Compare commits

...

41 Commits

Author SHA1 Message Date
Neeraj Gupta
cad9f00ebe Bump version 2.0.7+207 (#285) 2023-10-10 11:11:45 +05:30
Neeraj Gupta
1fb163d561 Fix translation 2023-10-10 10:58:31 +05:30
Neeraj Gupta
2c82bdc8a3 Bump version to 2.0.7+207 2023-10-10 10:51:49 +05:30
Vishnu Mohandas
ccf51fe139 New Translations (#284) 2023-10-09 19:59:29 +05:30
Crowdin Bot
9c56c0abbc New Crowdin translations by GitHub Action 2023-10-09 12:01:12 +00:00
Vishnu Mohandas
ea1827d963 Added authentication when pressing the Share QR, edit and delete button (#277) 2023-10-06 22:11:24 +05:30
Shivam Pachchigar
c441068857 Typo in QR code authentication message 2023-10-06 21:56:47 +05:30
Vishnu Mohandas
c7e917dacf New Translations (#283) 2023-10-06 20:54:22 +05:30
Shivam Pachchigar
262a49439d Added locales 2023-10-06 19:39:24 +05:30
Shivam Pachchigar
a552783f59 Merge branch 'ente-io:main' into main 2023-10-06 18:25:24 +05:30
Crowdin Bot
5658bd6ecf New Crowdin translations by GitHub Action 2023-10-06 12:01:23 +00:00
Neeraj Gupta
2742db3d5b New Translations (#282) 2023-10-06 06:56:19 +05:30
Crowdin Bot
2344cfda91 New Crowdin translations by GitHub Action 2023-10-06 00:24:44 +00:00
Neeraj Gupta
8f33182c18 New Translations (#280) 2023-10-05 19:47:03 +05:30
Crowdin Bot
2eb9dddf1d New Crowdin translations by GitHub Action 2023-10-05 12:10:02 +00:00
Neeraj Gupta
432e9d77a1 Added Skiff and NextDNS (#278) 2023-10-05 16:12:32 +05:30
Brogio
dbcfbf0824 Update custom-icons.json
Forgot comma
2023-10-05 12:19:24 +02:00
Brogio
3994470117 Update custom-icons.json
Added NextDNS and Skiff
2023-10-05 12:16:39 +02:00
Brogio
fce76ac629 Add files via upload 2023-10-05 12:12:27 +02:00
Shivam Pachchigar
a2d0c3c3d9 Merge branch 'ente-io:main' into main 2023-10-05 15:18:12 +05:30
Shivam Pachchigar
62a41c89c6 Added authentication to show QR, edit or delete a code
- Used the requestAuthentication function in utils/auth_util.dart to perform the authentication
2023-10-05 15:11:38 +05:30
Vishnu Mohandas
31ce98453e feat(screen-refresh-rate): use flutter_displaymode to enable high refresh rates on devices with refresh rate locked at 60FPS (#276) 2023-10-05 13:39:59 +05:30
ashilkn
858ba41f8b Merge main 2023-10-05 13:37:29 +05:30
ashilkn
02750dd8da feat(screen-refresh-rate): use flutter_displaymode to enable high refresh rates in devices with refresh rate locked at 60FPS 2023-10-05 13:29:15 +05:30
ashilkn
25f9b02e53 chore: run dart fix --apply to add trailing commas 2023-10-05 13:13:59 +05:30
Neeraj Gupta
eaca45f5fe New Translations (#272) 2023-10-02 08:03:31 +05:30
Crowdin Bot
ef2b9c5fcd New Crowdin translations by GitHub Action 2023-10-02 00:25:05 +00:00
Vishnu Mohandas
a5a287912b feature/264 - Add clipboard minimize (#273) 2023-10-01 23:36:11 +05:30
Hubert
8dc06464c7 Add minimize on copy 2023-10-01 18:47:13 +02:00
Hubert
5c6eaa9fb9 Fix require_trailing_commas 2023-10-01 17:45:15 +02:00
Vishnu Mohandas
c53ac484fa Require confirmation during Save if Secret Key (#271) 2023-10-01 17:05:17 +05:30
Ahsan Ahmad
573b3a321d Require confirmation during Save if Secret Key 2023-10-01 16:05:35 +05:00
Vishnu Mohandas
7072b14073 New Translations (#270) 2023-10-01 16:32:48 +05:30
Crowdin Bot
8c67e54396 New Crowdin translations by GitHub Action 2023-10-01 00:29:00 +00:00
Vishnu Mohandas
92bfa153f1 Update screenshots (#269) 2023-09-29 16:56:25 +05:30
vishnukvmd
47c5ed25e7 Update screenshots 2023-09-29 16:43:48 +05:30
Vishnu Mohandas
09e7bae985 Update banner (#268) 2023-09-29 16:17:35 +05:30
Vishnu Mohandas
54ecafdafc Merge branch 'main' into update_banner 2023-09-29 16:14:02 +05:30
Neeraj Gupta
9198b3c29a Support for masking codes (#267) 2023-09-29 14:06:21 +05:30
Neeraj Gupta
37904f9ef4 bump version 2.0.5+205 2023-09-29 13:53:21 +05:30
Neeraj Gupta
b7ce24b9c4 Add support for hiding codes 2023-09-29 13:39:11 +05:30
50 changed files with 758 additions and 111 deletions

View File

@@ -170,6 +170,14 @@
},
{
"title": "Wise"
},
{
"title": "NextDNS"
},
{
"title": "Skiff",
"hex": "EF5A3C"
}
]
}

View File

@@ -0,0 +1 @@
<svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(.43837115 .89879405 -.89879405 .43837115 0 0)">&gt;<stop offset="0" stop-color="#00a9ff"/><stop offset="1" stop-color="#05f"/></linearGradient><path d="m469.139 139.984-.016-.391c-.218-4.819-.363-9.919-.452-15.592-.409-27.666-22.402-50.55-50.071-52.097-57.69-3.219-102.319-22.031-140.45-59.198l-.326-.31c-12.437-11.404-31.199-11.404-43.64 0l-.326.31c-38.132 37.167-82.76 55.979-140.45 59.202-27.666 1.543-49.662 24.427-50.072 52.097-.084 5.635-.233 10.734-.452 15.588l-.023.907c-1.121 58.827-2.515 132.04 21.978 198.493 13.467 36.543 33.863 68.309 60.618 94.42 30.472 29.737 70.384 53.345 118.626 70.166 1.57.547 3.2.991 4.862 1.324 2.343.467 4.701.701 7.059.701s4.72-.234 7.059-.701c1.661-.333 3.304-.78 4.881-1.332 48.184-16.851 88.054-40.471 118.499-70.204 26.744-26.119 47.14-57.892 60.619-94.443 24.584-66.652 23.194-140.003 22.077-198.94z" fill="url(#a)"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,13 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 90 90" width="90" height="90">
<title>skiff</title>
<style>
.s0 { fill: #000000 }
</style>
<g id="Layer">
<g id="Layer">
<path id="Layer" fill-rule="evenodd" class="s0" d="m54.8 16.3q-1.8 0-3.6 0.3-1.7 0.4-3.4 1-1.7 0.7-3.2 1.7-1.5 0.9-2.8 2.2-1.3 1.2-2.3 2.7-1.1 1.4-1.8 3.1-0.8 1.6-1.2 3.3-0.5 1.8-0.6 3.6-0.1 1.8 0.2 3.5 0.2 1.8 0.7 3.5 0.6 1.8 1.5 3.3 0.8 1.6 2 3 1.1 1.4 2.5 2.5 1.4 1.2 2.9 2 1.6 0.9 3.3 1.4 1.7 0.6 3.5 0.8c0.6 0.1 1.2 0.2 1.8 0.2v0.9q-0.1 1.3-0.3 2.5c0 0.2-0.1 0.4-0.1 0.6-0.1 0.4-0.2 0.9-0.3 1.3-0.1 0.2-0.3 0.7-0.3 0.8l-0.2 0.6q-0.3 0.8-0.8 1.6-0.4 0.9-0.9 1.7-0.5 0.7-1 1.5-0.6 0.7-1.3 1.4-0.6 0.7-1.3 1.3-0.7 0.6-1.5 1.1-0.7 0.5-1.5 1-0.8 0.4-1.7 0.8c-2.1 0.9-4.4 1.4-6.8 1.5q-1.4 0-2.8-0.3l-0.8-0.1-0.9-0.2c-0.3-0.1-0.6-0.2-0.9-0.2-0.5-0.2-1.1-0.4-1.7-0.6-0.2-0.1-0.5-0.3-0.8-0.4l-0.7-0.4c-0.1 0-0.2-0.1-0.5-0.2-0.2-0.2-0.7-0.4-0.9-0.6l-0.3-0.2-0.2-0.1c-0.3-0.2-0.6-0.5-0.9-0.7l-0.2-0.2-0.2-0.1-0.4-0.4c-0.3-0.2-0.6-0.6-0.8-0.8l-1.2-1.2-1.1-1.2-0.7-0.9c-0.2-0.3-0.5-0.7-0.6-0.9-0.5-0.6-1-1.5-1.4-2.2q-1.4-2.4-2.4-5.1-0.9-2.7-1.4-5.5-0.5-2.8-0.5-5.7 0-2.8 0.5-5.6v-0.3c0.1-0.4 0.3-1.3 0.4-1.7 0.2-0.6 0.3-1.2 0.5-1.8 0.1-0.4 0.3-1 0.4-1.1 0-0.1 0.5-1.2 0.5-1.3l0.5-1.3c0.2-0.3 0.6-1.3 0.7-1.5 0.2-0.3 0.7-1.3 0.8-1.4 0.1-0.1 0.3-0.4 0.4-0.6 0.1-0.1 0.2-0.4 0.4-0.7 0.2-0.3 0.7-1.1 1-1.4l0.8-1.1c0.2-0.3 0.7-0.9 1.1-1.3 0.4-0.3 0.9-0.9 1.2-1.2 0.2-0.3 0.9-0.9 1.1-1.2 0.3-0.2 1-0.9 1.3-1.1q1.6-1.3 3.4-2.4 1.7-1.1 3.6-1.9 1.9-0.9 3.9-1.5 1.9-0.6 4-1 2-0.3 4.1-0.4 2.1-0.1 4.1 0.1 2.1 0.2 4.1 0.7 2 0.4 3.9 1.2 0.8 0.2 1.6 0.6 0.8 0.3 1.5 0.7 0.8 0.4 1.5 0.8 0.8 0.4 1.5 0.8c-2.5-1.1-5.3-1.7-8.1-1.6zm-22.3 50.8q2.3 0.9 4.7 1.1 2.5 0.2 4.9-0.3 2.5-0.5 4.6-1.7c-2.9 1.3-6.1 1.8-9.2 1.3q-1.1-0.2-2.3-0.5-1.1-0.4-2.2-0.8-1.1-0.5-2-1.2-1-0.6-1.9-1.4-0.3-0.2-0.5-0.5-0.2-0.2-0.5-0.4-0.2-0.3-0.4-0.5-0.3-0.3-0.5-0.5l-0.1-0.1-0.1-0.2-0.2-0.2q-0.8-1-1.6-2.1-0.7-1-1.3-2.1-0.6-1.1-1.2-2.2-0.5-1.2-0.9-2.4-1.1-3-1.5-6.1-0.4-3.1-0.1-6.2 0.3-3.2 1.2-6.2 1-3 2.6-5.7 0.7-1.4 1.6-2.6 1-1.3 2-2.5 1.1-1.1 2.2-2.2 1.2-1 2.5-1.9 1.2-0.9 2.6-1.7 1.4-0.7 2.8-1.3 1.4-0.6 2.9-1.1 1.5-0.4 3.1-0.7l1.3-0.2 1.4-0.2 1.3-0.1h-2.7l-1.4 0.1c-3.7 0.4-7.3 1.6-10.6 3.4q-1.5 0.9-2.9 1.9c-0.2 0.2-0.6 0.5-0.9 0.7q-1.1 0.9-2.2 2-1.1 1-2 2.2-1 1.2-1.8 2.4-0.8 1.3-1.5 2.6-1.4 2.7-2.2 5.6-0.8 2.9-1 5.9-0.3 3 0.1 6 0.4 3 1.5 5.9 0.4 1.4 1.1 2.7 0.6 1.4 1.4 2.7 0.8 1.3 1.7 2.5 0.9 1.2 1.9 2.3 0.3 0.2 0.5 0.5 0.3 0.3 0.5 0.5 0.3 0.2 0.5 0.5 0.3 0.2 0.6 0.4 1.9 1.6 4.2 2.6zm17.2-6.4c-2.9 1.5-6.1 2-9.2 1.4q-1.1-0.2-2.3-0.6-1.1-0.4-2.1-1-1-0.6-1.9-1.3-0.9-0.8-1.7-1.7c-0.4-0.4-0.8-0.9-1.2-1.4-0.2-0.2-0.5-0.7-0.7-0.9q-1-1.4-1.8-2.9-0.8-1.5-1.4-3-0.6-1.6-0.9-3.2-0.4-1.6-0.6-3.3-0.2-1.7-0.1-3.3 0-1.7 0.3-3.4 0.3-1.6 0.8-3.2 0.5-1.6 1.1-3.2 0.7-1.4 1.5-2.7 0.8-1.4 1.8-2.6 1-1.2 2.1-2.3 1.2-1.1 2.4-2.1 1.2-0.9 2.6-1.7 1.3-0.8 2.8-1.4 1.4-0.6 2.9-1.1 1.5-0.4 3.1-0.7 0.5-0.1 1-0.1 0.6-0.1 1.1-0.2 0.6 0 1.1 0 0.5-0.1 1.1-0.1-1.4-0.1-2.8-0.1h-1c-0.3 0-0.9 0.1-1.2 0.1q-0.8 0.1-1.7 0.3-0.8 0.1-1.6 0.3-0.8 0.2-1.6 0.5-0.8 0.2-1.5 0.5c-0.2 0.1-0.7 0.3-0.9 0.4-0.2 0.1-0.4 0.2-0.6 0.3-0.5 0.2-1.2 0.6-1.7 0.9-0.5 0.2-1.1 0.7-1.6 1q-0.3 0.2-0.7 0.4-0.3 0.3-0.6 0.5-0.3 0.3-0.6 0.5-0.3 0.3-0.6 0.6-1 0.8-1.9 1.8-0.8 0.9-1.6 2-0.8 1-1.5 2.1-0.6 1.1-1.2 2.3-1.1 2.3-1.7 4.8-0.6 2.6-0.8 5.2-0.1 2.6 0.3 5.1 0.4 2.6 1.3 5 0.5 1.3 1 2.4 0.6 1.2 1.3 2.3 0.7 1.1 1.5 2.1 0.7 1 1.6 2l0.8 0.8 0.1 0.1 0.2 0.2c4.7 4.3 12.2 5.4 17.5 1.6zm-14.3-10.1q-0.7-1.1-1.3-2.2-0.6-1.1-1.1-2.3-0.5-1.2-0.8-2.5-0.3-1.2-0.5-2.5-0.2-1.3-0.2-2.6-0.1-1.2 0.1-2.5 0.1-1.3 0.3-2.6 0.3-1.2 0.7-2.5 0.4-1.2 1-2.3 0.5-1.2 1.2-2.3 0.6-1.1 1.4-2.1 0.8-1 1.7-1.9 1-0.9 2-1.7 1-0.8 2.1-1.5 1-0.7 2.2-1.2 1.2-0.5 2.4-0.9 0.7-0.3 1.5-0.5 0.7-0.2 1.5-0.3 0.7-0.2 1.5-0.3 0.7-0.1 1.5-0.1h2.4c-0.4-0.1-0.9-0.2-1.3-0.2l-0.8-0.1h-2.2q-1 0.1-1.9 0.2-1 0.1-1.9 0.3-1 0.3-1.9 0.6-0.9 0.3-1.8 0.6c-0.4 0.2-0.7 0.3-1.3 0.6-0.5 0.3-1.1 0.7-1.6 1-0.3 0.2-0.7 0.4-1 0.6q-0.9 0.7-1.8 1.5-0.9 0.8-1.7 1.7-0.8 0.9-1.6 1.8-0.7 1-1.3 2-1.2 2.1-1.9 4.4-0.8 2.3-1 4.7-0.3 2.4 0 4.8 0.2 2.4 1 4.6 0.4 1.2 0.9 2.3 0.5 1.1 1.1 2.1 0.6 1 1.3 2 0.7 1 1.5 1.8 0.5 0.6 1 1 0.5 0.5 1.1 0.9 0.5 0.5 1.1 0.8 0.6 0.4 1.3 0.7 1.2 0.7 2.5 1 1.4 0.3 2.8 0.4 1.3 0 2.7-0.2 1.3-0.3 2.6-0.9c-2 0.7-4.2 0.8-6.3 0.3q-0.7-0.1-1.5-0.4-0.7-0.2-1.5-0.5-0.7-0.4-1.4-0.8-0.6-0.4-1.2-0.9-0.6-0.5-1-0.9-0.5-0.5-0.9-1-0.5-0.4-0.9-1-0.4-0.5-0.8-1z"/>
<path id="Layer" class="s0" d="m37.4 35.8l-0.7-0.1v0.1q0.8 0 1.5 0.1z"/>
<path id="Layer" fill-rule="evenodd" class="s0" d="m62 72.2q-1.7 1.1-3.6 2-1.9 0.8-3.9 1.4-2 0.6-4 1-2.1 0.3-4.1 0.4-2.1 0.1-4.2-0.1-2-0.2-4.1-0.6-2-0.5-3.9-1.2-0.8-0.3-1.6-0.6-0.8-0.3-1.5-0.7-0.8-0.4-1.5-0.8-0.7-0.4-1.5-0.9 2.2 1 4.5 1.4 2.3 0.4 4.7 0.2 2.3-0.1 4.6-0.9 2.2-0.7 4.2-2 1-0.6 1.9-1.3 0.9-0.8 1.7-1.6 0.8-0.9 1.5-1.8 0.8-0.9 1.3-2 0.6-1 1.1-2.1 0.5-1 0.8-2.2 0.3-1.1 0.5-2.3 0.2-1.1 0.3-2.3 0-1-0.1-1.9 0-0.9-0.2-1.9-0.2-0.9-0.4-1.8-0.2-0.9-0.6-1.8-0.3-0.8-0.7-1.7-0.4-0.8-0.9-1.6-0.5-0.8-1.1-1.5-0.6-0.8-1.2-1.5-0.7-0.6-1.4-1.3-0.7-0.6-1.5-1.1-0.7-0.5-1.5-1-0.9-0.4-1.7-0.8c-2.3-1-4.7-1.5-7.2-1.6v-1q0-1.3 0.3-2.5c0-0.2 0.1-0.4 0.1-0.6 0.1-0.4 0.2-0.9 0.3-1.3 0.1-0.2 0.2-0.7 0.3-0.8l0.2-0.6q0.3-0.8 0.7-1.7 0.4-0.8 0.9-1.6 0.5-0.8 1.1-1.5 0.6-0.7 1.2-1.4 0.7-0.7 1.4-1.3 0.7-0.6 1.4-1.1 0.8-0.5 1.6-1 0.8-0.4 1.7-0.8c2.1-0.9 4.4-1.4 6.7-1.5q0.4 0 0.8 0 0.3 0.1 0.7 0.1 0.3 0 0.7 0.1 0.3 0 0.7 0l0.8 0.2 0.8 0.2 1 0.2c0.5 0.2 1.1 0.4 1.7 0.6l0.7 0.4 0.8 0.4c0.1 0 0.2 0.1 0.4 0.2 0.3 0.2 0.7 0.4 1 0.6l0.2 0.2 0.3 0.1c0.2 0.2 0.6 0.5 0.8 0.7l0.3 0.2h0.1l0.1 0.1 0.4 0.4c0.2 0.2 0.6 0.6 0.8 0.8 0.4 0.3 0.9 0.9 1.2 1.1 0.2 0.3 0.8 1.1 1.1 1.3l0.6 0.9q0.1 0.1 0.2 0.3 0.1 0.1 0.2 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.2 0.2c0.4 0.7 1 1.5 1.4 2.2q1.4 2.4 2.3 5.1 1 2.7 1.5 5.5 0.5 2.8 0.5 5.7 0 2.8-0.6 5.6v0.3c0 0.4-0.2 1.3-0.3 1.7-0.2 0.6-0.4 1.2-0.6 1.8 0 0.3-0.2 1-0.3 1.1-0.1 0.1-0.5 1.2-0.5 1.3-0.2 0.4-0.4 1-0.5 1.3-0.2 0.3-0.7 1.3-0.8 1.5-0.1 0.3-0.7 1.3-0.7 1.4-0.1 0.1-0.3 0.5-0.4 0.6l-0.4 0.7c-0.2 0.3-0.8 1.1-1 1.4l-0.8 1.1c-0.3 0.3-0.8 1-1.1 1.3l-2.4 2.4c-0.2 0.2-1 0.9-1.2 1.1q-1.6 1.3-3.4 2.4zm-3.4-49.3q-2.3-0.9-4.8-1.2-2.5-0.2-4.9 0.4-2.4 0.5-4.6 1.7 1.2-0.5 2.5-0.9 1.3-0.3 2.7-0.5 1.3-0.1 2.6 0 1.4 0.1 2.7 0.4 1.3 0.3 2.6 0.8 1.2 0.5 2.4 1.2 1.1 0.7 2.1 1.6 1 0.9 1.9 2l0.1 0.1 0.1 0.1 0.2 0.3c0.3 0.3 0.6 0.7 0.9 1q1.5 2.1 2.6 4.3 1.2 2.3 1.9 4.7 0.8 2.4 1.1 4.9 0.3 2.5 0.1 5.1-0.1 2.5-0.7 4.9-0.5 2.5-1.5 4.8-1 2.4-2.4 4.5-1.3 2.1-3.1 4-1.9 2-4.2 3.7-2.2 1.6-4.8 2.8-2.5 1.2-5.3 1.9-2.7 0.7-5.5 0.8 1.7 0.1 3.5 0 1.7-0.2 3.4-0.5 1.7-0.4 3.4-1 1.6-0.6 3.2-1.3l1.2-0.7q0.4-0.2 0.8-0.4 0.4-0.3 0.7-0.5 0.4-0.3 0.8-0.5 0.3-0.3 0.7-0.5l0.7-0.6 0.1-0.1 0.3-0.2 0.5-0.5c0.4-0.2 0.8-0.6 1.1-0.9q2.1-2 3.7-4.3 1.6-2.4 2.8-5 1.2-2.6 1.8-5.4 0.6-2.8 0.7-5.7 0.1-2.8-0.4-5.7-0.5-2.8-1.5-5.5-1-2.6-2.5-5.1-1.5-2.4-3.4-4.5-0.3-0.3-0.5-0.5-0.3-0.3-0.5-0.5-0.3-0.3-0.6-0.5-0.2-0.3-0.5-0.5-1.9-1.6-4.2-2.5zm-0.5 7.3q0 0 0 0 0 0 0 0 0 0 0 0zm0 0c0 0 0 0 0 0-4.6-3.8-11.8-4.5-16.7-0.9q1-0.6 2.1-0.9 1.1-0.4 2.2-0.6 1.2-0.2 2.3-0.2 1.2 0 2.3 0.2 1.2 0.2 2.3 0.6 1.1 0.4 2.1 1 1 0.5 1.9 1.2 0.9 0.8 1.7 1.6c0.3 0.4 0.8 0.9 1 1.2 0.3 0.3 0.6 0.6 0.8 0.9q1 1.4 1.8 2.9 0.9 1.5 1.5 3.1 0.6 1.6 1 3.2 0.5 1.7 0.6 3.4 0.2 1.7 0.2 3.4 0 1.7-0.3 3.4-0.3 1.6-0.8 3.3-0.4 1.6-1.1 3.2-0.7 1.4-1.5 2.7-0.8 1.3-1.7 2.5-1 1.2-2 2.3-1.1 1.1-2.3 2-1.2 0.9-2.5 1.7-1.3 0.8-2.7 1.5-1.4 0.6-2.8 1.1-1.5 0.5-3 0.8-0.6 0.1-1.2 0.2-0.6 0.1-1.2 0.1-0.6 0.1-1.3 0.1-0.6 0.1-1.2 0.1 1.3 0.1 2.5 0.1 1.3 0 2.5-0.1 1.3-0.2 2.5-0.4 1.3-0.3 2.5-0.7c0.3-0.1 0.8-0.3 1.1-0.4l0.3-0.1 0.2-0.1 0.1-0.1 0.6-0.2q1.4-0.7 2.8-1.5 1.3-0.8 2.6-1.8 1.2-0.9 2.3-2.1 1.1-1.1 2-2.3 1-1.3 1.8-2.6 0.8-1.4 1.5-2.8 0.6-1.5 1-3 0.5-1.5 0.8-3 0.2-1.6 0.3-3.2 0.1-1.5 0-3.1-0.1-1.6-0.4-3.1-0.3-1.6-0.8-3.1-0.5-1.5-1.2-2.9-0.6-1.4-1.5-2.8-0.8-1.3-1.8-2.6-1-1.2-2.1-2.3c-0.4-0.3-0.7-0.6-1.1-0.9zm-12.6 42.4c-3 1.2-6.2 1.7-9.4 1.6q1.2 0.2 2.5 0.3 1.2 0.1 2.4 0 1.3-0.1 2.5-0.3 1.2-0.3 2.4-0.6 1.3-0.5 2.5-1 1.3-0.6 2.4-1.3 1.2-0.8 2.3-1.6 1-0.9 2-1.9 0.9-1 1.8-2.1 0.8-1.1 1.5-2.3 0.7-1.2 1.2-2.4 0.5-1.3 0.9-2.6 0.4-1.3 0.6-2.7 0.2-1.4 0.3-2.8 0-1.3-0.1-2.7-0.1-1.4-0.4-2.7-0.3-1.4-0.8-2.7-0.4-1.3-1-2.5-0.6-1.3-1.4-2.4-0.7-1.2-1.6-2.2-0.4-0.5-0.8-0.9-0.4-0.4-0.8-0.8-0.4-0.4-0.8-0.7-0.4-0.4-0.9-0.7-1.3-1-2.9-1.6-1.6-0.6-3.2-0.8-1.7-0.2-3.4 0-1.6 0.3-3.2 1 0.8-0.3 1.6-0.4 0.8-0.1 1.6-0.2 0.7 0 1.5 0 0.8 0.1 1.6 0.3 0.8 0.1 1.5 0.4 0.8 0.2 1.5 0.5 0.7 0.4 1.4 0.8 0.7 0.4 1.3 0.9 0.3 0.3 0.6 0.5 0.3 0.3 0.5 0.6 0.3 0.2 0.6 0.5 0.2 0.3 0.5 0.6l0.6 0.9 0.7 0.8 0.5 0.9q1.1 1.7 1.9 3.6 0.7 1.9 1.1 4 0.4 2 0.4 4 0 2.1-0.3 4.1-0.4 2-1.1 3.9-0.8 1.9-1.8 3.7-1.1 1.7-2.5 3.3-1.4 1.5-3 2.7c-0.3 0.2-0.7 0.6-1.1 0.8l-1.1 0.7c-0.4 0.2-0.8 0.4-1.2 0.6l-0.9 0.5-1 0.4z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@@ -45,7 +45,7 @@ class Configuration {
final List<String> onlineSecureKeys = [
keyKey,
secretKeyKey,
authSecretKeyKey
authSecretKeyKey,
];
final kTempFolderDeletionTimeBuffer = const Duration(days: 1).inMicroseconds;

View File

@@ -122,7 +122,7 @@ class _CredentialBuilder {
return headers
..addAll(
<String, String>{
'X-Sentry-Auth': '$_authHeader, sentry_timestamp=$timestamp'
'X-Sentry-Auth': '$_authHeader, sentry_timestamp=$timestamp',
},
);
}

View File

@@ -9,6 +9,7 @@
"onBoardingGetStarted": "Los geht's",
"setupFirstAccount": "Ihr erstes Konto einrichten",
"importScanQrCode": "Scannen eines QR-Codes",
"qrCode": "QR-Code",
"importEnterSetupKey": "Einen Setup-Schlüssel eingeben",
"importAccountPageTitle": "Kontodaten eingeben",
"secretCanNotBeEmpty": "Geheimnis darf nicht leer sein",
@@ -57,6 +58,8 @@
}
},
"contactSupport": "Support kontaktieren",
"rateUsOnStore": "Bewerte uns auf {storeName}",
"blog": "Blog",
"verifyPassword": "Passwort überprüfen",
"pleaseWait": "Bitte warten...",
"generatingEncryptionKeysTitle": "Generierung von Verschlüsselungsschlüsseln...",
@@ -72,10 +75,20 @@
"changePassword": "Passwort ändern",
"data": "Datei",
"importCodes": "Codes importieren",
"importTypeEnteEncrypted": "ente verschlüsselt exportieren",
"passwordForDecryptingExport": "Passwort um den Export zu entschlüsseln",
"passwordEmptyError": "Passwort kann nicht leer sein",
"importFromApp": "Importiere Codes von {appName}",
"importGoogleAuthGuide": "Exportiere deine Accounts von Google Authenticator zu einem QR-Code, durch die \"Konten übertragen\" Option. Scanne den QR-Code danach mit einem anderen Gerät.\n\nTipp: Du kannst die Kamera eines Laptops verwenden, um ein Foto den dem QR-Code zu erstellen.",
"importSelectJsonFile": "Wähle eine JSON-Datei",
"importEnteEncGuide": "Wähle die von ente exportierte, verschlüsselte JSON-Datei",
"exportCodes": "Codes exportieren",
"importLabel": "Importieren",
"importInstruction": "Bitte wählen sie eine Datei die Codes in folgendem Format beinhaltet",
"importCodeDelimiterInfo": "Codes können in einer neuen Zeile stehen oder durch Kommata getrennt sein",
"selectFile": "Datei auswählen",
"emailVerificationToggle": "E-Mail-Verifizierung",
"authToChangeEmailVerificationSetting": "Bitte Authentifizieren um die E-Mail Bestätigung zu ändern",
"authToViewYourRecoveryKey": "Bitte authentifizieren um ihren Wiederherstellungscode anzuzeigen",
"authToChangeYourEmail": "Bitte authentifizieren um ihre Emailadresse zu ändern",
"authToChangeYourPassword": "Bitte authentifizieren um ihr Passwort zu ändern",
@@ -85,6 +98,7 @@
"no": "Nein",
"email": "E-Mail",
"support": "Unterstützung",
"general": "Allgemein",
"settings": "Einstellungen",
"copied": "Kopiert",
"pleaseTryAgain": "Bitte versuchen Sie es erneut",
@@ -94,6 +108,17 @@
"enterYourPasswordHint": "Geben Sie Ihr Passwort ein",
"forgotPassword": "Passwort vergessen",
"oops": "Hopla",
"suggestFeatures": "Features vorschlagen",
"faq": "FAQ",
"faq_q_1": "Wie sicher ist ente Auth?",
"faq_a_1": "Alle Codes, die Sie über ente sichern, werden Ende-zu-Ende-verschlüsselt gespeichert. Das bedeutet, dass nur Sie auf Ihre Codes zugreifen können. Unsere Apps sind Open Source und unsere Kryptografie wurde extern überprüft.",
"faq_q_2": "Kann ich auf meine Codes auf dem Desktop zugreifen?",
"faq_a_2": "Sie können auf Ihre Codes im Web via auth.ente.io zugreifen.",
"faq_q_3": "Wie kann ich Codes löschen?",
"faq_a_3": "Sie können einen Code löschen, indem Sie auf dem Code nach links wischen.",
"faq_q_4": "Wie kann ich das Projekt unterstützen?",
"faq_a_4": "Sie können die Entwicklung dieses Projekts unterstützen, indem Sie unsere Fotos-App auf ente.io abonnieren.",
"faq_q_5": "Wie kann ich FaceID Sperre in ente Auth aktivieren",
"somethingWentWrongMessage": "Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut",
"leaveFamily": "Familie verlassen",
"leaveFamilyMessage": "Sind Sie sicher, dass Sie den Familien-Plan verlassen wollen?",
@@ -160,6 +185,7 @@
"recoveryKeySaveDescription": "Wir speichern diesen Schlüssel nicht. Sichern sie dieses diesen Schlüssel bestehend aus 24 Wörtern an einem sicheren Platz.",
"doThisLater": "Auf später verschieben",
"saveKey": "Schlüssel speichern",
"back": "Zurück",
"createAccount": "Account erstellen",
"passwordStrength": "Passwortstärke: {passwordStrengthValue}",
"@passwordStrength": {
@@ -223,6 +249,10 @@
"privacy": "Datenschutz",
"terms": "Bestimmungen",
"checkForUpdates": "Auf Updates prüfen",
"downloadUpdate": "Herunterladen",
"criticalUpdateAvailable": "Kritische neue Aktualisierung ist verfügbar",
"updateAvailable": "Aktualisierung verfügbar",
"update": "Aktualisierung",
"checking": "Prüfe...",
"youAreOnTheLatestVersion": "Sie haben die aktuellste Version",
"warning": "Warnung",
@@ -267,5 +297,21 @@
"thisWillLogYouOutOfTheFollowingDevice": "Dadurch wirst du von folgendem Gerät abgemeldet:",
"terminateSession": "Sitzungen beenden?",
"terminate": "Beenden",
"thisDevice": "Dieses Gerät"
"thisDevice": "Dieses Gerät",
"toResetVerifyEmail": "Um Ihr Passwort zurückzusetzen, verifizieren Sie bitte zuerst Ihre E-Mail-Adresse.",
"thisEmailIsAlreadyInUse": "Diese E-Mail-Adresse wird bereits verwendet",
"verificationFailedPleaseTryAgain": "Verifizierung fehlgeschlagen, bitte versuchen Sie es erneut",
"yourVerificationCodeHasExpired": "Ihr Bestätigungscode ist abgelaufen",
"incorrectCode": "Falscher Code",
"sorryTheCodeYouveEnteredIsIncorrect": "Leider ist der eingegebene Code falsch",
"emailChangedTo": "E-Mail-Adresse geändert zu {newEmail}",
"authenticationFailedPleaseTryAgain": "Authentifizierung fehlgeschlagen, versuchen Sie es bitte erneut",
"authenticationSuccessful": "Authentifizierung erfolgreich!",
"twofactorAuthenticationSuccessfullyReset": "Zwei-Faktor-Authentifizierung (2FA) erfolgreich zurückgesetzt",
"incorrectRecoveryKey": "Falscher Wiederherstellungs-Schlüssel",
"theRecoveryKeyYouEnteredIsIncorrect": "Der eingegebene Wiederherstellungs-Schlüssel ist ungültig",
"enterPassword": "Passwort eingeben",
"editCodeAuthMessage": "Authentifizieren, um Code zu bearbeiten",
"deleteCodeAuthMessage": "Authentifizieren, um Code zu löschen",
"showQRAuthMessage": "Authentifizieren, um QR-Code anzuzeigen"
}

View File

@@ -330,5 +330,11 @@
"sigInBackupReminder": "Please export your codes to ensure that you have a backup you can restore from.",
"offlineModeWarning": "You have chosen to proceed without backups. Please take manual backups to make sure your codes are safe.",
"showLargeIcons": "Show large icons",
"focusOnSearchBar": "Focus search on app start"
"shouldHideCode": "Hide codes",
"focusOnSearchBar": "Focus search on app start",
"confirmUpdatingkey": "Are you sure you want to update the secret key?",
"minimizeAppOnCopy": "Minimize app on copy",
"editCodeAuthMessage": "Authenticate to edit code",
"deleteCodeAuthMessage": "Authenticate to delete code",
"showQRAuthMessage": "Authenticate to show QR code"
}

View File

@@ -226,5 +226,8 @@
"authToExportCodes": "Por favor, autentifíquese para exportar sus códigos",
"sorry": "Lo sentimos",
"importFailureDesc": "No se pudo analizar el archivo seleccionado.\n¡Por favor escriba a support@ente.io si necesita ayuda!",
"pendingSyncs": "Atención"
"pendingSyncs": "Atención",
"editCodeAuthMessage": "Autenticar para editar código",
"deleteCodeAuthMessage": "Autenticar para borrar código",
"showQRAuthMessage": "Autenticar para mostrar código QR"
}

View File

@@ -231,5 +231,8 @@
"importFailureDesc": "نتوانستیم فایل انتخابی را تجزیه و تحلیل کنیم.\nاگر به کمک نیاز دارید، لطفا به support@ente.io ایمیل بزنید!",
"pendingSyncs": "اخطار",
"pendingSyncsWarningBody": "برخی از کدهای شما پشتیبان گیری نشده اند.\n\nلطفا قبل از خروج، مطمئن شوید که یک نسخه پشتیبان برای این کدها دارید.",
"thisDevice": "این دستگاه"
"thisDevice": "این دستگاه",
"editCodeAuthMessage": "احراز هویت برای ویرایش کد",
"deleteCodeAuthMessage": "احراز هویت برای حذف کد",
"showQRAuthMessage": "احراز هویت برای نمایش کد QR"
}

View File

@@ -119,5 +119,8 @@
"moderateStrength": "Kohtalainen salasana",
"confirmPassword": "Vahvista salasana",
"close": "Sulje",
"oopsSomethingWentWrong": "Hupsista! Jotakin meni nyt pieleen."
"oopsSomethingWentWrong": "Hupsista! Jotakin meni nyt pieleen.",
"editCodeAuthMessage": "Autentikoidu muokataksesi koodia",
"deleteCodeAuthMessage": "Autentikoidu poistaaksesi koodin",
"showQRAuthMessage": "Autentikoidu näyttääksesi QR-koodin"
}

View File

@@ -9,8 +9,12 @@
"onBoardingGetStarted": "Premiers pas",
"setupFirstAccount": "Configurez votre premier compte",
"importScanQrCode": "Scannez un QR Code",
"qrCode": "QR Code",
"importEnterSetupKey": "Saisir une clé de configuration",
"importAccountPageTitle": "Saisir les détails du compte",
"bothIssuerAndAccountCanNotBeEmpty": "L'émetteur et le compte ne peuvent pas être vides",
"incorrectDetails": "Détails incorrects",
"pleaseVerifyDetails": "Veuillez vérifier vos informations et réessayez",
"codeIssuerHint": "Émetteur",
"codeSecretKeyHint": "Clé secrète",
"codeAccountHint": "Compte (vous@domaine.fr)",
@@ -53,6 +57,9 @@
}
},
"contactSupport": "Contacter le support",
"rateUsOnStore": "Notez-nous sur {storeName}",
"blog": "Blog",
"merchandise": "Marchandise",
"verifyPassword": "Vérifier le mot de passe",
"pleaseWait": "Veuillez patienter...",
"generatingEncryptionKeysTitle": "Génération des clés de chiffrement...",
@@ -68,13 +75,23 @@
"changePassword": "Modifier le mot de passe",
"data": "Données",
"importCodes": "Importer les codes",
"importTypePlainText": "Texte brut",
"importTypeEnteEncrypted": "ente Exportation chiffrée",
"passwordForDecryptingExport": "Mot de passe pour déchiffrer l'exportation",
"passwordEmptyError": "Le mot de passe ne peut pas être vide",
"importFromApp": "Importer des codes depuis {appName}",
"importGoogleAuthGuide": "Exportez vos comptes depuis Google Authenticator vers un code QR en utilisant l'option \"Transférer des comptes\". Ensuite, en utilisant un autre appareil, scannez le code QR.\n\nAstuce : Vous pouvez utiliser la webcam de votre ordinateur portable pour prendre une photo du code QR.",
"importSelectJsonFile": "Sélectionnez un fichier JSON",
"importEnteEncGuide": "Sélectionnez le fichier JSON chiffré exporté à partir de ente",
"importRaivoGuide": "Utilisez l'option \"Exporter les OTPs vers l'archive Zip\" dans les paramètres de Raivo.\n\nExtrayez le fichier zip et importez le fichier JSON.",
"importAegisGuide": "Utilisez l'option \"Exporter le coffre-fort\" dans les paramètres d'Aegis.\n\nSi votre coffre-fort est crypté, vous devrez saisir le mot de passe du coffre-fort pour déchiffrer le coffre-fort.",
"exportCodes": "Exporter les codes",
"importLabel": "Importer",
"importInstruction": "Veuillez sélectionner un fichier qui contient une liste de vos codes dans le format suivant",
"importCodeDelimiterInfo": "Les codes peuvent être séparés par une virgule ou un retour à la ligne",
"selectFile": "Sélectionner le fichier",
"emailVerificationToggle": "Vérification de l'adresse e-mail",
"emailVerificationEnableWarning": "Si vous stockez le 2FA dans votre e-mail avec nous, l'activation de la vérification d'e-mail pourrait entraîner un blocage. Si vous êtes exclu d'un service, il se peut que vous ne puissiez pas vous connecter à l'autre.",
"authToChangeEmailVerificationSetting": "Veuillez vous authentifier pour modifier votre adresse e-mail",
"authToViewYourRecoveryKey": "Veuillez vous authentifier pour afficher votre clé de récupération",
"authToChangeYourEmail": "Veuillez vous authentifier pour modifier votre adresse e-mail",
@@ -85,6 +102,7 @@
"no": "Non",
"email": "E-mail",
"support": "Support",
"general": "Général",
"settings": "Paramètres",
"copied": "Copié",
"pleaseTryAgain": "Veuillez réessayer",
@@ -96,12 +114,16 @@
"oops": "Oups",
"suggestFeatures": "Suggérer des fonctionnalités",
"faq": "FAQ",
"faq_q_1": "Quelle est la sécurité de ente Auth?",
"faq_a_1": "Tous les codes que vous sauvegardez via ente sont stockés de bout en bout. Cela signifie que vous seul pouvez accéder à vos codes. Nos applications sont open source et notre cryptographie a été auditée à l'extérieur.",
"faq_q_2": "Puis-je accéder à mes codes sur mon ordinateur ?",
"faq_a_2": "Vous pouvez accéder à vos codes sur le web via auth.ente.io.",
"faq_q_3": "Comment puis-je supprimer des codes ?",
"faq_a_3": "Vous pouvez supprimer un code en glissant vers la gauche.",
"faq_q_4": "Comment puis-je soutenir le projet?",
"faq_a_4": "Vous pouvez soutenir le développement de ce projet en vous abonnant à notre application Photos, ente.io.",
"faq_q_5": "Comment puis-je activer le verrou FaceID en ente Auth",
"faq_a_5": "Vous pouvez activer le verrouillage FaceID dans Paramètres → Sécurité → Écran de verrouillage.",
"somethingWentWrongMessage": "Quelque chose s'est mal passé, veuillez recommencer",
"leaveFamily": "Quitter le plan familial",
"leaveFamilyMessage": "Êtes-vous certains de vouloir quitter le plan familial?",
@@ -162,6 +184,7 @@
"enterDetailsManually": "Saisir les détails manuellement",
"edit": "Éditer",
"copiedToClipboard": "Copié dans le presse-papiers",
"copiedNextToClipboard": "Copié le code suivant dans le presse-papiers",
"error": "Erreur",
"recoveryKeyCopiedToClipboard": "Clé de récupération copiée dans le presse-papiers",
"recoveryKeyOnForgotPassword": "Si vous oubliez votre mot de passe, la seule façon de récupérer vos données sera grâce à cette clé.",
@@ -232,6 +255,10 @@
"privacy": "Confidentialité",
"terms": "Conditions",
"checkForUpdates": "Vérifier les mises à jour",
"downloadUpdate": "Télécharger",
"criticalUpdateAvailable": "Mise à jour critique disponible",
"updateAvailable": "Une mise à jour est disponible",
"update": "Mise à jour",
"checking": "Vérification...",
"youAreOnTheLatestVersion": "Vous êtes sur la dernière version",
"warning": "Attention",
@@ -290,5 +317,21 @@
"incorrectRecoveryKey": "Clé de récupération non valide",
"theRecoveryKeyYouEnteredIsIncorrect": "La clé de récupération que vous avez entrée est incorrecte",
"enterPassword": "Saisissez le mot de passe",
"export": "Exporter"
"selectExportFormat": "Choisir le format d'exportation",
"exportDialogDesc": "Les exportations chiffrées seront protégées par un mot de passe de votre choix.",
"encrypted": "Chiffré",
"plainText": "Texte brut",
"passwordToEncryptExport": "Mot de passe pour chiffrer l'export",
"export": "Exporter",
"useOffline": "Utiliser sans sauvegardes",
"signInToBackup": "Connectez-vous pour sauvegarder vos codes",
"singIn": "Se connecter",
"sigInBackupReminder": "Veuillez exporter vos codes pour vous assurer que vous avez une sauvegarde à partir de laquelle vous pouvez restaurer.",
"offlineModeWarning": "Vous avez choisi de procéder sans sauvegarde. Veuillez prendre des sauvegardes manuelles pour vous assurer que vos codes sont sûrs.",
"showLargeIcons": "Afficher les grandes icônes",
"shouldHideCode": "Cacher les codes",
"focusOnSearchBar": "Cibler le champ de recherche au démarrage de l'application",
"editCodeAuthMessage": "Authentification requise pour modifier le code",
"deleteCodeAuthMessage": "Authentification requise pour supprimer le code",
"showQRAuthMessage": "Authentification requise pour afficher le code QR"
}

340
lib/l10n/arb/app_he.arb Normal file
View File

@@ -0,0 +1,340 @@
{
"account": "חשבון",
"recoveryKey": "מפתח שחזור",
"counterAppBarTitle": "מונה",
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "גיבוי מאובטח של קודי האימות שלך",
"onBoardingGetStarted": "התחילו",
"setupFirstAccount": "התקנה של החשבון הראשון שלך",
"importScanQrCode": "סרוק קוד QR",
"qrCode": "קוד QR",
"importEnterSetupKey": "הכנס מפתח התקנה",
"importAccountPageTitle": "הכנס פרטי חשבון",
"secretCanNotBeEmpty": "סוד לא יכול להיות ריק",
"bothIssuerAndAccountCanNotBeEmpty": "גם המנפיק והחשבון לא יכולים להיות ריקים",
"incorrectDetails": "פרטים לא נכונים",
"pleaseVerifyDetails": "אנא אמתו את הפרטים ונסו שוב",
"codeIssuerHint": "מנפיק",
"codeSecretKeyHint": "מפתח סודי",
"codeAccountHint": "חשבון(you@domain.com)",
"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 תוך שימוש באפשרות \"Transfer Accounts\". אז, תוך שימוש במכשיר אחר, סרוק את הקוד QR.",
"importSelectJsonFile": "בחר קובץ JSON",
"importEnteEncGuide": "בחר את קובץ ה-JSON המוצפן שייוצא מ-ente",
"importRaivoGuide": "השתמש באפוציה של \"Export OTPs to Zip archive\" בהגדרות של Raivo.",
"importAegisGuide": "אנא השתמש באפשרות של \"ייצוא של הכספת\" בתוך ההגדרות של Aegis.",
"exportCodes": "ייצא קודים",
"importLabel": "יבוא",
"importInstruction": "אנא בחר קובץ שמכיל רשימה של הקודים שלך לפי הפורמט הבא",
"importCodeDelimiterInfo": "הקודים יכולים להיות מופרדים על-ידי פסיק או שורה חדשה",
"selectFile": "בחר קובץ",
"emailVerificationToggle": "אימות אימייל",
"emailVerificationEnableWarning": "אם אתם מאחסנים את האימות הדו שלבי לאיימיל שלך איתנו, הדלקה של אימות אימייל יכול להגיע לנעילה. אם אתם ננעלים מחוץ לאחד השירותים, אתם אולי לא תצליחו להתחבר לאחר.",
"authToChangeEmailVerificationSetting": "אנא התאמת על מנת לשנות את אימות הדוא\"ל",
"authToViewYourRecoveryKey": "אנא אמת על מנת לראות את מפתח השחזור שלך",
"authToChangeYourEmail": "אנא אמת על מנת לשנות את הסיסמא שלך",
"authToChangeYourPassword": "אנא אמת על מנת לשנות את הסיסמא שלך",
"ok": "אוקיי",
"cancel": "בטל",
"yes": "כן",
"no": "לא",
"email": "דוא\"ל",
"support": "תמיכה",
"general": "כללי",
"settings": "הגדרות",
"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": "איך אפשר למחוק קודים?",
"faq_a_3": "אתה יכול למחוק את הקוד על-ידי החלקה שמאלה על הפריט הזה.",
"faq_q_4": "איך אפשר לתמוך בפרויקט זה?",
"faq_a_4": "אתה יכול לתמוך בפיתוח של הפרויקט הזה על ידי שתירשם לאפליקצית תמונות שלנו ב-ente.io.",
"faq_q_5": "איך אני יכול להפעיל מנעול FaceID ב-ente Auth",
"faq_a_5": "אתה יכול להפעיל מנעול FaceID תחת הגדרות -> אבטחה -> מסך נעילה.",
"somethingWentWrongMessage": "משהו השתבש, אנא נסה שנית",
"leaveFamily": "עזוב משפחה",
"leaveFamilyMessage": "האם אתה בטוח שאתה רוצה לעזוב את התוכנית המשפחתית?",
"inFamilyPlanMessage": "אתה על תוכנית משפחתית!",
"swipeHint": "החלק שמאלה כדי לערוך או להסיר קודים",
"scan": "סרוק",
"scanACode": "סרוק קוד",
"verify": "אמת",
"verifyEmail": "אימות דוא\"ל",
"enterCodeHint": "הכנס את הקוד בעל 6 ספרות מתוך\nאפליקציית האימות שלך",
"lostDeviceTitle": "איבדת את המכשיר?",
"twoFactorAuthTitle": "אימות דו-שלבי",
"recoverAccount": "שחזר חשבון",
"enterRecoveryKeyHint": "הזן את מפתח השחזור שלך",
"recover": "שחזר",
"contactSupportViaEmailMessage": "אנא תשלח דוא\"ל ל{email} מהכתובת דוא\"ל שנרשמת איתה",
"@contactSupportViaEmailMessage": {
"placeholders": {
"email": {
"type": "String"
}
}
},
"noRecoveryKeyTitle": "אין מפתח שחזור?",
"enterEmailHint": "הכנס את כתובת הדוא״ל שלך",
"invalidEmailTitle": "כתובת דוא״ל לא תקינה",
"invalidEmailMessage": "אנא הכנס כתובת דוא\"ל תקינה.",
"deleteAccount": "מחק חשבון",
"deleteAccountQuery": "אנו מצטערים שאתה עוזב. האם יש בעיות שאתה חווה?",
"yesSendFeedbackAction": "כן, שלח משוב",
"noDeleteAccountAction": "לא, מחק את החשבון",
"initiateAccountDeleteTitle": "אנא אמת על מנת להתחיל את מחיקת החשבון שלך",
"confirmAccountDeleteTitle": "האם אתה בטוח שברצונך למחוק את חשבונך?",
"confirmAccountDeleteMessage": "המידע שלך שהועלה, ברחבי כל האפליקציות (גם ב-Photos וב-Authenticator), יהיה מועמד למחיקה, וגם המחשבון שלך ימחק לצמיתות.",
"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": "שמור מפתח",
"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": "נראה שמשהו לא פעל כשורה. אנא נסה שוב אחרי כמה זמן. אם הבעיה ממשיכה, אנא צור קשר עם צוות התמיכה שלנו.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "נראה שמשהו לא פעל כשורה. אנא נסה שוב אחרי כמה זמן. אם הבעיה ממשיכה, אנא צור קשר עם צוות התמיכה שלנו.",
"about": "אודות",
"weAreOpenSource": "הקוד שלנו פתוח!",
"privacy": "פרטיות",
"terms": "תנאים",
"checkForUpdates": "בדוק אם קיימים עדכונים",
"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": "הסתר קודים",
"focusOnSearchBar": "התמקד בחיפוש בהתחלת האפליקציה",
"confirmUpdatingkey": "האם אתה בטוח שברצונך לעדכן את המפתח הסודי?",
"minimizeAppOnCopy": "מזער אפליקציה בהעתקה",
"editCodeAuthMessage": "אמת כדי לערוך קוד",
"deleteCodeAuthMessage": "אמת כדי למחוק קוד",
"showQRAuthMessage": "אמת כדי להראות קוד QR"
}

View File

@@ -92,6 +92,7 @@
"importCodeDelimiterInfo": "I codici possono essere separati da una virgola o da una nuova riga",
"selectFile": "Seleziona file",
"emailVerificationToggle": "Verifica email",
"emailVerificationEnableWarning": "Se memorizzate il 2FA per accedere alla vostra email con noi, l'attivazione della verifica dell'email potrebbe provocare dei problemi. Se siete rimasti bloccati fuori da un servizio, potreste non essere in grado di accedere anche all'altro.",
"authToChangeEmailVerificationSetting": "Autenticati per cambiare la verifica email",
"authToViewYourRecoveryKey": "Autenticati per visualizzare la tua chiave di recupero",
"authToChangeYourEmail": "Autenticati per cambiare la tua email",
@@ -329,5 +330,11 @@
"sigInBackupReminder": "Si prega di esportare i codici per assicurarsi di avere un backup da cui è possibile ripristinare.",
"offlineModeWarning": "Hai scelto di procedere senza backup. Si prega di eseguire backup manuali per assicurarsi che i codici siano al sicuro.",
"showLargeIcons": "Mostra icone grandi",
"focusOnSearchBar": "Apri ricerca all'avvio dell'app"
"shouldHideCode": "Nascondi i codici",
"focusOnSearchBar": "Apri ricerca all'avvio dell'app",
"confirmUpdatingkey": "Sei sicuro di voler aggiornare la chiave segreta?",
"minimizeAppOnCopy": "Riduci a icona l'app dopo la copia",
"editCodeAuthMessage": "Autenticarsi per modificare il codice",
"deleteCodeAuthMessage": "Autenticarsi per cancellare il codice",
"showQRAuthMessage": "Autenticarsi per mostrare il codice QR"
}

View File

@@ -263,5 +263,8 @@
"thisWillLogYouOutOfTheFollowingDevice": "以下のデバイスからログアウトします:",
"terminateSession": "セッションを終了しますか?",
"terminate": "終了",
"thisDevice": "このデバイス"
"thisDevice": "このデバイス",
"editCodeAuthMessage": "コードを編集するには認証が必要です",
"deleteCodeAuthMessage": "コードを削除するには認証が必要です",
"showQRAuthMessage": "QRコードを表示するには認証が必要です"
}

View File

@@ -329,5 +329,8 @@
"sigInBackupReminder": "Exporteer de codes zodat je een back-up hebt waarvandaan je kan herstellen.",
"offlineModeWarning": "Je hebt ervoor gekozen om verder te gaan zonder back-ups. Neem handmatige back-ups om ervoor te zorgen dat jouw codes veilig zijn.",
"showLargeIcons": "Grote iconen",
"focusOnSearchBar": "Focus zoekveld na starten app"
"focusOnSearchBar": "Focus zoekveld na starten app",
"editCodeAuthMessage": "Authenticeren om code te bewerken",
"deleteCodeAuthMessage": "Authenticeren om code te verwijderen",
"showQRAuthMessage": "Authenticeren om QR-code te tonen"
}

View File

@@ -263,5 +263,8 @@
"thisWillLogYouOutOfTheFollowingDevice": "To wyloguje Cię z tego urządzenia:",
"terminateSession": "Zakończyć sesję?",
"terminate": "Zakończ",
"thisDevice": "To urządzenie"
"thisDevice": "To urządzenie",
"editCodeAuthMessage": "Uwierzytelnij, aby edytować kod",
"deleteCodeAuthMessage": "Uwierzytelnij, aby usunąć kod",
"showQRAuthMessage": "Uwierzytelnij, aby pokazać kod QR"
}

