Compare commits
1 Commits
auth-v4.3.
...
docs-addiO
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acf978c302 |
92
.github/workflows/auth-release.yml
vendored
@@ -32,8 +32,8 @@ env:
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
|
||||
jobs:
|
||||
build-linux-latest:
|
||||
runs-on: ubuntu-latest
|
||||
build-ubuntu:
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -90,31 +90,22 @@ jobs:
|
||||
- name: Install dependencies for desktop build
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y libsecret-1-dev libsodium-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm patchelf libsqlite3-dev locate libayatana-appindicator3-dev libffi-dev libtiff6 xz-utils libarchive-tools libcurl4-openssl-dev
|
||||
sudo apt-get install -y libsecret-1-dev libsodium-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config libsqlite3-dev locate appindicator3-0.1 libappindicator3-dev libffi-dev libtiff5
|
||||
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: Build desktop app
|
||||
run: |
|
||||
flutter config --enable-linux-desktop
|
||||
dart pub global activate --source git https://github.com/ente-io/flutter_distributor_fork --git-ref develop --git-path packages/flutter_distributor
|
||||
# RPM
|
||||
flutter_distributor package --platform=linux --targets=rpm --skip-clean
|
||||
mv dist/**/*-*-linux.rpm artifacts/ente-${{ github.ref_name }}-x86_64.rpm
|
||||
# APPIMAGE
|
||||
flutter_distributor package --platform=linux --targets=appimage --skip-clean
|
||||
mv dist/**/*-*-linux.AppImage artifacts/ente-${{ github.ref_name }}-x86_64.AppImage
|
||||
# DEB
|
||||
# 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:
|
||||
LIBSODIUM_USE_PKGCONFIG: 1
|
||||
|
||||
- name: Generate checksums
|
||||
run: sha256sum artifacts/ente-* >> artifacts/sha256sum-rpm-appimage
|
||||
- name: Generate checksums and push to artifacts
|
||||
run: |
|
||||
sha256sum artifacts/ente-* > artifacts/sha256sum-apk-deb
|
||||
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
@@ -134,6 +125,67 @@ jobs:
|
||||
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
|
||||
build-fedora-etc:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
|
||||
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: 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 libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm patchelf libsqlite3-dev locate libayatana-appindicator3-dev libffi-dev libtiff6 xz-utils libarchive-tools libcurl4-openssl-dev
|
||||
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: 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: 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
|
||||
|
||||
@@ -161,7 +213,7 @@ jobs:
|
||||
run: |
|
||||
flutter config --enable-windows-desktop
|
||||
# dart pub global activate flutter_distributor
|
||||
dart pub global activate --source git https://github.com/ente-io/flutter_distributor_fork --git-ref develop --git-path packages/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/**/*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||
|
||||
@@ -36,6 +36,6 @@ jobs:
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Update branch ghcr/server to point to source commit
|
||||
- name: Update branch server/ghcr to point to source commit
|
||||
run: |
|
||||
git push -f origin HEAD:refs/heads/ghcr/server
|
||||
git push -f origin HEAD:refs/heads/server/ghcr
|
||||
34
.github/workflows/web-publish-ghcr.yml
vendored
@@ -1,34 +0,0 @@
|
||||
name: "Publish ghcr (web)"
|
||||
|
||||
on:
|
||||
# Run automatically every Wednesday, at 07:00 UTC.
|
||||
schedule:
|
||||
- cron: '0 7 * * 3'
|
||||
# Run manually if needed to publish out of schedule.
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Build and push
|
||||
uses: mr-smithers-excellent/docker-build-push@v6
|
||||
with:
|
||||
dockerfile: web/Dockerfile
|
||||
directory: web
|
||||
# Resultant package name will be ghcr.io/ente-io/web
|
||||
image: web
|
||||
registry: ghcr.io
|
||||
enableBuildKit: true
|
||||
multiPlatform: true
|
||||
platform: linux/amd64,linux/arm64
|
||||
tags: ${{ github.sha }}, latest
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Update branch ghcr/web to point to source commit
|
||||
run: |
|
||||
git push -f origin HEAD:refs/heads/ghcr/web
|
||||
@@ -842,10 +842,6 @@
|
||||
{
|
||||
"title": "Parsec"
|
||||
},
|
||||
{
|
||||
"title": "Patient Access",
|
||||
"slug": "patient_access"
|
||||
},
|
||||
{
|
||||
"title": "PayPal"
|
||||
},
|
||||
@@ -871,10 +867,6 @@
|
||||
{
|
||||
"title": "Pingvin Share"
|
||||
},
|
||||
{
|
||||
"title": "Pionex",
|
||||
"slug": "pionex"
|
||||
},
|
||||
{
|
||||
"title": "Plutus",
|
||||
"hex": "DEC685"
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<rect id="Artboard1" x="0" y="0" width="512" height="512" style="fill:none;"/>
|
||||
<g id="Artboard11" serif:id="Artboard1">
|
||||
<g transform="matrix(2.44447,0,0,2.44447,256,256)">
|
||||
<g transform="matrix(1,0,0,1,-94.85,-84.1)">
|
||||
<clipPath id="_clip1">
|
||||
<rect x="0" y="0" width="189.7" height="168.2"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#_clip1)">
|
||||
<g transform="matrix(1,0,0,1,-0.61524,-0.898391)">
|
||||
<path d="M173.9,17.6C152.361,-3.884 116.993,-3.929 95.4,17.5C116.63,38.944 116.585,74.011 95.3,95.4C93.1,97.6 90.3,98.7 88.6,101.1C81.3,111.4 88.5,117.8 97.1,126.6L113.6,143.6C118.2,148.1 119,151.1 120.7,149.6L174,96.3C184.431,85.887 190.299,71.739 190.299,57C190.299,42.212 184.392,28.021 173.9,17.6Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,-0.61524,-0.898391)">
|
||||
<path d="M95.6,17.1C85.167,6.707 71.026,0.865 56.3,0.865C25.752,0.865 0.615,26.002 0.615,56.55C0.615,71.35 6.515,85.555 17,96L43.2,69.8L43.1,69.7C39.759,66.235 37.89,61.604 37.89,56.79C37.89,46.586 46.286,38.19 56.49,38.19C61.304,38.19 65.935,40.059 69.4,43.4L69.5,43.5L95.1,18L95.8,17.3L95.6,17.1Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,-0.61524,-0.898391)">
|
||||
<path d="M88.9,116.3C85.228,112.435 85.318,106.257 89.1,102.5C89.241,102.337 89.41,102.202 89.6,102.1C92.944,99.141 96.022,95.895 98.8,92.4C116.335,71.396 116.037,40.462 98.1,19.8C97.3,18.9 96.4,18 95.7,17.3L69.5,43.4C72.841,46.865 74.71,51.496 74.71,56.31C74.71,66.514 66.314,74.91 56.11,74.91C51.296,74.91 46.665,73.041 43.2,69.7L17,96L86.4,165.3C91.479,170.365 99.821,170.365 104.9,165.3L121.4,148.8" style="fill:rgb(50,50,93);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(125.407,10.9269,-10.9269,125.407,103.088,88.1467)"><stop offset="0" style="stop-color:rgb(211,54,138);stop-opacity:1"/><stop offset="0.28" style="stop-color:rgb(221,76,126);stop-opacity:1"/><stop offset="0.68" style="stop-color:rgb(234,92,123);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(255,117,117);stop-opacity:1"/></linearGradient>
|
||||
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(92.07,6.44,-6.44,92.07,1.06,45.85)"><stop offset="0" style="stop-color:rgb(3,142,245);stop-opacity:1"/><stop offset="0.17" style="stop-color:rgb(3,142,245);stop-opacity:1"/><stop offset="0.38" style="stop-color:rgb(69,112,252);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(72,105,253);stop-opacity:1"/></linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1 +0,0 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 719 165"><defs><style>.cls-1{fill:#ff7028;}.cls-2{fill:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);}.cls-4{fill:url(#linear-gradient-3);}.cls-5{opacity:0.6;}.cls-6{fill:url(#linear-gradient-4);}.cls-7{fill:url(#linear-gradient-5);}.cls-8{fill:none;}</style><linearGradient id="linear-gradient" x1="62.83" y1="375.51" x2="211.47" y2="375.51" gradientTransform="matrix(1, 0, 0, -1, 0, 752)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff7028"/><stop offset="1" stop-color="#ffcd4d"/></linearGradient><linearGradient id="linear-gradient-2" x1="183.61" y1="411.83" x2="-4.86" y2="411.83" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-3" x1="130.7" y1="356.24" x2="14.99" y2="356.24" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-4" x1="60.26" y1="347.69" x2="92.91" y2="347.69" gradientTransform="matrix(1, 0, 0, -1, 0, 752)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c44100"/><stop offset="1" stop-color="#c84300" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-5" x1="229.03" y1="414.54" x2="52.03" y2="362.3" xlink:href="#linear-gradient"/></defs><title>pionexlogo-freelogovectors.net</title><path class="cls-1" d="M238.72,331.52H192.09V433.2h28.85V406.62h17.78c27.84,0,45.33-14.38,45.33-37.48S266.56,331.52,238.72,331.52ZM237,384h-16V354.18h16c11.95,0,17.93,5.52,17.93,15S248.92,384,237,384Z" transform="translate(-15 -293)"/><path class="cls-1" d="M311.36,345.76c10.2,0,16.9-6.39,16.9-15.11,0-8.28-6.7-14.23-16.9-14.23s-16.91,6.39-16.91,14.67S301.16,345.76,311.36,345.76ZM297.51,433.2H325.2V354.47H297.51Z" transform="translate(-15 -293)"/><path class="cls-1" d="M382.84,434.51c26.09,0,44.59-17,44.59-40.82s-18.5-40.52-44.59-40.52c-25.8,0-44.6,16.84-44.6,40.52S357,434.51,382.84,434.51Zm0-21.94c-9.33,0-16.61-6.82-16.61-18.88s7.28-18.59,16.61-18.59,16.61,6.68,16.61,18.59S392.31,412.57,382.84,412.57Z" transform="translate(-15 -293)"/><path class="cls-1" d="M491.71,353.17c-9.91,0-18.8,3.34-25.07,9.87v-8.57H440.26V433.2H468V395.14c0-13.07,6.85-18.59,15.74-18.59,8,0,13,4.79,13,16.12V433.2h27.69v-45C524.35,363.77,510.21,353.17,491.71,353.17Z" transform="translate(-15 -293)"/><path class="cls-1" d="M623.61,394c0-26-18.94-40.81-42.26-40.81-24.92,0-43.43,16.84-43.43,40.52s18.22,40.82,46.34,40.82c15,0,26.09-4.36,33.67-12.79l-14.58-15.1c-5.39,4.65-10.49,6.82-18.21,6.82-10.2,0-17-4.64-19.39-12.63h57.42C623.32,398.63,623.61,396,623.61,394Zm-42.12-21.21c8.6,0,14.72,5.23,16.18,13.51H565.32C566.92,378,572.9,372.77,581.49,372.77Z" transform="translate(-15 -293)"/><path class="cls-1" d="M716,433.2l-30.17-40.38L715,354.47H685.69l-14.58,19.9-14-19.9H625.94l29.14,39.37-30,39.36h30l15.16-20.63,14.14,20.63Z" transform="translate(-15 -293)"/><path class="cls-2" d="M67.42,373.41a28.79,28.79,0,0,1,25.32-15.08h72.59A36.33,36.33,0,0,1,129,394.65H55.91Z" transform="translate(-15 -293)"/><path class="cls-3" d="M67.42,343.25a28.79,28.79,0,0,0,25.32,15.08h72.59A36.33,36.33,0,0,0,129,322H55.91Z" transform="translate(-15 -293)"/><path class="cls-4" d="M64.8,378.12a37.81,37.81,0,0,1,33.25-19.8H124.7L92.83,417.17a30.6,30.6,0,0,1-26.9,16H35Z" transform="translate(-15 -293)"/><g class="cls-5"><path class="cls-6" d="M94.55,413.91c-12-17-31.55-19.1-38.77-19.2H105Z" transform="translate(-15 -293)"/></g><path class="cls-7" d="M92.7,358.34a28.81,28.81,0,0,0-25.35,15.1L55.91,394.65H105l19.67-36.31Z" transform="translate(-15 -293)"/><rect class="cls-8" width="719" height="165"/></svg>
|
||||
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -1,5 +1,5 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
platform :ios, '13.0'
|
||||
platform :ios, '12.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
||||
@@ -4,9 +4,6 @@ PODS:
|
||||
- connectivity_plus (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- cupertino_http (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- device_info_plus (0.0.1):
|
||||
- Flutter
|
||||
- DKImagePickerController/Core (4.3.9):
|
||||
@@ -74,8 +71,6 @@ PODS:
|
||||
- move_to_background (0.0.1):
|
||||
- Flutter
|
||||
- MTBBarcodeScanner (5.0.11)
|
||||
- objective_c (0.0.1):
|
||||
- Flutter
|
||||
- OrderedSet (6.0.3)
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
@@ -87,9 +82,9 @@ PODS:
|
||||
- qr_code_scanner (0.2.0):
|
||||
- Flutter
|
||||
- MTBBarcodeScanner
|
||||
- SDWebImage (5.21.0):
|
||||
- SDWebImage/Core (= 5.21.0)
|
||||
- SDWebImage/Core (5.21.0)
|
||||
- SDWebImage (5.20.0):
|
||||
- SDWebImage/Core (= 5.20.0)
|
||||
- SDWebImage/Core (5.20.0)
|
||||
- Sentry/HybridSDK (8.36.0)
|
||||
- sentry_flutter (8.9.0):
|
||||
- Flutter
|
||||
@@ -131,7 +126,6 @@ PODS:
|
||||
DEPENDENCIES:
|
||||
- app_links (from `.symlinks/plugins/app_links/ios`)
|
||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`)
|
||||
- cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`)
|
||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||
- file_saver (from `.symlinks/plugins/file_saver/ios`)
|
||||
@@ -146,7 +140,6 @@ DEPENDENCIES:
|
||||
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||
- move_to_background (from `.symlinks/plugins/move_to_background/ios`)
|
||||
- objective_c (from `.symlinks/plugins/objective_c/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- privacy_screen (from `.symlinks/plugins/privacy_screen/ios`)
|
||||
@@ -176,8 +169,6 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/app_links/ios"
|
||||
connectivity_plus:
|
||||
:path: ".symlinks/plugins/connectivity_plus/darwin"
|
||||
cupertino_http:
|
||||
:path: ".symlinks/plugins/cupertino_http/darwin"
|
||||
device_info_plus:
|
||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||
file_picker:
|
||||
@@ -206,8 +197,6 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||
move_to_background:
|
||||
:path: ".symlinks/plugins/move_to_background/ios"
|
||||
objective_c:
|
||||
:path: ".symlinks/plugins/objective_c/ios"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
@@ -234,7 +223,6 @@ EXTERNAL SOURCES:
|
||||
SPEC CHECKSUMS:
|
||||
app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0
|
||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||
cupertino_http: 947a233f40cfea55167a49f2facc18434ea117ba
|
||||
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
|
||||
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||
@@ -252,13 +240,12 @@ SPEC CHECKSUMS:
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
|
||||
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
|
||||
objective_c: 77e887b5ba1827970907e10e832eec1683f3431d
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
|
||||
qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
|
||||
SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868
|
||||
SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8
|
||||
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
|
||||
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe
|
||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
@@ -271,6 +258,6 @@ SPEC CHECKSUMS:
|
||||
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
|
||||
PODFILE CHECKSUM: 78f002751f1a8f65042b8da97902ba4124271c5a
|
||||
PODFILE CHECKSUM: b4e3a7eabb03395b66e81fc061789f61526ee6bb
|
||||
|
||||
COCOAPODS: 1.16.2
|
||||
|
||||
@@ -366,7 +366,6 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -441,7 +440,6 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -610,7 +608,6 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -685,7 +682,6 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -854,7 +850,6 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
||||
@@ -54,26 +54,10 @@
|
||||
"viewLogsAction": "Паглядзець журнал",
|
||||
"preparingLogsTitle": "Падрыхтоўка журнала...",
|
||||
"emailLogsTitle": "Адправіць журнал па электроннай пошце",
|
||||
"exportLogsAction": "Экспартаваць журнал",
|
||||
"reportABug": "Паведаміць пра памылку",
|
||||
"reportBug": "Паведаміць пра памылку",
|
||||
"contactSupport": "Звярнуцца ў службу падтрымкі",
|
||||
"blog": "Блог",
|
||||
"verifyPassword": "Праверыць пароль",
|
||||
"pleaseWait": "Пачакайце...",
|
||||
"generatingEncryptionKeysTitle": "Генерацыя ключоў шыфравання...",
|
||||
"recreatePassword": "Стварыць пароль паўторна",
|
||||
"useRecoveryKey": "Выкарыстоўваць ключ аднаўлення",
|
||||
"incorrectPasswordTitle": "Няправільны пароль",
|
||||
"welcomeBack": "З вяртаннем!",
|
||||
"changePassword": "Змяніць пароль",
|
||||
"data": "Даныя",
|
||||
"importCodes": "Імпартаваць коды",
|
||||
"passwordEmptyError": "Пароль не можа быць пустым",
|
||||
"importFromApp": "Імпартаваць коды з {appName}",
|
||||
"exportCodes": "Экспартаваць коды",
|
||||
"importLabel": "Імпарт",
|
||||
"selectFile": "Выбраць файл",
|
||||
"yes": "Так",
|
||||
"no": "Не",
|
||||
"email": "Электронная пошта",
|
||||
|
||||
@@ -499,16 +499,11 @@
|
||||
"appLockOfflineModeWarning": "Избрахте да продължите без резервни копия. Ако забравите паролата на приложението си, ще бъдете заключени от достъп до вашите данни.",
|
||||
"duplicateCodes": "Повтарящи се кодове",
|
||||
"noDuplicates": "✨ Няма дубликати",
|
||||
"youveNoDuplicateCodesThatCanBeCleared": "Нямате повтарящи се кодове, които могат да бъдат изчистени",
|
||||
"deduplicateCodes": "Премахване на повтарящи се кодове",
|
||||
"deselectAll": "Демаркиране на всички",
|
||||
"selectAll": "Избиране на всички",
|
||||
"deleteDuplicates": "Изтриване на дубликатите",
|
||||
"plainHTML": "Обикновен HTML",
|
||||
"tellUsWhatYouThink": "Кажете ни какво мислите",
|
||||
"supportEnte": "Подкрепете <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Дайте ни звезда в GitHub",
|
||||
"free5GB": "5GB безплатни в <bold-green>ente</bold-green> Photos",
|
||||
"freeStorageOffer": "10% отстъпка в <bold-green>ente</bold-green> Photos",
|
||||
"freeStorageOfferDescription": "Използвайте промокод „AUTH“, за да получите 10% отстъпка през първата година"
|
||||
}
|
||||
@@ -505,6 +505,7 @@
|
||||
"deleteDuplicates": "Elimina duplicats",
|
||||
"plainHTML": "HTML pla",
|
||||
"tellUsWhatYouThink": "Digueu-nos què us sembla",
|
||||
"dropReview": "Deixa una ressenya a l'App/Play Store",
|
||||
"supportEnte": "Donar suport a <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Dona'ns una estrella a Github",
|
||||
"free5GB": "5 GB gratuïts a <bold-green>ente</bold-green> Photos",
|
||||
|
||||
@@ -147,7 +147,6 @@
|
||||
"leaveFamily": "Familie verlassen",
|
||||
"leaveFamilyMessage": "Sind Sie sicher, dass Sie den Familien-Plan verlassen wollen?",
|
||||
"inFamilyPlanMessage": "Sie haben einen Familien-Plan!",
|
||||
"hintForMobile": "Lange drücken, um den Code zu bearbeiten oder zu entfernen.",
|
||||
"hintForDesktop": "Klicken Sie mit der rechten Maustaste auf einen Code zum Bearbeiten oder Entfernen.",
|
||||
"scan": "Scannen",
|
||||
"scanACode": "Scan einen Code",
|
||||
@@ -457,8 +456,6 @@
|
||||
"customEndpoint": "Mit {endpoint} verbunden",
|
||||
"pinText": "Anpinnen",
|
||||
"unpinText": "Lösen",
|
||||
"pinnedCodeMessage": "{code} wurde angepinnt",
|
||||
"unpinnedCodeMessage": "{code} wird nicht weiter angepinnt",
|
||||
"pinned": "Angeheftet",
|
||||
"tags": "Tags",
|
||||
"createNewTag": "Neuen Tag erstellen",
|
||||
@@ -498,17 +495,12 @@
|
||||
"authToViewPasskey": "Bitte authentifizieren, um deinen Passkey zu sehen",
|
||||
"duplicateCodes": "Doppelte Codes",
|
||||
"noDuplicates": "✨ Keine Duplikate",
|
||||
"youveNoDuplicateCodesThatCanBeCleared": "Du hast keine doppelten Codes, die bereinigt werden können",
|
||||
"deselectAll": "Alle abwählen",
|
||||
"selectAll": "Alles auswählen",
|
||||
"deleteDuplicates": "Duplikate löschen",
|
||||
"plainHTML": "Reines HTML",
|
||||
"tellUsWhatYouThink": "Sagen Sie uns, was Sie denken",
|
||||
"dropReviewAndroid": "Hinterlasse eine Rezension im Google Play Store",
|
||||
"supportEnte": "Support <bold-green>ente</bold-green>",
|
||||
"dropReview": "Eine Bewertung im App/Play Store ablegen",
|
||||
"giveUsAStarOnGithub": "Gib uns einen Stern auf Github",
|
||||
"free5GB": "5GB kostenlos auf <bold-green>ente</bold-green> Photos",
|
||||
"loginWithAuthAccount": "Mit Ihrem Auth Account anmelden",
|
||||
"freeStorageOffer": "10% Rabatt für <bold-green>ente</bold-green> Photos",
|
||||
"freeStorageOfferDescription": "Verwende den Code \"AUTH\", um 10% im 1. Jahr zu sparen"
|
||||
"loginWithAuthAccount": "Mit Ihrem Auth Account anmelden"
|
||||
}
|
||||
@@ -506,8 +506,7 @@
|
||||
"deleteDuplicates": "Delete duplicates",
|
||||
"plainHTML": "Plain HTML",
|
||||
"tellUsWhatYouThink": "Tell us what you think",
|
||||
"dropReviewiOS": "Drop a review on the App Store",
|
||||
"dropReviewAndroid": "Drop a review on the Play Store",
|
||||
"dropReview": "Drop a review on the App/Play Store",
|
||||
"supportEnte": "Support <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Give us a star on Github",
|
||||
"free5GB": "5GB free on <bold-green>ente</bold-green> Photos",
|
||||
|
||||
@@ -506,6 +506,7 @@
|
||||
"deleteDuplicates": "Eliminar duplicados",
|
||||
"plainHTML": "HTML plano",
|
||||
"tellUsWhatYouThink": "Cuéntanos cuál es su opinión",
|
||||
"dropReview": "Danos una reseña en la App/Play Store",
|
||||
"supportEnte": "Apoya a <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Danos una estrella en GitHub",
|
||||
"free5GB": "5 GB gratis en <bold-green>ente</bold-green> Fotos",
|
||||
|
||||
@@ -505,6 +505,7 @@
|
||||
"deleteDuplicates": "Supprimer les doublons",
|
||||
"plainHTML": "HTML Pur",
|
||||
"tellUsWhatYouThink": "Dites-nous ce que vous pensez",
|
||||
"dropReview": "Déposez un avis sur l'App/Play Store",
|
||||
"supportEnte": "Soutenir <bold-green>Ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Donnez-nous une étoile sur Github",
|
||||
"free5GB": "5 Go gratuits sur <bold-green>Ente</bold-green> Photos",
|
||||
|
||||
@@ -505,6 +505,7 @@
|
||||
"deleteDuplicates": "Ismétlődések törlése",
|
||||
"plainHTML": "Sima HTML kód",
|
||||
"tellUsWhatYouThink": "Mondja el mit gondol",
|
||||
"dropReview": "Írjon véleményt az App/Play Store-ban",
|
||||
"supportEnte": "Támogassa <bold-green>ente <bold-green>",
|
||||
"giveUsAStarOnGithub": "Adj nekünk egy csillagot a Githubon",
|
||||
"free5GB": "5GB ingyen <bold-green>ente <bold-green> Photos",
|
||||
|
||||
@@ -504,14 +504,5 @@
|
||||
"deselectAll": "Deselezionare tutti",
|
||||
"selectAll": "Seleziona tutti",
|
||||
"deleteDuplicates": "Elimina i duplicati",
|
||||
"plainHTML": "HTML semplice",
|
||||
"tellUsWhatYouThink": "Dicci cosa ne pensi",
|
||||
"dropReviewiOS": "Lascia una recensione sull'App Store",
|
||||
"dropReviewAndroid": "Lascia una recensione sul Play Store",
|
||||
"supportEnte": "Supporta <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Dacci una stella su Github",
|
||||
"free5GB": "5GB gratis su <bold-green>ente</bold-green> Foto",
|
||||
"loginWithAuthAccount": "Accedi con il tuo account Auth",
|
||||
"freeStorageOffer": "10% di sconto su <bold-green>ente</bold-green> Foto",
|
||||
"freeStorageOfferDescription": "Utilizzare il codice \"AUTH\" per ottenere il 10% di sconto al primo anno"
|
||||
"plainHTML": "HTML semplice"
|
||||
}
|
||||
@@ -506,6 +506,7 @@
|
||||
"deleteDuplicates": "重複を削除",
|
||||
"plainHTML": "Plain HTML",
|
||||
"tellUsWhatYouThink": "ご意見をお聞かせください",
|
||||
"dropReview": "App/Playストアにレビューを投稿する",
|
||||
"supportEnte": "<bold-green>ente</bold-green>をサポートする",
|
||||
"giveUsAStarOnGithub": "Githubで星をつける",
|
||||
"free5GB": "<bold-green>ente</bold-green>フォトで5GB無料",
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
{
|
||||
"account": "Konts",
|
||||
"unlock": "Atbloķēt",
|
||||
"codeSecretKeyHint": "Slepenā atslēga",
|
||||
"notes": "Piezīmes",
|
||||
"codeAccountHint": "Konts (jūs@domēns.lv)",
|
||||
"codeTagHint": "Birka",
|
||||
"saveAction": "Saglabāt",
|
||||
"selectFile": "Atlasīt failu",
|
||||
"ok": "Labi",
|
||||
"cancel": "Atcelt",
|
||||
"yes": "Jā",
|
||||
"no": "Nē",
|
||||
"email": "E-pasts",
|
||||
"support": "Atbalsts",
|
||||
"settings": "Iestatījumi",
|
||||
"delete": "Dzēst",
|
||||
"enterYourPasswordHint": "Ievadiet savu paroli",
|
||||
"enterEmailHint": "Ievadiet savu e-pasta adresi",
|
||||
"invalidEmailTitle": "Nederīga e-pasta adrese",
|
||||
"invalidEmailMessage": "Lūdzu ievadiet derīgu e-pasta adresi.",
|
||||
"deleteAccount": "Dzēst kontu",
|
||||
"noDeleteAccountAction": "Nē, dzēst kontu",
|
||||
"createNewAccount": "Izveidot jaunu kontu",
|
||||
"weakStrength": "Vāja",
|
||||
"strongStrength": "Spēcīga",
|
||||
"moderateStrength": "Vidēji spēcīga",
|
||||
"confirmPassword": "Apstiprināt paroli",
|
||||
"close": "Aizvērt",
|
||||
"selectLanguage": "Atlasīt valodu",
|
||||
"language": "Valoda",
|
||||
"security": "Drošība",
|
||||
"search": "Meklēt",
|
||||
"restore": "Atjaunot",
|
||||
"error": "Kļūda",
|
||||
"saveKey": "Saglabāt atslēgu",
|
||||
"save": "Saglabāt",
|
||||
"createAccount": "Izveidot kontu",
|
||||
"password": "Parole",
|
||||
"encryption": "Šifrēšana",
|
||||
"howItWorks": "Kā tas darbojas",
|
||||
"exit": "Iziet",
|
||||
"invalidKey": "Nederīga atslēga",
|
||||
"downloadUpdate": "Lejupielādēt",
|
||||
"updateAvailable": "Pieejams atjauninājums",
|
||||
"update": "Atjaunināt",
|
||||
"warning": "Brīdinājums",
|
||||
"thisDevice": "Šī ierīce",
|
||||
"thisEmailIsAlreadyInUse": "Šis e-pasts jau tiek izmantots",
|
||||
"emailChangedTo": "E-pasts nomainīts uz {newEmail}",
|
||||
"enterPassword": "Ievadiet paroli",
|
||||
"encrypted": "Šifrēts",
|
||||
"confirmAccountDeleteTitle": "Apstiprināt konta dzēšanu",
|
||||
"androidCancelButton": "Atcelt",
|
||||
"@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."
|
||||
},
|
||||
"noInternetConnection": "Nav interneta savienojums",
|
||||
"developerSettings": "Izstrādātāja iestatījumi",
|
||||
"pinText": "Piespraust",
|
||||
"unpinText": "Atspraust",
|
||||
"tags": "Birkas",
|
||||
"createNewTag": "Izveidot jaunu birku",
|
||||
"tag": "Birka",
|
||||
"create": "Izveidot",
|
||||
"editTag": "Rediģēt birku",
|
||||
"deleteTagTitle": "Dzēst birku?",
|
||||
"hideContent": "Slēpt saturu"
|
||||
}
|
||||
@@ -499,13 +499,13 @@
|
||||
"appLockOfflineModeWarning": "Je hebt ervoor gekozen om verder te gaan zonder backups. Als je jouw applock vergeet, wordt je uitgesloten van toegang tot je gegevens.",
|
||||
"duplicateCodes": "Dubbele codes",
|
||||
"noDuplicates": "✨ Geen dubbele",
|
||||
"youveNoDuplicateCodesThatCanBeCleared": "Je hebt geen dubbele codes die kunnen worden gewist",
|
||||
"deduplicateCodes": "Dubbele codes",
|
||||
"deselectAll": "Alles deselecteren",
|
||||
"selectAll": "Alles selecteren",
|
||||
"deleteDuplicates": "Dubbelen verwijderen",
|
||||
"plainHTML": "Alleen HTML",
|
||||
"tellUsWhatYouThink": "Vertel ons wat je vindt",
|
||||
"dropReview": "Laat een beoordeling achter in de App/Play Store",
|
||||
"supportEnte": "Steun <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Geef ons een ster op Github",
|
||||
"free5GB": "5GB gratis op <bold-green>ente</bold-green> Photos",
|
||||
|
||||
@@ -506,8 +506,7 @@
|
||||
"deleteDuplicates": "Usuń duplikaty",
|
||||
"plainHTML": "Zwykły HTML",
|
||||
"tellUsWhatYouThink": "Wyraź swoją opinię",
|
||||
"dropReviewiOS": "Napisz recenzję w App Store",
|
||||
"dropReviewAndroid": "Napisz recenzję w Play Store",
|
||||
"dropReview": "Napisz recenzję w App Store/Play Store",
|
||||
"supportEnte": "Wesprzyj <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Daj nam gwiazdkę na Githubie",
|
||||
"free5GB": "5 GB za darmo na zdjęcia <bold-green>ente</bold-green>",
|
||||
|
||||
@@ -506,8 +506,7 @@
|
||||
"deleteDuplicates": "Excluir duplicados",
|
||||
"plainHTML": "HTML simples",
|
||||
"tellUsWhatYouThink": "Diga-nos o que pensa",
|
||||
"dropReviewiOS": "Deixe uma avaliação na App Store",
|
||||
"dropReviewAndroid": "Deixe uma avaliação na Play Store",
|
||||
"dropReview": "Deixe uma avaliação na App/Play Store",
|
||||
"supportEnte": "Apoie o <bold-green>ente.io</bold-green>",
|
||||
"giveUsAStarOnGithub": "Dê-nos uma estrela no Github",
|
||||
"free5GB": "5GB grátis no <bold-green>ente</bold-green> Photos",
|
||||
|
||||
@@ -493,10 +493,5 @@
|
||||
"duplicateCodes": "Дублировать коды",
|
||||
"noDuplicates": "✨ Дубликатов нет",
|
||||
"selectAll": "Выбрать все",
|
||||
"plainHTML": "Обычный HTML",
|
||||
"tellUsWhatYouThink": "Расскажите нам, что вы думаете",
|
||||
"free5GB": "5GB бесплатно на <bold-green>ente</bold-green> фото",
|
||||
"loginWithAuthAccount": "Войти с помощью учетной записи Auth",
|
||||
"freeStorageOffer": "Скидка 10% на <bold-green>ente</bold-green> фото",
|
||||
"freeStorageOfferDescription": "Используйте код \"AUTH\", чтобы получить скидку 10% в первый год"
|
||||
"plainHTML": "Обычный HTML"
|
||||
}
|
||||
@@ -506,6 +506,7 @@
|
||||
"deleteDuplicates": "Izbriši dvojnike",
|
||||
"plainHTML": "Navadni HTML",
|
||||
"tellUsWhatYouThink": "Povejte nam kaj mislite",
|
||||
"dropReview": "Napišite oceno v trgovini App/Play Store",
|
||||
"supportEnte": "Podpiraj <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Dajte nam zvezdico na Githubu",
|
||||
"free5GB": "5 GB zastonj na <bold-green>ente</bold-green> fotografije",
|
||||
|
||||
@@ -274,7 +274,6 @@
|
||||
"tryAgain": "Försök igen",
|
||||
"viewRecoveryKey": "Visa återställningsnyckel",
|
||||
"confirmRecoveryKey": "Bekräfta återställningsnyckel",
|
||||
"recoveryKeyVerifyReason": "Din återställningsnyckel är det enda sättet att återställa dina foton om du glömmer ditt lösenord. Du hittar din återställningsnyckel i Inställningar > Säkerhet.\n\nAnge din återställningsnyckel här för att verifiera att du har sparat den ordentligt.",
|
||||
"confirmYourRecoveryKey": "Bekräfta din återställningsnyckel",
|
||||
"confirm": "Bekräfta",
|
||||
"emailYourLogs": "Maila dina loggar",
|
||||
@@ -359,7 +358,6 @@
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "Återställningsnyckeln du angav är felaktig",
|
||||
"enterPassword": "Ange lösenord",
|
||||
"selectExportFormat": "Välj exportformat",
|
||||
"exportDialogDesc": "Krypterad export skyddas av ett lösenord som du väljer.",
|
||||
"encrypted": "Krypterad",
|
||||
"plainText": "Enkel text",
|
||||
"passwordToEncryptExport": "Lösenord för att kryptera export",
|
||||
@@ -367,7 +365,6 @@
|
||||
"useOffline": "Använd utan säkerhetskopior",
|
||||
"signInToBackup": "Logga in för att säkerhetskopiera dina koder",
|
||||
"singIn": "Logga in",
|
||||
"sigInBackupReminder": "Vänligen exportera dina koder för att säkerställa att du har en säkerhetskopia som du kan återställa från.",
|
||||
"showLargeIcons": "Visa stora ikoner",
|
||||
"compactMode": "Kompakt läge",
|
||||
"shouldHideCode": "Dölj koder",
|
||||
|
||||
@@ -499,17 +499,9 @@
|
||||
"appLockOfflineModeWarning": "Bạn đã chọn tiếp tục mà không có bản sao lưu. Nếu bạn quên khóa ứng dụng, bạn sẽ bị khóa khỏi việc truy cập dữ liệu của mình.",
|
||||
"duplicateCodes": "Mã trùng lặp",
|
||||
"noDuplicates": "✨ Không có trùng lặp",
|
||||
"youveNoDuplicateCodesThatCanBeCleared": "Bạn không có mã nào bị trùng để xóa",
|
||||
"deduplicateCodes": "Loại bỏ mã trùng lặp",
|
||||
"deselectAll": "Bỏ chọn tất cả",
|
||||
"selectAll": "Chọn tất cả",
|
||||
"deleteDuplicates": "Xóa trùng lặp",
|
||||
"plainHTML": "HTML thuần",
|
||||
"tellUsWhatYouThink": "Hãy cho chúng tôi biết bạn nghĩ gì",
|
||||
"supportEnte": "Hỗ trợ <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "Cho chúng tôi ngôi sao trên Github",
|
||||
"free5GB": "Miễn phí 5GB cho <bold-green>ente</bold-green> Hình ảnh",
|
||||
"loginWithAuthAccount": "Đăng nhập bằng tài khoản Ente Auth",
|
||||
"freeStorageOffer": "Giảm giá 10% cho <bold-green>ente</bold-green> Hình ảnh",
|
||||
"freeStorageOfferDescription": "Sử dụng mã giảm giá \"AUTH\" để được giảm 10% trong năm đầu tiên"
|
||||
"plainHTML": "HTML thuần"
|
||||
}
|
||||
@@ -1,517 +0,0 @@
|
||||
{
|
||||
"account": "账户",
|
||||
"unlock": "解锁",
|
||||
"recoveryKey": "恢复密钥",
|
||||
"counterAppBarTitle": "计数器",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "妥善保管您的两步验证码",
|
||||
"onBoardingGetStarted": "开始",
|
||||
"setupFirstAccount": "设置您的第一个账户",
|
||||
"importScanQrCode": "扫描二维码",
|
||||
"qrCode": "二维码",
|
||||
"importEnterSetupKey": "输入设置密钥",
|
||||
"importAccountPageTitle": "输入账户详细信息",
|
||||
"secretCanNotBeEmpty": "密码不能为空",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "发行人和账户均不能为空",
|
||||
"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"
|
||||
},
|
||||
"pleaseLoginAgain": "请重新登录",
|
||||
"loggingOut": "正在登出...",
|
||||
"timeBasedKeyType": "基于时间 (TOTP)",
|
||||
"counterBasedKeyType": "基于计数器 (HOTP)",
|
||||
"saveAction": "保存",
|
||||
"nextTotpTitle": "下一个",
|
||||
"deleteCodeTitle": "要删除代码吗?",
|
||||
"deleteCodeMessage": "您确定要删除此代码吗?此操作不可逆。",
|
||||
"trashCode": "要删除代码吗?",
|
||||
"trashCodeMessage": "您确定要删除 {account} 的代码吗?",
|
||||
"trash": "删除",
|
||||
"viewLogsAction": "查看日志",
|
||||
"sendLogsDescription": "这将发送日志以帮助我们调试您的问题。虽然我们采取预防措施确保不记录敏感信息,但我们建议您在共享这些日志之前先查看它们。",
|
||||
"preparingLogsTitle": "正在准备日志...",
|
||||
"emailLogsTitle": "电子邮件日志",
|
||||
"emailLogsMessage": "请将日志发送至 {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "复制电子邮件",
|
||||
"exportLogsAction": "导出日志",
|
||||
"reportABug": "报告错误",
|
||||
"crashAndErrorReporting": "崩溃和错误报告",
|
||||
"reportBug": "报告错误",
|
||||
"emailUsMessage": "请给我们发送电子邮件至 {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "联系支持",
|
||||
"rateUsOnStore": "在 {storeName} 上给我们评分",
|
||||
"blog": "博客",
|
||||
"merchandise": "商品",
|
||||
"verifyPassword": "验证密码",
|
||||
"pleaseWait": "请稍候...",
|
||||
"generatingEncryptionKeysTitle": "正在生成加密密钥...",
|
||||
"recreatePassword": "重新创建密码",
|
||||
"recreatePasswordMessage": "当前设备的功能不足以验证您的密码,因此我们需要以一种适用于所有设备的方式重新生成一次密码。\n\n请使用您的恢复密钥登录并重新生成您的密码(如果您愿意,可以再次使用相同的密码)。",
|
||||
"useRecoveryKey": "使用恢复密钥",
|
||||
"incorrectPasswordTitle": "密码错误",
|
||||
"welcomeBack": "欢迎回来!",
|
||||
"emailAlreadyRegistered": "电子邮件地址已被注册。",
|
||||
"emailNotRegistered": "电子邮件地址未注册。",
|
||||
"madeWithLoveAtPrefix": "用❤️制作 ",
|
||||
"supportDevs": "订阅 <bold-green>ente</bold-green> 以支持我们",
|
||||
"supportDiscount": "使用优惠码“AUTH”可享受首年 10% 折扣",
|
||||
"changeEmail": "修改邮箱",
|
||||
"changePassword": "修改密码",
|
||||
"data": "数据",
|
||||
"importCodes": "导入代码",
|
||||
"importTypePlainText": "纯文本",
|
||||
"importTypeEnteEncrypted": "Ente 加密导出",
|
||||
"passwordForDecryptingExport": "用来解密导出的密码",
|
||||
"passwordEmptyError": "密码不能为空",
|
||||
"importFromApp": "从 {appName} 导入代码",
|
||||
"importGoogleAuthGuide": "使用“转移账户”选项将您的账户从 Google Authenticator 导出到二维码。然后使用另一台设备扫描二维码。\n\n提示:您可以使用笔记本电脑的摄像头拍摄二维码的照片。",
|
||||
"importSelectJsonFile": "选择 JSON 文件",
|
||||
"importSelectAppExport": "选择 {appName} 的导出文件",
|
||||
"importEnteEncGuide": "选择从 Ente 导出的 JSON 加密文件",
|
||||
"importRaivoGuide": "使用 Raivo 设置中的“将 OTP 导出到 Zip 存档”选项。\n\n解压 zip 文件并导入 JSON 文件。",
|
||||
"importBitwardenGuide": "使用 Bitwarden 工具中的“导出密码库”选项并导入未加密的 JSON 文件。",
|
||||
"importAegisGuide": "使用 Aegis 设置中的“导出密码库”选项。\n\n如果您的密码库已加密,则需要输入密码库密码才能解密密码库。",
|
||||
"import2FasGuide": "使用 2FAS 中的“设置 -> 备份 -> 导出”选项。\n\n如果您的备份已加密,则需要输入密码来解密备份",
|
||||
"importLastpassGuide": "使用 Lastpass Authenticator 设置中的“转移账户”选项,然后按“将账户导出到文件”。导入下载的 JSON。",
|
||||
"exportCodes": "导出代码",
|
||||
"importLabel": "导入",
|
||||
"importInstruction": "请选择一个包含以下格式的代码列表的文件",
|
||||
"importCodeDelimiterInfo": "代码可以用逗号或换行符分隔",
|
||||
"selectFile": "选择文件",
|
||||
"emailVerificationToggle": "电子邮件验证",
|
||||
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件两步验证的副本。",
|
||||
"authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证",
|
||||
"authenticateGeneric": "请验证",
|
||||
"authToViewYourRecoveryKey": "请验证以查看您的恢复密钥",
|
||||
"authToChangeYourEmail": "请验证以更改您的电子邮件",
|
||||
"authToChangeYourPassword": "请验证以更改密码",
|
||||
"authToViewSecrets": "请进行身份验证以查看您的密钥",
|
||||
"authToInitiateSignIn": "请进行身份验证以启动登录进行备份。",
|
||||
"ok": "确定",
|
||||
"cancel": "取消",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"email": "电子邮件地址",
|
||||
"support": "支持",
|
||||
"general": "通用",
|
||||
"settings": "设置",
|
||||
"copied": "已复制",
|
||||
"pleaseTryAgain": "请重试",
|
||||
"existingUser": "已注册用户",
|
||||
"newUser": "初来 Ente",
|
||||
"delete": "删除",
|
||||
"enterYourPasswordHint": "输入您的密码",
|
||||
"forgotPassword": "忘记密码",
|
||||
"oops": "哎呀",
|
||||
"suggestFeatures": "建议新功能",
|
||||
"faq": "常见问题",
|
||||
"somethingWentWrongMessage": "出了点问题,请重试",
|
||||
"leaveFamily": "离开家庭",
|
||||
"leaveFamilyMessage": "您确定要离开家庭计划吗?",
|
||||
"inFamilyPlanMessage": "你在一个家庭计划中!",
|
||||
"hintForMobile": "长按代码即可编辑或删除。",
|
||||
"hintForDesktop": "右键单击代码即可编辑或删除。",
|
||||
"scan": "扫描",
|
||||
"scanACode": "扫描代码",
|
||||
"verify": "验证",
|
||||
"verifyEmail": "验证电子邮件",
|
||||
"enterCodeHint": "从你的身份验证器应用中\n输入6位数字代码",
|
||||
"lostDeviceTitle": "丢失了设备吗?",
|
||||
"twoFactorAuthTitle": "两步验证",
|
||||
"passkeyAuthTitle": "通行密钥验证",
|
||||
"verifyPasskey": "验证通行密钥",
|
||||
"loginWithTOTP": "使用 TOTP 登录",
|
||||
"recoverAccount": "恢复账户",
|
||||
"enterRecoveryKeyHint": "输入您的恢复密钥",
|
||||
"recover": "恢复",
|
||||
"contactSupportViaEmailMessage": "请从您注册的电子邮件地址拖放一封邮件到 {email}",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "二维码无效",
|
||||
"noRecoveryKeyTitle": "没有恢复密钥吗?",
|
||||
"enterEmailHint": "请输入您的电子邮件地址",
|
||||
"invalidEmailTitle": "无效的电子邮件地址",
|
||||
"invalidEmailMessage": "请输入一个有效的电子邮件地址。",
|
||||
"deleteAccount": "删除账户",
|
||||
"deleteAccountQuery": "我们很抱歉看到您离开。您面临一些问题?",
|
||||
"yesSendFeedbackAction": "是,发送反馈",
|
||||
"noDeleteAccountAction": "否,删除账户",
|
||||
"initiateAccountDeleteTitle": "请进行身份验证以启动账户删除",
|
||||
"sendEmail": "发送电子邮件",
|
||||
"createNewAccount": "创建新账号",
|
||||
"weakStrength": "弱",
|
||||
"strongStrength": "强",
|
||||
"moderateStrength": "中",
|
||||
"confirmPassword": "请确认密码",
|
||||
"close": "关闭",
|
||||
"oopsSomethingWentWrong": "哎呀,出了点问题。",
|
||||
"selectLanguage": "选择语言",
|
||||
"language": "语言",
|
||||
"social": "社交媒体",
|
||||
"security": "安全",
|
||||
"lockscreen": "锁屏",
|
||||
"authToChangeLockscreenSetting": "请验证以更改锁屏设置",
|
||||
"deviceLockEnablePreSteps": "要启用设备锁,请在系统设置中设置设备密码或屏幕锁。",
|
||||
"viewActiveSessions": "查看活动会话",
|
||||
"authToViewYourActiveSessions": "请验证以查看您的活动会话",
|
||||
"searchHint": "搜索...",
|
||||
"search": "搜索",
|
||||
"sorryUnableToGenCode": "对不起,无法为 {issuerName} 生成代码",
|
||||
"noResult": "无结果",
|
||||
"addCode": "添加代码",
|
||||
"scanAQrCode": "扫描二维码",
|
||||
"enterDetailsManually": "手动输入详细信息",
|
||||
"edit": "编辑",
|
||||
"share": "分享",
|
||||
"shareCodes": "分享代码",
|
||||
"shareCodesDuration": "选择您要分享代码的期限。",
|
||||
"restore": "恢复",
|
||||
"copiedToClipboard": "已复制到剪贴板",
|
||||
"copiedNextToClipboard": "已将下一个代码复制到剪贴板",
|
||||
"error": "错误",
|
||||
"recoveryKeyCopiedToClipboard": "恢复密钥已复制到剪贴板",
|
||||
"recoveryKeyOnForgotPassword": "如果您忘记了密码,恢复数据的唯一方法就是使用此密钥。",
|
||||
"recoveryKeySaveDescription": "我们不会存储此密钥,请将此24个单词密钥保存在一个安全的地方。",
|
||||
"doThisLater": "稍后再做",
|
||||
"saveKey": "保存密钥",
|
||||
"save": "保存",
|
||||
"send": "发送",
|
||||
"saveOrSendDescription": "您想将其保存到您的内置存储(默认情况下为“下载”文件夹)还是将其发送到其他应用程序?",
|
||||
"saveOnlyDescription": "您想将其保存到您的内置存储中(默认情况下为“下载”文件夹)吗?",
|
||||
"back": "返回",
|
||||
"createAccount": "创建账户",
|
||||
"passwordStrength": "密码强度: {passwordStrengthValue}",
|
||||
"@passwordStrength": {
|
||||
"description": "Text to indicate the password strength",
|
||||
"placeholders": {
|
||||
"passwordStrengthValue": {
|
||||
"description": "The strength of the password as a string",
|
||||
"type": "String",
|
||||
"example": "Weak or Moderate or Strong"
|
||||
}
|
||||
},
|
||||
"message": "Password Strength: {passwordStrengthText}"
|
||||
},
|
||||
"password": "密码",
|
||||
"signUpTerms": "我同意 <u-terms>服务条款</u-terms> 和 <u-policy>隐私政策</u-policy>",
|
||||
"privacyPolicyTitle": "隐私政策",
|
||||
"termsOfServicesTitle": "服务条款",
|
||||
"encryption": "加密",
|
||||
"setPasswordTitle": "设置密码",
|
||||
"changePasswordTitle": "修改密码",
|
||||
"resetPasswordTitle": "重置密码",
|
||||
"encryptionKeys": "加密密钥",
|
||||
"passwordWarning": "我们不储存这个密码,所以如果忘记, <underline>我们不能解密您的数据</underline>",
|
||||
"enterPasswordToEncrypt": "输入我们可以用来加密您的数据的密码",
|
||||
"enterNewPasswordToEncrypt": "输入我们可以用来加密您的数据的新密码",
|
||||
"passwordChangedSuccessfully": "密码修改成功",
|
||||
"generatingEncryptionKeys": "正在生成加密密钥...",
|
||||
"continueLabel": "继续",
|
||||
"insecureDevice": "设备不安全",
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "抱歉,我们无法在此设备上生成安全密钥。\n\n请使用其他设备注册。",
|
||||
"howItWorks": "工作原理",
|
||||
"ackPasswordLostWarning": "我明白,如果我丢失密码,我可能会丢失我的数据,因为我的数据是 <underline>端到端加密的</underline>。",
|
||||
"loginTerms": "点击登录后,我同意 <u-terms>服务条款</u-terms> 和 <u-policy>隐私政策</u-policy>",
|
||||
"logInLabel": "登录",
|
||||
"logout": "登出",
|
||||
"areYouSureYouWantToLogout": "您确定要登出吗?",
|
||||
"yesLogout": "是的,登出",
|
||||
"exit": "退出",
|
||||
"theme": "主题",
|
||||
"lightTheme": "浅色",
|
||||
"darkTheme": "深色",
|
||||
"systemTheme": "系统",
|
||||
"verifyingRecoveryKey": "正在验证恢复密钥...",
|
||||
"recoveryKeyVerified": "恢复密钥已验证",
|
||||
"recoveryKeySuccessBody": "太棒了! 您的恢复密钥是有效的。 感谢您的验证。\n\n请记住要安全备份您的恢复密钥。",
|
||||
"invalidRecoveryKey": "您输入的恢复密钥无效。请确保它包含24个单词,并检查每个单词的拼写。\n\n如果您输入了旧的恢复码,请确保它长度为64个字符,并检查其中每个字符。",
|
||||
"recreatePasswordTitle": "重新创建密码",
|
||||
"recreatePasswordBody": "当前设备的功能不足以验证您的密码,但我们可以以适用于所有设备的方式重新生成。\n\n请使用您的恢复密钥登录并重新生成您的密码(如果您愿意,可以再次使用相同的密码)。",
|
||||
"invalidKey": "密钥无效",
|
||||
"tryAgain": "请再试一次",
|
||||
"viewRecoveryKey": "查看恢复密钥",
|
||||
"confirmRecoveryKey": "确认恢复密钥",
|
||||
"recoveryKeyVerifyReason": "如果您忘记了您的密码,您的恢复密钥是恢复您的照片的唯一途径。 您可以在“设置 > 账户”中找到您的恢复密钥。\n\n请在此输入您的恢复密钥以确认您已经正确地保存了它。",
|
||||
"confirmYourRecoveryKey": "确认您的恢复密钥",
|
||||
"confirm": "确认",
|
||||
"emailYourLogs": "通过电子邮件发送您的日志",
|
||||
"pleaseSendTheLogsTo": "请将日志发送至 \n{toEmail}",
|
||||
"copyEmailAddress": "复制电子邮件地址",
|
||||
"exportLogs": "导出日志",
|
||||
"enterYourRecoveryKey": "输入您的恢复密钥",
|
||||
"tempErrorContactSupportIfPersists": "看起来出了点问题。 请稍后重试。 如果错误仍然存在,请联系我们的支持团队。",
|
||||
"networkHostLookUpErr": "无法连接到 Ente,请检查您的网络设置,如果错误仍然存在,请联系支持。",
|
||||
"networkConnectionRefusedErr": "无法连接到 Ente,请稍后重试。如果错误仍然存在,请联系支持人员。",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "看起来出了点问题。 请稍后重试。 如果错误仍然存在,请联系我们的支持团队。",
|
||||
"about": "关于",
|
||||
"weAreOpenSource": "我们是开源的!",
|
||||
"privacy": "隐私",
|
||||
"terms": "条款",
|
||||
"checkForUpdates": "检查更新",
|
||||
"checkStatus": "检查状态",
|
||||
"downloadUpdate": "下载",
|
||||
"criticalUpdateAvailable": "有重要更新可用",
|
||||
"updateAvailable": "有可用的更新",
|
||||
"update": "更新",
|
||||
"checking": "正在检查...",
|
||||
"youAreOnTheLatestVersion": "当前为最新版本",
|
||||
"warning": "警告",
|
||||
"exportWarningDesc": "导出的文件包含敏感信息。请安全存储。",
|
||||
"iUnderStand": "了解",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "请验证以导出您的代码",
|
||||
"importSuccessTitle": "耶!",
|
||||
"importSuccessDesc": "您已导入了 {count} 个代码!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The number of codes imported",
|
||||
"type": "int",
|
||||
"example": "1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sorry": "抱歉",
|
||||
"importFailureDesc": "无法解析所选文件。\n如果您需要帮助,请发邮件给 support@ente.io!",
|
||||
"pendingSyncs": "警告",
|
||||
"pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在登出之前备份这些代码。",
|
||||
"checkInboxAndSpamFolder": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证",
|
||||
"tapToEnterCode": "点击以输入代码",
|
||||
"resendEmail": "重新发送电子邮件",
|
||||
"weHaveSendEmailTo": "我们已经发送邮件到 <green>{email}</green>",
|
||||
"@weHaveSendEmailTo": {
|
||||
"description": "Text to indicate that we have sent a mail to the user",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"description": "The email address of the user",
|
||||
"type": "String",
|
||||
"example": "example@ente.io"
|
||||
}
|
||||
}
|
||||
},
|
||||
"manualSort": "自定义",
|
||||
"editOrder": "编辑顺序",
|
||||
"mostFrequentlyUsed": "经常使用",
|
||||
"mostRecentlyUsed": "最近使用",
|
||||
"activeSessions": "已登录的设备",
|
||||
"somethingWentWrongPleaseTryAgain": "出了点问题,请重试",
|
||||
"thisWillLogYouOutOfThisDevice": "这将使您登出该设备!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "这将使您登出以下设备:",
|
||||
"terminateSession": "是否终止会话?",
|
||||
"terminate": "终止",
|
||||
"thisDevice": "此设备",
|
||||
"toResetVerifyEmail": "要重置您的密码,请先验证您的电子邮件。",
|
||||
"thisEmailIsAlreadyInUse": "该电子邮件已被使用",
|
||||
"verificationFailedPleaseTryAgain": "验证失败,请再试一次",
|
||||
"yourVerificationCodeHasExpired": "您的验证码已过期",
|
||||
"incorrectCode": "验证码错误",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "抱歉,您输入的验证码不正确",
|
||||
"emailChangedTo": "电子邮件已更改为 {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "认证失败,请重试",
|
||||
"authenticationSuccessful": "认证成功!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "两步验证已成功重置",
|
||||
"incorrectRecoveryKey": "恢复密钥不正确",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "您输入的恢复密钥不正确",
|
||||
"enterPassword": "输入密码",
|
||||
"selectExportFormat": "选择导出格式",
|
||||
"exportDialogDesc": "加密导出将由您选择的密码保护。",
|
||||
"encrypted": "已加密",
|
||||
"plainText": "纯文本",
|
||||
"passwordToEncryptExport": "用来加密导出的密码",
|
||||
"export": "导出",
|
||||
"useOffline": "无需备份即可使用",
|
||||
"signInToBackup": "登录以备份您的代码",
|
||||
"singIn": "登录",
|
||||
"sigInBackupReminder": "请导出您的代码以确保您有可以恢复的备份。",
|
||||
"offlineModeWarning": "您已选择在不进行备份的情况下继续操作。请手动备份以确保您的代码安全。",
|
||||
"showLargeIcons": "显示大图标",
|
||||
"compactMode": "紧凑模式",
|
||||
"shouldHideCode": "隐藏代码",
|
||||
"doubleTapToViewHiddenCode": "您可以双击条目来查看代码",
|
||||
"focusOnSearchBar": "应用启动后聚焦搜索",
|
||||
"confirmUpdatingkey": "您确定要更新此密钥吗?",
|
||||
"minimizeAppOnCopy": "复制时最小化应用",
|
||||
"editCodeAuthMessage": "编辑代码需要身份验证",
|
||||
"deleteCodeAuthMessage": "删除代码需要身份验证",
|
||||
"showQRAuthMessage": "显示二维码需要身份验证",
|
||||
"confirmAccountDeleteTitle": "确认删除账户",
|
||||
"confirmAccountDeleteMessage": "如果您使用其他 Ente 应用程序,该账户将会与其他应用程序链接。\n\n在所有 Ente 应用程序中,您上传的数据将被安排用于删除,并且您的账户将被永久删除。",
|
||||
"androidBiometricHint": "验证身份",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricNotRecognized": "未能识别,请重试。",
|
||||
"@androidBiometricNotRecognized": {
|
||||
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricSuccess": "成功",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "取消",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
},
|
||||
"androidSignInTitle": "需要进行身份验证",
|
||||
"@androidSignInTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricRequiredTitle": "需要进行生物识别认证",
|
||||
"@androidBiometricRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsRequiredTitle": "需要设备凭据",
|
||||
"@androidDeviceCredentialsRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsSetupDescription": "需要设备凭据",
|
||||
"@androidDeviceCredentialsSetupDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"goToSettings": "前往设置",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
"androidGoToSettingsDescription": "您的设备上未设置生物识别身份验证。转到“设置 > 安全”以添加生物识别身份验证。",
|
||||
"@androidGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"iOSLockOut": "生物识别身份验证已禁用。请锁定并解锁屏幕以启用该功能。",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSGoToSettingsDescription": "您的设备上未设置生物识别身份验证。请在您的手机上启用 触控 ID 或 面容 ID。",
|
||||
"@iOSGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSOkButton": "好",
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"noInternetConnection": "无互联网连接",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "请检查您的互联网连接,然后重试。",
|
||||
"signOutFromOtherDevices": "从其他设备登出",
|
||||
"signOutOtherBody": "如果您认为有人可能知道您的密码,您可以强制所有其他使用您账户的设备登出。",
|
||||
"signOutOtherDevices": "登出其他设备",
|
||||
"doNotSignOut": "不要登出",
|
||||
"hearUsWhereTitle": "您是怎么知道 Ente 的?(可选)",
|
||||
"hearUsExplanation": "我们不跟踪应用程序安装情况。如果您告诉我们您是在哪里找到我们的,将会有所帮助!",
|
||||
"recoveryKeySaved": "恢复密钥已保存在下载文件夹中!",
|
||||
"waitingForBrowserRequest": "正在等待浏览器请求...",
|
||||
"waitingForVerification": "等待验证...",
|
||||
"passkey": "通行密钥",
|
||||
"passKeyPendingVerification": "仍需验证",
|
||||
"loginSessionExpired": "会话已过期",
|
||||
"loginSessionExpiredDetails": "您的会话已过期。请重新登录。",
|
||||
"developerSettingsWarning": "您确定要修改开发者设置吗?",
|
||||
"developerSettings": "开发者设置",
|
||||
"serverEndpoint": "服务器端点",
|
||||
"invalidEndpoint": "端点无效",
|
||||
"invalidEndpointMessage": "抱歉,您输入的端点无效。请输入有效的端点,然后重试。",
|
||||
"endpointUpdatedMessage": "端点更新成功",
|
||||
"customEndpoint": "已连接至 {endpoint}",
|
||||
"pinText": "置顶",
|
||||
"unpinText": "取消置顶",
|
||||
"pinnedCodeMessage": "{code} 已被置顶",
|
||||
"unpinnedCodeMessage": "{code} 已被取消置顶",
|
||||
"pinned": "已置顶",
|
||||
"tags": "标签",
|
||||
"createNewTag": "创建新标签",
|
||||
"tag": "标签",
|
||||
"create": "创建",
|
||||
"editTag": "编辑标签",
|
||||
"deleteTagTitle": "要删除标签吗?",
|
||||
"deleteTagMessage": "您确定要删除此标签吗?此操作是不可逆的。",
|
||||
"somethingWentWrongParsingCode": "我们无法解析 {x} 代码。",
|
||||
"updateNotAvailable": "更新不可用",
|
||||
"viewRawCodes": "查看原始代码",
|
||||
"rawCodes": "原始代码",
|
||||
"rawCodeData": "原始代码数据",
|
||||
"appLock": "应用锁",
|
||||
"noSystemLockFound": "未找到系统锁",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁定。",
|
||||
"autoLock": "自动锁定",
|
||||
"immediately": "立即",
|
||||
"reEnterPassword": "再次输入密码",
|
||||
"reEnterPin": "再次输入 PIN 码",
|
||||
"next": "下一步",
|
||||
"tooManyIncorrectAttempts": "错误的尝试次数过多",
|
||||
"tapToUnlock": "点击解锁",
|
||||
"setNewPassword": "设置新密码",
|
||||
"deviceLock": "设备锁",
|
||||
"hideContent": "隐藏内容",
|
||||
"hideContentDescriptionAndroid": "在应用切换器中隐藏应用内容并禁用屏幕截图",
|
||||
"hideContentDescriptioniOS": "在应用切换器中隐藏应用内容",
|
||||
"autoLockFeatureDescription": "应用程序进入后台后锁定的时间",
|
||||
"appLockDescription": "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。",
|
||||
"pinLock": "Pin 锁定",
|
||||
"enterPin": "输入 PIN 码",
|
||||
"setNewPin": "设置新 PIN 码",
|
||||
"importFailureDescNew": "无法解析选定的文件。",
|
||||
"appLockNotEnabled": "应用锁未启用",
|
||||
"appLockNotEnabledDescription": "请从“安全”>“应用锁”启用应用锁",
|
||||
"authToViewPasskey": "请验证身份以查看通行密钥",
|
||||
"appLockOfflineModeWarning": "您已选择继续而不备份。如果您忘记了应用锁,您将无法访问数据。",
|
||||
"duplicateCodes": "重复代码",
|
||||
"noDuplicates": "✨ 没有重复",
|
||||
"youveNoDuplicateCodesThatCanBeCleared": "您没有可清除的重复代码",
|
||||
"deduplicateCodes": "删除重复代码",
|
||||
"deselectAll": "取消全选",
|
||||
"selectAll": "全选",
|
||||
"deleteDuplicates": "删除重复项",
|
||||
"plainHTML": "Plain HTML",
|
||||
"tellUsWhatYouThink": "告诉我们您的想法",
|
||||
"dropReviewiOS": "在 App Store 上发表评测",
|
||||
"dropReviewAndroid": "在 Play 商店上发表评测",
|
||||
"supportEnte": "支持 <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "在 Github 上给我们一个星标",
|
||||
"free5GB": "<bold-green>ente</bold-green> Photos 上 5GB 可用空间",
|
||||
"loginWithAuthAccount": "使用您的认证账户登录",
|
||||
"freeStorageOffer": "购买 <bold-green>ente</bold-green> Photos 可享受 10% 优惠",
|
||||
"freeStorageOfferDescription": "使用优惠码“AUTH”可享受首年 10% 折扣"
|
||||
}
|
||||
@@ -1,515 +0,0 @@
|
||||
{
|
||||
"account": "帳戶",
|
||||
"unlock": "解鎖",
|
||||
"recoveryKey": "復原密鑰",
|
||||
"counterAppBarTitle": "計數器",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "妥善保管您的雙重驗證碼",
|
||||
"onBoardingGetStarted": "開始",
|
||||
"setupFirstAccount": "設定您的第一個帳戶",
|
||||
"importScanQrCode": "掃描 QR 碼",
|
||||
"qrCode": "QR 碼",
|
||||
"importEnterSetupKey": "輸入設定金鑰",
|
||||
"importAccountPageTitle": "輸入帳戶詳細資訊",
|
||||
"secretCanNotBeEmpty": "密碼不能為空",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "發行方和帳戶均不能為空",
|
||||
"incorrectDetails": "詳細資訊不正確",
|
||||
"pleaseVerifyDetails": "請確認詳細資訊並重試",
|
||||
"codeIssuerHint": "發行方",
|
||||
"codeSecretKeyHint": "金鑰",
|
||||
"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"
|
||||
},
|
||||
"pleaseLoginAgain": "請重新登錄",
|
||||
"loggingOut": "正在登出...",
|
||||
"timeBasedKeyType": "基於時間 (TOTP)",
|
||||
"counterBasedKeyType": "基於計數器 (HOTP)",
|
||||
"saveAction": "儲存",
|
||||
"nextTotpTitle": "下一個",
|
||||
"deleteCodeTitle": "要刪除程式碼嗎?",
|
||||
"deleteCodeMessage": "您確定要刪除此程式碼嗎?此操作不可逆。",
|
||||
"trashCode": "要刪除程式碼嗎?",
|
||||
"trashCodeMessage": "您確定要刪除 {account} 的程式碼嗎?",
|
||||
"trash": "刪除",
|
||||
"viewLogsAction": "查看日誌",
|
||||
"sendLogsDescription": "這將傳送日誌以幫助我們偵錯您的問題。雖然我們採取預防措施確保不記錄敏感資訊,但我們建議您在共享這些日誌之前先查看它們。",
|
||||
"preparingLogsTitle": "正在準備日誌...",
|
||||
"emailLogsTitle": "電子郵件日誌",
|
||||
"emailLogsMessage": "請將日誌傳送至 {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "複製電子郵件",
|
||||
"exportLogsAction": "匯出日誌",
|
||||
"reportABug": "報告錯誤",
|
||||
"crashAndErrorReporting": "當機和錯誤報告",
|
||||
"reportBug": "報告錯誤",
|
||||
"emailUsMessage": "請給我們傳送電子郵件至 {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "聯絡支援",
|
||||
"rateUsOnStore": "在 {storeName} 上給我們評分",
|
||||
"blog": "部落格",
|
||||
"merchandise": "商品",
|
||||
"verifyPassword": "驗證密碼",
|
||||
"pleaseWait": "請稍候...",
|
||||
"generatingEncryptionKeysTitle": "正在產生加密金鑰...",
|
||||
"recreatePassword": "重新建立密碼",
|
||||
"recreatePasswordMessage": "目前裝置的功能不足以驗證您的密碼,因此我們需要以一種適用於所有裝置的方式重新產生一次密碼。\n\n請使用您的復原密鑰登錄並重新產生您的密碼(如果您願意,可以再次使用相同的密碼)。",
|
||||
"useRecoveryKey": "使用復原密鑰",
|
||||
"incorrectPasswordTitle": "密碼錯誤",
|
||||
"welcomeBack": "歡迎回來!",
|
||||
"emailAlreadyRegistered": "電子郵件地址已被註冊。",
|
||||
"emailNotRegistered": "電子郵件地址未註冊。",
|
||||
"madeWithLoveAtPrefix": "用❤️製作 ",
|
||||
"supportDevs": "訂閱 <bold-green>ente</bold-green> 以支援我們",
|
||||
"supportDiscount": "使用優惠碼“AUTH”可享受首年 10% 折扣",
|
||||
"changeEmail": "修改信箱",
|
||||
"changePassword": "修改密碼",
|
||||
"data": "資料",
|
||||
"importCodes": "匯入程式碼",
|
||||
"importTypePlainText": "純文字",
|
||||
"importTypeEnteEncrypted": "Ente 加密匯出",
|
||||
"passwordForDecryptingExport": "用來解密匯出的密碼",
|
||||
"passwordEmptyError": "密碼不能為空",
|
||||
"importFromApp": "從 {appName} 匯入程式碼",
|
||||
"importGoogleAuthGuide": "使用“轉移帳戶”選項將您的帳戶從 Google Authenticator 匯出到QR 碼。然後使用另一台裝置掃描 QR 碼。\n\n提示:您可以使用筆記型電腦的攝影機拍攝QR 碼的照片。",
|
||||
"importSelectJsonFile": "選擇 JSON 檔案",
|
||||
"importSelectAppExport": "選擇 {appName} 的匯出檔案",
|
||||
"importEnteEncGuide": "選擇從 Ente 匯出的 JSON 加密檔案",
|
||||
"importRaivoGuide": "使用 Raivo 設定中的“將 OTP 匯出到 Zip 存檔”選項。\n\n解壓 zip 檔案並匯入 JSON 檔案。",
|
||||
"importBitwardenGuide": "使用 Bitwarden 工具中的“匯出密碼庫”選項並匯入未加密的 JSON 檔案。",
|
||||
"importAegisGuide": "使用 Aegis 設定中的“匯出密碼庫”選項。\n\n如果您的密碼庫已加密,則需要輸入密碼庫密碼才能解密密碼庫。",
|
||||
"import2FasGuide": "使用 2FAS 中的“設定 -> 備份 -> 匯出”選項。\n\n如果您的備份已加密,則需要輸入密碼來解密備份",
|
||||
"importLastpassGuide": "使用 Lastpass Authenticator 設定中的“轉移帳戶”選項,然後按“將帳戶匯出到檔案”。匯入下載的 JSON。",
|
||||
"exportCodes": "匯出程式碼",
|
||||
"importLabel": "匯入",
|
||||
"importInstruction": "請選擇一個包含以下格式的程式碼列表的檔案",
|
||||
"importCodeDelimiterInfo": "程式碼可以用逗號或分行符號分隔",
|
||||
"selectFile": "選擇檔案",
|
||||
"emailVerificationToggle": "電子郵件驗證",
|
||||
"emailVerificationEnableWarning": "為避免被鎖在您的帳戶之外,請在啟用電子郵件驗證之前確保在 Ente Auth 之外儲存電子郵件二步驟驗證的副本。",
|
||||
"authToChangeEmailVerificationSetting": "請進行身份驗證以更改電子郵件驗證",
|
||||
"authenticateGeneric": "請確認",
|
||||
"authToViewYourRecoveryKey": "請確認以查看您的復原密鑰",
|
||||
"authToChangeYourEmail": "請確認以更改您的電子郵件",
|
||||
"authToChangeYourPassword": "請確認以更改密碼",
|
||||
"authToViewSecrets": "請進行身份驗證以查看您的金鑰",
|
||||
"authToInitiateSignIn": "請進行身份驗證以啟動登錄進行備份。",
|
||||
"ok": "確定",
|
||||
"cancel": "取消",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"email": "電子郵件地址",
|
||||
"support": "支援",
|
||||
"general": "一般",
|
||||
"settings": "設定",
|
||||
"copied": "已複製",
|
||||
"pleaseTryAgain": "請重試",
|
||||
"existingUser": "已註冊使用者",
|
||||
"newUser": "初來 Ente",
|
||||
"delete": "刪除",
|
||||
"enterYourPasswordHint": "輸入您的密碼",
|
||||
"forgotPassword": "忘記密碼",
|
||||
"oops": "哎呀",
|
||||
"suggestFeatures": "建議新功能",
|
||||
"faq": "常見問題",
|
||||
"somethingWentWrongMessage": "出了點問題,請重試",
|
||||
"leaveFamily": "離開家庭",
|
||||
"leaveFamilyMessage": "您確定要離開家庭計畫嗎?",
|
||||
"inFamilyPlanMessage": "你在一個家庭計畫中!",
|
||||
"hintForMobile": "長按程式碼即可編輯或刪除。",
|
||||
"hintForDesktop": "右鍵點選程式碼即可編輯或刪除。",
|
||||
"scan": "掃描",
|
||||
"scanACode": "掃描程式碼",
|
||||
"verify": "驗證",
|
||||
"verifyEmail": "驗證電子郵件",
|
||||
"enterCodeHint": "從你的身份驗證器APP中\n輸入6位數字程式碼",
|
||||
"lostDeviceTitle": "遺失了裝置嗎?",
|
||||
"twoFactorAuthTitle": "二步驟驗證",
|
||||
"passkeyAuthTitle": "通行金鑰驗證",
|
||||
"verifyPasskey": "驗證通行金鑰",
|
||||
"loginWithTOTP": "使用 TOTP 登錄",
|
||||
"recoverAccount": "恢復帳戶",
|
||||
"enterRecoveryKeyHint": "輸入您的復原密鑰",
|
||||
"recover": "恢復",
|
||||
"contactSupportViaEmailMessage": "請從您註冊的電子郵件地址拖放一封郵件到 {email}",
|
||||
"@contactSupportViaEmailMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "QR 碼無效",
|
||||
"noRecoveryKeyTitle": "沒有復原密鑰嗎?",
|
||||
"enterEmailHint": "請輸入您的電子郵件地址",
|
||||
"invalidEmailTitle": "無效的電子郵件地址",
|
||||
"invalidEmailMessage": "請輸入一個有效的電子郵件地址。",
|
||||
"deleteAccount": "刪除帳戶",
|
||||
"deleteAccountQuery": "我們很抱歉看到您要刪除帳戶。您似乎面臨著一些問題?",
|
||||
"yesSendFeedbackAction": "是,傳送回饋",
|
||||
"noDeleteAccountAction": "否,刪除帳戶",
|
||||
"initiateAccountDeleteTitle": "請進行身份驗證以啟動帳戶刪除",
|
||||
"sendEmail": "傳送電子郵件",
|
||||
"createNewAccount": "建立新帳號",
|
||||
"weakStrength": "弱",
|
||||
"strongStrength": "強",
|
||||
"moderateStrength": "中",
|
||||
"confirmPassword": "請確認密碼",
|
||||
"close": "關閉",
|
||||
"oopsSomethingWentWrong": "哎呀,出了點問題。",
|
||||
"selectLanguage": "選擇語言",
|
||||
"language": "語言",
|
||||
"social": "社交媒體",
|
||||
"security": "安全",
|
||||
"lockscreen": "鎖定螢幕",
|
||||
"authToChangeLockscreenSetting": "請確認以更改鎖定螢幕設定",
|
||||
"deviceLockEnablePreSteps": "要啟用裝置鎖,請在系統設定中設定裝置密碼或螢幕鎖。",
|
||||
"viewActiveSessions": "查看活動工作階段",
|
||||
"authToViewYourActiveSessions": "請確認以查看您的活動工作階段",
|
||||
"searchHint": "搜尋...",
|
||||
"search": "搜尋",
|
||||
"sorryUnableToGenCode": "對不起,無法為 {issuerName} 產生程式碼",
|
||||
"noResult": "無結果",
|
||||
"addCode": "加入程式碼",
|
||||
"scanAQrCode": "掃描 QR 碼",
|
||||
"enterDetailsManually": "手動輸入詳細資訊",
|
||||
"edit": "編輯",
|
||||
"share": "分享",
|
||||
"shareCodes": "分享程式碼",
|
||||
"shareCodesDuration": "選擇您要分享程式碼的期限。",
|
||||
"restore": "恢復",
|
||||
"copiedToClipboard": "已複製到剪貼簿",
|
||||
"copiedNextToClipboard": "已將下一個程式碼複製到剪貼簿",
|
||||
"error": "錯誤",
|
||||
"recoveryKeyCopiedToClipboard": "復原密鑰已複製到剪貼簿",
|
||||
"recoveryKeyOnForgotPassword": "如果您忘記了密碼,恢復資料的唯一方法就是使用此金鑰。",
|
||||
"recoveryKeySaveDescription": "我們不會儲存此金鑰,請將此24個單詞金鑰儲存在一個安全的地方。",
|
||||
"doThisLater": "稍後再做",
|
||||
"saveKey": "儲存金鑰",
|
||||
"save": "儲存",
|
||||
"send": "傳送",
|
||||
"saveOrSendDescription": "您想將其儲存到您的內建儲存(預設情況下為“下載”資料夾)還是將其傳送到其他APP?",
|
||||
"saveOnlyDescription": "您想將其儲存到您的內建儲存中(預設情況下為“下載”資料夾)嗎?",
|
||||
"back": "返回",
|
||||
"createAccount": "建立帳戶",
|
||||
"passwordStrength": "密碼強度: {passwordStrengthValue}",
|
||||
"@passwordStrength": {
|
||||
"description": "Text to indicate the password strength",
|
||||
"placeholders": {
|
||||
"passwordStrengthValue": {
|
||||
"description": "The strength of the password as a string",
|
||||
"type": "String",
|
||||
"example": "Weak or Moderate or Strong"
|
||||
}
|
||||
},
|
||||
"message": "Password Strength: {passwordStrengthText}"
|
||||
},
|
||||
"password": "密碼",
|
||||
"signUpTerms": "我同意 <u-terms>服務條款</u-terms> 和 <u-policy>隱私政策</u-policy>",
|
||||
"privacyPolicyTitle": "隱私政策",
|
||||
"termsOfServicesTitle": "服務條款",
|
||||
"encryption": "加密",
|
||||
"setPasswordTitle": "設定密碼",
|
||||
"changePasswordTitle": "修改密碼",
|
||||
"resetPasswordTitle": "重設密碼",
|
||||
"encryptionKeys": "加密金鑰",
|
||||
"passwordWarning": "我們不會儲存這個密碼,所以如果忘記, <underline>我們無法解密您的資料</underline>",
|
||||
"enterPasswordToEncrypt": "輸入我們可以用來加密您的資料的密碼",
|
||||
"enterNewPasswordToEncrypt": "輸入我們可以用來加密您的資料的新密碼",
|
||||
"passwordChangedSuccessfully": "密碼修改成功",
|
||||
"generatingEncryptionKeys": "正在產生加密金鑰...",
|
||||
"continueLabel": "繼續",
|
||||
"insecureDevice": "裝置不安全",
|
||||
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "抱歉,我們無法在此裝置上產生安全金鑰。\n\n請使用其他裝置註冊。",
|
||||
"howItWorks": "工作原理",
|
||||
"ackPasswordLostWarning": "我明白,如果我遺失密碼,我可能會遺失我的資料,因為我的資料是 <underline>端到端加密的</underline>。",
|
||||
"loginTerms": "點選登錄後,我同意 <u-terms>服務條款</u-terms> 和 <u-policy>隱私政策</u-policy>",
|
||||
"logInLabel": "登錄",
|
||||
"logout": "登出",
|
||||
"areYouSureYouWantToLogout": "您確定要登出嗎?",
|
||||
"yesLogout": "是的,登出",
|
||||
"exit": "退出",
|
||||
"theme": "主題",
|
||||
"lightTheme": "淺色",
|
||||
"darkTheme": "深色",
|
||||
"systemTheme": "系統",
|
||||
"verifyingRecoveryKey": "正在驗證復原密鑰...",
|
||||
"recoveryKeyVerified": "復原密鑰已驗證",
|
||||
"recoveryKeySuccessBody": "太棒了! 您的復原密鑰是有效的。 感謝您的驗證。\n\n請記住要安全備份您的復原密鑰。",
|
||||
"invalidRecoveryKey": "您輸入的復原密鑰無效。請確保它包含24個單詞,並檢查每個單詞的拼寫。\n\n如果您輸入了舊的恢復碼,請確保它長度為64個字元,並檢查其中每個字元。",
|
||||
"recreatePasswordTitle": "重新建立密碼",
|
||||
"recreatePasswordBody": "目前裝置的功能不足以驗證您的密碼,但我們可以以適用於所有裝置的方式重新產生。\n\n請使用您的復原密鑰登錄並重新產生您的密碼(如果您願意,可以再次使用相同的密碼)。",
|
||||
"invalidKey": "金鑰無效",
|
||||
"tryAgain": "請再試一次",
|
||||
"viewRecoveryKey": "查看復原密鑰",
|
||||
"confirmRecoveryKey": "確認復原密鑰",
|
||||
"recoveryKeyVerifyReason": "如果您忘記了您的密碼,您的復原密鑰是恢復您的照片的唯一途徑。 您可以在“設定 > 帳戶”中找到您的復原密鑰。\n\n請在此輸入您的復原密鑰以確認您已經正確地儲存了它。",
|
||||
"confirmYourRecoveryKey": "確認您的復原密鑰",
|
||||
"confirm": "確認",
|
||||
"emailYourLogs": "通過電子郵件傳送您的日誌",
|
||||
"pleaseSendTheLogsTo": "請將日誌傳送至 \n{toEmail}",
|
||||
"copyEmailAddress": "複製電子郵件地址",
|
||||
"exportLogs": "匯出日誌",
|
||||
"enterYourRecoveryKey": "輸入您的復原密鑰",
|
||||
"tempErrorContactSupportIfPersists": "看起來出了點問題。 請稍後重試。 如果錯誤仍然存在,請聯絡我們的支援團隊。",
|
||||
"networkHostLookUpErr": "無法連接到 Ente,請檢查您的網路設定,如果錯誤仍然存在,請聯絡支援。",
|
||||
"networkConnectionRefusedErr": "無法連接到 Ente,請稍後重試。如果錯誤仍然存在,請聯絡支援人員。",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "看起來出了點問題。 請稍後重試。 如果錯誤仍然存在,請聯絡我們的支援團隊。",
|
||||
"about": "關於",
|
||||
"weAreOpenSource": "我們是開放原始碼的!",
|
||||
"privacy": "隱私",
|
||||
"terms": "條款",
|
||||
"checkForUpdates": "檢查更新",
|
||||
"checkStatus": "檢查狀態",
|
||||
"downloadUpdate": "下載",
|
||||
"criticalUpdateAvailable": "有重要更新可用",
|
||||
"updateAvailable": "有可用的更新",
|
||||
"update": "更新",
|
||||
"checking": "正在檢查...",
|
||||
"youAreOnTheLatestVersion": "目前為最新版本",
|
||||
"warning": "警告",
|
||||
"exportWarningDesc": "匯出的檔案包含敏感資訊。請安全儲存。",
|
||||
"iUnderStand": "瞭解",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "請確認以匯出您的程式碼",
|
||||
"importSuccessTitle": "耶!",
|
||||
"importSuccessDesc": "您已匯入了 {count} 個程式碼!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The number of codes imported",
|
||||
"type": "int",
|
||||
"example": "1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sorry": "抱歉",
|
||||
"importFailureDesc": "無法解析所選檔案。\n如果您需要幫助,請發郵件給 support@ente.io!",
|
||||
"pendingSyncs": "警告",
|
||||
"pendingSyncsWarningBody": "您的一些程式碼尚未備份。\n\n請確保您在登出之前備份這些程式碼。",
|
||||
"checkInboxAndSpamFolder": "請檢查您的收件箱 (或者是在您的“垃圾郵件”列表內) 以完成驗證",
|
||||
"tapToEnterCode": "點選以輸入程式碼",
|
||||
"resendEmail": "重新傳送電子郵件",
|
||||
"weHaveSendEmailTo": "我們已經傳送郵件到 <green>{email}</green>",
|
||||
"@weHaveSendEmailTo": {
|
||||
"description": "Text to indicate that we have sent a mail to the user",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"description": "The email address of the user",
|
||||
"type": "String",
|
||||
"example": "example@ente.io"
|
||||
}
|
||||
}
|
||||
},
|
||||
"manualSort": "自訂",
|
||||
"editOrder": "編輯順序",
|
||||
"mostFrequentlyUsed": "經常使用",
|
||||
"mostRecentlyUsed": "最近使用",
|
||||
"activeSessions": "已登錄的裝置",
|
||||
"somethingWentWrongPleaseTryAgain": "出了點問題,請重試",
|
||||
"thisWillLogYouOutOfThisDevice": "這將使您登出該裝置!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "這將使您登出以下裝置:",
|
||||
"terminateSession": "是否終止工作階段?",
|
||||
"terminate": "終止",
|
||||
"thisDevice": "此裝置",
|
||||
"toResetVerifyEmail": "要重設您的密碼,請先驗證您的電子郵件。",
|
||||
"thisEmailIsAlreadyInUse": "該電子郵件已被使用",
|
||||
"verificationFailedPleaseTryAgain": "驗證失敗,請再試一次",
|
||||
"yourVerificationCodeHasExpired": "您的驗證碼已過期",
|
||||
"incorrectCode": "驗證碼錯誤",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "抱歉,您輸入的驗證碼不正確",
|
||||
"emailChangedTo": "電子郵件已更改為 {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "認證失敗,請重試",
|
||||
"authenticationSuccessful": "認證成功!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "二步驟驗證已成功重設",
|
||||
"incorrectRecoveryKey": "復原密鑰不正確",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "您輸入的復原密鑰不正確",
|
||||
"enterPassword": "輸入密碼",
|
||||
"selectExportFormat": "選擇匯出格式",
|
||||
"exportDialogDesc": "加密匯出將由您選擇的密碼保護。",
|
||||
"encrypted": "已加密",
|
||||
"plainText": "純文字",
|
||||
"passwordToEncryptExport": "用來加密匯出的密碼",
|
||||
"export": "匯出",
|
||||
"useOffline": "無需備份即可使用",
|
||||
"signInToBackup": "登錄以備份您的程式碼",
|
||||
"singIn": "登錄",
|
||||
"sigInBackupReminder": "請匯出您的程式碼以確保您有可以恢復的備份。",
|
||||
"offlineModeWarning": "您已選擇在不進行備份的情況下繼續操作。請手動備份以確保您的程式碼安全。",
|
||||
"showLargeIcons": "顯示大圖示",
|
||||
"compactMode": "緊湊模式",
|
||||
"shouldHideCode": "隱藏程式碼",
|
||||
"doubleTapToViewHiddenCode": "您可以連按兩下條目來查看程式碼",
|
||||
"focusOnSearchBar": "APP啟動後聚焦搜尋",
|
||||
"confirmUpdatingkey": "您確定要更新此金鑰嗎?",
|
||||
"minimizeAppOnCopy": "複製時最小化APP",
|
||||
"editCodeAuthMessage": "編輯程式碼需要身份驗證",
|
||||
"deleteCodeAuthMessage": "刪除程式碼需要身份驗證",
|
||||
"showQRAuthMessage": "顯示QR 碼需要身份驗證",
|
||||
"confirmAccountDeleteTitle": "確認刪除帳戶",
|
||||
"confirmAccountDeleteMessage": "如果您使用其他 Ente APP,該帳戶將會與其他APP連結。\n\n在所有 Ente APP中,您上傳的資料將被安排用於刪除,並且您的帳戶將被永久刪除。",
|
||||
"androidBiometricHint": "驗證身份",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricNotRecognized": "未能辨識,請重試。",
|
||||
"@androidBiometricNotRecognized": {
|
||||
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricSuccess": "成功",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "取消",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
},
|
||||
"androidSignInTitle": "需要進行身份驗證",
|
||||
"@androidSignInTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricRequiredTitle": "需要進行生物辨識認證",
|
||||
"@androidBiometricRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsRequiredTitle": "需要裝置憑據",
|
||||
"@androidDeviceCredentialsRequiredTitle": {
|
||||
"description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidDeviceCredentialsSetupDescription": "需要裝置憑據",
|
||||
"@androidDeviceCredentialsSetupDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"goToSettings": "前往設定",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
"androidGoToSettingsDescription": "您的裝置上未設定生物辨識身份驗證。轉到“設定 > 安全”以加入生物辨識身份驗證。",
|
||||
"@androidGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"iOSLockOut": "生物辨識身份驗證已停用。請鎖定並解鎖螢幕以啟用該功能。",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSGoToSettingsDescription": "您的裝置上未設定生物辨識身份驗證。請在您的手機上啟用 觸控 ID 或 面容 ID。",
|
||||
"@iOSGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSOkButton": "好",
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"noInternetConnection": "無網際網路連接",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "請檢查您的網際網路連接,然後重試。",
|
||||
"signOutFromOtherDevices": "從其他裝置登出",
|
||||
"signOutOtherBody": "如果您認為有人可能知道您的密碼,您可以強制所有其他使用您帳戶的裝置登出。",
|
||||
"signOutOtherDevices": "登出其他裝置",
|
||||
"doNotSignOut": "不要登出",
|
||||
"hearUsWhereTitle": "您是怎麼知道 Ente 的?(可選)",
|
||||
"hearUsExplanation": "我們不跟蹤APP安裝情況。如果您告訴我們您是在哪裡找到我們的,將會有所幫助!",
|
||||
"recoveryKeySaved": "復原密鑰已儲存在下載資料夾中!",
|
||||
"waitingForBrowserRequest": "正在等待瀏覽器請求...",
|
||||
"waitingForVerification": "等待驗證...",
|
||||
"passkey": "通行金鑰",
|
||||
"passKeyPendingVerification": "仍需驗證",
|
||||
"loginSessionExpired": "工作階段已過期",
|
||||
"loginSessionExpiredDetails": "您的工作階段已過期。請重新登錄。",
|
||||
"developerSettingsWarning": "您確定要修改開發者設定嗎?",
|
||||
"developerSettings": "開發者設定",
|
||||
"serverEndpoint": "伺服器端點",
|
||||
"invalidEndpoint": "端點無效",
|
||||
"invalidEndpointMessage": "抱歉,您輸入的端點無效。請輸入有效的端點,然後重試。",
|
||||
"endpointUpdatedMessage": "端點更新成功",
|
||||
"customEndpoint": "已連接至 {endpoint}",
|
||||
"pinText": "置頂",
|
||||
"unpinText": "取消置頂",
|
||||
"pinnedCodeMessage": "{code} 已被置頂",
|
||||
"unpinnedCodeMessage": "{code} 已被取消置頂",
|
||||
"pinned": "已置頂",
|
||||
"tags": "標籤",
|
||||
"createNewTag": "建立新標籤",
|
||||
"tag": "標籤",
|
||||
"create": "建立",
|
||||
"editTag": "編輯標籤",
|
||||
"deleteTagTitle": "要刪除標籤嗎?",
|
||||
"deleteTagMessage": "您確定要刪除此標籤嗎?此操作是不可逆的。",
|
||||
"somethingWentWrongParsingCode": "我們無法解析 {x} 程式碼。",
|
||||
"updateNotAvailable": "更新不可用",
|
||||
"viewRawCodes": "查看原始程式碼",
|
||||
"rawCodes": "原始程式碼",
|
||||
"rawCodeData": "原始程式碼資料",
|
||||
"appLock": "APP鎖",
|
||||
"noSystemLockFound": "未找到系統鎖",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要啟用APP鎖,請在系統設定中設定裝置密碼或螢幕鎖定。",
|
||||
"autoLock": "自動鎖定",
|
||||
"immediately": "立即",
|
||||
"reEnterPassword": "再次輸入密碼",
|
||||
"reEnterPin": "再次輸入 PIN 碼",
|
||||
"next": "下一步",
|
||||
"tooManyIncorrectAttempts": "錯誤的嘗試次數過多",
|
||||
"tapToUnlock": "點選解鎖",
|
||||
"setNewPassword": "設定新密碼",
|
||||
"deviceLock": "裝置鎖",
|
||||
"hideContent": "隱藏內容",
|
||||
"hideContentDescriptionAndroid": "在APP切換器中隱藏APP內容並停用螢幕截圖",
|
||||
"hideContentDescriptioniOS": "在APP切換器中隱藏APP內容",
|
||||
"autoLockFeatureDescription": "APP進入後台後鎖定的時間",
|
||||
"appLockDescription": "在裝置的預設鎖定螢幕和帶有 PIN 或密碼的自訂鎖定螢幕之間進行選擇。",
|
||||
"pinLock": "Pin 鎖定",
|
||||
"enterPin": "輸入 PIN 碼",
|
||||
"setNewPin": "設定新 PIN 碼",
|
||||
"importFailureDescNew": "無法解析選定的檔案。",
|
||||
"appLockNotEnabled": "APP鎖未啟用",
|
||||
"appLockNotEnabledDescription": "請從“安全”>“APP鎖”啟用APP鎖",
|
||||
"authToViewPasskey": "請確認身份以查看通行金鑰",
|
||||
"appLockOfflineModeWarning": "您已選擇繼續而不備份。如果您忘記了APP鎖,您將無法訪問資料。",
|
||||
"duplicateCodes": "重複程式碼",
|
||||
"noDuplicates": "✨ 沒有重複",
|
||||
"youveNoDuplicateCodesThatCanBeCleared": "你沒有任何可清除的重複代碼",
|
||||
"deduplicateCodes": "刪除重複程式碼",
|
||||
"deselectAll": "取消全選",
|
||||
"selectAll": "全選",
|
||||
"deleteDuplicates": "刪除重複項",
|
||||
"plainHTML": "Plain HTML",
|
||||
"tellUsWhatYouThink": "告訴我們您的想法",
|
||||
"supportEnte": "支援 <bold-green>ente</bold-green>",
|
||||
"giveUsAStarOnGithub": "在 Github 上給我們一個星標",
|
||||
"free5GB": "<bold-green>ente</bold-green> Photos 上 5GB 可用空間",
|
||||
"loginWithAuthAccount": "使用您的認證帳戶登錄",
|
||||
"freeStorageOffer": "購買 <bold-green>ente</bold-green> Photos 可享受 10% 優惠",
|
||||
"freeStorageOfferDescription": "使用優惠碼“AUTH”可享受首年 10% 折扣"
|
||||
}
|
||||
@@ -15,7 +15,6 @@ const List<Locale> appSupportedLocales = <Locale>[
|
||||
Locale('es', 'ES'),
|
||||
Locale('fa'),
|
||||
Locale('fr'),
|
||||
Locale('he'),
|
||||
Locale('hu'),
|
||||
Locale('id'),
|
||||
Locale('it'),
|
||||
@@ -26,7 +25,6 @@ const List<Locale> appSupportedLocales = <Locale>[
|
||||
Locale('pl'),
|
||||
Locale('pt'),
|
||||
Locale('pt', 'BR'),
|
||||
Locale('ro'),
|
||||
Locale('ru'),
|
||||
Locale('sl'),
|
||||
Locale('sk'),
|
||||
@@ -34,7 +32,6 @@ const List<Locale> appSupportedLocales = <Locale>[
|
||||
Locale('uk'),
|
||||
Locale('vi'),
|
||||
Locale("zh", "CN"),
|
||||
Locale("zh", "TW"),
|
||||
];
|
||||
|
||||
Locale? autoDetectedLocale;
|
||||
|
||||
@@ -350,7 +350,6 @@ class UserService {
|
||||
userPassword,
|
||||
_config.getKeyAttributes()!,
|
||||
);
|
||||
_config.resetVolatilePassword();
|
||||
page = const HomePage();
|
||||
} else {
|
||||
throw Exception("unexpected response during passkey verification");
|
||||
|
||||
@@ -6,8 +6,8 @@ import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
|
||||
class WindowListenerService {
|
||||
static const double initialWindowHeight = 1200.0;
|
||||
static const double initialWindowWidth = 800.0;
|
||||
static const double minWindowHeight = 600.0;
|
||||
static const double minWindowWidth = 800.0;
|
||||
static const double maxWindowHeight = 8192.0;
|
||||
static const double maxWindowWidth = 8192.0;
|
||||
late SharedPreferences _preferences;
|
||||
@@ -23,9 +23,9 @@ class WindowListenerService {
|
||||
|
||||
Size getWindowSize() {
|
||||
final double windowWidth =
|
||||
_preferences.getDouble('windowWidth') ?? initialWindowWidth;
|
||||
_preferences.getDouble('windowWidth') ?? minWindowWidth;
|
||||
final double windowHeight =
|
||||
_preferences.getDouble('windowHeight') ?? initialWindowHeight;
|
||||
_preferences.getDouble('windowHeight') ?? minWindowHeight;
|
||||
final w = windowWidth.clamp(200.0, maxWindowWidth);
|
||||
final h = windowHeight.clamp(400.0, maxWindowHeight);
|
||||
return Size(w, h);
|
||||
|
||||
@@ -147,8 +147,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
||||
return 'Français';
|
||||
case 'de':
|
||||
return 'Deutsch';
|
||||
case 'he':
|
||||
return 'עברית';
|
||||
case 'hu':
|
||||
return 'Magyar';
|
||||
case 'id':
|
||||
@@ -168,8 +166,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
||||
default:
|
||||
return 'Português';
|
||||
}
|
||||
case 'ro':
|
||||
return 'Română';
|
||||
case 'ru':
|
||||
return 'Русский';
|
||||
case 'sl':
|
||||
@@ -185,13 +181,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
||||
case 'fi':
|
||||
return 'Suomi';
|
||||
case 'zh':
|
||||
if (locale.countryCode == 'TW') {
|
||||
return '中文 (台灣)';
|
||||
} else if (locale.countryCode == 'HK') {
|
||||
return '中文 (香港)';
|
||||
} else if (locale.countryCode == 'CN') {
|
||||
return '中文 (中国)';
|
||||
}
|
||||
switch (locale.scriptCode) {
|
||||
case 'Hans':
|
||||
return '中文 (简体)';
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/l10n/l10n.dart';
|
||||
import 'package:ente_auth/models/user_details.dart';
|
||||
@@ -37,9 +35,7 @@ class NotificationBannerWidget extends StatelessWidget {
|
||||
[
|
||||
BannerWidget(
|
||||
text: l10n.tellUsWhatYouThink,
|
||||
subText: Platform.isIOS
|
||||
? l10n.dropReviewiOS
|
||||
: l10n.dropReviewAndroid,
|
||||
subText: l10n.dropReview,
|
||||
type: BannerType.rateUs,
|
||||
),
|
||||
sectionSpacing,
|
||||
@@ -88,8 +84,7 @@ class NotificationBannerWidget extends StatelessWidget {
|
||||
[
|
||||
BannerWidget(
|
||||
text: l10n.tellUsWhatYouThink,
|
||||
subText:
|
||||
Platform.isIOS ? l10n.dropReviewiOS : l10n.dropReviewAndroid,
|
||||
subText: l10n.dropReview,
|
||||
type: BannerType.rateUs,
|
||||
),
|
||||
sectionSpacing,
|
||||
|
||||
@@ -17,7 +17,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
jni
|
||||
)
|
||||
|
||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
platform :osx, '10.15'
|
||||
platform :osx, '10.14'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
||||
@@ -4,9 +4,6 @@ PODS:
|
||||
- connectivity_plus (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- cupertino_http (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- device_info_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- file_saver (0.0.1):
|
||||
@@ -24,8 +21,6 @@ PODS:
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- objective_c (0.0.1):
|
||||
- FlutterMacOS
|
||||
- OrderedSet (6.0.3)
|
||||
- package_info_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
@@ -77,7 +72,6 @@ PODS:
|
||||
DEPENDENCIES:
|
||||
- app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`)
|
||||
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin`)
|
||||
- cupertino_http (from `Flutter/ephemeral/.symlinks/plugins/cupertino_http/darwin`)
|
||||
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
|
||||
- file_saver (from `Flutter/ephemeral/.symlinks/plugins/file_saver/macos`)
|
||||
- flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos`)
|
||||
@@ -86,7 +80,6 @@ DEPENDENCIES:
|
||||
- flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
|
||||
- FlutterMacOS (from `Flutter/ephemeral`)
|
||||
- local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`)
|
||||
- objective_c (from `Flutter/ephemeral/.symlinks/plugins/objective_c/macos`)
|
||||
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
|
||||
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
|
||||
@@ -111,8 +104,6 @@ EXTERNAL SOURCES:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/app_links/macos
|
||||
connectivity_plus:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin
|
||||
cupertino_http:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/cupertino_http/darwin
|
||||
device_info_plus:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
|
||||
file_saver:
|
||||
@@ -129,8 +120,6 @@ EXTERNAL SOURCES:
|
||||
:path: Flutter/ephemeral
|
||||
local_auth_darwin:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin
|
||||
objective_c:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/objective_c/macos
|
||||
package_info_plus:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
|
||||
path_provider_foundation:
|
||||
@@ -159,7 +148,6 @@ EXTERNAL SOURCES:
|
||||
SPEC CHECKSUMS:
|
||||
app_links: 10e0a0ab602ffaf34d142cd4862f29d34b303b2a
|
||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||
cupertino_http: 947a233f40cfea55167a49f2facc18434ea117ba
|
||||
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
||||
file_saver: 44e6fbf666677faf097302460e214e977fdd977b
|
||||
flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b
|
||||
@@ -168,7 +156,6 @@ SPEC CHECKSUMS:
|
||||
flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9
|
||||
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
objective_c: e5f8194456e8fc943e034d1af00510a1bc29c067
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
@@ -185,6 +172,6 @@ SPEC CHECKSUMS:
|
||||
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
|
||||
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
|
||||
|
||||
PODFILE CHECKSUM: 6ff827273ace187339fc5d3684072a26ad85c298
|
||||
PODFILE CHECKSUM: f401c31c8f7c5571f6f565c78915d54338812dab
|
||||
|
||||
COCOAPODS: 1.16.2
|
||||
|
||||
@@ -428,7 +428,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@@ -560,7 +560,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
@@ -587,7 +587,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
OTHER_CODE_SIGN_FLAGS = "--timestamp";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
||||
@@ -250,10 +250,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: collection
|
||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.18.0"
|
||||
version: "1.19.0"
|
||||
confetti:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
name: ente_auth
|
||||
description: ente two-factor authenticator
|
||||
version: 4.3.3+433
|
||||
version: 4.3.2+432
|
||||
publish_to: none
|
||||
|
||||
environment:
|
||||
|
||||
@@ -20,7 +20,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
jni
|
||||
sentry_flutter
|
||||
)
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 918 B After Width: | Height: | Size: 989 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 607 B |
|
Before Width: | Height: | Size: 935 B After Width: | Height: | Size: 259 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 458 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 655 B |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -41,14 +41,14 @@
|
||||
"onnxruntime-node": "^1.20.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.22.0",
|
||||
"@eslint/js": "^9.21.0",
|
||||
"@tsconfig/node20": "^20.1.4",
|
||||
"@types/auto-launch": "^5.0.5",
|
||||
"@types/ffmpeg-static": "^3.0.3",
|
||||
"ajv": "^8.17.1",
|
||||
"concurrently": "^9.1.2",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^34.3.4",
|
||||
"electron": "^34.3.1",
|
||||
"electron-builder": "^26.0.0",
|
||||
"eslint": "^9",
|
||||
"prettier": "3.5.3",
|
||||
@@ -56,7 +56,7 @@
|
||||
"prettier-plugin-packagejson": "^2.5.10",
|
||||
"shx": "^0.3.4",
|
||||
"typescript": "^5.8.2",
|
||||
"typescript-eslint": "^8.26.1"
|
||||
"typescript-eslint": "^8.26.0"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22",
|
||||
"productName": "ente"
|
||||
|
||||
@@ -404,11 +404,10 @@ const createMainWindow = () => {
|
||||
// "The unresponsive event is fired when Chromium detects that your
|
||||
// webContents is not responding to input messages for > 30 seconds."
|
||||
window.webContents.on("unresponsive", () => {
|
||||
// There is a known case when this can happen: When the user to select a
|
||||
// folder to upload (Upload > Folder), the browser callback to us takes
|
||||
// some time. When trying to upload very large folders on slower Windows
|
||||
// machines, this can take up to 30 seconds.
|
||||
log.warn("MainWindow's webContents are unresponsive");
|
||||
log.error(
|
||||
"MainWindow's webContents are unresponsive, will restart the renderer process",
|
||||
);
|
||||
window.webContents.forcefullyCrashRenderer();
|
||||
});
|
||||
|
||||
window.on("close", (event) => {
|
||||
|
||||
@@ -177,10 +177,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06"
|
||||
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
|
||||
|
||||
"@eslint/js@^9.22.0":
|
||||
version "9.22.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.22.0.tgz#4ff53649ded7cbce90b444b494c234137fa1aa3d"
|
||||
integrity sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==
|
||||
"@eslint/js@^9.21.0":
|
||||
version "9.21.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.21.0.tgz#4303ef4e07226d87c395b8fad5278763e9c15c08"
|
||||
integrity sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==
|
||||
|
||||
"@eslint/object-schema@^2.1.4":
|
||||
version "2.1.4"
|
||||
@@ -392,62 +392,62 @@
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@typescript-eslint/eslint-plugin@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz#3e48eb847924161843b092c87a9b65176b53782f"
|
||||
integrity sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==
|
||||
"@typescript-eslint/eslint-plugin@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.0.tgz#7e880faf91f89471c30c141951e15f0eb3a0599e"
|
||||
integrity sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==
|
||||
dependencies:
|
||||
"@eslint-community/regexpp" "^4.10.0"
|
||||
"@typescript-eslint/scope-manager" "8.26.1"
|
||||
"@typescript-eslint/type-utils" "8.26.1"
|
||||
"@typescript-eslint/utils" "8.26.1"
|
||||
"@typescript-eslint/visitor-keys" "8.26.1"
|
||||
"@typescript-eslint/scope-manager" "8.26.0"
|
||||
"@typescript-eslint/type-utils" "8.26.0"
|
||||
"@typescript-eslint/utils" "8.26.0"
|
||||
"@typescript-eslint/visitor-keys" "8.26.0"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^5.3.1"
|
||||
natural-compare "^1.4.0"
|
||||
ts-api-utils "^2.0.1"
|
||||
|
||||
"@typescript-eslint/parser@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.26.1.tgz#0e2f915a497519fc43f52cf2ecbfa607ff56f72e"
|
||||
integrity sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==
|
||||
"@typescript-eslint/parser@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.26.0.tgz#9b4d2198e89f64fb81e83167eedd89a827d843a9"
|
||||
integrity sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "8.26.1"
|
||||
"@typescript-eslint/types" "8.26.1"
|
||||
"@typescript-eslint/typescript-estree" "8.26.1"
|
||||
"@typescript-eslint/visitor-keys" "8.26.1"
|
||||
"@typescript-eslint/scope-manager" "8.26.0"
|
||||
"@typescript-eslint/types" "8.26.0"
|
||||
"@typescript-eslint/typescript-estree" "8.26.0"
|
||||
"@typescript-eslint/visitor-keys" "8.26.0"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/scope-manager@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz#5e6ad0ac258ccf79462e91c3f43a3f1f7f31a6cc"
|
||||
integrity sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==
|
||||
"@typescript-eslint/scope-manager@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.26.0.tgz#b06623fad54a3a77fadab5f652ef75ed3780b545"
|
||||
integrity sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.26.1"
|
||||
"@typescript-eslint/visitor-keys" "8.26.1"
|
||||
"@typescript-eslint/types" "8.26.0"
|
||||
"@typescript-eslint/visitor-keys" "8.26.0"
|
||||
|
||||
"@typescript-eslint/type-utils@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz#462f0bae09de72ac6e8e1af2ebe588c23224d7f8"
|
||||
integrity sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==
|
||||
"@typescript-eslint/type-utils@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.26.0.tgz#9ee8cc98184b5f66326578de9c097edc89da6f68"
|
||||
integrity sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==
|
||||
dependencies:
|
||||
"@typescript-eslint/typescript-estree" "8.26.1"
|
||||
"@typescript-eslint/utils" "8.26.1"
|
||||
"@typescript-eslint/typescript-estree" "8.26.0"
|
||||
"@typescript-eslint/utils" "8.26.0"
|
||||
debug "^4.3.4"
|
||||
ts-api-utils "^2.0.1"
|
||||
|
||||
"@typescript-eslint/types@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.26.1.tgz#d5978721670cff263348d5062773389231a64132"
|
||||
integrity sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==
|
||||
"@typescript-eslint/types@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.26.0.tgz#c4e93a8faf3a38a8d8adb007dc7834f1c89ee7bf"
|
||||
integrity sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==
|
||||
|
||||
"@typescript-eslint/typescript-estree@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz#eb0e4ce31753683d83be53441a409fd5f0b34afd"
|
||||
integrity sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==
|
||||
"@typescript-eslint/typescript-estree@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.0.tgz#128972172005a7376e34ed2ecba4e29363b0cad1"
|
||||
integrity sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.26.1"
|
||||
"@typescript-eslint/visitor-keys" "8.26.1"
|
||||
"@typescript-eslint/types" "8.26.0"
|
||||
"@typescript-eslint/visitor-keys" "8.26.0"
|
||||
debug "^4.3.4"
|
||||
fast-glob "^3.3.2"
|
||||
is-glob "^4.0.3"
|
||||
@@ -455,22 +455,22 @@
|
||||
semver "^7.6.0"
|
||||
ts-api-utils "^2.0.1"
|
||||
|
||||
"@typescript-eslint/utils@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.26.1.tgz#54cc58469955f25577f659753b71a0e117a0539f"
|
||||
integrity sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==
|
||||
"@typescript-eslint/utils@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.26.0.tgz#845d20ed8378a5594e6445f54e53b972aee7b3e6"
|
||||
integrity sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.4.0"
|
||||
"@typescript-eslint/scope-manager" "8.26.1"
|
||||
"@typescript-eslint/types" "8.26.1"
|
||||
"@typescript-eslint/typescript-estree" "8.26.1"
|
||||
"@typescript-eslint/scope-manager" "8.26.0"
|
||||
"@typescript-eslint/types" "8.26.0"
|
||||
"@typescript-eslint/typescript-estree" "8.26.0"
|
||||
|
||||
"@typescript-eslint/visitor-keys@8.26.1":
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz#c5267fcc82795cf10280363023837deacad2647c"
|
||||
integrity sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==
|
||||
"@typescript-eslint/visitor-keys@8.26.0":
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.0.tgz#a4876216756c69130ea958df3b77222c2ad95290"
|
||||
integrity sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.26.1"
|
||||
"@typescript-eslint/types" "8.26.0"
|
||||
eslint-visitor-keys "^4.2.0"
|
||||
|
||||
"@xmldom/xmldom@^0.8.8":
|
||||
@@ -1264,10 +1264,10 @@ electron-updater@^6.4.0:
|
||||
semver "^7.6.3"
|
||||
tiny-typed-emitter "^2.1.0"
|
||||
|
||||
electron@^34.3.4:
|
||||
version "34.3.4"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-34.3.4.tgz#3acbcb5fe1aabfa926dddce23de28da9e6023cc5"
|
||||
integrity sha512-bIsjBh5EN229K4orJpVfjLb7JEoCYkUVg3tS981E1elEjvhBITqwm+K1j9goEqMIlxqYWgogREYpSZRQ+aLWgQ==
|
||||
electron@^34.3.1:
|
||||
version "34.3.1"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-34.3.1.tgz#2c337a496d923463a2c7be7eaab191ad8220459b"
|
||||
integrity sha512-Vsgxc4FDGg7hjduKyvTP5qfNDxZHTliZIiWD1HlR5hHXx3BFjyVv3db/uEH1GaCU0KKyeNsBXRwS4WAOMaSH5g==
|
||||
dependencies:
|
||||
"@electron/get" "^2.0.0"
|
||||
"@types/node" "^20.9.0"
|
||||
@@ -3209,14 +3209,14 @@ typedarray@^0.0.6:
|
||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
|
||||
|
||||
typescript-eslint@^8.26.1:
|
||||
version "8.26.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.26.1.tgz#d17a638a7543bc535157b83cdf5876513c71493b"
|
||||
integrity sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==
|
||||
typescript-eslint@^8.26.0:
|
||||
version "8.26.0"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.26.0.tgz#f44cafdaa6edc99e3612b33b791eb77a56286320"
|
||||
integrity sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==
|
||||
dependencies:
|
||||
"@typescript-eslint/eslint-plugin" "8.26.1"
|
||||
"@typescript-eslint/parser" "8.26.1"
|
||||
"@typescript-eslint/utils" "8.26.1"
|
||||
"@typescript-eslint/eslint-plugin" "8.26.0"
|
||||
"@typescript-eslint/parser" "8.26.0"
|
||||
"@typescript-eslint/utils" "8.26.0"
|
||||
|
||||
typescript@^5.4.3:
|
||||
version "5.5.4"
|
||||
|
||||
@@ -142,7 +142,6 @@ export const sidebar = [
|
||||
text: "Video streaming",
|
||||
link: "/photos/faq/video-streaming",
|
||||
},
|
||||
{ text: "Misc", link: "/photos/faq/misc" },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -312,10 +311,6 @@ export const sidebar = [
|
||||
text: "Uploads",
|
||||
link: "/self-hosting/troubleshooting/uploads",
|
||||
},
|
||||
{
|
||||
text: "Docker",
|
||||
link: "/self-hosting/troubleshooting/docker",
|
||||
},
|
||||
{
|
||||
text: "Yarn",
|
||||
link: "/self-hosting/troubleshooting/yarn",
|
||||
|
||||
@@ -117,26 +117,13 @@ clicking on "Your map" under "Locations" on the search screen.
|
||||
|
||||
On the login page, enter your email and click on Forgot Password. Then, enter your recovery key and create a new password.
|
||||
|
||||
# iOS Album Backup and Organization in Ente
|
||||
# iOS Album Backup and Organization in Ente
|
||||
|
||||
### How does Ente handle photos that are part of multiple iOS albums?
|
||||
### How does Ente handle photos that are part of multiple iOS albums?
|
||||
When you select multiple albums for backup, Ente prioritizes uploading each photo to the album with the fewest photos. This means a photo will only be uploaded once, even if it exists in multiple albums on your device. If you create new albums on your device after the initial backup, those photos may not appear in the corresponding Ente album if they were already uploaded to a different album.
|
||||
|
||||
|
||||
### Why don’t all photos from a new iOS album appear in the corresponding Ente album?
|
||||
If you create a new album on your device after the initial backup, the photos in that album may have already been uploaded to another album in Ente. To fix this, go to the "On Device" album in Ente, select all photos, and manually add them to the corresponding album in Ente.
|
||||
|
||||
### What happens if I reorganize my photos in the iOS Photos app after backing up?
|
||||
Reorganizing photos in the iOS Photos app (e.g., moving photos to new albums) won’t automatically reflect in Ente. You’ll need to manually add those photos to the corresponding albums in Ente to maintain consistency.
|
||||
|
||||
### Can I search for photos using the descriptions I’ve added?
|
||||
Yes, descriptions are searchable, making it easier to find specific photos later.
|
||||
To do this, open the photo, tap the (i) button, and enter your description.
|
||||
|
||||
### How does the deduplication feature work on the desktop app?
|
||||
If the app finds exact duplicates, it will show them in the deduplication. When you delete a duplicate, the app keeps one copy and creates a symlink for the other duplicate. This helps save storage space.
|
||||
|
||||
### What happens if I lose access to my email address? Can I use my recovery key to bypass email verification?
|
||||
No, the recovery key does not bypass email verification. For security reasons, we do not disable or bypass email verification unless the account owner reaches out to us and successfully verifies their identity by providing details about their account.
|
||||
|
||||
If you lose access to your email, please contact our support team at support@ente.io
|
||||
Reorganizing photos in the iOS Photos app (e.g., moving photos to new albums) won’t automatically reflect in Ente. You’ll need to manually add those photos to the corresponding albums in Ente to maintain consistency
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
title: Miscellaneous general FAQ
|
||||
description: Unsorted frequently asked questions about Ente Photos
|
||||
---
|
||||
|
||||
# Miscellaneous FAQ
|
||||
|
||||
## Exif Description
|
||||
|
||||
Ente will try to read as much information from Exif when the image is uploaded,
|
||||
but after that, only the fields which have been parsed into Ente can be
|
||||
searched.
|
||||
|
||||
The app still show all the fields in the raw Exif data in the file info panel
|
||||
when someone taps on the "View all Exif" option, but otherwise the app is
|
||||
unaware of these fields.
|
||||
|
||||
In particular, for the description associated with a photo, the exact logic to
|
||||
determine the description from the Exif when uploading the image can be seen
|
||||
[in this part of the code](https://github.com/ente-io/ente/blob/0dcb185744da469848b41b668fe4b647226b6fe2/web/packages/gallery/services/exif.ts#L609-L620).
|
||||
@@ -12,11 +12,6 @@ verification code by:
|
||||
|
||||
- Reading it from the DB (otts table)
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> You can also configure your instance to send out emails so that you can get
|
||||
> your verification code via emails by using the `smtp` section in the config.
|
||||
|
||||
You can also set pre-defined hardcoded OTTs for certain users when running
|
||||
locally by creating a `museum.yaml` and adding the `internal.hardcoded-ott`
|
||||
configuration setting to it. See
|
||||
|
||||
@@ -9,11 +9,11 @@ description:
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> This is a community contributed guide, and some of these steps ~~might be~~
|
||||
> ARE out of sync with the upstream changes. This document is retained for
|
||||
> reference purposes, but if something is not working correctly, please see the
|
||||
> latest [READMEs](https://github.com/ente-io/ente/blob/main/server/README.md)
|
||||
> in the repository and/or other guides in [self-hosting](/self-hosting/).
|
||||
> This is a community contributed guide, and some of these steps might be out of
|
||||
> sync with the upstream documentation. If something is not working correctly,
|
||||
> please also see the latest
|
||||
> [READMEs](https://github.com/ente-io/ente/blob/main/server/README.md) in the
|
||||
> repository and/or other guides in [self-hosting](/self-hosting/).
|
||||
|
||||
This guide is for self hosting the server and the web application of Ente Photos
|
||||
using docker compose and an external S3 bucket. So we assume that you already
|
||||
|
||||
@@ -30,6 +30,10 @@ longer term, then it is recommended to follow the Docker approach.
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> This docker image is still in testing stage and it might show up with some
|
||||
> unknown variables in different scenarios. But this image has been tested on a
|
||||
> production Ente site.
|
||||
>
|
||||
> Recurring changes might be made by the team or from community if more
|
||||
> improvements can be made so that we are able to build a full-fledged docker
|
||||
> image.
|
||||
@@ -46,8 +50,8 @@ COPY apps/ .
|
||||
RUN corepack enable
|
||||
|
||||
# Endpoint for Ente Server
|
||||
ENV NEXT_PUBLIC_ENTE_ENDPOINT=https://changeme.com
|
||||
ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://changeme.com
|
||||
ENV NEXT_PUBLIC_ENTE_ENDPOINT=https://your-ente-endpoint.com
|
||||
ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your-albums-endpoint.com
|
||||
|
||||
RUN yarn cache clean
|
||||
RUN yarn install --network-timeout 1000000000
|
||||
@@ -138,6 +142,75 @@ docker compose up -d # --build
|
||||
docker compose logs <container-name>
|
||||
```
|
||||
|
||||
## Without Docker / Docker compose
|
||||
|
||||
One way to run all the apps together without Docker is by using
|
||||
[PM2](https://pm2.keymetrics.io/) in this setup. The configuration and usage is
|
||||
very simple and just needs one configuration file for it. You can run the apps
|
||||
both in dev server mode as well as static files.
|
||||
|
||||
The below configuration will run the apps in dev server mode.
|
||||
|
||||
|
||||
|
||||
### Install PM2
|
||||
|
||||
```sh
|
||||
npm install pm2@latest
|
||||
```
|
||||
|
||||
Copy the below contents to a file called `ecosystem.config.js` inside the
|
||||
`ente/web` directory.
|
||||
|
||||
```js
|
||||
module.exports = {
|
||||
apps: [
|
||||
{
|
||||
name: "photos",
|
||||
script: "yarn workspace photos next dev",
|
||||
env: {
|
||||
NODE_ENV: "development",
|
||||
PORT: "3000"
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "accounts",
|
||||
script: "yarn workspace accounts next dev",
|
||||
env: {
|
||||
NODE_ENV: "development",
|
||||
PORT: "3001"
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "auth",
|
||||
script: "yarn workspace auth next dev",
|
||||
env: {
|
||||
NODE_ENV: "development",
|
||||
PORT: "3002"
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "cast",
|
||||
script: "yarn workspace cast next dev",
|
||||
env: {
|
||||
NODE_ENV: "development",
|
||||
PORT: "3003"
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
Finally, start pm2.
|
||||
|
||||
```sh
|
||||
pm2 start
|
||||
|
||||
# for logs
|
||||
pm2 logs all
|
||||
```
|
||||
|
||||
## Configure App Endpoints
|
||||
|
||||
> [!NOTE]
|
||||
|
||||
@@ -14,34 +14,7 @@ the same code we use for our own cloud service.
|
||||
> [blog post](https://ente.io/blog/open-sourcing-our-server/) announcing the
|
||||
> open sourcing of our server useful.
|
||||
|
||||
## Getting started - Quickstart
|
||||
|
||||
Install [Docker](https://www.docker.com). Then, paste the following command in a
|
||||
your terminal:
|
||||
|
||||
```sh
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/quickstart.sh)"
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> For more details about what this does, see [the quickstart
|
||||
> README](https://github.com/ente-io/ente/blob/main/server/docs/quickstart.md).
|
||||
|
||||
That's about it. If you open http://localhost:3000, you will be able to create
|
||||
an account on a Ente Photos web app running on your machine, and this web app
|
||||
will be connecting to the server running on your local machine at
|
||||
`localhost:8080`. The verification code will be shown in the server logs.
|
||||
|
||||
For the mobile or desktop apps, you don't even need to build, and can install
|
||||
normal Ente apps and configure them to use your
|
||||
[custom self-hosted server](guides/custom-server/).
|
||||
|
||||
## Getting started - From source
|
||||
|
||||
The quickstart method above uses pre-built images. Alternatively, if you want to
|
||||
build the self hosted server images from source, you can use the steps in this
|
||||
section.
|
||||
## Getting started
|
||||
|
||||
#### Installing Docker
|
||||
|
||||
@@ -57,6 +30,11 @@ cd ente/server
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> You can also use a pre-built Docker image from `ghcr.io/ente-io/server`
|
||||
> ([More info](https://github.com/ente-io/ente/blob/main/server/docs/docker.md))
|
||||
|
||||
Install the necessary dependencies for running the web client
|
||||
|
||||
```sh
|
||||
@@ -75,6 +53,15 @@ yarn install
|
||||
NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev
|
||||
```
|
||||
|
||||
That's about it. If you open http://localhost:3000, you will be able to create
|
||||
an account on a Ente Photos web app running on your machine, and this web app
|
||||
will be connecting to the server running on your local machine at
|
||||
`localhost:8080`.
|
||||
|
||||
For the mobile apps, you don't even need to build, and can install normal Ente
|
||||
apps and configure them to use your
|
||||
[custom self-hosted server](guides/custom-server/).
|
||||
|
||||
> If you want to build the mobile apps from source, see the instructions
|
||||
> [here](guides/mobile-build).
|
||||
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
---
|
||||
title: Docker errors
|
||||
description: Fixing docker related errors when trying to self host Ente
|
||||
---
|
||||
|
||||
# Docker
|
||||
|
||||
## configs
|
||||
|
||||
Remember to restart your cluster to ensure changes that you make in the
|
||||
`configs` section in `compose.yaml` get picked up.
|
||||
|
||||
```sh
|
||||
docker compose down
|
||||
docker compose up
|
||||
```
|
||||
|
||||
## post_start
|
||||
|
||||
The `server/compose.yaml` Docker compose file uses the "post_start" lifecycle
|
||||
hook to provision the MinIO instance.
|
||||
|
||||
The lifecycle hook **requires Docker Compose version 2.30.0+**, and if you're
|
||||
using an older version of docker compose you will see an error like this:
|
||||
|
||||
```
|
||||
validating compose.yaml: services.minio Additional property post_start is not allowed
|
||||
```
|
||||
|
||||
The easiest way to resolve this is to upgrade your Docker compose.
|
||||
|
||||
If you cannot update your Docker compose version, then alternatively you can
|
||||
perform the same configuration by removing the "post_start" hook, and adding a
|
||||
new service definition:
|
||||
|
||||
```yaml
|
||||
minio-provision:
|
||||
image: minio/mc
|
||||
depends_on:
|
||||
- minio
|
||||
volumes:
|
||||
- minio-data:/data
|
||||
networks:
|
||||
- internal
|
||||
entrypoint: |
|
||||
sh -c '
|
||||
#!/bin/sh
|
||||
|
||||
while ! mc config host add h0 http://minio:3200 changeme changeme1234
|
||||
do
|
||||
echo "waiting for minio..."
|
||||
sleep 0.5
|
||||
done
|
||||
|
||||
cd /data
|
||||
|
||||
mc mb -p b2-eu-cen
|
||||
mc mb -p wasabi-eu-central-2-v3
|
||||
mc mb -p scw-eu-fr-v3
|
||||
'
|
||||
```
|
||||
|
||||
## start_interval
|
||||
|
||||
Similar to the `post_start` case above, if you are seeing an error like
|
||||
|
||||
```
|
||||
services.postgres.healthcheck Additional property start_interval is not allowed
|
||||
```
|
||||
|
||||
You will need to upgrade your Docker compose version to a newer version that
|
||||
supports the `start_interval` property on the health check.
|
||||
@@ -5,8 +5,7 @@ description: Fixing yarn install errors when trying to self host Ente
|
||||
|
||||
# Yarn
|
||||
|
||||
If your `yarn install` is failing, make sure you are using Yarn v1 (also known
|
||||
as "Yarn Classic"):
|
||||
If your `yarn install` is failing, make sure you are using Yarn Classic
|
||||
|
||||
- https://classic.yarnpkg.com/lang/en/docs/install
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ plugins {
|
||||
id "com.android.application"
|
||||
id "kotlin-android"
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
id 'org.jetbrains.kotlin.plugin.serialization' version '2.1.10'
|
||||
}
|
||||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
@@ -82,6 +81,10 @@ android {
|
||||
dimension "default"
|
||||
applicationIdSuffix ".dev"
|
||||
}
|
||||
face {
|
||||
dimension "default"
|
||||
applicationIdSuffix ".face"
|
||||
}
|
||||
playstore {
|
||||
dimension "default"
|
||||
}
|
||||
@@ -134,8 +137,7 @@ flutter {
|
||||
|
||||
dependencies {
|
||||
implementation 'io.sentry:sentry-android:2.0.0'
|
||||
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21'
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0'
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21"
|
||||
implementation 'com.android.support:multidex:1.0.3'
|
||||
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
|
||||
implementation 'com.microsoft.onnxruntime:onnxruntime-android:1.8.1'
|
||||
|
||||
@@ -1,27 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="io.ente.photos">
|
||||
|
||||
<!-- Adding the following block to prevent the app from having multiple
|
||||
launcher entries. We can remove this along with the `LAUNCHER` category from
|
||||
main/AndroidManifest.xml once
|
||||
https://github.com/flutter/flutter/issues/38965 is fixed. -->
|
||||
<application>
|
||||
<activity android:name=".MainActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:exported="true"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER" tools:node="remove"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
||||
10
mobile/android/app/src/face/AndroidManifest.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="io.ente.photos">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
</manifest>
|
||||
4
mobile/android/app/src/face/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<resources>
|
||||
<string name="app_name">Ente Face</string>
|
||||
<string name="backup">backup face</string>
|
||||
</resources>
|
||||
@@ -1,25 +1,4 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
|
||||
package="io.ente.photos">
|
||||
|
||||
<!-- Adding the following block to prevent the app from having multiple
|
||||
launcher entries. We can remove this along with the `LAUNCHER` category from
|
||||
main/AndroidManifest.xml once
|
||||
https://github.com/flutter/flutter/issues/38965 is fixed. -->
|
||||
<application>
|
||||
<activity android:name=".MainActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:exported="true"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER" tools:node="remove"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
<uses-permission android:name="com.android.vending.BILLING" tools:node="remove"/>
|
||||
</manifest>
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="io.ente.photos">
|
||||
|
||||
<!-- Adding the following block to prevent the app from having multiple
|
||||
launcher entries. We can remove this along with the `LAUNCHER` category from
|
||||
main/AndroidManifest.xml once
|
||||
https://github.com/flutter/flutter/issues/38965 is fixed. -->
|
||||
<application>
|
||||
<activity android:name=".MainActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:exported="true"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER" tools:node="remove"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -3,7 +3,7 @@
|
||||
package="io.ente.photos">
|
||||
<application android:name="${applicationName}"
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/icon_green"
|
||||
android:icon="@mipmap/launcher_icon"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:allowBackup="false"
|
||||
@@ -17,11 +17,8 @@
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="es.antonborri.home_widget.action.LAUNCH" />
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
@@ -88,50 +85,6 @@
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
<activity-alias
|
||||
android:name="${applicationId}.IconGreen"
|
||||
android:icon="@mipmap/icon_green"
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
android:targetActivity=".MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:name="${applicationId}.IconLight"
|
||||
android:icon="@mipmap/icon_light"
|
||||
android:enabled="false"
|
||||
android:exported="true"
|
||||
android:targetActivity=".MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:name="${applicationId}.IconDark"
|
||||
android:icon="@mipmap/icon_dark"
|
||||
android:enabled="false"
|
||||
android:exported="true"
|
||||
android:targetActivity=".MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:name="${applicationId}.IconOG"
|
||||
android:icon="@mipmap/icon_og"
|
||||
android:enabled="false"
|
||||
android:exported="true"
|
||||
android:targetActivity=".MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
@@ -143,12 +96,12 @@
|
||||
android:value="https://2235e5c99219488ea93da34b9ac1cb68@sentry.ente.io/4" />
|
||||
<meta-data android:name="firebase_analytics_collection_deactivated"
|
||||
android:value="true" />
|
||||
<receiver android:name="EnteMemoryWidgetProvider" android:label="Memories" android:exported="true">
|
||||
<receiver android:name="SlideshowWidgetProvider" android:label="Favorites" android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.appwidget.provider"
|
||||
android:resource="@xml/memory_widget" />
|
||||
android:resource="@xml/slideshow_widget" />
|
||||
</receiver>
|
||||
</application>
|
||||
|
||||
|
||||
@@ -1,198 +0,0 @@
|
||||
package io.ente.photos
|
||||
|
||||
import android.appwidget.AppWidgetManager
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import android.graphics.drawable.BitmapDrawable
|
||||
import android.net.Uri
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.RemoteViews
|
||||
import androidx.core.content.ContextCompat
|
||||
import es.antonborri.home_widget.HomeWidgetLaunchIntent
|
||||
import es.antonborri.home_widget.HomeWidgetProvider
|
||||
import java.io.File
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.json.Json
|
||||
|
||||
@Serializable
|
||||
data class MemoryFileData(val title: String?, val subText: String?, val generatedId: Int?)
|
||||
|
||||
class EnteMemoryWidgetProvider : HomeWidgetProvider() {
|
||||
override fun onUpdate(
|
||||
context: Context,
|
||||
appWidgetManager: AppWidgetManager,
|
||||
appWidgetIds: IntArray,
|
||||
widgetData: SharedPreferences
|
||||
) {
|
||||
appWidgetIds.forEach { widgetId ->
|
||||
val views =
|
||||
RemoteViews(context.packageName, R.layout.memory_widget_layout)
|
||||
.apply {
|
||||
val totalMemories =
|
||||
widgetData.getInt("totalMemories", 0)
|
||||
var randomNumber = -1
|
||||
var imagePath: String? = null
|
||||
if (totalMemories > 0) {
|
||||
randomNumber =
|
||||
(0 until totalMemories!!).random()
|
||||
imagePath =
|
||||
widgetData.getString(
|
||||
"memory_widget_" +
|
||||
randomNumber,
|
||||
null
|
||||
)
|
||||
}
|
||||
var imageExists: Boolean = false
|
||||
if (imagePath != null) {
|
||||
val imageFile = File(imagePath)
|
||||
imageExists = imageFile.exists()
|
||||
}
|
||||
if (imageExists) {
|
||||
val data =
|
||||
widgetData.getString(
|
||||
"memory_widget_${randomNumber}_data",
|
||||
null
|
||||
)
|
||||
val decoded: MemoryFileData? =
|
||||
data?.let {
|
||||
Json.decodeFromString<
|
||||
MemoryFileData>(it)
|
||||
}
|
||||
val title = decoded?.title
|
||||
val subText = decoded?.subText
|
||||
val generatedId = decoded?.generatedId
|
||||
|
||||
val deepLinkUri =
|
||||
Uri.parse(
|
||||
"memorywidget://message?generatedId=${generatedId}&homeWidget"
|
||||
)
|
||||
|
||||
val pendingIntent =
|
||||
HomeWidgetLaunchIntent.getActivity(
|
||||
context,
|
||||
MainActivity::class.java,
|
||||
deepLinkUri
|
||||
)
|
||||
|
||||
setOnClickPendingIntent(
|
||||
R.id.widget_container,
|
||||
pendingIntent
|
||||
)
|
||||
|
||||
Log.d(
|
||||
"EnteMemoryWidgetProvider",
|
||||
"Image exists: $imagePath"
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_img,
|
||||
View.VISIBLE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder_container,
|
||||
View.VISIBLE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_subtitle,
|
||||
View.VISIBLE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_title,
|
||||
View.VISIBLE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_overlay,
|
||||
View.VISIBLE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder,
|
||||
View.GONE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder_text,
|
||||
View.GONE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder_container,
|
||||
View.GONE
|
||||
)
|
||||
|
||||
val bitmap: Bitmap =
|
||||
BitmapFactory.decodeFile(imagePath)
|
||||
setImageViewBitmap(R.id.widget_img, bitmap)
|
||||
setTextViewText(R.id.widget_title, title)
|
||||
setTextViewText(
|
||||
R.id.widget_subtitle,
|
||||
subText
|
||||
)
|
||||
} else {
|
||||
// Open App on Widget Click
|
||||
val pendingIntent =
|
||||
HomeWidgetLaunchIntent.getActivity(
|
||||
context,
|
||||
MainActivity::class.java
|
||||
)
|
||||
setOnClickPendingIntent(
|
||||
R.id.widget_container,
|
||||
pendingIntent
|
||||
)
|
||||
|
||||
Log.d(
|
||||
"EnteMemoryWidgetProvider",
|
||||
"Image doesn't exists"
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_img,
|
||||
View.GONE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder_container,
|
||||
View.GONE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_subtitle,
|
||||
View.GONE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_title,
|
||||
View.GONE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_overlay,
|
||||
View.GONE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder,
|
||||
View.VISIBLE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder_text,
|
||||
View.VISIBLE
|
||||
)
|
||||
setViewVisibility(
|
||||
R.id.widget_placeholder_container,
|
||||
View.VISIBLE
|
||||
)
|
||||
|
||||
val drawable =
|
||||
ContextCompat.getDrawable(
|
||||
context,
|
||||
R.drawable
|
||||
.ic_home_widget_default
|
||||
)
|
||||
val bitmap =
|
||||
(drawable as BitmapDrawable).bitmap
|
||||
setImageViewBitmap(
|
||||
R.id.widget_placeholder,
|
||||
bitmap
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
appWidgetManager.updateAppWidget(widgetId, views)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package io.ente.photos
|
||||
|
||||
import android.appwidget.AppWidgetManager
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import android.graphics.drawable.BitmapDrawable
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.RemoteViews
|
||||
import androidx.core.content.ContextCompat
|
||||
import es.antonborri.home_widget.HomeWidgetLaunchIntent
|
||||
import es.antonborri.home_widget.HomeWidgetProvider
|
||||
import java.io.File
|
||||
|
||||
class SlideshowWidgetProvider : HomeWidgetProvider() {
|
||||
override fun onUpdate(
|
||||
context: Context,
|
||||
appWidgetManager: AppWidgetManager,
|
||||
appWidgetIds: IntArray,
|
||||
widgetData: SharedPreferences
|
||||
) {
|
||||
appWidgetIds.forEach { widgetId ->
|
||||
val views =
|
||||
RemoteViews(context.packageName, R.layout.slideshow_layout).apply {
|
||||
// Open App on Widget Click
|
||||
val pendingIntent =
|
||||
HomeWidgetLaunchIntent.getActivity(
|
||||
context,
|
||||
MainActivity::class.java
|
||||
)
|
||||
setOnClickPendingIntent(R.id.widget_container, pendingIntent)
|
||||
|
||||
// Show Images saved with `renderFlutterWidget`
|
||||
val imagePath = widgetData.getString("slideshow", null)
|
||||
var imageExists: Boolean = false
|
||||
if (imagePath != null) {
|
||||
val imageFile = File(imagePath)
|
||||
imageExists = imageFile.exists()
|
||||
}
|
||||
if (imageExists) {
|
||||
Log.d("SlideshowWidgetProvider", "Image exists: $imagePath")
|
||||
setViewVisibility(R.id.widget_img, View.VISIBLE)
|
||||
setViewVisibility(R.id.widget_placeholder, View.GONE)
|
||||
|
||||
val bitmap: Bitmap = BitmapFactory.decodeFile(imagePath)
|
||||
setImageViewBitmap(R.id.widget_img, bitmap)
|
||||
} else {
|
||||
Log.d("SlideshowWidgetProvider", "Image doesn't exists")
|
||||
setViewVisibility(R.id.widget_img, View.GONE)
|
||||
setViewVisibility(R.id.widget_placeholder, View.VISIBLE)
|
||||
|
||||
val drawable =
|
||||
ContextCompat.getDrawable(
|
||||
context,
|
||||
R.drawable.ic_home_widget_default
|
||||
)
|
||||
val bitmap = (drawable as BitmapDrawable).bitmap
|
||||
setImageViewBitmap(R.id.widget_placeholder, bitmap)
|
||||
}
|
||||
}
|
||||
|
||||
appWidgetManager.updateAppWidget(widgetId, views)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.4 KiB |
BIN
mobile/android/app/src/main/res/drawable-night-hdpi/splash.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 2.4 KiB |
BIN
mobile/android/app/src/main/res/drawable-night-mdpi/splash.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 70 B |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 6.0 KiB |
BIN
mobile/android/app/src/main/res/drawable-night-xhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 16 KiB |
BIN
mobile/android/app/src/main/res/drawable-night-xxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 70 B |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |