Compare commits
223 Commits
photos-v0.
...
auth-v4.0.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
10b4abf9cd | ||
|
|
b72f047526 | ||
|
|
802aabdda5 | ||
|
|
bb0f7915f0 | ||
|
|
ca5ac8da6b | ||
|
|
978f82c809 | ||
|
|
bc84ea7529 | ||
|
|
019b9c3ebd | ||
|
|
f1d1bf9e02 | ||
|
|
8b64c6d2bc | ||
|
|
8ece709661 | ||
|
|
ac9648e885 | ||
|
|
ac9e907961 | ||
|
|
3bfe471110 | ||
|
|
bd9cb1ac86 | ||
|
|
5746ad1942 | ||
|
|
50f924e3c5 | ||
|
|
851ca1afe2 | ||
|
|
d7fd432f6e | ||
|
|
3be7abf381 | ||
|
|
41fce9b57c | ||
|
|
d8f98b4daa | ||
|
|
51be8e0622 | ||
|
|
f0ea95e141 | ||
|
|
a0f0333f5f | ||
|
|
fb2fd7d986 | ||
|
|
d9dddec33c | ||
|
|
fe79e4a5eb | ||
|
|
d781d2c2fc | ||
|
|
d79cbf5e5f | ||
|
|
9be5d1461d | ||
|
|
28529560f0 | ||
|
|
ca08b3eb5f | ||
|
|
dfab58ce33 | ||
|
|
d69d223bce | ||
|
|
02f42a0bb7 | ||
|
|
d502a10103 | ||
|
|
127172938b | ||
|
|
dae65736a8 | ||
|
|
c0e9642d97 | ||
|
|
aedbbeb321 | ||
|
|
c88fb258be | ||
|
|
17948e8364 | ||
|
|
1c3f560cb0 | ||
|
|
3a95823256 | ||
|
|
2e5c678690 | ||
|
|
1a3ca7c0fe | ||
|
|
cb404637cf | ||
|
|
617090a8c5 | ||
|
|
bfdda59b39 | ||
|
|
c37e5afed1 | ||
|
|
373d25e2d6 | ||
|
|
157cefd657 | ||
|
|
63b3732f82 | ||
|
|
1c306bf7b5 | ||
|
|
a13f3020ca | ||
|
|
3eb9b6bd77 | ||
|
|
3d994a5f07 | ||
|
|
fbc68f1143 | ||
|
|
7227a4b084 | ||
|
|
62f1713a1a | ||
|
|
c56a96454a | ||
|
|
72842e8c36 | ||
|
|
bb13d1d98f | ||
|
|
ec115b3f8b | ||
|
|
8e79884e31 | ||
|
|
70051b66b7 | ||
|
|
46134b3b9a | ||
|
|
b1c30417ba | ||
|
|
344c3d72ec | ||
|
|
b26e3b31d8 | ||
|
|
2cc9801fbc | ||
|
|
2ee2377490 | ||
|
|
dd65f4f156 | ||
|
|
d5216886d8 | ||
|
|
02e059989e | ||
|
|
61763ed16f | ||
|
|
51e8c2797d | ||
|
|
4a1db1edcc | ||
|
|
9a7a338339 | ||
|
|
4fd3fb09c9 | ||
|
|
11bbb70c3f | ||
|
|
5605c5b794 | ||
|
|
14c5ea5b86 | ||
|
|
6fc1f8c2d0 | ||
|
|
0dfa8ceee1 | ||
|
|
29ae5bfb09 | ||
|
|
b970f047e4 | ||
|
|
752f50efd2 | ||
|
|
7737d162ce | ||
|
|
c10317ae2a | ||
|
|
b3f210702d | ||
|
|
8b6ae56202 | ||
|
|
b51bacb3f8 | ||
|
|
5c6b0b8679 | ||
|
|
2c417cd711 | ||
|
|
64065b9a2f | ||
|
|
211d2ac4a9 | ||
|
|
fca8e13c03 | ||
|
|
535963b229 | ||
|
|
b4470e1e62 | ||
|
|
b00009aaab | ||
|
|
b1f603d463 | ||
|
|
79b311af8d | ||
|
|
68c28df945 | ||
|
|
924707fa56 | ||
|
|
a218d09960 | ||
|
|
c012055835 | ||
|
|
5e5d362341 | ||
|
|
fe473bcd0a | ||
|
|
855d0d43b6 | ||
|
|
fdc641be88 | ||
|
|
fb4712dced | ||
|
|
83990e1160 | ||
|
|
44d8f8b96f | ||
|
|
f76e64157b | ||
|
|
bd01340315 | ||
|
|
c50067bf7d | ||
|
|
48840a3df4 | ||
|
|
1942239989 | ||
|
|
7ff420a82e | ||
|
|
8be54b3f31 | ||
|
|
db95c07e73 | ||
|
|
507c79c2a1 | ||
|
|
8f39473720 | ||
|
|
c4e9e6014b | ||
|
|
248c24b522 | ||
|
|
3c7db36f62 | ||
|
|
5a4c08fa5d | ||
|
|
1cf4e920f2 | ||
|
|
a26838db00 | ||
|
|
17608df71e | ||
|
|
e19100cbac | ||
|
|
0322b125a1 | ||
|
|
702561e215 | ||
|
|
351026377f | ||
|
|
0a8cfb108a | ||
|
|
ffbe03c283 | ||
|
|
8fefddde7a | ||
|
|
aac4c261db | ||
|
|
baeb09a800 | ||
|
|
ed69d7874e | ||
|
|
ef66e94cb1 | ||
|
|
7d1a674f22 | ||
|
|
536936f97b | ||
|
|
395d8a8ab8 | ||
|
|
a0b80a40f4 | ||
|
|
5c93b5a1af | ||
|
|
9d8cec7c4c | ||
|
|
f61174a5c7 | ||
|
|
8ddd9f07cc | ||
|
|
0ae498d9c1 | ||
|
|
0957ab7f66 | ||
|
|
a7443710ac | ||
|
|
1d8f4b2ebc | ||
|
|
cd2d7be69a | ||
|
|
491b628577 | ||
|
|
bd5e53b83d | ||
|
|
27bdc5d229 | ||
|
|
d40f4a78c6 | ||
|
|
6ccc85d318 | ||
|
|
51ba9270e7 | ||
|
|
8db71fe45e | ||
|
|
0a095d71f8 | ||
|
|
f3ea391aa9 | ||
|
|
a273bbb577 | ||
|
|
6c4ef2e674 | ||
|
|
237b7c4116 | ||
|
|
379d549300 | ||
|
|
aecd7dc9f9 | ||
|
|
8ccfe3c609 | ||
|
|
91c8406e27 | ||
|
|
d0341ba50c | ||
|
|
d93d4a3601 | ||
|
|
10f4fd1118 | ||
|
|
ac86b3097c | ||
|
|
063a8dd792 | ||
|
|
ea5fa5b252 | ||
|
|
94298cc1b5 | ||
|
|
f2e3b0e0bf | ||
|
|
f9cf9733a0 | ||
|
|
8a5a923c93 | ||
|
|
3483ea0d1b | ||
|
|
b6baffa97e | ||
|
|
1dfd295f40 | ||
|
|
49b5c2ca14 | ||
|
|
dccd98dd0c | ||
|
|
0002e871c2 | ||
|
|
d8356ae0c0 | ||
|
|
3178a7a61d | ||
|
|
2f2fc43fa6 | ||
|
|
093d7fd333 | ||
|
|
0bc96f58fd | ||
|
|
3f7a42ba49 | ||
|
|
9bc3926372 | ||
|
|
2d17aa5550 | ||
|
|
7dcfc8ee47 | ||
|
|
ae77a38846 | ||
|
|
d7946fbfc5 | ||
|
|
594843f48b | ||
|
|
4c5942016f | ||
|
|
39765dd802 | ||
|
|
bd9bcf607c | ||
|
|
30e26a815f | ||
|
|
d873921422 | ||
|
|
2d7e58d743 | ||
|
|
fa3a9f4f52 | ||
|
|
0dcc840179 | ||
|
|
58384004b4 | ||
|
|
3361c1f149 | ||
|
|
c7a4cbc365 | ||
|
|
de9c294977 | ||
|
|
528f503444 | ||
|
|
fa9d171287 | ||
|
|
43ba2ee2da | ||
|
|
3292655ff7 | ||
|
|
484b05bdb2 | ||
|
|
cdbcc93571 | ||
|
|
00415cb6fe | ||
|
|
6af1604026 | ||
|
|
2e01a96477 | ||
|
|
fa8a8dd639 | ||
|
|
4a03388cf1 |
112
.github/workflows/auth-release.yml
vendored
112
.github/workflows/auth-release.yml
vendored
@@ -96,7 +96,8 @@ jobs:
|
||||
- name: Build desktop app
|
||||
run: |
|
||||
flutter config --enable-linux-desktop
|
||||
dart pub global activate flutter_distributor
|
||||
# dart pub global activate flutter_distributor
|
||||
dart pub global activate --source git https://github.com/prateekmedia/flutter_distributor --git-ref develop --git-path packages/flutter_distributor
|
||||
flutter_distributor package --platform=linux --targets=deb --skip-clean
|
||||
mv dist/**/*-*-linux.deb artifacts/ente-${{ github.ref_name }}-x86_64.deb
|
||||
env:
|
||||
@@ -104,7 +105,7 @@ jobs:
|
||||
|
||||
- name: Generate checksums and push to artifacts
|
||||
run: |
|
||||
sha256sum artifacts/ente-* > artifacts/sha256sum-apk-deb
|
||||
sha256sum artifacts/ente-* > artifacts/sha256sum-apk-deb
|
||||
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
@@ -125,65 +126,65 @@ jobs:
|
||||
track: internal
|
||||
|
||||
build-fedora-etc:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: "stable"
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: "stable"
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Create artifacts directory
|
||||
run: mkdir artifacts
|
||||
- name: Create artifacts directory
|
||||
run: mkdir artifacts
|
||||
|
||||
- name: Install dependencies for desktop build
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y libsecret-1-dev libsodium-dev libwebkit2gtk-4.0-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm patchelf libsqlite3-dev locate libayatana-appindicator3-dev libffi-dev libtiff5 xz-utils libarchive-tools
|
||||
sudo updatedb --localpaths='/usr/lib/x86_64-linux-gnu'
|
||||
- name: Install dependencies for desktop build
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y libsecret-1-dev libsodium-dev libwebkit2gtk-4.0-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm patchelf libsqlite3-dev locate libayatana-appindicator3-dev libffi-dev libtiff5 xz-utils libarchive-tools
|
||||
sudo updatedb --localpaths='/usr/lib/x86_64-linux-gnu'
|
||||
|
||||
- name: Install appimagetool
|
||||
run: |
|
||||
wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
chmod +x appimagetool
|
||||
mv appimagetool /usr/local/bin/
|
||||
- name: Install appimagetool
|
||||
run: |
|
||||
wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
chmod +x appimagetool
|
||||
mv appimagetool /usr/local/bin/
|
||||
|
||||
- name: Build desktop app
|
||||
run: |
|
||||
flutter config --enable-linux-desktop
|
||||
# dart pub global activate flutter_distributor
|
||||
dart pub global activate --source git https://github.com/prateekmedia/flutter_distributor --git-ref pacman --git-path packages/flutter_distributor
|
||||
# Run below command if it is a beta or nightly
|
||||
if [[ ${{ github.ref }} =~ beta|nightly ]]; then
|
||||
flutter_distributor package --platform=linux --targets=pacman --skip-clean
|
||||
mv dist/**/*-*-linux.pacman artifacts/ente-${{ github.ref_name }}-x86_64.pacman
|
||||
fi
|
||||
flutter_distributor package --platform=linux --targets=rpm --skip-clean
|
||||
mv dist/**/*-*-linux.rpm artifacts/ente-${{ github.ref_name }}-x86_64.rpm
|
||||
flutter_distributor package --platform=linux --targets=appimage --skip-clean
|
||||
mv dist/**/*-*-linux.AppImage artifacts/ente-${{ github.ref_name }}-x86_64.AppImage
|
||||
- name: Build desktop app
|
||||
run: |
|
||||
flutter config --enable-linux-desktop
|
||||
# dart pub global activate flutter_distributor
|
||||
dart pub global activate --source git https://github.com/prateekmedia/flutter_distributor --git-ref develop --git-path packages/flutter_distributor
|
||||
# Run below command if it is a beta or nightly
|
||||
if [[ ${{ github.ref }} =~ beta|nightly ]]; then
|
||||
flutter_distributor package --platform=linux --targets=pacman --skip-clean
|
||||
mv dist/**/*-*-linux.pacman artifacts/ente-${{ github.ref_name }}-x86_64.pacman
|
||||
fi
|
||||
flutter_distributor package --platform=linux --targets=rpm --skip-clean
|
||||
mv dist/**/*-*-linux.rpm artifacts/ente-${{ github.ref_name }}-x86_64.rpm
|
||||
flutter_distributor package --platform=linux --targets=appimage --skip-clean
|
||||
mv dist/**/*-*-linux.AppImage artifacts/ente-${{ github.ref_name }}-x86_64.AppImage
|
||||
|
||||
- name: Generate checksums
|
||||
run: sha256sum artifacts/ente-* >> artifacts/sha256sum-rpm-appimage
|
||||
- name: Generate checksums
|
||||
run: sha256sum artifacts/ente-* >> artifacts/sha256sum-rpm-appimage
|
||||
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "auth/artifacts/*"
|
||||
draft: true
|
||||
allowUpdates: true
|
||||
updateOnlyUnreleased: true
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "auth/artifacts/*"
|
||||
draft: true
|
||||
allowUpdates: true
|
||||
updateOnlyUnreleased: true
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
@@ -211,10 +212,11 @@ jobs:
|
||||
- name: Build Windows installer
|
||||
run: |
|
||||
flutter config --enable-windows-desktop
|
||||
dart pub global activate flutter_distributor
|
||||
# dart pub global activate flutter_distributor
|
||||
dart pub global activate --source git https://github.com/prateekmedia/flutter_distributor --git-ref develop --git-path packages/flutter_distributor
|
||||
make innoinstall
|
||||
flutter_distributor package --platform=windows --targets=exe --skip-clean
|
||||
mv dist/**/ente_auth-*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||
mv dist/**/*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||
|
||||
- name: Retain Windows EXE and DLLs
|
||||
run: cp -r build/windows/x64/runner/Release ente-${{ github.ref_name }}-windows
|
||||
@@ -307,7 +309,7 @@ jobs:
|
||||
flutter config --enable-macos-desktop
|
||||
dart pub global activate flutter_distributor
|
||||
flutter_distributor package --platform=macos --targets=dmg --skip-clean
|
||||
mv dist/**/ente_auth-*-macos.dmg artifacts/ente-${{ github.ref_name }}.dmg
|
||||
mv dist/**/*-macos.dmg artifacts/ente-${{ github.ref_name }}.dmg
|
||||
|
||||
- name: Code sign DMG
|
||||
run: |
|
||||
|
||||
@@ -695,6 +695,9 @@
|
||||
{
|
||||
"title": "Vikunja"
|
||||
},
|
||||
{
|
||||
"title": "WARGAMING.NET"
|
||||
},
|
||||
{
|
||||
"title": "Wealthfront"
|
||||
},
|
||||
|
||||
5
auth/assets/custom-icons/icons/wargaming.svg
Normal file
5
auth/assets/custom-icons/icons/wargaming.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96">
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path fill="white" fill-rule="evenodd" d="M47.77,1A47,47,0,1,1,1,48.23V48A46.87,46.87,0,0,1,47.71,1Zm0,9a38.12,38.12,0,0,1,19.13,71A82.23,82.23,0,0,0,69.84,54.5c2.44.69,3.82,1.08,6.27,1.87A128.54,128.54,0,0,0,66.2,36.09,81.28,81.28,0,0,1,53.06,54.25l7.84-.49c-6.75,12.12-16.27,18-28.33,19.71-2.75-13.71-.69-36,14.7-46.48l1.56,7.48c3-4.83,8.93-11.22,13.34-15.67a41.77,41.77,0,0,0-22.83-2.15c1.27,1.09,2.84,2.47,4.11,3.55C26.1,27.57,16.57,39.68,10.3,53.76A38.3,38.3,0,0,1,47.77,9.94Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 634 B |
@@ -50,10 +50,10 @@ PODS:
|
||||
- flutter_inappwebview_ios (0.0.1):
|
||||
- Flutter
|
||||
- flutter_inappwebview_ios/Core (= 0.0.1)
|
||||
- OrderedSet (~> 5.0)
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_inappwebview_ios/Core (0.0.1):
|
||||
- Flutter
|
||||
- OrderedSet (~> 5.0)
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_local_authentication (1.2.0):
|
||||
- Flutter
|
||||
- flutter_local_notifications (0.0.1):
|
||||
@@ -71,7 +71,7 @@ PODS:
|
||||
- move_to_background (0.0.1):
|
||||
- Flutter
|
||||
- MTBBarcodeScanner (5.0.11)
|
||||
- OrderedSet (5.0.0)
|
||||
- OrderedSet (6.0.3)
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_foundation (0.0.1):
|
||||
@@ -85,11 +85,11 @@ PODS:
|
||||
- SDWebImage (5.19.7):
|
||||
- SDWebImage/Core (= 5.19.7)
|
||||
- SDWebImage/Core (5.19.7)
|
||||
- Sentry/HybridSDK (8.33.0)
|
||||
- sentry_flutter (8.7.0):
|
||||
- Sentry/HybridSDK (8.36.0)
|
||||
- sentry_flutter (8.9.0):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- Sentry/HybridSDK (= 8.33.0)
|
||||
- Sentry/HybridSDK (= 8.36.0)
|
||||
- share_plus (0.0.1):
|
||||
- Flutter
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
@@ -231,7 +231,7 @@ SPEC CHECKSUMS:
|
||||
fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_email_sender: 10a22605f92809a11ef52b2f412db806c6082d40
|
||||
flutter_inappwebview_ios: 97215cf7d4677db55df76782dbd2930c5e1c1ea0
|
||||
flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
|
||||
flutter_local_authentication: 1172a4dd88f6306dadce067454e2c4caf07977bb
|
||||
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
|
||||
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
|
||||
@@ -240,14 +240,14 @@ SPEC CHECKSUMS:
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
|
||||
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
|
||||
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
|
||||
qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
|
||||
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
|
||||
Sentry: 8560050221424aef0bebc8e31eedf00af80f90a6
|
||||
sentry_flutter: e26b861f744e5037a3faf9bf56603ec65d658a61
|
||||
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
|
||||
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe
|
||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sodium_libs: 1faae17af662384acbd13e41867a0008cd2e2318
|
||||
|
||||
@@ -13,11 +13,11 @@ 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/directory_utils.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';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
||||
import 'package:tuple/tuple.dart';
|
||||
@@ -56,7 +56,6 @@ class Configuration {
|
||||
static final _logger = Logger("Configuration");
|
||||
|
||||
String? _cachedToken;
|
||||
late String _documentsDirectory;
|
||||
late SharedPreferences _preferences;
|
||||
String? _key;
|
||||
String? _secretKey;
|
||||
@@ -75,8 +74,7 @@ class Configuration {
|
||||
_preferences = await SharedPreferences.getInstance();
|
||||
sqfliteFfiInit();
|
||||
_secureStorage = const FlutterSecureStorage();
|
||||
_documentsDirectory = (await getApplicationDocumentsDirectory()).path;
|
||||
_tempDirectory = "$_documentsDirectory/temp/";
|
||||
_tempDirectory = (await DirectoryUtils.getDirectoryForInit()).path;
|
||||
final tempDirectory = io.Directory(_tempDirectory);
|
||||
try {
|
||||
final currentTime = DateTime.now().microsecondsSinceEpoch;
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
library super_logging;
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
import 'dart:core';
|
||||
|
||||
@@ -137,16 +137,6 @@
|
||||
"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": "مغادرة خطة العائلة",
|
||||
"leaveFamilyMessage": "هل أنت متأكد من الخروج من خطة العائلة؟",
|
||||
|
||||
@@ -141,16 +141,6 @@
|
||||
"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": "Напуснете семейството",
|
||||
"leaveFamilyMessage": "Сигурни ли сте, че искате да напуснете семейния план?",
|
||||
@@ -492,5 +482,6 @@
|
||||
"setNewPin": "Задаване на нов ПИН код",
|
||||
"importFailureDescNew": "Неуспешно обработване на избрания файл.",
|
||||
"appLockNotEnabled": "Заключването на приложението не е активирано",
|
||||
"appLockNotEnabledDescription": "Моля, активирайте заключването на приложението от Сигурност > Заключване на приложението"
|
||||
"appLockNotEnabledDescription": "Моля, активирайте заключването на приложението от Сигурност > Заключване на приложението",
|
||||
"authToViewPasskey": "Моля, удостоверете се, за да видите Вашите ключове за парола"
|
||||
}
|
||||
487
auth/lib/l10n/arb/app_da.arb
Normal file
487
auth/lib/l10n/arb/app_da.arb
Normal file
@@ -0,0 +1,487 @@
|
||||
{
|
||||
"account": "Konto",
|
||||
"unlock": "Lås op",
|
||||
"recoveryKey": "Gendannelsesnøgle",
|
||||
"counterAppBarTitle": "Tæller",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "Sikkerhedskopier dine 2FA koder",
|
||||
"onBoardingGetStarted": "Kom i gang",
|
||||
"setupFirstAccount": "Opret din første konto",
|
||||
"importScanQrCode": "Skan en QR kode",
|
||||
"qrCode": "QR kode",
|
||||
"importEnterSetupKey": "Indtast en oprettelsesnøgle",
|
||||
"importAccountPageTitle": "Indtast kontooplysninger",
|
||||
"secretCanNotBeEmpty": "Hemmelighed kan ikke være tom",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Både udsteder og konto kan ikke være tomme",
|
||||
"incorrectDetails": "Forkerte oplysninger",
|
||||
"pleaseVerifyDetails": "Bekræft venligst oplysningerne og forsøg igen",
|
||||
"codeIssuerHint": "Udsteder",
|
||||
"codeSecretKeyHint": "Hemmelig nøgle",
|
||||
"secret": "Hemmelighed",
|
||||
"all": "Alt",
|
||||
"notes": "Noter",
|
||||
"notesLengthLimit": "Noter kan højest være {count} tegn",
|
||||
"@notesLengthLimit": {
|
||||
"description": "Text to indicate the maximum number of characters allowed for notes",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The maximum number of characters allowed for notes",
|
||||
"type": "int",
|
||||
"example": "100"
|
||||
}
|
||||
}
|
||||
},
|
||||
"codeAccountHint": "Konto (you@domain.com)",
|
||||
"codeTagHint": "Tag",
|
||||
"accountKeyType": "Nøgletype",
|
||||
"sessionExpired": "Session udløbet",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Log venligst på igen",
|
||||
"loggingOut": "Logger ud...",
|
||||
"timeBasedKeyType": "Tids-baseret (TOTP)",
|
||||
"counterBasedKeyType": "Tæller-baseret (HOTP)",
|
||||
"saveAction": "Gem",
|
||||
"nextTotpTitle": "næste",
|
||||
"deleteCodeTitle": "Slet kode?",
|
||||
"deleteCodeMessage": "Er du sikker på at du vil slette denne kode? Handlingen er irreversibel.",
|
||||
"trashCode": "Slet kode?",
|
||||
"trashCodeMessage": "Er du sikker på at du vil slette koden til {account}?",
|
||||
"trash": "Slet",
|
||||
"viewLogsAction": "Se logs",
|
||||
"sendLogsDescription": "Dette vil sende os dine logs for at hjælpe os med at løse dit problem. Selvom vi tager forholdsregler for at sikre at følsomme oplysninger ikke bliver logget anbefaler vi at du tjekker dine logs før du sender dem.",
|
||||
"preparingLogsTitle": "Forbereder logs...",
|
||||
"emailLogsTitle": "Send logs i email",
|
||||
"emailLogsMessage": "Send venligst logs til {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "Kopier email adresse",
|
||||
"exportLogsAction": "Eksporter logs",
|
||||
"reportABug": "Rapporter en fejl",
|
||||
"crashAndErrorReporting": "Nedbruds- og fejlrapportering",
|
||||
"reportBug": "Rapporter fejl",
|
||||
"emailUsMessage": "Send os venligst en email på {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "Kontakt support",
|
||||
"rateUsOnStore": "Anmeld os på {storeName}",
|
||||
"blog": "Blog",
|
||||
"merchandise": "Merchandise",
|
||||
"verifyPassword": "Bekræft adgangskode",
|
||||
"pleaseWait": "Vent venligst...",
|
||||
"generatingEncryptionKeysTitle": "Genererer krypteringsnøgler...",
|
||||
"recreatePassword": "Gendan adgangskode",
|
||||
"recreatePasswordMessage": "Den nuværende enhed er ikke kraftfuld nok til at bekræfte din adgangskode, så vi bliver nødt til at gendanne den på en måde der fungerer på alle enheder.\n\nLog venligst ind med din gendannelsesnøgle og gendan din adgangskode (du kan bruge den samme adgangskode igen hvis du ønsker).",
|
||||
"useRecoveryKey": "Brug gendannelsesnøgle",
|
||||
"incorrectPasswordTitle": "Forkert adgangskode",
|
||||
"welcomeBack": "Velkommen tilbage!",
|
||||
"madeWithLoveAtPrefix": "lavet med ❤️ hos ",
|
||||
"supportDevs": "Abonnér på <bold-green>ente</bold-green> for at støtte os",
|
||||
"supportDiscount": "Brug rabatkoden \"AUTH\" og få 10% rabat på det første år",
|
||||
"changeEmail": "Skift email adresse",
|
||||
"changePassword": "Skift adgangskode",
|
||||
"data": "Data",
|
||||
"importCodes": "Importer koder",
|
||||
"importTypePlainText": "Almindelig tekst",
|
||||
"importTypeEnteEncrypted": "Krypteret Ente eksport",
|
||||
"passwordForDecryptingExport": "Kodeord til dekryptering af eksport",
|
||||
"passwordEmptyError": "Kodeordet kan ikke være tomt",
|
||||
"importFromApp": "Importer koder fra {appName}",
|
||||
"importGoogleAuthGuide": "Eksporter dine konti fra Google Authenticator til en QR kode fra \"Transfer Accounts\".\n\nTip: Du kan bruge webkameraet på din bærbare computer til at tage et billede af QR koden.",
|
||||
"importSelectJsonFile": "Vælg JSON fil",
|
||||
"importSelectAppExport": "Vælg {appName} eksportfil",
|
||||
"importEnteEncGuide": "Vælg den krypterede JSON fil eksporteret fra Ente",
|
||||
"importRaivoGuide": "Brug \"Export OTPs to Zip archive\" fra Raivo's indstillinger.\n\nUdpak zip filen og importér JSON filen.",
|
||||
"importBitwardenGuide": "Brug \"Export vault\" i Bitwarden Tools og importer den ukrypterede JSON fil.",
|
||||
"importAegisGuide": "Brug \"Export the vault\" i Aegis' indstillinger.\n\nHvis din vault er krypteret bliver du nødt til at indtaste kodeordet for at dekryptere den.",
|
||||
"import2FasGuide": "Brug \"Settings > Backup Export\" i 2FAS.\n\nHvis din backup er krypteret bliver du nødt til at indtaste kodeordet for at dekryptere den.",
|
||||
"importLastpassGuide": "Brug \"Transfer accounts\" i Lastpass Authenticator Settings og tryk på \"Export accounts to file\". Importer den downloadede JSON fil.",
|
||||
"exportCodes": "Eksporter koder",
|
||||
"importLabel": "Importer",
|
||||
"importInstruction": "Vælg venligst en fil der indeholder en liste af dine koder i det følgende format",
|
||||
"importCodeDelimiterInfo": "Koderne kan adskilles med enten et komma eller en ny linje",
|
||||
"selectFile": "Vælg fil",
|
||||
"emailVerificationToggle": "Email-verifikation",
|
||||
"emailVerificationEnableWarning": "For at undgå at blive låst ude af din konto, sørg for at gemme en kopi af din email 2FA udenfor Ente Auth før du aktiverer email-verifikation.",
|
||||
"authToChangeEmailVerificationSetting": "Bekræft venligst din identitet for at ændre email-verifikation",
|
||||
"authenticateGeneric": "Bekræft venligst din identitet",
|
||||
"authToViewYourRecoveryKey": "Bekræft venligst din identitet for at se din gendannelseskode.",
|
||||
"authToChangeYourEmail": "Bekræft venligst din identitet for at ændre din email adresse",
|
||||
"authToChangeYourPassword": "Bekræft venligst din identitet for at ændre din adgangskode",
|
||||
"authToViewSecrets": "Bekræft venligst din identitet for at se dine hemmeligheder",
|
||||
"authToInitiateSignIn": "Bekræft venligst din identitet for at påbegynde sikkerhedskopiering.",
|
||||
"ok": "OK",
|
||||
"cancel": "Afbryd",
|
||||
"yes": "Ja",
|
||||
"no": "Nej",
|
||||
"email": "Email",
|
||||
"support": "Support",
|
||||
"general": "Generelt",
|
||||
"settings": "Indstillinger",
|
||||
"copied": "Kopieret",
|
||||
"pleaseTryAgain": "Forsøg venligst igen",
|
||||
"existingUser": "Eksisterende bruger",
|
||||
"newUser": "Ny bruger",
|
||||
"delete": "Slet",
|
||||
"enterYourPasswordHint": "Indtast adgangskode",
|
||||
"forgotPassword": "Glemt adgangskode",
|
||||
"oops": "Ups",
|
||||
"suggestFeatures": "Foreslå funktioner",
|
||||
"faq": "FAQ",
|
||||
"somethingWentWrongMessage": "Noget gik galt, forsøg venligst igen",
|
||||
"leaveFamily": "Forlad familie-abonnementet",
|
||||
"leaveFamilyMessage": "Er du sikker på at du vil forlade familie-abonnementet?",
|
||||
"inFamilyPlanMessage": "Du er nu i familie-abonnementet!",
|
||||
"hintForMobile": "Langt tryk på en kode for at redigere eller slette.",
|
||||
"hintForDesktop": "Højre-klik på en kode for at redigere eller slette.",
|
||||
"scan": "Skan",
|
||||
"scanACode": "Skan en kode",
|
||||
"verify": "Bekræft",
|
||||
"verifyEmail": "Bekræft email adresse",
|
||||
"enterCodeHint": "Indtast den 6-cifrede kode fra din authenticator app",
|
||||
"lostDeviceTitle": "Mistet enhed?",
|
||||
"twoFactorAuthTitle": "Tofaktorgodkendelse",
|
||||
"passkeyAuthTitle": "Bekræftelse af adgangskode",
|
||||
"verifyPasskey": "Bekræft adgangskode",
|
||||
"recoverAccount": "Gendan konto",
|
||||
"enterRecoveryKeyHint": "Indtast din gendannelsesnøgle",
|
||||
"recover": "Gendan",
|
||||
"contactSupportViaEmailMessage": "Send venligst en email til {email} fra din registrerede email adresse",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "Ugyldig QR kode",
|
||||
"noRecoveryKeyTitle": "Ingen gendannelsesnøgle?",
|
||||
"enterEmailHint": "Indtast din email adresse",
|
||||
"invalidEmailTitle": "Ugyldig email adresse",
|
||||
"invalidEmailMessage": "Indtast en gyldig email adresse.",
|
||||
"deleteAccount": "Slet konto",
|
||||
"deleteAccountQuery": "Vi er kede af at se dig gå. Er du stødt på et problem?",
|
||||
"yesSendFeedbackAction": "Ja, send feedback",
|
||||
"noDeleteAccountAction": "Nej, slet konto",
|
||||
"initiateAccountDeleteTitle": "Bekræft venligst for at påbegynde sletning af konto",
|
||||
"sendEmail": "Send email",
|
||||
"createNewAccount": "Opret konto",
|
||||
"weakStrength": "Svagt",
|
||||
"strongStrength": "Stærkt",
|
||||
"moderateStrength": "Middel",
|
||||
"confirmPassword": "Bekræft kodeord",
|
||||
"close": "Luk",
|
||||
"oopsSomethingWentWrong": "Ups, noget gik galt.",
|
||||
"selectLanguage": "Vælg sprog",
|
||||
"language": "Sprog",
|
||||
"social": "Social",
|
||||
"security": "Sikkerhed",
|
||||
"lockscreen": "Skærmlås",
|
||||
"authToChangeLockscreenSetting": "Bekræft venligst din identitet for at ændre skærmlås indstillinger",
|
||||
"deviceLockEnablePreSteps": "For at aktivere enhedslås, indstil venligst kode eller skærmlås på din enhed i dine systemindstillinger.",
|
||||
"viewActiveSessions": "Se aktive sessioner",
|
||||
"authToViewYourActiveSessions": "Bekræft venligst din identitet for at se dine aktive sessioner",
|
||||
"searchHint": "Søg...",
|
||||
"search": "Søg",
|
||||
"sorryUnableToGenCode": "Beklager, ikke i stand til at generere en kode for {issuerName}",
|
||||
"noResult": "Intet resultat",
|
||||
"addCode": "Tilføj kode",
|
||||
"scanAQrCode": "Skan QR kode",
|
||||
"enterDetailsManually": "Indtast oplysninger manuelt",
|
||||
"edit": "Rediger",
|
||||
"share": "Del",
|
||||
"shareCodes": "Del koder",
|
||||
"shareCodesDuration": "Vælg varighed for deling af koden.",
|
||||
"restore": "Genopret",
|
||||
"copiedToClipboard": "Kopieret til udklipsholderen",
|
||||
"copiedNextToClipboard": "Næste kode kopieret til udklipsholderen",
|
||||
"error": "Fejl",
|
||||
"recoveryKeyCopiedToClipboard": "Gendannelsesnøgle kopieret til udklipsholderen",
|
||||
"recoveryKeyOnForgotPassword": "Hvis du glemmer dit kodeord er gendannelsesnøglen den eneste mulighed for at få adgang til dine data.",
|
||||
"recoveryKeySaveDescription": "Vi gemmer ikke denne nøgle, gem venligst denne 24-ords nøgle et sikkert sted.",
|
||||
"doThisLater": "Gør det senere",
|
||||
"saveKey": "Gem nøgle",
|
||||
"save": "Gem",
|
||||
"send": "Send",
|
||||
"saveOrSendDescription": "Vil du gemme på din enhed (Downloads mappe som udgangspunkt) eller sende til andre apps?",
|
||||
"saveOnlyDescription": "Vil du gemme på din enhed (Downloads mappe som udgangspunkt)?",
|
||||
"back": "Tilbage",
|
||||
"createAccount": "Opret konto",
|
||||
"passwordStrength": "Kodeordets styrke: {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": "Kodeord",
|
||||
"signUpTerms": "Jeg er enig i <u-terms>betingelser for brug</u-terms> og <u-policy>privatlivspolitik</u-policy>",
|
||||
"privacyPolicyTitle": "Privatlivspolitik",
|
||||
"termsOfServicesTitle": "Betingelser",
|
||||
"encryption": "Kryptering",
|
||||
"setPasswordTitle": "Angiv adgangskode",
|
||||
"changePasswordTitle": "Skift adgangskode",
|
||||
"resetPasswordTitle": "Nulstil adgangskode",
|
||||
"encryptionKeys": "Krypteringsnøgler",
|
||||
"passwordWarning": "Vi gemmer ikke denne adgangskode, så hvis du glemmer den <underline>kan vi ikke dekryptere dine data</underline>",
|
||||
"enterPasswordToEncrypt": "Indtast en adgangskode vi kan bruge til at kryptere dine data",
|
||||
"enterNewPasswordToEncrypt": "Indtast en ny adgangskode vi kan bruge til at kryptere dine data",
|
||||
"passwordChangedSuccessfully": "Adgangskoden er blevet ændret",
|
||||
"generatingEncryptionKeys": "Genererer krypteringsnøgler...",
|
||||
"continueLabel": "Fortsæt",
|
||||
"insecureDevice": "Usikker enhed",
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Beklager, vi kunne ikke generere sikre krypteringsnøgler på denne enhed.\n\nForsøg venligst at oprette en konto fra en anden enhed.",
|
||||
"howItWorks": "Sådan fungerer det",
|
||||
"ackPasswordLostWarning": "Jeg forstår at hvis jeg mister min adgangskode kan jeg miste mine data, da mine data er <underline>end-to-end krypteret</underline>.",
|
||||
"loginTerms": "Ved at logge ind godkender jeg Ente's <u-terms>betingelser for brug</u-terms> og <u-policy>privatlivspolitik</u-policy>.",
|
||||
"logInLabel": "Log ind",
|
||||
"logout": "Log ud",
|
||||
"areYouSureYouWantToLogout": "Er du sikker på at du vil logge ud?",
|
||||
"yesLogout": "Ja, log ud",
|
||||
"exit": "Afslut",
|
||||
"verifyingRecoveryKey": "Bekræfter gendannelsesnøgle...",
|
||||
"recoveryKeyVerified": "Gendannelsesnøgle bekræftet",
|
||||
"recoveryKeySuccessBody": "Fantastisk! Din gendannelsesnøgle er gyldig. Tak for bekræften.\n\nHusk venligst at tage en sikkerhedskopi af din gendannelsesnøgle.",
|
||||
"invalidRecoveryKey": "Den indtastede gendannelsesnøgle er ikke gyldig. Sørg venligst for at den indeholder 24 ord, og tjek stavningen af hvert ord.\n\nHvis du indtastede en ældre gendannelseskode, sørg for at den er 64 tegn lang, og tjek hvert tegn.",
|
||||
"recreatePasswordTitle": "Gendan adgangskode",
|
||||
"recreatePasswordBody": "Denne enhed er ikke kraftfuld nok til at bekræfte adgangskoden, men vi kan gendanne den på en måde der fungerer for alle enheder.\n\nLog venligst ind med din gendannelsesnøgle og gendan din adgangskode (du kan bruge den samme adgangskode igen hvis du ønsker).",
|
||||
"invalidKey": "Ugyldig nøgle",
|
||||
"tryAgain": "Forsøg igen",
|
||||
"viewRecoveryKey": "Se gendannelsesnøgle",
|
||||
"confirmRecoveryKey": "Bekræft gendannelsesnøgle",
|
||||
"recoveryKeyVerifyReason": "Din gendannelsesnøgle er den eneste måde du kan gendanne dine data hvis du glemmer din adgangskode. Du kan finde din gendannelseskode under \"Indstillinger > Konto\".\n\nIndtast venligst din gendannelseskode for at bekræfte at du har gemt den korrekt.",
|
||||
"confirmYourRecoveryKey": "Bekræft din gendannelsesnøgle",
|
||||
"confirm": "Bekræft",
|
||||
"emailYourLogs": "Email dine logs",
|
||||
"pleaseSendTheLogsTo": "Send venligst logs til {toEmail}",
|
||||
"copyEmailAddress": "Kopier email adresse",
|
||||
"exportLogs": "Eksporter logs",
|
||||
"enterYourRecoveryKey": "Indtast gendannelsesnøgle",
|
||||
"tempErrorContactSupportIfPersists": "Det ser ud til at noget gik galt. Forsøg venligst igen efter lidt tid. Hvis fejlen varer ved, kontakt da venligst vores support.",
|
||||
"networkHostLookUpErr": "Ude af stand til at forbinde til Ente. Tjek venligst dine netværksindstillinger og kontakt support hvis fejlen varer ved.",
|
||||
"networkConnectionRefusedErr": "Ude af stand til at forbinde til Ente. Forsøg igen efter et stykke tid. Hvis fejlen varer ved, kontakt da venligst support.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Det ser ud til at noget gik galt. Forsøg venligst igen efter lidt tid. Hvis fejlen varer ved, kontakt da venligst support.",
|
||||
"about": "Om os",
|
||||
"weAreOpenSource": "Vi er open source!",
|
||||
"privacy": "Privatliv",
|
||||
"terms": "Betingelser",
|
||||
"checkForUpdates": "Tjek for opdateringer",
|
||||
"checkStatus": "Tjek status",
|
||||
"downloadUpdate": "Download",
|
||||
"criticalUpdateAvailable": "Kritisk opdatering er tilgængelig",
|
||||
"updateAvailable": "Opdatering er tilgængelig",
|
||||
"update": "Opdater",
|
||||
"checking": "Tjekker...",
|
||||
"youAreOnTheLatestVersion": "Du er på den seneste version",
|
||||
"warning": "Advarsel",
|
||||
"exportWarningDesc": "Den eksporterede fil indeholder fortrolige oplysninger. Opbevar den sikkert.",
|
||||
"iUnderStand": "Jeg forstår",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "Bekræft din identitet for at eksportere dine koder",
|
||||
"importSuccessTitle": "Yay!",
|
||||
"importSuccessDesc": "Du har importeret {count} koder!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The number of codes imported",
|
||||
"type": "int",
|
||||
"example": "1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sorry": "Beklager",
|
||||
"importFailureDesc": "Kunne ikke afkode the valgte fil. Skriv venligst til support@ente.io hvis du har brug for hjælp!",
|
||||
"pendingSyncs": "Advarsel",
|
||||
"pendingSyncsWarningBody": "Nogle af dine koder er ikke sikkerhedskopieret.\n\nForsikr venligst at du har sikkerhedskopieret dine koder før du logger af.",
|
||||
"checkInboxAndSpamFolder": "Tjek venligst din indboks (og spam) for at færdiggøre verificeringen",
|
||||
"tapToEnterCode": "Tryk for at indtaste kode",
|
||||
"resendEmail": "Send email igen",
|
||||
"weHaveSendEmailTo": "Vi har sendt en email til <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": "Aktive sessioner",
|
||||
"somethingWentWrongPleaseTryAgain": "Noget gik galt, forsøg venligst igen",
|
||||
"thisWillLogYouOutOfThisDevice": "Dette vil logge dig ud af denne enhed!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "Dette vil logge dig ud af den følgende enhed:",
|
||||
"terminateSession": "Afslut session?",
|
||||
"terminate": "Afslut",
|
||||
"thisDevice": "Denne enhed",
|
||||
"toResetVerifyEmail": "For at nulstille din adgangskode, bekræft venligst din email adresse.",
|
||||
"thisEmailIsAlreadyInUse": "Denne email adresse er allerede i brug",
|
||||
"verificationFailedPleaseTryAgain": "Bekræftelse fejlede, forsøg venligst igen",
|
||||
"yourVerificationCodeHasExpired": "Din bekræftelseskode er udløbet",
|
||||
"incorrectCode": "Forkert kode",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "Beklager, den indtastede kode er forkert",
|
||||
"emailChangedTo": "Email adresse ændret til {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "Bekræftelse af identitet fejlede, forsøg venligst igen",
|
||||
"authenticationSuccessful": "Bekræftelse af identitet lykkedes!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Tofaktorgodkendelse nulstillet",
|
||||
"incorrectRecoveryKey": "Forkert gendannelsesnøgle",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "Den indtastede gendannelsesnøgle er ikke korrekt",
|
||||
"enterPassword": "Indtast adgangskode",
|
||||
"selectExportFormat": "Vælg eksportformat",
|
||||
"exportDialogDesc": "Krypterede eksporter vil blive beskyttet med en adgangskode efter dit valg.",
|
||||
"encrypted": "Krypteret",
|
||||
"plainText": "Almindelig tekst",
|
||||
"passwordToEncryptExport": "Adgangskode til krypteret eksport",
|
||||
"export": "Eksporter",
|
||||
"useOffline": "Brug uden sikkerhedskopier",
|
||||
"signInToBackup": "Log på for at tage sikkerhedskopier af dine koder",
|
||||
"singIn": "Log på",
|
||||
"sigInBackupReminder": "Eksporter venligst dine koder for at sikre at du har en sikkerhedskopi du kan gendanne fra.",
|
||||
"offlineModeWarning": "Du har valgt at fortsætte uden sikkerhedskopier. Tag venligst en manuel sikkerhedskopi for at sikre dine koders sikkerhed.",
|
||||
"showLargeIcons": "Vis store ikoner",
|
||||
"compactMode": "Kompakt tilstand",
|
||||
"shouldHideCode": "Skjul koder",
|
||||
"doubleTapToViewHiddenCode": "Du kan dobbelt-klikke på et felt for at se koden",
|
||||
"focusOnSearchBar": "Fokus på søgning ved opstart",
|
||||
"confirmUpdatingkey": "Er du sikker på at du vil opdatere den hemmelige nøgle?",
|
||||
"minimizeAppOnCopy": "Minimer app ved kopiering",
|
||||
"editCodeAuthMessage": "Bekræft identitet for at redigere kode",
|
||||
"deleteCodeAuthMessage": "Bekræft identitet for at slette kode",
|
||||
"showQRAuthMessage": "Bekræft identitet for at se QR kode",
|
||||
"confirmAccountDeleteTitle": "Bekræft sletning af konto",
|
||||
"confirmAccountDeleteMessage": "Denne konto er forbundet til andre Ente apps, hvis du benytter nogle.\n\nDine uploadede data for alle Ente apps vil blive slettet, og din konto vil blive slettet permanent.",
|
||||
"androidBiometricHint": "Bekræft identitet",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricNotRecognized": "Ikke genkendt. Forsøg igen.",
|
||||
"@androidBiometricNotRecognized": {
|
||||
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricSuccess": "Succes",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "Afbryd",
|
||||
"@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": "Godkendelse påkrævet",
|
||||
"@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": "Biometri påkrævet",
|
||||
"@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": "Enhedsoplysninger påkrævet",
|
||||
"@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": "Enhedsoplysninger påkrævet",
|
||||
"@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": "Gå til indstillinger",
|
||||
"@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": "Biometrisk godkendelse er ikke indstillet på din enhed. Gå til \"Indstillinger > Sikkerhed\" for at indstille biometrisk godkendelse.",
|
||||
"@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": "Biometrisk godkendelse er slået fra. Lås din skærm, og lås den derefter op for at aktivere det.",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSGoToSettingsDescription": "Biometrisk godkendelse er ikke indstillet på din enhed. Indstil venligst enten Touch ID eller Face ID på din telefon.",
|
||||
"@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": "Ingen internetforbindelse",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Tjek venligst din internetforbindelse og forsøg igen.",
|
||||
"signOutFromOtherDevices": "Log ud af andre enheder",
|
||||
"signOutOtherBody": "Hvis du mistænker at nogen kender din adgangskode kan du tvinge alle enheder der benytter din konto til at logge ud.",
|
||||
"signOutOtherDevices": "Log ud af andre enheder",
|
||||
"doNotSignOut": "Log ikke ud",
|
||||
"hearUsWhereTitle": "Hvordan hørte du om Ente? (valgfrit)",
|
||||
"hearUsExplanation": "Vi tracker ikke app installeringer. Det ville hjælpe os at vide hvordan du fandt os!",
|
||||
"recoveryKeySaved": "Gendannelsesnøgle gemt i din Downloads mappe!",
|
||||
"waitingForBrowserRequest": "Venter på browser forespørgsel...",
|
||||
"waitingForVerification": "Venter på bekræftelse...",
|
||||
"passkey": "Passkey",
|
||||
"passKeyPendingVerification": "Bekræftelse afventes stadig",
|
||||
"loginSessionExpired": "Session udløbet",
|
||||
"loginSessionExpiredDetails": "Din session er udløbet. Log venligst på igen.",
|
||||
"developerSettingsWarning": "Er du sikker på at du vil redigere Udvikler-indstillinger?",
|
||||
"developerSettings": "Udvikler-indstillinger",
|
||||
"serverEndpoint": "Server endpoint",
|
||||
"invalidEndpoint": "Ugyldigt endpoint",
|
||||
"invalidEndpointMessage": "Beklager, det indtastede endpoint er ugyldigt. Indtast venligst et gyldigt endpoint og forsøg igen.",
|
||||
"endpointUpdatedMessage": "Endpoint opdateret",
|
||||
"customEndpoint": "Forbindelse oprettet til {endpoint}",
|
||||
"pinText": "Fastgør",
|
||||
"unpinText": "Frigør",
|
||||
"pinnedCodeMessage": "{code} er blevet fastgjort",
|
||||
"unpinnedCodeMessage": "{code} er blevet frigjort",
|
||||
"tags": "Tags",
|
||||
"createNewTag": "Opret nyt tag",
|
||||
"tag": "Tag",
|
||||
"create": "Opret",
|
||||
"editTag": "Rediger tag",
|
||||
"deleteTagTitle": "Slet tag?",
|
||||
"deleteTagMessage": "Er du sikker på at du vil slette dette tag? Denne handling er irreversibel.",
|
||||
"somethingWentWrongParsingCode": "Vi var ikke i stand til at afkode {x} koder.",
|
||||
"updateNotAvailable": "Opdatering er ikke tilgængelig",
|
||||
"viewRawCodes": "Vis rå koder",
|
||||
"rawCodes": "Rå koder",
|
||||
"rawCodeData": "Rå kode data",
|
||||
"appLock": "Låsning af app",
|
||||
"noSystemLockFound": "Ingen systemlås fundet",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "For at indstille låsning af app, indstil venligst en kode eller skærmlås i dine systemindstillinger.",
|
||||
"autoLock": "Automatisk lås",
|
||||
"immediately": "Med det samme",
|
||||
"reEnterPassword": "Indtast adgangskode igen",
|
||||
"reEnterPin": "Indtast pinkode igen",
|
||||
"next": "Næste",
|
||||
"tooManyIncorrectAttempts": "For mange forkerte forsøg",
|
||||
"tapToUnlock": "Tryk for at låse op",
|
||||
"setNewPassword": "Indstil ny adgangskode",
|
||||
"deviceLock": "Enhedslås",
|
||||
"hideContent": "Skjul indhold",
|
||||
"hideContentDescriptionAndroid": "Skjul app indhold i app-vælger og deaktiver screenshots",
|
||||
"hideContentDescriptioniOS": "Skjul app indhold i app-vælger",
|
||||
"autoLockFeatureDescription": "Tid til låsning af app efter at være blevet placeret i baggrunden",
|
||||
"appLockDescription": "Vælg mellem din enheds standard skærmlås eller skærmlås med pinkode eller adgangskode.",
|
||||
"pinLock": "Låsning med pinkode",
|
||||
"enterPin": "Indtast pinkode",
|
||||
"setNewPin": "Indstil ny pinkode",
|
||||
"importFailureDescNew": "Kunne ikke afkode den valgte fil.",
|
||||
"appLockNotEnabled": "Låsning af app er ikke slået til",
|
||||
"appLockNotEnabledDescription": "Slå venligst låsning af app til under \"Sikkerhed > Låsning af app\"",
|
||||
"authToViewPasskey": "Bekræft venligst identitet for at se passkey"
|
||||
}
|
||||
@@ -141,16 +141,6 @@
|
||||
"oops": "Hopla",
|
||||
"suggestFeatures": "Features vorschlagen",
|
||||
"faq": "FAQ",
|
||||
"faq_q_1": "Wie sicher ist Auth?",
|
||||
"faq_a_1": "Alle Codes, die du über Auth sicherst, werden Ende-zu-Ende-verschlüsselt gespeichert. Das bedeutet, dass nur du auf deine Codes zugreifen kannst. Unsere Anwendungen sind quelloffen und unsere Kryptografie wurde extern geprüft.",
|
||||
"faq_q_2": "Kann ich auf meine Codes auf dem Desktop zugreifen?",
|
||||
"faq_a_2": "Sie können auf Ihre Codes im Web via auth.ente.io zugreifen.",
|
||||
"faq_q_3": "Wie kann ich Codes löschen?",
|
||||
"faq_a_3": "Sie können einen Code löschen, indem Sie auf dem Code nach links wischen.",
|
||||
"faq_q_4": "Wie kann ich das Projekt unterstützen?",
|
||||
"faq_a_4": "Sie können die Entwicklung dieses Projekts unterstützen, indem Sie unsere Fotos-App auf ente.io abonnieren.",
|
||||
"faq_q_5": "Wie kann ich die FaceID-Sperre in Auth aktivieren",
|
||||
"faq_a_5": "Sie können FaceID unter Einstellungen → Sicherheit → Sperrbildschirm aktivieren.",
|
||||
"somethingWentWrongMessage": "Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut",
|
||||
"leaveFamily": "Familie verlassen",
|
||||
"leaveFamilyMessage": "Sind Sie sicher, dass Sie den Familien-Plan verlassen wollen?",
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "Δημιουργήστε αντίγραφο ασφαλείας των 2FA κωδικών σας",
|
||||
"onBoardingGetStarted": "Ας Αρχίσουμε",
|
||||
"onBoardingGetStarted": "Ξεκινήστε",
|
||||
"setupFirstAccount": "Ρυθμίστε τον πρώτο σας λογαριασμό",
|
||||
"importScanQrCode": "Σαρώστε έναν κωδικό QR",
|
||||
"qrCode": "Κωδικός QR",
|
||||
"importEnterSetupKey": "Εισάγετε ένα κλειδί ρύθμισης",
|
||||
"importAccountPageTitle": "Εισαγωγή στοιχείων λογαριασμού",
|
||||
"secretCanNotBeEmpty": "Το μυστικό δεν μπορεί να είναι κενό",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Τόσο ο εκδότης όσο και ο λογαριασμός δεν μπορούν να είναι κενά",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "Ο εκδότης και ο λογαριασμός δεν μπορούν να είναι κενοί",
|
||||
"incorrectDetails": "Λανθασμένα στοιχεία",
|
||||
"pleaseVerifyDetails": "Παρακαλούμε επιβεβαιώστε τα στοιχεία σας και προσπαθήστε ξανά",
|
||||
"codeIssuerHint": "Εκδότης",
|
||||
@@ -41,20 +41,20 @@
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Παρακαλούμε συνδεθείτε ξανά",
|
||||
"loggingOut": "Αποσύνδεση...",
|
||||
"loggingOut": "Αποσύνδεση…",
|
||||
"timeBasedKeyType": "Βασισμένο σε χρόνο (TOTP)",
|
||||
"counterBasedKeyType": "Με βάση μετρητή (HOTP)",
|
||||
"saveAction": "Αποθήκευση",
|
||||
"nextTotpTitle": "επόμενο",
|
||||
"deleteCodeTitle": "Διαγραφή κωδικού;",
|
||||
"deleteCodeMessage": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτόν τον κωδικό; Αυτή η ενέργεια είναι μη αναστρέψιμη.",
|
||||
"deleteCodeMessage": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτόν τον κωδικό; Αυτή η ενέργεια δεν είναι αναστρέψιμη.",
|
||||
"trashCode": "Διαγραφή κώδικα;",
|
||||
"trashCodeMessage": "Είστε σίγουροι ότι θέλετε να διαγράψετε τον κώδικα για το {account} σας;",
|
||||
"trash": "Διαγραφή",
|
||||
"viewLogsAction": "Προβολή αρχείων καταγραφής",
|
||||
"sendLogsDescription": "Αυτό θα στείλει σε μας όλα τα αρχεία καταγραφής για να μας βοηθήσει να αποσφαλματώσουμε το πρόβλημά σας. Ενώ λαμβάνουμε προφυλάξεις για να διασφαλίσουμε ότι οι ευαίσθητες πληροφορίες δεν καταγράφονται, σας ενθαρρύνουμε να δείτε αυτά τα αρχεία καταγραφής πριν τα μοιραστείτε.",
|
||||
"preparingLogsTitle": "Προετοιμασία αρχείων καταγραφής...",
|
||||
"emailLogsTitle": "Αρχεία καταγραφής ηλ. ταχυδρομείου",
|
||||
"sendLogsDescription": "Αυτό θα στείλει αρχεία καταγραφής για να μας βοηθήσει να εντοπίσουμε το πρόβλημά σας. Παρόλο που λαμβάνουμε προφυλάξεις για να διασφαλίσουμε ότι δεν καταγράφονται ευαίσθητες πληροφορίες, σας ενθαρρύνουμε να δείτε αυτά τα αρχεία καταγραφής πριν τα μοιραστείτε.",
|
||||
"preparingLogsTitle": "Προετοιμασία αρχείων καταγραφής…",
|
||||
"emailLogsTitle": "Αρχεία καταγραφής email",
|
||||
"emailLogsMessage": "Παρακαλώ στείλτε τα αρχεία καταγραφής στο {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
@@ -63,12 +63,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "Αντιγραφή διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"copyEmailAction": "Αντιγραφή email",
|
||||
"exportLogsAction": "Εξαγωγή αρχείων καταγραφής",
|
||||
"reportABug": "Αναφορά Σφάλματος",
|
||||
"crashAndErrorReporting": "Αναφορά κατάρρευσης & σφάλματος",
|
||||
"reportBug": "Αναφορά σφάλματος",
|
||||
"emailUsMessage": "Παρακαλώ στείλτε μας μήνυμα ηλ. ταχυδρομείου στο {email}",
|
||||
"emailUsMessage": "Παρακαλούμε στείλτε μας email στο {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
@@ -78,20 +78,20 @@
|
||||
},
|
||||
"contactSupport": "Επικοινωνήστε με την υποστήριξη",
|
||||
"rateUsOnStore": "Αξιολογήστε μας στο {storeName}",
|
||||
"blog": "Ιστολόγιο",
|
||||
"blog": "Blog",
|
||||
"merchandise": "Προϊόντα",
|
||||
"verifyPassword": "Επαλήθευση κωδικού πρόσβασης",
|
||||
"pleaseWait": "Παρακαλώ περιμένετε...",
|
||||
"generatingEncryptionKeysTitle": "Δημιουργία κλειδιών κρυπτογράφησης...",
|
||||
"recreatePassword": "Επαναδημιουργία κωδικού πρόσβασης",
|
||||
"recreatePasswordMessage": "Η τρέχουσα συσκευή δεν είναι αρκετά ισχυρή για να επαληθεύσει τον κωδικό πρόσβασής σας, οπότε πρέπει να τον επαναδημιουργήσουμε με τέτοιο τρόπο ώστε να λειτουργεί με όλες τις συσκευές. \n\nΠαρακαλούμε συνδεθείτε χρησιμοποιώντας το κλειδί ανάκτησης σας και επαναδημιουργήστε τον κωδικό πρόσβασής σας (μπορείτε να χρησιμοποιήσετε ξανά τον ίδιο αν το επιθυμείτε).",
|
||||
"pleaseWait": "Παρακαλώ περιμένετε…",
|
||||
"generatingEncryptionKeysTitle": "Δημιουργία κλειδιών κρυπτογράφησης…",
|
||||
"recreatePassword": "Αναδημιουργία κωδικού πρόσβασης",
|
||||
"recreatePasswordMessage": "Η τρέχουσα συσκευή δεν είναι αρκετά ισχυρή για την επαλήθευση του κωδικού πρόσβασής σας, οπότε πρέπει να τον δημιουργήσουμε ξανά μια φορά με έναν τρόπο που να λειτουργεί με όλες τις συσκευές.\n\nΠαρακαλούμε συνδεθείτε χρησιμοποιώντας το κλειδί ανάκτησης και δημιουργήστε ξανά τον κωδικό πρόσβασής σας (μπορείτε να χρησιμοποιήσετε ξανά τον ίδιο αν επιθυμείτε).",
|
||||
"useRecoveryKey": "Χρήση κλειδιού ανάκτησης",
|
||||
"incorrectPasswordTitle": "Λάθος κωδικός πρόσβασης",
|
||||
"welcomeBack": "Καλωσορίσατε και πάλι!",
|
||||
"madeWithLoveAtPrefix": "φτιαγμένη με ❤️ στο ",
|
||||
"supportDevs": "Εγγραφείτε στο <bold-green>ente</bold-green> για να μας υποστηρίξετε",
|
||||
"supportDiscount": "Χρησιμοποιήστε τον κωδικό κουπονιού \"AUTH\" για να πάρετε 10% από το πρώτο έτος",
|
||||
"changeEmail": "Αλλαγή διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"changeEmail": "Αλλαγή email",
|
||||
"changePassword": "Αλλαγή κωδικού πρόσβασής",
|
||||
"data": "Δεδομένα",
|
||||
"importCodes": "Εισαγωγή κωδικών",
|
||||
@@ -114,12 +114,12 @@
|
||||
"importInstruction": "Παρακαλώ επιλέξτε ένα αρχείο που περιέχει μια λίστα των κωδικών σας με τον ακόλουθο τύπο",
|
||||
"importCodeDelimiterInfo": "Οι κωδικοί μπορούν να διαχωριστούν με κόμμα ή με μία νέα γραμμή",
|
||||
"selectFile": "Επιλέξτε αρχείο",
|
||||
"emailVerificationToggle": "Επαλήθευση διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"emailVerificationEnableWarning": "Για να αποφύγετε να κλειδωθείτε έξω από τον λογαριασμό σας, φροντίστε να αποθηκεύσετε ένα αντίγραφο του 2FA του ηλ. ταχυδρομείου σας έξω από το Ente Auth πριν ενεργοποιήσετε την επαλήθευση μέσω ηλ. ταχυδρομείου.",
|
||||
"authToChangeEmailVerificationSetting": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε την επαλήθευση ηλ. ταχυδρομείου",
|
||||
"emailVerificationToggle": "Επαλήθευση email",
|
||||
"emailVerificationEnableWarning": "Για να αποφύγετε να κλειδωθείτε έξω από τον λογαριασμό σας, φροντίστε να αποθηκεύσετε ένα αντίγραφο του 2FA του email σας εκτός του Ente Auth πριν ενεργοποιήσετε την επαλήθευση email.",
|
||||
"authToChangeEmailVerificationSetting": "Παρακαλούμε πιστοποιηθείτε για να αλλάξετε την επαλήθευση email",
|
||||
"authenticateGeneric": "Παρακαλώ πιστοποιήστε την ταυτότητά σας",
|
||||
"authToViewYourRecoveryKey": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε το κλειδί ανάκτησης",
|
||||
"authToChangeYourEmail": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τη διεύθυνση ηλ. ταχυδρομείου σας",
|
||||
"authToChangeYourEmail": "Παρακαλώ πιστοποιηθείτε για να αλλάξετε το email σας",
|
||||
"authToChangeYourPassword": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τον κωδικό πρόσβασής σας",
|
||||
"authToViewSecrets": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τα μυστικά σας",
|
||||
"authToInitiateSignIn": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να ξεκινήσετε την είσοδο για δημιουργία αντιγράφου ασφαλείας.",
|
||||
@@ -127,7 +127,7 @@
|
||||
"cancel": "Ακύρωση",
|
||||
"yes": "Ναι",
|
||||
"no": "Όχι",
|
||||
"email": "Διεύθυνση ηλ. ταχυδρομείου",
|
||||
"email": "Email",
|
||||
"support": "Υποστήριξη",
|
||||
"general": "Γενικά",
|
||||
"settings": "Ρυθμίσεις",
|
||||
@@ -141,16 +141,6 @@
|
||||
"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": "Είστε σίγουροι ότι θέλετε να φύγετε από το οικογενειακό πρόγραμμα;",
|
||||
@@ -160,7 +150,7 @@
|
||||
"scan": "Σάρωση",
|
||||
"scanACode": "Σάρωση κωδικού",
|
||||
"verify": "Επαλήθευση",
|
||||
"verifyEmail": "Επιβεβαίωση διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"verifyEmail": "Επαλήθευση email",
|
||||
"enterCodeHint": "Εισάγετε τον 6ψήφιο κωδικό από \nτην εφαρμογή αυθεντικοποίησης",
|
||||
"lostDeviceTitle": "Χαμένη συσκευή;",
|
||||
"twoFactorAuthTitle": "Αυθεντικοποίηση δύο παραγόντων",
|
||||
@@ -169,7 +159,7 @@
|
||||
"recoverAccount": "Ανάκτηση λογαριασμού",
|
||||
"enterRecoveryKeyHint": "Εισάγετε το κλειδί ανάκτησης σας",
|
||||
"recover": "Ανάκτηση",
|
||||
"contactSupportViaEmailMessage": "Παρακαλώ αφήστε ένα μήνυμα ηλ. ταχυδρομείου στο {email} από την καταχωρημένη διεύθυνση σας",
|
||||
"contactSupportViaEmailMessage": "Παρακαλούμε στείλτε ένα email στο {email} από την καταχωρημένη διεύθυνση email σας",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
@@ -179,15 +169,15 @@
|
||||
},
|
||||
"invalidQRCode": "Μη έγκυρος κωδικός QR",
|
||||
"noRecoveryKeyTitle": "Χωρίς κλειδί ανάκτησης;",
|
||||
"enterEmailHint": "Εισάγετε την διεύθυνση του ηλ. ταχυδρομείου σας",
|
||||
"invalidEmailTitle": "Μη έγκυρη διεύθυνση ηλ. ταχυδρομείου",
|
||||
"invalidEmailMessage": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση ηλ. ταχυδρομείου.",
|
||||
"enterEmailHint": "Εισάγετε τη διεύθυνση email σας",
|
||||
"invalidEmailTitle": "Μη έγκυρη διεύθυνση email",
|
||||
"invalidEmailMessage": "Παρακαλούμε εισάγετε μια έγκυρη διεύθυνση email.",
|
||||
"deleteAccount": "Διαγραφή λογαριασμού",
|
||||
"deleteAccountQuery": "Λυπόμαστε που σας βλέπουμε να φεύγετε. Αντιμετωπίζετε κάποιο πρόβλημα;",
|
||||
"yesSendFeedbackAction": "Ναι, αποστολή σχολίων",
|
||||
"noDeleteAccountAction": "Όχι, διαγραφή λογαριασμού",
|
||||
"initiateAccountDeleteTitle": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να ξεκινήσετε τη διαγραφή λογαριασμού",
|
||||
"sendEmail": "Αποστολή μηνύματος ηλ. ταχυδρομείου",
|
||||
"sendEmail": "Αποστολή email",
|
||||
"createNewAccount": "Δημιουργία νέου λογαριασμού",
|
||||
"weakStrength": "Αδύναμος",
|
||||
"strongStrength": "Δυνατός",
|
||||
@@ -280,9 +270,9 @@
|
||||
"recoveryKeyVerifyReason": "Το κλειδί ανάκτησης σας είναι ο μόνος τρόπος για να ανακτήσετε τις φωτογραφίες σας εάν ξεχάσετε τον κωδικό πρόσβασής σας. Μπορείτε να βρείτε το κλειδί ανάκτησης σας στις Ρυθμίσεις > Λογαριασμός.\n\nΠαρακαλώ εισάγετε το κλειδί ανάκτησης σας εδώ για να βεβαιωθείτε ότι το έχετε αποθηκεύσει σωστά.",
|
||||
"confirmYourRecoveryKey": "Επιβεβαίωση κλειδιού ανάκτησης",
|
||||
"confirm": "Επιβεβαίωση",
|
||||
"emailYourLogs": "Στείλτε με μήνυμα ηλ. ταχυδομείου τα αρχεία καταγραφής σας",
|
||||
"emailYourLogs": "Στείλτε με email τα αρχεία καταγραφής σας",
|
||||
"pleaseSendTheLogsTo": "Παρακαλώ στείλτε τα αρχεία καταγραφής σας στο \n{toEmail}",
|
||||
"copyEmailAddress": "Αντιγραφή διεύθυνσης ηλ. ταχυδρομείου",
|
||||
"copyEmailAddress": "Αντιγραφή διεύθυνσης email",
|
||||
"exportLogs": "Εξαγωγή αρχείων καταγραφής",
|
||||
"enterYourRecoveryKey": "Εισάγετε το κλειδί ανάκτησης σας",
|
||||
"tempErrorContactSupportIfPersists": "Φαίνεται ότι κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά μετά από κάποιο χρονικό διάστημα. Αν το σφάλμα παραμένει, παρακαλούμε επικοινωνήστε με την ομάδα υποστήριξης μας.",
|
||||
@@ -325,7 +315,7 @@
|
||||
"pendingSyncsWarningBody": "Δεν έχουν γίνει αντίγραφα ασφαλείας για μερικούς από τους κωδικούς σας.\n\nΠαρακαλώ βεβαιωθείτε ότι έχετε ένα αντίγραφο ασφαλείας για αυτούς τους κωδικούς πριν αποσυνδεθείτε.",
|
||||
"checkInboxAndSpamFolder": "Παρακαλώ ελέγξτε τα εισερχόμενά σας (και τα ανεπιθύμητα) για να ολοκληρώσετε την επαλήθευση",
|
||||
"tapToEnterCode": "Πατήστε για να εισάγετε τον κωδικό",
|
||||
"resendEmail": "Επαναποστολή μηνύματος ηλ. ταχυδρομείου",
|
||||
"resendEmail": "Επανάληψη αποστολής email",
|
||||
"weHaveSendEmailTo": "Έχουμε στείλει ένα μήνυμα στο <green>{email}</green>",
|
||||
"@weHaveSendEmailTo": {
|
||||
"description": "Text to indicate that we have sent a mail to the user",
|
||||
@@ -344,13 +334,13 @@
|
||||
"terminateSession": "Τερματισμός συνεδρίας;",
|
||||
"terminate": "Τερματισμός",
|
||||
"thisDevice": "Αυτή η συσκευή",
|
||||
"toResetVerifyEmail": "Για να επαναφέρετε τον κωδικό πρόσβασής σας, επαληθεύστε πρώτα την διευθυνση ηλ. ταχυδρομείου σας.",
|
||||
"thisEmailIsAlreadyInUse": "Αυτός ο λογαριασμός ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη",
|
||||
"toResetVerifyEmail": "Για να επαναφέρετε τον κωδικό πρόσβασής σας, επαληθεύστε πρώτα το email σας.",
|
||||
"thisEmailIsAlreadyInUse": "Αυτό το email είναι ήδη σε χρήση",
|
||||
"verificationFailedPleaseTryAgain": "Η επαλήθευση απέτυχε, παρακαλώ προσπαθήστε ξανά",
|
||||
"yourVerificationCodeHasExpired": "Ο κωδικός επαλήθευσης σας έχει λήξει",
|
||||
"incorrectCode": "Εσφαλμένος κωδικός",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "Λυπούμαστε, ο κωδικός που εισαγάγατε είναι εσφαλμένος",
|
||||
"emailChangedTo": "Η διεύθυνση ηλ. ταχυδρομείου άλλαξε σε {newEmail}",
|
||||
"emailChangedTo": "Το email άλλαξε σε {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "Αποτυχία ελέγχου ταυτότητας, παρακαλώ προσπαθήστε ξανά",
|
||||
"authenticationSuccessful": "Επιτυχής έλεγχος ταυτότητας!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Η αυθεντικοποίηση δύο παραγόντων επαναφέρθηκε επιτυχώς",
|
||||
@@ -492,5 +482,6 @@
|
||||
"setNewPin": "Ορίστε νέο PIN",
|
||||
"importFailureDescNew": "Αδυναμία ανάλυσης του επιλεγμένου αρχείου.",
|
||||
"appLockNotEnabled": "Το κλείδωμα εφαρμογής δεν είναι ενεργοποιημένο",
|
||||
"appLockNotEnabledDescription": "Παρακαλώ ενεργοποιήστε το κλείδωμα εφαρμογής μέσω της επιλογής Ασφάλεια > Κλείδωμα εφαρμογής"
|
||||
"appLockNotEnabledDescription": "Παρακαλώ ενεργοποιήστε το κλείδωμα εφαρμογής μέσω της επιλογής Ασφάλεια > Κλείδωμα εφαρμογής",
|
||||
"authToViewPasskey": "Παρακαλώ πιστοποιηθείτε για να δείτε το κλειδί πρόσβασης"
|
||||
}
|
||||
@@ -483,5 +483,6 @@
|
||||
"importFailureDescNew": "Could not parse the selected file.",
|
||||
"appLockNotEnabled": "App lock not enabled",
|
||||
"appLockNotEnabledDescription": "Please enable app lock from Security > App Lock",
|
||||
"authToViewPasskey": "Please authenticate to view passkey"
|
||||
"authToViewPasskey": "Please authenticate to view passkey",
|
||||
"appLockOfflineModeWarning": "You have chosen to proceed without backups. If you forget your applock, you will be locked out from accessing your data."
|
||||
}
|
||||
@@ -123,16 +123,6 @@
|
||||
"oops": "Ups",
|
||||
"suggestFeatures": "Sugerir funcionalidades",
|
||||
"faq": "Preguntas Frecuentes",
|
||||
"faq_q_1": "¿Qué tan seguro es Auth?",
|
||||
"faq_a_1": "Todos los códigos que copia de seguridad vía Ente se almacenan cifrados de extremo a extremo. Esto significa que solo usted puede acceder a sus códigos. Nuestras aplicaciones son de código abierto y nuestra criptografía ha sido auditada externamente.",
|
||||
"faq_q_2": "¿Puedo acceder a mis códigos en el escritorio?",
|
||||
"faq_a_2": "Puede acceder a tus códigos en la web en auth.ente.io.",
|
||||
"faq_q_3": "¿Cómo puedo borrar códigos?",
|
||||
"faq_a_3": "Puede eliminar un código deslizando a la izquierda en ese elemento.",
|
||||
"faq_q_4": "¿Cómo puedo apoyar este proyecto?",
|
||||
"faq_a_4": "Puedes apoyar el desarrollo de este proyecto suscribiéndote a nuestra app de Fotos en ente.io.",
|
||||
"faq_q_5": "Cómo puedo habilitar bloqueo FaceID en Ente Auth",
|
||||
"faq_a_5": "Puede activar el bloqueo FaceID en Ajustes → Seguridad → Pantalla de bloqueo.",
|
||||
"somethingWentWrongMessage": "Algo ha ido mal, por favor, prueba otra vez",
|
||||
"leaveFamily": "Dejar plan familiar",
|
||||
"leaveFamilyMessage": "¿Está seguro de que desea abandonar el plan familiar?",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"account": "حساب کاربری",
|
||||
"unlock": "بازکردن",
|
||||
"recoveryKey": "کلید بازیابی",
|
||||
"counterAppBarTitle": "شمارنده",
|
||||
"@counterAppBarTitle": {
|
||||
@@ -9,11 +10,31 @@
|
||||
"onBoardingGetStarted": "شروع کنید",
|
||||
"setupFirstAccount": "اولین حساب خود را راهاندازی کنید",
|
||||
"importScanQrCode": "اسکن کردن کد QR",
|
||||
"qrCode": "بارکد",
|
||||
"importEnterSetupKey": "وارد کردن کلید تنظیم",
|
||||
"importAccountPageTitle": "ورود اطلاعات حساب",
|
||||
"secretCanNotBeEmpty": "سکرت نمیتواند خالی باشد",
|
||||
"incorrectDetails": "اطلاعات اشتباه",
|
||||
"pleaseVerifyDetails": "لطفا اطلاعات را تایید کنید و دوباره امتحان کنید",
|
||||
"codeIssuerHint": "صادر کننده",
|
||||
"codeSecretKeyHint": "کلید مخفی",
|
||||
"secret": "سکرت",
|
||||
"all": "همه",
|
||||
"notes": "یادداشتها",
|
||||
"notesLengthLimit": "یادداشت میتوانند {count} کارکتر بلند باشند",
|
||||
"@notesLengthLimit": {
|
||||
"description": "Text to indicate the maximum number of characters allowed for notes",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The maximum number of characters allowed for notes",
|
||||
"type": "int",
|
||||
"example": "100"
|
||||
}
|
||||
}
|
||||
},
|
||||
"codeAccountHint": "حساب (you@domain.com)",
|
||||
"codeTagHint": "برچسب",
|
||||
"accountKeyType": "نوع کلید",
|
||||
"sessionExpired": "نشست منقضی شده است",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
@@ -26,6 +47,7 @@
|
||||
"nextTotpTitle": "بعدی",
|
||||
"deleteCodeTitle": "کد حذف شود؟",
|
||||
"deleteCodeMessage": "آیا مطمئن هستید که می خواهید این کد را حذف کنید؟ این کار غیرقابل تغییر است.",
|
||||
"trash": "زباله",
|
||||
"viewLogsAction": "نمایش لاگها",
|
||||
"sendLogsDescription": "این باعث ارسال لاگها میشود تا به ما در رفع مشکل شما کمک کند. هرچند ما اقداماتی را جهت جلوگیری از ثبت اطلاعات حساس در لاگ انجام میدهیم، اما به شما توصیه میکنیم قبل از اشتراک گذاری لاگها آنها را مشاهده کنید.",
|
||||
"preparingLogsTitle": "در حال آمادهسازی لاگها...",
|
||||
@@ -52,6 +74,8 @@
|
||||
}
|
||||
},
|
||||
"contactSupport": "ارتباط با پشتیبانی",
|
||||
"rateUsOnStore": "به ما در {storeName} امتیاز دهید",
|
||||
"blog": "وبلاگ",
|
||||
"verifyPassword": "تایید رمز عبور",
|
||||
"pleaseWait": "لطفا صبر کنید...",
|
||||
"generatingEncryptionKeysTitle": "در حال تولید کلیدهای رمزگذاری...",
|
||||
@@ -67,10 +91,15 @@
|
||||
"changePassword": "تغییر رمز عبور",
|
||||
"data": "داده ها",
|
||||
"importCodes": "ورود کدها",
|
||||
"importTypePlainText": "متن ساده",
|
||||
"importTypeEnteEncrypted": "Ente Encrypted export",
|
||||
"importSelectJsonFile": "انتخاب کنید فایل JSON",
|
||||
"exportCodes": "صدور کدها",
|
||||
"importLabel": "وارد کردن",
|
||||
"importInstruction": "لطفا یک فایل که حاوی لیستی از کدهای شما در قالب زیر است، انتخاب کنید",
|
||||
"importCodeDelimiterInfo": "کدها میتوانند با کاما یا یک خط جدید از یکدیگر جدا شوند",
|
||||
"selectFile": "انتخاب فایل",
|
||||
"emailVerificationToggle": "تائید ایمیل",
|
||||
"authToViewYourRecoveryKey": "لطفا جهت نمایش کلید بازیابی خود، اعتبارسنجی کنید",
|
||||
"authToChangeYourEmail": "لطفا جهت تغییر ایمیل خود، اعتبارسنجی کنید",
|
||||
"authToChangeYourPassword": "لطفا جهت تغییر رمز عبور خود، اعتبارسنجی کنید",
|
||||
@@ -80,14 +109,18 @@
|
||||
"no": "خیر",
|
||||
"email": "ایمیل",
|
||||
"support": "پشتیبانی",
|
||||
"general": "عمومی",
|
||||
"settings": "تنظیمات",
|
||||
"copied": "کپی شد",
|
||||
"pleaseTryAgain": "لطفا دوباره تلاش کنید",
|
||||
"existingUser": "کاربر موجود",
|
||||
"newUser": "کاربر جدید Ente",
|
||||
"delete": "حذف",
|
||||
"enterYourPasswordHint": "رمز عبور خود را وارد کنید",
|
||||
"forgotPassword": "فراموشی رمز عبور",
|
||||
"oops": "اوه",
|
||||
"suggestFeatures": "پیشنهاد قابلیت ها",
|
||||
"faq": "سوالات متداول",
|
||||
"somethingWentWrongMessage": "مشکلی پیش آمده است، لطفا دوباره تلاش کنید",
|
||||
"leaveFamily": "خروج از طرح خانواده",
|
||||
"leaveFamilyMessage": "آیا مطمئنید که میخواهید از طرح خانواده خارج شوید؟",
|
||||
@@ -95,9 +128,12 @@
|
||||
"scan": "اسکن",
|
||||
"scanACode": "یک کد را اسکن کنید",
|
||||
"verify": "تایید",
|
||||
"verifyEmail": "تایید ایمیل",
|
||||
"enterCodeHint": "کد تایید ۶ رقمی را از برنامه\nاحراز هویت خود وارد کنید",
|
||||
"lostDeviceTitle": "دستگاه را گم کردهاید؟",
|
||||
"twoFactorAuthTitle": "احراز هویت دو مرحلهای",
|
||||
"passkeyAuthTitle": "تایید کردن پسکی",
|
||||
"verifyPasskey": "تایید پسکی",
|
||||
"recoverAccount": "بازیابی حساب کاربری",
|
||||
"enterRecoveryKeyHint": "کلید بازیابی خود را وارد کنید",
|
||||
"recover": "بازیابی",
|
||||
@@ -109,6 +145,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "بارکد نامعتبر",
|
||||
"noRecoveryKeyTitle": "کلید بازیابی ندارید؟",
|
||||
"enterEmailHint": "آدرس ایمیل خود را وارد کنید",
|
||||
"invalidEmailTitle": "آدرس ایمیل نامعتبر است",
|
||||
@@ -142,6 +179,8 @@
|
||||
"scanAQrCode": "اسکن کردن کد QR",
|
||||
"enterDetailsManually": "ورود دستی جزئیات",
|
||||
"edit": "ویرایش",
|
||||
"share": "اشتراکگذاری",
|
||||
"restore": "بازگرداندن",
|
||||
"copiedToClipboard": "به حافظه موقت کپی شد",
|
||||
"error": "خطا",
|
||||
"recoveryKeyCopiedToClipboard": "کلید بازیابی به حافظه موقت کپی شد",
|
||||
@@ -149,6 +188,9 @@
|
||||
"recoveryKeySaveDescription": "ما این کلید را ذخیره نمیکنیم، لطفا این کلید ۲۴ کلمهای را در مکانی امن ذخیره کنید.",
|
||||
"doThisLater": "بعداً انجام شود",
|
||||
"saveKey": "ذخیره کلید",
|
||||
"save": "ذخیره",
|
||||
"send": "ارسال",
|
||||
"back": "بازگشت",
|
||||
"createAccount": "ایجاد حساب کاربری",
|
||||
"passwordStrength": "قدرت رمز عبور: {passwordStrengthValue}",
|
||||
"@passwordStrength": {
|
||||
@@ -167,8 +209,14 @@
|
||||
"privacyPolicyTitle": "سیاست حفظ حریم خصوصی",
|
||||
"termsOfServicesTitle": "شرایط و ضوابط",
|
||||
"encryption": "رمزگذاری",
|
||||
"setPasswordTitle": "تنظیم پسورد",
|
||||
"changePasswordTitle": "تغییر رمز عبور",
|
||||
"resetPasswordTitle": "بازنشانی رمز عبور",
|
||||
"encryptionKeys": "کلیدهای رمزنگاری",
|
||||
"passwordChangedSuccessfully": "رمز عبور با موفقیت تغییر کرد",
|
||||
"continueLabel": "ادامه",
|
||||
"insecureDevice": "دستگاه ناامن",
|
||||
"howItWorks": "چگونه کار میکند",
|
||||
"ackPasswordLostWarning": "میدانم که اگر رمز عبور خود را گم کنم، از آنجایی که اطلاعات من <underline>رمزگذاری سرتاسری</underline> شده است، ممکن است اطلاعاتم را از دست بدهم.",
|
||||
"loginTerms": "با کلیک روی ورود، با <u-terms>شرایط استفاده از خدمات</u-terms> و <u-policy>سیاست حفظ حریم خصوصی</u-policy> موافقت میکنم",
|
||||
"logInLabel": "ورود",
|
||||
@@ -201,6 +249,11 @@
|
||||
"privacy": "حریم خصوصی",
|
||||
"terms": "شرایط و ضوابط",
|
||||
"checkForUpdates": "بررسی بروزرسانی",
|
||||
"checkStatus": "بررسی وضعیت",
|
||||
"downloadUpdate": "دانلود",
|
||||
"criticalUpdateAvailable": "بهروزرسانی مهم در دسترس است",
|
||||
"updateAvailable": "بهرورزرسانی در دسترس است",
|
||||
"update": "بهروزرسانی",
|
||||
"checking": "در حال بررسی...",
|
||||
"youAreOnTheLatestVersion": "شما در حال اجرای آخرین نسخه هستید",
|
||||
"warning": "اخطار",
|
||||
@@ -225,7 +278,43 @@
|
||||
"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": "نشست های فعال",
|
||||
"terminate": "خروج",
|
||||
"thisDevice": "این دستگاه",
|
||||
"toResetVerifyEmail": "برای تنظیم مجدد رمز عبور، لطفا ابتدا ایمیل خود را تایید کنید.",
|
||||
"thisEmailIsAlreadyInUse": "این ایمیل درحال استفاده است",
|
||||
"verificationFailedPleaseTryAgain": "تایید ناموفق بود، لطفا مجددا تلاش کنید",
|
||||
"yourVerificationCodeHasExpired": "کد تایید شما باطل شد",
|
||||
"incorrectCode": "کد اشتباه",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "معظرت میخوام، کدی که شما وارد کردید اشتباه است",
|
||||
"emailChangedTo": "ایمیل عوض شد به {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "احراز هویت ناموفق بود، لطفا دوباره تلاش کنید",
|
||||
"enterPassword": "رمز عبور را وارد کنید",
|
||||
"selectExportFormat": "انتخاب فرمت استخراج",
|
||||
"encrypted": "رمزنگاری شده",
|
||||
"plainText": "متن ساده",
|
||||
"export": "صدور",
|
||||
"useOffline": "استفاده بدون پشتیبان گیری",
|
||||
"singIn": "ورود",
|
||||
"showLargeIcons": "نشان دادن ایکون های بزرگ",
|
||||
"compactMode": "حالت فشرده",
|
||||
"shouldHideCode": "کد هارا مخفی کردن",
|
||||
"doubleTapToViewHiddenCode": "شما میتونید با دوبار فشردن یه گزینه تا کد آنرا ببینید",
|
||||
"focusOnSearchBar": "در زمان شروع برنامه، در حالت جستجو باش",
|
||||
"editCodeAuthMessage": "احراز هویت برای ویرایش کد",
|
||||
"deleteCodeAuthMessage": "احراز هویت برای حذف کد",
|
||||
"showQRAuthMessage": "احراز هویت برای نمایش کد QR",
|
||||
|
||||
@@ -97,11 +97,6 @@
|
||||
"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?",
|
||||
|
||||
@@ -140,16 +140,6 @@
|
||||
"oops": "Oups",
|
||||
"suggestFeatures": "Suggérer des fonctionnalités",
|
||||
"faq": "FAQ",
|
||||
"faq_q_1": "Quelle est la sécurité de Auth?",
|
||||
"faq_a_1": "Tous les codes que vous sauvegardez via ente sont chiffrés de bout en bout. Cela signifie que vous seul pouvez accéder à vos codes. Nos applications sont open source et notre cryptographie ont fait l'objet d'un audit externe.",
|
||||
"faq_q_2": "Puis-je accéder à mes codes sur mon ordinateur ?",
|
||||
"faq_a_2": "Vous pouvez accéder à vos codes sur le web via auth.ente.io.",
|
||||
"faq_q_3": "Comment puis-je supprimer des codes ?",
|
||||
"faq_a_3": "Vous pouvez supprimer un code en glissant vers la gauche.",
|
||||
"faq_q_4": "Comment puis-je soutenir le projet ?",
|
||||
"faq_a_4": "Vous pouvez soutenir le développement de ce projet en vous abonnant à notre application Photos, ente.io.",
|
||||
"faq_q_5": "Comment puis-je activer le verrouillage FaceID dans Auth",
|
||||
"faq_a_5": "Vous pouvez activer le verrouillage FaceID dans Paramètres → Sécurité → Écran de verrouillage.",
|
||||
"somethingWentWrongMessage": "Quelque chose s'est mal passé, veuillez recommencer",
|
||||
"leaveFamily": "Quitter le plan familial",
|
||||
"leaveFamilyMessage": "Êtes-vous sûr de vouloir quitter le plan familial ?",
|
||||
@@ -487,5 +477,6 @@
|
||||
"pinLock": "Verrouillage par code PIN",
|
||||
"enterPin": "Saisir le code PIN",
|
||||
"setNewPin": "Définir un nouveau code PIN",
|
||||
"importFailureDescNew": "Impossible de lire le fichier sélectionné."
|
||||
"importFailureDescNew": "Impossible de lire le fichier sélectionné.",
|
||||
"authToViewPasskey": "Veuillez vous authentifier pour afficher la clé d'accès"
|
||||
}
|
||||
@@ -113,15 +113,6 @@
|
||||
"oops": "אופס",
|
||||
"suggestFeatures": "הציעו מאפיינים",
|
||||
"faq": "שאלות נפוצות",
|
||||
"faq_q_1": "כמה מאובטח ente Auth?",
|
||||
"faq_a_1": "כל הקודים שאתה מגבה דרך ente מאוחסנים מקצה לקצה בהצפנה. הכוונה שרק אתה יכול לגשת לקודים שלך. האפליקציות שלנו הם מפותחות דרך קוד פתוח והקריפטוגרפיה שלנו מבוקרת חיצונית.",
|
||||
"faq_q_2": "האם ישנה אפשרות להשתמש בקודים שלי במחשב?",
|
||||
"faq_a_2": "אתה יכול לגשת לקודים שלך ברשת ב- auth.ente.io.",
|
||||
"faq_q_3": "איך אפשר למחוק קודים?",
|
||||
"faq_a_3": "אתה יכול למחוק את הקוד על-ידי החלקה שמאלה על הפריט הזה.",
|
||||
"faq_q_4": "איך אפשר לתמוך בפרויקט זה?",
|
||||
"faq_a_4": "אתה יכול לתמוך בפיתוח של הפרויקט הזה על ידי שתירשם לאפליקצית תמונות שלנו ב-ente.io.",
|
||||
"faq_a_5": "אתה יכול להפעיל מנעול FaceID תחת הגדרות -> אבטחה -> מסך נעילה.",
|
||||
"somethingWentWrongMessage": "משהו השתבש, אנא נסה שנית",
|
||||
"leaveFamily": "עזוב משפחה",
|
||||
"leaveFamilyMessage": "האם אתה בטוח שאתה רוצה לעזוב את התוכנית המשפחתית?",
|
||||
|
||||
@@ -119,10 +119,6 @@
|
||||
"enterYourPasswordHint": "Masukkan sandi kamu",
|
||||
"suggestFeatures": "Sarankan fitur",
|
||||
"faq": "Tanya Jawab Umum",
|
||||
"faq_q_1": "Seberapa aman Auth itu?",
|
||||
"faq_a_1": "Semua kode yang kamu cadangkan melalui Auth disimpan menggunakan enkripsi end-to-end. Jadi hanya kamu yang dapat mengaksesnya. Aplikasi kami bersifat open source dan kriptografi kami telah diaudit oleh eksternal.",
|
||||
"faq_q_2": "Bisakah saya mengakses kode saya di desktop?",
|
||||
"faq_a_2": "Kamu dapat mengakses kodenya melalui web auth.ente.io.",
|
||||
"scan": "Pindai",
|
||||
"scanACode": "Pindai kode",
|
||||
"verify": "Verifikasi",
|
||||
|
||||
@@ -141,16 +141,6 @@
|
||||
"oops": "Oops",
|
||||
"suggestFeatures": "Suggerisci funzionalità",
|
||||
"faq": "FAQ",
|
||||
"faq_q_1": "Quanto è sicuro Auth?",
|
||||
"faq_a_1": "Tutti i codici di cui fai il backup tramite Auth sono memorizzati con crittografia end-to-end. Ciò significa che solo tu puoi accedere ai tuoi codici. Le nostre app sono open source e la nostra crittografia è stata verificata esternamente.",
|
||||
"faq_q_2": "Posso accedere ai miei codici sul desktop?",
|
||||
"faq_a_2": "Puoi accedere ai tuoi codici sul web @ auth.ente.io.",
|
||||
"faq_q_3": "Come posso cancellare i codici?",
|
||||
"faq_a_3": "Puoi eliminare un codice scorrendo il dito a sinistra sul codice in questione.",
|
||||
"faq_q_4": "Come posso supportare questo progetto?",
|
||||
"faq_a_4": "Puoi supportare lo sviluppo di questo progetto abbonandoti alla nostra app Photos @ ente.io.",
|
||||
"faq_q_5": "Come posso abilitare il blocco FaceID in Auth",
|
||||
"faq_a_5": "Puoi abilitare il blocco FaceID in Impostazioni → Sicurezza → Schermata di blocco.",
|
||||
"somethingWentWrongMessage": "Qualcosa è andato storto, per favore riprova",
|
||||
"leaveFamily": "Abbandona il piano famiglia",
|
||||
"leaveFamilyMessage": "Sei sicuro di voler uscire dal piano famiglia?",
|
||||
@@ -492,5 +482,6 @@
|
||||
"setNewPin": "Imposta un nuovo PIN",
|
||||
"importFailureDescNew": "Impossibile elaborare il file selezionato.",
|
||||
"appLockNotEnabled": "Blocco app non abilitato",
|
||||
"appLockNotEnabledDescription": "Si prega di abilitare il blocco dell'app da Sicurezza > Blocco App"
|
||||
"appLockNotEnabledDescription": "Si prega di abilitare il blocco dell'app da Sicurezza > Blocco App",
|
||||
"authToViewPasskey": "Autenticati per visualizzare le tue passkey"
|
||||
}
|
||||
@@ -123,16 +123,6 @@
|
||||
"oops": "おっと",
|
||||
"suggestFeatures": "機能を提案",
|
||||
"faq": "FAQ",
|
||||
"faq_q_1": "Authはどのくらい安全ですか?",
|
||||
"faq_a_1": "Ente Authでバックアップされたコードはすべてエンドツーエンドで暗号化されて保存されます。つまり、コードにアクセスできるのはあなただけです。当社のアプリはオープンソースであり、暗号化技術は外部監査を受けています。",
|
||||
"faq_q_2": "パソコンから私のコードにアクセスできますか?",
|
||||
"faq_a_2": "auth.ente.io で Web からコードにアクセス可能です。",
|
||||
"faq_q_3": "コードを削除するにはどうすればいいですか?",
|
||||
"faq_a_3": "その項目を左にスワイプすることでコードを削除できます。",
|
||||
"faq_q_4": "このプロジェクトを支援するにはどうすればいいですか?",
|
||||
"faq_a_4": "ente.io で私たちの写真アプリを購読することでこのプロジェクトの開発を支援できます。",
|
||||
"faq_q_5": "AuthでFaceIDロックを有効にするにはどうすればいいですか?",
|
||||
"faq_a_5": "設定→セキュリティ→画面のロックから FaceID ロックを有効にできます。",
|
||||
"somethingWentWrongMessage": "問題が発生しました、再試行してください",
|
||||
"leaveFamily": "ファミリープランから退会",
|
||||
"leaveFamilyMessage": "本当にファミリープランを退会しますか?",
|
||||
|
||||
@@ -123,16 +123,6 @@
|
||||
"oops": "Oeps",
|
||||
"suggestFeatures": "Features voorstellen",
|
||||
"faq": "Veelgestelde vragen",
|
||||
"faq_q_1": "Hoe veilig is Ente Auth?",
|
||||
"faq_a_1": "Alle codes in Auth zijn versleuteld opgeslagen met end-to-end encryptie. Dit betekent dat alleen jij toegang hebt tot je codes. Onze apps zijn open source en onze cryptografie is extern gecontroleerd.",
|
||||
"faq_q_2": "Kan ik toegang krijgen tot mijn codes op desktop?",
|
||||
"faq_a_2": "U heeft toegang tot uw codes op het web @ auth.ente.io.",
|
||||
"faq_q_3": "Hoe kan ik codes verwijderen?",
|
||||
"faq_a_3": "Je kunt een code verwijderen door naar links te vegen op dat item.",
|
||||
"faq_q_4": "Hoe kan ik dit project steunen?",
|
||||
"faq_a_4": "U kunt de ontwikkeling van dit project steunen door u te abonneren op onze Photos app @ ente.io.",
|
||||
"faq_q_5": "Hoe kan ik FaceID lock inschakelen in ente Auth",
|
||||
"faq_a_5": "Je kunt FaceID vergrendelen onder Instellingen → Beveiliging → Lockscreen.",
|
||||
"somethingWentWrongMessage": "Er is iets fout gegaan, probeer het opnieuw",
|
||||
"leaveFamily": "Familie verlaten",
|
||||
"leaveFamilyMessage": "Weet je zeker dat je het familie-plan wil verlaten?",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"incorrectDetails": "Nieprawidłowe szczegóły",
|
||||
"pleaseVerifyDetails": "Prosimy zweryfikować szczegóły i spróbować ponownie",
|
||||
"codeIssuerHint": "Wydawca",
|
||||
"codeSecretKeyHint": "Tajny Klucz",
|
||||
"codeSecretKeyHint": "Tajny klucz",
|
||||
"secret": "Sekret",
|
||||
"all": "Wszystko",
|
||||
"notes": "Notatki",
|
||||
@@ -133,7 +133,7 @@
|
||||
"settings": "Ustawienia",
|
||||
"copied": "Skopiowano",
|
||||
"pleaseTryAgain": "Prosimy spróbować ponownie",
|
||||
"existingUser": "Istniejący Użytkownik",
|
||||
"existingUser": "Istniejący użytkownik",
|
||||
"newUser": "Nowy/a do Ente",
|
||||
"delete": "Usuń",
|
||||
"enterYourPasswordHint": "Wprowadź swoje hasło",
|
||||
@@ -141,16 +141,6 @@
|
||||
"oops": "Ups",
|
||||
"suggestFeatures": "Zaproponuj funkcje",
|
||||
"faq": "Najczęściej zadawane pytania (FAQ)",
|
||||
"faq_q_1": "Jak bezpieczny jest Auth?",
|
||||
"faq_a_1": "Wszystkie kody, których tworzysz kopię zapasową za pomocą Ente są przechowywane zaszyfrowane end-to-end. Oznacza to, że tylko Ty możesz uzyskać dostęp do swoich kodów. Nasze aplikacje są otwarto-źródłowe, a nasza kryptografia została poddana zewnętrznemu audytowi.",
|
||||
"faq_q_2": "Czy mogę uzyskać dostęp do moich kodów na komputerze?",
|
||||
"faq_a_2": "Możesz uzyskać dostęp do swoich kodów na stronie auth.ente.io.",
|
||||
"faq_q_3": "Jak mogę usunąć kody?",
|
||||
"faq_a_3": "Możesz usunąć kod, przesuwając go w lewo.",
|
||||
"faq_q_4": "Jak mogę wesprzeć ten projekt?",
|
||||
"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, prosimy spróbować ponownie",
|
||||
"leaveFamily": "Opuść rodzinę",
|
||||
"leaveFamilyMessage": "Czy jesteś pewien/pewna, że chcesz opuścić plan rodzinny?",
|
||||
@@ -244,7 +234,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",
|
||||
@@ -293,7 +283,7 @@
|
||||
"weAreOpenSource": "Posiadamy otwarte źródło!",
|
||||
"privacy": "Prywatność",
|
||||
"terms": "Warunki",
|
||||
"checkForUpdates": "Sprawdź czy są dostępne nowe aktualizacje",
|
||||
"checkForUpdates": "Sprawdź, czy są dostępne nowe aktualizacje",
|
||||
"checkStatus": "Sprawdź stan",
|
||||
"downloadUpdate": "Pobierz",
|
||||
"criticalUpdateAvailable": "Dostępna jest krytyczna aktualizacja",
|
||||
@@ -459,10 +449,10 @@
|
||||
"pinnedCodeMessage": "Przypięto {code}",
|
||||
"unpinnedCodeMessage": "Odpięto {code}",
|
||||
"tags": "Etykiety",
|
||||
"createNewTag": "Utwórz Nową Etykietę",
|
||||
"createNewTag": "Utwórz nową etykietę",
|
||||
"tag": "Etykieta",
|
||||
"create": "Utwórz",
|
||||
"editTag": "Edytuj Etykietę",
|
||||
"editTag": "Edytuj etykietę",
|
||||
"deleteTagTitle": "Usunąć etykietę?",
|
||||
"deleteTagMessage": "Czy na pewno chcesz usunąć tę etykietę? Ta akcja jest nieodwracalna.",
|
||||
"somethingWentWrongParsingCode": "Nie udało się przetworzyć {x} kodów.",
|
||||
@@ -492,5 +482,6 @@
|
||||
"setNewPin": "Ustaw nowy kod PIN",
|
||||
"importFailureDescNew": "Nie udało się przetworzyć wybranego pliku.",
|
||||
"appLockNotEnabled": "Blokada aplikacji nie jest włączona",
|
||||
"appLockNotEnabledDescription": "Prosimy włączyć blokadę aplikacji z Zabezpieczenia > Blokada Aplikacji"
|
||||
"appLockNotEnabledDescription": "Prosimy włączyć blokadę aplikacji z Zabezpieczenia > Blokada Aplikacji",
|
||||
"authToViewPasskey": "Prosimy uwierzytelnić się, aby wyświetlić klucz dostępu"
|
||||
}
|
||||
@@ -141,16 +141,6 @@
|
||||
"oops": "Opa",
|
||||
"suggestFeatures": "Sugerir recursos",
|
||||
"faq": "Perguntas frequentes",
|
||||
"faq_q_1": "Quão seguro é o Auth?",
|
||||
"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 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 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. Tente outra vez",
|
||||
"leaveFamily": "Sair da família",
|
||||
"leaveFamilyMessage": "Deseja mesmo sair do plano familiar?",
|
||||
@@ -492,5 +482,6 @@
|
||||
"setNewPin": "Definir novo PIN",
|
||||
"importFailureDescNew": "Não foi possível analisar o arquivo selecionado.",
|
||||
"appLockNotEnabled": "Bloqueio de aplicativo não ativado",
|
||||
"appLockNotEnabledDescription": "Ative o bloqueio de aplicativo em Segurança > Bloqueio de aplicativo"
|
||||
"appLockNotEnabledDescription": "Ative o bloqueio de aplicativo em Segurança > Bloqueio de aplicativo",
|
||||
"authToViewPasskey": "Autentique para ver a sua chave de acesso"
|
||||
}
|
||||
@@ -101,13 +101,6 @@
|
||||
"oops": "Ups",
|
||||
"suggestFeatures": "Sugerează funcționalități",
|
||||
"faq": "Întrebări frecvente",
|
||||
"faq_q_1": "Cât de sigur este Auth?",
|
||||
"faq_q_2": "Pot accesa codurile de pe desktop?",
|
||||
"faq_q_3": "Cum pot șterge codurile?",
|
||||
"faq_q_4": "Cum pot susţine acest proiect?",
|
||||
"faq_a_4": "Poți susține dezvoltarea acestui proiect prin cumpărarea unui abonament la aplicația noastră de fotografii @ ente.io.",
|
||||
"faq_q_5": "Cum pot activa blocarea cu FaceID în Auth",
|
||||
"faq_a_5": "Poți activa blocarea FaceID din Setări → Securitate → Ecran de blocare.",
|
||||
"somethingWentWrongMessage": "Ceva n-a mers bine, te rog încearcă din nou",
|
||||
"leaveFamily": "Părăsește familia",
|
||||
"verifyEmail": "Verifică e-mail",
|
||||
|
||||
@@ -123,16 +123,6 @@
|
||||
"oops": "Ой",
|
||||
"suggestFeatures": "Предложить идеи",
|
||||
"faq": "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": "Вы уверены, что хотите отказаться от семейного плана?",
|
||||
|
||||
@@ -123,16 +123,6 @@
|
||||
"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?",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"codeIssuerHint": "Utfärdare",
|
||||
"codeSecretKeyHint": "Secret Key",
|
||||
"all": "Alla",
|
||||
"notes": "Anteckningar",
|
||||
"codeAccountHint": "Konto (du@domän.com)",
|
||||
"codeTagHint": "Tagg",
|
||||
"sessionExpired": "Sessionen har gått ut",
|
||||
@@ -77,6 +78,7 @@
|
||||
"cancel": "Avbryt",
|
||||
"yes": "Ja",
|
||||
"no": "Nej",
|
||||
"support": "Support",
|
||||
"settings": "Inställningar",
|
||||
"pleaseTryAgain": "Försök igen",
|
||||
"existingUser": "Befintlig användare",
|
||||
@@ -168,6 +170,7 @@
|
||||
"about": "Om",
|
||||
"terms": "Villkor",
|
||||
"warning": "Varning",
|
||||
"authToExportCodes": "Autentisera för att exportera dina koder",
|
||||
"importSuccessDesc": "Du har importerat {count} koder!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
@@ -183,9 +186,11 @@
|
||||
"incorrectCode": "Felaktig kod",
|
||||
"incorrectRecoveryKey": "Felaktig återställningsnyckel",
|
||||
"enterPassword": "Ange lösenord",
|
||||
"selectExportFormat": "Välj exportformat",
|
||||
"export": "Exportera",
|
||||
"signInToBackup": "Logga in för att säkerhetskopiera dina koder",
|
||||
"singIn": "Logga in",
|
||||
"showLargeIcons": "Visa stora ikoner",
|
||||
"shouldHideCode": "Dölj koder",
|
||||
"editCodeAuthMessage": "Autentisera för att redigera kod",
|
||||
"deleteCodeAuthMessage": "Autentisera för att radera kod",
|
||||
@@ -203,6 +208,7 @@
|
||||
"signOutOtherDevices": "Logga ut andra enheter",
|
||||
"passkey": "Nyckel",
|
||||
"loginSessionExpiredDetails": "Din session har upphört. Logga in igen.",
|
||||
"developerSettings": "Utvecklarinställningar",
|
||||
"tags": "Taggar",
|
||||
"createNewTag": "Skapa ny tagg",
|
||||
"tag": "Tagg",
|
||||
@@ -219,5 +225,6 @@
|
||||
"deviceLock": "Enhetslås",
|
||||
"hideContent": "Dölj innehåll",
|
||||
"enterPin": "Ange PIN-kod",
|
||||
"setNewPin": "Ställ in ny PIN-kod"
|
||||
"setNewPin": "Ställ in ny PIN-kod",
|
||||
"authToViewPasskey": "Autentisera för att visa nyckel"
|
||||
}
|
||||
@@ -120,14 +120,6 @@
|
||||
"oops": "ዉዉኡ",
|
||||
"suggestFeatures": "Suggest features",
|
||||
"faq": "FAQ",
|
||||
"faq_q_1": "Auth ክሳብ ክንደይ ውሑስ እዩ፧",
|
||||
"faq_q_2": "Can I access my codes on desktop?",
|
||||
"faq_a_2": "You can access your codes on the web @ auth.ente.io.",
|
||||
"faq_q_3": "How can I delete codes?",
|
||||
"faq_a_3": "You can delete a code by swiping left on that item.",
|
||||
"faq_q_4": "How can I support this project?",
|
||||
"faq_a_4": "You can support the development of this project by subscribing to our Photos app @ ente.io.",
|
||||
"faq_a_5": "You can enable FaceID lock under Settings → Security → Lockscreen.",
|
||||
"somethingWentWrongMessage": "Something went wrong, please try again",
|
||||
"leaveFamily": "Leave family",
|
||||
"leaveFamilyMessage": "Are you sure that you want to leave the family plan?",
|
||||
|
||||
@@ -141,16 +141,6 @@
|
||||
"oops": "Hay aksi",
|
||||
"suggestFeatures": "Özellik önerin",
|
||||
"faq": "SSS",
|
||||
"faq_q_1": "Kimlik doğrulayıcı ne kadar güvenli?",
|
||||
"faq_a_1": "Auth aracılığıyla yedeklediğiniz tüm kodlar uçtan uca şifrelenmiş olarak saklanır. Böylece kodlarınıza yalnızca siz erişebilirsiniz. Uygulamalarımız açık kaynaklıdır ve şifrelememiz dış denetimden geçmiştir.",
|
||||
"faq_q_2": "Kodlarıma masaüstünden erişebilir miyim?",
|
||||
"faq_a_2": "Kodlarınıza internet üzerinden @ auth.ente.io adresinden erişebilirsiniz.",
|
||||
"faq_q_3": "Kodları nasıl silebilirim?",
|
||||
"faq_a_3": "Bir kodu, o öğenin üzerinde sola kaydırarak silebilirsiniz.",
|
||||
"faq_q_4": "Bu projeye nasıl destek olabilirim?",
|
||||
"faq_a_4": "Fotoğraflar uygulamamıza @ ente.io abone olarak bu projenin geliştirilmesine destek olabilirsiniz.",
|
||||
"faq_q_5": "Auth'ta FaceID kilidini nasıl etkinleştirebilirim",
|
||||
"faq_a_5": "FaceID kilidini Ayarlar → Güvenlik → Kilit Ekranı altında etkinleştirebilirsiniz.",
|
||||
"somethingWentWrongMessage": "Bir şeyler ters gitti, lütfen tekrar deneyin",
|
||||
"leaveFamily": "Aile planından ayrıl",
|
||||
"leaveFamilyMessage": "Aile planından ayrılmak istediğinize emin misiniz?",
|
||||
|
||||
@@ -19,6 +19,20 @@
|
||||
"pleaseVerifyDetails": "Будь ласка, перевірте дані та повторіть спробу",
|
||||
"codeIssuerHint": "Емітент",
|
||||
"codeSecretKeyHint": "Секретний ключ",
|
||||
"secret": "Секретний ключ",
|
||||
"all": "Усі",
|
||||
"notes": "Нотатки",
|
||||
"notesLengthLimit": "Примітки можуть мати довжину не більше {count} символів",
|
||||
"@notesLengthLimit": {
|
||||
"description": "Text to indicate the maximum number of characters allowed for notes",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The maximum number of characters allowed for notes",
|
||||
"type": "int",
|
||||
"example": "100"
|
||||
}
|
||||
}
|
||||
},
|
||||
"codeAccountHint": "Обліковий запис (you@domain.com)",
|
||||
"codeTagHint": "Мітка",
|
||||
"accountKeyType": "Тип ключа",
|
||||
@@ -34,6 +48,9 @@
|
||||
"nextTotpTitle": "далі",
|
||||
"deleteCodeTitle": "Видалити код?",
|
||||
"deleteCodeMessage": "Ви впевнені, що хочете видалити цей код? Ця дія є незворотною.",
|
||||
"trashCode": "Смітник?",
|
||||
"trashCodeMessage": "Ви дійсно бажаєте смітити для {account}?",
|
||||
"trash": "Кошик",
|
||||
"viewLogsAction": "Переглянути журнали",
|
||||
"sendLogsDescription": "Це надішле журнали, щоб допомогти нам зневадити проблему. Хоча ми вживаємо запобіжні заходи для того, щоб ніяка чутлива інформація не була переслана, ми рекомендуємо вам переглянути ці журнали, перш ніж поділитися ними.",
|
||||
"preparingLogsTitle": "Підготовка журналів...",
|
||||
@@ -100,6 +117,7 @@
|
||||
"emailVerificationToggle": "Підтвердження адреси електронної пошти",
|
||||
"emailVerificationEnableWarning": "Щоб уникнути блокування доступу до свого облікового запису, обов’язково збережіть копію двофакторної аутентифікації до своєї електронної пошти за межами Ente Auth, перш ніж увімкнути перевірку електронної пошти.",
|
||||
"authToChangeEmailVerificationSetting": "Будь ласка, пройдіть аутентифікацію, щоб змінити перевірку адреси електронної пошти",
|
||||
"authenticateGeneric": "Будь ласка, авторизуйтеся",
|
||||
"authToViewYourRecoveryKey": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваш ключ відновлення",
|
||||
"authToChangeYourEmail": "Будь ласка, пройдіть аутентифікацію, щоб змінити адресу електронної пошти",
|
||||
"authToChangeYourPassword": "Будь ласка, пройдіть аутентифікацію, щоб змінити ваш пароль",
|
||||
@@ -123,20 +141,12 @@
|
||||
"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": "Ви знаходитесь на сімейному плані!",
|
||||
"hintForMobile": "Натисніть і утримуйте код для редагування чи видалення.",
|
||||
"hintForDesktop": "Клікніть правою кнопкою миші по коду для редагування чи видалення.",
|
||||
"scan": "Сканувати",
|
||||
"scanACode": "Сканувати код",
|
||||
"verify": "Перевірити",
|
||||
@@ -181,6 +191,7 @@
|
||||
"security": "Безпека",
|
||||
"lockscreen": "Екран блокування",
|
||||
"authToChangeLockscreenSetting": "Будь ласка, авторизуйтесь для зміни налаштувань екрану блокування",
|
||||
"deviceLockEnablePreSteps": "Для увімкнення блокування програми, будь ласка, налаштуйте пароль пристрою або блокування екрана в системних налаштуваннях.",
|
||||
"viewActiveSessions": "Показати активні сеанси",
|
||||
"authToViewYourActiveSessions": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваші активні сеанси",
|
||||
"searchHint": "Пошук...",
|
||||
@@ -191,6 +202,10 @@
|
||||
"scanAQrCode": "Сканувати QR-код",
|
||||
"enterDetailsManually": "Введіть дані вручну",
|
||||
"edit": "Редагувати",
|
||||
"share": "Поділитись",
|
||||
"shareCodes": "Поділитися кодами",
|
||||
"shareCodesDuration": "Виберіть тривалість, протягом якої ви хочете поділитися кодом.",
|
||||
"restore": "Відновити",
|
||||
"copiedToClipboard": "Скопійовано до буфера обміну",
|
||||
"copiedNextToClipboard": "Наступний код скопійовано до буфера обміну",
|
||||
"error": "Помилка",
|
||||
@@ -344,6 +359,7 @@
|
||||
"sigInBackupReminder": "Будь ласка, експортуйте свої коди, щоб зберегти резервну копію, з якої ви зможете їх відновити.",
|
||||
"offlineModeWarning": "Ви збираєтеся продовжити без резервних копій. Будь ласка, зробіть ручну резервну копію, щоб переконатися, що ваші коди в безпеці.",
|
||||
"showLargeIcons": "Показувати великі іконки",
|
||||
"compactMode": "Компактний режим",
|
||||
"shouldHideCode": "Приховати коди",
|
||||
"doubleTapToViewHiddenCode": "Ви можете двічі натиснути на запис для перегляду коду",
|
||||
"focusOnSearchBar": "Сфокусуватися на пошуку після запуску програми",
|
||||
@@ -464,5 +480,8 @@
|
||||
"pinLock": "PIN-код",
|
||||
"enterPin": "Введіть PIN-код",
|
||||
"setNewPin": "Встановити новий PIN-код",
|
||||
"importFailureDescNew": "Не вдалося обробити вибраний файл."
|
||||
"importFailureDescNew": "Не вдалося обробити вибраний файл.",
|
||||
"appLockNotEnabled": "Блокування програм не увімкнено",
|
||||
"appLockNotEnabledDescription": "Увімкніть блокування програм від безпеки > Блокування програм",
|
||||
"authToViewPasskey": "Будь ласка, авторизуйтеся для перегляду ключа доступу"
|
||||
}
|
||||
@@ -122,16 +122,6 @@
|
||||
"oops": "Rất tiếc",
|
||||
"suggestFeatures": "Tính năng đề nghị",
|
||||
"faq": "Câu hỏi thường gặp",
|
||||
"faq_q_1": "Mức độ an toàn của ente như thế nào?",
|
||||
"faq_a_1": "Tất cả các mã bạn sao lưu qua ente đều được lưu trữ dưới dạng mã hóa đầu cuối. Điều này có nghĩa là chỉ bạn mới có thể truy cập mã của mình. Ứng dụng của chúng tôi là mã nguồn mở và data của chúng tôi đã được bảo mật hoàn toàn.",
|
||||
"faq_q_2": "Tôi có thể truy cập mã của mình trên máy tính không?",
|
||||
"faq_a_2": "Bạn có thể truy cập mã của mình trên web @ auth.ente.io.",
|
||||
"faq_q_3": "Làm cách nào để xóa mã?",
|
||||
"faq_a_3": "Bạn có thể xóa mã bằng cách vuốt sang trái vào mục đó.",
|
||||
"faq_q_4": "Tôi có thể hỗ trợ dự án này như thế nào?",
|
||||
"faq_a_4": "Bạn có thể hỗ trợ sự phát triển của dự án này bằng cách đăng ký ứng dụng Ảnh @ ente.io của chúng tôi.",
|
||||
"faq_q_5": "Làm sao để tôi bật FaceID trong ente",
|
||||
"faq_a_5": "Bạn có thể bật khóa FaceID trong Cài đặt → Bảo mật → Màn hình khóa.",
|
||||
"somethingWentWrongMessage": "Đã xảy ra lỗi, xin thử lại",
|
||||
"leaveFamily": "Rời khỏi gia đình",
|
||||
"leaveFamilyMessage": "Bạn có chắc chắn muốn thoát khỏi gói dành cho gia đình không?",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "妥善保管您的 2FA代码",
|
||||
"onBoardingBody": "妥善保管您的两步验证码",
|
||||
"onBoardingGetStarted": "开始",
|
||||
"setupFirstAccount": "设置您的第一个账户",
|
||||
"importScanQrCode": "扫描二维码",
|
||||
@@ -18,8 +18,8 @@
|
||||
"incorrectDetails": "详细信息不正确",
|
||||
"pleaseVerifyDetails": "请验证详细信息并重试",
|
||||
"codeIssuerHint": "发行人",
|
||||
"codeSecretKeyHint": "私钥",
|
||||
"secret": "秘密",
|
||||
"codeSecretKeyHint": "密钥",
|
||||
"secret": "密钥",
|
||||
"all": "全部",
|
||||
"notes": "备注",
|
||||
"notesLengthLimit": "备注最多可以包含 {count} 个字符",
|
||||
@@ -88,8 +88,8 @@
|
||||
"useRecoveryKey": "使用恢复密钥",
|
||||
"incorrectPasswordTitle": "密码错误",
|
||||
"welcomeBack": "欢迎回来!",
|
||||
"madeWithLoveAtPrefix": "用❤️制成 ",
|
||||
"supportDevs": "订阅 <bold-green>ente</bold-green> 以支持此项目。",
|
||||
"madeWithLoveAtPrefix": "用❤️制作 ",
|
||||
"supportDevs": "订阅 <bold-green>ente</bold-green> 以支持我们",
|
||||
"supportDiscount": "使用优惠码“AUTH”可享受首年 10% 折扣",
|
||||
"changeEmail": "修改邮箱",
|
||||
"changePassword": "修改密码",
|
||||
@@ -112,10 +112,10 @@
|
||||
"exportCodes": "导出代码",
|
||||
"importLabel": "导入",
|
||||
"importInstruction": "请选择一个包含以下格式的代码列表的文件",
|
||||
"importCodeDelimiterInfo": "代码可以用逗号或新行分隔。",
|
||||
"importCodeDelimiterInfo": "代码可以用逗号或换行符分隔",
|
||||
"selectFile": "选择文件",
|
||||
"emailVerificationToggle": "电子邮件验证",
|
||||
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件双重验证的副本。",
|
||||
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件两步验证的副本。",
|
||||
"authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证",
|
||||
"authenticateGeneric": "请验证",
|
||||
"authToViewYourRecoveryKey": "请验证以查看您的恢复密钥",
|
||||
@@ -141,16 +141,6 @@
|
||||
"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": "我如何启用 Auth 中的面容 ID 锁",
|
||||
"faq_a_5": "您可以在“设置”→“安全”→“锁屏”下启用 FaceID 锁定。",
|
||||
"somethingWentWrongMessage": "出了点问题,请重试",
|
||||
"leaveFamily": "离开家庭",
|
||||
"leaveFamilyMessage": "您确定要离开家庭计划吗?",
|
||||
@@ -163,8 +153,8 @@
|
||||
"verifyEmail": "验证电子邮件",
|
||||
"enterCodeHint": "从你的身份验证器应用中\n输入6位数字代码",
|
||||
"lostDeviceTitle": "丢失了设备吗?",
|
||||
"twoFactorAuthTitle": "双重认证",
|
||||
"passkeyAuthTitle": "通行密钥认证",
|
||||
"twoFactorAuthTitle": "两步验证",
|
||||
"passkeyAuthTitle": "通行密钥验证",
|
||||
"verifyPasskey": "验证通行密钥",
|
||||
"recoverAccount": "恢复账户",
|
||||
"enterRecoveryKeyHint": "输入您的恢复密钥",
|
||||
@@ -185,7 +175,7 @@
|
||||
"deleteAccount": "删除账户",
|
||||
"deleteAccountQuery": "我们很抱歉看到您离开。您面临一些问题?",
|
||||
"yesSendFeedbackAction": "是,发送反馈",
|
||||
"noDeleteAccountAction": "不,删除账户",
|
||||
"noDeleteAccountAction": "否,删除账户",
|
||||
"initiateAccountDeleteTitle": "请进行身份验证以启动账户删除",
|
||||
"sendEmail": "发送电子邮件",
|
||||
"createNewAccount": "创建新账号",
|
||||
@@ -194,10 +184,10 @@
|
||||
"moderateStrength": "中等",
|
||||
"confirmPassword": "请确认密码",
|
||||
"close": "关闭",
|
||||
"oopsSomethingWentWrong": "哎呀,似乎出了点问题.",
|
||||
"oopsSomethingWentWrong": "哎呀,出了点问题。",
|
||||
"selectLanguage": "选择语言",
|
||||
"language": "语言",
|
||||
"social": "社交",
|
||||
"social": "社交媒体",
|
||||
"security": "安全",
|
||||
"lockscreen": "锁屏",
|
||||
"authToChangeLockscreenSetting": "请验证以更改锁屏设置",
|
||||
@@ -207,7 +197,7 @@
|
||||
"searchHint": "搜索...",
|
||||
"search": "搜索",
|
||||
"sorryUnableToGenCode": "对不起,无法为 {issuerName} 生成代码",
|
||||
"noResult": "没有结果",
|
||||
"noResult": "无结果",
|
||||
"addCode": "添加代码",
|
||||
"scanAQrCode": "扫描二维码",
|
||||
"enterDetailsManually": "手动输入详细信息",
|
||||
@@ -245,7 +235,7 @@
|
||||
"password": "密码",
|
||||
"signUpTerms": "我同意 <u-terms>服务条款</u-terms> 和 <u-policy>隐私政策</u-policy>",
|
||||
"privacyPolicyTitle": "隐私政策",
|
||||
"termsOfServicesTitle": "使用条款",
|
||||
"termsOfServicesTitle": "服务条款",
|
||||
"encryption": "加密",
|
||||
"setPasswordTitle": "设置密码",
|
||||
"changePasswordTitle": "修改密码",
|
||||
@@ -290,9 +280,9 @@
|
||||
"networkConnectionRefusedErr": "无法连接到 Ente,请稍后重试。如果错误仍然存在,请联系支持人员。",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "看起来出了点问题。 请稍后重试。 如果错误仍然存在,请联系我们的支持团队。",
|
||||
"about": "关于",
|
||||
"weAreOpenSource": "我们是开源的 !",
|
||||
"weAreOpenSource": "我们是开源的!",
|
||||
"privacy": "隐私",
|
||||
"terms": "使用条款",
|
||||
"terms": "条款",
|
||||
"checkForUpdates": "检查更新",
|
||||
"checkStatus": "检查状态",
|
||||
"downloadUpdate": "下载",
|
||||
@@ -320,7 +310,7 @@
|
||||
}
|
||||
},
|
||||
"sorry": "抱歉",
|
||||
"importFailureDesc": "无法解析选定的文件。\n如果您需要帮助,请写入support@ente.io!",
|
||||
"importFailureDesc": "无法解析所选文件。\n如果您需要帮助,请发邮件给 support@ente.io!",
|
||||
"pendingSyncs": "警告",
|
||||
"pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在登出之前备份这些代码。",
|
||||
"checkInboxAndSpamFolder": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证",
|
||||
@@ -353,7 +343,7 @@
|
||||
"emailChangedTo": "电子邮件已更改为 {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "认证失败,请重试",
|
||||
"authenticationSuccessful": "认证成功!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "双重认证已成功重置",
|
||||
"twofactorAuthenticationSuccessfullyReset": "两步验证已成功重置",
|
||||
"incorrectRecoveryKey": "恢复密钥不正确",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "您输入的恢复密钥不正确",
|
||||
"enterPassword": "输入密码",
|
||||
@@ -377,7 +367,7 @@
|
||||
"minimizeAppOnCopy": "复制时最小化应用",
|
||||
"editCodeAuthMessage": "编辑代码需要身份验证",
|
||||
"deleteCodeAuthMessage": "删除代码需要身份验证",
|
||||
"showQRAuthMessage": "显示QR码需要身份验证",
|
||||
"showQRAuthMessage": "显示二维码需要身份验证",
|
||||
"confirmAccountDeleteTitle": "确认删除账户",
|
||||
"confirmAccountDeleteMessage": "如果您使用其他 Ente 应用程序,该账户将会与其他应用程序链接。\n\n在所有 Ente 应用程序中,您上传的数据将被安排用于删除,并且您的账户将被永久删除。",
|
||||
"androidBiometricHint": "验证身份",
|
||||
@@ -492,5 +482,6 @@
|
||||
"setNewPin": "设置新 PIN 码",
|
||||
"importFailureDescNew": "无法解析选定的文件。",
|
||||
"appLockNotEnabled": "应用锁未启用",
|
||||
"appLockNotEnabledDescription": "请从“安全”>“应用锁”启用应用锁"
|
||||
"appLockNotEnabledDescription": "请从“安全”>“应用锁”启用应用锁",
|
||||
"authToViewPasskey": "请验证身份以查看通行密钥"
|
||||
}
|
||||
@@ -23,6 +23,7 @@ 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/directory_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';
|
||||
@@ -76,6 +77,9 @@ void main() async {
|
||||
size: WindowListenerService.instance.getWindowSize(),
|
||||
);
|
||||
await windowManager.waitUntilReadyToShow(windowOptions, () async {
|
||||
if (Platform.isWindows || Platform.isLinux) {
|
||||
await DirectoryUtils.migrateNamingChanges();
|
||||
}
|
||||
await windowManager.show();
|
||||
await windowManager.focus();
|
||||
initSystemTray().ignore();
|
||||
|
||||
@@ -338,8 +338,8 @@ class _HomePageState extends State<HomePage> {
|
||||
_searchText = _textController.text;
|
||||
|
||||
// Request focus on the search box
|
||||
// For Windows only for now. "Platform.isWindows" can be removed if other platforms has been tested.
|
||||
if (Platform.isWindows) {
|
||||
// For Windows and macOS only for now. This if statement can be removed if other platforms has been tested.
|
||||
if (Platform.isWindows || Platform.isMacOS) {
|
||||
searchBoxFocusNode.requestFocus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,8 +181,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
||||
return '日本語';
|
||||
case 'ko':
|
||||
return '한국어';
|
||||
case 'ar':
|
||||
return 'العربية';
|
||||
case 'fa':
|
||||
return 'فارسی';
|
||||
default:
|
||||
|
||||
@@ -10,14 +10,17 @@ import 'package:ente_auth/services/user_service.dart';
|
||||
import 'package:ente_auth/theme/ente_theme.dart';
|
||||
import 'package:ente_auth/ui/account/request_pwd_verification_page.dart';
|
||||
import 'package:ente_auth/ui/account/sessions_page.dart';
|
||||
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
|
||||
import 'package:ente_auth/ui/components/captioned_text_widget.dart';
|
||||
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/models/button_result.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/lock_screen_settings.dart';
|
||||
import 'package:ente_auth/utils/navigation_util.dart';
|
||||
import 'package:ente_auth/utils/platform_util.dart';
|
||||
import 'package:ente_auth/utils/toast_util.dart';
|
||||
@@ -146,10 +149,27 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
||||
trailingIcon: Icons.chevron_right_outlined,
|
||||
trailingIconIsMuted: true,
|
||||
onTap: () async {
|
||||
ButtonResult? result;
|
||||
if (_config.hasOptedForOfflineMode() &&
|
||||
LockScreenSettings.instance.getOfflineModeWarningStatus()) {
|
||||
result = await showChoiceActionSheet(
|
||||
context,
|
||||
title: context.l10n.warning,
|
||||
body: context.l10n.appLockOfflineModeWarning,
|
||||
secondButtonLabel: context.l10n.cancel,
|
||||
firstButtonLabel: context.l10n.ok,
|
||||
);
|
||||
if (result?.action == ButtonAction.first) {
|
||||
await LockScreenSettings.instance
|
||||
.setOfflineModeWarningStatus(false);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (await Configuration.instance.shouldShowLockScreen()) {
|
||||
final bool result = await requestAuthentication(
|
||||
context,
|
||||
context.l10n.about,
|
||||
context.l10n.authToChangeLockscreenSetting,
|
||||
);
|
||||
if (result) {
|
||||
await Navigator.of(context).push(
|
||||
|
||||
@@ -33,6 +33,9 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
int remainingTimeInSeconds = 0;
|
||||
final _lockscreenSetting = LockScreenSettings.instance;
|
||||
late Brightness _platformBrightness;
|
||||
final bool hasOptedForOfflineMode =
|
||||
Configuration.instance.hasOptedForOfflineMode();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_logger.info("initiatingState");
|
||||
@@ -53,13 +56,15 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.logout_outlined),
|
||||
color: Theme.of(context).iconTheme.color,
|
||||
onPressed: () {
|
||||
_onLogoutTapped(context);
|
||||
},
|
||||
),
|
||||
leading: hasOptedForOfflineMode
|
||||
? const SizedBox.shrink()
|
||||
: IconButton(
|
||||
icon: const Icon(Icons.logout_outlined),
|
||||
color: Theme.of(context).iconTheme.color,
|
||||
onPressed: () {
|
||||
_onLogoutTapped(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
body: GestureDetector(
|
||||
onTap: () {
|
||||
|
||||
@@ -1,12 +1,129 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:xdg_directories/xdg_directories.dart';
|
||||
|
||||
class DirectoryUtils {
|
||||
static Future<String> getDatabasePath(String databaseName) async => p.joinAll(
|
||||
[
|
||||
static final logger = Logger('DirectoryUtils');
|
||||
|
||||
static Future<String> getDatabasePath(String databaseName) async {
|
||||
String? directoryPath;
|
||||
|
||||
if (Platform.isLinux) {
|
||||
try {
|
||||
directoryPath = dataHome.path;
|
||||
} catch (e) {
|
||||
logger.warning("Failed to get dataHome: $e");
|
||||
}
|
||||
}
|
||||
|
||||
directoryPath ??= (await getLibraryDirectory()).path;
|
||||
|
||||
return p.joinAll(
|
||||
[
|
||||
directoryPath,
|
||||
"enteauth",
|
||||
".$databaseName",
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
static Future<Directory> getDirectoryForInit() async {
|
||||
Directory? directory;
|
||||
if (Platform.isLinux) {
|
||||
try {
|
||||
return cacheHome;
|
||||
} catch (e) {
|
||||
logger.warning("Failed to get cacheHome: $e");
|
||||
}
|
||||
}
|
||||
|
||||
directory ??= await getApplicationDocumentsDirectory();
|
||||
|
||||
return Directory(p.join(directory.path, "enteauthinit"));
|
||||
}
|
||||
|
||||
static Future<Directory> getTempsDir() async {
|
||||
return await getTemporaryDirectory();
|
||||
}
|
||||
|
||||
static String migratedNamingChanges = "migrated_naming_changes.b5";
|
||||
static migrateNamingChanges() async {
|
||||
final sharedPrefs = await SharedPreferences.getInstance();
|
||||
if (sharedPrefs.containsKey(migratedNamingChanges)) {
|
||||
return;
|
||||
}
|
||||
final databaseFile = File(
|
||||
p.join(
|
||||
(await getApplicationDocumentsDirectory()).path,
|
||||
"ente",
|
||||
".ente.authenticator.db",
|
||||
),
|
||||
);
|
||||
final offlineDatabaseFile = File(
|
||||
p.join(
|
||||
(await getApplicationDocumentsDirectory()).path,
|
||||
"ente",
|
||||
".ente.offline_authenticator.db",
|
||||
),
|
||||
);
|
||||
Directory oldDataDir;
|
||||
Directory newDataDir;
|
||||
|
||||
if (Platform.isLinux) {
|
||||
oldDataDir = Directory(
|
||||
p.join(dataHome.path, "ente_auth"),
|
||||
);
|
||||
newDataDir = Directory(
|
||||
p.join(dataHome.path, "enteauth"),
|
||||
);
|
||||
} else {
|
||||
oldDataDir = Directory(
|
||||
p.join(
|
||||
(await getApplicationDocumentsDirectory()).path,
|
||||
"ente",
|
||||
".$databaseName",
|
||||
),
|
||||
);
|
||||
newDataDir = Directory(
|
||||
p.join(
|
||||
(await getApplicationSupportDirectory()).path,
|
||||
),
|
||||
);
|
||||
}
|
||||
await newDataDir.create(recursive: true);
|
||||
|
||||
File newDatabaseFile =
|
||||
File(p.join(newDataDir.path, ".ente.authenticator.db"));
|
||||
if (await databaseFile.exists() && !await newDatabaseFile.exists()) {
|
||||
await databaseFile.copy(newDatabaseFile.path);
|
||||
}
|
||||
|
||||
File newOfflineDatabaseFile =
|
||||
File(p.join(newDataDir.path, ".ente.offline_authenticator.db"));
|
||||
if (await offlineDatabaseFile.exists() &&
|
||||
!await newOfflineDatabaseFile.exists()) {
|
||||
await offlineDatabaseFile.copy(newOfflineDatabaseFile.path);
|
||||
}
|
||||
|
||||
if (Platform.isLinux && await oldDataDir.exists()) {
|
||||
// execute shell command to recursively copy old data dir to new data dir
|
||||
final result = await Process.run(
|
||||
"cp",
|
||||
[
|
||||
"-r",
|
||||
oldDataDir.path,
|
||||
newDataDir.path,
|
||||
],
|
||||
);
|
||||
if (result.exitCode != 0) {
|
||||
logger.warning("Failed to copy old data dir to new data dir");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sharedPrefs.setBool(migratedNamingChanges, true).ignore();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'package:ente_auth/ui/components/dialog_widget.dart';
|
||||
import 'package:ente_auth/ui/components/models/button_type.dart';
|
||||
import 'package:ente_auth/ui/tools/debug/log_file_viewer.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/directory_utils.dart';
|
||||
import 'package:ente_auth/utils/platform_util.dart';
|
||||
import 'package:ente_auth/utils/share_utils.dart';
|
||||
import 'package:ente_auth/utils/toast_util.dart';
|
||||
@@ -146,7 +147,7 @@ Future<String> getZippedLogsFile(BuildContext context) async {
|
||||
await dialog.show();
|
||||
final logsPath = (await getApplicationSupportDirectory()).path;
|
||||
final logsDirectory = Directory("$logsPath/logs");
|
||||
final tempPath = (await getTemporaryDirectory()).path;
|
||||
final tempPath = (await DirectoryUtils.getTempsDir()).path;
|
||||
final zipFilePath =
|
||||
"$tempPath/logs-${Configuration.instance.getUserID() ?? 0}.zip";
|
||||
final encoder = ZipFileEncoder();
|
||||
|
||||
@@ -23,6 +23,8 @@ class LockScreenSettings {
|
||||
static const keyAppLockSet = "ls_is_app_lock_set";
|
||||
static const keyHasMigratedLockScreenChanges =
|
||||
"ls_has_migrated_lock_screen_changes";
|
||||
static const keyShowOfflineModeWarning = "ls_show_offline_mode_warning";
|
||||
|
||||
final List<Duration> autoLockDurations = const [
|
||||
Duration(milliseconds: 650),
|
||||
Duration(seconds: 5),
|
||||
@@ -47,6 +49,14 @@ class LockScreenSettings {
|
||||
await runLockScreenChangesMigration();
|
||||
}
|
||||
|
||||
Future<void> setOfflineModeWarningStatus(bool value) async {
|
||||
await _preferences.setBool(keyShowOfflineModeWarning, value);
|
||||
}
|
||||
|
||||
bool getOfflineModeWarningStatus() {
|
||||
return _preferences.getBool(keyShowOfflineModeWarning) ?? true;
|
||||
}
|
||||
|
||||
Future<void> runLockScreenChangesMigration() async {
|
||||
if (_preferences.getBool(keyHasMigratedLockScreenChanges) != null) {
|
||||
return;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:desktop_webview_window/desktop_webview_window.dart';
|
||||
import 'package:ente_auth/ui/common/web_page.dart';
|
||||
import 'package:file_saver/file_saver.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
@@ -31,17 +30,7 @@ class PlatformUtil {
|
||||
|
||||
static openWebView(BuildContext context, String title, String url) async {
|
||||
if (PlatformUtil.isDesktop()) {
|
||||
if (!await WebviewWindow.isWebviewAvailable()) {
|
||||
await launchUrlString(url);
|
||||
return;
|
||||
}
|
||||
|
||||
final webview = await WebviewWindow.create(
|
||||
configuration: CreateConfiguration(
|
||||
title: title,
|
||||
),
|
||||
);
|
||||
webview.launch(url);
|
||||
await launchUrlString(url);
|
||||
return;
|
||||
}
|
||||
await Navigator.of(context).push(
|
||||
|
||||
@@ -4,7 +4,7 @@ project(runner LANGUAGES CXX)
|
||||
|
||||
# The name of the executable created for the application. Change this to change
|
||||
# the on-disk name of your application.
|
||||
set(BINARY_NAME "ente_auth")
|
||||
set(BINARY_NAME "enteauth")
|
||||
# The unique GTK application identifier for this application. See:
|
||||
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
|
||||
set(APPLICATION_ID "io.ente.auth")
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <desktop_webview_window/desktop_webview_window_plugin.h>
|
||||
#include <file_saver/file_saver_plugin.h>
|
||||
#include <flutter_local_authentication/flutter_local_authentication_plugin.h>
|
||||
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
|
||||
@@ -20,9 +19,6 @@
|
||||
#include <window_manager/window_manager_plugin.h>
|
||||
|
||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||
g_autoptr(FlPluginRegistrar) desktop_webview_window_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopWebviewWindowPlugin");
|
||||
desktop_webview_window_plugin_register_with_registrar(desktop_webview_window_registrar);
|
||||
g_autoptr(FlPluginRegistrar) file_saver_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSaverPlugin");
|
||||
file_saver_plugin_register_with_registrar(file_saver_registrar);
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
desktop_webview_window
|
||||
file_saver
|
||||
flutter_local_authentication
|
||||
flutter_secure_storage_linux
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
display_name: Auth
|
||||
display_name: Ente Auth
|
||||
package_name: enteauth
|
||||
license: GPLv3
|
||||
|
||||
metainfo: linux/packaging/ente_auth.appdata.xml
|
||||
metainfo: linux/packaging/enteauth.appdata.xml
|
||||
|
||||
icon: assets/icons/auth-icon.png
|
||||
|
||||
@@ -26,9 +27,9 @@ startup_notify: false
|
||||
# include:
|
||||
# - libcurl.so.4
|
||||
include:
|
||||
- libffi.so.8
|
||||
- libtiff.so.5
|
||||
- libjpeg.so.8
|
||||
- libffi.so.8
|
||||
- libtiff.so.5
|
||||
- libjpeg.so.8
|
||||
|
||||
supported_mime_type:
|
||||
- x-scheme-handler/enteauth
|
||||
- x-scheme-handler/enteauth
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
display_name: Auth
|
||||
package_name: auth
|
||||
display_name: Ente Auth
|
||||
package_name: enteauth
|
||||
include_build_number: false
|
||||
|
||||
maintainer:
|
||||
name: Ente.io Developers
|
||||
email: auth@ente.io
|
||||
@@ -10,7 +12,7 @@ license: GPLv3
|
||||
icon: assets/icons/auth-icon.png
|
||||
installed_size: 36000
|
||||
|
||||
metainfo: linux/packaging/ente_auth.appdata.xml
|
||||
metainfo: linux/packaging/enteauth.appdata.xml
|
||||
|
||||
dependencies:
|
||||
- libwebkit2gtk-4.0-37
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>ente_auth</id>
|
||||
<id>enteauth</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>AGPL-3.0</project_license>
|
||||
<name>Ente Auth</name>
|
||||
<summary>Open source 2FA authenticator, with end-to-end encrypted backups</summary>
|
||||
<summary>FOSS, cross-platform 2FA app</summary>
|
||||
<description>
|
||||
<p>Auth provides end-to-end encrypted cloud backups so you don't have to worry about losing your tokens. Our cryptography has been externally audited.</p>
|
||||
<p>Auth has an app for every platform. Mobile, desktop and web. Your codes sync across all your devices, end-to-end encrypted.</p>
|
||||
<p>Auth also comes with Offline mode, tags, icons, pins, import/export and more</p>
|
||||
</description>
|
||||
<launchable type="desktop-id">ente_auth.desktop</launchable>
|
||||
<launchable type="desktop-id">enteauth.desktop</launchable>
|
||||
<url type="homepage">https://ente.io/auth</url>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
@@ -18,14 +18,18 @@
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release version="3.0.12" date="2024-06-17"/>
|
||||
<release version="4.0.3" date="2024-10-08" />
|
||||
</releases>
|
||||
<provides>
|
||||
<id>ente_auth.desktop</id>
|
||||
<id>enteauth.desktop</id>
|
||||
</provides>
|
||||
<content_rating type="oars-1.0" />
|
||||
<developer id="io.github.ente-io.ente">
|
||||
<name>Ente.io Developers</name>
|
||||
</developer>
|
||||
<update_contact>auth@ente.io</update_contact>
|
||||
<branding>
|
||||
<color type="primary" scheme_preference="light">#ffffff</color>
|
||||
<color type="primary" scheme_preference="dark">#000000</color>
|
||||
</branding>
|
||||
</component>
|
||||
@@ -1,5 +1,5 @@
|
||||
display_name: Auth
|
||||
package_name: auth
|
||||
display_name: Ente Auth
|
||||
package_name: enteauth
|
||||
maintainer:
|
||||
name: Ente.io Developers
|
||||
email: auth@ente.io
|
||||
@@ -8,7 +8,7 @@ licenses:
|
||||
icon: assets/icons/auth-icon.png
|
||||
installed_size: 36000
|
||||
|
||||
metainfo: linux/packaging/ente_auth.appdata.xml
|
||||
metainfo: linux/packaging/enteauth.appdata.xml
|
||||
|
||||
dependencies:
|
||||
- c-ares
|
||||
@@ -47,12 +47,12 @@ postinstall_scripts:
|
||||
|
||||
postupgrade_scripts:
|
||||
- post_install
|
||||
|
||||
|
||||
postremove_scripts:
|
||||
- gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
|
||||
- update-desktop-database -q
|
||||
- if [ -e /usr/lib/libsodium.so.23 ]; then
|
||||
- rm /usr/lib/libsodium.so.23
|
||||
- rm /usr/lib/libsodium.so.23
|
||||
- fi
|
||||
|
||||
startup_notify: false
|
||||
startup_notify: false
|
||||
|
||||
@@ -6,10 +6,12 @@ packager: Ente.io Developers
|
||||
packagerEmail: auth@ente.io
|
||||
license: GPLv3
|
||||
url: https://github.com/ente-io/ente
|
||||
package_name: enteauth
|
||||
include_build_number: false
|
||||
|
||||
display_name: Auth
|
||||
|
||||
metainfo: linux/packaging/ente_auth.appdata.xml
|
||||
metainfo: linux/packaging/enteauth.appdata.xml
|
||||
|
||||
requires:
|
||||
- libsqlite3x
|
||||
|
||||
@@ -7,7 +7,6 @@ import Foundation
|
||||
|
||||
import app_links
|
||||
import connectivity_plus
|
||||
import desktop_webview_window
|
||||
import device_info_plus
|
||||
import file_saver
|
||||
import flutter_inappwebview_macos
|
||||
@@ -31,7 +30,6 @@ import window_manager
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin"))
|
||||
ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin"))
|
||||
DesktopWebviewWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewWindowPlugin"))
|
||||
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||
FileSaverPlugin.register(with: registry.registrar(forPlugin: "FileSaverPlugin"))
|
||||
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
|
||||
|
||||
@@ -12,7 +12,7 @@ PODS:
|
||||
- FlutterMacOS
|
||||
- flutter_inappwebview_macos (0.0.1):
|
||||
- FlutterMacOS
|
||||
- OrderedSet (~> 5.0)
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_local_authentication (1.2.0):
|
||||
- FlutterMacOS
|
||||
- flutter_local_notifications (0.0.1):
|
||||
@@ -23,7 +23,7 @@ PODS:
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- OrderedSet (5.0.0)
|
||||
- OrderedSet (6.0.3)
|
||||
- package_info_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- path_provider_foundation (0.0.1):
|
||||
@@ -31,11 +31,11 @@ PODS:
|
||||
- FlutterMacOS
|
||||
- screen_retriever (0.0.1):
|
||||
- FlutterMacOS
|
||||
- Sentry/HybridSDK (8.33.0)
|
||||
- sentry_flutter (8.7.0):
|
||||
- Sentry/HybridSDK (8.36.0)
|
||||
- sentry_flutter (8.9.0):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- Sentry/HybridSDK (= 8.33.0)
|
||||
- Sentry/HybridSDK (= 8.36.0)
|
||||
- share_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
@@ -153,21 +153,21 @@ EXTERNAL SOURCES:
|
||||
SPEC CHECKSUMS:
|
||||
app_links: 10e0a0ab602ffaf34d142cd4862f29d34b303b2a
|
||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||
desktop_webview_window: d4365e71bcd4e1aa0c14cf0377aa24db0c16a7e2
|
||||
desktop_webview_window: 89bb3d691f4c80314a10be312f4cd35db93a9d5a
|
||||
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
||||
file_saver: 44e6fbf666677faf097302460e214e977fdd977b
|
||||
flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d
|
||||
flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b
|
||||
flutter_local_authentication: 85674893931e1c9cfa7c9e4f5973cb8c56b018b0
|
||||
flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4
|
||||
flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9
|
||||
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
|
||||
Sentry: 8560050221424aef0bebc8e31eedf00af80f90a6
|
||||
sentry_flutter: e26b861f744e5037a3faf9bf56603ec65d658a61
|
||||
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
|
||||
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe
|
||||
share_plus: 36537c04ce0c3e3f5bd297ce4318b6d5ee5fd6cf
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sodium_libs: d39bd76697736cb11ce4a0be73b9b4bc64466d6f
|
||||
@@ -175,7 +175,7 @@ SPEC CHECKSUMS:
|
||||
sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb
|
||||
sqlite3_flutter_libs: 5ca46c1a04eddfbeeb5b16566164aa7ad1616e7b
|
||||
tray_manager: 9064e219c56d75c476e46b9a21182087930baf90
|
||||
url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399
|
||||
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
|
||||
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
|
||||
|
||||
PODFILE CHECKSUM: f401c31c8f7c5571f6f565c78915d54338812dab
|
||||
|
||||
@@ -3,6 +3,13 @@ import FlutterMacOS
|
||||
|
||||
@main
|
||||
class AppDelegate: FlutterAppDelegate {
|
||||
override func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
|
||||
if !flag {
|
||||
sender.windows.first?.makeKeyAndOrderFront(self)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
f51f5c3bcecb0339dc02189e9dd2c2c8
|
||||
63075f3921b1df645993e992917c21d5
|
||||
@@ -5,10 +5,15 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
|
||||
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "67.0.0"
|
||||
version: "72.0.0"
|
||||
_macros:
|
||||
dependency: transitive
|
||||
description: dart
|
||||
source: sdk
|
||||
version: "0.3.2"
|
||||
adaptive_theme:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -21,26 +26,26 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
|
||||
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.4.1"
|
||||
version: "6.7.0"
|
||||
ansicolor:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ansicolor
|
||||
sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880"
|
||||
sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
version: "2.0.3"
|
||||
app_links:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: app_links
|
||||
sha256: f04c3ca96426baba784c736a201926bd4145524c36a1b38942a351b033305e21
|
||||
sha256: ad1a6d598e7e39b46a34f746f9a8b011ee147e4c275d407fa457e7a62f84dd99
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.2.1"
|
||||
version: "6.3.2"
|
||||
app_links_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -165,18 +170,18 @@ packages:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7"
|
||||
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.11"
|
||||
version: "2.4.13"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe
|
||||
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.3.1"
|
||||
version: "7.3.2"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -253,10 +258,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: confetti
|
||||
sha256: "979aafde2428c53947892c95eb244466c109c129b7eee9011f0a66caaca52267"
|
||||
sha256: "79376a99648efbc3f23582f5784ced0fe239922bd1a0fb41f582051eba750751"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.0"
|
||||
version: "0.8.0"
|
||||
connectivity_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -293,10 +298,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||
sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
version: "3.0.5"
|
||||
csslib:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -309,10 +314,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
|
||||
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.6"
|
||||
version: "2.3.7"
|
||||
dbus:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -321,15 +326,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.10"
|
||||
desktop_webview_window:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "packages/desktop_webview_window"
|
||||
ref: main
|
||||
resolved-ref: "726d8281a244d56ab36e843f0427c48de6d9cc56"
|
||||
url: "https://github.com/MixinNetwork/flutter-plugins"
|
||||
source: git
|
||||
version: "0.2.4"
|
||||
device_info_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -342,18 +338,26 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: device_info_plus_platform_interface
|
||||
sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64
|
||||
sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
version: "7.0.1"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dio
|
||||
sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5"
|
||||
sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.4.3+1"
|
||||
version: "5.7.0"
|
||||
dio_web_adapter:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dio_web_adapter
|
||||
sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
dotted_border:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -391,10 +395,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: event_bus
|
||||
sha256: "44baa799834f4c803921873e7446a2add0f3efa45e101a054b1f0ab9b95f8edc"
|
||||
sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
version: "2.0.1"
|
||||
expandable:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -423,10 +427,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: ffi
|
||||
sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
|
||||
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
version: "2.1.3"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -447,10 +451,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: file_saver
|
||||
sha256: bdebc720e17b3e01aba59da69b6d47020a7e5ba7d5c75bd9194f9618d5f16ef4
|
||||
sha256: "017a127de686af2d2fbbd64afea97052d95f2a0f87d19d25b87e097407bf9c1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.12"
|
||||
version: "0.2.14"
|
||||
fixnum:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -516,18 +520,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_inappwebview
|
||||
sha256: "3e9a443a18ecef966fb930c3a76ca5ab6a7aafc0c7b5e14a4a850cf107b09959"
|
||||
sha256: "93cfcca02bdda4b26cd700cf70d9ddba09d8348e3e8f2857638c23ed23a4fcb4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.0"
|
||||
version: "6.1.4"
|
||||
flutter_inappwebview_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_android
|
||||
sha256: d247f6ed417f1f8c364612fa05a2ecba7f775c8d0c044c1d3b9ee33a6515c421
|
||||
sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.13"
|
||||
version: "1.1.3"
|
||||
flutter_inappwebview_internal_annotations:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -540,42 +544,50 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_ios
|
||||
sha256: f363577208b97b10b319cd0c428555cd8493e88b468019a8c5635a0e4312bd0f
|
||||
sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.13"
|
||||
version: "1.1.2"
|
||||
flutter_inappwebview_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_macos
|
||||
sha256: b55b9e506c549ce88e26580351d2c71d54f4825901666bd6cfa4be9415bb2636
|
||||
sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.11"
|
||||
version: "1.1.2"
|
||||
flutter_inappwebview_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_platform_interface
|
||||
sha256: "545fd4c25a07d2775f7d5af05a979b2cac4fbf79393b0a7f5d33ba39ba4f6187"
|
||||
sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.10"
|
||||
version: "1.3.0+1"
|
||||
flutter_inappwebview_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_web
|
||||
sha256: d8c680abfb6fec71609a700199635d38a744df0febd5544c5a020bd73de8ee07
|
||||
sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.8"
|
||||
version: "1.1.2"
|
||||
flutter_inappwebview_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_windows
|
||||
sha256: "95ebc65aecfa63b2084c822aec6ba0545f0a0afaa3899f2c752ec96c09108db5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.0+2"
|
||||
flutter_launcher_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_launcher_icons
|
||||
sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
|
||||
sha256: "619817c4b65b322b5104b6bb6dfe6cda62d9729bd7ad4303ecc8b4e690a67a77"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.13.1"
|
||||
version: "0.14.1"
|
||||
flutter_local_authentication:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -589,10 +601,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_local_notifications
|
||||
sha256: c500d5d9e7e553f06b61877ca6b9c8b92c570a4c8db371038702e8ce57f8a50f
|
||||
sha256: "49eeef364fddb71515bc78d5a8c51435a68bccd6e4d68e25a942c5e47761ae71"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "17.2.2"
|
||||
version: "17.2.3"
|
||||
flutter_local_notifications_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -618,18 +630,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_native_splash
|
||||
sha256: edf39bcf4d74aca1eb2c1e43c3e445fd9f494013df7f0da752fefe72020eedc0
|
||||
sha256: aa06fec78de2190f3db4319dd60fdc8d12b2626e93ef9828633928c2dcaea840
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
version: "2.4.1"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_plugin_android_lifecycle
|
||||
sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e
|
||||
sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.20"
|
||||
version: "2.0.22"
|
||||
flutter_secure_storage:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -643,7 +655,7 @@ packages:
|
||||
description:
|
||||
path: flutter_secure_storage_linux
|
||||
ref: develop
|
||||
resolved-ref: cb30953edc029dc4059b72700270b4cd3a3afade
|
||||
resolved-ref: "5a5692b609b3886cdd49b2ed06b9c079ecdff996"
|
||||
url: "https://github.com/mogol/flutter_secure_storage.git"
|
||||
source: git
|
||||
version: "1.2.1"
|
||||
@@ -683,10 +695,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_shaders
|
||||
sha256: "02750b545c01ff4d8e9bbe8f27a7731aa3778402506c67daa1de7f5fc3f4befe"
|
||||
sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.2"
|
||||
version: "0.1.3"
|
||||
flutter_speed_dial:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -733,10 +745,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: freezed_annotation
|
||||
sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d
|
||||
sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
version: "2.4.4"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -773,10 +785,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: graphs
|
||||
sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19
|
||||
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.1"
|
||||
version: "2.3.2"
|
||||
gtk:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -789,18 +801,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: hashlib
|
||||
sha256: "67e640e19cc33070113acab3125cd48ebe480a0300e15554dec089b8878a729f"
|
||||
sha256: f572f2abce09fc7aee53f15927052b9732ea1053e540af8cae211111ee0b99b1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.16.0"
|
||||
version: "1.21.0"
|
||||
hashlib_codecs:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: hashlib_codecs
|
||||
sha256: a1c7b5d89ff29e81fd8e8c0b35966db4c935e149fc4ebe1ebf71e358c15863ab
|
||||
sha256: "8cea9ccafcfeaa7324d2ae52c61c69f7ff71f4237507a018caab31b9e416e3b1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
version: "2.6.0"
|
||||
hex:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -917,10 +929,10 @@ packages:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: lints
|
||||
sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235"
|
||||
sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
version: "5.0.0"
|
||||
local_auth:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -933,18 +945,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: local_auth_android
|
||||
sha256: "48dfb2d954da8ef6a77adfc93a29998f7729e9308eaa817e91dea4500317b2c8"
|
||||
sha256: "5351c7eea8823de28e37d8b7b3e386d944b80f2a77edb91a5707fb97a41fc1b1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.39"
|
||||
version: "1.0.45"
|
||||
local_auth_darwin:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: local_auth_darwin
|
||||
sha256: "7ba5738c874ca2b910d72385d00d2bebad9d4e807612936cf5e32bc01a048c71"
|
||||
sha256: "6d2950da311d26d492a89aeb247c72b4653ddc93601ea36a84924a396806d49c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
version: "1.4.1"
|
||||
local_auth_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -957,10 +969,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: local_auth_windows
|
||||
sha256: "505ba3367ca781efb1c50d3132e44a2446bccc4163427bc203b9b4d8994d97ea"
|
||||
sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.10"
|
||||
version: "1.0.11"
|
||||
logging:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -969,6 +981,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
macros:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: macros
|
||||
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.2-main.4"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1005,10 +1025,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
|
||||
sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.5"
|
||||
version: "1.0.6"
|
||||
mocktail:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
@@ -1117,18 +1137,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
|
||||
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
version: "2.1.4"
|
||||
path_provider_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514"
|
||||
sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.5"
|
||||
version: "2.2.10"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1157,10 +1177,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
|
||||
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
version: "2.3.0"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1253,10 +1273,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: qr
|
||||
sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3"
|
||||
sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
version: "3.0.2"
|
||||
qr_code_scanner:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1285,18 +1305,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: sentry
|
||||
sha256: "0f787e27ff617e4f88f7074977240406a9c5509444bac64a4dfa5b3200fb5632"
|
||||
sha256: "033287044a6644a93498969449d57c37907e56f5cedb17b88a3ff20a882261dd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.7.0"
|
||||
version: "8.9.0"
|
||||
sentry_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: sentry_flutter
|
||||
sha256: fbbb47d72ccca48be25bf3c2ced6ab6e872991af3a0ba78e54be8d138f2e053f
|
||||
sha256: "3780b5a0bb6afd476857cfbc6c7444d969c29a4d9bd1aa5b6960aa76c65b737a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.7.0"
|
||||
version: "8.9.0"
|
||||
share_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1317,58 +1337,58 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_preferences
|
||||
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
|
||||
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.3"
|
||||
version: "2.3.2"
|
||||
shared_preferences_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_android
|
||||
sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577"
|
||||
sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.3"
|
||||
version: "2.3.2"
|
||||
shared_preferences_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_foundation
|
||||
sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
|
||||
sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
version: "2.5.3"
|
||||
shared_preferences_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_linux
|
||||
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
|
||||
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.4.1"
|
||||
shared_preferences_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_platform_interface
|
||||
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
|
||||
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.4.1"
|
||||
shared_preferences_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_web
|
||||
sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf
|
||||
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
version: "2.4.2"
|
||||
shared_preferences_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_windows
|
||||
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
|
||||
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.4.1"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1410,10 +1430,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sodium_libs
|
||||
sha256: "441444f6f433032bae3444c2ef5ed2cf5bc0def77f104abdff20aedcf79a7c7a"
|
||||
sha256: aa764acd6ccc6113e119c2d99471aeeb4637a9a501639549b297d3a143ff49b3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.1+5"
|
||||
version: "2.2.1+6"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1451,26 +1471,26 @@ packages:
|
||||
description:
|
||||
path: sqflite
|
||||
ref: HEAD
|
||||
resolved-ref: "3309d399dd7d695bbfa7c05f643bb16765cef4ee"
|
||||
resolved-ref: "699aaafa282d823b89ca568aac7a68d2c29ddab6"
|
||||
url: "https://github.com/tekartik/sqflite"
|
||||
source: git
|
||||
version: "2.3.3+1"
|
||||
version: "2.3.3+2"
|
||||
sqflite_common:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_common
|
||||
sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4"
|
||||
sha256: "2d8e607db72e9cb7748c9c6e739e2c9618320a5517de693d5a24609c4671b1a4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.4"
|
||||
version: "2.5.4+4"
|
||||
sqflite_common_ffi:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: sqflite_common_ffi
|
||||
sha256: "4d6137c29e930d6e4a8ff373989dd9de7bac12e3bc87bce950f6e844e8ad3bb5"
|
||||
sha256: a6057d4c87e9260ba1ec436ebac24760a110589b9c0a859e128842eb69a7ef04
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.3"
|
||||
version: "2.3.3+1"
|
||||
sqlite3:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1499,10 +1519,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: steam_totp
|
||||
sha256: "3c09143c983f6bb05bb53e9232f9d40bbcc01c596ba0273c3e6bb246729abfa1"
|
||||
sha256: f47163df9be533024cecb97ca9bb1f29bb5575409a22fe4acdd9d70288d38d0d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.0.1"
|
||||
version: "0.0.2"
|
||||
step_progress_indicator:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1547,10 +1567,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: synchronized
|
||||
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
|
||||
sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.0+1"
|
||||
version: "3.3.0+3"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1571,10 +1591,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: timezone
|
||||
sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5
|
||||
sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.3"
|
||||
version: "0.9.4"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1587,10 +1607,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: tray_manager
|
||||
sha256: c9a63fd88bd3546287a7eb8ccc978d707eef82c775397af17dda3a4f4c039e64
|
||||
sha256: bdc3ac6c36f3d12d871459e4a9822705ce5a1165a17fa837103bc842719bf3f7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.3"
|
||||
version: "0.2.4"
|
||||
tuple:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1635,34 +1655,34 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf
|
||||
sha256: a4e5f34f2fadf1fa7b4e69db89189056e313c9c98e8ad420e6b53677b6abc334
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.3"
|
||||
version: "6.3.11"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89"
|
||||
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.0"
|
||||
version: "6.3.1"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
|
||||
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
version: "3.2.0"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
|
||||
sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
version: "3.2.1"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1691,10 +1711,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: uuid
|
||||
sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
|
||||
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.4.0"
|
||||
version: "4.5.1"
|
||||
vector_graphics:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1747,10 +1767,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web
|
||||
sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062
|
||||
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
version: "1.1.0"
|
||||
web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1771,18 +1791,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: win32
|
||||
sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4
|
||||
sha256: "4d45dc9069dba4619dc0ebd93c7cec5e66d8482cb625a370ac806dcc8165f2ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.5.1"
|
||||
version: "5.5.5"
|
||||
win32_registry:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32_registry
|
||||
sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb"
|
||||
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.3"
|
||||
version: "1.1.5"
|
||||
window_manager:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1792,13 +1812,13 @@ packages:
|
||||
source: hosted
|
||||
version: "0.4.2"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
|
||||
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
version: "1.1.0"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1824,5 +1844,5 @@ packages:
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.4.0 <4.0.0"
|
||||
flutter: ">=3.22.0"
|
||||
dart: ">=3.5.0 <4.0.0"
|
||||
flutter: ">=3.24.0"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
name: ente_auth
|
||||
description: ente two-factor authenticator
|
||||
version: 4.0.2+402
|
||||
version: 4.0.3+403
|
||||
publish_to: none
|
||||
|
||||
environment:
|
||||
@@ -16,14 +16,9 @@ dependencies:
|
||||
bloc: ^8.1.2
|
||||
clipboard: ^0.1.3
|
||||
collection: ^1.18.0 # dart
|
||||
confetti: ^0.7.0
|
||||
confetti: ^0.8.0
|
||||
connectivity_plus: ^6.0.5
|
||||
convert: ^3.1.1
|
||||
desktop_webview_window:
|
||||
git:
|
||||
url: https://github.com/MixinNetwork/flutter-plugins
|
||||
ref: main
|
||||
path: packages/desktop_webview_window
|
||||
device_info_plus: ^9.1.1
|
||||
dio: ^5.4.0
|
||||
dotted_border: ^2.0.0+2
|
||||
@@ -49,7 +44,7 @@ dependencies:
|
||||
flutter_displaymode: ^0.6.0
|
||||
flutter_email_sender: ^6.0.2
|
||||
flutter_inappwebview: ^6.0.0
|
||||
flutter_launcher_icons: ^0.13.1
|
||||
flutter_launcher_icons: ^0.14.1
|
||||
flutter_local_authentication:
|
||||
git:
|
||||
url: https://github.com/eaceto/flutter_local_authentication
|
||||
@@ -105,6 +100,7 @@ dependencies:
|
||||
uuid: ^4.2.2
|
||||
win32: ^5.1.1
|
||||
window_manager: ^0.4.2
|
||||
xdg_directories: ^1.0.4
|
||||
|
||||
dependency_overrides:
|
||||
flutter_secure_storage_linux:
|
||||
@@ -117,7 +113,7 @@ dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
json_serializable: ^6.2.0
|
||||
lints: ^4.0.0
|
||||
lints: ^5.0.0
|
||||
mocktail: ^1.0.3
|
||||
|
||||
# The following section is specific to Flutter.
|
||||
|
||||
@@ -8,13 +8,12 @@
|
||||
|
||||
#include <app_links/app_links_plugin_c_api.h>
|
||||
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
|
||||
#include <desktop_webview_window/desktop_webview_window_plugin.h>
|
||||
#include <file_saver/file_saver_plugin.h>
|
||||
#include <flutter_inappwebview_windows/flutter_inappwebview_windows_plugin_c_api.h>
|
||||
#include <flutter_local_authentication/flutter_local_authentication_plugin_c_api.h>
|
||||
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
|
||||
#include <local_auth_windows/local_auth_plugin.h>
|
||||
#include <screen_retriever/screen_retriever_plugin.h>
|
||||
#include <sentry_flutter/sentry_flutter_plugin.h>
|
||||
#include <share_plus/share_plus_windows_plugin_c_api.h>
|
||||
#include <sodium_libs/sodium_libs_plugin_c_api.h>
|
||||
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
|
||||
@@ -27,10 +26,10 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
registry->GetRegistrarForPlugin("AppLinksPluginCApi"));
|
||||
ConnectivityPlusWindowsPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
|
||||
DesktopWebviewWindowPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("DesktopWebviewWindowPlugin"));
|
||||
FileSaverPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FileSaverPlugin"));
|
||||
FlutterInappwebviewWindowsPluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FlutterInappwebviewWindowsPluginCApi"));
|
||||
FlutterLocalAuthenticationPluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FlutterLocalAuthenticationPluginCApi"));
|
||||
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
|
||||
@@ -39,8 +38,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
registry->GetRegistrarForPlugin("LocalAuthPlugin"));
|
||||
ScreenRetrieverPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("ScreenRetrieverPlugin"));
|
||||
SentryFlutterPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("SentryFlutterPlugin"));
|
||||
SharePlusWindowsPluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
|
||||
SodiumLibsPluginCApiRegisterWithRegistrar(
|
||||
|
||||
@@ -5,13 +5,12 @@
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
app_links
|
||||
connectivity_plus
|
||||
desktop_webview_window
|
||||
file_saver
|
||||
flutter_inappwebview_windows
|
||||
flutter_local_authentication
|
||||
flutter_secure_storage_windows
|
||||
local_auth_windows
|
||||
screen_retriever
|
||||
sentry_flutter
|
||||
share_plus
|
||||
sodium_libs
|
||||
sqlite3_flutter_libs
|
||||
@@ -21,6 +20,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
sentry_flutter
|
||||
)
|
||||
|
||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
app_id: 9E5F0C93-96A3-4DA9-AE52-1AA6339851FC
|
||||
package_name: enteauth
|
||||
publisher: ente.io
|
||||
publisher_url: https://github.com/ente-io/ente
|
||||
display_name: Ente Auth
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
## v1.7.6 (Unreleased)
|
||||
|
||||
- Parse description from metadata JSON.
|
||||
- .
|
||||
|
||||
## v1.7.5
|
||||
|
||||
@@ -109,6 +109,7 @@ export const sidebar = [
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "General", link: "/photos/faq/general" },
|
||||
{ text: "Installation", link: "/photos/faq/installing" },
|
||||
{
|
||||
text: "Export",
|
||||
link: "/photos/faq/export",
|
||||
@@ -172,6 +173,7 @@ export const sidebar = [
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "General", link: "/auth/faq/" },
|
||||
{ text: "Installation", link: "/auth/faq/installing" },
|
||||
{
|
||||
text: "Enteception",
|
||||
link: "/auth/faq/enteception/",
|
||||
|
||||
@@ -13,7 +13,8 @@ been externally audited.
|
||||
|
||||
### How can I delete or edit codes?
|
||||
|
||||
You can delete or edit a code long press (or right click on desktop) on that item.
|
||||
You can delete or edit a code long press (or right click on desktop) on that
|
||||
item.
|
||||
|
||||
### How can I support this project?
|
||||
|
||||
@@ -51,7 +52,9 @@ end-to-end encrypted.
|
||||
|
||||
### What information about my codes is stored on Ente server?
|
||||
|
||||
Due to E2EE, the server doesn't know anything about the code. Everything is encrypted, including the tags, type, account, issuer, notes, and pinned or trash status, etc."
|
||||
Due to E2EE, the server doesn't know anything about the code. Everything is
|
||||
encrypted, including the tags, type, account, issuer, notes, and pinned or trash
|
||||
status, etc."
|
||||
|
||||
### What does it mean when I receive a message saying my current device is not powerful enough to verify my password?
|
||||
|
||||
|
||||
90
docs/docs/auth/faq/installing.md
Normal file
90
docs/docs/auth/faq/installing.md
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: Installing Ente Auth
|
||||
description: Steps to install Ente Auth
|
||||
---
|
||||
|
||||
# Android
|
||||
|
||||
Our Android apps are distributed over the following channels.
|
||||
|
||||
### PlayStore
|
||||
|
||||
You can install Auth directly from
|
||||
[PlayStore](https://play.google.com/store/apps/details?id=io.ente.auth).
|
||||
|
||||
### F-Droid
|
||||
|
||||
Reproducible builds for Auth are available on
|
||||
[F-Droid](https://f-droid.org/packages/io.ente.auth/).
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> Releases over F-Droid are generally slower since they run their own build
|
||||
> servers. You can donate to F-Droid [here](https://f-droid.org/en/donate).
|
||||
|
||||
### GitHub
|
||||
|
||||
Latest releases are built straight from the source and made available over
|
||||
[GitHub](https://github.com/ente-io/ente/releases?q=tag%3Aauth-v4).
|
||||
|
||||
These builds will notify you whenever a new release is available and will help
|
||||
you stay updated.
|
||||
|
||||
### Obtanium
|
||||
|
||||
You can setup [Obtanium](https://github.com/ImranR98/Obtainium) to track our
|
||||
GitHub releases by following these steps.
|
||||
|
||||
1. Click **Add App** to open a new app config screen
|
||||
2. Enter `https://github.com/ente-io/ente` in the **App Source URL** field
|
||||
3. Enable the **Retain release order** from API toggle
|
||||
4. Scroll down to the **Filter APKs by Regular Expression** field and enter `ente-auth*`
|
||||
5. Enable the **Attempt to filter APKs by CPU architecture** if possible toggle
|
||||
6. Select any applicable app category labels you may have setup
|
||||
7. Enable the **Try inferring app ID from source code** toggle
|
||||
8. Scroll back to the top and click **Add** to complete the setup
|
||||
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# iOS
|
||||
|
||||
You can install Ente Auth on Apple devices from
|
||||
[AppStore](https://apps.apple.com/us/app/ente-auth/id6444121398).
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# Desktop
|
||||
|
||||
You can grab the latest version of Ente Auth for Mac, Windows and Linux from
|
||||
[GitHub](https://github.com/ente-io/ente/releases?q=tag%3Aauth-v4).
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# Web
|
||||
|
||||
Latest versions of our web app are available at [auth.ente.io](https://auth.ente.io).
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# CLI
|
||||
|
||||
Ente's CLI is distributed directly over
|
||||
[GitHub](https://github.com/ente-io/ente/releases?q=tag%3Acli-v0).
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
---
|
||||
title: Migrating from Authy
|
||||
description: Guide for importing your existing Authy 2FA tokens into Ente Auth
|
||||
@@ -213,7 +212,7 @@ If this didn't work, refer to
|
||||
|
||||
1. Open Ente Authenticator on your phone
|
||||
2. Log in to your account (if you haven't already), or press "Use without
|
||||
backups".
|
||||
backups".
|
||||
3. Click the add button in the bottom right of the app.
|
||||
4. Select "Scan a QR code" and scan the code from the browser.
|
||||
|
||||
|
||||
90
docs/docs/photos/faq/installing.md
Normal file
90
docs/docs/photos/faq/installing.md
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: Installing Ente Photos
|
||||
description: Steps to install Ente Photos
|
||||
---
|
||||
|
||||
# Android
|
||||
|
||||
Our Android apps are distributed over the following channels.
|
||||
|
||||
### PlayStore
|
||||
|
||||
You can install Ente directly from
|
||||
[PlayStore](https://play.google.com/store/apps/details?id=io.ente.photos).
|
||||
|
||||
### F-Droid
|
||||
|
||||
Reproducible builds for Ente are available on
|
||||
[F-Droid](https://f-droid.org/packages/io.ente.photos.fdroid/).
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> Releases over F-Droid are generally slower since they run their own build
|
||||
> servers. You can donate to F-Droid [here](https://f-droid.org/en/donate).
|
||||
|
||||
### GitHub
|
||||
|
||||
Latest releases are built straight from the source and made available over
|
||||
[GitHub](https://github.com/ente-io/ente/releases?q=tag%253Aphotos-v0).
|
||||
|
||||
These builds will notify you whenever a new release is available and will help
|
||||
you stay updated.
|
||||
|
||||
### Obtanium
|
||||
|
||||
You can setup [Obtanium](https://github.com/ImranR98/Obtainium) to track our
|
||||
GitHub releases by following these steps.
|
||||
|
||||
1. Click **Add App** to open a new app config screen
|
||||
2. Enter `https://github.com/ente-io/ente` in the **App Source URL** field
|
||||
3. Enable the **Retain release order** from API toggle
|
||||
4. Scroll down to the **Filter APKs by Regular Expression** field and enter `ente-photos*`
|
||||
5. Enable the **Attempt to filter APKs by CPU architecture** if possible toggle
|
||||
6. Select any applicable app category labels you may have setup
|
||||
7. Enable the **Try inferring app ID from source code** toggle
|
||||
8. Scroll back to the top and click **Add** to complete the setup
|
||||
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# iOS
|
||||
|
||||
You can install Ente on Apple devices from
|
||||
[AppStore](https://apps.apple.com/app/id1542026904).
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# Desktop
|
||||
|
||||
You can grab the latest version of Ente for Mac, Windows and Linux from
|
||||
[ente.io/download/desktop](https://ente.io/download/desktop).
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# Web
|
||||
|
||||
Latest versions of our web app are available at [web.ente.io](https://web.ente.io).
|
||||
|
||||
<br/>
|
||||
|
||||
---
|
||||
|
||||
<br/>
|
||||
|
||||
# CLI
|
||||
|
||||
Ente's CLI is distributed directly over
|
||||
[GitHub](https://github.com/ente-io/ente/releases?q=tag%3Acli-v0).
|
||||
@@ -71,6 +71,23 @@ not modify the original.
|
||||
> functionality within the app itself) for customers who intentionally wish to
|
||||
> modify their originals to reflect the associated metadata JSON.
|
||||
|
||||
As an example: suppose you have `flower.png`. When you export your library, you
|
||||
will end up with:
|
||||
|
||||
```
|
||||
flower.png
|
||||
metadata/flower.png.json
|
||||
```
|
||||
|
||||
Ente writes this JSON in the same format as Google Takeout so that if a tool
|
||||
supports Google Takeout import, it should be able to read the JSON written by
|
||||
Ente too
|
||||
|
||||
> One small difference is that, to avoid clutter, Ente puts the JSON in the
|
||||
> `metadata/` subfolder, while Google puts it next to the file.<br>
|
||||
>
|
||||
> <br>Ente itself will read it from either place.
|
||||
|
||||
### File creation time.
|
||||
|
||||
The photo's data will be preserved verbatim, however when it is written out to
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
platform :ios, '12.1'
|
||||
platform :ios, '13.0'
|
||||
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
PODS:
|
||||
- background_fetch (1.3.2):
|
||||
- background_fetch (1.3.7):
|
||||
- Flutter
|
||||
- battery_info (0.0.1):
|
||||
- Flutter
|
||||
@@ -19,38 +19,38 @@ PODS:
|
||||
- Flutter
|
||||
- file_saver (0.0.1):
|
||||
- Flutter
|
||||
- Firebase/CoreOnly (10.24.0):
|
||||
- FirebaseCore (= 10.24.0)
|
||||
- Firebase/Messaging (10.24.0):
|
||||
- Firebase/CoreOnly (11.2.0):
|
||||
- FirebaseCore (= 11.2.0)
|
||||
- Firebase/Messaging (11.2.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseMessaging (~> 10.24.0)
|
||||
- firebase_core (2.30.0):
|
||||
- Firebase/CoreOnly (= 10.24.0)
|
||||
- FirebaseMessaging (~> 11.2.0)
|
||||
- firebase_core (3.6.0):
|
||||
- Firebase/CoreOnly (= 11.2.0)
|
||||
- Flutter
|
||||
- firebase_messaging (14.8.1):
|
||||
- Firebase/Messaging (= 10.24.0)
|
||||
- firebase_messaging (15.1.3):
|
||||
- Firebase/Messaging (= 11.2.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- FirebaseCore (10.24.0):
|
||||
- FirebaseCoreInternal (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.12)
|
||||
- GoogleUtilities/Logger (~> 7.12)
|
||||
- FirebaseCoreInternal (10.29.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.8)"
|
||||
- FirebaseInstallations (10.29.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GoogleUtilities/UserDefaults (~> 7.8)
|
||||
- PromisesObjC (~> 2.1)
|
||||
- FirebaseMessaging (10.24.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseInstallations (~> 10.0)
|
||||
- GoogleDataTransport (~> 9.3)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GoogleUtilities/Reachability (~> 7.8)
|
||||
- GoogleUtilities/UserDefaults (~> 7.8)
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- FirebaseCore (11.2.0):
|
||||
- FirebaseCoreInternal (~> 11.0)
|
||||
- GoogleUtilities/Environment (~> 8.0)
|
||||
- GoogleUtilities/Logger (~> 8.0)
|
||||
- FirebaseCoreInternal (11.3.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||
- FirebaseInstallations (11.3.0):
|
||||
- FirebaseCore (~> 11.0)
|
||||
- GoogleUtilities/Environment (~> 8.0)
|
||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- FirebaseMessaging (11.2.0):
|
||||
- FirebaseCore (~> 11.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleDataTransport (~> 10.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||
- GoogleUtilities/Environment (~> 8.0)
|
||||
- GoogleUtilities/Reachability (~> 8.0)
|
||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||
- nanopb (~> 3.30910.0)
|
||||
- fk_user_agent (2.0.0):
|
||||
- Flutter
|
||||
- Flutter (1.0.0)
|
||||
@@ -61,13 +61,13 @@ PODS:
|
||||
- Mantle
|
||||
- SDWebImage
|
||||
- SDWebImageWebPCoder
|
||||
- flutter_inappwebview (0.0.1):
|
||||
- flutter_inappwebview_ios (0.0.1):
|
||||
- Flutter
|
||||
- flutter_inappwebview/Core (= 0.0.1)
|
||||
- OrderedSet (~> 5.0)
|
||||
- flutter_inappwebview/Core (0.0.1):
|
||||
- flutter_inappwebview_ios/Core (= 0.0.1)
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_inappwebview_ios/Core (0.0.1):
|
||||
- Flutter
|
||||
- OrderedSet (~> 5.0)
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_local_notifications (0.0.1):
|
||||
- Flutter
|
||||
- flutter_native_splash (0.0.1):
|
||||
@@ -79,33 +79,31 @@ PODS:
|
||||
- fluttertoast (0.0.2):
|
||||
- Flutter
|
||||
- Toast
|
||||
- GoogleDataTransport (9.4.1):
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.13.3):
|
||||
- GoogleDataTransport (10.1.0):
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- GoogleUtilities/AppDelegateSwizzler (8.0.2):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Environment (7.13.3):
|
||||
- GoogleUtilities/Environment (8.0.2):
|
||||
- GoogleUtilities/Privacy
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/Logger (7.13.3):
|
||||
- GoogleUtilities/Logger (8.0.2):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Network (7.13.3):
|
||||
- GoogleUtilities/Network (8.0.2):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (7.13.3)":
|
||||
- "GoogleUtilities/NSData+zlib (8.0.2)":
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Privacy (7.13.3)
|
||||
- GoogleUtilities/Reachability (7.13.3):
|
||||
- GoogleUtilities/Privacy (8.0.2)
|
||||
- GoogleUtilities/Reachability (8.0.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/UserDefaults (7.13.3):
|
||||
- GoogleUtilities/UserDefaults (8.0.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- heif_converter (1.0.0):
|
||||
@@ -135,6 +133,7 @@ PODS:
|
||||
- libwebp/sharpyuv
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- local_auth_ios (0.0.1):
|
||||
- Flutter
|
||||
- Mantle (2.2.0):
|
||||
@@ -156,11 +155,11 @@ PODS:
|
||||
- Flutter
|
||||
- move_to_background (0.0.1):
|
||||
- Flutter
|
||||
- nanopb (2.30910.0):
|
||||
- nanopb/decode (= 2.30910.0)
|
||||
- nanopb/encode (= 2.30910.0)
|
||||
- nanopb/decode (2.30910.0)
|
||||
- nanopb/encode (2.30910.0)
|
||||
- nanopb (3.30910.0):
|
||||
- nanopb/decode (= 3.30910.0)
|
||||
- nanopb/encode (= 3.30910.0)
|
||||
- nanopb/decode (3.30910.0)
|
||||
- nanopb/encode (3.30910.0)
|
||||
- native_video_player (1.0.0):
|
||||
- Flutter
|
||||
- onnxruntime (0.0.1):
|
||||
@@ -173,7 +172,7 @@ PODS:
|
||||
- onnxruntime-c (= 1.15.1)
|
||||
- open_mail_app (0.0.1):
|
||||
- Flutter
|
||||
- OrderedSet (5.0.0)
|
||||
- OrderedSet (6.0.3)
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_foundation (0.0.1):
|
||||
@@ -187,23 +186,21 @@ PODS:
|
||||
- privacy_screen (0.0.1):
|
||||
- Flutter
|
||||
- PromisesObjC (2.4.0)
|
||||
- receive_sharing_intent (1.6.8):
|
||||
- receive_sharing_intent (1.8.0):
|
||||
- Flutter
|
||||
- screen_brightness_ios (0.1.0):
|
||||
- Flutter
|
||||
- SDWebImage (5.19.6):
|
||||
- SDWebImage/Core (= 5.19.6)
|
||||
- SDWebImage/Core (5.19.6)
|
||||
- SDWebImage (5.19.7):
|
||||
- SDWebImage/Core (= 5.19.7)
|
||||
- SDWebImage/Core (5.19.7)
|
||||
- SDWebImageWebPCoder (0.14.6):
|
||||
- libwebp (~> 1.0)
|
||||
- SDWebImage/Core (~> 5.17)
|
||||
- Sentry/HybridSDK (8.21.0):
|
||||
- SentryPrivate (= 8.21.0)
|
||||
- sentry_flutter (7.19.0):
|
||||
- Sentry/HybridSDK (8.36.0)
|
||||
- sentry_flutter (8.9.0):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- Sentry/HybridSDK (= 8.21.0)
|
||||
- SentryPrivate (8.21.0)
|
||||
- Sentry/HybridSDK (= 8.36.0)
|
||||
- share_plus (0.0.1):
|
||||
- Flutter
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
@@ -212,18 +209,21 @@ PODS:
|
||||
- sqflite (0.0.3):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- "sqlite3 (3.45.3+1)":
|
||||
- "sqlite3/common (= 3.45.3+1)"
|
||||
- "sqlite3/common (3.45.3+1)"
|
||||
- "sqlite3/fts5 (3.45.3+1)":
|
||||
- "sqlite3 (3.46.1+1)":
|
||||
- "sqlite3/common (= 3.46.1+1)"
|
||||
- "sqlite3/common (3.46.1+1)"
|
||||
- "sqlite3/dbstatvtab (3.46.1+1)":
|
||||
- sqlite3/common
|
||||
- "sqlite3/perf-threadsafe (3.45.3+1)":
|
||||
- "sqlite3/fts5 (3.46.1+1)":
|
||||
- sqlite3/common
|
||||
- "sqlite3/rtree (3.45.3+1)":
|
||||
- "sqlite3/perf-threadsafe (3.46.1+1)":
|
||||
- sqlite3/common
|
||||
- "sqlite3/rtree (3.46.1+1)":
|
||||
- sqlite3/common
|
||||
- sqlite3_flutter_libs (0.0.1):
|
||||
- Flutter
|
||||
- sqlite3 (~> 3.45.1)
|
||||
- "sqlite3 (~> 3.46.0+1)"
|
||||
- sqlite3/dbstatvtab
|
||||
- sqlite3/fts5
|
||||
- sqlite3/perf-threadsafe
|
||||
- sqlite3/rtree
|
||||
@@ -257,7 +257,7 @@ DEPENDENCIES:
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_email_sender (from `.symlinks/plugins/flutter_email_sender/ios`)
|
||||
- flutter_image_compress (from `.symlinks/plugins/flutter_image_compress/ios`)
|
||||
- flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`)
|
||||
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
|
||||
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
|
||||
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
|
||||
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
|
||||
@@ -321,7 +321,6 @@ SPEC REPOS:
|
||||
- SDWebImage
|
||||
- SDWebImageWebPCoder
|
||||
- Sentry
|
||||
- SentryPrivate
|
||||
- sqlite3
|
||||
- Toast
|
||||
|
||||
@@ -352,8 +351,8 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/flutter_email_sender/ios"
|
||||
flutter_image_compress:
|
||||
:path: ".symlinks/plugins/flutter_image_compress/ios"
|
||||
flutter_inappwebview:
|
||||
:path: ".symlinks/plugins/flutter_inappwebview/ios"
|
||||
flutter_inappwebview_ios:
|
||||
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
|
||||
flutter_local_notifications:
|
||||
:path: ".symlinks/plugins/flutter_local_notifications/ios"
|
||||
flutter_native_splash:
|
||||
@@ -440,7 +439,7 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/wakelock_plus/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
background_fetch: 2319bf7e18237b4b269430b7f14d177c0df09c5a
|
||||
background_fetch: 39f11371c0dce04b001c4bfd5e782bcccb0a85e2
|
||||
battery_info: 09f5c9ee65394f2291c8c6227bedff345b8a730c
|
||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||
dart_ui_isolate: d5bcda83ca4b04f129d70eb90110b7a567aece14
|
||||
@@ -448,33 +447,33 @@ SPEC CHECKSUMS:
|
||||
ffmpeg-kit-ios-min: 4e9a088f4ee9629435960b9d68e54848975f1931
|
||||
ffmpeg_kit_flutter_min: 5eff47f4965bf9d1150e98961eb6129f5ae3f28c
|
||||
file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808
|
||||
Firebase: 91fefd38712feb9186ea8996af6cbdef41473442
|
||||
firebase_core: 66b99b4fb4e5d7cc4e88d4c195fe986681f3466a
|
||||
firebase_messaging: 0eb0425d28b4f4af147cdd4adcaf7c0100df28ed
|
||||
FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894
|
||||
FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934
|
||||
FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd
|
||||
FirebaseMessaging: 4d52717dd820707cc4eadec5eb981b4832ec8d5d
|
||||
Firebase: 98e6bf5278170668a7983e12971a66b2cd57fc8c
|
||||
firebase_core: 2bedc3136ec7c7b8561c6123ed0239387b53f2af
|
||||
firebase_messaging: 15d114e1a41fc31e4fbabcd48d765a19eec94a38
|
||||
FirebaseCore: a282032ae9295c795714ded2ec9c522fc237f8da
|
||||
FirebaseCoreInternal: ac26d09a70c730e497936430af4e60fb0c68ec4e
|
||||
FirebaseInstallations: 58cf94dabf1e2bb2fa87725a9be5c2249171cda0
|
||||
FirebaseMessaging: c9ec7b90c399c7a6100297e9d16f8a27fc7f7152
|
||||
fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_email_sender: 02d7443217d8c41483223627972bfdc09f74276b
|
||||
flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433
|
||||
flutter_inappwebview: 3d32228f1304635e7c028b0d4252937730bbc6cf
|
||||
flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
|
||||
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
|
||||
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
|
||||
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
|
||||
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
|
||||
flutter_sodium: c84426b4de738514b5b66cfdeb8a06634e72fe0b
|
||||
fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265
|
||||
GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
|
||||
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
|
||||
fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c
|
||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||
heif_converter: e3802659e4104e27e28c4d7bff07903da2f69318
|
||||
home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
|
||||
image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43
|
||||
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
||||
in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892
|
||||
in_app_purchase_storekit: 8c3b0b3eb1b0f04efbff401c3de6266d4258d433
|
||||
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
|
||||
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
|
||||
local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9
|
||||
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
||||
maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203
|
||||
@@ -485,39 +484,38 @@ SPEC CHECKSUMS:
|
||||
motion_sensors: 03f55b7c637a7e365a0b5f9697a449f9059d5d91
|
||||
motionphoto: d4a432b8c8f22fb3ad966258597c0103c9c5ff16
|
||||
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
|
||||
nanopb: 438bc412db1928dac798aa6fd75726007be04262
|
||||
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||
native_video_player: d12af78a1a4a8cf09775a5177d5b392def6fd23c
|
||||
onnxruntime: e9346181d75b8dea8733bdae512a22c298962e00
|
||||
onnxruntime-c: ebdcfd8650bcbd10121c125262f99dea681b92a3
|
||||
onnxruntime-objc: ae7acec7a3d03eaf072d340afed7a35635c1c2a6
|
||||
open_mail_app: 794172f6a22cd16319d3ddaf45e945b2f74952b0
|
||||
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
|
||||
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
||||
photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a
|
||||
privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
|
||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||
receive_sharing_intent: 6837b01768e567fe8562182397bf43d63d8c6437
|
||||
receive_sharing_intent: df9c334dc9feadcbd3266e5cb49c8443405e1c9f
|
||||
screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625
|
||||
SDWebImage: a79252b60f4678812d94316c91da69ec83089c9f
|
||||
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
|
||||
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
|
||||
Sentry: ebc12276bd17613a114ab359074096b6b3725203
|
||||
sentry_flutter: 88ebea3f595b0bc16acc5bedacafe6d60c12dcd5
|
||||
SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe
|
||||
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
|
||||
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe
|
||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
||||
sqlite3: 02d1f07eaaa01f80a1c16b4b31dfcbb3345ee01a
|
||||
sqlite3_flutter_libs: af0e8fe9bce48abddd1ffdbbf839db0302d72d80
|
||||
sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb
|
||||
sqlite3_flutter_libs: c00457ebd31e59fa6bb830380ddba24d44fbcd3b
|
||||
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
|
||||
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
|
||||
url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586
|
||||
video_player_avfoundation: 2b4384f3b157206b5e150a0083cdc0c905d260d3
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
|
||||
video_thumbnail: c4e2a3c539e247d4de13cd545344fd2d26ffafd1
|
||||
volume_controller: 531ddf792994285c9b17f9d8a7e4dcdd29b3eae9
|
||||
wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47
|
||||
|
||||
PODFILE CHECKSUM: 3c51755c77077d1aa4ef23d06c621f6e2569214c
|
||||
PODFILE CHECKSUM: 20e086e6008977d43a3d40260f3f9bffcac748dd
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
|
||||
@@ -288,7 +288,6 @@
|
||||
"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/SentryPrivate/SentryPrivate.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/Toast/Toast.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/background_fetch/background_fetch.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/battery_info/battery_info.framework",
|
||||
@@ -299,7 +298,7 @@
|
||||
"${BUILT_PRODUCTS_DIR}/fk_user_agent/fk_user_agent.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/flutter_email_sender/flutter_email_sender.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/flutter_image_compress/flutter_image_compress.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/flutter_inappwebview/flutter_inappwebview.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/flutter_inappwebview_ios/flutter_inappwebview_ios.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework",
|
||||
@@ -384,7 +383,6 @@
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageWebPCoder.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SentryPrivate.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/background_fetch.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/battery_info.framework",
|
||||
@@ -395,7 +393,7 @@
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/fk_user_agent.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_email_sender.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_image_compress.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_inappwebview.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_inappwebview_ios.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_native_splash.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework",
|
||||
@@ -500,10 +498,12 @@
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/firebase_messaging/firebase_messaging_Privacy.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/permission_handler_apple/permission_handler_apple_privacy.bundle",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/firebase_messaging_Privacy.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/permission_handler_apple_privacy.bundle",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
||||
@@ -1721,6 +1721,8 @@ class FilesDB {
|
||||
final result = await db.getAll(
|
||||
'SELECT * FROM $filesTable ORDER BY $columnCreationTime DESC',
|
||||
);
|
||||
_logger.info("${result.length} rows in filesDB");
|
||||
|
||||
final List<EnteFile> files = await Computer.shared()
|
||||
.compute(convertToFilesForIsolate, param: {"result": result});
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"@@locale ": "en",
|
||||
"incorrectRecoveryKeyBody": ""
|
||||
"askDeleteReason": "Jaký je váš hlavní důvod, proč mažete svůj účet?",
|
||||
"incorrectRecoveryKeyBody": "",
|
||||
"checkInboxAndSpamFolder": "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření"
|
||||
}
|
||||
@@ -150,7 +150,7 @@
|
||||
"tryAgain": "Try again",
|
||||
"viewRecoveryKey": "View recovery key",
|
||||
"confirmRecoveryKey": "Confirm recovery key",
|
||||
"recoveryKeyVerifyReason": "Your recovery key is the only way to recover your photos if you forget your password. You can find your recovery key in Settings > Security.\n\nPlease enter your recovery key here to verify that you have saved it correctly.",
|
||||
"recoveryKeyVerifyReason": "Your recovery key is the only way to recover your photos if you forget your password. You can find your recovery key in Settings > Account.\n\nPlease enter your recovery key here to verify that you have saved it correctly.",
|
||||
"confirmYourRecoveryKey": "Confirm your recovery key",
|
||||
"addViewer": "Add viewer",
|
||||
"addCollaborator": "Add collaborator",
|
||||
@@ -1344,4 +1344,4 @@
|
||||
"mostRelevant": "Most relevant",
|
||||
"loadingYourPhotos": "Loading your photos...",
|
||||
"processingImport": "Processing {folderName}..."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -417,8 +417,29 @@
|
||||
"mlConsent": "Habilitar aprendizaje automático",
|
||||
"mlConsentTitle": "¿Habilitar aprendizaje automático?",
|
||||
"mlConsentDescription": "Si habilitas el aprendizaje automático, Ente extraerá información como la geometría de la cara de los archivos, incluyendo aquellos compartidos contigo.\n\nEsto sucederá en tu dispositivo, y cualquier información biométrica generada será encriptada de extremo a extremo.",
|
||||
"mlConsentPrivacy": "Por favor, haz clic aquí para más detalles sobre esta característica en nuestra política de privacidad",
|
||||
"mlConsentConfirmation": "Entiendo y deseo habilitar el aprendizaje automático",
|
||||
"magicSearch": "Búsqueda mágica",
|
||||
"discover": "Descubrir",
|
||||
"@discover": {
|
||||
"description": "The text to display for the discover section under which we show receipts, screenshots, sunsets, greenery, etc."
|
||||
},
|
||||
"discover_identity": "Identidad",
|
||||
"discover_screenshots": "Capturas de pantalla",
|
||||
"discover_receipts": "Recibos",
|
||||
"discover_notes": "Notas",
|
||||
"discover_memes": "Memes",
|
||||
"discover_visiting_cards": "Tarjetas de visita",
|
||||
"discover_babies": "Bebés",
|
||||
"discover_pets": "Mascotas",
|
||||
"discover_selfies": "Selfies",
|
||||
"discover_wallpapers": "Fondos de pantalla",
|
||||
"discover_food": "Comida",
|
||||
"discover_celebrations": "Celebraciones",
|
||||
"discover_sunset": "Atardecer",
|
||||
"discover_hills": "Colinas",
|
||||
"discover_greenery": "Verdor",
|
||||
"mlIndexingDescription": "Por favor ten en cuenta que el aprendizaje automático dará como resultado un mayor ancho de banda y uso de batería hasta que todos los elementos estén indexados. Considera usar la aplicación de escritorio para una indexación más rápida. Todos los resultados se sincronizarán automáticamente.",
|
||||
"loadingModel": "Descargando modelos...",
|
||||
"waitingForWifi": "Esperando WiFi...",
|
||||
"status": "Estado",
|
||||
@@ -452,6 +473,7 @@
|
||||
"yearsAgo": "{count, plural, one{{count} año atrás} other{{count} años atrás}}",
|
||||
"backupSettings": "Ajustes de copia de seguridad",
|
||||
"backupStatus": "Estado de la copia de seguridad",
|
||||
"backupStatusDescription": "Los elementos que han sido respaldados aparecerán aquí",
|
||||
"backupOverMobileData": "Copia de seguridad usando datos móviles",
|
||||
"backupVideos": "Respaldar vídeos",
|
||||
"disableAutoLock": "Desactivar autobloqueo",
|
||||
@@ -495,6 +517,7 @@
|
||||
"removeDuplicates": "Eliminar duplicados",
|
||||
"removeDuplicatesDesc": "Revisar y eliminar archivos que son duplicados exactos.",
|
||||
"viewLargeFiles": "Archivos grandes",
|
||||
"viewLargeFilesDesc": "Ver los archivos que consumen la mayor cantidad de almacenamiento.",
|
||||
"noDuplicates": "✨ Sin duplicados",
|
||||
"youveNoDuplicateFilesThatCanBeCleared": "No tienes archivos duplicados que puedan ser borrados",
|
||||
"success": "Éxito",
|
||||
@@ -1278,6 +1301,7 @@
|
||||
"enabled": "Habilitado",
|
||||
"moreDetails": "Más detalles",
|
||||
"enableMLIndexingDesc": "Ente soporta aprendizaje automático en el dispositivo para la detección de caras, búsqueda mágica y otras características de búsqueda avanzada",
|
||||
"magicSearchHint": "La búsqueda mágica permite buscar fotos por su contenido. Por ejemplo, \"flor\", \"carro rojo\", \"documentos de identidad\"",
|
||||
"panorama": "Panorama",
|
||||
"reenterPassword": "Rescribe tu contraseña",
|
||||
"reenterPin": "Rescribe tu PIN",
|
||||
@@ -1306,12 +1330,18 @@
|
||||
"guestView": "Vista de invitado",
|
||||
"guestViewEnablePreSteps": "Para habilitar la vista de invitados, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de su sistema.",
|
||||
"nameTheAlbum": "Nombre el álbum",
|
||||
"collectPhotosDescription": "Crea un enlace donde tus amigos pueden subir fotos en su calidad original.",
|
||||
"collect": "Recolectar",
|
||||
"appLockDescriptions": "Escoge entre la pantalla de bloqueo por defecto de tu dispositivo y una pantalla de bloqueo personalizada con un PIN o contraseña.",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para habilitar el bloqueo de la aplicación, por favor configura el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes del sistema.",
|
||||
"authToViewPasskey": "Por favor, autentícate para ver tu clave de acceso",
|
||||
"loopVideoOn": "Vídeo en bucle activado",
|
||||
"loopVideoOff": "Vídeo en bucle desactivado",
|
||||
"localSyncErrorMessage": "Parece que algo salió mal ya que la sincronización de fotos locales está tomando más tiempo del esperado. Por favor contacta con nuestro equipo de soporte",
|
||||
"showPerson": "Mostrar persona",
|
||||
"sort": "Ordenar",
|
||||
"mostRecent": "Más reciente",
|
||||
"mostRelevant": "Más relevante",
|
||||
"loadingYourPhotos": "Cargando tus fotos..."
|
||||
"loadingYourPhotos": "Cargando tus fotos...",
|
||||
"processingImport": "Procesando {folderName}..."
|
||||
}
|
||||
@@ -92,7 +92,7 @@
|
||||
"continueLabel": "つづける",
|
||||
"insecureDevice": "安全でないデバイス",
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "このデバイスでは安全な鍵を生成することができませんでした。\n\n他のデバイスからサインアップを試みてください。",
|
||||
"howItWorks": "仕組み",
|
||||
"howItWorks": "仕組みを知る",
|
||||
"encryption": "暗号化",
|
||||
"ackPasswordLostWarning": "もしパスワードを忘れたら、自身のデータを失うことを理解しました",
|
||||
"privacyPolicyTitle": "プライバシーポリシー",
|
||||
@@ -111,8 +111,8 @@
|
||||
"recreatePasswordBody": "このデバイスではパスワードを確認する能力が足りません。\n\n恐れ入りますが、リカバリーキーを入力してパスワードを再生成する必要があります。",
|
||||
"verifyPassword": "パスワードの確認",
|
||||
"recoveryKey": "リカバリーキー",
|
||||
"recoveryKeyOnForgotPassword": "パスワードを忘れてしまったら、このリカバリーキーが唯一あなたのデータを復元できます",
|
||||
"recoveryKeySaveDescription": "リカバリーキーは私達も保管しません。24語の単語たちを安全な場所に保管してください",
|
||||
"recoveryKeyOnForgotPassword": "パスワードを忘れてしまったら、このリカバリーキーがあなたのデータを復元する唯一の方法です。",
|
||||
"recoveryKeySaveDescription": "リカバリーキーは私達も保管しません。この24個の単語を安全な場所に保管してください。",
|
||||
"doThisLater": "あとで行う",
|
||||
"saveKey": "キーを保存",
|
||||
"recoveryKeyCopiedToClipboard": "リカバリーキーはクリップボードにコピーされました",
|
||||
@@ -196,7 +196,7 @@
|
||||
"linkExpiry": "リンクの期限切れ",
|
||||
"linkExpired": "期限切れ",
|
||||
"linkEnabled": "有効",
|
||||
"linkNeverExpires": "絶対になし",
|
||||
"linkNeverExpires": "なし",
|
||||
"expiredLinkInfo": "このリンクは期限切れです。新たな期限を設定するか、期限設定そのものを無くすか、選択してください",
|
||||
"setAPassword": "パスワードを設定",
|
||||
"lockButtonLabel": "ロック",
|
||||
@@ -226,10 +226,10 @@
|
||||
},
|
||||
"description": "Number of participants in an album, including the album owner."
|
||||
},
|
||||
"collabLinkSectionDescription": "Enteアプリやアカウントを必要とせずに、共有アルバムに写真を追加したり表示したりできるリンクを作成します。",
|
||||
"collectPhotos": "写真を集める",
|
||||
"collabLinkSectionDescription": "Enteアプリやアカウントを持っていない人にも、共有アルバムに写真を追加したり表示したりできるリンクを作成します。",
|
||||
"collectPhotos": "写真を集めよう",
|
||||
"collaborativeLink": "共同作業リンク",
|
||||
"shareWithNonenteUsers": "Enteアカウントを持っていないユーザーと共有",
|
||||
"shareWithNonenteUsers": "Enteを使っていない人に共有",
|
||||
"createPublicLink": "公開リンクを作成",
|
||||
"sendLink": "リンクを送信",
|
||||
"copyLink": "リンクをコピー",
|
||||
@@ -247,7 +247,7 @@
|
||||
}
|
||||
},
|
||||
"thisIsYourVerificationId": "これはあなたの認証IDです",
|
||||
"someoneSharingAlbumsWithYouShouldSeeTheSameId": "アルバムを共有している人はデバイス上で同じIDを見ることができます。",
|
||||
"someoneSharingAlbumsWithYouShouldSeeTheSameId": "アルバムを共有している人はデバイス上で同じIDを見るはずです。",
|
||||
"howToViewShareeVerificationID": "設定画面でメールアドレスを長押しし、両デバイスのIDが一致していることを確認してください。",
|
||||
"thisIsPersonVerificationId": "これは {email} の確認用ID",
|
||||
"@thisIsPersonVerificationId": {
|
||||
@@ -327,6 +327,7 @@
|
||||
"removingFromFavorites": "お気に入りから削除しています...",
|
||||
"sorryCouldNotAddToFavorites": "お気に入りに追加できませんでした。",
|
||||
"sorryCouldNotRemoveFromFavorites": "お気に入りから削除できませんでした",
|
||||
"subscribeToEnableSharing": "共有を有効にするには、有料サブスクリプションが必要です。",
|
||||
"subscribe": "サブスクライブ",
|
||||
"canOnlyRemoveFilesOwnedByYou": "あなたが所有しているファイルのみを削除できます",
|
||||
"deleteSharedAlbum": "共有アルバムを削除しますか?",
|
||||
@@ -362,7 +363,7 @@
|
||||
"yesDelete": "はい、削除",
|
||||
"movedToTrash": "ごみ箱へ移動",
|
||||
"deleteFromDevice": "デバイスから削除",
|
||||
"deleteFromBoth": "Enteから削除",
|
||||
"deleteFromBoth": "両方から削除",
|
||||
"newAlbum": "新しいアルバム",
|
||||
"albums": "アルバム",
|
||||
"memoryCount": "{count, plural, zero{思い出なし} one{{formattedCount} 思い出} other{{formattedCount} 思い出}}",
|
||||
@@ -419,6 +420,25 @@
|
||||
"mlConsentPrivacy": "この機能の詳細については、こちらをクリックしてください。",
|
||||
"mlConsentConfirmation": "機械学習を可能にしたい",
|
||||
"magicSearch": "マジックサーチ",
|
||||
"discover": "ディスカバー",
|
||||
"@discover": {
|
||||
"description": "The text to display for the discover section under which we show receipts, screenshots, sunsets, greenery, etc."
|
||||
},
|
||||
"discover_identity": "アイデンティティ",
|
||||
"discover_screenshots": "スクリーンショット",
|
||||
"discover_receipts": "領収書",
|
||||
"discover_notes": "メモ",
|
||||
"discover_memes": "ミーム",
|
||||
"discover_visiting_cards": "訪問カード",
|
||||
"discover_babies": "赤ちゃん",
|
||||
"discover_pets": "ペット",
|
||||
"discover_selfies": "セルフィー",
|
||||
"discover_wallpapers": "壁紙",
|
||||
"discover_food": "食べ物",
|
||||
"discover_celebrations": "お祝い",
|
||||
"discover_sunset": "夕焼け",
|
||||
"discover_hills": "丘",
|
||||
"discover_greenery": "自然",
|
||||
"mlIndexingDescription": "すべての項目が処理されるまで、機械学習は帯域幅とバッテリー使用量が高くなりますのでご注意ください。 処理を高速で終わらせたい場合はデスクトップアプリを使用するのがおすすめです。結果は自動的に同期されます。",
|
||||
"loadingModel": "モデルをダウンロード中",
|
||||
"waitingForWifi": "WiFi を待っています",
|
||||
@@ -428,10 +448,10 @@
|
||||
"clearIndexes": "行った処理をクリアする",
|
||||
"selectFoldersForBackup": "バックアップするフォルダを選択",
|
||||
"selectedFoldersWillBeEncryptedAndBackedUp": "選ばれたフォルダは暗号化されバックアップされます",
|
||||
"unselectAll": "選択を解除",
|
||||
"unselectAll": "すべての選択を解除",
|
||||
"selectAll": "全て選択",
|
||||
"skip": "スキップ",
|
||||
"updatingFolderSelection": "フォルダの選択をアップデート中",
|
||||
"updatingFolderSelection": "フォルダの選択を更新しています...",
|
||||
"itemCount": "{count, plural, other {{count}個のアイテム}}",
|
||||
"deleteItemCount": "{count, plural,=1 {{count} 個の項目を削除} other {{count} 個の項目を削除}}",
|
||||
"duplicateItemsGroup": "{count} 個のファイル、それぞれ{formattedSize}",
|
||||
@@ -457,7 +477,7 @@
|
||||
"backupOverMobileData": "モバイルデータを使ってバックアップ",
|
||||
"backupVideos": "動画をバックアップ",
|
||||
"disableAutoLock": "自動ロックを無効にする",
|
||||
"deviceLockExplanation": "進行中のバックアップ中、デバイスがスリープしないようにする。\n\n※容量の大きいアップロードに役立ちます。",
|
||||
"deviceLockExplanation": "進行中のバックアップがある場合、デバイスがスリープしないようにします。\n\n※容量の大きいアップロードがある際にご活用ください。",
|
||||
"about": "このアプリについて",
|
||||
"weAreOpenSource": "私たちはオープンソースです!",
|
||||
"privacy": "プライバシー",
|
||||
@@ -569,7 +589,7 @@
|
||||
"darkTheme": "ダーク",
|
||||
"systemTheme": "システム",
|
||||
"freeTrial": "無料トライアル",
|
||||
"selectYourPlan": "プランを選択してください",
|
||||
"selectYourPlan": "プランを選びましょう",
|
||||
"enteSubscriptionPitch": "Enteはあなたの思い出を保存します。デバイスを紛失しても、オンラインでアクセス可能です",
|
||||
"enteSubscriptionShareWithFamily": "あなたの家族もあなたの有料プランに参加することができます。",
|
||||
"currentUsageIs": "現在の使用状況 ",
|
||||
@@ -702,7 +722,7 @@
|
||||
"usePublicLinksForPeopleNotOnEnte": "公開リンクを使用する(Enteを利用しない人と共有できます)",
|
||||
"allowPeopleToAddPhotos": "写真の追加をメンバーに許可する",
|
||||
"shareAnAlbumNow": "アルバムを共有",
|
||||
"collectEventPhotos": "イベントの写真を収集する",
|
||||
"collectEventPhotos": "イベントの写真を集めよう",
|
||||
"sessionExpired": "セッション切れ",
|
||||
"loggingOut": "ログアウト中...",
|
||||
"@onDevice": {
|
||||
@@ -790,7 +810,7 @@
|
||||
"invite": "招待",
|
||||
"shareYourFirstAlbum": "アルバムの共有をしてみましょう",
|
||||
"sharedWith": "{emailIDs} と共有中",
|
||||
"sharedWithMe": "あなたに共有されています",
|
||||
"sharedWithMe": "あなたと共有されたアルバム",
|
||||
"sharedByMe": "あなたが共有しました",
|
||||
"doubleYourStorage": "ストレージを倍にしましょう",
|
||||
"referFriendsAnd2xYourPlan": "友達に紹介してあなたのプランを2倍にしよう",
|
||||
@@ -817,7 +837,7 @@
|
||||
"sortNewestFirst": "新しい順",
|
||||
"sortOldestFirst": "古い順",
|
||||
"rename": "名前変更",
|
||||
"leaveSharedAlbum": "共有アルバムを抜ける",
|
||||
"leaveSharedAlbum": "共有アルバムを抜けてよいですか?",
|
||||
"leaveAlbum": "アルバムを抜ける",
|
||||
"photosAddedByYouWillBeRemovedFromTheAlbum": "あなたの追加した写真はこのアルバムから削除されます",
|
||||
"youveNoFilesInThisAlbumThatCanBeDeleted": "このアルバムには消すファイルがありません",
|
||||
@@ -1011,7 +1031,7 @@
|
||||
"searchPeopleEmptySection": "友達を招待すると、共有される写真はここから閲覧できます",
|
||||
"searchAlbumsEmptySection": "アルバム",
|
||||
"searchFileTypesAndNamesEmptySection": "ファイルの種類と名前",
|
||||
"searchCaptionEmptySection": "写真情報に \"#trip\" のように説明を追加して、簡単に見つけられます",
|
||||
"searchCaptionEmptySection": "写真情報に \"#trip\" のように説明を追加すれば、ここで簡単に見つけることができます",
|
||||
"language": "言語",
|
||||
"selectLanguage": "言語を選ぶ",
|
||||
"locationName": "場所名",
|
||||
@@ -1132,10 +1152,10 @@
|
||||
},
|
||||
"maps": "地図",
|
||||
"enableMaps": "マップを有効にする",
|
||||
"enableMapsDesc": "これは世界地図上にあなたの写真を表示します。\n\n地図はOpenStreetMapを利用しており、あなたの写真のいち情報が共有されることはありません。\n\nこの機能は設定から無効にすることができます",
|
||||
"enableMapsDesc": "世界地図上にあなたの写真を表示します。\n\n地図はOpenStreetMapを利用しており、あなたの写真の位置情報が外部に共有されることはありません。\n\nこの機能は設定から無効にすることができます",
|
||||
"quickLinks": "クイックリンク",
|
||||
"selectItemsToAdd": "追加するアイテムを選択",
|
||||
"addSelected": "追加選択",
|
||||
"selectItemsToAdd": "追加するアイテムを選んでください",
|
||||
"addSelected": "選んだものをアルバムに追加",
|
||||
"addFromDevice": "デバイスから追加",
|
||||
"addPhotos": "写真を追加",
|
||||
"noPhotosFoundHere": "写真が見つかりません",
|
||||
@@ -1145,7 +1165,7 @@
|
||||
"pinAlbum": "アルバムをピンする",
|
||||
"create": "作成",
|
||||
"viewAll": "すべて表示",
|
||||
"nothingSharedWithYouYet": "あなたと共有されたものはありません",
|
||||
"nothingSharedWithYouYet": "あなたに共有されたものはありません",
|
||||
"noAlbumsSharedByYouYet": "あなたが共有したアルバムはまだありません",
|
||||
"sharedWithYou": "あなたと共有されています",
|
||||
"sharedByYou": "あなたが共有しました",
|
||||
@@ -1190,7 +1210,7 @@
|
||||
}
|
||||
},
|
||||
"faces": "顔",
|
||||
"people": "人",
|
||||
"people": "人物",
|
||||
"contents": "内容",
|
||||
"addNew": "新規追加",
|
||||
"@addNew": {
|
||||
@@ -1309,9 +1329,19 @@
|
||||
"thisWillRemovePublicLinksOfAllSelectedQuickLinks": "選択したすべてのクイックリンクの公開リンクを削除します。",
|
||||
"guestView": "ゲストビュー",
|
||||
"guestViewEnablePreSteps": "アプリのロックを有効にするには、システム設定でデバイスのパスコードまたは画面ロックを設定してください。",
|
||||
"appLockDescriptions": "デバイスのデフォルトのロック画面と、カスタムロック画面を選択します。",
|
||||
"nameTheAlbum": "アルバムに名前を付けよう",
|
||||
"collectPhotosDescription": "友達が写真をアップロードできるリンクを作成できます",
|
||||
"collect": "集める",
|
||||
"appLockDescriptions": "デバイスのデフォルトのロック画面と、カスタムロック画面のどちらを利用しますか?",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "アプリのロックを有効にするには、システム設定でデバイスのパスコードまたは画面ロックを設定してください。",
|
||||
"authToViewPasskey": "パスキーを表示するには認証してください",
|
||||
"loopVideoOn": "ビデオのループをオン",
|
||||
"loopVideoOff": "ビデオのループをオフ"
|
||||
"loopVideoOff": "ビデオのループをオフ",
|
||||
"localSyncErrorMessage": "ローカルの写真の同期には予想以上の時間がかかっています。問題が発生したようです。サポートチームまでご連絡ください。",
|
||||
"showPerson": "人物を表示",
|
||||
"sort": "並び替え",
|
||||
"mostRecent": "新しい順",
|
||||
"mostRelevant": "関連度順",
|
||||
"loadingYourPhotos": "写真を読み込んでいます...",
|
||||
"processingImport": "{folderName} を処理中..."
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"@@locale ": "en",
|
||||
"enterYourEmailAddress": "Insira o seu endereço de e-mail",
|
||||
"accountWelcomeBack": "Bem-vindo de volta!",
|
||||
"enterYourEmailAddress": "Insira seu endereço de e-mail",
|
||||
"accountWelcomeBack": "Seja bem-vindo de volta!",
|
||||
"email": "E-mail",
|
||||
"cancel": "Cancelar",
|
||||
"verify": "Verificar",
|
||||
|
||||
@@ -139,10 +139,10 @@ class HomeWidgetService {
|
||||
iOSName: 'SlideshowWidget',
|
||||
);
|
||||
_logger.info(
|
||||
">>> OG size of SlideshowWidget image: ${width} x $height",
|
||||
">>> OG size of SlideshowWidget image: $width x $height",
|
||||
);
|
||||
_logger.info(
|
||||
">>> SlideshowWidget image rendered with size ${cacheWidth} x $cacheHeight",
|
||||
">>> SlideshowWidget image rendered with size $cacheWidth x $cacheHeight",
|
||||
);
|
||||
} catch (e) {
|
||||
_logger.severe("Error rendering widget", e);
|
||||
@@ -217,7 +217,7 @@ class HomeWidgetService {
|
||||
if (res == null) return;
|
||||
|
||||
final page = DetailPage(
|
||||
DetailPageConfiguration(List.unmodifiable([res]), null, 0, "collection"),
|
||||
DetailPageConfiguration(List.unmodifiable([res]), 0, "collection"),
|
||||
);
|
||||
routeToPage(context, page, forceCustomPageRoute: true).ignore();
|
||||
}
|
||||
|
||||
@@ -61,9 +61,9 @@ class _WebPageState extends State<WebPage> {
|
||||
),
|
||||
backgroundColor: Colors.black,
|
||||
body: InAppWebView(
|
||||
initialUrlRequest: URLRequest(url: Uri.parse(widget.url)),
|
||||
initialOptions: InAppWebViewGroupOptions(
|
||||
crossPlatform: InAppWebViewOptions(transparentBackground: true),
|
||||
initialUrlRequest: URLRequest(url: WebUri(widget.url)),
|
||||
initialSettings: InAppWebViewSettings(
|
||||
transparentBackground: true,
|
||||
),
|
||||
onLoadStop: (c, url) {
|
||||
setState(() {
|
||||
|
||||
@@ -13,6 +13,7 @@ import 'package:photos/services/collections_service.dart';
|
||||
import "package:photos/services/filter/db_filters.dart";
|
||||
import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class HomeGalleryWidget extends StatelessWidget {
|
||||
@@ -21,11 +22,11 @@ class HomeGalleryWidget extends StatelessWidget {
|
||||
final SelectedFiles selectedFiles;
|
||||
|
||||
const HomeGalleryWidget({
|
||||
Key? key,
|
||||
super.key,
|
||||
this.header,
|
||||
this.footer,
|
||||
required this.selectedFiles,
|
||||
}) : super(key: key);
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -85,14 +86,16 @@ class HomeGalleryWidget extends StatelessWidget {
|
||||
reloadDebounceTime: const Duration(seconds: 2),
|
||||
reloadDebounceExecutionInterval: const Duration(seconds: 5),
|
||||
);
|
||||
return SelectionState(
|
||||
selectedFiles: selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(GalleryType.homepage, selectedFiles),
|
||||
],
|
||||
return GalleryFilesState(
|
||||
child: SelectionState(
|
||||
selectedFiles: selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(GalleryType.homepage, selectedFiles),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import "package:photos/theme/ente_theme.dart";
|
||||
import "package:photos/ui/common/loading_widget.dart";
|
||||
import "package:photos/ui/viewer/actions/file_selection_overlay_bar.dart";
|
||||
import "package:photos/ui/viewer/gallery/gallery.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class MapPullUpGallery extends StatefulWidget {
|
||||
@@ -29,8 +30,8 @@ class MapPullUpGallery extends StatefulWidget {
|
||||
this.visibleImages,
|
||||
this.bottomSheetDraggableAreaHeight,
|
||||
this.bottomUnsafeArea, {
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<MapPullUpGallery> createState() => _MapPullUpGalleryState();
|
||||
@@ -49,40 +50,42 @@ class _MapPullUpGalleryState extends State<MapPullUpGallery> {
|
||||
Widget? cachedScrollableContent;
|
||||
|
||||
return DeferredPointerHandler(
|
||||
child: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
DraggableScrollableSheet(
|
||||
expand: false,
|
||||
initialChildSize: initialChildSize,
|
||||
minChildSize: initialChildSize,
|
||||
maxChildSize: 0.8,
|
||||
snap: true,
|
||||
snapSizes: const [0.5],
|
||||
builder: (context, scrollController) {
|
||||
//Must use cached widget here to avoid rebuilds when DraggableScrollableSheet
|
||||
//is snapped to it's initialChildSize
|
||||
cachedScrollableContent ??=
|
||||
cacheScrollableContent(scrollController, context, logger);
|
||||
return cachedScrollableContent!;
|
||||
},
|
||||
),
|
||||
DeferPointer(
|
||||
//This is to make the FileSelectionOverlayBar respect SafeArea
|
||||
child: MediaQuery(
|
||||
data: MediaQueryData.fromView(View.of(context)),
|
||||
child: FileSelectionOverlayBar(
|
||||
GalleryType.searchResults,
|
||||
_selectedFiles,
|
||||
backgroundColor:
|
||||
getEnteColorScheme(context).backgroundElevated2,
|
||||
child: GalleryFilesState(
|
||||
child: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
DraggableScrollableSheet(
|
||||
expand: false,
|
||||
initialChildSize: initialChildSize,
|
||||
minChildSize: initialChildSize,
|
||||
maxChildSize: 0.8,
|
||||
snap: true,
|
||||
snapSizes: const [0.5],
|
||||
builder: (context, scrollController) {
|
||||
//Must use cached widget here to avoid rebuilds when DraggableScrollableSheet
|
||||
//is snapped to it's initialChildSize
|
||||
cachedScrollableContent ??=
|
||||
cacheScrollableContent(scrollController, context, logger);
|
||||
return cachedScrollableContent!;
|
||||
},
|
||||
),
|
||||
DeferPointer(
|
||||
//This is to make the FileSelectionOverlayBar respect SafeArea
|
||||
child: MediaQuery(
|
||||
data: MediaQueryData.fromView(View.of(context)),
|
||||
child: FileSelectionOverlayBar(
|
||||
GalleryType.searchResults,
|
||||
_selectedFiles,
|
||||
backgroundColor:
|
||||
getEnteColorScheme(context).backgroundElevated2,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -33,7 +33,7 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
||||
final String basePaymentUrl = kWebPaymentBaseEndpoint;
|
||||
InAppWebViewController? webView;
|
||||
double progress = 0;
|
||||
Uri? initPaymentUrl;
|
||||
WebUri? initPaymentUrl;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -42,7 +42,7 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
||||
setState(() {});
|
||||
});
|
||||
if (Platform.isAndroid && kDebugMode) {
|
||||
AndroidInAppWebViewController.setWebContentsDebuggingEnabled(true);
|
||||
InAppWebViewController.setWebContentsDebuggingEnabled(true);
|
||||
}
|
||||
super.initState();
|
||||
}
|
||||
@@ -79,10 +79,8 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
||||
this.progress = progress / 100;
|
||||
});
|
||||
},
|
||||
initialOptions: InAppWebViewGroupOptions(
|
||||
crossPlatform: InAppWebViewOptions(
|
||||
useShouldOverrideUrlLoading: true,
|
||||
),
|
||||
initialSettings: InAppWebViewSettings(
|
||||
useShouldOverrideUrlLoading: true,
|
||||
),
|
||||
shouldOverrideUrlLoading: (controller, navigationAction) async {
|
||||
final loadingUri = navigationAction.request.url;
|
||||
@@ -100,12 +98,12 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
||||
onLoadStart: (controller, navigationAction) async {
|
||||
_logger.info("onLoadStart $navigationAction");
|
||||
},
|
||||
onLoadError: (controller, navigationAction, code, msg) async {
|
||||
_logger.severe("onLoadError $navigationAction $code $msg");
|
||||
onReceivedError: (controller, navigationAction, code) async {
|
||||
_logger.severe("onLoadError $navigationAction $code");
|
||||
},
|
||||
onLoadHttpError:
|
||||
(controller, navigationAction, code, msg) async {
|
||||
_logger.info("onHttpError with $code and msg = $msg");
|
||||
onReceivedHttpError:
|
||||
(controller, navigationAction, code) async {
|
||||
_logger.info("onHttpError with $code");
|
||||
},
|
||||
onLoadStop: (controller, navigationAction) async {
|
||||
_logger.info("onLoadStop $navigationAction");
|
||||
@@ -123,7 +121,7 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Uri _getPaymentUrl(String? paymentToken) {
|
||||
WebUri _getPaymentUrl(String? paymentToken) {
|
||||
final queryParameters = {
|
||||
'productID': widget.planId,
|
||||
'paymentToken': paymentToken,
|
||||
@@ -132,9 +130,13 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
||||
};
|
||||
final tryParse = Uri.tryParse(kWebPaymentBaseEndpoint);
|
||||
if (kDebugMode && kWebPaymentBaseEndpoint.startsWith("http://")) {
|
||||
return Uri.http(tryParse!.authority, tryParse.path, queryParameters);
|
||||
return WebUri.uri(
|
||||
Uri.http(tryParse!.authority, tryParse.path, queryParameters),
|
||||
);
|
||||
} else {
|
||||
return Uri.https(tryParse!.authority, tryParse.path, queryParameters);
|
||||
return WebUri.uri(
|
||||
Uri.https(tryParse!.authority, tryParse.path, queryParameters),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,12 +42,12 @@ class SaveCollageButton extends StatelessWidget {
|
||||
".jpeg";
|
||||
AssetEntity? newAsset = await (PhotoManager.editor.saveImage(
|
||||
compressedBytes,
|
||||
title: fileName,
|
||||
filename: fileName,
|
||||
relativePath: "ente Collages",
|
||||
));
|
||||
newAsset ??= await (PhotoManager.editor.saveImage(
|
||||
compressedBytes,
|
||||
title: fileName,
|
||||
filename: fileName,
|
||||
));
|
||||
if (newAsset == null) {
|
||||
showShortToast(context, S.of(context).fileFailedToSaveToGallery);
|
||||
@@ -59,7 +59,7 @@ class SaveCollageButton extends StatelessWidget {
|
||||
replacePage(
|
||||
context,
|
||||
DetailPage(
|
||||
DetailPageConfiguration([newFile], null, 0, "collage"),
|
||||
DetailPageConfiguration([newFile], 0, "collage"),
|
||||
),
|
||||
result: true,
|
||||
);
|
||||
|
||||
@@ -22,7 +22,7 @@ import 'package:photos/utils/navigation_util.dart';
|
||||
class DeduplicatePage extends StatefulWidget {
|
||||
final List<DuplicateFiles> duplicates;
|
||||
|
||||
const DeduplicatePage(this.duplicates, {Key? key}) : super(key: key);
|
||||
const DeduplicatePage(this.duplicates, {super.key});
|
||||
|
||||
@override
|
||||
State<DeduplicatePage> createState() => _DeduplicatePageState();
|
||||
@@ -442,7 +442,6 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
|
||||
DetailPage(
|
||||
DetailPageConfiguration(
|
||||
files,
|
||||
null,
|
||||
files.indexOf(file),
|
||||
"deduplicate_",
|
||||
mode: DetailPageMode.minimalistic,
|
||||
@@ -459,7 +458,6 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
|
||||
DetailPage(
|
||||
DetailPageConfiguration(
|
||||
files,
|
||||
null,
|
||||
files.indexOf(file),
|
||||
"deduplicate_",
|
||||
mode: DetailPageMode.minimalistic,
|
||||
|
||||
@@ -352,7 +352,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
||||
//files db before triggering a sync.
|
||||
await PhotoManager.stopChangeNotify();
|
||||
final AssetEntity? newAsset =
|
||||
await (PhotoManager.editor.saveImage(result, title: fileName));
|
||||
await (PhotoManager.editor.saveImage(result, filename: fileName));
|
||||
final newFile = await ente.EnteFile.fromAsset(
|
||||
widget.originalFile.deviceFolder ?? '',
|
||||
newAsset!,
|
||||
@@ -377,12 +377,8 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
||||
showShortToast(context, S.of(context).editsSaved);
|
||||
_logger.info("Original file " + widget.originalFile.toString());
|
||||
_logger.info("Saved edits to file " + newFile.toString());
|
||||
final existingFiles = widget.detailPageConfig.files;
|
||||
final files = (await widget.detailPageConfig.asyncLoader!(
|
||||
existingFiles[existingFiles.length - 1].creationTime!,
|
||||
existingFiles[0].creationTime!,
|
||||
))
|
||||
.files;
|
||||
final files = widget.detailPageConfig.files;
|
||||
|
||||
// the index could be -1 if the files fetched doesn't contain the newly
|
||||
// edited files
|
||||
int selectionIndex =
|
||||
|
||||
@@ -262,12 +262,8 @@ class _VideoEditorPageState extends State<VideoEditorPage> {
|
||||
showShortToast(context, S.of(context).editsSaved);
|
||||
_logger.info("Original file " + widget.file.toString());
|
||||
_logger.info("Saved edits to file " + newFile.toString());
|
||||
final existingFiles = widget.detailPageConfig.files;
|
||||
final files = (await widget.detailPageConfig.asyncLoader!(
|
||||
existingFiles[existingFiles.length - 1].creationTime!,
|
||||
existingFiles[0].creationTime!,
|
||||
))
|
||||
.files;
|
||||
final files = widget.detailPageConfig.files;
|
||||
|
||||
// the index could be -1 if the files fetched doesn't contain the newly
|
||||
// edited files
|
||||
int selectionIndex = files
|
||||
|
||||
@@ -577,7 +577,6 @@ class _FileSelectionActionsWidgetState
|
||||
final page = DetailPage(
|
||||
DetailPageConfiguration(
|
||||
selectedFiles,
|
||||
null,
|
||||
0,
|
||||
"guest_view",
|
||||
),
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:photos/models/selected_files.dart';
|
||||
import "package:photos/theme/effects.dart";
|
||||
import "package:photos/theme/ente_theme.dart";
|
||||
import 'package:photos/ui/components/bottom_action_bar/bottom_action_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class FileSelectionOverlayBar extends StatefulWidget {
|
||||
@@ -23,8 +24,8 @@ class FileSelectionOverlayBar extends StatefulWidget {
|
||||
this.backgroundColor,
|
||||
this.person,
|
||||
this.clusterID,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<FileSelectionOverlayBar> createState() =>
|
||||
@@ -136,6 +137,7 @@ class _SelectAllButtonState extends State<SelectAllButton> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final selectionState = SelectionState.of(context);
|
||||
final allGalleryFiles = GalleryFilesState.of(context).galleryFiles;
|
||||
assert(
|
||||
selectionState != null,
|
||||
"SelectionState not found in context, SelectionState should be an ancestor of FileSelectionOverlayBar",
|
||||
@@ -147,8 +149,9 @@ class _SelectAllButtonState extends State<SelectAllButton> {
|
||||
if (_allSelected) {
|
||||
selectionState.selectedFiles.clearAll();
|
||||
} else {
|
||||
selectionState.selectedFiles
|
||||
.selectAll(selectionState.allGalleryFiles!.toSet());
|
||||
selectionState.selectedFiles.selectAll(
|
||||
allGalleryFiles.toSet(),
|
||||
);
|
||||
}
|
||||
_allSelected = !_allSelected;
|
||||
});
|
||||
@@ -181,7 +184,7 @@ class _SelectAllButtonState extends State<SelectAllButton> {
|
||||
listenable: selectionState!.selectedFiles,
|
||||
builder: (context, _) {
|
||||
if (selectionState.selectedFiles.files.length ==
|
||||
selectionState.allGalleryFiles?.length) {
|
||||
allGalleryFiles.length) {
|
||||
_allSelected = true;
|
||||
} else {
|
||||
_allSelected = false;
|
||||
|
||||
@@ -7,7 +7,6 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/core/constants.dart';
|
||||
import 'package:photos/core/errors.dart';
|
||||
import "package:photos/core/event_bus.dart";
|
||||
import "package:photos/events/guest_view_event.dart";
|
||||
@@ -38,19 +37,15 @@ enum DetailPageMode {
|
||||
|
||||
class DetailPageConfiguration {
|
||||
final List<EnteFile> files;
|
||||
final GalleryLoader? asyncLoader;
|
||||
final int selectedIndex;
|
||||
final String tagPrefix;
|
||||
final DetailPageMode mode;
|
||||
final bool sortOrderAsc;
|
||||
|
||||
DetailPageConfiguration(
|
||||
this.files,
|
||||
this.asyncLoader,
|
||||
this.selectedIndex,
|
||||
this.tagPrefix, {
|
||||
this.mode = DetailPageMode.full,
|
||||
this.sortOrderAsc = false,
|
||||
});
|
||||
|
||||
DetailPageConfiguration copyWith({
|
||||
@@ -58,14 +53,11 @@ class DetailPageConfiguration {
|
||||
GalleryLoader? asyncLoader,
|
||||
int? selectedIndex,
|
||||
String? tagPrefix,
|
||||
bool? sortOrderAsc,
|
||||
}) {
|
||||
return DetailPageConfiguration(
|
||||
files ?? this.files,
|
||||
asyncLoader ?? this.asyncLoader,
|
||||
selectedIndex ?? this.selectedIndex,
|
||||
tagPrefix ?? this.tagPrefix,
|
||||
sortOrderAsc: sortOrderAsc ?? this.sortOrderAsc,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -80,14 +72,11 @@ class DetailPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _DetailPageState extends State<DetailPage> {
|
||||
static const kLoadLimit = 100;
|
||||
final _logger = Logger("DetailPageState");
|
||||
bool _shouldDisableScroll = false;
|
||||
List<EnteFile>? _files;
|
||||
late PageController _pageController;
|
||||
final _selectedIndexNotifier = ValueNotifier(0);
|
||||
bool _hasLoadedTillStart = false;
|
||||
bool _hasLoadedTillEnd = false;
|
||||
final _enableFullScreenNotifier = ValueNotifier(false);
|
||||
bool _isFirstOpened = true;
|
||||
bool isGuestView = false;
|
||||
@@ -97,11 +86,9 @@ class _DetailPageState extends State<DetailPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_files = [
|
||||
...widget.config.files,
|
||||
]; // Make a copy since we append preceding and succeeding entries to this
|
||||
_files = widget.config.files;
|
||||
|
||||
_selectedIndexNotifier.value = widget.config.selectedIndex;
|
||||
_preloadEntries();
|
||||
_pageController = PageController(initialPage: _selectedIndexNotifier.value);
|
||||
_guestViewEventSubscription =
|
||||
Bus.instance.on<GuestViewEvent>().listen((event) {
|
||||
@@ -311,7 +298,6 @@ class _DetailPageState extends State<DetailPage> {
|
||||
_selectedIndexNotifier.value = index;
|
||||
}
|
||||
Bus.instance.fire(GuestViewEvent(isGuestView, swipeLocked));
|
||||
_preloadEntries();
|
||||
},
|
||||
physics: _shouldDisableScroll || swipeLocked
|
||||
? const NeverScrollableScrollPhysics()
|
||||
@@ -349,74 +335,6 @@ class _DetailPageState extends State<DetailPage> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _preloadEntries() async {
|
||||
final isSortOrderAsc = widget.config.sortOrderAsc;
|
||||
|
||||
if (widget.config.asyncLoader == null) return;
|
||||
|
||||
if (_selectedIndexNotifier.value == 0 && !_hasLoadedTillStart) {
|
||||
await _loadStartEntries(isSortOrderAsc);
|
||||
}
|
||||
|
||||
if (_selectedIndexNotifier.value == _files!.length - 1 &&
|
||||
!_hasLoadedTillEnd) {
|
||||
await _loadEndEntries(isSortOrderAsc);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _loadStartEntries(bool isSortOrderAsc) async {
|
||||
final result = isSortOrderAsc
|
||||
? await widget.config.asyncLoader!(
|
||||
galleryLoadStartTime,
|
||||
_files![_selectedIndexNotifier.value].creationTime! - 1,
|
||||
limit: kLoadLimit,
|
||||
)
|
||||
: await widget.config.asyncLoader!(
|
||||
_files![_selectedIndexNotifier.value].creationTime! + 1,
|
||||
DateTime.now().microsecondsSinceEpoch,
|
||||
limit: kLoadLimit,
|
||||
asc: true,
|
||||
);
|
||||
|
||||
setState(() {
|
||||
_logger.fine('setState loadStartEntries');
|
||||
// Returned result could be a subtype of File
|
||||
// ignore: unnecessary_cast
|
||||
final files = result.files.reversed.map((e) => e as EnteFile).toList();
|
||||
if (!result.hasMore) {
|
||||
_hasLoadedTillStart = true;
|
||||
}
|
||||
final length = files.length;
|
||||
files.addAll(_files!);
|
||||
_files = files;
|
||||
_pageController.jumpToPage(length);
|
||||
_selectedIndexNotifier.value = length;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _loadEndEntries(bool isSortOrderAsc) async {
|
||||
final result = isSortOrderAsc
|
||||
? await widget.config.asyncLoader!(
|
||||
_files![_selectedIndexNotifier.value].creationTime! + 1,
|
||||
DateTime.now().microsecondsSinceEpoch,
|
||||
limit: kLoadLimit,
|
||||
asc: true,
|
||||
)
|
||||
: await widget.config.asyncLoader!(
|
||||
galleryLoadStartTime,
|
||||
_files![_selectedIndexNotifier.value].creationTime! - 1,
|
||||
limit: kLoadLimit,
|
||||
);
|
||||
|
||||
setState(() {
|
||||
if (!result.hasMore) {
|
||||
_hasLoadedTillEnd = true;
|
||||
}
|
||||
_logger.fine('setState loadEndEntries hasMore ${result.hasMore}');
|
||||
_files!.addAll(result.files);
|
||||
});
|
||||
}
|
||||
|
||||
void _preloadFiles(int index) {
|
||||
if (index > 0) {
|
||||
preloadFile(_files![index - 1]);
|
||||
@@ -434,7 +352,7 @@ class _DetailPageState extends State<DetailPage> {
|
||||
return;
|
||||
}
|
||||
setState(() {
|
||||
_files!.remove(file);
|
||||
_files!.removeAt(_selectedIndexNotifier.value);
|
||||
_selectedIndexNotifier.value = min(
|
||||
_selectedIndexNotifier.value,
|
||||
totalFiles - 2,
|
||||
|
||||
@@ -15,6 +15,7 @@ import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
|
||||
import "package:photos/ui/viewer/gallery/empty_state.dart";
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class ArchivePage extends StatelessWidget {
|
||||
@@ -27,8 +28,8 @@ class ArchivePage extends StatelessWidget {
|
||||
this.tagPrefix = "archived_page",
|
||||
this.appBarType = GalleryType.archive,
|
||||
this.overlayType = GalleryType.archive,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -78,26 +79,28 @@ class ArchivePage extends StatelessWidget {
|
||||
CollectionsService.instance.getArchivedCollection,
|
||||
),
|
||||
);
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
appBarType,
|
||||
S.of(context).archive,
|
||||
_selectedFiles,
|
||||
return GalleryFilesState(
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
appBarType,
|
||||
S.of(context).archive,
|
||||
_selectedFiles,
|
||||
),
|
||||
),
|
||||
),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -17,6 +17,7 @@ import "package:photos/ui/viewer/gallery/empty_album_state.dart";
|
||||
import 'package:photos/ui/viewer/gallery/empty_state.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class CollectionPage extends StatelessWidget {
|
||||
@@ -30,8 +31,8 @@ class CollectionPage extends StatelessWidget {
|
||||
this.tagPrefix = "collection",
|
||||
this.hasVerifiedLock = false,
|
||||
this.isFromCollectPhotos = false,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
final _selectedFiles = SelectedFiles();
|
||||
|
||||
@@ -98,35 +99,37 @@ class CollectionPage extends StatelessWidget {
|
||||
? const SizedBox(height: 20)
|
||||
: const SizedBox(height: 212),
|
||||
);
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
galleryType,
|
||||
c.collection.displayName,
|
||||
_selectedFiles,
|
||||
collection: c.collection,
|
||||
isFromCollectPhotos: isFromCollectPhotos,
|
||||
return GalleryFilesState(
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
galleryType,
|
||||
c.collection.displayName,
|
||||
_selectedFiles,
|
||||
collection: c.collection,
|
||||
isFromCollectPhotos: isFromCollectPhotos,
|
||||
),
|
||||
),
|
||||
),
|
||||
bottomNavigationBar: isFromCollectPhotos
|
||||
? CollectPhotosBottomButtons(
|
||||
c.collection,
|
||||
selectedFiles: _selectedFiles,
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
galleryType,
|
||||
_selectedFiles,
|
||||
collection: c.collection,
|
||||
),
|
||||
],
|
||||
bottomNavigationBar: isFromCollectPhotos
|
||||
? CollectPhotosBottomButtons(
|
||||
c.collection,
|
||||
selectedFiles: _selectedFiles,
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
galleryType,
|
||||
_selectedFiles,
|
||||
collection: c.collection,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -11,6 +11,7 @@ import "package:photos/ui/viewer/file/detail_page.dart";
|
||||
import "package:photos/ui/viewer/file/thumbnail_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/gallery.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_context_state.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/utils/file_util.dart";
|
||||
import "package:photos/utils/navigation_util.dart";
|
||||
|
||||
@@ -21,7 +22,6 @@ class GalleryFileWidget extends StatelessWidget {
|
||||
final String tag;
|
||||
final int photoGridSize;
|
||||
final int? currentUserID;
|
||||
final List<EnteFile> filesInGroup;
|
||||
final GalleryLoader asyncLoader;
|
||||
const GalleryFileWidget({
|
||||
required this.file,
|
||||
@@ -30,7 +30,6 @@ class GalleryFileWidget extends StatelessWidget {
|
||||
required this.tag,
|
||||
required this.photoGridSize,
|
||||
required this.currentUserID,
|
||||
required this.filesInGroup,
|
||||
required this.asyncLoader,
|
||||
super.key,
|
||||
});
|
||||
@@ -165,13 +164,12 @@ class GalleryFileWidget extends StatelessWidget {
|
||||
}
|
||||
|
||||
void _routeToDetailPage(EnteFile file, BuildContext context) {
|
||||
final galleryFiles = GalleryFilesState.of(context).galleryFiles;
|
||||
final page = DetailPage(
|
||||
DetailPageConfiguration(
|
||||
List.unmodifiable(filesInGroup),
|
||||
asyncLoader,
|
||||
filesInGroup.indexOf(file),
|
||||
galleryFiles,
|
||||
galleryFiles.indexOf(file),
|
||||
tag,
|
||||
sortOrderAsc: GalleryContextState.of(context)!.sortOrderAsc,
|
||||
),
|
||||
);
|
||||
routeToPage(context, page, forceCustomPageRoute: true);
|
||||
|
||||
@@ -38,7 +38,6 @@ class GalleryGridViewWidget extends StatelessWidget {
|
||||
tag: tag,
|
||||
photoGridSize: photoGridSize,
|
||||
currentUserID: currentUserID,
|
||||
filesInGroup: filesInGroup,
|
||||
asyncLoader: asyncLoader,
|
||||
);
|
||||
},
|
||||
|
||||
@@ -22,13 +22,14 @@ import 'package:photos/ui/components/toggle_switch_widget.dart';
|
||||
import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class DeviceFolderPage extends StatelessWidget {
|
||||
final DeviceCollection deviceCollection;
|
||||
final _selectedFiles = SelectedFiles();
|
||||
|
||||
DeviceFolderPage(this.deviceCollection, {Key? key}) : super(key: key);
|
||||
DeviceFolderPage(this.deviceCollection, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(Object context) {
|
||||
@@ -57,27 +58,29 @@ class DeviceFolderPage extends StatelessWidget {
|
||||
: const SizedBox.shrink(),
|
||||
initialFiles: [deviceCollection.thumbnail!],
|
||||
);
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
GalleryType.localFolder,
|
||||
deviceCollection.name,
|
||||
_selectedFiles,
|
||||
deviceCollection: deviceCollection,
|
||||
return GalleryFilesState(
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
GalleryType.localFolder,
|
||||
deviceCollection.name,
|
||||
_selectedFiles,
|
||||
deviceCollection: deviceCollection,
|
||||
),
|
||||
),
|
||||
),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
GalleryType.localFolder,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
GalleryType.localFolder,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -16,7 +16,7 @@ import "package:photos/ui/viewer/gallery/component/group/type.dart";
|
||||
import "package:photos/ui/viewer/gallery/component/multiple_groups_gallery_view.dart";
|
||||
import 'package:photos/ui/viewer/gallery/empty_state.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_context_state.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/utils/debouncer.dart";
|
||||
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
|
||||
|
||||
@@ -53,7 +53,9 @@ class Gallery extends StatefulWidget {
|
||||
final bool limitSelectionToOne;
|
||||
|
||||
/// When true, the gallery will be in selection mode. Tapping on any item
|
||||
/// will select even when no other item is selected.
|
||||
/// will select it even when no other item is selected. This is only used to
|
||||
/// make selection possible without long pressing. If a gallery has selected
|
||||
/// files, it's not necessary that this will be true.
|
||||
final bool inSelectionMode;
|
||||
final bool showSelectAllByDefault;
|
||||
final bool isScrollablePositionedList;
|
||||
@@ -86,8 +88,8 @@ class Gallery extends StatefulWidget {
|
||||
this.isScrollablePositionedList = true,
|
||||
this.reloadDebounceTime = const Duration(milliseconds: 500),
|
||||
this.reloadDebounceExecutionInterval = const Duration(seconds: 2),
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<Gallery> createState() {
|
||||
@@ -250,7 +252,7 @@ class GalleryState extends State<Gallery> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_logger.finest("Building Gallery ${widget.tagPrefix}");
|
||||
SelectionState.of(context)?.allGalleryFiles = _allFiles;
|
||||
GalleryFilesState.of(context).setGalleryFiles = _allFiles;
|
||||
if (!_hasLoadedFiles) {
|
||||
return widget.loadingWidget;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
|
||||
import 'package:photos/ui/viewer/gallery/empty_hidden_widget.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class HiddenPage extends StatefulWidget {
|
||||
@@ -30,8 +31,8 @@ class HiddenPage extends StatefulWidget {
|
||||
this.tagPrefix = "hidden_page",
|
||||
this.appBarType = GalleryType.hiddenSection,
|
||||
this.overlayType = GalleryType.hiddenSection,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<HiddenPage> createState() => _HiddenPageState();
|
||||
@@ -131,26 +132,28 @@ class _HiddenPageState extends State<HiddenPage> {
|
||||
hasVerifiedLock: true,
|
||||
),
|
||||
);
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
widget.appBarType,
|
||||
S.of(context).hidden,
|
||||
_selectedFiles,
|
||||
return GalleryFilesState(
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
widget.appBarType,
|
||||
S.of(context).hidden,
|
||||
_selectedFiles,
|
||||
),
|
||||
),
|
||||
),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
widget.overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
widget.overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -23,6 +23,7 @@ import "package:photos/ui/components/buttons/button_widget.dart";
|
||||
import "package:photos/ui/components/models/button_type.dart";
|
||||
import "package:photos/ui/components/title_bar_title_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/gallery.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/utils/dialog_util.dart";
|
||||
import "package:photos/utils/photo_manager_util.dart";
|
||||
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
||||
@@ -279,36 +280,38 @@ class _DelayedGalleryState extends State<DelayedGallery> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_showGallery) {
|
||||
return Gallery(
|
||||
inSelectionMode: true,
|
||||
asyncLoader: (
|
||||
creationStartTime,
|
||||
creationEndTime, {
|
||||
limit,
|
||||
asc,
|
||||
}) {
|
||||
return FilesDB.instance.getAllPendingOrUploadedFiles(
|
||||
return GalleryFilesState(
|
||||
child: Gallery(
|
||||
inSelectionMode: true,
|
||||
asyncLoader: (
|
||||
creationStartTime,
|
||||
creationEndTime,
|
||||
Configuration.instance.getUserID()!,
|
||||
limit: limit,
|
||||
asc: asc,
|
||||
filterOptions: DBFilterOptions(
|
||||
hideIgnoredForUpload: true,
|
||||
dedupeUploadID: true,
|
||||
ignoredCollectionIDs: widget.hiddenCollectionIDs,
|
||||
creationEndTime, {
|
||||
limit,
|
||||
asc,
|
||||
}) {
|
||||
return FilesDB.instance.getAllPendingOrUploadedFiles(
|
||||
creationStartTime,
|
||||
creationEndTime,
|
||||
Configuration.instance.getUserID()!,
|
||||
limit: limit,
|
||||
asc: asc,
|
||||
filterOptions: DBFilterOptions(
|
||||
hideIgnoredForUpload: true,
|
||||
dedupeUploadID: true,
|
||||
ignoredCollectionIDs: widget.hiddenCollectionIDs,
|
||||
),
|
||||
applyOwnerCheck: true,
|
||||
);
|
||||
},
|
||||
tagPrefix: "pick_add_photos_gallery",
|
||||
selectedFiles: widget.selectedFiles,
|
||||
showSelectAllByDefault: true,
|
||||
sortAsyncFn: () => false,
|
||||
).animate().fadeIn(
|
||||
duration: const Duration(milliseconds: 175),
|
||||
curve: Curves.easeOutCirc,
|
||||
),
|
||||
applyOwnerCheck: true,
|
||||
);
|
||||
},
|
||||
tagPrefix: "pick_add_photos_gallery",
|
||||
selectedFiles: widget.selectedFiles,
|
||||
showSelectAllByDefault: true,
|
||||
sortAsyncFn: () => false,
|
||||
).animate().fadeIn(
|
||||
duration: const Duration(milliseconds: 175),
|
||||
curve: Curves.easeOutCirc,
|
||||
);
|
||||
);
|
||||
} else {
|
||||
return const EnteLoadingWidget();
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import "package:photos/ui/components/buttons/button_widget.dart";
|
||||
import "package:photos/ui/components/models/button_type.dart";
|
||||
import "package:photos/ui/components/title_bar_title_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/gallery.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
|
||||
Future<int?> showPickCoverPhotoSheet(
|
||||
BuildContext context,
|
||||
@@ -81,43 +82,46 @@ class PickCoverPhotoWidget extends StatelessWidget {
|
||||
showCloseButton: true,
|
||||
),
|
||||
Expanded(
|
||||
child: Gallery(
|
||||
asyncLoader: (
|
||||
creationStartTime,
|
||||
creationEndTime, {
|
||||
limit,
|
||||
asc,
|
||||
}) async {
|
||||
final FileLoadResult result =
|
||||
await FilesDB.instance.getFilesInCollection(
|
||||
collection.id,
|
||||
child: GalleryFilesState(
|
||||
child: Gallery(
|
||||
asyncLoader: (
|
||||
creationStartTime,
|
||||
creationEndTime,
|
||||
limit: limit,
|
||||
asc: asc,
|
||||
);
|
||||
// hide ignored files from home page UI
|
||||
final ignoredIDs = await IgnoredFilesService
|
||||
.instance.idToIgnoreReasonMap;
|
||||
result.files.removeWhere(
|
||||
(f) =>
|
||||
f.uploadedFileID == null &&
|
||||
IgnoredFilesService.instance
|
||||
.shouldSkipUpload(ignoredIDs, f),
|
||||
);
|
||||
return result;
|
||||
},
|
||||
reloadEvent:
|
||||
Bus.instance.on<CollectionUpdatedEvent>().where(
|
||||
(event) =>
|
||||
event.collectionID == collection.id,
|
||||
),
|
||||
tagPrefix: "pick_center_point_gallery",
|
||||
selectedFiles: selectedFiles,
|
||||
limitSelectionToOne: true,
|
||||
showSelectAllByDefault: false,
|
||||
sortAsyncFn: () =>
|
||||
collection.pubMagicMetadata.asc ?? false,
|
||||
creationEndTime, {
|
||||
limit,
|
||||
asc,
|
||||
}) async {
|
||||
final FileLoadResult result =
|
||||
await FilesDB.instance.getFilesInCollection(
|
||||
collection.id,
|
||||
creationStartTime,
|
||||
creationEndTime,
|
||||
limit: limit,
|
||||
asc: asc,
|
||||
);
|
||||
// hide ignored files from home page UI
|
||||
final ignoredIDs = await IgnoredFilesService
|
||||
.instance.idToIgnoreReasonMap;
|
||||
result.files.removeWhere(
|
||||
(f) =>
|
||||
f.uploadedFileID == null &&
|
||||
IgnoredFilesService.instance
|
||||
.shouldSkipUpload(ignoredIDs, f),
|
||||
);
|
||||
return result;
|
||||
},
|
||||
reloadEvent: Bus.instance
|
||||
.on<CollectionUpdatedEvent>()
|
||||
.where(
|
||||
(event) =>
|
||||
event.collectionID == collection.id,
|
||||
),
|
||||
tagPrefix: "pick_center_point_gallery",
|
||||
selectedFiles: selectedFiles,
|
||||
limitSelectionToOne: true,
|
||||
showSelectAllByDefault: false,
|
||||
sortAsyncFn: () =>
|
||||
collection.pubMagicMetadata.asc ?? false,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -13,6 +13,7 @@ import "package:photos/services/search_service.dart";
|
||||
import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
|
||||
import "package:photos/ui/viewer/gallery/component/group/type.dart";
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class LargeFilesPagePage extends StatelessWidget {
|
||||
@@ -26,8 +27,8 @@ class LargeFilesPagePage extends StatelessWidget {
|
||||
this.tagPrefix = "Uncategorized_page",
|
||||
this.appBarType = GalleryType.homepage,
|
||||
this.overlayType = GalleryType.homepage,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -68,34 +69,36 @@ class LargeFilesPagePage extends StatelessWidget {
|
||||
initialFiles: null,
|
||||
albumName: S.of(context).viewLargeFiles,
|
||||
);
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: AppBar(
|
||||
elevation: 0,
|
||||
centerTitle: false,
|
||||
title: Text(
|
||||
S.of(context).viewLargeFiles,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.headlineSmall!
|
||||
.copyWith(fontSize: 16),
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
return GalleryFilesState(
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: AppBar(
|
||||
elevation: 0,
|
||||
centerTitle: false,
|
||||
title: Text(
|
||||
S.of(context).viewLargeFiles,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.headlineSmall!
|
||||
.copyWith(fontSize: 16),
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import "package:flutter/material.dart";
|
||||
import "package:photos/models/file/file.dart";
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class GalleryFilesState extends InheritedWidget {
|
||||
GalleryFilesState({
|
||||
super.key,
|
||||
required super.child,
|
||||
});
|
||||
|
||||
///Should be assigned later in gallery when files are loaded.
|
||||
///Note: EnteFiles in this list should be references of the same EnteFiles
|
||||
///that are grouped in gallery, so that when files are added/deleted,
|
||||
///both lists are in sync.
|
||||
List<EnteFile>? _galleryFiles;
|
||||
|
||||
set setGalleryFiles(List<EnteFile> galleryFiles) {
|
||||
_galleryFiles = galleryFiles;
|
||||
}
|
||||
|
||||
List<EnteFile> get galleryFiles {
|
||||
if (_galleryFiles == null) {
|
||||
throw Exception(
|
||||
"Gallery files not set yet. Should be set in the gallery widget",
|
||||
);
|
||||
}
|
||||
return _galleryFiles!;
|
||||
}
|
||||
|
||||
static GalleryFilesState? maybeOf(BuildContext context) {
|
||||
return context.dependOnInheritedWidgetOfExactType<GalleryFilesState>();
|
||||
}
|
||||
|
||||
static GalleryFilesState of(BuildContext context) {
|
||||
final GalleryFilesState? result = maybeOf(context);
|
||||
assert(
|
||||
result != null,
|
||||
'No GalleryFiles found in context. GalleryFilesState should be an ancestor of the GalleryWidget, preferably over the Scaffold of Gallery.',
|
||||
);
|
||||
return result!;
|
||||
}
|
||||
|
||||
@override
|
||||
bool updateShouldNotify(GalleryFilesState oldWidget) => false;
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
import "package:flutter/material.dart";
|
||||
import "package:logging/logging.dart";
|
||||
import "package:photos/models/file/file.dart";
|
||||
import "package:photos/models/selected_files.dart";
|
||||
|
||||
///This is an inherited widget that needs to be wrapped around Gallery and
|
||||
@@ -9,17 +8,11 @@ import "package:photos/models/selected_files.dart";
|
||||
class SelectionState extends InheritedWidget {
|
||||
final SelectedFiles selectedFiles;
|
||||
|
||||
///Should be assigned later in gallery when files are loaded.
|
||||
///Note: EnteFiles in this list should be references of the same EnteFiles
|
||||
///that are grouped in gallery, so that when files are added/deleted,
|
||||
///both lists are in sync.
|
||||
List<EnteFile>? allGalleryFiles;
|
||||
|
||||
SelectionState({
|
||||
Key? key,
|
||||
const SelectionState({
|
||||
super.key,
|
||||
required this.selectedFiles,
|
||||
required Widget child,
|
||||
}) : super(key: key, child: child);
|
||||
required super.child,
|
||||
});
|
||||
|
||||
static SelectionState? maybeOf(BuildContext context) {
|
||||
return context.dependOnInheritedWidgetOfExactType<SelectionState>();
|
||||
|
||||
@@ -13,6 +13,7 @@ import 'package:photos/ui/common/bottom_shadow.dart';
|
||||
import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
import 'package:photos/utils/delete_file_util.dart';
|
||||
|
||||
@@ -25,8 +26,8 @@ class TrashPage extends StatelessWidget {
|
||||
this.tagPrefix = "trash_page",
|
||||
this.appBarType = GalleryType.trash,
|
||||
this.overlayType = GalleryType.trash,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -57,43 +58,45 @@ class TrashPage extends StatelessWidget {
|
||||
initialFiles: null,
|
||||
);
|
||||
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
appBarType,
|
||||
S.of(context).trash,
|
||||
_selectedFiles,
|
||||
return GalleryFilesState(
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
appBarType,
|
||||
S.of(context).trash,
|
||||
_selectedFiles,
|
||||
),
|
||||
),
|
||||
),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
const BottomShadowWidget(
|
||||
offsetDy: 20,
|
||||
),
|
||||
AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOut,
|
||||
height: filesAreSelected ? 0 : 80,
|
||||
child: AnimatedOpacity(
|
||||
duration: const Duration(milliseconds: 100),
|
||||
opacity: filesAreSelected ? 0.0 : 1.0,
|
||||
curve: Curves.easeIn,
|
||||
child: IgnorePointer(
|
||||
ignoring: filesAreSelected,
|
||||
child: const SafeArea(
|
||||
minimum: EdgeInsets.only(bottom: 6),
|
||||
child: BottomButtonsWidget(),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
const BottomShadowWidget(
|
||||
offsetDy: 20,
|
||||
),
|
||||
AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOut,
|
||||
height: filesAreSelected ? 0 : 80,
|
||||
child: AnimatedOpacity(
|
||||
duration: const Duration(milliseconds: 100),
|
||||
opacity: filesAreSelected ? 0.0 : 1.0,
|
||||
curve: Curves.easeIn,
|
||||
child: IgnorePointer(
|
||||
ignoring: filesAreSelected,
|
||||
child: const SafeArea(
|
||||
minimum: EdgeInsets.only(bottom: 6),
|
||||
child: BottomButtonsWidget(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
FileSelectionOverlayBar(GalleryType.trash, _selectedFiles),
|
||||
],
|
||||
FileSelectionOverlayBar(GalleryType.trash, _selectedFiles),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -13,6 +13,7 @@ import 'package:photos/services/ignored_files_service.dart';
|
||||
import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class UnCategorizedPage extends StatelessWidget {
|
||||
@@ -27,8 +28,8 @@ class UnCategorizedPage extends StatelessWidget {
|
||||
this.tagPrefix = "Uncategorized_page",
|
||||
this.appBarType = GalleryType.uncategorized,
|
||||
this.overlayType = GalleryType.uncategorized,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -73,27 +74,29 @@ class UnCategorizedPage extends StatelessWidget {
|
||||
initialFiles: null,
|
||||
albumName: S.of(context).uncategorized,
|
||||
);
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
appBarType,
|
||||
S.of(context).uncategorized,
|
||||
_selectedFiles,
|
||||
collection: collection,
|
||||
return GalleryFilesState(
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: const Size.fromHeight(50.0),
|
||||
child: GalleryAppBarWidget(
|
||||
appBarType,
|
||||
S.of(context).uncategorized,
|
||||
_selectedFiles,
|
||||
collection: collection,
|
||||
),
|
||||
),
|
||||
),
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
body: SelectionState(
|
||||
selectedFiles: _selectedFiles,
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
gallery,
|
||||
FileSelectionOverlayBar(
|
||||
overlayType,
|
||||
_selectedFiles,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user