View File

@@ -223,5 +223,8 @@
"sorry": "Desculpe",
"importFailureDesc": "Não foi possível analisar o arquivo selecionado.\nPor favor, escreva para support@ente.io se precisar de ajuda!",
"pendingSyncs": "Atenção",
"pendingSyncsWarningBody": "Alguns de seus códigos não foram salvos.\n\nPor favor, certifique-se que você possui um backup para esses códigos antes de sair."
"pendingSyncsWarningBody": "Alguns de seus códigos não foram salvos.\n\nPor favor, certifique-se que você possui um backup para esses códigos antes de sair.",
"editCodeAuthMessage": "Autenticar para editar o código",
"deleteCodeAuthMessage": "Autenticar para excluir o código",
"showQRAuthMessage": "Autenticar para mostrar o QR Code"
}

View File

@@ -316,5 +316,8 @@
"encrypted": "Зашифрованный",
"plainText": "Обычный текст",
"passwordToEncryptExport": "Пароль для шифрования экспорта",
"export": "Экспорт"
"export": "Экспорт",
"editCodeAuthMessage": "Аутентификация для редактирования кода",
"deleteCodeAuthMessage": "Аутентификация для удаления кода",
"showQRAuthMessage": "Аутентификация для отображения QR-кода"
}

View File

