Compare commits
1133 Commits
fdroid-v0.
...
auth-v3.1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8c6c88f64 | ||
|
|
f2f4bf2fd7 | ||
|
|
019457be02 | ||
|
|
73b7b2e190 | ||
|
|
eb568080dd | ||
|
|
fe82faf80f | ||
|
|
00eb440c01 | ||
|
|
38662f6b6c | ||
|
|
029b43b13d | ||
|
|
468d429ecc | ||
|
|
19c6ebefd3 | ||
|
|
5cd093c413 | ||
|
|
8fed43ec00 | ||
|
|
6ba92298dd | ||
|
|
88d6f78741 | ||
|
|
0a35291084 | ||
|
|
adefb78cac | ||
|
|
8c5b07b3ce | ||
|
|
8d667f86b1 | ||
|
|
f7666deb5a | ||
|
|
1323525cd8 | ||
|
|
f84054b4ce | ||
|
|
bc94882234 | ||
|
|
95a03ef86d | ||
|
|
48c29700a4 | ||
|
|
d7d5b0aa9b | ||
|
|
63d65a4311 | ||
|
|
d6151a89e8 | ||
|
|
e6f26e62ae | ||
|
|
3f9a7e08a1 | ||
|
|
c39fcb3968 | ||
|
|
c0e48c7ada | ||
|
|
62c32d02ce | ||
|
|
5640086932 | ||
|
|
b443d5f472 | ||
|
|
81b913cb79 | ||
|
|
769b3ab21f | ||
|
|
a43c0baa46 | ||
|
|
d7fb8cf82b | ||
|
|
d96d4773cf | ||
|
|
cf3b757021 | ||
|
|
fed7864b11 | ||
|
|
60cee41a44 | ||
|
|
8e3183ed8f | ||
|
|
c4b47dcc14 | ||
|
|
2856bfb7f4 | ||
|
|
6bdafc0ed2 | ||
|
|
21764a520f | ||
|
|
4a19bfdcde | ||
|
|
3d41b555b6 | ||
|
|
92e0d82123 | ||
|
|
9b9c7e91f4 | ||
|
|
0c94613fdf | ||
|
|
54c699b6d5 | ||
|
|
d3f3679fb0 | ||
|
|
505dc7c20d | ||
|
|
8601662ea1 | ||
|
|
08c3b172d9 | ||
|
|
76da94cf78 | ||
|
|
0240b37032 | ||
|
|
9ae5006a4a | ||
|
|
0ee84db02f | ||
|
|
b329085940 | ||
|
|
de3943e69c | ||
|
|
069cf82bbb | ||
|
|
eafa662cc0 | ||
|
|
6488c4fa0e | ||
|
|
25f1087685 | ||
|
|
788ce53388 | ||
|
|
757ff5cd9a | ||
|
|
68e5d842e5 | ||
|
|
fdfaadfb1e | ||
|
|
0fcd21f61d | ||
|
|
4fa3b177c6 | ||
|
|
2775917e44 | ||
|
|
360113c3ac | ||
|
|
f338e40876 | ||
|
|
3a4246b82d | ||
|
|
fbc6137b3e | ||
|
|
5c09359738 | ||
|
|
90ffb68b51 | ||
|
|
d1b7177a53 | ||
|
|
890ed7dd4b | ||
|
|
25b9a36554 | ||
|
|
cf6508be4a | ||
|
|
153be4990a | ||
|
|
f3e947f47e | ||
|
|
f0b86323c3 | ||
|
|
dbe98acbd7 | ||
|
|
93d48f6d6f | ||
|
|
d91462773a | ||
|
|
3962f3a133 | ||
|
|
bc192e5b00 | ||
|
|
462adf7429 | ||
|
|
78a727c750 | ||
|
|
3676151dde | ||
|
|
9f23403604 | ||
|
|
eace1150f5 | ||
|
|
191e32463f | ||
|
|
0a59597301 | ||
|
|
f89e3793ec | ||
|
|
201b2eda67 | ||
|
|
c5ee50b3a2 | ||
|
|
b5b4d1df65 | ||
|
|
2d5faa3964 | ||
|
|
371fda4e97 | ||
|
|
44bdb016a8 | ||
|
|
763d9727e6 | ||
|
|
38d39c123d | ||
|
|
3b0ec7ce71 | ||
|
|
2e0ad673cf | ||
|
|
0de05fdc36 | ||
|
|
a19e4879db | ||
|
|
fcad2157bc | ||
|
|
94a40838a3 | ||
|
|
54efdd1072 | ||
|
|
797dcc4a1e | ||
|
|
ed6dc3ca6c | ||
|
|
4fda7c3c86 | ||
|
|
cbb36214a3 | ||
|
|
7e03462891 | ||
|
|
f37220bf20 | ||
|
|
1a6ae93a7a | ||
|
|
5e67bf90c5 | ||
|
|
89fd65d925 | ||
|
|
ddf530f236 | ||
|
|
3bc41f253b | ||
|
|
2ae98148ae | ||
|
|
3f20f572d2 | ||
|
|
f5738f8460 | ||
|
|
4f0145e6d3 | ||
|
|
37bbefa16b | ||
|
|
e3d7b14442 | ||
|
|
b04831d4df | ||
|
|
b9102a4074 | ||
|
|
d94f8be520 | ||
|
|
811aba2baf | ||
|
|
a31a761933 | ||
|
|
c69280a3d7 | ||
|
|
32fa1b1466 | ||
|
|
b88b81615d | ||
|
|
741107e950 | ||
|
|
4dbf8cbd54 | ||
|
|
6627faed8c | ||
|
|
29b81a468c | ||
|
|
10087c3cc0 | ||
|
|
175fe103e5 | ||
|
|
c759d37fd3 | ||
|
|
05df5962ef | ||
|
|
9f043eba24 | ||
|
|
b35b6a5983 | ||
|
|
2fe45ff10f | ||
|
|
c599ca2d80 | ||
|
|
27b20b4fc7 | ||
|
|
4028041c90 | ||
|
|
53a292f97d | ||
|
|
eff5b4fef4 | ||
|
|
a999eddbfe | ||
|
|
555f23a519 | ||
|
|
1fd238a89a | ||
|
|
ed1ee18e74 | ||
|
|
ddcc93c692 | ||
|
|
0e81dfb31a | ||
|
|
3418e69b95 | ||
|
|
ea18da295e | ||
|
|
d0e77e1673 | ||
|
|
f638b41508 | ||
|
|
a5c0ae81bf | ||
|
|
46e585dbf7 | ||
|
|
d2536241f7 | ||
|
|
ecbd2b4480 | ||
|
|
37dec0018c | ||
|
|
39e505a3ec | ||
|
|
ae98af9f8c | ||
|
|
5bd7170755 | ||
|
|
ab17ae71d0 | ||
|
|
f40f39984a | ||
|
|
fda7722adb | ||
|
|
4fc1d708b9 | ||
|
|
efb89e710c | ||
|
|
359572f4b2 | ||
|
|
5d9d3457ec | ||
|
|
1e3a726eaa | ||
|
|
e21a4b4f9e | ||
|
|
0753b59e4a | ||
|
|
e946749b2e | ||
|
|
b6b87c196f | ||
|
|
367a715aa8 | ||
|
|
6a8fe71000 | ||
|
|
bb56fddd45 | ||
|
|
4e1d80380c | ||
|
|
fd1f3c6710 | ||
|
|
ee5acf6a2e | ||
|
|
3a85e9dcae | ||
|
|
dffe364c51 | ||
|
|
da4ba85c7c | ||
|
|
b99e835d79 | ||
|
|
62652ea617 | ||
|
|
7e36ad357b | ||
|
|
4ea6f1cbfc | ||
|
|
c164b0710a | ||
|
|
d8b338a1e8 | ||
|
|
81885d6814 | ||
|
|
7b402e46bd | ||
|
|
ad156bc33a | ||
|
|
050bbfbbb3 | ||
|
|
7ba4aebf86 | ||
|
|
1eea5ffab1 | ||
|
|
04343b2a6c | ||
|
|
9d48fa4a50 | ||
|
|
1314b8ccbb | ||
|
|
d5d0e98197 | ||
|
|
82b8658268 | ||
|
|
f802e87215 | ||
|
|
565546755a | ||
|
|
113bd9744e | ||
|
|
3097810f2c | ||
|
|
207f9c50cf | ||
|
|
1c9a14cfdc | ||
|
|
5e4f0d4caf | ||
|
|
7f9391f89f | ||
|
|
614c312876 | ||
|
|
5081dc904b | ||
|
|
ef7b978cd5 | ||
|
|
2376327e52 | ||
|
|
f264461390 | ||
|
|
0c097b38f4 | ||
|
|
e74aac0023 | ||
|
|
8d0e3e972f | ||
|
|
c10eb97511 | ||
|
|
6fa5571e19 | ||
|
|
49f069c9cf | ||
|
|
2228874898 | ||
|
|
c6bdeeb722 | ||
|
|
8299c029ec | ||
|
|
9132fc5ec8 | ||
|
|
8a67eb7417 | ||
|
|
b0c18f9fd4 | ||
|
|
91de9c38cc | ||
|
|
3980d6b614 | ||
|
|
fd6cab6c26 | ||
|
|
3604fbe352 | ||
|
|
9422398922 | ||
|
|
cb8a5a72f5 | ||
|
|
3b63089b42 | ||
|
|
eb2520e55c | ||
|
|
96948c8699 | ||
|
|
0e04dd7393 | ||
|
|
d9d4ffa9e7 | ||
|
|
ff1c20288f | ||
|
|
55bd59ec6a | ||
|
|
520647d77f | ||
|
|
fa91430276 | ||
|
|
a995a2ff0c | ||
|
|
28a97a39b2 | ||
|
|
dd74a0d6c3 | ||
|
|
3c92ac9100 | ||
|
|
048c5aa540 | ||
|
|
f1d828455d | ||
|
|
efcad99737 | ||
|
|
146b4ac296 | ||
|
|
0c3a676572 | ||
|
|
c23ba06b0d | ||
|
|
6b30bb52b8 | ||
|
|
6f1ddb892f | ||
|
|
7b610dbc34 | ||
|
|
5d0c337bfb | ||
|
|
2274be94c3 | ||
|
|
546820542a | ||
|
|
0a66098ee6 | ||
|
|
cfadd700ff | ||
|
|
6fc24f6900 | ||
|
|
ff72590958 | ||
|
|
f38d9deb11 | ||
|
|
bcc5cde399 | ||
|
|
c3eafb50b6 | ||
|
|
0d82f6ec65 | ||
|
|
c1ee9a5d37 | ||
|
|
a61d62d862 | ||
|
|
988d1ef895 | ||
|
|
c62842e6bb | ||
|
|
644827aea1 | ||
|
|
54bca8570e | ||
|
|
641a9c9e1a | ||
|
|
3feeb40a9e | ||
|
|
17de43a857 | ||
|
|
6259a97f0e | ||
|
|
b4ba6834e9 | ||
|
|
ac64aadb3a | ||
|
|
be21ef9c50 | ||
|
|
4ce3362186 | ||
|
|
8b33612879 | ||
|
|
992ac53a27 | ||
|
|
fc63e683a7 | ||
|
|
06bd039a80 | ||
|
|
d37f7a5314 | ||
|
|
6266d16544 | ||
|
|
f2ae7c6ff9 | ||
|
|
04fd2d4410 | ||
|
|
0c3ef07b3b | ||
|
|
6aee3a50f5 | ||
|
|
7cc3e1cf99 | ||
|
|
e8d804468e | ||
|
|
ea01c43e6a | ||
|
|
e8a78cd818 | ||
|
|
20fb9e99f0 | ||
|
|
fd0925f59e | ||
|
|
a6c5d03286 | ||
|
|
1564d9c0ca | ||
|
|
3502fcac5e | ||
|
|
9c48cf4dc3 | ||
|
|
c88dd22e9c | ||
|
|
108e103e64 | ||
|
|
0c392a22a4 | ||
|
|
4a13b04b1c | ||
|
|
ac5da3ac1e | ||
|
|
bbac3a2a94 | ||
|
|
bcf29d971e | ||
|
|
ec8bd5bc7f | ||
|
|
43e711274e | ||
|
|
930c080dcf | ||
|
|
9be3051671 | ||
|
|
7a113a3aba | ||
|
|
d1b7d942b1 | ||
|
|
2830d32c79 | ||
|
|
92adb3ad6f | ||
|
|
83e9b18eba | ||
|
|
a70a3c7078 | ||
|
|
66726846da | ||
|
|
f80e91a65c | ||
|
|
62a979656f | ||
|
|
e618f13041 | ||
|
|
215899f35a | ||
|
|
004dd3bd0c | ||
|
|
98a9fc39ec | ||
|
|
e6250e2cc3 | ||
|
|
ccceb8c26a | ||
|
|
a7fcf7da9b | ||
|
|
2b7ee9f42f | ||
|
|
de03265675 | ||
|
|
b7de8ca9e5 | ||
|
|
b8830144be | ||
|
|
8acc5ac62d | ||
|
|
041ad135c9 | ||
|
|
ff7718a878 | ||
|
|
95cfdc4eaa | ||
|
|
7bbf926986 | ||
|
|
df234660a0 | ||
|
|
f89bc22dc4 | ||
|
|
e29c9288c0 | ||
|
|
cbdf6ea0e3 | ||
|
|
50d7d7e9a1 | ||
|
|
d6bf243701 | ||
|
|
4e49a352be | ||
|
|
de1f287c1c | ||
|
|
bac660f7a0 | ||
|
|
97c9253127 | ||
|
|
d5d7786b24 | ||
|
|
1aa38253a3 | ||
|
|
c27017e77e | ||
|
|
ca9726969c | ||
|
|
f5b6145da1 | ||
|
|
231e831c75 | ||
|
|
85020a490e | ||
|
|
d13c23f2d8 | ||
|
|
a029b16851 | ||
|
|
5044a0c33f | ||
|
|
c079ed12ca | ||
|
|
18b0bd4996 | ||
|
|
9abd9e126c | ||
|
|
f7345102a2 | ||
|
|
407364b626 | ||
|
|
23da3b1c84 | ||
|
|
42c3482423 | ||
|
|
4ea95c7d77 | ||
|
|
ac8a5b491d | ||
|
|
72bce123a5 | ||
|
|
5bbc2615e4 | ||
|
|
1f28fdada2 | ||
|
|
b503f75999 | ||
|
|
fb867bd351 | ||
|
|
5ce8d9838f | ||
|
|
93c5825364 | ||
|
|
82ecbe6866 | ||
|
|
62e27916b7 | ||
|
|
4cb0a5306a | ||
|
|
5e7febd8f2 | ||
|
|
73c4fd3488 | ||
|
|
5d28f75c1a | ||
|
|
ac27a22ddb | ||
|
|
e7e74c17f8 | ||
|
|
4d8e80041d | ||
|
|
72cdb2424a | ||
|
|
38c3e73638 | ||
|
|
e0fbc64f08 | ||
|
|
41a304a18c | ||
|
|
09c3d9e025 | ||
|
|
03f0db92ad | ||
|
|
1e7c1396e0 | ||
|
|
6b8473a958 | ||
|
|
c4770e8645 | ||
|
|
2d768c9c61 | ||
|
|
839727393b | ||
|
|
251a627219 | ||
|
|
cd2fde2c2e | ||
|
|
7bde0dea8c | ||
|
|
46082796d7 | ||
|
|
7d52f917c1 | ||
|
|
980ff741ba | ||
|
|
286517338e | ||
|
|
e5eb9fee7a | ||
|
|
8f167d81fc | ||
|
|
1c84b32608 | ||
|
|
1e3110ca9c | ||
|
|
0412c37bf5 | ||
|
|
777ce3f4a8 | ||
|
|
5fa719f3e9 | ||
|
|
7834662340 | ||
|
|
29d7403cda | ||
|
|
46a7880f05 | ||
|
|
ffbd76b88b | ||
|
|
762daa6bd5 | ||
|
|
890ea6c8d1 | ||
|
|
fdf3b6e85d | ||
|
|
cfcfade152 | ||
|
|
da09a5261b | ||
|
|
5c7c4ad35a | ||
|
|
771327a551 | ||
|
|
526546da59 | ||
|
|
a32a9dea3f | ||
|
|
69627ee8d6 | ||
|
|
292a8eb00f | ||
|
|
685680c6da | ||
|
|
8db29a25a4 | ||
|
|
10d6caa4e1 | ||
|
|
fb2c17c510 | ||
|
|
5925dfb3fc | ||
|
|
65b0a061b7 | ||
|
|
7c435b9ae5 | ||
|
|
7dcfe12d1d | ||
|
|
b4500ef4d7 | ||
|
|
4920ecf643 | ||
|
|
58e55a7a00 | ||
|
|
86ad432d5b | ||
|
|
0fcecc7786 | ||
|
|
a3c51044c4 | ||
|
|
488c239cf2 | ||
|
|
d26aafc5f4 | ||
|
|
272d17615e | ||
|
|
50f6fd7440 | ||
|
|
5ad1bacf3e | ||
|
|
1c8512ad81 | ||
|
|
c784831ded | ||
|
|
d53d39b400 | ||
|
|
eaf6147f2b | ||
|
|
e31f0b042d | ||
|
|
2eb0cb3487 | ||
|
|
395fe16d8a | ||
|
|
ce421eded4 | ||
|
|
5cc8479354 | ||
|
|
08303d2bb6 | ||
|
|
00d0cfe72c | ||
|
|
f3b13042ca | ||
|
|
6fbc807225 | ||
|
|
9ec1affcbb | ||
|
|
67d0fb1c31 | ||
|
|
b6602d052f | ||
|
|
7cafa9ccb6 | ||
|
|
b7bd8c83ba | ||
|
|
36de2db175 | ||
|
|
a09794304c | ||
|
|
fe97828328 | ||
|
|
3652430b59 | ||
|
|
553e62dfae | ||
|
|
a4c0c8b999 | ||
|
|
1bb4940e14 | ||
|
|
959f887d2f | ||
|
|
7910d92d34 | ||
|
|
6967d1235e | ||
|
|
ca1039884f | ||
|
|
551c151f1e | ||
|
|
777f9e9704 | ||
|
|
af758d4e85 | ||
|
|
527dfc3721 | ||
|
|
5f14057b65 | ||
|
|
8cde8d6d66 | ||
|
|
7795625708 | ||
|
|
0b279111dd | ||
|
|
c572fc171c | ||
|
|
d452d1acb0 | ||
|
|
1fdeebed28 | ||
|
|
139d3b99a1 | ||
|
|
0a3182be53 | ||
|
|
1db7bf2902 | ||
|
|
920b4e6823 | ||
|
|
fe399762f5 | ||
|
|
9a60bf3ba6 | ||
|
|
862495c29e | ||
|
|
5c0a80415d | ||
|
|
075096258f | ||
|
|
728c3a80f4 | ||
|
|
6adbb82d54 | ||
|
|
4c02e8ffa3 | ||
|
|
1fc1d3f4c0 | ||
|
|
05725dfdeb | ||
|
|
25c97dea48 | ||
|
|
9cc8469ed9 | ||
|
|
fead530786 | ||
|
|
4d6b57b96c | ||
|
|
74e50a8e37 | ||
|
|
62436db1c3 | ||
|
|
f4adea5a60 | ||
|
|
7ecfa20f03 | ||
|
|
71b909d950 | ||
|
|
36673997dd | ||
|
|
5d16f5735b | ||
|
|
8e284c1139 | ||
|
|
657ea68122 | ||
|
|
a6cc6f24d0 | ||
|
|
98a6bf9164 | ||
|
|
4abbb5c591 | ||
|
|
5351377ae7 | ||
|
|
af4064b97a | ||
|
|
84fa8f343b | ||
|
|
ec91e75780 | ||
|
|
9ceae94071 | ||
|
|
962a260e4b | ||
|
|
d30773e68a | ||
|
|
2c6298d6c3 | ||
|
|
07786140f9 | ||
|
|
7d36808bb5 | ||
|
|
a61ea9338e | ||
|
|
1c4ae46270 | ||
|
|
1570b0a551 | ||
|
|
eab1be3753 | ||
|
|
51f0cfff06 | ||
|
|
b8cb480d23 | ||
|
|
d9bd96ce34 | ||
|
|
a821d1f283 | ||
|
|
4470fe0425 | ||
|
|
296bcbc8c2 | ||
|
|
f38d432bf9 | ||
|
|
543b180137 | ||
|
|
2e683bb625 | ||
|
|
164d875324 | ||
|
|
70d691207c | ||
|
|
b12f981f5b | ||
|
|
28ca94265d | ||
|
|
b16a717776 | ||
|
|
20ac146b50 | ||
|
|
2916bcfda8 | ||
|
|
b91d854a92 | ||
|
|
f69214461d | ||
|
|
cbb1a57ffe | ||
|
|
543aa6b9cf | ||
|
|
744d6bc6ea | ||
|
|
81c3626c6c | ||
|
|
27eb5ecc2b | ||
|
|
18d58a9eee | ||
|
|
9991f0bfc0 | ||
|
|
9640d485a2 | ||
|
|
9b896c5c2f | ||
|
|
838840bfa8 | ||
|
|
2952c4a4c6 | ||
|
|
e1713851b3 | ||
|
|
2d1a8e5b85 | ||
|
|
a59b11c9f8 | ||
|
|
40c360a1bd | ||
|
|
d599a6dcfa | ||
|
|
219cc405da | ||
|
|
8cabf13e5a | ||
|
|
f8c12ba127 | ||
|
|
9583b31bfc | ||
|
|
506dc36c69 | ||
|
|
61935a0037 | ||
|
|
25541ecd3a | ||
|
|
5e3cae39ec | ||
|
|
e60506586e | ||
|
|
0d8a49317a | ||
|
|
6b52f1e53b | ||
|
|
9ff4aa47d0 | ||
|
|
edbe40d2fa | ||
|
|
4c28646ecc | ||
|
|
8ec2d3e87c | ||
|
|
2a00313159 | ||
|
|
22b2c49b63 | ||
|
|
13ab0d4309 | ||
|
|
5536f7ac03 | ||
|
|
bd42650b9e | ||
|
|
13f31a7d09 | ||
|
|
124552eda3 | ||
|
|
a9359d15d3 | ||
|
|
15f80e3fa6 | ||
|
|
2dcc199556 | ||
|
|
9bce3bba7c | ||
|
|
32a602725a | ||
|
|
0bff899713 | ||
|
|
d0fd868705 | ||
|
|
a02a4ca5c1 | ||
|
|
2860a94dae | ||
|
|
ccc20c5bbd | ||
|
|
98de9082b9 | ||
|
|
c703f46243 | ||
|
|
6bd9607c94 | ||
|
|
d68c04a8fb | ||
|
|
eea4958ee7 | ||
|
|
6feb3b7897 | ||
|
|
17e57b7486 | ||
|
|
9673aa1c19 | ||
|
|
ebf51b99c8 | ||
|
|
56c4b39d75 | ||
|
|
14d003dd8f | ||
|
|
a01077a1a4 | ||
|
|
29cf5b91a5 | ||
|
|
3392e39f7c | ||
|
|
c604078736 | ||
|
|
80dccca62c | ||
|
|
04d632b50e | ||
|
|
c41933edc4 | ||
|
|
d1dc977d5e | ||
|
|
0db9bd04a1 | ||
|
|
179acd7e47 | ||
|
|
97486818d8 | ||
|
|
22cff206b3 | ||
|
|
b8e20eb263 | ||
|
|
d530562552 | ||
|
|
ef38b639eb | ||
|
|
7db35fd8bd | ||
|
|
59d772f609 | ||
|
|
d5e54214da | ||
|
|
1227991300 | ||
|
|
cf81d25b6a | ||
|
|
cc596ae4f0 | ||
|
|
dbab1bad55 | ||
|
|
7c202a4edb | ||
|
|
289718f7f6 | ||
|
|
986c00f4e8 | ||
|
|
025b8f7bcf | ||
|
|
5f7b411b67 | ||
|
|
487cf125c1 | ||
|
|
e32cd7b64c | ||
|
|
839b86ce88 | ||
|
|
2ebfc79420 | ||
|
|
eb848eb4c6 | ||
|
|
ea36517832 | ||
|
|
0bbb15337f | ||
|
|
8a2d3600e9 | ||
|
|
4335df1634 | ||
|
|
967149c04b | ||
|
|
a19179cacd | ||
|
|
4f3fe73daa | ||
|
|
edc3337192 | ||
|
|
0241e408e1 | ||
|
|
32469adcc5 | ||
|
|
c8fcac8b55 | ||
|
|
fa89ed3a7c | ||
|
|
1364feeac8 | ||
|
|
3bf81dda3b | ||
|
|
066c41a6df | ||
|
|
57dd8b0c67 | ||
|
|
54d97c222e | ||
|
|
ee233eab71 | ||
|
|
706c288220 | ||
|
|
93b7d71543 | ||
|
|
d6433155db | ||
|
|
993943ccfa | ||
|
|
99c6c22fe1 | ||
|
|
bf6dc59429 | ||
|
|
7c71277759 | ||
|
|
88996eddea | ||
|
|
dbd2addeea | ||
|
|
ab652ee3fe | ||
|
|
d14b18867a | ||
|
|
cfe2e96227 | ||
|
|
ad0b8ae017 | ||
|
|
7e5577ecd7 | ||
|
|
cd73a736f4 | ||
|
|
0a03df9242 | ||
|
|
1c4a6ca8b1 | ||
|
|
f15729d73f | ||
|
|
8edf6d8253 | ||
|
|
43525128eb | ||
|
|
ea585903b7 | ||
|
|
42c508b9ce | ||
|
|
2fd960eb0e | ||
|
|
e72c858315 | ||
|
|
2af07d9211 | ||
|
|
5f40b2e251 | ||
|
|
50b6616680 | ||
|
|
ca3b477d4c | ||
|
|
395f0384a0 | ||
|
|
1c1135a9b2 | ||
|
|
31318f10d6 | ||
|
|
105ab79cdb | ||
|
|
0526c63681 | ||
|
|
7d8a7257b4 | ||
|
|
af5e9b51e1 | ||
|
|
884ff970ad | ||
|
|
22f4a3751f | ||
|
|
e640302ce0 | ||
|
|
4e51d76791 | ||
|
|
9b5b1d297b | ||
|
|
be00f015a7 | ||
|
|
9c883eebc6 | ||
|
|
d5b5b9bd51 | ||
|
|
50f601b66b | ||
|
|
bfe5632477 | ||
|
|
a67bc6aee7 | ||
|
|
c0011ef10b | ||
|
|
985de0a5ce | ||
|
|
940c647d50 | ||
|
|
97bbf4811f | ||
|
|
eed991a7b2 | ||
|
|
5a362b5d45 | ||
|
|
523af2600a | ||
|
|
f869447c7d | ||
|
|
586d8f86f7 | ||
|
|
c369db9453 | ||
|
|
c4103f9136 | ||
|
|
ba9d656b38 | ||
|
|
31493541a1 | ||
|
|
af90bfade7 | ||
|
|
95e342830b | ||
|
|
eb2557b2b0 | ||
|
|
9ae979abbe | ||
|
|
03805b6e75 | ||
|
|
b10d674711 | ||
|
|
6361859a1b | ||
|
|
e2f1d7488b | ||
|
|
8a39e4330b | ||
|
|
81d1b15aaf | ||
|
|
f925d4cf27 | ||
|
|
d52ea49a96 | ||
|
|
0bc360c55c | ||
|
|
154fffd620 | ||
|
|
46cc696ccd | ||
|
|
5e055b6039 | ||
|
|
59cc01053a | ||
|
|
1b0fe5fd4c | ||
|
|
bf6aa5f840 | ||
|
|
ef32313807 | ||
|
|
5bd75a8567 | ||
|
|
ebbb9a61ee | ||
|
|
b9b22fa4dc | ||
|
|
3d730f4d14 | ||
|
|
4647f9fac2 | ||
|
|
192e491acb | ||
|
|
627a34a231 | ||
|
|
3a5843f532 | ||
|
|
5a3838be34 | ||
|
|
e55a7facc3 | ||
|
|
6ad27a2d42 | ||
|
|
423f0b6719 | ||
|
|
62f723e50c | ||
|
|
a97e01171a | ||
|
|
daed8a72da | ||
|
|
b69d23028b | ||
|
|
1ae0f9723c | ||
|
|
f2f7b483fd | ||
|
|
95facd60e0 | ||
|
|
30cecf53b3 | ||
|
|
2101817b23 | ||
|
|
7baacc6a77 | ||
|
|
65cfcc27a8 | ||
|
|
3f3d10f57b | ||
|
|
18cb596d57 | ||
|
|
4ca40085c1 | ||
|
|
878d22fd4a | ||
|
|
c3c2dd5cc6 | ||
|
|
08ba58d790 | ||
|
|
60d9a819f4 | ||
|
|
6842218d2b | ||
|
|
3f0855d9a4 | ||
|
|
b2556e893b | ||
|
|
81b52419a5 | ||
|
|
e66e9251db | ||
|
|
37367f7260 | ||
|
|
48e566ae68 | ||
|
|
29877d119c | ||
|
|
c124cdff20 | ||
|
|
3d83786f6c | ||
|
|
a14a8b0cfb | ||
|
|
d92a31d8d8 | ||
|
|
3eaa9b449a | ||
|
|
b28e8c2fb4 | ||
|
|
24bc175f1c | ||
|
|
e54910f8d0 | ||
|
|
0195a9b494 | ||
|
|
ea8bb4529f | ||
|
|
180389f3e2 | ||
|
|
7d42f23abf | ||
|
|
4087c6ef4e | ||
|
|
67a9417528 | ||
|
|
1e720b4b7d | ||
|
|
1a9170632e | ||
|
|
3a962cfe52 | ||
|
|
65d2bfe1c1 | ||
|
|
82f808e533 | ||
|
|
27ae4b83c4 | ||
|
|
142a4ddbc4 | ||
|
|
406404f8d0 | ||
|
|
088cec2716 | ||
|
|
cf6336d100 | ||
|
|
c6bf6bd7b6 | ||
|
|
3dbdea472b | ||
|
|
d5711095f9 | ||
|
|
2a3fe8c49f | ||
|
|
7d94ef0bbd | ||
|
|
4e589840ff | ||
|
|
3571281bef | ||
|
|
7b0ec2991a | ||
|
|
3572efc02b | ||
|
|
3013d68203 | ||
|
|
c7857110ac | ||
|
|
505e1de14c | ||
|
|
d116c5ccb1 | ||
|
|
8f08ab18fc | ||
|
|
dc143bbaaf | ||
|
|
8f8f5d2f51 | ||
|
|
aad7300e4b | ||
|
|
2cc87140ed | ||
|
|
0290991e2c | ||
|
|
9e2e8e4d63 | ||
|
|
509b7bda67 | ||
|
|
30db24721a | ||
|
|
b121daa607 | ||
|
|
bae717dc69 | ||
|
|
b61e4f4ac6 | ||
|
|
a7e0c5b61d | ||
|
|
7a2d925737 | ||
|
|
84ee895b93 | ||
|
|
92068fbbd6 | ||
|
|
950b2bb997 | ||
|
|
d989a3b631 | ||
|
|
a8c9c33aaa | ||
|
|
198dab9f58 | ||
|
|
184e6090fd | ||
|
|
d1417f364a | ||
|
|
d2a6440cba | ||
|
|
f09a8c4c51 | ||
|
|
8d91b857fb | ||
|
|
d1a74da4a4 | ||
|
|
08833390bc | ||
|
|
e1923fdebd | ||
|
|
06be08a382 | ||
|
|
99066b8fea | ||
|
|
487fd62feb | ||
|
|
26c40ab2ec | ||
|
|
4deb9c8f13 | ||
|
|
efab8918f2 | ||
|
|
74c5b22927 | ||
|
|
8b30d52e94 | ||
|
|
b5d577f090 | ||
|
|
6440b2176d | ||
|
|
d3d859f252 | ||
|
|
63fe67d677 | ||
|
|
23d4156a12 | ||
|
|
41f59ec9ca | ||
|
|
bebaa76085 | ||
|
|
c28b6e3a62 | ||
|
|
19304daeab | ||
|
|
5c0942f2b7 | ||
|
|
1adab703b8 | ||
|
|
9613361151 | ||
|
|
77fcd04613 | ||
|
|
47f22cf7e4 | ||
|
|
90cd6502c1 | ||
|
|
b2103e3893 | ||
|
|
6d5af2e6a5 | ||
|
|
ef1429685b | ||
|
|
fc93deb575 | ||
|
|
8bbef91103 | ||
|
|
7f357d0f65 | ||
|
|
87e3aa4d11 | ||
|
|
6c7f8e5fae | ||
|
|
b637f2fe08 | ||
|
|
5995730659 | ||
|
|
689d3c4c82 | ||
|
|
d9a8eafbe3 | ||
|
|
e14e06dc1a | ||
|
|
ce4063c892 | ||
|
|
f01b3b9def | ||
|
|
8cde630e01 | ||
|
|
55a86cc85c | ||
|
|
8bf88c2059 | ||
|
|
af42c42141 | ||
|
|
0d01ed5c00 | ||
|
|
3edc323272 | ||
|
|
f6c8e13816 | ||
|
|
beace4cbde | ||
|
|
bac49c7058 | ||
|
|
76faf4c1d7 | ||
|
|
47ded8b302 | ||
|
|
1501e055a9 | ||
|
|
2cb9c915aa | ||
|
|
8072b2943a | ||
|
|
b4ea15f00b | ||
|
|
191f1fd097 | ||
|
|
fb25888129 | ||
|
|
f0d5c7d51f | ||
|
|
d5b59765aa | ||
|
|
d847141eb7 | ||
|
|
5d417f3825 | ||
|
|
422a36319e | ||
|
|
10e19ffae2 | ||
|
|
28b9d5512f | ||
|
|
939363fd7a | ||
|
|
584db778ee | ||
|
|
336aa7ac5f | ||
|
|
4bcec9d43b | ||
|
|
e5239e588b | ||
|
|
553c153155 | ||
|
|
a4a4b7f941 | ||
|
|
89a8a45935 | ||
|
|
adf68a82c5 | ||
|
|
0d313825d6 | ||
|
|
218a5ce5f9 | ||
|
|
719f056841 | ||
|
|
c835984e40 | ||
|
|
5a36e37e93 | ||
|
|
16ec4db546 | ||
|
|
ae0b701319 | ||
|
|
31043f5f4e | ||
|
|
4e29f1e03a | ||
|
|
dafa155903 | ||
|
|
f3a69b0d0b | ||
|
|
5764734f14 | ||
|
|
2be4c7e470 | ||
|
|
87ed684ce9 | ||
|
|
3fd7100dd7 | ||
|
|
1545f75217 | ||
|
|
816061774e | ||
|
|
4451d39ac9 | ||
|
|
12fbc6c801 | ||
|
|
386a2f841e | ||
|
|
275e521c40 | ||
|
|
2f6530d6d6 | ||
|
|
40f0829f6b | ||
|
|
cb0be8a624 | ||
|
|
3da9361271 | ||
|
|
aab6bb47b1 | ||
|
|
65863d1b8f | ||
|
|
7b80c5bf77 | ||
|
|
626bc71b25 | ||
|
|
1bcf232d25 | ||
|
|
b1907ff091 | ||
|
|
940c02bbbc | ||
|
|
66ed561d07 | ||
|
|
66e1062cd3 | ||
|
|
bd8057ede3 | ||
|
|
9c5d958250 | ||
|
|
db52780cee | ||
|
|
0730ba72a6 | ||
|
|
2ff6a2f73c | ||
|
|
f5f0af2ed8 | ||
|
|
4f14fafa34 | ||
|
|
65f2c92d41 | ||
|
|
b37fbab2dc | ||
|
|
7c7299aa09 | ||
|
|
005d786535 | ||
|
|
f17600a7c8 | ||
|
|
18ac20fd80 | ||
|
|
870697daf8 | ||
|
|
ea0cc47c9c | ||
|
|
869ecb832e | ||
|
|
1e5cbc8422 | ||
|
|
feeda425a5 | ||
|
|
7d8961fbc5 | ||
|
|
79fcf18f62 | ||
|
|
7f28d2bfe9 | ||
|
|
dbed9fb91c | ||
|
|
a73de2848e | ||
|
|
875b079850 | ||
|
|
47203af4ff | ||
|
|
8a35b71bb8 | ||
|
|
3e02c748ce | ||
|
|
4b7fe45963 | ||
|
|
af66c55444 | ||
|
|
439a7771b0 | ||
|
|
e4a288d6cf | ||
|
|
39a693edac | ||
|
|
57ec8771fb | ||
|
|
088b4b9cff | ||
|
|
6cb5c06ea8 | ||
|
|
cfb8c6a192 | ||
|
|
e7a399ff48 | ||
|
|
7364b4f3ef | ||
|
|
339182b73f | ||
|
|
6a9befd566 | ||
|
|
fc03d2196d | ||
|
|
3ff3841565 | ||
|
|
5c28780bc0 | ||
|
|
6e37a78d54 | ||
|
|
d20e880bed | ||
|
|
2568e4cbb4 | ||
|
|
4cfc38c4db | ||
|
|
27cd567225 | ||
|
|
cdbf8c5f09 | ||
|
|
e0beb414f9 | ||
|
|
f35d2773aa | ||
|
|
78306ccf1d | ||
|
|
310e20598e | ||
|
|
c5731e8894 | ||
|
|
40a4f783f7 | ||
|
|
6afd47ce3c | ||
|
|
972b7b82dd | ||
|
|
19e7c2d65c | ||
|
|
cff6570ebb | ||
|
|
3b1fd78fbe | ||
|
|
ca8ae8c6e7 | ||
|
|
09036bb57f | ||
|
|
e3e58eb9c2 | ||
|
|
9e81591c63 | ||
|
|
fda6f68688 | ||
|
|
bd2e8bb728 | ||
|
|
c918a796af | ||
|
|
85413e6269 | ||
|
|
87bd90870b | ||
|
|
67d1d6c597 | ||
|
|
d59e50ff93 | ||
|
|
c92e08c8d4 | ||
|
|
67df790d28 | ||
|
|
34e13caa77 | ||
|
|
5a79658e58 | ||
|
|
f97d5b19d9 | ||
|
|
1972239bb0 | ||
|
|
1da1aee845 | ||
|
|
d4accf09f9 | ||
|
|
e1dac063f6 | ||
|
|
3954464648 | ||
|
|
068b5e6dd2 | ||
|
|
3fbe161576 | ||
|
|
1381cfc6e4 | ||
|
|
ab3bb113ea | ||
|
|
92fae72760 | ||
|
|
4834cfb3ff | ||
|
|
542de42875 | ||
|
|
b57c6ba556 | ||
|
|
046275a09c | ||
|
|
0a3ee6e7bb | ||
|
|
caf6728876 | ||
|
|
e23bce3537 | ||
|
|
2adb93fb1b | ||
|
|
c0b80315ec | ||
|
|
4f41a32647 | ||
|
|
eadff3b7b3 | ||
|
|
eb8fa6db84 | ||
|
|
8202c9b4d3 | ||
|
|
1c0261bc5c | ||
|
|
254fb418ce | ||
|
|
e55de904b4 | ||
|
|
296dc21e88 | ||
|
|
73b57ffb34 | ||
|
|
e73bb0d374 | ||
|
|
b8cb1332c6 | ||
|
|
1cf2b24049 | ||
|
|
e7dbbbf74b | ||
|
|
d7f96863b2 | ||
|
|
22d2f7a520 | ||
|
|
e72aa6e7e6 | ||
|
|
9e83a4de81 | ||
|
|
f15851e6de | ||
|
|
b0b7ec5347 | ||
|
|
5a128f1e48 | ||
|
|
77de820c45 | ||
|
|
16acbc6dfa | ||
|
|
11f127781f | ||
|
|
8c32a25a6e | ||
|
|
9aec0903cf | ||
|
|
d2aeb3101c | ||
|
|
a4142ff800 | ||
|
|
122e3bb5f8 | ||
|
|
a7d93861b6 | ||
|
|
5a48aeb2ab | ||
|
|
40c489ebf0 | ||
|
|
f388d912f9 | ||
|
|
df2ae4f60b | ||
|
|
cd67fdbb8b | ||
|
|
e427e7df13 | ||
|
|
23d9e2db45 | ||
|
|
dd68a0d3de | ||
|
|
9166c5c80d | ||
|
|
ffda45faf7 | ||
|
|
8d9be5b7b7 | ||
|
|
37f676c0e9 | ||
|
|
ade3a41fa1 | ||
|
|
dab0e610db | ||
|
|
3060916d47 | ||
|
|
1cf51cb7b3 | ||
|
|
68de8c9f48 | ||
|
|
3cabafe128 | ||
|
|
92d4329aac | ||
|
|
9c23020e05 | ||
|
|
8600400179 | ||
|
|
bee3875e89 | ||
|
|
be06e5ae25 | ||
|
|
e7c470a9ff | ||
|
|
4bdb1c7922 | ||
|
|
9c04c9075e | ||
|
|
664f89aeec | ||
|
|
4c7f2c7c4e | ||
|
|
c387b59c78 | ||
|
|
8c9195e783 | ||
|
|
1b59a5bf87 | ||
|
|
41851c97be | ||
|
|
67e41f4bcd | ||
|
|
941b02f750 | ||
|
|
0ace569e97 | ||
|
|
b07d82ebc2 | ||
|
|
5b3b3b577b | ||
|
|
371a1805f0 | ||
|
|
0c6d27c134 | ||
|
|
e5a5d9c08d | ||
|
|
bd3e0c9289 | ||
|
|
827ac9ddf7 | ||
|
|
5f08e44e58 | ||
|
|
ab9c097a32 | ||
|
|
82f3cd19be | ||
|
|
147be37fdb | ||
|
|
9292dc6d04 | ||
|
|
0ce9ceba12 | ||
|
|
fb0d938cb5 | ||
|
|
97b5577d68 | ||
|
|
fd2c22dc5f | ||
|
|
d06586eb1c | ||
|
|
e39ba3c578 | ||
|
|
5089721507 | ||
|
|
4af03ad2dd | ||
|
|
7a06cf2364 | ||
|
|
45331de54e | ||
|
|
2e35b1eeb4 | ||
|
|
9982c73d5a | ||
|
|
65c72f6cf5 |
3
.github/workflows/server-lint.yml
vendored
@@ -21,7 +21,8 @@ jobs:
|
||||
- name: Setup go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: "server/go.mod"
|
||||
go-version-file: server/go.mod
|
||||
cache-dependency-path: server/go.sum
|
||||
cache: true
|
||||
|
||||
- name: Install dependencies
|
||||
|
||||
@@ -35,8 +35,8 @@ platform. Private sharing. Collaborative albums. Family plans. Easy import,
|
||||
easier export. Background uploads. The list goes on. And of course, all of this,
|
||||
while being fully end-to-end encrypted.
|
||||
|
||||
Ente Photos is a paid service, but we offer a free trial. You can also clone
|
||||
this repository and choose to self host.
|
||||
Ente Photos is a paid service, but we offer 5GB of free storage.
|
||||
You can also clone this repository and choose to self-host.
|
||||
|
||||
<br />
|
||||
|
||||
@@ -99,7 +99,7 @@ connect with the community.
|
||||
[](https://discord.gg/z2YVKkycX3)
|
||||
[](https://ente.io/blog/rss.xml)
|
||||
|
||||
[](https://twitter.com/enteio) [](https://mstdn.social/@ente)
|
||||
[](https://twitter.com/enteio) [](https://fosstodon.org/@ente)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<application android:name="${applicationName}"
|
||||
android:label="Auth"
|
||||
android:label="Ente Auth"
|
||||
android:icon="@mipmap/launcher_icon"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
|
||||
@@ -36,5 +36,5 @@ file, that adheres to the above format.
|
||||
|
||||
SUPPORT
|
||||
|
||||
If you need help, please reach out to support@ente.io, and a human will get in touch with you.
|
||||
If you need help, please visit @ https://github.com/ente-io/ente/discussions/new?category=q-a, and someone will get in touch with you.
|
||||
If you have feature requests, please create an issue @ https://github.com/ente-io/ente
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"icons": [
|
||||
{ "title": "1xBet",
|
||||
"altNames": ["1x", "1x bet", "1x-bet"
|
||||
]
|
||||
{ "title": "1xBet"
|
||||
},
|
||||
{
|
||||
"title": "3Commas"
|
||||
@@ -32,11 +30,19 @@
|
||||
"title": "bitget"
|
||||
},
|
||||
{
|
||||
"title": "Bitmart"
|
||||
"titile":"bitget wallet",
|
||||
"slug":"bitget_wallet"
|
||||
},
|
||||
{
|
||||
"title": "Bitmart",
|
||||
"hex":"000000"
|
||||
},
|
||||
{
|
||||
"title": "BitMEX"
|
||||
},
|
||||
{
|
||||
"title": "BitOasis"
|
||||
},
|
||||
{
|
||||
"title": "BitSkins"
|
||||
},
|
||||
@@ -57,6 +63,15 @@
|
||||
"Bloom Host Billing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Blockchain",
|
||||
"altNames": [
|
||||
"blockchain.com",
|
||||
"blockchain.com Wallet",
|
||||
"blockchain.com Exchange"
|
||||
],
|
||||
"slug": "blockchain"
|
||||
},
|
||||
{
|
||||
"title": "BorgBase",
|
||||
"altNames": [
|
||||
@@ -64,9 +79,21 @@
|
||||
],
|
||||
"slug": "BorgBase"
|
||||
},
|
||||
{
|
||||
"title": "Booking",
|
||||
"slug": "booking",
|
||||
"altNames":[
|
||||
"Booking.com"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Brave Creators",
|
||||
"slug": "brave_creators"
|
||||
"slug": "brave_creators",
|
||||
"altNames":[
|
||||
"Brave",
|
||||
"Brave Rewards",
|
||||
"Brave Browser"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Bybit"
|
||||
@@ -107,8 +134,13 @@
|
||||
"title": "Crowdpear"
|
||||
},
|
||||
{
|
||||
"title": "crypto.com",
|
||||
"altNames": ["crypto"]
|
||||
"title": "Crypto.com",
|
||||
"slug": "crypto",
|
||||
"altNames": [
|
||||
"crypto",
|
||||
"Crypto.com",
|
||||
"Crypto com"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "DCS",
|
||||
@@ -139,10 +171,18 @@
|
||||
"title": "dus.net",
|
||||
"slug": "dusnet"
|
||||
},
|
||||
{
|
||||
"title":"ecitizen kenya",
|
||||
"slug":"ecitizen_kenya"
|
||||
},
|
||||
{
|
||||
"title": "ente",
|
||||
"hex": "1DB954"
|
||||
},
|
||||
{
|
||||
"title": "enom"
|
||||
},
|
||||
|
||||
{
|
||||
"title": "Epic Games",
|
||||
"slug": "epic_games",
|
||||
@@ -164,7 +204,7 @@
|
||||
},
|
||||
{
|
||||
"title": "GitHub",
|
||||
"hex": "858585"
|
||||
"hex": "000000"
|
||||
},
|
||||
{
|
||||
"title": "GitLab"
|
||||
@@ -199,6 +239,10 @@
|
||||
"title": "IceDrive",
|
||||
"slug": "Icedrive"
|
||||
},
|
||||
{
|
||||
"titile": "Infomaniak",
|
||||
"slug": "infomaniak"
|
||||
},
|
||||
{
|
||||
"title": "ING"
|
||||
},
|
||||
@@ -213,8 +257,9 @@
|
||||
"title": "INWX"
|
||||
},
|
||||
{
|
||||
"title": "Itch.io",
|
||||
"slug": "itch_io"
|
||||
"title": "Itch",
|
||||
"slug": "itch_io",
|
||||
"hex": "e7685e"
|
||||
},
|
||||
{
|
||||
"title": "IVPN",
|
||||
@@ -352,8 +397,16 @@
|
||||
{
|
||||
"title": "Odido"
|
||||
},
|
||||
{
|
||||
"titile": "OpenObserve",
|
||||
"slug": "open_observe",
|
||||
"altNames":[
|
||||
"openobserve.ai",
|
||||
"openobserve ai"
|
||||
]
|
||||
},
|
||||
{ "title": "okx",
|
||||
"hex": "858585" },
|
||||
"hex": "000000" },
|
||||
{
|
||||
"title": "Parsec"
|
||||
},
|
||||
@@ -456,6 +509,18 @@
|
||||
{
|
||||
"title": "Skinport"
|
||||
},
|
||||
{
|
||||
"title": "SMSPool",
|
||||
"slug": "sms_pool_net",
|
||||
"altNames": [
|
||||
"smspool.net",
|
||||
"smspool net"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "SMTP2GO",
|
||||
"slug": "smtp2go"
|
||||
},
|
||||
{
|
||||
"title": "Snapchat"
|
||||
},
|
||||
@@ -542,6 +607,10 @@
|
||||
"slug": "uphold",
|
||||
"hex": "6FE68A"
|
||||
},
|
||||
{
|
||||
"titile": "Vikunja",
|
||||
"slug": "vikunja"
|
||||
},
|
||||
{
|
||||
"title": "WHMCS"
|
||||
},
|
||||
@@ -587,6 +656,15 @@
|
||||
],
|
||||
"slug": "ynab",
|
||||
"hex": "3B5EDA"
|
||||
},
|
||||
{
|
||||
"title": "Shakepay",
|
||||
"slug": "shakepay"
|
||||
},
|
||||
{
|
||||
"title": "Newton",
|
||||
"altNames": ["Newton Crypto"],
|
||||
"slug": "newton"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127.56 27.9"><defs><style>.cls-1{fill:#007acc;}.cls-2{fill:#002f5e;}</style></defs><title>logoo</title><g id="Слой_2" data-name="Слой 2"><g id="Layer_1" data-name="Layer 1"><path class="cls-1" d="M73.8,8.37C74.94,3.79,72.16,0,65.35,0L50.59,0,45.06,22.4l3.21,5.51h10.5c6.88,0,12.21-3.21,13.58-8.79.69-2.86-.11-4.86-1.91-5.86v-.07A7.78,7.78,0,0,0,73.8,8.37Zm-9,10.57c-.28,1.17-1.07,2.37-4.34,2.37h-6.7l1.17-4.8h6.67C64.83,16.5,65.07,17.73,64.76,18.94ZM66.14,8.52c-.24.9-.93,2-3.75,2h-6l1-3.9h6C66.24,6.6,66.38,7.52,66.14,8.52Z"/><polygon class="cls-1" points="83.09 17.1 96.53 17.1 98.06 10.5 84.71 10.5 85.75 6.6 98.97 6.6 100.5 0 78.8 0 71.92 27.9 96.5 27.9 98.11 21.3 82.1 21.3 83.09 17.1"/><polygon class="cls-1" points="102.38 0 100.84 6.6 108.87 6.6 103.6 27.9 112.03 27.9 117.31 6.6 125.91 6.6 127.56 0 102.38 0"/><path class="cls-2" d="M8.82,27.9H.32L4,13l.85-2.25L2.6,13,.1,15.53,0,8.09,8.82,0h6.87Z"/><path class="cls-2" d="M39.51,16.34,36.8,11.75,49.95,0H37.7l-5,4.8,0,0L15.74,20.35,7.6,27.9H19.19l8.71-7.77,2.93,5c1,1.26,2.41,2.79,8.39,2.79h7L39.52,16.33Z"/><path class="cls-2" d="M31.76,3.26l0-.06A7.69,7.69,0,0,0,25.12,0H16.07l6.75,11.48Z"/></g></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="5.9 24.02 400 231.77"><path d="M324.87 255.78h57.56l-83.04-125.82L405.9 24.02h-94.98L99.24 236.59 138.2 24.02H86.1L6.28 76.43l-.38 59.88 48.23-22.93-6.64 19.66c-7.37 40.91-14.91 81.82-22.1 122.75l154.9-.21 64.16-68.37 26.3 39.91c13.83 18.25 28.08 26.4 54.12 28.66m-125.11-144.9-55.92-86.86h63.89c17.79 1.74 35.7 8.06 47.3 22.88l3.69 5.25z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#12326e"></path></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 481 B |
10
auth/assets/custom-icons/icons/Enom.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.179104,0,0,0.179104,0,9.49254)">
|
||||
<path d="M73.245,0C80.736,0 86.81,6.269 86.81,14.001C86.81,21.733 80.736,28 73.245,28C65.754,28 59.68,21.733 59.68,14.001C59.68,6.269 65.754,0 73.245,0ZM73.245,21.646C77.043,21.646 80.21,18.222 80.21,14.001C80.21,9.779 77.043,6.356 73.245,6.356C69.447,6.356 66.28,9.779 66.28,14.001C66.28,18.222 69.447,21.646 73.245,21.646ZM123.068,0C129.157,0 133.186,5.123 133.186,13.632L133.186,26.895C133.186,27.099 133.021,27.264 132.818,27.264L127.162,27.264C126.959,27.264 126.796,27.099 126.796,26.895L126.796,13.632C126.796,9.544 125.156,6.447 121.471,6.447C118.066,6.447 115.586,9.981 115.586,15.29L115.586,26.895C115.586,27.099 115.423,27.264 115.221,27.264L109.354,27.264C109.153,27.264 108.989,27.099 108.989,26.895L108.989,13.632C108.989,9.544 107.295,6.447 103.49,6.447C100.089,6.447 97.61,9.369 97.449,14.731L97.449,26.895C97.449,27.099 97.285,27.264 97.082,27.264L91.217,27.264C91.015,27.264 90.85,27.099 90.85,26.895L90.85,1.131C90.85,0.927 91.015,0.762 91.217,0.762L96.928,0.762C97.119,0.762 97.279,0.908 97.294,1.1L97.449,2.967C99.402,1.146 101.961,0 105.139,0C108.833,0 111.79,1.77 113.604,4.952C115.586,1.989 118.682,0 123.068,0ZM45.017,0C51.305,0 55.649,5.123 55.649,13.632L55.649,26.895C55.649,27.099 55.484,27.264 55.282,27.264L49.415,27.264C49.214,27.264 49.049,27.099 49.049,26.895L49.049,13.632C49.049,9.544 47.173,6.447 43.368,6.447C39.963,6.447 37.135,9.378 36.96,14.757L36.96,26.895C36.96,27.099 36.795,27.264 36.593,27.264L30.728,27.264C30.525,27.264 30.361,27.099 30.361,26.895L30.361,1.131C30.361,0.927 30.525,0.762 30.728,0.762L36.437,0.762C36.628,0.762 36.788,0.911 36.803,1.103L36.96,3.198C39.012,1.244 41.706,0 45.017,0Z" style="fill:rgb(73,72,77);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.179104,0,0,0.179104,0,9.49254)">
|
||||
<path d="M20.839,19.015C20.692,18.893 20.475,18.904 20.343,19.044C18.914,20.561 16.549,21.737 13.931,21.737C12.409,21.737 10.811,21.341 9.727,20.497L26.082,8.544C26.223,8.442 26.273,8.255 26.201,8.096C25.081,5.635 21.335,0 13.931,0C6.237,0 0,6.267 0,13.999C0,21.655 6.237,28 13.931,28C18.277,28 22.676,26.073 25.218,23.135C25.351,22.981 25.328,22.745 25.171,22.615L20.839,19.015ZM13.931,6.263C15.451,6.263 16.982,6.635 18.073,7.56L6.478,16.025C5.159,11.239 9.116,6.263 13.931,6.263Z" style="fill:rgb(255,64,8);"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
1
auth/assets/custom-icons/icons/bitget_wallet.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="96" height="96" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><rect width="36" height="36" rx="18" fill="#54FFF5"/><g filter="url(#b)"><path d="M1.896 27.928c-6.02 16.936 26.181 12.153 43.035 7.644 17.248-5.724 5.326-30.957-7.045-31.515-12.37-.559 1.534 11.667-8.974 15.16-10.509 3.491-19.491-12.46-27.016 8.71" fill="#fff"/></g><g filter="url(#c)"><path d="M12.025-6.445C8.867-15.073-2.379-3.375-7.608 3.552-12.595 11.087.423 17.598 5.53 14.067c5.107-3.532-4.436-4.22-1.399-8.812s11.842-.915 7.895-11.7" fill="#00FFF0" fill-opacity=".67"/></g><g filter="url(#d)"><path d="M13.568 31.7c-4.308-14.494-22.86-6.861-31.599-1.234C-26.436 37.13-6.479 56.298 1.81 55.317c8.29-.98-6.65-9.324-1.53-13.388 5.118-4.063 18.672 7.886 13.288-10.23" fill="#9D81FF"/></g><g filter="url(#e)"><path d="M39.673-15.098c-9.291-11.064-22.592-1.915-28.081 4.042C6.788-4.31 31.539 8.046 38.408 5.928s-9.367-6.5-6.444-10.611c2.922-4.112 19.324 3.415 7.71-10.415" fill="#4D94FF"/></g><path fill-rule="evenodd" clip-rule="evenodd" d="M13.105 21.493h6.115l-6.956-7.001 7.045-7.001 1.92-1.866H14.88L6.797 13.75a1.045 1.045 0 0 0 .004 1.48zm3.676-6.985h-.047zm0 0 6.955 7-7.045 7.001-1.92 1.866h6.348l8.084-8.124a1.045 1.045 0 0 0-.004-1.48l-6.304-6.263z" fill="#000"/></g><defs><filter id="b" x="-12.69" y="-9.807" width="80.094" height="63.481" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="6.923" result="effect1_foregroundBlur_2029_330"/></filter><filter id="c" x="-22.572" y="-23.342" width="49.443" height="52.243" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="6.923" result="effect1_foregroundBlur_2029_330"/></filter><filter id="d" x="-33.901" y="9.511" width="62.557" height="59.688" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="6.923" result="effect1_foregroundBlur_2029_330"/></filter><filter id="e" x="-2.868" y="-34.139" width="60.496" height="54.155" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="6.923" result="effect1_foregroundBlur_2029_330"/></filter><clipPath id="a"><rect width="36" height="36" rx="18" fill="#fff"/></clipPath></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
3
auth/assets/custom-icons/icons/bitoasis.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 30 30">
|
||||
<path fill="#03ceaa" d="M10.898 0v5.108L7.367 1.575l-.08-.079-.079.079-5.633 5.636-.08.08.08.079 3.531 3.533H0v8.195h5.106L1.575 22.63l-.08.079.08.08 5.633 5.636.079.079.08-.079 3.531-3.533V30h8.19v-5.108l3.531 3.533.08.079.079-.079 5.633-5.636.08-.08-.08-.079-3.531-3.532h5.106v-8.195H24.88l3.531-3.533.08-.079-.08-.08-5.633-5.636-.079-.079-.08.079-3.531 3.533V0h-8.19Zm1.651 6.543h4.888V1.652h-4.888v4.891Zm6.693.748 3.457-3.458 3.456 3.458-3.456 3.458-3.457-3.458Zm-15.411 0 3.456-3.458 3.457 3.458-3.457 3.458-3.456-3.458Zm4.36 10.528v-5.638l3.985-3.986h5.635l3.984 3.986v5.638l-3.984 3.986h-5.635l-3.985-3.986Zm15.256-.374h4.888v-4.89h-4.888v4.89Zm-21.796 0H6.54v-4.89H1.651v4.89Zm17.591 5.264 3.457-3.458 3.456 3.458-3.456 3.459-3.457-3.459Zm-15.411 0 3.456-3.458 3.457 3.458-3.457 3.459-3.456-3.459Zm8.718 5.639h4.888v-4.89h-4.888v4.89Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
5
auth/assets/custom-icons/icons/blockchain.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 24 24">
|
||||
<path fill="#3d89f5" d="M2.053 8.723.958 9.818a3.12 3.12 0 0 0 0 4.5l8.82 8.91c.21.213.453.39.72.524V12.953l-8.445-4.23Z"/>
|
||||
<path fill="#1656b9" d="m21.946 8.723 1.095 1.095a3.12 3.12 0 0 1 0 4.5l-8.822 8.91c-.21.213-.452.39-.72.524V12.953l8.447-4.23Z"/>
|
||||
<path fill="#85b5f8" d="M19.827 6.488 14.307.953a3.133 3.133 0 0 0-4.5 0L4.272 6.488l7.755 3.87 7.8-3.87Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 545 B |
4
auth/assets/custom-icons/icons/booking.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 192 193">
|
||||
<path fill="#003b95" fill-rule="nonzero" d="M37.8 0h116.5C175.1 0 192 16.9 192 37.8v116.5c0 20.9-16.9 37.8-37.8 37.8H37.8C16.9 192 0 175.1 0 154.2V37.8C0 16.9 16.9 0 37.8 0Z"/>
|
||||
<path fill="#fff" fill-rule="nonzero" d="M144.2 143.8c6.7 0 12.1-5.5 12.1-12.2 0-6.7-5.4-12.2-12.1-12.2-6.7 0-12.1 5.4-12.1 12.2 0 6.7 5.5 12.2 12.1 12.2ZM106.7 91.9l-3.1-1.7 2.7-2.3c3.2-2.7 8.4-8.8 8.4-19.3 0-16.1-12.5-26.5-31.8-26.5H58.4c-5.7.2-10.3 4.9-10.4 10.6V144h35.4c21.5 0 35.4-11.7 35.4-29.8-.1-9.8-4.6-18.1-12.1-22.3ZM67.6 66c0-4.7 2-7 6.4-7.3h8.8c7.5 0 12 4.5 12 12.1 0 5.8-3.1 12.4-11.8 12.4H67.6V66Zm17.2 60.7H67.6v-20.5c0-4.4 1.7-6.7 5.5-7.2h11.7c8.4 0 13.8 5.3 13.8 13.8 0 8.8-5.3 13.9-13.8 13.9Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 874 B |
@@ -1 +0,0 @@
|
||||
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><circle cx="512" cy="512" r="512" style="fill:#002967"/><path d="M714.2 628.8 512 745.5 309.8 628.8V395.3L512 278.5l202.2 116.8zM512 256 290.3 384v256L512 768l221.7-128V384zm86.9 110.5H424.7l-20.2 88.8h215.4zM455.6 577.6v-59L404 485.8l-58.4 43.4 79.6 138.4H457l37.6-35V615zm113-108.9H455.8l19 49.6L469 574h43l43.4-.2-5.4-55.4zm51.6 16.7-51 33.2v59l-39 37.4v17.6l37.6 34.6h31.4l79.2-138z" style="fill:#fff"/></svg>
|
||||
|
Before Width: | Height: | Size: 479 B |
1
auth/assets/custom-icons/icons/crypto.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="167.1 0 2165.8 2500"><path style="fill:none" d="M0 0h2500v2500H0z"></path><path d="M1250 0 167.1 625v1250L1250 2500l1082.9-625V625zm0 0L167.1 625v1250L1250 2500l1082.9-625V625z" style="fill:#fff"></path><path d="M1677.5 2011.7h-154.1L1339 1842.4v-86.8l191-182.3v-288.6l249.6-162.8 284.3 214.8zm-638-455.7 28.2-271.3-93.3-243.1h551.2l-91.2 243.1 26.1 271.3zm125.9 286.4-184.5 171.4H824.6l-388.5-677.1L722.6 1124l251.7 160.6v288.6l191 182.3zm-342.9-1302h852.9l102 434H722.7zM1250 0 167.1 625v1250L1250 2500l1082.9-625V625z" style="fill:#03316c"></path></svg>
|
||||
|
After Width: | Height: | Size: 628 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 216.86 72"><path fill="#FF444F" d="m43.472 2.271-3.715 21.06H26.86c-12.03 0-23.498 9.744-25.623 21.77l-.9 5.118C-1.777 62.246 6.25 71.99 18.281 71.99h10.755c8.768 0 17.122-7.095 18.664-15.86L57.605 0zm-9.15 51.872c-.475 2.707-2.914 4.911-5.622 4.911h-6.534c-5.408 0-9.026-4.388-8.077-9.803l.564-3.192c.958-5.405 6.119-9.803 11.526-9.803h11.298zm108.463 17.845 8.462-47.986h13.385l-8.462 47.986zm1.448-47.433-2.016 11.419c-6.341-1.97-12.883-1.343-14.893-.942L120.806 72h-13.394l8.032-45.52c4.357-1.803 15.055-5.462 28.789-1.925m-54.27-1.232h-10.42c-10.152 0-19.83 8.221-21.619 18.37L55.819 53.62c-1.79 10.15 4.981 18.37 15.135 18.37h22.163l2.273-12.895H74.562c-3.38 0-5.644-2.737-5.041-6.127l.07-.405h33.58l1.918-10.87c1.789-10.149-4.982-18.37-15.135-18.37zm1.69 17.342-.079.692H71.606l.109-.613c.602-3.38 3.687-6.354 7.077-6.354h7.8c3.351 0 5.615 2.925 5.061 6.275m111.81-16.663h13.394c-4.563 12.126-15.019 32.755-25.149 47.986h-13.394c-4.65-14.496-7.653-34.695-8.225-47.986h13.395c.241 4.335 2.183 20.417 4.399 31.651 6.077-10.93 12.777-25.269 15.569-31.651z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256"><path d="M224 8c-.619 9.67-2.292 19.13-3.972 28.658l-.922 5.291q-1.246 7.144-2.504 14.287l-1.572 8.946q-2.46 14.025-4.935 28.05a16286 16286 0 0 0-5.661 32.272 11916 11916 0 0 1-4.395 25.025q-1.319 7.454-2.615 14.912a3013 3013 0 0 1-2.472 14.031q-.453 2.56-.893 5.121c-3.557 20.69-10.695 38.973-28.286 51.75-9.94 6.797-20.185 11.71-32.443 11.834l-3.38.039-3.634.022-3.779.025q-3.963.021-7.925.032-4.026.014-8.05.062c-3.895.043-7.788.059-11.683.069l-3.578.053c-17.241-.044-32.268-6.26-44.5-18.362C42.035 225.056 38.91 219.267 36 213l-1.375-2.937c-8.245-21.528-2.25-51.57 6.848-72.012C52.983 115.06 71.683 97.549 96 89c10.453-3.18 20.413-4.153 31.281-4.098l3.194.005c3.342.005 6.683.018 10.025.03l6.828.014q8.336.017 16.672.049l.456-2.765A5148 5148 0 0 1 176 15q8.805-1.505 17.615-2.99 2.994-.507 5.988-1.02 4.311-.734 8.624-1.459l2.69-.464C215.333 8.331 219.503 7.82 224 8M90.125 142.813c-8.985 10.66-11.885 24.665-11.477 38.468C79.55 188.25 82.955 194.174 88 199c7.78 5.626 15.988 5.808 25.214 5.707 2.35-.02 4.693.02 7.042.064 7.436.046 13.762-.18 19.998-4.701 5.69-6.744 6.89-14.473 8.324-22.925l.656-3.697q.679-3.85 1.34-7.703c.676-3.932 1.37-7.861 2.067-11.79l1.312-7.498.625-3.558.568-3.318.501-2.908c.342-2.593.418-5.06.353-7.673q-8.242-.112-16.486-.165-2.798-.022-5.594-.061c-17.177-.235-31.31.9-43.795 14.039" fill="#FF444F"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
1
auth/assets/custom-icons/icons/ecitizen_kenya.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg"><path d="M32 2C19.7 2 9.1 9.4 4.5 20h55C54.9 9.4 44.3 2 32 2" fill="#3e4347"/><path d="M32 62c12.3 0 22.9-7.4 27.5-18h-55C9.1 54.6 19.7 62 32 62" fill="#75a843"/><path d="M62 32c0-2.8-.4-5.5-1.1-8H3.1C2.4 26.5 2 29.2 2 32s.4 5.5 1.1 8h57.8c.7-2.5 1.1-5.2 1.1-8" fill="#c94747"/><g fill="#fff"><path d="M3.7 42c.2.7.5 1.3.8 2h55c.3-.7.6-1.3.8-2s.4-1.3.6-2H3.1c.2.7.4 1.3.6 2m56.6-20c-.2-.7-.5-1.3-.8-2h-55c-.3.7-.6 1.3-.8 2s-.4 1.3-.6 2h57.8c-.2-.7-.4-1.3-.6-2"/><path d="m20.2 52.3.7.4 19.3-33.4c1.1-.3 1.7-1.4 2.4-2.4.4-.7 2.1-3.6 2.8-7.3-2.9 2.5-4.5 5.3-4.9 6.1-.6 1.1-1.2 2.1-.9 3.3z"/><path d="m43.8 52.3-.7.4-19.3-33.4c-1.1-.3-1.7-1.4-2.4-2.4-.4-.7-2.1-3.6-2.8-7.3 2.9 2.5 4.5 5.3 4.9 6.1.6 1.1 1.2 2.1.9 3.3z"/></g><path d="M40 32c0 11-8 20-8 20s-8-9-8-20 8-20 8-20 8 9 8 20" fill="#c94747"/><path d="M26.1 40c1.7-1.7 2.9-4.6 2.9-8s-1.1-6.3-2.9-8c-.7 2.3-1.1 5.1-1.1 8s.4 5.7 1.1 8m11.8-16c-1.7 1.7-2.9 4.6-2.9 8s1.1 6.3 2.9 8c.7-2.3 1.1-5.1 1.1-8s-.4-5.7-1.1-8" fill="#3e4347"/><g fill="#fff"><ellipse cx="32" cy="32" rx="1.6" ry="2.4"/><path d="M31.4 12.7c-.6 1.7-1 4.9-1 8.4 0 3.6.4 6.7 1 8.4.2-2.5.4-5.3.4-8.4 0-3-.1-5.9-.4-8.4m1.2 0c.6 1.7 1 4.9 1 8.4 0 3.6-.4 6.7-1 8.4-.2-2.5-.4-5.3-.4-8.4 0-3 .1-5.9.4-8.4m-1.2 21.7c-.6 1.7-1 4.9-1 8.4 0 3.6.4 6.7 1 8.4.2-2.5.4-5.3.4-8.4 0-3-.1-5.9-.4-8.4m1.2 0c.6 1.7 1 4.9 1 8.4 0 3.6-.4 6.7-1 8.4-.2-2.5-.4-5.3-.4-8.4 0-3 .1-5.9.4-8.4"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
5
auth/assets/custom-icons/icons/infomaniak.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="512" cy="512" r="512" style="fill:#0098ff"/>
|
||||
<path d="M696.8 281H475.66v225.45L545.88 427h115.5l-88.17 83.75 93.71 156.49H560.66l-49.93-96.66-35.07 33.82v62.83h-96.1V281H327.2a46.2 46.2 0 0 0-46.2 46.2v369.6a46.2 46.2 0 0 0 46.2 46.2h369.6a46.2 46.2 0 0 0 46.2-46.2V327.2a46.2 46.2 0 0 0-46.2-46.2z" style="fill:#fff"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 557 B |
4
auth/assets/custom-icons/icons/newton.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M20.2324 2.78628H21.214V21.2136H9.76734V8.77878C9.76734 8.05185 9.17804 7.46255 8.4511 7.46255C7.72416 7.46255 7.13486 8.05185 7.13486 8.77878V22.5298C7.13486 23.2568 7.72416 23.8461 8.4511 23.8461H22.5302C23.2572 23.8461 23.8465 23.2568 23.8465 22.5298V1.47005C23.8465 0.743108 23.2572 0.153809 22.5302 0.153809H20.2324C19.5055 0.153809 18.9162 0.743108 18.9162 1.47005C18.9162 2.19698 19.5055 2.78628 20.2324 2.78628Z" fill="currentColor"></path>
|
||||
<path d="M3.76836 21.2136H2.78677V2.78632H14.2331V15.2211C14.2331 15.9481 14.8224 16.5374 15.5493 16.5374C16.2763 16.5374 16.8656 15.9481 16.8656 15.2211V1.47008C16.8656 0.743141 16.2763 0.153841 15.5493 0.153841H1.47053C0.743596 0.153841 0.154297 0.743141 0.154297 1.47008V22.5299C0.154297 23.2568 0.743596 23.8461 1.47053 23.8461H3.76836C4.49529 23.8461 5.08459 23.2568 5.08459 22.5299C5.08459 21.8029 4.49529 21.2136 3.76836 21.2136Z" fill="#2FE1B9"></path>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1022 B |
39
auth/assets/custom-icons/icons/open_observe.svg
Normal file
@@ -0,0 +1,39 @@
|
||||
<svg width="498" height="499" viewBox="0 0 498 499" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M411.491 249.489C411.491 254.498 411.243 259.461 410.814 264.38H318.347L311.288 250.053L261.062 350.343L219.497 230.446L191.171 324.058L153.304 264.38H88.0809C87.6524 259.461 87.4043 254.498 87.4043 249.489C87.4043 244.48 87.6524 239.493 88.0809 234.575H169.745L181.563 253.211L217.693 133.991L266.069 273.879L311.513 183.065L336.773 234.575H410.746C411.197 239.493 411.491 244.547 411.491 249.489Z" fill="#444444"/>
|
||||
<path d="M277.276 40.9205C277.132 49.4665 274.393 57.7665 269.422 64.7181C264.451 71.6697 257.484 76.9441 249.446 79.8408C227.172 79.8408 205.116 84.2302 184.538 92.7583C163.96 101.286 145.263 113.786 129.514 129.544C113.765 145.302 101.273 164.009 92.751 184.597C84.2292 205.184 79.8446 227.25 79.8476 249.533C76.9636 241.367 71.6193 234.295 64.5508 229.294C57.4824 224.292 49.0376 221.607 40.3798 221.607C31.7221 221.607 23.2773 224.292 16.2089 229.294C9.14043 234.295 3.79611 241.367 0.912119 249.533C0.90323 216.878 7.32551 184.541 19.8121 154.369C32.2987 124.198 50.6048 96.7832 73.6848 73.6914C96.7648 50.5996 124.166 32.2832 154.324 19.7887C184.482 7.29408 216.805 0.866146 249.446 0.872074C257.664 3.83466 264.758 9.28105 269.745 16.4566C274.731 23.6322 277.363 32.1817 277.276 40.9205Z" fill="url(#paint0_linear_430_3947)"/>
|
||||
<path d="M497.934 249.488C495.05 257.655 489.706 264.726 482.637 269.728C475.569 274.729 467.124 277.415 458.466 277.415C449.809 277.415 441.364 274.729 434.295 269.728C427.227 264.726 421.883 257.655 418.999 249.488C418.987 204.503 401.12 161.362 369.326 129.551C337.532 97.7388 294.412 79.8588 249.445 79.8408C257.609 76.9556 264.677 71.609 269.676 64.5376C274.676 57.4662 277.36 49.0179 277.36 40.3564C277.36 31.695 274.676 23.2467 269.676 16.1753C264.677 9.10385 257.609 3.75728 249.445 0.87207C282.079 0.87207 314.394 7.30288 344.543 19.7973C374.693 32.2917 402.087 50.605 425.161 73.6914C448.236 96.7779 466.539 124.185 479.026 154.349C491.512 184.512 497.937 216.841 497.934 249.488Z" fill="url(#paint1_linear_430_3947)"/>
|
||||
<path d="M497.933 249.488C497.936 282.134 491.511 314.462 479.024 344.624C466.537 374.786 448.234 402.192 425.159 425.276C402.084 448.361 374.69 466.672 344.54 479.164C314.391 491.656 282.077 498.084 249.444 498.081C241.281 495.196 234.213 489.849 229.213 482.778C224.214 475.707 221.529 467.258 221.529 458.597C221.529 449.935 224.214 441.487 229.213 434.416C234.213 427.344 241.281 421.998 249.444 419.112C271.718 419.115 293.774 414.729 314.354 406.203C334.933 397.678 353.632 385.181 369.383 369.425C385.134 353.67 397.629 334.964 406.153 314.377C414.678 293.791 419.065 271.726 419.065 249.442C421.949 257.609 427.293 264.68 434.362 269.682C441.43 274.683 449.875 277.369 458.533 277.369C467.191 277.369 475.635 274.683 482.704 269.682C489.772 264.68 495.117 257.609 498.001 249.442L497.933 249.488Z" fill="url(#paint2_linear_430_3947)"/>
|
||||
<path d="M249.446 498.083C183.542 498.083 120.338 471.892 73.7377 425.271C27.137 378.651 0.957031 315.42 0.957031 249.489C3.84102 241.322 9.18534 234.251 16.2538 229.25C23.3222 224.248 31.767 221.562 40.4247 221.562C49.0825 221.562 57.5273 224.248 64.5957 229.25C71.6642 234.251 77.0085 241.322 79.8925 249.489C79.8925 294.488 97.7608 337.645 129.567 369.464C145.315 385.219 164.012 397.717 184.588 406.244C205.165 414.771 227.219 419.159 249.491 419.159C241.328 422.044 234.259 427.391 229.26 434.462C224.261 441.534 221.576 449.982 221.576 458.644C221.576 467.305 224.261 475.753 229.26 482.825C234.259 489.896 241.328 495.243 249.491 498.128L249.446 498.083Z" fill="url(#paint3_linear_430_3947)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_430_3947" x1="0.957225" y1="125.169" x2="277.276" y2="125.169" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#D1C6E0"/>
|
||||
<stop offset="0.35" stop-color="#9274B2"/>
|
||||
<stop offset="0.71" stop-color="#652F8D"/>
|
||||
<stop offset="1" stop-color="#2B1143"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_430_3947" x1="249.445" y1="139.09" x2="497.934" y2="139.09" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.01" stop-color="#82C2DF"/>
|
||||
<stop offset="0.3" stop-color="#3CAFD9"/>
|
||||
<stop offset="0.59" stop-color="#0379B8"/>
|
||||
<stop offset="0.7" stop-color="#006DAC"/>
|
||||
<stop offset="0.73" stop-color="#006AA9"/>
|
||||
<stop offset="0.91" stop-color="#334C84"/>
|
||||
<stop offset="1" stop-color="#3A447A"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_430_3947" x1="240.4" y1="466.797" x2="581.559" y2="212.975" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#0C6237"/>
|
||||
<stop offset="0.406444" stop-color="#31BB77"/>
|
||||
<stop offset="0.752196" stop-color="#5BC792"/>
|
||||
<stop offset="0.98" stop-color="#B1E9CD"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_430_3947" x1="0.957031" y1="359.865" x2="249.446" y2="359.865" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#931B1E"/>
|
||||
<stop offset="0.32" stop-color="#ED4725"/>
|
||||
<stop offset="0.38" stop-color="#EE5F26"/>
|
||||
<stop offset="0.53" stop-color="#F08F27"/>
|
||||
<stop offset="0.74" stop-color="#F5C321"/>
|
||||
<stop offset="0.88" stop-color="#F8D718"/>
|
||||
<stop offset="1" stop-color="#F6DF65"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.1 KiB |
31
auth/assets/custom-icons/icons/shakepay.svg
Normal file
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 545.5 445.6" style="enable-background:new 0 0 545.5 445.6;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#00A2FF;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st0" d="M302.5,316.3c-2.1-0.5-4.2-1-6.2-1.4c-14.7-2.9-29.8-3-44.5-0.3c-1.8,0.3-3.6,0.7-5.4,1.2
|
||||
c-11.2,2.8-13.9,9.2-8.8,19.4c5.8,12,15.1,20.8,27.2,26.7c5.9,3,12.9,2.9,18.7-0.2c11.9-5.9,21.4-15.7,27-27.7
|
||||
C314.8,324.4,312.7,318.9,302.5,316.3z"/>
|
||||
<path class="st0" d="M507.2,11.2c-34-35.7-158.2,24.1-184.7,37.4c-3.3,1.7-7,2.6-10.8,2.6h-38.3l-38.7,0.1c-3.8,0-7.5-0.9-10.9-2.6
|
||||
C197.3,35.3,73.2-24.4,39.3,11.2C1.2,51.2-11.1,314.6,11,340.4c11.5,13.4,90,57.8,152.4,81.5c23,8.9,62.5,23.7,110,23.7
|
||||
c46.1,0,87.8-14,109.2-23.5c98.7-43.3,140.2-67.4,151.7-80.8C556.3,315.5,545.3,51.2,507.2,11.2z M374.2,66.8
|
||||
c0,0,25.3-18.2,61.9-27.1c5-1.2,10.1-1.8,15.3-1.7c18.6,0,32.8,12.1,37.3,30.9c0,0,8.3,36.7,8.7,69.9c0.1,11.1-8.4,18.9-18.9,18.9
|
||||
c-2.8,0-5.6-0.7-8.1-1.9h-0.1l-97.2-56l0,0c-5.3-3.1-8.7-8.6-9.2-14.7c0-0.5-0.1-1-0.1-1.5C363.8,76.3,368,70.9,374.2,66.8
|
||||
L374.2,66.8z M57.1,69c4.4-18.9,18.7-30.9,37.3-30.9c5.2-0.1,10.3,0.4,15.3,1.7c36.6,8.9,61.9,27.1,61.9,27.1
|
||||
c6.3,4.1,10.4,9.5,10.4,16.8c0,0.5,0,1-0.1,1.5c-0.5,6.1-3.9,11.6-9.2,14.7l0,0L75.4,156h-0.1c-2.5,1.2-5.3,1.8-8.1,1.9
|
||||
c-10.4,0-19-7.8-18.9-18.9C48.8,105.6,57.1,69,57.1,69L57.1,69z M133.8,261.9l-0.1,0.1l-41.8,27.6c-12.1,8-16.2,12.1-19.3,17.7
|
||||
c-2.7,4.7-3.6,10.2-3.7,15.6c0,6.1-2.2,9.9-3.9,11.7c-4,4.1-8.9,5-14.5,3.5c-2.4-0.6-4.7-1.7-6.6-3.3c-20-16.4-22.3-48.4-5.1-71.2
|
||||
c10.8-14.4,18.4-18.5,64.1-48.6s52.5-35.4,70-39.7c27.7-6.8,56.2,7.9,63.4,32.8c0.7,2.4,0.8,4.9,0.4,7.3c-0.8,5.7-3.5,9.9-8.9,11.9
|
||||
c-2.3,0.9-6.7,1.3-12.3-1c-5-2.2-10.4-3.2-15.8-2.8c-6.4,0.7-11.8,2.8-23.9,10.7L134,261.8L133.8,261.9z M385,364.2
|
||||
c-7.9,9.8-17.8,19.2-28.6,24.9c-55,29.2-110.9,29-165.9-0.2c-10.6-5.6-20.3-14.8-28.1-24.4c-14.3-17.7-13.8-39.8-0.5-58.5
|
||||
c8.1-11.4,18.8-19.5,30.6-26c25.5-13.9,52.7-19.7,81.2-19.9c29.5,0.3,57.9,5.9,83.5,21.8c10.6,6.6,20.1,14.9,27.9,24.7
|
||||
C399.2,324.3,399,346.8,385,364.2L385,364.2z M501.9,334.8c-1.9,1.6-4.2,2.7-6.6,3.3c-5.5,1.5-10.5,0.7-14.5-3.5
|
||||
c-1.7-1.8-3.9-5.6-3.9-11.7c0.1-5.4-1.1-10.8-3.7-15.6c-3.1-5.6-7.2-9.7-19.3-17.7L412,262l-0.1-0.1l-0.1-0.1L370,234.2
|
||||
c-12.1-8-17.5-10.1-23.9-10.7c-5.4-0.6-10.8,0.7-15.8,2.8c-5.6,2.4-10,1.9-12.3,1c-5.4-2-8.1-6.2-8.9-11.9
|
||||
c-0.4-2.4-0.3-4.9,0.4-7.3c7.2-24.8,35.7-39.6,63.4-32.8c17.5,4.3,24.3,9.6,70,39.7c45.7,30.1,53.3,34.3,64.1,48.6
|
||||
C524.2,286.4,521.9,318.5,501.9,334.8L501.9,334.8z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
10
auth/assets/custom-icons/icons/sms_pool_net.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<svg width="114" height="47" viewBox="0 0 114 47" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M51.2384 0H9.40916C6.91615 0.00798102 4.52753 1.00186 2.76469 2.76469C1.00186 4.52753 0.00798102 6.91615 0 9.40916L0 27.582C0.0078085 30.075 1.00163 32.4638 2.7645 34.2266C4.52737 35.9895 6.91609 36.9833 9.40916 36.9911H40.0383L51.3154 46.1371V36.9911C53.7957 36.9643 56.1658 35.9621 57.9127 34.2012C59.6597 32.4403 60.6431 30.0624 60.6502 27.582V9.40916C60.6419 6.9158 59.6476 4.52698 57.8842 2.76415C56.1209 1.00132 53.7318 0.00763233 51.2384 0Z" fill="#224ABE"/>
|
||||
<path d="M72.2326 9.89356C73.1071 9.8842 73.9779 10.0091 74.8145 10.264C75.5491 10.4849 76.2303 10.8549 76.8154 11.351C77.3708 11.8338 77.8135 12.4326 78.1123 13.1052C78.7382 14.6244 78.7382 16.3294 78.1123 17.8486C77.8138 18.5213 77.371 19.1201 76.8154 19.6027C76.2302 20.0987 75.549 20.4687 74.8145 20.6897C73.9778 20.9445 73.1071 21.0694 72.2326 21.0602H70.0612V27.1893H66.3555V9.89356H72.2326ZM70.0612 17.7749H72.3076C72.9682 17.8018 73.6167 17.5918 74.1361 17.1827C74.3625 16.9654 74.5428 16.7046 74.6659 16.4159C74.789 16.1273 74.8524 15.8167 74.8524 15.5029C74.8524 15.189 74.789 14.8785 74.6659 14.5898C74.5428 14.3011 74.3625 14.0403 74.1361 13.823C73.6167 13.4138 72.9682 13.2038 72.3076 13.2308H70.0593L70.0612 17.7749Z" fill="#224ABE"/>
|
||||
<path d="M79.4944 20.7325C79.4871 19.8818 79.6519 19.0385 79.9788 18.2531C80.3057 17.4677 80.7879 16.7565 81.3966 16.1622C82.002 15.5775 82.715 15.1158 83.4962 14.8028C85.18 14.1445 87.05 14.1445 88.7338 14.8028C89.5149 15.116 90.2278 15.5777 90.8333 16.1622C91.4407 16.7583 91.9231 17.4695 92.2524 18.2543C92.5818 19.039 92.7514 19.8815 92.7514 20.7325C92.7514 21.5835 92.5818 22.426 92.2524 23.2108C91.9231 23.9955 91.4407 24.7067 90.8333 25.3029C90.2281 25.8876 89.5151 26.3491 88.7338 26.6616C87.0501 27.3206 85.1798 27.3206 83.4962 26.6616C82.7148 26.3492 82.0017 25.8877 81.3966 25.3029C80.7879 24.7085 80.3057 23.9973 79.9788 23.2119C79.6519 22.4265 79.4871 21.5832 79.4944 20.7325ZM83.0521 20.7325C83.0476 21.1571 83.1316 21.5779 83.2988 21.9682C83.4555 22.3341 83.6774 22.6685 83.9535 22.9552C84.2289 23.2376 84.5565 23.464 84.9181 23.6217C85.48 23.8617 86.1013 23.9265 86.7006 23.8075C87.2999 23.6886 87.8494 23.3915 88.2771 22.9552C88.5534 22.6687 88.7753 22.3342 88.9317 21.9682C89.0947 21.5767 89.1787 21.1569 89.1787 20.7328C89.1787 20.3088 89.0947 19.889 88.9317 19.4975C88.774 19.1314 88.5511 18.7969 88.2738 18.5105C87.8461 18.0742 87.2966 17.7771 86.6973 17.6582C86.098 17.5392 85.4767 17.604 84.9148 17.844C84.5533 18.002 84.2258 18.2283 83.9502 18.5105C83.6742 18.7973 83.4524 19.1317 83.2955 19.4975C83.1298 19.8879 83.0465 20.3085 83.0521 20.7325Z" fill="#224ABE"/>
|
||||
<path d="M94.5647 20.7323C94.5574 19.8816 94.7222 19.0383 95.0491 18.2529C95.376 17.4675 95.8582 16.7563 96.4669 16.1619C97.0722 15.5772 97.7853 15.1155 98.5666 14.8025C100.25 14.1443 102.12 14.1443 103.803 14.8025C104.585 15.1157 105.298 15.5773 105.903 16.1619C106.51 16.7582 106.993 17.4694 107.322 18.2541C107.651 19.0389 107.821 19.8813 107.821 20.7323C107.821 21.5833 107.651 22.4257 107.322 23.2104C106.993 23.9952 106.51 24.7064 105.903 25.3026C105.298 25.8874 104.585 26.3489 103.803 26.6614C102.12 27.3204 100.25 27.3204 98.5666 26.6614C97.7851 26.349 97.072 25.8875 96.4669 25.3026C95.8582 24.7083 95.376 23.9971 95.0491 23.2117C94.7222 22.4263 94.5574 21.583 94.5647 20.7323ZM98.1224 20.7323C98.1182 21.1568 98.2022 21.5776 98.3691 21.968C98.5266 22.3342 98.7496 22.6687 99.0271 22.9549C99.3025 23.2374 99.6302 23.4637 99.9918 23.6215C100.554 23.8613 101.175 23.926 101.775 23.8071C102.374 23.6882 102.923 23.3912 103.351 22.9549C103.629 22.6685 103.852 22.3341 104.009 21.968C104.172 21.5765 104.256 21.1566 104.256 20.7326C104.256 20.3086 104.172 19.8887 104.009 19.4973C103.852 19.1312 103.629 18.7968 103.351 18.5103C102.924 18.074 102.374 17.7769 101.775 17.658C101.175 17.5391 100.554 17.6038 99.9918 17.8438C99.6303 18.0017 99.3027 18.228 99.0271 18.5103C98.7498 18.7967 98.5268 19.1311 98.3691 19.4973C98.2026 19.8875 98.1189 20.308 98.1231 20.7323H98.1224Z" fill="#224ABE"/>
|
||||
<path d="M113.507 9.89404V27.1878H109.9V9.89404H113.507Z" fill="#224ABE"/>
|
||||
<path d="M8.76285 21.4469C9.03704 22.1328 9.49428 22.7303 10.0847 23.1741C10.6644 23.6106 11.3726 23.8421 12.0982 23.8321C12.652 23.8475 13.1979 23.6982 13.6668 23.4031C13.8758 23.2731 14.0465 23.09 14.1616 22.8724C14.2766 22.6549 14.3318 22.4107 14.3215 22.1648C14.3215 21.3866 13.7205 20.7911 12.5186 20.3783L10.4433 19.6638C9.31171 19.3025 8.27973 18.6828 7.42912 17.8537C7.05614 17.4609 6.76559 16.9974 6.57461 16.4906C6.38362 15.9838 6.29607 15.4438 6.31712 14.9026C6.30603 14.1936 6.44927 13.4906 6.73692 12.8425C7.01137 12.2378 7.41576 11.7011 7.92129 11.2705C8.44924 10.8233 9.05689 10.4797 9.71232 10.2579C10.4402 10.0125 11.2044 9.89166 11.9725 9.90061C13.2075 9.88661 14.422 10.2165 15.4802 10.8534C16.5198 11.4741 17.3459 12.3964 17.8489 13.4978L14.761 15.2132C14.5069 14.6697 14.1404 14.1862 13.6859 13.7946C13.2284 13.4035 12.6426 13.1954 12.0409 13.2103C11.5434 13.1862 11.052 13.3288 10.6447 13.6156C10.4757 13.7376 10.339 13.899 10.2465 14.0858C10.154 14.2725 10.1084 14.4791 10.1137 14.6874C10.109 14.8733 10.1466 15.0577 10.2236 15.2269C10.3007 15.396 10.4152 15.5455 10.5585 15.6639C10.9272 15.958 11.3454 16.1839 11.7935 16.3311L14.0418 17.1647C15.2203 17.5328 16.2868 18.1926 17.1423 19.0828C17.8174 19.8746 18.1741 20.8891 18.1431 21.9292C18.1578 22.7049 17.984 23.4727 17.6364 24.1663C17.31 24.8043 16.851 25.3652 16.2902 25.8113C15.7102 26.265 15.0534 26.6109 14.3511 26.8325C13.6047 27.0725 12.825 27.1931 12.0409 27.1898C11.3399 27.1929 10.6417 27.1006 9.96564 26.9154C9.32263 26.7399 8.70737 26.4752 8.13776 26.1291C7.57392 25.784 7.06641 25.3544 6.63296 24.8552C6.17983 24.3333 5.82033 23.7369 5.57031 23.0925L8.76285 21.4469Z" fill="#FAFAFA"/>
|
||||
<path d="M39.5921 9.89404V27.1878H35.9857V16.2811L31.4844 27.1878H28.8308L24.3499 16.3304V27.1872H20.7441V9.89404H25.2651L30.2296 21.9259L35.6646 9.89404H39.5921Z" fill="#FAFAFA"/>
|
||||
<path d="M45.5596 21.447C45.8338 22.1329 46.2911 22.7304 46.8815 23.1742C47.4612 23.6107 48.1694 23.8422 48.895 23.8322C49.4488 23.8476 49.9947 23.6983 50.4636 23.4032C50.6726 23.2733 50.8434 23.0901 50.9584 22.8726C51.0734 22.655 51.1286 22.4108 51.1183 22.1649C51.1183 21.3867 50.5173 20.7912 49.3154 20.3784L47.2415 19.6606C46.1098 19.2994 45.0779 18.6796 44.2272 17.8505C43.8543 17.4577 43.5637 16.9943 43.3727 16.4874C43.1817 15.9806 43.0942 15.4406 43.1152 14.8994C43.1042 14.1904 43.2474 13.4874 43.535 12.8393C43.8095 12.2346 44.2139 11.6979 44.7194 11.2674C45.2474 10.8201 45.855 10.4766 46.5104 10.2547C47.2383 10.0093 48.0025 9.88846 48.7706 9.89744C50.0056 9.88344 51.2201 10.2133 52.2783 10.8502C53.3196 11.4692 54.1478 12.3904 54.653 13.4913L51.565 15.2067C51.3109 14.6632 50.9445 14.1797 50.4899 13.7881C50.0323 13.3974 49.4465 13.1893 48.845 13.2038C48.3476 13.1798 47.8565 13.3225 47.4494 13.6091C47.2804 13.7312 47.1438 13.8926 47.0513 14.0793C46.9587 14.2661 46.9131 14.4726 46.9184 14.681C46.9137 14.8668 46.9513 15.0513 47.0283 15.2204C47.1054 15.3896 47.2199 15.539 47.3632 15.6574C47.7319 15.9515 48.1501 16.1775 48.5982 16.3246L50.8465 17.1583C52.025 17.5264 53.0915 18.1861 53.9469 19.0763C54.6221 19.8681 54.9788 20.8826 54.9477 21.9227C54.9625 22.6985 54.7887 23.4662 54.4411 24.1599C54.1147 24.7979 53.6557 25.3587 53.0949 25.8048C52.5151 26.2598 51.8583 26.6068 51.1558 26.8293C50.4093 27.0694 49.6297 27.1899 48.8456 27.1866C48.1448 27.1897 47.4469 27.0974 46.771 26.9122C46.128 26.7367 45.5127 26.4721 44.9431 26.1259C44.3784 25.781 43.8699 25.3514 43.4357 24.8521C42.9826 24.3301 42.6231 23.7338 42.373 23.0893L45.5596 21.447Z" fill="#FAFAFA"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.5 KiB |
1
auth/assets/custom-icons/icons/smtp2go.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0.6000006198883057 0.9885644912719727 95 37.2114372253418" enable-background="new 0 0 96 39"><path fill="#ABD3FF" d="M54.6 38.2c-.4 0-.8-.1-1.1-.4-.7-.5-.9-1.5-.4-2.3.1-.2 11.3-18.8 5.5-28-1.2-1.9-2.5-3-4-3-2.8-.1-5.9 3-6.9 4.3-.6.8-1.7.9-2.5.3-.8-.6-.9-1.7-.3-2.5.2-.2 4.6-5.9 9.8-5.6 2.7.1 5 1.7 6.8 4.7 4.3 6.9 1.3 17.3-1.7 24.2 3.1-2.2 7-4.3 10.6-4.9 1-.1 1.9.5 2 1.5.1 1-.5 1.9-1.5 2-6.9 1.1-15.1 9.1-15.2 9.2-.2.4-.7.5-1.1.5z"></path><g fill="#fff"><path d="M11.5 23.5c0 .9-.2 1.8-.7 2.5s-1.2 1.3-2.1 1.7-2 .6-3.3.6c-1 0-1.9-.1-2.6-.2-.7-.1-1.4-.4-2.2-.7v-3.6c.8.4 1.6.7 2.5.9.8.2 1.6.3 2.3.3.6 0 1.1-.1 1.4-.3.3-.2.4-.5.4-.8 0-.2-.1-.4-.2-.5 0-.2-.2-.4-.5-.5-.3-.2-1-.5-2.1-1-1-.4-1.8-.9-2.3-1.3-.5-.4-.9-.9-1.1-1.4-.2-.5-.4-1.2-.4-1.9 0-1.4.5-2.5 1.6-3.2 1-.8 2.5-1.2 4.3-1.2 1.6 0 3.3.4 4.9 1.1l-1.2 3c-1.5-.6-2.7-1-3.8-1-.5 0-.9.1-1.2.3-.2.2-.4.5-.4.7 0 .3.2.6.5.8.3.2 1.2.7 2.6 1.3 1.3.6 2.3 1.2 2.8 1.9s.8 1.5.8 2.5zM20.3 28.1l-3.2-10.9H17c.1 1.9.2 3.3.2 4.3V28h-3.7V13h5.6l3.3 10.7h.1L25.6 13h5.6v15.1h-3.9V20.4s.1-1.4.1-3.1h-.1l-3.1 10.8h-3.9zM40.6 28.1h-4.2V16.3h-3.8V13h11.8v3.3h-3.8v11.8zM57.5 17.8c0 1.7-.5 3-1.5 3.9-1 .9-2.5 1.4-4.4 1.4h-1.2v5h-4.2V13h5.4c2 0 3.5.4 4.4 1.2 1 .9 1.5 2.1 1.5 3.6zm-7.1 2h.8c.6 0 1.1-.2 1.5-.5.4-.3.6-.8.6-1.4 0-1-.6-1.5-1.8-1.5h-1.1v3.4zM72 19.3h6.7v8.1c-1.8.6-3.8.9-6 .9-2.4 0-4.3-.7-5.6-2-1.3-1.3-2-3.3-2-5.8 0-2.4.7-4.3 2.2-5.7 1.4-1.4 3.5-2 6-2 1 0 1.9.1 2.8.3.9.2 1.6.4 2.3.7L77 16.9c-1.1-.5-2.4-.8-3.7-.8-1.2 0-2.2.4-2.9 1.2-.7.8-1 1.9-1 3.3s.3 2.5.9 3.2c.6.7 1.5 1.1 2.6 1.1.6 0 1.2-.1 1.7-.2v-2.4H72v-3zM95.6 20.5c0 2.5-.6 4.5-1.9 5.8s-3.2 2-5.7 2c-2.4 0-4.3-.7-5.6-2-1.3-1.3-2-3.3-2-5.8s.7-4.4 1.9-5.8 3.2-2 5.7-2 4.4.7 5.6 2 2 3.3 2 5.8zm-10.7 0c0 2.9 1.1 4.4 3.2 4.4 1.1 0 1.9-.4 2.4-1.1.5-.7.8-1.8.8-3.3 0-1.5-.3-2.6-.8-3.3-.5-.7-1.3-1.1-2.3-1.1-2.3 0-3.3 1.5-3.3 4.4z"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
12
auth/assets/custom-icons/icons/vikunja.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 256 256" width="256" height="256">
|
||||
<path d="M2268.2 2512.3a953.7 953.7 0 0 1-50 57c-180.5 189.5-426.2 294-691.6 294A953.7 953.7 0 0 1 847.8 2582a952.7 952.7 0 0 1-281.2-678.8 953.8 953.8 0 0 1 281.2-678.9 953.7 953.7 0 0 1 678.8-281.1 953.7 953.7 0 0 1 678.8 281.1 953.7 953.7 0 0 1 281.2 678.9c0 219.2-78.9 437.2-218.4 609" style="fill:#196aff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1823.7 1650.9c35.7 104.2 94.7 136.1 102 297 2.6 56.5-14.7 236-14.7 236s28 72-25.8 152.3c-83.5 124.3-255.4 132.8-345.7 132.8-90.3 0-260.2-8.5-343.7-132.8C1142 2256 1170 2184 1170 2184s-9.5-92.4-16.7-173.8c-1.7-19.1.1-94.7 2.4-113a453 453 0 0 1 25.8-96.2c14.4-39.6 36.8-79.9 54-120.5 51.8-122.8 8.4-274.9 11.1-407.3 2.2-94-20-189.3-28.7-281.2a960.4 960.4 0 0 1 308.7-50.6 958.6 958.6 0 0 1 344.9 63.6c-20.4 115-44.1 224.2-47.8 265.9-10.6 125.9-41.3 259.4 0 380" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36655635" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1162.9 2383.9c1.1-18.8 3-38 8.3-56.2 1.6-5.7 4-19.7 11.4-21.8 9-2.6 25.9 8.3 32.3 13 12.3 9 23.9 18.5 36.2 27.6 8 6 16.5 10.5 24.3 16.5 8.4 6.6 14.7 14.5 21.7 22.2 8.4 9.4 14.8 19 21.3 29.5 5.1 8.2 37.1 13.5 42.2 21 5.6 8.3 1 18.6 1 28.7 0 74.2 4.4 147.6 6.1 220.3 1.8 50 21.4 109.2-53.4 85.8-160.3-50-158.5-271.3-151.4-386.6M1869.1 2279.7c-1.6 1.8-4.2 3.2-6.3 4.8a208 208 0 0 0-25.1 21.5c-9.4 9.6-19.2 19-28.2 28.9-7.9 8.7-17.3 16.6-25 25.6-5.1 6-10 12.3-14.6 18.5-2.3 3.2-3.5 7-5.3 10.4-2.7 5-40 10.1-36.2 15 6.3 8.3 20.3 15.4 23.7 25 17.2 48.6 24.8 244.5 26.8 294.5 5.4 127.8 117.6-6.3 137.2-57.7 57-149.7 23.2-258.8-46.3-386.6" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1716.5 1787.9c-.1 73.8-9.3 103.6-50.4 139.7-25.8 22.6-55.9 31.2-103.8 30-47.9 1.2-82.4-13.4-107.3-39.2-37.5-39-47.4-62-47.5-135.9 0-39.9 43-128.1 55.7-148.5 21.3-36 60.6-48.9 99.1-46.2 38.6-2.7 77.9 10.3 99.1 46.2 12.8 20.4 55.1 107 55 153.9" style="fill:#f1e6d3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1226.6 2316c-9.6 86.2-38.6 240 61.5 331.3 11 10.1 14-24.2 15.8-38 2.6-19 0-73.5.4-92.6.7-36.1 8.3-55 4.7-71.5-9.6-45-17.3-42.2-26.5-69.6-18.3-54.4-53.3-83-55.9-59.5M1851.7 2333c10.3-18.2 37 80.3 45.4 123.2 8 40.3 18 93.8 4 133.9-7.4 21.5-53 84.5-58.4 62.9-2-8.5-3.2-71.1-8.3-101.1-6.4-37.1-18-73.8-18-111.6-.2-84.5 25.3-88 35.3-107.2" style="fill:#f1d7d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1522 1319.7c-2.2-6.5-18.6-11.4-24.8-13.3-14.9-4.9-28.1 6.9-36.4 16.8-11.6 13.7-11.3 35.6-16.2 51.6-2.9 9.7-19.5 11-24.5 2-16.6-29.8-81.1 26.4-66.1 45.2 9.9 12.3-13.8 23.2-23.6 11-29-36.1 49-103.4 93.6-85.2 2-9 4-18 8-26.6 7.4-16.9 23.9-27.8 41-37 23.1-12.4 68.2 9.5 75 30.3 4.9 14.5-21.2 19.7-26 5.2M1727.6 1538.2c2.4-10 2.8-44-16-25.4-7.5 7.5-22.6 3-23.2-7-1.4-23.4-24.9-24-45.1-16.9-16 5.6-24.6-16.6-8.6-22.1 29.7-10.4 62-4.6 74.7 17.8 10.1-4.7 21.5-6 30.7 2.6 16 15 18.4 36.2 13.7 55.7-3.5 14.8-29.7 10.1-26.2-4.7M1775 1049.2c-7-14.3-19.8-13.4-33.6-7.4-10.1 4.4-22.6-2.8-19.6-13 6.2-20.6-19.7-26.6-37.3-19.3-15.4 6.5-28.8-13.8-13.2-20.3 31.6-13.2 71.7-1.6 77.5 26.2 20.4-3.3 39.8 2.4 49.4 22.3 6.7 13.6-16.4 25.4-23.2 11.5M1569.8 2153.3c-3.3-20.2-41.1 3.3-50.5 9.7-8.3 5.5-19 2.1-20-7.3-1.4-12.7-18.5-9-26.3-7.4-14.8 3-27.4 12.2-27.7 26-.4 13.6 8.2 27.7 12.6 40.4 2.9 8-8.7 17-17.2 11.5-15.2-9.7-88.7-18.5-59.4 13.6 9.3 10.2-7.1 24.8-16.6 14.5-13.5-14.8-22.6-48.7 6.6-56 15.5-3.7 37.8-3.5 56.8.8-8-25.5-9.6-48.8 23.2-65.1 22.1-11.1 52.5-11 65.4 6 27.2-14.5 69.7-28.7 75.6 7.8 2.1 13-20.4 18.5-22.5 5.5" style="fill:#faeee0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1443 1685.6c39.4-3.4 78.8-12.3 118.5-10.9 25.4 1 51.7 4.5 76.8 8.2 18.2 2.7 40.5 6 52.7 19.4 1-45-92.6-59.1-128.9-60-42.1-1-89.5 17.2-119 43.3" style="fill:#494949;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1549.4 1779.5a353.5 353.5 0 0 1-2.7-87.3c.7-7.6-1.3-25.7 8.8-29.5 8.2-3 18.3 2.7 19.7 10.1 2.2 12.5-3 28.2-3.5 41-.5 14.9 0 29.8 1.6 44.7 1 8.8 5.9 20.7-4.2 27-7.4 4.5-18.3 2.8-19.7-6" style="fill:#494949;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1626 1849.7c-23.7-1-45.7-14.2-63.4-27-16.1 10.7-40.5 20.5-60.7 14.8-12-3.4-1.1-7.1 4-10.3 9.2-6.2 16.8-14.2 23.7-22.4 10.3-12.6 19.6-25.8 30.7-38 7.6 5.6 15 11.1 21.6 17.6 3.1 3 28.5 37 32.4 42.7 2.4 3.6 5 7.4 7.8 10.8 2.9 3.5 11 9 3.9 11.8" style="fill:#494949;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
<path d="M1326.5 2010c11.7 30.3 24.3 68.4 56.3 62.4 24.2-5.2 56.7-86.2 36-78.2-11.3 4.4-20.3 41.1-41.4 46-13.4 3-32-43.6-50-48.4-8.7-2.3-4.3 10.4-.9 18.2M1670.6 2010c11.7 30.3 24.2 68.4 56.3 62.4 24.2-5.2 56.7-86.2 35.9-78.2-11.3 4.4-20.2 41.1-41.3 46-13.5 3-32-43.6-50-48.4-8.7-2.3-4.4 10.4-1 18.2" style="fill:#2c3844;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
@@ -36,5 +36,5 @@ file, that adheres to the above format.
|
||||
|
||||
SUPPORT
|
||||
|
||||
If you need help, please reach out to support@ente.io, and a human will get in touch with you.
|
||||
If you need help, please visit @ https://github.com/ente-io/ente/discussions/new?category=q-a, and someone will get in touch with you.
|
||||
If you have feature requests, please create an issue @ https://github.com/ente-io/ente
|
||||
|
||||
@@ -2,5 +2,4 @@ flutter_icons:
|
||||
android: "launcher_icon"
|
||||
image_path: "assets/generation-icons/icon-light.png"
|
||||
adaptive_icon_foreground: "assets/generation-icons/icon-light-adaptive-fg.png"
|
||||
adaptive_icon_background: "#ffffff"
|
||||
|
||||
adaptive_icon_background: "assets/generation-icons/icon-light-adaptive-bg.png"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>auth</string>
|
||||
<string>Ente Auth</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
||||
@@ -13,6 +13,7 @@ import 'package:ente_auth/models/key_attributes.dart';
|
||||
import 'package:ente_auth/models/key_gen_result.dart';
|
||||
import 'package:ente_auth/models/private_key_attributes.dart';
|
||||
import 'package:ente_auth/store/authenticator_db.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:ente_crypto_dart/ente_crypto_dart.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
@@ -140,6 +141,7 @@ class Configuration {
|
||||
iOptions: _secureStorageOptionsIOS,
|
||||
);
|
||||
}
|
||||
await LockScreenSettings.instance.removePinAndPassword();
|
||||
await AuthenticatorDB.instance.clearTable();
|
||||
_key = null;
|
||||
_cachedToken = null;
|
||||
@@ -283,9 +285,20 @@ class Configuration {
|
||||
Future<void> recover(String recoveryKey) async {
|
||||
// check if user has entered mnemonic code
|
||||
if (recoveryKey.contains(' ')) {
|
||||
if (recoveryKey.split(' ').length != mnemonicKeyWordCount) {
|
||||
final split = recoveryKey.split(' ');
|
||||
if (split.length != mnemonicKeyWordCount) {
|
||||
String wordThatIsFollowedByEmptySpaceInSplit = '';
|
||||
for (int i = 0; i < split.length; i++) {
|
||||
String word = split[i];
|
||||
if (word.isEmpty) {
|
||||
wordThatIsFollowedByEmptySpaceInSplit =
|
||||
'\n\nExtra space after word at position $i';
|
||||
break;
|
||||
}
|
||||
}
|
||||
throw AssertionError(
|
||||
'recovery code should have $mnemonicKeyWordCount words',
|
||||
'\nRecovery code should have $mnemonicKeyWordCount words, '
|
||||
'found ${split.length} words instead.$wordThatIsFollowedByEmptySpaceInSplit',
|
||||
);
|
||||
}
|
||||
recoveryKey = bip39.mnemonicToEntropy(recoveryKey);
|
||||
@@ -469,7 +482,13 @@ class Configuration {
|
||||
await _preferences.setBool(hasOptedForOfflineModeKey, true);
|
||||
}
|
||||
|
||||
bool shouldShowLockScreen() {
|
||||
Future<bool> shouldShowLockScreen() async {
|
||||
final bool isPin = await LockScreenSettings.instance.isPinSet();
|
||||
final bool isPass = await LockScreenSettings.instance.isPasswordSet();
|
||||
return isPin || isPass || shouldShowSystemLockScreen();
|
||||
}
|
||||
|
||||
bool shouldShowSystemLockScreen() {
|
||||
if (_preferences.containsKey(keyShouldShowLockScreen)) {
|
||||
return _preferences.getBool(keyShouldShowLockScreen)!;
|
||||
} else {
|
||||
@@ -477,7 +496,7 @@ class Configuration {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setShouldShowLockScreen(bool value) {
|
||||
Future<void> setSystemLockScreen(bool value) {
|
||||
return _preferences.setBool(keyShouldShowLockScreen, value);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,8 +32,6 @@ const mnemonicKeyWordCount = 24;
|
||||
// https://stackoverflow.com/a/61162219
|
||||
const dragSensitivity = 8;
|
||||
|
||||
const supportEmail = 'support@ente.io';
|
||||
|
||||
// Default values for various feature flags
|
||||
class FFDefault {
|
||||
static const bool enableStripe = true;
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "النسخ الاحتياطي لأوامر 2FA",
|
||||
"onBoardingGetStarted": "إبدأ الآن",
|
||||
"onBoardingBody": "النسخ الاحتياطي لشيفرات الاستيثاق ذي العاملين",
|
||||
"onBoardingGetStarted": "ابدأ الآن",
|
||||
"setupFirstAccount": "إعداد الحساب الأول الخاص بك",
|
||||
"importScanQrCode": "مسح رمز QR",
|
||||
"qrCode": "رمز QR",
|
||||
"importScanQrCode": "مسح شيفرة الاستجابة السريعة",
|
||||
"qrCode": "شيفرة الاستجابة السريعة",
|
||||
"importEnterSetupKey": "أدخِل مفتاح الإعداد",
|
||||
"importAccountPageTitle": "أدخل تفاصيل الحساب",
|
||||
"secretCanNotBeEmpty": "لا يمكن أن يكون رمز السر فارغ",
|
||||
@@ -20,6 +20,8 @@
|
||||
"codeIssuerHint": "المصدِّر",
|
||||
"codeSecretKeyHint": "الرمز السري",
|
||||
"codeAccountHint": "الحساب (you@domain.com)",
|
||||
"codeTagHint": "وسم",
|
||||
"accountKeyType": "نوع المفتاح",
|
||||
"sessionExpired": "انتهت صلاحية الجلسة",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
@@ -31,10 +33,10 @@
|
||||
"saveAction": "حفظ",
|
||||
"nextTotpTitle": "التالي",
|
||||
"deleteCodeTitle": "حذف الرمز؟",
|
||||
"deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذا الرمز ؟ هذا الإجراء لا رجعة فيه.",
|
||||
"viewLogsAction": "عرض السجل",
|
||||
"sendLogsDescription": "هذا سوف يرسل عبر السجلات لمساعدتنا على تصحيح مشكلتك. وبينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل تقاسمها.",
|
||||
"preparingLogsTitle": "جاري إعداد السجلات...",
|
||||
"deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذه الشيفرة؟ هذا الإجراء لا رجعة فيه.",
|
||||
"viewLogsAction": "عرض السجلات",
|
||||
"sendLogsDescription": "سوف يُرسل هذا السجلات لنا لمساعدتنا على تصحيح مشكلتك. بينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل مشاركتها.",
|
||||
"preparingLogsTitle": "جارٍ إعداد السجلات...",
|
||||
"emailLogsTitle": "سجلات البريد الإلكتروني",
|
||||
"emailLogsMessage": "الرجاء إرسال السجلات إلى {email}",
|
||||
"@emailLogsMessage": {
|
||||
@@ -69,21 +71,23 @@
|
||||
"useRecoveryKey": "استخدم مفتاح الاسترداد",
|
||||
"incorrectPasswordTitle": "كلمة المرور غير صحيحة",
|
||||
"welcomeBack": "مرحبًا مجددًا!",
|
||||
"madeWithLoveAtPrefix": "مصنوعة مع ❤️ في ",
|
||||
"madeWithLoveAtPrefix": "مصنوعة بـ❤️ في ",
|
||||
"supportDevs": "اشترك في <bold-green>ente</bold-green> لدعمنا",
|
||||
"supportDiscount": "استخدم رمز القسيمة \"AUTH\" للحصول على 10% خصم من السنة الأولى",
|
||||
"changeEmail": "تغيير البريد الإلكتروني",
|
||||
"changePassword": "تغيير كلمة المرور",
|
||||
"changeEmail": "غير البريد الإلكتروني",
|
||||
"changePassword": "غير كلمة المرور",
|
||||
"data": "البيانات",
|
||||
"importCodes": "رمزالاستيراد",
|
||||
"importTypePlainText": "نص عادي",
|
||||
"importCodes": "استورد شيفرات",
|
||||
"importTypePlainText": "نص بسيط",
|
||||
"importTypeEnteEncrypted": "تصدير Ente Ecrypted",
|
||||
"passwordForDecryptingExport": "كلمة المرور لفك تشفير التصدير",
|
||||
"passwordEmptyError": "لا يمكن أن تكون كلمة المرور فارغة",
|
||||
"importFromApp": "استيراد الرموز من {appName}",
|
||||
"importGoogleAuthGuide": "قم بتصدير حساباتك من Google Authenticator إلى رمز QR code باستخدام خيار \"Transfer Accounts\" ثم استخدم جهازًا آخر لمسح رمز الاستجابة السريعة ضوئيًا.\n\nنصيحة: يمكنك استخدام كاميرا الويب الخاصة بالكمبيوتر المحمول لالتقاط صورة لرمز الاستجابة السريعة.",
|
||||
"importSelectJsonFile": "حدد ملف JSON",
|
||||
"importSelectAppExport": "حدد ملف التصدير {appName}",
|
||||
"importRaivoGuide": "استخدم خيار تصدير OTP إلى أرشيف Zip في إعدادات Raivo.\n\nاستخرج ملف zip واسترد ملف JSON.",
|
||||
"importFromApp": "استورد الشيفرات من {appName}",
|
||||
"importGoogleAuthGuide": "صدر حساباتك من Google Authenticator إلى شيفرة استجابة سريعة باستخدام خيار \"نقل الحسابات\" ثم استخدم جهازًا آخر لمسح شيفرة الاستجابة السريعة ضوئيًا.\n\nنصيحة: يمكنك استخدام كاميرا الشبكة الخاصة بحاسوبك المحمول لالتقاط صورة لشيفرة الاستجابة السريعة.",
|
||||
"importSelectJsonFile": "انتقِ ملف JSON",
|
||||
"importSelectAppExport": "حدد ملف التصدير الخاص بـ{appName}",
|
||||
"importEnteEncGuide": "اختر ملف JSON المشفر المصدَّر من Ente",
|
||||
"importRaivoGuide": "استخدم خيار \"صدر كلمات المرور لمرة واحدة إلى أرشيف Zip\" في إعدادات Raivo.\n\nاستخرج ملف الـzip واسترد ملف الـJSON.",
|
||||
"importBitwardenGuide": "استخدم خيار \"تصدير خزانة\" داخل أدوات Bitwarden واستيراد ملف JSON غير مشفر.",
|
||||
"importAegisGuide": "استخدم خيار \"Export the vault\" في إعدادات Aegis.\n\nإذا كان المخزن الخاص بك مشفرًا، فستحتاج إلى إدخال كلمة مرور المخزن لفك تشفير المخزن.",
|
||||
"import2FasGuide": "استخدم خيار \"الإعدادات -> النسخ الاحتياطي - التصدير\" في 2FAS.\n\nإذا تم تشفير النسخة الاحتياطية، سوف تحتاج إلى إدخال كلمة المرور لفك تشفير النسخة الاحتياطية",
|
||||
@@ -112,18 +116,22 @@
|
||||
"copied": "تم النسخ",
|
||||
"pleaseTryAgain": "حاول مرة اخرى",
|
||||
"existingUser": "المستخدم موجود",
|
||||
"newUser": "جديد في Ente",
|
||||
"delete": "حذف",
|
||||
"enterYourPasswordHint": "أدخل كلمة المرور الخاصة بك",
|
||||
"forgotPassword": "هل نسيت كلمة المرور",
|
||||
"oops": "عذرًا",
|
||||
"suggestFeatures": "اقتراح ميزة",
|
||||
"faq": "الأسئلة الأكثر شيوعاً",
|
||||
"faq_q_1": "إلى أي مدى Auth آمن؟",
|
||||
"faq_a_1": "كل الشيفرات التي تنسخها احتياطيا بواسطة Auth تخزن مشفرة من الطرفين. يعني هذا أنك وحدك من يمكنك الوصول لشيفراتك. تطبيقاتنا مفتوحة المصدر وتشفيرنا تم اختباره من جهات خارجية.",
|
||||
"faq_q_2": "هل يمكنني الوصول إلى رموزي على سطح المكتب؟",
|
||||
"faq_a_2": "يمكنك الوصول إلى رموزك على الويب @ auth.ente.io.",
|
||||
"faq_q_3": "كيف يمكنني حذف الرموز؟",
|
||||
"faq_a_3": "يمكنك حذف الرمز عن طريق السحب لليسار على هذا العنصر.",
|
||||
"faq_q_4": "كيف يمكنني دعم هذا المشروع؟",
|
||||
"faq_a_4": "يمكنك دعم تطوير هذا المشروع عن طريق الاشتراك في تطبيق الصور @ ente.io.",
|
||||
"faq_q_5": "كيف يمكنني تفعيل قفل FaceID في Auth",
|
||||
"faq_a_5": "يمكنك تمكين قفل FaceID تحت الإعدادات => الحماية => قفل الشاشة.",
|
||||
"somethingWentWrongMessage": "حدث خطأ ما، يرجى المحاولة مرة أخرى",
|
||||
"leaveFamily": "مغادرة خطة العائلة",
|
||||
@@ -150,6 +158,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "شيفرة استجابة سريعة غير صالحة",
|
||||
"noRecoveryKeyTitle": "لا يوجد مفتاح استرجاع؟",
|
||||
"enterEmailHint": "أدخل عنوان البريد الإلكتروني الخاص بك",
|
||||
"invalidEmailTitle": "عنوان البريد الإلكتروني غير صالح",
|
||||
@@ -194,6 +203,8 @@
|
||||
"saveKey": "حفظ المفتاح",
|
||||
"save": "حفظ",
|
||||
"send": "إرسال",
|
||||
"saveOrSendDescription": "هل تريد حفظه إلى السعة التخزينية الخاصة بك (مجلد التنزيلات افتراضيا) أم إرساله إلى تطبيقات أخرى؟",
|
||||
"saveOnlyDescription": "هل تريد حفظه إلى السعة التخزينية الخاصة بك (مجلد التنزيلات افتراضيا)؟",
|
||||
"back": "الرجوع",
|
||||
"createAccount": "إنشاء حساب",
|
||||
"passwordStrength": "قوة كلمة المرور: {passwordStrengthValue}",
|
||||
@@ -252,12 +263,15 @@
|
||||
"exportLogs": "تصدير السجلات",
|
||||
"enterYourRecoveryKey": "أدخل رمز الاسترداد",
|
||||
"tempErrorContactSupportIfPersists": "يبدو أنه حدث خطأ ما. الرجاء إعادة المحاولة لاحقا. إذا استمر الخطأ، يرجى الاتصال بفريق الدعم.",
|
||||
"networkHostLookUpErr": "تعذر الاتصال بـEnte، فضلا تحقق من إعدادات الشبكة الخاصة بك وتواصل مع الدعم إذا استمر الخطأ.",
|
||||
"networkConnectionRefusedErr": "تعذر الإتصال بـEnte، فضلا أعد المحاولة لاحقا. إذا استمر الخطأ، فضلا تواصل مع الدعم.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "يبدو أنه حدث خطأ ما. الرجاء إعادة المحاولة لاحقا. إذا استمر الخطأ، يرجى الاتصال بفريق الدعم.",
|
||||
"about": "حول",
|
||||
"weAreOpenSource": "الخدمة مفتوحة المصدر!",
|
||||
"privacy": "الخصوصية",
|
||||
"terms": "الشروط",
|
||||
"checkForUpdates": "بحث عن تحديثات",
|
||||
"checkStatus": "تحقق من الحالة",
|
||||
"downloadUpdate": "تحميل",
|
||||
"criticalUpdateAvailable": "تحديث حاسم متوفر",
|
||||
"updateAvailable": "التحديث متاح",
|
||||
@@ -341,6 +355,7 @@
|
||||
"deleteCodeAuthMessage": "المصادقة لحذف الرمز",
|
||||
"showQRAuthMessage": "المصادقة لإظهار رمز QR",
|
||||
"confirmAccountDeleteTitle": "تأكيد حذف الحساب",
|
||||
"confirmAccountDeleteMessage": "هذا الحساب مرتبط بتطبيقات Ente أخرى، إذا كنت تستخدم أحدها.\n\nسنضع موعدا لحذف بياناتك المرفوعة عبر كل تطبيقات Ente، وسيتم حذف حسابك بصورة دائمة.",
|
||||
"androidBiometricHint": "التحقق من الهوية",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
@@ -401,6 +416,55 @@
|
||||
"doNotSignOut": "لا تقم بتسجيل الخروج",
|
||||
"hearUsWhereTitle": "كيف سمعت عن Ente؟ (اختياري)",
|
||||
"hearUsExplanation": "نحن لا نتتبع تثبيت التطبيق. سيكون من المفيد إذا أخبرتنا أين وجدتنا!",
|
||||
"recoveryKeySaved": "حُفِظ مفتاح الاستعادة في مجلد التنزيلات!",
|
||||
"waitingForBrowserRequest": "بانتظار طلب المتصفح...",
|
||||
"waitingForVerification": "بانتظار التحقق...",
|
||||
"passkey": "مفتاح المرور",
|
||||
"developerSettings": "اعدادات المطور"
|
||||
"passKeyPendingVerification": "التحقق ما زال جارٍ",
|
||||
"loginSessionExpired": "انتهت صلاحية الجلسة",
|
||||
"loginSessionExpiredDetails": "انتهت صلاحية جلستك. فضلا أعد تسجيل الدخول.",
|
||||
"developerSettingsWarning": "هل أنت متأكد أنك تريد تعديل خيارات المطور؟",
|
||||
"developerSettings": "اعدادات المطور",
|
||||
"serverEndpoint": "نقطة طرف الخادم",
|
||||
"invalidEndpoint": "نقطة طرف غير صالحة",
|
||||
"invalidEndpointMessage": "عذرا، نقطة الطرف التي أدخلتها غير صالحة. فضلا أدخل نقطة طرف صالحة وأعد المحاولة.",
|
||||
"endpointUpdatedMessage": "حُدِّثَت نقطة الطرف بنجاح",
|
||||
"customEndpoint": "متصل بـ{endpoint}",
|
||||
"pinText": "ثبت",
|
||||
"unpinText": "ألغِ التثبيت",
|
||||
"pinnedCodeMessage": "ثُبِّت {code}",
|
||||
"unpinnedCodeMessage": "أُلغِي تثبيت {code}",
|
||||
"tags": "الأوسمة",
|
||||
"createNewTag": "أنشيء وسم جديد",
|
||||
"tag": "وسم",
|
||||
"create": "أنشيء",
|
||||
"editTag": "حرر الوسم",
|
||||
"deleteTagTitle": "حذف الوسم؟",
|
||||
"deleteTagMessage": "هل أنت متأكد أنك تريد حذف هذا الوسم؟ لا يمكن عكس هذا الإجراء.",
|
||||
"somethingWentWrongParsingCode": "تعذر علينا إعراب أكواد {x}.",
|
||||
"updateNotAvailable": "التحديث غير متاح",
|
||||
"viewRawCodes": "عرض الشيفرات الأصلية",
|
||||
"rawCodes": "الشيفرات الأصلية",
|
||||
"rawCodeData": "بيانات الشيفرات الأصلية",
|
||||
"appLock": "قفل التطبيق",
|
||||
"noSystemLockFound": "لا يوجد قفل نظام",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "لتمكين قفل التطبيق، فضلا أعد شيفرة مرور الجهاز أو قفل الشاشة في إعدادات نظامك.",
|
||||
"autoLock": "قفل تلقائي",
|
||||
"immediately": "فورًا",
|
||||
"reEnterPassword": "أعد إدخال كلمة المرور",
|
||||
"reEnterPin": "أعد إدخال رقم التعريف الشخصي",
|
||||
"next": "التالي",
|
||||
"tooManyIncorrectAttempts": "محاولات خاطئة أكثر من المسموح",
|
||||
"tapToUnlock": "المس لإلغاء القفل",
|
||||
"setNewPassword": "عين كلمة مرور جديدة",
|
||||
"deviceLock": "قفل الجهاز",
|
||||
"hideContent": "أخفِ المحتوى",
|
||||
"hideContentDescriptionAndroid": "يخفي محتوى التطبيق في مبدل التطبيقات ويمنع لقطات الشاشة",
|
||||
"hideContentDescriptioniOS": "يخفي محتوى التطبيق في مبدل التطبيقات",
|
||||
"autoLockFeatureDescription": "الوقت الذي بعده ينقفل التطبيق بعدما يوضع في الخلفية",
|
||||
"appLockDescription": "اختر بين شاشة القفل الافتراضية الخاصة بجهازك وشاشة قفل مخصصة برقم تعريف شخصي أو كلمة مرور.",
|
||||
"pinLock": "قفل رقم التعريف الشخصي",
|
||||
"enterPin": "أدخل رقم التعريف الشخصي",
|
||||
"setNewPin": "عين رقم تعريف شخصي جديد",
|
||||
"importFailureDescNew": "تعذر إعراب الملف المنتقى."
|
||||
}
|
||||
@@ -1 +1,26 @@
|
||||
{}
|
||||
{
|
||||
"account": "Compte",
|
||||
"unlock": "Desbloqueja",
|
||||
"recoveryKey": "Clau de recuperació",
|
||||
"counterAppBarTitle": "Comptador",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingGetStarted": "Primers passos",
|
||||
"qrCode": "Codi QR",
|
||||
"codeTagHint": "Etiqueta",
|
||||
"accountKeyType": "Tipus de clau",
|
||||
"sessionExpired": "La sessió ha caducat",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Torna a iniciar sessió",
|
||||
"verifyPassword": "Verifica la contrasenya",
|
||||
"pleaseWait": "Si us plau, espera...",
|
||||
"incorrectPasswordTitle": "Contrasenya incorrecta",
|
||||
"welcomeBack": "Benvingut de nou!",
|
||||
"madeWithLoveAtPrefix": "fet amb ❤️ a ",
|
||||
"changeEmail": "Canvia el correu electrònic",
|
||||
"changePassword": "Canvia la contrasenya",
|
||||
"importTypePlainText": "Text pla"
|
||||
}
|
||||
466
auth/lib/l10n/arb/app_el.arb
Normal file
@@ -0,0 +1,466 @@
|
||||
{
|
||||
"account": "Λογαριασμός",
|
||||
"unlock": "Ξεκλείδωμα",
|
||||
"recoveryKey": "Κλειδί ανάκτησης",
|
||||
"counterAppBarTitle": "Μετρητής",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "Δημιουργήστε αντίγραφο ασφαλείας των 2FA κωδικών σας",
|
||||
"onBoardingGetStarted": "Ας Αρχίσουμε",
|
||||
"setupFirstAccount": "Ρυθμίστε τον πρώτο σας λογαριασμό",
|
||||
"importScanQrCode": "Σαρώστε έναν κωδικό QR",
|
||||
"qrCode": "Κωδικός QR",
|
||||
"importEnterSetupKey": "Εισάγετε ένα κλειδί ρύθμισης",
|
||||
"importAccountPageTitle": "Εισαγωγή στοιχείων λογαριασμού",
|
||||
"secretCanNotBeEmpty": "Το μυστικό δεν μπορεί να είναι κενό",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Τόσο ο εκδότης όσο και ο λογαριασμός δεν μπορούν να είναι κενά",
|
||||
"incorrectDetails": "Λανθασμένα στοιχεία",
|
||||
"pleaseVerifyDetails": "Παρακαλούμε επιβεβαιώστε τα στοιχεία σας και προσπαθήστε ξανά",
|
||||
"codeIssuerHint": "Εκδότης",
|
||||
"codeSecretKeyHint": "Μυστικό Κλειδί",
|
||||
"codeAccountHint": "Λογαριασμός (you@domain.com)",
|
||||
"codeTagHint": "Ετικέτα",
|
||||
"accountKeyType": "Τύπος κλειδιού",
|
||||
"sessionExpired": "Η συνεδρία έληξε",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Παρακαλούμε συνδεθείτε ξανά",
|
||||
"loggingOut": "Αποσύνδεση...",
|
||||
"timeBasedKeyType": "Βασισμένο σε χρόνο (TOTP)",
|
||||
"counterBasedKeyType": "Με βάση μετρητή (HOTP)",
|
||||
"saveAction": "Αποθήκευση",
|
||||
"nextTotpTitle": "επόμενο",
|
||||
"deleteCodeTitle": "Διαγραφή κωδικού;",
|
||||
"deleteCodeMessage": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτόν τον κωδικό; Αυτή η ενέργεια είναι μη αναστρέψιμη.",
|
||||
"viewLogsAction": "Προβολή αρχείων καταγραφής",
|
||||
"sendLogsDescription": "Αυτό θα στείλει σε μας όλα τα αρχεία καταγραφής για να μας βοηθήσει να αποσφαλματώσουμε το πρόβλημά σας. Ενώ λαμβάνουμε προφυλάξεις για να διασφαλίσουμε ότι οι ευαίσθητες πληροφορίες δεν καταγράφονται, σας ενθαρρύνουμε να δείτε αυτά τα αρχεία καταγραφής πριν τα μοιραστείτε.",
|
||||
"preparingLogsTitle": "Προετοιμασία αρχείων καταγραφής...",
|
||||
"emailLogsTitle": "Αρχεία καταγραφής ηλ. ταχυδρομείου",
|
||||
"emailLogsMessage": "Παρακαλώ στείλτε τα αρχεία καταγραφής στο {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "Αντιγραφή διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"exportLogsAction": "Εξαγωγή αρχείων καταγραφής",
|
||||
"reportABug": "Αναφορά Σφάλματος",
|
||||
"crashAndErrorReporting": "Αναφορά κατάρρευσης & σφάλματος",
|
||||
"reportBug": "Αναφορά σφάλματος",
|
||||
"emailUsMessage": "Παρακαλώ στείλτε μας μήνυμα ηλ. ταχυδρομείου στο {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "Επικοινωνήστε με την υποστήριξη",
|
||||
"rateUsOnStore": "Αξιολογήστε μας στο {storeName}",
|
||||
"blog": "Ιστολόγιο",
|
||||
"merchandise": "Προϊόντα",
|
||||
"verifyPassword": "Επαλήθευση κωδικού πρόσβασης",
|
||||
"pleaseWait": "Παρακαλώ περιμένετε...",
|
||||
"generatingEncryptionKeysTitle": "Δημιουργία κλειδιών κρυπτογράφησης...",
|
||||
"recreatePassword": "Επαναδημιουργία κωδικού πρόσβασης",
|
||||
"recreatePasswordMessage": "Η τρέχουσα συσκευή δεν είναι αρκετά ισχυρή για να επαληθεύσει τον κωδικό πρόσβασής σας, οπότε πρέπει να τον επαναδημιουργήσουμε με τέτοιο τρόπο ώστε να λειτουργεί με όλες τις συσκευές. \n\nΠαρακαλούμε συνδεθείτε χρησιμοποιώντας το κλειδί ανάκτησης σας και επαναδημιουργήστε τον κωδικό πρόσβασής σας (μπορείτε να χρησιμοποιήσετε ξανά τον ίδιο αν το επιθυμείτε).",
|
||||
"useRecoveryKey": "Χρήση κλειδιού ανάκτησης",
|
||||
"incorrectPasswordTitle": "Λάθος κωδικός πρόσβασης",
|
||||
"welcomeBack": "Καλωσορίσατε και πάλι!",
|
||||
"madeWithLoveAtPrefix": "γίνεται με ❤️ στο ",
|
||||
"supportDevs": "Εγγραφείτε στο <bold-green>ente</bold-green> για να μας υποστηρίξετε",
|
||||
"supportDiscount": "Χρησιμοποιήστε τον κωδικό κουπονιού \"AUTH\" για να πάρετε 10% από το πρώτο έτος",
|
||||
"changeEmail": "Αλλαγή διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"changePassword": "Αλλαγή κωδικού πρόσβασής",
|
||||
"data": "Δεδομένα",
|
||||
"importCodes": "Εισαγωγή κωδικών",
|
||||
"importTypePlainText": "Απλό κείμενο",
|
||||
"importTypeEnteEncrypted": "Κρυπτογραφημένη Ente εξαγωγή",
|
||||
"passwordForDecryptingExport": "Κωδικός πρόσβασης για αποκρυπτογράφηση εξαγωγής",
|
||||
"passwordEmptyError": "Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός",
|
||||
"importFromApp": "Εισαγωγή κωδικών από {appName}",
|
||||
"importGoogleAuthGuide": "Εξαγωγή των λογαριασμών σας από το Google Authenticator σε έναν κωδικό QR χρησιμοποιώντας την επιλογή \"Μεταφορά λογαριασμών\". Στη συνέχεια, χρησιμοποιώντας μια άλλη συσκευή, σαρώστε τον κωδικό QR.\n\nΣυμβουλή: Μπορείτε να χρησιμοποιήσετε την κάμερα του λάπτοπ σας για να τραβήξετε μια φωτογραφία του κωδικού QR.",
|
||||
"importSelectJsonFile": "Επιλογή αρχείου JSON",
|
||||
"importSelectAppExport": "Επιλογή αρχείου εξαγωγής {appName}",
|
||||
"importEnteEncGuide": "Επιλέξτε το κρυπτογραφημένο αρχείο JSON που εξήχθη από το Ente",
|
||||
"importRaivoGuide": "Χρησιμοποιήστε την επιλογή \"Export OTPs to Zip archive\" στις Ρυθμίσεις του Raivo.\n\nΕξάγετε το αρχείο zip και εισάγετε το αρχείο JSON.",
|
||||
"importBitwardenGuide": "Χρησιμοποιήστε την επιλογή \"Εξαγωγή θησαυ/κίου\" μέσα στα Εργαλεία Bitwarden και εισάγετε το μη κρυπτογραφημένο αρχείο JSON.",
|
||||
"importAegisGuide": "Χρησιμοποιήστε την επιλογή \"Εξαγωγή θησαυ/κίου\" στις Ρυθμίσεις του Aegis.\n\nΑν το θησαυ/κιό σας είναι κρυπτογραφημένο, θα πρέπει να εισάγετε τον κωδικό πρόσβασης θησαυ/κίου για να αποκρυπτογραφήσετε το θησαυ/κιο.",
|
||||
"import2FasGuide": "Χρησιμοποιήστε την επιλογή \"Ρυθμίσεις->Δημιουργία αντιγράφων ασφαλείας - Εξαγωγή\" στο 2FAS.\n\nΑν το αντίγραφο ασφαλείας είναι κρυπτογραφημένο, θα πρέπει να εισάγετε τον κωδικό πρόσβασης για να αποκρυπτογραφήσετε το αντίγραφο ασφαλείας",
|
||||
"importLastpassGuide": "Χρησιμοποιήστε την επιλογή \"Μεταφορά λογαριασμών\" στις ρυθμίσεις Lastpass Authenticator και πατήστε \"Εξαγωγή λογαριασμών σε αρχείο\". Εισαγάγετε το κατεβασμένο JSON.",
|
||||
"exportCodes": "Εξαγωγή κωδικών",
|
||||
"importLabel": "Εισαγωγή",
|
||||
"importInstruction": "Παρακαλώ επιλέξτε ένα αρχείο που περιέχει μια λίστα των κωδικών σας με τον ακόλουθο τύπο",
|
||||
"importCodeDelimiterInfo": "Οι κωδικοί μπορούν να διαχωριστούν με κόμμα ή με μία νέα γραμμή",
|
||||
"selectFile": "Επιλέξτε αρχείο",
|
||||
"emailVerificationToggle": "Επαλήθευση διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"emailVerificationEnableWarning": "Για να αποφύγετε να κλειδωθείτε έξω από τον λογαριασμό σας, φροντίστε να αποθηκεύσετε ένα αντίγραφο του 2FA του ηλ. ταχυδρομείου σας έξω από το Ente Auth πριν ενεργοποιήσετε την επαλήθευση μέσω ηλ. ταχυδρομείου.",
|
||||
"authToChangeEmailVerificationSetting": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε την επαλήθευση ηλ. ταχυδρομείου",
|
||||
"authToViewYourRecoveryKey": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε το κλειδί ανάκτησης",
|
||||
"authToChangeYourEmail": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τη διεύθυνση ηλ. ταχυδρομείου σας",
|
||||
"authToChangeYourPassword": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τον κωδικό πρόσβασής σας",
|
||||
"authToViewSecrets": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τα μυστικά σας",
|
||||
"authToInitiateSignIn": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να ξεκινήσετε την είσοδο για δημιουργία αντιγράφου ασφαλείας.",
|
||||
"ok": "Οκ",
|
||||
"cancel": "Ακύρωση",
|
||||
"yes": "Ναι",
|
||||
"no": "Όχι",
|
||||
"email": "Διεύθυνση ηλ. ταχυδρομείου",
|
||||
"support": "Υποστήριξη",
|
||||
"general": "Γενικά",
|
||||
"settings": "Ρυθμίσεις",
|
||||
"copied": "Αντιγράφηκε",
|
||||
"pleaseTryAgain": "Παρακαλώ δοκιμάστε ξανά",
|
||||
"existingUser": "Υπάρχων Χρήστης",
|
||||
"newUser": "Νέος/α στο Ente",
|
||||
"delete": "Διαγραφή",
|
||||
"enterYourPasswordHint": "Εισάγετε τον κωδικό πρόσβασης σας",
|
||||
"forgotPassword": "Ξέχασα τον κωδικό πρόσβασης σας",
|
||||
"oops": "Ουπς",
|
||||
"suggestFeatures": "Προτείνετε λειτουργίες",
|
||||
"faq": "Συχνές Ερωτήσεις",
|
||||
"faq_q_1": "Πόσο ασφαλής είναι το Auth;",
|
||||
"faq_a_1": "Όλοι οι κωδικοί που δημιουργείτε μέσω του Auth αποθηκεύονται κρυπτογραφημένοι από άκρο σε άκρο. Αυτό σημαίνει ότι μόνο εσείς μπορείτε να έχετε πρόσβαση στους κωδικούς σας. Οι εφαρμογές μας είναι ανοικτού κώδικα και η κρυπτογραφία μας έχει ελεγχθεί εξωτερικά.",
|
||||
"faq_q_2": "Μπορώ να έχω πρόσβαση στους κωδικούς μου στον υπολογιστή;",
|
||||
"faq_a_2": "Μπορείτε να αποκτήσετε πρόσβαση στους κωδικούς σας στο ίντερνετ @ auth.ente.io.",
|
||||
"faq_q_3": "Πώς μπορώ να διαγράψω κωδικούς;",
|
||||
"faq_a_3": "Μπορείτε να διαγράψετε έναν κωδικό σύροντας αριστερά σε αυτό το αντικείμενο.",
|
||||
"faq_q_4": "Πώς μπορώ να υποστηρίξω αυτό το πρότζεκτ;",
|
||||
"faq_a_4": "Μπορείτε να υποστηρίξετε την ανάπτυξη αυτού του πρότζεκτ με την εγγραφή σας στην εφαρμογή Photos @ ente.io.",
|
||||
"faq_q_5": "Πώς μπορώ να ενεργοποιήσω το Κλείδωμα FaceID στο Auth",
|
||||
"faq_a_5": "Μπορείτε να ενεργοποιήσετε το κλείδωμα FaceID στις Ρυθμίσεις → Ασφάλεια → Οθόνη κλειδώματος.",
|
||||
"somethingWentWrongMessage": "Κάτι πήγε στραβά, παρακαλώ προσπαθήστε ξανά",
|
||||
"leaveFamily": "Αποχώρηση από οικογένεια",
|
||||
"leaveFamilyMessage": "Είστε σίγουροι ότι θέλετε να φύγετε από το οικογενειακό πρόγραμμα;",
|
||||
"inFamilyPlanMessage": "Είστε σε οικογενειακό πρόγραμμα!",
|
||||
"swipeHint": "Σύρετε αριστερά για επεξεργασία ή αφαίρεση κωδικών",
|
||||
"scan": "Σάρωση",
|
||||
"scanACode": "Σάρωση κωδικού",
|
||||
"verify": "Επαλήθευση",
|
||||
"verifyEmail": "Επιβεβαίωση διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"enterCodeHint": "Εισάγετε τον 6ψήφιο κωδικό από \nτην εφαρμογή αυθεντικοποίησης",
|
||||
"lostDeviceTitle": "Χαμένη συσκευή;",
|
||||
"twoFactorAuthTitle": "Αυθεντικοποίηση δύο παραγόντων",
|
||||
"passkeyAuthTitle": "Επιβεβαίωση κλειδιού πρόσβασης",
|
||||
"verifyPasskey": "Επιβεβαίωση κλειδιού πρόσβασης",
|
||||
"recoverAccount": "Ανάκτηση λογαριασμού",
|
||||
"enterRecoveryKeyHint": "Εισάγετε το κλειδί ανάκτησης σας",
|
||||
"recover": "Ανάκτηση",
|
||||
"contactSupportViaEmailMessage": "Παρακαλώ αφήστε ένα μήνυμα ηλ. ταχυδρομείου στο {email} από την καταχωρημένη διεύθυνση σας",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "Μη έγκυρος κωδικός QR",
|
||||
"noRecoveryKeyTitle": "Χωρίς κλειδί ανάκτησης;",
|
||||
"enterEmailHint": "Εισάγετε την διεύθυνση του ηλ. ταχυδρομείου σας",
|
||||
"invalidEmailTitle": "Μη έγκυρη διεύθυνση ηλ. ταχυδρομείου",
|
||||
"invalidEmailMessage": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση ηλ. ταχυδρομείου.",
|
||||
"deleteAccount": "Διαγραφή λογαριασμού",
|
||||
"deleteAccountQuery": "Λυπόμαστε που σας βλέπουμε να φεύγετε. Αντιμετωπίζετε κάποιο πρόβλημα;",
|
||||
"yesSendFeedbackAction": "Ναι, αποστολή σχολίων",
|
||||
"noDeleteAccountAction": "Όχι, διαγραφή λογαριασμού",
|
||||
"initiateAccountDeleteTitle": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να ξεκινήσετε τη διαγραφή λογαριασμού",
|
||||
"sendEmail": "Αποστολή μηνύματος ηλ. ταχυδρομείου",
|
||||
"createNewAccount": "Δημιουργία νέου λογαριασμού",
|
||||
"weakStrength": "Αδύναμος",
|
||||
"strongStrength": "Δυνατός",
|
||||
"moderateStrength": "Μέτριος",
|
||||
"confirmPassword": "Επιβεβαίωση κωδικού πρόσβασης",
|
||||
"close": "Κλείσιμο",
|
||||
"oopsSomethingWentWrong": "Ωχ, Κάτι πήγε στραβά.",
|
||||
"selectLanguage": "Επιλέξτε γλώσσα",
|
||||
"language": "Γλώσσα",
|
||||
"social": "Κοινωνικά",
|
||||
"security": "Ασφάλεια",
|
||||
"lockscreen": "Οθόνη κλειδώματος",
|
||||
"authToChangeLockscreenSetting": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τις ρυθμίσεις οθόνης κλειδώματος",
|
||||
"lockScreenEnablePreSteps": "Για να ενεργοποιήσετε την οθόνη κλειδώματος, παρακαλώ ορίστε τον κωδικό πρόσβασης της συσκευής ή το κλείδωμα οθόνης στις ρυθμίσεις του συστήματός σας.",
|
||||
"viewActiveSessions": "Προβολή ενεργών συνεδριών",
|
||||
"authToViewYourActiveSessions": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τις ενεργές συνεδρίες σας",
|
||||
"searchHint": "Αναζήτηση...",
|
||||
"search": "Αναζήτηση",
|
||||
"sorryUnableToGenCode": "Λυπούμαστε, δεν είναι δυνατή η δημιουργία κωδικού για το {issuerName}",
|
||||
"noResult": "Κανένα αποτέλεσμα",
|
||||
"addCode": "Προσθήκη κωδικού",
|
||||
"scanAQrCode": "Σαρώστε έναν κωδικό QR",
|
||||
"enterDetailsManually": "Χειροκίνητη εισαγωγή στοιχείων",
|
||||
"edit": "Επεξεργασία",
|
||||
"copiedToClipboard": "Αντιγράφηκε στο πρόχειρο",
|
||||
"copiedNextToClipboard": "Αντιγράφηκε ο επόμενος κωδικός στο πρόχειρο",
|
||||
"error": "Σφάλμα",
|
||||
"recoveryKeyCopiedToClipboard": "Το κλειδί ανάκτησης αντιγράφηκε στο πρόχειρο",
|
||||
"recoveryKeyOnForgotPassword": "Εάν ξεχάσετε τον κωδικό πρόσβασής σας, ο μόνος τρόπος για να ανακτήσετε τα δεδομένα σας είναι με αυτό το κλειδί.",
|
||||
"recoveryKeySaveDescription": "Δεν αποθηκεύουμε αυτό το κλειδί, παρακαλώ αποθηκεύστε αυτό το κλειδί 24 λέξεων σε μια ασφαλή τοποθεσία.",
|
||||
"doThisLater": "Κάντε το αργότερα",
|
||||
"saveKey": "Αποθήκευση κλειδιού",
|
||||
"save": "Αποθήκευση",
|
||||
"send": "Αποστολή",
|
||||
"saveOrSendDescription": "Θέλετε να το αποθηκεύσετε στον αποθηκευτικό σας χώρο (φάκελος Λήψεις από προεπιλογή) ή να το στείλετε σε άλλες εφαρμογές;",
|
||||
"saveOnlyDescription": "Θέλετε να το αποθηκεύσετε στον αποθηκευτικό σας χώρο (φάκελος Λήψεις από προεπιλογή);",
|
||||
"back": "Πίσω",
|
||||
"createAccount": "Δημιουργία λογαριασμού",
|
||||
"passwordStrength": "Ισχύς κωδικού πρόσβασης: {passwordStrengthValue}",
|
||||
"@passwordStrength": {
|
||||
"description": "Text to indicate the password strength",
|
||||
"placeholders": {
|
||||
"passwordStrengthValue": {
|
||||
"description": "The strength of the password as a string",
|
||||
"type": "String",
|
||||
"example": "Weak or Moderate or Strong"
|
||||
}
|
||||
},
|
||||
"message": "Password Strength: {passwordStrengthText}"
|
||||
},
|
||||
"password": "Κωδικόs πρόσβασης",
|
||||
"signUpTerms": "Συμφωνώ με τους <u-terms>όρους χρήσης</u-terms> και την <u-policy>πολιτική απορρήτου</u-policy>",
|
||||
"privacyPolicyTitle": "Πολιτική Απορρήτου",
|
||||
"termsOfServicesTitle": "Όροι",
|
||||
"encryption": "Kρυπτογράφηση",
|
||||
"setPasswordTitle": "Ορισμός κωδικού πρόσβασης",
|
||||
"changePasswordTitle": "Αλλαγή κωδικού πρόσβασής",
|
||||
"resetPasswordTitle": "Επαναφορά κωδικού πρόσβασης",
|
||||
"encryptionKeys": "Κλειδιά κρυπτογράφησης",
|
||||
"passwordWarning": "Δεν αποθηκεύουμε αυτόν τον κωδικό πρόσβασης, οπότε αν τον ξεχάσετε <underline>δεν μπορούμε να αποκρυπτογραφήσουμε τα δεδομένα σας</underline>",
|
||||
"enterPasswordToEncrypt": "Εισάγετε έναν κωδικό πρόσβασης που μπορούμε να χρησιμοποιήσουμε για την κρυπτογράφηση των δεδομένων σας",
|
||||
"enterNewPasswordToEncrypt": "Εισάγετε ένα νέο κωδικό πρόσβασης που μπορούμε να χρησιμοποιήσουμε για να κρυπτογραφήσουμε τα δεδομένα σας",
|
||||
"passwordChangedSuccessfully": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς",
|
||||
"generatingEncryptionKeys": "Δημιουργία κλειδιών κρυπτογράφησης...",
|
||||
"continueLabel": "Συνέχεια",
|
||||
"insecureDevice": "Μη ασφαλής συσκευή",
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Συγγνώμη, δεν μπορέσαμε να δημιουργήσουμε ασφαλή κλειδιά σε αυτήν τη συσκευή.\n\nπαρακαλώ εγγραφείτε από μια διαφορετική συσκευή.",
|
||||
"howItWorks": "Πώς λειτουργεί",
|
||||
"ackPasswordLostWarning": "Καταλαβαίνω ότι αν χάσω τον κωδικό μου μπορεί να χάσω τα δεδομένα μου αφού τα δεδομένα μου είναι από <underline>άκρο-σε-άκρο κρυπτογραφημένα</underline>.",
|
||||
"loginTerms": "Κάνοντας κλικ στη σύνδεση, συμφωνώ με τους <u-terms>όρους χρήσης</u-terms> και την <u-policy>πολιτική απορρήτου</u-policy>",
|
||||
"logInLabel": "Σύνδεση",
|
||||
"logout": "Αποσυνδέση",
|
||||
"areYouSureYouWantToLogout": "Είστε σίγουροι ότι θέλετε να αποσυνδεθείτε;",
|
||||
"yesLogout": "Ναι, αποσύνδεση",
|
||||
"exit": "Εξοδος",
|
||||
"verifyingRecoveryKey": "Επαλήθευση κλειδιού ανάκτησης...",
|
||||
"recoveryKeyVerified": "Το κλειδί ανάκτησης επαληθεύτηκε",
|
||||
"recoveryKeySuccessBody": "Τέλεια! Το κλειδί ανάκτησης σας είναι έγκυρο. Σας ευχαριστούμε για την επαλήθευση.\n\nΠαρακαλώ θυμηθείτε να κρατήσετε το κλειδί ανάκτησης σας και σε αντίγραφο ασφαλείας.",
|
||||
"invalidRecoveryKey": "Το κλειδί ανάκτησης που εισάγατε δεν είναι έγκυρο. Παρακαλώ βεβαιωθείτε ότι περιέχει 24 λέξεις και ελέγξτε την ορθογραφία της κάθε μίας.\n\nΑν εισαγάγατε έναν παλαιότερο κωδικό ανάκτησης, βεβαιωθείτε ότι έχει μήκος 64 χαρακτήρες, και ελέγξτε κάθε έναν από αυτούς.",
|
||||
"recreatePasswordTitle": "Επαναδημιουργία κωδικού πρόσβασης",
|
||||
"recreatePasswordBody": "Η τρέχουσα συσκευή δεν είναι αρκετά ισχυρή για να επαληθεύσει τον κωδικό πρόσβασής σας, αλλά μπορούμε να τον αναδημιουργήσουμε με έναν τρόπο που λειτουργεί με όλες τις συσκευές.\n\nΠαρακαλούμε συνδεθείτε χρησιμοποιώντας το κλειδί ανάκτησης και αναδημιουργήστε τον κωδικό πρόσβασής σας (μπορείτε να χρησιμοποιήσετε ξανά τον ίδιο αν το επιθυμείτε).",
|
||||
"invalidKey": "Μη έγκυρο κλειδί",
|
||||
"tryAgain": "Προσπαθήστε ξανά",
|
||||
"viewRecoveryKey": "Προβολή κλειδιού ανάκτησης",
|
||||
"confirmRecoveryKey": "Επιβεβαίωση κλειδιού ανάκτησης",
|
||||
"recoveryKeyVerifyReason": "Το κλειδί ανάκτησης σας είναι ο μόνος τρόπος για να ανακτήσετε τις φωτογραφίες σας εάν ξεχάσετε τον κωδικό πρόσβασής σας. Μπορείτε να βρείτε το κλειδί ανάκτησης σας στις Ρυθμίσεις > Λογαριασμός.\n\nΠαρακαλώ εισάγετε το κλειδί ανάκτησης σας εδώ για να βεβαιωθείτε ότι το έχετε αποθηκεύσει σωστά.",
|
||||
"confirmYourRecoveryKey": "Επιβεβαίωση κλειδιού ανάκτησης",
|
||||
"confirm": "Επιβεβαίωση",
|
||||
"emailYourLogs": "Στείλτε με μήνυμα ηλ. ταχυδομείου τα αρχεία καταγραφής σας",
|
||||
"pleaseSendTheLogsTo": "Παρακαλώ στείλτε τα αρχεία καταγραφής σας στο \n{toEmail}",
|
||||
"copyEmailAddress": "Αντιγραφή διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"exportLogs": "Εξαγωγή αρχείων καταγραφής",
|
||||
"enterYourRecoveryKey": "Εισάγετε το κλειδί ανάκτησης σας",
|
||||
"tempErrorContactSupportIfPersists": "Φαίνεται ότι κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά μετά από κάποιο χρονικό διάστημα. Αν το σφάλμα παραμένει, παρακαλούμε επικοινωνήστε με την ομάδα υποστήριξης μας.",
|
||||
"networkHostLookUpErr": "Δεν είναι δυνατή η σύνδεση με το Ente, ελέγξτε τις ρυθμίσεις του δικτύου σας και επικοινωνήστε με την υποστήριξη αν το σφάλμα παραμένει.",
|
||||
"networkConnectionRefusedErr": "Δεν είναι δυνατή η σύνδεση με το Ente, παρακαλώ προσπαθήστε ξανά μετά από λίγο. Εάν το σφάλμα παραμένει, παρακαλούμε επικοινωνήστε με την υποστήριξη.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Φαίνεται ότι κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά μετά από λίγο. Αν το σφάλμα παραμένει, παρακαλούμε επικοινωνήστε με την ομάδα υποστήριξης μας.",
|
||||
"about": "Σχετικά με",
|
||||
"weAreOpenSource": "Είμαστε ανοιχτού κώδικα!",
|
||||
"privacy": "Ιδιωτικότητα",
|
||||
"terms": "Όροι",
|
||||
"checkForUpdates": "Έλεγχος για ενημερώσεις",
|
||||
"checkStatus": "Έλεγχος κατάστασης",
|
||||
"downloadUpdate": "Λήψη",
|
||||
"criticalUpdateAvailable": "Διαθέσιμη κρίσιμη ενημέρωση",
|
||||
"updateAvailable": "Διαθέσιμη ενημέρωση",
|
||||
"update": "Ενημέρωση",
|
||||
"checking": "Έλεγχος...",
|
||||
"youAreOnTheLatestVersion": "Είστε στην πιο πρόσφατη έκδοση",
|
||||
"warning": "Προσοχή",
|
||||
"exportWarningDesc": "Το εξαγόμενο αρχείο περιέχει ευαίσθητες πληροφορίες. Παρακαλώ αποθηκεύστε το με ασφάλεια.",
|
||||
"iUnderStand": "Καταλαβαίνω",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να εξάγετε τους κωδικού σας",
|
||||
"importSuccessTitle": "Ζήτω!",
|
||||
"importSuccessDesc": "Έχετε εισάγει {count} κωδικούς!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The number of codes imported",
|
||||
"type": "int",
|
||||
"example": "1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sorry": "Συγνώμη",
|
||||
"importFailureDesc": "Δεν ήταν δυνατή η ανάλυση του επιλεγμένου αρχείου.\nΠαρακαλώ γράψτε στο support@ente.io αν χρειάζεστε βοήθεια!",
|
||||
"pendingSyncs": "Προσοχή",
|
||||
"pendingSyncsWarningBody": "Δεν έχουν γίνει αντίγραφα ασφαλείας για μερικούς από τους κωδικούς σας.\n\nΠαρακαλώ βεβαιωθείτε ότι έχετε ένα αντίγραφο ασφαλείας για αυτούς τους κωδικούς πριν αποσυνδεθείτε.",
|
||||
"checkInboxAndSpamFolder": "Παρακαλώ ελέγξτε τα εισερχόμενά σας (και τα ανεπιθύμητα) για να ολοκληρώσετε την επαλήθευση",
|
||||
"tapToEnterCode": "Πατήστε για να εισάγετε τον κωδικό",
|
||||
"resendEmail": "Επαναποστολή μηνύματος ηλ. ταχυδρομείου",
|
||||
"weHaveSendEmailTo": "Έχουμε στείλει ένα μήνυμα στο <green>{email}</green>",
|
||||
"@weHaveSendEmailTo": {
|
||||
"description": "Text to indicate that we have sent a mail to the user",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"description": "The email address of the user",
|
||||
"type": "String",
|
||||
"example": "example@ente.io"
|
||||
}
|
||||
}
|
||||
},
|
||||
"activeSessions": "Ενεργές συνεδρίες",
|
||||
"somethingWentWrongPleaseTryAgain": "Κάτι πήγε στραβά, παρακαλώ προσπαθήστε ξανά",
|
||||
"thisWillLogYouOutOfThisDevice": "Αυτό θα σας αποσυνδέσει από αυτή τη συσκευή!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "Αυτό θα σας αποσυνδέσει από την ακόλουθη συσκευή:",
|
||||
"terminateSession": "Τερματισμός συνεδρίας;",
|
||||
"terminate": "Τερματισμός",
|
||||
"thisDevice": "Αυτή η συσκευή",
|
||||
"toResetVerifyEmail": "Για να επαναφέρετε τον κωδικό πρόσβασής σας, επαληθεύστε πρώτα την διευθυνση ηλ. ταχυδρομείου σας.",
|
||||
"thisEmailIsAlreadyInUse": "Αυτός ο λογαριασμός ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη",
|
||||
"verificationFailedPleaseTryAgain": "Η επαλήθευση απέτυχε, παρακαλώ προσπαθήστε ξανά",
|
||||
"yourVerificationCodeHasExpired": "Ο κωδικός επαλήθευσης σας έχει λήξει",
|
||||
"incorrectCode": "Εσφαλμένος κωδικός",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "Λυπούμαστε, ο κωδικός που εισαγάγατε είναι εσφαλμένος",
|
||||
"emailChangedTo": "Η διεύθυνση ηλ. ταχυδρομείου άλλαξε σε {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "Αποτυχία ελέγχου ταυτότητας, παρακαλώ προσπαθήστε ξανά",
|
||||
"authenticationSuccessful": "Επιτυχής έλεγχος ταυτότητας!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Η αυθεντικοποίηση δύο παραγόντων επαναφέρθηκε επιτυχώς",
|
||||
"incorrectRecoveryKey": "Εσφαλμένο κλειδί ανάκτησης",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "Το κλειδί ανάκτησης που εισάγατε είναι εσφαλμένο",
|
||||
"enterPassword": "Εισάγετε κωδικό πρόσβασης",
|
||||
"selectExportFormat": "Επιλέξτε τύπο εξαγωγής",
|
||||
"exportDialogDesc": "Οι κρυπτογραφημένες εξαγωγές θα προστατεύονται από έναν κωδικό πρόσβασης της επιλογής σας.",
|
||||
"encrypted": "Κρυπτογραφημένο",
|
||||
"plainText": "Απλό κείμενο",
|
||||
"passwordToEncryptExport": "Κωδικός πρόσβασης για κρυπτογράφηση εξαγωγής",
|
||||
"export": "Εξαγωγή",
|
||||
"useOffline": "Χρήση χωρίς αντίγραφα ασφαλείας",
|
||||
"signInToBackup": "Συνδεθείτε για να δημιουργήσετε αντίγραφα ασφαλείας των κωδικών σας",
|
||||
"singIn": "Σύνδεση",
|
||||
"sigInBackupReminder": "Παρακαλώ εξάγετε τους κωδικούς σας για να βεβαιωθείτε ότι έχετε ένα αντίγραφο ασφαλείας από το οποίο μπορείτε να επαναφέρετε.",
|
||||
"offlineModeWarning": "Επιλέξατε να προχωρήσετε χωρίς αντίγραφα ασφαλείας. Παρακαλώ κάντε χειροκίνητα αντίγραφα ασφαλείας για να βεβαιωθείτε ότι οι κωδικοί σας είναι ασφαλείς.",
|
||||
"showLargeIcons": "Εμφάνιση μεγάλων εικονιδίων",
|
||||
"shouldHideCode": "Απόκρυψη κωδικών",
|
||||
"doubleTapToViewHiddenCode": "Μπορείτε να πατήσετε δύο φορές σε μια καταχώρηση για να δείτε τον κωδικό",
|
||||
"focusOnSearchBar": "Εστίαση στην αναζήτηση κατά την εκκίνηση εφαρμογής",
|
||||
"confirmUpdatingkey": "Είστε σίγουροι ότι θέλετε να ενημερώσετε το μυστικό κλειδί;",
|
||||
"minimizeAppOnCopy": "Ελαχιστοποίηση εφαρμογής κατά την αντιγραφή",
|
||||
"editCodeAuthMessage": "Πραγματοποιήστε έλεγχο ταυτότητας για να επεξεργαστείτε τον κωδικό",
|
||||
"deleteCodeAuthMessage": "Πραγματοποιήστε έλεγχο ταυτότητας για να διαγράψετε τον κωδικό",
|
||||
"showQRAuthMessage": "Πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τον κωδικό QR",
|
||||
"confirmAccountDeleteTitle": "Επιβεβαίωση διαγραφής λογαριασμού",
|
||||
"confirmAccountDeleteMessage": "Αυτός ο λογαριασμός είναι συνδεδεμένος με άλλες εφαρμογές Ente, εάν χρησιμοποιείτε κάποια.\n\nΤα δεδομένα σας, σε όλες τις εφαρμογές Ente, θα προγραμματιστούν για διαγραφή και ο λογαριασμός σας θα διαγραφεί οριστικά.",
|
||||
"androidBiometricHint": "Επαλήθευση ταυτότητας",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricNotRecognized": "Δεν αναγνωρίζεται. Δοκιμάστε ξανά.",
|
||||
"@androidBiometricNotRecognized": {
|
||||
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricSuccess": "Επιτυχία",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "Ακύρωση",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
},
|
||||
"androidSignInTitle": "Απαιτείται έλεγχος ταυτότητας",
|
||||
"@androidSignInTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricRequiredTitle": "Απαιτούνται βιομετρικά",
|
||||
"@androidBiometricRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsRequiredTitle": "Απαιτούνται στοιχεία συσκευής",
|
||||
"@androidDeviceCredentialsRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsSetupDescription": "Απαιτούνται στοιχεία συσκευής",
|
||||
"@androidDeviceCredentialsSetupDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"goToSettings": "Μετάβαση στις ρυθμίσεις",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
"androidGoToSettingsDescription": "Η βιομετρική πιστοποίηση δεν έχει ρυθμιστεί στη συσκευή σας. Μεταβείτε στις 'Ρυθμίσεις > Ασφάλεια' για να προσθέσετε βιομετρική ταυτοποίηση.",
|
||||
"@androidGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"iOSLockOut": "Η βιομετρική ταυτοποίηση είναι απενεργοποιημένη. Παρακαλώ κλειδώστε και ξεκλειδώστε την οθόνη σας για να την ενεργοποιήσετε.",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSGoToSettingsDescription": "Η βιομετρική ταυτοποίηση δεν έχει ρυθμιστεί στη συσκευή σας. Παρακαλώ ενεργοποιήστε το Touch ID ή το Face ID στο τηλέφωνό σας.",
|
||||
"@iOSGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSOkButton": "ΟΚ",
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"noInternetConnection": "Χωρίς σύνδεση στο διαδίκτυο",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Παρακαλούμε ελέγξτε τη σύνδεσή σας στο διαδίκτυο και προσπαθήστε ξανά.",
|
||||
"signOutFromOtherDevices": "Αποσύνδεση από άλλες συσκευές",
|
||||
"signOutOtherBody": "Αν νομίζετε ότι κάποιος μπορεί να γνωρίζει τον κωδικό πρόσβασής σας, μπορείτε να αναγκάσετε όλες τις άλλες συσκευές που χρησιμοποιούν το λογαριασμό σας να αποσυνδεθούν.",
|
||||
"signOutOtherDevices": "Αποσύνδεση άλλων συσκευών",
|
||||
"doNotSignOut": "Μην αποσυνδεθείτε",
|
||||
"hearUsWhereTitle": "Πώς ακούσατε για το Ente; (προαιρετικό)",
|
||||
"hearUsExplanation": "Δεν παρακολουθούμε εγκαταστάσεις εφαρμογών. Θα βοηθούσε αν μας είπατε πού μας βρήκατε!",
|
||||
"recoveryKeySaved": "Το κλειδί ανάκτησης αποθηκεύτηκε στο φάκελο Λήψεις!",
|
||||
"waitingForBrowserRequest": "Αναμονή για αίτημα περιηγητή...",
|
||||
"waitingForVerification": "Αναμονή για επαλήθευση...",
|
||||
"passkey": "Κλειδί πρόσβασης",
|
||||
"passKeyPendingVerification": "Η επαλήθευση εξακολουθεί να εκκρεμεί",
|
||||
"loginSessionExpired": "Η συνεδρία έληξε",
|
||||
"loginSessionExpiredDetails": "Η συνεδρία σας έληξε. Παρακαλώ συνδεθείτε ξανά.",
|
||||
"developerSettingsWarning": "Είστε σίγουροι ότι θέλετε να τροποποιήσετε τις ρυθμίσεις Προγραμματιστή;",
|
||||
"developerSettings": "Ρυθμίσεις προγραμματιστή",
|
||||
"serverEndpoint": "Τερματικό σημείο διακομιστή",
|
||||
"invalidEndpoint": "Μη έγκυρο τερματικό σημείο",
|
||||
"invalidEndpointMessage": "Λυπούμαστε, το τερματικό σημείο που εισάγατε δεν είναι έγκυρο. Παρακαλώ εισάγετε ένα έγκυρο τερματικό σημείο και προσπαθήστε ξανά.",
|
||||
"endpointUpdatedMessage": "Το τερματκό σημείο ενημερώθηκε επιτυχώς",
|
||||
"customEndpoint": "Συνδεδεμένο στο {endpoint}",
|
||||
"pinText": "Καρφίτσωμα",
|
||||
"unpinText": "Ξεκαρφίτσωμα",
|
||||
"pinnedCodeMessage": "Το {code} καρφιτσώθηκε",
|
||||
"unpinnedCodeMessage": "Το {code} ξεκαρφιτσώθηκε",
|
||||
"tags": "Ετικέτες",
|
||||
"createNewTag": "Δημιουργία Νέας Ετικέτας",
|
||||
"tag": "Ετικέτα",
|
||||
"create": "Δημιουργία",
|
||||
"editTag": "Επεξεργασία ετικέτας",
|
||||
"deleteTagTitle": "Διαγραφή ετικέτας;",
|
||||
"deleteTagMessage": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την ετικέτα; Αυτή η ενέργεια είναι μη αναστρέψιμη.",
|
||||
"somethingWentWrongParsingCode": "Δεν μπορέσαμε να αναλύσουμε τους {x} κώδικες.",
|
||||
"updateNotAvailable": "Μη διαθέσιμη ενημέρωση",
|
||||
"viewRawCodes": "Προβολή ακατέργαστων κωδικών",
|
||||
"rawCodes": "Ακατέργαστοι κωδικοί",
|
||||
"rawCodeData": "Δεδομένα ακατέργαστων κωδικών",
|
||||
"appLock": "Κλείδωμα εφαρμογής",
|
||||
"noSystemLockFound": "Δεν βρέθηκε κλείδωμα συστήματος",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Για να ενεργοποιήσετε το κλείδωμα εφαρμογής, παρακαλώ ορίστε τον κωδικό πρόσβασης της συσκευής ή το κλείδωμα οθόνης στις ρυθμίσεις του συστήματος σας.",
|
||||
"autoLock": "Αυτόματο κλείδωμα",
|
||||
"immediately": "Άμεσα",
|
||||
"reEnterPassword": "Πληκτρολογήστε ξανά τον κωδικό πρόσβασης",
|
||||
"reEnterPin": "Πληκτρολογήστε ξανά το PIN",
|
||||
"next": "Επόμενο",
|
||||
"tooManyIncorrectAttempts": "Πάρα πολλές εσφαλμένες προσπάθειες",
|
||||
"tapToUnlock": "Πατήστε για ξεκλείδωμα",
|
||||
"setNewPassword": "Ορίστε νέο κωδικό πρόσβασης",
|
||||
"deviceLock": "Κλείδωμα συσκευής",
|
||||
"hideContent": "Απόκρυψη περιεχομένου",
|
||||
"pinLock": "Κλείδωμα καρφιτσωμάτων",
|
||||
"enterPin": "Εισαγωγή PIN",
|
||||
"setNewPin": "Ορίστε νέο PIN",
|
||||
"importFailureDescNew": "Αδυναμία ανάλυσης του επιλεγμένου αρχείου."
|
||||
}
|
||||
@@ -421,9 +421,9 @@
|
||||
"waitingForVerification": "Waiting for verification...",
|
||||
"passkey": "Passkey",
|
||||
"passKeyPendingVerification": "Verification is still pending",
|
||||
"loginSessionExpired" : "Session expired",
|
||||
"loginSessionExpired": "Session expired",
|
||||
"loginSessionExpiredDetails": "Your session has expired. Please login again.",
|
||||
"developerSettingsWarning":"Are you sure that you want to modify Developer settings?",
|
||||
"developerSettingsWarning": "Are you sure that you want to modify Developer settings?",
|
||||
"developerSettings": "Developer settings",
|
||||
"serverEndpoint": "Server endpoint",
|
||||
"invalidEndpoint": "Invalid endpoint",
|
||||
@@ -445,5 +445,26 @@
|
||||
"updateNotAvailable": "Update not available",
|
||||
"viewRawCodes": "View raw codes",
|
||||
"rawCodes": "Raw codes",
|
||||
"rawCodeData": "Raw code data"
|
||||
"rawCodeData": "Raw code data",
|
||||
"appLock": "App lock",
|
||||
"noSystemLockFound": "No system lock found",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.",
|
||||
"autoLock": "Auto lock",
|
||||
"immediately": "Immediately",
|
||||
"reEnterPassword": "Re-enter password",
|
||||
"reEnterPin": "Re-enter PIN",
|
||||
"next": "Next",
|
||||
"tooManyIncorrectAttempts": "Too many incorrect attempts",
|
||||
"tapToUnlock": "Tap to unlock",
|
||||
"setNewPassword": "Set new password",
|
||||
"deviceLock": "Device lock",
|
||||
"hideContent": "Hide content",
|
||||
"hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots",
|
||||
"hideContentDescriptioniOS": "Hides app content in the app switcher",
|
||||
"autoLockFeatureDescription": "Time after which the app locks after being put in the background",
|
||||
"appLockDescription": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.",
|
||||
"pinLock": "Pin lock",
|
||||
"enterPin": "Enter PIN",
|
||||
"setNewPin": "Set new PIN",
|
||||
"importFailureDescNew": "Could not parse the selected file."
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"account": "Käyttäjätili",
|
||||
"unlock": "Avaa lukitus",
|
||||
"recoveryKey": "Palautusavain",
|
||||
"counterAppBarTitle": "Laskuri",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
@@ -7,11 +10,15 @@
|
||||
"onBoardingGetStarted": "Aloitetaan",
|
||||
"setupFirstAccount": "Määritä ensimmäinen tilisi",
|
||||
"importScanQrCode": "Lue QR-koodi",
|
||||
"qrCode": "QR-koodi",
|
||||
"importEnterSetupKey": "Syötä asetusavain",
|
||||
"importAccountPageTitle": "Syötä tilin tiedot",
|
||||
"incorrectDetails": "Virheelliset tiedot",
|
||||
"pleaseVerifyDetails": "Vahvista tietosi ja yritä uudelleen",
|
||||
"codeIssuerHint": "Myöntäjä",
|
||||
"codeSecretKeyHint": "Salainen avain",
|
||||
"codeAccountHint": "Tili (sinun@jokinosoite.com)",
|
||||
"accountKeyType": "Avaimen tyyppi",
|
||||
"sessionExpired": "Istunto on vanheutunut",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
@@ -50,6 +57,7 @@
|
||||
}
|
||||
},
|
||||
"contactSupport": "Ota yhteyttä käyttötukeen",
|
||||
"blog": "Blogi",
|
||||
"verifyPassword": "Vahvista salasana",
|
||||
"pleaseWait": "Odota hetki...",
|
||||
"generatingEncryptionKeysTitle": "Luodaan salausavaimia...",
|
||||
@@ -62,21 +70,38 @@
|
||||
"supportDevs": "Tilaa <bold-green>ente</bold-green> tukeaksesi tätä hanketta.",
|
||||
"supportDiscount": "Käytä kuponkikoodia \"AUTH\" saadaksesi 10% alennuksen ensimmäisestä vuodesta",
|
||||
"changeEmail": "vaihda sähköpostiosoitteesi",
|
||||
"changePassword": "Vaihda salasana",
|
||||
"importCodes": "Tuo koodit",
|
||||
"importTypePlainText": "Pelkkä teksti",
|
||||
"importTypeEnteEncrypted": "Ente salattu vienti",
|
||||
"importSelectJsonFile": "Valitse JSON-tiedosto",
|
||||
"exportCodes": "Vie koodit",
|
||||
"importLabel": "Tuo",
|
||||
"selectFile": "Valitse tiedosto",
|
||||
"emailVerificationToggle": "Sähköpostivahvistus",
|
||||
"ok": "Selvä",
|
||||
"cancel": "Keskeytä",
|
||||
"yes": "Kyllä",
|
||||
"no": "Ei",
|
||||
"email": "Sähköposti",
|
||||
"support": "Tuki",
|
||||
"general": "Yleiset",
|
||||
"settings": "Asetukset",
|
||||
"copied": "Jäljennetty",
|
||||
"pleaseTryAgain": "Yritä uudestaan",
|
||||
"existingUser": "Jo valmiiksi olemassaoleva käyttäjä",
|
||||
"newUser": "Uusi Ente-käyttäjä",
|
||||
"delete": "Poista",
|
||||
"enterYourPasswordHint": "Syötä salasanasi",
|
||||
"forgotPassword": "Olen unohtanut salasanani",
|
||||
"oops": "Hupsista",
|
||||
"suggestFeatures": "Ehdota parannuksia",
|
||||
"faq": "Usein kysyttyä",
|
||||
"faq_q_1": "Kuinka turvallinen Auth on?",
|
||||
"faq_q_3": "Kuinka voin poistaa koodeja?",
|
||||
"faq_q_4": "Kuinka voin tukea tätä projektia?",
|
||||
"faq_q_5": "Miten voin ottaa käyttöön FaceID-lukituksen Authissa",
|
||||
"faq_a_5": "Voit ottaa FaceID-lukituksen käyttöön kohdassa Asetukset → Turvallisuus → Lukitusnäyttö.",
|
||||
"somethingWentWrongMessage": "Jokin meni pieleen, yritä uudelleen",
|
||||
"leaveFamily": "Poistu perheestä",
|
||||
"leaveFamilyMessage": "Oletko varma että haluat jättää tämän perhemallin?",
|
||||
@@ -85,9 +110,12 @@
|
||||
"scan": "Lue",
|
||||
"scanACode": "Lue koodi",
|
||||
"verify": "Vahvista",
|
||||
"verifyEmail": "Vahvista sähköpostiosoite",
|
||||
"enterCodeHint": "Syötä 6-merkkinen koodi varmennussovelluksestasi",
|
||||
"lostDeviceTitle": "Kadonnut laite?",
|
||||
"twoFactorAuthTitle": "Kaksivaiheinen vahvistus",
|
||||
"passkeyAuthTitle": "Avainkoodin vahvistus",
|
||||
"verifyPasskey": "Vahvista avainkoodi",
|
||||
"recoverAccount": "Palauta tilisi",
|
||||
"enterRecoveryKeyHint": "Syötä palautusavaimesi",
|
||||
"recover": "Palauta",
|
||||
@@ -99,6 +127,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "Virheellinen QR-koodi",
|
||||
"noRecoveryKeyTitle": "Ei palautusavainta?",
|
||||
"enterEmailHint": "Syötä sähköpostiosoitteesi",
|
||||
"invalidEmailTitle": "Epäkelpo sähköpostiosoite",
|
||||
@@ -116,7 +145,65 @@
|
||||
"confirmPassword": "Vahvista salasana",
|
||||
"close": "Sulje",
|
||||
"oopsSomethingWentWrong": "Hupsista! Jotakin meni nyt pieleen.",
|
||||
"selectLanguage": "Valitse kieli",
|
||||
"language": "Kieli",
|
||||
"security": "Turvallisuus",
|
||||
"lockscreen": "Lukitusnäyttö",
|
||||
"lockScreenEnablePreSteps": "Aktivoi lukitusnäyttö ottamalla käyttöön laitteen salasana tai näytön lukitus järjestelmäasetuksissa.",
|
||||
"searchHint": "Etsi...",
|
||||
"search": "Etsi",
|
||||
"noResult": "Ei tuloksia",
|
||||
"addCode": "Lisää koodi",
|
||||
"enterDetailsManually": "Syötä tiedot manuaalisesti",
|
||||
"edit": "Muokkaa",
|
||||
"copiedToClipboard": "Kopioitu leikepöydälle",
|
||||
"copiedNextToClipboard": "Seuraava koodi kopioitu leikepöydälle",
|
||||
"error": "Virhe",
|
||||
"recoveryKeyCopiedToClipboard": "Palautusavain kopioitu leikepöydälle",
|
||||
"recoveryKeyOnForgotPassword": "Jos unohdat salasanasi, ainoa tapa palauttaa tietosi on tällä avaimella.",
|
||||
"recoveryKeySaveDescription": "Emme tallenna tätä avainta, ole hyvä ja tallenna tämä 24 sanan avain turvalliseen paikkaan.",
|
||||
"doThisLater": "Tee tämä myöhemmin",
|
||||
"saveKey": "Tallenna avain",
|
||||
"save": "Tallenna",
|
||||
"send": "Lähetä",
|
||||
"back": "Takaisin",
|
||||
"createAccount": "Luo tili",
|
||||
"password": "Salasana",
|
||||
"encryption": "Salaus",
|
||||
"setPasswordTitle": "Luo salasana",
|
||||
"changePasswordTitle": "Vaihda salasana",
|
||||
"resetPasswordTitle": "Nollaa salasana",
|
||||
"encryptionKeys": "Salausavaimet",
|
||||
"passwordChangedSuccessfully": "Salasana vaihdettu onnistuneesti",
|
||||
"generatingEncryptionKeys": "Luodaan salausavaimia...",
|
||||
"continueLabel": "Jatka",
|
||||
"logInLabel": "Kirjaudu sisään",
|
||||
"logout": "Kirjaudu ulos",
|
||||
"yesLogout": "Kyllä, kirjaudu ulos",
|
||||
"exit": "Poistu",
|
||||
"about": "Tietoa",
|
||||
"weAreOpenSource": "Olemme avoimen lähdekoodin ohjelma!",
|
||||
"privacy": "Yksityisyys",
|
||||
"checkForUpdates": "Tarkista päivitykset",
|
||||
"downloadUpdate": "Lataa",
|
||||
"updateAvailable": "Päivitys saatavilla",
|
||||
"warning": "Varoitus",
|
||||
"enterPassword": "Syötä salasana",
|
||||
"singIn": "Kirjaudu sisään",
|
||||
"shouldHideCode": "Piilota koodit",
|
||||
"editCodeAuthMessage": "Autentikoidu muokataksesi koodia",
|
||||
"deleteCodeAuthMessage": "Autentikoidu poistaaksesi koodin",
|
||||
"showQRAuthMessage": "Autentikoidu näyttääksesi QR-koodin"
|
||||
"showQRAuthMessage": "Autentikoidu näyttääksesi QR-koodin",
|
||||
"androidBiometricSuccess": "Kirjautuminen onnistui",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "Peruuta",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
},
|
||||
"goToSettings": "Mene asetuksiin",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
}
|
||||
}
|
||||
@@ -263,12 +263,15 @@
|
||||
"exportLogs": "Exporter les journaux",
|
||||
"enterYourRecoveryKey": "Entrez votre clé de récupération",
|
||||
"tempErrorContactSupportIfPersists": "Il semble qu'une erreur s'est produite. Veuillez réessayer après un certain temps. Si l'erreur persiste, veuillez contacter notre équipe d'assistance.",
|
||||
"networkHostLookUpErr": "Impossible de se connecter à Ente, veuillez vérifier vos paramètres réseau et contacter le support si l'erreur persiste.",
|
||||
"networkConnectionRefusedErr": "Impossible de se connecter à Ente, veuillez réessayer après un certain temps. Si l'erreur persiste, veuillez contacter le support.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Il semble qu'une erreur s'est produite. Veuillez réessayer après un certain temps. Si l'erreur persiste, veuillez contacter notre équipe d'assistance.",
|
||||
"about": "À propos",
|
||||
"weAreOpenSource": "Nous sommes open source !",
|
||||
"privacy": "Confidentialité",
|
||||
"terms": "Conditions",
|
||||
"checkForUpdates": "Vérifier les mises à jour",
|
||||
"checkStatus": "Vérifier le statut",
|
||||
"downloadUpdate": "Télécharger",
|
||||
"criticalUpdateAvailable": "Mise à jour critique disponible",
|
||||
"updateAvailable": "Une mise à jour est disponible",
|
||||
@@ -417,6 +420,9 @@
|
||||
"waitingForBrowserRequest": "En attente de la requête du navigateur...",
|
||||
"waitingForVerification": "En attente de vérification...",
|
||||
"passkey": "Code d'accès",
|
||||
"passKeyPendingVerification": "La vérification est toujours en attente",
|
||||
"loginSessionExpired": "Session expirée",
|
||||
"loginSessionExpiredDetails": "Votre session a expiré. Veuillez vous reconnecter.",
|
||||
"developerSettingsWarning": "Êtes-vous sûr de vouloir modifier les paramètres du développeur ?",
|
||||
"developerSettings": "Paramètres du développeur",
|
||||
"serverEndpoint": "Point de terminaison serveur",
|
||||
@@ -436,5 +442,22 @@
|
||||
"deleteTagTitle": "Supprimer le tag ?",
|
||||
"deleteTagMessage": "Êtes-vous sûr de vouloir supprimer ce tag ? Cette action est irréversible.",
|
||||
"somethingWentWrongParsingCode": "Impossible d'analyser les codes {x}.",
|
||||
"updateNotAvailable": "Mise à jour non disponible"
|
||||
"updateNotAvailable": "Mise à jour non disponible",
|
||||
"viewRawCodes": "Afficher les codes bruts",
|
||||
"rawCodes": "Codes bruts",
|
||||
"rawCodeData": "Données de code brut",
|
||||
"noSystemLockFound": "Aucun verrou système trouvé",
|
||||
"autoLock": "Verrouillage automatique",
|
||||
"immediately": "Immédiatement",
|
||||
"reEnterPassword": "Ressaisir le mot de passe",
|
||||
"reEnterPin": "Ressaisir le code PIN",
|
||||
"next": "Suivant",
|
||||
"tooManyIncorrectAttempts": "Trop de tentatives incorrectes",
|
||||
"tapToUnlock": "Appuyer pour déverrouiller",
|
||||
"setNewPassword": "Définir un nouveau mot de passe",
|
||||
"deviceLock": "Verrouillage de l'appareil",
|
||||
"hideContent": "Masquer le contenu",
|
||||
"enterPin": "Saisir le code PIN",
|
||||
"setNewPin": "Définir un nouveau code PIN",
|
||||
"importFailureDescNew": "Impossible de lire le fichier sélectionné."
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"account": "חשבון",
|
||||
"unlock": "בטל נעילה",
|
||||
"recoveryKey": "מפתח שחזור",
|
||||
"counterAppBarTitle": "מונה",
|
||||
"@counterAppBarTitle": {
|
||||
@@ -105,12 +106,15 @@
|
||||
"copied": "הועתק",
|
||||
"pleaseTryAgain": "אנא נסה שנית",
|
||||
"existingUser": "משתמש קיים",
|
||||
"newUser": "חדש בente",
|
||||
"delete": "למחוק",
|
||||
"enterYourPasswordHint": "הכנס סיסמא",
|
||||
"forgotPassword": "שכחתי סיסמה",
|
||||
"oops": "אופס",
|
||||
"suggestFeatures": "הציעו מאפיינים",
|
||||
"faq": "שאלות נפוצות",
|
||||
"faq_q_1": "כמה מאובטח ente Auth?",
|
||||
"faq_a_1": "כל הקודים שאתה מגבה דרך ente מאוחסנים מקצה לקצה בהצפנה. הכוונה שרק אתה יכול לגשת לקודים שלך. האפליקציות שלנו הם מפותחות דרך קוד פתוח והקריפטוגרפיה שלנו מבוקרת חיצונית.",
|
||||
"faq_q_2": "האם ישנה אפשרות להשתמש בקודים שלי במחשב?",
|
||||
"faq_a_2": "אתה יכול לגשת לקודים שלך ברשת ב- auth.ente.io.",
|
||||
"faq_q_3": "איך אפשר למחוק קודים?",
|
||||
@@ -183,6 +187,8 @@
|
||||
"recoveryKeySaveDescription": "אנחנו לא מאחסנים את המפתח הזה, אנא שמור את המפתח 24 מילים הזה במקום בטוח.",
|
||||
"doThisLater": "עשה זאת מאוחר יותר",
|
||||
"saveKey": "שמור מפתח",
|
||||
"save": "שמור",
|
||||
"send": "שלח",
|
||||
"back": "חזרה",
|
||||
"createAccount": "צור חשבון",
|
||||
"passwordStrength": "חוזק הסיסמא: {passwordStrengthValue}",
|
||||
@@ -247,6 +253,7 @@
|
||||
"privacy": "פרטיות",
|
||||
"terms": "תנאים",
|
||||
"checkForUpdates": "בדוק אם קיימים עדכונים",
|
||||
"checkStatus": "בדוק סטטוס",
|
||||
"downloadUpdate": "הורד",
|
||||
"criticalUpdateAvailable": "עדכון חשוב זמין",
|
||||
"updateAvailable": "עדכון זמין",
|
||||
@@ -327,5 +334,8 @@
|
||||
"minimizeAppOnCopy": "מזער אפליקציה בהעתקה",
|
||||
"editCodeAuthMessage": "אמת כדי לערוך קוד",
|
||||
"deleteCodeAuthMessage": "אמת כדי למחוק קוד",
|
||||
"showQRAuthMessage": "אמת כדי להראות קוד QR"
|
||||
"showQRAuthMessage": "אמת כדי להראות קוד QR",
|
||||
"confirmAccountDeleteTitle": "אישור מחיקת חשבון",
|
||||
"noInternetConnection": "אין חיבור לאינטרנט",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "אנא בדוק את חיבור האינטרנט שלך ונסה שוב."
|
||||
}
|
||||
@@ -1 +1,4 @@
|
||||
{}
|
||||
{
|
||||
"account": "खाता",
|
||||
"unlock": "खोलें"
|
||||
}
|
||||
@@ -442,5 +442,29 @@
|
||||
"deleteTagTitle": "Eliminare il tag?",
|
||||
"deleteTagMessage": "Sei sicuro di voler eliminare questo tag? Questa azione è irreversibile.",
|
||||
"somethingWentWrongParsingCode": "Non siamo riusciti ad analizzare i codici {x}.",
|
||||
"updateNotAvailable": "Aggiornamento non disponibile"
|
||||
"updateNotAvailable": "Aggiornamento non disponibile",
|
||||
"viewRawCodes": "Visualizza codici raw",
|
||||
"rawCodes": "Codici raw",
|
||||
"rawCodeData": "Dati codice raw",
|
||||
"appLock": "Blocco app",
|
||||
"noSystemLockFound": "Nessun blocco di sistema trovato",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Per abilitare il blocco dell'app, configura il codice di accesso del dispositivo o il blocco schermo nelle impostazioni di sistema.",
|
||||
"autoLock": "Blocco automatico",
|
||||
"immediately": "Immediatamente",
|
||||
"reEnterPassword": "Reinserisci la password",
|
||||
"reEnterPin": "Reinserisci il PIN",
|
||||
"next": "Successivo",
|
||||
"tooManyIncorrectAttempts": "Troppi tentativi errati",
|
||||
"tapToUnlock": "Tocca per sbloccare",
|
||||
"setNewPassword": "Imposta una nuova password",
|
||||
"deviceLock": "Blocco del dispositivo",
|
||||
"hideContent": "Nascondi il contenuto",
|
||||
"hideContentDescriptionAndroid": "Nasconde il contenuto nel selettore delle app e disabilita gli screenshot",
|
||||
"hideContentDescriptioniOS": "Nasconde il contenuto nel selettore delle app",
|
||||
"autoLockFeatureDescription": "Tempo dopo il quale l'applicazione si blocca dopo essere stata messa in background",
|
||||
"appLockDescription": "Scegli tra la schermata di blocco predefinita del dispositivo e una schermata di blocco personalizzata con PIN o password.",
|
||||
"pinLock": "Blocco con PIN",
|
||||
"enterPin": "Inserisci PIN",
|
||||
"setNewPin": "Imposta un nuovo PIN",
|
||||
"importFailureDescNew": "Impossibile elaborare il file selezionato."
|
||||
}
|
||||
@@ -1 +1,86 @@
|
||||
{}
|
||||
{
|
||||
"account": "계정",
|
||||
"unlock": "잠금해제",
|
||||
"recoveryKey": "복구 키",
|
||||
"counterAppBarTitle": "카운터",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "2단계 인증 코드를 안전하게 백업하세요",
|
||||
"onBoardingGetStarted": "시작하기",
|
||||
"setupFirstAccount": "첫번째 계정을 설정하세요",
|
||||
"importScanQrCode": "QR 코드 스캔",
|
||||
"qrCode": "QR 코드",
|
||||
"importEnterSetupKey": "설정 키 입력",
|
||||
"importAccountPageTitle": "계정 상세 정보 입력",
|
||||
"secretCanNotBeEmpty": "비밀 키는 비워둘 수 없습니다",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "발행인과 계정을 모두 비워둘 수 없습니다",
|
||||
"incorrectDetails": "세부 정보가 잘못 됨",
|
||||
"pleaseVerifyDetails": "입력된 정보를 확인하고 다시 시도하세요",
|
||||
"codeIssuerHint": "발행인",
|
||||
"codeSecretKeyHint": "비밀 키",
|
||||
"codeAccountHint": "계정 (you@domain.com)",
|
||||
"codeTagHint": "태그",
|
||||
"accountKeyType": "키 종류",
|
||||
"sessionExpired": "세션 만료 됨",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "다시 로그인하세요",
|
||||
"loggingOut": "로그아웃하는 중...",
|
||||
"timeBasedKeyType": "시간 기반 (TOTP)",
|
||||
"counterBasedKeyType": "카운터 기반 (HOTP)",
|
||||
"saveAction": "저장",
|
||||
"nextTotpTitle": "다음",
|
||||
"deleteCodeTitle": "코드를 삭제할까요?",
|
||||
"deleteCodeMessage": "정말 이 코드를 삭제하시겠습니까? 이 동작은 되돌릴 수 없습니다.",
|
||||
"viewLogsAction": "로그 확인",
|
||||
"sendLogsDescription": "이렇게 하면 문제를 디버깅하는 데 도움이 되는 로그가 전송됩니다. 민감한 정보가 기록되지 않도록 예방 조치를 취하고 있지만, 로그를 공유하기 전에 해당 로그를 확인하는 것이 좋습니다.",
|
||||
"preparingLogsTitle": "로그를 준비하는 중...",
|
||||
"emailLogsTitle": "이메일 로그",
|
||||
"emailLogsMessage": "{email} 로 로그를 보내주세요",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "이메일 복사",
|
||||
"exportLogsAction": "로그 내보내기",
|
||||
"reportABug": "버그 제보",
|
||||
"crashAndErrorReporting": "충돌 & 에러 보고",
|
||||
"reportBug": "버그 제보",
|
||||
"emailUsMessage": "{email} 로 이메일을 보내주세요",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "지원 연락",
|
||||
"rateUsOnStore": "{storeName} 에서 평가해주세요",
|
||||
"blog": "블로그",
|
||||
"merchandise": "제품",
|
||||
"verifyPassword": "비밀번호 확인",
|
||||
"pleaseWait": "잠시만 기다려주세요...",
|
||||
"generatingEncryptionKeysTitle": "암호화 키를 생성하는 중...",
|
||||
"recreatePassword": "비밀번호 재생성",
|
||||
"recreatePasswordMessage": "현재 기기는 비밀번호를 확인할 수 있을 만큼 강력하지 않으므로, 모든 기기에서 작동하는 방식으로 비밀번호를 한 번 더 생성해야 합니다. \n\n복구 키를 사용하여 로그인하고 비밀번호를 다시 생성해 주세요. (원하는 경우 동일한 비밀번호를 다시 사용할 수 있습니다)",
|
||||
"useRecoveryKey": "복구 키 사용",
|
||||
"incorrectPasswordTitle": "올바르지 않은 비밀번호",
|
||||
"welcomeBack": "돌아오신 것을 환영합니다!",
|
||||
"madeWithLoveAtPrefix": "made with ❤️ at ",
|
||||
"supportDevs": "<bold-green>ente</bold-green>를 구독하고 저희를 지원해주세요",
|
||||
"supportDiscount": "쿠폰 코드 \"AUTH\"를 사용하고 첫 해 10% 할인 혜택을 받으세요",
|
||||
"changeEmail": "이메일 변경",
|
||||
"changePassword": "비밀번호 변경",
|
||||
"data": "데이터",
|
||||
"importCodes": "코드 가져오기",
|
||||
"importTypePlainText": "일반 텍스트",
|
||||
"importTypeEnteEncrypted": "Ente로 암호화된 내보내기",
|
||||
"passwordForDecryptingExport": "복호화용 비밀번호",
|
||||
"passwordEmptyError": "비밀번호는 비어있을 수 없습니다",
|
||||
"importSelectJsonFile": "JSON 파일 선택"
|
||||
}
|
||||
@@ -442,5 +442,29 @@
|
||||
"deleteTagTitle": "Label verwijderen?",
|
||||
"deleteTagMessage": "Weet je zeker dat je deze label wilt verwijderen? Deze actie is onomkeerbaar.",
|
||||
"somethingWentWrongParsingCode": "We konden {x} codes niet verwerken.",
|
||||
"updateNotAvailable": "Update niet beschikbaar"
|
||||
"updateNotAvailable": "Update niet beschikbaar",
|
||||
"viewRawCodes": "Ruwe codes weergeven",
|
||||
"rawCodes": "Ruwe codes",
|
||||
"rawCodeData": "Onbewerkte code gegevens",
|
||||
"appLock": "App-vergrendeling",
|
||||
"noSystemLockFound": "Geen systeemvergrendeling gevonden",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om schermvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.",
|
||||
"autoLock": "Automatische vergrendeling",
|
||||
"immediately": "Onmiddellijk",
|
||||
"reEnterPassword": "Wachtwoord opnieuw invoeren",
|
||||
"reEnterPin": "PIN opnieuw invoeren",
|
||||
"next": "Volgende",
|
||||
"tooManyIncorrectAttempts": "Te veel onjuiste pogingen",
|
||||
"tapToUnlock": "Tik om te ontgrendelen",
|
||||
"setNewPassword": "Nieuw wachtwoord instellen",
|
||||
"deviceLock": "Apparaat vergrendeling",
|
||||
"hideContent": "Inhoud verbergen",
|
||||
"hideContentDescriptionAndroid": "Verbergt de app inhoud in de app switcher en schakelt schermafbeeldingen uit",
|
||||
"hideContentDescriptioniOS": "Verbergt de inhoud van de app in de app switcher",
|
||||
"autoLockFeatureDescription": "Tijd waarna de app vergrendelt nadat ze op de achtergrond is gezet",
|
||||
"appLockDescription": "Kies tussen de standaard schermvergrendeling van uw apparaat en een aangepaste schermvergrendeling met een pincode of wachtwoord.",
|
||||
"pinLock": "Pin vergrendeling",
|
||||
"enterPin": "Pin invoeren",
|
||||
"setNewPin": "Nieuwe pin instellen",
|
||||
"importFailureDescNew": "Kon het geselecteerde bestand niet lezen."
|
||||
}
|
||||
@@ -16,9 +16,9 @@
|
||||
"secretCanNotBeEmpty": "Sekret nie może być pusty",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Pola wydawca i konto nie mogą być puste",
|
||||
"incorrectDetails": "Nieprawidłowe szczegóły",
|
||||
"pleaseVerifyDetails": "Proszę zweryfikować szczegóły i spróbuj ponownie",
|
||||
"pleaseVerifyDetails": "Prosimy zweryfikować szczegóły i spróbować ponownie",
|
||||
"codeIssuerHint": "Wydawca",
|
||||
"codeSecretKeyHint": "Tajny klucz",
|
||||
"codeSecretKeyHint": "Tajny Klucz",
|
||||
"codeAccountHint": "Konto (ty@domena.com)",
|
||||
"codeTagHint": "Oznacz",
|
||||
"accountKeyType": "Rodzaj klucza",
|
||||
@@ -26,7 +26,7 @@
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Prosimy zaloguj się ponownie",
|
||||
"pleaseLoginAgain": "Prosimy zalogować się ponownie",
|
||||
"loggingOut": "Wylogowywanie...",
|
||||
"timeBasedKeyType": "Oparte na czasie (TOTP)",
|
||||
"counterBasedKeyType": "Oparte na liczniku (HOTP)",
|
||||
@@ -36,9 +36,9 @@
|
||||
"deleteCodeMessage": "Czy na pewno chcesz usunąć ten kod? Ta akcja jest nieodwracalna.",
|
||||
"viewLogsAction": "Wyświetl logi",
|
||||
"sendLogsDescription": "Spowoduje to przesłanie logów, które pomogą nam rozwiązać Twój problem. Chociaż podejmujemy środki ostrożności, aby zapewnić, że wrażliwe informacje nie są rejestrowane, zachęcamy do obejrzenia tych dzienników przed ich udostępnieniem.",
|
||||
"preparingLogsTitle": "Przygotowanie logów...",
|
||||
"emailLogsTitle": "Wyślij log mailem",
|
||||
"emailLogsMessage": "Proszę wysłać logi do {email}",
|
||||
"preparingLogsTitle": "Przygotowywanie logów...",
|
||||
"emailLogsTitle": "Wyślij logi mailem",
|
||||
"emailLogsMessage": "Prosimy wysłać logi do {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
@@ -64,14 +64,14 @@
|
||||
"blog": "Blog",
|
||||
"merchandise": "Sklep",
|
||||
"verifyPassword": "Zweryfikuj hasło",
|
||||
"pleaseWait": "Proszę czekać...",
|
||||
"pleaseWait": "Prosimy czekać...",
|
||||
"generatingEncryptionKeysTitle": "Generowanie kluczy szyfrujących...",
|
||||
"recreatePassword": "Zresetuj hasło",
|
||||
"recreatePasswordMessage": "Obecne urządzenie nie jest wystarczająco wydajne, aby zweryfikować Twoje hasło, więc musimy je raz zregenerować w sposób, który działa ze wszystkimi urządzeniami. \n\nZaloguj się przy użyciu klucza odzyskiwania i zresetuj swoje hasło (możesz ponownie użyć tego samego, jeśli chcesz).",
|
||||
"useRecoveryKey": "Użyj kodu odzyskiwania",
|
||||
"incorrectPasswordTitle": "Nieprawidłowe hasło",
|
||||
"welcomeBack": "Witaj ponownie!",
|
||||
"madeWithLoveAtPrefix": "wykonane z ❤️ w ",
|
||||
"madeWithLoveAtPrefix": "zrobione z ❤️ w ",
|
||||
"supportDevs": "Subskrybuj <bold-green>ente</bold-green> aby wesprzeć ten projekt.",
|
||||
"supportDiscount": "Użyj kodu rabatowego \"AUTH\", aby otrzymać 10% rabatu na pierwszy rok",
|
||||
"changeEmail": "Zmień adres e-mail",
|
||||
@@ -83,7 +83,7 @@
|
||||
"passwordForDecryptingExport": "Hasło do odszyfrowania eksportu",
|
||||
"passwordEmptyError": "Pole hasło nie może być puste",
|
||||
"importFromApp": "Importuj kody z {appName}",
|
||||
"importGoogleAuthGuide": "Wyeksportuj twoje konta z Google Authenticator do kodu QR używając opcji \"Przenieś konta\". Potem używając innego urządzenia, zeskanuj kod QR.",
|
||||
"importGoogleAuthGuide": "Wyeksportuj Twoje konta z Google Authenticator do kodu QR używając opcji \"Przenieś konta\". Potem używając innego urządzenia, zeskanuj kod QR.\n\nWskazówka: Możesz użyć kamery Twojego laptopa, by zrobić zdjęcie kodu QR.",
|
||||
"importSelectJsonFile": "Wybierz plik JSON",
|
||||
"importSelectAppExport": "Wybierz plik eksportu {appName}",
|
||||
"importEnteEncGuide": "Wybierz zaszyfrowany plik JSON wyeksportowany z Ente",
|
||||
@@ -98,13 +98,13 @@
|
||||
"importCodeDelimiterInfo": "Kody mogą być oddzielone przecinkiem lub nową linią",
|
||||
"selectFile": "Wybierz plik",
|
||||
"emailVerificationToggle": "Weryfikacja e-mail",
|
||||
"emailVerificationEnableWarning": "Jeśli przechowujesz uwierzytelnianie dwuskładnikowe do twojego e-mailu z nami, włączenie weryfikacji adresu e-mail może spowodować impas. Jeśli jesteś zablokowany z jednej usługi, możesz nie być w stanie zalogować się do drugiej.",
|
||||
"authToChangeEmailVerificationSetting": "Proszę uwierzytelnić, aby zmienić weryfikację e-mail",
|
||||
"authToViewYourRecoveryKey": "Proszę uwierzytelnić, aby wyświetlić swój klucz odzyskiwania",
|
||||
"authToChangeYourEmail": "Proszę uwierzytelnić, aby zmienić swój adres e-mail",
|
||||
"authToChangeYourPassword": "Proszę uwierzytelnić, aby zmienić hasło",
|
||||
"authToViewSecrets": "Proszę uwierzytelnić, aby wyświetlić swoje sekrety",
|
||||
"authToInitiateSignIn": "Proszę uwierzytelnić się, aby zainicjować logowanie do kopii zapasowej.",
|
||||
"emailVerificationEnableWarning": "Aby uniknąć zablokowania się z konta, upewnij się, że przed włączeniem weryfikacji e-mail przechowujesz kopię 2FA dla swojego adresu e-mail poza Ente Auth.",
|
||||
"authToChangeEmailVerificationSetting": "Prosimy uwierzytelnić się, aby zmienić weryfikację e-mail",
|
||||
"authToViewYourRecoveryKey": "Prosimy uwierzytelnić się, aby wyświetlić swój klucz odzyskiwania",
|
||||
"authToChangeYourEmail": "Prosimy uwierzytelnić się, aby zmienić swój adres e-mail",
|
||||
"authToChangeYourPassword": "Prosimy uwierzytelnić się, aby zmienić hasło",
|
||||
"authToViewSecrets": "Prosimy uwierzytelnić się, aby wyświetlić swoje sekrety",
|
||||
"authToInitiateSignIn": "Prosimy uwierzytelnić się, aby zainicjować logowanie do kopii zapasowej.",
|
||||
"ok": "Ok",
|
||||
"cancel": "Anuluj",
|
||||
"yes": "Tak",
|
||||
@@ -114,8 +114,8 @@
|
||||
"general": "Ogólne",
|
||||
"settings": "Ustawienia",
|
||||
"copied": "Skopiowano",
|
||||
"pleaseTryAgain": "Proszę spróbować ponownie",
|
||||
"existingUser": "Istniejący użytkownik",
|
||||
"pleaseTryAgain": "Prosimy spróbować ponownie",
|
||||
"existingUser": "Istniejący Użytkownik",
|
||||
"newUser": "Nowy/a do Ente",
|
||||
"delete": "Usuń",
|
||||
"enterYourPasswordHint": "Wprowadź swoje hasło",
|
||||
@@ -133,7 +133,7 @@
|
||||
"faq_a_4": "Możesz wspierać rozwój tego projektu, subskrybując do naszej aplikacji Zdjęcia na ente.io.",
|
||||
"faq_q_5": "Jak mogę włączyć blokadę FaceID w Ente Auth",
|
||||
"faq_a_5": "Możesz włączyć blokadę FaceID w Ustawienia → Bezpieczeństwo→ Ekran blokady.",
|
||||
"somethingWentWrongMessage": "Coś poszło nie tak. Proszę, spróbuj ponownie",
|
||||
"somethingWentWrongMessage": "Coś poszło nie tak, prosimy spróbować ponownie",
|
||||
"leaveFamily": "Opuść rodzinę",
|
||||
"leaveFamilyMessage": "Czy jesteś pewien/pewna, że chcesz opuścić plan rodzinny?",
|
||||
"inFamilyPlanMessage": "Jesteś w planie rodzinnym!",
|
||||
@@ -142,15 +142,15 @@
|
||||
"scanACode": "Skanuj kod",
|
||||
"verify": "Zweryfikuj",
|
||||
"verifyEmail": "Zweryfikuj adres e-mail",
|
||||
"enterCodeHint": "Wprowadź sześciocyfrowy kod z twojej aplikacji uwierzytelniającej",
|
||||
"enterCodeHint": "Wprowadź sześciocyfrowy kod z \nTwojej aplikacji uwierzytelniającej",
|
||||
"lostDeviceTitle": "Zagubiono urządzenie?",
|
||||
"twoFactorAuthTitle": "Uwierzytelnianie dwuetapowe",
|
||||
"twoFactorAuthTitle": "Uwierzytelnianie dwustopniowe",
|
||||
"passkeyAuthTitle": "Weryfikacja kluczem dostępu",
|
||||
"verifyPasskey": "Zweryfikuj klucz dostępu",
|
||||
"recoverAccount": "Odzyskaj konto",
|
||||
"enterRecoveryKeyHint": "Wprowadź swój klucz odzyskiwania",
|
||||
"recover": "Odzyskaj",
|
||||
"contactSupportViaEmailMessage": "Wyślij wiadomość e-mail na {email} z zarejestrowanego adresu e-mail",
|
||||
"contactSupportViaEmailMessage": "Wyślij wiadomość e-mail na {email} z Twojego zarejestrowanego adresu e-mail",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
@@ -162,17 +162,17 @@
|
||||
"noRecoveryKeyTitle": "Brak klucza odzyskiwania?",
|
||||
"enterEmailHint": "Wprowadź adres e-mail",
|
||||
"invalidEmailTitle": "Nieprawidłowy adres e-mail",
|
||||
"invalidEmailMessage": "Proszę wpisać prawidłowy adres e-mail.",
|
||||
"invalidEmailMessage": "Prosimy podać prawidłowy adres e-mail.",
|
||||
"deleteAccount": "Usuń konto",
|
||||
"deleteAccountQuery": "Będzie nam przykro, że odchodzisz. Masz jakiś problem?",
|
||||
"yesSendFeedbackAction": "Tak, wyślij opinię",
|
||||
"noDeleteAccountAction": "Nie, usuń moje konto",
|
||||
"initiateAccountDeleteTitle": "Proszę uwierzytelnić, aby zainicjować usuwanie konta",
|
||||
"initiateAccountDeleteTitle": "Prosimy uwierzytelnić się, aby zainicjować usuwanie konta",
|
||||
"sendEmail": "Wyślij e-mail",
|
||||
"createNewAccount": "Utwórz nowe konto",
|
||||
"weakStrength": "Słabe",
|
||||
"strongStrength": "Silne",
|
||||
"moderateStrength": "Umiarkowany",
|
||||
"moderateStrength": "Umiarkowane",
|
||||
"confirmPassword": "Potwierdź hasło",
|
||||
"close": "Zamknij",
|
||||
"oopsSomethingWentWrong": "Ups! Coś poszło nie tak.",
|
||||
@@ -181,10 +181,10 @@
|
||||
"social": "Społeczność",
|
||||
"security": "Bezpieczeństwo",
|
||||
"lockscreen": "Ekran blokady",
|
||||
"authToChangeLockscreenSetting": "Proszę uwierzytelnić, aby zmienić ustawienia ekranu blokady",
|
||||
"authToChangeLockscreenSetting": "Prosimy uwierzytelnić się, aby zmienić ustawienia ekranu blokady",
|
||||
"lockScreenEnablePreSteps": "Aby włączyć ekran blokady, ustaw hasło urządzenia lub blokadę ekranu w ustawieniach systemu.",
|
||||
"viewActiveSessions": "Zobacz aktualne sesje",
|
||||
"authToViewYourActiveSessions": "Proszę uwierzytelnić, aby wyświetlić swój klucz odzyskiwania",
|
||||
"viewActiveSessions": "Zobacz aktywne sesje",
|
||||
"authToViewYourActiveSessions": "Prosimy uwierzytelnić się, aby wyświetlić swoje aktywne sesje",
|
||||
"searchHint": "Szukaj...",
|
||||
"search": "Szukaj",
|
||||
"sorryUnableToGenCode": "Przepraszamy, nie można wygenerować kodu dla {issuerName}",
|
||||
@@ -199,12 +199,12 @@
|
||||
"recoveryKeyCopiedToClipboard": "Klucz odzyskiwania został skopiowany do schowka",
|
||||
"recoveryKeyOnForgotPassword": "Jeśli zapomnisz hasła, jedynym sposobem na odzyskanie danych jest ten klucz.",
|
||||
"recoveryKeySaveDescription": "Nie przechowujemy tego klucza, proszę zachować ten 24 wyrazowy klucz w bezpiecznym miejscu.",
|
||||
"doThisLater": "Zrób To Później",
|
||||
"doThisLater": "Zrób to później",
|
||||
"saveKey": "Zapisz klucz",
|
||||
"save": "Zapisz",
|
||||
"send": "Wyślij",
|
||||
"saveOrSendDescription": "Czy chcesz zapisać to do pamięci masowej (domyślnie folder Pobrane) czy wysłać to do innych aplikacji?",
|
||||
"saveOnlyDescription": "Czy chcesz zapisać to do pamięci masowej (domyślnie folder Pobrane)?",
|
||||
"saveOrSendDescription": "Czy chcesz zapisać to do swojej pamięci masowej (domyślnie folder Pobrane) czy wysłać to do innych aplikacji?",
|
||||
"saveOnlyDescription": "Czy chcesz zapisać to do swojej pamięci masowej (domyślnie folder Pobrane)?",
|
||||
"back": "Wstecz",
|
||||
"createAccount": "Utwórz konto",
|
||||
"passwordStrength": "Siła hasła: {passwordStrengthValue}",
|
||||
@@ -221,7 +221,7 @@
|
||||
},
|
||||
"password": "Hasło",
|
||||
"signUpTerms": "Akceptuję <u-terms>warunki korzystania z usługi</u-terms> i <u-policy>politykę prywatności</u-policy>",
|
||||
"privacyPolicyTitle": "Polityka prywatności",
|
||||
"privacyPolicyTitle": "Polityka Prywatności",
|
||||
"termsOfServicesTitle": "Regulamin",
|
||||
"encryption": "Szyfrowanie",
|
||||
"setPasswordTitle": "Ustaw hasło",
|
||||
@@ -238,7 +238,7 @@
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Przepraszamy, nie mogliśmy wygenerować kluczy bezpiecznych na tym urządzeniu.\n\nZarejestruj się z innego urządzenia.",
|
||||
"howItWorks": "Jak to działa",
|
||||
"ackPasswordLostWarning": "Rozumiem, że jeśli utracę hasło, mogę stracić moje dane, ponieważ moje dane są <underline>szyfrowane end-to-end</underline>.",
|
||||
"loginTerms": "Klikając zaloguj się zgadzam się na <u-terms>Regulamin</u-terms> i <u-policy>politykę prywatności<u-policy>",
|
||||
"loginTerms": "Klikając, zaloguj się, zgadzam się na <u-terms>regulamin</u-terms> i <u-policy>politykę prywatności</u-policy>",
|
||||
"logInLabel": "Zaloguj się",
|
||||
"logout": "Wyloguj się",
|
||||
"areYouSureYouWantToLogout": "Czy na pewno chcesz się wylogować?",
|
||||
@@ -246,8 +246,8 @@
|
||||
"exit": "Wyjdź",
|
||||
"verifyingRecoveryKey": "Weryfikowanie klucza odzyskiwania...",
|
||||
"recoveryKeyVerified": "Klucz odzyskiwania zweryfikowany",
|
||||
"recoveryKeySuccessBody": "Świetnie! Twój klucz odzyskiwania jest prawidłowy. Dziękuję za weryfikację.\n\nPamiętaj, aby przechowywać klucz odzyskiwania w bezpiecznej kopii zapasowej.",
|
||||
"invalidRecoveryKey": "Wprowadzony klucz odzyskiwania jest nieprawidłowy. Upewnij się, że zawiera 24 słowa i sprawdź pisownię każdego z nich.\n\nJeśli wprowadziłeś starszy kod odzyskiwania, upewnij się, że ma on 64 znaki i sprawdź każdy z nich.",
|
||||
"recoveryKeySuccessBody": "Znakomicie! Klucz odzyskiwania jest prawidłowy. Dziękujemy za weryfikację.\n\nPamiętaj, aby bezpiecznie przechowywać kopię zapasową klucza odzyskiwania.",
|
||||
"invalidRecoveryKey": "Wprowadzony klucz odzyskiwania jest nieprawidłowy. Upewnij się, że zawiera 24 słowa i sprawdź pisownię każdego z nich.\n\nJeśli wprowadziłeś/aś starszy kod odzyskiwania, upewnij się, że ma on 64 znaki i sprawdź każdy z nich.",
|
||||
"recreatePasswordTitle": "Zresetuj hasło",
|
||||
"recreatePasswordBody": "Obecne urządzenie nie jest wystarczająco wydajne, aby zweryfikować Twoje hasło, więc musimy je raz zregenerować w sposób, który działa ze wszystkimi urządzeniami. \n\nZaloguj się przy użyciu klucza odzyskiwania i zresetuj swoje hasło (możesz ponownie użyć tego samego, jeśli chcesz).",
|
||||
"invalidKey": "Nieprawidłowy klucz",
|
||||
@@ -258,7 +258,7 @@
|
||||
"confirmYourRecoveryKey": "Potwierdź klucz odzyskiwania",
|
||||
"confirm": "Potwierdź",
|
||||
"emailYourLogs": "Wyślij mailem logi",
|
||||
"pleaseSendTheLogsTo": "Proszę wysłać logi do {toEmail}",
|
||||
"pleaseSendTheLogsTo": "Prosimy wysłać logi do {toEmail}",
|
||||
"copyEmailAddress": "Kopiuj adres e-mail",
|
||||
"exportLogs": "Eksportuj logi",
|
||||
"enterYourRecoveryKey": "Wprowadź swój klucz odzyskiwania",
|
||||
@@ -279,14 +279,14 @@
|
||||
"checking": "Sprawdzanie...",
|
||||
"youAreOnTheLatestVersion": "Używasz najnowszej wersji",
|
||||
"warning": "Ostrzeżenie",
|
||||
"exportWarningDesc": "Wyeksportowany plik zawiera poufne informacje. Przechowuj to bezpiecznie.",
|
||||
"exportWarningDesc": "Wyeksportowany plik zawiera poufne informacje. Przechowuj go bezpiecznie.",
|
||||
"iUnderStand": "Rozumiem",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "Proszę uwierzytelnić, aby wyeksportować swoje kody",
|
||||
"authToExportCodes": "Prosimy uwierzytelnić się, aby wyeksportować swoje kody",
|
||||
"importSuccessTitle": "Hura!",
|
||||
"importSuccessDesc": "Zaimportowałeś {count} kodów!",
|
||||
"importSuccessDesc": "Zaimportowałeś/aś {count} kodów!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
@@ -328,9 +328,9 @@
|
||||
"incorrectCode": "Nieprawidłowy kod",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "Niestety, wprowadzony kod jest nieprawidłowy",
|
||||
"emailChangedTo": "Adres e-mail został zmieniony na {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "Uwierzytelnianie nie powiodło się, proszę spróbować ponownie",
|
||||
"authenticationFailedPleaseTryAgain": "Uwierzytelnianie nie powiodło się, prosimy spróbować ponownie",
|
||||
"authenticationSuccessful": "Uwierzytelnianie powiodło się!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Pomyślnie zresetowano uwierzytelnianie dwuskładnikowe",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Pomyślnie zresetowano uwierzytelnianie dwustopniowe",
|
||||
"incorrectRecoveryKey": "Nieprawidłowy klucz odzyskiwania",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "Wprowadzony klucz odzyskiwania jest nieprawidłowy",
|
||||
"enterPassword": "Wprowadź hasło",
|
||||
@@ -343,7 +343,7 @@
|
||||
"useOffline": "Używaj bez kopii zapasowych",
|
||||
"signInToBackup": "Zaloguj się, aby wykonać kopię zapasową swoich kodów",
|
||||
"singIn": "Zaloguj się",
|
||||
"sigInBackupReminder": "Proszę wyeksportować swoje kody, aby upewnić się, że masz kopię zapasową, z której możesz przywrócić swoje kody.",
|
||||
"sigInBackupReminder": "Prosimy wyeksportować swoje kody, aby upewnić się, że masz kopię zapasową, z której możesz przywrócić swoje kody.",
|
||||
"offlineModeWarning": "Wybrałeś kontynuację bez kopii zapasowych. Proszę wykonywać ręczne kopie zapasowe, aby upewnić się, że Twoje kody są bezpieczne.",
|
||||
"showLargeIcons": "Pokaż duże ikony",
|
||||
"shouldHideCode": "Ukryj kody",
|
||||
@@ -351,9 +351,9 @@
|
||||
"focusOnSearchBar": "Uaktywnij wyszukiwanie przy uruchamianiu aplikacji",
|
||||
"confirmUpdatingkey": "Czy na pewno chcesz zaktualizować tajny klucz?",
|
||||
"minimizeAppOnCopy": "Minimalizuj aplikację przy kopiowaniu",
|
||||
"editCodeAuthMessage": "Uwierzytelnij, aby edytować kod",
|
||||
"deleteCodeAuthMessage": "Uwierzytelnij, aby usunąć kod",
|
||||
"showQRAuthMessage": "Uwierzytelnij, aby pokazać kod QR",
|
||||
"editCodeAuthMessage": "Uwierzytelnij się, aby edytować kod",
|
||||
"deleteCodeAuthMessage": "Uwierzytelnij się, aby usunąć kod",
|
||||
"showQRAuthMessage": "Uwierzytelnij się, aby pokazać kod QR",
|
||||
"confirmAccountDeleteTitle": "Potwierdź usunięcie konta",
|
||||
"confirmAccountDeleteMessage": "To konto jest połączone z innymi aplikacjami Ente, jeśli ich używasz.\n\nTwoje przesłane dane, we wszystkich aplikacjach Ente, zostaną zaplanowane do usunięcia, a Twoje konto zostanie trwale usunięte.",
|
||||
"androidBiometricHint": "Potwierdź swoją tożsamość",
|
||||
@@ -388,7 +388,7 @@
|
||||
"@androidDeviceCredentialsSetupDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"goToSettings": "Przejdź do Ustawień",
|
||||
"goToSettings": "Przejdź do ustawień",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
@@ -409,12 +409,12 @@
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"noInternetConnection": "Brak połączenia z Internetem",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Proszę sprawdzić połączenie internetowe i spróbować ponownie.",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Prosimy sprawdzić połączenie internetowe i spróbować ponownie.",
|
||||
"signOutFromOtherDevices": "Wyloguj z pozostałych urządzeń",
|
||||
"signOutOtherBody": "Jeśli uważasz, że ktoś może znać Twoje hasło, możesz wymusić wylogowanie na wszystkich innych urządzeniach korzystających z Twojego konta.",
|
||||
"signOutOtherDevices": "Wyloguj z pozostałych urządzeń",
|
||||
"doNotSignOut": "Nie wylogowuj mnie",
|
||||
"hearUsWhereTitle": "Jak usłyszałeś o Ente? (opcjonalnie)",
|
||||
"hearUsWhereTitle": "Jak usłyszałeś/aś o Ente? (opcjonalnie)",
|
||||
"hearUsExplanation": "Nie śledzimy instalacji aplikacji. Pomogłyby nam, gdybyś powiedział/a nam, gdzie nas znalazłeś/aś!",
|
||||
"recoveryKeySaved": "Klucz odzyskiwania zapisany w folderze Pobrane!",
|
||||
"waitingForBrowserRequest": "Oczekiwanie na żądanie przeglądarki...",
|
||||
@@ -424,7 +424,7 @@
|
||||
"loginSessionExpired": "Sesja wygasła",
|
||||
"loginSessionExpiredDetails": "Twoja sesja wygasła. Zaloguj się ponownie.",
|
||||
"developerSettingsWarning": "Czy na pewno chcesz zmodyfikować ustawienia programisty?",
|
||||
"developerSettings": "Ustawienia deweloperskie",
|
||||
"developerSettings": "Ustawienia dla programistów",
|
||||
"serverEndpoint": "Punkt końcowy serwera",
|
||||
"invalidEndpoint": "Punkt końcowy jest nieprawidłowy",
|
||||
"invalidEndpointMessage": "Niestety, wprowadzony punkt końcowy jest nieprawidłowy. Wprowadź prawidłowy punkt końcowy i spróbuj ponownie.",
|
||||
@@ -441,6 +441,30 @@
|
||||
"editTag": "Edytuj Etykietę",
|
||||
"deleteTagTitle": "Usunąć etykietę?",
|
||||
"deleteTagMessage": "Czy na pewno chcesz usunąć tę etykietę? Ta akcja jest nieodwracalna.",
|
||||
"somethingWentWrongParsingCode": "Nie udało się przetworzyć kodów {x}.",
|
||||
"updateNotAvailable": "Aktualizacja jest niedostępna"
|
||||
"somethingWentWrongParsingCode": "Nie udało się przetworzyć {x} kodów.",
|
||||
"updateNotAvailable": "Aktualizacja jest niedostępna",
|
||||
"viewRawCodes": "Zobacz surowe kody",
|
||||
"rawCodes": "Surowe kody",
|
||||
"rawCodeData": "Dane surowego kodu",
|
||||
"appLock": "Blokada dostępu do aplikacji",
|
||||
"noSystemLockFound": "Nie znaleziono blokady systemowej",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Aby włączyć blokadę aplikacji, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach systemu.",
|
||||
"autoLock": "Automatyczna blokada",
|
||||
"immediately": "Natychmiast",
|
||||
"reEnterPassword": "Wprowadź ponownie hasło",
|
||||
"reEnterPin": "Wprowadź ponownie kod PIN",
|
||||
"next": "Dalej",
|
||||
"tooManyIncorrectAttempts": "Zbyt wiele błędnych prób",
|
||||
"tapToUnlock": "Naciśnij, aby odblokować",
|
||||
"setNewPassword": "Ustaw nowe hasło",
|
||||
"deviceLock": "Blokada urządzenia",
|
||||
"hideContent": "Ukryj zawartość",
|
||||
"hideContentDescriptionAndroid": "Ukrywa zawartość aplikacji w przełączniku aplikacji i wyłącza zrzuty ekranu",
|
||||
"hideContentDescriptioniOS": "Ukrywa zawartość aplikacji w przełączniku aplikacji",
|
||||
"autoLockFeatureDescription": "Czas, po którym aplikacja blokuje się po umieszczeniu jej w tle",
|
||||
"appLockDescription": "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem.",
|
||||
"pinLock": "Blokada PIN",
|
||||
"enterPin": "Wprowadź kod PIN",
|
||||
"setNewPin": "Ustaw nowy kod PIN",
|
||||
"importFailureDescNew": "Nie udało się przetworzyć wybranego pliku."
|
||||
}
|
||||
@@ -6,15 +6,15 @@
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "Proteja seus códigos 2FA",
|
||||
"onBoardingBody": "Proteja os seus códigos 2FA",
|
||||
"onBoardingGetStarted": "Introdução",
|
||||
"setupFirstAccount": "Configure sua primeira conta",
|
||||
"importScanQrCode": "Escanear QR code",
|
||||
"qrCode": "QR Code",
|
||||
"importEnterSetupKey": "Inserir uma chave de configuração",
|
||||
"importAccountPageTitle": "Inserir detalhes da conta",
|
||||
"secretCanNotBeEmpty": "A chave secreta não pode ficar vazia",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Emissor e conta não podem ficar vazios",
|
||||
"importEnterSetupKey": "Insira uma chave de configuração",
|
||||
"importAccountPageTitle": "Inserir dados da conta",
|
||||
"secretCanNotBeEmpty": "A chave secreta não pode ser vazia",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "O emissor e a conta não podem estar vazios",
|
||||
"incorrectDetails": "Detalhes incorretos",
|
||||
"pleaseVerifyDetails": "Por favor, verifique os detalhes e tente novamente",
|
||||
"codeIssuerHint": "Emissor",
|
||||
@@ -26,19 +26,19 @@
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Por favor, faça login novamente",
|
||||
"pleaseLoginAgain": "Entre novamente",
|
||||
"loggingOut": "Saindo...",
|
||||
"timeBasedKeyType": "Baseado no horário (TOTP)",
|
||||
"counterBasedKeyType": "Baseado em um contador (HOTP)",
|
||||
"counterBasedKeyType": "Baseado num contador (HOTP)",
|
||||
"saveAction": "Salvar",
|
||||
"nextTotpTitle": "avançar",
|
||||
"deleteCodeTitle": "Apagar código?",
|
||||
"deleteCodeMessage": "Tem certeza de que deseja excluir este código? Esta ação é irreversível.",
|
||||
"deleteCodeMessage": "Deseja mesmo excluir este código? Esta ação é irreversível.",
|
||||
"viewLogsAction": "Ver logs",
|
||||
"sendLogsDescription": "Isto irá compartilhar seus logs para nos ajudar a depurar seu problema. Embora tomemos precauções para garantir que informações sensíveis não sejam enviadas, encorajamos você a ver esses logs antes de compartilhá-los.",
|
||||
"sendLogsDescription": "Isto compartilhará seus logs para ajudar-nos depurar seu problema. Enquanto tomamos precauções para ter certeza que as informações sensíveis não estejam registradas, nós encorajamos você a visualizar esses logs antes de compartilhá-los.",
|
||||
"preparingLogsTitle": "Preparando logs...",
|
||||
"emailLogsTitle": "Logs (e-mail)",
|
||||
"emailLogsMessage": "Por favor, envie os logs para {email}",
|
||||
"emailLogsMessage": "Envie os logs para {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
@@ -48,9 +48,9 @@
|
||||
},
|
||||
"copyEmailAction": "Copiar e-mail",
|
||||
"exportLogsAction": "Exportar logs",
|
||||
"reportABug": "Informar um problema",
|
||||
"crashAndErrorReporting": "Reporte de erros e falhas",
|
||||
"reportBug": "Informar problema",
|
||||
"reportABug": "Informe um erro",
|
||||
"crashAndErrorReporting": "Relatórios de erros",
|
||||
"reportBug": "Informar erro",
|
||||
"emailUsMessage": "Envie um e-mail para {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
@@ -67,10 +67,10 @@
|
||||
"pleaseWait": "Aguarde...",
|
||||
"generatingEncryptionKeysTitle": "Gerando chaves de criptografia...",
|
||||
"recreatePassword": "Recriar senha",
|
||||
"recreatePasswordMessage": "O dispositivo atual não é poderoso o suficiente para verificar sua senha, mas podemos regenerar de uma forma que funcione com todos os dispositivos.\n\nPor favor, faça o login usando sua chave de recuperação e recrie sua senha (você pode usar o mesmo novamente se desejar).",
|
||||
"recreatePasswordMessage": "Não é possível verificar a sua senha no dispositivo atual, então precisamos regenerá-la para que funcione em todos os dispositivos. \n\nEntre com a sua chave de recuperação e regenere sua senha (você pode usar a mesma se quiser).",
|
||||
"useRecoveryKey": "Usar chave de recuperação",
|
||||
"incorrectPasswordTitle": "Senha incorreta",
|
||||
"welcomeBack": "Bem-vindo de volta!",
|
||||
"welcomeBack": "Bem-vindo(a) de volta!",
|
||||
"madeWithLoveAtPrefix": "feito com ❤️ em ",
|
||||
"supportDevs": "Inscreva-se no <bold-green>ente</bold-green> para apoiar este projeto.",
|
||||
"supportDiscount": "Use o cupom \"AUTH\" para obter 10% de desconto no primeiro ano",
|
||||
@@ -79,7 +79,7 @@
|
||||
"data": "Dados",
|
||||
"importCodes": "Importar códigos",
|
||||
"importTypePlainText": "Texto simples",
|
||||
"importTypeEnteEncrypted": "Exportação Ente criptografada",
|
||||
"importTypeEnteEncrypted": "Exportação do Ente criptografada",
|
||||
"passwordForDecryptingExport": "Senha para descriptografar a exportação",
|
||||
"passwordEmptyError": "A senha não pode estar vazia",
|
||||
"importFromApp": "Importar códigos do {appName}",
|
||||
@@ -124,28 +124,28 @@
|
||||
"suggestFeatures": "Sugerir recursos",
|
||||
"faq": "Perguntas frequentes",
|
||||
"faq_q_1": "Quão seguro é o Auth?",
|
||||
"faq_a_1": "Todos os códigos que você faz backup via Auth são armazenados criptografados de ponta a ponta. Isso significa que somente você pode acessar seus códigos. Nossos aplicativos são de código aberto e nossa criptografia foi auditada externamente.",
|
||||
"faq_q_2": "Eu posso acessar meus códigos no computador?",
|
||||
"faq_a_1": "Todos os backups de códigos via Auth são armazenados com criptografia de ponta-a-ponta. Isso significa que só você pode acessar os códigos. Nossos apps são de código-aberto e nossa criptografia é auditada por terceiros.",
|
||||
"faq_q_2": "Posso acessar meus códigos no computador?",
|
||||
"faq_a_2": "Você pode acessar seus códigos na web em auth.ente.io.",
|
||||
"faq_q_3": "Como faço para excluir códigos?",
|
||||
"faq_q_3": "Como posso excluir códigos?",
|
||||
"faq_a_3": "Você pode excluir um código deslizando para a esquerda sobre esse item.",
|
||||
"faq_q_4": "Como posso apoiar este projeto?",
|
||||
"faq_a_4": "Você pode apoiar o desenvolvimento deste projeto assinando nosso aplicativo de Fotos em ente.io.",
|
||||
"faq_q_5": "Como posso ativar o bloqueio facial no Auth",
|
||||
"faq_a_4": "Você pode apoiar o desenvolvimento do projeto com a assinatura do nosso app Photos @ ente.io.",
|
||||
"faq_q_5": "Como ativar o bloqueio facial no Auth",
|
||||
"faq_a_5": "Você pode ativar o bloqueio facial em Configurações → Segurança → Tela de bloqueio.",
|
||||
"somethingWentWrongMessage": "Algo deu errado. Por favor, tente outra vez",
|
||||
"somethingWentWrongMessage": "Algo deu errado. Tente outra vez",
|
||||
"leaveFamily": "Sair da família",
|
||||
"leaveFamilyMessage": "Tem certeza que deseja sair do plano familiar?",
|
||||
"leaveFamilyMessage": "Deseja mesmo sair do plano familiar?",
|
||||
"inFamilyPlanMessage": "Você está em um plano familiar!",
|
||||
"swipeHint": "Deslize para a esquerda para editar ou remover os códigos",
|
||||
"scan": "Escanear",
|
||||
"scanACode": "Escanear código",
|
||||
"verify": "Verificar",
|
||||
"verifyEmail": "Verificar e-mail",
|
||||
"enterCodeHint": "Digite o código de 6 dígitos de\nseu aplicativo autenticador",
|
||||
"enterCodeHint": "Digite o código de 6 dígitos\ndo seu app autenticador",
|
||||
"lostDeviceTitle": "Perdeu um dispositivo?",
|
||||
"twoFactorAuthTitle": "Autenticação de dois fatores",
|
||||
"passkeyAuthTitle": "Autenticação via Chave de acesso",
|
||||
"passkeyAuthTitle": "Verificação de chave de acesso",
|
||||
"verifyPasskey": "Verificar chave de acesso",
|
||||
"recoverAccount": "Recuperar conta",
|
||||
"enterRecoveryKeyHint": "Digite a chave de recuperação",
|
||||
@@ -162,10 +162,10 @@
|
||||
"noRecoveryKeyTitle": "Sem chave de recuperação?",
|
||||
"enterEmailHint": "Insira o endereço de e-mail",
|
||||
"invalidEmailTitle": "Endereço de e-mail inválido",
|
||||
"invalidEmailMessage": "Por favor, insira um endereço de e-mail válido.",
|
||||
"invalidEmailMessage": "Insira um endereço de e-mail válido.",
|
||||
"deleteAccount": "Excluir conta",
|
||||
"deleteAccountQuery": "Sentiremos muito por vê-lo partir. Você está enfrentando algum problema?",
|
||||
"yesSendFeedbackAction": "Sim, enviar comentário",
|
||||
"deleteAccountQuery": "Estamos tristes com sua decisão. Você encontrou algum problema?",
|
||||
"yesSendFeedbackAction": "Sim, enviar feedback",
|
||||
"noDeleteAccountAction": "Não, excluir conta",
|
||||
"initiateAccountDeleteTitle": "Por favor, autentique-se para iniciar a exclusão de conta",
|
||||
"sendEmail": "Enviar e-mail",
|
||||
@@ -173,7 +173,7 @@
|
||||
"weakStrength": "Fraca",
|
||||
"strongStrength": "Forte",
|
||||
"moderateStrength": "Moderada",
|
||||
"confirmPassword": "Confirme sua senha",
|
||||
"confirmPassword": "Confirmar senha",
|
||||
"close": "Fechar",
|
||||
"oopsSomethingWentWrong": "Opa. Algo deu errado.",
|
||||
"selectLanguage": "Trocar idioma",
|
||||
@@ -186,25 +186,25 @@
|
||||
"viewActiveSessions": "Ver sessões ativas",
|
||||
"authToViewYourActiveSessions": "Por favor, autentique-se para ver as sessões ativas",
|
||||
"searchHint": "Buscar...",
|
||||
"search": "Pesquisar",
|
||||
"search": "Buscar",
|
||||
"sorryUnableToGenCode": "Desculpe, não foi possível gerar um código para {issuerName}",
|
||||
"noResult": "Nenhum resultado",
|
||||
"addCode": "Adicionar código",
|
||||
"scanAQrCode": "Escanear QR code",
|
||||
"enterDetailsManually": "Insira os dados manualmente",
|
||||
"enterDetailsManually": "Inserir dados manualmente",
|
||||
"edit": "Editar",
|
||||
"copiedToClipboard": "Copiado para a área de transferência",
|
||||
"copiedNextToClipboard": "Copiado o próximo código para a área de transferência",
|
||||
"copiedNextToClipboard": "Próximo código copiado para a área de transferência",
|
||||
"error": "Erro",
|
||||
"recoveryKeyCopiedToClipboard": "A chave de recuperação foi copiada para a área de transferência",
|
||||
"recoveryKeyOnForgotPassword": "Caso você esqueça sua senha, a única maneira de recuperar seus dados é com essa chave.",
|
||||
"recoveryKeySaveDescription": "Não armazenamos essa chave, por favor, salve essa chave de 24 palavras em um lugar seguro.",
|
||||
"recoveryKeyCopiedToClipboard": "Chave de recuperação copiada para a área de transferência",
|
||||
"recoveryKeyOnForgotPassword": "Caso esqueça sua senha, a única maneira de recuperar seus dados é com esta chave.",
|
||||
"recoveryKeySaveDescription": "Não armazenamos esta chave de 24 palavras. Salve-a em um lugar seguro.",
|
||||
"doThisLater": "Fazer isso depois",
|
||||
"saveKey": "Salvar chave",
|
||||
"save": "Salvar",
|
||||
"send": "Enviar",
|
||||
"saveOrSendDescription": "Você deseja salvar isso no seu armazenamento (pasta de downloads por padrão) ou enviá-lo para outros aplicativos?",
|
||||
"saveOnlyDescription": "Você deseja salvar isto no seu armazenamento (pasta de downloads por padrão)?",
|
||||
"saveOrSendDescription": "Deseja mesmo salvar em seu armazenamento (pasta Downloads por padrão) ou enviar para outros apps?",
|
||||
"saveOnlyDescription": "Deseja mesmo salvar em seu armazenamento (pasta Downloads por padrão)?",
|
||||
"back": "Voltar",
|
||||
"createAccount": "Criar conta",
|
||||
"passwordStrength": "Força da senha: {passwordStrengthValue}",
|
||||
@@ -228,10 +228,10 @@
|
||||
"changePasswordTitle": "Alterar senha",
|
||||
"resetPasswordTitle": "Redefinir senha",
|
||||
"encryptionKeys": "Chaves de criptografia",
|
||||
"passwordWarning": "Nós não salvamos essa senha, então se você a esquecer, <underline> nós não poderemos descriptografar seus dados</underline>",
|
||||
"passwordWarning": "Não salvamos esta senha, então se você esquecê-la, <underline>não podemos descriptografar seus dados</underline>",
|
||||
"enterPasswordToEncrypt": "Digite uma senha que podemos usar para criptografar seus dados",
|
||||
"enterNewPasswordToEncrypt": "Insira uma senha nova para criptografar seus dados",
|
||||
"passwordChangedSuccessfully": "Senha alterada com sucesso",
|
||||
"enterNewPasswordToEncrypt": "Insira uma nova senha para criptografar seus dados",
|
||||
"passwordChangedSuccessfully": "A senha foi alterada",
|
||||
"generatingEncryptionKeys": "Gerando chaves de criptografia...",
|
||||
"continueLabel": "Continuar",
|
||||
"insecureDevice": "Dispositivo inseguro",
|
||||
@@ -241,15 +241,15 @@
|
||||
"loginTerms": "Ao clicar em login, eu concordo com os <u-terms>termos de serviço</u-terms> e a <u-policy>política de privacidade</u-policy>",
|
||||
"logInLabel": "Entrar",
|
||||
"logout": "Sair",
|
||||
"areYouSureYouWantToLogout": "Você tem certeza que deseja encerrar a sessão?",
|
||||
"yesLogout": "Sim, sair",
|
||||
"areYouSureYouWantToLogout": "Deseja mesmo sair?",
|
||||
"yesLogout": "Sim, quero sair",
|
||||
"exit": "Sair",
|
||||
"verifyingRecoveryKey": "Verificando chave de recuperação...",
|
||||
"recoveryKeyVerified": "Chave de recuperação verificada",
|
||||
"recoveryKeySuccessBody": "Ótimo! Sua chave de recuperação é válida. Obrigado por verificar.\n\nLembre-se de manter o backup seguro de sua chave de recuperação.",
|
||||
"invalidRecoveryKey": "A chave de recuperação que você digitou não é válida. Certifique-se de que contém 24 palavras e verifique a ortografia de cada uma.\n\nSe você inseriu um código de recuperação mais antigo, verifique se ele tem 64 caracteres e verifique cada um deles.",
|
||||
"recreatePasswordTitle": "Redefinir senha",
|
||||
"recreatePasswordBody": "O dispositivo atual não é poderoso o suficiente para verificar sua senha, mas podemos recriar de uma forma que funcione com todos os dispositivos.\n\nPor favor, faça o login usando sua chave de recuperação e recrie sua senha (você pode usar a mesma novamente se desejar).",
|
||||
"recreatePasswordBody": "Não é possível verificar a sua senha no dispositivo atual, mas podemos regenerá-la para que funcione em todos os dispositivos. \n\nEntre com a sua chave de recuperação e regenere sua senha (você pode usar a mesma se quiser).",
|
||||
"invalidKey": "Chave inválida",
|
||||
"tryAgain": "Tente novamente",
|
||||
"viewRecoveryKey": "Ver chave de recuperação",
|
||||
@@ -258,7 +258,7 @@
|
||||
"confirmYourRecoveryKey": "Confirme sua chave de recuperação",
|
||||
"confirm": "Confirmar",
|
||||
"emailYourLogs": "Enviar logs por e-mail",
|
||||
"pleaseSendTheLogsTo": "Por favor, envie os logs para \n{toEmail}",
|
||||
"pleaseSendTheLogsTo": "Envie os logs para \n{toEmail}",
|
||||
"copyEmailAddress": "Copiar endereço de e-mail",
|
||||
"exportLogs": "Exportar logs",
|
||||
"enterYourRecoveryKey": "Digite a chave de recuperação",
|
||||
@@ -267,15 +267,15 @@
|
||||
"networkConnectionRefusedErr": "Não foi possível conectar ao Ente, tente novamente após algum tempo. Se o erro persistir, entre em contato com o suporte.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Parece que algo deu errado. Por favor, tente novamente mais tarde. Se o erro persistir, entre em contato com nossa equipe de suporte.",
|
||||
"about": "Sobre",
|
||||
"weAreOpenSource": "Nós somos de código aberto!",
|
||||
"weAreOpenSource": "Nosso código é aberto!",
|
||||
"privacy": "Privacidade",
|
||||
"terms": "Termos",
|
||||
"checkForUpdates": "Verificar por atualizações",
|
||||
"checkForUpdates": "Buscar atualizações",
|
||||
"checkStatus": "Verificar status",
|
||||
"downloadUpdate": "Baixar",
|
||||
"criticalUpdateAvailable": "Atualização crítica disponível",
|
||||
"updateAvailable": "Atualização disponível",
|
||||
"update": "Atualização",
|
||||
"update": "Atualizar",
|
||||
"checking": "Verificando...",
|
||||
"youAreOnTheLatestVersion": "Você está na versão mais recente",
|
||||
"warning": "Atenção",
|
||||
@@ -318,13 +318,13 @@
|
||||
"somethingWentWrongPleaseTryAgain": "Algo deu errado. Por favor, tente outra vez",
|
||||
"thisWillLogYouOutOfThisDevice": "Isso fará com que você saia deste dispositivo!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "Isso fará com que você saia do seguinte dispositivo:",
|
||||
"terminateSession": "Encerrar sessão?",
|
||||
"terminateSession": "Sair?",
|
||||
"terminate": "Encerrar",
|
||||
"thisDevice": "Esse dispositivo",
|
||||
"toResetVerifyEmail": "Para redefinir a sua senha, por favor verifique o seu email primeiro.",
|
||||
"thisEmailIsAlreadyInUse": "Este e-mail já está em uso",
|
||||
"verificationFailedPleaseTryAgain": "Falha na verificação. Por favor, tente novamente",
|
||||
"yourVerificationCodeHasExpired": "O código de verificação expirou",
|
||||
"verificationFailedPleaseTryAgain": "Falha na verificação. Tente novamente",
|
||||
"yourVerificationCodeHasExpired": "Seu código de verificação expirou",
|
||||
"incorrectCode": "Código incorreto",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "Desculpe, o código que você inseriu está incorreto",
|
||||
"emailChangedTo": "E-mail alterado para {newEmail}",
|
||||
@@ -335,7 +335,7 @@
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "A chave de recuperação inserida está incorreta",
|
||||
"enterPassword": "Inserir senha",
|
||||
"selectExportFormat": "Selecione o formato para exportação",
|
||||
"exportDialogDesc": "As exportações criptografadas ficarão protegidas por uma senha de sua escolha.",
|
||||
"exportDialogDesc": "As exportações criptografadas serão protegidas por uma senha de sua escolha.",
|
||||
"encrypted": "Criptografado",
|
||||
"plainText": "Texto simples",
|
||||
"passwordToEncryptExport": "Senha para criptografar a exportação",
|
||||
@@ -349,13 +349,13 @@
|
||||
"shouldHideCode": "Ocultar códigos",
|
||||
"doubleTapToViewHiddenCode": "Você pode tocar duas vezes em uma entrada para ver o código",
|
||||
"focusOnSearchBar": "Foco na busca ao iniciar o app",
|
||||
"confirmUpdatingkey": "Você tem certeza que deseja atualizar a chave secreta?",
|
||||
"minimizeAppOnCopy": "Minimizar aplicativo ao copiar",
|
||||
"confirmUpdatingkey": "Deseja mesmo atualizar a sua chave secreta?",
|
||||
"minimizeAppOnCopy": "Minimizar app ao copiar",
|
||||
"editCodeAuthMessage": "Autenticar para editar o código",
|
||||
"deleteCodeAuthMessage": "Autenticar para excluir o código",
|
||||
"showQRAuthMessage": "Autenticar para mostrar o QR code",
|
||||
"confirmAccountDeleteTitle": "Confirmar exclusão de conta",
|
||||
"confirmAccountDeleteMessage": "Esta conta está vinculada a outros aplicativos Ente, se você usa algum.\n\nSeus dados enviados, em todos os aplicativos Ente, serão agendados para exclusão, e sua conta será excluída permanentemente.",
|
||||
"confirmAccountDeleteMessage": "Esta conta está vinculada a outros apps Ente, se você usa algum.\n\nSeus dados enviados, entre todos os apps Ente, serão marcados para exclusão, e sua conta será apagada permanentemente.",
|
||||
"androidBiometricHint": "Verificar identidade",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
@@ -380,11 +380,11 @@
|
||||
"@androidBiometricRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsRequiredTitle": "Credenciais do dispositivo são necessárias",
|
||||
"androidDeviceCredentialsRequiredTitle": "Credenciais do dispositivo necessárias",
|
||||
"@androidDeviceCredentialsRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsSetupDescription": "Credenciais do dispositivo são necessárias",
|
||||
"androidDeviceCredentialsSetupDescription": "Credenciais do dispositivo necessárias",
|
||||
"@androidDeviceCredentialsSetupDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
@@ -408,27 +408,27 @@
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"noInternetConnection": "Sem conexão à internet",
|
||||
"noInternetConnection": "Não conectado à internet",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Verifique sua conexão com a internet e tente novamente.",
|
||||
"signOutFromOtherDevices": "Terminar sessão em outros dispositivos",
|
||||
"signOutFromOtherDevices": "Sair da conta em outros dispositivos",
|
||||
"signOutOtherBody": "Se você acha que alguém pode saber sua senha, você pode forçar todos os outros dispositivos que estão com sua conta a desconectar.",
|
||||
"signOutOtherDevices": "Terminar sessão em outros dispositivos",
|
||||
"signOutOtherDevices": "Sair em outros dispositivos",
|
||||
"doNotSignOut": "Não sair",
|
||||
"hearUsWhereTitle": "Como você ouviu sobre o Ente? (opcional)",
|
||||
"hearUsExplanation": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!",
|
||||
"hearUsExplanation": "Não sabemos como você encontrou nosso app. Seria útil se você nos contasse!",
|
||||
"recoveryKeySaved": "Chave de recuperação salva na pasta Downloads!",
|
||||
"waitingForBrowserRequest": "Aguardando solicitação do navegador...",
|
||||
"waitingForVerification": "Esperando por verificação...",
|
||||
"waitingForVerification": "Aguardando verificação...",
|
||||
"passkey": "Chave de acesso",
|
||||
"passKeyPendingVerification": "A verificação ainda está pendente",
|
||||
"loginSessionExpired": "Sessão expirada",
|
||||
"loginSessionExpiredDetails": "Sua sessão expirou. Por favor, entre novamente.",
|
||||
"developerSettingsWarning": "Tem certeza de que deseja modificar as configurações de Desenvolvedor?",
|
||||
"developerSettings": "Configurações de desenvolvedor",
|
||||
"developerSettingsWarning": "Deseja mesmo alterar os ajustes de Desenvolvedor?",
|
||||
"developerSettings": "Ajustes de Desenvolvedor",
|
||||
"serverEndpoint": "Endpoint do servidor",
|
||||
"invalidEndpoint": "Endpoint inválido",
|
||||
"invalidEndpointMessage": "Desculpe, o endpoint que você inseriu é inválido. Por favor, insira um endpoint válido e tente novamente.",
|
||||
"endpointUpdatedMessage": "Endpoint atualizado com sucesso",
|
||||
"endpointUpdatedMessage": "O endpoint foi atualizado",
|
||||
"customEndpoint": "Conectado a {endpoint}",
|
||||
"pinText": "Fixar",
|
||||
"unpinText": "Desafixar",
|
||||
@@ -440,7 +440,31 @@
|
||||
"create": "Criar",
|
||||
"editTag": "Editar etiqueta",
|
||||
"deleteTagTitle": "Apagar etiqueta?",
|
||||
"deleteTagMessage": "Tem certeza de que deseja excluir esta etiqueta? Essa ação é irreversível.",
|
||||
"deleteTagMessage": "Deseja mesmo excluir esta etiqueta? Essa ação é irreversível.",
|
||||
"somethingWentWrongParsingCode": "Não foi possível analisar os códigos {x}.",
|
||||
"updateNotAvailable": "Atualização indisponível"
|
||||
"updateNotAvailable": "Atualização indisponível",
|
||||
"viewRawCodes": "Ver códigos brutos",
|
||||
"rawCodes": "Códigos brutos",
|
||||
"rawCodeData": "Dados de códigos brutos",
|
||||
"appLock": "Bloqueio do app",
|
||||
"noSystemLockFound": "Nenhum bloqueio do sistema encontrado",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio do app, configure uma senha no dispositivo ou tela de bloqueio nas configurações do sistema.",
|
||||
"autoLock": "Bloqueio automático",
|
||||
"immediately": "Imediatamente",
|
||||
"reEnterPassword": "Reinserir senha",
|
||||
"reEnterPin": "Reinserir PIN",
|
||||
"next": "Avançar",
|
||||
"tooManyIncorrectAttempts": "Muitas tentativas incorretas",
|
||||
"tapToUnlock": "Toque para desbloquear",
|
||||
"setNewPassword": "Defina a nova senha",
|
||||
"deviceLock": "Bloqueio do dispositivo",
|
||||
"hideContent": "Ocultar conteúdo",
|
||||
"hideContentDescriptionAndroid": "Oculta o conteúdo do app no seletor de apps e desativa as capturas de tela",
|
||||
"hideContentDescriptioniOS": "Oculta o conteúdo do seletor de apps",
|
||||
"autoLockFeatureDescription": "Tempo de bloqueio do app em segundo plano",
|
||||
"appLockDescription": "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha.",
|
||||
"pinLock": "Bloqueio PIN",
|
||||
"enterPin": "Insira o PIN",
|
||||
"setNewPin": "Definir novo PIN",
|
||||
"importFailureDescNew": "Não foi possível analisar o arquivo selecionado."
|
||||
}
|
||||
@@ -61,6 +61,7 @@
|
||||
"recreatePassword": "Recreează parola",
|
||||
"incorrectPasswordTitle": "Parolă incorectă",
|
||||
"welcomeBack": "Bine ai revenit!",
|
||||
"madeWithLoveAtPrefix": "creat cu ❤️ la ",
|
||||
"supportDevs": "Abonează-te la <bold-green>ente</bold-green> pentru a ne susține",
|
||||
"supportDiscount": "Folosește codul \"AUTH\" pentru a obține o reducere de 10% în primul an",
|
||||
"changeEmail": "Schimbă e-mailul",
|
||||
@@ -68,9 +69,11 @@
|
||||
"data": "Date",
|
||||
"importCodes": "Importă coduri",
|
||||
"importTypePlainText": "Text simplu",
|
||||
"importTypeEnteEncrypted": "Export Ente criptat",
|
||||
"passwordForDecryptingExport": "Parola pentru a decripta exportul",
|
||||
"passwordEmptyError": "Parola nu poate fi goală",
|
||||
"importFromApp": "Importă coduri din {appName}",
|
||||
"importGoogleAuthGuide": "Exportă-ți conturile din Google Autheticator cu un cod QR utilizând opțiunea „Transfer conturi”. Apoi, utilizând alt dispozitiv, scanați codul QR.\n\nSfat: Poți utiliza camera web a laptopul-ui pentru a scana codul QR.",
|
||||
"importSelectJsonFile": "Selectează fișierul JSON",
|
||||
"importSelectAppExport": "Selectează fișierul de export din {appName}",
|
||||
"importEnteEncGuide": "Selectează fișierul criptat JSON exportat din Bențe",
|
||||
@@ -127,11 +130,15 @@
|
||||
"social": "Social",
|
||||
"security": "Securitate",
|
||||
"lockscreen": "Ecran de blocare",
|
||||
"search": "Căutare",
|
||||
"scanAQrCode": "Scanează un cod QR",
|
||||
"edit": "Editare",
|
||||
"copiedToClipboard": "Copiat în clipboard",
|
||||
"copiedNextToClipboard": "Codul următor a fost copiat în clipboard",
|
||||
"error": "Eroare",
|
||||
"recoveryKeyCopiedToClipboard": "Cheie de recuperare salvată în clipboard",
|
||||
"recoveryKeyOnForgotPassword": "Dacă îți uiți parola, singura modalitate prin care poți recupera datele este cu această cheie.",
|
||||
"recoveryKeySaveDescription": "Nu stocăm această cheie, vă rugăm salvați această cheie de 24 de cuvinte într-un loc sigur.",
|
||||
"saveKey": "Salvare cheie",
|
||||
"save": "Salvare",
|
||||
"send": "Trimitere",
|
||||
|
||||
@@ -263,6 +263,8 @@
|
||||
"exportLogs": "Экспорт журналов",
|
||||
"enterYourRecoveryKey": "Введите свой ключ восстановления",
|
||||
"tempErrorContactSupportIfPersists": "Похоже, что-то пошло не так. Пожалуйста, повторите попытку через некоторое время. Если ошибка повторится, обратитесь в нашу службу поддержки.",
|
||||
"networkHostLookUpErr": "Не удается подключиться к Ente, пожалуйста, проверьте настройки своей сети и обратитесь в службу поддержки, если ошибка повторится.",
|
||||
"networkConnectionRefusedErr": "Не удается подключиться к Ente, пожалуйста, повторите попытку через некоторое время. Если ошибка не устраняется, обратитесь в службу поддержки.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Похоже, что-то пошло не так. Пожалуйста, повторите попытку через некоторое время. Если ошибка повторится, обратитесь в нашу службу поддержки.",
|
||||
"about": "О программе",
|
||||
"weAreOpenSource": "У нас открытое программное обеспечение!",
|
||||
@@ -440,5 +442,29 @@
|
||||
"deleteTagTitle": "Удалить метку?",
|
||||
"deleteTagMessage": "Вы уверены, что хотите удалить эту метку? Это действие необратимо.",
|
||||
"somethingWentWrongParsingCode": "Мы не смогли разобрать коды {x}.",
|
||||
"updateNotAvailable": "Обновление недоступно"
|
||||
"updateNotAvailable": "Обновление недоступно",
|
||||
"viewRawCodes": "Просмотр сырых кодов",
|
||||
"rawCodes": "Сырые коды",
|
||||
"rawCodeData": "Сырая информация кодов",
|
||||
"appLock": "Блокировка приложения",
|
||||
"noSystemLockFound": "Системная блокировка не найдена",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Чтобы включить блокировку, настройте пароль устройства или блокировку экрана в настройках системы.",
|
||||
"autoLock": "Автоблокировка",
|
||||
"immediately": "Немедленно",
|
||||
"reEnterPassword": "Подтвердите пароль",
|
||||
"reEnterPin": "Введите PIN-код ещё раз",
|
||||
"next": "Далее",
|
||||
"tooManyIncorrectAttempts": "Слишком много неудачных попыток",
|
||||
"tapToUnlock": "Нажмите для разблокировки",
|
||||
"setNewPassword": "Задать новый пароль",
|
||||
"deviceLock": "Блокировка устройства",
|
||||
"hideContent": "Скрыть содержимое",
|
||||
"hideContentDescriptionAndroid": "Скрывает содержимое приложения в переключателе приложений и отключает скриншоты",
|
||||
"hideContentDescriptioniOS": "Скрывает содержимое приложения в переключателе приложений",
|
||||
"autoLockFeatureDescription": "Время в фоне, после которого приложение блокируется",
|
||||
"appLockDescription": "Выберите между экраном блокировки вашего устройства и пользовательским экраном блокировки с PIN-кодом или паролем.",
|
||||
"pinLock": "Pin Замок",
|
||||
"enterPin": "Введите PIN",
|
||||
"setNewPin": "Установите новый PIN",
|
||||
"importFailureDescNew": "Не удалось обработать выбранный файл."
|
||||
}
|
||||
470
auth/lib/l10n/arb/app_sk.arb
Normal file
@@ -0,0 +1,470 @@
|
||||
{
|
||||
"account": "Konto",
|
||||
"unlock": "Odomknúť",
|
||||
"recoveryKey": "Kľúč pre obnovenie",
|
||||
"counterAppBarTitle": "Počítadlo",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "Zabezpečte svoje kódy 2FA",
|
||||
"onBoardingGetStarted": "Poďme na to",
|
||||
"setupFirstAccount": "Vytvorte svoj prvý účet",
|
||||
"importScanQrCode": "Naskenovať QR kód",
|
||||
"qrCode": "QR kód",
|
||||
"importEnterSetupKey": "Vložte kľúč nastavenia",
|
||||
"importAccountPageTitle": "Vložte detaily o konte",
|
||||
"secretCanNotBeEmpty": "Tajný kľúč nemôže ostať prázdny",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Buď vydavateľ alebo účet nemôže ostať prázdny",
|
||||
"incorrectDetails": "Chybné údaje",
|
||||
"pleaseVerifyDetails": "Prosím, skontrolujte svoje údaje a skúste to znova",
|
||||
"codeIssuerHint": "Vydavateľ",
|
||||
"codeSecretKeyHint": "Tajný kľúč",
|
||||
"codeAccountHint": "Konto (ucet@domena.com)",
|
||||
"codeTagHint": "Tag",
|
||||
"accountKeyType": "Typ kľúča",
|
||||
"sessionExpired": "Relácia vypršala",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Prosím, prihláste sa znova",
|
||||
"loggingOut": "Odhlasovanie...",
|
||||
"timeBasedKeyType": "Na základe času (TOTP)",
|
||||
"counterBasedKeyType": "Na základe počítadla (HOTP)",
|
||||
"saveAction": "Uložiť",
|
||||
"nextTotpTitle": "ďalej",
|
||||
"deleteCodeTitle": "Odstrániť položku?",
|
||||
"deleteCodeMessage": "Naozaj chcete odstrániť položku? Táto akcia je nezvratná.",
|
||||
"viewLogsAction": "Zobraziť logy",
|
||||
"sendLogsDescription": "Toto odošle logy, ktoré nám pomôžu vyriešiť váš problém. Aj keď prijímame preventívne opatrenia, aby sme zabezpečili, že sa citlivé informácie neukladajú do logov, odporúčame vám, aby ste si ich pred zdieľaním pozreli.",
|
||||
"preparingLogsTitle": "Príprava logov...",
|
||||
"emailLogsTitle": "Odoslať logy emailom",
|
||||
"emailLogsMessage": "Prosím, pošlite logy na adresu {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "Skopírovať e-mail",
|
||||
"exportLogsAction": "Exportovať logy",
|
||||
"reportABug": "Nahlásiť chybu",
|
||||
"crashAndErrorReporting": "Hlásenie zlyhaní a chýb",
|
||||
"reportBug": "Nahlásiť chybu",
|
||||
"emailUsMessage": "Pošlite nám email na adresu {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "Kontaktovať podporu",
|
||||
"rateUsOnStore": "Ohodnoťte nás cez {storeName}",
|
||||
"blog": "Blog",
|
||||
"merchandise": "Merchandise",
|
||||
"verifyPassword": "Potvrďte heslo",
|
||||
"pleaseWait": "Prosím počkajte...",
|
||||
"generatingEncryptionKeysTitle": "Generovanie šifrovacích kľúčov...",
|
||||
"recreatePassword": "Resetovať heslo",
|
||||
"recreatePasswordMessage": "Aktuálne zariadenie nie je dostatočne výkonné na overenie vášho hesla, takže ho musíme regenerovať raz spôsobom, ktorý funguje vo všetkých zariadeniach.\n\nPrihláste sa pomocou kľúča na obnovenie a znovu vygenerujte svoje heslo (ak si prajete, môžete znova použiť rovnaké).",
|
||||
"useRecoveryKey": "Použiť kľúč na obnovenie",
|
||||
"incorrectPasswordTitle": "Nesprávne heslo",
|
||||
"welcomeBack": "Vitajte späť!",
|
||||
"madeWithLoveAtPrefix": "vyrobené so ❤️ v ",
|
||||
"supportDevs": "Predplaďte si <bold-green>ente</bold-green> a podporte nás",
|
||||
"supportDiscount": "Použite kód \"AUTH\" pre získanie 10% zľavy na prvý rok",
|
||||
"changeEmail": "Zmeniť e-mail",
|
||||
"changePassword": "Zmeniť heslo",
|
||||
"data": "Údaje",
|
||||
"importCodes": "Importovať kódy",
|
||||
"importTypePlainText": "Obyčajný text",
|
||||
"importTypeEnteEncrypted": "Šifrovaný Ente export",
|
||||
"passwordForDecryptingExport": "Heslo na rozšifrovanie exportu",
|
||||
"passwordEmptyError": "Heslo nemôže byť prázdne",
|
||||
"importFromApp": "Importovať kódy z {appName}",
|
||||
"importGoogleAuthGuide": "Exportujte svoje účty z aplikácie Google Authenticator pomocou QR kódu zvolením možnosti „Preniesť účty“. Následne, naskenujte QR kód pomocou iného zariadenia.\n\nTip: Na odfotenie QR kódu môžete použiť webovú kameru laptopu.",
|
||||
"importSelectJsonFile": "Vybrať JSON súbor",
|
||||
"importSelectAppExport": "Vybrať export súbor aplikácie {appName}",
|
||||
"importEnteEncGuide": "Vyberte zašifrovaný JSON export súbor aplikácie Ente",
|
||||
"importRaivoGuide": "Použite možnosť \"Exportovať OTP kódy do archívu Zip\" v nastaveniach služby Raivo.\n\nExtrahujte súbor zip a naimportujte JSON súbor.",
|
||||
"importBitwardenGuide": "Použite možnosť „Exportovať trezor“ v službe Bitwarden Tools a importujte nezašifrovaný JSON súbor.",
|
||||
"importAegisGuide": "Použite možnosť \"Exportovať trezor\" v nastaveniach služby Aegis.\n\nAk je váš trezor zašifrovaný, na dešifrovanie budete musieť zadať heslo trezoru.",
|
||||
"import2FasGuide": "Použite možnosť \"Nastavenia->Záloha -Export\" v službe 2FAS.\n\nAk je vaša záloha zašifrovaná, na dešifrovanie budete musieť zadať heslo",
|
||||
"importLastpassGuide": "Použite možnosť \"Preniesť účty\" v nastaveniach služby Lastpass Authenticator a stlačte \"Exportovať účty do súboru\". Importujte stiahnutý JSON súbor.",
|
||||
"exportCodes": "Exportovať kódy",
|
||||
"importLabel": "Importovať",
|
||||
"importInstruction": "Vyberte súbor, ktorý obsahuje zoznam vašich kódov v nasledujúcom formáte",
|
||||
"importCodeDelimiterInfo": "Kódy môžu byť oddelené čiarkou alebo novým riadkom",
|
||||
"selectFile": "Vybrať súbor",
|
||||
"emailVerificationToggle": "Overenie pomocou e-mailovej adresy",
|
||||
"emailVerificationEnableWarning": "Aby ste predišli vymknutiu sa z vášho účtu, nezabudnite pred povolením overenia emailom uložiť kópiu svojho 2FA emailu mimo Ente Auth.",
|
||||
"authToChangeEmailVerificationSetting": "Pre zmenu overenia pomocou emailu sa musíte overiť",
|
||||
"authToViewYourRecoveryKey": "Pre zobrazenie vášho kľúča na obnovenie sa musíte overiť",
|
||||
"authToChangeYourEmail": "Pre zmenu vášho emailu sa musíte overiť",
|
||||
"authToChangeYourPassword": "Pre zmenu vášho hesla sa musíte overiť",
|
||||
"authToViewSecrets": "Pre zobrazenie vašich tajných údajov sa musíte overiť",
|
||||
"authToInitiateSignIn": "Pre iniciáciu prihlásenia sa pre zálohu sa musíte overiť.",
|
||||
"ok": "Ok",
|
||||
"cancel": "Zrušiť",
|
||||
"yes": "Áno",
|
||||
"no": "Nie",
|
||||
"email": "Email",
|
||||
"support": "Podpora",
|
||||
"general": "Všeobecné",
|
||||
"settings": "Nastavenia",
|
||||
"copied": "Skopírované",
|
||||
"pleaseTryAgain": "Prosím, skúste to znova",
|
||||
"existingUser": "Existujúci užívateľ",
|
||||
"newUser": "Nový v Ente",
|
||||
"delete": "Odstrániť",
|
||||
"enterYourPasswordHint": "Zadajte vaše heslo",
|
||||
"forgotPassword": "Zabudnuté heslo",
|
||||
"oops": "Ups",
|
||||
"suggestFeatures": "Navrhnúť funkcionalitu",
|
||||
"faq": "Často kladené otázky",
|
||||
"faq_q_1": "Ako bezpečné je Auth?",
|
||||
"faq_a_1": "Všetky kódy, ktoré zálohujete cez Auth, sú ukladané zabezpečené end-to-end šifrovaním. To znamená, že k svojim kódom máte prístup iba vy. Naše aplikácie sú open source a na nami používanej kryptografii prebehol externý audit.",
|
||||
"faq_q_2": "Môžem pristupovať k svojim kódom cez počítač?",
|
||||
"faq_a_2": "K svojim kódom sa môžete dostať cez web auth.ente.io.",
|
||||
"faq_q_3": "Ako môžem odstrániť svoje kódy?",
|
||||
"faq_a_3": "Kód môžete odstrániť potiahnutím prsta doľava na danej položke.",
|
||||
"faq_q_4": "Ako môžem podporiť tento projekt?",
|
||||
"faq_a_4": "Vývoj tohto projektu môžete podporiť zakúpením predplatného našej aplikácie Photos na ente.io.",
|
||||
"faq_q_5": "Ako môžem nastaviť FaceID v Auth?",
|
||||
"faq_a_5": "Zámok FaceID môžete povoliť v sekcii Nastavenia → Zabezpečenie → Uzamknutie obrazovky.",
|
||||
"somethingWentWrongMessage": "Niečo sa pokazilo, skúste to prosím znova",
|
||||
"leaveFamily": "Opustiť rodinku",
|
||||
"leaveFamilyMessage": "Ste si istý, že chcete opustiť rodinku?",
|
||||
"inFamilyPlanMessage": "Ste prihlásený k rodinke!",
|
||||
"swipeHint": "Potiahnite doľava pre upravenie alebo vymazanie kódov",
|
||||
"scan": "Skenovať",
|
||||
"scanACode": "Skenovať kód",
|
||||
"verify": "Overiť",
|
||||
"verifyEmail": "Overiť email",
|
||||
"enterCodeHint": "Zadajte 6-miestny kód z\nvašej overovacej aplikácie",
|
||||
"lostDeviceTitle": "Stratené zariadenie?",
|
||||
"twoFactorAuthTitle": "Dvojfaktorové overovanie",
|
||||
"passkeyAuthTitle": "Overenie pomocou passkey",
|
||||
"verifyPasskey": "Overiť passkey",
|
||||
"recoverAccount": "Obnoviť konto",
|
||||
"enterRecoveryKeyHint": "Vložte váš kód pre obnovenie",
|
||||
"recover": "Obnoviť",
|
||||
"contactSupportViaEmailMessage": "Pošlite e-mail na adresu {email} z vašej registrovanej e-mailovej adresy",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "Neplatný QR kód",
|
||||
"noRecoveryKeyTitle": "Nemáte kľúč pre obnovenie?",
|
||||
"enterEmailHint": "Zadajte vašu emailovú adresu",
|
||||
"invalidEmailTitle": "Neplatná emailová adresa",
|
||||
"invalidEmailMessage": "Zadajte platnú e-mailovú adresu.",
|
||||
"deleteAccount": "Odstrániť konto",
|
||||
"deleteAccountQuery": "Bude nám tu bez vás smutno. Vyskytol sa nejaký problém?",
|
||||
"yesSendFeedbackAction": "Áno, odoslať spätnú väzbu",
|
||||
"noDeleteAccountAction": "Nie, odstrániť účet",
|
||||
"initiateAccountDeleteTitle": "Pre odstránenie účtu sa musíte overiť",
|
||||
"sendEmail": "Odoslať email",
|
||||
"createNewAccount": "Vytvoriť nové konto",
|
||||
"weakStrength": "Slabé",
|
||||
"strongStrength": "Silné",
|
||||
"moderateStrength": "Mierne",
|
||||
"confirmPassword": "Potvrdiť heslo",
|
||||
"close": "Zatvoriť",
|
||||
"oopsSomethingWentWrong": "Ajáj, vyskytla sa chyba.",
|
||||
"selectLanguage": "Vybrať jazyk",
|
||||
"language": "Jazyk",
|
||||
"social": "Sociálne siete",
|
||||
"security": "Zabezpečenie",
|
||||
"lockscreen": "Uzamknutie obrazovky",
|
||||
"authToChangeLockscreenSetting": "Pre zmenu nastavenia uzamknutia obrazovky sa musíte overiť",
|
||||
"lockScreenEnablePreSteps": "Pre povolenie uzamknutia obrazovky, nastavte prístupový kód zariadenia alebo zámok obrazovky v nastaveniach systému.",
|
||||
"viewActiveSessions": "Zobraziť aktívne relácie",
|
||||
"authToViewYourActiveSessions": "Pre zobrazenie vašich aktívnych relácii sa musíte overiť",
|
||||
"searchHint": "Hľadať...",
|
||||
"search": "Hľadať",
|
||||
"sorryUnableToGenCode": "Ospravedlňujeme sa, nie je možné vygenerovať kód pre {issuerName}",
|
||||
"noResult": "Žiadny výsledok",
|
||||
"addCode": "Pridať kód",
|
||||
"scanAQrCode": "Naskenovať QR kód",
|
||||
"enterDetailsManually": "Zadajte údaje manuálne",
|
||||
"edit": "Upraviť",
|
||||
"copiedToClipboard": "Skopírované do schránky",
|
||||
"copiedNextToClipboard": "Skopírovaný následujúci kód do schránky",
|
||||
"error": "Chyba",
|
||||
"recoveryKeyCopiedToClipboard": "Skopírovaný kód pre obnovenie do schránky",
|
||||
"recoveryKeyOnForgotPassword": "Ak zabudnete heslo, jediným spôsobom, ako môžete obnoviť svoje údaje, je tento kľúč.",
|
||||
"recoveryKeySaveDescription": "My tento kľúč neuchovávame, uložte si tento kľúč obsahujúci 24 slov na bezpečnom mieste.",
|
||||
"doThisLater": "Urobiť to neskôr",
|
||||
"saveKey": "Uložiť kľúč",
|
||||
"save": "Uložiť",
|
||||
"send": "Odoslať",
|
||||
"saveOrSendDescription": "Chcete to uložiť do svojho zariadenia (predvolený priečinok Stiahnuté súbory) alebo to odoslať do iných aplikácií?",
|
||||
"saveOnlyDescription": "Chcete to uložiť do svojho zariadenia (predvolený priečinok Stiahnuté súbory)?",
|
||||
"back": "Späť",
|
||||
"createAccount": "Vytvoriť účet",
|
||||
"passwordStrength": "Sila hesla: {passwordStrengthValue}",
|
||||
"@passwordStrength": {
|
||||
"description": "Text to indicate the password strength",
|
||||
"placeholders": {
|
||||
"passwordStrengthValue": {
|
||||
"description": "The strength of the password as a string",
|
||||
"type": "String",
|
||||
"example": "Weak or Moderate or Strong"
|
||||
}
|
||||
},
|
||||
"message": "Password Strength: {passwordStrengthText}"
|
||||
},
|
||||
"password": "Heslo",
|
||||
"signUpTerms": "Súhlasím s <u-terms>podmienkami používania</u-terms> a <u-policy>zásadami ochrany osobných údajov</u-policy>",
|
||||
"privacyPolicyTitle": "Zásady ochrany osobných údajov",
|
||||
"termsOfServicesTitle": "Podmienky používania",
|
||||
"encryption": "Šifrovanie",
|
||||
"setPasswordTitle": "Nastaviť heslo",
|
||||
"changePasswordTitle": "Zmeniť heslo",
|
||||
"resetPasswordTitle": "Obnoviť heslo",
|
||||
"encryptionKeys": "Šifrovacie kľúče",
|
||||
"passwordWarning": "Ente neukladá tohto heslo. V prípade, že ho zabudnete, <underline>nie sme schopní rozšifrovať vaše údaje</underline>",
|
||||
"enterPasswordToEncrypt": "Zadajte heslo, ktoré môžeme použiť na šifrovanie vašich údajov",
|
||||
"enterNewPasswordToEncrypt": "Zadajte nové heslo, ktoré môžeme použiť na šifrovanie vašich údajov",
|
||||
"passwordChangedSuccessfully": "Heslo bolo úspešne zmenené",
|
||||
"generatingEncryptionKeys": "Generovanie šifrovacích kľúčov...",
|
||||
"continueLabel": "Pokračovať",
|
||||
"insecureDevice": "Slabo zabezpečené zariadenie",
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Ospravedlňujeme sa, v tomto zariadení sme nemohli generovať bezpečnostné kľúče.\n\nzaregistrujte sa z iného zariadenia.",
|
||||
"howItWorks": "Ako to funguje",
|
||||
"ackPasswordLostWarning": "Rozumiem, že ak stratím alebo zabudnem heslo, môžem stratiť svoje údaje, pretože moje údaje sú <underline>šifrované end-to-end</underline>.",
|
||||
"loginTerms": "Kliknutím na prihlásenie, súhlasím s <u-terms>podmienkami používania</u-terms> a <u-policy>zásadami ochrany osobných údajov</u-policy>",
|
||||
"logInLabel": "Prihlásenie",
|
||||
"logout": "Odhlasenie",
|
||||
"areYouSureYouWantToLogout": "Naozaj sa chcete odhlásiť?",
|
||||
"yesLogout": "Áno, odhlásiť sa",
|
||||
"exit": "Ukončiť",
|
||||
"verifyingRecoveryKey": "Overovanie kľúča na obnovenie...",
|
||||
"recoveryKeyVerified": "Kľúč na obnovenie overený",
|
||||
"recoveryKeySuccessBody": "Skvelé! Váš kľúč na obnovenie je správny. Ďakujeme za overenie.\n\nNezabudnite uchovať váš kľúč na obnovenie uložený bezpečne.",
|
||||
"invalidRecoveryKey": "Zadaný kľúč na obnovenie nie je platný. Uistite sa, že obsahuje 24 slov a skontrolujte písmenko po písmenku každé z nich.\n\nAk ste zadali starší kód na obnovenie, uistite sa, že je dlhý 64 znakov a skontrolujte každý znak samostatne.",
|
||||
"recreatePasswordTitle": "Resetovať heslo",
|
||||
"recreatePasswordBody": "Aktuálne zariadenie nie je dostatočne výkonné na overenie vášho hesla, avšak vieme ho regenerovať spôsobom, ktorý funguje vo všetkých zariadeniach.\n\nPrihláste sa pomocou kľúča na obnovenie a znovu vygenerujte svoje heslo (ak si prajete, môžete znova použiť rovnaké).",
|
||||
"invalidKey": "Neplatný kľúč",
|
||||
"tryAgain": "Skúsiť znova",
|
||||
"viewRecoveryKey": "Zobraziť kľúč na obnovenie",
|
||||
"confirmRecoveryKey": "Potvrdiť kód pre obnovenie",
|
||||
"recoveryKeyVerifyReason": "Váš kľúč na obnovenie je jediný spôsob, ako obnoviť svoje fotografie, ak zabudnete heslo. Kľúč na obnovenie nájdete v Nastavenia > Konto.\n\nZadajte tu svoj kľúč na obnovenie a overte, či ste ho správne uložili.",
|
||||
"confirmYourRecoveryKey": "Potvrďte váš kód pre obnovenie",
|
||||
"confirm": "Potvrdiť",
|
||||
"emailYourLogs": "Odoslať vaše logy emailom",
|
||||
"pleaseSendTheLogsTo": "Prosím, pošlite logy na adresu \n{toEmail}",
|
||||
"copyEmailAddress": "Skopírovať e-mailovú adresu",
|
||||
"exportLogs": "Exportovať logy",
|
||||
"enterYourRecoveryKey": "Vložte váš kód pre obnovenie",
|
||||
"tempErrorContactSupportIfPersists": "Vyzerá to, že sa niečo pokazilo. Skúste znova v krátkom čase. Ak chyba pretrváva, kontaktujte náš tím podpory.",
|
||||
"networkHostLookUpErr": "Nemožno sa pripojiť k Ente, skontrolujte svoje nastavenia siete a kontaktujte podporu, ak chyba pretrváva.",
|
||||
"networkConnectionRefusedErr": "Nemožno sa pripojiť k Ente, skúste znova v krátkom čase. Ak chyba pretrváva, kontaktujte podporu.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Vyzerá to, že sa niečo pokazilo. Skúste znova v krátkom čase. Ak chyba pretrváva, kontaktujte náš tím podpory.",
|
||||
"about": "O aplikácii",
|
||||
"weAreOpenSource": "We are open source!",
|
||||
"privacy": "Súkromie",
|
||||
"terms": "Podmienky",
|
||||
"checkForUpdates": "Zistiť dostupnosť aktualizácií",
|
||||
"checkStatus": "Overiť stav",
|
||||
"downloadUpdate": "Stiahnuť",
|
||||
"criticalUpdateAvailable": "K dispozícii je kritická aktualizácia",
|
||||
"updateAvailable": "K dispozícii je aktualizácia",
|
||||
"update": "Aktualizovať",
|
||||
"checking": "Kontrolovanie...",
|
||||
"youAreOnTheLatestVersion": "Používate najnovšiu verziu",
|
||||
"warning": "Upozornenie",
|
||||
"exportWarningDesc": "Exportovaný súbor obsahuje citlivé informácie. Prosím, uložte to bezpečne.",
|
||||
"iUnderStand": "Rozumiem",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "Pre export vašich kódov sa musíte overiť",
|
||||
"importSuccessTitle": "Jéj!",
|
||||
"importSuccessDesc": "Úspešne ste importovali kódy v počte {count}!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The number of codes imported",
|
||||
"type": "int",
|
||||
"example": "1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sorry": "Ospravedlňujeme sa",
|
||||
"importFailureDesc": "Vybraný súbor nie je možné spracovať.\nAk potrebujete pomoc, napíšte na adresu support@ente.io!",
|
||||
"pendingSyncs": "Upozornenie",
|
||||
"pendingSyncsWarningBody": "Niektoré z vašich kódov neboli zálohované.\n\nPred odhlásením sa uistite, že máte zálohu pre tieto kódy.",
|
||||
"checkInboxAndSpamFolder": "Skontrolujte svoju doručenú poštu (a spam) pre dokončenie overenia",
|
||||
"tapToEnterCode": "Klepnutím zadajte kód",
|
||||
"resendEmail": "Znovu odoslať email",
|
||||
"weHaveSendEmailTo": "Odoslali sme email na adresu <green>{email}</green>",
|
||||
"@weHaveSendEmailTo": {
|
||||
"description": "Text to indicate that we have sent a mail to the user",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"description": "The email address of the user",
|
||||
"type": "String",
|
||||
"example": "example@ente.io"
|
||||
}
|
||||
}
|
||||
},
|
||||
"activeSessions": "Aktívne relácie",
|
||||
"somethingWentWrongPleaseTryAgain": "Niečo sa pokazilo, skúste to prosím znova",
|
||||
"thisWillLogYouOutOfThisDevice": "Toto vás odhlási z tohto zariadenia!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "Toto vás odhlási z následujúceho zariadenia:",
|
||||
"terminateSession": "Ukončiť reláciu?",
|
||||
"terminate": "Ukončiť",
|
||||
"thisDevice": "Toto zariadenie",
|
||||
"toResetVerifyEmail": "Ak chcete obnoviť svoje heslo, najskôr overte svoj email.",
|
||||
"thisEmailIsAlreadyInUse": "Tento e-mail sa už používa",
|
||||
"verificationFailedPleaseTryAgain": "Overenie zlyhalo, skúste to znova",
|
||||
"yourVerificationCodeHasExpired": "Platnosť overovacieho kódu uplynula",
|
||||
"incorrectCode": "Neplatný kód",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "Ľutujeme, zadaný kód je nesprávny",
|
||||
"emailChangedTo": "Emailová adresa bola zmenená na {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "Overenie zlyhalo. Skúste to znova",
|
||||
"authenticationSuccessful": "Overenie sa podarilo!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Dvojfaktorové overovanie bolo úspešne obnovené",
|
||||
"incorrectRecoveryKey": "Nesprávny kľúč na obnovenie",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "Kľúč na obnovenie, ktorý ste zadali, je nesprávny",
|
||||
"enterPassword": "Zadajte heslo",
|
||||
"selectExportFormat": "Zvoľte formát pre exportovanie",
|
||||
"exportDialogDesc": "Šifrované exporty budú chránené heslom, ktoré si vyberiete.",
|
||||
"encrypted": "Šifrované",
|
||||
"plainText": "Obyčajný text",
|
||||
"passwordToEncryptExport": "Heslo na zašifrovanie exportu",
|
||||
"export": "Exportovať",
|
||||
"useOffline": "Používať bez zálohy",
|
||||
"signInToBackup": "Prihláste sa a zálohujte svoje kódy",
|
||||
"singIn": "Prihlásiť sa",
|
||||
"sigInBackupReminder": "Exportujte svoje kódy, aby ste sa uistili, že máte zálohu, ktorú môžete neskôr obnoviť.",
|
||||
"offlineModeWarning": "Rozhodli ste sa pokračovať bez zálohovania. Prosím, vykonávajte pravidelné manuálne zálohy aby ste mali istotu, že kódy nestratíte.",
|
||||
"showLargeIcons": "Zobraziť veľké ikony",
|
||||
"shouldHideCode": "Skryť kódy",
|
||||
"doubleTapToViewHiddenCode": "Dvakrát klepnite na položku aby ste zobrazili kód",
|
||||
"focusOnSearchBar": "Využívať pole vyhľadávania pri spustení aplikácie",
|
||||
"confirmUpdatingkey": "Ste si istí, že chcete zmeniť tajný kľúč?",
|
||||
"minimizeAppOnCopy": "Minimalizovať po skopírovaní",
|
||||
"editCodeAuthMessage": "Overte sa pre zmenu kódu",
|
||||
"deleteCodeAuthMessage": "Overte sa pre vymazanie kódu",
|
||||
"showQRAuthMessage": "Overte sa pre zobrazenie QR kódu",
|
||||
"confirmAccountDeleteTitle": "Potvrdiť odstránenie účtu",
|
||||
"confirmAccountDeleteMessage": "Tento účet je prepojený s inými aplikáciami Ente, ak nejaké používate.\n\nVšetky nahrané údaje v aplikáciách od Ente budú naplánované na výmaz a váš účet bude natrvalo odstránený.",
|
||||
"androidBiometricHint": "Overiť identitu",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricNotRecognized": "Nerozpoznané. Skúste znova.",
|
||||
"@androidBiometricNotRecognized": {
|
||||
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricSuccess": "Overenie úspešné",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "Zrušiť",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
},
|
||||
"androidSignInTitle": "Vyžaduje sa overenie",
|
||||
"@androidSignInTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricRequiredTitle": "Vyžaduje sa biometria",
|
||||
"@androidBiometricRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsRequiredTitle": "Vyžadujú sa poverenia zariadenia",
|
||||
"@androidDeviceCredentialsRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsSetupDescription": "Vyžadujú sa poverenia zariadenia",
|
||||
"@androidDeviceCredentialsSetupDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"goToSettings": "Prejsť do nastavení",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
"androidGoToSettingsDescription": "Overenie pomocou biometrie nie je na vašom zariadení nastavené. Prejdite na 'Nastavenie > Zabezpečenie' a pridajte overenie pomocou biometrie.",
|
||||
"@androidGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"iOSLockOut": "Overenie pomocou biometrie je zakázané. Zamknite a odomknite svoju obrazovku, aby ste ho povolili.",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSGoToSettingsDescription": "Overenie pomocou biometrie nie je na vašom zariadení nastavené. Povoľte buď Touch ID or Face ID na svojom telefóne.",
|
||||
"@iOSGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSOkButton": "OK",
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"noInternetConnection": "Žiadne internetové pripojenie",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Skontrolujte svoje internetové pripojenie a skúste to znova.",
|
||||
"signOutFromOtherDevices": "Odhlásiť sa z iných zariadení",
|
||||
"signOutOtherBody": "Ak si myslíte, že niekto môže vedieť vaše heslo, môžete vynútiť odhlásenie všetkých ostatných zariadení vo vašom účte.",
|
||||
"signOutOtherDevices": "Odhlásiť iné zariadenie",
|
||||
"doNotSignOut": "Neodhlasovať",
|
||||
"hearUsWhereTitle": "Ako ste sa dozvedeli o Ente? (voliteľné)",
|
||||
"hearUsExplanation": "Nesledujeme inštalácie aplikácie. Veľmi by nám pomohlo, keby ste nám povedali, ako ste sa o nás dozvedeli!",
|
||||
"recoveryKeySaved": "Kľúč na obnovenie uložený v priečinku Stiahnutých súborov!",
|
||||
"waitingForBrowserRequest": "Čakanie na prehliadač...",
|
||||
"waitingForVerification": "Čakanie na overenie...",
|
||||
"passkey": "Passkey",
|
||||
"passKeyPendingVerification": "Overenie stále prebieha",
|
||||
"loginSessionExpired": "Relácia vypršala",
|
||||
"loginSessionExpiredDetails": "Vaša relácia vypršala. Prosím, prihláste sa znovu.",
|
||||
"developerSettingsWarning": "Ste si istí, že chcete modifikovať nastavenia pre vývojárov?",
|
||||
"developerSettings": "Nastavenia pre vývojárov",
|
||||
"serverEndpoint": "Endpoint servera",
|
||||
"invalidEndpoint": "Neplatný endpoint",
|
||||
"invalidEndpointMessage": "Ospravedlňujeme sa, endpoint, ktorý ste zadali, je neplatný. Zadajte platný endpoint a skúste to znova.",
|
||||
"endpointUpdatedMessage": "Endpoint úspešne aktualizovaný",
|
||||
"customEndpoint": "Pripojený k endpointu {endpoint}",
|
||||
"pinText": "Pripnúť",
|
||||
"unpinText": "Odopnúť",
|
||||
"pinnedCodeMessage": "{code} bol pripnutý",
|
||||
"unpinnedCodeMessage": "{code} bol odopnutý",
|
||||
"tags": "Tagy",
|
||||
"createNewTag": "Vytvoriť nový tag",
|
||||
"tag": "Tag",
|
||||
"create": "Vytvoriť",
|
||||
"editTag": "Upraviť tag",
|
||||
"deleteTagTitle": "Odstrániť tag?",
|
||||
"deleteTagMessage": "Naozaj chcete odstrániť tag? Táto akcia je nezvratná.",
|
||||
"somethingWentWrongParsingCode": "Neboli sme schopní spracovať {x} kódov.",
|
||||
"updateNotAvailable": "K dispozícii nie je žiadna aktualizácia",
|
||||
"viewRawCodes": "Zobraziť nešifrované kódy",
|
||||
"rawCodes": "Nešifrované kódy",
|
||||
"rawCodeData": "Nešifrované údaje o kódoch",
|
||||
"appLock": "Zámok aplikácie",
|
||||
"noSystemLockFound": "Nenájdená žiadna zámka obrazovky",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pre povolenie uzamknutia aplikácie, nastavte prístupový kód zariadenia alebo zámok obrazovky v nastaveniach systému.",
|
||||
"autoLock": "Automatické uzamknutie",
|
||||
"immediately": "Okamžite",
|
||||
"reEnterPassword": "Zadajte heslo znova",
|
||||
"reEnterPin": "Zadajte PIN znova",
|
||||
"next": "Ďalej",
|
||||
"tooManyIncorrectAttempts": "Príliš veľa chybných pokusov",
|
||||
"tapToUnlock": "Ťuknutím odomknete",
|
||||
"setNewPassword": "Nastaviť nové heslo",
|
||||
"deviceLock": "Zámok zariadenia",
|
||||
"hideContent": "Skryť obsah",
|
||||
"hideContentDescriptionAndroid": "Skrýva obsah v prepínači aplikácii a zakazuje snímky obrazovky",
|
||||
"hideContentDescriptioniOS": "Skrýva obsah v prepínači aplikácii",
|
||||
"autoLockFeatureDescription": "Čas, po ktorom sa aplikácia uzamkne po nečinnosti",
|
||||
"appLockDescription": "Vyberte si medzi predvolenou zámkou obrazovky vášho zariadenia a vlastnou zámkou obrazovky s PIN kódom alebo heslom.",
|
||||
"pinLock": "Zámok PIN",
|
||||
"enterPin": "Zadajte PIN",
|
||||
"setNewPin": "Nastaviť nový PIN",
|
||||
"importFailureDescNew": "Vybraný súbor nie je možné spracovať."
|
||||
}
|
||||
@@ -62,6 +62,7 @@
|
||||
"changePassword": "Ändra lösenord",
|
||||
"importCodes": "Importera koder",
|
||||
"exportCodes": "Exportera koder",
|
||||
"importLabel": "Importera",
|
||||
"cancel": "Avbryt",
|
||||
"yes": "Ja",
|
||||
"no": "Nej",
|
||||
@@ -91,6 +92,7 @@
|
||||
"moderateStrength": "Måttligt",
|
||||
"confirmPassword": "Bekräfta lösenord",
|
||||
"close": "Stäng",
|
||||
"selectLanguage": "Välj språk",
|
||||
"language": "Språk",
|
||||
"searchHint": "Sök...",
|
||||
"search": "Sök",
|
||||
@@ -150,6 +152,7 @@
|
||||
"enterPassword": "Ange lösenord",
|
||||
"export": "Exportera",
|
||||
"singIn": "Logga in",
|
||||
"shouldHideCode": "Dölj koder",
|
||||
"androidCancelButton": "Avbryt",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
@@ -160,5 +163,16 @@
|
||||
},
|
||||
"noInternetConnection": "Ingen internetanslutning",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Kontrollera din internetanslutning och försök igen.",
|
||||
"loginSessionExpiredDetails": "Din session har upphört. Logga in igen."
|
||||
"loginSessionExpiredDetails": "Din session har upphört. Logga in igen.",
|
||||
"immediately": "Omedelbart",
|
||||
"reEnterPassword": "Ange lösenord igen",
|
||||
"reEnterPin": "Ange PIN-kod igen",
|
||||
"next": "Nästa",
|
||||
"tooManyIncorrectAttempts": "För många felaktiga försök",
|
||||
"tapToUnlock": "Tryck för att låsa upp",
|
||||
"setNewPassword": "Ange nytt lösenord",
|
||||
"deviceLock": "Enhetslås",
|
||||
"hideContent": "Dölj innehåll",
|
||||
"enterPin": "Ange PIN-kod",
|
||||
"setNewPin": "Ange ny PIN-kod"
|
||||
}
|
||||
@@ -263,6 +263,8 @@
|
||||
"exportLogs": "Günlüğü dışa aktar",
|
||||
"enterYourRecoveryKey": "Kurtarma anahtarınızı girin",
|
||||
"tempErrorContactSupportIfPersists": "Bir şeyler ters gitmiş gibi görünüyor. Lütfen bir süre sonra tekrar deneyin. Hata devam ederse, lütfen destek ekibimizle iletişime geçin.",
|
||||
"networkHostLookUpErr": "Ente'ye bağlanılamıyor, lütfen ağ ayarlarınızı kontrol edin ve hata devam ederse desteğe başvurun.",
|
||||
"networkConnectionRefusedErr": "Ente'ye bağlanılamıyor, lütfen daha sonra tekrar deneyin. Hata devam ederse, lütfen desteğe başvurun.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Bir şeyler ters gitmiş gibi görünüyor. Lütfen bir süre sonra tekrar deneyin. Hata devam ederse, lütfen destek ekibimizle iletişime geçin.",
|
||||
"about": "Hakkında",
|
||||
"weAreOpenSource": "Biz açık kaynağız!",
|
||||
@@ -440,5 +442,8 @@
|
||||
"deleteTagTitle": "Etiket silinsin mi?",
|
||||
"deleteTagMessage": "Bu etiketi silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
|
||||
"somethingWentWrongParsingCode": "{x} kodu ayrıştıramadık.",
|
||||
"updateNotAvailable": "Güncelleme mevcut değil"
|
||||
"updateNotAvailable": "Güncelleme mevcut değil",
|
||||
"viewRawCodes": "Ham kodları gör",
|
||||
"rawCodes": "Ham kodlar",
|
||||
"rawCodeData": "Ham kod verisi"
|
||||
}
|
||||
470
auth/lib/l10n/arb/app_uk.arb
Normal file
@@ -0,0 +1,470 @@
|
||||
{
|
||||
"account": "Обліковий запис",
|
||||
"unlock": "Розблокувати",
|
||||
"recoveryKey": "Ключ відновлення",
|
||||
"counterAppBarTitle": "Лічильник",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "Безпечно зробіть резервну копію кодів 2FA",
|
||||
"onBoardingGetStarted": "Розпочати",
|
||||
"setupFirstAccount": "Налаштуйте свій перший обліковий запис",
|
||||
"importScanQrCode": "Відскануйте QR-код",
|
||||
"qrCode": "QR-код",
|
||||
"importEnterSetupKey": "Введіть ключ налаштування",
|
||||
"importAccountPageTitle": "Введіть дані облікового запису",
|
||||
"secretCanNotBeEmpty": "Секретний ключ не може бути порожнім",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Не може бути пустим як емітент, так і обліковий запис",
|
||||
"incorrectDetails": "Невірні дані",
|
||||
"pleaseVerifyDetails": "Будь ласка, перевірте дані та повторіть спробу",
|
||||
"codeIssuerHint": "Емітент",
|
||||
"codeSecretKeyHint": "Секретний ключ",
|
||||
"codeAccountHint": "Обліковий запис (you@domain.com)",
|
||||
"codeTagHint": "Мітка",
|
||||
"accountKeyType": "Тип ключа",
|
||||
"sessionExpired": "Час сеансу минув",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Будь ласка, увійдіть знову",
|
||||
"loggingOut": "Вихід із системи...",
|
||||
"timeBasedKeyType": "На основі часу (TOTP)",
|
||||
"counterBasedKeyType": "На основі лічильника (HOTP)",
|
||||
"saveAction": "Зберегти",
|
||||
"nextTotpTitle": "далі",
|
||||
"deleteCodeTitle": "Видалити код?",
|
||||
"deleteCodeMessage": "Ви впевнені, що хочете видалити цей код? Ця дія є незворотною.",
|
||||
"viewLogsAction": "Переглянути журнали",
|
||||
"sendLogsDescription": "Це надішле журнали, щоб допомогти нам зневадити проблему. Хоча ми вживаємо запобіжні заходи для того, щоб ніяка чутлива інформація не була переслана, ми рекомендуємо вам переглянути ці журнали, перш ніж поділитися ними.",
|
||||
"preparingLogsTitle": "Підготовка журналів...",
|
||||
"emailLogsTitle": "Переслати журнали електронною поштою",
|
||||
"emailLogsMessage": "Будь ласка, надішліть журнали до електронної пошти {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "Скопіювати електронну пошту",
|
||||
"exportLogsAction": "Експортувати журнал",
|
||||
"reportABug": "Повідомити про помилку",
|
||||
"crashAndErrorReporting": "Звіт про аварії та помилки",
|
||||
"reportBug": "Повідомити про помилку",
|
||||
"emailUsMessage": "Будь ласка, напишіть нам за електронною адресою {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "Звернутися до служби підтримки",
|
||||
"rateUsOnStore": "Оцініть нас на {storeName}",
|
||||
"blog": "Блог",
|
||||
"merchandise": "Товари",
|
||||
"verifyPassword": "Підтвердження пароля",
|
||||
"pleaseWait": "Будь ласка, зачекайте...",
|
||||
"generatingEncryptionKeysTitle": "Створення ключів шифрування...",
|
||||
"recreatePassword": "Повторно створити пароль",
|
||||
"recreatePasswordMessage": "Поточний пристрій не є достатньо потужним для підтвердження пароля, тому ми маємо відновити його таким чином, щоб він працював на всіх пристроях.\n\nБудь ласка, увійдіть за допомогою вашого ключа відновлення і відновіть ваш пароль (ви можете знову використати той самий пароль, якщо бажаєте).",
|
||||
"useRecoveryKey": "Застосувати ключ відновлення",
|
||||
"incorrectPasswordTitle": "Невірний пароль",
|
||||
"welcomeBack": "З поверненням!",
|
||||
"madeWithLoveAtPrefix": "зроблено з ❤️ в ",
|
||||
"supportDevs": "Підпишіться на <bold-green>ente</bold-green>, щоб підтримати нас",
|
||||
"supportDiscount": "Використовуйте купон \"AUTH\", щоб отримати 10% знижки за перший рік",
|
||||
"changeEmail": "Змінити адресу електронної пошти",
|
||||
"changePassword": "Змінити пароль",
|
||||
"data": "Дані",
|
||||
"importCodes": "Імпортувати коди",
|
||||
"importTypePlainText": "Звичайний текст",
|
||||
"importTypeEnteEncrypted": "Зашифрований експорт Ente",
|
||||
"passwordForDecryptingExport": "Пароль для розшифровки експорту",
|
||||
"passwordEmptyError": "Пароль не може бути порожнім",
|
||||
"importFromApp": "Імпортувати коди з {appName}",
|
||||
"importGoogleAuthGuide": "Експортуйте свої облікові записи з Google Authenticator у QR-код за допомогою опції «Перенести облікові записи». Потім за допомогою іншого пристрою відскануйте QR-код.\n\nПорада: Ви можете сфотографувати QR-код за допомогою вебкамери свого ноутбука.",
|
||||
"importSelectJsonFile": "Оберіть файл JSON",
|
||||
"importSelectAppExport": "Виберіть експортований файл {appName}",
|
||||
"importEnteEncGuide": "Виберіть зашифрований файл JSON, експортований з Ente",
|
||||
"importRaivoGuide": "Використовуйте опцію «Export OTPs to Zip archive» у налаштуваннях Raivo.\n\nРозпакуйте файл ZIP та імпортуйте файл JSON.",
|
||||
"importBitwardenGuide": "Використовуйте опцію \"Export vault\" в Bitwarden Tools та імпортуйте незашифрований файл JSON.",
|
||||
"importAegisGuide": "Скористайтеся опцією \"Export the vault\" у параметрах Aegis.\n\nЯкщо ваше сховище зашифровано, вам потрібно буде ввести пароль сховища для його дешифрування.",
|
||||
"import2FasGuide": "Використовуйте параметр «Settings->Backup -Export» у 2FAS.\n\nЯкщо ваша резервна копія зашифрована, вам потрібно буде ввести пароль, щоб розшифрувати резервну копію",
|
||||
"importLastpassGuide": "Скористайтеся опцією «Transfer accounts» в налаштуваннях Lastpass Authenticator і натисніть «Export accounts to file». Імпортуйте завантажений JSON.",
|
||||
"exportCodes": "Експортувати коди",
|
||||
"importLabel": "Імпортувати",
|
||||
"importInstruction": "Будь ласка, виберіть файл, що містить список кодів у наступному форматі",
|
||||
"importCodeDelimiterInfo": "Коди можуть бути розділені комою або новим рядком",
|
||||
"selectFile": "Вибрати файл",
|
||||
"emailVerificationToggle": "Підтвердження адреси електронної пошти",
|
||||
"emailVerificationEnableWarning": "Щоб уникнути блокування доступу до свого облікового запису, обов’язково збережіть копію двофакторної аутентифікації до своєї електронної пошти за межами Ente Auth, перш ніж увімкнути перевірку електронної пошти.",
|
||||
"authToChangeEmailVerificationSetting": "Будь ласка, пройдіть аутентифікацію, щоб змінити перевірку адреси електронної пошти",
|
||||
"authToViewYourRecoveryKey": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваш ключ відновлення",
|
||||
"authToChangeYourEmail": "Будь ласка, пройдіть аутентифікацію, щоб змінити адресу електронної пошти",
|
||||
"authToChangeYourPassword": "Будь ласка, пройдіть аутентифікацію, щоб змінити ваш пароль",
|
||||
"authToViewSecrets": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваші секретні коди",
|
||||
"authToInitiateSignIn": "Будь ласка, пройдіть аутентифікацію, щоб розпочати вхід для резервного копіювання.",
|
||||
"ok": "Ок",
|
||||
"cancel": "Скасувати",
|
||||
"yes": "Так",
|
||||
"no": "Ні",
|
||||
"email": "Адреса електронної пошти",
|
||||
"support": "Служба підтримки",
|
||||
"general": "Загальні",
|
||||
"settings": "Налаштування",
|
||||
"copied": "Скопійовано",
|
||||
"pleaseTryAgain": "Будь ласка, спробуйте ще раз",
|
||||
"existingUser": "Існуючий користувач",
|
||||
"newUser": "Вперше на Ente",
|
||||
"delete": "Видалити",
|
||||
"enterYourPasswordHint": "Введіть свій пароль",
|
||||
"forgotPassword": "Нагадати пароль",
|
||||
"oops": "От халепа",
|
||||
"suggestFeatures": "Запропонувати нові функції",
|
||||
"faq": "Часто Запитувані Питання",
|
||||
"faq_q_1": "Наскільки безпечним є Auth?",
|
||||
"faq_a_1": "Всі коди, які ви зберігаєте в Auth, кодуються наскрізним захистом. Це означає, що тільки ви можете отримати доступ до ваших кодів. Наші програми мають відкритий вихідний код, і наша криптографія була перевірена зовнішніми аудиторами.",
|
||||
"faq_q_2": "Чи я можу отримати доступ до своїх кодів на настільному комп'ютері?",
|
||||
"faq_a_2": "Ви можете отримати доступ до ваших кодів у веб на auth.ente.io.",
|
||||
"faq_q_3": "Як я можу видалити коди?",
|
||||
"faq_a_3": "Ви можете видалити код, провівши пальцем вліво на цьому елементі.",
|
||||
"faq_q_4": "Як я можу підтримати цей проект?",
|
||||
"faq_a_4": "Ви можете підтримати розробку цього проекту, підписавшись на наш додаток Photos на ente.io.",
|
||||
"faq_q_5": "Як я можу активувати розблокування за допомогою FaceID в Auth",
|
||||
"faq_a_5": "Ви можете активувати розблокування за допомогою FaceID у Налаштування → Безпека → Блокування екрану.",
|
||||
"somethingWentWrongMessage": "Щось пішло не так, спробуйте, будь ласка, знову",
|
||||
"leaveFamily": "Залишити сімейний план",
|
||||
"leaveFamilyMessage": "Ви впевнені, що хочете залишити сімейний план?",
|
||||
"inFamilyPlanMessage": "Ви знаходитесь на сімейному плані!",
|
||||
"swipeHint": "Проведіть пальцем вліво, щоб редагувати або видаляти коди",
|
||||
"scan": "Сканувати",
|
||||
"scanACode": "Сканувати код",
|
||||
"verify": "Перевірити",
|
||||
"verifyEmail": "Підтвердити електронну адресу",
|
||||
"enterCodeHint": "Введіть нижче шестизначний код із застосунку для автентифікації",
|
||||
"lostDeviceTitle": "Загубили пристрій?",
|
||||
"twoFactorAuthTitle": "Двофакторна аутентифікація",
|
||||
"passkeyAuthTitle": "Перевірка секретного ключа",
|
||||
"verifyPasskey": "Підтвердження секретного ключа",
|
||||
"recoverAccount": "Відновити обліковий запис",
|
||||
"enterRecoveryKeyHint": "Введіть ваш ключ відновлення",
|
||||
"recover": "Відновлення",
|
||||
"contactSupportViaEmailMessage": "Будь ласка, надішліть електронну пошту на адресу {email} з вашої зареєстрованої адреси електронної пошти",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "Хибний QR-код",
|
||||
"noRecoveryKeyTitle": "Немає ключа відновлення?",
|
||||
"enterEmailHint": "Введіть вашу адресу електронної пошти",
|
||||
"invalidEmailTitle": "Хибна адреса електронної пошти",
|
||||
"invalidEmailMessage": "Введіть дійсну адресу електронної пошти.",
|
||||
"deleteAccount": "Видалити обліковий запис",
|
||||
"deleteAccountQuery": "Нам дуже шкода, що Ви залишаєте нас. Чи Ви зіткнулися з якоюсь проблемою?",
|
||||
"yesSendFeedbackAction": "Так, надіслати відгук",
|
||||
"noDeleteAccountAction": "Ні, видаліть мій обліковий запис",
|
||||
"initiateAccountDeleteTitle": "Будь ласка, авторизуйтесь, щоб розпочати видалення облікового запису",
|
||||
"sendEmail": "Надіслати електронного листа",
|
||||
"createNewAccount": "Створити новий обліковий запис",
|
||||
"weakStrength": "Слабкий",
|
||||
"strongStrength": "Надійний",
|
||||
"moderateStrength": "Помірний",
|
||||
"confirmPassword": "Підтвердити пароль",
|
||||
"close": "Закрити",
|
||||
"oopsSomethingWentWrong": "Ой, лихо. Щось пішло не так.",
|
||||
"selectLanguage": "Виберіть мову",
|
||||
"language": "Мова",
|
||||
"social": "Соціальні мережі",
|
||||
"security": "Безпека",
|
||||
"lockscreen": "Екран блокування",
|
||||
"authToChangeLockscreenSetting": "Будь ласка, авторизуйтесь для зміни налаштувань екрану блокування",
|
||||
"lockScreenEnablePreSteps": "Для увімкнення екрана блокування, будь ласка, налаштуйте пароль пристрою або блокування екрана в системних налаштуваннях.",
|
||||
"viewActiveSessions": "Показати активні сеанси",
|
||||
"authToViewYourActiveSessions": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваші активні сеанси",
|
||||
"searchHint": "Пошук...",
|
||||
"search": "Пошук",
|
||||
"sorryUnableToGenCode": "Вибачте, не вдалося створити код для {issuerName}",
|
||||
"noResult": "Немає результатів",
|
||||
"addCode": "Додати код",
|
||||
"scanAQrCode": "Сканувати QR-код",
|
||||
"enterDetailsManually": "Введіть дані вручну",
|
||||
"edit": "Редагувати",
|
||||
"copiedToClipboard": "Скопійовано до буфера обміну",
|
||||
"copiedNextToClipboard": "Наступний код скопійовано до буфера обміну",
|
||||
"error": "Помилка",
|
||||
"recoveryKeyCopiedToClipboard": "Ключ відновлення скопійований в буфер обміну",
|
||||
"recoveryKeyOnForgotPassword": "Якщо ви забудете свій пароль, то єдиний спосіб відновити ваші дані – за допомогою цього ключа.",
|
||||
"recoveryKeySaveDescription": "Ми не зберігаємо цей ключ, будь ласка, збережіть цей ключ з 24 слів в надійному місці.",
|
||||
"doThisLater": "Зробити це пізніше",
|
||||
"saveKey": "Зберегти ключ",
|
||||
"save": "Зберегти",
|
||||
"send": "Надіслати",
|
||||
"saveOrSendDescription": "Чи хочете Ви зберегти це до свого сховища (тека Downloads за замовчуванням), чи надіслати його в інші додатки?",
|
||||
"saveOnlyDescription": "Чи хочете Ви зберегти це до свого сховища (тека Downloads за замовчуванням)?",
|
||||
"back": "Назад",
|
||||
"createAccount": "Створити обліковий запис",
|
||||
"passwordStrength": "Сила пароля: {passwordStrengthValue}",
|
||||
"@passwordStrength": {
|
||||
"description": "Text to indicate the password strength",
|
||||
"placeholders": {
|
||||
"passwordStrengthValue": {
|
||||
"description": "The strength of the password as a string",
|
||||
"type": "String",
|
||||
"example": "Weak or Moderate or Strong"
|
||||
}
|
||||
},
|
||||
"message": "Password Strength: {passwordStrengthText}"
|
||||
},
|
||||
"password": "Пароль",
|
||||
"signUpTerms": "Я приймаю <u-terms>умови використання</u-terms> і <u-policy>політику конфіденційності</u-policy>",
|
||||
"privacyPolicyTitle": "Політика конфіденційності",
|
||||
"termsOfServicesTitle": "Умови",
|
||||
"encryption": "Шифрування",
|
||||
"setPasswordTitle": "Встановити пароль",
|
||||
"changePasswordTitle": "Змінити пароль",
|
||||
"resetPasswordTitle": "Скинути пароль",
|
||||
"encryptionKeys": "Ключі шифрування",
|
||||
"passwordWarning": "Ми не зберігаємо цей пароль, тому, якщо ви його забудете, <underline>ми не зможемо розшифрувати Ваші дані</underline>",
|
||||
"enterPasswordToEncrypt": "Введіть пароль, який ми зможемо використати для шифрування ваших даних",
|
||||
"enterNewPasswordToEncrypt": "Введіть новий пароль, який ми зможемо використати для шифрування ваших даних",
|
||||
"passwordChangedSuccessfully": "Пароль успішно змінено",
|
||||
"generatingEncryptionKeys": "Створення ключів шифрування...",
|
||||
"continueLabel": "Продовжити",
|
||||
"insecureDevice": "Незахищений пристрій",
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "На жаль, нам не вдалося згенерувати захищені ключі на цьому пристрої.\n\nБудь ласка, увійдіть з іншого пристрою.",
|
||||
"howItWorks": "Як це працює",
|
||||
"ackPasswordLostWarning": "Я розумію, що якщо я втрачу свій пароль, я можу втратити свої дані, тому що вони є захищені <underline>наскрізним шифруванням</underline>.",
|
||||
"loginTerms": "Натискаючи «Увійти», я приймаю <u-terms>умови використання</u-terms> і <u-policy>політику конфіденційності</u-policy>",
|
||||
"logInLabel": "Увійти",
|
||||
"logout": "Вийти",
|
||||
"areYouSureYouWantToLogout": "Ви впевнені, що хочете вийти з системи?",
|
||||
"yesLogout": "Так, вийти з системи",
|
||||
"exit": "Вийти",
|
||||
"verifyingRecoveryKey": "Перевірка ключа відновлення...",
|
||||
"recoveryKeyVerified": "Ключ відновлення перевірено",
|
||||
"recoveryKeySuccessBody": "Чудово! Ваш ключ відновлення дійсний. Дякуємо за перевірку.\n\nБудь ласка, не забувайте зберігати надійну резервну копію ключа відновлення.",
|
||||
"invalidRecoveryKey": "Уведений вами ключ відновлення недійсний. Переконайтеся, що він містить 24 слова, а також перевірте правопис кожного.\n\nЯкщо ви ввели старий код відновлення, переконайтеся, що він має 64 символи, а також перевірте кожен з них.",
|
||||
"recreatePasswordTitle": "Повторно створити пароль",
|
||||
"recreatePasswordBody": "Поточний пристрій не є достатньо потужним для підтвердження пароля, але ми можемо відновити його таким чином, щоб він працював на всіх пристроях.\n\nБудь ласка, увійдіть за допомогою вашого ключа відновлення і відновіть ваш пароль (ви можете знову використати той самий пароль, якщо бажаєте).",
|
||||
"invalidKey": "Хибний ключ",
|
||||
"tryAgain": "Спробуйте ще раз",
|
||||
"viewRecoveryKey": "Переглянути ключ відновлення",
|
||||
"confirmRecoveryKey": "Підтвердити ключ відновлення",
|
||||
"recoveryKeyVerifyReason": "Ваш ключ відновлення це єдиний спосіб відновити ваші фотографії, якщо ви забудете пароль. Ви можете знайти ключ відновлення у меню Налаштування > Обліковий запис.\n\nБудь ласка, введіть ваш ключ відновлення, щоб переконатися, що ви зберегли його правильно.",
|
||||
"confirmYourRecoveryKey": "Підтвердіть ваш ключ відновлення",
|
||||
"confirm": "Підтвердити",
|
||||
"emailYourLogs": "Відправте ваші журнали електронною поштою",
|
||||
"pleaseSendTheLogsTo": "Будь ласка, надішліть журнали до електронної пошти {toEmail}",
|
||||
"copyEmailAddress": "Копіювати електронну адресу",
|
||||
"exportLogs": "Експортувати журнал",
|
||||
"enterYourRecoveryKey": "Введіть ваш ключ відновлення",
|
||||
"tempErrorContactSupportIfPersists": "Схоже, що щось пішло не так. Будь ласка, спробуйте ще раз через деякий час. Якщо помилка не зникне, зв'яжіться з нашою командою підтримки.",
|
||||
"networkHostLookUpErr": "Не вдалося приєднатися до Ente. Будь ласка, перевірте налаштування мережі. Зверніться до нашої команди підтримки, якщо помилка залишиться.",
|
||||
"networkConnectionRefusedErr": "Не вдалося приєднатися до Ente. Будь ласка, спробуйте ще раз через деякий час. Якщо помилка не зникне, зв'яжіться з нашою командою підтримки.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Схоже, що щось пішло не так. Будь ласка, спробуйте ще раз через деякий час. Якщо помилка не зникне, зв'яжіться з нашою командою підтримки.",
|
||||
"about": "Про додаток",
|
||||
"weAreOpenSource": "Наш додаток має відкритий код!",
|
||||
"privacy": "Конфіденційність",
|
||||
"terms": "Умови",
|
||||
"checkForUpdates": "Перевiрити наявнiсть оновлень",
|
||||
"checkStatus": "Перевірити стан",
|
||||
"downloadUpdate": "Завантажити",
|
||||
"criticalUpdateAvailable": "Доступне критичне оновлення",
|
||||
"updateAvailable": "Доступне оновлення",
|
||||
"update": "Оновлення",
|
||||
"checking": "Перевірка...",
|
||||
"youAreOnTheLatestVersion": "Ви використовуєте останню версію",
|
||||
"warning": "Увага!",
|
||||
"exportWarningDesc": "Експортований файл містить конфіденційну інформацію. Будь ласка, збережіть його безпечно.",
|
||||
"iUnderStand": "Я розумію",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "Будь ласка, авторизуйтесь, щоб експортувати ваші коди",
|
||||
"importSuccessTitle": "Гей, любо!",
|
||||
"importSuccessDesc": "Ви імпортували наступну кількість кодів: {count}!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The number of codes imported",
|
||||
"type": "int",
|
||||
"example": "1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sorry": "Дуже шкода",
|
||||
"importFailureDesc": "Не вдалося обробити обраний файл.\nБудь ласка, надішліть електронну пошту на адресу support@ente.io, якщо вам потрібна допомога!",
|
||||
"pendingSyncs": "Увага!",
|
||||
"pendingSyncsWarningBody": "Деякі з ваших кодів не були збережені.\n\nБудь ласка, переконайтеся, що у вас є резервна копія для цих кодів перед виходом.",
|
||||
"checkInboxAndSpamFolder": "Будь ласка, перевірте вашу скриньку електронної пошти (та спам), щоб завершити перевірку",
|
||||
"tapToEnterCode": "Натисніть, щоб ввести код",
|
||||
"resendEmail": "Повторно надіслати лист на електронну пошту",
|
||||
"weHaveSendEmailTo": "Ми надіслали листа на адресу електронної пошти <green>{email}</green>",
|
||||
"@weHaveSendEmailTo": {
|
||||
"description": "Text to indicate that we have sent a mail to the user",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"description": "The email address of the user",
|
||||
"type": "String",
|
||||
"example": "example@ente.io"
|
||||
}
|
||||
}
|
||||
},
|
||||
"activeSessions": "Активні сеанси",
|
||||
"somethingWentWrongPleaseTryAgain": "Щось пішло не так, спробуйте, будь ласка, знову",
|
||||
"thisWillLogYouOutOfThisDevice": "Це призведе до виходу на цьому пристрої!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "Це призведе до виходу на наступному пристрої:",
|
||||
"terminateSession": "Припинити сеанс?",
|
||||
"terminate": "Припинити",
|
||||
"thisDevice": "Цей пристрій",
|
||||
"toResetVerifyEmail": "Щоб скинути пароль, будь ласка, спочатку підтвердіть адресу своєї електронної пошти.",
|
||||
"thisEmailIsAlreadyInUse": "Ця адреса електронної пошти вже використовується",
|
||||
"verificationFailedPleaseTryAgain": "Перевірка не вдалася, спробуйте ще",
|
||||
"yourVerificationCodeHasExpired": "Час дії коду підтвердження минув",
|
||||
"incorrectCode": "Невірний код",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "Вибачте, але введений вами код є невірним",
|
||||
"emailChangedTo": "Адресу електронної пошти змінено на {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "Аутентифікація не пройдена. Будь ласка, спробуйте ще раз",
|
||||
"authenticationSuccessful": "Автентифікацію виконано!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Двофакторна аутентифікація успішно скинута",
|
||||
"incorrectRecoveryKey": "Неправильний ключ відновлення",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "Ви ввели неправильний ключ відновлення",
|
||||
"enterPassword": "Введіть пароль",
|
||||
"selectExportFormat": "Виберіть формат експортування",
|
||||
"exportDialogDesc": "Зашифрований експорт буде захищений паролем, який Ви виберете.",
|
||||
"encrypted": "Зашифрований",
|
||||
"plainText": "Звичайний текст",
|
||||
"passwordToEncryptExport": "Пароль для зашифровування експорту",
|
||||
"export": "Експорт",
|
||||
"useOffline": "Використовувати без резервних копій",
|
||||
"signInToBackup": "Увійдіть для резервного копіювання кодів",
|
||||
"singIn": "Увійти",
|
||||
"sigInBackupReminder": "Будь ласка, експортуйте свої коди, щоб зберегти резервну копію, з якої ви зможете їх відновити.",
|
||||
"offlineModeWarning": "Ви збираєтеся продовжити без резервних копій. Будь ласка, зробіть ручну резервну копію, щоб переконатися, що ваші коди в безпеці.",
|
||||
"showLargeIcons": "Показувати великі іконки",
|
||||
"shouldHideCode": "Приховати коди",
|
||||
"doubleTapToViewHiddenCode": "Ви можете двічі натиснути на запис для перегляду коду",
|
||||
"focusOnSearchBar": "Сфокусуватися на пошуку після запуску програми",
|
||||
"confirmUpdatingkey": "Ви впевнені у тому, що бажаєте змінити секретний ключ?",
|
||||
"minimizeAppOnCopy": "Згорнути програму після копіювання",
|
||||
"editCodeAuthMessage": "Аутентифікуйтесь, щоб змінити код",
|
||||
"deleteCodeAuthMessage": "Аутентифікуйтесь, щоб видалити код",
|
||||
"showQRAuthMessage": "Аутентифікуйтесь, щоб показати QR-код",
|
||||
"confirmAccountDeleteTitle": "Підтвердіть видалення облікового запису",
|
||||
"confirmAccountDeleteMessage": "Цей обліковий запис є зв'язаним з іншими програмами Ente, якщо ви використовуєте якісь з них.\n\nВаші завантажені дані у всіх програмах Ente будуть заплановані до видалення, а обліковий запис буде видалено назавжди.",
|
||||
"androidBiometricHint": "Підтвердити ідентифікацію",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricNotRecognized": "Не розпізнано. Спробуйте ще раз.",
|
||||
"@androidBiometricNotRecognized": {
|
||||
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricSuccess": "Успіх",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "Скасувати",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
},
|
||||
"androidSignInTitle": "Необхідна аутентифікація",
|
||||
"@androidSignInTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricRequiredTitle": "Потрібна біометрична аутентифікація",
|
||||
"@androidBiometricRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsRequiredTitle": "Необхідні облікові дані пристрою",
|
||||
"@androidDeviceCredentialsRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsSetupDescription": "Необхідні облікові дані пристрою",
|
||||
"@androidDeviceCredentialsSetupDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"goToSettings": "Перейти до налаштувань",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
"androidGoToSettingsDescription": "Біометрична аутентифікація не налаштована на вашому пристрої. Перейдіть в 'Налаштування > Безпека', щоб додати біометричну аутентифікацію.",
|
||||
"@androidGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"iOSLockOut": "Біометрична автентифікація вимкнена. Будь ласка, заблокуйте і розблокуйте свій екран, щоб увімкнути її.",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSGoToSettingsDescription": "Біометрична аутентифікація не налаштована на вашому пристрої. Увімкніть TouchID або FaceID на вашому телефоні.",
|
||||
"@iOSGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSOkButton": "OK",
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"noInternetConnection": "Немає підключення до Інтернету",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Будь ласка, перевірте підключення до Інтернету та спробуйте ще раз.",
|
||||
"signOutFromOtherDevices": "Вийти на інших пристроях",
|
||||
"signOutOtherBody": "Якщо ви думаєте, що хтось може знати ваш пароль, ви можете примусити всі інші пристрої, які використовують ваш обліковий запис, вийти з нього.",
|
||||
"signOutOtherDevices": "Вийти на інших пристроях",
|
||||
"doNotSignOut": "Не виходити",
|
||||
"hearUsWhereTitle": "Як ви дізналися про Ente? (опціонально)",
|
||||
"hearUsExplanation": "Ми не відстежуємо встановлення додатків. Але, якщо ви скажете нам, де ви нас знайшли, це допоможе!",
|
||||
"recoveryKeySaved": "Ключ відновлення збережений у теці Downloads!",
|
||||
"waitingForBrowserRequest": "Очікування запиту браузера...",
|
||||
"waitingForVerification": "Очікується підтвердження...",
|
||||
"passkey": "Ключ доступу",
|
||||
"passKeyPendingVerification": "Підтвердження все ще в процесі",
|
||||
"loginSessionExpired": "Час сеансу минув",
|
||||
"loginSessionExpiredDetails": "Термін дії вашого сеансу завершився. Будь ласка, увійдіть знову.",
|
||||
"developerSettingsWarning": "Ви впевнені, що хочете змінити налаштування розробника?",
|
||||
"developerSettings": "Налаштування розробника",
|
||||
"serverEndpoint": "Кінцева точка сервера",
|
||||
"invalidEndpoint": "Некоректна кінцева точка",
|
||||
"invalidEndpointMessage": "Вибачте, введена вами кінцева точка є недійсною. Введіть дійсну кінцеву точку та спробуйте ще раз.",
|
||||
"endpointUpdatedMessage": "Точка входу успішно оновлена",
|
||||
"customEndpoint": "Приєднано до {endpoint}",
|
||||
"pinText": "Закріпити",
|
||||
"unpinText": "Відкріпити",
|
||||
"pinnedCodeMessage": "{code} закріплено",
|
||||
"unpinnedCodeMessage": "{code} відкріплено",
|
||||
"tags": "Мітки",
|
||||
"createNewTag": "Створити нову мітку",
|
||||
"tag": "Мітка",
|
||||
"create": "Створити",
|
||||
"editTag": "Редагувати мітку",
|
||||
"deleteTagTitle": "Видалити мітку?",
|
||||
"deleteTagMessage": "Ви впевнені, що хочете видалити цю мітку? Ця дія є незворотною.",
|
||||
"somethingWentWrongParsingCode": "Не вдалося обробити цю кількість кодів: {x}.",
|
||||
"updateNotAvailable": "Оновлення недоступне",
|
||||
"viewRawCodes": "Переглянути коди як є",
|
||||
"rawCodes": "Коди як є",
|
||||
"rawCodeData": "Дані кодів як є",
|
||||
"appLock": "Блокування",
|
||||
"noSystemLockFound": "Не знайдено системного блокування",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Для увімкнення блокування програми, будь ласка, налаштуйте пароль пристрою або блокування екрана в системних налаштуваннях.",
|
||||
"autoLock": "Автоблокування",
|
||||
"immediately": "Негайно",
|
||||
"reEnterPassword": "Введіть пароль ще раз",
|
||||
"reEnterPin": "Введіть PIN-код ще раз",
|
||||
"next": "Наступний",
|
||||
"tooManyIncorrectAttempts": "Завелика кількість невірних спроб",
|
||||
"tapToUnlock": "Доторкніться, щоб розблокувати",
|
||||
"setNewPassword": "Встановити новий пароль",
|
||||
"deviceLock": "Блокування пристрою",
|
||||
"hideContent": "Приховати зміст",
|
||||
"hideContentDescriptionAndroid": "Приховує зміст програми в перемикачі програм і вимикає скриншоти",
|
||||
"hideContentDescriptioniOS": "Приховує зміст в перемикачі додатків",
|
||||
"autoLockFeatureDescription": "Час, через який додаток буде заблоковано після розміщення у фоновому режимі",
|
||||
"appLockDescription": "Виберіть між типовим екраном блокування вашого пристрою та власним екраном блокування з PIN-кодом або паролем.",
|
||||
"pinLock": "PIN-код",
|
||||
"enterPin": "Введіть PIN-код",
|
||||
"setNewPin": "Встановити новий PIN-код",
|
||||
"importFailureDescNew": "Не вдалося обробити вибраний файл."
|
||||
}
|
||||
@@ -442,5 +442,29 @@
|
||||
"deleteTagTitle": "要删除标签吗?",
|
||||
"deleteTagMessage": "您确定要删除此标签吗?此操作是不可逆的。",
|
||||
"somethingWentWrongParsingCode": "我们无法解析 {x} 代码。",
|
||||
"updateNotAvailable": "更新不可用"
|
||||
"updateNotAvailable": "更新不可用",
|
||||
"viewRawCodes": "查看原始代码",
|
||||
"rawCodes": "原始代码",
|
||||
"rawCodeData": "原始代码数据",
|
||||
"appLock": "应用锁",
|
||||
"noSystemLockFound": "未找到系统锁",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁定。",
|
||||
"autoLock": "自动锁定",
|
||||
"immediately": "立即",
|
||||
"reEnterPassword": "再次输入密码",
|
||||
"reEnterPin": "再次输入 PIN 码",
|
||||
"next": "下一步",
|
||||
"tooManyIncorrectAttempts": "错误的尝试次数过多",
|
||||
"tapToUnlock": "点击解锁",
|
||||
"setNewPassword": "设置新密码",
|
||||
"deviceLock": "设备锁",
|
||||
"hideContent": "隐藏内容",
|
||||
"hideContentDescriptionAndroid": "在应用切换器中隐藏应用内容并禁用屏幕截图",
|
||||
"hideContentDescriptioniOS": "在应用切换器中隐藏应用内容",
|
||||
"autoLockFeatureDescription": "应用程序进入后台后锁定的时间",
|
||||
"appLockDescription": "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。",
|
||||
"pinLock": "Pin 锁定",
|
||||
"enterPin": "输入 PIN 码",
|
||||
"setNewPin": "设置新 PIN 码",
|
||||
"importFailureDescNew": "无法解析选定的文件。"
|
||||
}
|
||||
@@ -23,17 +23,15 @@ import 'package:ente_auth/store/code_store.dart';
|
||||
import 'package:ente_auth/ui/tools/app_lock.dart';
|
||||
import 'package:ente_auth/ui/tools/lock_screen.dart';
|
||||
import 'package:ente_auth/ui/utils/icon_utils.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:ente_auth/utils/platform_util.dart';
|
||||
import 'package:ente_auth/utils/window_protocol_handler.dart';
|
||||
import 'package:ente_crypto_dart/ente_crypto_dart.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import "package:flutter/material.dart";
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_displaymode/flutter_displaymode.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:privacy_screen/privacy_screen.dart';
|
||||
import 'package:tray_manager/tray_manager.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
|
||||
@@ -85,7 +83,6 @@ void main() async {
|
||||
}
|
||||
|
||||
await _runInForeground();
|
||||
await _setupPrivacyScreen();
|
||||
if (Platform.isAndroid) {
|
||||
FlutterDisplayMode.setHighRefreshRate().ignore();
|
||||
}
|
||||
@@ -115,7 +112,7 @@ Future<void> _runInForeground() async {
|
||||
AppLock(
|
||||
builder: (args) => App(locale: locale),
|
||||
lockScreen: const LockScreen(),
|
||||
enabled: Configuration.instance.shouldShowLockScreen(),
|
||||
enabled: await Configuration.instance.shouldShowLockScreen(),
|
||||
locale: locale,
|
||||
lightTheme: lightThemeData,
|
||||
darkTheme: darkThemeData,
|
||||
@@ -174,24 +171,5 @@ Future<void> _init(bool bool, {String? via}) async {
|
||||
await NotificationService.instance.init();
|
||||
await UpdateService.instance.init();
|
||||
await IconUtils.instance.init();
|
||||
}
|
||||
|
||||
Future<void> _setupPrivacyScreen() async {
|
||||
if (!PlatformUtil.isMobile() || kDebugMode) return;
|
||||
final brightness =
|
||||
SchedulerBinding.instance.platformDispatcher.platformBrightness;
|
||||
bool isInDarkMode = brightness == Brightness.dark;
|
||||
await PrivacyScreen.instance.enable(
|
||||
iosOptions: const PrivacyIosOptions(
|
||||
enablePrivacy: true,
|
||||
privacyImageName: "LaunchImage",
|
||||
lockTrigger: IosLockTrigger.didEnterBackground,
|
||||
),
|
||||
androidOptions: const PrivacyAndroidOptions(
|
||||
enableSecure: true,
|
||||
),
|
||||
backgroundColor: isInDarkMode ? Colors.black : Colors.white,
|
||||
blurEffect:
|
||||
isInDarkMode ? PrivacyBlurEffect.dark : PrivacyBlurEffect.extraLight,
|
||||
);
|
||||
await LockScreenSettings.instance.init();
|
||||
}
|
||||
|
||||
@@ -219,9 +219,10 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
||||
}
|
||||
|
||||
Future<void> _optForOfflineMode() async {
|
||||
bool canCheckBio = Platform.isMacOS || Platform.isLinux
|
||||
? true
|
||||
: await LocalAuthentication().canCheckBiometrics;
|
||||
bool canCheckBio = Platform.isMacOS ||
|
||||
Platform.isLinux ||
|
||||
Platform.isWindows ||
|
||||
await LocalAuthentication().canCheckBiometrics;
|
||||
if (!canCheckBio) {
|
||||
showToast(
|
||||
context,
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/ui/settings/lock_screen/lock_screen_password.dart';
|
||||
import 'package:ente_auth/ui/settings/lock_screen/lock_screen_pin.dart';
|
||||
import 'package:ente_auth/ui/tools/app_lock.dart';
|
||||
import 'package:ente_auth/utils/auth_util.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:ente_auth/utils/toast_util.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@@ -21,11 +24,16 @@ class LocalAuthenticationService {
|
||||
BuildContext context,
|
||||
String infoMessage,
|
||||
) async {
|
||||
if (await _isLocalAuthSupportedOnDevice()) {
|
||||
if (await isLocalAuthSupportedOnDevice() ||
|
||||
LockScreenSettings.instance.getIsAppLockSet()) {
|
||||
AppLock.of(context)!.setEnabled(false);
|
||||
final result = await requestAuthentication(context, infoMessage);
|
||||
final result = await requestAuthentication(
|
||||
context,
|
||||
infoMessage,
|
||||
isAuthenticatingForInAppChange: true,
|
||||
);
|
||||
AppLock.of(context)!.setEnabled(
|
||||
Configuration.instance.shouldShowLockScreen(),
|
||||
await Configuration.instance.shouldShowLockScreen(),
|
||||
);
|
||||
if (!result) {
|
||||
showToast(context, infoMessage);
|
||||
@@ -37,6 +45,50 @@ class LocalAuthenticationService {
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<bool> requestEnteAuthForLockScreen(
|
||||
BuildContext context,
|
||||
String? savedPin,
|
||||
String? savedPassword, {
|
||||
bool isAuthenticatingOnAppLaunch = false,
|
||||
bool isAuthenticatingForInAppChange = false,
|
||||
}) async {
|
||||
if (savedPassword != null) {
|
||||
final result = await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return LockScreenPassword(
|
||||
isChangingLockScreenSettings: true,
|
||||
isAuthenticatingForInAppChange: isAuthenticatingForInAppChange,
|
||||
isAuthenticatingOnAppLaunch: isAuthenticatingOnAppLaunch,
|
||||
authPass: savedPassword,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
if (result) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (savedPin != null) {
|
||||
final result = await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return LockScreenPin(
|
||||
isChangingLockScreenSettings: true,
|
||||
isAuthenticatingForInAppChange: isAuthenticatingForInAppChange,
|
||||
isAuthenticatingOnAppLaunch: isAuthenticatingOnAppLaunch,
|
||||
authPin: savedPin,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
if (result) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Future<bool> requestLocalAuthForLockScreen(
|
||||
BuildContext context,
|
||||
bool shouldEnableLockScreen,
|
||||
@@ -44,7 +96,7 @@ class LocalAuthenticationService {
|
||||
String errorDialogContent, [
|
||||
String errorDialogTitle = "",
|
||||
]) async {
|
||||
if (await _isLocalAuthSupportedOnDevice()) {
|
||||
if (await isLocalAuthSupportedOnDevice()) {
|
||||
AppLock.of(context)!.disable();
|
||||
final result = await requestAuthentication(
|
||||
context,
|
||||
@@ -53,11 +105,11 @@ class LocalAuthenticationService {
|
||||
if (result) {
|
||||
AppLock.of(context)!.setEnabled(shouldEnableLockScreen);
|
||||
await Configuration.instance
|
||||
.setShouldShowLockScreen(shouldEnableLockScreen);
|
||||
.setSystemLockScreen(shouldEnableLockScreen);
|
||||
return true;
|
||||
} else {
|
||||
AppLock.of(context)!
|
||||
.setEnabled(Configuration.instance.shouldShowLockScreen());
|
||||
.setEnabled(await Configuration.instance.shouldShowLockScreen());
|
||||
}
|
||||
} else {
|
||||
// ignore: unawaited_futures
|
||||
@@ -70,9 +122,9 @@ class LocalAuthenticationService {
|
||||
return false;
|
||||
}
|
||||
|
||||
Future<bool> _isLocalAuthSupportedOnDevice() async {
|
||||
Future<bool> isLocalAuthSupportedOnDevice() async {
|
||||
try {
|
||||
return Platform.isMacOS || Platform.isLinux
|
||||
return Platform.isLinux
|
||||
? await FlutterLocalAuthentication().canAuthenticate()
|
||||
: await LocalAuthentication().isDeviceSupported();
|
||||
} on MissingPluginException {
|
||||
|
||||
@@ -182,7 +182,6 @@ class _LoginPasswordVerificationPageState
|
||||
await sendLogs(
|
||||
context,
|
||||
context.l10n.contactSupport,
|
||||
"auth@ente.io",
|
||||
postShare: () {},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -140,7 +140,6 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||
await sendLogs(
|
||||
context,
|
||||
context.l10n.contactSupport,
|
||||
"support@ente.io",
|
||||
postShare: () {},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import 'package:ente_auth/theme/ente_theme.dart';
|
||||
import 'package:ente_auth/ui/common/gradient_button.dart';
|
||||
import 'package:ente_auth/ui/linear_progress_widget.dart';
|
||||
import 'package:ente_auth/ui/tools/debug/raw_codes_viewer.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/email_util.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class CodeErrorWidget extends StatelessWidget {
|
||||
@@ -114,12 +114,7 @@ class CodeErrorWidget extends StatelessWidget {
|
||||
text: context.l10n.contactSupport,
|
||||
fontSize: 10,
|
||||
onTap: () async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.contactSupport,
|
||||
context.l10n
|
||||
.contactSupportViaEmailMessage("support@ente.io"),
|
||||
);
|
||||
await openSupportPage(null, null);
|
||||
},
|
||||
borderWidth: 0.6,
|
||||
borderRadius: 6,
|
||||
|
||||
@@ -22,7 +22,6 @@ PopupMenuButton<dynamic> reportBugPopupMenu(BuildContext context) {
|
||||
await sendLogs(
|
||||
context,
|
||||
"Contact support",
|
||||
"support@ente.io",
|
||||
postShare: () {},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:ente_auth/ui/components/separators.dart';
|
||||
import 'package:ente_auth/utils/debouncer.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
class TextInputWidget extends StatefulWidget {
|
||||
final String? label;
|
||||
@@ -58,6 +59,7 @@ class TextInputWidget extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _TextInputWidgetState extends State<TextInputWidget> {
|
||||
final _logger = Logger("TextInputWidget");
|
||||
ExecutionState executionState = ExecutionState.idle;
|
||||
final _textController = TextEditingController();
|
||||
final _debouncer = Debouncer(const Duration(milliseconds: 300));
|
||||
@@ -66,7 +68,7 @@ class _TextInputWidgetState extends State<TextInputWidget> {
|
||||
///This is to pass if the TextInputWidget is in a dialog and an error is
|
||||
///thrown in executing onSubmit by passing it as arg in Navigator.pop()
|
||||
Exception? _exception;
|
||||
|
||||
bool _incorrectPassword = false;
|
||||
@override
|
||||
void initState() {
|
||||
widget.submitNotifier?.addListener(_onSubmit);
|
||||
@@ -138,7 +140,11 @@ class _TextInputWidgetState extends State<TextInputWidget> {
|
||||
borderSide: BorderSide.none,
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(color: colorScheme.strokeFaint),
|
||||
borderSide: BorderSide(
|
||||
color: _incorrectPassword
|
||||
? const Color.fromRGBO(245, 42, 42, 1)
|
||||
: colorScheme.strokeFaint,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
suffixIcon: Padding(
|
||||
@@ -233,6 +239,10 @@ class _TextInputWidgetState extends State<TextInputWidget> {
|
||||
executionState = ExecutionState.error;
|
||||
_debouncer.cancelDebounce();
|
||||
_exception = e as Exception;
|
||||
if (e.toString().contains("Incorrect password")) {
|
||||
_logger.warning("Incorrect password");
|
||||
_surfaceWrongPasswordState();
|
||||
}
|
||||
if (!widget.popNavAfterSubmission) {
|
||||
rethrow;
|
||||
}
|
||||
@@ -306,6 +316,20 @@ class _TextInputWidgetState extends State<TextInputWidget> {
|
||||
void _popNavigatorStack(BuildContext context, {Exception? e}) {
|
||||
Navigator.of(context).canPop() ? Navigator.of(context).pop(e) : null;
|
||||
}
|
||||
|
||||
void _surfaceWrongPasswordState() {
|
||||
setState(() {
|
||||
_incorrectPassword = true;
|
||||
HapticFeedback.vibrate();
|
||||
Future.delayed(const Duration(seconds: 1), () {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_incorrectPassword = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//todo: Add clear and custom icon for suffic icon
|
||||
|
||||
@@ -77,7 +77,7 @@ Future<void> _pickAegisJsonFile(BuildContext context) async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.sorry,
|
||||
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
|
||||
"${context.l10n.importFailureDescNew}\n Error: ${e.toString()}",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ Future<void> _pickBitwardenJsonFile(BuildContext context) async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.sorry,
|
||||
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
|
||||
"${context.l10n.importFailureDescNew}\n Error: ${e.toString()}",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ Future<void> _pickEnteJsonFile(BuildContext context) async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.sorry,
|
||||
context.l10n.importFailureDesc,
|
||||
context.l10n.importFailureDescNew,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ Future<void> _pickLastpassJsonFile(BuildContext context) async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.sorry,
|
||||
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
|
||||
"${context.l10n.importFailureDescNew}\n Error: ${e.toString()}",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ Future<void> _pickImportFile(BuildContext context) async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.sorry,
|
||||
context.l10n.importFailureDesc,
|
||||
context.l10n.importFailureDescNew,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ Future<void> _pickRaivoJsonFile(BuildContext context) async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.sorry,
|
||||
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
|
||||
"${context.l10n.importFailureDescNew}\n Error: ${e.toString()}",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ Future<void> _pick2FasFile(BuildContext context) async {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.sorry,
|
||||
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
|
||||
"${context.l10n.importFailureDescNew}\n Error: ${e.toString()}",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
203
auth/lib/ui/settings/lock_screen/custom_pin_keypad.dart
Normal file
@@ -0,0 +1,203 @@
|
||||
import "package:ente_auth/theme/ente_theme.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class CustomPinKeypad extends StatelessWidget {
|
||||
final TextEditingController controller;
|
||||
const CustomPinKeypad({required this.controller, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(2),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Container(
|
||||
color: getEnteColorScheme(context).strokeFainter,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
_Button(
|
||||
text: '',
|
||||
number: '1',
|
||||
onTap: () {
|
||||
_onKeyTap('1');
|
||||
},
|
||||
),
|
||||
_Button(
|
||||
text: "ABC",
|
||||
number: '2',
|
||||
onTap: () {
|
||||
_onKeyTap('2');
|
||||
},
|
||||
),
|
||||
_Button(
|
||||
text: "DEF",
|
||||
number: '3',
|
||||
onTap: () {
|
||||
_onKeyTap('3');
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
_Button(
|
||||
number: '4',
|
||||
text: "GHI",
|
||||
onTap: () {
|
||||
_onKeyTap('4');
|
||||
},
|
||||
),
|
||||
_Button(
|
||||
number: '5',
|
||||
text: 'JKL',
|
||||
onTap: () {
|
||||
_onKeyTap('5');
|
||||
},
|
||||
),
|
||||
_Button(
|
||||
number: '6',
|
||||
text: 'MNO',
|
||||
onTap: () {
|
||||
_onKeyTap('6');
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
_Button(
|
||||
number: '7',
|
||||
text: 'PQRS',
|
||||
onTap: () {
|
||||
_onKeyTap('7');
|
||||
},
|
||||
),
|
||||
_Button(
|
||||
number: '8',
|
||||
text: 'TUV',
|
||||
onTap: () {
|
||||
_onKeyTap('8');
|
||||
},
|
||||
),
|
||||
_Button(
|
||||
number: '9',
|
||||
text: 'WXYZ',
|
||||
onTap: () {
|
||||
_onKeyTap('9');
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
const _Button(
|
||||
number: '',
|
||||
text: '',
|
||||
muteButton: true,
|
||||
onTap: null,
|
||||
),
|
||||
_Button(
|
||||
number: '0',
|
||||
text: '',
|
||||
onTap: () {
|
||||
_onKeyTap('0');
|
||||
},
|
||||
),
|
||||
_Button(
|
||||
number: '',
|
||||
text: '',
|
||||
icon: const Icon(Icons.backspace_outlined),
|
||||
onTap: () {
|
||||
_onBackspace();
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _onKeyTap(String number) {
|
||||
controller.text += number;
|
||||
return;
|
||||
}
|
||||
|
||||
void _onBackspace() {
|
||||
if (controller.text.isNotEmpty) {
|
||||
controller.text =
|
||||
controller.text.substring(0, controller.text.length - 1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
class _Button extends StatelessWidget {
|
||||
final String number;
|
||||
final String text;
|
||||
final VoidCallback? onTap;
|
||||
final bool muteButton;
|
||||
final Widget? icon;
|
||||
const _Button({
|
||||
required this.number,
|
||||
required this.text,
|
||||
this.muteButton = false,
|
||||
required this.onTap,
|
||||
this.icon,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorScheme = getEnteColorScheme(context);
|
||||
final textTheme = getEnteTextTheme(context);
|
||||
return Expanded(
|
||||
child: GestureDetector(
|
||||
onTap: onTap,
|
||||
child: Container(
|
||||
margin: const EdgeInsets.all(4),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.rectangle,
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
color: muteButton
|
||||
? colorScheme.fillFaintPressed
|
||||
: icon == null
|
||||
? colorScheme.backgroundElevated2
|
||||
: null,
|
||||
),
|
||||
child: Center(
|
||||
child: muteButton
|
||||
? const SizedBox.shrink()
|
||||
: icon != null
|
||||
? Container(
|
||||
child: icon,
|
||||
)
|
||||
: Container(
|
||||
padding: const EdgeInsets.all(4),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
number,
|
||||
style: textTheme.h3,
|
||||
),
|
||||
Text(
|
||||
text,
|
||||
style: textTheme.tinyBold,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
143
auth/lib/ui/settings/lock_screen/lock_screen_auto_lock.dart
Normal file
@@ -0,0 +1,143 @@
|
||||
import 'package:ente_auth/l10n/l10n.dart';
|
||||
import 'package:ente_auth/theme/ente_theme.dart';
|
||||
import 'package:ente_auth/ui/components/captioned_text_widget.dart';
|
||||
import 'package:ente_auth/ui/components/divider_widget.dart';
|
||||
import 'package:ente_auth/ui/components/menu_item_widget.dart';
|
||||
import 'package:ente_auth/ui/components/separators.dart';
|
||||
import 'package:ente_auth/ui/components/title_bar_title_widget.dart';
|
||||
import 'package:ente_auth/ui/components/title_bar_widget.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class LockScreenAutoLock extends StatefulWidget {
|
||||
const LockScreenAutoLock({super.key});
|
||||
|
||||
@override
|
||||
State<LockScreenAutoLock> createState() => _LockScreenAutoLockState();
|
||||
}
|
||||
|
||||
class _LockScreenAutoLockState extends State<LockScreenAutoLock> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: CustomScrollView(
|
||||
primary: false,
|
||||
slivers: <Widget>[
|
||||
TitleBarWidget(
|
||||
flexibleSpaceTitle: TitleBarTitleWidget(
|
||||
title: context.l10n.autoLock,
|
||||
),
|
||||
),
|
||||
SliverList(
|
||||
delegate: SliverChildBuilderDelegate(
|
||||
(context, index) {
|
||||
return const Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 20,
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.all(Radius.circular(8)),
|
||||
child: AutoLockItems(),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
childCount: 1,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class AutoLockItems extends StatefulWidget {
|
||||
const AutoLockItems({super.key});
|
||||
|
||||
@override
|
||||
State<AutoLockItems> createState() => _AutoLockItemsState();
|
||||
}
|
||||
|
||||
class _AutoLockItemsState extends State<AutoLockItems> {
|
||||
final autoLockDurations = LockScreenSettings.instance.autoLockDurations;
|
||||
List<Widget> items = [];
|
||||
Duration currentAutoLockTime = const Duration(seconds: 5);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
for (Duration autoLockDuration in autoLockDurations) {
|
||||
if (autoLockDuration.inMilliseconds ==
|
||||
LockScreenSettings.instance.getAutoLockTime()) {
|
||||
currentAutoLockTime = autoLockDuration;
|
||||
break;
|
||||
}
|
||||
}
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
items.clear();
|
||||
for (Duration autoLockDuration in autoLockDurations) {
|
||||
items.add(
|
||||
_menuItemForPicker(autoLockDuration),
|
||||
);
|
||||
}
|
||||
items = addSeparators(
|
||||
items,
|
||||
DividerWidget(
|
||||
dividerType: DividerType.menuNoIcon,
|
||||
bgColor: getEnteColorScheme(context).fillFaint,
|
||||
),
|
||||
);
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: items,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _menuItemForPicker(Duration autoLockTime) {
|
||||
return MenuItemWidget(
|
||||
key: ValueKey(autoLockTime),
|
||||
menuItemColor: getEnteColorScheme(context).fillFaint,
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: _formatTime(autoLockTime),
|
||||
),
|
||||
trailingIcon: currentAutoLockTime == autoLockTime ? Icons.check : null,
|
||||
alignCaptionedTextToLeft: true,
|
||||
isTopBorderRadiusRemoved: true,
|
||||
isBottomBorderRadiusRemoved: true,
|
||||
showOnlyLoadingState: true,
|
||||
onTap: () async {
|
||||
await LockScreenSettings.instance.setAutoLockTime(autoLockTime).then(
|
||||
(value) => {
|
||||
setState(() {
|
||||
currentAutoLockTime = autoLockTime;
|
||||
}),
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
String _formatTime(Duration duration) {
|
||||
if (duration.inHours != 0) {
|
||||
return "${duration.inHours}hr";
|
||||
} else if (duration.inMinutes != 0) {
|
||||
return "${duration.inMinutes}m";
|
||||
} else if (duration.inSeconds != 0) {
|
||||
return "${duration.inSeconds}s";
|
||||
} else {
|
||||
return context.l10n.immediately;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
import "package:ente_auth/l10n/l10n.dart";
|
||||
import "package:ente_auth/theme/ente_theme.dart";
|
||||
import "package:ente_auth/ui/common/dynamic_fab.dart";
|
||||
import "package:ente_auth/ui/components/buttons/icon_button_widget.dart";
|
||||
import "package:ente_auth/ui/components/text_input_widget.dart";
|
||||
import "package:ente_auth/utils/lock_screen_settings.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter/services.dart";
|
||||
|
||||
class LockScreenConfirmPassword extends StatefulWidget {
|
||||
const LockScreenConfirmPassword({
|
||||
super.key,
|
||||
required this.password,
|
||||
});
|
||||
final String password;
|
||||
|
||||
@override
|
||||
State<LockScreenConfirmPassword> createState() =>
|
||||
_LockScreenConfirmPasswordState();
|
||||
}
|
||||
|
||||
class _LockScreenConfirmPasswordState extends State<LockScreenConfirmPassword> {
|
||||
final _confirmPasswordController = TextEditingController(text: null);
|
||||
final LockScreenSettings _lockscreenSetting = LockScreenSettings.instance;
|
||||
final _focusNode = FocusNode();
|
||||
final _isFormValid = ValueNotifier<bool>(false);
|
||||
final _submitNotifier = ValueNotifier(false);
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
_focusNode.requestFocus();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_submitNotifier.dispose();
|
||||
_focusNode.dispose();
|
||||
_isFormValid.dispose();
|
||||
_confirmPasswordController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future<void> _confirmPasswordMatch() async {
|
||||
if (widget.password == _confirmPasswordController.text) {
|
||||
await _lockscreenSetting.setPassword(_confirmPasswordController.text);
|
||||
|
||||
Navigator.of(context).pop(true);
|
||||
Navigator.of(context).pop(true);
|
||||
return;
|
||||
}
|
||||
await HapticFeedback.vibrate();
|
||||
throw Exception("Incorrect password");
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorTheme = getEnteColorScheme(context);
|
||||
final textTheme = getEnteTextTheme(context);
|
||||
final isKeypadOpen = MediaQuery.viewInsetsOf(context).bottom > 100;
|
||||
|
||||
FloatingActionButtonLocation? fabLocation() {
|
||||
if (isKeypadOpen) {
|
||||
return null;
|
||||
} else {
|
||||
return FloatingActionButtonLocation.centerFloat;
|
||||
}
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: isKeypadOpen,
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
FocusScope.of(context).unfocus();
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.arrow_back,
|
||||
color: colorTheme.textBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
floatingActionButton: ValueListenableBuilder<bool>(
|
||||
valueListenable: _isFormValid,
|
||||
builder: (context, isFormValid, child) {
|
||||
return DynamicFAB(
|
||||
isKeypadOpen: isKeypadOpen,
|
||||
buttonText: context.l10n.confirm,
|
||||
isFormValid: isFormValid,
|
||||
onPressedFunction: () async {
|
||||
_submitNotifier.value = !_submitNotifier.value;
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
floatingActionButtonLocation: fabLocation(),
|
||||
floatingActionButtonAnimator: NoScalingAnimation(),
|
||||
body: SingleChildScrollView(
|
||||
child: Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 120,
|
||||
width: 120,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Container(
|
||||
width: 82,
|
||||
height: 82,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Colors.grey.shade500.withOpacity(0.2),
|
||||
Colors.grey.shade50.withOpacity(0.1),
|
||||
Colors.grey.shade400.withOpacity(0.2),
|
||||
Colors.grey.shade300.withOpacity(0.4),
|
||||
],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(1.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: colorTheme.backgroundBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 75,
|
||||
width: 75,
|
||||
child: CircularProgressIndicator(
|
||||
color: colorTheme.fillFaintPressed,
|
||||
value: 1,
|
||||
strokeWidth: 1.5,
|
||||
),
|
||||
),
|
||||
IconButtonWidget(
|
||||
icon: Icons.lock,
|
||||
iconButtonType: IconButtonType.primary,
|
||||
iconColor: colorTheme.textBase,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Text(
|
||||
context.l10n.reEnterPassword,
|
||||
style: textTheme.bodyBold,
|
||||
),
|
||||
const Padding(padding: EdgeInsets.all(12)),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
child: TextInputWidget(
|
||||
hintText: context.l10n.confirmPassword,
|
||||
autoFocus: true,
|
||||
textCapitalization: TextCapitalization.none,
|
||||
isPasswordInput: true,
|
||||
shouldSurfaceExecutionStates: false,
|
||||
onChange: (p0) {
|
||||
_confirmPasswordController.text = p0;
|
||||
_isFormValid.value =
|
||||
_confirmPasswordController.text.isNotEmpty;
|
||||
},
|
||||
onSubmit: (p0) {
|
||||
return _confirmPasswordMatch();
|
||||
},
|
||||
submitNotifier: _submitNotifier,
|
||||
),
|
||||
),
|
||||
const Padding(padding: EdgeInsets.all(12)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
211
auth/lib/ui/settings/lock_screen/lock_screen_confirm_pin.dart
Normal file
@@ -0,0 +1,211 @@
|
||||
import "dart:io";
|
||||
|
||||
import "package:ente_auth/l10n/l10n.dart";
|
||||
import "package:ente_auth/theme/ente_theme.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/custom_pin_keypad.dart";
|
||||
import "package:ente_auth/utils/lock_screen_settings.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter/services.dart";
|
||||
import "package:pinput/pinput.dart";
|
||||
|
||||
class LockScreenConfirmPin extends StatefulWidget {
|
||||
const LockScreenConfirmPin({super.key, required this.pin});
|
||||
final String pin;
|
||||
@override
|
||||
State<LockScreenConfirmPin> createState() => _LockScreenConfirmPinState();
|
||||
}
|
||||
|
||||
class _LockScreenConfirmPinState extends State<LockScreenConfirmPin> {
|
||||
final _confirmPinController = TextEditingController(text: null);
|
||||
bool isConfirmPinValid = false;
|
||||
bool isPlatformDesktop = false;
|
||||
final LockScreenSettings _lockscreenSetting = LockScreenSettings.instance;
|
||||
final _pinPutDecoration = PinTheme(
|
||||
height: 48,
|
||||
width: 48,
|
||||
padding: const EdgeInsets.only(top: 6.0),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: const Color.fromRGBO(45, 194, 98, 1.0)),
|
||||
borderRadius: BorderRadius.circular(15.0),
|
||||
),
|
||||
);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
isPlatformDesktop =
|
||||
Platform.isLinux || Platform.isMacOS || Platform.isWindows;
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_confirmPinController.dispose();
|
||||
}
|
||||
|
||||
Future<void> _confirmPinMatch() async {
|
||||
if (widget.pin == _confirmPinController.text) {
|
||||
await _lockscreenSetting.setPin(_confirmPinController.text);
|
||||
|
||||
Navigator.of(context).pop(true);
|
||||
Navigator.of(context).pop(true);
|
||||
return;
|
||||
}
|
||||
setState(() {
|
||||
isConfirmPinValid = true;
|
||||
});
|
||||
await HapticFeedback.vibrate();
|
||||
await Future.delayed(const Duration(milliseconds: 75));
|
||||
_confirmPinController.clear();
|
||||
setState(() {
|
||||
isConfirmPinValid = false;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorTheme = getEnteColorScheme(context);
|
||||
final textTheme = getEnteTextTheme(context);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(false);
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.arrow_back,
|
||||
color: colorTheme.textBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
floatingActionButton: isPlatformDesktop
|
||||
? null
|
||||
: CustomPinKeypad(controller: _confirmPinController),
|
||||
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
|
||||
body: SingleChildScrollView(
|
||||
child: _getBody(colorTheme, textTheme),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getBody(colorTheme, textTheme) {
|
||||
return Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 120,
|
||||
width: 120,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Container(
|
||||
width: 82,
|
||||
height: 82,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Colors.grey.shade500.withOpacity(0.2),
|
||||
Colors.grey.shade50.withOpacity(0.1),
|
||||
Colors.grey.shade400.withOpacity(0.2),
|
||||
Colors.grey.shade300.withOpacity(0.4),
|
||||
],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(1.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: colorTheme.backgroundBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 75,
|
||||
width: 75,
|
||||
child: ValueListenableBuilder(
|
||||
valueListenable: _confirmPinController,
|
||||
builder: (context, value, child) {
|
||||
return TweenAnimationBuilder<double>(
|
||||
tween: Tween<double>(
|
||||
begin: 0,
|
||||
end: _confirmPinController.text.length / 4,
|
||||
),
|
||||
curve: Curves.ease,
|
||||
duration: const Duration(milliseconds: 250),
|
||||
builder: (context, value, _) =>
|
||||
CircularProgressIndicator(
|
||||
backgroundColor: colorTheme.fillFaintPressed,
|
||||
value: value,
|
||||
color: colorTheme.primary400,
|
||||
strokeWidth: 1.5,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Icon(
|
||||
Icons.lock,
|
||||
color: colorTheme.textBase,
|
||||
size: 30,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Text(
|
||||
context.l10n.reEnterPin,
|
||||
style: textTheme.bodyBold,
|
||||
),
|
||||
const Padding(padding: EdgeInsets.all(12)),
|
||||
Pinput(
|
||||
length: 4,
|
||||
showCursor: false,
|
||||
useNativeKeyboard: isPlatformDesktop,
|
||||
autofocus: true,
|
||||
controller: _confirmPinController,
|
||||
defaultPinTheme: _pinPutDecoration,
|
||||
submittedPinTheme: _pinPutDecoration.copyWith(
|
||||
textStyle: textTheme.h3Bold,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
border: Border.all(
|
||||
color: colorTheme.fillBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
followingPinTheme: _pinPutDecoration.copyWith(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
border: Border.all(
|
||||
color: colorTheme.fillMuted,
|
||||
),
|
||||
),
|
||||
),
|
||||
focusedPinTheme: _pinPutDecoration,
|
||||
errorPinTheme: _pinPutDecoration.copyWith(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
border: Border.all(
|
||||
color: colorTheme.warning400,
|
||||
),
|
||||
),
|
||||
),
|
||||
errorText: '',
|
||||
obscureText: true,
|
||||
obscuringCharacter: '*',
|
||||
forceErrorState: isConfirmPinValid,
|
||||
onCompleted: (value) async {
|
||||
await _confirmPinMatch();
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
389
auth/lib/ui/settings/lock_screen/lock_screen_options.dart
Normal file
@@ -0,0 +1,389 @@
|
||||
import "dart:async";
|
||||
import "dart:io";
|
||||
|
||||
import "package:ente_auth/core/configuration.dart";
|
||||
import "package:ente_auth/l10n/l10n.dart";
|
||||
import "package:ente_auth/services/local_authentication_service.dart";
|
||||
import "package:ente_auth/theme/ente_theme.dart";
|
||||
import "package:ente_auth/ui/components/captioned_text_widget.dart";
|
||||
import "package:ente_auth/ui/components/divider_widget.dart";
|
||||
import "package:ente_auth/ui/components/menu_item_widget.dart";
|
||||
import "package:ente_auth/ui/components/title_bar_title_widget.dart";
|
||||
import "package:ente_auth/ui/components/title_bar_widget.dart";
|
||||
import "package:ente_auth/ui/components/toggle_switch_widget.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/lock_screen_auto_lock.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/lock_screen_password.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/lock_screen_pin.dart";
|
||||
import "package:ente_auth/ui/tools/app_lock.dart";
|
||||
import "package:ente_auth/utils/dialog_util.dart";
|
||||
import "package:ente_auth/utils/lock_screen_settings.dart";
|
||||
import "package:ente_auth/utils/navigation_util.dart";
|
||||
import "package:ente_auth/utils/platform_util.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class LockScreenOptions extends StatefulWidget {
|
||||
const LockScreenOptions({super.key});
|
||||
|
||||
@override
|
||||
State<LockScreenOptions> createState() => _LockScreenOptionsState();
|
||||
}
|
||||
|
||||
class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
final Configuration _configuration = Configuration.instance;
|
||||
final LockScreenSettings _lockscreenSetting = LockScreenSettings.instance;
|
||||
late bool appLock = false;
|
||||
bool isPinEnabled = false;
|
||||
bool isPasswordEnabled = false;
|
||||
late int autoLockTimeInMilliseconds;
|
||||
late bool hideAppContent;
|
||||
late bool isSystemLockEnabled = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
hideAppContent = _lockscreenSetting.getShouldHideAppContent();
|
||||
autoLockTimeInMilliseconds = _lockscreenSetting.getAutoLockTime();
|
||||
_initializeSettings();
|
||||
appLock = _lockscreenSetting.getIsAppLockSet();
|
||||
}
|
||||
|
||||
Future<void> _initializeSettings() async {
|
||||
final bool passwordEnabled = await _lockscreenSetting.isPasswordSet();
|
||||
final bool pinEnabled = await _lockscreenSetting.isPinSet();
|
||||
final bool shouldHideAppContent =
|
||||
_lockscreenSetting.getShouldHideAppContent();
|
||||
final bool systemLockEnabled = _configuration.shouldShowSystemLockScreen();
|
||||
setState(() {
|
||||
isPasswordEnabled = passwordEnabled;
|
||||
isPinEnabled = pinEnabled;
|
||||
hideAppContent = shouldHideAppContent;
|
||||
isSystemLockEnabled = systemLockEnabled;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _deviceLock() async {
|
||||
if (await LocalAuthenticationService.instance
|
||||
.isLocalAuthSupportedOnDevice()) {
|
||||
await _lockscreenSetting.removePinAndPassword();
|
||||
await _configuration.setSystemLockScreen(!isSystemLockEnabled);
|
||||
} else {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.noSystemLockFound,
|
||||
context.l10n.toEnableAppLockPleaseSetupDevicePasscodeOrScreen,
|
||||
);
|
||||
}
|
||||
await _initializeSettings();
|
||||
}
|
||||
|
||||
Future<void> _pinLock() async {
|
||||
final bool result = await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return const LockScreenPin();
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
if (result) {
|
||||
await _configuration.setSystemLockScreen(false);
|
||||
await _lockscreenSetting.setAppLockEnabled(true);
|
||||
setState(() {
|
||||
appLock = _lockscreenSetting.getIsAppLockSet();
|
||||
});
|
||||
}
|
||||
await _initializeSettings();
|
||||
}
|
||||
|
||||
Future<void> _passwordLock() async {
|
||||
final bool result = await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return const LockScreenPassword();
|
||||
},
|
||||
),
|
||||
);
|
||||
if (result) {
|
||||
await _configuration.setSystemLockScreen(false);
|
||||
setState(() {
|
||||
appLock = _lockscreenSetting.getIsAppLockSet();
|
||||
});
|
||||
}
|
||||
await _initializeSettings();
|
||||
}
|
||||
|
||||
Future<void> _onToggleSwitch() async {
|
||||
AppLock.of(context)!.setEnabled(!appLock);
|
||||
if (await LocalAuthenticationService.instance
|
||||
.isLocalAuthSupportedOnDevice()) {
|
||||
await _configuration.setSystemLockScreen(!appLock);
|
||||
await _lockscreenSetting.setAppLockEnabled(!appLock);
|
||||
} else {
|
||||
await _configuration.setSystemLockScreen(false);
|
||||
await _lockscreenSetting.setAppLockEnabled(false);
|
||||
}
|
||||
await _lockscreenSetting.removePinAndPassword();
|
||||
if (PlatformUtil.isMobile()) {
|
||||
await _lockscreenSetting.setHideAppContent(!appLock);
|
||||
setState(() {
|
||||
hideAppContent = _lockscreenSetting.getShouldHideAppContent();
|
||||
});
|
||||
}
|
||||
await _initializeSettings();
|
||||
setState(() {
|
||||
appLock = !appLock;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _onAutoLock() async {
|
||||
await routeToPage(
|
||||
context,
|
||||
const LockScreenAutoLock(),
|
||||
).then(
|
||||
(value) {
|
||||
setState(() {
|
||||
autoLockTimeInMilliseconds = _lockscreenSetting.getAutoLockTime();
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _onHideContent() async {
|
||||
setState(() {
|
||||
hideAppContent = !hideAppContent;
|
||||
});
|
||||
await _lockscreenSetting.setHideAppContent(hideAppContent);
|
||||
}
|
||||
|
||||
String _formatTime(Duration duration) {
|
||||
if (duration.inHours != 0) {
|
||||
return "in ${duration.inHours} hour${duration.inHours > 1 ? 's' : ''}";
|
||||
} else if (duration.inMinutes != 0) {
|
||||
return "in ${duration.inMinutes} minute${duration.inMinutes > 1 ? 's' : ''}";
|
||||
} else if (duration.inSeconds != 0) {
|
||||
return "in ${duration.inSeconds} second${duration.inSeconds > 1 ? 's' : ''}";
|
||||
} else {
|
||||
return context.l10n.immediately;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorTheme = getEnteColorScheme(context);
|
||||
final textTheme = getEnteTextTheme(context);
|
||||
return Scaffold(
|
||||
body: CustomScrollView(
|
||||
primary: false,
|
||||
slivers: <Widget>[
|
||||
TitleBarWidget(
|
||||
flexibleSpaceTitle: TitleBarTitleWidget(
|
||||
title: context.l10n.appLock,
|
||||
),
|
||||
),
|
||||
SliverList(
|
||||
delegate: SliverChildBuilderDelegate(
|
||||
(context, index) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 20),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: context.l10n.appLock,
|
||||
),
|
||||
alignCaptionedTextToLeft: true,
|
||||
singleBorderRadius: 8,
|
||||
menuItemColor: colorTheme.fillFaint,
|
||||
trailingWidget: ToggleSwitchWidget(
|
||||
value: () => appLock,
|
||||
onChanged: () => _onToggleSwitch(),
|
||||
),
|
||||
),
|
||||
AnimatedSwitcher(
|
||||
duration: const Duration(milliseconds: 210),
|
||||
switchInCurve: Curves.easeOut,
|
||||
switchOutCurve: Curves.easeIn,
|
||||
child: !appLock
|
||||
? Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 14,
|
||||
left: 14,
|
||||
right: 12,
|
||||
),
|
||||
child: Text(
|
||||
context.l10n.appLockDescription,
|
||||
style: textTheme.miniFaint,
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
)
|
||||
: const SizedBox(),
|
||||
),
|
||||
const Padding(
|
||||
padding: EdgeInsets.only(top: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
AnimatedSwitcher(
|
||||
duration: const Duration(milliseconds: 210),
|
||||
switchInCurve: Curves.easeOut,
|
||||
switchOutCurve: Curves.easeIn,
|
||||
child: appLock
|
||||
? Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: context.l10n.deviceLock,
|
||||
),
|
||||
surfaceExecutionStates: false,
|
||||
alignCaptionedTextToLeft: true,
|
||||
isTopBorderRadiusRemoved: false,
|
||||
isBottomBorderRadiusRemoved: true,
|
||||
menuItemColor: colorTheme.fillFaint,
|
||||
trailingIcon: isSystemLockEnabled
|
||||
? Icons.check
|
||||
: null,
|
||||
trailingIconColor: colorTheme.textBase,
|
||||
onTap: () => _deviceLock(),
|
||||
),
|
||||
DividerWidget(
|
||||
dividerType: DividerType.menuNoIcon,
|
||||
bgColor: colorTheme.fillFaint,
|
||||
),
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: context.l10n.pinLock,
|
||||
),
|
||||
surfaceExecutionStates: false,
|
||||
alignCaptionedTextToLeft: true,
|
||||
isTopBorderRadiusRemoved: true,
|
||||
isBottomBorderRadiusRemoved: true,
|
||||
menuItemColor: colorTheme.fillFaint,
|
||||
trailingIcon:
|
||||
isPinEnabled ? Icons.check : null,
|
||||
trailingIconColor: colorTheme.textBase,
|
||||
onTap: () => _pinLock(),
|
||||
),
|
||||
DividerWidget(
|
||||
dividerType: DividerType.menuNoIcon,
|
||||
bgColor: colorTheme.fillFaint,
|
||||
),
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: context.l10n.password,
|
||||
),
|
||||
surfaceExecutionStates: false,
|
||||
alignCaptionedTextToLeft: true,
|
||||
isTopBorderRadiusRemoved: true,
|
||||
isBottomBorderRadiusRemoved: false,
|
||||
menuItemColor: colorTheme.fillFaint,
|
||||
trailingIcon: isPasswordEnabled
|
||||
? Icons.check
|
||||
: null,
|
||||
trailingIconColor: colorTheme.textBase,
|
||||
onTap: () => _passwordLock(),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
PlatformUtil.isMobile()
|
||||
? MenuItemWidget(
|
||||
captionedTextWidget:
|
||||
CaptionedTextWidget(
|
||||
title: context.l10n.autoLock,
|
||||
subTitle: _formatTime(
|
||||
Duration(
|
||||
milliseconds:
|
||||
autoLockTimeInMilliseconds,
|
||||
),
|
||||
),
|
||||
),
|
||||
surfaceExecutionStates: false,
|
||||
alignCaptionedTextToLeft: true,
|
||||
singleBorderRadius: 8,
|
||||
menuItemColor: colorTheme.fillFaint,
|
||||
trailingIconColor:
|
||||
colorTheme.textBase,
|
||||
onTap: () => _onAutoLock(),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
PlatformUtil.isMobile()
|
||||
? Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 14,
|
||||
left: 14,
|
||||
right: 12,
|
||||
),
|
||||
child: Text(
|
||||
context.l10n
|
||||
.autoLockFeatureDescription,
|
||||
style: textTheme.miniFaint,
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
PlatformUtil.isMobile()
|
||||
? Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
const SizedBox(height: 24),
|
||||
MenuItemWidget(
|
||||
captionedTextWidget:
|
||||
CaptionedTextWidget(
|
||||
title:
|
||||
context.l10n.hideContent,
|
||||
),
|
||||
alignCaptionedTextToLeft: true,
|
||||
singleBorderRadius: 8,
|
||||
menuItemColor:
|
||||
colorTheme.fillFaint,
|
||||
trailingWidget:
|
||||
ToggleSwitchWidget(
|
||||
value: () => hideAppContent,
|
||||
onChanged: () =>
|
||||
_onHideContent(),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 14,
|
||||
left: 14,
|
||||
right: 12,
|
||||
),
|
||||
child: Text(
|
||||
Platform.isAndroid
|
||||
? context.l10n
|
||||
.hideContentDescriptionAndroid
|
||||
: context.l10n
|
||||
.hideContentDescriptioniOS,
|
||||
style: textTheme.miniFaint,
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
],
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
childCount: 1,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
250
auth/lib/ui/settings/lock_screen/lock_screen_password.dart
Normal file
@@ -0,0 +1,250 @@
|
||||
import "dart:convert";
|
||||
|
||||
import "package:ente_auth/l10n/l10n.dart";
|
||||
import "package:ente_auth/theme/ente_theme.dart";
|
||||
import "package:ente_auth/ui/common/dynamic_fab.dart";
|
||||
import "package:ente_auth/ui/components/buttons/icon_button_widget.dart";
|
||||
import "package:ente_auth/ui/components/text_input_widget.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/lock_screen_confirm_password.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/lock_screen_options.dart";
|
||||
import "package:ente_auth/utils/lock_screen_settings.dart";
|
||||
import "package:ente_crypto_dart/ente_crypto_dart.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter/services.dart";
|
||||
|
||||
/// [isChangingLockScreenSettings] Authentication required for changing lock screen settings.
|
||||
/// Set to true when the app requires the user to authenticate before allowing
|
||||
/// changes to the lock screen settings.
|
||||
|
||||
/// [isAuthenticatingOnAppLaunch] Authentication required on app launch.
|
||||
/// Set to true when the app requires the user to authenticate immediately upon opening.
|
||||
|
||||
/// [isAuthenticatingForInAppChange] Authentication required for in-app changes (e.g., email, password).
|
||||
/// Set to true when the app requires the to authenticate for sensitive actions like email, password changes.
|
||||
|
||||
class LockScreenPassword extends StatefulWidget {
|
||||
const LockScreenPassword({
|
||||
super.key,
|
||||
this.isChangingLockScreenSettings = false,
|
||||
this.isAuthenticatingOnAppLaunch = false,
|
||||
this.isAuthenticatingForInAppChange = false,
|
||||
this.authPass,
|
||||
});
|
||||
|
||||
final bool isChangingLockScreenSettings;
|
||||
final bool isAuthenticatingOnAppLaunch;
|
||||
final bool isAuthenticatingForInAppChange;
|
||||
final String? authPass;
|
||||
@override
|
||||
State<LockScreenPassword> createState() => _LockScreenPasswordState();
|
||||
}
|
||||
|
||||
class _LockScreenPasswordState extends State<LockScreenPassword> {
|
||||
final _passwordController = TextEditingController(text: null);
|
||||
final _focusNode = FocusNode();
|
||||
final _isFormValid = ValueNotifier<bool>(false);
|
||||
final _submitNotifier = ValueNotifier(false);
|
||||
int invalidAttemptsCount = 0;
|
||||
|
||||
final _lockscreenSetting = LockScreenSettings.instance;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
invalidAttemptsCount = _lockscreenSetting.getInvalidAttemptCount();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
_focusNode.requestFocus();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_submitNotifier.dispose();
|
||||
_focusNode.dispose();
|
||||
_isFormValid.dispose();
|
||||
_passwordController.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorTheme = getEnteColorScheme(context);
|
||||
final textTheme = getEnteTextTheme(context);
|
||||
final isKeypadOpen = MediaQuery.viewInsetsOf(context).bottom > 100;
|
||||
|
||||
FloatingActionButtonLocation? fabLocation() {
|
||||
if (isKeypadOpen) {
|
||||
return null;
|
||||
} else {
|
||||
return FloatingActionButtonLocation.centerFloat;
|
||||
}
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: isKeypadOpen,
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
FocusScope.of(context).unfocus();
|
||||
Navigator.of(context).pop(false);
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.arrow_back,
|
||||
color: colorTheme.textBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
floatingActionButton: ValueListenableBuilder<bool>(
|
||||
valueListenable: _isFormValid,
|
||||
builder: (context, isFormValid, child) {
|
||||
return DynamicFAB(
|
||||
isKeypadOpen: isKeypadOpen,
|
||||
buttonText: context.l10n.next,
|
||||
isFormValid: isFormValid,
|
||||
onPressedFunction: () async {
|
||||
_submitNotifier.value = !_submitNotifier.value;
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
floatingActionButtonLocation: fabLocation(),
|
||||
floatingActionButtonAnimator: NoScalingAnimation(),
|
||||
body: SingleChildScrollView(
|
||||
child: Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 120,
|
||||
width: 120,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Container(
|
||||
width: 82,
|
||||
height: 82,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Colors.grey.shade500.withOpacity(0.2),
|
||||
Colors.grey.shade50.withOpacity(0.1),
|
||||
Colors.grey.shade400.withOpacity(0.2),
|
||||
Colors.grey.shade300.withOpacity(0.4),
|
||||
],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(1.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: colorTheme.backgroundBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 75,
|
||||
width: 75,
|
||||
child: CircularProgressIndicator(
|
||||
color: colorTheme.fillFaintPressed,
|
||||
value: 1,
|
||||
strokeWidth: 1.5,
|
||||
),
|
||||
),
|
||||
IconButtonWidget(
|
||||
icon: Icons.lock,
|
||||
iconButtonType: IconButtonType.primary,
|
||||
iconColor: colorTheme.textBase,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Text(
|
||||
widget.isChangingLockScreenSettings
|
||||
? context.l10n.enterPassword
|
||||
: context.l10n.setNewPassword,
|
||||
textAlign: TextAlign.center,
|
||||
style: textTheme.bodyBold,
|
||||
),
|
||||
const Padding(padding: EdgeInsets.all(12)),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
child: TextInputWidget(
|
||||
hintText: context.l10n.password,
|
||||
autoFocus: true,
|
||||
textCapitalization: TextCapitalization.none,
|
||||
isPasswordInput: true,
|
||||
shouldSurfaceExecutionStates: false,
|
||||
onChange: (p0) {
|
||||
_passwordController.text = p0;
|
||||
_isFormValid.value = _passwordController.text.isNotEmpty;
|
||||
},
|
||||
onSubmit: (p0) {
|
||||
return _confirmPassword();
|
||||
},
|
||||
submitNotifier: _submitNotifier,
|
||||
),
|
||||
),
|
||||
const Padding(padding: EdgeInsets.all(12)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<bool> _confirmPasswordAuth(String inputtedPassword) async {
|
||||
final Uint8List? salt = await _lockscreenSetting.getSalt();
|
||||
final hash = cryptoPwHash(
|
||||
utf8.encode(inputtedPassword),
|
||||
salt!,
|
||||
sodium.crypto.pwhash.memLimitInteractive,
|
||||
sodium.crypto.pwhash.opsLimitSensitive,
|
||||
sodium,
|
||||
);
|
||||
if (widget.authPass == base64Encode(hash)) {
|
||||
await _lockscreenSetting.setInvalidAttemptCount(0);
|
||||
|
||||
widget.isAuthenticatingOnAppLaunch ||
|
||||
widget.isAuthenticatingForInAppChange
|
||||
? Navigator.of(context).pop(true)
|
||||
: Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const LockScreenOptions(),
|
||||
),
|
||||
);
|
||||
return true;
|
||||
} else {
|
||||
if (widget.isAuthenticatingOnAppLaunch) {
|
||||
invalidAttemptsCount++;
|
||||
await _lockscreenSetting.setInvalidAttemptCount(invalidAttemptsCount);
|
||||
if (invalidAttemptsCount > 4) {
|
||||
Navigator.of(context).pop(false);
|
||||
}
|
||||
}
|
||||
|
||||
await HapticFeedback.vibrate();
|
||||
throw Exception("Incorrect password");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _confirmPassword() async {
|
||||
if (widget.isChangingLockScreenSettings) {
|
||||
await _confirmPasswordAuth(_passwordController.text);
|
||||
return;
|
||||
} else {
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) => LockScreenConfirmPassword(
|
||||
password: _passwordController.text,
|
||||
),
|
||||
),
|
||||
);
|
||||
_passwordController.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
284
auth/lib/ui/settings/lock_screen/lock_screen_pin.dart
Normal file
@@ -0,0 +1,284 @@
|
||||
import "dart:convert";
|
||||
import "dart:io";
|
||||
|
||||
import "package:ente_auth/l10n/l10n.dart";
|
||||
import "package:ente_auth/theme/colors.dart";
|
||||
import "package:ente_auth/theme/ente_theme.dart";
|
||||
import "package:ente_auth/theme/text_style.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/custom_pin_keypad.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/lock_screen_confirm_pin.dart";
|
||||
import "package:ente_auth/ui/settings/lock_screen/lock_screen_options.dart";
|
||||
import "package:ente_auth/utils/lock_screen_settings.dart";
|
||||
import "package:ente_crypto_dart/ente_crypto_dart.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter/services.dart";
|
||||
import 'package:pinput/pinput.dart';
|
||||
|
||||
/// [isChangingLockScreenSettings] Authentication required for changing lock screen settings.
|
||||
/// Set to true when the app requires the user to authenticate before allowing
|
||||
/// changes to the lock screen settings.
|
||||
|
||||
/// [isAuthenticatingOnAppLaunch] Authentication required on app launch.
|
||||
/// Set to true when the app requires the user to authenticate immediately upon opening.
|
||||
|
||||
/// [isAuthenticatingForInAppChange] Authentication required for in-app changes (e.g., email, password).
|
||||
/// Set to true when the app requires the to authenticate for sensitive actions like email, password changes.
|
||||
|
||||
class LockScreenPin extends StatefulWidget {
|
||||
const LockScreenPin({
|
||||
super.key,
|
||||
this.isChangingLockScreenSettings = false,
|
||||
this.isAuthenticatingOnAppLaunch = false,
|
||||
this.isAuthenticatingForInAppChange = false,
|
||||
this.authPin,
|
||||
});
|
||||
|
||||
final bool isAuthenticatingOnAppLaunch;
|
||||
final bool isChangingLockScreenSettings;
|
||||
final bool isAuthenticatingForInAppChange;
|
||||
final String? authPin;
|
||||
@override
|
||||
State<LockScreenPin> createState() => _LockScreenPinState();
|
||||
}
|
||||
|
||||
class _LockScreenPinState extends State<LockScreenPin> {
|
||||
final _pinController = TextEditingController(text: null);
|
||||
|
||||
final LockScreenSettings _lockscreenSetting = LockScreenSettings.instance;
|
||||
bool isPinValid = false;
|
||||
int invalidAttemptsCount = 0;
|
||||
bool isPlatformDesktop = false;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
isPlatformDesktop =
|
||||
Platform.isLinux || Platform.isMacOS || Platform.isWindows;
|
||||
invalidAttemptsCount = _lockscreenSetting.getInvalidAttemptCount();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_pinController.dispose();
|
||||
}
|
||||
|
||||
Future<bool> confirmPinAuth(String inputtedPin) async {
|
||||
final Uint8List? salt = await _lockscreenSetting.getSalt();
|
||||
final hash = cryptoPwHash(
|
||||
utf8.encode(inputtedPin),
|
||||
salt!,
|
||||
sodium.crypto.pwhash.memLimitInteractive,
|
||||
sodium.crypto.pwhash.opsLimitSensitive,
|
||||
sodium,
|
||||
);
|
||||
if (widget.authPin == base64Encode(hash)) {
|
||||
invalidAttemptsCount = 0;
|
||||
await _lockscreenSetting.setInvalidAttemptCount(0);
|
||||
widget.isAuthenticatingOnAppLaunch ||
|
||||
widget.isAuthenticatingForInAppChange
|
||||
? Navigator.of(context).pop(true)
|
||||
: Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const LockScreenOptions(),
|
||||
),
|
||||
);
|
||||
return true;
|
||||
} else {
|
||||
setState(() {
|
||||
isPinValid = true;
|
||||
});
|
||||
await HapticFeedback.vibrate();
|
||||
await Future.delayed(const Duration(milliseconds: 75));
|
||||
_pinController.clear();
|
||||
setState(() {
|
||||
isPinValid = false;
|
||||
});
|
||||
|
||||
if (widget.isAuthenticatingOnAppLaunch) {
|
||||
invalidAttemptsCount++;
|
||||
await _lockscreenSetting.setInvalidAttemptCount(invalidAttemptsCount);
|
||||
if (invalidAttemptsCount > 4) {
|
||||
Navigator.of(context).pop(false);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _confirmPin(String inputtedPin) async {
|
||||
if (widget.isChangingLockScreenSettings) {
|
||||
await confirmPinAuth(inputtedPin);
|
||||
return;
|
||||
} else {
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) =>
|
||||
LockScreenConfirmPin(pin: inputtedPin),
|
||||
),
|
||||
);
|
||||
_pinController.clear();
|
||||
}
|
||||
}
|
||||
|
||||
final _pinPutDecoration = PinTheme(
|
||||
height: 48,
|
||||
width: 48,
|
||||
padding: const EdgeInsets.only(top: 6.0),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: const Color.fromRGBO(45, 194, 98, 1.0)),
|
||||
borderRadius: BorderRadius.circular(15.0),
|
||||
),
|
||||
);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorTheme = getEnteColorScheme(context);
|
||||
final textTheme = getEnteTextTheme(context);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(false);
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.arrow_back,
|
||||
color: colorTheme.textBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
floatingActionButton: isPlatformDesktop
|
||||
? null
|
||||
: CustomPinKeypad(controller: _pinController),
|
||||
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
|
||||
body: SingleChildScrollView(
|
||||
child: _getBody(colorTheme, textTheme),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getBody(
|
||||
EnteColorScheme colorTheme,
|
||||
EnteTextTheme textTheme,
|
||||
) {
|
||||
return Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 120,
|
||||
width: 120,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Container(
|
||||
width: 82,
|
||||
height: 82,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Colors.grey.shade500.withOpacity(0.2),
|
||||
Colors.grey.shade50.withOpacity(0.1),
|
||||
Colors.grey.shade400.withOpacity(0.2),
|
||||
Colors.grey.shade300.withOpacity(0.4),
|
||||
],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(1.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: colorTheme.backgroundBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 75,
|
||||
width: 75,
|
||||
child: ValueListenableBuilder(
|
||||
valueListenable: _pinController,
|
||||
builder: (context, value, child) {
|
||||
return TweenAnimationBuilder<double>(
|
||||
tween: Tween<double>(
|
||||
begin: 0,
|
||||
end: _pinController.text.length / 4,
|
||||
),
|
||||
curve: Curves.ease,
|
||||
duration: const Duration(milliseconds: 250),
|
||||
builder: (context, value, _) =>
|
||||
CircularProgressIndicator(
|
||||
backgroundColor: colorTheme.fillFaintPressed,
|
||||
value: value,
|
||||
color: colorTheme.primary400,
|
||||
strokeWidth: 1.5,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Icon(
|
||||
Icons.lock,
|
||||
color: colorTheme.textBase,
|
||||
size: 30,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Text(
|
||||
widget.isChangingLockScreenSettings
|
||||
? context.l10n.enterPin
|
||||
: context.l10n.setNewPin,
|
||||
style: textTheme.bodyBold,
|
||||
),
|
||||
const Padding(padding: EdgeInsets.all(12)),
|
||||
Pinput(
|
||||
length: 4,
|
||||
showCursor: false,
|
||||
useNativeKeyboard: isPlatformDesktop,
|
||||
controller: _pinController,
|
||||
autofocus: true,
|
||||
defaultPinTheme: _pinPutDecoration,
|
||||
submittedPinTheme: _pinPutDecoration.copyWith(
|
||||
textStyle: textTheme.h3Bold,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
border: Border.all(
|
||||
color: colorTheme.fillBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
followingPinTheme: _pinPutDecoration.copyWith(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
border: Border.all(
|
||||
color: colorTheme.fillMuted,
|
||||
),
|
||||
),
|
||||
),
|
||||
focusedPinTheme: _pinPutDecoration,
|
||||
errorPinTheme: _pinPutDecoration.copyWith(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
border: Border.all(
|
||||
color: colorTheme.warning400,
|
||||
),
|
||||
),
|
||||
),
|
||||
forceErrorState: isPinValid,
|
||||
obscureText: true,
|
||||
obscuringCharacter: '*',
|
||||
errorText: '',
|
||||
onCompleted: (value) async {
|
||||
await _confirmPin(_pinController.text);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,8 @@ import 'package:ente_auth/ui/components/expandable_menu_item_widget.dart';
|
||||
import 'package:ente_auth/ui/components/menu_item_widget.dart';
|
||||
import 'package:ente_auth/ui/components/toggle_switch_widget.dart';
|
||||
import 'package:ente_auth/ui/settings/common_settings.dart';
|
||||
import 'package:ente_auth/ui/settings/lock_screen/lock_screen_options.dart';
|
||||
import 'package:ente_auth/utils/auth_util.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/navigation_util.dart';
|
||||
import 'package:ente_auth/utils/platform_util.dart';
|
||||
@@ -66,16 +68,6 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
||||
UserService.instance.getUserDetailsV2().ignore();
|
||||
}
|
||||
children.addAll([
|
||||
sectionOptionSpacing,
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: l10n.passkey,
|
||||
),
|
||||
pressedColor: getEnteColorScheme(context).fillFaint,
|
||||
trailingIcon: Icons.chevron_right_outlined,
|
||||
trailingIconIsMuted: true,
|
||||
onTap: () async => await onPasskeyClick(context),
|
||||
),
|
||||
sectionOptionSpacing,
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
@@ -102,6 +94,16 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
||||
),
|
||||
),
|
||||
sectionOptionSpacing,
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: l10n.passkey,
|
||||
),
|
||||
pressedColor: getEnteColorScheme(context).fillFaint,
|
||||
trailingIcon: Icons.chevron_right_outlined,
|
||||
trailingIconIsMuted: true,
|
||||
onTap: () async => await onPasskeyClick(context),
|
||||
),
|
||||
sectionOptionSpacing,
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: context.l10n.viewActiveSessions,
|
||||
@@ -133,26 +135,39 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
||||
children.add(sectionOptionSpacing);
|
||||
}
|
||||
children.addAll([
|
||||
sectionOptionSpacing,
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: l10n.lockscreen,
|
||||
title: context.l10n.appLock,
|
||||
),
|
||||
trailingWidget: ToggleSwitchWidget(
|
||||
value: () => _config.shouldShowLockScreen(),
|
||||
onChanged: () async {
|
||||
final hasAuthenticated = await LocalAuthenticationService.instance
|
||||
.requestLocalAuthForLockScreen(
|
||||
surfaceExecutionStates: false,
|
||||
trailingIcon: Icons.chevron_right_outlined,
|
||||
trailingIconIsMuted: true,
|
||||
onTap: () async {
|
||||
if (await Configuration.instance.shouldShowLockScreen()) {
|
||||
final bool result = await requestAuthentication(
|
||||
context,
|
||||
!_config.shouldShowLockScreen(),
|
||||
context.l10n.authToChangeLockscreenSetting,
|
||||
context.l10n.lockScreenEnablePreSteps,
|
||||
context.l10n.about,
|
||||
);
|
||||
if (hasAuthenticated) {
|
||||
FocusScope.of(context).requestFocus();
|
||||
setState(() {});
|
||||
if (result) {
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return const LockScreenOptions();
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
} else {
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return const LockScreenOptions();
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
sectionOptionSpacing,
|
||||
]);
|
||||
|
||||
@@ -47,7 +47,7 @@ class SocialSectionWidget extends StatelessWidget {
|
||||
"https://shop.ente.io",
|
||||
launchInExternalApp: !Platform.isAndroid,
|
||||
),
|
||||
const SocialsMenuItemWidget("Mastodon", "https://mstdn.social/@ente/"),
|
||||
const SocialsMenuItemWidget("Mastodon", "https://fosstodon.org/@ente"),
|
||||
sectionOptionSpacing,
|
||||
const SocialsMenuItemWidget("Twitter", "https://twitter.com/enteio"),
|
||||
sectionOptionSpacing,
|
||||
|
||||
@@ -70,18 +70,18 @@ class _SupportSectionWidgetState extends State<SupportSectionWidget> {
|
||||
},
|
||||
),
|
||||
sectionOptionSpacing,
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: l10n.email,
|
||||
),
|
||||
pressedColor: getEnteColorScheme(context).fillFaint,
|
||||
trailingIcon: Icons.chevron_right_outlined,
|
||||
trailingIconIsMuted: true,
|
||||
onTap: () async {
|
||||
await sendEmail(context, to: supportEmail);
|
||||
},
|
||||
),
|
||||
sectionOptionSpacing,
|
||||
// MenuItemWidget(
|
||||
// captionedTextWidget: CaptionedTextWidget(
|
||||
// title: l10n.email,
|
||||
// ),
|
||||
// pressedColor: getEnteColorScheme(context).fillFaint,
|
||||
// trailingIcon: Icons.chevron_right_outlined,
|
||||
// trailingIconIsMuted: true,
|
||||
// onTap: () async {
|
||||
// await sendEmail(context, to: supportEmail);
|
||||
// },
|
||||
// ),
|
||||
// sectionOptionSpacing,
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: l10n.reportABug,
|
||||
@@ -90,7 +90,7 @@ class _SupportSectionWidgetState extends State<SupportSectionWidget> {
|
||||
trailingIcon: Icons.chevron_right_outlined,
|
||||
trailingIconIsMuted: true,
|
||||
onTap: () async {
|
||||
await sendLogs(context, l10n.reportBug, "auth@ente.io");
|
||||
await sendLogs(context, l10n.reportBug);
|
||||
},
|
||||
onDoubleTap: () async {
|
||||
try {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:ente_auth/locale.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
@@ -83,8 +84,12 @@ class _AppLockState extends State<AppLock> with WidgetsBindingObserver {
|
||||
|
||||
if (state == AppLifecycleState.paused &&
|
||||
(!this._isLocked && this._didUnlockForAppLaunch)) {
|
||||
this._backgroundLockLatencyTimer =
|
||||
Timer(this.widget.backgroundLockLatency, () => this.showLockScreen());
|
||||
this._backgroundLockLatencyTimer = Timer(
|
||||
Duration(
|
||||
milliseconds: LockScreenSettings.instance.getAutoLockTime(),
|
||||
),
|
||||
() => this.showLockScreen(),
|
||||
);
|
||||
}
|
||||
|
||||
if (state == AppLifecycleState.resumed) {
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/l10n/l10n.dart';
|
||||
import 'package:ente_auth/ui/common/gradient_button.dart';
|
||||
import 'package:ente_auth/services/user_service.dart';
|
||||
import 'package:ente_auth/theme/ente_theme.dart';
|
||||
import 'package:ente_auth/ui/tools/app_lock.dart';
|
||||
import 'package:ente_auth/utils/auth_util.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter_animate/flutter_animate.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
class LockScreen extends StatefulWidget {
|
||||
@@ -20,11 +27,17 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
bool _hasPlacedAppInBackground = false;
|
||||
bool _hasAuthenticationFailed = false;
|
||||
int? lastAuthenticatingTime;
|
||||
|
||||
bool isTimerRunning = false;
|
||||
int lockedTimeInSeconds = 0;
|
||||
int invalidAttemptCount = 0;
|
||||
int remainingTimeInSeconds = 0;
|
||||
final _lockscreenSetting = LockScreenSettings.instance;
|
||||
late Brightness _platformBrightness;
|
||||
@override
|
||||
void initState() {
|
||||
_logger.info("initiatingState");
|
||||
super.initState();
|
||||
invalidAttemptCount = _lockscreenSetting.getInvalidAttemptCount();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
||||
if (isNonMobileIOSDevice()) {
|
||||
@@ -33,37 +46,145 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
}
|
||||
_showLockScreen(source: "postFrameInit");
|
||||
});
|
||||
_platformBrightness =
|
||||
SchedulerBinding.instance.platformDispatcher.platformBrightness;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorTheme = getEnteColorScheme(context);
|
||||
final textTheme = getEnteTextTheme(context);
|
||||
return Scaffold(
|
||||
body: Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
Stack(
|
||||
alignment: Alignment.center,
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.logout_outlined),
|
||||
color: Theme.of(context).iconTheme.color,
|
||||
onPressed: () {
|
||||
_onLogoutTapped(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
body: GestureDetector(
|
||||
onTap: () {
|
||||
isTimerRunning ? null : _showLockScreen(source: "tap");
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
opacity: _platformBrightness == Brightness.light ? 0.08 : 0.12,
|
||||
image: const ExactAssetImage(
|
||||
'assets/loading_photos_background.png',
|
||||
),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
child: Center(
|
||||
child: Column(
|
||||
children: [
|
||||
Opacity(
|
||||
opacity: 0.2,
|
||||
child: Image.asset('assets/loading_photos_background.png'),
|
||||
),
|
||||
const Spacer(),
|
||||
SizedBox(
|
||||
width: 180,
|
||||
child: GradientButton(
|
||||
text: context.l10n.unlock,
|
||||
iconData: Icons.lock_open_outlined,
|
||||
onTap: () async {
|
||||
// ignore: unawaited_futures
|
||||
_showLockScreen(source: "tapUnlock");
|
||||
},
|
||||
height: 120,
|
||||
width: 120,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Container(
|
||||
width: 82,
|
||||
height: 82,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Colors.grey.shade500.withOpacity(0.2),
|
||||
Colors.grey.shade50.withOpacity(0.1),
|
||||
Colors.grey.shade400.withOpacity(0.2),
|
||||
Colors.grey.shade300.withOpacity(0.4),
|
||||
],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(1.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: colorTheme.backgroundBase,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 75,
|
||||
width: 75,
|
||||
child: TweenAnimationBuilder<double>(
|
||||
tween: Tween<double>(
|
||||
begin: isTimerRunning ? 0 : 1,
|
||||
end: isTimerRunning
|
||||
? _getFractionOfTimeElapsed()
|
||||
: 1,
|
||||
),
|
||||
duration: const Duration(seconds: 1),
|
||||
builder: (context, value, _) =>
|
||||
CircularProgressIndicator(
|
||||
backgroundColor: colorTheme.fillFaintPressed,
|
||||
value: value,
|
||||
color: colorTheme.primary400,
|
||||
strokeWidth: 1.5,
|
||||
),
|
||||
),
|
||||
),
|
||||
Icon(
|
||||
Icons.lock,
|
||||
size: 30,
|
||||
color: colorTheme.textBase,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
isTimerRunning
|
||||
? Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Text(
|
||||
context.l10n.tooManyIncorrectAttempts,
|
||||
style: textTheme.small,
|
||||
)
|
||||
.animate(
|
||||
delay: const Duration(milliseconds: 2000),
|
||||
)
|
||||
.fadeOut(
|
||||
duration: 400.ms,
|
||||
curve: Curves.easeInOutCirc,
|
||||
),
|
||||
Text(
|
||||
_formatTime(remainingTimeInSeconds),
|
||||
style: textTheme.small,
|
||||
)
|
||||
.animate(
|
||||
delay: const Duration(milliseconds: 2250),
|
||||
)
|
||||
.fadeIn(
|
||||
duration: 400.ms,
|
||||
curve: Curves.easeInOutCirc,
|
||||
),
|
||||
],
|
||||
)
|
||||
: GestureDetector(
|
||||
onTap: () => _showLockScreen(source: "tap"),
|
||||
child: Text(
|
||||
context.l10n.tapToUnlock,
|
||||
style: textTheme.small,
|
||||
),
|
||||
),
|
||||
const Padding(
|
||||
padding: EdgeInsets.only(bottom: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -77,6 +198,18 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
return shortestSide > 600 ? true : false;
|
||||
}
|
||||
|
||||
void _onLogoutTapped(BuildContext context) {
|
||||
showChoiceActionSheet(
|
||||
context,
|
||||
title: context.l10n.areYouSureYouWantToLogout,
|
||||
firstButtonLabel: context.l10n.yesLogout,
|
||||
isCritical: true,
|
||||
firstButtonOnTap: () async {
|
||||
await UserService.instance.logout(context);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||
_logger.info(state.toString());
|
||||
@@ -90,10 +223,17 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
if (!_hasAuthenticationFailed && !didAuthInLast5Seconds) {
|
||||
// Show the lock screen again only if the app is resuming from the
|
||||
// background, and not when the lock screen was explicitly dismissed
|
||||
Future.delayed(
|
||||
Duration.zero,
|
||||
() => _showLockScreen(source: "lifeCycle"),
|
||||
);
|
||||
if (_lockscreenSetting.getlastInvalidAttemptTime() >
|
||||
DateTime.now().millisecondsSinceEpoch &&
|
||||
!_isShowingLockScreen) {
|
||||
final int time = (_lockscreenSetting.getlastInvalidAttemptTime() -
|
||||
DateTime.now().millisecondsSinceEpoch) ~/
|
||||
1000;
|
||||
Future.delayed(Duration.zero, () {
|
||||
startLockTimer(time);
|
||||
_showLockScreen(source: "lifeCycle");
|
||||
});
|
||||
}
|
||||
} else {
|
||||
_hasAuthenticationFailed = false; // Reset failure state
|
||||
}
|
||||
@@ -115,24 +255,112 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future<void> startLockTimer(int timeInSeconds) async {
|
||||
if (isTimerRunning) {
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
isTimerRunning = true;
|
||||
remainingTimeInSeconds = timeInSeconds;
|
||||
});
|
||||
|
||||
while (remainingTimeInSeconds > 0) {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
setState(() {
|
||||
remainingTimeInSeconds--;
|
||||
});
|
||||
}
|
||||
|
||||
setState(() {
|
||||
isTimerRunning = false;
|
||||
});
|
||||
}
|
||||
|
||||
double _getFractionOfTimeElapsed() {
|
||||
final int totalLockedTime =
|
||||
lockedTimeInSeconds = pow(2, invalidAttemptCount - 5).toInt() * 30;
|
||||
if (remainingTimeInSeconds == 0) return 1;
|
||||
|
||||
return 1 - remainingTimeInSeconds / totalLockedTime;
|
||||
}
|
||||
|
||||
String _formatTime(int seconds) {
|
||||
final int hours = seconds ~/ 3600;
|
||||
final int minutes = (seconds % 3600) ~/ 60;
|
||||
final int remainingSeconds = seconds % 60;
|
||||
|
||||
if (hours > 0) {
|
||||
return "${hours}h ${minutes}m";
|
||||
} else if (minutes > 0) {
|
||||
return "${minutes}m ${remainingSeconds}s";
|
||||
} else {
|
||||
return "${remainingSeconds}s";
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _autoLogoutOnMaxInvalidAttempts() async {
|
||||
_logger.info("Auto logout on max invalid attempts");
|
||||
Navigator.of(context, rootNavigator: true).pop('dialog');
|
||||
Navigator.of(context).popUntil((route) => route.isFirst);
|
||||
final dialog = createProgressDialog(context, "Logging out ...");
|
||||
await dialog.show();
|
||||
await Configuration.instance.logout();
|
||||
await dialog.hide();
|
||||
}
|
||||
|
||||
Future<void> _showLockScreen({String source = ''}) async {
|
||||
final int id = DateTime.now().millisecondsSinceEpoch;
|
||||
_logger.info("Showing lock screen $source $id");
|
||||
final int currentTimestamp = DateTime.now().millisecondsSinceEpoch;
|
||||
_logger.info("Showing lock screen $source $currentTimestamp");
|
||||
try {
|
||||
if (currentTimestamp < _lockscreenSetting.getlastInvalidAttemptTime() &&
|
||||
!_isShowingLockScreen) {
|
||||
final int remainingTime =
|
||||
(_lockscreenSetting.getlastInvalidAttemptTime() -
|
||||
currentTimestamp) ~/
|
||||
1000;
|
||||
|
||||
await startLockTimer(remainingTime);
|
||||
}
|
||||
_isShowingLockScreen = true;
|
||||
final result = await requestAuthentication(
|
||||
context,
|
||||
context.l10n.authToViewSecrets,
|
||||
);
|
||||
_logger.finest("LockScreen Result $result $id");
|
||||
final result = isTimerRunning
|
||||
? false
|
||||
: await requestAuthentication(
|
||||
context,
|
||||
context.l10n.authToViewSecrets,
|
||||
isOpeningApp: true,
|
||||
);
|
||||
_logger.finest("LockScreen Result $result $currentTimestamp");
|
||||
_isShowingLockScreen = false;
|
||||
if (result) {
|
||||
lastAuthenticatingTime = DateTime.now().millisecondsSinceEpoch;
|
||||
AppLock.of(context)!.didUnlock();
|
||||
await _lockscreenSetting.setInvalidAttemptCount(0);
|
||||
setState(() {
|
||||
lockedTimeInSeconds = 15;
|
||||
isTimerRunning = false;
|
||||
});
|
||||
} else {
|
||||
if (!_hasPlacedAppInBackground) {
|
||||
// Treat this as a failure only if user did not explicitly
|
||||
// put the app in background
|
||||
if (_lockscreenSetting.getInvalidAttemptCount() > 4 &&
|
||||
invalidAttemptCount !=
|
||||
_lockscreenSetting.getInvalidAttemptCount()) {
|
||||
invalidAttemptCount = _lockscreenSetting.getInvalidAttemptCount();
|
||||
|
||||
if (invalidAttemptCount > 9) {
|
||||
await _autoLogoutOnMaxInvalidAttempts();
|
||||
return;
|
||||
}
|
||||
|
||||
lockedTimeInSeconds = pow(2, invalidAttemptCount - 5).toInt() * 30;
|
||||
await _lockscreenSetting.setLastInvalidAttemptTime(
|
||||
DateTime.now().millisecondsSinceEpoch +
|
||||
lockedTimeInSeconds * 1000,
|
||||
);
|
||||
await startLockTimer(lockedTimeInSeconds);
|
||||
}
|
||||
_hasAuthenticationFailed = true;
|
||||
_logger.info("Authentication failed");
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import 'package:ente_auth/services/user_service.dart';
|
||||
import 'package:ente_auth/ui/lifecycle_event_handler.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:pinput/pin_put/pin_put.dart';
|
||||
import 'package:pinput/pinput.dart';
|
||||
|
||||
class TwoFactorAuthenticationPage extends StatefulWidget {
|
||||
final String sessionID;
|
||||
@@ -19,9 +19,13 @@ class TwoFactorAuthenticationPage extends StatefulWidget {
|
||||
class _TwoFactorAuthenticationPageState
|
||||
extends State<TwoFactorAuthenticationPage> {
|
||||
final _pinController = TextEditingController();
|
||||
final _pinPutDecoration = BoxDecoration(
|
||||
border: Border.all(color: const Color.fromRGBO(45, 194, 98, 1.0)),
|
||||
borderRadius: BorderRadius.circular(15.0),
|
||||
final _pinPutDecoration = PinTheme(
|
||||
height: 45,
|
||||
width: 45,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: const Color.fromRGBO(45, 194, 98, 1.0)),
|
||||
borderRadius: BorderRadius.circular(15.0),
|
||||
),
|
||||
);
|
||||
String _code = "";
|
||||
late LifecycleEventHandler _lifecycleEventHandler;
|
||||
@@ -79,9 +83,9 @@ class _TwoFactorAuthenticationPageState
|
||||
const Padding(padding: EdgeInsets.all(32)),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(40, 0, 40, 0),
|
||||
child: PinPut(
|
||||
fieldsCount: 6,
|
||||
onSubmit: (String code) {
|
||||
child: Pinput(
|
||||
length: 6,
|
||||
onCompleted: (String code) {
|
||||
_verifyTwoFactorCode(code);
|
||||
},
|
||||
onChanged: (String pin) {
|
||||
@@ -90,20 +94,22 @@ class _TwoFactorAuthenticationPageState
|
||||
});
|
||||
},
|
||||
controller: _pinController,
|
||||
submittedFieldDecoration: _pinPutDecoration.copyWith(
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
),
|
||||
selectedFieldDecoration: _pinPutDecoration,
|
||||
followingFieldDecoration: _pinPutDecoration.copyWith(
|
||||
borderRadius: BorderRadius.circular(5.0),
|
||||
border: Border.all(
|
||||
color: const Color.fromRGBO(45, 194, 98, 0.5),
|
||||
submittedPinTheme: _pinPutDecoration.copyWith(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
border: Border.all(
|
||||
color: const Color.fromRGBO(45, 194, 98, 0.5),
|
||||
),
|
||||
),
|
||||
),
|
||||
inputDecoration: const InputDecoration(
|
||||
focusedBorder: InputBorder.none,
|
||||
border: InputBorder.none,
|
||||
counterText: '',
|
||||
defaultPinTheme: _pinPutDecoration,
|
||||
followingPinTheme: _pinPutDecoration.copyWith(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
border: Border.all(
|
||||
color: const Color.fromRGBO(45, 194, 98, 0.5),
|
||||
),
|
||||
),
|
||||
),
|
||||
autofocus: true,
|
||||
),
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:ente_auth/l10n/l10n.dart';
|
||||
import 'package:ente_auth/models/account/two_factor.dart';
|
||||
import 'package:ente_auth/services/user_service.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/email_util.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class TwoFactorRecoveryPage extends StatefulWidget {
|
||||
@@ -86,12 +86,8 @@ class _TwoFactorRecoveryPageState extends State<TwoFactorRecoveryPage> {
|
||||
),
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () {
|
||||
showErrorDialog(
|
||||
context,
|
||||
l10n.contactSupport,
|
||||
l10n.contactSupportViaEmailMessage("support@ente.io"),
|
||||
);
|
||||
onTap: () async {
|
||||
await openSupportPage(null, null);
|
||||
},
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(40),
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:ente_auth/l10n/l10n.dart';
|
||||
import 'package:ente_auth/services/local_authentication_service.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_local_authentication/flutter_local_authentication.dart';
|
||||
import 'package:local_auth/local_auth.dart';
|
||||
@@ -8,8 +10,26 @@ import 'package:local_auth_android/local_auth_android.dart';
|
||||
import 'package:local_auth_darwin/types/auth_messages_ios.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
Future<bool> requestAuthentication(BuildContext context, String reason) async {
|
||||
Future<bool> requestAuthentication(
|
||||
BuildContext context,
|
||||
String reason, {
|
||||
bool isOpeningApp = false,
|
||||
bool isAuthenticatingForInAppChange = false,
|
||||
}) async {
|
||||
Logger("AuthUtil").info("Requesting authentication");
|
||||
|
||||
final String? savedPin = await LockScreenSettings.instance.getPin();
|
||||
final String? savedPassword = await LockScreenSettings.instance.getPassword();
|
||||
if (savedPassword != null || savedPin != null) {
|
||||
return await LocalAuthenticationService.instance
|
||||
.requestEnteAuthForLockScreen(
|
||||
context,
|
||||
savedPin,
|
||||
savedPassword,
|
||||
isAuthenticatingOnAppLaunch: isOpeningApp,
|
||||
isAuthenticatingForInAppChange: isAuthenticatingForInAppChange,
|
||||
);
|
||||
}
|
||||
if (Platform.isMacOS || Platform.isLinux) {
|
||||
return await FlutterLocalAuthentication().authenticate();
|
||||
} else {
|
||||
|
||||
@@ -31,12 +31,21 @@ Future<ButtonResult?> showErrorDialog(
|
||||
title: title,
|
||||
body: body,
|
||||
isDismissible: isDismissable,
|
||||
buttons: const [
|
||||
buttons: [
|
||||
ButtonWidget(
|
||||
buttonType: ButtonType.primary,
|
||||
labelText: context.l10n.contactSupport,
|
||||
isInAlert: true,
|
||||
buttonAction: ButtonAction.first,
|
||||
onTap: () async {
|
||||
await openSupportPage(body, null);
|
||||
},
|
||||
),
|
||||
const ButtonWidget(
|
||||
buttonType: ButtonType.secondary,
|
||||
labelText: "OK",
|
||||
isInAlert: true,
|
||||
buttonAction: ButtonAction.first,
|
||||
buttonAction: ButtonAction.second,
|
||||
),
|
||||
],
|
||||
);
|
||||
@@ -158,7 +167,6 @@ Future<ButtonResult?> showGenericErrorDialog({
|
||||
await sendLogs(
|
||||
context,
|
||||
context.l10n.contactSupport,
|
||||
"support@ente.io",
|
||||
postShare: () {},
|
||||
);
|
||||
},
|
||||
|
||||
@@ -16,7 +16,6 @@ import 'package:ente_auth/utils/toast_util.dart';
|
||||
import "package:file_saver/file_saver.dart";
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_email_sender/flutter_email_sender.dart';
|
||||
import "package:intl/intl.dart";
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
@@ -35,8 +34,7 @@ bool isValidEmail(String? email) {
|
||||
|
||||
Future<void> sendLogs(
|
||||
BuildContext context,
|
||||
String title,
|
||||
String toEmail, {
|
||||
String title, {
|
||||
Function? postShare,
|
||||
String? subject,
|
||||
String? body,
|
||||
@@ -55,7 +53,7 @@ Future<void> sendLogs(
|
||||
buttonAction: ButtonAction.first,
|
||||
shouldSurfaceExecutionStates: false,
|
||||
onTap: () async {
|
||||
await _sendLogs(context, toEmail, subject, body);
|
||||
await openSupportPage(subject, body);
|
||||
if (postShare != null) {
|
||||
postShare();
|
||||
}
|
||||
@@ -111,27 +109,35 @@ Future<void> sendLogs(
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _sendLogs(
|
||||
BuildContext context,
|
||||
String toEmail,
|
||||
Future<void> openSupportPage(
|
||||
String? subject,
|
||||
String? body,
|
||||
) async {
|
||||
final String zipFilePath = await getZippedLogsFile(context);
|
||||
final Email email = Email(
|
||||
recipients: [toEmail],
|
||||
subject: subject ?? '',
|
||||
body: body ?? '',
|
||||
attachmentPaths: [zipFilePath],
|
||||
isHTML: false,
|
||||
);
|
||||
try {
|
||||
await FlutterEmailSender.send(email);
|
||||
} catch (e, s) {
|
||||
_logger.severe('email sender failed', e, s);
|
||||
Navigator.of(context, rootNavigator: true).pop();
|
||||
await shareLogs(context, toEmail, zipFilePath);
|
||||
const url = "https://github.com/ente-io/ente/discussions/new?category=q-a";
|
||||
if (subject != null && body != null) {
|
||||
await launchUrl(
|
||||
Uri.parse(
|
||||
"$url&title=$subject&body=$body",
|
||||
),
|
||||
);
|
||||
} else {
|
||||
await launchUrl(Uri.parse(url));
|
||||
}
|
||||
// final String zipFilePath = await getZippedLogsFile(context);
|
||||
// final Email email = Email(
|
||||
// recipients: [toEmail],
|
||||
// subject: subject ?? '',
|
||||
// body: body ?? '',
|
||||
// attachmentPaths: [zipFilePath],
|
||||
// isHTML: false,
|
||||
// );
|
||||
// try {
|
||||
// await FlutterEmailSender.send(email);
|
||||
// } catch (e, s) {
|
||||
// _logger.severe('email sender failed', e, s);
|
||||
// Navigator.of(context, rootNavigator: true).pop();
|
||||
// await shareLogs(context, toEmail, zipFilePath);
|
||||
// }
|
||||
}
|
||||
|
||||
Future<String> getZippedLogsFile(BuildContext context) async {
|
||||
|
||||
190
auth/lib/utils/lock_screen_settings.dart
Normal file
@@ -0,0 +1,190 @@
|
||||
import "dart:convert";
|
||||
import "dart:typed_data";
|
||||
|
||||
import "package:ente_auth/core/configuration.dart";
|
||||
import "package:ente_auth/utils/platform_util.dart";
|
||||
import "package:ente_crypto_dart/ente_crypto_dart.dart";
|
||||
import "package:flutter_secure_storage/flutter_secure_storage.dart";
|
||||
import "package:privacy_screen/privacy_screen.dart";
|
||||
import "package:shared_preferences/shared_preferences.dart";
|
||||
|
||||
class LockScreenSettings {
|
||||
LockScreenSettings._privateConstructor();
|
||||
|
||||
static final LockScreenSettings instance =
|
||||
LockScreenSettings._privateConstructor();
|
||||
static const password = "ls_password";
|
||||
static const pin = "ls_pin";
|
||||
static const saltKey = "ls_salt";
|
||||
static const keyInvalidAttempts = "ls_invalid_attempts";
|
||||
static const lastInvalidAttemptTime = "ls_last_invalid_attempt_time";
|
||||
static const autoLockTime = "ls_auto_lock_time";
|
||||
static const keyHideAppContent = "ls_hide_app_content";
|
||||
static const keyAppLockSet = "ls_is_app_lock_set";
|
||||
static const keyHasMigratedLockScreenChanges =
|
||||
"ls_has_migrated_lock_screen_changes";
|
||||
final List<Duration> autoLockDurations = const [
|
||||
Duration(seconds: 0),
|
||||
Duration(seconds: 5),
|
||||
Duration(seconds: 15),
|
||||
Duration(minutes: 1),
|
||||
Duration(minutes: 5),
|
||||
Duration(minutes: 30),
|
||||
];
|
||||
|
||||
late SharedPreferences _preferences;
|
||||
late FlutterSecureStorage _secureStorage;
|
||||
|
||||
Future<void> init() async {
|
||||
_secureStorage = const FlutterSecureStorage();
|
||||
_preferences = await SharedPreferences.getInstance();
|
||||
|
||||
///Workaround for privacyScreen not working when app is killed and opened.
|
||||
await setHideAppContent(getShouldHideAppContent());
|
||||
|
||||
/// Function to Check if the migration for lock screen changes has
|
||||
/// already been done by checking a stored boolean value.
|
||||
await runLockScreenChangesMigration();
|
||||
}
|
||||
|
||||
Future<void> runLockScreenChangesMigration() async {
|
||||
if (_preferences.getBool(keyHasMigratedLockScreenChanges) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final bool passwordEnabled = await isPasswordSet();
|
||||
final bool pinEnabled = await isPinSet();
|
||||
final bool systemLockEnabled =
|
||||
Configuration.instance.shouldShowSystemLockScreen();
|
||||
|
||||
if (passwordEnabled || pinEnabled || systemLockEnabled) {
|
||||
await setAppLockEnabled(true);
|
||||
}
|
||||
|
||||
await _preferences.setBool(keyHasMigratedLockScreenChanges, true);
|
||||
}
|
||||
|
||||
Future<void> setHideAppContent(bool hideContent) async {
|
||||
if (PlatformUtil.isDesktop()) return;
|
||||
!hideContent
|
||||
? PrivacyScreen.instance.disable()
|
||||
: await PrivacyScreen.instance.enable(
|
||||
iosOptions: const PrivacyIosOptions(
|
||||
enablePrivacy: true,
|
||||
),
|
||||
androidOptions: const PrivacyAndroidOptions(
|
||||
enableSecure: true,
|
||||
),
|
||||
blurEffect: PrivacyBlurEffect.extraLight,
|
||||
);
|
||||
await _preferences.setBool(keyHideAppContent, hideContent);
|
||||
}
|
||||
|
||||
bool getShouldHideAppContent() {
|
||||
return _preferences.getBool(keyHideAppContent) ?? true;
|
||||
}
|
||||
|
||||
Future<void> setAutoLockTime(Duration duration) async {
|
||||
await _preferences.setInt(autoLockTime, duration.inMilliseconds);
|
||||
}
|
||||
|
||||
int getAutoLockTime() {
|
||||
return _preferences.getInt(autoLockTime) ?? 5000;
|
||||
}
|
||||
|
||||
Future<void> setLastInvalidAttemptTime(int time) async {
|
||||
await _preferences.setInt(lastInvalidAttemptTime, time);
|
||||
}
|
||||
|
||||
int getlastInvalidAttemptTime() {
|
||||
return _preferences.getInt(lastInvalidAttemptTime) ?? 0;
|
||||
}
|
||||
|
||||
int getInvalidAttemptCount() {
|
||||
return _preferences.getInt(keyInvalidAttempts) ?? 0;
|
||||
}
|
||||
|
||||
Future<void> setInvalidAttemptCount(int count) async {
|
||||
await _preferences.setInt(keyInvalidAttempts, count);
|
||||
}
|
||||
|
||||
Future<void> setAppLockEnabled(bool value) async {
|
||||
await _preferences.setBool(keyAppLockSet, value);
|
||||
}
|
||||
|
||||
bool getIsAppLockSet() {
|
||||
return _preferences.getBool(keyAppLockSet) ?? false;
|
||||
}
|
||||
|
||||
static Uint8List _generateSalt() {
|
||||
return sodium.randombytes.buf(sodium.crypto.pwhash.saltBytes);
|
||||
}
|
||||
|
||||
Future<void> setPin(String userPin) async {
|
||||
await _secureStorage.delete(key: saltKey);
|
||||
final salt = _generateSalt();
|
||||
|
||||
final hash = cryptoPwHash(
|
||||
utf8.encode(userPin),
|
||||
salt,
|
||||
sodium.crypto.pwhash.memLimitInteractive,
|
||||
sodium.crypto.pwhash.opsLimitSensitive,
|
||||
sodium,
|
||||
);
|
||||
final String saltPin = base64Encode(salt);
|
||||
final String hashedPin = base64Encode(hash);
|
||||
|
||||
await _secureStorage.write(key: saltKey, value: saltPin);
|
||||
await _secureStorage.write(key: pin, value: hashedPin);
|
||||
await _secureStorage.delete(key: password);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Future<Uint8List?> getSalt() async {
|
||||
final String? salt = await _secureStorage.read(key: saltKey);
|
||||
if (salt == null) return null;
|
||||
return base64Decode(salt);
|
||||
}
|
||||
|
||||
Future<String?> getPin() async {
|
||||
return _secureStorage.read(key: pin);
|
||||
}
|
||||
|
||||
Future<void> setPassword(String pass) async {
|
||||
await _secureStorage.delete(key: saltKey);
|
||||
final salt = _generateSalt();
|
||||
|
||||
final hash = cryptoPwHash(
|
||||
utf8.encode(pass),
|
||||
salt,
|
||||
sodium.crypto.pwhash.memLimitInteractive,
|
||||
sodium.crypto.pwhash.opsLimitSensitive,
|
||||
sodium,
|
||||
);
|
||||
|
||||
await _secureStorage.write(key: saltKey, value: base64Encode(salt));
|
||||
await _secureStorage.write(key: password, value: base64Encode(hash));
|
||||
await _secureStorage.delete(key: pin);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Future<String?> getPassword() async {
|
||||
return _secureStorage.read(key: password);
|
||||
}
|
||||
|
||||
Future<void> removePinAndPassword() async {
|
||||
await _secureStorage.delete(key: saltKey);
|
||||
await _secureStorage.delete(key: pin);
|
||||
await _secureStorage.delete(key: password);
|
||||
}
|
||||
|
||||
Future<bool> isPinSet() async {
|
||||
return await _secureStorage.containsKey(key: pin);
|
||||
}
|
||||
|
||||
Future<bool> isPasswordSet() async {
|
||||
return await _secureStorage.containsKey(key: password);
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ display_name: Auth
|
||||
package_name: auth
|
||||
maintainer:
|
||||
name: Ente.io Developers
|
||||
email: human@ente.io
|
||||
email: auth@ente.io
|
||||
priority: optional
|
||||
section: x11
|
||||
essential: false
|
||||
|
||||
@@ -27,5 +27,5 @@
|
||||
<developer id="io.github.ente-io.ente">
|
||||
<name>Ente.io Developers</name>
|
||||
</developer>
|
||||
<update_contact>human@ente.io</update_contact>
|
||||
<update_contact>auth@ente.io</update_contact>
|
||||
</component>
|
||||
@@ -2,7 +2,7 @@ display_name: Auth
|
||||
package_name: auth
|
||||
maintainer:
|
||||
name: Ente.io Developers
|
||||
email: human@ente.io
|
||||
email: auth@ente.io
|
||||
licenses:
|
||||
- GPLv3
|
||||
icon: assets/icons/auth-icon.png
|
||||
|
||||
@@ -3,7 +3,7 @@ summary: 2FA app with free end-to-end encrypted backup and sync
|
||||
group: Application/Utility
|
||||
vendor: Ente.io
|
||||
packager: Ente.io Developers
|
||||
packagerEmail: human@ente.io
|
||||
packagerEmail: auth@ente.io
|
||||
license: GPLv3
|
||||
url: https://github.com/ente-io/ente
|
||||
|
||||
|
||||
@@ -440,6 +440,14 @@ packages:
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_animate:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_animate
|
||||
sha256: "7c8a6594a9252dad30cc2ef16e33270b6248c4dedc3b3d06c86c4f3f4dc05ae5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.5.0"
|
||||
flutter_bloc:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -639,6 +647,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
flutter_shaders:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_shaders
|
||||
sha256: "02750b545c01ff4d8e9bbe8f27a7731aa3778402506c67daa1de7f5fc3f4befe"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.2"
|
||||
flutter_slidable:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -853,18 +869,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.4"
|
||||
version: "10.0.5"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
version: "3.0.5"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -885,10 +901,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: local_auth
|
||||
sha256: "280421b416b32de31405b0a25c3bd42dfcef2538dfbb20c03019e02a5ed55ed0"
|
||||
sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
version: "2.3.0"
|
||||
local_auth_android:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -901,10 +917,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: local_auth_darwin
|
||||
sha256: e424ebf90d5233452be146d4a7da4bcd7a70278b67791592f3fde1bda8eef9e2
|
||||
sha256: "7ba5738c874ca2b910d72385d00d2bebad9d4e807612936cf5e32bc01a048c71"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
version: "1.4.0"
|
||||
local_auth_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -941,10 +957,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
|
||||
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.0"
|
||||
version: "0.11.1"
|
||||
menu_base:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -957,10 +973,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.0"
|
||||
version: "1.15.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1133,10 +1149,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: pinput
|
||||
sha256: "27eb69042f75755bdb6544f6e79a50a6ed09d6e97e2d75c8421744df1e392949"
|
||||
sha256: "7bf9aa7d0eeb3da9f7d49d2087c7bc7d36cd277d2e94cc31c6da52e1ebb048d0"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
version: "5.0.0"
|
||||
platform:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1523,10 +1539,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.0"
|
||||
version: "0.7.2"
|
||||
timezone:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1575,6 +1591,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.2"
|
||||
universal_platform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: universal_platform
|
||||
sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
url_launcher:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1683,10 +1707,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||
sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.1"
|
||||
version: "14.2.4"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
name: ente_auth
|
||||
description: ente two-factor authenticator
|
||||
version: 3.0.18+318
|
||||
version: 3.1.2+322
|
||||
publish_to: none
|
||||
|
||||
environment:
|
||||
@@ -41,6 +41,7 @@ dependencies:
|
||||
fk_user_agent: ^2.1.0
|
||||
flutter:
|
||||
sdk: flutter
|
||||
flutter_animate: ^4.1.0
|
||||
flutter_bloc: ^8.0.1
|
||||
flutter_context_menu: ^0.1.3
|
||||
flutter_displaymode: ^0.6.0
|
||||
@@ -66,7 +67,7 @@ dependencies:
|
||||
http: ^1.1.0
|
||||
intl: ^0.19.0
|
||||
json_annotation: ^4.5.0
|
||||
local_auth: ^2.2.0
|
||||
local_auth: ^2.3.0
|
||||
local_auth_android: ^1.0.37
|
||||
local_auth_darwin: ^1.2.2
|
||||
logging: ^1.0.1
|
||||
@@ -77,7 +78,7 @@ dependencies:
|
||||
password_strength: ^0.2.0
|
||||
path: ^1.8.3
|
||||
path_provider: ^2.0.11
|
||||
pinput: ^1.2.2
|
||||
pinput: ^5.0.0
|
||||
pointycastle: ^3.7.3
|
||||
privacy_screen: ^0.0.6
|
||||
protobuf: ^3.0.0
|
||||
|
||||
@@ -1,19 +1,39 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"github.com/ente-io/cli/pkg/model"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
// versionCmd represents the version command
|
||||
// exportCmd represents the export command
|
||||
var exportCmd = &cobra.Command{
|
||||
Use: "export",
|
||||
Short: "Starts the export process",
|
||||
Long: ``,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
ctrl.Export()
|
||||
// Retrieve flag values
|
||||
shared, _ := cmd.Flags().GetBool("shared")
|
||||
hidden, _ := cmd.Flags().GetBool("hidden")
|
||||
albums, _ := cmd.Flags().GetStringSlice("albums")
|
||||
emails, _ := cmd.Flags().GetStringSlice("emails")
|
||||
// Create Filters struct with flag values
|
||||
filters := model.Filter{
|
||||
ExcludeShared: !shared,
|
||||
ExcludeHidden: !hidden,
|
||||
Albums: albums,
|
||||
Emails: emails,
|
||||
}
|
||||
// Call the Export function with the filters
|
||||
ctrl.Export(filters)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
rootCmd.AddCommand(exportCmd)
|
||||
|
||||
// Add flags for Filters struct fields with default value true
|
||||
exportCmd.Flags().Bool("shared", true, "to exclude shared albums, pass --shared=false")
|
||||
exportCmd.Flags().Bool("hidden", true, "to exclude hidden albums, pass --hidden=false")
|
||||
exportCmd.Flags().StringSlice("albums", []string{}, "Comma-separated list of album names to export")
|
||||
exportCmd.Flags().StringSlice("emails", []string{}, "Comma-separated list of emails to export files shared with")
|
||||
}
|
||||
|
||||
2
cli/docs/generated/ente.md
generated
@@ -25,4 +25,4 @@ ente [flags]
|
||||
* [ente export](ente_export.md) - Starts the export process
|
||||
* [ente version](ente_version.md) - Prints the current version
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_account.md
generated
@@ -16,4 +16,4 @@ Manage account settings
|
||||
* [ente account list](ente_account_list.md) - list configured accounts
|
||||
* [ente account update](ente_account_update.md) - Update an existing account's export directory
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_account_add.md
generated
@@ -20,4 +20,4 @@ ente account add [flags]
|
||||
|
||||
* [ente account](ente_account.md) - Manage account settings
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_account_get-token.md
generated
@@ -18,4 +18,4 @@ ente account get-token [flags]
|
||||
|
||||
* [ente account](ente_account.md) - Manage account settings
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_account_list.md
generated
@@ -16,4 +16,4 @@ ente account list [flags]
|
||||
|
||||
* [ente account](ente_account.md) - Manage account settings
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_account_update.md
generated
@@ -19,4 +19,4 @@ ente account update [flags]
|
||||
|
||||
* [ente account](ente_account.md) - Manage account settings
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_admin.md
generated
@@ -22,4 +22,4 @@ Commands for admin actions like disable or enabling 2fa, bumping up the storage
|
||||
* [ente admin list-users](ente_admin_list-users.md) - List all users
|
||||
* [ente admin update-subscription](ente_admin_update-subscription.md) - Update subscription for user
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_admin_delete-user.md
generated
@@ -18,4 +18,4 @@ ente admin delete-user [flags]
|
||||
|
||||
* [ente admin](ente_admin.md) - Commands for admin actions
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_admin_disable-2fa.md
generated
@@ -18,4 +18,4 @@ ente admin disable-2fa [flags]
|
||||
|
||||
* [ente admin](ente_admin.md) - Commands for admin actions
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_admin_disable-passkey.md
generated
@@ -18,4 +18,4 @@ ente admin disable-passkey [flags]
|
||||
|
||||
* [ente admin](ente_admin.md) - Commands for admin actions
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_admin_get-user-id.md
generated
@@ -18,4 +18,4 @@ ente admin get-user-id [flags]
|
||||
|
||||
* [ente admin](ente_admin.md) - Commands for admin actions
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
2
cli/docs/generated/ente_admin_list-users.md
generated
@@ -17,4 +17,4 @@ ente admin list-users [flags]
|
||||
|
||||
* [ente admin](ente_admin.md) - Commands for admin actions
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||
@@ -23,4 +23,4 @@ ente admin update-subscription [flags]
|
||||
|
||||
* [ente admin](ente_admin.md) - Commands for admin actions
|
||||
|
||||
###### Auto generated by spf13/cobra on 22-Jun-2024
|
||||
###### Auto generated by spf13/cobra on 14-Aug-2024
|
||||
|
||||