Compare commits

...

1133 Commits

Author SHA1 Message Date
Manav Rathi
e8c6c88f64 [desktop] Update translation (#2765) 2024-08-20 21:21:01 +05:30
Manav Rathi
f2f4bf2fd7 [desktop] Update translation 2024-08-20 21:13:56 +05:30
Ashil
019457be02 [mob][auth] Option to add pin/passcode without having a system lock (#2738) 2024-08-20 19:36:10 +05:30
Ashil
73b7b2e190 [mob][auth] local_auth upgrade & work around for new applock key (#2752) 2024-08-20 18:11:06 +05:30
Aman Raj Singh Mourya
eb568080dd [mob][auth] Used better names 2024-08-20 15:56:40 +05:30
Manav Rathi
fe82faf80f [doc] Large upload troubleshooting (#2761) 2024-08-20 11:28:36 +05:30
Manav Rathi
00eb440c01 [doc] Large upload troubleshooting 2024-08-20 11:26:10 +05:30
Manav Rathi
38662f6b6c [web] New translations (#2760)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-20 10:59:26 +05:30
Crowdin Bot
029b43b13d New Crowdin translations by GitHub Action 2024-08-20 05:29:06 +00:00
Manav Rathi
468d429ecc Add workaround for Polish plurals (#2759)
Instead of foo_other, i18n seems to fallback to the base language
translation for languages like Polish that have multiple plurals.

Use the workaround mentioned here:
https://github.com/i18next/i18next/issues/1851#issuecomment-1464017036
2024-08-20 10:46:35 +05:30
Manav Rathi
19c6ebefd3 Add note 2024-08-20 10:45:20 +05:30
Manav Rathi
5cd093c413 Add workaround for Polish plurals
Instead of foo_other, i18n seems to fallback to the base language translation
for languages like Polish that have multiple plurals.

Use the workaround mentioned here: https://github.com/i18next/i18next/issues/1851#issuecomment-1464017036
2024-08-20 10:37:18 +05:30
Manav Rathi
8fed43ec00 [web] New translations (#2758)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-20 10:26:57 +05:30
Crowdin Bot
6ba92298dd New Crowdin translations by GitHub Action 2024-08-20 04:49:15 +00:00
Manav Rathi
88d6f78741 [web] Further refactoring of the crypto layering (#2755)
\+ tweaks to the indexing process
2024-08-19 21:20:27 +05:30
Manav Rathi
0a35291084 Lint fix 2024-08-19 21:16:00 +05:30
Manav Rathi
adefb78cac Updated Mastodon links (#2754)
Changed the links in the social section and readme to Fosstodon instead
of mstdn
2024-08-19 21:08:43 +05:30
Brogio
8c5b07b3ce Update README.md 2024-08-19 17:14:31 +02:00
Brogio
8d667f86b1 Update social_section_widget.dart 2024-08-19 17:10:50 +02:00
Brogio
f7666deb5a Update social_section_widget.dart
Updated Mastodon link
2024-08-19 17:10:07 +02:00
Aman Raj Singh Mourya
1323525cd8 [mob][auth] Independent applock implemented 2024-08-19 18:59:03 +05:30
Aman Raj Singh Mourya
f84054b4ce [mob][auth] macOS pin/passcode support 2024-08-19 17:36:04 +05:30
Aman Raj Singh Mourya
bc94882234 [mob][auth] Upgraded local_auth 2.2.0 -> 2.3.0 2024-08-19 17:34:50 +05:30
Aman Raj Singh Mourya
95a03ef86d [mob][auth] Minor fixes 2024-08-19 17:06:48 +05:30
Aman Raj Singh Mourya
48c29700a4 [mob][auth] Work around for new applock key 2024-08-19 16:47:47 +05:30
Manav Rathi
d7d5b0aa9b [web] New translations (#2750)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-19 16:29:23 +05:30
Manav Rathi
63d65a4311 Expose decryptBlob to main thread 2024-08-19 15:55:07 +05:30
Manav Rathi
d6151a89e8 Fix 2024-08-19 15:46:52 +05:30
Manav Rathi
e6f26e62ae Fix jumping 2024-08-19 15:40:57 +05:30
Manav Rathi
3f9a7e08a1 Better state during initial load 2024-08-19 15:36:30 +05:30
Manav Rathi
c39fcb3968 Use 2024-08-19 15:19:26 +05:30
Manav Rathi
c0e48c7ada keygen 2024-08-19 15:19:26 +05:30
Manav Rathi
62c32d02ce Start treating it as a gateway 2024-08-19 15:19:26 +05:30
Manav Rathi
5640086932 Remove unnecessary conversion attempt 2024-08-19 15:19:26 +05:30
Crowdin Bot
b443d5f472 New Crowdin translations by GitHub Action 2024-08-19 09:44:48 +00:00
Manav Rathi
81b913cb79 [desktop] Indexing tweaks (#2749) 2024-08-19 15:14:05 +05:30
Manav Rathi
769b3ab21f i18n 2024-08-19 15:05:31 +05:30
Manav Rathi
a43c0baa46 Avoid non-greppable context APIs for i18n 2024-08-19 15:00:49 +05:30
Manav Rathi
d7fb8cf82b Handle the idle transition in the UI 2024-08-19 14:56:01 +05:30
Manav Rathi
d96d4773cf Fix status during live uploads 2024-08-19 14:42:46 +05:30
Manav Rathi
cf3b757021 Most recent file IDs first 2024-08-19 14:31:51 +05:30
Manav Rathi
fed7864b11 Fetching state 2024-08-19 13:49:36 +05:30
Neeraj Gupta
60cee41a44 [auth] New translations (#2746)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)
2024-08-19 12:14:15 +05:30
Ashil
8e3183ed8f [mob][photos] Workaround for android 10 free up space issue (#2637) 2024-08-19 11:51:23 +05:30
Manav Rathi
c4b47dcc14 [web] New translations (#2744)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-19 09:55:55 +05:30
Neeraj Gupta
2856bfb7f4 [mobile] New translations (#2745)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-app)
2024-08-19 07:19:08 +05:30
Crowdin Bot
6bdafc0ed2 New Crowdin translations by GitHub Action 2024-08-19 01:16:45 +00:00
Crowdin Bot
21764a520f New Crowdin translations by GitHub Action 2024-08-19 01:04:15 +00:00
Crowdin Bot
4a19bfdcde New Crowdin translations by GitHub Action 2024-08-19 00:31:56 +00:00
Vishnu Mohandas
3d41b555b6 fix: fdroid icon background (#2741)
## Description

Fdroid icon for auth was white, whilst we have already moved to purple
gradient. This PR adds the same adaptive background for fdroid as it is
for normal build.

The below Fdroid build recipe regenerates the icons that's why it was
not correct before:

3bbf65e8f0/metadata/io.ente.auth.yml (L58)
2024-08-18 22:19:33 +05:30
Prateek Sunal
92e0d82123 fix: fdroid icon background 2024-08-18 22:16:09 +05:30
Neeraj Gupta
9b9c7e91f4 [mob] use blur instead of blurhash in panorama (#2739)
## Description

Blurhash was not perfect, so replaced it with gaussian blur (20)
instead.

## Tests
2024-08-18 07:56:50 +05:30
Prateek Sunal
0c94613fdf Merge remote-tracking branch 'origin/main' into mob-pano 2024-08-17 22:36:37 +05:30
Prateek Sunal
54c699b6d5 fix: use blur instead of blurhash in panorama 2024-08-17 22:36:01 +05:30
Manav Rathi
d3f3679fb0 [web] Iterate on the cluster related crypto (#2737) 2024-08-17 22:18:30 +05:30
Manav Rathi
505dc7c20d Fix 2024-08-17 22:03:52 +05:30
Manav Rathi
8601662ea1 Un2 2024-08-17 21:51:50 +05:30
Manav Rathi
08c3b172d9 Update types 2024-08-17 21:49:39 +05:30
Manav Rathi
76da94cf78 Add the variant 2024-08-17 21:42:13 +05:30
Manav Rathi
0240b37032 Denoise 2024-08-17 21:33:15 +05:30
Manav Rathi
9ae5006a4a Mig 2024-08-17 21:30:54 +05:30
Manav Rathi
0ee84db02f Mig 2024-08-17 21:29:40 +05:30
Manav Rathi
b329085940 Mig 2024-08-17 21:25:57 +05:30
Manav Rathi
de3943e69c Prune 2024-08-17 21:22:54 +05:30
Manav Rathi
069cf82bbb Mig 2024-08-17 21:21:09 +05:30
Manav Rathi
eafa662cc0 Prune 2024-08-17 21:13:48 +05:30
Manav Rathi
6488c4fa0e Sigh 2024-08-17 21:10:11 +05:30
Manav Rathi
25f1087685 Unused 2024-08-17 21:05:49 +05:30
Manav Rathi
788ce53388 Use 2024-08-17 21:04:02 +05:30
Manav Rathi
757ff5cd9a New 2024-08-17 21:02:34 +05:30
Manav Rathi
68e5d842e5 Tweak 2024-08-17 20:57:20 +05:30
Manav Rathi
fdfaadfb1e Use 2024-08-17 20:56:05 +05:30
Manav Rathi
0fcd21f61d Use 2024-08-17 20:53:10 +05:30
Manav Rathi
4fa3b177c6 Use 2024-08-17 20:48:41 +05:30
Manav Rathi
2775917e44 Parallel hierarchy 2024-08-17 20:45:17 +05:30
Manav Rathi
360113c3ac Use newer pattern in more places 2024-08-17 20:21:49 +05:30
Aman Raj Singh Mourya
f338e40876 [mob][auth] Option to add pin/passcode without a having a systemLock 2024-08-17 19:48:06 +05:30
Aman Raj Singh Mourya
3a4246b82d [mob][auth] Added key to check if appLock is set or not 2024-08-17 19:47:10 +05:30
Aman Raj Singh Mourya
fbc6137b3e [mob][auth] Directly route to appLock in case of no systemLock found 2024-08-17 19:33:54 +05:30
Manav Rathi
5c09359738 Remove unnecessary conversion 2024-08-17 18:54:50 +05:30
Manav Rathi
90ffb68b51 key variants too 2024-08-17 18:53:00 +05:30
Manav Rathi
d1b7177a53 We need both 2024-08-17 18:49:41 +05:30
Manav Rathi
890ed7dd4b Cleanup 2024-08-17 18:43:31 +05:30
Manav Rathi
25b9a36554 Fix
crypto_secretbox_easy takes a string, but that's a UTF-8 string, not the base64 one that we're looking for.
2024-08-17 18:30:37 +05:30
Manav Rathi
cf6508be4a Enc 2024-08-17 17:33:22 +05:30
Manav Rathi
153be4990a Rearrange 2024-08-17 17:13:16 +05:30
Manav Rathi
f3e947f47e Match the types 2024-08-17 17:10:06 +05:30
Manav Rathi
f0b86323c3 Attempt to curb the combinatorial explosion 2024-08-17 17:00:47 +05:30
Manav Rathi
dbe98acbd7 Dec 2024-08-17 16:38:51 +05:30
Manav Rathi
93d48f6d6f Fix 2024-08-17 11:14:02 +05:30
Manav Rathi
d91462773a Use same nomenclature as the architecture document 2024-08-17 11:07:11 +05:30
Manav Rathi
3962f3a133 Use same nomenclature as the architecture document 2024-08-17 11:07:11 +05:30
Manav Rathi
bc192e5b00 Hold remote to the delete invariant 2024-08-17 11:07:11 +05:30
Manav Rathi
462adf7429 Nomenclature 2024-08-17 11:07:11 +05:30
Neeraj Gupta
78a727c750 [auth] Improve recovery input validation (#2735)
## Description

## Tests
2024-08-17 06:57:58 +05:30
Neeraj Gupta
3676151dde [auth] Bump version 3.1.2 2024-08-17 06:52:04 +05:30
Neeraj Gupta
9f23403604 Use word position 2024-08-17 06:51:16 +05:30
Neeraj Gupta
eace1150f5 [auth] Improve error message for invalid recovery input 2024-08-17 06:46:53 +05:30
Manav Rathi
191e32463f [desktop] Hide People header until we start showing clusters (#2730) 2024-08-16 18:10:12 +05:30
Manav Rathi
0a59597301 Padding at the top 2024-08-16 18:07:22 +05:30
Manav Rathi
f89e3793ec Hide People header until we start showing clusters 2024-08-16 17:59:26 +05:30
Manav Rathi
201b2eda67 [desktop] Improve robustness of cluster disabling condition (#2729)
Otherwise the code reaches the isInternalUser on logout, triggered by
the search service, and at a point when it does not have the auth token
anymore. Doesn't impact production builds, but doesn't hurt to make the
check more robust say for people who're trying dev builds.
2024-08-16 17:47:58 +05:30
Manav Rathi
c5ee50b3a2 [desktop] Improve robustness of cluster disabling condition
Otherwise the code reaches the isInternalUser on logout, triggered by the search
service, and at a point when it does not have the auth token anymore. Doesn't
impact production builds, but doesn't hurt to make the check more robust say for
people who're trying dev builds.
2024-08-16 17:41:13 +05:30
Manav Rathi
b5b4d1df65 [web] Crypto: Use Box vs Blob to classify secretbox vs secretstream-one-shot (#2728) 2024-08-16 17:37:11 +05:30
Manav Rathi
2d5faa3964 Dec 2024-08-16 17:05:39 +05:30
Manav Rathi
371fda4e97 B64 2024-08-16 16:51:38 +05:30
Manav Rathi
44bdb016a8 Swap 2024-08-16 16:34:06 +05:30
Manav Rathi
763d9727e6 Dec 2024-08-16 16:26:44 +05:30
Manav Rathi
38d39c123d Dec types 2024-08-16 16:21:48 +05:30
Manav Rathi
3b0ec7ce71 Use 2024-08-16 16:06:15 +05:30
Manav Rathi
2e0ad673cf B64 variant 2024-08-16 16:03:13 +05:30
Manav Rathi
0de05fdc36 Remove duplication 2024-08-16 16:00:04 +05:30
Vishnu Mohandas
a19e4879db Update Google Photos Takeout Instructions (#2648)
Simplify instructions
Remove note
Expand step 9 to incorporate note

## Description
Raises an important caveat closer to a relevant step. 
## Tests
N/A
2024-08-16 15:58:18 +05:30
Manav Rathi
fcad2157bc Update 2024-08-16 15:53:16 +05:30
Manav Rathi
94a40838a3 Box variant 2024-08-16 15:48:36 +05:30
Manav Rathi
54efdd1072 Use existing primitive 2024-08-16 15:48:36 +05:30
Manav Rathi
797dcc4a1e Streamline 2024-08-16 15:48:36 +05:30
Manav Rathi
ed6dc3ca6c Tweak 2024-08-16 15:48:36 +05:30
Manav Rathi
4fda7c3c86 Move 2024-08-16 15:48:36 +05:30
Manav Rathi
cbb36214a3 New terms 2024-08-16 15:48:36 +05:30
Manav Rathi
7e03462891 Terminology 2024-08-16 15:48:36 +05:30
Manav Rathi
f37220bf20 Terminology 2024-08-16 15:48:35 +05:30
Manav Rathi
1a6ae93a7a More 2024-08-16 15:48:35 +05:30
Manav Rathi
5e67bf90c5 Outline 2024-08-16 15:48:35 +05:30
Manav Rathi
89fd65d925 [desktop] person => cgroup (#2727)
https://github.com/ente-io/ente/pull/2718
2024-08-16 15:45:54 +05:30
Manav Rathi
ddf530f236 sync 2024-08-16 15:29:53 +05:30
Manav Rathi
3bc41f253b Propagate 2024-08-16 15:22:02 +05:30
Manav Rathi
2ae98148ae Fin db 2024-08-16 15:19:43 +05:30
Manav Rathi
3f20f572d2 Propagate 2024-08-16 15:16:58 +05:30
Manav Rathi
f5738f8460 CGroup 2024-08-16 15:07:09 +05:30
Manav Rathi
4f0145e6d3 Remove unused 2024-08-16 14:32:29 +05:30
Manav Rathi
37bbefa16b [desktop] Sync ML status immediately on login (#2726) 2024-08-16 14:24:04 +05:30
Manav Rathi
e3d7b14442 Use 2024-08-16 14:05:14 +05:30
Manav Rathi
b04831d4df Split ML status sync 2024-08-16 13:34:19 +05:30
Manav Rathi
b9102a4074 [web] Log during logout (#2723)
Helps in tracing event sequences in logs.
2024-08-16 13:17:19 +05:30
Neeraj Gupta
d94f8be520 [mob] Bypass map permission dialog if already given (#2722)
## Description

## Tests
2024-08-16 13:15:03 +05:30
Neeraj Gupta
811aba2baf [mob] Remove unused field 2024-08-16 13:14:24 +05:30
Manav Rathi
a31a761933 [web] Log during logout
Helps in tracing event sequences in logs
2024-08-16 13:08:00 +05:30
Neeraj Gupta
c69280a3d7 [mob] ios build change 2024-08-16 13:06:02 +05:30
Neeraj Gupta
32fa1b1466 [mob]Bypass map permission dialog if already given 2024-08-16 13:05:51 +05:30
Neeraj Gupta
b88b81615d [server] Enable multi-part upload flag for mobile (#2721)
## Description

## Tests
2024-08-16 12:27:50 +05:30
Neeraj Gupta
741107e950 [server] Enable multi-part upload flag for mobile 2024-08-16 12:27:10 +05:30
Manav Rathi
4dbf8cbd54 [docs] Add note about avoiding NAS (#2720) 2024-08-16 12:19:16 +05:30
Manav Rathi
6627faed8c Add sidebar entry 2024-08-16 12:18:58 +05:30
Manav Rathi
29b81a468c [docs] Add note about avoiding NAS 2024-08-16 12:16:16 +05:30
Neeraj Gupta
10087c3cc0 [server] Switch to nano_id for entity_data (#2718)
## Description

## Tests
Tested locally that new location tag were getting created, and we are
able to delete or edit existing tag.
2024-08-16 12:10:23 +05:30
Neeraj Gupta
175fe103e5 rename 2024-08-16 11:56:41 +05:30
Neeraj Gupta
c759d37fd3 Add entity type validation 2024-08-16 11:40:31 +05:30
Neeraj Gupta
05df5962ef Use nanoId for entity_data.id 2024-08-16 11:10:28 +05:30
Neeraj Gupta
9f043eba24 [server] Change entity_data.id from uuid to string 2024-08-16 10:30:18 +05:30
Ashil
b35b6a5983 [mob][photos] Remove feature flag from panorama viewer feature (#2715) 2024-08-16 10:28:36 +05:30
Ashil
2fe45ff10f [mob][photos] Add more logs on deleting local files (#2713) 2024-08-16 10:28:24 +05:30
ashilkn
c599ca2d80 [mob][photos] Remove feature flag from panorama viewer feature 2024-08-16 09:44:50 +05:30
Manav Rathi
27b20b4fc7 [docs] Mention Firefox jitter in auth FAQ (#2714) 2024-08-16 09:43:02 +05:30
Manav Rathi
4028041c90 Update README.md (#2705)
I updated the sentence "Ente Photos is a paid service, but we offer a
free trial. You can also clone this repository and choose to self host."
to reflect that Ente now offers a permanent free option with 5GB of free
storage.
2024-08-16 09:42:22 +05:30
Manav Rathi
53a292f97d yarn pretty 2024-08-16 09:40:46 +05:30
Manav Rathi
eff5b4fef4 Mention in FAQ
https://github.com/ente-io/ente/issues/2657#issuecomment-2283088810
2024-08-16 09:39:36 +05:30
ashilkn
a999eddbfe [mob][photos] Add more logs on deleting local files 2024-08-16 09:36:56 +05:30
Neeraj Gupta
555f23a519 [cli] Fix temp file deletion on windows (#2712)
## Description

## Tests
2024-08-16 09:20:04 +05:30
Neeraj Gupta
1fd238a89a [cli] Fix temp file deletion on windows 2024-08-16 09:19:26 +05:30
Vishnu Mohandas
ed1ee18e74 Update icon for Panorama view (#2710) 2024-08-15 19:18:23 +05:30
vishnukvmd
ddcc93c692 Update icon for Panorama view 2024-08-15 18:52:25 +05:30
Vishnu Mohandas
0e81dfb31a [docs] Minor update (#2709) 2024-08-15 17:35:32 +05:30
vishnukvmd
3418e69b95 [docs] Minor update 2024-08-15 17:34:36 +05:30
Vishnu Mohandas
ea18da295e [mob] Bump version 2024-08-15 17:26:09 +05:30
Brogio
d0e77e1673 Update README.md
Removed free trial
2024-08-14 17:29:20 +02:00
Ashil
f638b41508 [mob][photos] Use native video player (#2700)
## Description

- Use (Native video
player)[https://pub.dev/packages/native_video_player] for video
playback. With this, HDR videos can be played without tone-mapping to
SDR, preserving the full HDR quality and dynamic range.
**Note**: HDR will be supported only if the device supports it. Also,
only video formats that are supported by the device will be playable.
- Better UX/UX for video player.
- Also see #2694 
- Closes #1350 #832 #1166 



https://github.com/user-attachments/assets/f62bdff6-3218-4314-bd8b-651a6a3f8586



## Tests

- Tested playback on both iOS and Android devices with remote, local and
shared media videos.
2024-08-14 18:11:10 +05:30
Ashil
a5c0ae81bf [mob][photos] Update android target SDK (#2675)
No behavioural changes added in API level 34 

https://developer.android.com/reference/android/os/Build.VERSION_CODES#VANILLA_ICE_CREAM


https://medium.com/androiddevelopers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd#.fo6h6k65r

Looks safe to update without testing.
2024-08-14 18:10:57 +05:30
Ashil
46e585dbf7 [mob][photos] Fix Safe area issues (#2703) 2024-08-14 17:33:45 +05:30
ashilkn
d2536241f7 [mob][photos] chore 2024-08-14 17:32:26 +05:30
ashilkn
ecbd2b4480 [mob][photos] Fix safearea issues 2024-08-14 17:21:23 +05:30
Neeraj Gupta
37dec0018c [cli] Skip export with bad time stamp (#2702)
## Description

## Tests
2024-08-14 17:14:51 +05:30
Neeraj Gupta
39e505a3ec update docs 2024-08-14 17:14:35 +05:30
Neeraj Gupta
ae98af9f8c bump cli version 2024-08-14 17:12:49 +05:30
Neeraj Gupta
5bd7170755 [cli] Fix error log 2024-08-14 17:11:13 +05:30
Neeraj Gupta
ab17ae71d0 [cli] Continue export on bad timestamp marshal error 2024-08-14 17:10:58 +05:30
ashilkn
f40f39984a [mob][photos] Fix safearea issues 2024-08-14 16:53:22 +05:30
Neeraj Gupta
fda7722adb [mob] Add option under advance settings to enable multi part upload (#2697)
## Description

## Tests
- Verified that by turning off the flag from server, we are not seeing
the option to enable multi part upload.
2024-08-14 16:36:23 +05:30
Neeraj Gupta
4fc1d708b9 [server] Add auth key validation (#2696)
## Description
This avoids the 5xx error for authEntity which happens when we try to
create an auth entity without reporting the corresponding key

## Tests
2024-08-14 16:35:42 +05:30
Manav Rathi
efb89e710c [desktop] Clustering WIP - Part 2/x (#2701) 2024-08-14 16:06:17 +05:30
Neeraj Gupta
359572f4b2 Remove keyValidation from diff 2024-08-14 16:05:22 +05:30
Manav Rathi
5d9d3457ec [server] Use the go.sum cache during CI lint (#2699)
Unrelated to the lint failures, I noticed that we were not using the
go.sum file during the lint steps.
2024-08-14 16:02:27 +05:30
ashilkn
1e3a726eaa [mob] Fix 'skip' button being under navigation bar 2024-08-14 15:52:34 +05:30
Manav Rathi
e21a4b4f9e Handle deleted better 2024-08-14 15:39:04 +05:30
ashilkn
0753b59e4a [mob][photos] Pause new video player if app is not in fg 2024-08-14 15:34:14 +05:30
Manav Rathi
e946749b2e Fixes for person v2 2024-08-14 15:29:28 +05:30
Manav Rathi
b6b87c196f Update comment 2024-08-14 15:20:05 +05:30
Manav Rathi
367a715aa8 Reduce CLIP threshold to 0.175 2024-08-14 15:19:10 +05:30
Manav Rathi
6a8fe71000 Extra 2024-08-14 14:38:33 +05:30
Manav Rathi
bb56fddd45 lf 2024-08-14 14:20:23 +05:30
Manav Rathi
4e1d80380c pv2 2024-08-14 14:00:39 +05:30
Manav Rathi
fd1f3c6710 Sync 1 2024-08-14 13:51:43 +05:30
Manav Rathi
ee5acf6a2e Sketch 2024-08-14 13:46:27 +05:30
Manav Rathi
3a85e9dcae ek type 2024-08-14 13:04:08 +05:30
Manav Rathi
dffe364c51 Read ss 2024-08-14 12:49:21 +05:30
Manav Rathi
da4ba85c7c wip ek 2024-08-14 12:26:11 +05:30
ashilkn
b99e835d79 [mob][photos] Refactoring 2024-08-14 12:21:35 +05:30
Manav Rathi
62652ea617 [server] Send 5xx if query to validate token fails (#2695)
## Description

## Tests
2024-08-14 11:56:46 +05:30
ashilkn
7e36ad357b [mob][photos] Chore 2024-08-14 11:47:48 +05:30
Manav Rathi
4ea6f1cbfc [server] Fix lint failures on CI 2024-08-14 11:30:32 +05:30
Manav Rathi
c164b0710a key 2024-08-14 11:24:29 +05:30
Neeraj Gupta
d8b338a1e8 [cli] Add filters for Export (#2596)
## Description

Feature: Add support for selective export with filters for account,
albums, and options to exclude hidden or shared files.

    Flags Added:
        --shared: Include shared albums in export (default: true).
        --hidden: Include hidden albums in export (default: true).
        --albums: Comma-separated list of album names to export.
--emails: Comma-separated list of emails of the accounts that needs to
be exported

Behavior: By default, both hidden and shared albums are exported.

## Tests
Tested locally
2024-08-14 11:23:50 +05:30
Manav Rathi
81885d6814 Tweak 2024-08-14 11:21:04 +05:30
Neeraj Gupta
7b402e46bd [mob] Control the enable multipart option via feature flag 2024-08-14 11:20:30 +05:30
Manav Rathi
ad156bc33a Diff 2024-08-14 11:16:26 +05:30
Manav Rathi
050bbfbbb3 Discussion 2024-08-14 11:11:43 +05:30
Neeraj Gupta
7ba4aebf86 [mob] Add toggle button to enable multipart upload 2024-08-14 11:09:43 +05:30
Neeraj Gupta
1eea5ffab1 [mob] Switch to 20MB for multipart upload 2024-08-14 11:09:03 +05:30
Neeraj Gupta
04343b2a6c [server] Add auth key validation 2024-08-14 10:43:18 +05:30
Neeraj Gupta
9d48fa4a50 [server] Send 5xx if query to validate token fails 2024-08-14 10:22:57 +05:30
Manav Rathi
1314b8ccbb sync 2 2024-08-14 09:48:08 +05:30
Manav Rathi
d5d0e98197 Person 2024-08-14 09:11:56 +05:30
Manav Rathi
82b8658268 lint-fix 2024-08-14 08:45:00 +05:30
Manav Rathi
f802e87215 To search person 2024-08-13 21:03:22 +05:30
Manav Rathi
565546755a Split the type 2024-08-13 21:03:22 +05:30
Manav Rathi
113bd9744e Update all 2024-08-13 21:03:22 +05:30
Manav Rathi
3097810f2c Top scorer 2024-08-13 21:03:22 +05:30
Manav Rathi
207f9c50cf Clean 2024-08-13 21:03:22 +05:30
Manav Rathi
1c9a14cfdc Tweak 2024-08-13 21:03:22 +05:30
Manav Rathi
5e4f0d4caf A2 2024-08-13 21:03:22 +05:30
Manav Rathi
7f9391f89f Parse 2024-08-13 21:03:22 +05:30
Manav Rathi
614c312876 Tentative DB schema 2024-08-13 21:03:22 +05:30
Manav Rathi
5081dc904b Enhance 2024-08-13 21:03:22 +05:30
Manav Rathi
ef7b978cd5 Outline 2024-08-13 21:03:22 +05:30
Manav Rathi
2376327e52 zt 2024-08-13 21:03:22 +05:30
Ashil
f264461390 [mob][photos] Fullscreen UX improvements (#2694)
## Description

- Snapping when tapping to remove controls + app and bottom bar from a
photo or video is no more.
- System navigation bar has been change to be transparent.
- On iOS, nothing changes visually. 

#### Before:


https://github.com/user-attachments/assets/4665ec52-31d8-4cab-8ca1-d830579c0f60


https://github.com/user-attachments/assets/95adf062-260a-4b23-810f-550c83c2e562

#### After:


https://github.com/user-attachments/assets/75307e63-df21-490b-ab6f-ef7c4de66c06


https://github.com/user-attachments/assets/83f89387-7fc2-41c3-a55a-3b2d62ef5bfb
2024-08-13 20:20:56 +05:30
ashilkn
0c097b38f4 [mob][photos] chore 2024-08-13 20:19:10 +05:30
ashilkn
e74aac0023 [mob][photos] Remove listener 2024-08-13 19:59:40 +05:30
ashilkn
8d0e3e972f [mob][photos] Fix or make UI and layout better of the system navigation bar, home bottom navigation bar and the search widget 2024-08-13 19:49:41 +05:30
ashilkn
c10eb97511 [mob][photos] Fix screen snapping when toggling to full screen when viewing items + imporve full screen UX on the new native video player 2024-08-13 17:48:36 +05:30
ashilkn
6fa5571e19 Merge branch 'main' into use_native_video_player 2024-08-13 15:37:03 +05:30
Manav Rathi
49f069c9cf Add timeout for replication lock query & allow updating metadata with less keys (#2692)
## Description

## Tests
2024-08-13 15:25:24 +05:30
Neeraj Gupta
2228874898 [Fix] Handle case when existing metadata is null 2024-08-13 15:22:02 +05:30
Manav Rathi
c6bdeeb722 [server] Minor tweaks to the new FileData API URLs (#2689)
- Start with leading slash for easier greppability
- Omit trailing slash for consistency

No production clients are using this yet, so should be safe.

Tested the two embedding related ones on localhost.
2024-08-13 15:19:11 +05:30
Neeraj Gupta
8299c029ec Add 10 second timeout while locking row for replication 2024-08-13 15:17:33 +05:30
Neeraj Gupta
9132fc5ec8 Allow updating metadata with fewer keys 2024-08-13 15:15:40 +05:30
Manav Rathi
8a67eb7417 [web] Fix width of all albums dialog (#2691)
Fixes bug introduced in 1c0261bc5c
2024-08-13 13:49:47 +05:30
Manav Rathi
b0c18f9fd4 [web] Fix width of all albums dialog
Fixes bug introduced in 1c0261bc5c
2024-08-13 13:41:55 +05:30
Manav Rathi
91de9c38cc [desktop] Tweak the integration of the new file data APIs (#2690) 2024-08-13 13:32:08 +05:30
Manav Rathi
3980d6b614 Nomen 2024-08-13 13:27:03 +05:30
Manav Rathi
fd6cab6c26 Add CHANGELOG entry 2024-08-13 13:19:36 +05:30
Manav Rathi
3604fbe352 Clarify and note 2024-08-13 13:18:57 +05:30
Manav Rathi
9422398922 New and fold 2024-08-13 13:15:29 +05:30
Manav Rathi
cb8a5a72f5 Rename 2024-08-13 13:11:19 +05:30
Manav Rathi
3b63089b42 Fin2 2024-08-13 12:58:31 +05:30
Manav Rathi
eb2520e55c Fin 2024-08-13 12:48:33 +05:30
Manav Rathi
96948c8699 Fix context 2024-08-13 12:24:21 +05:30
Manav Rathi
0e04dd7393 [web] New translations (#2688)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-13 12:20:01 +05:30
Manav Rathi
d9d4ffa9e7 [server] Minor tweaks to the new FileData API URLs
- Start with leading slash for easier greppability
- Omit trailing slash for consistency

No production clients are using this yet, so should be safe.
2024-08-13 12:17:53 +05:30
Manav Rathi
ff1c20288f More 2024-08-13 12:13:57 +05:30
Manav Rathi
55bd59ec6a WIP cleanup 2024-08-13 12:07:48 +05:30
Manav Rathi
520647d77f Split 2024-08-13 12:07:48 +05:30
Manav Rathi
fa91430276 Rename 2024-08-13 12:07:48 +05:30
Crowdin Bot
a995a2ff0c New Crowdin translations by GitHub Action 2024-08-13 06:36:03 +00:00
Manav Rathi
28a97a39b2 [desktop] Update consent prompts (#2687) 2024-08-13 12:05:14 +05:30
Manav Rathi
dd74a0d6c3 [desktop] Update consent prompts 2024-08-13 11:39:32 +05:30
Manav Rathi
3c92ac9100 [web] New translations (#2677)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-13 11:28:13 +05:30
Crowdin Bot
048c5aa540 New Crowdin translations by GitHub Action 2024-08-13 05:50:21 +00:00
Neeraj Gupta
f1d828455d [server] Skip logging large payloads on successful requests (#2683)
## Description

## Tests
2024-08-13 11:20:08 +05:30
Manav Rathi
efcad99737 [web] Remove the potentially confusing modification time from UI (#2685)
Also, gracefully handle a missing modification time and public magic
metadata.
2024-08-13 11:18:54 +05:30
Manav Rathi
146b4ac296 Remove the confusing modification time option from the UI
It is not the upload time
2024-08-13 11:06:18 +05:30
Manav Rathi
0c3a676572 Handle missing pub magic mdt 2024-08-13 11:04:38 +05:30
Manav Rathi
c23ba06b0d Dedup 2024-08-13 10:59:20 +05:30
Manav Rathi
6b30bb52b8 Same file also doesn't have public magic metadata
file id 52422
2024-08-13 10:53:20 +05:30
Manav Rathi
6f1ddb892f Gracefully handle a missing modification time 2024-08-13 10:46:49 +05:30
Neeraj Gupta
7b610dbc34 [server] Log request body in output for error 2024-08-13 10:26:57 +05:30
Neeraj Gupta
5d0c337bfb [server] Reduce log noise 2024-08-13 10:22:16 +05:30
Prateek Sunal
2274be94c3 [auth] don't use privacy screen for desktop (#2680)
## Description

## Tests
2024-08-12 22:09:34 +05:30
Prateek Sunal
546820542a chore: bump version 2024-08-12 22:06:58 +05:30
Prateek Sunal
0a66098ee6 fix(auth): don't use privacy screen for desktop 2024-08-12 22:06:25 +05:30
Neeraj Gupta
cfadd700ff [server][file-data] Fix query to mark replication as done 2024-08-12 21:59:00 +05:30
Neeraj Gupta
6fc24f6900 Reduce ctx timeout duration 2024-08-12 21:39:49 +05:30
Neeraj Gupta
ff72590958 Fix bug in GetAndLockUnreplicatedObject query 2024-08-12 21:39:49 +05:30
Manav Rathi
f38d9deb11 [desktop] [docs] Rename ML (#2676) 2024-08-12 20:26:27 +05:30
Manav Rathi
bcc5cde399 Rename doc 2024-08-12 20:22:10 +05:30
Manav Rathi
c3eafb50b6 Change translations 2024-08-12 20:18:19 +05:30
ashilkn
0d82f6ec65 [mob][photos] Update android target SDK 2024-08-12 19:58:39 +05:30
Shamshid
c1ee9a5d37 [Auth] fix Booking and Blockchain icons (#2656)
Fix Booking.com and Blockchain.com icons loading issue
2024-08-12 18:08:54 +05:30
Vishnu Mohandas
a61d62d862 Minor update 2024-08-12 18:01:32 +05:30
Neeraj Gupta
988d1ef895 [server] Fix multi part get url (#2672)
## Description

## Tests
2024-08-12 17:14:37 +05:30
Neeraj Gupta
c62842e6bb Fix multi part get 2024-08-12 17:13:32 +05:30
Manav Rathi
644827aea1 [desktop] Use new ML apis (#2670) 2024-08-12 16:40:37 +05:30
Neeraj Gupta
54bca8570e [server] Minor fixes (#2671)
## Description

## Tests
2024-08-12 16:40:26 +05:30
Neeraj Gupta
641a9c9e1a [server] Minor fixes 2024-08-12 16:39:36 +05:30
Manav Rathi
3feeb40a9e Update 2024-08-12 16:29:47 +05:30
Manav Rathi
17de43a857 worker's can't localStorage 2024-08-12 16:27:25 +05:30
Neeraj Gupta
6259a97f0e [server] Add support for file-data (#2662)
## Description

## Tests
2024-08-12 16:21:09 +05:30
Manav Rathi
b4ba6834e9 Use newer file-data APIs 2024-08-12 16:20:03 +05:30
Neeraj Gupta
ac64aadb3a [sever][replication] Avoid long running txn during replication (#2669)
## Description
Going forward, we pick a row for replication, and immediately mark
replication attempt. Once that's done, we try to replicate the object,
and update it's status without any transaction.

The initial locking and marking the replication attempt should ideally
ensure that no other worker will pick up the row for replication for
next 24hours.

## Tests
2024-08-12 16:09:41 +05:30
Prateek Sunal
be21ef9c50 [auth] allow without backups use for windows (#2650)
## Description

Windows client without pin/password should also be able to use the app,
without backups as they can set app lock afterwards.

## Tests
2024-08-12 15:54:52 +05:30
Neeraj Gupta
4ce3362186 document 2024-08-12 15:52:46 +05:30
Neeraj Gupta
8b33612879 clean up 2024-08-12 15:49:14 +05:30
Neeraj Gupta
992ac53a27 [sever][replication] Avoid long txn during replication 2024-08-12 15:41:29 +05:30
Manav Rathi
fc63e683a7 [web] New translations (#2668)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-12 14:45:07 +05:30
Neeraj Gupta
06bd039a80 Update index query 2024-08-12 14:43:48 +05:30
Crowdin Bot
d37f7a5314 New Crowdin translations by GitHub Action 2024-08-12 09:12:38 +00:00
Manav Rathi
6266d16544 [web] Tweak translation keys (#2667) 2024-08-12 14:41:48 +05:30
Manav Rathi
f2ae7c6ff9 Rename 2024-08-12 14:36:34 +05:30
Manav Rathi
04fd2d4410 echo '494m502\nwq' | ed -s $f 2024-08-12 14:35:07 +05:30
Manav Rathi
0c3ef07b3b [web] Rename tr keys 2024-08-12 14:32:45 +05:30
Ashil
6aee3a50f5 [mob][photos] Fix Autofill Issue with Proton Pass in App Lock (#2664) 2024-08-12 14:28:47 +05:30
Manav Rathi
7cc3e1cf99 [web] New translations (#2666)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-12 14:24:56 +05:30
Crowdin Bot
e8d804468e New Crowdin translations by GitHub Action 2024-08-12 08:53:59 +00:00
Manav Rathi
ea01c43e6a [desktop] Towards public beta of advanced (ML) search - Part 2/x (#2665) 2024-08-12 14:23:17 +05:30
Aman Raj Singh Mourya
e8a78cd818 [mob][photos] Auto-fill password for Applock 2024-08-12 14:07:08 +05:30
Manav Rathi
20fb9e99f0 context 2024-08-12 14:05:18 +05:30
ashilkn
fd0925f59e [mob][photos] Improve video loading UI 2024-08-12 13:33:58 +05:30
Neeraj Gupta
a6c5d03286 rename 2024-08-12 13:21:11 +05:30
Neeraj Gupta
1564d9c0ca refactor 2024-08-12 13:10:54 +05:30
Manav Rathi
3502fcac5e Move strings to translations 2024-08-12 13:10:15 +05:30
ashilkn
9c48cf4dc3 [mob][photos] Fix minor UI issue 2024-08-12 13:09:37 +05:30
Neeraj Gupta
c88dd22e9c [server] Add bucket b6 2024-08-12 13:07:55 +05:30
Neeraj Gupta
108e103e64 Add an icon to open the active location on Maps (#2663)
## Description

This change introduces a navigate button on the top-right corner that
will use [maps_launcher](https://pub.dev/packages/maps_launcher) to open
the center-point of the view port (by default the location of the photo
that was opened) in the device's default maps application.

<img width="200"
src="https://github.com/user-attachments/assets/baca54b8-5757-4c9b-a10f-3fccead2f142"/>
2024-08-12 13:04:52 +05:30
Neeraj Gupta
0c392a22a4 [server] Rename 2024-08-12 13:04:13 +05:30
Neeraj Gupta
4a13b04b1c [server] Update db script 2024-08-12 13:03:51 +05:30
ashilkn
ac5da3ac1e [mob][photos] commit pubspec.lock and Podfile.lock changes 2024-08-12 13:01:39 +05:30
Manav Rathi
bbac3a2a94 Update key 2024-08-12 12:54:58 +05:30
vishnukvmd
bcf29d971e Fix more warnings 2024-08-12 12:49:45 +05:30
vishnukvmd
ec8bd5bc7f Fix lint warnings 2024-08-12 12:46:25 +05:30
vishnukvmd
43e711274e Add an icon to open the active location on Maps 2024-08-12 12:39:41 +05:30
github-actions[bot]
930c080dcf [auth] New translations (#2660)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2024-08-12 12:14:45 +05:30
github-actions[bot]
9be3051671 [mobile] New translations (#2659)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-app)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2024-08-12 12:13:54 +05:30
Manav Rathi
7a113a3aba Preciser 2024-08-12 11:50:59 +05:30
Manav Rathi
d1b7d942b1 [desktop] [docs] Towards public beta of advanced (ML) search (#2661) 2024-08-12 11:14:57 +05:30
Manav Rathi
2830d32c79 Shorten 2024-08-12 11:10:18 +05:30
Manav Rathi
92adb3ad6f Remove old one 2024-08-12 11:05:50 +05:30
Manav Rathi
83e9b18eba Update link 2024-08-12 10:38:05 +05:30
Manav Rathi
a70a3c7078 edit 2024-08-12 10:27:33 +05:30
Manav Rathi
66726846da d1 2024-08-12 10:23:25 +05:30
Manav Rathi
f80e91a65c [web] New translations (#2658)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-12 09:53:23 +05:30
Crowdin Bot
62a979656f New Crowdin translations by GitHub Action 2024-08-12 00:32:10 +00:00
Manav Rathi
e618f13041 [web] Improve layering of the crypto abstractions (#2651) 2024-08-10 20:40:10 +05:30
Manav Rathi
215899f35a Nicer 2024-08-10 20:28:35 +05:30
Manav Rathi
004dd3bd0c Rearrange to make webpack happy
Something in the previous arrangement was causing webpack to not pack
worker/worker.ts as a web worker.
2024-08-10 20:28:17 +05:30
Manav Rathi
98a9fc39ec Direct 2024-08-10 20:12:36 +05:30
Manav Rathi
e6250e2cc3 Reorder 2024-08-10 20:11:29 +05:30
Manav Rathi
ccceb8c26a Direct 2024-08-10 20:10:02 +05:30
Manav Rathi
a7fcf7da9b Fixes 2024-08-10 20:04:50 +05:30
Manav Rathi
2b7ee9f42f Forward 2024-08-10 20:03:40 +05:30
Manav Rathi
de03265675 Leftovers 2024-08-10 20:00:16 +05:30
Manav Rathi
b7de8ca9e5 Update import 2024-08-10 19:57:12 +05:30
Manav Rathi
b8830144be Remove the no longer needed indirection 2024-08-10 19:55:24 +05:30
Manav Rathi
8acc5ac62d Propagate 2024-08-10 19:50:36 +05:30
Manav Rathi
041ad135c9 Use during upload 2024-08-10 19:31:20 +05:30
Manav Rathi
ff7718a878 Fin 2024-08-10 19:17:23 +05:30
Manav Rathi
95cfdc4eaa Rearrange 2024-08-10 19:11:24 +05:30
ashilkn
7bbf926986 [mob][photos] Bump up version to 0.9.17 2024-08-10 18:23:46 +05:30
ashilkn
df234660a0 [mob][photos] chore 2024-08-10 18:19:40 +05:30
ashilkn
f89bc22dc4 Merge branch 'main' into use_native_video_player 2024-08-10 18:15:00 +05:30
Manav Rathi
e29c9288c0 Abstract 2024-08-10 18:02:44 +05:30
ashilkn
cbdf6ea0e3 [mob][photos] Fix UI for native video player on memories 2024-08-10 17:58:01 +05:30
Manav Rathi
50d7d7e9a1 Proxy 2024-08-10 17:55:39 +05:30
Manav Rathi
d6bf243701 More 2024-08-10 17:53:12 +05:30
Manav Rathi
4e49a352be Integrate 2024-08-10 17:39:29 +05:30
ashilkn
de1f287c1c [mob][photos] Keep video playing until the currently playing video completely off the screen 2024-08-10 17:37:29 +05:30
Neeraj Gupta
bac660f7a0 [server] Lint fix 2024-08-10 17:20:03 +05:30
Neeraj Gupta
97c9253127 [server] Support for reporting preview video 2024-08-10 17:16:35 +05:30
Manav Rathi
d5d7786b24 Types 2024-08-10 17:09:43 +05:30
ashilkn
1aa38253a3 [mob][photos] Chore 2024-08-10 16:42:54 +05:30
ashilkn
c27017e77e [mob][photos] UX improvements on native video player 2024-08-10 16:41:01 +05:30
Manav Rathi
ca9726969c Impl 2 2024-08-10 16:32:30 +05:30
Manav Rathi
f5b6145da1 Impl 1 2024-08-10 16:32:30 +05:30
Manav Rathi
231e831c75 Refactor 2024-08-10 16:32:30 +05:30
Manav Rathi
85020a490e Rearrange 2024-08-10 16:32:30 +05:30
Manav Rathi
d13c23f2d8 Doc 2024-08-10 16:32:30 +05:30
Manav Rathi
a029b16851 Transparent but handrolled proxy 2024-08-10 16:32:29 +05:30
Ashil
5044a0c33f [mob][photos] Guest view final changes (#2645) 2024-08-10 16:17:42 +05:30
ashilkn
c079ed12ca [mob][photos] UX improvements on native video player 2024-08-10 16:12:22 +05:30
Prateek Sunal
18b0bd4996 fix(auth): allow without backups for windows 2024-08-10 16:00:31 +05:30
ashilkn
9abd9e126c [mob][photos] Fix seeking UX issue when video just started playing 2024-08-10 15:49:33 +05:30
ashilkn
f7345102a2 [mob][photos] Do not hide controls when seeking + Hide controls after seeking + do not surface controls when video starts over when playing in loop: 2024-08-10 15:31:30 +05:30
Neeraj Gupta
407364b626 Add Shakepay and Newton Crypto icons (#2634)
## Description

* Adds icons for Shakepay and Newton Crypto exchanges
* Shakepay icon derived from [press
kit](https://shakepay.com/images/shakepay_media_assets_2023.zip)
* Newton icon derived from [homepage](https://newton.co) (their press
kit leads to 404)

## Tests
2024-08-10 15:24:07 +05:30
ludespeedny
23da3b1c84 Custom icons for auth (#2646)
Added "enom" as a custom icon and added the entry in custom-icons.json
file.
2024-08-10 15:23:35 +05:30
vktr2b
42c3482423 Added & Improved Logos (#2642)
## Description
Added logos for:

- Infomaniak
- OpenObserve
- Vikunja
- SMSPool
- SMTP2GO

Improvements / Minor Changes 

- Brave Icon config
- Crypto.com Icon config
2024-08-10 15:23:04 +05:30
Manav Rathi
4ea95c7d77 [desktop] Use MobileCLIP for magic search (#2649) 2024-08-10 14:08:37 +05:30
Manav Rathi
ac8a5b491d Update refs 2024-08-10 13:47:10 +05:30
Manav Rathi
72bce123a5 Cleanup 2024-08-10 13:42:26 +05:30
Manav Rathi
5bbc2615e4 Tune the threshold for MobileCLIP
Experimentation.

- 0.15 was noisy
- 0.23 was too strict
2024-08-10 13:39:14 +05:30
Manav Rathi
1f28fdada2 Bilinear 2024-08-10 13:11:18 +05:30
Manav Rathi
b503f75999 Don't need the mean/std 2024-08-10 13:09:23 +05:30
Jaspal Suri
fb867bd351 Update Google Photos Takeout Instructions
Simplify instructions
Remove note
Expand step 9 to incorporate note
2024-08-10 00:06:10 -07:00
Manav Rathi
5ce8d9838f 224 => 256
https://github.com/apple/ml-mobileclip/blob/main/mobileclip/configs/mobileclip_s2.json
2024-08-10 09:51:37 +05:30
Manav Rathi
93c5825364 Add MobileCLIP URLs 2024-08-10 09:47:10 +05:30
Manav Rathi
82ecbe6866 [desktop] Clustering - Part 2/x (#2647) 2024-08-10 09:33:25 +05:30
Manav Rathi
62e27916b7 lf 2024-08-10 09:09:50 +05:30
ashilkn
4cb0a5306a [mob][photos] Hide/show controls when necessary in native video player 2024-08-09 22:26:07 +05:30
ashilkn
5e7febd8f2 [mob][photos] Added comment 2024-08-09 21:04:56 +05:30
ashilkn
73c4fd3488 [mob][photos] Only initialize native video player and load video when the file is completely visible
Without this, if two high res potrait videos are loaded, one of them goes blank
2024-08-09 21:03:11 +05:30
Manav Rathi
5d28f75c1a Dedup 2024-08-09 20:30:03 +05:30
ashilkn
ac27a22ddb [mob][photos] UX improvements in native video player 2024-08-09 20:28:19 +05:30
Manav Rathi
e7e74c17f8 Fix debug flow 2024-08-09 20:24:56 +05:30
Prateek Sunal
4d8e80041d [mob][panorama] update panorama checking mechanism (#2532)
## Description

Panorama was getting checked every time and was not getting cached. This
PR creates mediaType to classify image whether it's panorama or not.

- If a image can be panorama (Any side Dimensions >8000px and 2 * height
>= width or 2 * width >= height) it will try to check metadata if image
could be panorama.
- Opening details pane will check metadata if image is panorama or not.
- Gyroscope button is introduced along with proper panoramic view
instead of 360* view for Images that have Cropped metadata.
2024-08-09 20:22:12 +05:30
Prateek Sunal
72cdb2424a Merge branch 'main' into mobile-panorama-fix 2024-08-09 20:21:49 +05:30
Prateek Sunal
38c3e73638 fix: move panorama icon to middle 2024-08-09 20:18:28 +05:30
ashilkn
e0fbc64f08 [mob][photos] Handle errors 2024-08-09 19:36:59 +05:30
ashilkn
41a304a18c [mob][photos] log errors from native video player if any 2024-08-09 19:30:07 +05:30
ashilkn
09c3d9e025 [mob][photos] UI fixes on native video player 2024-08-09 19:15:19 +05:30
ashilkn
03f0db92ad [mob][photos] Remove unnecessary delay 2024-08-09 19:08:59 +05:30
ashilkn
1e7c1396e0 [mob][photos] Delete cache only on iOS 2024-08-09 19:03:03 +05:30
ashilkn
6b8473a958 [mob][photos] UI fix for play pause button 2024-08-09 18:58:29 +05:30
ashilkn
c4770e8645 [mob][photos] Refactoring 2024-08-09 18:19:08 +05:30
Aman Raj Singh Mourya
2d768c9c61 [mob][photos] Fallback for no device lock found for guest view and extracted strings 2024-08-09 16:44:44 +05:30
Manav Rathi
839727393b Debugging code 2024-08-09 16:17:09 +05:30
Neeraj Gupta
251a627219 delete 2024-08-09 15:51:38 +05:30
Neeraj Gupta
cd2fde2c2e [server] 1/n Support for persisting preview video 2024-08-09 15:50:29 +05:30
Manav Rathi
7bde0dea8c test harness 2024-08-09 15:48:30 +05:30
Manav Rathi
46082796d7 Decrypt 2024-08-09 15:36:15 +05:30
Manav Rathi
7d52f917c1 [docs] Clarifications (#2644) 2024-08-09 14:50:08 +05:30
Manav Rathi
980ff741ba yarn pretty 2024-08-09 14:48:08 +05:30
Manav Rathi
286517338e pretty 2024-08-09 14:47:23 +05:30
Manav Rathi
e5eb9fee7a [docs] Clarifications 2024-08-09 14:46:22 +05:30
Manav Rathi
8f167d81fc Types 2024-08-09 14:36:27 +05:30
Manav Rathi
1c84b32608 Specifize 2024-08-09 14:22:26 +05:30
Vishnu Mohandas
1e3110ca9c [docs] updated Googletakeout (#2643) 2024-08-09 14:15:44 +05:30
Vishnu Mohandas
0412c37bf5 Update index.md 2024-08-09 14:14:52 +05:30
Manav Rathi
777ce3f4a8 Sketch 2024-08-09 13:41:39 +05:30
Manav Rathi
5fa719f3e9 Sketch 2024-08-09 13:26:32 +05:30
Neeraj Gupta
7834662340 [server] Clean up 2024-08-09 13:08:46 +05:30
Manav Rathi
29d7403cda Non-trivial ones 2024-08-09 12:43:56 +05:30
ashilkn
46a7880f05 [mob][photos] Extract strings 2024-08-09 12:41:04 +05:30
Neeraj Gupta
ffbd76b88b [server] Support for replicating ml data 2024-08-09 12:40:52 +05:30
ashilkn
762daa6bd5 [mob][photos] Change icon of guest view 2024-08-09 12:33:45 +05:30
Manav Rathi
890ea6c8d1 Closer 2024-08-09 12:33:33 +05:30
Ashil
fdf3b6e85d [mob][photos] Swipe lock for multiple files (#2631) 2024-08-09 12:13:51 +05:30
Manav Rathi
cfcfade152 People list 2024-08-09 12:00:31 +05:30
Neeraj Gupta
da09a5261b [server] Fix key look up 2024-08-09 11:57:21 +05:30
Manav Rathi
5c7c4ad35a Fix 2024-08-09 11:41:59 +05:30
Manav Rathi
771327a551 gen 2024-08-09 11:35:50 +05:30
Manav Rathi
526546da59 Promise 2024-08-09 11:30:21 +05:30
Jay
a32a9dea3f [docs] updated googletakeout 2024-08-09 11:18:17 +05:30
Manav Rathi
69627ee8d6 Start moving the plumbing out 2024-08-09 11:14:23 +05:30
Manav Rathi
292a8eb00f Group state 2024-08-09 10:33:24 +05:30
Manav Rathi
685680c6da Integrate 2024-08-09 09:48:01 +05:30
Prateek Sunal
8db29a25a4 fix: review changes 2024-08-09 02:41:44 +05:30
Prateek Sunal
10d6caa4e1 fix: review changes 2024-08-09 02:40:03 +05:30
Prateek Sunal
fb2c17c510 fix: update panorama package to support sensor tweaks 2024-08-09 02:32:14 +05:30
Aman Raj Singh Mourya
5925dfb3fc [mob][photos] Minor fixes 2024-08-08 21:41:46 +05:30
Manav Rathi
65b0a061b7 [desktop] Cluster - Initial steps (#2640)
- No functional changes
- Also add nanoid dep
2024-08-08 21:01:41 +05:30
Manav Rathi
7c435b9ae5 [web] Fix referrer policy (#2639)
Ref: https://web.dev/articles/referrer-best-practices
2024-08-08 20:20:29 +05:30
Manav Rathi
7dcfe12d1d [web] Fix referrer policy
Ref: https://web.dev/articles/referrer-best-practices
2024-08-08 20:17:16 +05:30
ashilkn
b4500ef4d7 [mob][photos] Workaround for android 10 free up space issue
Workaround for deletedIDs being empty on android 10
2024-08-08 15:26:14 +05:30
Neeraj Gupta
4920ecf643 rename 2024-08-08 14:44:42 +05:30
Neeraj Gupta
58e55a7a00 [server] Clean up 2024-08-08 14:19:50 +05:30
Neeraj Gupta
86ad432d5b [server] Implement file data deleted using existing table as queue 2024-08-08 14:16:40 +05:30
Manav Rathi
0fcecc7786 [web] Improve handling of cancelled sub updates (#2635)
This fixes an issue where a user with a cancelled _and_ expired
subscription would try to purchase a plan, and would instead get
redirected to the updated subscription flow in stripe (instead of the
buy flow).

Smoke tested a few scenarios locally.
2024-08-08 14:15:55 +05:30
Manav Rathi
a3c51044c4 Unused 2024-08-08 14:02:24 +05:30
Manav Rathi
488c239cf2 Use 2024-08-08 13:59:44 +05:30
Manav Rathi
d26aafc5f4 Flowchart 2024-08-08 13:57:17 +05:30
Neeraj Gupta
272d17615e [server] Remove fileData cleanup via queue 2024-08-08 13:03:34 +05:30
Neeraj Gupta
50f6fd7440 Add request to get preview url 2024-08-08 12:51:42 +05:30
Manav Rathi
5ad1bacf3e Swap 2024-08-08 12:46:13 +05:30
Manav Rathi
1c8512ad81 wip harness 2024-08-08 12:38:33 +05:30
Manav Rathi
c784831ded Test 2024-08-08 12:35:04 +05:30
Manav Rathi
d53d39b400 Loop 2024-08-08 12:27:19 +05:30
ashilkn
eaf6147f2b Merge branch 'main' into guest_view 2024-08-08 12:12:12 +05:30
Manav Rathi
e31f0b042d Sketch 2024-08-08 12:05:20 +05:30
Neeraj Gupta
2eb0cb3487 Update DB Schema 2024-08-08 12:04:05 +05:30
Manav Rathi
395fe16d8a dp 2024-08-08 11:52:30 +05:30
Manav Rathi
ce421eded4 nanoids 2024-08-08 11:17:18 +05:30
Manav Rathi
5cc8479354 Outline 2 2024-08-08 10:50:49 +05:30
Manav Rathi
08303d2bb6 Outline 2024-08-08 10:36:48 +05:30
httpjamesm
00d0cfe72c feat: add shakepay and newton icon metadata 2024-08-08 00:12:51 -04:00
httpjamesm
f3b13042ca feat: newton crypto icon 2024-08-08 00:11:42 -04:00
httpjamesm
6fbc807225 feat: shakepay icon 2024-08-08 00:09:55 -04:00
Manav Rathi
9ec1affcbb docs: section links Method (#2633)
## Description
Link separate by hyphen for scrolling through intended section title.
## Tests
2024-08-08 09:13:05 +05:30
Guspan Tanadi
67d0fb1c31 docs: section links Method 2024-08-08 07:32:39 +07:00
Prateek Sunal
b6602d052f Merge remote-tracking branch 'origin/main' into mobile-panorama-fix 2024-08-08 04:01:24 +05:30
Prateek Sunal
7cafa9ccb6 fix(mob/panorama): add background pattern 2024-08-08 04:00:59 +05:30
Aman Raj Singh Mourya
b7bd8c83ba [mob][photos] Swipe lock for multiple files 2024-08-08 00:44:27 +05:30
Manav Rathi
36de2db175 [web] Finalize migration to new Exif library (#2630) 2024-08-07 21:07:37 +05:30
Prateek Sunal
a09794304c [auth] redirect support issues to github discussion (#2605)
## Description

same as title
2024-08-07 20:22:55 +05:30
Manav Rathi
fe97828328 Remove debug log 2024-08-07 19:50:00 +05:30
ashilkn
3652430b59 [mob][photos] Set volume to full in native video player 2024-08-07 18:57:27 +05:30
ashilkn
553e62dfae [mob][photos] Minor UI enhancements on native video player controls 2024-08-07 17:55:55 +05:30
ashilkn
a4c0c8b999 [mob][photos] Show duration and current position in duration in the native video player 2024-08-07 17:44:19 +05:30
Neeraj Gupta
1bb4940e14 Handle deletion from inFlight replica 2024-08-07 16:46:02 +05:30
Manav Rathi
959f887d2f Remove unused flexibility 2024-08-07 16:08:20 +05:30
ashilkn
7910d92d34 [mob][photos] Theme changes to seek bar 2024-08-07 16:00:13 +05:30
Manav Rathi
6967d1235e derived 2024-08-07 15:55:10 +05:30
Manav Rathi
ca1039884f Remove exif extraction during indexing 2024-08-07 15:50:10 +05:30
ashilkn
551c151f1e [mob][photos] Seek bar minor improvement 2024-08-07 15:47:50 +05:30
Manav Rathi
777f9e9704 - @xmldom/xmldom
(In next commit we'll remove it from the indexer)
2024-08-07 15:42:44 +05:30
ashilkn
af758d4e85 [mob][photos] Make dragging of seek bar interactive, both in the seek bar widget and in the video 2024-08-07 15:39:09 +05:30
Manav Rathi
527dfc3721 Remove exifr 2024-08-07 15:34:55 +05:30
Neeraj Gupta
5f14057b65 Update schema to add in-flight list of regions 2024-08-07 15:34:21 +05:30
Manav Rathi
8cde8d6d66 [web] Use new Exif library during uploads (#2629) 2024-08-07 15:16:51 +05:30
ashilkn
7795625708 [mob][photos] Move SeekBar and PlayPauseButton widgets to separate files 2024-08-07 15:07:52 +05:30
Manav Rathi
0b279111dd Use during uploads 2024-08-07 15:07:50 +05:30
ashilkn
c572fc171c [mob][photos] Make seeking work (only when seeking ends) 2024-08-07 14:58:38 +05:30
ashilkn
d452d1acb0 [mob][photos] Stop animating seek bar after being seeked when video is paused 2024-08-07 14:57:28 +05:30
Manav Rathi
1fdeebed28 Integrate 2024-08-07 14:37:12 +05:30
dnred
139d3b99a1 Change Auth mobile apps' names to "Ente Auth" (#2622)
## Description

Changed the name of the Auth mobile app to "Ente Auth" on both Android
and iOS to make it consistent with the naming of Ente Photos and to also
make it consistent on both platforms.
2024-08-07 14:34:01 +05:30
Manav Rathi
0a3182be53 Not deprecated 2024-08-07 14:15:12 +05:30
Shamshid
1db7bf2902 [Auth] Add 3 new icons (#2627)
## Description

Add icons for:
- [Booking.com](http://booking.com/)
- [Blockchain.com](https://blockchain.com/)
- [BitOasis](https://bitoasis.net/)
2024-08-07 14:07:14 +05:30
Manav Rathi
920b4e6823 Unnull 2024-08-07 13:55:18 +05:30
Manav Rathi
fe399762f5 Doc 2024-08-07 13:22:15 +05:30
Manav Rathi
9a60bf3ba6 Doc 2024-08-07 13:06:46 +05:30
Manav Rathi
862495c29e Up 2024-08-07 13:00:59 +05:30
Manav Rathi
5c0a80415d Give both a shot 2024-08-07 12:56:59 +05:30
Neeraj Gupta
075096258f Rename 2024-08-07 12:56:39 +05:30
Manav Rathi
728c3a80f4 Scaffold 2024-08-07 12:47:19 +05:30
Manav Rathi
6adbb82d54 p1 2024-08-07 12:40:18 +05:30
ashilkn
4c02e8ffa3 [mob][photos] Create seek bar that moves with video and animate the seek bar between each second with also handling edge cases
The native video player package that is used only emits an event at each second when the video is played. For a good looking seek bar, have animate it in between seconds
2024-08-07 12:31:15 +05:30
Manav Rathi
1fc1d3f4c0 Rearrange 2024-08-07 12:30:49 +05:30
Manav Rathi
05725dfdeb lay of the land 2024-08-07 12:26:02 +05:30
Manav Rathi
25c97dea48 Switch 2024-08-07 12:21:17 +05:30
Manav Rathi
9cc8469ed9 Remove unused 2024-08-07 12:04:34 +05:30
Manav Rathi
fead530786 Use in fixer 2024-08-07 11:41:29 +05:30
Manav Rathi
4d6b57b96c [web] Use the new date/time persistence format for edits (#2628) 2024-08-07 11:13:42 +05:30
Manav Rathi
74e50a8e37 Show from both places 2024-08-07 11:02:17 +05:30
Manav Rathi
62436db1c3 Add sync variant 2024-08-07 10:56:25 +05:30
Manav Rathi
f4adea5a60 Add wrapper 2024-08-07 10:33:53 +05:30
Manav Rathi
7ecfa20f03 Up 2024-08-07 10:19:12 +05:30
Manav Rathi
71b909d950 Outline 2024-08-07 10:15:14 +05:30
Manav Rathi
36673997dd lf 2024-08-07 09:37:05 +05:30
Manav Rathi
5d16f5735b Inline 2024-08-06 20:39:34 +05:30
Manav Rathi
8e284c1139 Don't use the offset 2024-08-06 20:30:05 +05:30
Manav Rathi
657ea68122 Keep in sync 2024-08-06 20:21:56 +05:30
Manav Rathi
a6cc6f24d0 Use newer fields 2024-08-06 20:05:27 +05:30
Neeraj Gupta
98a6bf9164 Store bucketID for temp objects 2024-08-06 17:01:06 +05:30
ashilkn
4abbb5c591 [mob][photos] Fix unexpected behaviour of play pause button 2024-08-06 16:34:56 +05:30
ashilkn
5351377ae7 [mob][photos] Make play pause controls for native video player 2024-08-06 16:29:16 +05:30
Manav Rathi
af4064b97a Prepare for merge 2024-08-06 16:24:40 +05:30
Neeraj Gupta
84fa8f343b clean up 2024-08-06 15:34:27 +05:30
Neeraj Gupta
ec91e75780 [server] Handle fileData cleanup on file Deletion 2024-08-06 15:31:53 +05:30
Manav Rathi
9ceae94071 Update docs 2024-08-06 15:30:38 +05:30
Manav Rathi
962a260e4b Copy over another hack 2024-08-06 15:27:05 +05:30
Manav Rathi
d30773e68a Fix 2024-08-06 15:22:38 +05:30
Manav Rathi
2c6298d6c3 Test 2 2024-08-06 14:56:21 +05:30
Manav Rathi
07786140f9 Give it a spin 2024-08-06 14:47:30 +05:30
Manav Rathi
7d36808bb5 Sprinkled with TODOs, but a checkpoint 2024-08-06 14:28:51 +05:30
Manav Rathi
a61ea9338e Add note about Zod and exactOptionalPropertyTypes 2024-08-06 14:07:21 +05:30
Manav Rathi
1c4ae46270 wip 1 2024-08-06 13:53:55 +05:30
Manav Rathi
1570b0a551 Entry point 2024-08-06 13:06:26 +05:30
ashilkn
eab1be3753 [mob][photos] Add native_video_player to pubspec.yaml 2024-08-06 12:42:45 +05:30
ashilkn
51f0cfff06 Merge branch 'main' into use_native_video_player 2024-08-06 11:32:50 +05:30
Ashil
b8cb480d23 [mob][photos] Fix bug in parsing rotation metadata from video using FFProbe (#2595)
### Description

Parse width and height of video correctly using FFProbe by 
- Considering both `coded_height` & `height` + `coded_width` + `width`
keys to parse height and width of video. Came across two videos where
`coded_width` and `coded_height` were both `0` where as `height` and
`width` had the correct values.
- Parse `rotation` from `side_data_list` and consider `rotation` for
accurate (i.e, not flipped) dimensions.

Have made sure the correct height and width of the video is shown on the
video's file info. Sometimes there could be a slight difference from
what a user would expect, if the `coded_side` is different from `side`
(`side` is `width` or `height`). Will be fixing this in future.
Ref:
https://superuser.com/questions/1523944/whats-the-difference-between-coded-width-and-width-in-ffprobe
2024-08-06 11:25:13 +05:30
Prateek Sunal
d9bd96ce34 Merge remote-tracking branch 'origin/main' into mobile-panorama-fix 2024-08-06 02:31:52 +05:30
Manav Rathi
a821d1f283 [web] Magic metadata related refactoring (#2621)
This is mostly prep, no (major) changes to the functional codepaths yet.
2024-08-05 20:56:46 +05:30
Manav Rathi
4470fe0425 Clean 2024-08-05 20:41:22 +05:30
Manav Rathi
296bcbc8c2 Move and grow 2024-08-05 20:33:54 +05:30
Manav Rathi
f38d432bf9 It's also used for collections 2024-08-05 20:22:33 +05:30
Manav Rathi
543b180137 Rename II 2024-08-05 20:20:58 +05:30
Manav Rathi
2e683bb625 Doc 2024-08-05 20:19:10 +05:30
Manav Rathi
164d875324 Rename 2024-08-05 20:11:48 +05:30
Manav Rathi
70d691207c Doc 2024-08-05 20:04:21 +05:30
Manav Rathi
b12f981f5b Sibling 2024-08-05 20:00:17 +05:30
Manav Rathi
28ca94265d More 2024-08-05 19:54:20 +05:30
Manav Rathi
b16a717776 Doc 2024-08-05 19:15:39 +05:30
Manav Rathi
20ac146b50 Remove unnecessary alias 2024-08-05 18:25:44 +05:30
ashilkn
2916bcfda8 [mob][photos] chore 2024-08-05 18:24:29 +05:30
Manav Rathi
b91d854a92 New 2024-08-05 18:14:50 +05:30
ashilkn
f69214461d [mob][photos] Add todo comment 2024-08-05 18:09:07 +05:30
Crowdin Bot
cbb1a57ffe New Crowdin translations by GitHub Action 2024-08-05 18:06:28 +05:30
Neeraj Gupta
543aa6b9cf Clean up 2024-08-05 17:46:00 +05:30
Neeraj Gupta
744d6bc6ea Add helper method to empty bucket for given user 2024-08-05 17:35:05 +05:30
Neeraj Gupta
81c3626c6c Rename 2024-08-05 17:31:12 +05:30
Neeraj Gupta
27eb5ecc2b [server] Update DB Script 2024-08-05 16:44:34 +05:30
Neeraj Gupta
18d58a9eee [server] Parse config for file-data buckets 2024-08-05 16:44:01 +05:30
Manav Rathi
9991f0bfc0 [web] Better standardize the crypto nomenclature used in code (#2620) 2024-08-05 15:44:49 +05:30
Manav Rathi
9640d485a2 Rename 2024-08-05 15:37:46 +05:30
Manav Rathi
9b896c5c2f Dedup 2024-08-05 15:37:29 +05:30
Manav Rathi
838840bfa8 Decrypt thumb 2024-08-05 15:36:34 +05:30
Manav Rathi
2952c4a4c6 Consistency 2024-08-05 15:19:20 +05:30
ashilkn
e1713851b3 [mob][photos] Show accurate height and width in file info for a video 2024-08-05 15:09:16 +05:30
Manav Rathi
2d1a8e5b85 Doc 2024-08-05 15:08:47 +05:30
Manav Rathi
a59b11c9f8 Rearrange 2024-08-05 15:04:46 +05:30
Manav Rathi
40c360a1bd Rename 2024-08-05 15:03:55 +05:30
Manav Rathi
d599a6dcfa Thumb 2024-08-05 15:03:39 +05:30
Manav Rathi
219cc405da Terms 2024-08-05 14:58:35 +05:30
Manav Rathi
8cabf13e5a lint 2024-08-05 14:46:16 +05:30
Manav Rathi
f8c12ba127 Rename 2024-08-05 14:44:37 +05:30
Manav Rathi
9583b31bfc Prune 2024-08-05 14:44:03 +05:30
Manav Rathi
506dc36c69 Rest 2024-08-05 14:43:36 +05:30
Manav Rathi
61935a0037 More 2024-08-05 14:41:56 +05:30
Manav Rathi
25541ecd3a More 2024-08-05 14:41:05 +05:30
Manav Rathi
5e3cae39ec Entities too 2024-08-05 14:38:21 +05:30
Manav Rathi
e60506586e Prune 2024-08-05 14:33:29 +05:30
Manav Rathi
0d8a49317a Upload 2024-08-05 14:32:57 +05:30
Manav Rathi
6b52f1e53b all but 1 2024-08-05 14:26:45 +05:30
Manav Rathi
9ff4aa47d0 Collection 2024-08-05 14:22:28 +05:30
Manav Rathi
edbe40d2fa Use 2024-08-05 14:21:03 +05:30
Manav Rathi
4c28646ecc Expand to collections 2024-08-05 14:20:03 +05:30
Manav Rathi
8ec2d3e87c Forward 2024-08-05 14:01:46 +05:30
Crowdin Bot
2a00313159 New Crowdin translations by GitHub Action 2024-08-05 14:01:35 +05:30
Manav Rathi
22b2c49b63 metadata 2024-08-05 13:57:05 +05:30
Manav Rathi
13ab0d4309 enc new 2024-08-05 13:49:21 +05:30
Manav Rathi
5536f7ac03 Update the embedding layer 2024-08-05 13:42:55 +05:30
Manav Rathi
bd42650b9e More docs etc 2024-08-05 13:28:02 +05:30
Manav Rathi
13f31a7d09 Dec 2024-08-05 12:12:14 +05:30
Manav Rathi
124552eda3 New 2024-08-05 12:04:38 +05:30
Manav Rathi
a9359d15d3 Doc 2024-08-05 11:39:31 +05:30
Manav Rathi
15f80e3fa6 Ontology 2024-08-05 11:33:16 +05:30
Manav Rathi
2dcc199556 Unused 2024-08-05 11:10:56 +05:30
Manav Rathi
9bce3bba7c Rename and prune 2024-08-05 11:07:57 +05:30
Manav Rathi
32a602725a Unnest 2024-08-05 10:34:01 +05:30
Manav Rathi
0bff899713 Doc 2024-08-05 10:31:07 +05:30
Neeraj Gupta
d0fd868705 Merge branch 'main' into file_data 2024-08-05 10:24:02 +05:30
Manav Rathi
a02a4ca5c1 [web] New translations (#2616)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-05 09:53:17 +05:30
Crowdin Bot
2860a94dae New Crowdin translations by GitHub Action 2024-08-05 00:31:53 +00:00
Manav Rathi
ccc20c5bbd [server] Mention extra in docs (#2613)
Ref: https://github.com/ente-io/ente/pull/2607
2024-08-03 18:13:30 +05:30
Manav Rathi
98de9082b9 [server] Mention extra in docs
Ref: https://github.com/ente-io/ente/pull/2607
2024-08-03 18:11:15 +05:30
Manav Rathi
c703f46243 [web] Miscellaneous improvements (#2612) 2024-08-03 18:02:43 +05:30
Manav Rathi
6bd9607c94 allow setting extra parameter for dsn (#2607)
## Description
For https://github.com/ente-io/ente/discussions/2603
2024-08-03 18:01:32 +05:30
Manav Rathi
d68c04a8fb Increase tap area for better mobile UX 2024-08-03 17:57:41 +05:30
Manav Rathi
eea4958ee7 Non-ente ext links 2024-08-03 17:42:49 +05:30
Manav Rathi
6feb3b7897 Move 2024-08-03 17:20:21 +05:30
Manav Rathi
17e57b7486 Inline 2024-08-03 17:14:21 +05:30
Manav Rathi
9673aa1c19 Remove redundant preload
We show the img tag immediately
2024-08-03 17:11:27 +05:30
Manav Rathi
ebf51b99c8 Remove unused image (and its preload) 2024-08-03 17:05:41 +05:30
Manav Rathi
56c4b39d75 Button already handles this 2024-08-03 16:41:33 +05:30
Neeraj Gupta
14d003dd8f [server] Add API to update referral code 2024-08-03 16:39:15 +05:30
Manav Rathi
a01077a1a4 Inline 2024-08-03 16:38:27 +05:30
Neeraj Gupta
29cf5b91a5 [server] Fix deviceLimit tracker 2024-08-03 16:37:00 +05:30
Neeraj Gupta
3392e39f7c [server] Change default link expiry to never 2024-08-03 16:37:00 +05:30
Manav Rathi
c604078736 Prune 2024-08-03 16:31:36 +05:30
Manav Rathi
80dccca62c Accurater 2024-08-03 16:11:59 +05:30
Manav Rathi
04d632b50e Opt
https://mui.com/material-ui/react-use-media-query/#client-side-only-rendering
2024-08-03 16:09:40 +05:30
Neeraj Gupta
c41933edc4 [server] Fix typo (#2608)
## Description

## Tests
2024-08-03 16:07:17 +05:30
Neeraj Gupta
d1dc977d5e [server] Add struct for fileData config 2024-08-03 16:06:47 +05:30
Manav Rathi
0db9bd04a1 Inline 2024-08-03 16:04:41 +05:30
Manav Rathi
179acd7e47 Prune more 2024-08-03 16:00:04 +05:30
Manav Rathi
97486818d8 [web] Use pointer media query to approximate mobile device detection 2024-08-03 15:51:49 +05:30
Vishnu Mohandas
22cff206b3 Update README.md 2024-08-03 15:35:52 +05:30
Manav Rathi
b8e20eb263 [web] Start using new Exif library during date modifications (#2604) 2024-08-03 10:15:31 +05:30
Manav Rathi
d530562552 Update docs 2024-08-03 10:14:30 +05:30
Manav Rathi
ef38b639eb Fix appearance in the info drawer 2024-08-03 10:10:36 +05:30
Manav Rathi
7db35fd8bd I don't see a pen icon anymore
Not sure what this was for
2024-08-03 09:54:19 +05:30
Manav Rathi
59d772f609 Fix the layout shift 2024-08-03 09:54:06 +05:30
Manav Rathi
d5e54214da Fix another bunch of issues
This also fixes the problem with the separator (the colon in 08:54) not aligning
in the default orientation.
2024-08-03 08:57:51 +05:30
Manav Rathi
1227991300 Customize the paper slot the new way 2024-08-03 08:42:16 +05:30
Manav Rathi
cf81d25b6a Migrate renderInput 2024-08-03 08:35:01 +05:30
Manav Rathi
cc596ae4f0 freshen 2024-08-03 06:14:49 +05:30
John Doe
dbab1bad55 allow setting extra parameter for dsn 2024-08-02 21:09:23 +01:00
ashilkn
7c202a4edb [mob][photos] Consider the 'width' and 'height' key also when parsing dimensions of video 2024-08-02 17:26:36 +05:30
Prateek Sunal
289718f7f6 fix(auth/support): update support email to auth@ente.io 2024-08-02 16:40:39 +05:30
Prateek Sunal
986c00f4e8 fix(auth/support): remove support email and redirect to github discussions 2024-08-02 16:36:05 +05:30
Manav Rathi
025b8f7bcf Handle initial option 2024-08-02 15:24:58 +05:30
Victor Muthiani
5f7b411b67 [Auth] Add new icons and fix some icons (#2559)
## Description
1. Icons added:

- Ecitizen Kenya
- Bitget Wallet

2. Fixed icons that were invisble:

- Crypto
- 1xbet

3. Updated icons to cater for both dark and light mode:

- Github
- OKX 
- Bitmart

4. Reduced deriv.svg icon width
2024-08-02 15:22:01 +05:30
Manav Rathi
487cf125c1 Lint fix 2024-08-02 15:17:51 +05:30
Neeraj Gupta
e32cd7b64c [server] Expose API to get and put metadata 2024-08-02 15:09:52 +05:30
Manav Rathi
839b86ce88 uncon 2024-08-02 14:58:51 +05:30
Manav Rathi
2ebfc79420 Handle initial value 2024-08-02 14:54:50 +05:30
Manav Rathi
eb848eb4c6 The other place 2024-08-02 14:51:30 +05:30
Manav Rathi
ea36517832 Move back
Too many requisites first need to be moved to move those functions to new.
2024-08-02 14:49:55 +05:30
Manav Rathi
0bbb15337f Rework 2024-08-02 14:35:11 +05:30
Manav Rathi
8a2d3600e9 wip move 2024-08-02 14:21:51 +05:30
Manav Rathi
4335df1634 mig wip 2024-08-02 13:58:09 +05:30
Manav Rathi
967149c04b New home 2024-08-02 13:44:31 +05:30
Manav Rathi
a19179cacd Fix type 2024-08-02 13:42:12 +05:30
ashilkn
4f3fe73daa [mob][photos] Fix getVideoPropsAsync failing in native video player because a normal file and not the origin file was being passed to it in case of locally available vidoes 2024-08-02 13:33:32 +05:30
Manav Rathi
edc3337192 2 2024-08-02 13:33:10 +05:30
Manav Rathi
0241e408e1 Make it work 1
Rely on default 1900 instead of 1800
2024-08-02 13:18:50 +05:30
Manav Rathi
32469adcc5 Update MUI date picker to try and obtain the UTC functionality
Per https://mui.com/blog/mui-x-v6/#decoupling-versions-from-mui-core, the
version of MUI X is now decoupled from MUI core so this should work even when
our MUI remains at 5.

Migration:
- https://mui.com/x/migration/migration-pickers-v5/
- https://mui.com/x/migration/migration-tree-view-v6/
2024-08-02 12:28:26 +05:30
Manav Rathi
c8fcac8b55 (doesn't work) attempt to use UTC dates
We need to update MUI
2024-08-02 12:24:13 +05:30
Manav Rathi
fa89ed3a7c Switch to dayjs for UTC support 2024-08-02 12:14:30 +05:30
Manav Rathi
1364feeac8 Scope 2024-08-02 11:55:29 +05:30
Manav Rathi
3bf81dda3b Make it work 2024-08-02 11:51:03 +05:30
Manav Rathi
066c41a6df Upgrade 2024-08-02 11:38:10 +05:30
Manav Rathi
57dd8b0c67 Doc 2024-08-02 11:21:25 +05:30
Manav Rathi
54d97c222e Fix lint 2024-08-02 11:14:31 +05:30
Manav Rathi
ee233eab71 Tweak 2024-08-02 11:07:41 +05:30
Manav Rathi
706c288220 Remove unused prop 2024-08-02 10:48:47 +05:30
Manav Rathi
93b7d71543 Use the mui option 2024-08-02 10:47:04 +05:30
Manav Rathi
d6433155db New home 2024-08-02 10:42:51 +05:30
Manav Rathi
993943ccfa Prep 2024-08-02 10:41:28 +05:30
Manav Rathi
99c6c22fe1 [web] Non functional code rearrangement for the plan list (#2597) 2024-08-01 21:19:04 +05:30
Manav Rathi
bf6dc59429 Up 2024-08-01 21:12:07 +05:30
Manav Rathi
7c71277759 Inline 2024-08-01 21:11:10 +05:30
Manav Rathi
88996eddea Inline 2024-08-01 21:08:26 +05:30
Manav Rathi
dbd2addeea Scope 2024-08-01 21:06:44 +05:30
Manav Rathi
ab652ee3fe Inline 2024-08-01 21:05:04 +05:30
Manav Rathi
d14b18867a Remove unused 2024-08-01 21:00:16 +05:30
Manav Rathi
cfe2e96227 Inline 2024-08-01 20:59:26 +05:30
Manav Rathi
ad0b8ae017 Inline 2024-08-01 20:55:52 +05:30
Manav Rathi
7e5577ecd7 Inline 2024-08-01 20:53:19 +05:30
Manav Rathi
cd73a736f4 Remove unused 2024-08-01 20:51:44 +05:30
Manav Rathi
0a03df9242 Inline 2024-08-01 20:50:03 +05:30
Manav Rathi
1c4a6ca8b1 Remove unused 2024-08-01 20:39:28 +05:30
Manav Rathi
f15729d73f Inline 2024-08-01 20:37:14 +05:30
Manav Rathi
8edf6d8253 Remove unnecessary cast 2024-08-01 20:36:18 +05:30
Aman Raj Singh Mourya
43525128eb [mob][photos] Multi-Item Selection and Deletion Feature for Quick Links (#2589)
**Description**
This PR introduces a new feature that allows users to select multiple
links from quick links and delete them in one action.
2024-08-01 20:21:47 +05:30
Aman Raj Singh Mourya
ea585903b7 Merge branch 'quick_links' of https://github.com/ente-io/ente into quick_links 2024-08-01 20:17:32 +05:30
Aman Raj Singh Mourya
42c508b9ce [mob][photos] Use string for ValueKey 2024-08-01 20:16:56 +05:30
ashilkn
2fd960eb0e Merge branch 'main' into quick_links 2024-08-01 20:10:43 +05:30
Aman Raj Singh Mourya
e72c858315 [mob][photos] Fixed animation 2024-08-01 19:55:47 +05:30
Aman Raj Singh Mourya
2af07d9211 [mob][photos] Added animation 2024-08-01 19:55:19 +05:30
Aman Raj Singh Mourya
5f40b2e251 [mob][photos] Extracted strings 2024-08-01 19:31:21 +05:30
Ashil
50b6616680 [mob][auth] Bump up to v3.1.0 (#2582) 2024-08-01 19:25:43 +05:30
Ashil
ca3b477d4c [mob][photo] Fix incorrect SQLite syntax (missing whitespace) (#2587) 2024-08-01 19:25:17 +05:30
Neeraj Gupta
395f0384a0 [cli] Add option to exlude shared or hidden folders 2024-08-01 19:13:03 +05:30
Aman Raj Singh Mourya
1c1135a9b2 [mob][photos] Minor UI changes 2024-08-01 19:03:25 +05:30
ashilkn
31318f10d6 [mob][photos] Set aspect ratio of video 2024-08-01 18:38:34 +05:30
Aman Raj Singh Mourya
105ab79cdb [mob][photos] Changed dialog copy 2024-08-01 18:19:27 +05:30
Neeraj Gupta
0526c63681 [cli] Extend export command to pass filters 2024-08-01 17:52:58 +05:30
Neeraj Gupta
7d8a7257b4 [cli] Add list of filters 2024-08-01 17:46:05 +05:30
ashilkn
af5e9b51e1 [mob][photos] Fix bug in parsing rotation metadata from video using FFProbe 2024-08-01 16:51:36 +05:30
Manav Rathi
884ff970ad [desktop] Make the Exif backfill optional (#2594) 2024-08-01 16:33:53 +05:30
Manav Rathi
22f4a3751f [desktop] Don't use the indexable-files API (#2593)
Discussed. It is meant for mobile app use cases - us using it also on
desktop (where the constraints are different) doesn't really improve on
much latency and adds the overhead of extra API requests on each sync.

Supercedes: https://github.com/ente-io/ente/pull/2591
2024-08-01 16:33:06 +05:30
Manav Rathi
e640302ce0 [desktop] Make the exif backfill optional 2024-08-01 16:30:41 +05:30
Manav Rathi
4e51d76791 [desktop] Don't use the indexable-files API
Discussed. It is meant for mobile app use cases - us using it also on desktop
(where the constraints are different) doesn't really improve on much latency and
adds the overhead of extra API requests on each sync.
2024-08-01 16:12:21 +05:30
ashilkn
9b5b1d297b [mob][photos] Start integrating native_video_player 2024-08-01 15:52:41 +05:30
Manav Rathi
be00f015a7 [desktop] Handle logout for utility process (#2592) 2024-08-01 15:30:58 +05:30
Manav Rathi
9c883eebc6 [desktop] Handle logout for utility process 2024-08-01 15:27:14 +05:30
ashilkn
d5b5b9bd51 [mob][photos] Rename VideoWidgetNew to VideoWidgetMediaKit 2024-08-01 14:53:38 +05:30
Ashil
50f601b66b [mob][photos] Handle/fix issues with media dimensions (#2580)
## Description

- Stopped updating image width and height in public metadata since the
these could be incorrect (width and height inverted to be precise).
- Parse `rotation` metadata from video metadata when parsing video
properties with `ffprobe` to get the correct video width and height
considering `rotation`.
2024-08-01 14:46:02 +05:30
Neeraj Gupta
bfe5632477 [server] Support for inserting and fetching s3 metadata 2024-08-01 13:24:46 +05:30
Neeraj Gupta
a67bc6aee7 [server] Add bucket5 2024-08-01 13:24:25 +05:30
Manav Rathi
c0011ef10b [desktop] Pull existing embeddings first before starting on indexing (#2591)
Speeds up the initial sync on a new client.
2024-08-01 12:36:14 +05:30
Manav Rathi
985de0a5ce Fix the actual issue described in 940c647d50 2024-08-01 12:26:27 +05:30
Manav Rathi
940c647d50 Prevent multiple ticks from being enqueued
Noticed multiple ticks when uploading an item, which brought back focus into the
app and caused wakeUp also to get triggered because of sync. Not sure if this
was the issue, but felt like a potential one.
2024-08-01 12:19:06 +05:30
Manav Rathi
97bbf4811f Save 2024-08-01 11:45:25 +05:30
Manav Rathi
eed991a7b2 Construct the scaffolding 2024-08-01 11:22:10 +05:30
Manav Rathi
5a362b5d45 Move wip 2024-08-01 11:06:41 +05:30
Manav Rathi
523af2600a pull wip 2024-08-01 10:49:45 +05:30
Manav Rathi
f869447c7d File IDs 2024-08-01 10:41:31 +05:30
Manav Rathi
586d8f86f7 Up 2024-08-01 10:32:47 +05:30
Manav Rathi
c369db9453 Impl handler for /embeddings/indexed-files
https://github.com/ente-io/ente/pull/2511/
2024-08-01 10:15:04 +05:30
Manav Rathi
c4103f9136 Restore the pull scaffolding
Partially reverts 61b98a9964
2024-08-01 09:49:54 +05:30
Aman Raj Singh Mourya
ba9d656b38 [mob][photos] Added dialog box for confirmation 2024-07-31 19:47:08 +05:30
Vishnu Mohandas
31493541a1 Update pricing faq (#2588)
## Description

## Tests
2024-07-31 19:34:42 +05:30
vishnukvmd
af90bfade7 Update pricing faq 2024-07-31 19:33:35 +05:30
ashilkn
95e342830b [mob][photo] Fix incorrectly formatted query (missing whitespace) 2024-07-31 18:20:53 +05:30
Manav Rathi
eb2557b2b0 [desktop] Use a utility process for ML indexing (#2583)
* This ensures that the UI remains responsive when indexing is running.
* This allows us to parallelize the in-flight networking etc instead of
waterfalling everything.
* The actual CPU intensive indexing is still serial.
2024-07-31 16:27:28 +05:30
Manav Rathi
9ae979abbe [web] New translations (#2586)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-07-31 15:54:48 +05:30
Crowdin Bot
03805b6e75 New Crowdin translations by GitHub Action 2024-07-31 10:23:46 +00:00
Manav Rathi
b10d674711 [web] Free forever copy changes (#2585) 2024-07-31 15:53:00 +05:30
Aman Raj Singh Mourya
6361859a1b [mob][photos] Batch operation to delete quick links 2024-07-31 15:52:07 +05:30
Manav Rathi
e2f1d7488b [web] Free forever copy changes 2024-07-31 15:49:36 +05:30
Manav Rathi
8a39e4330b [web] New translations (#2584)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-07-31 15:45:29 +05:30
Crowdin Bot
81d1b15aaf New Crowdin translations by GitHub Action 2024-07-31 10:14:24 +00:00
Manav Rathi
f925d4cf27 Update plan IDs for pricing-v4 (#2573) 2024-07-31 15:32:24 +05:30
vishnukvmd
d52ea49a96 Update plan IDs for pricing-v4 2024-07-31 15:30:14 +05:30
Manav Rathi
0bc360c55c Add link 2024-07-31 15:21:52 +05:30
Manav Rathi
154fffd620 Clean unused 2024-07-31 15:11:23 +05:30
Manav Rathi
46cc696ccd Avoid jargon people might not understand 2024-07-31 14:58:24 +05:30
Manav Rathi
5e055b6039 opt unnecessary uploads 2024-07-31 14:44:42 +05:30
Manav Rathi
59cc01053a Handle refresh 2024-07-31 14:35:47 +05:30
Manav Rathi
1b0fe5fd4c Tighten timings 2024-07-31 14:19:25 +05:30
Manav Rathi
bf6aa5f840 Fix 2024-07-31 14:08:16 +05:30
Manav Rathi
ef32313807 x4 2024-07-31 14:04:29 +05:30
Neeraj Gupta
5bd75a8567 [server] Add req/res model files 2024-07-31 13:42:31 +05:30
Manav Rathi
ebbb9a61ee Don't fail on exif errors 2024-07-31 13:14:09 +05:30
Neeraj Gupta
b9b22fa4dc [server] Add DB triggers for validating row sanity 2024-07-31 13:04:51 +05:30
ashilkn
3d730f4d14 [mob][auth] Bump up to v3.1.0 2024-07-31 12:55:57 +05:30
Manav Rathi
4647f9fac2 Undup and scope 2024-07-31 12:47:52 +05:30
Manav Rathi
192e491acb Match the documented behaviour 2024-07-31 12:46:09 +05:30
Ashil
627a34a231 [mob][auth] Lockscreen option auth (#2465)
### Pull Request Description

*Features Added:*

1. *App Lock Options:*
- *Device Lock*: Users can set the app lock to utilize the device's
default lock mechanism (e.g., fingerprint, face recognition, or device
PIN/password).
- *Custom PIN/Password*: Users have the option to set a custom PIN or
password for app lock.

2. *Authentication for App Lock Settings:*
- When users attempt to change the app lock settings, they must
authenticate using the currently set PIN/password or, if none is set,
the device lock.

3. *App Lock on Background and Quit:*
- The app will prompt for authentication when it is brought back to the
foreground after being in the background or when the app is restarted.
4. *Incremental Lock Timer:*
- A timer mechanism is implemented which starts at 30 seconds after few
incorrect unlock attempts.
- The lockout time doubles after each incorrect attempt, increasing
delay penalties.
- After 10 incorrect attempts, the user is automatically logged out.
2024-07-31 12:43:15 +05:30
Manav Rathi
3a5843f532 tail 2024-07-31 12:34:30 +05:30
Manav Rathi
5a3838be34 Route via workers 2024-07-31 12:30:15 +05:30
Manav Rathi
e55a7facc3 Replace our homebrew RPC 2024-07-31 12:11:53 +05:30
Manav Rathi
6ad27a2d42 Cleanup 2024-07-31 11:58:22 +05:30
ashilkn
423f0b6719 [mob][auth] Reorder security section 2024-07-31 11:50:10 +05:30
Manav Rathi
62f723e50c Adapt 2024-07-31 11:33:18 +05:30
Manav Rathi
a97e01171a Commit incorrect but original motivations 2024-07-31 11:27:15 +05:30
Manav Rathi
daed8a72da Only once 2024-07-31 10:17:08 +05:30
Manav Rathi
b69d23028b Remove test code 2024-07-31 09:56:45 +05:30
Manav Rathi
1ae0f9723c Fix 1 2024-07-31 09:56:00 +05:30
Manav Rathi
f2f7b483fd comlink wip 2024-07-31 09:40:08 +05:30
Manav Rathi
95facd60e0 integrate wip 1 2024-07-31 09:20:35 +05:30
Aman Raj Singh Mourya
30cecf53b3 [mob][auth] Hide content default value set to true when applock enabled 2024-07-30 22:02:50 +05:30
Aman Raj Singh Mourya
2101817b23 [mob][auth] Code clean up 2024-07-30 21:49:40 +05:30
Manav Rathi
7baacc6a77 For real - 1 2024-07-30 20:22:09 +05:30
Manav Rathi
65cfcc27a8 Rearrange 2024-07-30 20:00:21 +05:30
Manav Rathi
3f3d10f57b Error 2 2024-07-30 19:53:39 +05:30
Manav Rathi
18cb596d57 Error 1 2024-07-30 19:41:51 +05:30
Manav Rathi
4ca40085c1 init 2024-07-30 19:13:54 +05:30
ashilkn
878d22fd4a [mob][auth]: Show auto lock feature only on mobile 2024-07-30 18:46:03 +05:30
ashilkn
c3c2dd5cc6 [mob][auth] Fix 'App lock' not working onTap from security section on macOS and Linux 2024-07-30 18:14:59 +05:30
ashilkn
08ba58d790 [mob][photos] Write getters to access correct height and width considering the rotation data and keep the raw codec height and width properties private in FFProbeProps 2024-07-30 17:30:20 +05:30
ashilkn
60d9a819f4 [mob][photos] Rename 2024-07-30 16:52:36 +05:30
ashilkn
6842218d2b [mob][photos] Remove unnecessary int to double conversion 2024-07-30 16:37:10 +05:30
ashilkn
3f0855d9a4 [mob][photos] write getter for video dimensions considering rotation in FFProbeProps 2024-07-30 16:27:43 +05:30
ashilkn
b2556e893b [mob][photos] Parse rotation also when parsing video properties using ffprobe 2024-07-30 16:18:30 +05:30
Manav Rathi
81b52419a5 debug strings 2024-07-30 16:03:57 +05:30
Manav Rathi
e66e9251db Fancier 2024-07-30 15:48:44 +05:30
Manav Rathi
37367f7260 Logging 1 2024-07-30 15:41:48 +05:30
ashilkn
48e566ae68 [mob][photos] Stop updating dimension in pubmmd as it could be inverted for some images 2024-07-30 15:40:17 +05:30
Manav Rathi
29877d119c Let it flow 2024-07-30 14:51:40 +05:30
Manav Rathi
c124cdff20 Fix ordering 2024-07-30 14:49:31 +05:30
Manav Rathi
3d83786f6c Workaround 2024-07-30 14:46:54 +05:30
Aman Raj Singh Mourya
a14a8b0cfb [mob][auth] Lockscreen fixes 2024-07-30 14:40:32 +05:30
Manav Rathi
d92a31d8d8 Indicate error 2024-07-30 14:27:27 +05:30
Manav Rathi
3eaa9b449a IPC 2024-07-30 14:16:10 +05:30
Manav Rathi
b28e8c2fb4 IPC 2024-07-30 13:41:58 +05:30
Manav Rathi
24bc175f1c Forward 2024-07-30 13:21:31 +05:30
Manav Rathi
e54910f8d0 Fix origin 2024-07-30 12:44:22 +05:30
Manav Rathi
0195a9b494 Add workaround 2024-07-30 12:43:07 +05:30
Manav Rathi
ea8bb4529f We need to go via the preload 2024-07-30 12:29:11 +05:30
Manav Rathi
180389f3e2 Can't circumvert that way 2024-07-30 12:00:44 +05:30
Manav Rathi
7d42f23abf Send to the right person 2024-07-30 11:48:00 +05:30
Manav Rathi
4087c6ef4e Fix path 2024-07-30 11:39:58 +05:30
Manav Rathi
67a9417528 Scaffold 2024-07-30 11:37:46 +05:30
Manav Rathi
1e720b4b7d Scaffold 2024-07-30 11:23:32 +05:30
Manav Rathi
1a9170632e Take 1 2024-07-30 11:16:04 +05:30
Neeraj Gupta
3a962cfe52 [server] Extend ObjectType instead of creating new enum 2024-07-30 10:30:57 +05:30
Manav Rathi
65d2bfe1c1 Split on the main/utility axis 2024-07-30 10:19:03 +05:30
Manav Rathi
82f808e533 Outline 2024-07-30 09:59:33 +05:30
Ashil
27ae4b83c4 [mob][photos] Subscription screen redesign (#2576) 2024-07-29 22:54:34 +05:30
ashilkn
142a4ddbc4 [mob][photo] Bump up to v0.9.16 2024-07-29 21:44:18 +05:30
ashilkn
406404f8d0 Merge branch 'main' into subscription_screen_redesign 2024-07-29 21:43:19 +05:30
ashilkn
088cec2716 [mob][photos] Fix on tap not working on free plan when onboarding 2024-07-29 21:38:45 +05:30
Manav Rathi
cf6336d100 [web] Minor tweak for the indexer (#2577)
Continuation of https://github.com/ente-io/ente/pull/2574.
2024-07-29 21:13:00 +05:30
Aman Raj Singh Mourya
c6bf6bd7b6 [mob][photos] Changed max quick link count to 4 2024-07-29 21:09:49 +05:30
Manav Rathi
3dbdea472b Add a top level catch handler instead of silent swallows 2024-07-29 20:46:05 +05:30
ashilkn
d5711095f9 [mob][photos] Change border of plans in subscription screen 2024-07-29 19:34:47 +05:30
ashilkn
2a3fe8c49f [mob][photos] Copy stripe subscription page changes to store subscription page 2024-07-29 19:22:53 +05:30
ashilkn
7d94ef0bbd [mob][photos] Subscription page final UI tweaks 2024-07-29 17:56:58 +05:30
ashilkn
4e589840ff [mob][photos] Subscription page UI improvements 2024-07-29 17:15:03 +05:30
Neeraj Gupta
3571281bef [auth] New translations (#2568)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)
2024-07-29 17:03:03 +05:30
Neeraj Gupta
7b0ec2991a [mobile] New translations (#2567)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-app)
2024-07-29 17:00:03 +05:30
Ashil
3572efc02b [mob][photos] Add preview to the album link (#2553) 2024-07-29 16:14:26 +05:30
Manav Rathi
3013d68203 [web] Exif - Migrate to a maintained library - Part 6/x (#2574) 2024-07-29 16:12:19 +05:30
Aman Raj Singh Mourya
c7857110ac [mob][photos] Minor changes 2024-07-29 16:11:52 +05:30
Manav Rathi
505e1de14c lint 2024-07-29 16:09:33 +05:30
Manav Rathi
d116c5ccb1 Prune false positives for times picked from file names 2024-07-29 15:59:55 +05:30
Aman Raj Singh Mourya
8f08ab18fc [mob][photos] MInor changes 2024-07-29 15:56:48 +05:30
Neeraj Gupta
dc143bbaaf [server] Minor fix 2024-07-29 15:48:22 +05:30
Neeraj Gupta
8f8f5d2f51 [server] Avoid redirect 2024-07-29 15:47:44 +05:30
Manav Rathi
aad7300e4b Take 2 2024-07-29 15:41:44 +05:30
Neeraj Gupta
2cc87140ed Add basic endpoint to unblock testing 2024-07-29 15:37:58 +05:30
Manav Rathi
0290991e2c DOMParser is not available in web workers
Exif extraction from XMP thus fails with the following console warning

    Warning: DOMParser is not available. It is needed to be able to parse XMP tags

Thus we need to explicitly take a dep on xmldom.
2024-07-29 15:16:33 +05:30
Manav Rathi
9e2e8e4d63 Fix 2024-07-29 14:54:31 +05:30
Aman Raj Singh Mourya
509b7bda67 [mob][photos] Moving code to share_util.dart 2024-07-29 14:48:42 +05:30
Manav Rathi
30db24721a Fix video spinner 2024-07-29 14:46:29 +05:30
Manav Rathi
b121daa607 Trace 2024-07-29 14:40:11 +05:30
Manav Rathi
bae717dc69 Prepare for internal users 2024-07-29 14:19:17 +05:30
Manav Rathi
b61e4f4ac6 Integrate exif 2024-07-29 13:55:37 +05:30
Manav Rathi
a7e0c5b61d Use the new server enum 2024-07-29 13:20:25 +05:30
Manav Rathi
7a2d925737 [server] Stop exposing /metrics for self-hosted users (#2569)
Doesn't impact Ente's production instances since this endpoint was
disallowed on the load balancer, but instead of requiring the same for
folks who are self hosting we modify the source to not expose /metrics
on :8080 (they'll still be available on :2112).

Refs:
-
2199a42d96/middleware.go (L345)
- https://github.com/ente-io/ente/discussions/2562
2024-07-29 12:05:07 +05:30
Vishnu Mohandas
84ee895b93 Fix typo (#2570) 2024-07-29 11:56:53 +05:30
Vishnu Mohandas
92068fbbd6 Fix typo 2024-07-29 11:56:40 +05:30
Neeraj Gupta
950b2bb997 [server] Update db script 2024-07-29 11:42:14 +05:30
Manav Rathi
d989a3b631 [server] Stop exposing /metrics for self-hosted users
Doesn't impact Ente's production instances since this endpoint was disallowed on
the load balancer, but instead of requiring the same for folks who are self
hosting we modify the source to not expose /metrics on :8080 (they'll still be
available on :2112).

Refs:
- 2199a42d96/middleware.go (L345)
- https://github.com/ente-io/ente/discussions/2562
2024-07-29 11:22:34 +05:30
Ashil
a8c9c33aaa [mob][photos]App lock screen UI improvements (#2536) 2024-07-29 11:22:12 +05:30
Neeraj Gupta
198dab9f58 [server] Add db script to store data 2024-07-29 10:37:13 +05:30
Manav Rathi
184e6090fd [web] New translations (#2566)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-07-29 09:51:49 +05:30
Crowdin Bot
d1417f364a New Crowdin translations by GitHub Action 2024-07-29 01:16:41 +00:00
Crowdin Bot
d2a6440cba New Crowdin translations by GitHub Action 2024-07-29 01:04:16 +00:00
Crowdin Bot
f09a8c4c51 New Crowdin translations by GitHub Action 2024-07-29 00:31:41 +00:00
Manav Rathi
8d91b857fb [web] Exif - Migrate to a maintained library - Part 5/x (#2558)
Things are reaching a state where we can flip the switch.
2024-07-27 21:51:26 +05:30
Manav Rathi
d1a74da4a4 Rely on the lib's formatters 2024-07-27 21:35:43 +05:30
Manav Rathi
08833390bc Retain previous behaviour 2024-07-27 20:24:59 +05:30
Manav Rathi
e1923fdebd Prone to confusion between the object and the type 2024-07-27 20:13:06 +05:30
Manav Rathi
06be08a382 Fix accidental aliasing 2024-07-27 20:08:56 +05:30
Manav Rathi
99066b8fea Use 2024-07-27 20:02:06 +05:30
Manav Rathi
487fd62feb Rearrange 2024-07-27 20:00:34 +05:30
Manav Rathi
26c40ab2ec Test
Chrome, Safari, Firefox, Node.js (macOS)

    const parseMetadataDate = (s) => {
        const timestamp = new Date(s).getTime() * 1000;
        if (isNaN(timestamp)) return undefined;

        let offsetTime;
        let sWithoutOffset;

        const m = s.match(/Z|[+-]\d\d:?\d\d$/);
        if (m?.index) {
            sWithoutOffset = s.substring(0, m.index);
            offsetTime = s.substring(m.index);
        } else {
            sWithoutOffset = s;
        }

        const date = new Date(
            sWithoutOffset + (sWithoutOffset.length <= 10 ? "" : "Z"),
        );
        const dateTime = dropLast(date.toISOString());

        return { dateTime, offsetTime, timestamp };
    };

    const dropLast = (s) => (s ? s.substring(0, s.length - 1) : s);

    const test = () => {
        console.log(parseMetadataDate("2023"));
        console.log(parseMetadataDate("2023-08"));
        console.log(parseMetadataDate("2023-08-23"));
        console.log(parseMetadataDate("2023-08-23T18:03:00"));
        console.log(parseMetadataDate("2023-08-23T18:03:00+05:30"));
        console.log(parseMetadataDate("2023-08-23T18:03:00.000+05:30"));
        console.log(parseMetadataDate("2023-08-23T12:33:00.000Z"));
    };

    test();
2024-07-27 19:45:15 +05:30
Manav Rathi
4deb9c8f13 Impl wip 2024-07-27 19:22:41 +05:30
ashilkn
efab8918f2 [mob][photos] Many changes to subscription page 2024-07-27 17:47:13 +05:30
Manav Rathi
74c5b22927 Outline 2024-07-27 17:42:54 +05:30
Manav Rathi
8b30d52e94 New home 2024-07-27 16:03:29 +05:30
ashilkn
b5d577f090 [mob][photos] Tweak animation 2024-07-27 13:23:11 +05:30
ashilkn
6440b2176d [mob][photos] Update font size in subscription screen 2024-07-27 13:17:12 +05:30
ashilkn
d3d859f252 [mob][photos] Update asset 2024-07-27 12:56:16 +05:30
ashilkn
63fe67d677 [mob][photos] Add animation when to price when switching between monthly and yearly plans 2024-07-27 12:48:07 +05:30
Neeraj Gupta
23d4156a12 [server] Make linter happy and new entityType: person_v2 (#2545)
## Description

## Tests
2024-07-27 12:36:50 +05:30
ashilkn
41f59ec9ca [mob][photos] Move SubscriptionToggle widget to subscription_common_widgets.dart 2024-07-27 12:16:47 +05:30
ashilkn
bebaa76085 [mob][photos] Show which plan is popular and active in subscription screen 2024-07-27 12:09:43 +05:30
Manav Rathi
c28b6e3a62 Stay within JavaScript
https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums
2024-07-27 10:29:46 +05:30
Manav Rathi
19304daeab Auto rename didn't catch this 2024-07-27 10:24:12 +05:30
Manav Rathi
5c0942f2b7 Remove unused 2024-07-27 10:15:41 +05:30
Manav Rathi
1adab703b8 Rename FILE_TYPE 2024-07-27 10:14:19 +05:30
Manav Rathi
9613361151 Outline 2024-07-27 10:04:47 +05:30
Manav Rathi
77fcd04613 [web] Exif - Migrate to a maintained library - Part x/x (#2556) 2024-07-27 08:56:28 +05:30
Manav Rathi
47f22cf7e4 [desktop] Attempts to improve large drag drops on Windows (#2555)
Trying to diagnose a customer issue where they reported that the
renderer was crashing when trying to drag and drop a 1TB folder on
Windows. Fixing some things that popped out in the memory allocations or
the CPU time when testing with a synthetic workflow (on macOS) - these
may or may not fix their issue, but these are anyway improvements and
will only make things better.
2024-07-26 21:21:48 +05:30
Manav Rathi
90cd6502c1 [desktop] Attempts to improve large drag drops on Windows
Trying to diagnose a customer issue where they reported that the renderer was
crashing when trying to drag and drop a 1TB folder on Windows. Fixing some
things that popped out in the memory allocations or the CPU time when testing
with a synthetic workflow (on macOS) - these may or may not fix their issue, but
these are anyway improvements and will only make things better.
2024-07-26 21:18:17 +05:30
ashilkn
b2103e3893 [mob][photos] Update subscription page colors 2024-07-26 20:09:02 +05:30
ashilkn
6d5af2e6a5 [mob][photos] Update colors and text style 2024-07-26 19:43:25 +05:30
ashilkn
ef1429685b [mob][photos] Make subscription toggle work 2024-07-26 19:19:42 +05:30
ashilkn
fc93deb575 [mob][photos] Create new subscription toggle 2024-07-26 18:50:11 +05:30
Aman Raj Singh Mourya
8bbef91103 [mob][photos] Add preview to the album link 2024-07-26 18:02:17 +05:30
Manav Rathi
7f357d0f65 lint 2024-07-26 16:11:06 +05:30
ashilkn
87e3aa4d11 [mob][photos] Redesign header widget of subscription page 2024-07-26 16:09:35 +05:30
Manav Rathi
6c7f8e5fae Mention we're ignoring NaNs too 2024-07-26 15:25:17 +05:30
Manav Rathi
b637f2fe08 Handle exif subsecs 2024-07-26 15:15:32 +05:30
Manav Rathi
5995730659 Rearrange 2024-07-26 14:54:51 +05:30
Manav Rathi
689d3c4c82 New lib works in more cases than before 2024-07-26 14:46:52 +05:30
Manav Rathi
d9a8eafbe3 Tweak 2024-07-26 14:29:56 +05:30
Manav Rathi
e14e06dc1a Handle errors 2024-07-26 14:22:09 +05:30
Manav Rathi
ce4063c892 There is always some data (from the image itself e.g.) 2024-07-26 13:33:48 +05:30
ashilkn
f01b3b9def [mob][photos] Redesign app bar of subscription screen 2024-07-26 13:29:33 +05:30
Manav Rathi
8cde630e01 Tweaks 2024-07-26 13:09:39 +05:30
Manav Rathi
55a86cc85c Test 1 2024-07-26 13:04:20 +05:30
Manav Rathi
8bf88c2059 Full listing 2024-07-26 12:51:47 +05:30
ashilkn
af42c42141 [mob][photos] Make borders, bg color, stroke color and padding same as design on SubscriptionPlanWidget 2024-07-26 12:49:07 +05:30
Manav Rathi
0d01ed5c00 Full listing 2024-07-26 12:38:50 +05:30
ashilkn
3edc323272 [mob][photos] Redesign and change logic in SubscriptionPlanWidget to match new design 2024-07-26 12:20:39 +05:30
Manav Rathi
f6c8e13816 Update wip 2024-07-26 12:07:59 +05:30
Manav Rathi
beace4cbde Parse wip 2024-07-26 11:57:46 +05:30
Manav Rathi
bac49c7058 Ontology wip 2024-07-26 11:03:18 +05:30
Manav Rathi
76faf4c1d7 Use raw exif - wip 1 2024-07-26 09:42:57 +05:30
Manav Rathi
47ded8b302 Dates 2024-07-25 21:07:18 +05:30
Manav Rathi
1501e055a9 Rename 2024-07-25 20:56:25 +05:30
Manav Rathi
2cb9c915aa Narrow down scope: index => extract raw exif 2024-07-25 20:49:36 +05:30
Ashil
8072b2943a [mob][photos] Improve UX on "Create new account" screen (#2548)
## Description

Since the app doesn't let a user create an account with a weak password
and since isn't clear for the user how the app classifies a password as
"Weak", "Moderate" or "Strong", users would find it hard to come up with
a moderate or strong password. Also, the app wasn't surfacing the
strength every time.

All these UX issues have been fixed in this PR. 
 
Before: 


https://github.com/user-attachments/assets/c9630c44-4591-4bdd-a05d-8098ff5afef8

After:


https://github.com/user-attachments/assets/a9c1abfa-de1e-44c6-9f7e-157abe4f8de3


## Tests

Tested new account creation flow, did not find any regressions and can't
think of any that could have been introduced.
2024-07-25 19:51:57 +05:30
Manav Rathi
b4ea15f00b Tweak the debug logging 2024-07-25 19:02:32 +05:30
Manav Rathi
191f1fd097 creationTime will always be present 2024-07-25 15:51:46 +05:30
ashilkn
fb25888129 [mob][photos] Release resources in dispose() and increase tap area of password strength info 2024-07-25 15:08:24 +05:30
Vishnu Mohandas
f0d5c7d51f Add breakdown of AppStore's privacy disclosure (#2549) 2024-07-25 15:06:39 +05:30
vishnukvmd
d5b59765aa Add breakdown of AppStore's privacy disclosure 2024-07-25 15:05:51 +05:30
ashilkn
d847141eb7 [mob][photos] Extract string 2024-07-25 13:43:04 +05:30
ashilkn
5d417f3825 [mob][photos] Give info to user how password strength is calculated in 'Create new account' screen 2024-07-25 13:40:51 +05:30
ashilkn
422a36319e [mob][photos] Create reuseble infoDialog 2024-07-25 13:36:07 +05:30
Aman Raj Singh Mourya
10e19ffae2 [mob][auth] Minor UI changes 2024-07-25 13:22:06 +05:30
Aman Raj Singh Mourya
28b9d5512f [mob][auth] Add animation when toggling app lock 2024-07-25 13:19:19 +05:30
ashilkn
939363fd7a [mob][photos] Always show password strength when needed in create new account screen 2024-07-25 12:55:26 +05:30
Neeraj Gupta
584db778ee [server] Add person_v2 entity type 2024-07-25 11:51:29 +05:30
Neeraj Gupta
336aa7ac5f [server] Make linter happy 2024-07-25 11:47:06 +05:30
Neeraj Gupta
4bcec9d43b [server] Temporarily disable fetch from Wasabi (#2544)
## Description

## Tests
2024-07-25 11:41:18 +05:30
Ashil
e5239e588b [mob][photos] Reorder security section in settings for consistent UI (#2538) 2024-07-25 11:40:55 +05:30
Neeraj Gupta
553c153155 [server] Temporarily disable fetch from Wasabi 2024-07-25 11:39:19 +05:30
Manav Rathi
a4a4b7f941 debug logging 2024-07-25 09:51:50 +05:30
Manav Rathi
89a8a45935 [web] Exif - New library migration - Part 4/x (#2542) 2024-07-24 21:05:33 +05:30
Manav Rathi
adf68a82c5 Add some debugging code 2024-07-24 21:00:51 +05:30
Manav Rathi
0d313825d6 debug logging 2024-07-24 20:46:37 +05:30
Manav Rathi
218a5ce5f9 Tie together 2024-07-24 20:42:49 +05:30
Manav Rathi
719f056841 Interface 2024-07-24 20:28:03 +05:30
Manav Rathi
c835984e40 Single date 2024-07-24 20:08:08 +05:30
Manav Rathi
5a36e37e93 Fuse 2024-07-24 19:54:39 +05:30
Manav Rathi
16ec4db546 Use 2024-07-24 19:41:31 +05:30
Manav Rathi
ae0b701319 Parse IPTC dates 2024-07-24 19:29:04 +05:30
ashilkn
31043f5f4e [mob][photos] Reorder security section in settings for consistent UI 2024-07-24 18:59:12 +05:30
Manav Rathi
4e29f1e03a Return pairs 2024-07-24 18:44:52 +05:30
ashilkn
dafa155903 Revert "[mob][photos] Fix internal release workflow failing"
This reverts commit 5764734f14.
2024-07-24 18:37:26 +05:30
Ashil
f3a69b0d0b [mob][photos] Fix internal release workflow failing (#2537)
To fix
`Changes cannot be sent for review automatically. Please set the query
parameter changesNotSentForReview to true. Once committed, the changes
in this edit can be sent for review from the Google Play Console UI.`
2024-07-24 18:23:53 +05:30
ashilkn
5764734f14 [mob][photos] Fix internal release workflow failing 2024-07-24 18:18:36 +05:30
ashilkn
2be4c7e470 [mob][photos] Minor UI changes 2024-07-24 17:52:44 +05:30
ashilkn
87ed684ce9 [mob][photos] Add animation when toggling app lock 2024-07-24 17:46:48 +05:30
Aman Raj Singh Mourya
3fd7100dd7 [mob][auth] Used better names 2024-07-24 17:26:49 +05:30
ashilkn
1545f75217 [mob][photos] Bump up to v0.9.15 2024-07-24 17:26:01 +05:30
Ashil
816061774e [mob][photos] Show app content (#2522)
**Toggle Implementation:** Added a new feature in the app settings to
enable or disable the visibility of app content in app switcher mode.
2024-07-24 17:20:26 +05:30
ashilkn
4451d39ac9 [mob][photos] Revert change to remove bug 2024-07-24 17:15:28 +05:30
ashilkn
12fbc6c801 [mob][photos] Use better names 2024-07-24 17:11:51 +05:30
Aman Raj Singh Mourya
386a2f841e [mob][auth] Extracted strings 2024-07-24 16:35:47 +05:30
Aman Raj Singh Mourya
275e521c40 [mob][auth] Fixes 2024-07-24 16:12:31 +05:30
ashilkn
2f6530d6d6 [mob][photos] Add comment for context 2024-07-24 16:02:25 +05:30
ashilkn
40f0829f6b [mob][photos] Make code better readable 2024-07-24 16:00:18 +05:30
Manav Rathi
cb0be8a624 [web] Exif - New library migration - Part 3/x (#2534) 2024-07-24 15:36:38 +05:30
Manav Rathi
3da9361271 Make the linter happy 2024-07-24 15:32:18 +05:30
Neeraj Gupta
aab6bb47b1 [server] Add new type for derived data (#2533)
## Description

## Tests
Tested locally, both DB insertion & value for client.
2024-07-24 15:27:33 +05:30
Manav Rathi
65863d1b8f Match the current order 2024-07-24 15:26:30 +05:30
Manav Rathi
7b80c5bf77 Do it as per the XMP spec
This is the format I've seen in all the XMP files I've encountered so far too
(not relying on this evidence, just that it corroborates what the spec says).

The wording in the exiftool spec was confusing, I now think what it means is
that _exiftool_ will use that format, not XMP.
2024-07-24 15:18:40 +05:30
Neeraj Gupta
626bc71b25 [server] Use req header for client info 2024-07-24 15:02:28 +05:30
Manav Rathi
1bcf232d25 Split 2024-07-24 14:53:18 +05:30
Aman Raj Singh Mourya
b1907ff091 [mob][photos] Extracted strings 2024-07-24 14:46:15 +05:30
Aman Raj Singh Mourya
940c02bbbc [mob][photos] Merge branch 'main' into show_app_content 2024-07-24 14:31:55 +05:30
Manav Rathi
66ed561d07 ExifReader trims the exif: or tiff: prefix from the XMP tags
12360dd8f3/src/xmp-tags.js (L252)
2024-07-24 14:17:13 +05:30
Neeraj Gupta
66e1062cd3 [server] Add derived model type 2024-07-24 13:56:48 +05:30
Manav Rathi
bd8057ede3 Dimensions 2024-07-24 13:53:23 +05:30
Aman Raj Singh Mourya
9c5d958250 [mob][photos] Minor fixes 2024-07-24 13:35:01 +05:30
Manav Rathi
db52780cee Lat lng 2024-07-24 13:00:01 +05:30
Manav Rathi
0730ba72a6 Build up 2024-07-24 12:54:37 +05:30
Manav Rathi
2ff6a2f73c XMP 2024-07-24 12:27:32 +05:30
Manav Rathi
f5f0af2ed8 Rely on the JS parser 2024-07-24 12:08:47 +05:30
Prateek Sunal
4f14fafa34 fix(panorama): update panorama checking mechanism to reduce checks 2024-07-24 11:59:35 +05:30
Manav Rathi
65f2c92d41 Parse 2 2024-07-24 11:56:57 +05:30
Manav Rathi
b37fbab2dc Parse 1 2024-07-24 11:51:02 +05:30
Neeraj Gupta
7c7299aa09 CLI: Allow setting secrets path via env var (#2426)
## Description

Adds a new enviroment variable `ENTE_CLI_SECRETS_PATH`, that allows
specifying the path to a `secrets.txt` like the one used in the
dockerized version. If no path is provided, the old behaviour is
maintained.

The configuration variable and behaviour is analog to the already
present `ENTE_CONFIG_PATH` variable, which allows specifying a
configuration.

This provides a solution for people running without gnome-keyring
(https://github.com/ente-io/ente/issues/722 and
https://github.com/ente-io/ente/issues/1328)
2024-07-24 11:31:41 +05:30
Ashil
005d786535 [mob][photos] Fix appbar getting clipped on custom font and display size on pixel 7 (#2526) 2024-07-24 11:30:48 +05:30
Manav Rathi
f17600a7c8 Separate 2024-07-24 11:27:38 +05:30
Manav Rathi
18ac20fd80 Sketch 2024-07-24 11:26:05 +05:30
Manav Rathi
870697daf8 Outline 2024-07-24 11:09:20 +05:30
Manav Rathi
ea0cc47c9c Outline 2024-07-24 10:39:37 +05:30
Aman Raj Singh Mourya
869ecb832e [mob][auth] Minor fixes and used better names 2024-07-23 23:30:36 +05:30
Aman Raj Singh Mourya
1e5cbc8422 [mob][photos] Minor changes 2024-07-23 21:59:59 +05:30
Manav Rathi
feeda425a5 [desktop] Further clarify the comment (#2528)
Updates 79fcf18f62
2024-07-23 20:00:45 +05:30
Manav Rathi
7d8961fbc5 [desktop] Further clarify the comment
Updates 79fcf18f62
2024-07-23 19:55:36 +05:30
Manav Rathi
79fcf18f62 [desktop] Fix desktop app direct uploads when self-hosting (#2527)
It seems that Backblaze returns `null` as the ACAO response if the
scheme is not http(s), even if we have set allowedOrigins to "*". The
desktop app has a custom scheme, "ente://app", which is thus causing B2
to return null.

    # Works:
curl -v -X OPTIONS -H 'Origin: http://example.org' -H
'Access-Control-Request-Method: PUT'
'https://xxx.s3.eu-central-003.backblazeb2.com/yyy'

    # Fails:
curl -v -X OPTIONS -H 'Origin: ente://example.org' -H
'Access-Control-Request-Method: PUT'
'https://xxx.s3.eu-central-003.backblazeb2.com/yyy'

Ref:
https://github.com/ente-io/ente/discussions/2461#discussioncomment-10125881
2024-07-23 19:47:28 +05:30
Manav Rathi
7f28d2bfe9 [desktop] Fix desktop app direct uploads when self-hosting
It seems that Backblaze returns `null` as the ACAO response if the scheme is not
http(s), even if we have set allowedOrigins to "*". The desktop app has a custom
scheme, "ente://app", which is thus causing B2 to return null.

    # Works:
    curl -v -X OPTIONS -H 'Origin: http://example.org' -H 'Access-Control-Request-Method: PUT' 'https://xxx.s3.eu-central-003.backblazeb2.com/yyy'

    # Fails:
    curl -v -X OPTIONS -H 'Origin: ente://example.org' -H 'Access-Control-Request-Method: PUT' 'https://xxx.s3.eu-central-003.backblazeb2.com/yyy'

Ref: https://github.com/ente-io/ente/discussions/2461#discussioncomment-10125881
2024-07-23 19:44:34 +05:30
ashilkn
dbed9fb91c [mob][photos] Fix appbar getting clipped on custom font and display size on pixel 7 2024-07-23 18:45:12 +05:30
ashilkn
a73de2848e [mob][auth] Remove unused import 2024-07-23 17:19:04 +05:30
ashilkn
875b079850 [mob] Minor refactor 2024-07-23 17:17:04 +05:30
ashilkn
47203af4ff [mob][auth] Bump up pinput 2024-07-23 17:13:30 +05:30
ashilkn
8a35b71bb8 [mob][auth] Extract strings 2024-07-23 17:12:58 +05:30
Manav Rathi
3e02c748ce Delete the raw xmp 2024-07-23 16:20:53 +05:30
Manav Rathi
4b7fe45963 Prune embedded thumbnails and images
Ref:
- https://github.com/mattiasw/ExifReader/issues/108#issuecomment-752422822
2024-07-23 16:15:34 +05:30
Manav Rathi
af66c55444 Determine the flags 2024-07-23 15:58:51 +05:30
ashilkn
439a7771b0 Merge branch 'main' into lockscreen_option_auth 2024-07-23 15:55:35 +05:30
Manav Rathi
e4a288d6cf Move to separate file 2024-07-23 15:13:35 +05:30
Aman Raj Singh Mourya
39a693edac [mob][photos] Quick fixes 2024-07-23 15:04:19 +05:30
Aman Raj Singh Mourya
57ec8771fb [mob][photos] Show app content fixes 2024-07-23 14:05:57 +05:30
Ashil
088b4b9cff [mob][photos] Animate visibility toggling of appbar and bottom bar when toggling swipe lock (#2520) 2024-07-23 11:57:01 +05:30
ashilkn
6cb5c06ea8 [mob][photos] Animate visibility toggling of appbar and bottom bar when toggling swipe lock 2024-07-23 11:49:05 +05:30
Manav Rathi
cfb8c6a192 [docs] Mention mobile app for iCloud imports (#2519) 2024-07-23 10:52:53 +05:30
Manav Rathi
e7a399ff48 [docs] Mention mobile app for iCloud imports 2024-07-23 10:50:22 +05:30
Manav Rathi
7364b4f3ef [web] Exif improvements - Part 2/x (#2516)
Refs:
-
https://photo.stackexchange.com/questions/130570/can-i-assume-the-datetimeoriginal-of-an-image-without-an-offsettimeoriginal-is-a
2024-07-22 21:30:44 +05:30
Manav Rathi
339182b73f [web] Exif improvments
Refs:
- https://photo.stackexchange.com/questions/130570/can-i-assume-the-datetimeoriginal-of-an-image-without-an-offsettimeoriginal-is-a
2024-07-22 21:27:57 +05:30
Manav Rathi
6a9befd566 [web] Exif write-back improvements (#2515) 2024-07-22 21:04:32 +05:30
Manav Rathi
fc03d2196d Tell eslint that we want the ? 2024-07-22 21:01:36 +05:30
Manav Rathi
3ff3841565 zero pad 2024-07-22 20:48:40 +05:30
Aman Raj Singh Mourya
5c28780bc0 [mob][photos] Add Swipe Restriction and Authentication for Media Files (#2502)
This PR introduces a feature to lock individual media files (photos,
live photos, and videos) in the gallery.
This feature ensures that sensitive content remains protected,
especially when the device is handed to others.

Key aspects include:
- **Locking Mechanism:** Users can lock a media file, which hides all
other options and restricts access when the device is handed to others..
- **Authentication:** To view other files, users must authenticate via
the device's lock screen or a custom app PIN/pattern.
- **Swipe Restriction:** Swiping to navigate other files triggers an
authentication prompt to ensure secure access.
2024-07-22 19:50:00 +05:30
Manav Rathi
6e37a78d54 [docs] Document the Google Takeout Intel macOS video thumbnail scenario (#2514)
Ref:
- https://github.com/ente-io/ente/issues/2189#issuecomment-2184095189
- https://discord.com/channels/948937918347608085/1254116633237127198
2024-07-22 19:29:34 +05:30
Manav Rathi
d20e880bed Add doc note 2024-07-22 19:23:22 +05:30
Manav Rathi
2568e4cbb4 Document the case from user logs
[rndr] [error] Native thumbnail generation failed: Error: Error invoking remote method 'ffmpegExec': Error: Command failed: '/Applications/ente.app/Contents/Resources/app.asar.unpacked/node_modules/ffmpeg-static/ffmpeg' -i /var/folders/61/8lm3qh2s1vx9905_jkvgcsqh0000gn/T/ente/9P6wsR5mPA -ss '00:00:00' -vframes 1 -vf 'scale=-1:720' '/var/folders/61/8lm3qh2s1vx9
905_jkvgcsqh0000gn/T/ente/wvkVRFNgpy.jpeg'

    /bin/sh: /Applications/ente.app/Contents/Resources/app.asar.unpacked/node_modules/ffmpeg-static/ffmpeg: Bad CPU type in executable

    [rndr] [warn] Not using browser based thumbnail generation fallback for video at path takeout-xxx.zip,Takeout/yyy.mp4
2024-07-22 19:05:41 +05:30
ashilkn
4cfc38c4db [mob][photos] Resolve merge conflicts and merge main 2024-07-22 17:12:06 +05:30
ashilkn
27cd567225 [mob][photos] Remove unused translations 2024-07-22 16:49:34 +05:30
Neeraj Gupta
cdbf8c5f09 [server] Use regular go context in repo (#2512)
## Description

## Tests
2024-07-22 16:32:39 +05:30
Aman Raj Singh Mourya
e0beb414f9 [mob][auth] Removed app lock subtitle from the setting_section_widget 2024-07-22 16:32:34 +05:30
Neeraj Gupta
f35d2773aa [server]Use regular go context in repo 2024-07-22 16:29:20 +05:30
Aman Raj Singh Mourya
78306ccf1d [mob][auth] Implemented logic for show app content 2024-07-22 16:27:12 +05:30
ashilkn
310e20598e [mob][photos] Extract strings 2024-07-22 16:24:55 +05:30
Neeraj Gupta
c5731e8894 [server] Add API to return indexed files for given model (#2511)
## Description
Planning to consume this API on mobile to fetch already indexed files 

## Tests
Tested locally
2024-07-22 16:19:51 +05:30
Neeraj Gupta
40a4f783f7 [server] Add API to return indexed files for given model 2024-07-22 16:15:25 +05:30
Ashil
6afd47ce3c Autolock options implemented (#2420) 2024-07-22 15:42:37 +05:30
Aman Raj Singh Mourya
972b7b82dd [mob][photos] Quick fixes and fallback when no system lock found 2024-07-22 15:28:09 +05:30
Manav Rathi
19e7c2d65c Fix 2024-07-22 15:25:53 +05:30
Manav Rathi
cff6570ebb Move to a layer that should be dealing with the piexifjs internals 2024-07-22 15:23:37 +05:30
Manav Rathi
3b1fd78fbe Selective handling 2024-07-22 15:21:35 +05:30
Manav Rathi
ca8ae8c6e7 Fix the fallback 2024-07-22 15:16:58 +05:30
Manav Rathi
09036bb57f Move the catch up 2024-07-22 15:02:36 +05:30
Aman Raj Singh Mourya
e3e58eb9c2 [mob][auth] Show app content option added 2024-07-22 14:58:03 +05:30
Manav Rathi
9e81591c63 Rearrange 2024-07-22 14:52:16 +05:30
Manav Rathi
fda6f68688 The default type deduced by tsc from the JS works
This file was apparently never in use (its extension was not .d.ts).
2024-07-22 14:43:11 +05:30
Manav Rathi
bd2e8bb728 Rename 2024-07-22 14:42:44 +05:30
Manav Rathi
c918a796af Add types 2024-07-22 14:27:02 +05:30
ashilkn
85413e6269 [mob][photos] Resolve merge conflicts and merge main 2024-07-22 14:23:01 +05:30
ashilkn
87bd90870b [mob][photos] Extract strings 2024-07-22 14:18:28 +05:30
Manav Rathi
67d1d6c597 Move 2024-07-22 13:57:59 +05:30
Manav Rathi
d59e50ff93 Mention why 2024-07-22 13:52:54 +05:30
Manav Rathi
c92e08c8d4 Rewrite
to the same result
2024-07-22 13:43:53 +05:30
Manav Rathi
67df790d28 Shorten
We don't have a CSP yet (it is report only, and there we already allow data:)

Ref:
- https://stackoverflow.com/questions/12168909/blob-from-dataurl
2024-07-22 12:09:50 +05:30
Manav Rathi
34e13caa77 Doc 2024-07-22 11:55:16 +05:30
Manav Rathi
5a79658e58 Tweak 2024-07-22 11:39:59 +05:30
Manav Rathi
f97d5b19d9 Inline
I did try and search both in git history and on the internet if caching the
FileReader itself has any performance benefits, but I didn't find anything.
2024-07-22 11:37:44 +05:30
Neeraj Gupta
1972239bb0 [auth] New translations (#2508)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)
2024-07-22 10:23:58 +05:30
Neeraj Gupta
1da1aee845 [mobile] New translations (#2507)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-app)
2024-07-22 10:23:05 +05:30
Manav Rathi
d4accf09f9 [web] New translations (#2506)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-07-22 09:57:31 +05:30
Crowdin Bot
e1dac063f6 New Crowdin translations by GitHub Action 2024-07-22 01:16:50 +00:00
Crowdin Bot
3954464648 New Crowdin translations by GitHub Action 2024-07-22 01:04:08 +00:00
Crowdin Bot
068b5e6dd2 New Crowdin translations by GitHub Action 2024-07-22 00:32:01 +00:00
Aman Raj Singh Mourya
3fbe161576 [mob][photos] Fixes 2024-07-21 23:46:11 +05:30
Aman Raj Singh Mourya
1381cfc6e4 [mob][photos] Used privacy_screen instead of secure_app_switcher to hide app content 2024-07-21 23:44:55 +05:30
Manav Rathi
ab3bb113ea [web] Dialog related refactoring (#2503) 2024-07-20 21:25:07 +05:30
Manav Rathi
92fae72760 Move and merge 2024-07-20 21:13:26 +05:30
Manav Rathi
4834cfb3ff Inline 2024-07-20 21:03:22 +05:30
Manav Rathi
542de42875 Remove from context 2024-07-20 20:58:49 +05:30
Manav Rathi
b57c6ba556 Rem unused 2024-07-20 20:56:15 +05:30
Manav Rathi
046275a09c Inline 2024-07-20 20:55:48 +05:30
Manav Rathi
0a3ee6e7bb Remove unused 2024-07-20 20:54:55 +05:30
Manav Rathi
caf6728876 Inline 2024-07-20 20:53:26 +05:30
Manav Rathi
e23bce3537 Inline 2024-07-20 20:52:55 +05:30
Manav Rathi
2adb93fb1b Inline 2024-07-20 20:51:47 +05:30
Manav Rathi
c0b80315ec Remove unused prop 2024-07-20 20:47:46 +05:30
Manav Rathi
4f41a32647 More 2024-07-20 20:43:22 +05:30
Manav Rathi
eadff3b7b3 More 2024-07-20 20:34:12 +05:30
Manav Rathi
eb8fa6db84 Make the connection explicit 2024-07-20 20:27:47 +05:30
Manav Rathi
8202c9b4d3 Reuse pattern 2024-07-20 20:26:28 +05:30
Manav Rathi
1c0261bc5c Remove default props 2024-07-20 20:13:14 +05:30
Aman Raj Singh Mourya
254fb418ce [mob][photos] Auto lock default time set to 5 seconds 2024-07-20 20:03:56 +05:30
Manav Rathi
e55de904b4 Fix the width restriction when going fullscreen 2024-07-20 19:56:04 +05:30
Manav Rathi
296dc21e88 Systematize 2024-07-20 19:14:28 +05:30
ashilkn
73b57ffb34 Merge branch 'main' into autolock_options 2024-07-20 18:27:13 +05:30
Aman Raj Singh Mourya
e73bb0d374 [mob][photos] Used PopScope instead of WillPopScope 2024-07-20 17:54:43 +05:30
Aman Raj Singh Mourya
b8cb1332c6 [mob][photos] File lock implemented 2024-07-20 16:16:54 +05:30
Manav Rathi
1cf2b24049 [web] Prominently indicate the enabled state of the continuous export switch (#2501) 2024-07-20 14:35:55 +05:30
Manav Rathi
e7dbbbf74b Tweak 2024-07-20 14:17:26 +05:30
Manav Rathi
d7f96863b2 Remove duplicate 2024-07-20 14:07:19 +05:30
Manav Rathi
22d2f7a520 [web] Prominently indicate the enabled state of the switch
color="accent" was not doing anything, it appeared gray in both enabled and disabled states.
2024-07-20 14:04:52 +05:30
Manav Rathi
e72aa6e7e6 [web] Remove unnecessary eventemitter dependency (#2499) 2024-07-20 13:51:32 +05:30
Manav Rathi
9e83a4de81 [web] Remove unnecessary eventemitter dependency 2024-07-20 13:44:55 +05:30
Manav Rathi
f15851e6de Remove unused code path 2024-07-20 13:44:01 +05:30
Manav Rathi
b0b7ec5347 Direct 2024-07-20 13:41:08 +05:30
Manav Rathi
5a128f1e48 [web] New translations (#2498)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-07-20 13:02:57 +05:30
Crowdin Bot
77de820c45 New Crowdin translations by GitHub Action 2024-07-20 07:32:19 +00:00
Manav Rathi
16acbc6dfa [web] Translation improvements (#2497) 2024-07-20 12:28:13 +05:30
Manav Rathi
11f127781f Remove unnecessary space 2024-07-20 12:19:21 +05:30
Manav Rathi
8c32a25a6e Rename 2024-07-20 12:17:46 +05:30
Manav Rathi
9aec0903cf Rename 2024-07-20 12:15:36 +05:30
Manav Rathi
d2aeb3101c EXIF => Exif
The standard uses "Exif"
2024-07-20 12:12:22 +05:30
Manav Rathi
a4142ff800 Rename 2024-07-20 12:08:51 +05:30
Manav Rathi
122e3bb5f8 Move 2024-07-20 12:06:43 +05:30
Manav Rathi
a7d93861b6 Move 2024-07-20 12:03:12 +05:30
Manav Rathi
5a48aeb2ab Remove ref of non-existent formatter 2024-07-20 11:33:22 +05:30
Manav Rathi
40c489ebf0 Rename 2024-07-20 11:32:18 +05:30
Manav Rathi
f388d912f9 Rename 2024-07-20 11:31:08 +05:30
Manav Rathi
df2ae4f60b Move 2024-07-20 11:28:54 +05:30
Manav Rathi
cd67fdbb8b Rename 2024-07-20 11:25:24 +05:30
Manav Rathi
e427e7df13 Move 153m138\nwq 2024-07-20 11:24:27 +05:30
Manav Rathi
23d9e2db45 Rename 2024-07-20 11:17:11 +05:30
Manav Rathi
dd68a0d3de Rename 2024-07-20 11:15:35 +05:30
Manav Rathi
9166c5c80d New convention 2024-07-20 11:14:54 +05:30
Manav Rathi
ffda45faf7 Rename 2024-07-20 11:13:06 +05:30
Manav Rathi
8d9be5b7b7 Rename 2024-07-20 11:12:09 +05:30
Manav Rathi
37f676c0e9 Rename 2024-07-20 11:10:22 +05:30
Manav Rathi
ade3a41fa1 echo '68,70m162\nwq' | ed -s $f
Move chunks using
for f in packages/base/locales/**/translation.json; do echo '68,70m162\nwq' | ed -s $f; done
2024-07-20 11:08:16 +05:30
Manav Rathi
dab0e610db Rename 2024-07-20 10:16:49 +05:30
Manav Rathi
3060916d47 Fix 2024-07-20 10:11:08 +05:30
Manav Rathi
1cf51cb7b3 Use new formatter 2024-07-20 10:11:04 +05:30
Manav Rathi
68de8c9f48 Add a custom cached formatter 2024-07-19 20:59:21 +05:30
atyabbin
3cabafe128 Dashboard with some changes (#2494) 2024-07-19 17:27:23 +05:30
atyabbin
92d4329aac Solved lint issues 2024-07-19 16:51:25 +05:30
atyabbin
9c23020e05 Changed UserComponent.tsx 2024-07-19 16:39:04 +05:30
Manav Rathi
8600400179 [desktop] Extract Exif during indexing - Part 1/x (#2493) 2024-07-19 15:52:03 +05:30
Manav Rathi
bee3875e89 Add note 2024-07-19 15:43:23 +05:30
Manav Rathi
be06e5ae25 lf 2024-07-19 15:34:31 +05:30
Manav Rathi
e7c470a9ff Tentative 2024-07-19 15:22:52 +05:30
Manav Rathi
4bdb1c7922 Explore 2024-07-19 15:01:32 +05:30
Manav Rathi
9c04c9075e Tie it together 2024-07-19 13:38:15 +05:30
atyabbin
664f89aeec Changes in App.tsx 2024-07-19 13:14:54 +05:30
atyabbin
4c7f2c7c4e Reduced the space between input fields and the tabs section 2024-07-19 13:12:25 +05:30
atyabbin
c387b59c78 Dashboard with the new UI (#2486) 2024-07-19 12:41:31 +05:30
Manav Rathi
8c9195e783 Fix crop 2024-07-19 11:17:22 +05:30
Manav Rathi
1b59a5bf87 Rework lower 2024-07-19 11:11:05 +05:30
Manav Rathi
41851c97be wip scaffold 2024-07-19 10:46:07 +05:30
Manav Rathi
67e41f4bcd wip scaffold 2024-07-19 10:13:43 +05:30
Manav Rathi
941b02f750 (start) Switch to a more maintained library 2024-07-19 09:57:13 +05:30
Manav Rathi
0ace569e97 Start scaffolding 2024-07-19 09:44:27 +05:30
Manav Rathi
b07d82ebc2 Restore developability 2024-07-19 09:27:06 +05:30
Aman Raj Singh Mourya
5b3b3b577b [mob][photos] Hide content when app is in background using secure_app_switcher 2024-07-18 23:52:13 +05:30
atyabbin
371a1805f0 Updated some new components 2024-07-18 18:42:40 +05:30
atyabbin
0c6d27c134 Full dashboard 2024-07-18 17:58:42 +05:30
Aman Raj Singh Mourya
e5a5d9c08d [mob][photos] Auto lock time changed 2024-07-18 14:32:49 +05:30
atyabbin
bd3e0c9289 Deleted Sidbar.tsx 2024-07-16 17:47:11 +05:30
atyabbin
827ac9ddf7 Dashboard with imporved UI 2024-07-16 16:21:59 +05:30
Aman Raj Singh Mourya
5f08e44e58 [mob][auth] Auto lock fixes 2024-07-16 15:23:21 +05:30
Aman Raj Singh Mourya
ab9c097a32 [mob][photos] Removed App lock subtitle in Settings 2024-07-15 15:59:52 +05:30
Aman Raj Singh Mourya
82f3cd19be [mob][photos] Auto lock options fixes 2024-07-15 12:02:54 +05:30
Aman Raj Singh Mourya
147be37fdb [mob][auth] Removed dialog box on auto-logout 2024-07-14 22:58:17 +05:30
Aman Raj Singh Mourya
9292dc6d04 [mob][auth] Do not show CustomPinKeypad on Desktop 2024-07-13 14:45:45 +05:30
Aman Raj Singh Mourya
0ce9ceba12 [mob][auth] Used memLimitInteractive instead of memLimitSensitive to avoid delay 2024-07-12 16:48:33 +05:30
Aman Raj Singh Mourya
fb0d938cb5 [mob][auth] Implemented Pin/Password hashing using ente_crypto 2024-07-12 15:58:23 +05:30
Pablo Ovelleiro Corral
97b5577d68 CLI: Allow setting secrets path via env var
Adds a new enviroment variable `ENTE_CLI_SECRETS_PATH`, that allows
specifying the path to a `secrets.txt` like the one used in the
dockerized version. If no path is provided, the old behaviour is maintained.
2024-07-11 18:38:52 +02:00
Aman Raj Singh Mourya
fd2c22dc5f [mob][photos] Auto lock implemented and UI fixes 2024-07-11 14:32:57 +05:30
Aman Raj Singh Mourya
d06586eb1c [mob][auth] Auto lock duration added to the app_lock file 2024-07-10 13:21:52 +05:30
Aman Raj Singh Mourya
e39ba3c578 [mob][auth] Added Auto lock UI 2024-07-10 00:24:50 +05:30
Aman Raj Singh Mourya
5089721507 [mob][photos] Autolock time delay implemented 2024-07-09 23:46:34 +05:30
Aman Raj Singh Mourya
4af03ad2dd [mob][photos] Implemented Auto lock options 2024-07-09 15:10:39 +05:30
Aman Raj Singh Mourya
7a06cf2364 [mob][auth] Added logout option on lockscreen 2024-07-06 17:08:24 +05:30
Aman Raj Singh Mourya
45331de54e [mob][photos] Custom keypad position fixed 2024-07-06 16:58:26 +05:30
atyabbin
2e35b1eeb4 First view of the dashboard with new UI 2024-07-06 16:33:26 +05:30
Aman Raj Singh Mourya
9982c73d5a [mob][auth] Implemented Lock screen 2024-07-04 16:55:33 +05:30
atyabbin
65c72f6cf5 Showing usage data in GB in the fetch table 2024-06-27 15:59:39 +05:30
592 changed files with 26053 additions and 10107 deletions

View File

@@ -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

View File

@@ -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.
[![Discord](https://img.shields.io/discord/948937918347608085?style=for-the-badge&logo=Discord&logoColor=white&label=Discord)](https://discord.gg/z2YVKkycX3)
[![Ente's Blog RSS](https://img.shields.io/badge/blog-rss-F88900?style=for-the-badge&logo=rss&logoColor=white)](https://ente.io/blog/rss.xml)
[![Twitter](.github/assets/twitter.svg)](https://twitter.com/enteio) &nbsp; [![Mastodon](.github/assets/mastodon.svg)](https://mstdn.social/@ente)
[![Twitter](.github/assets/twitter.svg)](https://twitter.com/enteio) &nbsp; [![Mastodon](.github/assets/mastodon.svg)](https://fosstodon.org/@ente)
---

View File

@@ -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"

View File

@@ -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

View File

@@ -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"
}
]
}

View File

@@ -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

View 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

View 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

View 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

View 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

View 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

View File

@@ -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

View 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

View File

@@ -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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@@ -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

View File

@@ -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"

View File

@@ -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>

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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": "تعذر إعراب الملف المنتقى."
}

View File

@@ -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"
}

View 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": "Αδυναμία ανάλυσης του επιλεγμένου αρχείου."
}

View File

@@ -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."
}

View 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."
}
}

View File

@@ -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é."
}

View File

@@ -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": "אנא בדוק את חיבור האינטרנט שלך ונסה שוב."
}

View File

@@ -1 +1,4 @@
{}
{
"account": "खाता",
"unlock": "खोलें"
}

View File

@@ -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."
}

View File

@@ -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 파일 선택"
}

View File

@@ -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."
}

View File

@@ -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": "Pros 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": "Pros 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": "Pros 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": "Pros uwierzytelnić, aby zmienić weryfikację e-mail",
"authToViewYourRecoveryKey": "Pros uwierzytelnić, aby wyświetlić swój klucz odzyskiwania",
"authToChangeYourEmail": "Pros uwierzytelnić, aby zmienić swój adres e-mail",
"authToChangeYourPassword": "Pros uwierzytelnić, aby zmienić hasło",
"authToViewSecrets": "Pros uwierzytelnić, aby wyświetlić swoje sekrety",
"authToInitiateSignIn": "Pros 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": "Pros 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": "Pros 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": "Pros 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": "Pros 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": "Pros 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": "Pros 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ę, pros 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": "Pros 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": "Pros 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."
}

View File

@@ -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 coneo à 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."
}

View File

@@ -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",

View File

@@ -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": "Не удалось обработать выбранный файл."
}

View 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ť."
}

View File

@@ -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"
}

View File

@@ -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"
}

View 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": "Не вдалося обробити вибраний файл."
}

View File

@@ -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": "无法解析选定的文件。"
}

View File

@@ -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();
}

View File

@@ -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,

View File

@@ -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 {

View File

@@ -182,7 +182,6 @@ class _LoginPasswordVerificationPageState
await sendLogs(
context,
context.l10n.contactSupport,
"auth@ente.io",
postShare: () {},
);
}

View File

@@ -140,7 +140,6 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
await sendLogs(
context,
context.l10n.contactSupport,
"support@ente.io",
postShare: () {},
);
}

View File

@@ -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,

View File

@@ -22,7 +22,6 @@ PopupMenuButton<dynamic> reportBugPopupMenu(BuildContext context) {
await sendLogs(
context,
"Contact support",
"support@ente.io",
postShare: () {},
);
}

View File

@@ -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

View File

@@ -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()}",
);
}
}

View File

@@ -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()}",
);
}
}

View File

@@ -150,7 +150,7 @@ Future<void> _pickEnteJsonFile(BuildContext context) async {
await showErrorDialog(
context,
context.l10n.sorry,
context.l10n.importFailureDesc,
context.l10n.importFailureDescNew,
);
}
}

View File

@@ -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()}",
);
}
}

View File

@@ -144,7 +144,7 @@ Future<void> _pickImportFile(BuildContext context) async {
await showErrorDialog(
context,
context.l10n.sorry,
context.l10n.importFailureDesc,
context.l10n.importFailureDescNew,
);
}
}

View File

@@ -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()}",
);
}
}

View File

@@ -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()}",
);
}
}

View 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,
),
],
),
),
),
),
),
);
}
}

View 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;
}
}
}

View File

@@ -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)),
],
),
),
),
);
}
}

View 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();
},
),
],
),
);
}
}

View 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,
),
),
],
),
);
}
}

View 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();
}
}
}

View 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);
},
),
],
),
);
}
}

View File

@@ -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,
]);

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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");
}

View File

@@ -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,
),

View File

@@ -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),

View File

@@ -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 {

View File

@@ -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: () {},
);
},

View File

@@ -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 {

View 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);
}
}

View File

@@ -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

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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")
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

Some files were not shown because too many files have changed in this diff Show More