@@ -314,5 +314,8 @@
"encrypted": "Şifreli",
"plainText": "Düz metin",
"passwordToEncryptExport": "Dışa aktarımı şifrelemek için parola",
"export": "Dışa aktar"
"export": "Dışa aktar",
"editCodeAuthMessage": "Kodu düzenlemek için doğrulama yapın",
"deleteCodeAuthMessage": "Kodu silmek için doğrulama yapın",
"showQRAuthMessage": "QR kodunu göstermek için doğrulama yapın"
}

View File

@@ -267,5 +267,8 @@
"thisWillLogYouOutOfTheFollowingDevice": "Thao tác này sẽ đăng xuất bạn khỏi thiết bị sau:",
"terminateSession": "Chấm dứt phiên?",
"terminate": "Dừng lại",
"thisDevice": "Thiết bị này"
"thisDevice": "Thiết bị này",
"editCodeAuthMessage": "Xác minh để chỉnh sửa mã",
"deleteCodeAuthMessage": "Xác minh để xóa mã",
"showQRAuthMessage": "Xác minh để hiển thị mã QR"
}

View File

@@ -92,6 +92,7 @@
"importCodeDelimiterInfo": "代码可以用逗号或新行分隔。",
"selectFile": "选择文件",
"emailVerificationToggle": "电子邮件验证",
"emailVerificationEnableWarning": "如果您将 2FA 存储到我们的电子邮件中,则打开电子邮件验证可能会导致僵局。如果您被一项服务锁定,您可能无法登录另一项服务。",
"authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证",
"authToViewYourRecoveryKey": "请验证以查看您的恢复密钥",
"authToChangeYourEmail": "请验证以更改您的电子邮件",
@@ -329,5 +330,11 @@
"sigInBackupReminder": "请导出您的代码以确保您有可以恢复的备份。",
"offlineModeWarning": "您已选择在不进行备份的情况下继续操作。请手动备份以确保您的代码安全。",
"showLargeIcons": "显示大图标",
"focusOnSearchBar": "应用启动后聚焦搜索"
"shouldHideCode": "隐藏代码",
"focusOnSearchBar": "应用启动后聚焦搜索",
"confirmUpdatingkey": "您确定要更新此密钥吗?",
"minimizeAppOnCopy": "复制时最小化应用",
"editCodeAuthMessage": "编辑代码需要身份验证",
"deleteCodeAuthMessage": "删除代码需要身份验证",
"showQRAuthMessage": "显示QR码需要身份验证"
}

View File

@@ -24,7 +24,7 @@ Locale localResolutionCallBack(locales, supportedLocales) {
Locale? languageCodeMatch;
final Map<String, Locale> languageCodeToLocale = {
for (Locale supportedLocale in appSupportedLocales)
supportedLocale.languageCode: supportedLocale
supportedLocale.languageCode: supportedLocale,
};
for (Locale locale in locales) {

View File

@@ -21,6 +21,7 @@ import 'package:ente_auth/ui/utils/icon_utils.dart';
import 'package:ente_auth/utils/crypto_util.dart';
import 'package:flutter/foundation.dart';
import "package:flutter/material.dart";
import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart';
@@ -30,6 +31,7 @@ void main() async {
WidgetsFlutterBinding.ensureInitialized();
final savedThemeMode = await AdaptiveTheme.getThemeMode();
await _runInForeground(savedThemeMode);
FlutterDisplayMode.setHighRefreshRate();
}
Future<void> _runInForeground(AdaptiveThemeMode? savedThemeMode) async {

View File

@@ -1,5 +1,7 @@
import "package:ente_auth/l10n/l10n.dart";
import 'package:ente_auth/models/code.dart';
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
import 'package:ente_auth/ui/components/models/button_result.dart';
import 'package:ente_auth/utils/dialog_util.dart';
import 'package:ente_auth/utils/totp_util.dart';
import "package:flutter/material.dart";
@@ -10,7 +12,8 @@ class SetupEnterSecretKeyPage extends StatefulWidget {
SetupEnterSecretKeyPage({this.code, Key? key}) : super(key: key);
@override
State<SetupEnterSecretKeyPage> createState() => _SetupEnterSecretKeyPageState();
State<SetupEnterSecretKeyPage> createState() =>
_SetupEnterSecretKeyPageState();
}
class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
@@ -25,7 +28,8 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
text: widget.code != null ? safeDecode(widget.code!.issuer).trim() : null,
);
_accountController = TextEditingController(
text: widget.code != null ? safeDecode(widget.code!.account).trim() : null,
text:
widget.code != null ? safeDecode(widget.code!.account).trim() : null,
);
_secretController = TextEditingController(
text: widget.code != null ? widget.code!.secret : null,
@@ -110,7 +114,7 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
SizedBox(
width: 400,
child: OutlinedButton(
onPressed: () {
onPressed: () async {
if ((_accountController.text.trim().isEmpty &&
_issuerController.text.trim().isEmpty) ||
_secretController.text.trim().isEmpty) {
@@ -118,31 +122,45 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
if (_secretController.text.trim().isEmpty) {
message = context.l10n.secretCanNotBeEmpty;
} else {
message = context.l10n.bothIssuerAndAccountCanNotBeEmpty;
message =
context.l10n.bothIssuerAndAccountCanNotBeEmpty;
}
_showIncorrectDetailsDialog(context, message: message);
return;
}
try {
final account = _accountController.text.trim();
final issuer = _issuerController.text.trim();
final secret = _secretController.text.trim().replaceAll(' ', '');
final Code newCode = widget.code == null
? Code.fromAccountAndSecret(
account,
issuer,
secret,
)
: widget.code!.copyWith(
account: account,
issuer: issuer,
secret: secret,
);
// Verify the validity of the code
getOTP(newCode);
Navigator.of(context).pop(newCode);
} catch (e) {
_showIncorrectDetailsDialog(context);
ButtonResult? result = await showChoiceActionSheet(
context,
title: context.l10n.warning,
body: context.l10n.confirmUpdatingkey,
firstButtonLabel: context.l10n.yes,
secondButtonAction: ButtonAction.cancel,
secondButtonLabel: context.l10n.cancel,
);
if (result == null) return;
if (result.action == ButtonAction.first) {
try {
final account = _accountController.text.trim();
final issuer = _issuerController.text.trim();
final secret =
_secretController.text.trim().replaceAll(' ', '');
final Code newCode = widget.code == null
? Code.fromAccountAndSecret(
account,
issuer,
secret,
)
: widget.code!.copyWith(
account: account,
issuer: issuer,
secret: secret,
);
// Verify the validity of the code
getOTP(newCode);
Navigator.of(context).pop(newCode);
} catch (e) {
_showIncorrectDetailsDialog(context);
}
}
},
child: Padding(
@@ -153,7 +171,7 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
child: Text(l10n.saveAction),
),
),
)
),
],
),
),

View File

@@ -89,7 +89,7 @@ class ViewQrPage extends StatelessWidget {
child: Text(l10n.back),
),
),
)
),
],
),
),

