Compare commits
1 Commits
auth-v4.3.
...
docs-addiO
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acf978c302 |
4
.github/workflows/auth-crowdin-push.yml
vendored
@@ -9,10 +9,6 @@ on:
|
|||||||
# Or the workflow itself is changed
|
# Or the workflow itself is changed
|
||||||
- ".github/workflows/auth-crowdin.yml"
|
- ".github/workflows/auth-crowdin.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
push-sources-to-crowdin:
|
push-sources-to-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
4
.github/workflows/auth-crowdin-sync.yml
vendored
@@ -8,10 +8,6 @@ on:
|
|||||||
# Also allow manually running the workflow.
|
# Also allow manually running the workflow.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
synchronize-with-crowdin:
|
synchronize-with-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
3
.github/workflows/auth-internal-release.yml
vendored
@@ -6,9 +6,6 @@ on:
|
|||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.24.3"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
5
.github/workflows/auth-lint.yml
vendored
@@ -10,9 +10,6 @@ on:
|
|||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.24.3"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -33,7 +30,7 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
- name: Verify all icons are less than 20KB
|
- name: Verify all icons are less than 20KB
|
||||||
run: |
|
run: |
|
||||||
find assets/custom-icons -type f -name "*.svg" | while read -r file; do
|
find assets/custom-icons -type f -name "*.svg" | while read -r file; do
|
||||||
|
|||||||
95
.github/workflows/auth-release.yml
vendored
@@ -31,12 +31,9 @@ on:
|
|||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.24.3"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-linux-latest:
|
build-ubuntu:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -93,31 +90,22 @@ jobs:
|
|||||||
- name: Install dependencies for desktop build
|
- name: Install dependencies for desktop build
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y
|
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'
|
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
|
- name: Build desktop app
|
||||||
run: |
|
run: |
|
||||||
flutter config --enable-linux-desktop
|
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
|
# dart pub global activate flutter_distributor
|
||||||
# RPM
|
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=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
|
|
||||||
flutter_distributor package --platform=linux --targets=deb --skip-clean
|
flutter_distributor package --platform=linux --targets=deb --skip-clean
|
||||||
mv dist/**/*-*-linux.deb artifacts/ente-${{ github.ref_name }}-x86_64.deb
|
mv dist/**/*-*-linux.deb artifacts/ente-${{ github.ref_name }}-x86_64.deb
|
||||||
|
env:
|
||||||
|
LIBSODIUM_USE_PKGCONFIG: 1
|
||||||
|
|
||||||
- name: Generate checksums
|
- name: Generate checksums and push to artifacts
|
||||||
run: sha256sum artifacts/ente-* >> artifacts/sha256sum-rpm-appimage
|
run: |
|
||||||
|
sha256sum artifacts/ente-* > artifacts/sha256sum-apk-deb
|
||||||
|
|
||||||
- name: Create a draft GitHub release
|
- name: Create a draft GitHub release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
@@ -137,6 +125,67 @@ jobs:
|
|||||||
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||||
track: internal
|
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:
|
build-windows:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
|
||||||
@@ -164,7 +213,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
flutter config --enable-windows-desktop
|
flutter config --enable-windows-desktop
|
||||||
# dart pub global activate flutter_distributor
|
# dart pub global activate flutter_distributor
|
||||||
dart pub global activate --source git https://github.com/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
|
make innoinstall
|
||||||
flutter_distributor package --platform=windows --targets=exe --skip-clean
|
flutter_distributor package --platform=windows --targets=exe --skip-clean
|
||||||
mv dist/**/*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
mv dist/**/*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||||
|
|||||||
4
.github/workflows/cli-release.yml
vendored
@@ -12,10 +12,6 @@ on:
|
|||||||
tags:
|
tags:
|
||||||
- "cli-v*"
|
- "cli-v*"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
draft-release:
|
draft-release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
53
.github/workflows/codeql.yml
vendored
@@ -1,53 +0,0 @@
|
|||||||
# The only reason we're making a custom CodeQL configuration is because the
|
|
||||||
# default setup does not have an option to run daily / weekly instead of per
|
|
||||||
# push, which is too slow.
|
|
||||||
#
|
|
||||||
# In the future, it might become faster. Then just delete this file, and revert
|
|
||||||
# to the default configuration.
|
|
||||||
#
|
|
||||||
# References:
|
|
||||||
# https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/
|
|
||||||
|
|
||||||
name: "CodeQL"
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch: # Allow running manually
|
|
||||||
schedule:
|
|
||||||
- cron: "22 1 * * 1"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyze:
|
|
||||||
name: Analyze (${{ matrix.language }})
|
|
||||||
runs-on: 'ubuntu-latest'
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
# Required for all workflows.
|
|
||||||
security-events: write
|
|
||||||
# Required to fetch internal or private CodeQL packs.
|
|
||||||
packages: read
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- language: actions
|
|
||||||
build-mode: none
|
|
||||||
- language: go
|
|
||||||
build-mode: autobuild
|
|
||||||
- language: javascript-typescript
|
|
||||||
build-mode: none
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v3
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
build-mode: ${{ matrix.build-mode }}
|
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v3
|
|
||||||
with:
|
|
||||||
category: "/language:${{matrix.language}}"
|
|
||||||
3
.github/workflows/copycat-db-release.yml
vendored
@@ -3,9 +3,6 @@ name: "Release (copycat-db)"
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch: # Run manually
|
workflow_dispatch: # Run manually
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
5
.github/workflows/desktop-lint.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "desktop/**"
|
- "desktop/**"
|
||||||
- ".github/workflows/desktop-lint.yml"
|
- ".github/workflows/desktop-lint.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -23,7 +20,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "desktop/yarn.lock"
|
cache-dependency-path: "desktop/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/docs-deploy.yml
vendored
@@ -10,9 +10,6 @@ on:
|
|||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "docs/yarn.lock"
|
cache-dependency-path: "docs/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/docs-verify-build.yml
vendored
@@ -10,9 +10,6 @@ on:
|
|||||||
- "docs/**"
|
- "docs/**"
|
||||||
- ".github/workflows/docs-verify-build.yml"
|
- ".github/workflows/docs-verify-build.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
verify-build:
|
verify-build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "docs/yarn.lock"
|
cache-dependency-path: "docs/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/infra-deploy-staff.yml
vendored
@@ -10,9 +10,6 @@ on:
|
|||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "infra/staff/yarn.lock"
|
cache-dependency-path: "infra/staff/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/infra-lint-staff.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "infra/staff/**"
|
- "infra/staff/**"
|
||||||
- ".github/workflows/infra-deploy-staff.yml"
|
- ".github/workflows/infra-deploy-staff.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -25,7 +22,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "infra/staff/yarn.lock"
|
cache-dependency-path: "infra/staff/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
4
.github/workflows/mobile-crowdin-push.yml
vendored
@@ -9,10 +9,6 @@ on:
|
|||||||
# Or the workflow itself is changed
|
# Or the workflow itself is changed
|
||||||
- ".github/workflows/mobile-crowdin.yml"
|
- ".github/workflows/mobile-crowdin.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
push-sources-to-crowdin:
|
push-sources-to-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
4
.github/workflows/mobile-crowdin-sync.yml
vendored
@@ -8,10 +8,6 @@ on:
|
|||||||
# Also allow manually running the workflow.
|
# Also allow manually running the workflow.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
synchronize-with-crowdin:
|
synchronize-with-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ on:
|
|||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.24.3"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -57,7 +54,7 @@ jobs:
|
|||||||
packageName: io.ente.photos
|
packageName: io.ente.photos
|
||||||
releaseFiles: mobile/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
releaseFiles: mobile/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||||
track: internal
|
track: internal
|
||||||
|
|
||||||
- name: Notify Discord
|
- name: Notify Discord
|
||||||
uses: sarisia/actions-status-discord@v1
|
uses: sarisia/actions-status-discord@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
4
.github/workflows/mobile-lint.yml
vendored
@@ -8,10 +8,8 @@ on:
|
|||||||
- ".github/workflows/mobile-lint.yml"
|
- ".github/workflows/mobile-lint.yml"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.24.3"
|
|
||||||
|
|
||||||
permissions:
|
FLUTTER_VERSION: "3.24.3"
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
|
|||||||
3
.github/workflows/mobile-release.yml
vendored
@@ -11,9 +11,6 @@ on:
|
|||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: "3.24.3"
|
FLUTTER_VERSION: "3.24.3"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
3
.github/workflows/server-lint.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "server/**"
|
- "server/**"
|
||||||
- ".github/workflows/server-lint.yml"
|
- ".github/workflows/server-lint.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -7,10 +7,6 @@ on:
|
|||||||
# Run manually if needed to publish out of schedule.
|
# Run manually if needed to publish out of schedule.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write # for pushing the `ghcr/server` branch
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -40,6 +36,6 @@ jobs:
|
|||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
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: |
|
run: |
|
||||||
git push -f origin HEAD:refs/heads/ghcr/server
|
git push -f origin HEAD:refs/heads/server/ghcr
|
||||||
3
.github/workflows/server-release.yml
vendored
@@ -3,9 +3,6 @@ name: "Release (server)"
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch: # Run manually
|
workflow_dispatch: # Run manually
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
4
.github/workflows/web-crowdin-push-both.yml
vendored
@@ -12,10 +12,6 @@ on:
|
|||||||
# `gh workflow run web-crowdin-push-both.yml --ref <my-branch>`
|
# `gh workflow run web-crowdin-push-both.yml --ref <my-branch>`
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
push-both-to-crowdin:
|
push-both-to-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
9
.github/workflows/web-crowdin-sync.yml
vendored
@@ -22,15 +22,6 @@ on:
|
|||||||
# Also allow manually running the workflow.
|
# Also allow manually running the workflow.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
# "In order to push translations and create pull requests, the Crowdin GitHub
|
|
||||||
# action requires the `GITHUB_TOKEN` to have write permission on the `contents`
|
|
||||||
# and `pull-requests`.
|
|
||||||
#
|
|
||||||
# - https://github.com/crowdin/github-action?tab=readme-ov-file#permissions
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
synchronize-with-crowdin:
|
synchronize-with-crowdin:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
5
.github/workflows/web-deploy-one.yml
vendored
@@ -15,9 +15,6 @@ on:
|
|||||||
- "payments"
|
- "payments"
|
||||||
- "photos"
|
- "photos"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -33,7 +30,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/web-deploy-preview.yml
vendored
@@ -15,9 +15,6 @@ on:
|
|||||||
- "payments"
|
- "payments"
|
||||||
- "photos"
|
- "photos"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -33,7 +30,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/web-deploy-staging.yml
vendored
@@ -11,9 +11,6 @@ on:
|
|||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -41,7 +38,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/web-deploy.yml
vendored
@@ -19,9 +19,6 @@ on:
|
|||||||
# Also allow manually running the workflow
|
# Also allow manually running the workflow
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -37,7 +34,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/web-lint.yml
vendored
@@ -7,9 +7,6 @@ on:
|
|||||||
- "web/**"
|
- "web/**"
|
||||||
- ".github/workflows/web-lint.yml"
|
- ".github/workflows/web-lint.yml"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
# Cancel in-progress lint runs when a new commit is pushed.
|
# Cancel in-progress lint runs when a new commit is pushed.
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
@@ -28,7 +25,7 @@ jobs:
|
|||||||
- name: Setup node and enable yarn caching
|
- name: Setup node and enable yarn caching
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
cache: "yarn"
|
cache: "yarn"
|
||||||
cache-dependency-path: "web/yarn.lock"
|
cache-dependency-path: "web/yarn.lock"
|
||||||
|
|
||||||
|
|||||||
38
.github/workflows/web-publish-ghcr.yml
vendored
@@ -1,38 +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:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write # for pushing the `ghcr/web` branch
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -35,7 +35,7 @@ Private sharing. Collaborative albums. Family plans. Easy import, easier export.
|
|||||||
Background uploads. The list goes on. And of course, all of this, while being
|
Background uploads. The list goes on. And of course, all of this, while being
|
||||||
fully end-to-end encrypted across platforms.
|
fully end-to-end encrypted across platforms.
|
||||||
|
|
||||||
Ente Photos is a paid service, but we offer 10GB of free storage.
|
Ente Photos is a paid service, but we offer 5GB of free storage.
|
||||||
You can also clone this repository and choose to self-host.
|
You can also clone this repository and choose to self-host.
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -285,15 +285,6 @@
|
|||||||
"title": "CSGORoll",
|
"title": "CSGORoll",
|
||||||
"slug": "csgoroll"
|
"slug": "csgoroll"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "Cwallet",
|
|
||||||
"altNames": [
|
|
||||||
"cwallet",
|
|
||||||
"c-wallet",
|
|
||||||
"c wallet",
|
|
||||||
"cwallet.com"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "DCS",
|
"title": "DCS",
|
||||||
"altNames": [
|
"altNames": [
|
||||||
@@ -667,14 +658,6 @@
|
|||||||
"mathworks"
|
"mathworks"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "Mbin",
|
|
||||||
"altNames": [
|
|
||||||
"kbin",
|
|
||||||
"thebrainbin",
|
|
||||||
"gehirneimer"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "Mercado Livre",
|
"title": "Mercado Livre",
|
||||||
"slug": "mercado_livre",
|
"slug": "mercado_livre",
|
||||||
@@ -859,10 +842,6 @@
|
|||||||
{
|
{
|
||||||
"title": "Parsec"
|
"title": "Parsec"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "Patient Access",
|
|
||||||
"slug": "patient_access"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "PayPal"
|
"title": "PayPal"
|
||||||
},
|
},
|
||||||
@@ -888,10 +867,6 @@
|
|||||||
{
|
{
|
||||||
"title": "Pingvin Share"
|
"title": "Pingvin Share"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "Pionex",
|
|
||||||
"slug": "pionex"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "Plutus",
|
"title": "Plutus",
|
||||||
"hex": "DEC685"
|
"hex": "DEC685"
|
||||||
@@ -905,13 +880,6 @@
|
|||||||
{
|
{
|
||||||
"title": "PostNL"
|
"title": "PostNL"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "Postmark",
|
|
||||||
"slug": "postmarkapp",
|
|
||||||
"altNames": [
|
|
||||||
"postmarkapp"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "PostScan Mail",
|
"title": "PostScan Mail",
|
||||||
"slug": "postscanmail",
|
"slug": "postscanmail",
|
||||||
@@ -976,15 +944,6 @@
|
|||||||
"slug": "realvnc",
|
"slug": "realvnc",
|
||||||
"hex": "488aec"
|
"hex": "488aec"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "RedotPay",
|
|
||||||
"altNames": [
|
|
||||||
"redotpay",
|
|
||||||
"redot pay",
|
|
||||||
"redot-pay",
|
|
||||||
"redotpay.com"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "Registro br",
|
"title": "Registro br",
|
||||||
"slug": "registro_br",
|
"slug": "registro_br",
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 16 KiB |
@@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg width="320" height="320" viewBox="0 0 320 320" version="1.1" id="svg1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<defs id="defs1">
|
|
||||||
<linearGradient xlink:href="#linearGradient8" id="linearGradient9" x1="105.88936" y1="-7.966506" x2="153.52075" y2="74.533493" gradientUnits="userSpaceOnUse"/>
|
|
||||||
<linearGradient id="linearGradient8">
|
|
||||||
<stop style="stop-color:#2de2e6;stop-opacity:1;" offset="0" id="stop8"/>
|
|
||||||
<stop style="stop-color:#3399ff;stop-opacity:1;" offset="1" id="stop11"/>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient xlink:href="#linearGradient6" id="linearGradient7" x1="97.229103" y1="82.033493" x2="97.229103" y2="107.03349" gradientUnits="userSpaceOnUse"/>
|
|
||||||
<linearGradient id="linearGradient6">
|
|
||||||
<stop style="stop-color:#f623ac;stop-opacity:1;" offset="0" id="stop6"/>
|
|
||||||
<stop style="stop-color:#f706cf;stop-opacity:1;" offset="1" id="stop7"/>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<rect style="display:inline;opacity:1;fill:#29144a;fill-opacity:0;stroke:none;stroke-width:4.39823;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" id="rect35" width="323.65826" height="325.41187" x="0" y="-2.7059329"/>
|
|
||||||
<g id="g1" transform="matrix(0.97092512,0,0,0.95099897,34.423647,35.890832)">
|
|
||||||
<g id="layer1" style="display:inline;fill:none" transform="matrix(2.12871,0,0,2.0000001,-90.126008,15.218211)">
|
|
||||||
<path style="display:inline;opacity:1;fill:url(#linearGradient9);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="M 92.898977,-25.466506 23.616945,94.53349 a 4.9999999,4.9999999 60 0 0 4.330127,7.5 H 166.51114 a 4.9999996,4.9999996 120 0 0 4.33012,-7.499999 L 101.55923,-25.466506 a 5.0000002,5.0000002 180 0 0 -8.660253,0 z" id="path5" transform="translate(5.8501312,19.942587)"/>
|
|
||||||
<path id="path1" style="display:inline;opacity:1;fill:#241734;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="M 103.61607,27.033498 60.315284,102.0335 H 77.635596 L 90.625831,79.533498 103.61607,102.0335 116.60825,79.533498 129.59849,102.0335 h 17.32031 z m 0,15 10.82666,18.74973 a 7.4997612,7.4997612 90 0 1 0,7.50054 l -10.82666,18.74973 -10.824962,-18.74959 a 7.5008819,7.5008819 90 0 1 0,-7.50082 z" transform="translate(-0.5188027,0.07359983)"/>
|
|
||||||
<path style="display:inline;opacity:1;fill:url(#linearGradient7);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="M 27.947072,102.03349 H 166.51114 a 5.0000006,5.0000006 120 0 0 4.33012,-7.5 l -7.21687,-12.499996 h -40.41452 l -12.99038,-22.5 -12.990386,22.5 -12.990381,-22.5 -12.990381,22.5 H 30.833821 L 23.616945,94.53349 a 5,5 60 0 0 4.330127,7.5 z" id="path6" transform="matrix(1.0011548,0,0,1.0030727,5.7535451,19.687436)"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -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 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><path id="A" d="M128 117v6a5 5 0 0 0-5 5h-6a5 5 0 1 0-10 0h-6a5 5 0 1 0-10 0h-6a5 5 0 1 0-10 0h-6a5 5 0 1 0-10 0h-6a5 5 0 1 0-10 0h-6a5 5 0 1 0-10 0h-6a5 5 0 1 0-10 0H5a5 5 0 0 0-5-5v-6a5 5 0 1 0 0-10v-6a5 5 0 0 0 0-10v-6a5 5 0 0 0 0-10v-6a5 5 0 0 0 0-10v-6a5 5 0 0 0 0-10v-6a5 5 0 0 0 0-10v-6a5 5 0 0 0 0-10V5a5 5 0 0 0 5-5h6a5 5 0 0 0 10 0h6a5 5 0 0 0 10 0h6a5 5 0 0 0 10 0h6a5 5 0 0 0 10 0h6a5 5 0 0 0 10 0h6a5 5 0 0 0 10 0h6a5 5 0 1 0 10 0h6a5 5 0 0 0 5 5v6a5 5 0 1 0 0 10v6a5 5 0 1 0 0 10v6a5 5 0 1 0 0 10v6a5 5 0 1 0 0 10v6a5 5 0 1 0 0 10v6a5 5 0 1 0 0 10v6a5 5 0 1 0 0 10z"/><rect id="B" width="96" height="96" x="16" y="16" rx="2"/></defs><g transform="matrix(.492308 0 0 .492308 .492308 .492308)" fill="none" fill-rule="evenodd"><use xlink:href="#A" fill="#f0f0f0"/><path d="M128.5 116.5v7h-.5a4.5 4.5 0 0 0-4.5 4.5v.5h-7v-.5a4.5 4.5 0 0 0-9 0v.5h-7v-.5a4.5 4.5 0 0 0-9 0v.5h-7v-.5a4.5 4.5 0 0 0-9 0v.5h-7v-.5a4.5 4.5 0 0 0-9 0v.5h-7v-.5a4.5 4.5 0 0 0-9 0v.5h-7v-.5a4.5 4.5 0 0 0-9 0v.5h-7v-.5a4.5 4.5 0 0 0-9 0v.5h-7v-.5a4.5 4.5 0 0 0-4.5-4.5h-.5v-7H0a4.5 4.5 0 0 0 0-9h-.5v-7H0a4.5 4.5 0 1 0 0-9h-.5v-7H0a4.5 4.5 0 1 0 0-9h-.5v-7H0a4.5 4.5 0 1 0 0-9h-.5v-7H0a4.5 4.5 0 1 0 0-9h-.5v-7H0a4.5 4.5 0 1 0 0-9h-.5v-7H0a4.5 4.5 0 1 0 0-9h-.5v-7H0A4.5 4.5 0 0 0 4.5 0v-.5h7V0a4.5 4.5 0 1 0 9 0v-.5h7V0a4.5 4.5 0 1 0 9 0v-.5h7V0a4.5 4.5 0 1 0 9 0v-.5h7V0a4.5 4.5 0 1 0 9 0v-.5h7V0a4.5 4.5 0 1 0 9 0v-.5h7V0a4.5 4.5 0 1 0 9 0v-.5h7V0a4.5 4.5 0 0 0 9 0v-.5h7V0a4.5 4.5 0 0 0 4.5 4.5h.5v7h-.5a4.5 4.5 0 0 0 0 9h.5v7h-.5a4.5 4.5 0 0 0 0 9h.5v7h-.5a4.5 4.5 0 0 0 0 9h.5v7h-.5a4.5 4.5 0 0 0 0 9h.5v7h-.5a4.5 4.5 0 0 0 0 9h.5v7h-.5a4.5 4.5 0 0 0 0 9h.5v7h-.5a4.5 4.5 0 0 0 0 9z" stroke="#ccc"/><path d="M127.5 117.478a5.5 5.5 0 0 1 0-10.956v-5.044a5.5 5.5 0 0 1 0-10.956v-5.044a5.5 5.5 0 0 1 0-10.956v-5.044a5.5 5.5 0 0 1 0-10.956v-5.044a5.5 5.5 0 0 1 0-10.956v-5.044a5.5 5.5 0 0 1 0-10.956v-5.044a5.5 5.5 0 0 1 0-10.956V5.478A5.502 5.502 0 0 1 122.522.5h-5.044a5.5 5.5 0 0 1-10.956 0h-5.044a5.5 5.5 0 0 1-10.956 0h-5.044a5.5 5.5 0 0 1-10.956 0h-5.044a5.5 5.5 0 0 1-10.956 0h-5.044a5.5 5.5 0 0 1-10.956 0h-5.044a5.5 5.5 0 0 1-10.956 0h-5.044a5.5 5.5 0 0 1-10.956 0H5.478A5.502 5.502 0 0 1 .5 5.478v5.044a5.5 5.5 0 0 1 0 10.956v5.044a5.5 5.5 0 0 1 0 10.956v5.044a5.5 5.5 0 0 1 0 10.956v5.044a5.5 5.5 0 0 1 0 10.956v5.044a5.5 5.5 0 0 1 0 10.956v5.044a5.5 5.5 0 0 1 0 10.956v5.044a5.5 5.5 0 0 1 0 10.956v5.044a5.502 5.502 0 0 1 4.978 4.978h5.044a5.5 5.5 0 0 1 10.956 0h5.044a5.5 5.5 0 0 1 10.956 0h5.044a5.5 5.5 0 0 1 10.956 0h5.044a5.5 5.5 0 0 1 10.956 0h5.044a5.5 5.5 0 0 1 10.956 0h5.044a5.5 5.5 0 0 1 10.956 0h5.044a5.5 5.5 0 0 1 10.956 0h5.044a5.502 5.502 0 0 1 4.978-4.978z" stroke="#fff"/><use xlink:href="#B" fill="#fedd00"/><rect width="95" height="95" x="16.5" y="16.5" rx="2" stroke="#d9b500"/><rect width="97" height="97" x="15.5" y="15.5" rx="2" stroke="#fff"/><path d="M50.3 86.084V42.3H43V35h25.886c16.168 0 19.522 10.664 19.522 18.06 0 5.934-2.408 10.492-4.902 12.986-4.042 4.042-9.546 4.988-17.888 4.988h-6.536v15.05h7.654v7.3H43v-7.3zm8.772-22.102h7.3c10.75 0 13.072-4.988 13.072-11.008 0-6.88-3.87-10.664-10.32-10.664H59.082z" fill="#000"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 17 KiB |
@@ -1,5 +1,5 @@
|
|||||||
# Uncomment this line to define a global platform for your project
|
# 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.
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|||||||
@@ -4,9 +4,6 @@ PODS:
|
|||||||
- connectivity_plus (0.0.1):
|
- connectivity_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- cupertino_http (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- FlutterMacOS
|
|
||||||
- device_info_plus (0.0.1):
|
- device_info_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- DKImagePickerController/Core (4.3.9):
|
- DKImagePickerController/Core (4.3.9):
|
||||||
@@ -74,8 +71,6 @@ PODS:
|
|||||||
- move_to_background (0.0.1):
|
- move_to_background (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- MTBBarcodeScanner (5.0.11)
|
- MTBBarcodeScanner (5.0.11)
|
||||||
- objective_c (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- OrderedSet (6.0.3)
|
- OrderedSet (6.0.3)
|
||||||
- package_info_plus (0.4.5):
|
- package_info_plus (0.4.5):
|
||||||
- Flutter
|
- Flutter
|
||||||
@@ -87,9 +82,9 @@ PODS:
|
|||||||
- qr_code_scanner (0.2.0):
|
- qr_code_scanner (0.2.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- MTBBarcodeScanner
|
- MTBBarcodeScanner
|
||||||
- SDWebImage (5.21.0):
|
- SDWebImage (5.20.0):
|
||||||
- SDWebImage/Core (= 5.21.0)
|
- SDWebImage/Core (= 5.20.0)
|
||||||
- SDWebImage/Core (5.21.0)
|
- SDWebImage/Core (5.20.0)
|
||||||
- Sentry/HybridSDK (8.36.0)
|
- Sentry/HybridSDK (8.36.0)
|
||||||
- sentry_flutter (8.9.0):
|
- sentry_flutter (8.9.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
@@ -131,7 +126,6 @@ PODS:
|
|||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- app_links (from `.symlinks/plugins/app_links/ios`)
|
- app_links (from `.symlinks/plugins/app_links/ios`)
|
||||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`)
|
- 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`)
|
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||||
- file_saver (from `.symlinks/plugins/file_saver/ios`)
|
- file_saver (from `.symlinks/plugins/file_saver/ios`)
|
||||||
@@ -146,7 +140,6 @@ DEPENDENCIES:
|
|||||||
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||||
- move_to_background (from `.symlinks/plugins/move_to_background/ios`)
|
- 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`)
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
- privacy_screen (from `.symlinks/plugins/privacy_screen/ios`)
|
- privacy_screen (from `.symlinks/plugins/privacy_screen/ios`)
|
||||||
@@ -176,8 +169,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/app_links/ios"
|
:path: ".symlinks/plugins/app_links/ios"
|
||||||
connectivity_plus:
|
connectivity_plus:
|
||||||
:path: ".symlinks/plugins/connectivity_plus/darwin"
|
:path: ".symlinks/plugins/connectivity_plus/darwin"
|
||||||
cupertino_http:
|
|
||||||
:path: ".symlinks/plugins/cupertino_http/darwin"
|
|
||||||
device_info_plus:
|
device_info_plus:
|
||||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||||
file_picker:
|
file_picker:
|
||||||
@@ -206,8 +197,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||||
move_to_background:
|
move_to_background:
|
||||||
:path: ".symlinks/plugins/move_to_background/ios"
|
:path: ".symlinks/plugins/move_to_background/ios"
|
||||||
objective_c:
|
|
||||||
:path: ".symlinks/plugins/objective_c/ios"
|
|
||||||
package_info_plus:
|
package_info_plus:
|
||||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
@@ -234,7 +223,6 @@ EXTERNAL SOURCES:
|
|||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0
|
app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0
|
||||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||||
cupertino_http: 947a233f40cfea55167a49f2facc18434ea117ba
|
|
||||||
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
|
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
|
||||||
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
||||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||||
@@ -252,13 +240,12 @@ SPEC CHECKSUMS:
|
|||||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||||
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
|
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
|
||||||
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
|
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
|
||||||
objective_c: 77e887b5ba1827970907e10e832eec1683f3431d
|
|
||||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||||
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
||||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||||
privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
|
privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
|
||||||
qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
|
qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
|
||||||
SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868
|
SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8
|
||||||
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
|
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
|
||||||
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe
|
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe
|
||||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||||
@@ -271,6 +258,6 @@ SPEC CHECKSUMS:
|
|||||||
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
|
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
|
||||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||||
|
|
||||||
PODFILE CHECKSUM: 78f002751f1a8f65042b8da97902ba4124271c5a
|
PODFILE CHECKSUM: b4e3a7eabb03395b66e81fc061789f61526ee6bb
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
|||||||
@@ -366,7 +366,6 @@
|
|||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -441,7 +440,6 @@
|
|||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -610,7 +608,6 @@
|
|||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -685,7 +682,6 @@
|
|||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -854,7 +850,6 @@
|
|||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
|
|||||||
@@ -66,14 +66,14 @@ class Configuration {
|
|||||||
|
|
||||||
String? _volatilePassword;
|
String? _volatilePassword;
|
||||||
|
|
||||||
|
final _secureStorageOptionsIOS = const IOSOptions(
|
||||||
|
accessibility: KeychainAccessibility.first_unlock_this_device,
|
||||||
|
);
|
||||||
|
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
_preferences = await SharedPreferences.getInstance();
|
_preferences = await SharedPreferences.getInstance();
|
||||||
sqfliteFfiInit();
|
sqfliteFfiInit();
|
||||||
_secureStorage = const FlutterSecureStorage(
|
_secureStorage = const FlutterSecureStorage();
|
||||||
iOptions: IOSOptions(
|
|
||||||
accessibility: KeychainAccessibility.first_unlock_this_device,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
_tempDirectory = (await DirectoryUtils.getDirectoryForInit()).path;
|
_tempDirectory = (await DirectoryUtils.getDirectoryForInit()).path;
|
||||||
final tempDirectory = io.Directory(_tempDirectory);
|
final tempDirectory = io.Directory(_tempDirectory);
|
||||||
try {
|
try {
|
||||||
@@ -98,6 +98,7 @@ class Configuration {
|
|||||||
Future<void> _initOfflineAccount() async {
|
Future<void> _initOfflineAccount() async {
|
||||||
_offlineAuthKey = await _secureStorage.read(
|
_offlineAuthKey = await _secureStorage.read(
|
||||||
key: offlineAuthSecretKey,
|
key: offlineAuthSecretKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,18 +108,22 @@ class Configuration {
|
|||||||
unawaited(
|
unawaited(
|
||||||
_secureStorage.delete(
|
_secureStorage.delete(
|
||||||
key: key,
|
key: key,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_key = await _secureStorage.read(
|
_key = await _secureStorage.read(
|
||||||
key: keyKey,
|
key: keyKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
_secretKey = await _secureStorage.read(
|
_secretKey = await _secureStorage.read(
|
||||||
key: secretKeyKey,
|
key: secretKeyKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
_authSecretKey = await _secureStorage.read(
|
_authSecretKey = await _secureStorage.read(
|
||||||
key: authSecretKeyKey,
|
key: authSecretKeyKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
if (_key == null) {
|
if (_key == null) {
|
||||||
await logout(autoLogout: true);
|
await logout(autoLogout: true);
|
||||||
@@ -131,6 +136,7 @@ class Configuration {
|
|||||||
for (String key in onlineSecureKeys) {
|
for (String key in onlineSecureKeys) {
|
||||||
await _secureStorage.delete(
|
await _secureStorage.delete(
|
||||||
key: key,
|
key: key,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
await LockScreenSettings.instance.removePinAndPassword();
|
await LockScreenSettings.instance.removePinAndPassword();
|
||||||
@@ -390,6 +396,7 @@ class Configuration {
|
|||||||
await _secureStorage.write(
|
await _secureStorage.write(
|
||||||
key: keyKey,
|
key: keyKey,
|
||||||
value: key,
|
value: key,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,6 +405,7 @@ class Configuration {
|
|||||||
await _secureStorage.write(
|
await _secureStorage.write(
|
||||||
key: secretKeyKey,
|
key: secretKeyKey,
|
||||||
value: secretKey,
|
value: secretKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,6 +414,7 @@ class Configuration {
|
|||||||
await _secureStorage.write(
|
await _secureStorage.write(
|
||||||
key: authSecretKeyKey,
|
key: authSecretKeyKey,
|
||||||
value: authSecretKey,
|
value: authSecretKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,15 +463,18 @@ class Configuration {
|
|||||||
Future<void> optForOfflineMode() async {
|
Future<void> optForOfflineMode() async {
|
||||||
if ((await _secureStorage.containsKey(
|
if ((await _secureStorage.containsKey(
|
||||||
key: offlineAuthSecretKey,
|
key: offlineAuthSecretKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
))) {
|
))) {
|
||||||
_offlineAuthKey = await _secureStorage.read(
|
_offlineAuthKey = await _secureStorage.read(
|
||||||
key: offlineAuthSecretKey,
|
key: offlineAuthSecretKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
_offlineAuthKey = CryptoUtil.bin2base64(CryptoUtil.generateKey());
|
_offlineAuthKey = CryptoUtil.bin2base64(CryptoUtil.generateKey());
|
||||||
await _secureStorage.write(
|
await _secureStorage.write(
|
||||||
key: offlineAuthSecretKey,
|
key: offlineAuthSecretKey,
|
||||||
value: _offlineAuthKey,
|
value: _offlineAuthKey,
|
||||||
|
iOptions: _secureStorageOptionsIOS,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
await _preferences.setBool(hasOptedForOfflineModeKey, true);
|
await _preferences.setBool(hasOptedForOfflineModeKey, true);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"account": "الحساب",
|
"account": "الحساب",
|
||||||
"unlock": "فتح القُفْل",
|
"unlock": "فتح القفل",
|
||||||
"recoveryKey": "مفتاح الاسترداد",
|
"recoveryKey": "مفتاح الاسترداد",
|
||||||
"counterAppBarTitle": "العداد",
|
"counterAppBarTitle": "العداد",
|
||||||
"@counterAppBarTitle": {
|
"@counterAppBarTitle": {
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
"secretCanNotBeEmpty": "لا يمكن أن يكون رمز السر فارغ",
|
"secretCanNotBeEmpty": "لا يمكن أن يكون رمز السر فارغ",
|
||||||
"bothIssuerAndAccountCanNotBeEmpty": "لا يمكن أن يكون المُصدر والحساب فارغًا",
|
"bothIssuerAndAccountCanNotBeEmpty": "لا يمكن أن يكون المُصدر والحساب فارغًا",
|
||||||
"incorrectDetails": "بيانات غير صحيحة",
|
"incorrectDetails": "بيانات غير صحيحة",
|
||||||
"pleaseVerifyDetails": "الرجاء التأكد من البيانات وإعادة المحاولة",
|
"pleaseVerifyDetails": "من فضلك تأكد من بياناتك وحاول مرة أخرى",
|
||||||
"codeIssuerHint": "المصدِّر",
|
"codeIssuerHint": "المصدِّر",
|
||||||
"codeSecretKeyHint": "الرمز السري",
|
"codeSecretKeyHint": "الرمز السري",
|
||||||
"secret": "سري",
|
"secret": "سري",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"codeAccountHint": "الحساب (you@domain.com)",
|
"codeAccountHint": "الحساب (you@domain.com)",
|
||||||
"codeTagHint": "وسم",
|
"codeTagHint": "وسم",
|
||||||
"accountKeyType": "نوع المفتاح",
|
"accountKeyType": "نوع المفتاح",
|
||||||
"sessionExpired": "انتهت صَلاحِيَة الجِلسة",
|
"sessionExpired": "انتهت صلاحية الجلسة",
|
||||||
"@sessionExpired": {
|
"@sessionExpired": {
|
||||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||||
},
|
},
|
||||||
@@ -48,8 +48,6 @@
|
|||||||
"nextTotpTitle": "التالي",
|
"nextTotpTitle": "التالي",
|
||||||
"deleteCodeTitle": "حذف الرمز؟",
|
"deleteCodeTitle": "حذف الرمز؟",
|
||||||
"deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذه الشيفرة؟ هذا الإجراء لا رجعة فيه.",
|
"deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذه الشيفرة؟ هذا الإجراء لا رجعة فيه.",
|
||||||
"trashCode": "حذف الكود؟",
|
|
||||||
"trashCodeMessage": "هل أنت متيقِّن أنك تريد حذف الكود الخاص بـ {account}؟",
|
|
||||||
"trash": "سلة المهملات",
|
"trash": "سلة المهملات",
|
||||||
"viewLogsAction": "عرض السجلات",
|
"viewLogsAction": "عرض السجلات",
|
||||||
"sendLogsDescription": "سوف يُرسل هذا السجلات لنا لمساعدتنا على تصحيح مشكلتك. بينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل مشاركتها.",
|
"sendLogsDescription": "سوف يُرسل هذا السجلات لنا لمساعدتنا على تصحيح مشكلتك. بينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل مشاركتها.",
|
||||||
@@ -65,7 +63,7 @@
|
|||||||
},
|
},
|
||||||
"copyEmailAction": "نسخ البريد الإلكتروني",
|
"copyEmailAction": "نسخ البريد الإلكتروني",
|
||||||
"exportLogsAction": "تصدير السجلات",
|
"exportLogsAction": "تصدير السجلات",
|
||||||
"reportABug": "ألإبلاغ عن خلل تقني",
|
"reportABug": "الابلاغ عن خلل تقني",
|
||||||
"crashAndErrorReporting": "الإبلاغ عن الأعطال والأخطاء",
|
"crashAndErrorReporting": "الإبلاغ عن الأعطال والأخطاء",
|
||||||
"reportBug": "الإبلاغ عن خلل",
|
"reportBug": "الإبلاغ عن خلل",
|
||||||
"emailUsMessage": "الرجاء مراسلتنا على {email}",
|
"emailUsMessage": "الرجاء مراسلتنا على {email}",
|
||||||
@@ -81,24 +79,22 @@
|
|||||||
"blog": "المدونة",
|
"blog": "المدونة",
|
||||||
"merchandise": "إدارة المنتجات",
|
"merchandise": "إدارة المنتجات",
|
||||||
"verifyPassword": "التحقق من كلمة المرور",
|
"verifyPassword": "التحقق من كلمة المرور",
|
||||||
"pleaseWait": "انتظر قليلاً...",
|
"pleaseWait": "الرجاء الإنتظار...",
|
||||||
"generatingEncryptionKeysTitle": "توليد مفاتيح التشفير...",
|
"generatingEncryptionKeysTitle": "توليد مفاتيح التشفير...",
|
||||||
"recreatePassword": "إعادة كتابة كلمة المرور",
|
"recreatePassword": "إعادة كتابة كلمة المرور",
|
||||||
"recreatePasswordMessage": "الجهاز الحالي ليس قويًا بما يكفي للتحقق من كلمة المرور الخاصة بك، لذا نحتاج إلى إعادة إنشائها مرة واحدة بطريقة تعمل مع جميع الأجهزة.\n\nالرجاء تسجيل الدخول باستخدام مفتاح الاسترداد وإعادة إنشاء كلمة المرور الخاصة بك (يمكنك استخدام نفس كلمة المرور مرة أخرى إذا كنت ترغب في ذلك).",
|
"recreatePasswordMessage": "الجهاز الحالي ليس قويًا بما يكفي للتحقق من كلمة المرور الخاصة بك، لذا نحتاج إلى إعادة إنشائها مرة واحدة بطريقة تعمل مع جميع الأجهزة.\n\nالرجاء تسجيل الدخول باستخدام مفتاح الاسترداد وإعادة إنشاء كلمة المرور الخاصة بك (يمكنك استخدام نفس كلمة المرور مرة أخرى إذا كنت ترغب في ذلك).",
|
||||||
"useRecoveryKey": "استخدم مفتاح الاسترداد",
|
"useRecoveryKey": "استخدم مفتاح الاسترداد",
|
||||||
"incorrectPasswordTitle": "كلمة المرور غير صحيحة",
|
"incorrectPasswordTitle": "كلمة المرور غير صحيحة",
|
||||||
"welcomeBack": "مرحبًا مجددًا!",
|
"welcomeBack": "مرحبًا مجددًا!",
|
||||||
"emailAlreadyRegistered": "البريد الإلكتروني مُسَجَّل من قبل.",
|
"madeWithLoveAtPrefix": "مصنوعة بـ❤️ في ",
|
||||||
"emailNotRegistered": "البريد الإلكتروني غير مُسَجَّل.",
|
|
||||||
"madeWithLoveAtPrefix": "مصنوعة بـ❤️ في",
|
|
||||||
"supportDevs": "اشترك في <bold-green>ente</bold-green> لدعمنا",
|
"supportDevs": "اشترك في <bold-green>ente</bold-green> لدعمنا",
|
||||||
"supportDiscount": "استخدم رمز القسيمة \"AUTH\" للحصول على 10% خَصْم من السنة الأولى",
|
"supportDiscount": "استخدم رمز القسيمة \"AUTH\" للحصول على 10% خصم من السنة الأولى",
|
||||||
"changeEmail": "غير البريد الإلكتروني",
|
"changeEmail": "غير البريد الإلكتروني",
|
||||||
"changePassword": "غير كلمة المرور",
|
"changePassword": "غير كلمة المرور",
|
||||||
"data": "البيانات",
|
"data": "البيانات",
|
||||||
"importCodes": "استورد شيفرات",
|
"importCodes": "استورد شيفرات",
|
||||||
"importTypePlainText": "نص بسيط",
|
"importTypePlainText": "نص بسيط",
|
||||||
"importTypeEnteEncrypted": "تصدير مشفَّر ente",
|
"importTypeEnteEncrypted": "تصدير مشفر ente",
|
||||||
"passwordForDecryptingExport": "كلمة المرور لفك تشفير التصدير",
|
"passwordForDecryptingExport": "كلمة المرور لفك تشفير التصدير",
|
||||||
"passwordEmptyError": "لا يمكن أن تكون كلمة المرور فارغة",
|
"passwordEmptyError": "لا يمكن أن تكون كلمة المرور فارغة",
|
||||||
"importFromApp": "استورد الشيفرات من {appName}",
|
"importFromApp": "استورد الشيفرات من {appName}",
|
||||||
@@ -115,11 +111,10 @@
|
|||||||
"importLabel": "استيراد",
|
"importLabel": "استيراد",
|
||||||
"importInstruction": "الرجاء تحديد ملف يحتوي على قائمة بالرموز الخاصة بك بالشكل التالي",
|
"importInstruction": "الرجاء تحديد ملف يحتوي على قائمة بالرموز الخاصة بك بالشكل التالي",
|
||||||
"importCodeDelimiterInfo": "يمكن فصل الرموز بفاصلة أو سطر جديد",
|
"importCodeDelimiterInfo": "يمكن فصل الرموز بفاصلة أو سطر جديد",
|
||||||
"selectFile": "حدد مِلَفّ",
|
"selectFile": "اختيار الملف",
|
||||||
"emailVerificationToggle": "تأكيد عنوان البريد الإلكتروني",
|
"emailVerificationToggle": "تأكيد عنوان البريد الإلكتروني",
|
||||||
"emailVerificationEnableWarning": "لتجنب إقفال حسابك، تأكد من تخزين نسخة من بريدك الإلكتروني 2FA خارج Ente Auth قبل تمكين التحقق من البريد الإلكتروني.",
|
"emailVerificationEnableWarning": "لتجنب إقفال حسابك، تأكد من تخزين نسخة من بريدك الإلكتروني 2FA خارج Ente Auth قبل تمكين التحقق من البريد الإلكتروني.",
|
||||||
"authToChangeEmailVerificationSetting": "الرجاء المصادقة لتغيير التحقق من البريد الإلكتروني",
|
"authToChangeEmailVerificationSetting": "الرجاء المصادقة لتغيير التحقق من البريد الإلكتروني",
|
||||||
"authenticateGeneric": "الرجاء المصادقة",
|
|
||||||
"authToViewYourRecoveryKey": "الرجاء المصادقة لعرض مفتاح الاسترداد الخاص بك",
|
"authToViewYourRecoveryKey": "الرجاء المصادقة لعرض مفتاح الاسترداد الخاص بك",
|
||||||
"authToChangeYourEmail": "الرجاء المصادقة لتغيير بريدك الإلكتروني",
|
"authToChangeYourEmail": "الرجاء المصادقة لتغيير بريدك الإلكتروني",
|
||||||
"authToChangeYourPassword": "الرجاء المصادقة لتغيير كلمة المرور الخاصة بك",
|
"authToChangeYourPassword": "الرجاء المصادقة لتغيير كلمة المرور الخاصة بك",
|
||||||
@@ -134,7 +129,7 @@
|
|||||||
"general": "العامة",
|
"general": "العامة",
|
||||||
"settings": "الإعدادات",
|
"settings": "الإعدادات",
|
||||||
"copied": "تم النسخ",
|
"copied": "تم النسخ",
|
||||||
"pleaseTryAgain": "يرجى المحاولة مرة أخرى",
|
"pleaseTryAgain": "حاول مرة اخرى",
|
||||||
"existingUser": "المستخدم موجود",
|
"existingUser": "المستخدم موجود",
|
||||||
"newUser": "جديد في Ente",
|
"newUser": "جديد في Ente",
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
@@ -147,8 +142,6 @@
|
|||||||
"leaveFamily": "مغادرة خطة العائلة",
|
"leaveFamily": "مغادرة خطة العائلة",
|
||||||
"leaveFamilyMessage": "هل أنت متأكد من الخروج من خطة العائلة؟",
|
"leaveFamilyMessage": "هل أنت متأكد من الخروج من خطة العائلة؟",
|
||||||
"inFamilyPlanMessage": "أنت مندرج ضمن خطة عائلية!",
|
"inFamilyPlanMessage": "أنت مندرج ضمن خطة عائلية!",
|
||||||
"hintForMobile": "اضغط مطولاً على الكود لتعديل أو إزالته.",
|
|
||||||
"hintForDesktop": "انقر بزر الأيمن على الكود لتعديله.",
|
|
||||||
"scan": "مسح",
|
"scan": "مسح",
|
||||||
"scanACode": "فحص رمز Qr",
|
"scanACode": "فحص رمز Qr",
|
||||||
"verify": "التحقق",
|
"verify": "التحقق",
|
||||||
@@ -158,7 +151,6 @@
|
|||||||
"twoFactorAuthTitle": "المصادقة الثنائية",
|
"twoFactorAuthTitle": "المصادقة الثنائية",
|
||||||
"passkeyAuthTitle": "التحقق من مفتاح المرور",
|
"passkeyAuthTitle": "التحقق من مفتاح المرور",
|
||||||
"verifyPasskey": "تحقق من مفتاح المرور",
|
"verifyPasskey": "تحقق من مفتاح المرور",
|
||||||
"loginWithTOTP": "",
|
|
||||||
"recoverAccount": "إسترجاع الحساب",
|
"recoverAccount": "إسترجاع الحساب",
|
||||||
"enterRecoveryKeyHint": "أدخل رمز الاسترداد",
|
"enterRecoveryKeyHint": "أدخل رمز الاسترداد",
|
||||||
"recover": "استرداد",
|
"recover": "استرداد",
|
||||||
@@ -180,7 +172,7 @@
|
|||||||
"yesSendFeedbackAction": "نعم، ارسل الملاحظات",
|
"yesSendFeedbackAction": "نعم، ارسل الملاحظات",
|
||||||
"noDeleteAccountAction": "لا، حذف الحساب",
|
"noDeleteAccountAction": "لا، حذف الحساب",
|
||||||
"initiateAccountDeleteTitle": "الرجاء المصادقة لبدء حذف الحساب",
|
"initiateAccountDeleteTitle": "الرجاء المصادقة لبدء حذف الحساب",
|
||||||
"sendEmail": "إرسال بريد إلكتروني",
|
"sendEmail": "ارسل بريد الكتروني",
|
||||||
"createNewAccount": "إنشاء حساب جديد",
|
"createNewAccount": "إنشاء حساب جديد",
|
||||||
"weakStrength": "ضعيف",
|
"weakStrength": "ضعيف",
|
||||||
"strongStrength": "قوي",
|
"strongStrength": "قوي",
|
||||||
@@ -192,9 +184,9 @@
|
|||||||
"language": "اللغة",
|
"language": "اللغة",
|
||||||
"social": "وسائل التواصل",
|
"social": "وسائل التواصل",
|
||||||
"security": "الأمان",
|
"security": "الأمان",
|
||||||
"lockscreen": "شاشة القُفْل",
|
"lockscreen": "شاشة القفل",
|
||||||
"authToChangeLockscreenSetting": "الرجاء المصادقة لتغيير إعدادات شاشة القُفْل",
|
"authToChangeLockscreenSetting": "الرجاء المصادقة لتغيير إعدادات شاشة القفل",
|
||||||
"deviceLockEnablePreSteps": "لتفعيل قُفْل الجهاز، اضبط رمز مرور أو قُفْل الشاشة من الإعدادات",
|
"deviceLockEnablePreSteps": "لتمكين قفل التطبيق، فضلا أعد شيفرة مرور للجهاز أو قفل الشاشة في إعدادات نظامك.",
|
||||||
"viewActiveSessions": "عرض الجلسات النشطة",
|
"viewActiveSessions": "عرض الجلسات النشطة",
|
||||||
"authToViewYourActiveSessions": "الرجاء المصادقة لعرض جلساتك النشطة",
|
"authToViewYourActiveSessions": "الرجاء المصادقة لعرض جلساتك النشطة",
|
||||||
"searchHint": "بحث...",
|
"searchHint": "بحث...",
|
||||||
@@ -207,7 +199,6 @@
|
|||||||
"edit": "تعديل",
|
"edit": "تعديل",
|
||||||
"share": "مشاركة",
|
"share": "مشاركة",
|
||||||
"shareCodes": "شارك الرموز",
|
"shareCodes": "شارك الرموز",
|
||||||
"shareCodesDuration": "حدد المدة التي تريد أن تشارك فيها ألاكوا د.",
|
|
||||||
"restore": "استعادة",
|
"restore": "استعادة",
|
||||||
"copiedToClipboard": "تم النسخ إلى الحافظة",
|
"copiedToClipboard": "تم النسخ إلى الحافظة",
|
||||||
"copiedNextToClipboard": "تم نسخ الرموز التالية إلى الحافظة",
|
"copiedNextToClipboard": "تم نسخ الرموز التالية إلى الحافظة",
|
||||||
@@ -335,7 +326,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"manualSort": "مخصّص",
|
"manualSort": "مخصّص",
|
||||||
"editOrder": "تعديل الطلب",
|
|
||||||
"mostFrequentlyUsed": "مستخدم بكثرة",
|
"mostFrequentlyUsed": "مستخدم بكثرة",
|
||||||
"mostRecentlyUsed": "مستخدمة مؤخراً",
|
"mostRecentlyUsed": "مستخدمة مؤخراً",
|
||||||
"activeSessions": "الجلسات النشطة",
|
"activeSessions": "الجلسات النشطة",
|
||||||
@@ -457,9 +447,6 @@
|
|||||||
"customEndpoint": "متصل بـ{endpoint}",
|
"customEndpoint": "متصل بـ{endpoint}",
|
||||||
"pinText": "ثبت",
|
"pinText": "ثبت",
|
||||||
"unpinText": "ألغِ التثبيت",
|
"unpinText": "ألغِ التثبيت",
|
||||||
"pinnedCodeMessage": "ثُبِّت {code}",
|
|
||||||
"unpinnedCodeMessage": "أُلغِي تثبيت {code}",
|
|
||||||
"pinned": "ثُبِّت",
|
|
||||||
"tags": "الأوسمة",
|
"tags": "الأوسمة",
|
||||||
"createNewTag": "أنشيء وسم جديد",
|
"createNewTag": "أنشيء وسم جديد",
|
||||||
"tag": "وسم",
|
"tag": "وسم",
|
||||||
@@ -472,9 +459,9 @@
|
|||||||
"viewRawCodes": "عرض الشيفرات الأصلية",
|
"viewRawCodes": "عرض الشيفرات الأصلية",
|
||||||
"rawCodes": "الشيفرات الأصلية",
|
"rawCodes": "الشيفرات الأصلية",
|
||||||
"rawCodeData": "بيانات الشيفرات الأصلية",
|
"rawCodeData": "بيانات الشيفرات الأصلية",
|
||||||
"appLock": "قُفْل التطبيق",
|
"appLock": "قفل التطبيق",
|
||||||
"noSystemLockFound": "لا يوجد قفل نظام",
|
"noSystemLockFound": "لا يوجد قفل نظام",
|
||||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "لتفعيل قُفْل التطبيق، اضبط رمز مرور الجهاز أو قُفْل الشاشة من الإعدادات.",
|
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "لتمكين قفل التطبيق، فضلا أعد شيفرة مرور الجهاز أو قفل الشاشة في إعدادات نظامك.",
|
||||||
"autoLock": "قفل تلقائي",
|
"autoLock": "قفل تلقائي",
|
||||||
"immediately": "فورًا",
|
"immediately": "فورًا",
|
||||||
"reEnterPassword": "أعد إدخال كلمة المرور",
|
"reEnterPassword": "أعد إدخال كلمة المرور",
|
||||||
@@ -488,30 +475,14 @@
|
|||||||
"hideContentDescriptionAndroid": "يخفي محتوى التطبيق في مبدل التطبيقات ويمنع لقطات الشاشة",
|
"hideContentDescriptionAndroid": "يخفي محتوى التطبيق في مبدل التطبيقات ويمنع لقطات الشاشة",
|
||||||
"hideContentDescriptioniOS": "يخفي محتوى التطبيق في مبدل التطبيقات",
|
"hideContentDescriptioniOS": "يخفي محتوى التطبيق في مبدل التطبيقات",
|
||||||
"autoLockFeatureDescription": "الوقت الذي بعده ينقفل التطبيق بعدما يوضع في الخلفية",
|
"autoLockFeatureDescription": "الوقت الذي بعده ينقفل التطبيق بعدما يوضع في الخلفية",
|
||||||
"appLockDescription": "اختر نوع قُفْل الشاشة: افتراضي أو مخصص.",
|
"appLockDescription": "اختر بين شاشة القفل الافتراضية الخاصة بجهازك وشاشة قفل مخصصة برقم تعريف شخصي أو كلمة مرور.",
|
||||||
"pinLock": "قفل رقم التعريف الشخصي",
|
"pinLock": "قفل رقم التعريف الشخصي",
|
||||||
"enterPin": "أدخل رقم التعريف الشخصي",
|
"enterPin": "أدخل رقم التعريف الشخصي",
|
||||||
"setNewPin": "عين رقم تعريف شخصي جديد",
|
"setNewPin": "عين رقم تعريف شخصي جديد",
|
||||||
"importFailureDescNew": "تعذر إعراب الملف المنتقى.",
|
"importFailureDescNew": "تعذر إعراب الملف المنتقى.",
|
||||||
"appLockNotEnabled": "قُفْل التطبيق غير مفعل ",
|
|
||||||
"appLockNotEnabledDescription": "لحماية بياناتك، فعِّل قُفْل التطبيق من إعدادات الأمان ← قُفْل التطبيق",
|
|
||||||
"authToViewPasskey": "الرجاء المصادقة لعرض مفتاح الاسترداد الخاص بك",
|
|
||||||
"appLockOfflineModeWarning": "لقد اخترتَ المُتابعة دون نُسخ احتياطية. إذا نَسيتَ قُفْل التطبيق، فلن تتمكن من الوصول إلى بياناتك.",
|
|
||||||
"duplicateCodes": "رموز مكررة",
|
"duplicateCodes": "رموز مكررة",
|
||||||
"noDuplicates": "✨ لا تكرارات",
|
"noDuplicates": "✨ لا تكرارات",
|
||||||
"youveNoDuplicateCodesThatCanBeCleared": "لا توجد لديك أي أكواد مكررة يمكن حذفها",
|
|
||||||
"deduplicateCodes": "أكواد مكررة",
|
|
||||||
"deselectAll": "ألغِ تحديد الكل",
|
"deselectAll": "ألغِ تحديد الكل",
|
||||||
"selectAll": "حدد الكل",
|
"selectAll": "حدد الكل",
|
||||||
"deleteDuplicates": "احذف التكرار",
|
"deleteDuplicates": "احذف التكرار"
|
||||||
"plainHTML": "HTML عَادِي ",
|
|
||||||
"tellUsWhatYouThink": "شاركنا برأيك",
|
|
||||||
"dropReviewiOS": "اترك مراجعة على أبل ستور",
|
|
||||||
"dropReviewAndroid": "اترك مراجعة بلاي ستور",
|
|
||||||
"supportEnte": "دعم <bold-green>ente</bold-green></bold-green>",
|
|
||||||
"giveUsAStarOnGithub": "من فضلك أعطِنا نجمة على جيت هاب",
|
|
||||||
"free5GB": "5GB مجانًا على <bold-green>ente</bold-green> صور",
|
|
||||||
"loginWithAuthAccount": "سجّل الدخول باستخدام حساب المُصادقة",
|
|
||||||
"freeStorageOffer": "خَصْم 10٪ على صور <bold-green>ente</bold-green>",
|
|
||||||
"freeStorageOfferDescription": "استخدم الكود \"AUTH\" وأحصل على 10٪ خَصْم في السنة الأولى"
|
|
||||||
}
|
}
|
||||||
@@ -54,26 +54,10 @@
|
|||||||
"viewLogsAction": "Паглядзець журнал",
|
"viewLogsAction": "Паглядзець журнал",
|
||||||
"preparingLogsTitle": "Падрыхтоўка журнала...",
|
"preparingLogsTitle": "Падрыхтоўка журнала...",
|
||||||
"emailLogsTitle": "Адправіць журнал па электроннай пошце",
|
"emailLogsTitle": "Адправіць журнал па электроннай пошце",
|
||||||
"exportLogsAction": "Экспартаваць журнал",
|
|
||||||
"reportABug": "Паведаміць пра памылку",
|
|
||||||
"reportBug": "Паведаміць пра памылку",
|
|
||||||
"contactSupport": "Звярнуцца ў службу падтрымкі",
|
|
||||||
"blog": "Блог",
|
"blog": "Блог",
|
||||||
"verifyPassword": "Праверыць пароль",
|
|
||||||
"pleaseWait": "Пачакайце...",
|
|
||||||
"generatingEncryptionKeysTitle": "Генерацыя ключоў шыфравання...",
|
|
||||||
"recreatePassword": "Стварыць пароль паўторна",
|
|
||||||
"useRecoveryKey": "Выкарыстоўваць ключ аднаўлення",
|
|
||||||
"incorrectPasswordTitle": "Няправільны пароль",
|
|
||||||
"welcomeBack": "З вяртаннем!",
|
|
||||||
"changePassword": "Змяніць пароль",
|
"changePassword": "Змяніць пароль",
|
||||||
"data": "Даныя",
|
"data": "Даныя",
|
||||||
"importCodes": "Імпартаваць коды",
|
|
||||||
"passwordEmptyError": "Пароль не можа быць пустым",
|
|
||||||
"importFromApp": "Імпартаваць коды з {appName}",
|
|
||||||
"exportCodes": "Экспартаваць коды",
|
|
||||||
"importLabel": "Імпарт",
|
"importLabel": "Імпарт",
|
||||||
"selectFile": "Выбраць файл",
|
|
||||||
"yes": "Так",
|
"yes": "Так",
|
||||||
"no": "Не",
|
"no": "Не",
|
||||||
"email": "Электронная пошта",
|
"email": "Электронная пошта",
|
||||||
|
|||||||
@@ -499,16 +499,11 @@
|
|||||||
"appLockOfflineModeWarning": "Избрахте да продължите без резервни копия. Ако забравите паролата на приложението си, ще бъдете заключени от достъп до вашите данни.",
|
"appLockOfflineModeWarning": "Избрахте да продължите без резервни копия. Ако забравите паролата на приложението си, ще бъдете заключени от достъп до вашите данни.",
|
||||||
"duplicateCodes": "Повтарящи се кодове",
|
"duplicateCodes": "Повтарящи се кодове",
|
||||||
"noDuplicates": "✨ Няма дубликати",
|
"noDuplicates": "✨ Няма дубликати",
|
||||||
"youveNoDuplicateCodesThatCanBeCleared": "Нямате повтарящи се кодове, които могат да бъдат изчистени",
|
|
||||||
"deduplicateCodes": "Премахване на повтарящи се кодове",
|
"deduplicateCodes": "Премахване на повтарящи се кодове",
|
||||||
"deselectAll": "Демаркиране на всички",
|
"deselectAll": "Демаркиране на всички",
|
||||||
"selectAll": "Избиране на всички",
|
"selectAll": "Избиране на всички",
|
||||||
"deleteDuplicates": "Изтриване на дубликатите",
|
"deleteDuplicates": "Изтриване на дубликатите",
|
||||||
"plainHTML": "Обикновен HTML",
|
"plainHTML": "Обикновен HTML",
|
||||||
"tellUsWhatYouThink": "Кажете ни какво мислите",
|
"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% отстъпка през първата година"
|
"freeStorageOfferDescription": "Използвайте промокод „AUTH“, за да получите 10% отстъпка през първата година"
|
||||||
}
|
}
|
||||||
@@ -505,6 +505,7 @@
|
|||||||
"deleteDuplicates": "Elimina duplicats",
|
"deleteDuplicates": "Elimina duplicats",
|
||||||
"plainHTML": "HTML pla",
|
"plainHTML": "HTML pla",
|
||||||
"tellUsWhatYouThink": "Digueu-nos què us sembla",
|
"tellUsWhatYouThink": "Digueu-nos què us sembla",
|
||||||
|
"dropReview": "Deixa una ressenya a l'App/Play Store",
|
||||||
"supportEnte": "Donar suport a <bold-green>ente</bold-green>",
|
"supportEnte": "Donar suport a <bold-green>ente</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Dona'ns una estrella a Github",
|
"giveUsAStarOnGithub": "Dona'ns una estrella a Github",
|
||||||
"free5GB": "5 GB gratuïts a <bold-green>ente</bold-green> Photos",
|
"free5GB": "5 GB gratuïts a <bold-green>ente</bold-green> Photos",
|
||||||
|
|||||||
@@ -147,7 +147,6 @@
|
|||||||
"leaveFamily": "Familie verlassen",
|
"leaveFamily": "Familie verlassen",
|
||||||
"leaveFamilyMessage": "Sind Sie sicher, dass Sie den Familien-Plan verlassen wollen?",
|
"leaveFamilyMessage": "Sind Sie sicher, dass Sie den Familien-Plan verlassen wollen?",
|
||||||
"inFamilyPlanMessage": "Sie haben einen Familien-Plan!",
|
"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.",
|
"hintForDesktop": "Klicken Sie mit der rechten Maustaste auf einen Code zum Bearbeiten oder Entfernen.",
|
||||||
"scan": "Scannen",
|
"scan": "Scannen",
|
||||||
"scanACode": "Scan einen Code",
|
"scanACode": "Scan einen Code",
|
||||||
@@ -457,8 +456,6 @@
|
|||||||
"customEndpoint": "Mit {endpoint} verbunden",
|
"customEndpoint": "Mit {endpoint} verbunden",
|
||||||
"pinText": "Anpinnen",
|
"pinText": "Anpinnen",
|
||||||
"unpinText": "Lösen",
|
"unpinText": "Lösen",
|
||||||
"pinnedCodeMessage": "{code} wurde angepinnt",
|
|
||||||
"unpinnedCodeMessage": "{code} wird nicht weiter angepinnt",
|
|
||||||
"pinned": "Angeheftet",
|
"pinned": "Angeheftet",
|
||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"createNewTag": "Neuen Tag erstellen",
|
"createNewTag": "Neuen Tag erstellen",
|
||||||
@@ -498,18 +495,12 @@
|
|||||||
"authToViewPasskey": "Bitte authentifizieren, um deinen Passkey zu sehen",
|
"authToViewPasskey": "Bitte authentifizieren, um deinen Passkey zu sehen",
|
||||||
"duplicateCodes": "Doppelte Codes",
|
"duplicateCodes": "Doppelte Codes",
|
||||||
"noDuplicates": "✨ Keine Duplikate",
|
"noDuplicates": "✨ Keine Duplikate",
|
||||||
"youveNoDuplicateCodesThatCanBeCleared": "Du hast keine doppelten Codes, die bereinigt werden können",
|
|
||||||
"deselectAll": "Alle abwählen",
|
"deselectAll": "Alle abwählen",
|
||||||
"selectAll": "Alles auswählen",
|
"selectAll": "Alles auswählen",
|
||||||
"deleteDuplicates": "Duplikate löschen",
|
"deleteDuplicates": "Duplikate löschen",
|
||||||
"plainHTML": "Reines HTML",
|
"plainHTML": "Reines HTML",
|
||||||
"tellUsWhatYouThink": "Sagen Sie uns, was Sie denken",
|
"tellUsWhatYouThink": "Sagen Sie uns, was Sie denken",
|
||||||
"dropReviewiOS": "Hinterlasse eine Rezension im App Store",
|
"dropReview": "Eine Bewertung im App/Play Store ablegen",
|
||||||
"dropReviewAndroid": "Hinterlasse eine Rezension im Google Play Store",
|
|
||||||
"supportEnte": "Support <bold-green>ente</bold-green>",
|
|
||||||
"giveUsAStarOnGithub": "Gib uns einen Stern auf Github",
|
"giveUsAStarOnGithub": "Gib uns einen Stern auf Github",
|
||||||
"free5GB": "5GB kostenlos auf <bold-green>ente</bold-green> Photos",
|
"loginWithAuthAccount": "Mit Ihrem Auth Account anmelden"
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
@@ -506,8 +506,7 @@
|
|||||||
"deleteDuplicates": "Delete duplicates",
|
"deleteDuplicates": "Delete duplicates",
|
||||||
"plainHTML": "Plain HTML",
|
"plainHTML": "Plain HTML",
|
||||||
"tellUsWhatYouThink": "Tell us what you think",
|
"tellUsWhatYouThink": "Tell us what you think",
|
||||||
"dropReviewiOS": "Drop a review on the App Store",
|
"dropReview": "Drop a review on the App/Play Store",
|
||||||
"dropReviewAndroid": "Drop a review on the Play Store",
|
|
||||||
"supportEnte": "Support <bold-green>ente</bold-green>",
|
"supportEnte": "Support <bold-green>ente</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Give us a star on Github",
|
"giveUsAStarOnGithub": "Give us a star on Github",
|
||||||
"free5GB": "5GB free on <bold-green>ente</bold-green> Photos",
|
"free5GB": "5GB free on <bold-green>ente</bold-green> Photos",
|
||||||
|
|||||||
@@ -506,8 +506,7 @@
|
|||||||
"deleteDuplicates": "Eliminar duplicados",
|
"deleteDuplicates": "Eliminar duplicados",
|
||||||
"plainHTML": "HTML plano",
|
"plainHTML": "HTML plano",
|
||||||
"tellUsWhatYouThink": "Cuéntanos cuál es su opinión",
|
"tellUsWhatYouThink": "Cuéntanos cuál es su opinión",
|
||||||
"dropReviewiOS": "Deja una reseña en la App Store",
|
"dropReview": "Danos una reseña en la App/Play Store",
|
||||||
"dropReviewAndroid": "Deja una reseña en la Play Store",
|
|
||||||
"supportEnte": "Apoya a <bold-green>ente</bold-green>",
|
"supportEnte": "Apoya a <bold-green>ente</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Danos una estrella en GitHub",
|
"giveUsAStarOnGithub": "Danos una estrella en GitHub",
|
||||||
"free5GB": "5 GB gratis en <bold-green>ente</bold-green> Fotos",
|
"free5GB": "5 GB gratis en <bold-green>ente</bold-green> Fotos",
|
||||||
|
|||||||
@@ -499,15 +499,13 @@
|
|||||||
"appLockOfflineModeWarning": "Vous avez choisi de fonctionner sans sauvegardes. Si vous oubliez votre outil Applock, vous serez bloqué dans l'accès à vos données.",
|
"appLockOfflineModeWarning": "Vous avez choisi de fonctionner sans sauvegardes. Si vous oubliez votre outil Applock, vous serez bloqué dans l'accès à vos données.",
|
||||||
"duplicateCodes": "Codes dupliqués",
|
"duplicateCodes": "Codes dupliqués",
|
||||||
"noDuplicates": "✨ Pas de doublons",
|
"noDuplicates": "✨ Pas de doublons",
|
||||||
"youveNoDuplicateCodesThatCanBeCleared": "Vous n'avez aucun code en doublon pouvant être supprimé",
|
|
||||||
"deduplicateCodes": "Codes dédupliqués",
|
"deduplicateCodes": "Codes dédupliqués",
|
||||||
"deselectAll": "Tout désélectionner",
|
"deselectAll": "Tout désélectionner",
|
||||||
"selectAll": "Tout sélectionner",
|
"selectAll": "Tout sélectionner",
|
||||||
"deleteDuplicates": "Supprimer les doublons",
|
"deleteDuplicates": "Supprimer les doublons",
|
||||||
"plainHTML": "HTML Pur",
|
"plainHTML": "HTML Pur",
|
||||||
"tellUsWhatYouThink": "Dites-nous ce que vous pensez",
|
"tellUsWhatYouThink": "Dites-nous ce que vous pensez",
|
||||||
"dropReviewiOS": "Laisser un avis sur l'App Store",
|
"dropReview": "Déposez un avis sur l'App/Play Store",
|
||||||
"dropReviewAndroid": "Laisser un avis sur le Play Store",
|
|
||||||
"supportEnte": "Soutenir <bold-green>Ente</bold-green>",
|
"supportEnte": "Soutenir <bold-green>Ente</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Donnez-nous une étoile sur Github",
|
"giveUsAStarOnGithub": "Donnez-nous une étoile sur Github",
|
||||||
"free5GB": "5 Go gratuits sur <bold-green>Ente</bold-green> Photos",
|
"free5GB": "5 Go gratuits sur <bold-green>Ente</bold-green> Photos",
|
||||||
|
|||||||
@@ -505,6 +505,7 @@
|
|||||||
"deleteDuplicates": "Ismétlődések törlése",
|
"deleteDuplicates": "Ismétlődések törlése",
|
||||||
"plainHTML": "Sima HTML kód",
|
"plainHTML": "Sima HTML kód",
|
||||||
"tellUsWhatYouThink": "Mondja el mit gondol",
|
"tellUsWhatYouThink": "Mondja el mit gondol",
|
||||||
|
"dropReview": "Írjon véleményt az App/Play Store-ban",
|
||||||
"supportEnte": "Támogassa <bold-green>ente <bold-green>",
|
"supportEnte": "Támogassa <bold-green>ente <bold-green>",
|
||||||
"giveUsAStarOnGithub": "Adj nekünk egy csillagot a Githubon",
|
"giveUsAStarOnGithub": "Adj nekünk egy csillagot a Githubon",
|
||||||
"free5GB": "5GB ingyen <bold-green>ente <bold-green> Photos",
|
"free5GB": "5GB ingyen <bold-green>ente <bold-green> Photos",
|
||||||
|
|||||||
@@ -504,14 +504,5 @@
|
|||||||
"deselectAll": "Deselezionare tutti",
|
"deselectAll": "Deselezionare tutti",
|
||||||
"selectAll": "Seleziona tutti",
|
"selectAll": "Seleziona tutti",
|
||||||
"deleteDuplicates": "Elimina i duplicati",
|
"deleteDuplicates": "Elimina i duplicati",
|
||||||
"plainHTML": "HTML semplice",
|
"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"
|
|
||||||
}
|
}
|
||||||
@@ -506,6 +506,7 @@
|
|||||||
"deleteDuplicates": "重複を削除",
|
"deleteDuplicates": "重複を削除",
|
||||||
"plainHTML": "Plain HTML",
|
"plainHTML": "Plain HTML",
|
||||||
"tellUsWhatYouThink": "ご意見をお聞かせください",
|
"tellUsWhatYouThink": "ご意見をお聞かせください",
|
||||||
|
"dropReview": "App/Playストアにレビューを投稿する",
|
||||||
"supportEnte": "<bold-green>ente</bold-green>をサポートする",
|
"supportEnte": "<bold-green>ente</bold-green>をサポートする",
|
||||||
"giveUsAStarOnGithub": "Githubで星をつける",
|
"giveUsAStarOnGithub": "Githubで星をつける",
|
||||||
"free5GB": "<bold-green>ente</bold-green>フォトで5GB無料",
|
"free5GB": "<bold-green>ente</bold-green>フォトで5GB無料",
|
||||||
|
|||||||
@@ -506,8 +506,6 @@
|
|||||||
"deleteDuplicates": "Ištrinti dublikatus",
|
"deleteDuplicates": "Ištrinti dublikatus",
|
||||||
"plainHTML": "Grynasis HTML",
|
"plainHTML": "Grynasis HTML",
|
||||||
"tellUsWhatYouThink": "Pasakykite mums, ką manote",
|
"tellUsWhatYouThink": "Pasakykite mums, ką manote",
|
||||||
"dropReviewiOS": "Rašyti apžvalgą parduotuvėje „App Store“",
|
|
||||||
"dropReviewAndroid": "Rašyti apžvalgą parduotuvėje „Play“ parduotuvė“",
|
|
||||||
"giveUsAStarOnGithub": "Suteikite mums žvaigždutę platformoje „Github“",
|
"giveUsAStarOnGithub": "Suteikite mums žvaigždutę platformoje „Github“",
|
||||||
"free5GB": "5 GB nemokami programai „<bold-green>ente</bold-green>“ nuotraukos",
|
"free5GB": "5 GB nemokami programai „<bold-green>ente</bold-green>“ nuotraukos",
|
||||||
"loginWithAuthAccount": "Prisijungti su jūsų „Auth“ paskyra",
|
"loginWithAuthAccount": "Prisijungti su jūsų „Auth“ paskyra",
|
||||||
|
|||||||
@@ -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,15 +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.",
|
"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",
|
"duplicateCodes": "Dubbele codes",
|
||||||
"noDuplicates": "✨ Geen dubbele",
|
"noDuplicates": "✨ Geen dubbele",
|
||||||
"youveNoDuplicateCodesThatCanBeCleared": "Je hebt geen dubbele codes die kunnen worden gewist",
|
|
||||||
"deduplicateCodes": "Dubbele codes",
|
"deduplicateCodes": "Dubbele codes",
|
||||||
"deselectAll": "Alles deselecteren",
|
"deselectAll": "Alles deselecteren",
|
||||||
"selectAll": "Alles selecteren",
|
"selectAll": "Alles selecteren",
|
||||||
"deleteDuplicates": "Dubbelen verwijderen",
|
"deleteDuplicates": "Dubbelen verwijderen",
|
||||||
"plainHTML": "Alleen HTML",
|
"plainHTML": "Alleen HTML",
|
||||||
"tellUsWhatYouThink": "Vertel ons wat je vindt",
|
"tellUsWhatYouThink": "Vertel ons wat je vindt",
|
||||||
"dropReviewiOS": "Laat een beoordeling achter in de App Store",
|
"dropReview": "Laat een beoordeling achter in de App/Play Store",
|
||||||
"dropReviewAndroid": "Laat een beoordeling achter in de Play Store",
|
|
||||||
"supportEnte": "Steun <bold-green>ente</bold-green>",
|
"supportEnte": "Steun <bold-green>ente</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Geef ons een ster op Github",
|
"giveUsAStarOnGithub": "Geef ons een ster op Github",
|
||||||
"free5GB": "5GB gratis op <bold-green>ente</bold-green> Photos",
|
"free5GB": "5GB gratis op <bold-green>ente</bold-green> Photos",
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
{}
|
|
||||||
@@ -506,8 +506,7 @@
|
|||||||
"deleteDuplicates": "Usuń duplikaty",
|
"deleteDuplicates": "Usuń duplikaty",
|
||||||
"plainHTML": "Zwykły HTML",
|
"plainHTML": "Zwykły HTML",
|
||||||
"tellUsWhatYouThink": "Wyraź swoją opinię",
|
"tellUsWhatYouThink": "Wyraź swoją opinię",
|
||||||
"dropReviewiOS": "Napisz recenzję w App Store",
|
"dropReview": "Napisz recenzję w App Store/Play Store",
|
||||||
"dropReviewAndroid": "Napisz recenzję w Play Store",
|
|
||||||
"supportEnte": "Wesprzyj <bold-green>ente</bold-green>",
|
"supportEnte": "Wesprzyj <bold-green>ente</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Daj nam gwiazdkę na Githubie",
|
"giveUsAStarOnGithub": "Daj nam gwiazdkę na Githubie",
|
||||||
"free5GB": "5 GB za darmo na zdjęcia <bold-green>ente</bold-green>",
|
"free5GB": "5 GB za darmo na zdjęcia <bold-green>ente</bold-green>",
|
||||||
|
|||||||
@@ -506,8 +506,7 @@
|
|||||||
"deleteDuplicates": "Excluir duplicados",
|
"deleteDuplicates": "Excluir duplicados",
|
||||||
"plainHTML": "HTML simples",
|
"plainHTML": "HTML simples",
|
||||||
"tellUsWhatYouThink": "Diga-nos o que pensa",
|
"tellUsWhatYouThink": "Diga-nos o que pensa",
|
||||||
"dropReviewiOS": "Deixe uma avaliação na App Store",
|
"dropReview": "Deixe uma avaliação na App/Play Store",
|
||||||
"dropReviewAndroid": "Deixe uma avaliação na Play Store",
|
|
||||||
"supportEnte": "Apoie o <bold-green>ente.io</bold-green>",
|
"supportEnte": "Apoie o <bold-green>ente.io</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Dê-nos uma estrela no Github",
|
"giveUsAStarOnGithub": "Dê-nos uma estrela no Github",
|
||||||
"free5GB": "5GB grátis no <bold-green>ente</bold-green> Photos",
|
"free5GB": "5GB grátis no <bold-green>ente</bold-green> Photos",
|
||||||
|
|||||||
@@ -83,22 +83,22 @@
|
|||||||
"verifyPassword": "Подтверждение пароля",
|
"verifyPassword": "Подтверждение пароля",
|
||||||
"pleaseWait": "Пожалуйста, подождите...",
|
"pleaseWait": "Пожалуйста, подождите...",
|
||||||
"generatingEncryptionKeysTitle": "Генерируем ключи шифрования...",
|
"generatingEncryptionKeysTitle": "Генерируем ключи шифрования...",
|
||||||
"recreatePassword": "Повторное создание пароля",
|
"recreatePassword": "Воссоздать пароль заново",
|
||||||
"recreatePasswordMessage": "Текущее устройство недостаточно мощное для проверки пароля, поэтому нам нужно регенерировать его один раз таким образом, чтобы работать со всеми устройствами. \n\nПожалуйста, войдите, используя ваш ключ восстановления и сгенерируйте ваш пароль (вы можете использовать тот же самый, если пожелаете).",
|
"recreatePasswordMessage": "Текущее устройство недостаточно мощное для проверки пароля, поэтому нам нужно регенерировать его один раз таким образом, чтобы работать со всеми устройствами. \n\nПожалуйста, войдите, используя ваш ключ восстановления и сгенерируйте ваш пароль (вы можете использовать тот же самый, если пожелаете).",
|
||||||
"useRecoveryKey": "Использовать ключ восстановления",
|
"useRecoveryKey": "Использовать ключ восстановления",
|
||||||
"incorrectPasswordTitle": "Неправильный пароль",
|
"incorrectPasswordTitle": "Неправильный пароль",
|
||||||
"welcomeBack": "С возвращением!",
|
"welcomeBack": "С возвращением!",
|
||||||
"emailAlreadyRegistered": "Адрес электронной почты уже зарегистрирован.",
|
"emailAlreadyRegistered": "Адрес электронной почты уже зарегистрирован.",
|
||||||
"emailNotRegistered": "Адрес электронной почты не зарегистрирован.",
|
"emailNotRegistered": "Адрес электронной почты не зарегистрирован.",
|
||||||
"madeWithLoveAtPrefix": "сделано с ❤️ в ",
|
"madeWithLoveAtPrefix": "сделана с ❤️ в ",
|
||||||
"supportDevs": "Подпишитесь на <bold-green>ente</bold-green> для поддержки нашего проекта",
|
"supportDevs": "Подпишитесь на <bold-green>ente</bold-green> для поддержки нашего проекта",
|
||||||
"supportDiscount": "Используйте кодовое слово \"AUTH\", чтобы получить скидку 10% на первый год",
|
"supportDiscount": "Используйте код скидки \"AUTH\", чтобы получить скидку 10% на первый год",
|
||||||
"changeEmail": "Изменить адрес электронной почты",
|
"changeEmail": "Изменить почту",
|
||||||
"changePassword": "Изменить пароль",
|
"changePassword": "Изменить пароль",
|
||||||
"data": "Данные",
|
"data": "Данные",
|
||||||
"importCodes": "Импортировать коды",
|
"importCodes": "Импортировать коды",
|
||||||
"importTypePlainText": "Обычный текст",
|
"importTypePlainText": "Обычный текст",
|
||||||
"importTypeEnteEncrypted": "Зашифрованный экспорт из Ente",
|
"importTypeEnteEncrypted": "Ente Зашифрованный экспорт",
|
||||||
"passwordForDecryptingExport": "Пароль для расшифровки экспорта",
|
"passwordForDecryptingExport": "Пароль для расшифровки экспорта",
|
||||||
"passwordEmptyError": "Пароль не может быть пустым",
|
"passwordEmptyError": "Пароль не может быть пустым",
|
||||||
"importFromApp": "Импорт кодов из {appName}",
|
"importFromApp": "Импорт кодов из {appName}",
|
||||||
@@ -106,27 +106,27 @@
|
|||||||
"importSelectJsonFile": "Выбрать JSON-файл",
|
"importSelectJsonFile": "Выбрать JSON-файл",
|
||||||
"importSelectAppExport": "Выбрать файл экспорта {appName}",
|
"importSelectAppExport": "Выбрать файл экспорта {appName}",
|
||||||
"importEnteEncGuide": "Выберите зашифрованный JSON файл, экспортированный из Ente",
|
"importEnteEncGuide": "Выберите зашифрованный JSON файл, экспортированный из Ente",
|
||||||
"importRaivoGuide": "Используйте опцию «Экспорт OTP-кодов в Zip-архив» в настройках Raivo.\n\nРаспакуйте zip-архив и импортируйте JSON-файл.",
|
"importRaivoGuide": "Используйте опцию «Export OTPs to Zip archive» в настройках Raivo.\n\nРаспакуйте zip-архив и импортируйте JSON-файл.",
|
||||||
"importBitwardenGuide": "Используйте опцию \"Экспортировать хранилище\" в Bitwarden и импортируйте незашифрованный JSON-файл.",
|
"importBitwardenGuide": "Используйте опцию \"Экспортировать хранилище\" в Bitwarden Tools и импортируйте незашифрованный JSON файл.",
|
||||||
"importAegisGuide": "Используйте опцию «Экспортировать хранилище» в настройках Aegis.\n\nЕсли ваше хранилище зашифровано, то для его расшифровки потребуется ввести пароль хранилища.",
|
"importAegisGuide": "Используйте опцию «Экспортировать хранилище» в настройках Aegis.\n\nЕсли ваше хранилище зашифровано, то для его расшифровки потребуется ввести пароль хранилища.",
|
||||||
"import2FasGuide": "Используйте опцию \"Настройки->Резервное копирование -Экспорт\" в 2FAS.\n\nЕсли ваша резервная копия зашифрована, то для расшифровки резервной копии необходимо ввести пароль",
|
"import2FasGuide": "Используйте опцию \"Settings->Backup -Export\" в 2FAS.\n\nЕсли ваша резервная копия зашифрована, то для расшифровки резервной копии необходимо ввести пароль",
|
||||||
"importLastpassGuide": "Используйте опцию \"Перенести аккаунты\" в настройках Lastpass Authenticator и нажмите на \"Экспортировать учетные записи в файл\". Импортируйте загружённый JSON-файл.",
|
"importLastpassGuide": "Используйте опцию \"Перенести аккаунты\" в настройках Lastpass Authenticator и нажмите на \"Экспортировать учетные записи в файл\". Импортируйте загружённый JSON файл.",
|
||||||
"exportCodes": "Экспортировать коды",
|
"exportCodes": "Экспортировать коды",
|
||||||
"importLabel": "Импорт",
|
"importLabel": "Импорт",
|
||||||
"importInstruction": "Пожалуйста, выберите файл, содержащий список ваших кодов в следующем формате",
|
"importInstruction": "Пожалуйста, выберите файл, содержащий список ваших кодов в следующем формате",
|
||||||
"importCodeDelimiterInfo": "Коды могут быть разделены запятой или новой строкой",
|
"importCodeDelimiterInfo": "Коды могут быть разделены запятой или новой строкой",
|
||||||
"selectFile": "Выбрать файл",
|
"selectFile": "Выбрать файл",
|
||||||
"emailVerificationToggle": "Подтверждение адреса электронной почты",
|
"emailVerificationToggle": "Подтверждение электронной почты",
|
||||||
"emailVerificationEnableWarning": "Чтобы избежать блокировки вашей учетной записи, обязательно сохраните копию вашего электронного письма 2FA за пределами Ente Auth, прежде чем активировать проверку электронной почты.",
|
"emailVerificationEnableWarning": "Если вы храните у нас двухфакторную аутентификацию в своей электронной почте, включение проверки электронной почты может привести к тупиковой ситуации. Если у вас заблокирован доступ к одной службе, возможно, вы не сможете войти в другую.",
|
||||||
"authToChangeEmailVerificationSetting": "Авторизуйтесь, чтобы изменить подтверждение электронной почты",
|
"authToChangeEmailVerificationSetting": "Авторизуйтесь, чтобы изменить подтверждение электронной почты",
|
||||||
"authenticateGeneric": "Пожалуйста, авторизуйтесь",
|
"authenticateGeneric": "Пожалуйста, авторизуйтесь",
|
||||||
"authToViewYourRecoveryKey": "Пожалуйста, авторизуйтесь для просмотра вашего ключа восстановления",
|
"authToViewYourRecoveryKey": "Пожалуйста, авторизуйтесь для просмотра вашего ключа восстановления",
|
||||||
"authToChangeYourEmail": "Пожалуйста, авторизуйтесь, чтобы изменить адрес электронной почты",
|
"authToChangeYourEmail": "Пожалуйста, авторизуйтесь, чтобы изменить адрес электронной почты",
|
||||||
"authToChangeYourPassword": "Пожалуйста, авторизуйтесь, чтобы изменить пароль",
|
"authToChangeYourPassword": "Пожалуйста, авторизуйтесь, чтобы изменить пароль",
|
||||||
"authToViewSecrets": "Пожалуйста, авторизуйтесь для просмотра ваших секретов",
|
"authToViewSecrets": "Пожалуйста, авторизуйтесь для просмотра ваших секретов",
|
||||||
"authToInitiateSignIn": "Пожалуйста, авторизуйтесь, чтобы получить доступ к резервному копированию.",
|
"authToInitiateSignIn": "Пожалуйста, авторизуйтесь, чтобы начать вход для резервного копирования.",
|
||||||
"ok": "Ок",
|
"ok": "Ок",
|
||||||
"cancel": "Отмена",
|
"cancel": "Отменить",
|
||||||
"yes": "Да",
|
"yes": "Да",
|
||||||
"no": "Нет",
|
"no": "Нет",
|
||||||
"email": "Электронная почта",
|
"email": "Электронная почта",
|
||||||
@@ -136,31 +136,30 @@
|
|||||||
"copied": "Скопировано",
|
"copied": "Скопировано",
|
||||||
"pleaseTryAgain": "Пожалуйста, попробуйте ещё раз",
|
"pleaseTryAgain": "Пожалуйста, попробуйте ещё раз",
|
||||||
"existingUser": "Существующий пользователь",
|
"existingUser": "Существующий пользователь",
|
||||||
"newUser": "Впервые в Ente",
|
"newUser": "Впервые здесь, в Ente",
|
||||||
"delete": "Удалить",
|
"delete": "Удалить",
|
||||||
"enterYourPasswordHint": "Введите пароль",
|
"enterYourPasswordHint": "Введите пароль",
|
||||||
"forgotPassword": "Забыл пароль",
|
"forgotPassword": "Забыл пароль",
|
||||||
"oops": "Ой",
|
"oops": "Ой",
|
||||||
"suggestFeatures": "Предложить идеи",
|
"suggestFeatures": "Предложить идеи",
|
||||||
"faq": "ЧаВо",
|
"faq": "FAQ",
|
||||||
"somethingWentWrongMessage": "Что-то пошло не так, пожалуйста, попробуйте еще раз",
|
"somethingWentWrongMessage": "Что-то пошло не так. Попробуйте еще раз",
|
||||||
"leaveFamily": "Покинуть семью",
|
"leaveFamily": "Покинуть семью",
|
||||||
"leaveFamilyMessage": "Вы уверены, что хотите отказаться от семейного плана?",
|
"leaveFamilyMessage": "Вы уверены, что хотите отказаться от семейного плана?",
|
||||||
"inFamilyPlanMessage": "Вы на семейном плане!",
|
"inFamilyPlanMessage": "Вы на семейном плане!",
|
||||||
"hintForMobile": "Нажмите на код и удерживайте, чтобы редактировать его или удалить.",
|
"hintForMobile": "Длительное нажмите на код для редактирования или удаления.",
|
||||||
"hintForDesktop": "Щелкните правой кнопкой мыши по коду, чтобы редактировать его или удалить.",
|
"hintForDesktop": "Щелкните правой кнопкой мыши по коду, чтобы изменить или удалить.",
|
||||||
"scan": "Сканировать",
|
"scan": "Сканировать",
|
||||||
"scanACode": "Сканировать QR-код",
|
"scanACode": "Сканировать QR-код",
|
||||||
"verify": "Подтвердить",
|
"verify": "Подтвердить",
|
||||||
"verifyEmail": "Подтвердить адрес электронной почты",
|
"verifyEmail": "Подтвердить электронную почту",
|
||||||
"enterCodeHint": "Введите 6-значный код из\nвашего приложения-аутентификатора",
|
"enterCodeHint": "Введите 6-значный код из\nвашего приложения-аутентификатора",
|
||||||
"lostDeviceTitle": "Потеряно устройство?",
|
"lostDeviceTitle": "Потеряно устройство?",
|
||||||
"twoFactorAuthTitle": "Двухфакторная аутентификация",
|
"twoFactorAuthTitle": "Двухфакторная аутентификация",
|
||||||
"passkeyAuthTitle": "Проверка с помощью ключа доступа",
|
"passkeyAuthTitle": "Проверка с помощью пароля",
|
||||||
"verifyPasskey": "Подтвердить пароль",
|
"verifyPasskey": "Подтвердить пароль",
|
||||||
"loginWithTOTP": "Войти с помощью TOTP",
|
|
||||||
"recoverAccount": "Восстановить аккаунт",
|
"recoverAccount": "Восстановить аккаунт",
|
||||||
"enterRecoveryKeyHint": "Введите ключ восстановления",
|
"enterRecoveryKeyHint": "Введите свой ключ восстановления",
|
||||||
"recover": "Восстановить",
|
"recover": "Восстановить",
|
||||||
"contactSupportViaEmailMessage": "Пожалуйста, отправьте электронное письмо на адрес {email} с вашего зарегистрированного адреса электронной почты",
|
"contactSupportViaEmailMessage": "Пожалуйста, отправьте электронное письмо на адрес {email} с вашего зарегистрированного адреса электронной почты",
|
||||||
"@contactSupportViaEmailMessage": {
|
"@contactSupportViaEmailMessage": {
|
||||||
@@ -172,7 +171,7 @@
|
|||||||
},
|
},
|
||||||
"invalidQRCode": "Неверный QR-код",
|
"invalidQRCode": "Неверный QR-код",
|
||||||
"noRecoveryKeyTitle": "Нет ключа восстановления?",
|
"noRecoveryKeyTitle": "Нет ключа восстановления?",
|
||||||
"enterEmailHint": "Введите адрес электронной почты",
|
"enterEmailHint": "Введите свою почту",
|
||||||
"invalidEmailTitle": "Неверный адрес электронной почты",
|
"invalidEmailTitle": "Неверный адрес электронной почты",
|
||||||
"invalidEmailMessage": "Пожалуйста, введите действительный адрес электронной почты.",
|
"invalidEmailMessage": "Пожалуйста, введите действительный адрес электронной почты.",
|
||||||
"deleteAccount": "Удалить аккаунт",
|
"deleteAccount": "Удалить аккаунт",
|
||||||
@@ -183,7 +182,7 @@
|
|||||||
"sendEmail": "Отправить электронное письмо",
|
"sendEmail": "Отправить электронное письмо",
|
||||||
"createNewAccount": "Создать новый аккаунт",
|
"createNewAccount": "Создать новый аккаунт",
|
||||||
"weakStrength": "Слабый",
|
"weakStrength": "Слабый",
|
||||||
"strongStrength": "Сильный",
|
"strongStrength": "Крепкий",
|
||||||
"moderateStrength": "Средний",
|
"moderateStrength": "Средний",
|
||||||
"confirmPassword": "Подтвердить пароль",
|
"confirmPassword": "Подтвердить пароль",
|
||||||
"close": "Закрыть",
|
"close": "Закрыть",
|
||||||
@@ -334,9 +333,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"manualSort": "Ручная",
|
|
||||||
"editOrder": "Изменить порядок",
|
|
||||||
"mostFrequentlyUsed": "Частота использования",
|
|
||||||
"mostRecentlyUsed": "Недавно использованные",
|
"mostRecentlyUsed": "Недавно использованные",
|
||||||
"activeSessions": "Активные сеансы",
|
"activeSessions": "Активные сеансы",
|
||||||
"somethingWentWrongPleaseTryAgain": "Что-то пошло не так. Попробуйте еще раз",
|
"somethingWentWrongPleaseTryAgain": "Что-то пошло не так. Попробуйте еще раз",
|
||||||
@@ -380,7 +376,7 @@
|
|||||||
"deleteCodeAuthMessage": "Аутентификация для удаления кода",
|
"deleteCodeAuthMessage": "Аутентификация для удаления кода",
|
||||||
"showQRAuthMessage": "Аутентификация для отображения QR-кода",
|
"showQRAuthMessage": "Аутентификация для отображения QR-кода",
|
||||||
"confirmAccountDeleteTitle": "Подтвердить удаление аккаунта",
|
"confirmAccountDeleteTitle": "Подтвердить удаление аккаунта",
|
||||||
"confirmAccountDeleteMessage": "Эта учетная запись связана с другими приложениями Ente, если вы ими пользуетесь.\n\nЗагруженные вами данные во всех приложениях Ente будут запланированы к удалению, а ваша учетная запись будет удалена без возможности восстановления.",
|
"confirmAccountDeleteMessage": "Эта учетная запись связана с другими приложениями Ente, если вы ими пользуетесь.\n\nЗагруженные вами данные во всех приложениях ente будут запланированы к удалению, а ваша учетная запись будет удалена без возможности восстановления.",
|
||||||
"androidBiometricHint": "Подтвердите личность",
|
"androidBiometricHint": "Подтвердите личность",
|
||||||
"@androidBiometricHint": {
|
"@androidBiometricHint": {
|
||||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||||
@@ -440,7 +436,7 @@
|
|||||||
"signOutOtherDevices": "Выйти из других устройств",
|
"signOutOtherDevices": "Выйти из других устройств",
|
||||||
"doNotSignOut": "Не выходить",
|
"doNotSignOut": "Не выходить",
|
||||||
"hearUsWhereTitle": "Как вы узнали о Ente? (необязательно)",
|
"hearUsWhereTitle": "Как вы узнали о Ente? (необязательно)",
|
||||||
"hearUsExplanation": "Мы не отслеживаем установки приложений. Было бы полезно, если бы вы сказали, где нас нашли!",
|
"hearUsExplanation": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения",
|
||||||
"recoveryKeySaved": "Ключ восстановления сохранён в папке Загрузки!",
|
"recoveryKeySaved": "Ключ восстановления сохранён в папке Загрузки!",
|
||||||
"waitingForBrowserRequest": "Ожидание запроса браузера...",
|
"waitingForBrowserRequest": "Ожидание запроса браузера...",
|
||||||
"waitingForVerification": "Ожидание подтверждения...",
|
"waitingForVerification": "Ожидание подтверждения...",
|
||||||
@@ -457,9 +453,6 @@
|
|||||||
"customEndpoint": "Подключено к {endpoint}",
|
"customEndpoint": "Подключено к {endpoint}",
|
||||||
"pinText": "Прикрепить",
|
"pinText": "Прикрепить",
|
||||||
"unpinText": "Открепить",
|
"unpinText": "Открепить",
|
||||||
"pinnedCodeMessage": "{code} был закреплен",
|
|
||||||
"unpinnedCodeMessage": "{code} был откреплен",
|
|
||||||
"pinned": "Закреплено",
|
|
||||||
"tags": "Метки",
|
"tags": "Метки",
|
||||||
"createNewTag": "Создать новую метку",
|
"createNewTag": "Создать новую метку",
|
||||||
"tag": "Метка",
|
"tag": "Метка",
|
||||||
@@ -469,9 +462,9 @@
|
|||||||
"deleteTagMessage": "Вы уверены, что хотите удалить эту метку? Это действие необратимо.",
|
"deleteTagMessage": "Вы уверены, что хотите удалить эту метку? Это действие необратимо.",
|
||||||
"somethingWentWrongParsingCode": "Мы не смогли разобрать коды {x}.",
|
"somethingWentWrongParsingCode": "Мы не смогли разобрать коды {x}.",
|
||||||
"updateNotAvailable": "Обновление недоступно",
|
"updateNotAvailable": "Обновление недоступно",
|
||||||
"viewRawCodes": "Просмотр необработанных кодов",
|
"viewRawCodes": "Просмотр сырых кодов",
|
||||||
"rawCodes": "Необработанные коды",
|
"rawCodes": "Сырые коды",
|
||||||
"rawCodeData": "Необработанные кодовые данные",
|
"rawCodeData": "Сырая информация кодов",
|
||||||
"appLock": "Блокировка приложения",
|
"appLock": "Блокировка приложения",
|
||||||
"noSystemLockFound": "Системная блокировка не найдена",
|
"noSystemLockFound": "Системная блокировка не найдена",
|
||||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Чтобы включить блокировку, настройте пароль устройства или блокировку экрана в настройках системы.",
|
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Чтобы включить блокировку, настройте пароль устройства или блокировку экрана в настройках системы.",
|
||||||
@@ -489,29 +482,16 @@
|
|||||||
"hideContentDescriptioniOS": "Скрывает содержимое приложения в переключателе приложений",
|
"hideContentDescriptioniOS": "Скрывает содержимое приложения в переключателе приложений",
|
||||||
"autoLockFeatureDescription": "Время в фоне, после которого приложение блокируется",
|
"autoLockFeatureDescription": "Время в фоне, после которого приложение блокируется",
|
||||||
"appLockDescription": "Выберите между экраном блокировки вашего устройства и пользовательским экраном блокировки с PIN-кодом или паролем.",
|
"appLockDescription": "Выберите между экраном блокировки вашего устройства и пользовательским экраном блокировки с PIN-кодом или паролем.",
|
||||||
"pinLock": "Pin блокировка",
|
"pinLock": "Pin Замок",
|
||||||
"enterPin": "Введите PIN",
|
"enterPin": "Введите PIN",
|
||||||
"setNewPin": "Установите новый PIN",
|
"setNewPin": "Установите новый PIN",
|
||||||
"importFailureDescNew": "Не удалось обработать выбранный файл.",
|
"importFailureDescNew": "Не удалось обработать выбранный файл.",
|
||||||
"appLockNotEnabled": "Блокировка приложения отключена",
|
"appLockNotEnabled": "Блокировка приложения отключена",
|
||||||
"appLockNotEnabledDescription": "Пожалуйста, включите блокировку приложения в разделе Безопасность > Блокировка приложений",
|
"appLockNotEnabledDescription": "Пожалуйста, включите блокировку приложения в безопасности > Блокировка приложений",
|
||||||
"authToViewPasskey": "Пожалуйста, авторизуйтесь, чтобы просмотреть пароль",
|
"authToViewPasskey": "Пожалуйста, авторизуйтесь, чтобы просмотреть пароль",
|
||||||
"appLockOfflineModeWarning": "Вы решили продолжить работу без резервного копирования. Если вы забудете свой пароль, доступ к вашим данным будет заблокирован.",
|
"appLockOfflineModeWarning": "Вы решили продолжить работу без резервного копирования. Если вы забудете свой пароль, доступ к вашим данным будет заблокирован.",
|
||||||
"duplicateCodes": "Дублировать коды",
|
"duplicateCodes": "Дублировать коды",
|
||||||
"noDuplicates": "✨ Дубликатов нет",
|
"noDuplicates": "✨ Дубликатов нет",
|
||||||
"youveNoDuplicateCodesThatCanBeCleared": "У вас нет повторяющихся кодов, которые можно было бы удалить",
|
|
||||||
"deduplicateCodes": "Дедупликационные коды",
|
|
||||||
"deselectAll": "Снять выделение",
|
|
||||||
"selectAll": "Выбрать все",
|
"selectAll": "Выбрать все",
|
||||||
"deleteDuplicates": "Удалить повторяющиеся",
|
"plainHTML": "Обычный HTML"
|
||||||
"plainHTML": "Обычный HTML",
|
|
||||||
"tellUsWhatYouThink": "Расскажите нам, что вы думаете",
|
|
||||||
"dropReviewiOS": "Оставьте отзыв в App Store",
|
|
||||||
"dropReviewAndroid": "Оставьте отзыв в Play Store",
|
|
||||||
"supportEnte": "Поддержка <bold-green>ente</bold-green>",
|
|
||||||
"giveUsAStarOnGithub": "Поставьте нам звезду на Github",
|
|
||||||
"free5GB": "5Гб бесплатного пространства на <bold-green>ente</bold-green> Фото",
|
|
||||||
"loginWithAuthAccount": "Войти с помощью учетной записи Auth",
|
|
||||||
"freeStorageOffer": "Скидка 10% на <bold-green>ente</bold-green> фото",
|
|
||||||
"freeStorageOfferDescription": "Используйте код \"AUTH\", чтобы получить скидку 10% в первый год"
|
|
||||||
}
|
}
|
||||||
@@ -506,6 +506,7 @@
|
|||||||
"deleteDuplicates": "Izbriši dvojnike",
|
"deleteDuplicates": "Izbriši dvojnike",
|
||||||
"plainHTML": "Navadni HTML",
|
"plainHTML": "Navadni HTML",
|
||||||
"tellUsWhatYouThink": "Povejte nam kaj mislite",
|
"tellUsWhatYouThink": "Povejte nam kaj mislite",
|
||||||
|
"dropReview": "Napišite oceno v trgovini App/Play Store",
|
||||||
"supportEnte": "Podpiraj <bold-green>ente</bold-green>",
|
"supportEnte": "Podpiraj <bold-green>ente</bold-green>",
|
||||||
"giveUsAStarOnGithub": "Dajte nam zvezdico na Githubu",
|
"giveUsAStarOnGithub": "Dajte nam zvezdico na Githubu",
|
||||||
"free5GB": "5 GB zastonj na <bold-green>ente</bold-green> fotografije",
|
"free5GB": "5 GB zastonj na <bold-green>ente</bold-green> fotografije",
|
||||||
|
|||||||
@@ -274,7 +274,6 @@
|
|||||||
"tryAgain": "Försök igen",
|
"tryAgain": "Försök igen",
|
||||||
"viewRecoveryKey": "Visa återställningsnyckel",
|
"viewRecoveryKey": "Visa återställningsnyckel",
|
||||||
"confirmRecoveryKey": "Bekräfta å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",
|
"confirmYourRecoveryKey": "Bekräfta din återställningsnyckel",
|
||||||
"confirm": "Bekräfta",
|
"confirm": "Bekräfta",
|
||||||
"emailYourLogs": "Maila dina loggar",
|
"emailYourLogs": "Maila dina loggar",
|
||||||
@@ -359,7 +358,6 @@
|
|||||||
"theRecoveryKeyYouEnteredIsIncorrect": "Återställningsnyckeln du angav är felaktig",
|
"theRecoveryKeyYouEnteredIsIncorrect": "Återställningsnyckeln du angav är felaktig",
|
||||||
"enterPassword": "Ange lösenord",
|
"enterPassword": "Ange lösenord",
|
||||||
"selectExportFormat": "Välj exportformat",
|
"selectExportFormat": "Välj exportformat",
|
||||||
"exportDialogDesc": "Krypterad export skyddas av ett lösenord som du väljer.",
|
|
||||||
"encrypted": "Krypterad",
|
"encrypted": "Krypterad",
|
||||||
"plainText": "Enkel text",
|
"plainText": "Enkel text",
|
||||||
"passwordToEncryptExport": "Lösenord för att kryptera export",
|
"passwordToEncryptExport": "Lösenord för att kryptera export",
|
||||||
@@ -367,7 +365,6 @@
|
|||||||
"useOffline": "Använd utan säkerhetskopior",
|
"useOffline": "Använd utan säkerhetskopior",
|
||||||
"signInToBackup": "Logga in för att säkerhetskopiera dina koder",
|
"signInToBackup": "Logga in för att säkerhetskopiera dina koder",
|
||||||
"singIn": "Logga in",
|
"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",
|
"showLargeIcons": "Visa stora ikoner",
|
||||||
"compactMode": "Kompakt läge",
|
"compactMode": "Kompakt läge",
|
||||||
"shouldHideCode": "Dölj koder",
|
"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.",
|
"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",
|
"duplicateCodes": "Mã trùng lặp",
|
||||||
"noDuplicates": "✨ Không có 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",
|
"deduplicateCodes": "Loại bỏ mã trùng lặp",
|
||||||
"deselectAll": "Bỏ chọn tất cả",
|
"deselectAll": "Bỏ chọn tất cả",
|
||||||
"selectAll": "Chọn tất cả",
|
"selectAll": "Chọn tất cả",
|
||||||
"deleteDuplicates": "Xóa trùng lặp",
|
"deleteDuplicates": "Xóa trùng lặp",
|
||||||
"plainHTML": "HTML thuần",
|
"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"
|
|
||||||
}
|
}
|
||||||
@@ -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": "纯 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,517 +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": "告訴我們您的想法",
|
|
||||||
"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% 折扣"
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,6 @@ const List<Locale> appSupportedLocales = <Locale>[
|
|||||||
Locale('es', 'ES'),
|
Locale('es', 'ES'),
|
||||||
Locale('fa'),
|
Locale('fa'),
|
||||||
Locale('fr'),
|
Locale('fr'),
|
||||||
Locale('he'),
|
|
||||||
Locale('hu'),
|
Locale('hu'),
|
||||||
Locale('id'),
|
Locale('id'),
|
||||||
Locale('it'),
|
Locale('it'),
|
||||||
@@ -26,7 +25,6 @@ const List<Locale> appSupportedLocales = <Locale>[
|
|||||||
Locale('pl'),
|
Locale('pl'),
|
||||||
Locale('pt'),
|
Locale('pt'),
|
||||||
Locale('pt', 'BR'),
|
Locale('pt', 'BR'),
|
||||||
Locale('ro'),
|
|
||||||
Locale('ru'),
|
Locale('ru'),
|
||||||
Locale('sl'),
|
Locale('sl'),
|
||||||
Locale('sk'),
|
Locale('sk'),
|
||||||
@@ -34,7 +32,6 @@ const List<Locale> appSupportedLocales = <Locale>[
|
|||||||
Locale('uk'),
|
Locale('uk'),
|
||||||
Locale('vi'),
|
Locale('vi'),
|
||||||
Locale("zh", "CN"),
|
Locale("zh", "CN"),
|
||||||
Locale("zh", "TW"),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
Locale? autoDetectedLocale;
|
Locale? autoDetectedLocale;
|
||||||
|
|||||||
@@ -114,19 +114,18 @@ class Code {
|
|||||||
CodeDisplay? display,
|
CodeDisplay? display,
|
||||||
int digits, {
|
int digits, {
|
||||||
Algorithm algorithm = Algorithm.sha1,
|
Algorithm algorithm = Algorithm.sha1,
|
||||||
int period = defaultPeriod,
|
|
||||||
}) {
|
}) {
|
||||||
final String encodedIssuer = Uri.encodeQueryComponent(issuer);
|
final String encodedIssuer = Uri.encodeQueryComponent(issuer);
|
||||||
return Code(
|
return Code(
|
||||||
account,
|
account,
|
||||||
issuer,
|
issuer,
|
||||||
digits,
|
digits,
|
||||||
period,
|
defaultPeriod,
|
||||||
secret,
|
secret,
|
||||||
algorithm,
|
algorithm,
|
||||||
type,
|
type,
|
||||||
0,
|
0,
|
||||||
"otpauth://${type.name}/$issuer:$account?algorithm=${algorithm.name.toUpperCase()}&digits=$digits&issuer=$encodedIssuer&period=$period&secret=$secret",
|
"otpauth://${type.name}/$issuer:$account?algorithm=${algorithm.name.toUpperCase()}&digits=$digits&issuer=$encodedIssuer&period=30&secret=$secret",
|
||||||
display: display ?? CodeDisplay(),
|
display: display ?? CodeDisplay(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,10 @@ import 'package:flutter/material.dart';
|
|||||||
|
|
||||||
class FieldLabel extends StatelessWidget {
|
class FieldLabel extends StatelessWidget {
|
||||||
final String label;
|
final String label;
|
||||||
final double width;
|
|
||||||
|
|
||||||
const FieldLabel(
|
const FieldLabel(
|
||||||
this.label, {
|
this.label, {
|
||||||
super.key,
|
super.key,
|
||||||
this.width = 80,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -16,7 +14,7 @@ class FieldLabel extends StatelessWidget {
|
|||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(right: 12.0),
|
padding: const EdgeInsets.only(right: 12.0),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: width,
|
width: 80,
|
||||||
child: Text(
|
child: Text(
|
||||||
label,
|
label,
|
||||||
style: getEnteTextTheme(context).miniBoldMuted,
|
style: getEnteTextTheme(context).miniBoldMuted,
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import 'package:ente_auth/ui/components/buttons/button_widget.dart';
|
|||||||
import 'package:ente_auth/ui/components/custom_icon_widget.dart';
|
import 'package:ente_auth/ui/components/custom_icon_widget.dart';
|
||||||
import 'package:ente_auth/ui/components/models/button_result.dart';
|
import 'package:ente_auth/ui/components/models/button_result.dart';
|
||||||
import 'package:ente_auth/ui/custom_icon_page.dart';
|
import 'package:ente_auth/ui/custom_icon_page.dart';
|
||||||
import 'package:ente_auth/ui/topt_selector_widget.dart';
|
|
||||||
import 'package:ente_auth/ui/utils/icon_utils.dart';
|
import 'package:ente_auth/ui/utils/icon_utils.dart';
|
||||||
import 'package:ente_auth/utils/dialog_util.dart';
|
import 'package:ente_auth/utils/dialog_util.dart';
|
||||||
import 'package:ente_auth/utils/toast_util.dart';
|
import 'package:ente_auth/utils/toast_util.dart';
|
||||||
@@ -41,13 +40,11 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
final int _notesLimit = 500;
|
final int _notesLimit = 500;
|
||||||
final int _otherTextLimit = 200;
|
final int _otherTextLimit = 200;
|
||||||
final int defaultDigits = 6;
|
final int defaultDigits = 6;
|
||||||
final int defaultPeriodInSeconds = 30;
|
|
||||||
late TextEditingController _issuerController;
|
late TextEditingController _issuerController;
|
||||||
late TextEditingController _accountController;
|
late TextEditingController _accountController;
|
||||||
late TextEditingController _secretController;
|
late TextEditingController _secretController;
|
||||||
late TextEditingController _notesController;
|
late TextEditingController _notesController;
|
||||||
late TextEditingController _digitsController;
|
late TextEditingController _digitsController;
|
||||||
late TextEditingController _periodController;
|
|
||||||
late bool _secretKeyObscured;
|
late bool _secretKeyObscured;
|
||||||
late List<String> selectedTags = [...?widget.code?.display.tags];
|
late List<String> selectedTags = [...?widget.code?.display.tags];
|
||||||
List<String> allTags = [];
|
List<String> allTags = [];
|
||||||
@@ -56,8 +53,6 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
String _customIconID = "";
|
String _customIconID = "";
|
||||||
late IconType _iconSrc;
|
late IconType _iconSrc;
|
||||||
late Algorithm _algorithm;
|
late Algorithm _algorithm;
|
||||||
late Type _type;
|
|
||||||
final ValueNotifier<bool> showAdvancedOptions = ValueNotifier<bool>(false);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
@@ -79,11 +74,6 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
? widget.code!.digits.toString()
|
? widget.code!.digits.toString()
|
||||||
: defaultDigits.toString(),
|
: defaultDigits.toString(),
|
||||||
);
|
);
|
||||||
_periodController = TextEditingController(
|
|
||||||
text: widget.code != null
|
|
||||||
? widget.code!.period.toString()
|
|
||||||
: defaultPeriodInSeconds.toString(),
|
|
||||||
);
|
|
||||||
|
|
||||||
_secretKeyObscured = widget.code != null;
|
_secretKeyObscured = widget.code != null;
|
||||||
_loadTags();
|
_loadTags();
|
||||||
@@ -122,7 +112,6 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
: IconType.customIcon;
|
: IconType.customIcon;
|
||||||
|
|
||||||
_algorithm = widget.code == null ? Algorithm.sha1 : widget.code!.algorithm;
|
_algorithm = widget.code == null ? Algorithm.sha1 : widget.code!.algorithm;
|
||||||
_type = widget.code == null ? Type.totp : widget.code!.type;
|
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
@@ -145,7 +134,6 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
_accountController.dispose();
|
_accountController.dispose();
|
||||||
_notesController.dispose();
|
_notesController.dispose();
|
||||||
_digitsController.dispose();
|
_digitsController.dispose();
|
||||||
_periodController.dispose();
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,7 +282,76 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
widget.code == null
|
widget.code == null
|
||||||
? advanceOptionWidget()
|
? Theme(
|
||||||
|
data: Theme.of(context).copyWith(
|
||||||
|
splashColor: Colors.transparent,
|
||||||
|
highlightColor: Colors.transparent,
|
||||||
|
hoverColor: Colors.transparent,
|
||||||
|
),
|
||||||
|
child: ExpansionTile(
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
),
|
||||||
|
collapsedShape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
),
|
||||||
|
collapsedBackgroundColor: Colors.transparent,
|
||||||
|
tilePadding: EdgeInsets.zero,
|
||||||
|
title: Text(
|
||||||
|
"Advanced",
|
||||||
|
style: getEnteTextTheme(context).small,
|
||||||
|
),
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
const FieldLabel("Digits"),
|
||||||
|
Expanded(
|
||||||
|
child: TextFormField(
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
// The validator receives the text that the user has entered.
|
||||||
|
validator: (value) {
|
||||||
|
if (value == null || value.isEmpty) {
|
||||||
|
return "Please enter a number";
|
||||||
|
}
|
||||||
|
final intValue = int.tryParse(value);
|
||||||
|
if (intValue == null) {
|
||||||
|
return "Only integers are allowed";
|
||||||
|
}
|
||||||
|
if (intValue < 1 || intValue > 10) {
|
||||||
|
return "OTP digits must be between 1 and 10";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
maxLines: 1,
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
contentPadding: EdgeInsets.symmetric(
|
||||||
|
vertical: 12.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
style: getEnteTextTheme(context).small,
|
||||||
|
controller: _digitsController,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 22),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
const FieldLabel("Algorithm"),
|
||||||
|
AlgorithmSelectorWidget(
|
||||||
|
currentAlgorithm: _algorithm,
|
||||||
|
onSelected: (newAlgorithm) async {
|
||||||
|
setState(() {
|
||||||
|
_algorithm = newAlgorithm;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
: const SizedBox.shrink(),
|
: const SizedBox.shrink(),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
Wrap(
|
Wrap(
|
||||||
@@ -362,25 +419,11 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final period =
|
|
||||||
int.tryParse(_periodController.text.trim());
|
|
||||||
if (period != null && (period < 10 || period > 60)) {
|
|
||||||
String message =
|
|
||||||
"Period must be between 10 and 60 seconds";
|
|
||||||
_showIncorrectDetailsDialog(
|
|
||||||
context,
|
|
||||||
message: message,
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((_accountController.text.trim().isEmpty &&
|
if ((_accountController.text.trim().isEmpty &&
|
||||||
_issuerController.text.trim().isEmpty) ||
|
_issuerController.text.trim().isEmpty) ||
|
||||||
_secretController.text.trim().isEmpty ||
|
_secretController.text.trim().isEmpty ||
|
||||||
_digitsController.text.trim().isEmpty ||
|
_digitsController.text.trim().isEmpty ||
|
||||||
digits == null ||
|
digits == null) {
|
||||||
_periodController.text.trim().isEmpty ||
|
|
||||||
period == null) {
|
|
||||||
String message;
|
String message;
|
||||||
if (_secretController.text.trim().isEmpty) {
|
if (_secretController.text.trim().isEmpty) {
|
||||||
message = context.l10n.secretCanNotBeEmpty;
|
message = context.l10n.secretCanNotBeEmpty;
|
||||||
@@ -388,10 +431,6 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
message = "Digits cannot be empty";
|
message = "Digits cannot be empty";
|
||||||
} else if (digits == null) {
|
} else if (digits == null) {
|
||||||
message = "Digits is not a integer";
|
message = "Digits is not a integer";
|
||||||
} else if (_periodController.text.isEmpty) {
|
|
||||||
message = "Period cannot be empty";
|
|
||||||
} else if (period == null) {
|
|
||||||
message = "Period is not a integer";
|
|
||||||
} else {
|
} else {
|
||||||
message =
|
message =
|
||||||
context.l10n.bothIssuerAndAccountCanNotBeEmpty;
|
context.l10n.bothIssuerAndAccountCanNotBeEmpty;
|
||||||
@@ -423,7 +462,6 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
final secret = _secretController.text.trim().replaceAll(' ', '');
|
final secret = _secretController.text.trim().replaceAll(' ', '');
|
||||||
final notes = _notesController.text.trim();
|
final notes = _notesController.text.trim();
|
||||||
final digits = int.tryParse(_digitsController.text.trim());
|
final digits = int.tryParse(_digitsController.text.trim());
|
||||||
final period = int.tryParse(_periodController.text.trim());
|
|
||||||
|
|
||||||
final isStreamCode = issuer.toLowerCase() == "steam" ||
|
final isStreamCode = issuer.toLowerCase() == "steam" ||
|
||||||
issuer.toLowerCase().contains('steampowered.com');
|
issuer.toLowerCase().contains('steampowered.com');
|
||||||
@@ -460,14 +498,13 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
|
|
||||||
final Code newCode = widget.code == null
|
final Code newCode = widget.code == null
|
||||||
? Code.fromAccountAndSecret(
|
? Code.fromAccountAndSecret(
|
||||||
isStreamCode ? Type.steam : _type,
|
isStreamCode ? Type.steam : Type.totp,
|
||||||
account,
|
account,
|
||||||
issuer,
|
issuer,
|
||||||
secret,
|
secret,
|
||||||
display,
|
display,
|
||||||
isStreamCode ? Code.steamDigits : digits!,
|
isStreamCode ? Code.steamDigits : digits!,
|
||||||
algorithm: _algorithm,
|
algorithm: _algorithm,
|
||||||
period: period!,
|
|
||||||
)
|
)
|
||||||
: widget.code!.copyWith(
|
: widget.code!.copyWith(
|
||||||
account: account,
|
account: account,
|
||||||
@@ -476,8 +513,6 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
display: display,
|
display: display,
|
||||||
algorithm: _algorithm,
|
algorithm: _algorithm,
|
||||||
digits: digits!,
|
digits: digits!,
|
||||||
type: _type,
|
|
||||||
period: period,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify the validity of the code
|
// Verify the validity of the code
|
||||||
@@ -523,159 +558,4 @@ class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
|
|||||||
_iconSrc = newCustomIcon.type;
|
_iconSrc = newCustomIcon.type;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget advanceOptionWidget() {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 16.0),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
showAdvancedOptions.value = !showAdvancedOptions.value;
|
|
||||||
},
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
const Text(
|
|
||||||
'Advanced',
|
|
||||||
),
|
|
||||||
ValueListenableBuilder<bool>(
|
|
||||||
valueListenable: showAdvancedOptions,
|
|
||||||
builder: (context, isExpanded, child) {
|
|
||||||
return Icon(
|
|
||||||
isExpanded
|
|
||||||
? Icons.keyboard_arrow_up
|
|
||||||
: Icons.keyboard_arrow_down,
|
|
||||||
size: 24,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
ValueListenableBuilder<bool>(
|
|
||||||
valueListenable: showAdvancedOptions,
|
|
||||||
builder: (context, isExpanded, child) {
|
|
||||||
return AnimatedSwitcher(
|
|
||||||
duration: const Duration(milliseconds: 300),
|
|
||||||
transitionBuilder: (child, animation) {
|
|
||||||
return SizeTransition(
|
|
||||||
sizeFactor: animation,
|
|
||||||
child: child,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: isExpanded
|
|
||||||
? SizedBox(
|
|
||||||
width: 400,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(
|
|
||||||
top: 16,
|
|
||||||
),
|
|
||||||
child: GridView.count(
|
|
||||||
crossAxisCount: 2,
|
|
||||||
shrinkWrap: true,
|
|
||||||
childAspectRatio: 2.5,
|
|
||||||
crossAxisSpacing: 16,
|
|
||||||
mainAxisSpacing: 14,
|
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
const FieldLabel("Algorithm", width: 60),
|
|
||||||
AlgorithmSelectorWidget(
|
|
||||||
currentAlgorithm: _algorithm,
|
|
||||||
onSelected: (newAlgorithm) async {
|
|
||||||
setState(() {
|
|
||||||
_algorithm = newAlgorithm;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
const FieldLabel("Type", width: 60),
|
|
||||||
ToptSelectorWidget(
|
|
||||||
currentTopt: _type,
|
|
||||||
onSelected: (newTopt) async {
|
|
||||||
setState(() {
|
|
||||||
_type = newTopt;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
const FieldLabel("Period", width: 60),
|
|
||||||
Expanded(
|
|
||||||
child: TextFormField(
|
|
||||||
keyboardType: TextInputType.number,
|
|
||||||
// The validator receives the text that the user has entered.
|
|
||||||
validator: (value) {
|
|
||||||
if (value == null || value.isEmpty) {
|
|
||||||
return "Please enter a number";
|
|
||||||
}
|
|
||||||
final intValue = int.tryParse(value);
|
|
||||||
if (intValue == null) {
|
|
||||||
return "Only integers are allowed";
|
|
||||||
}
|
|
||||||
if (intValue < 1 || intValue > 60) {
|
|
||||||
return "Period must be between 1 and 60";
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
maxLines: 1,
|
|
||||||
style: getEnteTextTheme(
|
|
||||||
context,
|
|
||||||
).small,
|
|
||||||
controller: _periodController,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
const FieldLabel("Digits", width: 60),
|
|
||||||
Expanded(
|
|
||||||
child: TextFormField(
|
|
||||||
keyboardType: TextInputType.number,
|
|
||||||
// The validator receives the text that the user has entered.
|
|
||||||
validator: (value) {
|
|
||||||
if (value == null || value.isEmpty) {
|
|
||||||
return "Please enter a number";
|
|
||||||
}
|
|
||||||
final intValue = int.tryParse(value);
|
|
||||||
if (intValue == null) {
|
|
||||||
return "Only integers are allowed";
|
|
||||||
}
|
|
||||||
if (intValue < 1 || intValue > 10) {
|
|
||||||
return "OTP digits must be between 1 and 10";
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
maxLines: 1,
|
|
||||||
style: getEnteTextTheme(
|
|
||||||
context,
|
|
||||||
).small,
|
|
||||||
controller: _digitsController,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: const SizedBox.shrink(),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -350,7 +350,6 @@ class UserService {
|
|||||||
userPassword,
|
userPassword,
|
||||||
_config.getKeyAttributes()!,
|
_config.getKeyAttributes()!,
|
||||||
);
|
);
|
||||||
_config.resetVolatilePassword();
|
|
||||||
page = const HomePage();
|
page = const HomePage();
|
||||||
} else {
|
} else {
|
||||||
throw Exception("unexpected response during passkey verification");
|
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';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
class WindowListenerService {
|
class WindowListenerService {
|
||||||
static const double initialWindowHeight = 1200.0;
|
static const double minWindowHeight = 600.0;
|
||||||
static const double initialWindowWidth = 800.0;
|
static const double minWindowWidth = 800.0;
|
||||||
static const double maxWindowHeight = 8192.0;
|
static const double maxWindowHeight = 8192.0;
|
||||||
static const double maxWindowWidth = 8192.0;
|
static const double maxWindowWidth = 8192.0;
|
||||||
late SharedPreferences _preferences;
|
late SharedPreferences _preferences;
|
||||||
@@ -23,9 +23,9 @@ class WindowListenerService {
|
|||||||
|
|
||||||
Size getWindowSize() {
|
Size getWindowSize() {
|
||||||
final double windowWidth =
|
final double windowWidth =
|
||||||
_preferences.getDouble('windowWidth') ?? initialWindowWidth;
|
_preferences.getDouble('windowWidth') ?? minWindowWidth;
|
||||||
final double windowHeight =
|
final double windowHeight =
|
||||||
_preferences.getDouble('windowHeight') ?? initialWindowHeight;
|
_preferences.getDouble('windowHeight') ?? minWindowHeight;
|
||||||
final w = windowWidth.clamp(200.0, maxWindowWidth);
|
final w = windowWidth.clamp(200.0, maxWindowWidth);
|
||||||
final h = windowHeight.clamp(400.0, maxWindowHeight);
|
final h = windowHeight.clamp(400.0, maxWindowHeight);
|
||||||
return Size(w, h);
|
return Size(w, h);
|
||||||
|
|||||||
@@ -580,9 +580,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
|
|
||||||
return ClipRect(
|
return ClipRect(
|
||||||
child: CodeWidget(
|
child: CodeWidget(
|
||||||
key: ValueKey(
|
key: ValueKey('${code.hashCode}_${newIndex}_$_codeSortKey'),
|
||||||
'${code.hashCode}_${newIndex}_$_codeSortKey',
|
|
||||||
),
|
|
||||||
code,
|
code,
|
||||||
isCompactMode: isCompactMode,
|
isCompactMode: isCompactMode,
|
||||||
sortKey: _codeSortKey,
|
sortKey: _codeSortKey,
|
||||||
@@ -669,13 +667,11 @@ class _HomePageState extends State<HomePage> {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lastScanTime = DateTime.now().millisecondsSinceEpoch - 1000;
|
int lastScanTime = DateTime.now().millisecondsSinceEpoch - 1000;
|
||||||
void _handleDeeplink(BuildContext context, String? link) {
|
void _handleDeeplink(BuildContext context, String? link) {
|
||||||
bool isAccountConfigured = Configuration.instance.hasConfiguredAccount();
|
bool isAccountConfigured = Configuration.instance.hasConfiguredAccount();
|
||||||
bool isOfflineModeEnabled =
|
bool isOfflineModeEnabled = Configuration.instance.hasOptedForOfflineMode() &&
|
||||||
Configuration.instance.hasOptedForOfflineMode() &&
|
Configuration.instance.getOfflineSecretKey() != null;
|
||||||
Configuration.instance.getOfflineSecretKey() != null;
|
|
||||||
if (!(isAccountConfigured || isOfflineModeEnabled) || link == null) {
|
if (!(isAccountConfigured || isOfflineModeEnabled) || link == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ Future<int?> _processAegisExportFile(
|
|||||||
final isEncrypted = decodedJson['header']['slots'] != null;
|
final isEncrypted = decodedJson['header']['slots'] != null;
|
||||||
Map? aegisDB;
|
Map? aegisDB;
|
||||||
if (isEncrypted) {
|
if (isEncrypted) {
|
||||||
await dialog.hide();
|
|
||||||
String? password;
|
String? password;
|
||||||
try {
|
try {
|
||||||
await showTextInputDialog(
|
await showTextInputDialog(
|
||||||
@@ -110,7 +109,6 @@ Future<int?> _processAegisExportFile(
|
|||||||
await dialog.hide();
|
await dialog.hide();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
await dialog.show();
|
|
||||||
final content = decryptAegisVault(decodedJson, password: password!);
|
final content = decryptAegisVault(decodedJson, password: password!);
|
||||||
aegisDB = jsonDecode(content);
|
aegisDB = jsonDecode(content);
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
|
|||||||
@@ -147,8 +147,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
|||||||
return 'Français';
|
return 'Français';
|
||||||
case 'de':
|
case 'de':
|
||||||
return 'Deutsch';
|
return 'Deutsch';
|
||||||
case 'he':
|
|
||||||
return 'עברית';
|
|
||||||
case 'hu':
|
case 'hu':
|
||||||
return 'Magyar';
|
return 'Magyar';
|
||||||
case 'id':
|
case 'id':
|
||||||
@@ -159,8 +157,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
|||||||
return 'Lietuvių';
|
return 'Lietuvių';
|
||||||
case 'nl':
|
case 'nl':
|
||||||
return 'Nederlands';
|
return 'Nederlands';
|
||||||
case 'no':
|
|
||||||
return 'Norsk';
|
|
||||||
case 'pl':
|
case 'pl':
|
||||||
return 'Polski';
|
return 'Polski';
|
||||||
case 'pt':
|
case 'pt':
|
||||||
@@ -170,8 +166,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
|||||||
default:
|
default:
|
||||||
return 'Português';
|
return 'Português';
|
||||||
}
|
}
|
||||||
case 'ro':
|
|
||||||
return 'Română';
|
|
||||||
case 'ru':
|
case 'ru':
|
||||||
return 'Русский';
|
return 'Русский';
|
||||||
case 'sl':
|
case 'sl':
|
||||||
@@ -187,13 +181,6 @@ class _ItemsWidgetState extends State<ItemsWidget> {
|
|||||||
case 'fi':
|
case 'fi':
|
||||||
return 'Suomi';
|
return 'Suomi';
|
||||||
case 'zh':
|
case 'zh':
|
||||||
if (locale.countryCode == 'TW') {
|
|
||||||
return '中文 (台灣)';
|
|
||||||
} else if (locale.countryCode == 'HK') {
|
|
||||||
return '中文 (香港)';
|
|
||||||
} else if (locale.countryCode == 'CN') {
|
|
||||||
return '中文 (中国)';
|
|
||||||
}
|
|
||||||
switch (locale.scriptCode) {
|
switch (locale.scriptCode) {
|
||||||
case 'Hans':
|
case 'Hans':
|
||||||
return '中文 (简体)';
|
return '中文 (简体)';
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:ente_auth/core/configuration.dart';
|
import 'package:ente_auth/core/configuration.dart';
|
||||||
import 'package:ente_auth/l10n/l10n.dart';
|
import 'package:ente_auth/l10n/l10n.dart';
|
||||||
import 'package:ente_auth/models/user_details.dart';
|
import 'package:ente_auth/models/user_details.dart';
|
||||||
@@ -37,9 +35,7 @@ class NotificationBannerWidget extends StatelessWidget {
|
|||||||
[
|
[
|
||||||
BannerWidget(
|
BannerWidget(
|
||||||
text: l10n.tellUsWhatYouThink,
|
text: l10n.tellUsWhatYouThink,
|
||||||
subText: Platform.isIOS
|
subText: l10n.dropReview,
|
||||||
? l10n.dropReviewiOS
|
|
||||||
: l10n.dropReviewAndroid,
|
|
||||||
type: BannerType.rateUs,
|
type: BannerType.rateUs,
|
||||||
),
|
),
|
||||||
sectionSpacing,
|
sectionSpacing,
|
||||||
@@ -88,8 +84,7 @@ class NotificationBannerWidget extends StatelessWidget {
|
|||||||
[
|
[
|
||||||
BannerWidget(
|
BannerWidget(
|
||||||
text: l10n.tellUsWhatYouThink,
|
text: l10n.tellUsWhatYouThink,
|
||||||
subText:
|
subText: l10n.dropReview,
|
||||||
Platform.isIOS ? l10n.dropReviewiOS : l10n.dropReviewAndroid,
|
|
||||||
type: BannerType.rateUs,
|
type: BannerType.rateUs,
|
||||||
),
|
),
|
||||||
sectionSpacing,
|
sectionSpacing,
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
import 'package:ente_auth/models/code.dart';
|
|
||||||
import 'package:ente_auth/theme/ente_theme.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class ToptSelectorWidget extends StatelessWidget {
|
|
||||||
final Type currentTopt;
|
|
||||||
final void Function(Type) onSelected;
|
|
||||||
const ToptSelectorWidget({
|
|
||||||
super.key,
|
|
||||||
required this.currentTopt,
|
|
||||||
required this.onSelected,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
Text toptOptionText(Type type) {
|
|
||||||
return Text(
|
|
||||||
type.name.toUpperCase(),
|
|
||||||
style: getEnteTextTheme(context).small,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GestureDetector(
|
|
||||||
onTapDown: (TapDownDetails details) async {
|
|
||||||
final int? selectedValue = await showMenu<int>(
|
|
||||||
context: context,
|
|
||||||
position: RelativeRect.fromLTRB(
|
|
||||||
details.globalPosition.dx,
|
|
||||||
details.globalPosition.dy,
|
|
||||||
details.globalPosition.dx,
|
|
||||||
details.globalPosition.dy + 300,
|
|
||||||
),
|
|
||||||
items: List.generate(Type.values.length, (index) {
|
|
||||||
return PopupMenuItem(
|
|
||||||
value: index,
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
toptOptionText(Type.values[index]),
|
|
||||||
if (Type.values[index] == currentTopt)
|
|
||||||
Icon(
|
|
||||||
Icons.check,
|
|
||||||
color: Theme.of(context).iconTheme.color,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
if (selectedValue != null) {
|
|
||||||
onSelected(Type.values[selectedValue]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
padding: const EdgeInsets.only(bottom: 4),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border(
|
|
||||||
bottom: BorderSide(color: Theme.of(context).dividerColor),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
toptOptionText(currentTopt),
|
|
||||||
const SizedBox(width: 8),
|
|
||||||
const Icon(Icons.arrow_drop_down),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import "dart:convert";
|
import "dart:convert";
|
||||||
import "dart:io";
|
|
||||||
import "dart:typed_data";
|
import "dart:typed_data";
|
||||||
|
|
||||||
import "package:ente_auth/core/configuration.dart";
|
import "package:ente_auth/core/configuration.dart";
|
||||||
@@ -50,8 +49,6 @@ class LockScreenSettings {
|
|||||||
/// Function to Check if the migration for lock screen changes has
|
/// Function to Check if the migration for lock screen changes has
|
||||||
/// already been done by checking a stored boolean value.
|
/// already been done by checking a stored boolean value.
|
||||||
await runLockScreenChangesMigration();
|
await runLockScreenChangesMigration();
|
||||||
|
|
||||||
await _clearLsDataInKeychainIfFreshInstall();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setOfflineModeWarningStatus(bool value) async {
|
Future<void> setOfflineModeWarningStatus(bool value) async {
|
||||||
@@ -213,17 +210,4 @@ class LockScreenSettings {
|
|||||||
Future<bool> isPasswordSet() async {
|
Future<bool> isPasswordSet() async {
|
||||||
return await _secureStorage.containsKey(key: password);
|
return await _secureStorage.containsKey(key: password);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the app was uninstalled (without logging out if it was used with
|
|
||||||
// backups), keychain items of the app persist in the keychain. To avoid using
|
|
||||||
// old keychain items, we delete them on reinstall.
|
|
||||||
Future<void> _clearLsDataInKeychainIfFreshInstall() async {
|
|
||||||
if ((Platform.isIOS || Platform.isMacOS) &&
|
|
||||||
!Configuration.instance.isLoggedIn() &&
|
|
||||||
!Configuration.instance.hasOptedForOfflineMode()) {
|
|
||||||
await _secureStorage.delete(key: password);
|
|
||||||
await _secureStorage.delete(key: pin);
|
|
||||||
await _secureStorage.delete(key: saltKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
|||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
jni
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
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.
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|||||||
@@ -4,9 +4,6 @@ PODS:
|
|||||||
- connectivity_plus (0.0.1):
|
- connectivity_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- cupertino_http (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- FlutterMacOS
|
|
||||||
- device_info_plus (0.0.1):
|
- device_info_plus (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- file_saver (0.0.1):
|
- file_saver (0.0.1):
|
||||||
@@ -24,8 +21,6 @@ PODS:
|
|||||||
- local_auth_darwin (0.0.1):
|
- local_auth_darwin (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- objective_c (0.0.1):
|
|
||||||
- FlutterMacOS
|
|
||||||
- OrderedSet (6.0.3)
|
- OrderedSet (6.0.3)
|
||||||
- package_info_plus (0.0.1):
|
- package_info_plus (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
@@ -77,7 +72,6 @@ PODS:
|
|||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`)
|
- app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`)
|
||||||
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin`)
|
- 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`)
|
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
|
||||||
- file_saver (from `Flutter/ephemeral/.symlinks/plugins/file_saver/macos`)
|
- file_saver (from `Flutter/ephemeral/.symlinks/plugins/file_saver/macos`)
|
||||||
- flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/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`)
|
- flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
|
||||||
- FlutterMacOS (from `Flutter/ephemeral`)
|
- FlutterMacOS (from `Flutter/ephemeral`)
|
||||||
- local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`)
|
- 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`)
|
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
|
||||||
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
|
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
|
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
|
||||||
@@ -111,8 +104,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: Flutter/ephemeral/.symlinks/plugins/app_links/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/app_links/macos
|
||||||
connectivity_plus:
|
connectivity_plus:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin
|
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin
|
||||||
cupertino_http:
|
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/cupertino_http/darwin
|
|
||||||
device_info_plus:
|
device_info_plus:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
|
||||||
file_saver:
|
file_saver:
|
||||||
@@ -129,8 +120,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: Flutter/ephemeral
|
:path: Flutter/ephemeral
|
||||||
local_auth_darwin:
|
local_auth_darwin:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin
|
:path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin
|
||||||
objective_c:
|
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/objective_c/macos
|
|
||||||
package_info_plus:
|
package_info_plus:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
@@ -159,7 +148,6 @@ EXTERNAL SOURCES:
|
|||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
app_links: 10e0a0ab602ffaf34d142cd4862f29d34b303b2a
|
app_links: 10e0a0ab602ffaf34d142cd4862f29d34b303b2a
|
||||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||||
cupertino_http: 947a233f40cfea55167a49f2facc18434ea117ba
|
|
||||||
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
||||||
file_saver: 44e6fbf666677faf097302460e214e977fdd977b
|
file_saver: 44e6fbf666677faf097302460e214e977fdd977b
|
||||||
flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b
|
flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b
|
||||||
@@ -168,7 +156,6 @@ SPEC CHECKSUMS:
|
|||||||
flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9
|
flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9
|
||||||
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
||||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||||
objective_c: e5f8194456e8fc943e034d1af00510a1bc29c067
|
|
||||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||||
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
|
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
|
||||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||||
@@ -185,6 +172,6 @@ SPEC CHECKSUMS:
|
|||||||
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
|
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
|
||||||
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
|
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
|
||||||
|
|
||||||
PODFILE CHECKSUM: 6ff827273ace187339fc5d3684072a26ad85c298
|
PODFILE CHECKSUM: f401c31c8f7c5571f6f565c78915d54338812dab
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
|||||||
@@ -428,7 +428,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
@@ -560,7 +560,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
@@ -587,7 +587,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||||
OTHER_CODE_SIGN_FLAGS = "--timestamp";
|
OTHER_CODE_SIGN_FLAGS = "--timestamp";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
|||||||
@@ -250,10 +250,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.19.0"
|
||||||
confetti:
|
confetti:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
name: ente_auth
|
name: ente_auth
|
||||||
description: ente two-factor authenticator
|
description: ente two-factor authenticator
|
||||||
version: 4.3.4+435
|
version: 4.3.2+432
|
||||||
publish_to: none
|
publish_to: none
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
|||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
jni
|
|
||||||
sentry_flutter
|
sentry_flutter
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ente account list
|
|||||||
#### Change export directory
|
#### Change export directory
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
ente account update --app auth/photos --email email@domain.com --dir ~/photos
|
ente account update --email email@domain.com --dir ~/photos
|
||||||
```
|
```
|
||||||
|
|
||||||
### Export
|
### Export
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ func (c *ClICtrl) UpdateFreeStorage(ctx context.Context, params model.AdminActio
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Updating storage for user %s to %s (old %s) with new expiry %s (old %s) \n",
|
fmt.Printf("Updating storage for user %s to %s (old %s) with new expirty %s (old %s) \n",
|
||||||
params.UserEmail,
|
params.UserEmail,
|
||||||
utils.ByteCountDecimalGIB(storageSize), utils.ByteCountDecimalGIB(userDetails.Subscription.Storage),
|
utils.ByteCountDecimalGIB(storageSize), utils.ByteCountDecimalGIB(userDetails.Subscription.Storage),
|
||||||
date.Format("2006-01-02"),
|
date.Format("2006-01-02"),
|
||||||
|
|||||||
@@ -22,9 +22,6 @@ on:
|
|||||||
tags:
|
tags:
|
||||||
- "v[0-9]+.[0-9]+.[0-9]+"
|
- "v[0-9]+.[0-9]+.[0-9]+"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
@@ -52,7 +49,7 @@ jobs:
|
|||||||
- name: Setup node
|
- name: Setup node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 20
|
||||||
|
|
||||||
- name: Increase yarn timeout
|
- name: Increase yarn timeout
|
||||||
# `yarn install` times out sometimes on the Windows runner,
|
# `yarn install` times out sometimes on the Windows runner,
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
|
||||||
## v1.7.12 (Unreleased)
|
## v1.7.11 (Unreleased)
|
||||||
|
|
||||||
- .
|
|
||||||
|
|
||||||
## v1.7.11
|
|
||||||
|
|
||||||
- Improved file viewer.
|
- Improved file viewer.
|
||||||
- Improved live photo experience.
|
- Improved live photo experience.
|
||||||
|
- .
|
||||||
|
|
||||||
## v1.7.10
|
## v1.7.10
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 113 KiB |
|
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 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ente",
|
"name": "ente",
|
||||||
"version": "1.7.12-beta",
|
"version": "1.7.11-beta",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Desktop client for Ente Photos",
|
"description": "Desktop client for Ente Photos",
|
||||||
"repository": "github:ente-io/photos-desktop",
|
"repository": "github:ente-io/photos-desktop",
|
||||||
@@ -27,36 +27,36 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"any-shell-escape": "^0.1.1",
|
"any-shell-escape": "^0.1.1",
|
||||||
"auto-launch": "^5.0.6",
|
"auto-launch": "^5.0.6",
|
||||||
"chokidar": "^4.0.3",
|
"chokidar": "^3.6.0",
|
||||||
"clip-bpe-js": "^0.0.6",
|
"clip-bpe-js": "^0.0.6",
|
||||||
"comlink": "^4.4.2",
|
"comlink": "^4.4.2",
|
||||||
"compare-versions": "^6.1.1",
|
"compare-versions": "^6.1.1",
|
||||||
"electron-log": "^5.3.3",
|
"electron-log": "^5.3.2",
|
||||||
"electron-store": "^8.2.0",
|
"electron-store": "^8.2.0",
|
||||||
"electron-updater": "^6.6.2",
|
"electron-updater": "^6.4.0",
|
||||||
"ffmpeg-static": "^5.2.0",
|
"ffmpeg-static": "^5.2.0",
|
||||||
"lru-cache": "^11.1.0",
|
"lru-cache": "^11.0.2",
|
||||||
"next-electron-server": "^1.0.0",
|
"next-electron-server": "^1.0.0",
|
||||||
"node-stream-zip": "^1.15.0",
|
"node-stream-zip": "^1.15.0",
|
||||||
"onnxruntime-node": "^1.20.1"
|
"onnxruntime-node": "^1.20.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.24.0",
|
"@eslint/js": "^9.21.0",
|
||||||
"@tsconfig/node22": "^22.0.1",
|
"@tsconfig/node20": "^20.1.4",
|
||||||
"@types/auto-launch": "^5.0.5",
|
"@types/auto-launch": "^5.0.5",
|
||||||
"@types/ffmpeg-static": "^3.0.3",
|
"@types/ffmpeg-static": "^3.0.3",
|
||||||
"ajv": "^8.17.1",
|
"ajv": "^8.17.1",
|
||||||
"concurrently": "^9.1.2",
|
"concurrently": "^9.1.2",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"electron": "^35.1.4",
|
"electron": "^34.3.1",
|
||||||
"electron-builder": "^26.0.12",
|
"electron-builder": "^26.0.0",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"prettier": "3.5.3",
|
"prettier": "3.5.3",
|
||||||
"prettier-plugin-organize-imports": "^4.1.0",
|
"prettier-plugin-organize-imports": "^4.1.0",
|
||||||
"prettier-plugin-packagejson": "^2.5.10",
|
"prettier-plugin-packagejson": "^2.5.10",
|
||||||
"shx": "^0.3.4",
|
"shx": "^0.3.4",
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.8.2",
|
||||||
"typescript-eslint": "^8.29.1"
|
"typescript-eslint": "^8.26.0"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@1.22.22",
|
"packageManager": "yarn@1.22.22",
|
||||||
"productName": "ente"
|
"productName": "ente"
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
*
|
*
|
||||||
* Note that `vips.js` would've already run once `beforeBuild.js` is run, but on
|
* Note that `vips.js` would've already run once `beforeBuild.js` is run, but on
|
||||||
* our CI we prepare builds for multiple architectures in one go, so we need to
|
* our CI we prepare builds for multiple architectures in one go, so we need to
|
||||||
* unconditionally replace the binary with the relevant one for the current
|
* unconditonally replace the binary with the relevant one for the current
|
||||||
* architecture being built (which might be different from the one we're running
|
* architecture being built (which might be different from the one we're running
|
||||||
* on). `beforeBuild.js` runs for each architecture being built.
|
* on). `beforeBuild.js` runs for each architecture being built.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ import log, { initLogging } from "./main/log";
|
|||||||
import { createApplicationMenu, createTrayContextMenu } from "./main/menu";
|
import { createApplicationMenu, createTrayContextMenu } from "./main/menu";
|
||||||
import { setupAutoUpdater } from "./main/services/app-update";
|
import { setupAutoUpdater } from "./main/services/app-update";
|
||||||
import autoLauncher from "./main/services/auto-launcher";
|
import autoLauncher from "./main/services/auto-launcher";
|
||||||
import { shouldHideDockIcon } from "./main/services/store";
|
|
||||||
import { createWatcher } from "./main/services/watch";
|
import { createWatcher } from "./main/services/watch";
|
||||||
import { userPreferences } from "./main/stores/user-preferences";
|
import { userPreferences } from "./main/stores/user-preferences";
|
||||||
import { migrateLegacyWatchStoreIfNeeded } from "./main/stores/watch";
|
import { migrateLegacyWatchStoreIfNeeded } from "./main/stores/watch";
|
||||||
@@ -386,8 +385,8 @@ const createMainWindow = () => {
|
|||||||
const wasAutoLaunched = autoLauncher.wasAutoLaunched();
|
const wasAutoLaunched = autoLauncher.wasAutoLaunched();
|
||||||
if (wasAutoLaunched) {
|
if (wasAutoLaunched) {
|
||||||
// Don't automatically show the app's window if we were auto-launched.
|
// Don't automatically show the app's window if we were auto-launched.
|
||||||
// On macOS, also hide the dock icon.
|
// On macOS, also hide the dock icon on macOS.
|
||||||
app.dock?.hide();
|
if (process.platform == "darwin") app.dock.hide();
|
||||||
} else {
|
} else {
|
||||||
// Show our window otherwise, maximizing it if we're not asked to set it
|
// Show our window otherwise, maximizing it if we're not asked to set it
|
||||||
// to a specific size.
|
// to a specific size.
|
||||||
@@ -405,11 +404,10 @@ const createMainWindow = () => {
|
|||||||
// "The unresponsive event is fired when Chromium detects that your
|
// "The unresponsive event is fired when Chromium detects that your
|
||||||
// webContents is not responding to input messages for > 30 seconds."
|
// webContents is not responding to input messages for > 30 seconds."
|
||||||
window.webContents.on("unresponsive", () => {
|
window.webContents.on("unresponsive", () => {
|
||||||
// There is a known case when this can happen: When the user to select a
|
log.error(
|
||||||
// folder to upload (Upload > Folder), the browser callback to us takes
|
"MainWindow's webContents are unresponsive, will restart the renderer process",
|
||||||
// some time. When trying to upload very large folders on slower Windows
|
);
|
||||||
// machines, this can take up to 30 seconds.
|
window.webContents.forcefullyCrashRenderer();
|
||||||
log.warn("MainWindow's webContents are unresponsive");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
window.on("close", (event) => {
|
window.on("close", (event) => {
|
||||||
@@ -422,11 +420,14 @@ const createMainWindow = () => {
|
|||||||
|
|
||||||
window.on("hide", () => {
|
window.on("hide", () => {
|
||||||
// On macOS, when hiding the window also hide the app's icon in the dock
|
// On macOS, when hiding the window also hide the app's icon in the dock
|
||||||
// unless the user has unchecked the Settings > Hide dock icon checkbox.
|
// if the user has selected the Settings > Hide dock icon checkbox.
|
||||||
if (shouldHideDockIcon()) app.dock?.hide();
|
if (process.platform == "darwin" && userPreferences.get("hideDockIcon"))
|
||||||
|
app.dock.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
window.on("show", () => void app.dock?.show());
|
window.on("show", () => {
|
||||||
|
if (process.platform == "darwin") void app.dock.show();
|
||||||
|
});
|
||||||
|
|
||||||
// Let ipcRenderer know when mainWindow is in the foreground so that it can
|
// Let ipcRenderer know when mainWindow is in the foreground so that it can
|
||||||
// in turn inform the renderer process.
|
// in turn inform the renderer process.
|
||||||
@@ -607,7 +608,7 @@ const handleBackOnStripeCheckout = (window: BrowserWindow) =>
|
|||||||
*
|
*
|
||||||
* But this is an issue for uploads in the self hosted apps (or when we
|
* But this is an issue for uploads in the self hosted apps (or when we
|
||||||
* ourselves are trying to test things by with an arbitrary S3 bucket without
|
* ourselves are trying to test things by with an arbitrary S3 bucket without
|
||||||
* going via a worker). During upload, there is no redirection, so the request
|
* going via a worker). During upload, theer is no redirection, so the request
|
||||||
* ACAO is "ente://app" but the response ACAO is `null` which don't match,
|
* ACAO is "ente://app" but the response ACAO is `null` which don't match,
|
||||||
* causing the request to fail.
|
* causing the request to fail.
|
||||||
*
|
*
|
||||||
|
|||||||