View File

@@ -11,7 +11,9 @@ class PreferenceService {
static const kHasShownCoachMarkKey = "has_shown_coach_mark";
static const kShouldShowLargeIconsKey = "should_show_large_icons";
static const kShouldHideCodesKey = "should_hide_codes";
static const kShouldAutoFocusOnSearchBar = "should_auto_focus_on_search_bar";
static const kShouldMinimizeOnCopy = "should_minimize_on_copy";
Future<void> init() async {
_prefs = await SharedPreferences.getInstance();
@@ -42,6 +44,15 @@ class PreferenceService {
Bus.instance.fire(IconsChangedEvent());
}
bool shouldHideCodes() {
return _prefs.getBool(kShouldHideCodesKey) ?? false;
}
Future<void> setHideCodes(bool value) async {
await _prefs.setBool(kShouldHideCodesKey, value);
Bus.instance.fire(IconsChangedEvent());
}
bool shouldAutoFocusOnSearchBar() {
if (_prefs.containsKey(kShouldAutoFocusOnSearchBar)) {
return _prefs.getBool(kShouldAutoFocusOnSearchBar)!;
@@ -54,4 +65,16 @@ class PreferenceService {
await _prefs.setBool(kShouldAutoFocusOnSearchBar, value);
Bus.instance.fire(IconsChangedEvent());
}
bool shouldMinimizeOnCopy() {
if (_prefs.containsKey(kShouldMinimizeOnCopy)) {
return _prefs.getBool(kShouldMinimizeOnCopy)!;
} else {
return false;
}
}
Future<void> setShouldMinimizeOnCopy(bool value) async {
await _prefs.setBool(kShouldMinimizeOnCopy, value);
}
}

View File

@@ -371,39 +371,43 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
Expanded(
child: StyledText(
text: context.l10n.signUpTerms,
style:
Theme.of(context).textTheme.titleMedium!.copyWith(fontSize: 12),
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(fontSize: 12),
tags: {
'u-terms': StyledTextActionTag(
(String? text, Map<String?, String?> attrs) => Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return WebPage(
context.l10n.termsOfServicesTitle,
"https://ente.io/terms",
);
},
),
(String? text, Map<String?, String?> attrs) =>
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return WebPage(
context.l10n.termsOfServicesTitle,
"https://ente.io/terms",
);
},
),
),
style: const TextStyle(
decoration: TextDecoration.underline,
),
),
'u-policy': StyledTextActionTag(
(String? text, Map<String?, String?> attrs) => Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return WebPage(
context.l10n.privacyPolicyTitle,
"https://ente.io/privacy",
);
},
),
(String? text, Map<String?, String?> attrs) =>
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return WebPage(
context.l10n.privacyPolicyTitle,
"https://ente.io/privacy",
);
},
),
),
style: const TextStyle(
decoration: TextDecoration.underline,
),
)
),
},
),
),
@@ -434,20 +438,23 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
Expanded(
child: StyledText(
text: context.l10n.ackPasswordLostWarning,
style:
Theme.of(context).textTheme.titleMedium!.copyWith(fontSize: 12),
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(fontSize: 12),
tags: {
'underline': StyledTextActionTag(
(String? text, Map<String?, String?> attrs) => Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return WebPage(
context.l10n.encryption,
"https://ente.io/architecture",
);
},
),
(String? text, Map<String?, String?> attrs) =>
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return WebPage(
context.l10n.encryption,
"https://ente.io/architecture",
);
},
),
),
style: const TextStyle(
decoration: TextDecoration.underline,
),

View File

@@ -204,14 +204,14 @@ class _LoginPageState extends State<LoginPage> {
style: const TextStyle(
decoration: TextDecoration.underline,
),
)
),
},
),
),
Expanded(
flex: 2,
child: Container(),
)
),
],
),
),

View File

@@ -221,7 +221,7 @@ State<LoginPasswordVerificationPage> {
),
],
),
)
),
],
),
),

View File

@@ -152,7 +152,7 @@ class _OTTVerificationPageState extends State<OTTVerificationPage> {
SizedBox(
width: MediaQuery.of(context).size.width * 0.2,
height: 1,
)
),
],
),
),
@@ -203,7 +203,7 @@ class _OTTVerificationPageState extends State<OTTVerificationPage> {
decoration: TextDecoration.underline,
),
),
)
),
],
),
),

View File

@@ -310,7 +310,7 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
),
],
),
)
),
],
),
),

View File

@@ -191,7 +191,7 @@ class _RecoveryKeyPageState extends State<RecoveryKeyPage> {
children: _saveOptions(context, recoveryKey),
),
),
)
),
],
), // columnEnds
),

View File

@@ -196,7 +196,7 @@ class _VerifyRecoveryPageState extends State<VerifyRecoveryPage> {
),
),
),
const SizedBox(height: 20)
const SizedBox(height: 20),
],
),
),

View File

@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:io';
import 'package:clipboard/clipboard.dart';
import 'package:ente_auth/core/configuration.dart';
@@ -11,12 +12,14 @@ import 'package:ente_auth/services/preference_service.dart';
import 'package:ente_auth/store/code_store.dart';
import 'package:ente_auth/ui/code_timer_progress.dart';
import 'package:ente_auth/ui/utils/icon_utils.dart';
import 'package:ente_auth/utils/auth_util.dart';
import 'package:ente_auth/utils/dialog_util.dart';
import 'package:ente_auth/utils/toast_util.dart';
import 'package:ente_auth/utils/totp_util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:logging/logging.dart';
import 'package:move_to_background/move_to_background.dart';
class CodeWidget extends StatefulWidget {
final Code code;
@@ -35,11 +38,14 @@ class _CodeWidgetState extends State<CodeWidget> {
bool _isInitialized = false;
late bool hasConfiguredAccount;
late bool _shouldShowLargeIcon;
late bool _hideCode;
bool isMaskingEnabled = false;
@override
void initState() {
super.initState();
isMaskingEnabled = PreferenceService.instance.shouldHideCodes();
_hideCode = isMaskingEnabled;
_everySecondTimer =
Timer.periodic(const Duration(milliseconds: 500), (Timer t) {
String newCode = _getCurrentOTP();
@@ -63,6 +69,10 @@ class _CodeWidgetState extends State<CodeWidget> {
@override
Widget build(BuildContext context) {
if (isMaskingEnabled != PreferenceService.instance.shouldHideCodes()) {
isMaskingEnabled = PreferenceService.instance.shouldHideCodes();
_hideCode = isMaskingEnabled;
}
_shouldShowLargeIcon = PreferenceService.instance.shouldShowLargeIcons();
if (!_isInitialized) {
_currentCode.value = _getCurrentOTP();
@@ -134,10 +144,19 @@ class _CodeWidgetState extends State<CodeWidget> {
borderRadius: BorderRadius.circular(10),
),
onTap: () {
_copyToClipboard();
_copyCurrentOTPToClipboard();
},
onDoubleTap: isMaskingEnabled
? () {
setState(
() {
_hideCode = !_hideCode;
},
);
}
: null,
onLongPress: () {
_copyToClipboard();
_copyCurrentOTPToClipboard();
},
child: _getCardContents(l10n),
),
@@ -312,17 +331,34 @@ class _CodeWidgetState extends State<CodeWidget> {
);
}
void _copyToClipboard() {
FlutterClipboard.copy(_getCurrentOTP())
.then((value) => showToast(context, context.l10n.copiedToClipboard));
void _copyCurrentOTPToClipboard() async {
_copyToClipboard(
_getCurrentOTP(),
confirmationMessage: context.l10n.copiedToClipboard,
);
}
void _copyNextToClipboard() {
FlutterClipboard.copy(_getNextTotp()).then(
(value) => showToast(context, context.l10n.copiedNextToClipboard),
_copyToClipboard(
_getNextTotp(),
confirmationMessage: context.l10n.copiedNextToClipboard,
);
}
void _copyToClipboard(
String content, {
required String confirmationMessage,
}) async {
final shouldMinimizeOnCopy =
PreferenceService.instance.shouldMinimizeOnCopy();
await FlutterClipboard.copy(content);
showToast(context, confirmationMessage);
if (Platform.isAndroid && shouldMinimizeOnCopy) {
MoveToBackground.moveTaskToBack();
}
}
void _onNextHotpTapped() {
if (widget.code.type == Type.hotp) {
CodeStore.instance
@@ -335,6 +371,10 @@ class _CodeWidgetState extends State<CodeWidget> {
}
Future<void> _onEditPressed(_) async {
bool _isAuthSuccessful = await requestAuthentication(context.l10n.editCodeAuthMessage);
if(!_isAuthSuccessful) {
return;
}
final Code? code = await Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
@@ -348,6 +388,10 @@ class _CodeWidgetState extends State<CodeWidget> {
}
Future<void> _onShowQrPressed(_) async {
bool _isAuthSuccessful = await requestAuthentication(context.l10n.showQRAuthMessage);
if(!_isAuthSuccessful) {
return;
}
// ignore: unused_local_variable
final Code? code = await Navigator.of(context).push(
MaterialPageRoute(
@@ -359,6 +403,10 @@ class _CodeWidgetState extends State<CodeWidget> {
}
void _onDeletePressed(_) async {
bool _isAuthSuccessful = await requestAuthentication(context.l10n.deleteCodeAuthMessage);
if(!_isAuthSuccessful) {
return;
}
final l10n = context.l10n;
await showChoiceActionSheet(
context,
@@ -390,6 +438,10 @@ class _CodeWidgetState extends State<CodeWidget> {
}
String _getFormattedCode(String code) {
if (_hideCode) {
// replace all digits with •
code = code.replaceAll(RegExp(r'\d'), '');
}
if (code.length == 6) {
return code.substring(0, 3) + " " + code.substring(3, 6);
}

View File

@@ -30,7 +30,7 @@ class DynamicFAB extends StatelessWidget {
spreadRadius: 200,
blurRadius: 100,
offset: const Offset(0, 230),
)
),
],
),
width: double.infinity,

View File

@@ -277,7 +277,7 @@ class _BodyState extends State<_Body> {
_direction == TextDirection.ltr ? loader : text,
const SizedBox(width: 8.0),
_direction == TextDirection.rtl ? loader : text,
const SizedBox(width: 8.0)
const SizedBox(width: 8.0),
],
),
],

View File

@@ -308,7 +308,7 @@ class _ButtonChildWidgetState extends State<ButtonChildWidget> {
overflow: TextOverflow.ellipsis,
),
),
)
),
],
);
},

View File

@@ -48,7 +48,7 @@ class CaptionedTextWidget extends StatelessWidget {
],
),
),
)
),
],
),
),

View File

@@ -280,7 +280,7 @@ class _TextInputDialogState extends State<TextInputDialog> {
),
),
],
)
),
],
),
),

View File

@@ -61,7 +61,7 @@ class TitleBarWidget extends StatelessWidget {
: Text(
caption!,
style: textTheme.mini.copyWith(color: colorTheme.textMuted),
)
),
],
),
),
@@ -112,7 +112,7 @@ class TitleBarWidget extends StatelessWidget {
),
overflow: TextOverflow.ellipsis,
maxLines: 1,
)
),
],
),
),

View File

@@ -56,7 +56,7 @@ class CoachMarkWidget extends StatelessWidget {
},
child: Text(l10n.ok),
),
)
),
],
),
],

View File

@@ -46,7 +46,8 @@ class ScannerGoogleAuthPageState extends State<ScannerGoogleAuthPage> {
child: QRView(
key: qrKey,
overlay: QrScannerOverlayShape(
borderColor: getEnteColorScheme(context).primary700,),
borderColor: getEnteColorScheme(context).primary700,
),
onQRViewCreated: _onQRViewCreated,
formatsAllowed: const [BarcodeFormat.qrcode],
),
@@ -56,7 +57,7 @@ class ScannerGoogleAuthPageState extends State<ScannerGoogleAuthPage> {
child: Center(
child: (totp != null) ? Text(totp!) : Text(l10n.scanACode),
),
)
),
],
),
);

View File

@@ -51,7 +51,7 @@ class ScannerPageState extends State<ScannerPage> {
child: Center(
child: (totp != null) ? Text(totp!) : Text(l10n.scanACode),
),
)
),
],
),
);

View File

@@ -95,7 +95,7 @@ class FaqWidget extends StatelessWidget {
),
),
),
)
),
],
),
);

View File

@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:ente_auth/app/view/app.dart';
import 'package:ente_auth/core/logging/super_logging.dart';
import 'package:ente_auth/l10n/l10n.dart';
@@ -74,6 +76,21 @@ class _AdvancedSectionWidgetState extends State<AdvancedSectionWidget> {
),
),
sectionOptionSpacing,
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: l10n.shouldHideCode,
),
trailingWidget: ToggleSwitchWidget(
value: () => PreferenceService.instance.shouldHideCodes(),
onChanged: () async {
await PreferenceService.instance.setHideCodes(
!PreferenceService.instance.shouldHideCodes(),
);
setState(() {});
},
),
),
sectionOptionSpacing,
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: l10n.focusOnSearchBar,
@@ -105,6 +122,23 @@ class _AdvancedSectionWidgetState extends State<AdvancedSectionWidget> {
),
),
sectionOptionSpacing,
if (Platform.isAndroid) ...[
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: l10n.minimizeAppOnCopy,
),
trailingWidget: ToggleSwitchWidget(
value: () => PreferenceService.instance.shouldMinimizeOnCopy(),
onChanged: () async {
await PreferenceService.instance.setShouldMinimizeOnCopy(
!PreferenceService.instance.shouldMinimizeOnCopy(),
);
setState(() {});
},
),
),
sectionOptionSpacing,
],
],
);
}

View File

@@ -27,7 +27,7 @@ late Set<String> iOSLowEndMachineCodes = <String>{
"iPhone10,2", // iPhone 8 Plus
"iPhone10,3", // iPhone X Global
"iPhone10,4", // iPhone 8
"iPhone10,5" // iPhone 8
"iPhone10,5", // iPhone 8
};
Future<bool> isLowSpecDevice() async {

View File

@@ -277,7 +277,7 @@ void _showNoMailAppsDialog(BuildContext context, String toEmail) {
onPressed: () {
Navigator.pop(context);
},
)
),
],
);
},

View File

@@ -447,6 +447,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "8.1.3"
flutter_displaymode:
dependency: "direct main"
description:
name: flutter_displaymode
sha256: "42c5e9abd13d28ed74f701b60529d7f8416947e58256e6659c5550db719c57ef"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
flutter_email_sender:
dependency: "direct main"
description:
@@ -747,10 +755,10 @@ packages:
dependency: "direct main"
description:
name: local_auth
sha256: "0cf238be2bfa51a6c9e7e9cfc11c05ea39f2a3a4d3e5bb255d0ebc917da24401"
sha256: "7e6c63082e399b61e4af71266b012e767a5d4525dd6e9ba41e174fd42d76e115"
url: "https://pub.dev"
source: hosted
version: "2.1.6"
version: "2.1.7"
local_auth_android:
dependency: transitive
description:
@@ -1646,4 +1654,4 @@ packages:
version: "3.1.2"
sdks:
dart: ">=3.1.0-185.0.dev <4.0.0"
flutter: ">=3.7.0"
flutter: ">=3.10.0"

View File

@@ -1,6 +1,6 @@
name: ente_auth
description: ente two-factor authenticator
version: 2.0.6+206
version: 2.0.7+207
publish_to: none
environment:
@@ -31,6 +31,7 @@ dependencies:
flutter:
sdk: flutter
flutter_bloc: ^8.0.1
flutter_displaymode: ^0.6.0
flutter_email_sender: ^5.1.0
flutter_inappwebview: ^5.7.1
flutter_launcher_icons: ^0.9.3
@@ -50,7 +51,7 @@ dependencies:
http: ^0.13.4
intl: ^0.18.0
json_annotation: ^4.5.0
local_auth: ^2.1.3
local_auth: ^2.1.7
logging: ^1.0.1
modal_bottom_sheet: ^3.0.0-pre
move_to_background: ^1.0.2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 KiB

After

Width:  |  Height:  |  Size: 345 KiB