diff --git a/.github/assets/github-badge.png b/.github/assets/github-badge.png deleted file mode 100644 index ef3207c95..000000000 Binary files a/.github/assets/github-badge.png and /dev/null differ diff --git a/.github/workflows/auth-release.yml b/.github/workflows/auth-release.yml index 1203bc4a3..cc3e598e3 100644 --- a/.github/workflows/auth-release.yml +++ b/.github/workflows/auth-release.yml @@ -85,7 +85,8 @@ jobs: - name: Install dependencies for desktop build run: | sudo apt-get update -y - sudo apt-get install -y libsecret-1-dev libsodium-dev libwebkit2gtk-4.0-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm libsqlite3-dev locate appindicator3-0.1 libappindicator3-dev + sudo apt-get install -y libsecret-1-dev libsodium-dev libwebkit2gtk-4.0-dev libfuse2 ninja-build libgtk-3-dev dpkg-dev pkg-config rpm libsqlite3-dev locate appindicator3-0.1 libappindicator3-dev libffi-dev libtiff5 + sudo updatedb --localpaths='/usr/lib/x86_64-linux-gnu' - name: Install appimagetool run: | @@ -173,6 +174,9 @@ jobs: - name: Zip Windows EXE and DLLs run: tar.exe -a -c -f artifacts/ente-${{ github.ref_name }}-windows.zip ente-${{ github.ref_name }}-windows + - name: Generate checksums + run: sha256sum artifacts/ente-* > artifacts/sha256sum-windows + - name: Create a draft GitHub release uses: ncipollo/release-action@v1 with: @@ -267,6 +271,9 @@ jobs: APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + - name: Generate checksums + run: shasum -a 256 artifacts/ente-* > artifacts/sha256sum-macos + - name: Create a draft GitHub release uses: ncipollo/release-action@v1 with: diff --git a/.github/workflows/server-publish.yml b/.github/workflows/server-publish.yml index 393fa899d..1ba193517 100644 --- a/.github/workflows/server-publish.yml +++ b/.github/workflows/server-publish.yml @@ -32,6 +32,8 @@ jobs: image: server registry: ghcr.io enableBuildKit: true + multiPlatform: true + platform: linux/amd64,linux/arm64,linux/arm/v7 buildArgs: GIT_COMMIT=${{ inputs.commit }} tags: ${{ inputs.commit }}, latest username: ${{ github.actor }} diff --git a/.github/workflows/web-crowdin.yml b/.github/workflows/web-crowdin.yml index f834e62f3..d98685065 100644 --- a/.github/workflows/web-crowdin.yml +++ b/.github/workflows/web-crowdin.yml @@ -5,7 +5,7 @@ on: branches: [main] paths: # Run workflow when web's en-US/translation.json is changed - - "web/apps/photos/public/locales/en-US/translation.json" + - "web/packages/next/locales/en-US/translation.json" # Or the workflow itself is changed - ".github/workflows/web-crowdin.yml" schedule: diff --git a/.github/workflows/web-deploy-accounts.yml b/.github/workflows/web-deploy-accounts.yml index 8164aea44..61411cac6 100644 --- a/.github/workflows/web-deploy-accounts.yml +++ b/.github/workflows/web-deploy-accounts.yml @@ -24,7 +24,7 @@ jobs: with: node-version: 20 cache: "yarn" - cache-dependency-path: "docs/yarn.lock" + cache-dependency-path: "web/yarn.lock" - name: Install dependencies run: yarn install diff --git a/.github/workflows/web-deploy-auth.yml b/.github/workflows/web-deploy-auth.yml index 63a56b95b..d195b62f8 100644 --- a/.github/workflows/web-deploy-auth.yml +++ b/.github/workflows/web-deploy-auth.yml @@ -24,7 +24,7 @@ jobs: with: node-version: 20 cache: "yarn" - cache-dependency-path: "docs/yarn.lock" + cache-dependency-path: "web/yarn.lock" - name: Install dependencies run: yarn install diff --git a/.github/workflows/web-deploy-cast.yml b/.github/workflows/web-deploy-cast.yml index be4861c71..c5bbca954 100644 --- a/.github/workflows/web-deploy-cast.yml +++ b/.github/workflows/web-deploy-cast.yml @@ -24,7 +24,7 @@ jobs: with: node-version: 20 cache: "yarn" - cache-dependency-path: "docs/yarn.lock" + cache-dependency-path: "web/yarn.lock" - name: Install dependencies run: yarn install diff --git a/.github/workflows/web-deploy-payments.yml b/.github/workflows/web-deploy-payments.yml new file mode 100644 index 000000000..367e1db18 --- /dev/null +++ b/.github/workflows/web-deploy-payments.yml @@ -0,0 +1,43 @@ +name: "Deploy (payments)" + +on: + push: + # Run workflow on pushes to the deploy/payments + branches: [deploy/payments] + +jobs: + deploy: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: web + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup node and enable yarn caching + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "yarn" + cache-dependency-path: "web/yarn.lock" + + - name: Install dependencies + run: yarn install + + - name: Build payments + run: yarn build:payments + + - name: Publish payments + uses: cloudflare/pages-action@1 + with: + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + projectName: ente + branch: deploy/payments + directory: web/apps/payments/dist + wranglerVersion: "3" diff --git a/.github/workflows/web-deploy-photos.yml b/.github/workflows/web-deploy-photos.yml index 64a88421d..cb3a9db86 100644 --- a/.github/workflows/web-deploy-photos.yml +++ b/.github/workflows/web-deploy-photos.yml @@ -24,7 +24,7 @@ jobs: with: node-version: 20 cache: "yarn" - cache-dependency-path: "docs/yarn.lock" + cache-dependency-path: "web/yarn.lock" - name: Install dependencies run: yarn install diff --git a/.github/workflows/web-deploy-staff.yml b/.github/workflows/web-deploy-staff.yml new file mode 100644 index 000000000..4d386344d --- /dev/null +++ b/.github/workflows/web-deploy-staff.yml @@ -0,0 +1,48 @@ +name: "Deploy (staff)" + +on: + # Run on every push to main that changes web/apps/staff/ + push: + branches: [main] + paths: + - "web/apps/staff/**" + - ".github/workflows/web-deploy-staff.yml" + # Also allow manually running the workflow + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: web + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup node and enable yarn caching + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "yarn" + cache-dependency-path: "web/yarn.lock" + + - name: Install dependencies + run: yarn install + + - name: Build staff + run: yarn build:staff + + - name: Publish staff + uses: cloudflare/pages-action@1 + with: + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + projectName: ente + branch: deploy/staff + directory: web/apps/staff/dist + wranglerVersion: "3" diff --git a/.github/workflows/web-nightly.yml b/.github/workflows/web-nightly.yml index a800a4b73..949738292 100644 --- a/.github/workflows/web-nightly.yml +++ b/.github/workflows/web-nightly.yml @@ -34,7 +34,7 @@ jobs: with: node-version: 20 cache: "yarn" - cache-dependency-path: "docs/yarn.lock" + cache-dependency-path: "web/yarn.lock" - name: Install dependencies run: yarn install @@ -78,6 +78,19 @@ jobs: directory: web/apps/cast/out wranglerVersion: "3" + - name: Build payments + run: yarn build:payments + + - name: Publish payments + uses: cloudflare/pages-action@1 + with: + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + projectName: ente + branch: n-payments + directory: web/apps/payments/dist + wranglerVersion: "3" + - name: Build photos run: yarn build:photos env: diff --git a/.github/workflows/web-preview.yml b/.github/workflows/web-preview.yml index 4e86d9a81..8f39c0247 100644 --- a/.github/workflows/web-preview.yml +++ b/.github/workflows/web-preview.yml @@ -12,6 +12,7 @@ on: - "accounts" - "auth" - "cast" + - "payments" - "photos" jobs: @@ -33,7 +34,7 @@ jobs: with: node-version: 20 cache: "yarn" - cache-dependency-path: "docs/yarn.lock" + cache-dependency-path: "web/yarn.lock" - name: Install dependencies run: yarn install diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5042b6712..857e18fb5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -59,7 +59,10 @@ See [docs/](docs/README.md) for how to edit these documents. ## Code contributions -If you'd like to contribute code, it is best to start small. +Code is a small aspect of community, and the ways mentioned above are more +important in helping us. But if you'd _really_ like to contribute code, it is +best to start small. Consider some well-scoped changes, say like adding more +[custom icons to auth](auth/docs/adding-icons.md). Each of the individual product/platform specific directories in this repository have instructions on setting up a dev environment and making changes. The issues diff --git a/README.md b/README.md index 68632ea3b..88488d11c 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ existing users will be grandfathered in. [](https://apps.apple.com/app/id6444121398) [](https://play.google.com/store/apps/details?id=io.ente.auth) [](https://f-droid.org/packages/io.ente.auth/) -[](https://github.com/ente-io/ente/releases?q=tag%3Aauth-v2) +[](https://github.com/ente-io/ente/releases?q=tag%3Aauth-v2) [](https://auth.ente.io) diff --git a/auth/README.md b/auth/README.md index 71ae1f93b..e2e03f023 100644 --- a/auth/README.md +++ b/auth/README.md @@ -31,14 +31,16 @@ You can alternatively install the build from PlayStore or F-Droid. +### Desktop + +You can [**download**](https://github.com/ente-io/ente/releases?q=tag%3Aauth-v2) +a native desktop app from this repository's GitHub releases. The desktop app +works on Windows, Linux and macOS. + ### Web You can view your 2FA codes at [auth.ente.io](https://auth.ente.io). For adding -or managing your secrets, please use our mobile app. - -### Desktop - -A native desktop app is coming soon! +or managing your secrets, please use our mobile or desktop app. ## 🧑‍💻 Build from source diff --git a/auth/android/app/src/main/play/listings/en-US/full_description.txt b/auth/android/app/src/main/play/listings/en-US/full_description.txt new file mode 100644 index 000000000..8f575bda0 --- /dev/null +++ b/auth/android/app/src/main/play/listings/en-US/full_description.txt @@ -0,0 +1,40 @@ +Ente Auth helps you generate and store 2 step verification (2FA) +tokens on your mobile devices. + + +FEATURES + +- Secure Backups +Auth provides end-to-end encrypted cloud backups so that you don't have to worry +about losing your tokens. We use the same protocols ente Photos uses to encrypt +and preserve your data. + +- Multi Device Synchronization +Auth will automatically sync the 2FA tokens you add to your account, across all +your devices. Every new device you sign into will have access to these tokens. + +- Web access +You can access your 2FA code from any web browser by visiting https://auth.ente.io . + +- Offline Mode +Auth generates 2FA tokens offline, so your network connectivity will not get in +the way of your workflow. + +- Import and Export Tokens +You can add tokens to Auth by one of the following methods: +1. Scanning a QR code +2. Manually entering (copy-pasting) a 2FA secret +3. Bulk importing from a file that contains a list of codes in the following format: + +otpauth://totp/provider.com:you@email.com?secret=YOUR_SECRET + +The codes maybe separated by new lines or commas. + +You can also export the codes you have added to Auth, to an **unencrypted** text +file, that adheres to the above format. + + +SUPPORT + +If you need help, please reach out to support@ente.io, and a human will get in touch with you. +If you have feature requests, please create an issue @ https://github.com/ente-io/ente diff --git a/auth/android/app/src/main/play/listings/en-US/graphics/icon/icon.png b/auth/android/app/src/main/play/listings/en-US/graphics/icon/icon.png new file mode 100644 index 000000000..043b944f3 Binary files /dev/null and b/auth/android/app/src/main/play/listings/en-US/graphics/icon/icon.png differ diff --git a/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png new file mode 100644 index 000000000..e87d3a124 Binary files /dev/null and b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png differ diff --git a/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png new file mode 100644 index 000000000..9a700ea18 Binary files /dev/null and b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png differ diff --git a/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png new file mode 100644 index 000000000..64e992821 Binary files /dev/null and b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png differ diff --git a/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png new file mode 100644 index 000000000..88d5ec3ad Binary files /dev/null and b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png differ diff --git a/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png new file mode 100644 index 000000000..f2825d0b4 Binary files /dev/null and b/auth/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png differ diff --git a/auth/android/app/src/main/play/listings/en-US/short_description.txt b/auth/android/app/src/main/play/listings/en-US/short_description.txt new file mode 100644 index 000000000..92b9c58f1 --- /dev/null +++ b/auth/android/app/src/main/play/listings/en-US/short_description.txt @@ -0,0 +1 @@ +Auth is a FOSS authenticator app that provides end-to-end encrypted backups for your 2FA secrets. \ No newline at end of file diff --git a/auth/android/app/src/main/play/listings/en-US/title.txt b/auth/android/app/src/main/play/listings/en-US/title.txt new file mode 100644 index 000000000..b052b835d --- /dev/null +++ b/auth/android/app/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +Ente Auth \ No newline at end of file diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index b38179e97..3e8f8ce67 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -36,7 +36,9 @@ }, { "title": "BorgBase", - "altNames": ["borg"], + "altNames": [ + "borg" + ], "slug": "BorgBase" }, { @@ -46,11 +48,17 @@ { "title": "Bybit" }, + { + "title": "CERN" + }, { "title": "Channel Island Hosting", "slug": "cih", "hex": "D14633" }, + { + "title": "ConfigCat" + }, { "title": "Cloudflare" }, @@ -64,7 +72,9 @@ }, { "title": "DCS", - "altNames": ["Digital Combat Simulator"], + "altNames": [ + "Digital Combat Simulator" + ], "slug": "dcs" }, { @@ -112,9 +122,14 @@ }, { "title": "Gosuslugi", - "altNames": ["Госуслуги"], + "altNames": [ + "Госуслуги" + ], "slug": "Gosuslugi" }, + { + "title": "Habbo" + }, { "title": "Healthchecks.io", "slug": "healthchecks" @@ -177,13 +192,24 @@ }, { "title": "Mastodon", - "altNames": ["mstdn", "fediscience", "mathstodon", "fosstodon"], + "altNames": [ + "mstdn", + "fediscience", + "mathstodon", + "fosstodon" + ], "slug": "mastodon", "hex": "6364FF" }, + { + "title": "Mercado Livre", + "slug": "mercado_livre" + }, { "title": "Murena", - "altNames": ["eCloud"], + "altNames": [ + "eCloud" + ], "slug": "ecloud" }, { @@ -281,6 +307,9 @@ "slug": "rust_language_forum", "hex": "000000" }, + { + "title": "Sendgrid" + }, { "title": "service-bw" }, @@ -371,13 +400,18 @@ }, { "title": "X", - "altNames": ["twitter"], + "altNames": [ + "twitter" + ], "slug": "x" }, { "title": "Yandex", - "altNames": ["Ya", "Яндекс"], + "altNames": [ + "Ya", + "Яндекс" + ], "slug": "Yandex" } ] -} +} \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/CERN.svg b/auth/assets/custom-icons/icons/CERN.svg new file mode 100644 index 000000000..0e4b82e1f --- /dev/null +++ b/auth/assets/custom-icons/icons/CERN.svg @@ -0,0 +1,47 @@ + + + + + + diff --git a/auth/assets/custom-icons/icons/configcat.svg b/auth/assets/custom-icons/icons/configcat.svg new file mode 100644 index 000000000..cfecd22b0 --- /dev/null +++ b/auth/assets/custom-icons/icons/configcat.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/habbo.svg b/auth/assets/custom-icons/icons/habbo.svg new file mode 100644 index 000000000..746bcdb22 --- /dev/null +++ b/auth/assets/custom-icons/icons/habbo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/mercado_livre.svg b/auth/assets/custom-icons/icons/mercado_livre.svg new file mode 100644 index 000000000..7f4db5fd5 --- /dev/null +++ b/auth/assets/custom-icons/icons/mercado_livre.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/sendgrid.svg b/auth/assets/custom-icons/icons/sendgrid.svg new file mode 100644 index 000000000..1562adab9 --- /dev/null +++ b/auth/assets/custom-icons/icons/sendgrid.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/auth/assets/icon-light-adaptive-fg.png b/auth/assets/generation-icons/icon-light-adaptive-fg.png similarity index 100% rename from auth/assets/icon-light-adaptive-fg.png rename to auth/assets/generation-icons/icon-light-adaptive-fg.png diff --git a/auth/assets/icon-light.png b/auth/assets/generation-icons/icon-light.png similarity index 100% rename from auth/assets/icon-light.png rename to auth/assets/generation-icons/icon-light.png diff --git a/auth/assets/icon-light.ico b/auth/assets/icon-light.ico deleted file mode 100644 index 6f45f522b..000000000 Binary files a/auth/assets/icon-light.ico and /dev/null differ diff --git a/auth/assets/icons/auth-icon.ico b/auth/assets/icons/auth-icon.ico new file mode 100644 index 000000000..38bb22bcf Binary files /dev/null and b/auth/assets/icons/auth-icon.ico differ diff --git a/auth/assets/icon/auth-icon.png b/auth/assets/icons/auth-icon.png similarity index 100% rename from auth/assets/icon/auth-icon.png rename to auth/assets/icons/auth-icon.png diff --git a/auth/fastlane/metadata/android/en-US/title.txt b/auth/fastlane/metadata/android/en-US/title.txt index f1c54762a..257e3ddcc 100644 --- a/auth/fastlane/metadata/android/en-US/title.txt +++ b/auth/fastlane/metadata/android/en-US/title.txt @@ -1 +1 @@ -ente Authenticator \ No newline at end of file +Ente Authenticator \ No newline at end of file diff --git a/auth/fdroid_flutter_icons.yaml b/auth/fdroid_flutter_icons.yaml index da327160a..0ef87effd 100644 --- a/auth/fdroid_flutter_icons.yaml +++ b/auth/fdroid_flutter_icons.yaml @@ -1,6 +1,6 @@ -flutter_icons: - android: "launcher_icon" - image_path: "assets/icon-light.png" - adaptive_icon_foreground: "assets/icon-light-adaptive-fg.png" - adaptive_icon_background: "#ffffff" - +flutter_icons: + android: "launcher_icon" + image_path: "assets/generation-icons/icon-light.png" + adaptive_icon_foreground: "assets/generation-icons/icon-light-adaptive-fg.png" + adaptive_icon_background: "#ffffff" + diff --git a/auth/ios/Podfile.lock b/auth/ios/Podfile.lock index aec7e14f0..7d02d123b 100644 --- a/auth/ios/Podfile.lock +++ b/auth/ios/Podfile.lock @@ -67,8 +67,6 @@ PODS: - Toast - local_auth_darwin (0.0.1): - Flutter - - local_auth_ios (0.0.1): - - Flutter - move_to_background (0.0.1): - Flutter - MTBBarcodeScanner (5.0.11) @@ -99,8 +97,6 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - smart_auth (0.0.1): - - Flutter - sodium_libs (2.2.1): - Flutter - sqflite (0.0.3): @@ -142,7 +138,6 @@ DEPENDENCIES: - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - - local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`) - move_to_background (from `.symlinks/plugins/move_to_background/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) @@ -151,7 +146,6 @@ DEPENDENCIES: - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - smart_auth (from `.symlinks/plugins/smart_auth/ios`) - sodium_libs (from `.symlinks/plugins/sodium_libs/ios`) - sqflite (from `.symlinks/plugins/sqflite/darwin`) - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`) @@ -202,8 +196,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/fluttertoast/ios" local_auth_darwin: :path: ".symlinks/plugins/local_auth_darwin/darwin" - local_auth_ios: - :path: ".symlinks/plugins/local_auth_ios/ios" move_to_background: :path: ".symlinks/plugins/move_to_background/ios" package_info_plus: @@ -220,8 +212,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/share_plus/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - smart_auth: - :path: ".symlinks/plugins/smart_auth/ios" sodium_libs: :path: ".symlinks/plugins/sodium_libs/ios" sqflite: @@ -245,11 +235,10 @@ SPEC CHECKSUMS: flutter_inappwebview_ios: 97215cf7d4677db55df76782dbd2930c5e1c1ea0 flutter_local_authentication: 1172a4dd88f6306dadce067454e2c4caf07977bb flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 - flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef + flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778 flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265 local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 - local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9 move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c @@ -264,7 +253,6 @@ SPEC CHECKSUMS: SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 - smart_auth: 4bedbc118723912d0e45a07e8ab34039c19e04f2 sodium_libs: 1faae17af662384acbd13e41867a0008cd2e2318 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqlite3: 73b7fc691fdc43277614250e04d183740cb15078 diff --git a/auth/ios/Runner.xcodeproj/project.pbxproj b/auth/ios/Runner.xcodeproj/project.pbxproj index 4d77182b0..b60012aa8 100644 --- a/auth/ios/Runner.xcodeproj/project.pbxproj +++ b/auth/ios/Runner.xcodeproj/project.pbxproj @@ -365,7 +365,7 @@ DEVELOPMENT_TEAM = 6Z68YJY9Q2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = auth; + INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -439,7 +439,7 @@ DEVELOPMENT_TEAM = 6Z68YJY9Q2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = auth; + INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -513,7 +513,7 @@ DEVELOPMENT_TEAM = 6Z68YJY9Q2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = auth; + INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -587,7 +587,7 @@ DEVELOPMENT_TEAM = 6Z68YJY9Q2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = auth; + INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -661,7 +661,7 @@ DEVELOPMENT_TEAM = 6Z68YJY9Q2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = auth; + INFOPLIST_KEY_CFBundleDisplayName = "Ente Auth"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/auth/lib/app/view/app.dart b/auth/lib/app/view/app.dart index 2ca5e4b3e..3bd9d4e73 100644 --- a/auth/lib/app/view/app.dart +++ b/auth/lib/app/view/app.dart @@ -18,7 +18,7 @@ import 'package:ente_auth/ui/settings/app_update_dialog.dart'; import 'package:flutter/foundation.dart'; import "package:flutter/material.dart"; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:system_tray/system_tray.dart'; +import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; class App extends StatefulWidget { @@ -34,7 +34,7 @@ class App extends StatefulWidget { State createState() => _AppState(); } -class _AppState extends State with WindowListener { +class _AppState extends State with WindowListener, TrayListener { late StreamSubscription _signedOutEvent; late StreamSubscription _signedInEvent; Locale? locale; @@ -46,12 +46,17 @@ class _AppState extends State with WindowListener { Future initWindowManager() async { windowManager.addListener(this); - await windowManager.setPreventClose(true); + } + + Future initTrayManager() async { + trayManager.addListener(this); } @override void initState() { initWindowManager(); + initTrayManager(); + _signedOutEvent = Bus.instance.on().listen((event) { if (mounted) { setState(() {}); @@ -85,7 +90,10 @@ class _AppState extends State with WindowListener { @override void dispose() { super.dispose(); + windowManager.removeListener(this); + trayManager.removeListener(this); + _signedOutEvent.cancel(); _signedInEvent.cancel(); } @@ -145,14 +153,44 @@ class _AppState extends State with WindowListener { }; } - @override - void onWindowClose() async { - final AppWindow appWindow = AppWindow(); - await appWindow.hide(); - } - @override void onWindowResize() { WindowListenerService.instance.onWindowResize().ignore(); } + + @override + void onTrayIconMouseDown() { + if (Platform.isWindows) { + windowManager.show(); + } else { + trayManager.popUpContextMenu(); + } + } + + @override + void onTrayIconRightMouseDown() { + if (Platform.isWindows) { + trayManager.popUpContextMenu(); + } else { + windowManager.show(); + } + } + + @override + void onTrayIconRightMouseUp() {} + + @override + void onTrayMenuItemClick(MenuItem menuItem) { + switch (menuItem.key) { + case 'hide_window': + windowManager.hide(); + break; + case 'show_window': + windowManager.show(); + break; + case 'exit_app': + windowManager.close(); + break; + } + } } diff --git a/auth/lib/l10n/arb/app_en.arb b/auth/lib/l10n/arb/app_en.arb index a2f6e77ed..e16a39c79 100644 --- a/auth/lib/l10n/arb/app_en.arb +++ b/auth/lib/l10n/arb/app_en.arb @@ -78,14 +78,14 @@ "data": "Data", "importCodes": "Import codes", "importTypePlainText": "Plain text", - "importTypeEnteEncrypted": "ente Encrypted export", + "importTypeEnteEncrypted": "Ente Encrypted export", "passwordForDecryptingExport": "Password to decrypt export", "passwordEmptyError": "Password can not be empty", "importFromApp": "Import codes from {appName}", "importGoogleAuthGuide": "Export your accounts from Google Authenticator to a QR code using the \"Transfer Accounts\" option. Then using another device, scan the QR code.\n\nTip: You can use your laptop's webcam to take a picture of the QR code.", "importSelectJsonFile": "Select JSON file", "importSelectAppExport": "Select {appName} export file", - "importEnteEncGuide": "Select the encrypted JSON file exported from ente", + "importEnteEncGuide": "Select the encrypted JSON file exported from Ente", "importRaivoGuide": "Use the \"Export OTPs to Zip archive\" option in Raivo's Settings.\n\nExtract the zip file and import the JSON file.", "importBitwardenGuide": "Use the \"Export vault\" option within Bitwarden Tools and import the unencrypted JSON file.", "importAegisGuide": "Use the \"Export the vault\" option in Aegis's Settings.\n\nIf your vault is encrypted, you will need to enter vault password to decrypt the vault.", @@ -115,22 +115,22 @@ "copied": "Copied", "pleaseTryAgain": "Please try again", "existingUser": "Existing User", - "newUser": "New to ente", + "newUser": "New to Ente", "delete": "Delete", "enterYourPasswordHint": "Enter your password", "forgotPassword": "Forgot password", "oops": "Oops", "suggestFeatures": "Suggest features", "faq": "FAQ", - "faq_q_1": "How secure is ente Auth?", - "faq_a_1": "All codes you backup via ente is stored end-to-end encrypted. This means only you can access your codes. Our apps are open source and our cryptography has been externally audited.", + "faq_q_1": "How secure is Auth?", + "faq_a_1": "All codes you backup via Auth is stored end-to-end encrypted. This means only you can access your codes. Our apps are open source and our cryptography has been externally audited.", "faq_q_2": "Can I access my codes on desktop?", "faq_a_2": "You can access your codes on the web @ auth.ente.io.", "faq_q_3": "How can I delete codes?", "faq_a_3": "You can delete a code by swiping left on that item.", "faq_q_4": "How can I support this project?", "faq_a_4": "You can support the development of this project by subscribing to our Photos app @ ente.io.", - "faq_q_5": "How can I enable FaceID lock in ente Auth", + "faq_q_5": "How can I enable FaceID lock in Auth", "faq_a_5": "You can enable FaceID lock under Settings → Security → Lockscreen.", "somethingWentWrongMessage": "Something went wrong, please try again", "leaveFamily": "Leave family", @@ -350,7 +350,7 @@ "deleteCodeAuthMessage": "Authenticate to delete code", "showQRAuthMessage": "Authenticate to show QR code", "confirmAccountDeleteTitle": "Confirm account deletion", - "confirmAccountDeleteMessage": "This account is linked to other ente apps, if you use any.\n\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted.", + "confirmAccountDeleteMessage": "This account is linked to other Ente apps, if you use any.\n\nYour uploaded data, across all Ente apps, will be scheduled for deletion, and your account will be permanently deleted.", "androidBiometricHint": "Verify identity", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." diff --git a/auth/lib/main.dart b/auth/lib/main.dart index 3514472f5..09b85d8b3 100644 --- a/auth/lib/main.dart +++ b/auth/lib/main.dart @@ -31,42 +31,34 @@ import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; import 'package:privacy_screen/privacy_screen.dart'; -import 'package:system_tray/system_tray.dart'; +import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; final _logger = Logger("main"); Future initSystemTray() async { - String path = - Platform.isWindows ? 'assets/icon-light.ico' : 'assets/icon-light.png'; - - final AppWindow appWindow = AppWindow(); - final SystemTray systemTray = SystemTray(); - - // We first init the systray menu - await systemTray.initSystemTray( - title: "", - iconPath: path, + String path = Platform.isWindows + ? 'assets/icons/auth-icon.ico' + : 'assets/icons/auth-icon.png'; + await trayManager.setIcon(path); + Menu menu = Menu( + items: [ + MenuItem( + key: 'hide_window', + label: 'Hide Window', + ), + MenuItem( + key: 'show_window', + label: 'Show Window', + ), + MenuItem.separator(), + MenuItem( + key: 'exit_app', + label: 'Exit App', + ), + ], ); - - // create context menu - final show = MenuItem(label: 'Show', onClicked: () => appWindow.show()); - final hide = MenuItem(label: 'Hide', onClicked: () => appWindow.hide()); - final exit = MenuItem(label: 'Exit', onClicked: () => appWindow.close()); - - // set context menu - await systemTray.setContextMenu([show, hide, exit]); - - const kSystemTrayEventClick = 'leftMouseDown'; - const kSystemTrayEventRightClick = 'rightMouseDown'; - // // handle system tray event - systemTray.registerSystemTrayEventHandler((eventName) { - if (eventName == kSystemTrayEventClick) { - Platform.isWindows ? appWindow.show() : systemTray.popUpContextMenu(); - } else if (eventName == kSystemTrayEventRightClick) { - Platform.isWindows ? systemTray.popUpContextMenu() : appWindow.show(); - } - }); + await trayManager.setContextMenu(menu); } void main() async { diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index 0a74ad1ce..f97e865ec 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -17,8 +17,8 @@ import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/platform_util.dart'; import 'package:ente_auth/utils/toast_util.dart'; import 'package:ente_auth/utils/totp_util.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:logging/logging.dart'; import 'package:move_to_background/move_to_background.dart'; @@ -86,108 +86,122 @@ class _CodeWidgetState extends State { final l10n = context.l10n; return Container( margin: const EdgeInsets.only(left: 16, right: 16, bottom: 8, top: 8), - child: Slidable( - key: ValueKey(widget.code.hashCode), - endActionPane: ActionPane( - extentRatio: 0.60, - motion: const ScrollMotion(), - children: [ - const SizedBox( - width: 4, - ), - SlidableAction( - onPressed: _onShowQrPressed, - backgroundColor: Colors.grey.withOpacity(0.1), - borderRadius: const BorderRadius.all(Radius.circular(12.0)), - foregroundColor: - Theme.of(context).colorScheme.inverseBackgroundColor, - icon: Icons.qr_code_2_outlined, - label: "QR", - padding: const EdgeInsets.only(left: 4, right: 0), - spacing: 8, - ), - const SizedBox( - width: 4, - ), - SlidableAction( - onPressed: _onEditPressed, - backgroundColor: Colors.grey.withOpacity(0.1), - borderRadius: const BorderRadius.all(Radius.circular(12.0)), - foregroundColor: - Theme.of(context).colorScheme.inverseBackgroundColor, - icon: Icons.edit_outlined, - label: l10n.edit, - padding: const EdgeInsets.only(left: 4, right: 0), - spacing: 8, - ), - const SizedBox( - width: 4, - ), - SlidableAction( - onPressed: _onDeletePressed, - backgroundColor: Colors.grey.withOpacity(0.1), - borderRadius: const BorderRadius.all(Radius.circular(12.0)), - foregroundColor: const Color(0xFFFE4A49), - icon: Icons.delete, - label: l10n.delete, - padding: const EdgeInsets.only(left: 0, right: 0), - spacing: 8, - ), - ], - ), - child: Builder( - builder: (context) { - return RawGestureDetector( - gestures: { - PanGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => PanGestureRecognizer( - debugOwner: this, - // This recognizer accepts any button press made with a secondary button. - allowedButtonsFilter: (int buttons) => - buttons & kSecondaryButton != 0, + child: Builder( + builder: (context) { + if (PlatformUtil.isDesktop()) { + return ContextMenuRegion( + contextMenu: ContextMenu( + entries: [ + MenuItem( + label: 'QR', + icon: Icons.qr_code_2_outlined, + onSelected: () => _onShowQrPressed(null), ), - (PanGestureRecognizer instance) { - instance - ..dragStartBehavior = DragStartBehavior.down - ..onEnd = (DragEndDetails details) { - Slidable.of(context)?.openEndActionPane(); - }; - }, - ), - }, - child: ClipRRect( - borderRadius: BorderRadius.circular(8), - child: Container( - color: Theme.of(context).colorScheme.codeCardBackgroundColor, - child: Material( - color: Colors.transparent, - child: InkWell( - customBorder: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - onTap: () { - _copyCurrentOTPToClipboard(); - }, - onDoubleTap: isMaskingEnabled - ? () { - setState( - () { - _hideCode = !_hideCode; - }, - ); - } - : null, - onLongPress: () { - _copyCurrentOTPToClipboard(); - }, - child: _getCardContents(l10n), - ), + MenuItem( + label: l10n.edit, + icon: Icons.edit, + onSelected: () => _onEditPressed(null), ), - ), + const MenuDivider(), + MenuItem( + label: l10n.delete, + value: "Delete", + icon: Icons.delete, + onSelected: () => _onDeletePressed(null), + ), + ], + padding: const EdgeInsets.all(8.0), ), + child: _clippedCard(l10n), ); - }, + } + + return Slidable( + key: ValueKey(widget.code.hashCode), + endActionPane: ActionPane( + extentRatio: 0.60, + motion: const ScrollMotion(), + children: [ + const SizedBox( + width: 4, + ), + SlidableAction( + onPressed: _onShowQrPressed, + backgroundColor: Colors.grey.withOpacity(0.1), + borderRadius: const BorderRadius.all(Radius.circular(12.0)), + foregroundColor: + Theme.of(context).colorScheme.inverseBackgroundColor, + icon: Icons.qr_code_2_outlined, + label: "QR", + padding: const EdgeInsets.only(left: 4, right: 0), + spacing: 8, + ), + const SizedBox( + width: 4, + ), + SlidableAction( + onPressed: _onEditPressed, + backgroundColor: Colors.grey.withOpacity(0.1), + borderRadius: const BorderRadius.all(Radius.circular(12.0)), + foregroundColor: + Theme.of(context).colorScheme.inverseBackgroundColor, + icon: Icons.edit_outlined, + label: l10n.edit, + padding: const EdgeInsets.only(left: 4, right: 0), + spacing: 8, + ), + const SizedBox( + width: 4, + ), + SlidableAction( + onPressed: _onDeletePressed, + backgroundColor: Colors.grey.withOpacity(0.1), + borderRadius: const BorderRadius.all(Radius.circular(12.0)), + foregroundColor: const Color(0xFFFE4A49), + icon: Icons.delete, + label: l10n.delete, + padding: const EdgeInsets.only(left: 0, right: 0), + spacing: 8, + ), + ], + ), + child: Builder( + builder: (context) => _clippedCard(l10n), + ), + ); + }, + ), + ); + } + + Widget _clippedCard(AppLocalizations l10n) { + return ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Container( + color: Theme.of(context).colorScheme.codeCardBackgroundColor, + child: Material( + color: Colors.transparent, + child: InkWell( + customBorder: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + onTap: () { + _copyCurrentOTPToClipboard(); + }, + onDoubleTap: isMaskingEnabled + ? () { + setState( + () { + _hideCode = !_hideCode; + }, + ); + } + : null, + onLongPress: () { + _copyCurrentOTPToClipboard(); + }, + child: _getCardContents(l10n), + ), ), ), ); diff --git a/auth/lib/ui/home_page.dart b/auth/lib/ui/home_page.dart index 76cc8d4dc..ead979d7d 100644 --- a/auth/lib/ui/home_page.dart +++ b/auth/lib/ui/home_page.dart @@ -93,12 +93,22 @@ class _HomePageState extends State { void _applyFilteringAndRefresh() { if (_searchText.isNotEmpty && _showSearchBox) { final String val = _searchText.toLowerCase(); - _filteredCodes = _codes - .where( - (element) => (element.account.toLowerCase().contains(val) || - element.issuer.toLowerCase().contains(val)), - ) - .toList(); + // Prioritize issuer match above account for better UX while searching + // for a specific TOTP for email providers. Searching for "emailProvider" like (gmail, proton) should + // show the email provider first instead of other accounts where protonmail + // is the account name. + final List issuerMatch = []; + final List accountMatch = []; + + for (final Code code in _codes) { + if (code.issuer.toLowerCase().contains(val)) { + issuerMatch.add(code); + } else if (code.account.toLowerCase().contains(val)) { + accountMatch.add(code); + } + } + _filteredCodes = issuerMatch; + _filteredCodes.addAll(accountMatch); } else { _filteredCodes = _codes; } @@ -180,7 +190,7 @@ class _HomePageState extends State { resizeToAvoidBottomInset: false, appBar: AppBar( title: !_showSearchBox - ? const Text('ente Auth') + ? const Text('Ente Auth') : TextField( autofocus: _searchText.isEmpty, controller: _textController, diff --git a/auth/lib/ui/settings/data/import/encrypted_ente_import.dart b/auth/lib/ui/settings/data/import/encrypted_ente_import.dart index 0cba96056..511c9bbf9 100644 --- a/auth/lib/ui/settings/data/import/encrypted_ente_import.dart +++ b/auth/lib/ui/settings/data/import/encrypted_ente_import.dart @@ -24,7 +24,7 @@ Future showEncryptedImportInstruction(BuildContext context) async { final l10n = context.l10n; final result = await showDialogWidget( context: context, - title: l10n.importFromApp("ente Auth"), + title: l10n.importFromApp("Ente Auth"), body: l10n.importEnteEncGuide, buttons: [ ButtonWidget( diff --git a/auth/lib/ui/two_factor_authentication_page.dart b/auth/lib/ui/two_factor_authentication_page.dart index 58a462286..068f4255d 100644 --- a/auth/lib/ui/two_factor_authentication_page.dart +++ b/auth/lib/ui/two_factor_authentication_page.dart @@ -4,8 +4,7 @@ import 'package:ente_auth/services/user_service.dart'; import 'package:ente_auth/ui/lifecycle_event_handler.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -import 'package:pinput/pinput.dart'; +import 'package:pinput/pin_put/pin_put.dart'; class TwoFactorAuthenticationPage extends StatefulWidget { final String sessionID; @@ -20,6 +19,10 @@ class TwoFactorAuthenticationPage extends StatefulWidget { class _TwoFactorAuthenticationPageState extends State { final _pinController = TextEditingController(); + final _pinPutDecoration = BoxDecoration( + border: Border.all(color: const Color.fromRGBO(45, 194, 98, 1.0)), + borderRadius: BorderRadius.circular(15.0), + ); String _code = ""; late LifecycleEventHandler _lifecycleEventHandler; @@ -60,16 +63,6 @@ class _TwoFactorAuthenticationPageState Widget _getBody() { final l10n = context.l10n; - final pinPutDecoration = BoxDecoration( - border: Border.all( - color: Theme.of(context) - .inputDecorationTheme - .focusedBorder! - .borderSide - .color, - ), - borderRadius: BorderRadius.circular(15.0), - ); return Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.center, @@ -86,31 +79,32 @@ class _TwoFactorAuthenticationPageState const Padding(padding: EdgeInsets.all(32)), Padding( padding: const EdgeInsets.fromLTRB(40, 0, 40, 0), - child: Pinput( - onSubmitted: (String code) { + child: PinPut( + fieldsCount: 6, + onSubmit: (String code) { _verifyTwoFactorCode(code); }, - length: 6, - defaultPinTheme: const PinTheme(), - submittedPinTheme: PinTheme( - decoration: pinPutDecoration.copyWith( - borderRadius: BorderRadius.circular(20.0), - ), - ), - focusedPinTheme: PinTheme( - decoration: pinPutDecoration, - ), - followingPinTheme: PinTheme( - decoration: pinPutDecoration.copyWith( - borderRadius: BorderRadius.circular(5.0), - ), - ), onChanged: (String pin) { setState(() { _code = pin; }); }, controller: _pinController, + submittedFieldDecoration: _pinPutDecoration.copyWith( + borderRadius: BorderRadius.circular(20.0), + ), + selectedFieldDecoration: _pinPutDecoration, + followingFieldDecoration: _pinPutDecoration.copyWith( + borderRadius: BorderRadius.circular(5.0), + border: Border.all( + color: const Color.fromRGBO(45, 194, 98, 0.5), + ), + ), + inputDecoration: const InputDecoration( + focusedBorder: InputBorder.none, + border: InputBorder.none, + counterText: '', + ), autofocus: true, ), ), diff --git a/auth/lib/utils/auth_util.dart b/auth/lib/utils/auth_util.dart index b543b4c73..c2d2f5afa 100644 --- a/auth/lib/utils/auth_util.dart +++ b/auth/lib/utils/auth_util.dart @@ -5,7 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_local_authentication/flutter_local_authentication.dart'; import 'package:local_auth/local_auth.dart'; import 'package:local_auth_android/local_auth_android.dart'; -import 'package:local_auth_ios/types/auth_messages_ios.dart'; +import 'package:local_auth_darwin/types/auth_messages_ios.dart'; import 'package:logging/logging.dart'; Future requestAuthentication(BuildContext context, String reason) async { diff --git a/auth/linux/flutter/generated_plugin_registrant.cc b/auth/linux/flutter/generated_plugin_registrant.cc index 0bbf397b0..7b1c79935 100644 --- a/auth/linux/flutter/generated_plugin_registrant.cc +++ b/auth/linux/flutter/generated_plugin_registrant.cc @@ -13,10 +13,9 @@ #include #include #include -#include #include #include -#include +#include #include #include @@ -42,18 +41,15 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) sentry_flutter_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "SentryFlutterPlugin"); sentry_flutter_plugin_register_with_registrar(sentry_flutter_registrar); - g_autoptr(FlPluginRegistrar) smart_auth_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "SmartAuthPlugin"); - smart_auth_plugin_register_with_registrar(smart_auth_registrar); g_autoptr(FlPluginRegistrar) sodium_libs_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "SodiumLibsPlugin"); sodium_libs_plugin_register_with_registrar(sodium_libs_registrar); g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); - g_autoptr(FlPluginRegistrar) system_tray_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "SystemTrayPlugin"); - system_tray_plugin_register_with_registrar(system_tray_registrar); + g_autoptr(FlPluginRegistrar) tray_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "TrayManagerPlugin"); + tray_manager_plugin_register_with_registrar(tray_manager_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/auth/linux/flutter/generated_plugins.cmake b/auth/linux/flutter/generated_plugins.cmake index 0f2c32b0a..45674067d 100644 --- a/auth/linux/flutter/generated_plugins.cmake +++ b/auth/linux/flutter/generated_plugins.cmake @@ -10,10 +10,9 @@ list(APPEND FLUTTER_PLUGIN_LIST gtk screen_retriever sentry_flutter - smart_auth sodium_libs sqlite3_flutter_libs - system_tray + tray_manager url_launcher_linux window_manager ) diff --git a/auth/linux/my_application.cc b/auth/linux/my_application.cc index bf557c528..8a553fec3 100644 --- a/auth/linux/my_application.cc +++ b/auth/linux/my_application.cc @@ -53,13 +53,13 @@ static void my_application_activate(GApplication *application) { GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "ente Auth"); + gtk_header_bar_set_title(header_bar, "Ente Auth"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "ente Auth"); + gtk_window_set_title(window, "Ente Auth"); } gtk_window_set_default_size(window, 1280, 720); diff --git a/auth/linux/packaging/appimage/make_config.yaml b/auth/linux/packaging/appimage/make_config.yaml index ad9553980..90db9c587 100644 --- a/auth/linux/packaging/appimage/make_config.yaml +++ b/auth/linux/packaging/appimage/make_config.yaml @@ -1,26 +1,28 @@ -display_name: Auth -license: GPLv3 - -icon: assets/icon/auth-icon.png - -keywords: - - Authentication - - 2FA - -generic_name: ente Auth - -categories: - - Utility - -startup_notify: false - -# You can specify the shared libraries that you want to bundle with your app -# -# flutter_distributor automatically detects the shared libraries that your app -# depends on, but you can also specify them manually here. -# -# The following example shows how to bundle the libcurl library with your app. -# -# include: -# - libcurl.so.4 -include: [] +display_name: Auth +license: GPLv3 + +icon: assets/icons/auth-icon.png + +keywords: + - Authentication + - 2FA + +generic_name: Ente Auth + +categories: + - Utility + +startup_notify: false + +# You can specify the shared libraries that you want to bundle with your app +# +# flutter_distributor automatically detects the shared libraries that your app +# depends on, but you can also specify them manually here. +# +# The following example shows how to bundle the libcurl library with your app. +# +# include: +# - libcurl.so.4 +include: + - libffi.so.7 + - libtiff.so.5 diff --git a/auth/linux/packaging/deb/make_config.yaml b/auth/linux/packaging/deb/make_config.yaml index c5335f15a..93f54e472 100644 --- a/auth/linux/packaging/deb/make_config.yaml +++ b/auth/linux/packaging/deb/make_config.yaml @@ -1,34 +1,34 @@ -display_name: Auth -package_name: auth -maintainer: - name: Ente.io Developers - email: human@ente.io -priority: optional -section: x11 -essential: false -license: GPLv3 -icon: assets/icon/auth-icon.png -installed_size: 36000 - -dependencies: - - libwebkit2gtk-4.0-37 - - libsqlite3-0 - - libsodium23 - - libsecret-1-0 - - libappindicator3-1 | libayatana-appindicator3-1 - - gir1.2-appindicator3-0.1 | gir1.2-ayatanaappindicator3-0.1 - - libayatana-ido3-0.4-0 - -keywords: - - Authentication - - 2FA - -generic_name: Ente Authentication - -categories: - - Utility - -startup_notify: false - -supported_mime_type: - - x-scheme-handler/ente +display_name: Auth +package_name: auth +maintainer: + name: Ente.io Developers + email: human@ente.io +priority: optional +section: x11 +essential: false +license: GPLv3 +icon: assets/icons/auth-icon.png +installed_size: 36000 + +dependencies: + - libwebkit2gtk-4.0-37 + - libsqlite3-0 + - libsodium23 + - libsecret-1-0 + - libappindicator3-1 | libayatana-appindicator3-1 + - gir1.2-appindicator3-0.1 | gir1.2-ayatanaappindicator3-0.1 + - libayatana-ido3-0.4-0 + +keywords: + - Authentication + - 2FA + +generic_name: Ente Authentication + +categories: + - Utility + +startup_notify: false + +supported_mime_type: + - x-scheme-handler/ente diff --git a/auth/linux/packaging/rpm/make_config.yaml b/auth/linux/packaging/rpm/make_config.yaml index a345da361..5d5f3aab5 100644 --- a/auth/linux/packaging/rpm/make_config.yaml +++ b/auth/linux/packaging/rpm/make_config.yaml @@ -1,31 +1,31 @@ -icon: assets/icon/auth-icon.png -summary: 2FA app with free end-to-end encrypted backup and sync -group: Application/Utility -vendor: Ente.io -packager: Ente.io Developers -packagerEmail: human@ente.io -license: GPLv3 -url: https://github.com/ente-io/ente - -display_name: Auth - -dependencies: - - libsqlite3x - - webkit2gtk-4.0 - - libsodium - - libsecret - - libappindicator - -keywords: - - Authentication - - 2FA - -generic_name: Ente Authentication - -categories: - - Utility - -startup_notify: false - -supported_mime_type: - - x-scheme-handler/ente +icon: assets/icons/auth-icon.png +summary: 2FA app with free end-to-end encrypted backup and sync +group: Application/Utility +vendor: Ente.io +packager: Ente.io Developers +packagerEmail: human@ente.io +license: GPLv3 +url: https://github.com/ente-io/ente + +display_name: Auth + +requires: + - libsqlite3x + - webkit2gtk-4.0 + - libsodium + - libsecret + - libappindicator + +keywords: + - Authentication + - 2FA + +generic_name: Ente Authentication + +categories: + - Utility + +startup_notify: false + +supported_mime_type: + - x-scheme-handler/ente diff --git a/auth/macos/Flutter/GeneratedPluginRegistrant.swift b/auth/macos/Flutter/GeneratedPluginRegistrant.swift index 509bf6674..5d8c36991 100644 --- a/auth/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/auth/macos/Flutter/GeneratedPluginRegistrant.swift @@ -20,11 +20,10 @@ import screen_retriever import sentry_flutter import share_plus import shared_preferences_foundation -import smart_auth import sodium_libs import sqflite import sqlite3_flutter_libs -import system_tray +import tray_manager import url_launcher_macos import window_manager @@ -44,11 +43,10 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { SentryFlutterPlugin.register(with: registry.registrar(forPlugin: "SentryFlutterPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) - SmartAuthPlugin.register(with: registry.registrar(forPlugin: "SmartAuthPlugin")) SodiumLibsPlugin.register(with: registry.registrar(forPlugin: "SodiumLibsPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) - SystemTrayPlugin.register(with: registry.registrar(forPlugin: "SystemTrayPlugin")) + TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/auth/macos/Podfile.lock b/auth/macos/Podfile.lock index 641289552..a5b6eb77c 100644 --- a/auth/macos/Podfile.lock +++ b/auth/macos/Podfile.lock @@ -63,7 +63,7 @@ PODS: - sqlite3/fts5 - sqlite3/perf-threadsafe - sqlite3/rtree - - system_tray (0.0.1): + - tray_manager (0.0.1): - FlutterMacOS - url_launcher_macos (0.0.1): - FlutterMacOS @@ -91,7 +91,7 @@ DEPENDENCIES: - sodium_libs (from `Flutter/ephemeral/.symlinks/plugins/sodium_libs/macos`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`) - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`) - - system_tray (from `Flutter/ephemeral/.symlinks/plugins/system_tray/macos`) + - tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) @@ -144,8 +144,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin sqlite3_flutter_libs: :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos - system_tray: - :path: Flutter/ephemeral/.symlinks/plugins/system_tray/macos + tray_manager: + :path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos window_manager: @@ -177,7 +177,7 @@ SPEC CHECKSUMS: sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqlite3: 73b7fc691fdc43277614250e04d183740cb15078 sqlite3_flutter_libs: 06a05802529659a272beac4ee1350bfec294f386 - system_tray: e53c972838c69589ff2e77d6d3abfd71332f9e5d + tray_manager: 9064e219c56d75c476e46b9a21182087930baf90 url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 diff --git a/auth/macos/Runner.xcodeproj/project.pbxproj b/auth/macos/Runner.xcodeproj/project.pbxproj index 976b897ad..492f710ad 100644 --- a/auth/macos/Runner.xcodeproj/project.pbxproj +++ b/auth/macos/Runner.xcodeproj/project.pbxproj @@ -55,7 +55,7 @@ /* Begin PBXFileReference section */ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* ente Auth.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ente Auth.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* Ente Auth.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Ente Auth.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -122,7 +122,7 @@ 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* ente Auth.app */, + 33CC10ED2044A3C60003C045 /* Ente Auth.app */, ); name = Products; sourceTree = ""; @@ -192,7 +192,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* ente Auth.app */; + productReference = 33CC10ED2044A3C60003C045 /* Ente Auth.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ diff --git a/auth/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/auth/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index bb73a0d58..7b82ae2ae 100644 --- a/auth/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/auth/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -54,7 +54,7 @@ @@ -71,7 +71,7 @@ diff --git a/auth/macos/Runner/Configs/AppInfo.xcconfig b/auth/macos/Runner/Configs/AppInfo.xcconfig index b716deabf..cb548680b 100644 --- a/auth/macos/Runner/Configs/AppInfo.xcconfig +++ b/auth/macos/Runner/Configs/AppInfo.xcconfig @@ -5,7 +5,7 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = ente Auth +PRODUCT_NAME = Ente Auth // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth diff --git a/auth/macos/packaging/dmg/make_config.yaml b/auth/macos/packaging/dmg/make_config.yaml index 5cbffbec8..30628bef3 100644 --- a/auth/macos/packaging/dmg/make_config.yaml +++ b/auth/macos/packaging/dmg/make_config.yaml @@ -1,11 +1,11 @@ -title: Auth -icon: ../../../assets/icon/auth-icon.png -contents: - - x: 448 - y: 344 - type: link - path: "/Applications" - - x: 192 - y: 344 - type: file - path: ente Auth.app +title: Auth +icon: ../../../assets/icons/auth-icon.png +contents: + - x: 448 + y: 344 + type: link + path: "/Applications" + - x: 192 + y: 344 + type: file + path: Ente Auth.app diff --git a/auth/pubspec.lock b/auth/pubspec.lock index 66ef40e2a..73b3075cb 100644 --- a/auth/pubspec.lock +++ b/auth/pubspec.lock @@ -85,10 +85,10 @@ packages: dependency: "direct main" description: name: bloc - sha256: f53a110e3b48dcd78136c10daa5d51512443cea5e1348c9d80a320095fa2db9e + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.1.4" boolean_selector: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" url: "https://pub.dev" source: hosted - version: "2.4.8" + version: "2.4.9" build_runner_core: dependency: transitive description: @@ -294,7 +294,7 @@ packages: description: path: "packages/desktop_webview_window" ref: HEAD - resolved-ref: "649302f53451dde9ded4dc1fadfbead2b001fe64" + resolved-ref: "8cbbf9cd6efcfee5e0f420a36f7f8e7e64b667a1" url: "https://github.com/MixinNetwork/flutter-plugins" source: git version: "0.2.4" @@ -318,10 +318,10 @@ packages: dependency: "direct main" description: name: dio - sha256: "49af28382aefc53562459104f64d16b9dfd1e8ef68c862d5af436cc8356ce5a8" + sha256: "0978e9a3e45305a80a7210dbeaf79d6ee8bee33f70c8e542dc654c952070217f" url: "https://pub.dev" source: hosted - version: "5.4.1" + version: "5.4.2+1" dotted_border: dependency: "direct main" description: @@ -347,6 +347,14 @@ packages: url: "https://github.com/ente-io/ente_crypto_dart.git" source: git version: "1.0.0" + equatable: + dependency: transitive + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" event_bus: dependency: "direct main" description: @@ -399,10 +407,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: caa6bc229eab3e32eb2f37b53a5f9d22a6981474afd210c512a7546c1e1a04f6 + sha256: "1bbf65dd997458a08b531042ec3794112a6c39c07c37ff22113d2e7e4f81d4e4" url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.2.1" file_saver: dependency: "direct main" description: @@ -436,10 +444,18 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: "87325da1ac757fcc4813e6b34ed5dd61169973871fdf181d6c2109dd6935ece1" + sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2 url: "https://pub.dev" source: hosted - version: "8.1.4" + version: "8.1.5" + flutter_context_menu: + dependency: "direct main" + description: + name: flutter_context_menu + sha256: "9f220a8fa0290c68e38000d6d62a0dc4555d490c15a5bd856a6e6d255d81b8dc" + url: "https://pub.dev" + source: hosted + version: "0.1.3" flutter_displaymode: dependency: "direct main" description: @@ -562,10 +578,10 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: "558f10070f03ee71f850a78f7136ab239a67636a294a44a06b6b7345178edb1e" + sha256: edf39bcf4d74aca1eb2c1e43c3e445fd9f494013df7f0da752fefe72020eedc0 url: "https://pub.dev" source: hosted - version: "2.3.10" + version: "2.4.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -685,10 +701,10 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" glob: dependency: transitive description: @@ -858,21 +874,13 @@ packages: source: hosted version: "1.0.37" local_auth_darwin: - dependency: transitive + dependency: "direct main" description: name: local_auth_darwin sha256: "33381a15b0de2279523eca694089393bb146baebdce72a404555d03174ebc1e9" url: "https://pub.dev" source: hosted version: "1.2.2" - local_auth_ios: - dependency: "direct main" - description: - name: local_auth_ios - sha256: "6dde47dc852bc0c8343cb58e66a46efb16b62eddf389ce103d4dacb0c6c40c71" - url: "https://pub.dev" - source: hosted - version: "1.1.7" local_auth_platform_interface: dependency: transitive description: @@ -913,6 +921,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.8.0" + menu_base: + dependency: transitive + description: + name: menu_base + sha256: "820368014a171bd1241030278e6c2617354f492f5c703d7b7d4570a6b8b84405" + url: "https://pub.dev" + source: hosted + version: "0.1.1" meta: dependency: transitive description: @@ -1093,10 +1109,10 @@ packages: dependency: "direct main" description: name: pinput - sha256: a92b55ecf9c25d1b9e100af45905385d5bc34fc9b6b04177a9e82cb88fe4d805 + sha256: "27eb69042f75755bdb6544f6e79a50a6ed09d6e97e2d75c8421744df1e392949" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "1.2.2" platform: dependency: transitive description: @@ -1229,10 +1245,10 @@ packages: dependency: transitive description: name: share_plus_platform_interface - sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 + sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.0" shared_preferences: dependency: "direct main" description: @@ -1305,19 +1321,19 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + shortid: + dependency: transitive + description: + name: shortid + sha256: d0b40e3dbb50497dad107e19c54ca7de0d1a274eb9b4404991e443dadb9ebedb + url: "https://pub.dev" + source: hosted + version: "0.1.2" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" - smart_auth: - dependency: transitive - description: - name: smart_auth - sha256: a25229b38c02f733d0a4e98d941b42bed91a976cb589e934895e60ccfa674cf6 - url: "https://pub.dev" - source: hosted - version: "1.1.1" sodium: dependency: transitive description: @@ -1330,10 +1346,10 @@ packages: dependency: transitive description: name: sodium_libs - sha256: "05b9e2de0f850a5315f596379f0c617aa1f938ed5e099126f8919c55499fed46" + sha256: f7f6719b7ab3e8512ce7a5ecd7bc8d865482431cdd5a07a46b55b13c152b54e1 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.1+1" source_gen: dependency: transitive description: @@ -1371,7 +1387,7 @@ packages: description: path: sqflite ref: HEAD - resolved-ref: "07fb76f37e17a396dd7dcc8fb83b81b3f5b62486" + resolved-ref: "075b3e2f81e691a19a500e7ff6db2953de7f83a9" url: "https://github.com/tekartik/sqflite" source: git version: "2.3.2" @@ -1379,18 +1395,18 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" sqflite_common_ffi: dependency: "direct main" description: name: sqflite_common_ffi - sha256: "754927d82de369a6b9e760fb60640aa81da650f35ffd468d5a992814d6022908" + sha256: "4d6137c29e930d6e4a8ff373989dd9de7bac12e3bc87bce950f6e844e8ad3bb5" url: "https://pub.dev" source: hosted - version: "2.3.2+1" + version: "2.3.3" sqlite3: dependency: "direct main" description: @@ -1463,14 +1479,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0+1" - system_tray: - dependency: "direct main" - description: - name: system_tray - sha256: "1bcc11bc230033be20d7443c29f65f68d67169715a838a1122f20fbff5dd2d19" - url: "https://pub.dev" - source: hosted - version: "0.1.1" term_glyph: dependency: transitive description: @@ -1503,6 +1511,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + tray_manager: + dependency: "direct main" + description: + name: tray_manager + sha256: "4ab709d70a4374af172f8c39e018db33a4271265549c6fc9d269a65e5f4b0225" + url: "https://pub.dev" + source: hosted + version: "0.2.1" tuple: dependency: "direct main" description: @@ -1527,14 +1543,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" - universal_platform: - dependency: transitive - description: - name: universal_platform - sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc - url: "https://pub.dev" - source: hosted - version: "1.0.0+1" url_launcher: dependency: "direct main" description: diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 6d76952cd..2ef543aa6 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 2.0.46+246 +version: 2.0.55+255 publish_to: none environment: @@ -41,6 +41,7 @@ dependencies: flutter: sdk: flutter flutter_bloc: ^8.0.1 + flutter_context_menu: ^0.1.3 flutter_displaymode: ^0.6.0 flutter_email_sender: ^6.0.2 flutter_inappwebview: ^6.0.0 @@ -63,9 +64,9 @@ dependencies: http: ^1.1.0 intl: ^0.18.0 json_annotation: ^4.5.0 - local_auth: ^2.1.7 - local_auth_android: ^1.0.31 - local_auth_ios: ^1.1.3 + local_auth: ^2.2.0 + local_auth_android: ^1.0.37 + local_auth_darwin: ^1.2.2 logging: ^1.0.1 modal_bottom_sheet: ^3.0.0-pre move_to_background: ^1.0.2 @@ -74,7 +75,7 @@ dependencies: password_strength: ^0.2.0 path: ^1.8.3 path_provider: ^2.0.11 - pinput: ^3.0.1 + pinput: ^1.2.2 pointycastle: ^3.7.3 privacy_screen: ^0.0.6 protobuf: ^3.0.0 @@ -93,7 +94,7 @@ dependencies: sqlite3_flutter_libs: ^0.5.19+1 step_progress_indicator: ^1.0.2 styled_text: ^8.1.0 - system_tray: ^0.1.1 + tray_manager: ^0.2.1 tuple: ^2.0.0 url_launcher: ^6.1.5 uuid: ^4.2.2 @@ -122,6 +123,7 @@ flutter: # https://docs:flutter:dev/development/ui/assets-and-images: assets: - assets/ + - assets/icons/ - assets/simple-icons/icons/ - assets/simple-icons/_data/ - assets/custom-icons/icons/ @@ -141,10 +143,10 @@ flutter: flutter_icons: android: "launcher_icon" - adaptive_icon_foreground: "assets/icon-light-adaptive-fg.png" + adaptive_icon_foreground: "assets/generation-icons/icon-light-adaptive-fg.png" adaptive_icon_background: "#ffffff" ios: true - image_path: "assets/icon-light.png" + image_path: "assets/generation-icons/icon-light.png" remove_alpha_ios: true flutter_native_splash: diff --git a/auth/windows/flutter/generated_plugin_registrant.cc b/auth/windows/flutter/generated_plugin_registrant.cc index aed85fbff..41d3cd7a3 100644 --- a/auth/windows/flutter/generated_plugin_registrant.cc +++ b/auth/windows/flutter/generated_plugin_registrant.cc @@ -16,10 +16,9 @@ #include #include #include -#include #include #include -#include +#include #include #include @@ -44,14 +43,12 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("SentryFlutterPlugin")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); - SmartAuthPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("SmartAuthPlugin")); SodiumLibsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SodiumLibsPluginCApi")); Sqlite3FlutterLibsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); - SystemTrayPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("SystemTrayPlugin")); + TrayManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("TrayManagerPlugin")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); WindowManagerPluginRegisterWithRegistrar( diff --git a/auth/windows/flutter/generated_plugins.cmake b/auth/windows/flutter/generated_plugins.cmake index 2578d34e2..a2b56b65d 100644 --- a/auth/windows/flutter/generated_plugins.cmake +++ b/auth/windows/flutter/generated_plugins.cmake @@ -13,10 +13,9 @@ list(APPEND FLUTTER_PLUGIN_LIST screen_retriever sentry_flutter share_plus - smart_auth sodium_libs sqlite3_flutter_libs - system_tray + tray_manager url_launcher_windows window_manager ) diff --git a/auth/windows/packaging/exe/inno_setup.iss b/auth/windows/packaging/exe/inno_setup.iss new file mode 100644 index 000000000..5906ecbd0 --- /dev/null +++ b/auth/windows/packaging/exe/inno_setup.iss @@ -0,0 +1,64 @@ +[Setup] +AppId={{APP_ID}} +AppVersion={{APP_VERSION}} +AppName={{DISPLAY_NAME}} +AppPublisher={{PUBLISHER_NAME}} +AppPublisherURL={{PUBLISHER_URL}} +AppSupportURL={{PUBLISHER_URL}} +AppUpdatesURL={{PUBLISHER_URL}} +DefaultDirName={{INSTALL_DIR_NAME}} +DisableProgramGroupPage=yes +OutputDir=. +OutputBaseFilename={{OUTPUT_BASE_FILENAME}} +Compression=lzma +SolidCompression=yes +SetupIconFile={{SETUP_ICON_FILE}} +WizardStyle=modern +;PrivilegesRequired={{PRIVILEGES_REQUIRED}} +PrivilegesRequiredOverridesAllowed=dialog +ArchitecturesAllowed=x64 +ArchitecturesInstallIn64BitMode=x64 +UninstallDisplayIcon={app}\auth.exe + +[Languages] +{% for locale in LOCALES %} +{% if locale == 'en' %}Name: "english"; MessagesFile: "compiler:Default.isl"{% endif %} +{% if locale == 'hy' %}Name: "armenian"; MessagesFile: "compiler:Languages\\Armenian.isl"{% endif %} +{% if locale == 'bg' %}Name: "bulgarian"; MessagesFile: "compiler:Languages\\Bulgarian.isl"{% endif %} +{% if locale == 'ca' %}Name: "catalan"; MessagesFile: "compiler:Languages\\Catalan.isl"{% endif %} +{% if locale == 'zh' %}Name: "chinesesimplified"; MessagesFile: "compiler:Languages\\ChineseSimplified.isl"{% endif %} +{% if locale == 'co' %}Name: "corsican"; MessagesFile: "compiler:Languages\\Corsican.isl"{% endif %} +{% if locale == 'cs' %}Name: "czech"; MessagesFile: "compiler:Languages\\Czech.isl"{% endif %} +{% if locale == 'da' %}Name: "danish"; MessagesFile: "compiler:Languages\\Danish.isl"{% endif %} +{% if locale == 'nl' %}Name: "dutch"; MessagesFile: "compiler:Languages\\Dutch.isl"{% endif %} +{% if locale == 'fi' %}Name: "finnish"; MessagesFile: "compiler:Languages\\Finnish.isl"{% endif %} +{% if locale == 'fr' %}Name: "french"; MessagesFile: "compiler:Languages\\French.isl"{% endif %} +{% if locale == 'de' %}Name: "german"; MessagesFile: "compiler:Languages\\German.isl"{% endif %} +{% if locale == 'he' %}Name: "hebrew"; MessagesFile: "compiler:Languages\\Hebrew.isl"{% endif %} +{% if locale == 'is' %}Name: "icelandic"; MessagesFile: "compiler:Languages\\Icelandic.isl"{% endif %} +{% if locale == 'it' %}Name: "italian"; MessagesFile: "compiler:Languages\\Italian.isl"{% endif %} +{% if locale == 'ja' %}Name: "japanese"; MessagesFile: "compiler:Languages\\Japanese.isl"{% endif %} +{% if locale == 'no' %}Name: "norwegian"; MessagesFile: "compiler:Languages\\Norwegian.isl"{% endif %} +{% if locale == 'pl' %}Name: "polish"; MessagesFile: "compiler:Languages\\Polish.isl"{% endif %} +{% if locale == 'pt' %}Name: "portuguese"; MessagesFile: "compiler:Languages\\Portuguese.isl"{% endif %} +{% if locale == 'ru' %}Name: "russian"; MessagesFile: "compiler:Languages\\Russian.isl"{% endif %} +{% if locale == 'sk' %}Name: "slovak"; MessagesFile: "compiler:Languages\\Slovak.isl"{% endif %} +{% if locale == 'sl' %}Name: "slovenian"; MessagesFile: "compiler:Languages\\Slovenian.isl"{% endif %} +{% if locale == 'es' %}Name: "spanish"; MessagesFile: "compiler:Languages\\Spanish.isl"{% endif %} +{% if locale == 'tr' %}Name: "turkish"; MessagesFile: "compiler:Languages\\Turkish.isl"{% endif %} +{% if locale == 'uk' %}Name: "ukrainian"; MessagesFile: "compiler:Languages\\Ukrainian.isl"{% endif %} +{% endfor %} + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: {% if CREATE_DESKTOP_ICON != true %}unchecked{% else %}checkedonce{% endif %} +Name: "launchAtStartup"; Description: "{cm:AutoStartProgram,{{DISPLAY_NAME}}}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: {% if LAUNCH_AT_STARTUP != true %}unchecked{% else %}checkedonce{% endif %} +[Files] +Source: "{{SOURCE_DIR}}\\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{autoprograms}\\{{DISPLAY_NAME}}"; Filename: "{app}\\{{EXECUTABLE_NAME}}" +Name: "{autodesktop}\\{{DISPLAY_NAME}}"; Filename: "{app}\\{{EXECUTABLE_NAME}}"; Tasks: desktopicon +Name: "{userstartup}\\{{DISPLAY_NAME}}"; Filename: "{app}\\{{EXECUTABLE_NAME}}"; WorkingDir: "{app}"; Tasks: launchAtStartup +[Run] +Filename: "{app}\\{{EXECUTABLE_NAME}}"; Description: "{cm:LaunchProgram,{{DISPLAY_NAME}}}"; Flags: {% if PRIVILEGES_REQUIRED == 'admin' %}runascurrentuser{% endif %} nowait postinstall skipifsilent diff --git a/auth/windows/packaging/exe/make_config.yaml b/auth/windows/packaging/exe/make_config.yaml index 35b973292..378d2d4d8 100644 --- a/auth/windows/packaging/exe/make_config.yaml +++ b/auth/windows/packaging/exe/make_config.yaml @@ -1,8 +1,10 @@ -app_id: 9E5F0C93-96A3-4DA9-AE52-1AA6339851FC -publisher: ente.io -publisher_url: https://github.com/ente-io/ente -display_name: ente Auth -create_desktop_icon: true -install_dir_name: enteauth -locales: - - en +app_id: 9E5F0C93-96A3-4DA9-AE52-1AA6339851FC +publisher: ente.io +publisher_url: https://github.com/ente-io/ente +display_name: Ente Auth +create_desktop_icon: false +install_dir_name: "{autopf}\\Ente Auth" +setup_icon_file: ../../assets/icons/auth-icon.ico +script_template: inno_setup.iss +locales: + - en diff --git a/auth/windows/runner/Runner.rc b/auth/windows/runner/Runner.rc index ecf6f65d3..398fdf68b 100644 --- a/auth/windows/runner/Runner.rc +++ b/auth/windows/runner/Runner.rc @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Ente Technologies, Inc." "\0" - VALUE "FileDescription", "ente Auth" "\0" + VALUE "FileDescription", "Ente Auth" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "ente Auth" "\0" + VALUE "InternalName", "Ente Auth" "\0" VALUE "LegalCopyright", "Copyright (C) 2024 Ente Technologies, Inc.. All rights reserved." "\0" VALUE "OriginalFilename", "auth.exe" "\0" - VALUE "ProductName", "ente Auth" "\0" + VALUE "ProductName", "Ente Auth" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/auth/windows/runner/main.cpp b/auth/windows/runner/main.cpp index 546bc77e6..11751936c 100644 --- a/auth/windows/runner/main.cpp +++ b/auth/windows/runner/main.cpp @@ -49,7 +49,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, _In_ wchar_t *command_line, _In_ int show_command) { // [app_links] - if (SendAppLinkToInstance(L"ente Auth")) + if (SendAppLinkToInstance(L"Ente Auth")) { return EXIT_SUCCESS; } @@ -74,7 +74,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.Create(L"ente Auth", origin, size)) + if (!window.Create(L"Ente Auth", origin, size)) { return EXIT_FAILURE; } diff --git a/cli/internal/api/file_type.go b/cli/internal/api/file_type.go index f241f8fe5..93a23b7b0 100644 --- a/cli/internal/api/file_type.go +++ b/cli/internal/api/file_type.go @@ -18,6 +18,10 @@ type File struct { Info *FileInfo `json:"info,omitempty"` } +func (f File) IsRemovedFromAlbum() bool { + return f.IsDeleted || f.File.EncryptedData == "-" +} + // FileInfo has information about storage used by the file & it's metadata(future) type FileInfo struct { FileSize int64 `json:"fileSize,omitempty"` diff --git a/cli/internal/crypto/crypto.go b/cli/internal/crypto/crypto.go index 83200896b..11868c0ba 100644 --- a/cli/internal/crypto/crypto.go +++ b/cli/internal/crypto/crypto.go @@ -98,7 +98,8 @@ func DecryptChaChaBase64(data string, key []byte, nonce string) (string, []byte, // Decode data from base64 dataBytes, err := base64.StdEncoding.DecodeString(data) if err != nil { - return "", nil, fmt.Errorf("invalid data: %v", err) + // safe to log the encrypted data + return "", nil, fmt.Errorf("invalid base64 data %s: %v", data, err) } // Decode nonce from base64 nonceBytes, err := base64.StdEncoding.DecodeString(nonce) diff --git a/cli/main.go b/cli/main.go index 157c11fd8..d62cdcffa 100644 --- a/cli/main.go +++ b/cli/main.go @@ -15,7 +15,7 @@ import ( "strings" ) -var AppVersion = "0.1.12" +var AppVersion = "0.1.13" func main() { cliDBPath, err := GetCLIConfigPath() diff --git a/cli/pkg/mapper/photo.go b/cli/pkg/mapper/photo.go index fa55ffae5..ac16f44f7 100644 --- a/cli/pkg/mapper/photo.go +++ b/cli/pkg/mapper/photo.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "github.com/ente-io/cli/internal/api" eCrypto "github.com/ente-io/cli/internal/crypto" "github.com/ente-io/cli/pkg/model" @@ -41,7 +42,7 @@ func MapCollectionToAlbum(ctx context.Context, collection api.Collection, holder if collection.MagicMetadata != nil { _, encodedJsonBytes, err := eCrypto.DecryptChaChaBase64(collection.MagicMetadata.Data, collectionKey, collection.MagicMetadata.Header) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decrypt magic metadata for collection %d: %w", collection.ID, err) } err = json.Unmarshal(encodedJsonBytes, &album.PrivateMeta) if err != nil { @@ -51,28 +52,28 @@ func MapCollectionToAlbum(ctx context.Context, collection api.Collection, holder if collection.PublicMagicMetadata != nil { _, encodedJsonBytes, err := eCrypto.DecryptChaChaBase64(collection.PublicMagicMetadata.Data, collectionKey, collection.PublicMagicMetadata.Header) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decrypt public magic metadata for collection %d: %w", collection.ID, err) } err = json.Unmarshal(encodedJsonBytes, &album.PublicMeta) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to unmarshal public magic metadata for collection %d: %w", collection.ID, err) } } if album.IsShared && collection.SharedMagicMetadata != nil { _, encodedJsonBytes, err := eCrypto.DecryptChaChaBase64(collection.SharedMagicMetadata.Data, collectionKey, collection.SharedMagicMetadata.Header) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decrypt shared magic metadata for collection %d: %w", collection.ID, err) } err = json.Unmarshal(encodedJsonBytes, &album.SharedMeta) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to unmarshal shared magic metadata for collection %d: %w", collection.ID, err) } } return &album, nil } func MapApiFileToPhotoFile(ctx context.Context, album model.RemoteAlbum, file api.File, holder *secrets.KeyHolder) (*model.RemoteFile, error) { - if file.IsDeleted { + if file.IsRemovedFromAlbum() { return nil, errors.New("file is deleted") } albumKey := album.AlbumKey.MustDecrypt(holder.DeviceKey) @@ -99,7 +100,7 @@ func MapApiFileToPhotoFile(ctx context.Context, album model.RemoteAlbum, file ap if file.Metadata.DecryptionHeader != "" { _, encodedJsonBytes, err := eCrypto.DecryptChaChaBase64(file.Metadata.EncryptedData, fileKey, file.Metadata.DecryptionHeader) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decrypt metadata for file %d: %w", file.ID, err) } err = json.Unmarshal(encodedJsonBytes, &photoFile.Metadata) if err != nil { @@ -109,7 +110,7 @@ func MapApiFileToPhotoFile(ctx context.Context, album model.RemoteAlbum, file ap if file.MagicMetadata != nil { _, encodedJsonBytes, err := eCrypto.DecryptChaChaBase64(file.MagicMetadata.Data, fileKey, file.MagicMetadata.Header) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decrypt magic metadata for file %d: %w", file.ID, err) } err = json.Unmarshal(encodedJsonBytes, &photoFile.PrivateMetadata) if err != nil { @@ -119,7 +120,7 @@ func MapApiFileToPhotoFile(ctx context.Context, album model.RemoteAlbum, file ap if file.PubicMagicMetadata != nil { _, encodedJsonBytes, err := eCrypto.DecryptChaChaBase64(file.PubicMagicMetadata.Data, fileKey, file.PubicMagicMetadata.Header) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decrypt public magic metadata for file %d: %w", file.ID, err) } err = json.Unmarshal(encodedJsonBytes, &photoFile.PublicMetadata) if err != nil { diff --git a/cli/pkg/remote_sync.go b/cli/pkg/remote_sync.go index a37a4a58c..5ca149d71 100644 --- a/cli/pkg/remote_sync.go +++ b/cli/pkg/remote_sync.go @@ -87,16 +87,16 @@ func (c *ClICtrl) fetchRemoteFiles(ctx context.Context) error { if file.UpdationTime > maxUpdated { maxUpdated = file.UpdationTime } - if isFirstSync && file.IsDeleted { + if isFirstSync && file.IsRemovedFromAlbum() { // on first sync, no need to sync delete markers continue } - albumEntry := model.AlbumFileEntry{AlbumID: album.ID, FileID: file.ID, IsDeleted: file.IsDeleted, SyncedLocally: false} + albumEntry := model.AlbumFileEntry{AlbumID: album.ID, FileID: file.ID, IsDeleted: file.IsRemovedFromAlbum(), SyncedLocally: false} putErr := c.UpsertAlbumEntry(ctx, &albumEntry) if putErr != nil { return putErr } - if file.IsDeleted { + if file.IsRemovedFromAlbum() { continue } photoFile, err := mapper.MapApiFileToPhotoFile(ctx, album, file, c.KeyHolder) diff --git a/desktop/.eslintrc.js b/desktop/.eslintrc.js index 491d9aed3..a47eb483f 100644 --- a/desktop/.eslintrc.js +++ b/desktop/.eslintrc.js @@ -7,11 +7,6 @@ module.exports = { // "plugin:@typescript-eslint/strict-type-checked", // "plugin:@typescript-eslint/stylistic-type-checked", ], - /* Temporarily disable some rules - Enhancement: Remove me */ - rules: { - "no-unused-vars": "off", - }, /* Temporarily add a global Enhancement: Remove me */ globals: { diff --git a/desktop/build/ggmlclip-linux b/desktop/build/ggmlclip-linux deleted file mode 100755 index 4c160b039..000000000 Binary files a/desktop/build/ggmlclip-linux and /dev/null differ diff --git a/desktop/build/ggmlclip-mac b/desktop/build/ggmlclip-mac deleted file mode 100755 index db7c4f249..000000000 Binary files a/desktop/build/ggmlclip-mac and /dev/null differ diff --git a/desktop/build/ggmlclip-windows.exe b/desktop/build/ggmlclip-windows.exe deleted file mode 100755 index 1e197dfe8..000000000 Binary files a/desktop/build/ggmlclip-windows.exe and /dev/null differ diff --git a/desktop/build/msvcp140d.dll b/desktop/build/msvcp140d.dll deleted file mode 100644 index 358e18663..000000000 Binary files a/desktop/build/msvcp140d.dll and /dev/null differ diff --git a/desktop/build/ucrtbased.dll b/desktop/build/ucrtbased.dll deleted file mode 100644 index 78cfcfeeb..000000000 Binary files a/desktop/build/ucrtbased.dll and /dev/null differ diff --git a/desktop/build/vcruntime140_1d.dll b/desktop/build/vcruntime140_1d.dll deleted file mode 100644 index 700cf5f75..000000000 Binary files a/desktop/build/vcruntime140_1d.dll and /dev/null differ diff --git a/desktop/build/vcruntime140d.dll b/desktop/build/vcruntime140d.dll deleted file mode 100644 index 8b5425e0f..000000000 Binary files a/desktop/build/vcruntime140d.dll and /dev/null differ diff --git a/desktop/docs/dependencies.md b/desktop/docs/dependencies.md index cf38fe121..5c1b07744 100644 --- a/desktop/docs/dependencies.md +++ b/desktop/docs/dependencies.md @@ -61,15 +61,15 @@ Electron process. This allows us to directly use the output produced by ### Others -* [any-shell-escape](https://github.com/boazy/any-shell-escape) is for - escaping shell commands before we execute them (e.g. say when invoking the - embedded ffmpeg CLI). +- [any-shell-escape](https://github.com/boazy/any-shell-escape) is for + escaping shell commands before we execute them (e.g. say when invoking the + embedded ffmpeg CLI). -* [auto-launch](https://github.com/Teamwork/node-auto-launch) is for - automatically starting our app on login, if the user so wishes. +- [auto-launch](https://github.com/Teamwork/node-auto-launch) is for + automatically starting our app on login, if the user so wishes. -* [electron-store](https://github.com/sindresorhus/electron-store) is used for - persisting user preferences and other arbitrary data. +- [electron-store](https://github.com/sindresorhus/electron-store) is used for + persisting user preferences and other arbitrary data. ## Dev @@ -79,12 +79,12 @@ are similar to that in the web code. Some extra ones specific to the code here are: -* [concurrently](https://github.com/open-cli-tools/concurrently) for spawning - parallel tasks when we do `yarn dev`. +- [concurrently](https://github.com/open-cli-tools/concurrently) for spawning + parallel tasks when we do `yarn dev`. -* [shx](https://github.com/shelljs/shx) for providing a portable way to use Unix - commands in our `package.json` scripts. This allows us to use the same - commands (like `ln`) across different platforms like Linux and Windows. +- [shx](https://github.com/shelljs/shx) for providing a portable way to use + Unix commands in our `package.json` scripts. This allows us to use the same + commands (like `ln`) across different platforms like Linux and Windows. ## Functionality @@ -111,11 +111,11 @@ watcher for the watch folders functionality. ### AI/ML -* [onnxruntime-node](https://github.com/Microsoft/onnxruntime) -* html-entities is used by the bundled clip-bpe-ts. -* GGML binaries are bundled -* We also use [jpeg-js](https://github.com/jpeg-js/jpeg-js#readme) for - conversion of all images to JPEG before processing. +- [onnxruntime-node](https://github.com/Microsoft/onnxruntime) is used for + natural language searches based on CLIP. +- html-entities is used by the bundled clip-bpe-ts tokenizer. +- [jpeg-js](https://github.com/jpeg-js/jpeg-js#readme) is used for decoding + JPEG data into raw RGB bytes before passing it to ONNX. ## ZIP diff --git a/desktop/docs/dev.md b/desktop/docs/dev.md index af459e555..507438fdc 100644 --- a/desktop/docs/dev.md +++ b/desktop/docs/dev.md @@ -31,7 +31,7 @@ are built against `electron`'s packaged `node` version. We use to rebuild those modules automatically after each `yarn install` by invoking it in as the `postinstall` step in our package.json. -### lint and lint-fix +### lint, lint-fix Use `yarn lint` to check that your code formatting is as expected, and that there are no linter errors. Use `yarn lint-fix` to try and automatically fix the diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml index 9189c3435..4fdfc4f55 100644 --- a/desktop/electron-builder.yml +++ b/desktop/electron-builder.yml @@ -19,7 +19,6 @@ mac: arch: [universal] category: public.app-category.photography hardenedRuntime: true - x64ArchFiles: Contents/Resources/ggmlclip-mac afterSign: electron-builder-notarize extraFiles: - from: build diff --git a/desktop/src/api/electronStore.ts b/desktop/src/api/electronStore.ts deleted file mode 100644 index 2ee74953d..000000000 --- a/desktop/src/api/electronStore.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { logError } from "../main/log"; -import { keysStore } from "../stores/keys.store"; -import { safeStorageStore } from "../stores/safeStorage.store"; -import { uploadStatusStore } from "../stores/upload.store"; -import { watchStore } from "../stores/watch.store"; - -export const clearElectronStore = () => { - try { - uploadStatusStore.clear(); - keysStore.clear(); - safeStorageStore.clear(); - watchStore.clear(); - } catch (e) { - logError(e, "error while clearing electron store"); - throw e; - } -}; diff --git a/desktop/src/api/safeStorage.ts b/desktop/src/api/safeStorage.ts deleted file mode 100644 index e3d674951..000000000 --- a/desktop/src/api/safeStorage.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { safeStorage } from "electron/main"; -import { logError } from "../main/log"; -import { safeStorageStore } from "../stores/safeStorage.store"; - -export async function setEncryptionKey(encryptionKey: string) { - try { - const encryptedKey: Buffer = - await safeStorage.encryptString(encryptionKey); - const b64EncryptedKey = Buffer.from(encryptedKey).toString("base64"); - safeStorageStore.set("encryptionKey", b64EncryptedKey); - } catch (e) { - logError(e, "setEncryptionKey failed"); - throw e; - } -} - -export async function getEncryptionKey(): Promise { - try { - const b64EncryptedKey = safeStorageStore.get("encryptionKey"); - if (b64EncryptedKey) { - const keyBuffer = Buffer.from(b64EncryptedKey, "base64"); - return await safeStorage.decryptString(keyBuffer); - } - } catch (e) { - logError(e, "getEncryptionKey failed"); - throw e; - } -} diff --git a/desktop/src/api/upload.ts b/desktop/src/api/upload.ts deleted file mode 100644 index 24d0283ff..000000000 --- a/desktop/src/api/upload.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { getElectronFile } from "../services/fs"; -import { - getElectronFilesFromGoogleZip, - getSavedFilePaths, -} from "../services/upload"; -import { uploadStatusStore } from "../stores/upload.store"; -import { ElectronFile, FILE_PATH_TYPE } from "../types/ipc"; - -export const getPendingUploads = async () => { - const filePaths = getSavedFilePaths(FILE_PATH_TYPE.FILES); - const zipPaths = getSavedFilePaths(FILE_PATH_TYPE.ZIPS); - const collectionName = uploadStatusStore.get("collectionName"); - - let files: ElectronFile[] = []; - let type: FILE_PATH_TYPE; - if (zipPaths.length) { - type = FILE_PATH_TYPE.ZIPS; - for (const zipPath of zipPaths) { - files = [ - ...files, - ...(await getElectronFilesFromGoogleZip(zipPath)), - ]; - } - const pendingFilePaths = new Set(filePaths); - files = files.filter((file) => pendingFilePaths.has(file.path)); - } else if (filePaths.length) { - type = FILE_PATH_TYPE.FILES; - files = await Promise.all(filePaths.map(getElectronFile)); - } - return { - files, - collectionName, - type, - }; -}; - -export { - getElectronFilesFromGoogleZip, - setToUploadCollection, - setToUploadFiles, -} from "../services/upload"; diff --git a/desktop/src/constants/errors.ts b/desktop/src/constants/errors.ts deleted file mode 100644 index e6225ecf6..000000000 --- a/desktop/src/constants/errors.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * [Note: Custom errors across Electron/Renderer boundary] - * - * We need to use the `message` field to disambiguate between errors thrown by - * the main process when invoked from the renderer process. This is because: - * - * > Errors thrown throw `handle` in the main process are not transparent as - * > they are serialized and only the `message` property from the original error - * > is provided to the renderer process. - * > - * > - https://www.electronjs.org/docs/latest/tutorial/ipc - * > - * > Ref: https://github.com/electron/electron/issues/24427 - */ -export const CustomErrors = { - WINDOWS_NATIVE_IMAGE_PROCESSING_NOT_SUPPORTED: - "Windows native image processing is not supported", - INVALID_OS: (os: string) => `Invalid OS - ${os}`, - WAIT_TIME_EXCEEDED: "Wait time exceeded", - UNSUPPORTED_PLATFORM: (platform: string, arch: string) => - `Unsupported platform - ${platform} ${arch}`, - MODEL_DOWNLOAD_PENDING: - "Model download pending, skipping clip search request", - INVALID_FILE_PATH: "Invalid file path", - INVALID_CLIP_MODEL: (model: string) => `Invalid Clip model - ${model}`, -}; diff --git a/desktop/src/main.ts b/desktop/src/main.ts index 4383fa73f..b1e89b40c 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -12,6 +12,7 @@ import { app, BrowserWindow, Menu } from "electron/main"; import serveNextAt from "next-electron-server"; import { existsSync } from "node:fs"; import fs from "node:fs/promises"; +import os from "node:os"; import path from "node:path"; import { addAllowOriginHeader, @@ -19,7 +20,6 @@ import { handleDockIconHideOnAutoLaunch, handleDownloads, handleExternalLinks, - logStartupBanner, setupMacWindowOnDockIconClick, setupTrayItem, } from "./main/init"; @@ -27,7 +27,7 @@ import { attachFSWatchIPCHandlers, attachIPCHandlers } from "./main/ipc"; import log, { initLogging } from "./main/log"; import { createApplicationMenu } from "./main/menu"; import { isDev } from "./main/util"; -import { setupAutoUpdater } from "./services/appUpdater"; +import { setupAutoUpdater } from "./services/app-update"; import { initWatcher } from "./services/chokidar"; let appIsQuitting = false; @@ -72,6 +72,21 @@ const setupRendererServer = () => { serveNextAt(rendererURL); }; +/** + * Log a standard startup banner. + * + * This helps us identify app starts and other environment details in the logs. + */ +const logStartupBanner = () => { + const version = isDev ? "dev" : app.getVersion(); + log.info(`Starting ente-photos-desktop ${version}`); + + const platform = process.platform; + const osRelease = os.release(); + const systemVersion = process.getSystemVersion(); + log.info("Running on", { platform, osRelease, systemVersion }); +}; + function enableSharedArrayBufferSupport() { app.commandLine.appendSwitch("enable-features", "SharedArrayBuffer"); } @@ -126,12 +141,13 @@ const deleteLegacyDiskCacheDirIfExists = async () => { } }; -function setupAppEventEmitter(mainWindow: BrowserWindow) { - // fire event when mainWindow is in foreground - mainWindow.on("focus", () => { - mainWindow.webContents.send("app-in-foreground"); - }); -} +const attachEventHandlers = (mainWindow: BrowserWindow) => { + // Let ipcRenderer know when mainWindow is in the foreground so that it can + // in turn inform the renderer process. + mainWindow.on("focus", () => + mainWindow.webContents.send("mainWindowFocus"), + ); +}; const main = () => { const gotTheLock = app.requestSingleInstanceLock(); @@ -144,6 +160,7 @@ const main = () => { initLogging(); setupRendererServer(); + logStartupBanner(); handleDockIconHideOnAutoLaunch(); increaseDiskCache(); enableSharedArrayBufferSupport(); @@ -163,7 +180,6 @@ const main = () => { // // Note that some Electron APIs can only be used after this event occurs. app.on("ready", async () => { - logStartupBanner(); mainWindow = await createWindow(); const watcher = initWatcher(mainWindow); setupTrayItem(mainWindow); @@ -175,13 +191,13 @@ const main = () => { handleDownloads(mainWindow); handleExternalLinks(mainWindow); addAllowOriginHeader(mainWindow); - setupAppEventEmitter(mainWindow); + attachEventHandlers(mainWindow); try { deleteLegacyDiskCacheDirIfExists(); } catch (e) { // Log but otherwise ignore errors during non-critical startup - // actions + // actions. log.error("Ignoring startup error", e); } }); diff --git a/desktop/src/main/init.ts b/desktop/src/main/init.ts index 0e94232aa..7f454f2e6 100644 --- a/desktop/src/main/init.ts +++ b/desktop/src/main/init.ts @@ -1,6 +1,5 @@ import { app, BrowserWindow, nativeImage, Tray } from "electron"; import { existsSync } from "node:fs"; -import os from "node:os"; import path from "node:path"; import { isAppQuitting, rendererURL } from "../main"; import autoLauncher from "../services/autoLauncher"; @@ -77,8 +76,6 @@ export const createWindow = async () => { return mainWindow; }; -export async function handleUpdates(mainWindow: BrowserWindow) {} - export const setupTrayItem = (mainWindow: BrowserWindow) => { const iconName = isPlatform("mac") ? "taskbar-icon-Template.png" @@ -149,16 +146,6 @@ export async function handleDockIconHideOnAutoLaunch() { } } -export function logStartupBanner() { - const version = isDev ? "dev" : app.getVersion(); - log.info(`Hello from ente-photos-desktop ${version}`); - - const platform = process.platform; - const osRelease = os.release(); - const systemVersion = process.getSystemVersion(); - log.info("Running on", { platform, osRelease, systemVersion }); -} - function lowerCaseHeaders(responseHeaders: Record) { const headers: Record = {}; for (const key of Object.keys(responseHeaders)) { diff --git a/desktop/src/main/ipc.ts b/desktop/src/main/ipc.ts index be9798186..ecb3e2010 100644 --- a/desktop/src/main/ipc.ts +++ b/desktop/src/main/ipc.ts @@ -10,30 +10,30 @@ import type { FSWatcher } from "chokidar"; import { ipcMain } from "electron/main"; -import { clearElectronStore } from "../api/electronStore"; -import { getEncryptionKey, setEncryptionKey } from "../api/safeStorage"; -import { - getElectronFilesFromGoogleZip, - getPendingUploads, - setToUploadCollection, - setToUploadFiles, -} from "../api/upload"; import { appVersion, - muteUpdateNotification, skipAppUpdate, updateAndRestart, -} from "../services/appUpdater"; -import { - computeImageEmbedding, - computeTextEmbedding, -} from "../services/clipService"; + updateOnNextRestart, +} from "../services/app-update"; +import { clipImageEmbedding, clipTextEmbedding } from "../services/clip"; import { runFFmpegCmd } from "../services/ffmpeg"; import { getDirFiles } from "../services/fs"; import { convertToJPEG, generateImageThumbnail, } from "../services/imageProcessor"; +import { + clearStores, + encryptionKey, + saveEncryptionKey, +} from "../services/store"; +import { + getElectronFilesFromGoogleZip, + getPendingUploads, + setToUploadCollection, + setToUploadFiles, +} from "../services/upload"; import { addWatchMapping, getWatchMappings, @@ -41,12 +41,7 @@ import { updateWatchMappingIgnoredFiles, updateWatchMappingSyncedFiles, } from "../services/watch"; -import type { - ElectronFile, - FILE_PATH_TYPE, - Model, - WatchMapping, -} from "../types/ipc"; +import type { ElectronFile, FILE_PATH_TYPE, WatchMapping } from "../types/ipc"; import { selectDirectory, showUploadDirsDialog, @@ -91,35 +86,33 @@ export const attachIPCHandlers = () => { // - General - ipcMain.handle("appVersion", (_) => appVersion()); + ipcMain.handle("appVersion", () => appVersion()); ipcMain.handle("openDirectory", (_, dirPath) => openDirectory(dirPath)); - ipcMain.handle("openLogDirectory", (_) => openLogDirectory()); + ipcMain.handle("openLogDirectory", () => openLogDirectory()); // See [Note: Catching exception during .send/.on] ipcMain.on("logToDisk", (_, message) => logToDisk(message)); - ipcMain.on("clear-electron-store", (_) => { - clearElectronStore(); - }); + ipcMain.on("clearStores", () => clearStores()); - ipcMain.handle("setEncryptionKey", (_, encryptionKey) => - setEncryptionKey(encryptionKey), + ipcMain.handle("saveEncryptionKey", (_, encryptionKey) => + saveEncryptionKey(encryptionKey), ); - ipcMain.handle("getEncryptionKey", (_) => getEncryptionKey()); + ipcMain.handle("encryptionKey", () => encryptionKey()); // - App update - ipcMain.on("update-and-restart", (_) => updateAndRestart()); + ipcMain.on("updateAndRestart", () => updateAndRestart()); - ipcMain.on("skip-app-update", (_, version) => skipAppUpdate(version)); - - ipcMain.on("mute-update-notification", (_, version) => - muteUpdateNotification(version), + ipcMain.on("updateOnNextRestart", (_, version) => + updateOnNextRestart(version), ); + ipcMain.on("skipAppUpdate", (_, version) => skipAppUpdate(version)); + // - Conversion ipcMain.handle("convertToJPEG", (_, fileData, filename) => @@ -145,25 +138,23 @@ export const attachIPCHandlers = () => { // - ML - ipcMain.handle( - "computeImageEmbedding", - (_, model: Model, imageData: Uint8Array) => - computeImageEmbedding(model, imageData), + ipcMain.handle("clipImageEmbedding", (_, jpegImageData: Uint8Array) => + clipImageEmbedding(jpegImageData), ); - ipcMain.handle("computeTextEmbedding", (_, model: Model, text: string) => - computeTextEmbedding(model, text), + ipcMain.handle("clipTextEmbedding", (_, text: string) => + clipTextEmbedding(text), ); // - File selection - ipcMain.handle("selectDirectory", (_) => selectDirectory()); + ipcMain.handle("selectDirectory", () => selectDirectory()); - ipcMain.handle("showUploadFilesDialog", (_) => showUploadFilesDialog()); + ipcMain.handle("showUploadFilesDialog", () => showUploadFilesDialog()); - ipcMain.handle("showUploadDirsDialog", (_) => showUploadDirsDialog()); + ipcMain.handle("showUploadDirsDialog", () => showUploadDirsDialog()); - ipcMain.handle("showUploadZipDialog", (_) => showUploadZipDialog()); + ipcMain.handle("showUploadZipDialog", () => showUploadZipDialog()); // - FS @@ -177,12 +168,12 @@ export const attachIPCHandlers = () => { ipcMain.handle( "saveStreamToDisk", - (_, path: string, fileStream: ReadableStream) => + (_, path: string, fileStream: ReadableStream) => saveStreamToDisk(path, fileStream), ); - ipcMain.handle("saveFileToDisk", (_, path: string, file: any) => - saveFileToDisk(path, file), + ipcMain.handle("saveFileToDisk", (_, path: string, contents: string) => + saveFileToDisk(path, contents), ); ipcMain.handle("readTextFile", (_, path: string) => readTextFile(path)); @@ -203,7 +194,7 @@ export const attachIPCHandlers = () => { // - Upload - ipcMain.handle("getPendingUploads", (_) => getPendingUploads()); + ipcMain.handle("getPendingUploads", () => getPendingUploads()); ipcMain.handle( "setToUploadFiles", @@ -252,7 +243,7 @@ export const attachFSWatchIPCHandlers = (watcher: FSWatcher) => { removeWatchMapping(watcher, folderPath), ); - ipcMain.handle("getWatchMappings", (_) => getWatchMappings()); + ipcMain.handle("getWatchMappings", () => getWatchMappings()); ipcMain.handle( "updateWatchMappingSyncedFiles", diff --git a/desktop/src/main/log.ts b/desktop/src/main/log.ts index 8787a530d..d43161fea 100644 --- a/desktop/src/main/log.ts +++ b/desktop/src/main/log.ts @@ -15,10 +15,20 @@ import { isDev } from "./util"; */ export const initLogging = () => { log.transports.file.fileName = "ente.log"; - log.transports.file.maxSize = 50 * 1024 * 1024; // 50MB; + log.transports.file.maxSize = 50 * 1024 * 1024; // 50 MB log.transports.file.format = "[{y}-{m}-{d}T{h}:{i}:{s}{z}] {text}"; log.transports.console.level = false; + + // Log unhandled errors and promise rejections. + log.errorHandler.startCatching({ + onError: ({ error, errorName }) => { + logError(errorName, error); + // Prevent the default electron-log actions (e.g. showing a dialog) + // from getting triggered. + return false; + }, + }); }; /** @@ -31,25 +41,7 @@ export const logToDisk = (message: string) => { log.info(`[rndr] ${message}`); }; -export const logError = logErrorSentry; - -/** Deprecated, but no alternative yet */ -export function logErrorSentry( - error: any, - msg: string, - info?: Record, -) { - logToDisk( - `error: ${error?.name} ${error?.message} ${ - error?.stack - } msg: ${msg} info: ${JSON.stringify(info)}`, - ); - if (isDev) { - console.log(error, { msg, info }); - } -} - -const logError1 = (message: string, e?: unknown) => { +const logError = (message: string, e?: unknown) => { if (!e) { logError_(message); return; @@ -78,11 +70,14 @@ const logInfo = (...params: any[]) => { .map((p) => (typeof p == "string" ? p : util.inspect(p))) .join(" "); log.info(`[main] ${message}`); - if (isDev) console.log(message); + if (isDev) console.log(`[info] ${message}`); }; const logDebug = (param: () => any) => { - if (isDev) console.log(`[debug] ${util.inspect(param())}`); + if (isDev) { + const p = param(); + console.log(`[debug] ${typeof p == "string" ? p : util.inspect(p)}`); + } }; /** @@ -98,12 +93,13 @@ export default { * Log an error message with an optional associated error object. * * {@link e} is generally expected to be an `instanceof Error` but it can be - * any arbitrary object that we obtain, say, when in a try-catch handler. + * any arbitrary object that we obtain, say, when in a try-catch handler (in + * JavaScript any arbitrary value can be thrown). * * The log is written to disk. In development builds, the log is also - * printed to the (Node.js process') console. + * printed to the main (Node.js) process console. */ - error: logError1, + error: logError, /** * Log a message. * @@ -111,7 +107,7 @@ export default { * arbitrary number of arbitrary parameters that it then serializes. * * The log is written to disk. In development builds, the log is also - * printed to the (Node.js process') console. + * printed to the main (Node.js) process console. */ info: logInfo, /** @@ -121,11 +117,11 @@ export default { * function to call to get the log message instead of directly taking the * message. The provided function will only be called in development builds. * - * The function can return an arbitrary value which is serialied before + * The function can return an arbitrary value which is serialized before * being logged. * - * This log is not written to disk. It is printed to the (Node.js process') - * console only on development builds. + * This log is NOT written to disk. And it is printed to the main (Node.js) + * process console, but only on development builds. */ debug: logDebug, }; diff --git a/desktop/src/main/menu.ts b/desktop/src/main/menu.ts index 658932961..c6ac1688a 100644 --- a/desktop/src/main/menu.ts +++ b/desktop/src/main/menu.ts @@ -6,7 +6,7 @@ import { shell, } from "electron"; import { setIsAppQuitting } from "../main"; -import { forceCheckForUpdateAndNotify } from "../services/appUpdater"; +import { forceCheckForAppUpdates } from "../services/app-update"; import autoLauncher from "../services/autoLauncher"; import { getHideDockIconPreference, @@ -26,8 +26,7 @@ export const createApplicationMenu = async (mainWindow: BrowserWindow) => { const macOSOnly = (options: MenuItemConstructorOptions[]) => process.platform == "darwin" ? options : []; - const handleCheckForUpdates = () => - forceCheckForUpdateAndNotify(mainWindow); + const handleCheckForUpdates = () => forceCheckForAppUpdates(mainWindow); const handleViewChangelog = () => shell.openExternal( diff --git a/desktop/src/preload.ts b/desktop/src/preload.ts index 4b171e28e..07736502b 100644 --- a/desktop/src/preload.ts +++ b/desktop/src/preload.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-unused-vars */ /** * @file The preload script * @@ -31,9 +32,9 @@ * and when changing one of them, remember to see if the other two also need * changing: * - * - [renderer] web/packages/shared/electron/types.ts contains docs - * - [preload] desktop/src/preload.ts ↕︎ - * - [main] desktop/src/main/ipc.ts contains impl + * - [renderer] web/packages/next/types/electron.ts contains docs + * - [preload] desktop/src/preload.ts ↕︎ + * - [main] desktop/src/main/ipc.ts contains impl */ import { contextBridge, ipcRenderer } from "electron/renderer"; @@ -44,7 +45,6 @@ import type { AppUpdateInfo, ElectronFile, FILE_PATH_TYPE, - Model, WatchMapping, } from "./types/ipc"; @@ -52,60 +52,55 @@ import type { const appVersion = (): Promise => ipcRenderer.invoke("appVersion"); +const logToDisk = (message: string): void => + ipcRenderer.send("logToDisk", message); + const openDirectory = (dirPath: string): Promise => - ipcRenderer.invoke("openDirectory"); + ipcRenderer.invoke("openDirectory", dirPath); const openLogDirectory = (): Promise => ipcRenderer.invoke("openLogDirectory"); -const logToDisk = (message: string): void => - ipcRenderer.send("logToDisk", message); +const clearStores = () => ipcRenderer.send("clearStores"); + +const encryptionKey = (): Promise => + ipcRenderer.invoke("encryptionKey"); + +const saveEncryptionKey = (encryptionKey: string): Promise => + ipcRenderer.invoke("saveEncryptionKey", encryptionKey); + +const onMainWindowFocus = (cb?: () => void) => { + ipcRenderer.removeAllListeners("mainWindowFocus"); + if (cb) ipcRenderer.on("mainWindowFocus", cb); +}; + +// - App update + +const onAppUpdateAvailable = ( + cb?: ((updateInfo: AppUpdateInfo) => void) | undefined, +) => { + ipcRenderer.removeAllListeners("appUpdateAvailable"); + if (cb) { + ipcRenderer.on("appUpdateAvailable", (_, updateInfo: AppUpdateInfo) => + cb(updateInfo), + ); + } +}; + +const updateAndRestart = () => ipcRenderer.send("updateAndRestart"); + +const updateOnNextRestart = (version: string) => + ipcRenderer.send("updateOnNextRestart", version); + +const skipAppUpdate = (version: string) => { + ipcRenderer.send("skipAppUpdate", version); +}; const fsExists = (path: string): Promise => ipcRenderer.invoke("fsExists", path); // - AUDIT below this -const registerForegroundEventListener = (onForeground: () => void) => { - ipcRenderer.removeAllListeners("app-in-foreground"); - ipcRenderer.on("app-in-foreground", () => { - onForeground(); - }); -}; - -const clearElectronStore = () => { - ipcRenderer.send("clear-electron-store"); -}; - -const setEncryptionKey = (encryptionKey: string): Promise => - ipcRenderer.invoke("setEncryptionKey", encryptionKey); - -const getEncryptionKey = (): Promise => - ipcRenderer.invoke("getEncryptionKey"); - -// - App update - -const registerUpdateEventListener = ( - showUpdateDialog: (updateInfo: AppUpdateInfo) => void, -) => { - ipcRenderer.removeAllListeners("show-update-dialog"); - ipcRenderer.on("show-update-dialog", (_, updateInfo: AppUpdateInfo) => { - showUpdateDialog(updateInfo); - }); -}; - -const updateAndRestart = () => { - ipcRenderer.send("update-and-restart"); -}; - -const skipAppUpdate = (version: string) => { - ipcRenderer.send("skip-app-update", version); -}; - -const muteUpdateNotification = (version: string) => { - ipcRenderer.send("mute-update-notification", version); -}; - // - Conversion const convertToJPEG = ( @@ -142,17 +137,11 @@ const runFFmpegCmd = ( // - ML -const computeImageEmbedding = ( - model: Model, - imageData: Uint8Array, -): Promise => - ipcRenderer.invoke("computeImageEmbedding", model, imageData); +const clipImageEmbedding = (jpegImageData: Uint8Array): Promise => + ipcRenderer.invoke("clipImageEmbedding", jpegImageData); -const computeTextEmbedding = ( - model: Model, - text: string, -): Promise => - ipcRenderer.invoke("computeTextEmbedding", model, text); +const clipTextEmbedding = (text: string): Promise => + ipcRenderer.invoke("clipTextEmbedding", text); // - File selection @@ -228,11 +217,11 @@ const checkExistsAndCreateDir = (dirPath: string): Promise => const saveStreamToDisk = ( path: string, - fileStream: ReadableStream, + fileStream: ReadableStream, ): Promise => ipcRenderer.invoke("saveStreamToDisk", path, fileStream); -const saveFileToDisk = (path: string, file: any): Promise => - ipcRenderer.invoke("saveFileToDisk", path, file); +const saveFileToDisk = (path: string, contents: string): Promise => + ipcRenderer.invoke("saveFileToDisk", path, contents); const readTextFile = (path: string): Promise => ipcRenderer.invoke("readTextFile", path); @@ -308,24 +297,22 @@ const getDirFiles = (dirPath: string): Promise => // // The copy itself is relatively fast, but the problem with transfering large // amounts of data is potentially running out of memory during the copy. -contextBridge.exposeInMainWorld("ElectronAPIs", { +contextBridge.exposeInMainWorld("electron", { // - General appVersion, - openDirectory, - registerForegroundEventListener, - clearElectronStore, - getEncryptionKey, - setEncryptionKey, - - // - Logging - openLogDirectory, logToDisk, + openDirectory, + openLogDirectory, + clearStores, + encryptionKey, + saveEncryptionKey, + onMainWindowFocus, // - App update + onAppUpdateAvailable, updateAndRestart, + updateOnNextRestart, skipAppUpdate, - muteUpdateNotification, - registerUpdateEventListener, // - Conversion convertToJPEG, @@ -333,8 +320,8 @@ contextBridge.exposeInMainWorld("ElectronAPIs", { runFFmpegCmd, // - ML - computeImageEmbedding, - computeTextEmbedding, + clipImageEmbedding, + clipTextEmbedding, // - File selection selectDirectory, diff --git a/desktop/src/services/app-update.ts b/desktop/src/services/app-update.ts new file mode 100644 index 000000000..ec592095e --- /dev/null +++ b/desktop/src/services/app-update.ts @@ -0,0 +1,98 @@ +import { compareVersions } from "compare-versions"; +import { app, BrowserWindow } from "electron"; +import { default as electronLog } from "electron-log"; +import { autoUpdater } from "electron-updater"; +import { setIsAppQuitting, setIsUpdateAvailable } from "../main"; +import log from "../main/log"; +import { userPreferencesStore } from "../stores/user-preferences"; +import { AppUpdateInfo } from "../types/ipc"; + +export const setupAutoUpdater = (mainWindow: BrowserWindow) => { + autoUpdater.logger = electronLog; + autoUpdater.autoDownload = false; + + const oneDay = 1 * 24 * 60 * 60 * 1000; + setInterval(() => checkForUpdatesAndNotify(mainWindow), oneDay); + checkForUpdatesAndNotify(mainWindow); +}; + +/** + * Check for app update check ignoring any previously saved skips / mutes. + */ +export const forceCheckForAppUpdates = (mainWindow: BrowserWindow) => { + userPreferencesStore.delete("skipAppVersion"); + userPreferencesStore.delete("muteUpdateNotificationVersion"); + checkForUpdatesAndNotify(mainWindow); +}; + +const checkForUpdatesAndNotify = async (mainWindow: BrowserWindow) => { + try { + const { updateInfo } = await autoUpdater.checkForUpdates(); + const { version } = updateInfo; + + log.debug(() => `Checking for updates found version ${version}`); + + if (compareVersions(version, app.getVersion()) <= 0) { + log.debug(() => "Skipping update, already at latest version"); + return; + } + + if (version === userPreferencesStore.get("skipAppVersion")) { + log.info(`User chose to skip version ${version}`); + return; + } + + const mutedVersion = userPreferencesStore.get( + "muteUpdateNotificationVersion", + ); + if (version === mutedVersion) { + log.info( + `User has muted update notifications for version ${version}`, + ); + return; + } + + const showUpdateDialog = (updateInfo: AppUpdateInfo) => + mainWindow.webContents.send("appUpdateAvailable", updateInfo); + + log.debug(() => "Attempting auto update"); + autoUpdater.downloadUpdate(); + + let timeout: NodeJS.Timeout; + const fiveMinutes = 5 * 60 * 1000; + autoUpdater.on("update-downloaded", () => { + timeout = setTimeout( + () => showUpdateDialog({ autoUpdatable: true, version }), + fiveMinutes, + ); + }); + autoUpdater.on("error", (error) => { + clearTimeout(timeout); + log.error("Auto update failed", error); + showUpdateDialog({ autoUpdatable: false, version }); + }); + + setIsUpdateAvailable(true); + } catch (e) { + log.error("checkForUpdateAndNotify failed", e); + } +}; + +/** + * Return the version of the desktop app + * + * The return value is of the form `v1.2.3`. + */ +export const appVersion = () => `v${app.getVersion()}`; + +export const updateAndRestart = () => { + log.info("Restarting the app to apply update"); + setIsAppQuitting(true); + autoUpdater.quitAndInstall(); +}; + +export const updateOnNextRestart = (version: string) => + userPreferencesStore.set("muteUpdateNotificationVersion", version); + +export const skipAppUpdate = (version: string) => + userPreferencesStore.set("skipAppVersion", version); diff --git a/desktop/src/services/appUpdater.ts b/desktop/src/services/appUpdater.ts deleted file mode 100644 index 98db606a4..000000000 --- a/desktop/src/services/appUpdater.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { compareVersions } from "compare-versions"; -import { app, BrowserWindow } from "electron"; -import { default as ElectronLog, default as log } from "electron-log"; -import { autoUpdater } from "electron-updater"; -import { setIsAppQuitting, setIsUpdateAvailable } from "../main"; -import { logErrorSentry } from "../main/log"; -import { AppUpdateInfo } from "../types/ipc"; -import { - clearMuteUpdateNotificationVersion, - clearSkipAppVersion, - getMuteUpdateNotificationVersion, - getSkipAppVersion, - setMuteUpdateNotificationVersion, - setSkipAppVersion, -} from "./userPreference"; - -const FIVE_MIN_IN_MICROSECOND = 5 * 60 * 1000; -const ONE_DAY_IN_MICROSECOND = 1 * 24 * 60 * 60 * 1000; - -export function setupAutoUpdater(mainWindow: BrowserWindow) { - autoUpdater.logger = log; - autoUpdater.autoDownload = false; - checkForUpdateAndNotify(mainWindow); - setInterval( - () => checkForUpdateAndNotify(mainWindow), - ONE_DAY_IN_MICROSECOND, - ); -} - -export function forceCheckForUpdateAndNotify(mainWindow: BrowserWindow) { - try { - clearSkipAppVersion(); - clearMuteUpdateNotificationVersion(); - checkForUpdateAndNotify(mainWindow); - } catch (e) { - logErrorSentry(e, "forceCheckForUpdateAndNotify failed"); - } -} - -async function checkForUpdateAndNotify(mainWindow: BrowserWindow) { - try { - log.debug("checkForUpdateAndNotify called"); - const updateCheckResult = await autoUpdater.checkForUpdates(); - log.debug("update version", updateCheckResult.updateInfo.version); - if ( - compareVersions( - updateCheckResult.updateInfo.version, - app.getVersion(), - ) <= 0 - ) { - log.debug("already at latest version"); - return; - } - const skipAppVersion = getSkipAppVersion(); - if ( - skipAppVersion && - updateCheckResult.updateInfo.version === skipAppVersion - ) { - log.info( - "user chose to skip version ", - updateCheckResult.updateInfo.version, - ); - return; - } - - let timeout: NodeJS.Timeout; - log.debug("attempting auto update"); - autoUpdater.downloadUpdate(); - const muteUpdateNotificationVersion = - getMuteUpdateNotificationVersion(); - if ( - muteUpdateNotificationVersion && - updateCheckResult.updateInfo.version === - muteUpdateNotificationVersion - ) { - log.info( - "user chose to mute update notification for version ", - updateCheckResult.updateInfo.version, - ); - return; - } - autoUpdater.on("update-downloaded", () => { - timeout = setTimeout( - () => - showUpdateDialog(mainWindow, { - autoUpdatable: true, - version: updateCheckResult.updateInfo.version, - }), - FIVE_MIN_IN_MICROSECOND, - ); - }); - autoUpdater.on("error", (error) => { - clearTimeout(timeout); - logErrorSentry(error, "auto update failed"); - showUpdateDialog(mainWindow, { - autoUpdatable: false, - version: updateCheckResult.updateInfo.version, - }); - }); - - setIsUpdateAvailable(true); - } catch (e) { - logErrorSentry(e, "checkForUpdateAndNotify failed"); - } -} - -export function updateAndRestart() { - ElectronLog.log("user quit the app"); - setIsAppQuitting(true); - autoUpdater.quitAndInstall(); -} - -/** - * Return the version of the desktop app - * - * The return value is of the form `v1.2.3`. - */ -export const appVersion = () => `v${app.getVersion()}`; - -export function skipAppUpdate(version: string) { - setSkipAppVersion(version); -} - -export function muteUpdateNotification(version: string) { - setMuteUpdateNotificationVersion(version); -} - -function showUpdateDialog( - mainWindow: BrowserWindow, - updateInfo: AppUpdateInfo, -) { - mainWindow.webContents.send("show-update-dialog", updateInfo); -} diff --git a/desktop/src/services/chokidar.ts b/desktop/src/services/chokidar.ts index 57a0e504e..cef386ea3 100644 --- a/desktop/src/services/chokidar.ts +++ b/desktop/src/services/chokidar.ts @@ -1,7 +1,7 @@ import chokidar from "chokidar"; import { BrowserWindow } from "electron"; import path from "path"; -import { logError } from "../main/log"; +import log from "../main/log"; import { getWatchMappings } from "../services/watch"; import { getElectronFile } from "./fs"; @@ -38,7 +38,7 @@ export function initWatcher(mainWindow: BrowserWindow) { ); }) .on("error", (error) => { - logError(error, "error while watching files"); + log.error("Error while watching files", error); }); return watcher; diff --git a/desktop/src/services/clip.ts b/desktop/src/services/clip.ts new file mode 100644 index 000000000..5de05e601 --- /dev/null +++ b/desktop/src/services/clip.ts @@ -0,0 +1,288 @@ +/** + * @file Compute CLIP embeddings + * + * @see `web/apps/photos/src/services/clip-service.ts` for more details. This + * file implements the Node.js implementation of the actual embedding + * computation. By doing it in the Node.js layer, we can use the binary ONNX + * runtimes which are 10-20x faster than the WASM based web ones. + * + * The embeddings are computed using ONNX runtime. The model itself is not + * shipped with the app but is downloaded on demand. + */ +import { app, net } from "electron/main"; +import { existsSync } from "fs"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { writeStream } from "../main/fs"; +import log from "../main/log"; +import { CustomErrors } from "../types/ipc"; +import Tokenizer from "../utils/clip-bpe-ts/mod"; +import { generateTempFilePath } from "../utils/temp"; +import { deleteTempFile } from "./ffmpeg"; +const jpeg = require("jpeg-js"); +const ort = require("onnxruntime-node"); + +const textModelName = "clip-text-vit-32-uint8.onnx"; +const textModelByteSize = 64173509; // 61.2 MB + +const imageModelName = "clip-image-vit-32-float32.onnx"; +const imageModelByteSize = 351468764; // 335.2 MB + +/** Return the path where the given {@link modelName} is meant to be saved */ +const modelSavePath = (modelName: string) => + path.join(app.getPath("userData"), "models", modelName); + +const downloadModel = async (saveLocation: string, name: string) => { + // `mkdir -p` the directory where we want to save the model. + const saveDir = path.dirname(saveLocation); + await fs.mkdir(saveDir, { recursive: true }); + // Download + log.info(`Downloading CLIP model from ${name}`); + const url = `https://models.ente.io/${name}`; + const res = await net.fetch(url); + if (!res.ok) throw new Error(`Failed to fetch ${url}: HTTP ${res.status}`); + // Save + await writeStream(saveLocation, res.body); + log.info(`Downloaded CLIP model ${name}`); +}; + +let activeImageModelDownload: Promise | undefined; + +const imageModelPathDownloadingIfNeeded = async () => { + try { + const modelPath = modelSavePath(imageModelName); + if (activeImageModelDownload) { + log.info("Waiting for CLIP image model download to finish"); + await activeImageModelDownload; + } else { + if (!existsSync(modelPath)) { + log.info("CLIP image model not found, downloading"); + activeImageModelDownload = downloadModel( + modelPath, + imageModelName, + ); + await activeImageModelDownload; + } else { + const localFileSize = (await fs.stat(modelPath)).size; + if (localFileSize !== imageModelByteSize) { + log.error( + `CLIP image model size ${localFileSize} does not match the expected size, downloading again`, + ); + activeImageModelDownload = downloadModel( + modelPath, + imageModelName, + ); + await activeImageModelDownload; + } + } + } + return modelPath; + } finally { + activeImageModelDownload = undefined; + } +}; + +let textModelDownloadInProgress = false; + +const textModelPathDownloadingIfNeeded = async () => { + if (textModelDownloadInProgress) + throw Error(CustomErrors.MODEL_DOWNLOAD_PENDING); + + const modelPath = modelSavePath(textModelName); + if (!existsSync(modelPath)) { + log.info("CLIP text model not found, downloading"); + textModelDownloadInProgress = true; + downloadModel(modelPath, textModelName) + .catch((e) => { + // log but otherwise ignore + log.error("CLIP text model download failed", e); + }) + .finally(() => { + textModelDownloadInProgress = false; + }); + throw Error(CustomErrors.MODEL_DOWNLOAD_PENDING); + } else { + const localFileSize = (await fs.stat(modelPath)).size; + if (localFileSize !== textModelByteSize) { + log.error( + `CLIP text model size ${localFileSize} does not match the expected size, downloading again`, + ); + textModelDownloadInProgress = true; + downloadModel(modelPath, textModelName) + .catch((e) => { + // log but otherwise ignore + log.error("CLIP text model download failed", e); + }) + .finally(() => { + textModelDownloadInProgress = false; + }); + throw Error(CustomErrors.MODEL_DOWNLOAD_PENDING); + } + } + + return modelPath; +}; + +const createInferenceSession = async (modelPath: string) => { + return await ort.InferenceSession.create(modelPath, { + intraOpNumThreads: 1, + enableCpuMemArena: false, + }); +}; + +let imageSessionPromise: Promise | undefined; + +const onnxImageSession = async () => { + if (!imageSessionPromise) { + imageSessionPromise = (async () => { + const modelPath = await imageModelPathDownloadingIfNeeded(); + return createInferenceSession(modelPath); + })(); + } + return imageSessionPromise; +}; + +let _textSession: any = null; + +const onnxTextSession = async () => { + if (!_textSession) { + const modelPath = await textModelPathDownloadingIfNeeded(); + _textSession = await createInferenceSession(modelPath); + } + return _textSession; +}; + +export const clipImageEmbedding = async (jpegImageData: Uint8Array) => { + const tempFilePath = await generateTempFilePath(""); + const imageStream = new Response(jpegImageData.buffer).body; + await writeStream(tempFilePath, imageStream); + try { + return await clipImageEmbedding_(tempFilePath); + } finally { + await deleteTempFile(tempFilePath); + } +}; + +const clipImageEmbedding_ = async (jpegFilePath: string) => { + const imageSession = await onnxImageSession(); + const t1 = Date.now(); + const rgbData = await getRGBData(jpegFilePath); + const feeds = { + input: new ort.Tensor("float32", rgbData, [1, 3, 224, 224]), + }; + const t2 = Date.now(); + const results = await imageSession.run(feeds); + log.debug( + () => + `CLIP image embedding took ${Date.now() - t1} ms (prep: ${t2 - t1} ms, inference: ${Date.now() - t2} ms)`, + ); + const imageEmbedding = results["output"].data; // Float32Array + return normalizeEmbedding(imageEmbedding); +}; + +const getRGBData = async (jpegFilePath: string) => { + const jpegData = await fs.readFile(jpegFilePath); + const rawImageData = jpeg.decode(jpegData, { + useTArray: true, + formatAsRGBA: false, + }); + + const nx: number = rawImageData.width; + const ny: number = rawImageData.height; + const inputImage: Uint8Array = rawImageData.data; + + const nx2: number = 224; + const ny2: number = 224; + const totalSize: number = 3 * nx2 * ny2; + + const result: number[] = Array(totalSize).fill(0); + const scale: number = Math.max(nx, ny) / 224; + + const nx3: number = Math.round(nx / scale); + const ny3: number = Math.round(ny / scale); + + const mean: number[] = [0.48145466, 0.4578275, 0.40821073]; + const std: number[] = [0.26862954, 0.26130258, 0.27577711]; + + for (let y = 0; y < ny3; y++) { + for (let x = 0; x < nx3; x++) { + for (let c = 0; c < 3; c++) { + // Linear interpolation + const sx: number = (x + 0.5) * scale - 0.5; + const sy: number = (y + 0.5) * scale - 0.5; + + const x0: number = Math.max(0, Math.floor(sx)); + const y0: number = Math.max(0, Math.floor(sy)); + + const x1: number = Math.min(x0 + 1, nx - 1); + const y1: number = Math.min(y0 + 1, ny - 1); + + const dx: number = sx - x0; + const dy: number = sy - y0; + + const j00: number = 3 * (y0 * nx + x0) + c; + const j01: number = 3 * (y0 * nx + x1) + c; + const j10: number = 3 * (y1 * nx + x0) + c; + const j11: number = 3 * (y1 * nx + x1) + c; + + const v00: number = inputImage[j00]; + const v01: number = inputImage[j01]; + const v10: number = inputImage[j10]; + const v11: number = inputImage[j11]; + + const v0: number = v00 * (1 - dx) + v01 * dx; + const v1: number = v10 * (1 - dx) + v11 * dx; + + const v: number = v0 * (1 - dy) + v1 * dy; + + const v2: number = Math.min(Math.max(Math.round(v), 0), 255); + + // createTensorWithDataList is dumb compared to reshape and + // hence has to be given with one channel after another + const i: number = y * nx3 + x + (c % 3) * 224 * 224; + + result[i] = (v2 / 255 - mean[c]) / std[c]; + } + } + } + + return result; +}; + +const normalizeEmbedding = (embedding: Float32Array) => { + let normalization = 0; + for (let index = 0; index < embedding.length; index++) { + normalization += embedding[index] * embedding[index]; + } + const sqrtNormalization = Math.sqrt(normalization); + for (let index = 0; index < embedding.length; index++) { + embedding[index] = embedding[index] / sqrtNormalization; + } + return embedding; +}; + +let _tokenizer: Tokenizer = null; +const getTokenizer = () => { + if (!_tokenizer) { + _tokenizer = new Tokenizer(); + } + return _tokenizer; +}; + +export const clipTextEmbedding = async (text: string) => { + const imageSession = await onnxTextSession(); + const t1 = Date.now(); + const tokenizer = getTokenizer(); + const tokenizedText = Int32Array.from(tokenizer.encodeForCLIP(text)); + const feeds = { + input: new ort.Tensor("int32", tokenizedText, [1, 77]), + }; + const t2 = Date.now(); + const results = await imageSession.run(feeds); + log.debug( + () => + `CLIP text embedding took ${Date.now() - t1} ms (prep: ${t2 - t1} ms, inference: ${Date.now() - t2} ms)`, + ); + const textEmbedding = results["output"].data; + return normalizeEmbedding(textEmbedding); +}; diff --git a/desktop/src/services/clipService.ts b/desktop/src/services/clipService.ts deleted file mode 100644 index 41e559a9b..000000000 --- a/desktop/src/services/clipService.ts +++ /dev/null @@ -1,506 +0,0 @@ -import { app, net } from "electron/main"; -import { existsSync } from "fs"; -import fs from "node:fs/promises"; -import path from "node:path"; -import { CustomErrors } from "../constants/errors"; -import { writeStream } from "../main/fs"; -import log, { logErrorSentry } from "../main/log"; -import { execAsync, isDev } from "../main/util"; -import { Model } from "../types/ipc"; -import Tokenizer from "../utils/clip-bpe-ts/mod"; -import { getPlatform } from "../utils/common/platform"; -import { generateTempFilePath } from "../utils/temp"; -import { deleteTempFile } from "./ffmpeg"; -const jpeg = require("jpeg-js"); - -const CLIP_MODEL_PATH_PLACEHOLDER = "CLIP_MODEL"; -const GGMLCLIP_PATH_PLACEHOLDER = "GGML_PATH"; -const INPUT_PATH_PLACEHOLDER = "INPUT"; - -const IMAGE_EMBEDDING_EXTRACT_CMD: string[] = [ - GGMLCLIP_PATH_PLACEHOLDER, - "-mv", - CLIP_MODEL_PATH_PLACEHOLDER, - "--image", - INPUT_PATH_PLACEHOLDER, -]; - -const TEXT_EMBEDDING_EXTRACT_CMD: string[] = [ - GGMLCLIP_PATH_PLACEHOLDER, - "-mt", - CLIP_MODEL_PATH_PLACEHOLDER, - "--text", - INPUT_PATH_PLACEHOLDER, -]; -const ort = require("onnxruntime-node"); - -const TEXT_MODEL_DOWNLOAD_URL = { - ggml: "https://models.ente.io/clip-vit-base-patch32_ggml-text-model-f16.gguf", - onnx: "https://models.ente.io/clip-text-vit-32-uint8.onnx", -}; -const IMAGE_MODEL_DOWNLOAD_URL = { - ggml: "https://models.ente.io/clip-vit-base-patch32_ggml-vision-model-f16.gguf", - onnx: "https://models.ente.io/clip-image-vit-32-float32.onnx", -}; - -const TEXT_MODEL_NAME = { - ggml: "clip-vit-base-patch32_ggml-text-model-f16.gguf", - onnx: "clip-text-vit-32-uint8.onnx", -}; -const IMAGE_MODEL_NAME = { - ggml: "clip-vit-base-patch32_ggml-vision-model-f16.gguf", - onnx: "clip-image-vit-32-float32.onnx", -}; - -const IMAGE_MODEL_SIZE_IN_BYTES = { - ggml: 175957504, // 167.8 MB - onnx: 351468764, // 335.2 MB -}; -const TEXT_MODEL_SIZE_IN_BYTES = { - ggml: 127853440, // 121.9 MB, - onnx: 64173509, // 61.2 MB -}; - -/** Return the path where the given {@link modelName} is meant to be saved */ -const getModelSavePath = (modelName: string) => - path.join(app.getPath("userData"), "models", modelName); - -async function downloadModel(saveLocation: string, url: string) { - // confirm that the save location exists - const saveDir = path.dirname(saveLocation); - await fs.mkdir(saveDir, { recursive: true }); - log.info("downloading clip model"); - const res = await net.fetch(url); - if (!res.ok) throw new Error(`Failed to fetch ${url}: HTTP ${res.status}`); - await writeStream(saveLocation, res.body); - log.info("clip model downloaded"); -} - -let imageModelDownloadInProgress: Promise = null; - -export async function getClipImageModelPath(type: "ggml" | "onnx") { - try { - const modelSavePath = getModelSavePath(IMAGE_MODEL_NAME[type]); - if (imageModelDownloadInProgress) { - log.info("waiting for image model download to finish"); - await imageModelDownloadInProgress; - } else { - if (!existsSync(modelSavePath)) { - log.info("clip image model not found, downloading"); - imageModelDownloadInProgress = downloadModel( - modelSavePath, - IMAGE_MODEL_DOWNLOAD_URL[type], - ); - await imageModelDownloadInProgress; - } else { - const localFileSize = (await fs.stat(modelSavePath)).size; - if (localFileSize !== IMAGE_MODEL_SIZE_IN_BYTES[type]) { - log.info( - `clip image model size mismatch, downloading again got: ${localFileSize}`, - ); - imageModelDownloadInProgress = downloadModel( - modelSavePath, - IMAGE_MODEL_DOWNLOAD_URL[type], - ); - await imageModelDownloadInProgress; - } - } - } - return modelSavePath; - } finally { - imageModelDownloadInProgress = null; - } -} - -let textModelDownloadInProgress: boolean = false; - -export async function getClipTextModelPath(type: "ggml" | "onnx") { - const modelSavePath = getModelSavePath(TEXT_MODEL_NAME[type]); - if (textModelDownloadInProgress) { - throw Error(CustomErrors.MODEL_DOWNLOAD_PENDING); - } else { - if (!existsSync(modelSavePath)) { - log.info("clip text model not found, downloading"); - textModelDownloadInProgress = true; - downloadModel(modelSavePath, TEXT_MODEL_DOWNLOAD_URL[type]) - .catch(() => { - // ignore - }) - .finally(() => { - textModelDownloadInProgress = false; - }); - throw Error(CustomErrors.MODEL_DOWNLOAD_PENDING); - } else { - const localFileSize = (await fs.stat(modelSavePath)).size; - if (localFileSize !== TEXT_MODEL_SIZE_IN_BYTES[type]) { - log.info( - `clip text model size mismatch, downloading again got: ${localFileSize}`, - ); - textModelDownloadInProgress = true; - downloadModel(modelSavePath, TEXT_MODEL_DOWNLOAD_URL[type]) - .catch(() => { - // ignore - }) - .finally(() => { - textModelDownloadInProgress = false; - }); - throw Error(CustomErrors.MODEL_DOWNLOAD_PENDING); - } - } - } - return modelSavePath; -} - -function getGGMLClipPath() { - return isDev - ? path.join("./build", `ggmlclip-${getPlatform()}`) - : path.join(process.resourcesPath, `ggmlclip-${getPlatform()}`); -} - -async function createOnnxSession(modelPath: string) { - return await ort.InferenceSession.create(modelPath, { - intraOpNumThreads: 1, - enableCpuMemArena: false, - }); -} - -let onnxImageSessionPromise: Promise = null; - -async function getOnnxImageSession() { - if (!onnxImageSessionPromise) { - onnxImageSessionPromise = (async () => { - const clipModelPath = await getClipImageModelPath("onnx"); - return createOnnxSession(clipModelPath); - })(); - } - return onnxImageSessionPromise; -} - -let onnxTextSession: any = null; - -async function getOnnxTextSession() { - if (!onnxTextSession) { - const clipModelPath = await getClipTextModelPath("onnx"); - onnxTextSession = await createOnnxSession(clipModelPath); - } - return onnxTextSession; -} - -let tokenizer: Tokenizer = null; -function getTokenizer() { - if (!tokenizer) { - tokenizer = new Tokenizer(); - } - return tokenizer; -} - -export const computeImageEmbedding = async ( - model: Model, - imageData: Uint8Array, -): Promise => { - let tempInputFilePath = null; - try { - tempInputFilePath = await generateTempFilePath(""); - const imageStream = new Response(imageData.buffer).body; - await writeStream(tempInputFilePath, imageStream); - const embedding = await computeImageEmbedding_( - model, - tempInputFilePath, - ); - return embedding; - } catch (err) { - if (isExecError(err)) { - const parsedExecError = parseExecError(err); - throw Error(parsedExecError); - } else { - throw err; - } - } finally { - if (tempInputFilePath) { - await deleteTempFile(tempInputFilePath); - } - } -}; - -const isExecError = (err: any) => { - return err.message.includes("Command failed:"); -}; - -const parseExecError = (err: any) => { - const errMessage = err.message; - if (errMessage.includes("Bad CPU type in executable")) { - return CustomErrors.UNSUPPORTED_PLATFORM( - process.platform, - process.arch, - ); - } else { - return errMessage; - } -}; - -async function computeImageEmbedding_( - model: Model, - inputFilePath: string, -): Promise { - if (!existsSync(inputFilePath)) { - throw Error(CustomErrors.INVALID_FILE_PATH); - } - if (model === Model.GGML_CLIP) { - return await computeGGMLImageEmbedding(inputFilePath); - } else if (model === Model.ONNX_CLIP) { - return await computeONNXImageEmbedding(inputFilePath); - } else { - throw Error(CustomErrors.INVALID_CLIP_MODEL(model)); - } -} - -export async function computeGGMLImageEmbedding( - inputFilePath: string, -): Promise { - try { - const clipModelPath = await getClipImageModelPath("ggml"); - const ggmlclipPath = getGGMLClipPath(); - const cmd = IMAGE_EMBEDDING_EXTRACT_CMD.map((cmdPart) => { - if (cmdPart === GGMLCLIP_PATH_PLACEHOLDER) { - return ggmlclipPath; - } else if (cmdPart === CLIP_MODEL_PATH_PLACEHOLDER) { - return clipModelPath; - } else if (cmdPart === INPUT_PATH_PLACEHOLDER) { - return inputFilePath; - } else { - return cmdPart; - } - }); - - const { stdout } = await execAsync(cmd); - // parse stdout and return embedding - // get the last line of stdout - const lines = stdout.split("\n"); - const lastLine = lines[lines.length - 1]; - const embedding = JSON.parse(lastLine); - const embeddingArray = new Float32Array(embedding); - return embeddingArray; - } catch (err) { - log.error("Failed to compute GGML image embedding", err); - throw err; - } -} - -export async function computeONNXImageEmbedding( - inputFilePath: string, -): Promise { - try { - const imageSession = await getOnnxImageSession(); - const t1 = Date.now(); - const rgbData = await getRGBData(inputFilePath); - const feeds = { - input: new ort.Tensor("float32", rgbData, [1, 3, 224, 224]), - }; - const t2 = Date.now(); - const results = await imageSession.run(feeds); - log.info( - `onnx image embedding time: ${Date.now() - t1} ms (prep:${ - t2 - t1 - } ms, extraction: ${Date.now() - t2} ms)`, - ); - const imageEmbedding = results["output"].data; // Float32Array - return normalizeEmbedding(imageEmbedding); - } catch (err) { - log.error("Failed to compute ONNX image embedding", err); - throw err; - } -} - -export async function computeTextEmbedding( - model: Model, - text: string, -): Promise { - try { - const embedding = computeTextEmbedding_(model, text); - return embedding; - } catch (err) { - if (isExecError(err)) { - const parsedExecError = parseExecError(err); - throw Error(parsedExecError); - } else { - throw err; - } - } -} - -async function computeTextEmbedding_( - model: Model, - text: string, -): Promise { - if (model === Model.GGML_CLIP) { - return await computeGGMLTextEmbedding(text); - } else { - return await computeONNXTextEmbedding(text); - } -} - -export async function computeGGMLTextEmbedding( - text: string, -): Promise { - try { - const clipModelPath = await getClipTextModelPath("ggml"); - const ggmlclipPath = getGGMLClipPath(); - const cmd = TEXT_EMBEDDING_EXTRACT_CMD.map((cmdPart) => { - if (cmdPart === GGMLCLIP_PATH_PLACEHOLDER) { - return ggmlclipPath; - } else if (cmdPart === CLIP_MODEL_PATH_PLACEHOLDER) { - return clipModelPath; - } else if (cmdPart === INPUT_PATH_PLACEHOLDER) { - return text; - } else { - return cmdPart; - } - }); - - const { stdout } = await execAsync(cmd); - // parse stdout and return embedding - // get the last line of stdout - const lines = stdout.split("\n"); - const lastLine = lines[lines.length - 1]; - const embedding = JSON.parse(lastLine); - const embeddingArray = new Float32Array(embedding); - return embeddingArray; - } catch (err) { - if (err.message === CustomErrors.MODEL_DOWNLOAD_PENDING) { - log.info(CustomErrors.MODEL_DOWNLOAD_PENDING); - } else { - log.error("Failed to compute GGML text embedding", err); - } - throw err; - } -} - -export async function computeONNXTextEmbedding( - text: string, -): Promise { - try { - const imageSession = await getOnnxTextSession(); - const t1 = Date.now(); - const tokenizer = getTokenizer(); - const tokenizedText = Int32Array.from(tokenizer.encodeForCLIP(text)); - const feeds = { - input: new ort.Tensor("int32", tokenizedText, [1, 77]), - }; - const t2 = Date.now(); - const results = await imageSession.run(feeds); - log.info( - `onnx text embedding time: ${Date.now() - t1} ms (prep:${ - t2 - t1 - } ms, extraction: ${Date.now() - t2} ms)`, - ); - const textEmbedding = results["output"].data; // Float32Array - return normalizeEmbedding(textEmbedding); - } catch (err) { - if (err.message === CustomErrors.MODEL_DOWNLOAD_PENDING) { - log.info(CustomErrors.MODEL_DOWNLOAD_PENDING); - } else { - logErrorSentry(err, "Error in computeONNXTextEmbedding"); - } - throw err; - } -} - -async function getRGBData(inputFilePath: string) { - const jpegData = await fs.readFile(inputFilePath); - let rawImageData; - try { - rawImageData = jpeg.decode(jpegData, { - useTArray: true, - formatAsRGBA: false, - }); - } catch (err) { - logErrorSentry(err, "JPEG decode error"); - throw err; - } - - const nx: number = rawImageData.width; - const ny: number = rawImageData.height; - const inputImage: Uint8Array = rawImageData.data; - - const nx2: number = 224; - const ny2: number = 224; - const totalSize: number = 3 * nx2 * ny2; - - const result: number[] = Array(totalSize).fill(0); - const scale: number = Math.max(nx, ny) / 224; - - const nx3: number = Math.round(nx / scale); - const ny3: number = Math.round(ny / scale); - - const mean: number[] = [0.48145466, 0.4578275, 0.40821073]; - const std: number[] = [0.26862954, 0.26130258, 0.27577711]; - - for (let y = 0; y < ny3; y++) { - for (let x = 0; x < nx3; x++) { - for (let c = 0; c < 3; c++) { - // linear interpolation - const sx: number = (x + 0.5) * scale - 0.5; - const sy: number = (y + 0.5) * scale - 0.5; - - const x0: number = Math.max(0, Math.floor(sx)); - const y0: number = Math.max(0, Math.floor(sy)); - - const x1: number = Math.min(x0 + 1, nx - 1); - const y1: number = Math.min(y0 + 1, ny - 1); - - const dx: number = sx - x0; - const dy: number = sy - y0; - - const j00: number = 3 * (y0 * nx + x0) + c; - const j01: number = 3 * (y0 * nx + x1) + c; - const j10: number = 3 * (y1 * nx + x0) + c; - const j11: number = 3 * (y1 * nx + x1) + c; - - const v00: number = inputImage[j00]; - const v01: number = inputImage[j01]; - const v10: number = inputImage[j10]; - const v11: number = inputImage[j11]; - - const v0: number = v00 * (1 - dx) + v01 * dx; - const v1: number = v10 * (1 - dx) + v11 * dx; - - const v: number = v0 * (1 - dy) + v1 * dy; - - const v2: number = Math.min(Math.max(Math.round(v), 0), 255); - - // createTensorWithDataList is dump compared to reshape and hence has to be given with one channel after another - const i: number = y * nx3 + x + (c % 3) * 224 * 224; - - result[i] = (v2 / 255 - mean[c]) / std[c]; - } - } - } - - return result; -} - -export const computeClipMatchScore = async ( - imageEmbedding: Float32Array, - textEmbedding: Float32Array, -) => { - if (imageEmbedding.length !== textEmbedding.length) { - throw Error("imageEmbedding and textEmbedding length mismatch"); - } - let score = 0; - for (let index = 0; index < imageEmbedding.length; index++) { - score += imageEmbedding[index] * textEmbedding[index]; - } - return score; -}; - -export const normalizeEmbedding = (embedding: Float32Array) => { - let normalization = 0; - for (let index = 0; index < embedding.length; index++) { - normalization += embedding[index] * embedding[index]; - } - const sqrtNormalization = Math.sqrt(normalization); - for (let index = 0; index < embedding.length; index++) { - embedding[index] = embedding[index] / sqrtNormalization; - } - return embedding; -}; diff --git a/desktop/src/services/ffmpeg.ts b/desktop/src/services/ffmpeg.ts index ddb3361cf..468034046 100644 --- a/desktop/src/services/ffmpeg.ts +++ b/desktop/src/services/ffmpeg.ts @@ -1,7 +1,6 @@ import pathToFfmpeg from "ffmpeg-static"; import { existsSync } from "node:fs"; import fs from "node:fs/promises"; -import { CustomErrors } from "../constants/errors"; import { writeStream } from "../main/fs"; import log from "../main/log"; import { execAsync } from "../main/util"; @@ -146,7 +145,7 @@ const promiseWithTimeout = async ( } = { current: null }; const rejectOnTimeout = new Promise((_, reject) => { timeoutRef.current = setTimeout( - () => reject(Error(CustomErrors.WAIT_TIME_EXCEEDED)), + () => reject(new Error("Operation timed out")), timeout, ); }); diff --git a/desktop/src/services/fs.ts b/desktop/src/services/fs.ts index d36317720..5a8fb265c 100644 --- a/desktop/src/services/fs.ts +++ b/desktop/src/services/fs.ts @@ -2,7 +2,7 @@ import StreamZip from "node-stream-zip"; import { existsSync } from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; -import { logError } from "../main/log"; +import log from "../main/log"; import { ElectronFile } from "../types/ipc"; const FILE_STREAM_CHUNK_SIZE: number = 4 * 1024 * 1024; @@ -115,7 +115,9 @@ export const getZipFileStream = async ( const inProgress = { current: false, }; + // eslint-disable-next-line no-unused-vars let resolveObj: (value?: any) => void = null; + // eslint-disable-next-line no-unused-vars let rejectObj: (reason?: any) => void = null; stream.on("readable", () => { try { @@ -179,7 +181,7 @@ export const getZipFileStream = async ( controller.close(); } } catch (e) { - logError(e, "readableStream pull failed"); + log.error("Failed to pull from readableStream", e); controller.close(); } }, diff --git a/desktop/src/services/imageProcessor.ts b/desktop/src/services/imageProcessor.ts index f6a567f8c..8f81ba287 100644 --- a/desktop/src/services/imageProcessor.ts +++ b/desktop/src/services/imageProcessor.ts @@ -1,11 +1,10 @@ import { existsSync } from "fs"; import fs from "node:fs/promises"; import path from "path"; -import { CustomErrors } from "../constants/errors"; import { writeStream } from "../main/fs"; -import { logError, logErrorSentry } from "../main/log"; +import log from "../main/log"; import { execAsync, isDev } from "../main/util"; -import { ElectronFile } from "../types/ipc"; +import { CustomErrors, ElectronFile } from "../types/ipc"; import { isPlatform } from "../utils/common/platform"; import { generateTempFilePath } from "../utils/temp"; import { deleteTempFile } from "./ffmpeg"; @@ -103,18 +102,21 @@ async function convertToJPEG_( return new Uint8Array(await fs.readFile(tempOutputFilePath)); } catch (e) { - logErrorSentry(e, "failed to convert heic"); + log.error("Failed to convert HEIC", e); throw e; } finally { try { await fs.rm(tempInputFilePath, { force: true }); } catch (e) { - logErrorSentry(e, "failed to remove tempInputFile"); + log.error(`Failed to remove tempInputFile ${tempInputFilePath}`, e); } try { await fs.rm(tempOutputFilePath, { force: true }); } catch (e) { - logErrorSentry(e, "failed to remove tempOutputFile"); + log.error( + `Failed to remove tempOutputFile ${tempOutputFilePath}`, + e, + ); } } } @@ -150,7 +152,7 @@ function constructConvertCommand( }, ); } else { - throw Error(CustomErrors.INVALID_OS(process.platform)); + throw new Error(`Unsupported OS ${process.platform}`); } return convertCmd; } @@ -187,7 +189,7 @@ export async function generateImageThumbnail( try { await deleteTempFile(inputFilePath); } catch (e) { - logError(e, "failed to deleteTempFile"); + log.error(`Failed to deleteTempFile ${inputFilePath}`, e); } } } @@ -217,13 +219,16 @@ async function generateImageThumbnail_( } while (thumbnail.length > maxSize && quality > MIN_QUALITY); return thumbnail; } catch (e) { - logErrorSentry(e, "generate image thumbnail failed"); + log.error("Failed to generate image thumbnail", e); throw e; } finally { try { await fs.rm(tempOutputFilePath, { force: true }); } catch (e) { - logErrorSentry(e, "failed to remove tempOutputFile"); + log.error( + `Failed to remove tempOutputFile ${tempOutputFilePath}`, + e, + ); } } } @@ -283,7 +288,7 @@ function constructThumbnailGenerationCommand( return cmdPart; }); } else { - throw Error(CustomErrors.INVALID_OS(process.platform)); + throw new Error(`Unsupported OS ${process.platform}`); } return thumbnailGenerationCmd; } diff --git a/desktop/src/services/store.ts b/desktop/src/services/store.ts new file mode 100644 index 000000000..a484080f5 --- /dev/null +++ b/desktop/src/services/store.ts @@ -0,0 +1,25 @@ +import { safeStorage } from "electron/main"; +import { keysStore } from "../stores/keys.store"; +import { safeStorageStore } from "../stores/safeStorage.store"; +import { uploadStatusStore } from "../stores/upload.store"; +import { watchStore } from "../stores/watch.store"; + +export const clearStores = () => { + uploadStatusStore.clear(); + keysStore.clear(); + safeStorageStore.clear(); + watchStore.clear(); +}; + +export const saveEncryptionKey = async (encryptionKey: string) => { + const encryptedKey: Buffer = await safeStorage.encryptString(encryptionKey); + const b64EncryptedKey = Buffer.from(encryptedKey).toString("base64"); + safeStorageStore.set("encryptionKey", b64EncryptedKey); +}; + +export const encryptionKey = async (): Promise => { + const b64EncryptedKey = safeStorageStore.get("encryptionKey"); + if (!b64EncryptedKey) return undefined; + const keyBuffer = Buffer.from(b64EncryptedKey, "base64"); + return await safeStorage.decryptString(keyBuffer); +}; diff --git a/desktop/src/services/upload.ts b/desktop/src/services/upload.ts index 2fc56fef5..ae51e8218 100644 --- a/desktop/src/services/upload.ts +++ b/desktop/src/services/upload.ts @@ -1,10 +1,39 @@ import StreamZip from "node-stream-zip"; import path from "path"; +import { getElectronFile } from "../services/fs"; import { uploadStatusStore } from "../stores/upload.store"; import { ElectronFile, FILE_PATH_TYPE } from "../types/ipc"; import { FILE_PATH_KEYS } from "../types/main"; import { getValidPaths, getZipFileStream } from "./fs"; +export const getPendingUploads = async () => { + const filePaths = getSavedFilePaths(FILE_PATH_TYPE.FILES); + const zipPaths = getSavedFilePaths(FILE_PATH_TYPE.ZIPS); + const collectionName = uploadStatusStore.get("collectionName"); + + let files: ElectronFile[] = []; + let type: FILE_PATH_TYPE; + if (zipPaths.length) { + type = FILE_PATH_TYPE.ZIPS; + for (const zipPath of zipPaths) { + files = [ + ...files, + ...(await getElectronFilesFromGoogleZip(zipPath)), + ]; + } + const pendingFilePaths = new Set(filePaths); + files = files.filter((file) => pendingFilePaths.has(file.path)); + } else if (filePaths.length) { + type = FILE_PATH_TYPE.FILES; + files = await Promise.all(filePaths.map(getElectronFile)); + } + return { + files, + collectionName, + type, + }; +}; + export const getSavedFilePaths = (type: FILE_PATH_TYPE) => { const paths = getValidPaths( diff --git a/desktop/src/services/userPreference.ts b/desktop/src/services/userPreference.ts index 8074ee4de..c20657aa9 100644 --- a/desktop/src/services/userPreference.ts +++ b/desktop/src/services/userPreference.ts @@ -1,4 +1,4 @@ -import { userPreferencesStore } from "../stores/userPreferences.store"; +import { userPreferencesStore } from "../stores/user-preferences"; export function getHideDockIconPreference() { return userPreferencesStore.get("hideDockIcon"); @@ -7,27 +7,3 @@ export function getHideDockIconPreference() { export function setHideDockIconPreference(shouldHideDockIcon: boolean) { userPreferencesStore.set("hideDockIcon", shouldHideDockIcon); } - -export function getSkipAppVersion() { - return userPreferencesStore.get("skipAppVersion"); -} - -export function setSkipAppVersion(version: string) { - userPreferencesStore.set("skipAppVersion", version); -} - -export function getMuteUpdateNotificationVersion() { - return userPreferencesStore.get("muteUpdateNotificationVersion"); -} - -export function setMuteUpdateNotificationVersion(version: string) { - userPreferencesStore.set("muteUpdateNotificationVersion", version); -} - -export function clearSkipAppVersion() { - userPreferencesStore.delete("skipAppVersion"); -} - -export function clearMuteUpdateNotificationVersion() { - userPreferencesStore.delete("muteUpdateNotificationVersion"); -} diff --git a/desktop/src/stores/userPreferences.store.ts b/desktop/src/stores/user-preferences.ts similarity index 63% rename from desktop/src/stores/userPreferences.store.ts rename to desktop/src/stores/user-preferences.ts index 9545b1261..396e7a86c 100644 --- a/desktop/src/stores/userPreferences.store.ts +++ b/desktop/src/stores/user-preferences.ts @@ -1,7 +1,12 @@ import Store, { Schema } from "electron-store"; -import type { UserPreferencesType } from "../types/main"; -const userPreferencesSchema: Schema = { +interface UserPreferencesSchema { + hideDockIcon: boolean; + skipAppVersion?: string; + muteUpdateNotificationVersion?: string; +} + +const userPreferencesSchema: Schema = { hideDockIcon: { type: "boolean", }, diff --git a/desktop/src/types/any-shell-escape.d.ts b/desktop/src/types/any-shell-escape.d.ts index 4172cdb1e..b8777d2ae 100644 --- a/desktop/src/types/any-shell-escape.d.ts +++ b/desktop/src/types/any-shell-escape.d.ts @@ -19,6 +19,7 @@ * curl -v -H "Location;" -H "User-Agent: FooBar's so-called ""Browser""" "http://www.daveeddy.com/?name=dave&age=24" Which is suitable for being executed by the shell. */ +/* eslint-disable no-unused-vars */ declare module "any-shell-escape" { declare const shellescape: (args: readonly string | string[]) => string; export default shellescape; diff --git a/desktop/src/types/ipc.ts b/desktop/src/types/ipc.ts index 93586f29a..3dba231f2 100644 --- a/desktop/src/types/ipc.ts +++ b/desktop/src/types/ipc.ts @@ -4,6 +4,32 @@ * This file is manually kept in sync with the renderer code. * See [Note: types.ts <-> preload.ts <-> ipc.ts] */ + +/** + * Errors that have special semantics on the web side. + * + * [Note: Custom errors across Electron/Renderer boundary] + * + * We need to use the `message` field to disambiguate between errors thrown by + * the main process when invoked from the renderer process. This is because: + * + * > Errors thrown throw `handle` in the main process are not transparent as + * > they are serialized and only the `message` property from the original error + * > is provided to the renderer process. + * > + * > - https://www.electronjs.org/docs/latest/tutorial/ipc + * > + * > Ref: https://github.com/electron/electron/issues/24427 + */ +export const CustomErrors = { + WINDOWS_NATIVE_IMAGE_PROCESSING_NOT_SUPPORTED: + "Windows native image processing is not supported", + UNSUPPORTED_PLATFORM: (platform: string, arch: string) => + `Unsupported platform - ${platform} ${arch}`, + MODEL_DOWNLOAD_PENDING: + "Model download pending, skipping clip search request", +}; + /** * Deprecated - Use File + webUtils.getPathForFile instead * @@ -45,6 +71,7 @@ export interface WatchStoreType { } export enum FILE_PATH_TYPE { + /* eslint-disable no-unused-vars */ FILES = "files", ZIPS = "zips", } @@ -53,8 +80,3 @@ export interface AppUpdateInfo { autoUpdatable: boolean; version: string; } - -export enum Model { - GGML_CLIP = "ggml-clip", - ONNX_CLIP = "onnx-clip", -} diff --git a/desktop/src/types/main.ts b/desktop/src/types/main.ts index 98d04ec6e..546749c54 100644 --- a/desktop/src/types/main.ts +++ b/desktop/src/types/main.ts @@ -18,6 +18,7 @@ export interface KeysStoreType { }; } +/* eslint-disable no-unused-vars */ export const FILE_PATH_KEYS: { [k in FILE_PATH_TYPE]: keyof UploadStoreType; } = { @@ -28,9 +29,3 @@ export const FILE_PATH_KEYS: { export interface SafeStorageStoreType { encryptionKey: string; } - -export interface UserPreferencesType { - hideDockIcon: boolean; - skipAppVersion: string; - muteUpdateNotificationVersion: string; -} diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index b7c3946a2..927f12b9d 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -202,6 +202,10 @@ export const sidebar = [ { text: "Troubleshooting", items: [ + { + text: "Uploads", + link: "/self-hosting/troubleshooting/uploads", + }, { text: "Yarn", link: "/self-hosting/troubleshooting/yarn", @@ -219,80 +223,3 @@ export const sidebar = [ link: "/about/contribute", }, ]; - -function sidebarOld() { - return [ - { - text: "Welcome", - items: [ - { - text: "Features", - collapsed: true, - items: [ - { - text: "Family Plan", - link: "/photos/features/family-plan", - }, - { text: "Albums", link: "/photos/features/albums" }, - { text: "Archive", link: "/photos/features/archive" }, - { text: "Hidden", link: "/photos/features/hidden" }, - { text: "Map", link: "/photos/features/map" }, - { - text: "Location Tags", - link: "/photos/features/location", - }, - { - text: "Collect Photos", - link: "/photos/features/collect", - }, - { - text: "Public links", - link: "/photos/features/public-links", - }, - { - text: "Quick link", - link: "/photos/features/quick-link", - }, - { - text: "Watch folder", - link: "/photos/features/watch-folders", - }, - { text: "Trash", link: "/photos/features/trash" }, - { - text: "Uncategorized", - link: "/photos/features/uncategorized", - }, - { - text: "Referral Plan", - link: "/photos/features/referral", - }, - { - text: "Live & Motion Photos", - link: "/photos/features/live-photos", - }, - { text: "Cast", link: "/photos/features/cast" }, - ], - }, - { - text: "Troubleshoot", - collapsed: true, - link: "/photos/troubleshooting/files-not-uploading", - items: [ - { - text: "Files not uploading", - link: "/photos/troubleshooting/files-not-uploading", - }, - { - text: "Failed to play video", - link: "/photos/troubleshooting/video-not-playing", - }, - { - text: "Report bug", - link: "/photos/troubleshooting/report-bug", - }, - ], - }, - ], - }, - ]; -} diff --git a/docs/docs/auth/migration-guides/authy/index.md b/docs/docs/auth/migration-guides/authy/index.md index 268d7e4f7..48ce3965d 100644 --- a/docs/docs/auth/migration-guides/authy/index.md +++ b/docs/docs/auth/migration-guides/authy/index.md @@ -10,7 +10,7 @@ A guide written by Green, an ente.io lover > [!WARNING] > > Authy will soon be dropping support for its desktop apps in the near future. -> If you are looking to switch to ente Authenticator from Authy, I heavily +> If you are looking to switch to Ente Authenticator from Authy, I heavily > recommend you export your codes as soon as you can. --- @@ -19,7 +19,7 @@ Migrating from Authy can be tiring, as you cannot export your 2FA codes through the app, meaning that you would have to reconfigure 2FA for all of your accounts for your new 2FA authenticator. However, easier ways exist to export your codes out of Authy. This guide will cover two of the most used methods for mograting -from Authy to ente Authenticator. +from Authy to Ente Authenticator. > [!CAUTION] > @@ -39,7 +39,7 @@ hard (and rather technical) parts of the process.

One way to export is to [use this tool by Neeraj](https://github.com/ua741/authy-export/releases/tag/v0.0.4) -to simplify the process and skip directly to importing to ente Authenticator. +to simplify the process and skip directly to importing to Ente Authenticator. To export from Authy, download the tool for your specific OS, then type the following in your terminal: @@ -72,7 +72,7 @@ For Windows: ``` This will generate a text file called `authy_codes.txt`, which contains your -Authy codes in ente's plaintext export format. You can now import this to ente +Authy codes in Ente's plaintext export format. You can now import this to Ente Authenticator! ## Method 2: Use gboudreau's GitHub guide @@ -89,23 +89,23 @@ To export your data, please follow This will create a JSON file called `authy-to-bitwarden-export.json`, which contains your Authy codes in Bitwarden's export format. You can now import this -to ente Authenticator! +to Ente Authenticator! ### Method 2.1: If the export worked, but the import didn't > [!NOTE] > > This is intended only for users who successfully exported their codes using -> the guide in method 2, but could not import it to ente Authenticator for +> the guide in method 2, but could not import it to Ente Authenticator for > whatever reason. If the import was successful, or you haven't tried to import > the codes yet, ignore this section. > > If the export itself failed, try using > [**method 1**](#method-1-use-neerajs-export-tool) instead. -Usually, you should be able to import Bitwarden exports directly into ente +Usually, you should be able to import Bitwarden exports directly into Ente Authenticator. In case this didn't work for whatever reason, I've written a -program in Python that converts the JSON file into a TXT file that ente +program in Python that converts the JSON file into a TXT file that Ente Authenticator can use, so you can try importing using plain text import instead. You can download my program @@ -140,18 +140,18 @@ To run the Python program, open it in your IDE and run the program, or open your terminal and type `python3 authy_to_ente.py` (MacOS/Linux, or any other OS that uses bash) or `py -3 authy_to_ente.py` (Windows). Once you run it, a new TXT file called `auth_codes.txt` will be generated. You can now import your data to -ente Authenticator! +Ente Authenticator! --- You should now have a TXT file (method 1, method 2.1) or a JSON file (method 2) -that countains your TOTP secrets, which can now be imported into ente +that countains your TOTP secrets, which can now be imported into Ente Authenticator. To import your codes, please follow one of the steps below, depending on which method you used to export your codes. -## Importing to ente Authenticator (Method 1, method 2.1) +## Importing to Ente Authenticator (Method 1, method 2.1) -1. Copy the TXT file to one of your devices with ente Authenticator. +1. Copy the TXT file to one of your devices with Ente Authenticator. 2. Log in to your account (if you haven't already), or press "Use without backups". 3. Open the navigation menu (hamburger button on the top left), then press @@ -159,9 +159,9 @@ depending on which method you used to export your codes. 4. Select the "Plain text" option. 5. Select the TXT file that was made earlier. -## Importing to ente Authenticator (Method 2) +## Importing to Ente Authenticator (Method 2) -1. Copy the JSON file to one of your devices with ente Authenticator. +1. Copy the JSON file to one of your devices with Ente Authenticator. 2. Log in to your account (if you haven't already), or press "Use without backups". 3. Open the navigation menu (hamburger button on the top left), then press @@ -172,7 +172,7 @@ depending on which method you used to export your codes. If this didn't work, refer to [**method 2.1**](#method-21-if-the-export-worked-but-the-import-didnt).

-And that's it! You have now successfully migrated from Authy to ente +And that's it! You have now successfully migrated from Authy to Ente Authenticator. Now that your secrets are safely stored, I recommend you delete the unencrypted diff --git a/docs/docs/photos/faq/export.md b/docs/docs/photos/faq/export.md index f0a4c71f1..303fa830c 100644 --- a/docs/docs/photos/faq/export.md +++ b/docs/docs/photos/faq/export.md @@ -12,12 +12,20 @@ in a local drive or NAS of your choice. This way, you can use Ente in your day to day use, but will have an additional guarantee that a copy of your original photos and videos are always available in normal directories and files. -* You can use [Ente's CLI](https://github.com/ente-io/ente/tree/main/cli#export) - to export your data in a cron job to a location of your choice. The exports - are incremental, and will also gracefully handle interruptions. +- You can use + [Ente's CLI](https://github.com/ente-io/ente/tree/main/cli#export) to export + your data in a cron job to a location of your choice. The exports are + incremental, and will also gracefully handle interruptions. -* Similarly, you can use Ente's [desktop app](https://ente.io/download/desktop) - to export your data to a folder of your choice. The desktop app also supports - "continuous" exports, where it will automatically export new items in the - background without you needing to run any other cron jobs. See - [migration/export](/photos/migration/export/) for more details. +- Similarly, you can use Ente's + [desktop app](https://ente.io/download/desktop) to export your data to a + folder of your choice. The desktop app also supports "continuous" exports, + where it will automatically export new items in the background without you + needing to run any other cron jobs. See + [migration/export](/photos/migration/export/) for more details. + +## Does the exported data from Ente photos preserve the same folder and album structure as in the app? + +When you export your data for local backup, it will maintain the exact structure +how you have set up within Ente. The exported data will reflect the same photos +and album structure intact. diff --git a/docs/docs/photos/faq/general.md b/docs/docs/photos/faq/general.md index 65d548a2d..0be4e4c01 100644 --- a/docs/docs/photos/faq/general.md +++ b/docs/docs/photos/faq/general.md @@ -74,3 +74,38 @@ If you would like to fund the development of this project, please consider ## How do I pronounce ente? It's like cafe 😊. kaf-_ay_. en-_tay_. + +## Does Ente apply compression to uploaded photos? + +Ente does not apply compression to uploaded photos. The file size of your photos +in Ente will be similar to the original file sizes you have. + +## Can I add photos from a shared album to albums that I created in Ente? + +Currently, Ente does not support adding photos from a shared album to your +personal albums. If you want to include photos from a shared album in your own +albums, you will need to ask the owner of the photos to add them to your album. + +## How do I ensure that the Ente desktop app stays up to date on my system? + +Ente desktop includes an auto-update feature, ensuring that whenever updates are +deployed, the app will automatically download and install them. You don't need +to manually update the software. + +## Can I sync a folder containing multiple subfolders, each representing an album? + +Yes, when you drag and drop the folder onto the desktop app, the app will detect +the multiple folders and prompt you to choose whether you want to create a +single album or separate albums for each folder. + +## What is the difference between **Magic** and **Content** search results on the desktop? + +**Magic** is where you can search for long queries. Like, "baby in red dress", +or "dog playing at the beach". + +**Content** is where you can search for single-words. Like, "car" or "pizza". + +## How do I identify which files experienced upload issues within the desktop app? + +Check the sections within the upload progress bar for "Failed Uploads," "Ignored +Uploads," and "Unsuccessful Uploads." diff --git a/docs/docs/photos/faq/subscription.md b/docs/docs/photos/faq/subscription.md index 58eb1857a..53cc63471 100644 --- a/docs/docs/photos/faq/subscription.md +++ b/docs/docs/photos/faq/subscription.md @@ -156,3 +156,9 @@ Sorry, since we're building a business that does not involve monetization of user data, we have to charge to remain sustainable. We do offer a generous free trial for you to experience the product. + +## Will I need to pay for Ente Auth after my Ente Photos free plan expires? + +No, you will not need to pay for Ente Auth after your Ente Photos free plan +expires. Ente Auth is completely free to use, and the expiration of your Ente +Photos free plan will not impact your ability to access or use Ente Auth. diff --git a/docs/docs/photos/migration/export/export-1.png b/docs/docs/photos/migration/export/export-1.png index e00bd49c5..49f03b28c 100644 Binary files a/docs/docs/photos/migration/export/export-1.png and b/docs/docs/photos/migration/export/export-1.png differ diff --git a/docs/docs/photos/migration/export/export-2.png b/docs/docs/photos/migration/export/export-2.png index cfef40bb3..f181a2422 100644 Binary files a/docs/docs/photos/migration/export/export-2.png and b/docs/docs/photos/migration/export/export-2.png differ diff --git a/docs/docs/photos/migration/export/export-3.png b/docs/docs/photos/migration/export/export-3.png index 0434ffdb6..3df2a5660 100644 Binary files a/docs/docs/photos/migration/export/export-3.png and b/docs/docs/photos/migration/export/export-3.png differ diff --git a/docs/docs/photos/migration/export/export-4.png b/docs/docs/photos/migration/export/export-4.png index 2a5d16d59..e8abcf0f2 100644 Binary files a/docs/docs/photos/migration/export/export-4.png and b/docs/docs/photos/migration/export/export-4.png differ diff --git a/docs/docs/photos/migration/export/export-5.png b/docs/docs/photos/migration/export/export-5.png new file mode 100644 index 000000000..aa939e566 Binary files /dev/null and b/docs/docs/photos/migration/export/export-5.png differ diff --git a/docs/docs/photos/migration/export/index.md b/docs/docs/photos/migration/export/index.md index 014e2e898..51b347d01 100644 --- a/docs/docs/photos/migration/export/index.md +++ b/docs/docs/photos/migration/export/index.md @@ -11,37 +11,59 @@ videos you have uploaded to Ente. 1. Sign in to [our desktop app](https://ente.io/download/desktop), if you haven't done so already. -2. Open the side bar, and select the option to **export data**. + ![Ente - Sign in to export data](sign-in.png) + +2. Open the side bar, and select the option to **Export Data**. ![Ente - Export data](export-1.png) -3. Select the destination folder and click on **start**. +3. Choose the destination folder by clicking on three dots icon. - ![Ente - Select destination folder and start](export-2.png) +
-4. Wait for the export to get completed. +![Ente - Select destination folder and start](export-2.png){width=400px} - ![Ente - Export in progress](export-3.png) +
-5. Later on if you wish to sync newer files that were uploaded since the last - time you exported, simply select **export data** again and click on - **resync**. +4. Select the folder and then click on **Start** - ![Ente - Rexport](export-4.png) +
+ +![Ente - Export in progress](export-3.png){width=400px} + +
+ +5. Wait for the export to complete. + +
+ +![Ente - Rexport](export-4.png){width=400px} + +
6. In case your download gets interrupted, Ente will resume from where it left - off. Simply select **export data** again and click on **resync**. + off. Simply select **Export Data** again and click on **Resync**. -7. **Sync continuously** : You can utilize Continuous Sync to eliminate manual - exports each time new photos are added to Ente. This feature automatically - detects new files and runs exports accordingly, It also ensures that exported - data reflects the latest album states with new files, moves, and deletions. +
- ![Ente - Continuous sync](continuous-sync.webp) +![Ente - Rexport](export-5.png){width=400px} + +
+ +### Sync continuously + +You can switch on the toggle to **Sync continuously** to eliminate manual +exports each time new photos are added to Ente. This feature automatically +detects new files and runs exports accordingly. It also ensures that exported +data reflects the latest album states with new files, moves, and deletions. + +![Ente - Continuous sync](continuous-sync.webp) + +--- If you run into any issues during your data export, please reach out to [support@ente.io](mailto:support@ente.io) and we will be happy to help you! Note that we also provide a [CLI tool](https://github.com/ente-io/ente/tree/main/cli#export) to export your data. -Some more details are in this [FAQ entry](/photos/faq/export). +Please find more details [here](/photos/faq/export). diff --git a/docs/docs/photos/migration/export/sign-in.png b/docs/docs/photos/migration/export/sign-in.png new file mode 100644 index 000000000..4a9fa4a23 Binary files /dev/null and b/docs/docs/photos/migration/export/sign-in.png differ diff --git a/docs/docs/self-hosting/guides/admin.md b/docs/docs/self-hosting/guides/admin.md index 91ea4d0f8..92f52a91f 100644 --- a/docs/docs/self-hosting/guides/admin.md +++ b/docs/docs/self-hosting/guides/admin.md @@ -24,18 +24,32 @@ and subsequently increase the [storage and account validity](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_admin_update-subscription.md) using the CLI. -For the admin actions, you can create `server/museum.yaml`, and whitelist add -the admin userID `internal.admins`. See -[local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml#L211C1-L232C1) +For security purposes, we need to whitelist the user IDs that can perform admin +actions on the server. To do this, + +- Create a `museum.yaml` in the directory where you're starting museum from. + For example, if you're running using `docker compose up`, then this file + should be in the same directory as `compose.yaml` (generally, + `server/museum.yaml`). + + > Docker might've created an empty `museum.yaml` _directory_ on your machine + > previously. If so, delete that empty directory and create a new file named + > `museum.yaml`. + +- In this `museum.yaml` we can add overrides over the default configuration. + +For whitelisting the admin userIDs we need to define an `internal.admins`. See +the "internal" section in +[local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml) in the server source code for details about how to define this. -```yaml -.... -internal: - admins: - # - 1580559962386440 +Here is an example. Suppose we wanted to whitelist a user with ID +`1580559962386440`, we can create the following `museum.yaml` -.... +```yaml +internal: + admins: + - 1580559962386440 ``` You can use diff --git a/docs/docs/self-hosting/guides/custom-server/index.md b/docs/docs/self-hosting/guides/custom-server/index.md index 7f7ba50fa..bf695af30 100644 --- a/docs/docs/self-hosting/guides/custom-server/index.md +++ b/docs/docs/self-hosting/guides/custom-server/index.md @@ -18,11 +18,6 @@ configure the endpoint the app should be connecting to. ![Setting a custom server on the onboarding screen](custom-server.png) -> [!IMPORTANT] -> -> This is only supported by the Ente Auth app currently. We'll add this same -> functionality to the Ente Photos app soon. - ## CLI > [!NOTE] diff --git a/docs/docs/self-hosting/index.md b/docs/docs/self-hosting/index.md index c1ae7075e..14f9ba4dd 100644 --- a/docs/docs/self-hosting/index.md +++ b/docs/docs/self-hosting/index.md @@ -26,8 +26,8 @@ docker compose up --build > [!TIP] > -> You can also use a pre-built Docker image from `ghcr.io/ente-io/server` ([More -> info](https://github.com/ente-io/ente/blob/main/server/docs/docker.md)) +> You can also use a pre-built Docker image from `ghcr.io/ente-io/server` +> ([More info](https://github.com/ente-io/ente/blob/main/server/docs/docker.md)) Then in a separate terminal, you can run (e.g) the web client diff --git a/docs/docs/self-hosting/troubleshooting/uploads.md b/docs/docs/self-hosting/troubleshooting/uploads.md new file mode 100644 index 000000000..4f7273e94 --- /dev/null +++ b/docs/docs/self-hosting/troubleshooting/uploads.md @@ -0,0 +1,13 @@ +--- +title: Uploads failing +description: Fixing upload errors when trying to self host Ente +--- + +# Uploads failing + +If uploads to your self-hosted server are failing, make sure that +`credentials.yaml` has `yourserverip:3200` for all three minio locations. + +By default it is `localhost:3200`, and it needs to be changed to an IP that is +accessible from both where you are running the Ente clients (e.g. the mobile +app) and also from within the Docker compose cluster. diff --git a/infra/services/listmonk/README.md b/infra/services/listmonk/README.md new file mode 100644 index 000000000..e94c676cd --- /dev/null +++ b/infra/services/listmonk/README.md @@ -0,0 +1,54 @@ +# Listmonk + +We use [Listmonk](https://listmonk.app/) to manage our mailing lists. + +- Museum lets Listmonk know about new users and account deletion (this allows + Listmonk to create corresponding accounts). + +- Subsequently, Listmonk handles user subscription / unsubscription etc + (Listmonk stores its data in an external Postgres). + +## Installing + +Install [nginx](../nginx/README.md). + +Add Listmonk's configuration. + +```sh +sudo mkdir -p /root/listmonk +sudo tee /root/listmonk/config.toml +``` + +Add the service definition and nginx configuration. + +```sh +scp services/listmonk/listmonk.* : + +sudo mv listmonk.service /etc/systemd/system/ +sudo mv listmonk.nginx.conf /root/nginx/conf.d +``` + +> The very first time we ran Listmonk, at this point we also needed to get it to +> install the tables it needs in the Postgres DB. For this, we used the +> `initialize-db.sh` script. +> +> ```sh +> scp services/listmonk/initialize-db.sh : +> +> sudo sh initialize-db.sh +> rm initialize-db.sh +> ``` + +Tell systemd to pick up new service definitions, enable the unit (so that it +automatically starts on boot), and start it this time around. + +```sh +sudo systemctl daemon-reload +sudo systemctl enable --now listmonk +``` + +Tell nginx to pick up the new configuration. + +```sh +sudo systemctl reload nginx +``` diff --git a/infra/services/listmonk/initialize-db.sh b/infra/services/listmonk/initialize-db.sh new file mode 100755 index 000000000..576c607a9 --- /dev/null +++ b/infra/services/listmonk/initialize-db.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +# This script needs to be manually run the once (and only once) before starting +# Listmonk for the first time. It uses the provided credentials to initialize +# its database. + +set -o errexit +set -o xtrace + +docker pull listmonk/listmonk + +docker run -it --rm --name listmonk \ + -v /root/listmonk/config.toml:/listmonk/config.toml:ro \ + listmonk/listmonk ./listmonk --install diff --git a/infra/services/listmonk/listmonk.nginx.conf b/infra/services/listmonk/listmonk.nginx.conf new file mode 100644 index 000000000..783c28a8a --- /dev/null +++ b/infra/services/listmonk/listmonk.nginx.conf @@ -0,0 +1,26 @@ +# This file gets loaded in a top level http block by the default nginx.conf +# See infra/services/nginx/README.md for more details. + +server { + listen 443 ssl; + listen [::]:443 ssl; + http2 on; + ssl_certificate /etc/ssl/certs/cert.pem; + ssl_certificate_key /etc/ssl/private/key.pem; + + server_name lists.ente.io; + + location / { + proxy_pass http://host.docker.internal:9000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Use HTTP/1.1 when talking to upstream + # Also, while not necessary (AFAIK), also allow websockets. + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} diff --git a/infra/services/listmonk/listmonk.service b/infra/services/listmonk/listmonk.service new file mode 100644 index 000000000..bf45bbaf6 --- /dev/null +++ b/infra/services/listmonk/listmonk.service @@ -0,0 +1,19 @@ +[Unit] +Documentation=https://listmonk.app/docs/installation/ +Requires=docker.service +After=docker.service + +[Install] +WantedBy=multi-user.target + +[Service] +ExecStartPre=docker pull listmonk/listmonk +ExecStartPre=-docker stop listmonk +ExecStartPre=-docker rm listmonk +ExecStartPre=-docker run --rm --name listmonk \ + -v /root/listmonk/config.toml:/listmonk/config.toml:ro \ + listmonk/listmonk ./listmonk --upgrade --yes +ExecStart=docker run --name listmonk \ + -p 9000:9000 \ + -v /root/listmonk/config.toml:/listmonk/config.toml:ro \ + listmonk/listmonk diff --git a/infra/services/nginx/README.md b/infra/services/nginx/README.md index 7239a5610..c6d0d56ef 100644 --- a/infra/services/nginx/README.md +++ b/infra/services/nginx/README.md @@ -62,3 +62,12 @@ We can see this in the default configuration of nginx: This is a [handy tool](https://nginx-playground.wizardzines.com) to check the syntax of the configuration files. Alternatively, you can run `docker exec nginx nginx -t` on the instance to ask nginx to check the configuration. + +## Updating configuration + +Nginx configuration files can be changed without needing to restart anything. + +1. Update the configuration file at `/root/nginx/conf.d/museum.conf` +2. Verify that there are no errors in the configuration by using `sudo docker + exec nginx nginx -t`. +3. Ask nginx to reload the configuration `sudo systemctl reload nginx`. diff --git a/infra/services/nginx/nginx.service b/infra/services/nginx/nginx.service index e14e7840d..4951c5e75 100644 --- a/infra/services/nginx/nginx.service +++ b/infra/services/nginx/nginx.service @@ -16,5 +16,6 @@ ExecStart=docker run --name nginx \ -v /root/nginx/cert.pem:/etc/ssl/certs/cert.pem:ro \ -v /root/nginx/key.pem:/etc/ssl/private/key.pem:ro \ -v /root/nginx/conf.d:/etc/nginx/conf.d:ro \ + --log-opt max-size=1g \ nginx ExecReload=docker exec nginx nginx -s reload diff --git a/infra/services/status/uptime-kuma.nginx.conf b/infra/services/status/uptime-kuma.nginx.conf index c45c7b660..a67f5e101 100644 --- a/infra/services/status/uptime-kuma.nginx.conf +++ b/infra/services/status/uptime-kuma.nginx.conf @@ -2,8 +2,9 @@ # See infra/services/nginx/README.md for more details. server { - listen 443 ssl http2; - listen [::]:443 ssl http2; + listen 443 ssl; + listen [::]:443 ssl; + http2 on; ssl_certificate /etc/ssl/certs/cert.pem; ssl_certificate_key /etc/ssl/private/key.pem; diff --git a/mobile/CHANGELOG.md b/mobile/CHANGELOG.md index a4b33abdf..167b65b6e 100644 --- a/mobile/CHANGELOG.md +++ b/mobile/CHANGELOG.md @@ -1,6 +1,6 @@ # CHANGELOG -## v0.8.72 +## v0.8.73 ### Added * #### Share an Album to Multiple Contacts at Once @@ -9,7 +9,7 @@ * #### Bug Fixes and Performance Improvements - Many a bugs were squashed in this release. If you run into any, please write to team@ente.io, or let us know on Discord! 🙏 + Many a bugs were squashed in this release and have improved performance on app start. If you run into any bugs, please write to team@ente.io, or let us know on Discord! 🙏 ## v0.8.67 diff --git a/mobile/android/app/src/main/play/listings/de/full_description.txt b/mobile/android/app/src/main/play/listings/de/full_description.txt new file mode 100644 index 000000000..4d963c1d7 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/de/full_description.txt @@ -0,0 +1,36 @@ +ente ist eine einfache App, um Ihre Fotos und Videos automatisch zu sichern und zu organisieren. + +Wenn Sie auf der Suche nach einer datenschutzfreundlichen Alternative zu Google Fotos sind, sind Sie an der richtigen Stelle. Mit Ente werden Ihre Fotos Ende-zu-Ende-verschlüsselt gespeichert (e2ee). Dies bedeutet, dass nur Sie sie sehen können. + +Ihre Fotos werden verschlüsselt (e2ee) zwischen allen Geräten synchronisiert. + +ente ermöglicht es, deine Alben simpel & schnell mit deinen Geliebten zu teilen. Sie können öffentlich einsehbare Links teilen, sodass andere sogar ohne einen Account oder eine App Ihr Album sehen und darin zusammenarbeiten können, indem sie Fotos hinzufügen. + +Ihre verschlüsselten Daten werden an 3 verschiedenen Orten gespeichert, unter anderem in einem Schutzbunker in Paris. Wir nehmen die Erhaltung der Nachwelt ernst und machen es Ihnen leicht, dafür zu sorgen, dass Ihre Erinnerungen Sie überdauern. + +Wir sind hier, um die sicherste Foto-App aller Zeiten zu entwickeln, begleite uns auf unserem Weg! + +FEATURES +- Sicherungen in Originalqualität, weil jeder Pixel zählt +- Familien-Abos, damit Sie den Speicherplatz mit Ihrer Familie teilen können +- Kollaborative Alben, sodass Sie nach einer Reise Fotos sammeln können +- Geteilte Ordner für den Fall, dass Ihr Partner Ihre "Kamera" Klicks genießen soll +- Album-Links, die mit einem Passwort geschützt werden können +- Möglichkeit, Speicherplatz freizugeben, indem bereits gesicherte Daten auf dem Gerät entfernt werden +- Menschlicher Support, denn Sie sind es wert +- Beschreibungen, damit Sie Ihre Erinnerungen beschriften und leicht wiederfinden können +- Foto-Editor, um Ihren Fotos den Feinschliff zu verpassen +- Favorisieren, verstecken und erleben Sie Ihre Erinnerungen, denn sie sind kostbar +- Ein-Klick-Import von Google, Apple, Ihrer Festplatte und mehr +- Dunkles Theme, weil Ihre Fotos darin gut aussehen +- 2FA, 3FA, biometrische Authentifizierung +- und noch VIELES mehr! + +BERECHTIGUNGEN +Diese können unter folgendem Link überprüft werden: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +PREIS +Wir bieten keine lebenslang kostenlosen Abonnements an, da es für uns wichtig ist, einen nachhaltigen Service anzubieten. Wir bieten jedoch bezahlbare Abonemments an, welche auch mit der Familie geteilt werden können. Mehr Informationen sind auf ente.io zu finden. + +SUPPORT +Wir sind stolz darauf, einen persönlichen Support anzubieten. Falls Sie ein Abonnement besitzen, können Sie sich mit Ihrem Anliegen via E-Mail an team@ente.io wenden und erhalten eine Antwort innerhalb von 24 Stunden. diff --git a/mobile/android/app/src/main/play/listings/de/short_description.txt b/mobile/android/app/src/main/play/listings/de/short_description.txt new file mode 100644 index 000000000..1727dbd99 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/de/short_description.txt @@ -0,0 +1 @@ +ente ist eine Ende-zu-Ende-verschlüsselte Fotospeicher-App \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/de/title.txt b/mobile/android/app/src/main/play/listings/de/title.txt new file mode 100644 index 000000000..d4fb292dc --- /dev/null +++ b/mobile/android/app/src/main/play/listings/de/title.txt @@ -0,0 +1 @@ +ente - verschlüsselter Fotospeicher \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/en-US/full_description.txt b/mobile/android/app/src/main/play/listings/en-US/full_description.txt new file mode 100644 index 000000000..8994a789c --- /dev/null +++ b/mobile/android/app/src/main/play/listings/en-US/full_description.txt @@ -0,0 +1,36 @@ +Ente is a simple app to backup and share your photos and videos. + +If you've been looking for a privacy-friendly alternative to Google Photos, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them. + +We have open-source apps across Android, iOS, web and desktop, and your photos will seamlessly sync between all of them in an end-to-end encrypted (e2ee) manner. + +Ente also makes it simple to share your albums with your loved ones, even if they aren't on Ente. You can share publicly viewable links, where they can view your album and collaborate by adding photos to it, even without an account or app. + +Your encrypted data is replicated to 3 different locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you. + +We are here to make the safest photos app ever, come join our journey! + +FEATURES +- Original quality backups, because every pixel is important +- Family plans, so you can share storage with your family +- Collaborative albums, so you can pool together photos after a trip +- Shared folders, in case you want your partner to enjoy your "Camera" clicks +- Album links, that can be protected with a password +- Ability to free up space, by removing files that have been safely backed up +- Human support, because you're worth it +- Descriptions, so you can caption your memories and find them easily +- Image editor, to add finishing touches +- Favorite, hide and relive your memories, for they are precious +- One-click import from Google, Apple, your hard drive and more +- Dark theme, because your photos look good in it +- 2FA, 3FA, biometric auth +- and a LOT more! + +PERMISSIONS +Ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +PRICING +We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io. + +SUPPORT +We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours. diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/icon/icon.png b/mobile/android/app/src/main/play/listings/en-US/graphics/icon/icon.png new file mode 100644 index 000000000..8b32155bb Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/icon/icon.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png new file mode 100644 index 000000000..7cab0bfe4 Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png new file mode 100644 index 000000000..15e875465 Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png new file mode 100644 index 000000000..91fb9da73 Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png new file mode 100644 index 000000000..cd47572c9 Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png new file mode 100644 index 000000000..4e5ca0bad Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/6.png b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/6.png new file mode 100644 index 000000000..39cfa966d Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/6.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/7.png b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/7.png new file mode 100644 index 000000000..0b4422657 Binary files /dev/null and b/mobile/android/app/src/main/play/listings/en-US/graphics/phone-screenshots/7.png differ diff --git a/mobile/android/app/src/main/play/listings/en-US/short_description.txt b/mobile/android/app/src/main/play/listings/en-US/short_description.txt new file mode 100644 index 000000000..c52324aba --- /dev/null +++ b/mobile/android/app/src/main/play/listings/en-US/short_description.txt @@ -0,0 +1 @@ +Ente Photos is an open source photos app, that provides end-to-end encrypted backups for your photos and videos. \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/en-US/title.txt b/mobile/android/app/src/main/play/listings/en-US/title.txt new file mode 100644 index 000000000..4991e74e6 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +Ente Photos - Open source, end-to-end encrypted alternative to Google Photos \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/es/full_description.txt b/mobile/android/app/src/main/play/listings/es/full_description.txt new file mode 100644 index 000000000..8c0667934 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/es/full_description.txt @@ -0,0 +1,36 @@ +ente es una aplicación simple para hacer copias de seguridad y compartir tus fotos y videos. + +Si has estado buscando una alternativa a Google Photos que sea amigable con la privacidad, has llegado al lugar correcto. Con Ente, se almacenan cifradas de extremo a extremo (e2ee). Esto significa que solo tú puedes verlas. + +Tenemos aplicaciones en Android, iOS, web y escritorio, y tus fotos se sincronizarán perfectamente entre todos tus dispositivos encriptadas de extremo a extremo (e2ee). + +ente también hace fácil compartir tus álbumes con tus seres queridos, incluso si no están en ente. Puedes compartir enlaces visibles públicamente, donde pueden ver tu álbum y colaborar añadiendo fotos a él, incluso sin una cuenta o aplicación. + +Sus datos cifrados se replican en 3 ubicaciones diferentes, incluyendo un bunker en París. Nos tomamos la posteridad en serio y facilitamos que sus recuerdos sobrevivan a usted. + +Estamos aquí para hacer la aplicación de fotos más segura jamás creada, ¡únete a nuestro viaje! + +CARACTERÍSTICAS +- Copias de seguridad con la calidad original, porque cada pixel es importante +- Planes familiares, para que puedas compartir el almacenamiento con tu familia +- Álbumes colaborativos, para que puedas juntar fotos después de un viaje +- Carpetas compartidas, por si quieres que tu pareja disfrute de tus fotos +- Enlaces al álbum, que se pueden proteger con una contraseña +- Capacidad para liberar espacio, eliminando archivos de los que ya tienes una copia de seguridad +- Apoyo humano, porque tú lo vales +- Descripciones, para que puedas encontrar tus recuerdos fácilmente +- Editor de imagen, para añadir retoques finales +- Marca como favoritos, oculta y revive tus recuerdos, porque son preciosos +- Importa en un click desde Google, Apple, tu disco duro y más +- Tema oscuro, porque tus fotos quedan bien con él +- 2FA, 3FA, autenticación biométrica +- ¡Y mucho más! + +PERMISOS +ente solicita ciertos permisos para servir al propósito de un proveedor de almacenamiento de fotos, que puede ser revisado aquí: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +PRECIOS +No ofrecemos planes gratis para siempre, porque es importante para nosotros seguir siendo sostenibles y resistir a la prueba del tiempo. En su lugar, ofrecemos planes asequibles que puedes compartir libremente con tu familia. Puedes encontrar más información en ente.io. + +SOPORTE +Estamos orgullosos de ofrecer apoyo humano. Si eres un cliente de pago, puedes contactar con team@ente.io y esperar una respuesta de nuestro equipo en 24 horas. diff --git a/mobile/android/app/src/main/play/listings/es/short_description.txt b/mobile/android/app/src/main/play/listings/es/short_description.txt new file mode 100644 index 000000000..34195beef --- /dev/null +++ b/mobile/android/app/src/main/play/listings/es/short_description.txt @@ -0,0 +1 @@ +ente es una aplicación de almacenamiento de fotos cifrado de extremo a extremo \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/es/title.txt b/mobile/android/app/src/main/play/listings/es/title.txt new file mode 100644 index 000000000..f27fb3c2d --- /dev/null +++ b/mobile/android/app/src/main/play/listings/es/title.txt @@ -0,0 +1 @@ +ente - almacenamiento de fotos encriptado \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/fr/full_description.txt b/mobile/android/app/src/main/play/listings/fr/full_description.txt new file mode 100644 index 000000000..f94e467af --- /dev/null +++ b/mobile/android/app/src/main/play/listings/fr/full_description.txt @@ -0,0 +1,36 @@ +entre est une application simple qui permet de sauvegarder et partager vos photos et vidéos. + +Si vous êtes à la recherche d'une alternative à Google Photos respectueuse de la vie privée, vous êtes au bon endroit. Avec ente, ils sont stockés chiffrés de bout-en-bout (e2ee). Cela signifie que vous-seul pouvez les voir. + +Nous avons des applications sur Android, iOS, Web et Ordinateur, et vos photos seront synchronisées de manière transparente entre tous vos appareils chiffrée de bout en bout (e2ee). + +ente vous permet également de partager vos albums avec vos proches, même s'ils ne sont pas sur ente. Vous pouvez partager des liens visibles publiquement, où ils peuvent voir votre album et collaborer en y ajoutant des photos, même sans compte ou application. + +Vos données chiffrées sont répliqué à 3 endroits différents, dont un abri antiatomique à Paris. Nous prenons la postérité au sérieux et facilitons la conservation de vos souvenirs. + +Nous sommes là pour faire l'application photo la plus sûre de tous les temps, rejoignez-nous ! + +CARACTÉRISTIQUES +- Sauvegardes de qualité originales, car chaque pixel est important +- Abonnement familiaux, pour que vous puissiez partager l'espace de stockage avec votre famille +- Albums collaboratifs, pour que vous puissiez regrouper des photos après un voyage +- Dossiers partagés, si vous voulez que votre partenaire profite de vos clichés +- Liens ves les albums qui peuvent être protégés par un mot de passe +- Possibilité de libérer de l'espace en supprimant les fichiers qui ont été sauvegardés en toute sécurité +- Support humain, car vous en valez la peine +- Descriptions, afin que vous puissiez légender vos souvenirs et les retrouver facilement +- Éditeur d'images, pour ajouter des touches de finition +- Favoriser, cacher et revivre vos souvenirs, car ils sont précieux +- Importation en un clic depuis Google, Apple, votre disque dur et plus encore +- Thème sombre, parce que vos photos y sont jolies +- 2FA, 3FA, authentification biométrique +- et beaucoup de choses encore ! + +PERMISSIONS +ente sollicite diverses autorisations dans le but de fonctionner en tant que service de stockage de photos, et ces autorisations sont détaillées ici : https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +PRIX +Nous ne proposons pas d'abonnement gratuits pour toujours, car il est important pour nous de rester durables et de résister à l'épreuve du temps. Au lieu de cela, nous vous proposons des abonnements abordables que vous pouvez partager librement avec votre famille. Vous pouvez trouver plus d'informations sur ente.io. + +ASSISTANCE +Nous sommes fiers d'offrir un support humain. Si vous êtes un abonné, vous pouvez contacter team@ente.io et vous recevrez une réponse de notre équipe dans les 24 heures. diff --git a/mobile/android/app/src/main/play/listings/fr/short_description.txt b/mobile/android/app/src/main/play/listings/fr/short_description.txt new file mode 100644 index 000000000..0cac8bdcf --- /dev/null +++ b/mobile/android/app/src/main/play/listings/fr/short_description.txt @@ -0,0 +1 @@ +ente est une application de stockage de photos chiffrées de bout en bout \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/fr/title.txt b/mobile/android/app/src/main/play/listings/fr/title.txt new file mode 100644 index 000000000..0a5c07f18 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/fr/title.txt @@ -0,0 +1 @@ +ente - stockage de photos chiffré \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/he/full_description.txt b/mobile/android/app/src/main/play/listings/he/full_description.txt new file mode 100644 index 000000000..21719b771 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/he/full_description.txt @@ -0,0 +1,36 @@ +האפליקציה Ente היא אפליקציה פשוטה לגיבוי ושיתוף של התמונות והסרטונים שלך. + +אם חיפשת אלטרנטיבה ידידותית לפרטיות לGoogle Photos, הגעת למקום הנכון. עם Ente, התמונות והסרטונים מאוחסנים בצורה מאובטחת באמצעות הצפנה קצה-אל-קצה (e2ee). זה אומר שרק אתה יכול לצפות בהם. + +יש לנו אפלקציות קוד פתוח זמינות לAndroid, iOS, רשת ולמחשב, וכל התמונות שלך ייסתנכרנו באופן חלק בין כולם באופן מאובטח על ידי הצפנה קצה-אל-קצה (e2ee). + +ente גם מקל על שיתוף האלבומים שלך עם קרובך, גם אם הם אינם ב-ente. תוכל לשתף קישורים שניתן לצפות בהם בצורה פומבית, שבאמצעותם יתאפשר להם לצפות באלבום שלך ולשתף פעולה על ידי הוספת תמונות אליו, גם בלי חשבון או האפליקציה. + +הנתונים המוצפנים שלך מאוחסנים ב3 מקומות שונים, כולל מקלט גרעיני בפריז. אנחנו מתייחסים ברצינות לעתידות ומקלים עליך לוודא שזכרונותיך ישרדו אחרייך. + +הגענו לכאן כדי ליצור את היישומון לתמונות המאובטח ביותר אי פעם, הצטרפו אלינו למסע! + +מאפיינים +- גיבויים באיכות המקורית, כי כל פיקסל חשוב +- תוכניות משפחתיות, כך שתוכלו לשתף אחסון עם המשפחה שלכם +- אלבומים משותפים, כך שתוכל לאגד יחד תמונות אחרי טיול +- תיקיות משותפות, במקרה ותרצה שהבן זוג שלך יהנה מהקליקים של ה"מצלמה" שלך +- קישורי אלבום, המאובטחים בעזרת סיסמא +- יכולת לשחרר מקום, על ידי הסרת קבצים שכבר גובו באופן מאובטח +- תמיכה אנושית, כי אתה שווה את זה +- תיאורים, כך שתוכל לתאר את הזכרונות שלך ולמצוא אותם בקלות +- עורך תמונות, להוסיף למראה הסופי +- סמן כמועדפים, הסתר ולחזור על זכרונות שלך, כי הם יקרים ללבך +- ייבוא בלחיצה אחת מ-Google, Apple, הכונן הקשיח שלך ועוד +- ערכת נושא כהה, כי התמונות שלך נראות יפות בה +- 2FA, 3FA, אימות ביומטרי +- ועוד הרבה יותר! + +הרשאות +ente מבקש הרשאות מסוימות כדי לספק שירותי אחסון תמונות, וניתן לסקור אותן כאן: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +מחיר +אנחנו לא מציעים תוכניות בחינם לתמיד, משום שזה חשוב לנו להיות עמידים ולעמוד במבחן הזמן. במקום זאת אנחנו מציעים תוכניות במחיר סביר כדי שתוכל לשתף באופן חופשי עם המשפחה שלך. ניתן למצוא עוד מידע ב-ente.io. + +תמיכה +אנחנו גאים להציע תמיכה אנושית. אם אתה לקום משלם, אתה יכול לפנות אלינו בכתובת team@ente.io ולצפות לתשובה תוך 24 שעות. diff --git a/mobile/android/app/src/main/play/listings/he/short_description.txt b/mobile/android/app/src/main/play/listings/he/short_description.txt new file mode 100644 index 000000000..ed7d1d09e --- /dev/null +++ b/mobile/android/app/src/main/play/listings/he/short_description.txt @@ -0,0 +1 @@ +ente הוא אפליקציה לאחסון תמונות המשתמשת בהצפנה קצה-אל-קצה \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/he/title.txt b/mobile/android/app/src/main/play/listings/he/title.txt new file mode 100644 index 000000000..f0f3c6173 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/he/title.txt @@ -0,0 +1 @@ +ente - אחסון תמונות באופן מוצפן \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/it/full_description.txt b/mobile/android/app/src/main/play/listings/it/full_description.txt new file mode 100644 index 000000000..9da92c97a --- /dev/null +++ b/mobile/android/app/src/main/play/listings/it/full_description.txt @@ -0,0 +1,36 @@ +ente è una semplice app per il backup e la condivisione di foto e video. + +Se siete alla ricerca di un'alternativa rispettosa della privacy a Google Photos, siete nel posto giusto. Con ente, sono memorizzati con crittografia end-to-end (e2ee). Questo significa che solo tu puoi vederli. + +Abbiamo applicazioni open-source su Android, iOS, web e desktop, e le tue foto saranno sincronizzate tra tutti i dispositivi utilizzando la crittografia end-to-end (e2ee). + +ente rende anche semplice condividere i tuoi album con i tuoi cari, anche se non sono utenti ente. Puoi condividere link visualizzabili pubblicamente, dove possono visualizzare il tuo album e collaborare aggiungendo le foto, anche senza un account o un'app installata. + +I tuoi dati crittografati vengono replicati in 3 luoghi diversi, tra cui un rifugio antiatomico a Parigi. I tuoi ricordi continueranno a vivere anche quando non ci sarai più. + +Siamo qui per creare l'app per la gestione di foto e video più sicura di sempre, unisciti al nostro viaggio! + +CARATTERISTICHE +- Backup di qualità originale, perché ogni pixel è importante +- Piani famiglia, in modo da poter condividere lo spazio disponibile con la tua famiglia +- Album collaborativi, per poter mettere insieme le foto dopo un viaggio +- Cartelle condivise, nel caso in cui desideri condividere le tue foto subito con il tuo o la tua partner +- Collegamenti di album, che possono essere anche protetti con una password +- Possibilità di liberare spazio, rimuovendo i file che sono stati salvati in modo sicuro +- Supporto umano, perché ne vale la pena +- Descrizioni, in modo da poter descrivere i tuoi ricordi e trovarli facilmente +- Editor di immagini, per ritocchi finali +- Preferiti, nascondi e rivivi i tuoi ricordi, perché sono preziosi +- Importa da Google, Apple o dal tuo hard disk con un semplice clic +- Tema scuro, per valorizzare le tue foto +- 2FA, 3FA, Autenticazione biometrica +- e molto altro ancora! + +PERMESSI +ente richiede alcune autorizzazioni per servire lo scopo di un provider di storage fotografico, che può essere esaminato qui: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +PREZZO +Non offriamo piani gratuiti per sempre, perché per noi è importante rimanere sostenibili e resistere alla prova del tempo. Offriamo invece piani accessibili che si possono condividere liberamente con la propria famiglia. Puoi trovare maggiori informazioni su ente.io. + +SUPPORTO +Siamo orgogliosi di offrire supporto umano. Se sei un nostro cliente a pagamento, puoi contattare team@ente.io e aspettarti una risposta dal nostro team entro 24 ore. diff --git a/mobile/android/app/src/main/play/listings/it/short_description.txt b/mobile/android/app/src/main/play/listings/it/short_description.txt new file mode 100644 index 000000000..77ac8a007 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/it/short_description.txt @@ -0,0 +1 @@ +ente è un'applicazione di archiviazione foto e video crittografata end-to-end \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/it/title.txt b/mobile/android/app/src/main/play/listings/it/title.txt new file mode 100644 index 000000000..63874fc7f --- /dev/null +++ b/mobile/android/app/src/main/play/listings/it/title.txt @@ -0,0 +1 @@ +ente - archivio fotografico crittografato \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/nl/full_description.txt b/mobile/android/app/src/main/play/listings/nl/full_description.txt new file mode 100644 index 000000000..80c925263 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/nl/full_description.txt @@ -0,0 +1,36 @@ +ente is een eenvoudige app om jouw foto's en video's automatisch te back-uppen en delen. + +Als je op zoek bent naar een privacy-vriendelijk alternatief voor Google Photos, dan ben je hier op de juiste plaats. Bij ente worden ze end-to-end encrypted (e2ee). Dit betekent dat alleen jij ze kunt bekijken. + +We hebben open-source apps op Android, iOS, web en Desktop, en je foto's zullen naadloos synchroniseren tussen al je apparaten op een end-to-end versleutelde (e2ee) manier. + +ente maakt het ook simpeler om album te delen met je dierbaren, zelfs als die ente niet gebruiken. Je kunt openbaar zichtbare links delen, waar anderen jouw album kunnen bekijken en er foto's aan toe kunnen voegen, zelfs zonder account of app. + +Jouw versleutelde gegevens worden drievoudig opgeslagen op meerdere locaties, waaronder een kernbunker in Parijs. Wij nemen opslag voor de lange termijn serieus, en zorgen ervoor dat je herinneringen minstens je hele leven bewaard worden. + +Ons doel is om de veiligste foto app ooit te maken, sluit je bij ons aan! + +FUNCTIES +- Backups van originele kwaliteit, omdat elke pixel belangrijk is +- Familieplannen, zodat je de opslag kunt delen met je familie +- Gezamenlijke albums, zodat je foto's kunt samenvoegen na een reis +- Gedeelde mappen, voor het geval je jouw partner wilt laten meegenieten van jouw "Camera" klikjes +- Album links, die met een wachtwoord beschermd kunnen worden +- Mogelijkheid om ruimte vrij te maken op je apparaat, door bestanden die veilig zijn geback-upt te verwijderen +- Menselijke klantenservice, omdat je het waard bent +- Beschrijvingen, zodat je je herinneringen kunt bijhouden en ze gemakkelijk kunt vinden +- Fotobewerker om de laatste finishing touches toe te voegen +- Favorieten, verbergen en herleven van je herinneringen, want ze zijn kostbaar +- Met één klik importeren vanuit Google, Apple, je harde schijf en meer +- Donker thema, omdat je foto's er goed in uit zien +- 2FA, 3FA, biometrische authenticatie +- en nog veel meer! + +TOESTEMMINGEN +ente heeft bepaalde machtigingen nodig om uw foto's op te slaan, die hier bekeken kunnen worden: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +PRIJZEN +We bieden geen oneindig gratis plannen aan, omdat het voor ons belangrijk is dat we duurzaam blijven en de tand des tijds weerstaan. In plaats daarvan bieden we betaalbare plannen aan die je vrij kunt delen met je familie. Je kunt meer informatie vinden op ente.io. + +KLANTENSERVICE +Wij zijn trots op het bieden van menselijke klantenservice. Als je een betaalde klant bent, kun je contact opnemen met team@ente.io en binnen 24 uur een antwoord van ons verwachten. diff --git a/mobile/android/app/src/main/play/listings/nl/short_description.txt b/mobile/android/app/src/main/play/listings/nl/short_description.txt new file mode 100644 index 000000000..9590ece8f --- /dev/null +++ b/mobile/android/app/src/main/play/listings/nl/short_description.txt @@ -0,0 +1 @@ +ente is een end-to-end versteutelde app voor foto opslag \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/nl/title.txt b/mobile/android/app/src/main/play/listings/nl/title.txt new file mode 100644 index 000000000..a73acd5c4 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/nl/title.txt @@ -0,0 +1 @@ +ente - versleutelde foto opslag \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/pl/short_description.txt b/mobile/android/app/src/main/play/listings/pl/short_description.txt new file mode 100644 index 000000000..94bf61a49 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/pl/short_description.txt @@ -0,0 +1 @@ +ente to w pełni szyfrowana aplikacja do przechowywania zdjęć \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/pl/title.txt b/mobile/android/app/src/main/play/listings/pl/title.txt new file mode 100644 index 000000000..ad4bb83f3 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/pl/title.txt @@ -0,0 +1 @@ +ente - szyfrowane przechowywanie zdjęć \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/pt/full_description.txt b/mobile/android/app/src/main/play/listings/pt/full_description.txt new file mode 100644 index 000000000..8e6bc4833 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/pt/full_description.txt @@ -0,0 +1,36 @@ +ente é um aplicativo simples para fazer backup e compartilhar suas fotos e vídeos. + +Se você está procurando uma alternativa ao Google Fotos com foco em privacidade, você veio ao lugar certo. Com ente, eles são armazenados com criptografia de ponta a ponta (e2ee). Isso significa que só você pode vê-los. + +Temos aplicativos de código aberto em todas as plataformas, Android, iOS, web e desktop, e suas fotos irão sincronizar perfeitamente entre todas elas de forma criptografada (e2ee). + +ente também torna simples compartilhar seus álbuns com seus entes queridos, mesmo que eles não estejam no ente. Você pode compartilhar links para visualização pública, onde eles podem visualizar seu álbum e colaborar adicionando fotos a ele, mesmo sem uma conta ou app. + +Seus dados criptografados são replicados em 3 locais diferentes, incluindo um abrigo avançado em Paris. Levamos a sério a nossa postura e fazemos com que seja fácil garantir que suas memórias vivam. + +Estamos aqui para se tornar o app de fotos mais seguro de todos, venha entrar em nossa jornada! + +RECURSOS +- Cópia de qualidade original, porque cada pixel é importante +- Planos de família, para que você possa compartilhar o armazenamento com sua família +- Álbuns colaborativos, para que você possa agrupar fotos após uma corrida +- Pastas compartilhadas, caso você queira que seu parceiro aproveite seus cliques da "Câmera" +- Links de álbuns, que podem ser protegidos com uma senha e definidos para expirar +- Capacidade de liberar espaço, removendo arquivos que foram salvos com segurança +- Suporte humano, porque você vale a pena +- Descrições, para que você possa captar suas memórias e encontrá-las facilmente +- Editor de imagens, para adicionar toques finais +- Favoritar, esconder e reviver suas memórias, pois elas são preciosas +- Importar com um clique do Google, Apple, seu disco rígido e muito mais +- Tema escuro, porque suas fotos parecem bem nele +- 2FA, 3FA, Autenticação biométrica +- e MUITO MAIS! + +PERMISSÕES +ente solicita certas permissões para servir o propósito de um provedor de armazenamento de fotos, que pode ser revisado aqui: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +PREÇO +Não oferecemos planos gratuitos para sempre, porque é importante para nós que permaneçamos sustentáveis e resistamos à prova do tempo. Em vez disso, oferecemos planos acessíveis que você pode compartilhar livremente com sua família. Você pode encontrar mais informações em ente.io. + +SUPORTE +Temos orgulho em oferecer apoio humano. Se você é nosso cliente pago, você pode entrar em contato com o team@ente.io e esperar uma resposta da nossa equipe dentro de 24 horas. diff --git a/mobile/android/app/src/main/play/listings/pt/short_description.txt b/mobile/android/app/src/main/play/listings/pt/short_description.txt new file mode 100644 index 000000000..59c457c0e --- /dev/null +++ b/mobile/android/app/src/main/play/listings/pt/short_description.txt @@ -0,0 +1 @@ +ente é um aplicativo de armazenamento de fotos criptografado de ponta a ponta \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/pt/title.txt b/mobile/android/app/src/main/play/listings/pt/title.txt new file mode 100644 index 000000000..dc953a866 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/pt/title.txt @@ -0,0 +1 @@ +ente - armazenamento criptografado de fotos \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/ru/full_description.txt b/mobile/android/app/src/main/play/listings/ru/full_description.txt new file mode 100644 index 000000000..567f5a947 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/ru/full_description.txt @@ -0,0 +1,36 @@ +ente - это простое приложение для резервного копирования и отправки ваших фотографий и видео. + +Если вы ищете подходящую для вас альтернативу Гугл Фото, то вы попали в нужное место. В Ente, они хранятся в сквозном шифровании (e2ee). Это означает то, что только вы можете их просматривать. + +У нас есть приложения с открытым исходным кодом на всех платформах, и ваши фотографии будут беспрепятственно синхронизироваться со всеми вашими устройствами с помощью сквозного шифрования (e2ee). + +ente также делает так, что делится альбомами со своими близкими становиться невероятно легко, даже если они не зарегистрированы в ente. Вы можете поделиться ссылками публичного доступа, где они могут просматривать ваш альбом и совместно с вами добавлять фотографии в него даже без учетной записи или приложения. + +Ваши зашифрованные данные воспроизводятся в 3‑х разных местах, включая скрытое убежище в Париже. Мы серьезно относимся к потомству и легко сделаем так, что ваши воспоминания переживут и вас. + +Мы здесь, чтобы сделать самое безопасное приложение для хранения фотографий, присоединяйтесь к нашему путешествию! + +ОСОБЕННОСТИ +- Оригинальное качество резервных копий, потому что важен каждый пиксел +- Семейные планы, чтобы вы могли делиться хранилищем с вашей семьей +- Групповые альбомы, что бы вы могли объединить фотографии после поездки +- Общие папки, если вы хотите, чтобы ваш партнер наслаждался кликами вашей "Камеры" +- Ссылки для альбома, которые могут быть защищены паролем +- Возможность освободить место путем удаления файлов, которые были безопасно сохранены +- Поддержка с живыми людьми, потому что вы заслуживаете лучшего +- Описания, так что вы можете добавить надпись на свои воспоминания и легко найти их +- Редактор изображений, для добавления финальных штрихов +- Избранное, скрывать и доверять вашим воспоминаниям, потому что они драгоценны +- Импорт в один клик из Google, Apple, вашего жесткого диска и многого другого +- Темная тема, потому что в ней хорошо выглядят ваши фотографии +- 2ФА, 3ФА, биометрическая аутентификация +- и ещё МНОГОЕ другое! + +РАЗРЕШЕНИЯ +ente просит разрешения на использование хранилища фотографий, которые можно рассмотреть здесь: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +ЦЕНА +Мы не предлагаем бесконечные бесплатные планы, потому что для нас важно оставаться устойчивыми и выдерживать испытание временем. Вместо этого мы предлагаем доступные по цене планы, которыми вы можете свободно делиться с вашей семьей. Дополнительную информацию можно найти на сайте ente.io. + +ПОДДЕРЖКА +Мы гордимся тем, что предлагаем поддержку с живыми людьми. Если вы являетесь нашим платным клиентом, вы можете связаться по электронному адресу team@ente.io и получить ответ от нашей команды в течение 24 часов. diff --git a/mobile/android/app/src/main/play/listings/ru/short_description.txt b/mobile/android/app/src/main/play/listings/ru/short_description.txt new file mode 100644 index 000000000..e2bb8133f --- /dev/null +++ b/mobile/android/app/src/main/play/listings/ru/short_description.txt @@ -0,0 +1 @@ +ente - это приложение для хранения фотографий с помощью сквозного шифрования \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/ru/title.txt b/mobile/android/app/src/main/play/listings/ru/title.txt new file mode 100644 index 000000000..e1e217065 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/ru/title.txt @@ -0,0 +1 @@ +ente - хранилище фотографий со сквозным шифрованием \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/zh/full_description.txt b/mobile/android/app/src/main/play/listings/zh/full_description.txt new file mode 100644 index 000000000..2fffa8a0c --- /dev/null +++ b/mobile/android/app/src/main/play/listings/zh/full_description.txt @@ -0,0 +1,36 @@ +ente 是一个简单的应用程序来备份和分享您的照片和视频。 + +如果你一直在寻找一个隐私友好的Google Photos替代品,那么你就来对地方了。 使用 Ente,它们以端到端加密 (e2ee) 的方式存储。 这意味着只有您可以查看它们。 使用 Ente,它们以端到端加密 (e2ee) 的方式存储。 这意味着只有您可以查看它们。 + +我们在Android、iOS、web 和桌面上有开源应用, 和您的照片将以端到端加密方式 (e2ee) 无缝同步。 + +ente也使分享相册给自己的爱人、亲人变得轻而易举,即使他们可能并不使用ente。 您可以分享可公开查看的链接,使他们可以查看您的相册,并通过添加照片来协作而不需要注册账户或下载app。 您可以共享公开可见的链接,他们可以在其中查看您的相册并通过向其中添加照片进行协作,即使没有账户或应用程序也是如此。 + +您的加密数据已复制到三个不同的地点,包括巴黎的一个安全屋。 我们认真对待子孙后代,并确保您的回忆比您长寿。 我们认真对待子孙后代,并确保您的回忆比您长寿。 + +我们来这里是为了打造有史以来最安全的照片应用,来和我们一起前行! + +特点 +- 原始质量备份,因为每个像素都是重要的 +- 家庭计划,您可以与家人共享存储 +- 协作相册,您可以在旅行后将照片汇集在一起。 +- 共享文件夹,如果您想让您的伙伴享受您的每一次快门 +- 可以用密码保护相册链接 +- 能够通过移除已经安全备份的文件释放空间 +- 实人支持与协助,因为你值得这一切。 +- 添加描述,这样您可以描述您的回忆并在未来轻松地找到它们 +- 图像编辑器,完成收尾工作 +- 收藏、隐藏和恢复您的回忆,因为它们是宝贵的 +- 一键从谷歌、苹果、您的硬盘或更多的介质导入 +- 黑暗主题,因为您的照片在其中看着不错 +- 2FA,3FA,生物识别认证 +- 还有更多特色待你发现! + +权限 +ente需要特定权限以执行作为图像存储提供商的职责,相关内容可以在此链接查阅:https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +价格 +我们不会提供永久免费计划,因为我们必须保持可持续性,经受住时间的考验。 相反,我们向您提供了价格实惠、可自由分享的订阅计划。 您可以在 ente.io 找到更多信息。 相反,我们向您提供了价格实惠、可自由分享的订阅计划。 您可以在 ente.io 找到更多信息。 相反,我们向您提供了价格实惠、可自由分享的订阅计划。 您可以在 ente.io 找到更多信息。 + +支持 +我们对提供真人支持感到自豪。 我们对提供真人支持感到自豪。 如果您是我们的付费客户,您可以联系 team@ente.io 并在24小时内收到来自我们团队的回复。 diff --git a/mobile/android/app/src/main/play/listings/zh/short_description.txt b/mobile/android/app/src/main/play/listings/zh/short_description.txt new file mode 100644 index 000000000..f03d1a37f --- /dev/null +++ b/mobile/android/app/src/main/play/listings/zh/short_description.txt @@ -0,0 +1 @@ +ente 是一个端到端加密的照片存储应用 \ No newline at end of file diff --git a/mobile/android/app/src/main/play/listings/zh/title.txt b/mobile/android/app/src/main/play/listings/zh/title.txt new file mode 100644 index 000000000..a976869b1 --- /dev/null +++ b/mobile/android/app/src/main/play/listings/zh/title.txt @@ -0,0 +1 @@ +ente - 加密照片存储 \ No newline at end of file diff --git a/mobile/fastlane/metadata/android/tr/full_description.txt b/mobile/fastlane/metadata/android/tr/full_description.txt new file mode 100644 index 000000000..2362583f6 --- /dev/null +++ b/mobile/fastlane/metadata/android/tr/full_description.txt @@ -0,0 +1,36 @@ +ente, fotoğraflarınızı ve videolarınızı yedeklemek ve paylaşmak için basit bir uygulamadır. + +Google Fotoğraflar'a gizlilik dostu bir alternatif arıyorsanız doğru yere geldiniz. Ente ile uçtan uca şifrelenmiş olarak (e2ee) saklanırlar. Bu, onları yalnızca sizin görebileceğiniz anlamına gelir. + +Android, iOS, web ve masaüstünde açık kaynaklı uygulamalarımız var ve fotoğraflarınız bunların tümü arasında uçtan uca şifrelenmiş (e2ee) şekilde sorunsuz bir şekilde senkronize edilecek. + +ente ayrıca, ente'de olmasalar bile albümlerinizi sevdiklerinizle paylaşmanızı da kolaylaştırır. Bir hesap veya uygulama olmadan bile albümünüzü görüntüleyebilecekleri ve albüme fotoğraf ekleyerek ortak çalışabilecekleri, herkese açık olarak görüntülenebilen bağlantıları paylaşabilirsiniz. + +Şifrelenmiş verileriniz, Paris'teki bir serpinti sığınağı da dahil olmak üzere birden fazla yerde depolanır. Gelecek nesilleri ciddiye alıyor ve anılarınızın sizden daha uzun yaşamasını sağlamayı kolaylaştırıyoruz. + +Şimdiye kadarki en güvenli fotoğraf uygulamasını yapmak için buradayız, gelin yolculuğumuza katılın! + +✨ÖZELLİKLER +- Orijinal kalitede yedekler, çünkü her piksel önemlidir +- Aile planları, böylece depolama alanını ailenizle paylaşabilirsiniz +- Seyahatten sonra fotoğrafları bir araya toplayabilmeniz için ortak albümler +- Partnerinizin "Kamera" tıklamalarınızın keyfini çıkarmasını istemeniz durumunda paylaşılan klasörler +- Parola ile korunabilen ve süresi dolacak şekilde ayarlanabilen albüm bağlantıları +- Güvenli bir şekilde yedeklenmiş dosyaları kaldırarak alan boşaltma yeteneği +- İnsan desteği, çünkü sen buna değersin +- Açıklamalar, böylece anılarınıza başlık yazabilir ve onları kolayca bulabilirsiniz +- Son rötuşları eklemek için görüntü düzenleyici +- Favori, sakla ve anılarını yeniden yaşa, çünkü onlar değerlidir +- Google, Apple, sabit diskiniz ve daha fazlasından tek tıkla içe aktarma +- Koyu tema, çünkü fotoğraflarınız bu temada güzel görünüyor +- 2FA, 3FA, biyometrik kimlik doğrulama +- ve çok daha fazlası! + +İZİNLER +bir fotoğraf depolama sağlayıcısının amacına hizmet etmek için belirli izinlere yönelik taleplerde bulunulabilir; bu izinler burada incelenebilir: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md + +FİYATLANDIRMA +Sonsuza kadar ücretsiz planlar sunmuyoruz, çünkü sürdürülebilir kalmamız ve zamanın testine dayanmamız bizim için önemli. Bunun yerine, ailenizle özgürce paylaşabileceğiniz uygun fiyatlı planlar sunuyoruz. Daha fazla bilgiyi ente.io adresinde bulabilirsiniz. + +🙋DESTEK +İnsan desteği sunmaktan gurur duyuyoruz. Ücretli müşterimiz iseniz team@ente.io adresine ulaşabilir ve ekibimizden 24 saat içinde yanıt bekleyebilirsiniz. diff --git a/mobile/fastlane/metadata/android/tr/short_description.txt b/mobile/fastlane/metadata/android/tr/short_description.txt new file mode 100644 index 000000000..8995ef366 --- /dev/null +++ b/mobile/fastlane/metadata/android/tr/short_description.txt @@ -0,0 +1 @@ +ente uçtan uca şifrelenmiş bir fotoğraf depolama uygulamasıdır \ No newline at end of file diff --git a/mobile/fastlane/metadata/android/tr/title.txt b/mobile/fastlane/metadata/android/tr/title.txt new file mode 100644 index 000000000..85355d495 --- /dev/null +++ b/mobile/fastlane/metadata/android/tr/title.txt @@ -0,0 +1 @@ +ente - şifrelenmiş depolama sistemi \ No newline at end of file diff --git a/mobile/fastlane/metadata/ios/ru/name.txt b/mobile/fastlane/metadata/ios/ru/name.txt index 45bf4920f..44e95b9fc 100644 --- a/mobile/fastlane/metadata/ios/ru/name.txt +++ b/mobile/fastlane/metadata/ios/ru/name.txt @@ -1 +1 @@ -ente Фото +ente фотографии diff --git a/mobile/fastlane/metadata/ios/ru/subtitle.txt b/mobile/fastlane/metadata/ios/ru/subtitle.txt index a995d09ed..990f6a1af 100644 --- a/mobile/fastlane/metadata/ios/ru/subtitle.txt +++ b/mobile/fastlane/metadata/ios/ru/subtitle.txt @@ -1 +1 @@ -Система зашифрованного хранения фотографий +Зашифрованное хранилище фотографий diff --git a/mobile/fastlane/metadata/ios/tr/description.txt b/mobile/fastlane/metadata/ios/tr/description.txt new file mode 100644 index 000000000..9ee96f277 --- /dev/null +++ b/mobile/fastlane/metadata/ios/tr/description.txt @@ -0,0 +1,33 @@ +Ente, fotoğraflarınızı ve videolarınızı yedekleyip paylaşmanızı sağlayan kullanimi kolay bir uygulamadır. + +Anılarınızı saklamak için gizlilik dostu bir alternatif arıyorsanız, doğru yere geldiniz. Ente ile uçtan uca şifrelenmiş olarak (e2ee) saklanırlar. Bu, onları yalnızca sizin görebileceğiniz anlamına gelir. + +Android, iOS, web ve Masaüstünde uygulamalarımız var ve fotoğraflarınız tüm cihazlarınız arasında uçtan uca şifrelenmiş (e2ee) bir şekilde sorunsuz bir şekilde senkronize edilecek. + +Ente, albümlerinizi sevdiklerinizle paylaşmanızı da kolaylaştırıyor. Bunları uçtan uca şifrelenmiş olarak doğrudan diğer Ente kullanıcılarıyla paylaşabilir veya herkese açık olarak görüntülenebilir bağlantılarla paylaşabilirsiniz. + +Şifrelenmiş verileriniz, Paris'teki bir serpinti sığınağı da dahil olmak üzere birden fazla yerde depolanır. Gelecek nesilleri ciddiye alıyor ve anılarınızın sizden daha uzun yaşamasını sağlamayı kolaylaştırıyoruz. + +Şimdiye kadarki en güvenli fotoğraf uygulamasını yapmak için buradayız, gelin yolculuğumuza katılın! + +✨ÖZELLİKLER +- Orijinal kalitede yedekler, çünkü her piksel önemlidir +- Aile planları, böylece depolama alanını ailenizle paylaşabilirsiniz +- Partnerinizin "Kamera" tıklamalarınızın keyfini çıkarmasını istemeniz durumunda paylaşılan klasörler +- Parola ile korunabilen ve süresi dolacak şekilde ayarlanabilen albüm bağlantıları +- Güvenli bir şekilde yedeklenmiş dosyaları kaldırarak alan boşaltma yeteneği +- Son rötuşları eklemek için görüntü düzenleyici +- Favori, sakla ve anılarını yeniden yaşa, çünkü onlar değerlidir +- Tüm büyük depolama sağlayıcılarından tek tıklamayla içe aktarma +- Koyu tema, çünkü fotoğraflarınız bu temada güzel görünüyor +- 2FA, 3FA, biyometrik kimlik doğrulama +- ve çok daha fazlası! + +FİYATLANDIRMA +Sonsuza kadar ücretsiz planlar sunmuyoruz, çünkü sürdürülebilir kalmamız ve zamanın testine dayanmamız bizim için önemli. Bunun yerine, ailenizle özgürce paylaşabileceğiniz uygun fiyatlı planlar sunuyoruz. Daha fazla bilgiyi ente.io adresinde bulabilirsiniz. + +🙋DESTEK +İnsan desteği sunmaktan gurur duyuyoruz. Ücretli müşterimiz iseniz team@ente.io adresine ulaşabilir ve ekibimizden 24 saat içinde yanıt bekleyebilirsiniz. + +ŞARTLAR +https://ente.io/terms diff --git a/mobile/fastlane/metadata/ios/tr/keywords.txt b/mobile/fastlane/metadata/ios/tr/keywords.txt new file mode 100644 index 000000000..4e9f74bd7 --- /dev/null +++ b/mobile/fastlane/metadata/ios/tr/keywords.txt @@ -0,0 +1 @@ +fotoğraflar,fotoğrafçılık,aile,gizlilik,bulut,yedekleme,videolar,fotoğraf,şifreleme,depolama,albüm,alternatif diff --git a/mobile/fastlane/metadata/ios/tr/name.txt b/mobile/fastlane/metadata/ios/tr/name.txt new file mode 100644 index 000000000..04e5a9c01 --- /dev/null +++ b/mobile/fastlane/metadata/ios/tr/name.txt @@ -0,0 +1 @@ +ente fotoğraf uygulaması diff --git a/mobile/fastlane/metadata/ios/tr/subtitle.txt b/mobile/fastlane/metadata/ios/tr/subtitle.txt new file mode 100644 index 000000000..cbc438b5f --- /dev/null +++ b/mobile/fastlane/metadata/ios/tr/subtitle.txt @@ -0,0 +1 @@ +Şifrelenmiş depolama sistemi diff --git a/mobile/fastlane/metadata/playstore/tr/full_description.txt b/mobile/fastlane/metadata/playstore/tr/full_description.txt new file mode 100644 index 000000000..b13229830 --- /dev/null +++ b/mobile/fastlane/metadata/playstore/tr/full_description.txt @@ -0,0 +1,30 @@ +Ente, fotoğraflarınızı ve videolarınızı yedekleyip paylaşmanızı sağlayan kullanimi kolay bir uygulamadır. + +Anılarınızı saklamak için gizlilik dostu bir alternatif arıyorsanız, doğru yere geldiniz. Ente ile uçtan uca şifrelenmiş olarak (e2ee) saklanırlar. Bu, onları yalnızca sizin görüntüleyebileceğiniz anlamına gelir. + +Android, iOS, web ve Masaüstünde uygulamalarımız var ve fotoğraflarınız tüm cihazlarınız arasında uçtan uca şifrelenmiş (e2ee) bir şekilde sorunsuz bir şekilde senkronize edilecek. + +Ente, albümlerinizi sevdiklerinizle paylaşmanızı da kolaylaştırıyor. Bunları uçtan uca şifrelenmiş olarak doğrudan diğer Ente kullanıcılarıyla paylaşabilir veya herkese açık olarak görüntülenebilir bağlantılarla paylaşabilirsiniz. + +Şifrelenmiş verileriniz, Paris'teki bir serpinti sığınağı da dahil olmak üzere birden fazla yerde depolanır. Gelecek nesilleri ciddiye alıyor ve anılarınızın sizden daha uzun yaşamasını sağlamayı kolaylaştırıyoruz. + +Şimdiye kadarki en güvenli fotoğraf uygulamasını yapmak için buradayız, gelin yolculuğumuza katılın! + +✨ÖZELLİKLER +- Orijinal kalitede yedekler, çünkü her piksel önemlidir +- Aile planları, böylece depolama alanını ailenizle paylaşabilirsiniz +- Partnerinizin "Kamera" tıklamalarınızın keyfini çıkarmasını istemeniz durumunda paylaşılan klasörler +- Parola ile korunabilen ve süresi dolacak şekilde ayarlanabilen albüm bağlantıları +- Güvenli bir şekilde yedeklenmiş dosyaları kaldırarak alan boşaltma yeteneği +- Son rötuşları eklemek için görüntü düzenleyici +- Favori, sakla ve anılarını yeniden yaşa, çünkü onlar değerlidir +- Google, Apple, sabit diskiniz ve daha fazlasından tek tıkla içe aktarma +- Koyu tema, çünkü fotoğraflarınız bu temada güzel görünüyor +- 2FA, 3FA, biyometrik kimlik doğrulama +- ve çok daha fazlası! + +💲 FİYATLANDIRMA +Sonsuza kadar ücretsiz planlar sunmuyoruz, çünkü sürdürülebilir kalmamız ve zamanın testine dayanmamız bizim için önemli. Bunun yerine, ailenizle özgürce paylaşabileceğiniz uygun fiyatlı planlar sunuyoruz. Daha fazla bilgiyi ente.io adresinde bulabilirsiniz. + +🙋DESTEK +İnsan desteği sunmaktan gurur duyuyoruz. Ücretli müşterimiz iseniz team@ente.io adresine ulaşabilir ve ekibimizden 24 saat içinde yanıt bekleyebilirsiniz. \ No newline at end of file diff --git a/mobile/fastlane/metadata/playstore/tr/short_description.txt b/mobile/fastlane/metadata/playstore/tr/short_description.txt new file mode 100644 index 000000000..009cb00bf --- /dev/null +++ b/mobile/fastlane/metadata/playstore/tr/short_description.txt @@ -0,0 +1 @@ +Şifreli fotoğraf depolama - fotoğraflarınızı ve videolarınızı yedekleyin, düzenleyin ve paylaşın \ No newline at end of file diff --git a/mobile/integration_test/app_init_test.dart b/mobile/integration_test/app_init_test.dart new file mode 100644 index 000000000..e3313670c --- /dev/null +++ b/mobile/integration_test/app_init_test.dart @@ -0,0 +1,130 @@ +import "dart:async"; + +import "package:flutter/material.dart"; +import "package:flutter_test/flutter_test.dart"; +import "package:integration_test/integration_test.dart"; +import "package:logging/logging.dart"; +import "package:photos/main.dart" as app; + +void main() { + group("App init test", () { + final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive; + testWidgets("App init test", semanticsEnabled: false, (tester) async { + // https://github.com/flutter/flutter/issues/89749#issuecomment-1029965407 + tester.testTextInput.register(); + + await runZonedGuarded( + () async { + bool skipLogin = false; + + ///Ignore exceptions thrown by the app for the test to pass + WidgetsFlutterBinding.ensureInitialized(); + FlutterError.onError = (FlutterErrorDetails errorDetails) { + FlutterError.dumpErrorToConsole(errorDetails); + }; + + await binding.traceAction( + () async { + app.main(); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + await dismissUpdateAppDialog(tester); + + final signInButton = find.byKey(const ValueKey("signInButton")); + skipLogin = !tester.any(signInButton); + + if (!skipLogin) { + await tester.tap(signInButton); + await tester.pumpAndSettle(); + final emailInputField = find.byType(TextFormField); + final logInButton = find.byKey(const ValueKey("logInButton")); + //Fill email id here + await tester.enterText(emailInputField, "*enter email here*"); + await tester.pumpAndSettle(const Duration(seconds: 1)); + await tester.tap(logInButton); + await tester.pumpAndSettle(const Duration(seconds: 3)); + final passwordInputField = + find.byKey(const ValueKey("passwordInputField")); + final verifyPasswordButton = + find.byKey(const ValueKey("verifyPasswordButton")); + //Fill password here + await tester.enterText( + passwordInputField, + "*enter password here*", + ); + await tester.pumpAndSettle(const Duration(seconds: 1)); + await tester.tap(verifyPasswordButton); + await tester.pumpAndSettle(); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + await dismissUpdateAppDialog(tester); + + //Grant permission to access photos. Must manually click the system dialog. + final grantPermissionButton = + find.byKey(const ValueKey("grantPermissionButton")); + await tester.tap(grantPermissionButton); + await tester.pumpAndSettle(const Duration(seconds: 1)); + await tester.pumpAndSettle(const Duration(seconds: 3)); + + //Automatically skips backup + final skipBackupButton = + find.byKey(const ValueKey("skipBackupButton")); + await tester.tap(skipBackupButton); + await tester.pumpAndSettle(const Duration(seconds: 2)); + } + }, + reportKey: "app_init_summary", + ); + }, + (error, stack) { + Logger("app_init_test").info(error, stack); + }, + ); + }); + }); +} + +Future dismissUpdateAppDialog(WidgetTester tester) async { + await tester.tapAt(const Offset(0, 0)); + await tester.pumpAndSettle(); +} + + +///Use this widget as floating action buttom in HomeWidget so that frames +///are built and rendered continuously so that timeline trace has continuous +///data. Change the duraiton in `_startTimer()` to control the duraiton of +///test on app init. + +// class TempWidget extends StatefulWidget { +// const TempWidget({super.key}); + +// @override +// TempWidgetState createState() => TempWidgetState(); +// } + +// class TempWidgetState extends State { +// bool _isLoading = true; + +// @override +// void initState() { +// super.initState(); +// _startTimer(); +// } + +// void _startTimer() { +// Future.delayed(const Duration(seconds: 20), () { +// setState(() { +// _isLoading = false; +// }); +// }); +// } + +// @override +// Widget build(BuildContext context) { +// return _isLoading +// ? const CircularProgressIndicator() +// : const SizedBox.shrink(); +// } +// } \ No newline at end of file diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 46aa7d86b..f8d2c3ad7 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -1,8 +1,11 @@ PODS: - - background_fetch (1.2.1): + - background_fetch (1.3.2): - Flutter - battery_info (0.0.1): - Flutter + - bonsoir_darwin (3.0.0): + - Flutter + - FlutterMacOS - connectivity_plus (0.0.1): - Flutter - ReachabilitySwift @@ -10,38 +13,38 @@ PODS: - Flutter - file_saver (0.0.1): - Flutter - - Firebase/CoreOnly (10.18.0): - - FirebaseCore (= 10.18.0) - - Firebase/Messaging (10.18.0): + - Firebase/CoreOnly (10.22.0): + - FirebaseCore (= 10.22.0) + - Firebase/Messaging (10.22.0): - Firebase/CoreOnly - FirebaseMessaging (~> 10.22.0) - firebase_core (2.29.0): - Firebase/CoreOnly (= 10.22.0) - Flutter - - firebase_messaging (14.7.10): - - Firebase/Messaging (= 10.18.0) + - firebase_messaging (14.7.19): + - Firebase/Messaging (= 10.22.0) - firebase_core - Flutter - - FirebaseCore (10.18.0): + - FirebaseCore (10.22.0): - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.12) - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreInternal (10.21.0): + - FirebaseCoreInternal (10.24.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (10.21.0): + - FirebaseInstallations (10.24.0): - FirebaseCore (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.18.0): + - FirebaseMessaging (10.22.0): - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) + - GoogleDataTransport (~> 9.3) - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/Reachability (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) + - nanopb (< 2.30911.0, >= 2.30908.0) - fk_user_agent (2.0.0): - Flutter - Flutter (1.0.0) @@ -70,27 +73,35 @@ PODS: - fluttertoast (0.0.2): - Flutter - Toast - - GoogleDataTransport (9.3.0): + - GoogleDataTransport (9.4.1): - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) + - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/AppDelegateSwizzler (7.13.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (7.13.0): + - GoogleUtilities/Privacy - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Logger (7.13.0): - GoogleUtilities/Environment - - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Network (7.13.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.12.0)" - - GoogleUtilities/Reachability (7.12.0): + - "GoogleUtilities/NSData+zlib (7.13.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.0) + - GoogleUtilities/Reachability (7.13.0): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (7.13.0): - GoogleUtilities/Logger + - GoogleUtilities/Privacy - home_widget (0.0.1): - Flutter - image_editor_common (1.0.0): @@ -114,6 +125,8 @@ PODS: - libwebp/sharpyuv (1.3.2) - libwebp/webp (1.3.2): - libwebp/sharpyuv + - local_auth_darwin (0.0.1): + - Flutter - local_auth_ios (0.0.1): - Flutter - Mantle (2.2.0): @@ -131,11 +144,11 @@ PODS: - Flutter - move_to_background (0.0.1): - Flutter - - nanopb (2.30909.1): - - nanopb/decode (= 2.30909.1) - - nanopb/encode (= 2.30909.1) - - nanopb/decode (2.30909.1) - - nanopb/encode (2.30909.1) + - nanopb (2.30910.0): + - nanopb/decode (= 2.30910.0) + - nanopb/encode (= 2.30910.0) + - nanopb/decode (2.30910.0) + - nanopb/encode (2.30910.0) - onnxruntime (0.0.1): - Flutter - onnxruntime-objc (= 1.15.1) @@ -152,28 +165,30 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - permission_handler_apple (9.3.0): + - Flutter - photo_manager (2.0.0): - Flutter - FlutterMacOS - - PromisesObjC (2.3.1) - - ReachabilitySwift (5.0.0) - - receive_sharing_intent (1.6.7): + - PromisesObjC (2.4.0) + - ReachabilitySwift (5.2.1) + - receive_sharing_intent (1.6.8): - Flutter - screen_brightness_ios (0.1.0): - Flutter - - SDWebImage (5.18.11): - - SDWebImage/Core (= 5.18.11) - - SDWebImage/Core (5.18.11) + - SDWebImage (5.19.1): + - SDWebImage/Core (= 5.19.1) + - SDWebImage/Core (5.19.1) - SDWebImageWebPCoder (0.14.5): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - - Sentry/HybridSDK (8.18.0): - - SentryPrivate (= 8.18.0) - - sentry_flutter (0.0.1): + - Sentry/HybridSDK (8.21.0): + - SentryPrivate (= 8.21.0) + - sentry_flutter (7.19.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 8.18.0) - - SentryPrivate (8.18.0) + - Sentry/HybridSDK (= 8.21.0) + - SentryPrivate (8.21.0) - share_plus (0.0.1): - Flutter - shared_preferences_foundation (0.0.1): @@ -193,11 +208,11 @@ PODS: - sqlite3/common - sqlite3_flutter_libs (0.0.1): - Flutter - - sqlite3 (~> 3.45.0) + - sqlite3 (~> 3.45.1) - sqlite3/fts5 - sqlite3/perf-threadsafe - sqlite3/rtree - - Toast (4.1.0) + - Toast (4.1.1) - uni_links (0.0.1): - Flutter - url_launcher_ios (0.0.1): @@ -216,6 +231,7 @@ PODS: DEPENDENCIES: - background_fetch (from `.symlinks/plugins/background_fetch/ios`) - battery_info (from `.symlinks/plugins/battery_info/ios`) + - bonsoir_darwin (from `.symlinks/plugins/bonsoir_darwin/darwin`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - file_saver (from `.symlinks/plugins/file_saver/ios`) @@ -236,6 +252,7 @@ DEPENDENCIES: - in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`) - integration_test (from `.symlinks/plugins/integration_test/ios`) - isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`) + - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`) - media_extension (from `.symlinks/plugins/media_extension/ios`) - media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`) @@ -247,6 +264,7 @@ DEPENDENCIES: - open_mail_app (from `.symlinks/plugins/open_mail_app/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - photo_manager (from `.symlinks/plugins/photo_manager/ios`) - receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`) - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) @@ -291,6 +309,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/background_fetch/ios" battery_info: :path: ".symlinks/plugins/battery_info/ios" + bonsoir_darwin: + :path: ".symlinks/plugins/bonsoir_darwin/darwin" connectivity_plus: :path: ".symlinks/plugins/connectivity_plus/ios" device_info_plus: @@ -331,6 +351,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/integration_test/ios" isar_flutter_libs: :path: ".symlinks/plugins/isar_flutter_libs/ios" + local_auth_darwin: + :path: ".symlinks/plugins/local_auth_darwin/darwin" local_auth_ios: :path: ".symlinks/plugins/local_auth_ios/ios" media_extension: @@ -353,6 +375,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" photo_manager: :path: ".symlinks/plugins/photo_manager/ios" receive_sharing_intent: @@ -383,9 +407,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/wakelock_plus/ios" SPEC CHECKSUMS: - background_fetch: 896944864b038d2837fc750d470e9841e1e6a363 + background_fetch: 2319bf7e18237b4b269430b7f14d177c0df09c5a battery_info: 09f5c9ee65394f2291c8c6227bedff345b8a730c - connectivity_plus: 53efb943fc2882c8512d84c45707bcabc4c36076 + bonsoir_darwin: 127bdc632fdc154ae2f277a4d5c86a6212bc75be + connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808 Firebase: 797fd7297b7e1be954432743a0b3f90038e45a71 @@ -396,7 +421,7 @@ SPEC CHECKSUMS: FirebaseInstallations: 8f581fca6478a50705d2bd2abd66d306e0f5736e FirebaseMessaging: 9f71037fd9db3376a4caa54e5a3949d1027b4b6e fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545 - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_email_sender: 02d7443217d8c41483223627972bfdc09f74276b flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433 flutter_inappwebview: 3d32228f1304635e7c028b0d4252937730bbc6cf @@ -405,15 +430,16 @@ SPEC CHECKSUMS: flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be flutter_sodium: c84426b4de738514b5b66cfdeb8a06634e72fe0b fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265 - GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a + GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152 home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57 image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43 - in_app_purchase_storekit: 9e9931234f0adcf71ae323f8c83785b96030edf1 + in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892 integration_test: 13825b8a9334a850581300559b8839134b124670 isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 - local_auth_ios: 1ba1475238daa33a6ffa2a29242558437be435ac + local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 + local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9 Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d media_extension: 6d30dc1431ebaa63f43c397c37917b1a0a597a4c media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1 @@ -421,7 +447,7 @@ SPEC CHECKSUMS: media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e motionphoto: d4a432b8c8f22fb3ad966258597c0103c9c5ff16 move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d - nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + nanopb: 438bc412db1928dac798aa6fd75726007be04262 onnxruntime: e9346181d75b8dea8733bdae512a22c298962e00 onnxruntime-c: ebdcfd8650bcbd10121c125262f99dea681b92a3 onnxruntime-objc: ae7acec7a3d03eaf072d340afed7a35635c1c2a6 @@ -429,25 +455,26 @@ SPEC CHECKSUMS: OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 photo_manager: 4f6810b7dfc4feb03b461ac1a70dacf91fba7604 - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - receive_sharing_intent: 9ca20ae908f83c36ddaaaa8c9bd30ce4700495e8 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + ReachabilitySwift: 5ae15e16814b5f9ef568963fb2c87aeb49158c66 + receive_sharing_intent: 6837b01768e567fe8562182397bf43d63d8c6437 screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625 - SDWebImage: a3ba0b8faac7228c3c8eadd1a55c9c9fe5e16457 + SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb SDWebImageWebPCoder: c94f09adbca681822edad9e532ac752db713eabf Sentry: ebc12276bd17613a114ab359074096b6b3725203 sentry_flutter: 88ebea3f595b0bc16acc5bedacafe6d60c12dcd5 SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe - share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad + share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqlite3: 73b7fc691fdc43277614250e04d183740cb15078 - sqlite3_flutter_libs: aeb4d37509853dfa79d9b59386a2dac5dd079428 - Toast: ec33c32b8688982cecc6348adeae667c1b9938da + sqlite3_flutter_libs: af0e8fe9bce48abddd1ffdbbf839db0302d72d80 + Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e uni_links: d97da20c7701486ba192624d99bffaaffcfc298a - url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812 - video_player_avfoundation: e9e6f9cae7d7a6d9b43519b0aab382bca60fcfd1 + url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586 + video_player_avfoundation: 2b4384f3b157206b5e150a0083cdc0c905d260d3 video_thumbnail: c4e2a3c539e247d4de13cd545344fd2d26ffafd1 volume_controller: 531ddf792994285c9b17f9d8a7e4dcdd29b3eae9 wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47 diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index bb053d999..72c5ef5cf 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -174,6 +174,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, ABF2FD2FD606DC6DD54BD9AB /* [CP] Embed Pods Frameworks */, + F5BF2E85B889CF8483C26F35 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -292,6 +293,7 @@ "${BUILT_PRODUCTS_DIR}/Toast/Toast.framework", "${BUILT_PRODUCTS_DIR}/background_fetch/background_fetch.framework", "${BUILT_PRODUCTS_DIR}/battery_info/battery_info.framework", + "${BUILT_PRODUCTS_DIR}/bonsoir_darwin/bonsoir_darwin.framework", "${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework", "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework", "${BUILT_PRODUCTS_DIR}/file_saver/file_saver.framework", @@ -310,6 +312,7 @@ "${BUILT_PRODUCTS_DIR}/integration_test/integration_test.framework", "${BUILT_PRODUCTS_DIR}/isar_flutter_libs/isar_flutter_libs.framework", "${BUILT_PRODUCTS_DIR}/libwebp/libwebp.framework", + "${BUILT_PRODUCTS_DIR}/local_auth_darwin/local_auth_darwin.framework", "${BUILT_PRODUCTS_DIR}/local_auth_ios/local_auth_ios.framework", "${BUILT_PRODUCTS_DIR}/media_extension/media_extension.framework", "${BUILT_PRODUCTS_DIR}/media_kit_libs_ios_video/media_kit_libs_ios_video.framework", @@ -374,6 +377,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/background_fetch.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/battery_info.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bonsoir_darwin.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_saver.framework", @@ -392,6 +396,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/integration_test.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/isar_flutter_libs.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libwebp.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth_darwin.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth_ios.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/media_extension.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/media_kit_libs_ios_video.framework", @@ -464,6 +469,24 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + F5BF2E85B889CF8483C26F35 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/permission_handler_apple/permission_handler_apple_privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/permission_handler_apple_privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/mobile/lib/core/configuration.dart b/mobile/lib/core/configuration.dart index cd6b5156e..cde766b1e 100644 --- a/mobile/lib/core/configuration.dart +++ b/mobile/lib/core/configuration.dart @@ -16,6 +16,7 @@ import 'package:photos/db/files_db.dart'; import 'package:photos/db/memories_db.dart'; import 'package:photos/db/trash_db.dart'; import 'package:photos/db/upload_locks_db.dart'; +import "package:photos/events/endpoint_updated_event.dart"; import 'package:photos/events/signed_in_event.dart'; import 'package:photos/events/user_logged_out_event.dart'; import 'package:photos/models/key_attributes.dart'; @@ -69,6 +70,7 @@ class Configuration { static const hasSelectedAllFoldersForBackupKey = "has_selected_all_folders_for_backup"; static const anonymousUserIDKey = "anonymous_user_id"; + static const endPointKey = "endpoint"; final kTempFolderDeletionTimeBuffer = const Duration(hours: 6).inMicroseconds; @@ -390,7 +392,12 @@ class Configuration { } String getHttpEndpoint() { - return endpoint; + return _preferences.getString(endPointKey) ?? endpoint; + } + + Future setHttpEndpoint(String endpoint) async { + await _preferences.setString(endPointKey, endpoint); + Bus.instance.fire(EndpointUpdatedEvent()); } String? getToken() { diff --git a/mobile/lib/core/errors.dart b/mobile/lib/core/errors.dart index a7d616b92..d39f6f027 100644 --- a/mobile/lib/core/errors.dart +++ b/mobile/lib/core/errors.dart @@ -79,3 +79,5 @@ class LoginKeyDerivationError extends Error {} class SrpSetupNotCompleteError extends Error {} class SharingNotPermittedForFreeAccountsError extends Error {} + +class NoMediaLocationAccessError extends Error {} diff --git a/mobile/lib/core/network/ente_interceptor.dart b/mobile/lib/core/network/ente_interceptor.dart index 5eb8d16d5..676fe94cb 100644 --- a/mobile/lib/core/network/ente_interceptor.dart +++ b/mobile/lib/core/network/ente_interceptor.dart @@ -1,14 +1,12 @@ import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:photos/core/configuration.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:uuid/uuid.dart'; class EnteRequestInterceptor extends Interceptor { - final SharedPreferences _preferences; final String enteEndpoint; - EnteRequestInterceptor(this._preferences, this.enteEndpoint); + EnteRequestInterceptor(this.enteEndpoint); @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { @@ -20,7 +18,7 @@ class EnteRequestInterceptor extends Interceptor { } // ignore: prefer_const_constructors options.headers.putIfAbsent("x-request-id", () => Uuid().v4().toString()); - final String? tokenValue = _preferences.getString(Configuration.tokenKey); + final String? tokenValue = Configuration.instance.getToken(); if (tokenValue != null) { options.headers.putIfAbsent("X-Auth-Token", () => tokenValue); } diff --git a/mobile/lib/core/network/network.dart b/mobile/lib/core/network/network.dart index b3930ddaf..076fb2584 100644 --- a/mobile/lib/core/network/network.dart +++ b/mobile/lib/core/network/network.dart @@ -3,26 +3,21 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:fk_user_agent/fk_user_agent.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:photos/core/constants.dart'; +import "package:photos/core/configuration.dart"; +import "package:photos/core/event_bus.dart"; import 'package:photos/core/network/ente_interceptor.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import "package:photos/events/endpoint_updated_event.dart"; int kConnectTimeout = 15000; class NetworkClient { - // apiEndpoint points to the Ente server's API endpoint - static const apiEndpoint = String.fromEnvironment( - "endpoint", - defaultValue: kDefaultProductionEndpoint, - ); - late Dio _dio; late Dio _enteDio; Future init() async { await FkUserAgent.init(); final packageInfo = await PackageInfo.fromPlatform(); - final preferences = await SharedPreferences.getInstance(); + final endpoint = Configuration.instance.getHttpEndpoint(); _dio = Dio( BaseOptions( connectTimeout: kConnectTimeout, @@ -35,7 +30,7 @@ class NetworkClient { ); _enteDio = Dio( BaseOptions( - baseUrl: apiEndpoint, + baseUrl: endpoint, connectTimeout: kConnectTimeout, headers: { HttpHeaders.userAgentHeader: FkUserAgent.userAgent, @@ -44,7 +39,18 @@ class NetworkClient { }, ), ); - _enteDio.interceptors.add(EnteRequestInterceptor(preferences, apiEndpoint)); + _setupInterceptors(endpoint); + + Bus.instance.on().listen((event) { + final endpoint = Configuration.instance.getHttpEndpoint(); + _enteDio.options.baseUrl = endpoint; + _setupInterceptors(endpoint); + }); + } + + void _setupInterceptors(String endpoint) { + _enteDio.interceptors.clear(); + _enteDio.interceptors.add(EnteRequestInterceptor(endpoint)); } NetworkClient._privateConstructor(); diff --git a/mobile/lib/db/file_updation_db.dart b/mobile/lib/db/file_updation_db.dart index 6496b71ed..426cc7a52 100644 --- a/mobile/lib/db/file_updation_db.dart +++ b/mobile/lib/db/file_updation_db.dart @@ -15,6 +15,7 @@ class FileUpdationDB { static const columnLocalID = 'local_id'; static const columnReason = 'reason'; static const livePhotoCheck = 'livePhotoCheck'; + static const androidMissingGPS = 'androidMissingGPS'; static const modificationTimeUpdated = 'modificationTimeUpdated'; diff --git a/mobile/lib/db/files_db.dart b/mobile/lib/db/files_db.dart index 39ff83210..202faaaad 100644 --- a/mobile/lib/db/files_db.dart +++ b/mobile/lib/db/files_db.dart @@ -1,5 +1,6 @@ import "dart:io"; +import "package:computer/computer.dart"; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; import 'package:path/path.dart'; @@ -16,6 +17,7 @@ import 'package:photos/utils/file_uploader_util.dart'; import 'package:sqflite/sqflite.dart'; import 'package:sqflite_migration/sqflite_migration.dart'; import 'package:sqlite3/sqlite3.dart' as sqlite3; +import 'package:sqlite_async/sqlite_async.dart' as sqlite_async; class FilesDB { /* @@ -102,6 +104,7 @@ class FilesDB { // only have a single app-wide reference to the database static Future? _dbFuture; static Future? _ffiDBFuture; + static Future? _sqliteAsyncDBFuture; Future get database async { // lazily instantiate the db the first time it is accessed @@ -114,6 +117,11 @@ class FilesDB { return _ffiDBFuture!; } + Future get sqliteAsyncDB async { + _sqliteAsyncDBFuture ??= _initSqliteAsyncDatabase(); + return _sqliteAsyncDBFuture!; + } + // this opens the database (and creates it if it doesn't exist) Future _initDatabase() async { final Directory documentsDirectory = @@ -131,6 +139,14 @@ class FilesDB { return sqlite3.sqlite3.open(path); } + Future _initSqliteAsyncDatabase() async { + final Directory documentsDirectory = + await getApplicationDocumentsDirectory(); + final String path = join(documentsDirectory.path, _databaseName); + _logger.info("DB path " + path); + return sqlite_async.SqliteDatabase(path: path); + } + // SQL code to create the database table static List createTable(String tableName) { return [ @@ -557,31 +573,34 @@ class FilesDB { bool applyOwnerCheck = false, }) async { final stopWatch = EnteWatch('getAllPendingOrUploadedFiles')..start(); - late String whereQuery; - late List? whereArgs; + final order = (asc ?? false ? 'ASC' : 'DESC'); + + late String query; + late List? args; if (applyOwnerCheck) { - whereQuery = '$columnCreationTime >= ? AND $columnCreationTime <= ? ' + query = + 'SELECT * FROM $filesTable WHERE $columnCreationTime >= ? AND $columnCreationTime <= ? ' 'AND ($columnOwnerID IS NULL OR $columnOwnerID = ?) ' 'AND ($columnCollectionID IS NOT NULL AND $columnCollectionID IS NOT -1)' - ' AND $columnMMdVisibility = ?'; - whereArgs = [startTime, endTime, ownerID, visibility]; + ' AND $columnMMdVisibility = ? ORDER BY $columnCreationTime $order, $columnModificationTime $order'; + + args = [startTime, endTime, ownerID, visibility]; } else { - whereQuery = - '$columnCreationTime >= ? AND $columnCreationTime <= ? AND ($columnCollectionID IS NOT NULL AND $columnCollectionID IS NOT -1)' - ' AND $columnMMdVisibility = ?'; - whereArgs = [startTime, endTime, visibility]; + query = + 'SELECT * FROM $filesTable WHERE $columnCreationTime >= ? AND $columnCreationTime <= ? ' + 'AND ($columnCollectionID IS NOT NULL AND $columnCollectionID IS NOT -1)' + ' AND $columnMMdVisibility = ? ORDER BY $columnCreationTime $order, $columnModificationTime $order'; + args = [startTime, endTime, visibility]; } - final db = await instance.database; - final order = (asc ?? false ? 'ASC' : 'DESC'); - final results = await db.query( - filesTable, - where: whereQuery, - whereArgs: whereArgs, - orderBy: - '$columnCreationTime ' + order + ', $columnModificationTime ' + order, - limit: limit, - ); + if (limit != null) { + query += ' LIMIT ?'; + args.add(limit); + } + + final db = await instance.sqliteAsyncDB; + final results = await db.getAll(query, args); + _logger.info("message"); stopWatch.log('queryDone'); final files = convertToFiles(results); stopWatch.log('convertDone'); @@ -593,23 +612,25 @@ class FilesDB { Future getAllLocalAndUploadedFiles( int startTime, - int endTime, - int ownerID, { + int endTime, { int? limit, bool? asc, required DBFilterOptions filterOptions, }) async { - final db = await instance.database; + final db = await instance.sqliteAsyncDB; final order = (asc ?? false ? 'ASC' : 'DESC'); - final results = await db.query( - filesTable, - where: - '$columnCreationTime >= ? AND $columnCreationTime <= ? AND ($columnMMdVisibility IS NULL OR $columnMMdVisibility = ?)' - ' AND ($columnLocalID IS NOT NULL OR ($columnCollectionID IS NOT NULL AND $columnCollectionID IS NOT -1))', - whereArgs: [startTime, endTime, visibleVisibility], - orderBy: - '$columnCreationTime ' + order + ', $columnModificationTime ' + order, - limit: limit, + final args = [startTime, endTime, visibleVisibility]; + String query = + 'SELECT * FROM $filesTable WHERE $columnCreationTime >= ? AND $columnCreationTime <= ? AND ($columnMMdVisibility IS NULL OR $columnMMdVisibility = ?)' + ' AND ($columnLocalID IS NOT NULL OR ($columnCollectionID IS NOT NULL AND $columnCollectionID IS NOT -1))' + ' ORDER BY $columnCreationTime $order, $columnModificationTime $order'; + if (limit != null) { + query += ' LIMIT ?'; + args.add(limit); + } + final results = await db.getAll( + query, + args, ); final files = convertToFiles(results); final List filteredFiles = @@ -642,19 +663,18 @@ class FilesDB { bool? asc, int visibility = visibleVisibility, }) async { - final db = await instance.database; + final db = await instance.sqliteAsyncDB; final order = (asc ?? false ? 'ASC' : 'DESC'); - const String whereClause = - '$columnCollectionID = ? AND $columnCreationTime >= ? AND $columnCreationTime <= ?'; - final List whereArgs = [collectionID, startTime, endTime]; - - final results = await db.query( - filesTable, - where: whereClause, - whereArgs: whereArgs, - orderBy: - '$columnCreationTime ' + order + ', $columnModificationTime ' + order, - limit: limit, + String query = + 'SELECT * FROM $filesTable WHERE $columnCollectionID = ? AND $columnCreationTime >= ? AND $columnCreationTime <= ? ORDER BY $columnCreationTime $order, $columnModificationTime $order'; + final List args = [collectionID, startTime, endTime]; + if (limit != null) { + query += ' LIMIT ?'; + args.add(limit); + } + final results = await db.getAll( + query, + args, ); final files = convertToFiles(results); return FileLoadResult(files, files.length == limit); @@ -1450,6 +1470,14 @@ class FilesDB { return collectionIDsOfFile; } + List convertToFilesForIsolate(Map args) { + final List files = []; + for (final result in args["result"]) { + files.add(_getFileFromRow(result)); + } + return files; + } + List convertToFiles(List> results) { final List files = []; for (final result in results) { @@ -1533,6 +1561,24 @@ class FilesDB { return result; } + Future> getLocalFilesBackedUpWithoutLocation(int userId) async { + final db = await instance.database; + final rows = await db.query( + filesTable, + columns: [columnLocalID], + distinct: true, + where: + '$columnOwnerID = ? AND $columnLocalID IS NOT NULL AND ($columnUploadedFileID IS NOT NULL AND $columnUploadedFileID IS NOT -1) ' + 'AND ($columnLatitude IS NULL OR $columnLongitude IS NULL OR $columnLongitude = 0.0 or $columnLongitude = 0.0)', + whereArgs: [userId], + ); + final result = []; + for (final row in rows) { + result.add(row[columnLocalID] as String); + } + return result; + } + // updateSizeForUploadIDs takes a map of upploadedFileID and fileSize and // update the fileSize for the given uploadedFileID Future updateSizeForUploadIDs( @@ -1558,10 +1604,13 @@ class FilesDB { Set collectionsToIgnore, { bool dedupeByUploadId = true, }) async { - final db = await instance.database; - final List> result = - await db.query(filesTable, orderBy: '$columnCreationTime DESC'); - final List files = convertToFiles(result); + final db = await instance.sqliteAsyncDB; + final result = await db.getAll( + 'SELECT * FROM $filesTable ORDER BY $columnCreationTime DESC', + ); + final List files = await Computer.shared() + .compute(convertToFilesForIsolate, param: {"result": result}); + final List deduplicatedFiles = await applyDBFilters( files, DBFilterOptions( diff --git a/mobile/lib/events/endpoint_updated_event.dart b/mobile/lib/events/endpoint_updated_event.dart new file mode 100644 index 000000000..33b18f68e --- /dev/null +++ b/mobile/lib/events/endpoint_updated_event.dart @@ -0,0 +1,3 @@ +import "package:photos/events/event.dart"; + +class EndpointUpdatedEvent extends Event {} diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 5035838f4..86ecd6893 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -35,6 +35,8 @@ class MessageLookup extends MessageLookupByLibrary { "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Change location of selected items?"), "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted."), "descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 39fdb3b96..9005de2dc 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -503,6 +503,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Konto erstellen"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Drücke lange um Fotos auszuwählen und klicke + um ein Album zu erstellen"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createCollage": MessageLookupByLibrary.simpleMessage("Collage erstellen"), "createNewAccount": diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index b208717fa..59180d26c 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -62,6 +62,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m13(provider) => "Please contact us at support@ente.io to manage your ${provider} subscription."; + static String m69(endpoint) => "Connected to ${endpoint}"; + static String m14(count) => "${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}"; @@ -83,7 +85,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m20(newEmail) => "Email changed to ${newEmail}"; static String m21(email) => - "${email} does not have an ente account.\n\nSend them an invite to share photos."; + "${email} does not have an Ente account.\n\nSend them an invite to share photos."; static String m22(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; @@ -100,7 +102,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m26(endDate) => "Free trial valid till ${endDate}"; static String m27(count) => - "You can still access ${Intl.plural(count, one: 'it', other: 'them')} on ente as long as you have an active subscription"; + "You can still access ${Intl.plural(count, one: 'it', other: 'them')} on Ente as long as you have an active subscription"; static String m28(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; @@ -161,7 +163,7 @@ class MessageLookup extends MessageLookupByLibrary { "Hey, can you confirm that this is your ente.io verification ID: ${verificationID}"; static String m50(referralCode, referralStorageInGB) => - "ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; + "Ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; static String m51(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Share with specific people', one: 'Shared with 1 person', other: 'Shared with ${numberOfPeople} people')}"; @@ -172,9 +174,9 @@ class MessageLookup extends MessageLookupByLibrary { "This ${fileType} will be deleted from your device."; static String m54(fileType) => - "This ${fileType} is in both ente and your device."; + "This ${fileType} is in both Ente and your device."; - static String m55(fileType) => "This ${fileType} will be deleted from ente."; + static String m55(fileType) => "This ${fileType} will be deleted from Ente."; static String m56(storageAmountInGB) => "${storageAmountInGB} GB"; @@ -183,7 +185,7 @@ class MessageLookup extends MessageLookupByLibrary { "${usedAmount} ${usedStorageUnit} of ${totalAmount} ${totalStorageUnit} used"; static String m58(id) => - "Your ${id} is already linked to another ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; + "Your ${id} is already linked to another Ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; static String m59(endDate) => "Your subscription will be cancelled on ${endDate}"; @@ -214,7 +216,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( - "A new version of ente is available."), + "A new version of Ente is available."), "about": MessageLookupByLibrary.simpleMessage("About"), "account": MessageLookupByLibrary.simpleMessage("Account"), "accountWelcomeBack": @@ -241,7 +243,7 @@ class MessageLookup extends MessageLookupByLibrary { "addPhotos": MessageLookupByLibrary.simpleMessage("Add photos"), "addSelected": MessageLookupByLibrary.simpleMessage("Add selected"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Add to album"), - "addToEnte": MessageLookupByLibrary.simpleMessage("Add to ente"), + "addToEnte": MessageLookupByLibrary.simpleMessage("Add to Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Add to hidden album"), "addViewer": MessageLookupByLibrary.simpleMessage("Add viewer"), @@ -428,7 +430,7 @@ class MessageLookup extends MessageLookupByLibrary { "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Code used by you"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "Create a link to allow people to add and view photos in your shared album without needing an ente app or account. Great for collecting event photos."), + "Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Collaborative link"), "collaborativeLinkCreatedFor": m11, @@ -488,6 +490,8 @@ class MessageLookup extends MessageLookupByLibrary { "createAccount": MessageLookupByLibrary.simpleMessage("Create account"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Long press to select photos and click + to create an album"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createCollage": MessageLookupByLibrary.simpleMessage("Create collage"), "createNewAccount": MessageLookupByLibrary.simpleMessage("Create new account"), @@ -502,6 +506,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Current usage is "), "custom": MessageLookupByLibrary.simpleMessage("Custom"), + "customEndpoint": m69, "darkTheme": MessageLookupByLibrary.simpleMessage("Dark"), "dayToday": MessageLookupByLibrary.simpleMessage("Today"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Yesterday"), @@ -523,7 +528,7 @@ class MessageLookup extends MessageLookupByLibrary { "This will delete all empty albums. This is useful when you want to reduce the clutter in your album list."), "deleteAll": MessageLookupByLibrary.simpleMessage("Delete All"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "This account is linked to other ente apps, if you use any. Your uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted."), + "This account is linked to other Ente apps, if you use any. Your uploaded data, across all Ente apps, will be scheduled for deletion, and your account will be permanently deleted."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "Please send an email to account-deletion@ente.io from your registered email address."), "deleteEmptyAlbums": @@ -535,7 +540,7 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Delete from device"), "deleteFromEnte": - MessageLookupByLibrary.simpleMessage("Delete from ente"), + MessageLookupByLibrary.simpleMessage("Delete from Ente"), "deleteItemCount": m14, "deleteLocation": MessageLookupByLibrary.simpleMessage("Delete location"), @@ -561,13 +566,17 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Designed to outlive"), "details": MessageLookupByLibrary.simpleMessage("Details"), "devAccountChanged": MessageLookupByLibrary.simpleMessage( - "The developer account we use to publish ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable."), + "The developer account we use to publish Ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable."), + "developerSettings": + MessageLookupByLibrary.simpleMessage("Developer settings"), + "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( + "Are you sure that you want to modify Developer settings?"), "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Enter the code"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( - "Files added to this device album will automatically get uploaded to ente."), + "Files added to this device album will automatically get uploaded to Ente."), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "Disable the device screen lock when ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster."), + "Disable the device screen lock when Ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster."), "deviceNotFound": MessageLookupByLibrary.simpleMessage("Device not found"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Did you know?"), @@ -627,15 +636,17 @@ class MessageLookup extends MessageLookupByLibrary { "encryption": MessageLookupByLibrary.simpleMessage("Encryption"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("Encryption keys"), + "endpointUpdatedMessage": MessageLookupByLibrary.simpleMessage( + "Endpoint updated successfully"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( "End-to-end encrypted by default"), "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": MessageLookupByLibrary.simpleMessage( - "ente can encrypt and preserve files only if you grant access to them"), + "Ente can encrypt and preserve files only if you grant access to them"), "entePhotosPerm": MessageLookupByLibrary.simpleMessage( - "ente needs permission to preserve your photos"), + "Ente needs permission to preserve your photos"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "ente preserves your memories, so they\'re always available to you, even if you lose your device."), + "Ente preserves your memories, so they\'re always available to you, even if you lose your device."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Your family can be added to your plan as well."), "enterAlbumName": @@ -691,7 +702,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( "Failed to verify payment status"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( - "Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other\'s files unless they\'re shared.\n\nFamily plans are available to customers who have a paid ente subscription.\n\nSubscribe now to get started!"), + "Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other\'s files unless they\'re shared.\n\nFamily plans are available to customers who have a paid Ente subscription.\n\nSubscribe now to get started!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Family"), "familyPlans": MessageLookupByLibrary.simpleMessage("Family plans"), "faq": MessageLookupByLibrary.simpleMessage("FAQ"), @@ -763,7 +774,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignore"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "Some files in this album are ignored from upload because they had previously been deleted from ente."), + "Some files in this album are ignored from upload because they had previously been deleted from Ente."), "importing": MessageLookupByLibrary.simpleMessage("Importing...."), "incorrectCode": MessageLookupByLibrary.simpleMessage("Incorrect code"), "incorrectPasswordTitle": @@ -781,15 +792,19 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Install manually"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Invalid email address"), + "invalidEndpoint": + MessageLookupByLibrary.simpleMessage("Invalid endpoint"), + "invalidEndpointMessage": MessageLookupByLibrary.simpleMessage( + "Sorry, the endpoint you entered is invalid. Please enter a valid endpoint and try again."), "invalidKey": MessageLookupByLibrary.simpleMessage("Invalid key"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "The recovery key you entered is not valid. Please make sure it contains 24 words, and check the spelling of each.\n\nIf you entered an older recovery code, make sure it is 64 characters long, and check each of them."), "invite": MessageLookupByLibrary.simpleMessage("Invite"), - "inviteToEnte": MessageLookupByLibrary.simpleMessage("Invite to ente"), + "inviteToEnte": MessageLookupByLibrary.simpleMessage("Invite to Ente"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("Invite your friends"), "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("Invite your friends to ente"), + MessageLookupByLibrary.simpleMessage("Invite your friends to Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), @@ -916,7 +931,7 @@ class MessageLookup extends MessageLookupByLibrary { "Unable to connect to Ente, please check your network settings and contact support if the error persists."), "never": MessageLookupByLibrary.simpleMessage("Never"), "newAlbum": MessageLookupByLibrary.simpleMessage("New album"), - "newToEnte": MessageLookupByLibrary.simpleMessage("New to ente"), + "newToEnte": MessageLookupByLibrary.simpleMessage("New to Ente"), "newest": MessageLookupByLibrary.simpleMessage("Newest"), "no": MessageLookupByLibrary.simpleMessage("No"), "noAlbumsSharedByYouYet": @@ -1207,7 +1222,7 @@ class MessageLookup extends MessageLookupByLibrary { "selectYourPlan": MessageLookupByLibrary.simpleMessage("Select your plan"), "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Selected files are not on ente"), + "Selected files are not on Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( "Selected folders will be encrypted and backed up"), @@ -1220,6 +1235,8 @@ class MessageLookup extends MessageLookupByLibrary { "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invite"), "sendLink": MessageLookupByLibrary.simpleMessage("Send link"), + "serverEndpoint": + MessageLookupByLibrary.simpleMessage("Server endpoint"), "sessionExpired": MessageLookupByLibrary.simpleMessage("Session expired"), "setAPassword": MessageLookupByLibrary.simpleMessage("Set a password"), @@ -1242,15 +1259,15 @@ class MessageLookup extends MessageLookupByLibrary { "Share only with the people you want"), "shareTextConfirmOthersVerificationID": m49, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "Download ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), + "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), "shareTextReferralCode": m50, "shareWithNonenteUsers": - MessageLookupByLibrary.simpleMessage("Share with non-ente users"), + MessageLookupByLibrary.simpleMessage("Share with non-Ente users"), "shareWithPeopleSectionTitle": m51, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Share your first album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( - "Create shared and collaborative albums with other ente users, including users on free plans."), + "Create shared and collaborative albums with other Ente users, including users on free plans."), "sharedByMe": MessageLookupByLibrary.simpleMessage("Shared by me"), "sharedByYou": MessageLookupByLibrary.simpleMessage("Shared by you"), "sharedPhotoNotifications": @@ -1280,7 +1297,7 @@ class MessageLookup extends MessageLookupByLibrary { "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( - "Some items are in both ente and your device."), + "Some items are in both Ente and your device."), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage( "Some of the files you are trying to delete are only available on your device and cannot be recovered if deleted"), @@ -1397,7 +1414,7 @@ class MessageLookup extends MessageLookupByLibrary { "trashDaysLeft": m63, "tryAgain": MessageLookupByLibrary.simpleMessage("Try again"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( - "Turn on backup to automatically upload files added to this device folder to ente."), + "Turn on backup to automatically upload files added to this device folder to Ente."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 months free on yearly plans"), @@ -1440,7 +1457,7 @@ class MessageLookup extends MessageLookupByLibrary { "Usable storage is limited by your current plan. Excess claimed storage will automatically become usable when you upgrade your plan."), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Use public links for people not on ente"), + "Use public links for people not on Ente"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Use recovery key"), "useSelectedPhoto": diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 8ceb97ad3..5bba2d9a0 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -426,6 +426,8 @@ class MessageLookup extends MessageLookupByLibrary { "createAccount": MessageLookupByLibrary.simpleMessage("Crear cuenta"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Mantenga presionado para seleccionar fotos y haga clic en + para crear un álbum"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createNewAccount": MessageLookupByLibrary.simpleMessage("Crear nueva cuenta"), "createOrSelectAlbum": diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 035d6c232..5f21ec77b 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -494,6 +494,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Créer un compte"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Appuyez longuement pour sélectionner des photos et cliquez sur + pour créer un album"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createCollage": MessageLookupByLibrary.simpleMessage("Créez un collage"), "createNewAccount": diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index c3cbb0b74..c20931418 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -478,6 +478,8 @@ class MessageLookup extends MessageLookupByLibrary { "createAccount": MessageLookupByLibrary.simpleMessage("Crea account"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Premi a lungo per selezionare le foto e fai clic su + per creare un album"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createCollage": MessageLookupByLibrary.simpleMessage("Crea un collage"), "createNewAccount": diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 83d8495a0..15b4acf26 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -35,6 +35,8 @@ class MessageLookup extends MessageLookupByLibrary { "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Change location of selected items?"), "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted."), "descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index fe49550d6..a86943e50 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -500,6 +500,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Account aanmaken"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Lang indrukken om foto\'s te selecteren en klik + om een album te maken"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createCollage": MessageLookupByLibrary.simpleMessage("Creëer collage"), "createNewAccount": MessageLookupByLibrary.simpleMessage("Nieuw account aanmaken"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 05477cfeb..294292a3d 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -44,6 +44,8 @@ class MessageLookup extends MessageLookupByLibrary { "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( "Ja, jeg ønsker å slette denne kontoen og all dataen dens permanent."), "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "deleteAccount": MessageLookupByLibrary.simpleMessage("Slett konto"), "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( "Vi er lei oss for at du forlater oss. Gi oss gjerne en tilbakemelding så vi kan forbedre oss."), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index af6ba4353..fea153d71 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -63,6 +63,8 @@ class MessageLookup extends MessageLookupByLibrary { "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "continueLabel": MessageLookupByLibrary.simpleMessage("Kontynuuj"), "createAccount": MessageLookupByLibrary.simpleMessage("Stwórz konto"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createNewAccount": MessageLookupByLibrary.simpleMessage("Stwórz nowe konto"), "decrypting": diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index dd169df42..3168451df 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -63,6 +63,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m13(provider) => "Entre em contato conosco pelo e-mail support@ente.io para gerenciar sua assinatura ${provider}."; + static String m69(endpoint) => "Conectado a ${endpoint}"; + static String m14(count) => "${Intl.plural(count, one: 'Excluir ${count} item', other: 'Excluir ${count} itens')}"; @@ -84,7 +86,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m20(newEmail) => "E-mail alterado para ${newEmail}"; static String m21(email) => - "${email} Não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos."; + "${email} não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos."; static String m22(count, formattedNumber) => "${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste dispositivo teve um backup seguro"; @@ -101,7 +103,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m26(endDate) => "Teste gratuito acaba em ${endDate}"; static String m27(count) => - "Você ainda pode acessar ${Intl.plural(count, one: 'ele', other: 'eles')} no ente contanto que você tenha uma assinatura ativa"; + "Você ainda pode acessar ${Intl.plural(count, one: 'ele', other: 'eles')} no Ente contanto que você tenha uma assinatura ativa"; static String m28(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; @@ -173,9 +175,9 @@ class MessageLookup extends MessageLookupByLibrary { "Este ${fileType} será excluído do seu dispositivo."; static String m54(fileType) => - "Este ${fileType} está em ente e no seu dispositivo."; + "Este ${fileType} está tanto no Ente quanto no seu dispositivo."; - static String m55(fileType) => "Este ${fileType} será excluído do ente."; + static String m55(fileType) => "Este ${fileType} será excluído do Ente."; static String m56(storageAmountInGB) => "${storageAmountInGB} GB"; @@ -184,7 +186,7 @@ class MessageLookup extends MessageLookupByLibrary { "${usedAmount} ${usedStorageUnit} de ${totalAmount} ${totalStorageUnit} usado"; static String m58(id) => - "Seu ${id} já está vinculado a outra conta ente.\nSe você gostaria de usar seu ${id} com esta conta, por favor contate nosso suporte\'\'"; + "Seu ${id} já está vinculado a outra conta Ente.\nSe você gostaria de usar seu ${id} com esta conta, por favor contate nosso suporte\'\'"; static String m59(endDate) => "Sua assinatura será cancelada em ${endDate}"; @@ -214,7 +216,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( - "Uma nova versão do ente está disponível."), + "Uma nova versão do Ente está disponível."), "about": MessageLookupByLibrary.simpleMessage("Sobre"), "account": MessageLookupByLibrary.simpleMessage("Conta"), "accountWelcomeBack": @@ -244,7 +246,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Adicionar selecionado"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Adicionar ao álbum"), - "addToEnte": MessageLookupByLibrary.simpleMessage("Adicionar ao ente"), + "addToEnte": MessageLookupByLibrary.simpleMessage("Adicionar ao Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Adicionar a álbum oculto"), "addViewer": @@ -438,7 +440,7 @@ class MessageLookup extends MessageLookupByLibrary { "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Código usado por você"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "Crie um link para permitir pessoas adicionar e ver fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos."), + "Crie um link para permitir que as pessoas adicionem e vejam fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link Colaborativo"), "collaborativeLinkCreatedFor": m11, @@ -499,6 +501,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Criar uma conta"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Pressione e segure para selecionar fotos e clique em + para criar um álbum"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Criar link colaborativo"), "createCollage": MessageLookupByLibrary.simpleMessage("Criar colagem"), "createNewAccount": MessageLookupByLibrary.simpleMessage("Criar nova conta"), @@ -512,6 +516,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("O uso atual é "), "custom": MessageLookupByLibrary.simpleMessage("Personalizado"), + "customEndpoint": m69, "darkTheme": MessageLookupByLibrary.simpleMessage("Escuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Hoje"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ontem"), @@ -521,7 +526,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Descriptografando vídeo..."), "deduplicateFiles": MessageLookupByLibrary.simpleMessage("Arquivos duplicados"), - "delete": MessageLookupByLibrary.simpleMessage("Apagar"), + "delete": MessageLookupByLibrary.simpleMessage("Excluir"), "deleteAccount": MessageLookupByLibrary.simpleMessage("Excluir conta"), "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( "Lamentamos ver você partir. Por favor, compartilhe seus comentários para nos ajudar a melhorar."), @@ -534,7 +539,7 @@ class MessageLookup extends MessageLookupByLibrary { "Isto irá apagar todos os álbuns vazios. Isso é útil quando você deseja reduzir a bagunça na sua lista de álbuns."), "deleteAll": MessageLookupByLibrary.simpleMessage("Excluir Tudo"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "Esta conta está vinculada a outros aplicativos ente, se você usar algum. Seus dados enviados, em todos os aplicativos ente, serão agendados para exclusão, e sua conta será excluída permanentemente."), + "Esta conta está vinculada a outros aplicativos Ente, se você usar algum. Seus dados enviados, em todos os aplicativos Ente, serão agendados para exclusão, e sua conta será excluída permanentemente."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "Por favor, envie um e-mail para account-deletion@ente.io a partir do seu endereço de e-mail registrado."), "deleteEmptyAlbums": @@ -571,13 +576,17 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Feito para ter logenvidade"), "details": MessageLookupByLibrary.simpleMessage("Detalhes"), "devAccountChanged": MessageLookupByLibrary.simpleMessage( - "A conta de desenvolvedor que usamos para publicar o ente na App Store foi alterada. Por esse motivo, você precisará fazer login novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável."), + "A conta de desenvolvedor que usamos para publicar o Ente na App Store foi alterada. Por esse motivo, você precisará fazer entrar novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável."), + "developerSettings": MessageLookupByLibrary.simpleMessage( + "Configurações de desenvolvedor"), + "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( + "Tem certeza de que deseja modificar as configurações de Desenvolvedor?"), "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Insira o código"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( - "Arquivos adicionados a este álbum do dispositivo serão automaticamente enviados para o ente."), + "Arquivos adicionados a este álbum do dispositivo serão automaticamente enviados para o Ente."), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "Desative o bloqueio de tela do dispositivo quando o ente estiver em primeiro plano e houver um backup em andamento. Isso normalmente não é necessário, mas pode ajudar grandes uploads e importações iniciais de grandes bibliotecas a serem concluídos mais rapidamente."), + "Desative o bloqueio de tela do dispositivo quando o Ente estiver em primeiro plano e houver um backup em andamento. Isso normalmente não é necessário, mas pode ajudar nos envios grandes e importações iniciais de grandes bibliotecas a serem concluídos mais rapidamente."), "deviceNotFound": MessageLookupByLibrary.simpleMessage("Dispositivo não encontrado"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Você sabia?"), @@ -634,21 +643,23 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Esvaziar a lixeira?"), "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( - "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo Open Street Map, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), + "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Criptografando backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Criptografia"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("Chaves de criptografia"), + "endpointUpdatedMessage": MessageLookupByLibrary.simpleMessage( + "Endpoint atualizado com sucesso"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( "Criptografia de ponta a ponta por padrão"), "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": MessageLookupByLibrary.simpleMessage( - "ente pode criptografar e preservar arquivos somente se você conceder acesso a eles"), + "Ente pode criptografar e preservar arquivos apenas se você conceder acesso a eles"), "entePhotosPerm": MessageLookupByLibrary.simpleMessage( "Ente precisa de permissão para preservar suas fotos"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "O ente preserva suas memórias, então eles estão sempre disponíveis para você, mesmo se você perder o seu dispositivo."), + "O Ente preserva suas memórias, então eles estão sempre disponíveis para você, mesmo se você perder o seu dispositivo."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Sua família também pode ser adicionada ao seu plano."), "enterAlbumName": @@ -706,7 +717,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( "Falha ao verificar status do pagamento"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( - "Adicione 5 membros da família ao seu plano existente sem pagar a mais.\n\nCada membro recebe seu próprio espaço privado, e nenhum membro pode ver os arquivos uns dos outros a menos que sejam compartilhados.\n\nPlanos de família estão disponíveis para os clientes que têm uma assinatura de ente paga.\n\nassine agora para começar!"), + "Adicione 5 membros da família ao seu plano existente sem pagar a mais.\n\nCada membro recebe seu próprio espaço privado, e nenhum membro pode ver os arquivos uns dos outros a menos que sejam compartilhados.\n\nPlanos de família estão disponíveis para os clientes que têm uma assinatura do Ente paga.\n\nAssine agora para começar!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Família"), "familyPlans": MessageLookupByLibrary.simpleMessage("Plano familiar"), @@ -766,6 +777,7 @@ class MessageLookup extends MessageLookupByLibrary { "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( "Como você ouviu sobre o Ente? (opcional)"), + "help": MessageLookupByLibrary.simpleMessage("Ajuda"), "hidden": MessageLookupByLibrary.simpleMessage("Oculto"), "hide": MessageLookupByLibrary.simpleMessage("Ocultar"), "hiding": MessageLookupByLibrary.simpleMessage("Ocultando..."), @@ -781,7 +793,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSOkButton": MessageLookupByLibrary.simpleMessage("Aceitar"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorar"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "Alguns arquivos neste álbum são ignorados do upload porque eles tinham sido anteriormente excluídos do ente."), + "Alguns arquivos neste álbum são ignorados do envio porque eles tinham sido anteriormente excluídos do Ente."), "importing": MessageLookupByLibrary.simpleMessage("Importando...."), "incorrectCode": MessageLookupByLibrary.simpleMessage("Código incorreto"), @@ -800,6 +812,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Instalar manualmente"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Endereço de e-mail invalido"), + "invalidEndpoint": + MessageLookupByLibrary.simpleMessage("Endpoint inválido"), + "invalidEndpointMessage": MessageLookupByLibrary.simpleMessage( + "Desculpe, o endpoint que você inseriu é inválido. Por favor, insira um endpoint válido e tente novamente."), "invalidKey": MessageLookupByLibrary.simpleMessage("Chave inválida"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "A chave de recuperação que você digitou não é válida. Certifique-se de que contém 24 palavras e verifique a ortografia de cada uma.\n\nSe você inseriu um código de recuperação mais antigo, verifique se ele tem 64 caracteres e verifique cada um deles."), @@ -809,7 +825,7 @@ class MessageLookup extends MessageLookupByLibrary { "inviteYourFriends": MessageLookupByLibrary.simpleMessage("Convide seus amigos"), "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("Convide seus amigos ao ente"), + MessageLookupByLibrary.simpleMessage("Convide seus amigos ao Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Parece que algo deu errado. Por favor, tente novamente mais tarde. Se o erro persistir, entre em contato com nossa equipe de suporte."), @@ -943,7 +959,7 @@ class MessageLookup extends MessageLookupByLibrary { "Não foi possível conectar-se ao Ente, verifique suas configurações de rede e entre em contato com o suporte se o erro persistir."), "never": MessageLookupByLibrary.simpleMessage("Nunca"), "newAlbum": MessageLookupByLibrary.simpleMessage("Novo álbum"), - "newToEnte": MessageLookupByLibrary.simpleMessage("Novo no ente"), + "newToEnte": MessageLookupByLibrary.simpleMessage("Novo no Ente"), "newest": MessageLookupByLibrary.simpleMessage("Mais recente"), "no": MessageLookupByLibrary.simpleMessage("Não"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( @@ -1011,6 +1027,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Detalhes de pagamento"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Falha no pagamento"), + "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( + "Infelizmente o seu pagamento falhou. Entre em contato com o suporte e nós ajudaremos você!"), "paymentFailedTalkToProvider": m37, "pendingItems": MessageLookupByLibrary.simpleMessage("Itens pendentes"), "pendingSync": @@ -1124,7 +1142,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Eles se inscreveram para um plano pago"), "referralStep3": m42, - "referrals": MessageLookupByLibrary.simpleMessage("Indicações"), + "referrals": MessageLookupByLibrary.simpleMessage("Referências"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referências estão atualmente pausadas"), "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( @@ -1247,7 +1265,7 @@ class MessageLookup extends MessageLookupByLibrary { "selectYourPlan": MessageLookupByLibrary.simpleMessage("Selecione seu plano"), "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Os arquivos selecionados não estão no ente"), + "Os arquivos selecionados não estão no Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( "As pastas selecionadas serão criptografadas e armazenadas em backup"), @@ -1260,6 +1278,8 @@ class MessageLookup extends MessageLookupByLibrary { "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar e-mail"), "sendInvite": MessageLookupByLibrary.simpleMessage("Enviar convite"), "sendLink": MessageLookupByLibrary.simpleMessage("Enviar link"), + "serverEndpoint": + MessageLookupByLibrary.simpleMessage("Servidor endpoint"), "sessionExpired": MessageLookupByLibrary.simpleMessage("Sessão expirada"), "setAPassword": @@ -1284,7 +1304,7 @@ class MessageLookup extends MessageLookupByLibrary { "Compartilhar apenas com as pessoas que você quiser"), "shareTextConfirmOthersVerificationID": m49, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "Baixe o Ente para podermos compartilhar facilmente fotos e vídeos de alta qualidade\n\nhttps://ente.io"), + "Baixe o Ente para que possamos compartilhar facilmente fotos e vídeos de qualidade original\n\nhttps://ente.io"), "shareTextReferralCode": m50, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Compartilhar com usuários não-Ente"), @@ -1310,11 +1330,11 @@ class MessageLookup extends MessageLookupByLibrary { "showMemories": MessageLookupByLibrary.simpleMessage("Mostrar memórias"), "signOutFromOtherDevices": MessageLookupByLibrary.simpleMessage( - "Terminar sessão em outros dispositivos"), + "Encerrar sessão em outros dispositivos"), "signOutOtherBody": MessageLookupByLibrary.simpleMessage( "Se você acha que alguém pode saber sua senha, você pode forçar todos os outros dispositivos que estão com sua conta a desconectar."), "signOutOtherDevices": MessageLookupByLibrary.simpleMessage( - "Terminar sessão em outros dispositivos"), + "Encerrar sessão em outros dispositivos"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Eu concordo com os termos de serviço e a política de privacidade"), "singleFileDeleteFromDevice": m53, @@ -1326,7 +1346,7 @@ class MessageLookup extends MessageLookupByLibrary { "social": MessageLookupByLibrary.simpleMessage("Redes sociais"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( - "Alguns itens estão tanto no ente quanto no seu dispositivo."), + "Alguns itens estão tanto no Ente quanto no seu dispositivo."), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage( "Alguns dos arquivos que você está tentando excluir só estão disponíveis no seu dispositivo e não podem ser recuperados se forem excluídos"), @@ -1447,7 +1467,7 @@ class MessageLookup extends MessageLookupByLibrary { "trashDaysLeft": m63, "tryAgain": MessageLookupByLibrary.simpleMessage("Tente novamente"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( - "Ative o backup para enviar automaticamente arquivos adicionados a esta pasta do dispositivo para o ente."), + "Ative o backup para enviar automaticamente arquivos adicionados a esta pasta do dispositivo para o Ente."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 meses grátis em planos anuais"), @@ -1491,7 +1511,7 @@ class MessageLookup extends MessageLookupByLibrary { "Armazenamento utilizável é limitado pelo seu plano atual. O armazenamento reivindicado em excesso se tornará utilizável automaticamente quando você fizer a melhoria do seu plano."), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Usar links públicos para pessoas que não estão no ente"), + "Usar links públicos para pessoas que não estão no Ente"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Usar chave de recuperação"), "useSelectedPhoto": @@ -1552,7 +1572,7 @@ class MessageLookup extends MessageLookupByLibrary { "yesDiscardChanges": MessageLookupByLibrary.simpleMessage("Sim, descartar alterações"), "yesLogout": - MessageLookupByLibrary.simpleMessage("Sim, terminar sessão"), + MessageLookupByLibrary.simpleMessage("Sim, encerrar sessão"), "yesRemove": MessageLookupByLibrary.simpleMessage("Sim, excluir"), "yesRenew": MessageLookupByLibrary.simpleMessage("Sim, Renovar"), "you": MessageLookupByLibrary.simpleMessage("Você"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index c55f004a0..65e2af71f 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -60,13 +60,15 @@ class MessageLookup extends MessageLookupByLibrary { static String m13(provider) => "请通过support@ente.io 用英语联系我们来管理您的 ${provider} 订阅。"; + static String m69(endpoint) => "已连接至 ${endpoint}"; + static String m14(count) => "${Intl.plural(count, one: '删除 ${count} 个项目', other: '删除 ${count} 个项目')}"; static String m15(currentlyDeleting, totalCount) => "正在删除 ${currentlyDeleting} /共 ${totalCount}"; - static String m16(albumName) => "这将删除用于访问\"${albumName}\"的公共链接。"; + static String m16(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。"; static String m17(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}"; @@ -78,7 +80,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m20(newEmail) => "电子邮件已更改为 ${newEmail}"; - static String m21(email) => "${email} 没有 ente 账户。\n\n向他们发送分享照片的邀请。"; + static String m21(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。"; static String m22(count, formattedNumber) => "此设备上的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份"; @@ -95,7 +97,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m26(endDate) => "免费试用有效期至 ${endDate}"; static String m27(count) => - "只要您有有效的订阅,您仍然可以在 ente 上访问 ${Intl.plural(count, one: 'it', other: 'them')}"; + "只要您有有效的订阅,您仍然可以在 Ente 上访问 ${Intl.plural(count, one: '它', other: '它们')}"; static String m28(sizeInMBorGB) => "释放 ${sizeInMBorGB}"; @@ -150,7 +152,7 @@ class MessageLookup extends MessageLookupByLibrary { "嘿,你能确认这是你的 ente.io 验证 ID吗:${verificationID}"; static String m50(referralCode, referralStorageInGB) => - "ente推荐码: ${referralCode} \n\n注册付费计划后在设置 → 常规 → 推荐中应用它以免费获得 ${referralStorageInGB} GB空间\n\nhttps://ente.io"; + "Ente 推荐代码:${referralCode}\n\n在 \"设置\"→\"通用\"→\"推荐 \"中应用它,即可在注册付费计划后免费获得 ${referralStorageInGB} GB 存储空间\n\nhttps://ente.io"; static String m51(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: '与特定人员共享', one: '与 1 人共享', other: '与 ${numberOfPeople} 人共享')}"; @@ -159,9 +161,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m53(fileType) => "此 ${fileType} 将从您的设备中删除。"; - static String m54(fileType) => "此 ${fileType} 同时在ente和您的设备中。"; + static String m54(fileType) => "${fileType} 已同时存在于 Ente 和您的设备中。"; - static String m55(fileType) => "此 ${fileType} 将从ente中删除。"; + static String m55(fileType) => "${fileType} 将从 Ente 中删除。"; static String m56(storageAmountInGB) => "${storageAmountInGB} GB"; @@ -170,7 +172,7 @@ class MessageLookup extends MessageLookupByLibrary { "已使用 ${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit}"; static String m58(id) => - "您的 ${id} 已经链接到另一个ente账户。\n如果您想要通过此账户使用您的 ${id} ,请联系我们的客服\'\'"; + "您的 ${id} 已链接到另一个 Ente 账户。\n如果您想在此账户中使用您的 ${id} ,请联系我们的支持人员"; static String m59(endDate) => "您的订阅将于 ${endDate} 取消"; @@ -197,7 +199,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aNewVersionOfEnteIsAvailable": - MessageLookupByLibrary.simpleMessage("有新版本的 ente 可供使用。"), + MessageLookupByLibrary.simpleMessage("有新版本的 Ente 可供使用。"), "about": MessageLookupByLibrary.simpleMessage("关于"), "account": MessageLookupByLibrary.simpleMessage("账户"), "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("欢迎回来!"), @@ -219,7 +221,7 @@ class MessageLookup extends MessageLookupByLibrary { "addPhotos": MessageLookupByLibrary.simpleMessage("添加照片"), "addSelected": MessageLookupByLibrary.simpleMessage("添加所选项"), "addToAlbum": MessageLookupByLibrary.simpleMessage("添加到相册"), - "addToEnte": MessageLookupByLibrary.simpleMessage("添加到 ente"), + "addToEnte": MessageLookupByLibrary.simpleMessage("添加到 Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("添加到隐藏相册"), "addViewer": MessageLookupByLibrary.simpleMessage("添加查看者"), "addViewers": m1, @@ -302,7 +304,7 @@ class MessageLookup extends MessageLookupByLibrary { "authToChangeYourPassword": MessageLookupByLibrary.simpleMessage("请验证以更改密码"), "authToConfigureTwofactorAuthentication": - MessageLookupByLibrary.simpleMessage("请进行身份验证以配置双重身份验证"), + MessageLookupByLibrary.simpleMessage("请进行身份验证以配置双重身份认证"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage("请进行身份验证以启动账户删除"), "authToViewYourActiveSessions": @@ -375,7 +377,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("代码已复制到剪贴板"), "codeUsedByYou": MessageLookupByLibrary.simpleMessage("您所使用的代码"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "创建一个链接以允许其他人在您的共享相册中添加和查看照片,而无需应用程序或ente账户。 非常适合收集活动照片。"), + "创建一个链接来让他人无需 Ente 应用程序或账户即可在您的共享相册中添加和查看照片。非常适合收集活动照片。"), "collaborativeLink": MessageLookupByLibrary.simpleMessage("协作链接"), "collaborativeLinkCreatedFor": m11, "collaborator": MessageLookupByLibrary.simpleMessage("协作者"), @@ -388,7 +390,7 @@ class MessageLookup extends MessageLookupByLibrary { "color": MessageLookupByLibrary.simpleMessage("颜色"), "confirm": MessageLookupByLibrary.simpleMessage("确认"), "confirm2FADisable": - MessageLookupByLibrary.simpleMessage("您确定要禁用双因素认证吗?"), + MessageLookupByLibrary.simpleMessage("您确定要禁用双重认证吗?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("确认删除账户"), "confirmDeletePrompt": @@ -421,6 +423,8 @@ class MessageLookup extends MessageLookupByLibrary { "createAccount": MessageLookupByLibrary.simpleMessage("创建账户"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage("长按选择照片,然后点击 + 创建相册"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("创建协作链接"), "createCollage": MessageLookupByLibrary.simpleMessage("创建拼贴"), "createNewAccount": MessageLookupByLibrary.simpleMessage("创建新账号"), "createOrSelectAlbum": MessageLookupByLibrary.simpleMessage("创建或选择相册"), @@ -430,6 +434,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("可用的关键更新"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("当前用量 "), "custom": MessageLookupByLibrary.simpleMessage("自定义"), + "customEndpoint": m69, "darkTheme": MessageLookupByLibrary.simpleMessage("深色"), "dayToday": MessageLookupByLibrary.simpleMessage("今天"), "dayYesterday": MessageLookupByLibrary.simpleMessage("昨天"), @@ -449,7 +454,7 @@ class MessageLookup extends MessageLookupByLibrary { "这将删除所有空相册。 当您想减少相册列表的混乱时,这很有用。"), "deleteAll": MessageLookupByLibrary.simpleMessage("全部删除"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "此账户已链接到其他 ente 旗下的应用程序(如果您使用任何 ente 旗下的应用程序)。\\n\\n您在所有 ente 旗下的应用程序中上传的数据将被安排删除,并且您的账户将被永久删除。"), + "此账户已链接到其他 Ente 应用程序(如果您使用任何应用程序)。您在所有 Ente 应用程序中上传的数据将被安排删除,并且您的账户将被永久删除。"), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "请从您注册的电子邮件地址发送电子邮件到 account-delettion@ente.io。"), "deleteEmptyAlbums": MessageLookupByLibrary.simpleMessage("删除空相册"), @@ -457,7 +462,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("要删除空相册吗?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("同时从两者中删除"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("从设备中删除"), - "deleteFromEnte": MessageLookupByLibrary.simpleMessage("从ente 中删除"), + "deleteFromEnte": MessageLookupByLibrary.simpleMessage("从 Ente 中删除"), "deleteItemCount": m14, "deleteLocation": MessageLookupByLibrary.simpleMessage("删除位置"), "deletePhotos": MessageLookupByLibrary.simpleMessage("删除照片"), @@ -478,12 +483,15 @@ class MessageLookup extends MessageLookupByLibrary { "designedToOutlive": MessageLookupByLibrary.simpleMessage("经久耐用"), "details": MessageLookupByLibrary.simpleMessage("详情"), "devAccountChanged": MessageLookupByLibrary.simpleMessage( - "我们用于在 App Store 上发布 ente 的开发者账户已更改。 因此,您将需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。"), + "我们用于在 App Store 上发布 Ente 的开发者账户已更改。因此,您需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。"), + "developerSettings": MessageLookupByLibrary.simpleMessage("开发者设置"), + "developerSettingsWarning": + MessageLookupByLibrary.simpleMessage("您确定要修改开发者设置吗?"), "deviceCodeHint": MessageLookupByLibrary.simpleMessage("输入代码"), "deviceFilesAutoUploading": - MessageLookupByLibrary.simpleMessage("添加到此设备相册的文件将自动上传到 ente。"), + MessageLookupByLibrary.simpleMessage("添加到此设备相册的文件将自动上传到 Ente。"), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "当 ente 在前台并且正在进行备份时禁用设备屏幕锁定。 这通常不需要,但可以帮助大型库的大上传和初始导入更快地完成。"), + "当 Ente 置于前台且正在进行备份时将禁用设备屏幕锁定。这通常是不需要的,但可能有助于更快地完成大型上传和大型库的初始导入。"), "deviceNotFound": MessageLookupByLibrary.simpleMessage("未发现设备"), "didYouKnow": MessageLookupByLibrary.simpleMessage("您知道吗?"), "disableAutoLock": MessageLookupByLibrary.simpleMessage("禁用自动锁定"), @@ -492,9 +500,9 @@ class MessageLookup extends MessageLookupByLibrary { "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("请注意"), "disableLinkMessage": m16, - "disableTwofactor": MessageLookupByLibrary.simpleMessage("禁用双因素认证"), + "disableTwofactor": MessageLookupByLibrary.simpleMessage("禁用双重认证"), "disablingTwofactorAuthentication": - MessageLookupByLibrary.simpleMessage("正在禁用双因素认证..."), + MessageLookupByLibrary.simpleMessage("正在禁用双重认证..."), "discord": MessageLookupByLibrary.simpleMessage("Discord"), "dismiss": MessageLookupByLibrary.simpleMessage("忽略"), "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("公里"), @@ -532,14 +540,16 @@ class MessageLookup extends MessageLookupByLibrary { "encryptingBackup": MessageLookupByLibrary.simpleMessage("正在加密备份..."), "encryption": MessageLookupByLibrary.simpleMessage("加密"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("加密密钥"), + "endpointUpdatedMessage": + MessageLookupByLibrary.simpleMessage("端点更新成功"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage("默认端到端加密"), "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": - MessageLookupByLibrary.simpleMessage("只有您授予访问权限,ente 才能加密和保存文件"), + MessageLookupByLibrary.simpleMessage("仅当您授予文件访问权限时,Ente 才能加密和保存文件"), "entePhotosPerm": - MessageLookupByLibrary.simpleMessage("ente 需要许可才能保存您的照片"), + MessageLookupByLibrary.simpleMessage("Ente 需要许可才能保存您的照片"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "ente 会保留您的回忆,因此即使您丢失了设备,它们也始终可供您使用。"), + "Ente 会保留您的回忆,因此即使您丢失了设备,也能随时找到它们。"), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage("您的家人也可以添加到您的计划中。"), "enterAlbumName": MessageLookupByLibrary.simpleMessage("输入相册名称"), @@ -584,7 +594,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage("验证支付状态失败"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( - "在您现有的计划中添加 5 名家庭成员而无需支付额外费用。\n\n每个成员都有自己的私人空间,除非共享,否则无法看到彼此的文件。\n\n家庭计划适用于已有付费订阅的客户。\n\n立即订阅以开始使用!"), + "将 5 名家庭成员添加到您现有的计划中,无需支付额外费用。\n\n每个成员都有自己的私人空间,除非共享,否则无法看到彼此的文件。\n\n家庭计划适用于已付费 Ente 订阅的客户。\n\n立即订阅,开始体验!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("家庭"), "familyPlans": MessageLookupByLibrary.simpleMessage("家庭计划"), "faq": MessageLookupByLibrary.simpleMessage("常见问题"), @@ -630,6 +640,7 @@ class MessageLookup extends MessageLookupByLibrary { "我们不跟踪应用程序安装情况。如果您告诉我们您是在哪里找到我们的,将会有所帮助!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage("您是如何知道Ente的? (可选的)"), + "help": MessageLookupByLibrary.simpleMessage("帮助"), "hidden": MessageLookupByLibrary.simpleMessage("已隐藏"), "hide": MessageLookupByLibrary.simpleMessage("隐藏"), "hiding": MessageLookupByLibrary.simpleMessage("正在隐藏..."), @@ -644,7 +655,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSOkButton": MessageLookupByLibrary.simpleMessage("好的"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("忽略"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "此相册中的某些文件在上传时被忽略,因为它们之前已从 ente 中删除。"), + "此相册中的某些文件在上传时会被忽略,因为它们之前已从 Ente 中删除。"), "importing": MessageLookupByLibrary.simpleMessage("正在导入..."), "incorrectCode": MessageLookupByLibrary.simpleMessage("代码错误"), "incorrectPasswordTitle": MessageLookupByLibrary.simpleMessage("密码错误"), @@ -659,14 +670,17 @@ class MessageLookup extends MessageLookupByLibrary { "installManually": MessageLookupByLibrary.simpleMessage("手动安装"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("无效的电子邮件地址"), + "invalidEndpoint": MessageLookupByLibrary.simpleMessage("端点无效"), + "invalidEndpointMessage": + MessageLookupByLibrary.simpleMessage("抱歉,您输入的端点无效。请输入有效的端点,然后重试。"), "invalidKey": MessageLookupByLibrary.simpleMessage("无效的密钥"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "您输入的恢复密钥无效。请确保它包含24个单词,并检查每个单词的拼写。\n\n如果您输入了旧的恢复码,请确保它长度为64个字符,并检查其中每个字符。"), "invite": MessageLookupByLibrary.simpleMessage("邀请"), - "inviteToEnte": MessageLookupByLibrary.simpleMessage("邀请到 ente"), + "inviteToEnte": MessageLookupByLibrary.simpleMessage("邀请到 Ente"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("邀请您的朋友"), "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("邀请您的好友加入ente"), + MessageLookupByLibrary.simpleMessage("邀请您的朋友加入 Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "看起来出了点问题。 请稍后重试。 如果错误仍然存在,请联系我们的支持团队。"), @@ -740,7 +754,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("长按电子邮件以验证端到端加密。"), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage("长按一个项目来全屏查看"), - "lostDevice": MessageLookupByLibrary.simpleMessage("丢失了设备吗?"), + "lostDevice": MessageLookupByLibrary.simpleMessage("设备丢失?"), "machineLearning": MessageLookupByLibrary.simpleMessage("机器学习"), "magicSearch": MessageLookupByLibrary.simpleMessage("魔法搜索"), "magicSearchDescription": MessageLookupByLibrary.simpleMessage( @@ -778,7 +792,7 @@ class MessageLookup extends MessageLookupByLibrary { "无法连接到 Ente,请检查您的网络设置,如果错误仍然存在,请联系支持人员。"), "never": MessageLookupByLibrary.simpleMessage("永不"), "newAlbum": MessageLookupByLibrary.simpleMessage("新建相册"), - "newToEnte": MessageLookupByLibrary.simpleMessage("刚来到ente"), + "newToEnte": MessageLookupByLibrary.simpleMessage("初来 Ente"), "newest": MessageLookupByLibrary.simpleMessage("最新"), "no": MessageLookupByLibrary.simpleMessage("否"), "noAlbumsSharedByYouYet": @@ -834,6 +848,8 @@ class MessageLookup extends MessageLookupByLibrary { "我们不储存这个密码,所以如果忘记, 我们将无法解密您的数据"), "paymentDetails": MessageLookupByLibrary.simpleMessage("付款明细"), "paymentFailed": MessageLookupByLibrary.simpleMessage("支付失败"), + "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( + "不幸的是,您的付款失败。请联系支持人员,我们将为您提供帮助!"), "paymentFailedTalkToProvider": m37, "pendingItems": MessageLookupByLibrary.simpleMessage("待处理项目"), "pendingSync": MessageLookupByLibrary.simpleMessage("正在等待同步"), @@ -883,7 +899,7 @@ class MessageLookup extends MessageLookupByLibrary { "privacy": MessageLookupByLibrary.simpleMessage("隐私"), "privacyPolicyTitle": MessageLookupByLibrary.simpleMessage("隐私政策"), "privateBackups": MessageLookupByLibrary.simpleMessage("私人备份"), - "privateSharing": MessageLookupByLibrary.simpleMessage("私人共享"), + "privateSharing": MessageLookupByLibrary.simpleMessage("私人分享"), "publicLinkCreated": MessageLookupByLibrary.simpleMessage("公共链接已创建"), "publicLinkEnabled": MessageLookupByLibrary.simpleMessage("公开链接已启用"), "quickLinks": MessageLookupByLibrary.simpleMessage("快速链接"), @@ -917,7 +933,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage("1. 将此代码提供给您的朋友"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. 他们注册一个付费计划"), "referralStep3": m42, - "referrals": MessageLookupByLibrary.simpleMessage("推荐人"), + "referrals": MessageLookupByLibrary.simpleMessage("推荐"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("推荐已暂停"), "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( @@ -1008,7 +1024,7 @@ class MessageLookup extends MessageLookupByLibrary { "selectReason": MessageLookupByLibrary.simpleMessage("选择原因"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("选择您的计划"), "selectedFilesAreNotOnEnte": - MessageLookupByLibrary.simpleMessage("所选文件不在ente上"), + MessageLookupByLibrary.simpleMessage("所选文件不在 Ente 上"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage("所选文件夹将被加密和备份"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": @@ -1019,6 +1035,7 @@ class MessageLookup extends MessageLookupByLibrary { "sendEmail": MessageLookupByLibrary.simpleMessage("发送电子邮件"), "sendInvite": MessageLookupByLibrary.simpleMessage("发送邀请"), "sendLink": MessageLookupByLibrary.simpleMessage("发送链接"), + "serverEndpoint": MessageLookupByLibrary.simpleMessage("服务器端点"), "sessionExpired": MessageLookupByLibrary.simpleMessage("会话已过期"), "setAPassword": MessageLookupByLibrary.simpleMessage("设置密码"), "setAs": MessageLookupByLibrary.simpleMessage("设置为"), @@ -1037,16 +1054,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("仅与您想要的人分享"), "shareTextConfirmOthersVerificationID": m49, - "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "下载 ente,以便我们轻松分享原始质量的照片和视频\n\nhttps://ente.io"), + "shareTextRecommendUsingEnte": + MessageLookupByLibrary.simpleMessage("下载 Ente,让我们轻松共享高质量的原始照片和视频"), "shareTextReferralCode": m50, "shareWithNonenteUsers": - MessageLookupByLibrary.simpleMessage("与非ente 用户分享"), + MessageLookupByLibrary.simpleMessage("与非 Ente 用户共享"), "shareWithPeopleSectionTitle": m51, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("分享您的第一个相册"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( - "与其他ente用户创建共享和协作相册,包括免费计划的用户。"), + "与其他 Ente 用户(包括免费计划用户)创建共享和协作相册。"), "sharedByMe": MessageLookupByLibrary.simpleMessage("由我共享的"), "sharedByYou": MessageLookupByLibrary.simpleMessage("您共享的"), "sharedPhotoNotifications": @@ -1073,7 +1090,7 @@ class MessageLookup extends MessageLookupByLibrary { "skip": MessageLookupByLibrary.simpleMessage("跳过"), "social": MessageLookupByLibrary.simpleMessage("社交"), "someItemsAreInBothEnteAndYourDevice": - MessageLookupByLibrary.simpleMessage("有些项目既在ente 也在您的设备中。"), + MessageLookupByLibrary.simpleMessage("有些项目同时存在于 Ente 和您的设备中。"), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage("您要删除的部分文件仅在您的设备上可用,且删除后无法恢复"), "someoneSharingAlbumsWithYouShouldSeeTheSameId": @@ -1149,7 +1166,7 @@ class MessageLookup extends MessageLookupByLibrary { "thisAlbumAlreadyHDACollaborativeLink": MessageLookupByLibrary.simpleMessage("此相册已经有一个协作链接"), "thisCanBeUsedToRecoverYourAccountIfYou": - MessageLookupByLibrary.simpleMessage("如果您丢失了双因素验证方式,这可以用来恢复您的账户"), + MessageLookupByLibrary.simpleMessage("如果您丢失了双重认证方式,这可以用来恢复您的账户"), "thisDevice": MessageLookupByLibrary.simpleMessage("此设备"), "thisEmailIsAlreadyInUse": MessageLookupByLibrary.simpleMessage("这个邮箱地址已经被使用"), @@ -1171,19 +1188,19 @@ class MessageLookup extends MessageLookupByLibrary { "trash": MessageLookupByLibrary.simpleMessage("回收站"), "trashDaysLeft": m63, "tryAgain": MessageLookupByLibrary.simpleMessage("请再试一次"), - "turnOnBackupForAutoUpload": - MessageLookupByLibrary.simpleMessage("打开备份以自动上传添加到此设备文件夹的文件。"), + "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( + "打开备份可自动上传添加到此设备文件夹的文件至 Ente。"), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage("在年度计划上免费获得 2 个月"), - "twofactor": MessageLookupByLibrary.simpleMessage("两因素认证"), + "twofactor": MessageLookupByLibrary.simpleMessage("双重认证"), "twofactorAuthenticationHasBeenDisabled": - MessageLookupByLibrary.simpleMessage("双因素认证已被禁用"), + MessageLookupByLibrary.simpleMessage("双重认证已被禁用"), "twofactorAuthenticationPageTitle": - MessageLookupByLibrary.simpleMessage("双因素认证"), + MessageLookupByLibrary.simpleMessage("双重认证"), "twofactorAuthenticationSuccessfullyReset": - MessageLookupByLibrary.simpleMessage("成功重置双因素认证"), - "twofactorSetup": MessageLookupByLibrary.simpleMessage("双因素认证设置"), + MessageLookupByLibrary.simpleMessage("成功重置双重认证"), + "twofactorSetup": MessageLookupByLibrary.simpleMessage("双重认证设置"), "unarchive": MessageLookupByLibrary.simpleMessage("取消存档"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("取消存档相册"), "unarchiving": MessageLookupByLibrary.simpleMessage("正在取消归档..."), @@ -1208,7 +1225,7 @@ class MessageLookup extends MessageLookupByLibrary { "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "可用存储空间受您当前计划的限制。 当您升级您的计划时,超出要求的存储空间将自动变为可用。"), "usePublicLinksForPeopleNotOnEnte": - MessageLookupByLibrary.simpleMessage("为不在ente 上的人使用公共链接"), + MessageLookupByLibrary.simpleMessage("对不在 Ente 上的人使用公开链接"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("使用恢复密钥"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("使用所选照片"), "usedSpace": MessageLookupByLibrary.simpleMessage("已用空间"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 8d8853ae2..89b71a76a 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -290,10 +290,10 @@ class S { ); } - /// `ente needs permission to preserve your photos` + /// `Ente needs permission to preserve your photos` String get entePhotosPerm { return Intl.message( - 'ente needs permission to preserve your photos', + 'Ente needs permission to preserve your photos', name: 'entePhotosPerm', desc: '', args: [], @@ -1743,10 +1743,10 @@ class S { ); } - /// `Create a link to allow people to add and view photos in your shared album without needing an ente app or account. Great for collecting event photos.` + /// `Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos.` String get collabLinkSectionDescription { return Intl.message( - 'Create a link to allow people to add and view photos in your shared album without needing an ente app or account. Great for collecting event photos.', + 'Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos.', name: 'collabLinkSectionDescription', desc: '', args: [], @@ -1773,10 +1773,10 @@ class S { ); } - /// `Share with non-ente users` + /// `Share with non-Ente users` String get shareWithNonenteUsers { return Intl.message( - 'Share with non-ente users', + 'Share with non-Ente users', name: 'shareWithNonenteUsers', desc: '', args: [], @@ -1843,10 +1843,10 @@ class S { ); } - /// `Create shared and collaborative albums with other ente users, including users on free plans.` + /// `Create shared and collaborative albums with other Ente users, including users on free plans.` String get sharedAlbumSectionDescription { return Intl.message( - 'Create shared and collaborative albums with other ente users, including users on free plans.', + 'Create shared and collaborative albums with other Ente users, including users on free plans.', name: 'sharedAlbumSectionDescription', desc: '', args: [], @@ -1926,10 +1926,10 @@ class S { ); } - /// `{email} does not have an ente account.\n\nSend them an invite to share photos.` + /// `{email} does not have an Ente account.\n\nSend them an invite to share photos.` String emailNoEnteAccount(Object email) { return Intl.message( - '$email does not have an ente account.\n\nSend them an invite to share photos.', + '$email does not have an Ente account.\n\nSend them an invite to share photos.', name: 'emailNoEnteAccount', desc: '', args: [email], @@ -1976,10 +1976,10 @@ class S { ); } - /// `Download ente so we can easily share original quality photos and videos\n\nhttps://ente.io` + /// `Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io` String get shareTextRecommendUsingEnte { return Intl.message( - 'Download ente so we can easily share original quality photos and videos\n\nhttps://ente.io', + 'Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io', name: 'shareTextRecommendUsingEnte', desc: '', args: [], @@ -2116,11 +2116,11 @@ class S { ); } - /// `ente referral code: {referralCode} \n\nApply it in Settings → General → Referrals to get {referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io` + /// `Ente referral code: {referralCode} \n\nApply it in Settings → General → Referrals to get {referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io` String shareTextReferralCode( Object referralCode, Object referralStorageInGB) { return Intl.message( - 'ente referral code: $referralCode \n\nApply it in Settings → General → Referrals to get $referralStorageInGB GB free after you signup for a paid plan\n\nhttps://ente.io', + 'Ente referral code: $referralCode \n\nApply it in Settings → General → Referrals to get $referralStorageInGB GB free after you signup for a paid plan\n\nhttps://ente.io', name: 'shareTextReferralCode', desc: '', args: [referralCode, referralStorageInGB], @@ -2532,10 +2532,10 @@ class S { ); } - /// `Invite to ente` + /// `Invite to Ente` String get inviteToEnte { return Intl.message( - 'Invite to ente', + 'Invite to Ente', name: 'inviteToEnte', desc: '', args: [], @@ -2692,20 +2692,20 @@ class S { ); } - /// `This {fileType} is in both ente and your device.` + /// `This {fileType} is in both Ente and your device.` String singleFileInBothLocalAndRemote(Object fileType) { return Intl.message( - 'This $fileType is in both ente and your device.', + 'This $fileType is in both Ente and your device.', name: 'singleFileInBothLocalAndRemote', desc: '', args: [fileType], ); } - /// `This {fileType} will be deleted from ente.` + /// `This {fileType} will be deleted from Ente.` String singleFileInRemoteOnly(Object fileType) { return Intl.message( - 'This $fileType will be deleted from ente.', + 'This $fileType will be deleted from Ente.', name: 'singleFileInRemoteOnly', desc: '', args: [fileType], @@ -2722,10 +2722,10 @@ class S { ); } - /// `Delete from ente` + /// `Delete from Ente` String get deleteFromEnte { return Intl.message( - 'Delete from ente', + 'Delete from Ente', name: 'deleteFromEnte', desc: '', args: [], @@ -3102,10 +3102,10 @@ class S { ); } - /// `Disable the device screen lock when ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.` + /// `Disable the device screen lock when Ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.` String get deviceLockExplanation { return Intl.message( - 'Disable the device screen lock when ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.', + 'Disable the device screen lock when Ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.', name: 'deviceLockExplanation', desc: '', args: [], @@ -3302,10 +3302,10 @@ class S { ); } - /// `A new version of ente is available.` + /// `A new version of Ente is available.` String get aNewVersionOfEnteIsAvailable { return Intl.message( - 'A new version of ente is available.', + 'A new version of Ente is available.', name: 'aNewVersionOfEnteIsAvailable', desc: '', args: [], @@ -3954,10 +3954,10 @@ class S { ); } - /// `ente preserves your memories, so they're always available to you, even if you lose your device.` + /// `Ente preserves your memories, so they're always available to you, even if you lose your device.` String get enteSubscriptionPitch { return Intl.message( - 'ente preserves your memories, so they\'re always available to you, even if you lose your device.', + 'Ente preserves your memories, so they\'re always available to you, even if you lose your device.', name: 'enteSubscriptionPitch', desc: '', args: [], @@ -3979,7 +3979,7 @@ class S { return Intl.message( 'Current usage is ', name: 'currentUsageIs', - desc: 'This text is followed by storage usaged', + desc: 'This text is followed by storage usage', args: [], ); } @@ -4365,10 +4365,10 @@ class S { ); } - /// `Your {id} is already linked to another ente account.\nIf you would like to use your {id} with this account, please contact our support''` + /// `Your {id} is already linked to another Ente account.\nIf you would like to use your {id} with this account, please contact our support''` String subAlreadyLinkedErrMessage(Object id) { return Intl.message( - 'Your $id is already linked to another ente account.\nIf you would like to use your $id with this account, please contact our support\'\'', + 'Your $id is already linked to another Ente account.\nIf you would like to use your $id with this account, please contact our support\'\'', name: 'subAlreadyLinkedErrMessage', desc: '', args: [id], @@ -4715,10 +4715,10 @@ class S { ); } - /// `New to ente` + /// `New to Ente` String get newToEnte { return Intl.message( - 'New to ente', + 'New to Ente', name: 'newToEnte', desc: '', args: [], @@ -4735,10 +4735,10 @@ class S { ); } - /// `The developer account we use to publish ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable.` + /// `The developer account we use to publish Ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable.` String get devAccountChanged { return Intl.message( - 'The developer account we use to publish ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable.', + 'The developer account we use to publish Ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable.', name: 'devAccountChanged', desc: '', args: [], @@ -4806,10 +4806,10 @@ class S { ); } - /// `ente can encrypt and preserve files only if you grant access to them` + /// `Ente can encrypt and preserve files only if you grant access to them` String get enteCanEncryptAndPreserveFilesOnlyIfYouGrant { return Intl.message( - 'ente can encrypt and preserve files only if you grant access to them', + 'Ente can encrypt and preserve files only if you grant access to them', name: 'enteCanEncryptAndPreserveFilesOnlyIfYouGrant', desc: '', args: [], @@ -4856,10 +4856,10 @@ class S { ); } - /// `Use public links for people not on ente` + /// `Use public links for people not on Ente` String get usePublicLinksForPeopleNotOnEnte { return Intl.message( - 'Use public links for people not on ente', + 'Use public links for people not on Ente', name: 'usePublicLinksForPeopleNotOnEnte', desc: '', args: [], @@ -4931,7 +4931,7 @@ class S { return Intl.message( 'On ente', name: 'onEnte', - desc: 'The text displayed above albums backed up to ente', + desc: 'The text displayed above albums backed up to Ente', args: [], ); } @@ -5177,10 +5177,10 @@ class S { ); } - /// `Add to ente` + /// `Add to Ente` String get addToEnte { return Intl.message( - 'Add to ente', + 'Add to Ente', name: 'addToEnte', desc: '', args: [], @@ -5655,10 +5655,10 @@ class S { ); } - /// `Some files in this album are ignored from upload because they had previously been deleted from ente.` + /// `Some files in this album are ignored from upload because they had previously been deleted from Ente.` String get ignoredFolderUploadReason { return Intl.message( - 'Some files in this album are ignored from upload because they had previously been deleted from ente.', + 'Some files in this album are ignored from upload because they had previously been deleted from Ente.', name: 'ignoredFolderUploadReason', desc: '', args: [], @@ -5675,20 +5675,20 @@ class S { ); } - /// `Files added to this device album will automatically get uploaded to ente.` + /// `Files added to this device album will automatically get uploaded to Ente.` String get deviceFilesAutoUploading { return Intl.message( - 'Files added to this device album will automatically get uploaded to ente.', + 'Files added to this device album will automatically get uploaded to Ente.', name: 'deviceFilesAutoUploading', desc: '', args: [], ); } - /// `Turn on backup to automatically upload files added to this device folder to ente.` + /// `Turn on backup to automatically upload files added to this device folder to Ente.` String get turnOnBackupForAutoUpload { return Intl.message( - 'Turn on backup to automatically upload files added to this device folder to ente.', + 'Turn on backup to automatically upload files added to this device folder to Ente.', name: 'turnOnBackupForAutoUpload', desc: '', args: [], @@ -6149,10 +6149,10 @@ class S { ); } - /// `You can still access {count, plural, one {it} other {them}} on ente as long as you have an active subscription` + /// `You can still access {count, plural, one {it} other {them}} on Ente as long as you have an active subscription` String freeUpAccessPostDelete(int count) { return Intl.message( - 'You can still access ${Intl.plural(count, one: 'it', other: 'them')} on ente as long as you have an active subscription', + 'You can still access ${Intl.plural(count, one: 'it', other: 'them')} on Ente as long as you have an active subscription', name: 'freeUpAccessPostDelete', desc: '', args: [count], @@ -6469,10 +6469,10 @@ class S { ); } - /// `Selected files are not on ente` + /// `Selected files are not on Ente` String get selectedFilesAreNotOnEnte { return Intl.message( - 'Selected files are not on ente', + 'Selected files are not on Ente', name: 'selectedFilesAreNotOnEnte', desc: '', args: [], @@ -6559,10 +6559,10 @@ class S { ); } - /// `Some items are in both ente and your device.` + /// `Some items are in both Ente and your device.` String get someItemsAreInBothEnteAndYourDevice { return Intl.message( - 'Some items are in both ente and your device.', + 'Some items are in both Ente and your device.', name: 'someItemsAreInBothEnteAndYourDevice', desc: '', args: [], @@ -7472,10 +7472,10 @@ class S { ); } - /// `Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other's files unless they're shared.\n\nFamily plans are available to customers who have a paid ente subscription.\n\nSubscribe now to get started!` + /// `Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other's files unless they're shared.\n\nFamily plans are available to customers who have a paid Ente subscription.\n\nSubscribe now to get started!` String get familyPlanOverview { return Intl.message( - 'Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other\'s files unless they\'re shared.\n\nFamily plans are available to customers who have a paid ente subscription.\n\nSubscribe now to get started!', + 'Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other\'s files unless they\'re shared.\n\nFamily plans are available to customers who have a paid Ente subscription.\n\nSubscribe now to get started!', name: 'familyPlanOverview', desc: '', args: [], @@ -7845,10 +7845,10 @@ class S { ); } - /// `Invite your friends to ente` + /// `Invite your friends to Ente` String get inviteYourFriendsToEnte { return Intl.message( - 'Invite your friends to ente', + 'Invite your friends to Ente', name: 'inviteYourFriendsToEnte', desc: '', args: [], @@ -7945,10 +7945,10 @@ class S { ); } - /// `This account is linked to other ente apps, if you use any. Your uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted.` + /// `This account is linked to other Ente apps, if you use any. Your uploaded data, across all Ente apps, will be scheduled for deletion, and your account will be permanently deleted.` String get deleteConfirmDialogBody { return Intl.message( - 'This account is linked to other ente apps, if you use any. Your uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted.', + 'This account is linked to other Ente apps, if you use any. Your uploaded data, across all Ente apps, will be scheduled for deletion, and your account will be permanently deleted.', name: 'deleteConfirmDialogBody', desc: '', args: [], @@ -8473,6 +8473,86 @@ class S { args: [], ); } + + /// `Are you sure that you want to modify Developer settings?` + String get developerSettingsWarning { + return Intl.message( + 'Are you sure that you want to modify Developer settings?', + name: 'developerSettingsWarning', + desc: '', + args: [], + ); + } + + /// `Developer settings` + String get developerSettings { + return Intl.message( + 'Developer settings', + name: 'developerSettings', + desc: '', + args: [], + ); + } + + /// `Server endpoint` + String get serverEndpoint { + return Intl.message( + 'Server endpoint', + name: 'serverEndpoint', + desc: '', + args: [], + ); + } + + /// `Invalid endpoint` + String get invalidEndpoint { + return Intl.message( + 'Invalid endpoint', + name: 'invalidEndpoint', + desc: '', + args: [], + ); + } + + /// `Sorry, the endpoint you entered is invalid. Please enter a valid endpoint and try again.` + String get invalidEndpointMessage { + return Intl.message( + 'Sorry, the endpoint you entered is invalid. Please enter a valid endpoint and try again.', + name: 'invalidEndpointMessage', + desc: '', + args: [], + ); + } + + /// `Endpoint updated successfully` + String get endpointUpdatedMessage { + return Intl.message( + 'Endpoint updated successfully', + name: 'endpointUpdatedMessage', + desc: '', + args: [], + ); + } + + /// `Connected to {endpoint}` + String customEndpoint(Object endpoint) { + return Intl.message( + 'Connected to $endpoint', + name: 'customEndpoint', + desc: '', + args: [endpoint], + ); + } + + /// `Create collaborative link` + String get createCollaborativeLink { + return Intl.message( + 'Create collaborative link', + name: 'createCollaborativeLink', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index b552b1052..6b7a4933b 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -16,5 +16,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 6b971ff63..8bb844df3 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1202,5 +1202,6 @@ "descriptions": "Beschreibungen", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index eee952487..9d1c7bcf9 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -23,7 +23,7 @@ "sendEmail": "Send email", "deleteRequestSLAText": "Your request will be processed within 72 hours.", "deleteEmailRequest": "Please send an email to account-deletion@ente.io from your registered email address.", - "entePhotosPerm": "ente needs permission to preserve your photos", + "entePhotosPerm": "Ente needs permission to preserve your photos", "ok": "Ok", "createAccount": "Create account", "createNewAccount": "Create new account", @@ -225,17 +225,17 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Create a link to allow people to add and view photos in your shared album without needing an ente app or account. Great for collecting event photos.", + "collabLinkSectionDescription": "Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos.", "collectPhotos": "Collect photos", "collaborativeLink": "Collaborative link", - "shareWithNonenteUsers": "Share with non-ente users", + "shareWithNonenteUsers": "Share with non-Ente users", "createPublicLink": "Create public link", "sendLink": "Send link", "copyLink": "Copy link", "linkHasExpired": "Link has expired", "publicLinkEnabled": "Public link enabled", "shareALink": "Share a link", - "sharedAlbumSectionDescription": "Create shared and collaborative albums with other ente users, including users on free plans.", + "sharedAlbumSectionDescription": "Create shared and collaborative albums with other Ente users, including users on free plans.", "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Share with specific people} =1 {Shared with 1 person} other {Shared with {numberOfPeople} people}}", "@shareWithPeopleSectionTitle": { "placeholders": { @@ -259,12 +259,12 @@ }, "verificationId": "Verification ID", "verifyEmailID": "Verify {email}", - "emailNoEnteAccount": "{email} does not have an ente account.\n\nSend them an invite to share photos.", + "emailNoEnteAccount": "{email} does not have an Ente account.\n\nSend them an invite to share photos.", "shareMyVerificationID": "Here's my verification ID: {verificationID} for ente.io.", "shareTextConfirmOthersVerificationID": "Hey, can you confirm that this is your ente.io verification ID: {verificationID}", "somethingWentWrong": "Something went wrong", "sendInvite": "Send invite", - "shareTextRecommendUsingEnte": "Download ente so we can easily share original quality photos and videos\n\nhttps://ente.io", + "shareTextRecommendUsingEnte": "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io", "done": "Done", "applyCodeTitle": "Apply code", "enterCodeDescription": "Enter the code provided by your friend to claim free storage for both of you", @@ -281,7 +281,7 @@ "claimMore": "Claim more!", "theyAlsoGetXGb": "They also get {storageAmountInGB} GB", "freeStorageOnReferralSuccess": "{storageAmountInGB} GB each time someone signs up for a paid plan and applies your code", - "shareTextReferralCode": "ente referral code: {referralCode} \n\nApply it in Settings → General → Referrals to get {referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io", + "shareTextReferralCode": "Ente referral code: {referralCode} \n\nApply it in Settings → General → Referrals to get {referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io", "claimFreeStorage": "Claim free storage", "inviteYourFriends": "Invite your friends", "failedToFetchReferralDetails": "Unable to fetch referral details. Please try again later.", @@ -334,7 +334,7 @@ "removeParticipantBody": "{userEmail} will be removed from this shared album\n\nAny photos added by them will also be removed from the album", "keepPhotos": "Keep Photos", "deletePhotos": "Delete photos", - "inviteToEnte": "Invite to ente", + "inviteToEnte": "Invite to Ente", "removePublicLink": "Remove public link", "disableLinkMessage": "This will remove the public link for accessing \"{albumName}\".", "sharing": "Sharing...", @@ -350,10 +350,10 @@ "videoSmallCase": "video", "photoSmallCase": "photo", "singleFileDeleteHighlight": "It will be deleted from all albums.", - "singleFileInBothLocalAndRemote": "This {fileType} is in both ente and your device.", - "singleFileInRemoteOnly": "This {fileType} will be deleted from ente.", + "singleFileInBothLocalAndRemote": "This {fileType} is in both Ente and your device.", + "singleFileInRemoteOnly": "This {fileType} will be deleted from Ente.", "singleFileDeleteFromDevice": "This {fileType} will be deleted from your device.", - "deleteFromEnte": "Delete from ente", + "deleteFromEnte": "Delete from Ente", "yesDelete": "Yes, delete", "movedToTrash": "Moved to trash", "deleteFromDevice": "Delete from device", @@ -445,7 +445,7 @@ "backupOverMobileData": "Backup over mobile data", "backupVideos": "Backup videos", "disableAutoLock": "Disable auto lock", - "deviceLockExplanation": "Disable the device screen lock when ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.", + "deviceLockExplanation": "Disable the device screen lock when Ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.", "about": "About", "weAreOpenSource": "We are open source!", "privacy": "Privacy", @@ -465,7 +465,7 @@ "authToInitiateAccountDeletion": "Please authenticate to initiate account deletion", "areYouSureYouWantToLogout": "Are you sure you want to logout?", "yesLogout": "Yes, logout", - "aNewVersionOfEnteIsAvailable": "A new version of ente is available.", + "aNewVersionOfEnteIsAvailable": "A new version of Ente is available.", "update": "Update", "installManually": "Install manually", "criticalUpdateAvailable": "Critical update available", @@ -554,11 +554,11 @@ "systemTheme": "System", "freeTrial": "Free trial", "selectYourPlan": "Select your plan", - "enteSubscriptionPitch": "ente preserves your memories, so they're always available to you, even if you lose your device.", + "enteSubscriptionPitch": "Ente preserves your memories, so they're always available to you, even if you lose your device.", "enteSubscriptionShareWithFamily": "Your family can be added to your plan as well.", "currentUsageIs": "Current usage is ", "@currentUsageIs": { - "description": "This text is followed by storage usaged", + "description": "This text is followed by storage usage", "examples": [ "Current usage is 1.2 GB" ], @@ -620,7 +620,7 @@ "appleId": "Apple ID", "playstoreSubscription": "PlayStore subscription", "appstoreSubscription": "AppStore subscription", - "subAlreadyLinkedErrMessage": "Your {id} is already linked to another ente account.\nIf you would like to use your {id} with this account, please contact our support''", + "subAlreadyLinkedErrMessage": "Your {id} is already linked to another Ente account.\nIf you would like to use your {id} with this account, please contact our support''", "visitWebToManage": "Please visit web.ente.io to manage your subscription", "couldNotUpdateSubscription": "Could not update subscription", "pleaseContactSupportAndWeWillBeHappyToHelp": "Please contact support@ente.io and we will be happy to help!", @@ -665,9 +665,9 @@ "everywhere": "everywhere", "androidIosWebDesktop": "Android, iOS, Web, Desktop", "mobileWebDesktop": "Mobile, Web, Desktop", - "newToEnte": "New to ente", + "newToEnte": "New to Ente", "pleaseLoginAgain": "Please login again", - "devAccountChanged": "The developer account we use to publish ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable.", + "devAccountChanged": "The developer account we use to publish Ente on App Store has changed. Because of this, you will need to login again.\n\nOur apologies for the inconvenience, but this was unavoidable.", "yourSubscriptionHasExpired": "Your subscription has expired", "storageLimitExceeded": "Storage limit exceeded", "upgrade": "Upgrade", @@ -678,12 +678,12 @@ }, "backupFailed": "Backup failed", "couldNotBackUpTryLater": "We could not backup your data.\nWe will retry later.", - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "ente can encrypt and preserve files only if you grant access to them", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente can encrypt and preserve files only if you grant access to them", "pleaseGrantPermissions": "Please grant permissions", "grantPermission": "Grant permission", "privateSharing": "Private sharing", "shareOnlyWithThePeopleYouWant": "Share only with the people you want", - "usePublicLinksForPeopleNotOnEnte": "Use public links for people not on ente", + "usePublicLinksForPeopleNotOnEnte": "Use public links for people not on Ente", "allowPeopleToAddPhotos": "Allow people to add photos", "shareAnAlbumNow": "Share an album now", "collectEventPhotos": "Collect event photos", @@ -695,7 +695,7 @@ }, "onDevice": "On device", "@onEnte": { - "description": "The text displayed above albums backed up to ente", + "description": "The text displayed above albums backed up to Ente", "type": "text" }, "onEnte": "On ente", @@ -741,7 +741,7 @@ "saveCollage": "Save collage", "collageSaved": "Collage saved to gallery", "collageLayout": "Layout", - "addToEnte": "Add to ente", + "addToEnte": "Add to Ente", "addToAlbum": "Add to album", "delete": "Delete", "hide": "Hide", @@ -806,10 +806,10 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "Photos added by you will be removed from the album", "youveNoFilesInThisAlbumThatCanBeDeleted": "You've no files in this album that can be deleted", "youDontHaveAnyArchivedItems": "You don't have any archived items.", - "ignoredFolderUploadReason": "Some files in this album are ignored from upload because they had previously been deleted from ente.", + "ignoredFolderUploadReason": "Some files in this album are ignored from upload because they had previously been deleted from Ente.", "resetIgnoredFiles": "Reset ignored files", - "deviceFilesAutoUploading": "Files added to this device album will automatically get uploaded to ente.", - "turnOnBackupForAutoUpload": "Turn on backup to automatically upload files added to this device folder to ente.", + "deviceFilesAutoUploading": "Files added to this device album will automatically get uploaded to Ente.", + "turnOnBackupForAutoUpload": "Turn on backup to automatically upload files added to this device folder to Ente.", "noHiddenPhotosOrVideos": "No hidden photos or videos", "toHideAPhotoOrVideo": "To hide a photo or video", "openTheItem": "• Open the item", @@ -886,7 +886,7 @@ "@freeUpSpaceSaving": { "description": "Text to tell user how much space they can free up by deleting items from the device" }, - "freeUpAccessPostDelete": "You can still access {count, plural, one {it} other {them}} on ente as long as you have an active subscription", + "freeUpAccessPostDelete": "You can still access {count, plural, one {it} other {them}} on Ente as long as you have an active subscription", "@freeUpAccessPostDelete": { "placeholders": { "count": { @@ -937,7 +937,7 @@ "renameFile": "Rename file", "enterFileName": "Enter file name", "filesDeleted": "Files deleted", - "selectedFilesAreNotOnEnte": "Selected files are not on ente", + "selectedFilesAreNotOnEnte": "Selected files are not on Ente", "thisActionCannotBeUndone": "This action cannot be undone", "emptyTrash": "Empty trash?", "permDeleteWarning": "All items in trash will be permanently deleted\n\nThis action cannot be undone", @@ -946,7 +946,7 @@ "permanentlyDeleteFromDevice": "Permanently delete from device?", "someOfTheFilesYouAreTryingToDeleteAre": "Some of the files you are trying to delete are only available on your device and cannot be recovered if deleted", "theyWillBeDeletedFromAllAlbums": "They will be deleted from all albums.", - "someItemsAreInBothEnteAndYourDevice": "Some items are in both ente and your device.", + "someItemsAreInBothEnteAndYourDevice": "Some items are in both Ente and your device.", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Selected items will be deleted from all albums and moved to trash.", "theseItemsWillBeDeletedFromYourDevice": "These items will be deleted from your device.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team.", @@ -1052,7 +1052,7 @@ }, "setRadius": "Set radius", "familyPlanPortalTitle": "Family", - "familyPlanOverview": "Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other's files unless they're shared.\n\nFamily plans are available to customers who have a paid ente subscription.\n\nSubscribe now to get started!", + "familyPlanOverview": "Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other's files unless they're shared.\n\nFamily plans are available to customers who have a paid Ente subscription.\n\nSubscribe now to get started!", "androidBiometricHint": "Verify identity", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -1130,7 +1130,7 @@ "noAlbumsSharedByYouYet": "No albums shared by you yet", "sharedWithYou": "Shared with you", "sharedByYou": "Shared by you", - "inviteYourFriendsToEnte": "Invite your friends to ente", + "inviteYourFriendsToEnte": "Invite your friends to Ente", "failedToDownloadVideo": "Failed to download video", "hiding": "Hiding...", "unhiding": "Unhiding...", @@ -1140,7 +1140,7 @@ "addToHiddenAlbum": "Add to hidden album", "moveToHiddenAlbum": "Move to hidden album", "fileTypes": "File types", - "deleteConfirmDialogBody": "This account is linked to other ente apps, if you use any. Your uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted.", + "deleteConfirmDialogBody": "This account is linked to other Ente apps, if you use any. Your uploaded data, across all Ente apps, will be scheduled for deletion, and your account will be permanently deleted.", "hearUsWhereTitle": "How did you hear about Ente? (optional)", "hearUsExplanation": "We don't track app installs. It'd help if you told us where you found us!", "viewAddOnButton": "View add-ons", @@ -1203,5 +1203,13 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "developerSettingsWarning": "Are you sure that you want to modify Developer settings?", + "developerSettings": "Developer settings", + "serverEndpoint": "Server endpoint", + "invalidEndpoint": "Invalid endpoint", + "invalidEndpointMessage": "Sorry, the endpoint you entered is invalid. Please enter a valid endpoint and try again.", + "endpointUpdatedMessage": "Endpoint updated successfully", + "customEndpoint": "Connected to {endpoint}", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index fcdff5ccf..7dff21036 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -978,5 +978,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index d24e11827..d44d093c1 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1159,5 +1159,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index ef8eeda34..9e884ed9e 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1121,5 +1121,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index b552b1052..6b7a4933b 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -16,5 +16,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 43ca7ee5d..120e4a207 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1197,5 +1197,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index b4ba1d96d..0b777b353 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -30,5 +30,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 8dd33fda6..d358d4d2c 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -117,5 +117,6 @@ "descriptions": "Descriptions", "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption." + "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", + "createCollaborativeLink": "Create collaborative link" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index c4f274335..37b1041a9 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -225,7 +225,7 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Crie um link para permitir pessoas adicionar e ver fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos.", + "collabLinkSectionDescription": "Crie um link para permitir que as pessoas adicionem e vejam fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos.", "collectPhotos": "Colete fotos", "collaborativeLink": "Link Colaborativo", "shareWithNonenteUsers": "Compartilhar com usuários não-Ente", @@ -259,12 +259,12 @@ }, "verificationId": "ID de Verificação", "verifyEmailID": "Verificar {email}", - "emailNoEnteAccount": "{email} Não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos.", + "emailNoEnteAccount": "{email} não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos.", "shareMyVerificationID": "Aqui está meu ID de verificação para o Ente.io: {verificationID}", "shareTextConfirmOthersVerificationID": "Ei, você pode confirmar que este é seu ID de verificação do Ente.io? {verificationID}", "somethingWentWrong": "Algo deu errado", "sendInvite": "Enviar convite", - "shareTextRecommendUsingEnte": "Baixe o Ente para podermos compartilhar facilmente fotos e vídeos de alta qualidade\n\nhttps://ente.io", + "shareTextRecommendUsingEnte": "Baixe o Ente para que possamos compartilhar facilmente fotos e vídeos de qualidade original\n\nhttps://ente.io", "done": "Concluído", "applyCodeTitle": "Aplicar código", "enterCodeDescription": "Digite o código fornecido pelo seu amigo para reivindicar o armazenamento gratuito para vocês dois", @@ -304,6 +304,7 @@ } }, "faq": "Perguntas frequentes", + "help": "Ajuda", "oopsSomethingWentWrong": "Ops! Algo deu errado", "peopleUsingYourCode": "Pessoas que usam seu código", "eligible": "elegível", @@ -349,8 +350,8 @@ "videoSmallCase": "Video", "photoSmallCase": "Foto", "singleFileDeleteHighlight": "Ele será excluído de todos os álbuns.", - "singleFileInBothLocalAndRemote": "Este {fileType} está em ente e no seu dispositivo.", - "singleFileInRemoteOnly": "Este {fileType} será excluído do ente.", + "singleFileInBothLocalAndRemote": "Este {fileType} está tanto no Ente quanto no seu dispositivo.", + "singleFileInRemoteOnly": "Este {fileType} será excluído do Ente.", "singleFileDeleteFromDevice": "Este {fileType} será excluído do seu dispositivo.", "deleteFromEnte": "Excluir do ente", "yesDelete": "Sim, excluir", @@ -444,7 +445,7 @@ "backupOverMobileData": "Backup de dados móveis", "backupVideos": "Backup de videos", "disableAutoLock": "Desativar bloqueio automático", - "deviceLockExplanation": "Desative o bloqueio de tela do dispositivo quando o ente estiver em primeiro plano e houver um backup em andamento. Isso normalmente não é necessário, mas pode ajudar grandes uploads e importações iniciais de grandes bibliotecas a serem concluídos mais rapidamente.", + "deviceLockExplanation": "Desative o bloqueio de tela do dispositivo quando o Ente estiver em primeiro plano e houver um backup em andamento. Isso normalmente não é necessário, mas pode ajudar nos envios grandes e importações iniciais de grandes bibliotecas a serem concluídos mais rapidamente.", "about": "Sobre", "weAreOpenSource": "Somos de código aberto!", "privacy": "Privacidade", @@ -463,8 +464,8 @@ "logout": "Encerrar sessão", "authToInitiateAccountDeletion": "Por favor, autentique-se para iniciar a exclusão de conta", "areYouSureYouWantToLogout": "Você tem certeza que deseja encerrar a sessão?", - "yesLogout": "Sim, terminar sessão", - "aNewVersionOfEnteIsAvailable": "Uma nova versão do ente está disponível.", + "yesLogout": "Sim, encerrar sessão", + "aNewVersionOfEnteIsAvailable": "Uma nova versão do Ente está disponível.", "update": "Atualização", "installManually": "Instalar manualmente", "criticalUpdateAvailable": "Atualização crítica disponível", @@ -514,7 +515,7 @@ } }, "familyPlans": "Plano familiar", - "referrals": "Indicações", + "referrals": "Referências", "notifications": "Notificações", "sharedPhotoNotifications": "Novas fotos compartilhadas", "sharedPhotoNotificationsExplanation": "Receber notificações quando alguém adicionar uma foto em um álbum compartilhado que você faz parte", @@ -553,11 +554,11 @@ "systemTheme": "Sistema", "freeTrial": "Teste gratuito", "selectYourPlan": "Selecione seu plano", - "enteSubscriptionPitch": "O ente preserva suas memórias, então eles estão sempre disponíveis para você, mesmo se você perder o seu dispositivo.", + "enteSubscriptionPitch": "O Ente preserva suas memórias, então eles estão sempre disponíveis para você, mesmo se você perder o seu dispositivo.", "enteSubscriptionShareWithFamily": "Sua família também pode ser adicionada ao seu plano.", "currentUsageIs": "O uso atual é ", "@currentUsageIs": { - "description": "This text is followed by storage usaged", + "description": "This text is followed by storage usage", "examples": { "0": "Current usage is 1.2 GB" }, @@ -619,7 +620,7 @@ "appleId": "ID da Apple", "playstoreSubscription": "Assinatura da PlayStore", "appstoreSubscription": "Assinatura da AppStore", - "subAlreadyLinkedErrMessage": "Seu {id} já está vinculado a outra conta ente.\nSe você gostaria de usar seu {id} com esta conta, por favor contate nosso suporte''", + "subAlreadyLinkedErrMessage": "Seu {id} já está vinculado a outra conta Ente.\nSe você gostaria de usar seu {id} com esta conta, por favor contate nosso suporte''", "visitWebToManage": "Por favor visite web.ente.io para gerenciar sua assinatura", "couldNotUpdateSubscription": "Não foi possível atualizar a assinatura", "pleaseContactSupportAndWeWillBeHappyToHelp": "Por favor, entre em contato com support@ente.io e nós ficaremos felizes em ajudar!", @@ -640,7 +641,7 @@ "thankYou": "Obrigado", "failedToVerifyPaymentStatus": "Falha ao verificar status do pagamento", "pleaseWaitForSometimeBeforeRetrying": "Por favor, aguarde algum tempo antes de tentar novamente", - "paymentFailedWithReason": "Infelizmente o seu pagamento falhou devido a {reason}", + "paymentFailedMessage": "Infelizmente o seu pagamento falhou. Entre em contato com o suporte e nós ajudaremos você!", "youAreOnAFamilyPlan": "Você está em um plano familiar!", "contactFamilyAdmin": "Entre em contato com {familyAdminEmail} para gerenciar sua assinatura", "leaveFamily": "Sair da família", @@ -664,9 +665,9 @@ "everywhere": "em todos os lugares", "androidIosWebDesktop": "Android, iOS, Web, Desktop", "mobileWebDesktop": "Mobile, Web, Desktop", - "newToEnte": "Novo no ente", + "newToEnte": "Novo no Ente", "pleaseLoginAgain": "Por favor, faça login novamente", - "devAccountChanged": "A conta de desenvolvedor que usamos para publicar o ente na App Store foi alterada. Por esse motivo, você precisará fazer login novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável.", + "devAccountChanged": "A conta de desenvolvedor que usamos para publicar o Ente na App Store foi alterada. Por esse motivo, você precisará fazer entrar novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável.", "yourSubscriptionHasExpired": "A sua assinatura expirou", "storageLimitExceeded": "Limite de armazenamento excedido", "upgrade": "Aprimorar", @@ -677,12 +678,12 @@ }, "backupFailed": "Erro ao efetuar o backup", "couldNotBackUpTryLater": "Não foi possível fazer o backup de seus dados.\nTentaremos novamente mais tarde.", - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "ente pode criptografar e preservar arquivos somente se você conceder acesso a eles", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente pode criptografar e preservar arquivos apenas se você conceder acesso a eles", "pleaseGrantPermissions": "Por favor, conceda as permissões", "grantPermission": "Garantir permissão", "privateSharing": "Compartilhamento privado", "shareOnlyWithThePeopleYouWant": "Compartilhar apenas com as pessoas que você quiser", - "usePublicLinksForPeopleNotOnEnte": "Usar links públicos para pessoas que não estão no ente", + "usePublicLinksForPeopleNotOnEnte": "Usar links públicos para pessoas que não estão no Ente", "allowPeopleToAddPhotos": "Permitir que pessoas adicionem fotos", "shareAnAlbumNow": "Compartilhar um álbum agora", "collectEventPhotos": "Coletar fotos do evento", @@ -694,7 +695,7 @@ }, "onDevice": "No dispositivo", "@onEnte": { - "description": "The text displayed above albums backed up to ente", + "description": "The text displayed above albums backed up to Ente", "type": "text" }, "onEnte": "Em ente", @@ -740,9 +741,9 @@ "saveCollage": "Salvar colagem", "collageSaved": "Colagem salva na galeria", "collageLayout": "Layout", - "addToEnte": "Adicionar ao ente", + "addToEnte": "Adicionar ao Ente", "addToAlbum": "Adicionar ao álbum", - "delete": "Apagar", + "delete": "Excluir", "hide": "Ocultar", "share": "Compartilhar", "unhideToAlbum": "Reexibir para o álbum", @@ -805,10 +806,10 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "As fotos adicionadas por você serão removidas do álbum", "youveNoFilesInThisAlbumThatCanBeDeleted": "Você não tem arquivos neste álbum que possam ser excluídos", "youDontHaveAnyArchivedItems": "Você não tem nenhum item arquivado.", - "ignoredFolderUploadReason": "Alguns arquivos neste álbum são ignorados do upload porque eles tinham sido anteriormente excluídos do ente.", + "ignoredFolderUploadReason": "Alguns arquivos neste álbum são ignorados do envio porque eles tinham sido anteriormente excluídos do Ente.", "resetIgnoredFiles": "Redefinir arquivos ignorados", - "deviceFilesAutoUploading": "Arquivos adicionados a este álbum do dispositivo serão automaticamente enviados para o ente.", - "turnOnBackupForAutoUpload": "Ative o backup para enviar automaticamente arquivos adicionados a esta pasta do dispositivo para o ente.", + "deviceFilesAutoUploading": "Arquivos adicionados a este álbum do dispositivo serão automaticamente enviados para o Ente.", + "turnOnBackupForAutoUpload": "Ative o backup para enviar automaticamente arquivos adicionados a esta pasta do dispositivo para o Ente.", "noHiddenPhotosOrVideos": "Nenhuma foto ou vídeos ocultos", "toHideAPhotoOrVideo": "Para ocultar uma foto ou vídeo", "openTheItem": "• Abra o item", @@ -885,7 +886,7 @@ "@freeUpSpaceSaving": { "description": "Text to tell user how much space they can free up by deleting items from the device" }, - "freeUpAccessPostDelete": "Você ainda pode acessar {count, plural, one {ele} other {eles}} no ente contanto que você tenha uma assinatura ativa", + "freeUpAccessPostDelete": "Você ainda pode acessar {count, plural, one {ele} other {eles}} no Ente contanto que você tenha uma assinatura ativa", "@freeUpAccessPostDelete": { "placeholders": { "count": { @@ -936,7 +937,7 @@ "renameFile": "Renomear arquivo", "enterFileName": "Digite o nome do arquivo", "filesDeleted": "Arquivos excluídos", - "selectedFilesAreNotOnEnte": "Os arquivos selecionados não estão no ente", + "selectedFilesAreNotOnEnte": "Os arquivos selecionados não estão no Ente", "thisActionCannotBeUndone": "Esta ação não pode ser desfeita", "emptyTrash": "Esvaziar a lixeira?", "permDeleteWarning": "Todos os itens na lixeira serão excluídos permanentemente\n\nEsta ação não pode ser desfeita", @@ -945,7 +946,7 @@ "permanentlyDeleteFromDevice": "Excluir permanentemente do dispositivo?", "someOfTheFilesYouAreTryingToDeleteAre": "Alguns dos arquivos que você está tentando excluir só estão disponíveis no seu dispositivo e não podem ser recuperados se forem excluídos", "theyWillBeDeletedFromAllAlbums": "Ele será excluído de todos os álbuns.", - "someItemsAreInBothEnteAndYourDevice": "Alguns itens estão tanto no ente quanto no seu dispositivo.", + "someItemsAreInBothEnteAndYourDevice": "Alguns itens estão tanto no Ente quanto no seu dispositivo.", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.", "theseItemsWillBeDeletedFromYourDevice": "Estes itens serão excluídos do seu dispositivo.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Parece que algo deu errado. Por favor, tente novamente mais tarde. Se o erro persistir, entre em contato com nossa equipe de suporte.", @@ -1051,7 +1052,7 @@ }, "setRadius": "Definir raio", "familyPlanPortalTitle": "Família", - "familyPlanOverview": "Adicione 5 membros da família ao seu plano existente sem pagar a mais.\n\nCada membro recebe seu próprio espaço privado, e nenhum membro pode ver os arquivos uns dos outros a menos que sejam compartilhados.\n\nPlanos de família estão disponíveis para os clientes que têm uma assinatura de ente paga.\n\nassine agora para começar!", + "familyPlanOverview": "Adicione 5 membros da família ao seu plano existente sem pagar a mais.\n\nCada membro recebe seu próprio espaço privado, e nenhum membro pode ver os arquivos uns dos outros a menos que sejam compartilhados.\n\nPlanos de família estão disponíveis para os clientes que têm uma assinatura do Ente paga.\n\nAssine agora para começar!", "androidBiometricHint": "Verificar identidade", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -1112,7 +1113,7 @@ }, "maps": "Mapas", "enableMaps": "Habilitar mapa", - "enableMapsDesc": "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo Open Street Map, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações.", + "enableMapsDesc": "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações.", "quickLinks": "Links rápidos", "selectItemsToAdd": "Selecionar itens para adicionar", "addSelected": "Adicionar selecionado", @@ -1129,7 +1130,7 @@ "noAlbumsSharedByYouYet": "Nenhum álbum compartilhado por você ainda", "sharedWithYou": "Compartilhado com você", "sharedByYou": "Compartilhado por você", - "inviteYourFriendsToEnte": "Convide seus amigos ao ente", + "inviteYourFriendsToEnte": "Convide seus amigos ao Ente", "failedToDownloadVideo": "Falha ao baixar vídeo", "hiding": "Ocultando...", "unhiding": "Desocultando...", @@ -1139,7 +1140,7 @@ "addToHiddenAlbum": "Adicionar a álbum oculto", "moveToHiddenAlbum": "Mover para álbum oculto", "fileTypes": "Tipos de arquivo", - "deleteConfirmDialogBody": "Esta conta está vinculada a outros aplicativos ente, se você usar algum. Seus dados enviados, em todos os aplicativos ente, serão agendados para exclusão, e sua conta será excluída permanentemente.", + "deleteConfirmDialogBody": "Esta conta está vinculada a outros aplicativos Ente, se você usar algum. Seus dados enviados, em todos os aplicativos Ente, serão agendados para exclusão, e sua conta será excluída permanentemente.", "hearUsWhereTitle": "Como você ouviu sobre o Ente? (opcional)", "hearUsExplanation": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", "viewAddOnButton": "Ver complementos", @@ -1177,9 +1178,9 @@ "contacts": "Contatos", "noInternetConnection": "Sem conexão à internet", "pleaseCheckYourInternetConnectionAndTryAgain": "Verifique sua conexão com a internet e tente novamente.", - "signOutFromOtherDevices": "Terminar sessão em outros dispositivos", + "signOutFromOtherDevices": "Encerrar sessão em outros dispositivos", "signOutOtherBody": "Se você acha que alguém pode saber sua senha, você pode forçar todos os outros dispositivos que estão com sua conta a desconectar.", - "signOutOtherDevices": "Terminar sessão em outros dispositivos", + "signOutOtherDevices": "Encerrar sessão em outros dispositivos", "doNotSignOut": "Não encerrar sessão", "editLocation": "Editar local", "selectALocation": "Selecionar um local", @@ -1202,5 +1203,13 @@ "descriptions": "Descrições", "addViewers": "{count, plural, zero {Adicionar visualizador} one {Adicionar visualizador} other {Adicionar Visualizadores}}", "addCollaborators": "{count, plural, zero {Adicionar colaborador} one {Adicionar coloborador} other {Adicionar colaboradores}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Pressione e segure um e-mail para verificar a criptografia de ponta a ponta." + "longPressAnEmailToVerifyEndToEndEncryption": "Pressione e segure um e-mail para verificar a criptografia de ponta a ponta.", + "developerSettingsWarning": "Tem certeza de que deseja modificar as configurações de Desenvolvedor?", + "developerSettings": "Configurações de desenvolvedor", + "serverEndpoint": "Servidor endpoint", + "invalidEndpoint": "Endpoint inválido", + "invalidEndpointMessage": "Desculpe, o endpoint que você inseriu é inválido. Por favor, insira um endpoint válido e tente novamente.", + "endpointUpdatedMessage": "Endpoint atualizado com sucesso", + "customEndpoint": "Conectado a {endpoint}", + "createCollaborativeLink": "Criar link colaborativo" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 0506820a8..8eb97df78 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -23,7 +23,7 @@ "sendEmail": "发送电子邮件", "deleteRequestSLAText": "您的请求将在 72 小时内处理。", "deleteEmailRequest": "请从您注册的电子邮件地址发送电子邮件到 account-delettion@ente.io。", - "entePhotosPerm": "ente 需要许可才能保存您的照片", + "entePhotosPerm": "Ente 需要许可才能保存您的照片", "ok": "OK", "createAccount": "创建账户", "createNewAccount": "创建新账号", @@ -127,7 +127,7 @@ } } }, - "twofactorSetup": "双因素认证设置", + "twofactorSetup": "双重认证设置", "enterCode": "输入代码", "scanCode": "扫描二维码/条码", "codeCopiedToClipboard": "代码已复制到剪贴板", @@ -138,9 +138,9 @@ "confirm": "确认", "setupComplete": "设置完成", "saveYourRecoveryKeyIfYouHaventAlready": "若您尚未保存,请妥善保存此恢复密钥", - "thisCanBeUsedToRecoverYourAccountIfYou": "如果您丢失了双因素验证方式,这可以用来恢复您的账户", - "twofactorAuthenticationPageTitle": "双因素认证", - "lostDevice": "丢失了设备吗?", + "thisCanBeUsedToRecoverYourAccountIfYou": "如果您丢失了双重认证方式,这可以用来恢复您的账户", + "twofactorAuthenticationPageTitle": "双重认证", + "lostDevice": "设备丢失?", "verifyingRecoveryKey": "正在验证恢复密钥...", "recoveryKeyVerified": "恢复密钥已验证", "recoveryKeySuccessBody": "太棒了! 您的恢复密钥是有效的。 感谢您的验证。\n\n请记住要安全备份您的恢复密钥。", @@ -225,17 +225,17 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "创建一个链接以允许其他人在您的共享相册中添加和查看照片,而无需应用程序或ente账户。 非常适合收集活动照片。", + "collabLinkSectionDescription": "创建一个链接来让他人无需 Ente 应用程序或账户即可在您的共享相册中添加和查看照片。非常适合收集活动照片。", "collectPhotos": "收集照片", "collaborativeLink": "协作链接", - "shareWithNonenteUsers": "与非ente 用户分享", + "shareWithNonenteUsers": "与非 Ente 用户共享", "createPublicLink": "创建公开链接", "sendLink": "发送链接", "copyLink": "复制链接", "linkHasExpired": "链接已过期", "publicLinkEnabled": "公开链接已启用", "shareALink": "分享链接", - "sharedAlbumSectionDescription": "与其他ente用户创建共享和协作相册,包括免费计划的用户。", + "sharedAlbumSectionDescription": "与其他 Ente 用户(包括免费计划用户)创建共享和协作相册。", "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {与特定人员共享} =1 {与 1 人共享} other {与 {numberOfPeople} 人共享}}", "@shareWithPeopleSectionTitle": { "placeholders": { @@ -259,12 +259,12 @@ }, "verificationId": "验证 ID", "verifyEmailID": "验证 {email}", - "emailNoEnteAccount": "{email} 没有 ente 账户。\n\n向他们发送分享照片的邀请。", + "emailNoEnteAccount": "{email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。", "shareMyVerificationID": "这是我的ente.io 的验证 ID: {verificationID}。", "shareTextConfirmOthersVerificationID": "嘿,你能确认这是你的 ente.io 验证 ID吗:{verificationID}", "somethingWentWrong": "出了些问题", "sendInvite": "发送邀请", - "shareTextRecommendUsingEnte": "下载 ente,以便我们轻松分享原始质量的照片和视频\n\nhttps://ente.io", + "shareTextRecommendUsingEnte": "下载 Ente,让我们轻松共享高质量的原始照片和视频", "done": "已完成", "applyCodeTitle": "应用代码", "enterCodeDescription": "输入您的朋友提供的代码来为您申请免费存储", @@ -281,7 +281,7 @@ "claimMore": "领取更多!", "theyAlsoGetXGb": "他们也会获得 {storageAmountInGB} GB", "freeStorageOnReferralSuccess": "每当有人使用您的代码注册付费计划时您将获得{storageAmountInGB} GB", - "shareTextReferralCode": "ente推荐码: {referralCode} \n\n注册付费计划后在设置 → 常规 → 推荐中应用它以免费获得 {referralStorageInGB} GB空间\n\nhttps://ente.io", + "shareTextReferralCode": "Ente 推荐代码:{referralCode}\n\n在 \"设置\"→\"通用\"→\"推荐 \"中应用它,即可在注册付费计划后免费获得 {referralStorageInGB} GB 存储空间\n\nhttps://ente.io", "claimFreeStorage": "领取免费存储", "inviteYourFriends": "邀请您的朋友", "failedToFetchReferralDetails": "无法获取引荐详细信息。 请稍后再试。", @@ -304,6 +304,7 @@ } }, "faq": "常见问题", + "help": "帮助", "oopsSomethingWentWrong": "哎呀,似乎出了点问题", "peopleUsingYourCode": "使用您的代码的人", "eligible": "符合资格", @@ -333,9 +334,9 @@ "removeParticipantBody": "{userEmail} 将从这个共享相册中删除\n\nTA们添加的任何照片也将从相册中删除", "keepPhotos": "保留照片", "deletePhotos": "删除照片", - "inviteToEnte": "邀请到 ente", + "inviteToEnte": "邀请到 Ente", "removePublicLink": "删除公开链接", - "disableLinkMessage": "这将删除用于访问\"{albumName}\"的公共链接。", + "disableLinkMessage": "这将删除用于访问\"{albumName}\"的公开链接。", "sharing": "正在分享...", "youCannotShareWithYourself": "莫开玩笑,您不能与自己分享", "archive": "存档", @@ -349,10 +350,10 @@ "videoSmallCase": "视频", "photoSmallCase": "照片", "singleFileDeleteHighlight": "它将从所有相册中删除。", - "singleFileInBothLocalAndRemote": "此 {fileType} 同时在ente和您的设备中。", - "singleFileInRemoteOnly": "此 {fileType} 将从ente中删除。", + "singleFileInBothLocalAndRemote": "{fileType} 已同时存在于 Ente 和您的设备中。", + "singleFileInRemoteOnly": "{fileType} 将从 Ente 中删除。", "singleFileDeleteFromDevice": "此 {fileType} 将从您的设备中删除。", - "deleteFromEnte": "从ente 中删除", + "deleteFromEnte": "从 Ente 中删除", "yesDelete": "是的, 删除", "movedToTrash": "已移至回收站", "deleteFromDevice": "从设备中删除", @@ -444,7 +445,7 @@ "backupOverMobileData": "通过移动数据备份", "backupVideos": "备份视频", "disableAutoLock": "禁用自动锁定", - "deviceLockExplanation": "当 ente 在前台并且正在进行备份时禁用设备屏幕锁定。 这通常不需要,但可以帮助大型库的大上传和初始导入更快地完成。", + "deviceLockExplanation": "当 Ente 置于前台且正在进行备份时将禁用设备屏幕锁定。这通常是不需要的,但可能有助于更快地完成大型上传和大型库的初始导入。", "about": "关于", "weAreOpenSource": "我们是开源的 !", "privacy": "隐私", @@ -464,7 +465,7 @@ "authToInitiateAccountDeletion": "请进行身份验证以启动账户删除", "areYouSureYouWantToLogout": "您确定要退出登录吗?", "yesLogout": "是的,退出登陆", - "aNewVersionOfEnteIsAvailable": "有新版本的 ente 可供使用。", + "aNewVersionOfEnteIsAvailable": "有新版本的 Ente 可供使用。", "update": "更新", "installManually": "手动安装", "criticalUpdateAvailable": "可用的关键更新", @@ -514,7 +515,7 @@ } }, "familyPlans": "家庭计划", - "referrals": "推荐人", + "referrals": "推荐", "notifications": "通知", "sharedPhotoNotifications": "新共享的照片", "sharedPhotoNotificationsExplanation": "当有人将照片添加到您所属的共享相册时收到通知", @@ -522,15 +523,15 @@ "general": "通用", "security": "安全", "authToViewYourRecoveryKey": "请验证以查看您的恢复密钥", - "twofactor": "两因素认证", - "authToConfigureTwofactorAuthentication": "请进行身份验证以配置双重身份验证", + "twofactor": "双重认证", + "authToConfigureTwofactorAuthentication": "请进行身份验证以配置双重身份认证", "lockscreen": "锁屏", "authToChangeLockscreenSetting": "请验证以更改锁屏设置", "lockScreenEnablePreSteps": "要启用锁屏,请在系统设置中设置设备密码或屏幕锁定。", "viewActiveSessions": "查看活动会话", "authToViewYourActiveSessions": "请验证以查看您的活动会话", - "disableTwofactor": "禁用双因素认证", - "confirm2FADisable": "您确定要禁用双因素认证吗?", + "disableTwofactor": "禁用双重认证", + "confirm2FADisable": "您确定要禁用双重认证吗?", "no": "否", "yes": "是", "social": "社交", @@ -553,11 +554,11 @@ "systemTheme": "适应系统", "freeTrial": "免费试用", "selectYourPlan": "选择您的计划", - "enteSubscriptionPitch": "ente 会保留您的回忆,因此即使您丢失了设备,它们也始终可供您使用。", + "enteSubscriptionPitch": "Ente 会保留您的回忆,因此即使您丢失了设备,也能随时找到它们。", "enteSubscriptionShareWithFamily": "您的家人也可以添加到您的计划中。", "currentUsageIs": "当前用量 ", "@currentUsageIs": { - "description": "This text is followed by storage usaged", + "description": "This text is followed by storage usage", "examples": { "0": "Current usage is 1.2 GB" }, @@ -619,7 +620,7 @@ "appleId": "Apple ID", "playstoreSubscription": "PlayStore 订阅", "appstoreSubscription": "AppStore 订阅", - "subAlreadyLinkedErrMessage": "您的 {id} 已经链接到另一个ente账户。\n如果您想要通过此账户使用您的 {id} ,请联系我们的客服''", + "subAlreadyLinkedErrMessage": "您的 {id} 已链接到另一个 Ente 账户。\n如果您想在此账户中使用您的 {id} ,请联系我们的支持人员", "visitWebToManage": "请访问 web.ente.io 来管理您的订阅", "couldNotUpdateSubscription": "无法升级订阅", "pleaseContactSupportAndWeWillBeHappyToHelp": "请用英语联系 support@ente.io ,我们将乐意提供帮助!", @@ -640,7 +641,7 @@ "thankYou": "非常感谢您", "failedToVerifyPaymentStatus": "验证支付状态失败", "pleaseWaitForSometimeBeforeRetrying": "请稍等片刻后再重试", - "paymentFailedWithReason": "很抱歉,您的支付因 {reason} 而失败", + "paymentFailedMessage": "不幸的是,您的付款失败。请联系支持人员,我们将为您提供帮助!", "youAreOnAFamilyPlan": "你在一个家庭计划中!", "contactFamilyAdmin": "请联系 {familyAdminEmail} 来管理您的订阅", "leaveFamily": "离开家庭计划", @@ -664,9 +665,9 @@ "everywhere": "随时随地", "androidIosWebDesktop": "安卓, iOS, 网页端, 桌面端", "mobileWebDesktop": "移动端, 网页端, 桌面端", - "newToEnte": "刚来到ente", + "newToEnte": "初来 Ente", "pleaseLoginAgain": "请重新登录", - "devAccountChanged": "我们用于在 App Store 上发布 ente 的开发者账户已更改。 因此,您将需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。", + "devAccountChanged": "我们用于在 App Store 上发布 Ente 的开发者账户已更改。因此,您需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。", "yourSubscriptionHasExpired": "您的订阅已过期", "storageLimitExceeded": "已超出存储限制", "upgrade": "升级", @@ -677,12 +678,12 @@ }, "backupFailed": "备份失败", "couldNotBackUpTryLater": "我们无法备份您的数据。\n我们将稍后再试。", - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "只有您授予访问权限,ente 才能加密和保存文件", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "仅当您授予文件访问权限时,Ente 才能加密和保存文件", "pleaseGrantPermissions": "请授予权限", "grantPermission": "授予权限", - "privateSharing": "私人共享", + "privateSharing": "私人分享", "shareOnlyWithThePeopleYouWant": "仅与您想要的人分享", - "usePublicLinksForPeopleNotOnEnte": "为不在ente 上的人使用公共链接", + "usePublicLinksForPeopleNotOnEnte": "对不在 Ente 上的人使用公开链接", "allowPeopleToAddPhotos": "允许人们添加照片", "shareAnAlbumNow": "立即分享相册", "collectEventPhotos": "收集活动照片", @@ -694,7 +695,7 @@ }, "onDevice": "在设备上", "@onEnte": { - "description": "The text displayed above albums backed up to ente", + "description": "The text displayed above albums backed up to Ente", "type": "text" }, "onEnte": "在 ente 上", @@ -740,7 +741,7 @@ "saveCollage": "保存拼贴", "collageSaved": "拼贴已保存到相册", "collageLayout": "布局", - "addToEnte": "添加到 ente", + "addToEnte": "添加到 Ente", "addToAlbum": "添加到相册", "delete": "删除", "hide": "隐藏", @@ -805,10 +806,10 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "您添加的照片将从相册中移除", "youveNoFilesInThisAlbumThatCanBeDeleted": "您在此相册中没有可以删除的文件", "youDontHaveAnyArchivedItems": "您没有任何存档的项目。", - "ignoredFolderUploadReason": "此相册中的某些文件在上传时被忽略,因为它们之前已从 ente 中删除。", + "ignoredFolderUploadReason": "此相册中的某些文件在上传时会被忽略,因为它们之前已从 Ente 中删除。", "resetIgnoredFiles": "重置忽略的文件", - "deviceFilesAutoUploading": "添加到此设备相册的文件将自动上传到 ente。", - "turnOnBackupForAutoUpload": "打开备份以自动上传添加到此设备文件夹的文件。", + "deviceFilesAutoUploading": "添加到此设备相册的文件将自动上传到 Ente。", + "turnOnBackupForAutoUpload": "打开备份可自动上传添加到此设备文件夹的文件至 Ente。", "noHiddenPhotosOrVideos": "没有隐藏的照片或视频", "toHideAPhotoOrVideo": "隐藏照片或视频", "openTheItem": "• 打开该项目", @@ -885,7 +886,7 @@ "@freeUpSpaceSaving": { "description": "Text to tell user how much space they can free up by deleting items from the device" }, - "freeUpAccessPostDelete": "只要您有有效的订阅,您仍然可以在 ente 上访问 {count, plural, one {it} other {them}}", + "freeUpAccessPostDelete": "只要您有有效的订阅,您仍然可以在 Ente 上访问 {count, plural, one {它} other {它们}}", "@freeUpAccessPostDelete": { "placeholders": { "count": { @@ -903,15 +904,15 @@ "authenticationSuccessful": "验证成功", "incorrectRecoveryKey": "不正确的恢复密钥", "theRecoveryKeyYouEnteredIsIncorrect": "您输入的恢复密钥不正确", - "twofactorAuthenticationSuccessfullyReset": "成功重置双因素认证", + "twofactorAuthenticationSuccessfullyReset": "成功重置双重认证", "pleaseVerifyTheCodeYouHaveEntered": "请验证您输入的代码", "pleaseContactSupportIfTheProblemPersists": "如果问题仍然存在,请联系支持", - "twofactorAuthenticationHasBeenDisabled": "双因素认证已被禁用", + "twofactorAuthenticationHasBeenDisabled": "双重认证已被禁用", "sorryTheCodeYouveEnteredIsIncorrect": "抱歉,您输入的代码不正确", "yourVerificationCodeHasExpired": "您的验证码已过期", "emailChangedTo": "电子邮件已更改为 {newEmail}", "verifying": "正在验证...", - "disablingTwofactorAuthentication": "正在禁用双因素认证...", + "disablingTwofactorAuthentication": "正在禁用双重认证...", "allMemoriesPreserved": "所有回忆都已保存", "loadingGallery": "正在加载图库...", "syncing": "正在同步···", @@ -936,7 +937,7 @@ "renameFile": "重命名文件", "enterFileName": "请输入文件名", "filesDeleted": "文件已删除", - "selectedFilesAreNotOnEnte": "所选文件不在ente上", + "selectedFilesAreNotOnEnte": "所选文件不在 Ente 上", "thisActionCannotBeUndone": "此操作无法撤销", "emptyTrash": "要清空回收站吗?", "permDeleteWarning": "回收站中的所有项目将被永久删除\n\n此操作无法撤消", @@ -945,7 +946,7 @@ "permanentlyDeleteFromDevice": "要从设备中永久删除吗?", "someOfTheFilesYouAreTryingToDeleteAre": "您要删除的部分文件仅在您的设备上可用,且删除后无法恢复", "theyWillBeDeletedFromAllAlbums": "他们将从所有相册中删除。", - "someItemsAreInBothEnteAndYourDevice": "有些项目既在ente 也在您的设备中。", + "someItemsAreInBothEnteAndYourDevice": "有些项目同时存在于 Ente 和您的设备中。", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "所选项目将从所有相册中删除并移动到回收站。", "theseItemsWillBeDeletedFromYourDevice": "这些项目将从您的设备中删除。", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "看起来出了点问题。 请稍后重试。 如果错误仍然存在,请联系我们的支持团队。", @@ -1051,7 +1052,7 @@ }, "setRadius": "设定半径", "familyPlanPortalTitle": "家庭", - "familyPlanOverview": "在您现有的计划中添加 5 名家庭成员而无需支付额外费用。\n\n每个成员都有自己的私人空间,除非共享,否则无法看到彼此的文件。\n\n家庭计划适用于已有付费订阅的客户。\n\n立即订阅以开始使用!", + "familyPlanOverview": "将 5 名家庭成员添加到您现有的计划中,无需支付额外费用。\n\n每个成员都有自己的私人空间,除非共享,否则无法看到彼此的文件。\n\n家庭计划适用于已付费 Ente 订阅的客户。\n\n立即订阅,开始体验!", "androidBiometricHint": "验证身份", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -1129,7 +1130,7 @@ "noAlbumsSharedByYouYet": "您尚未共享任何相册", "sharedWithYou": "已与您共享", "sharedByYou": "您共享的", - "inviteYourFriendsToEnte": "邀请您的好友加入ente", + "inviteYourFriendsToEnte": "邀请您的朋友加入 Ente", "failedToDownloadVideo": "视频下载失败", "hiding": "正在隐藏...", "unhiding": "正在取消隐藏...", @@ -1139,7 +1140,7 @@ "addToHiddenAlbum": "添加到隐藏相册", "moveToHiddenAlbum": "移至隐藏相册", "fileTypes": "文件类型", - "deleteConfirmDialogBody": "此账户已链接到其他 ente 旗下的应用程序(如果您使用任何 ente 旗下的应用程序)。\\n\\n您在所有 ente 旗下的应用程序中上传的数据将被安排删除,并且您的账户将被永久删除。", + "deleteConfirmDialogBody": "此账户已链接到其他 Ente 应用程序(如果您使用任何应用程序)。您在所有 Ente 应用程序中上传的数据将被安排删除,并且您的账户将被永久删除。", "hearUsWhereTitle": "您是如何知道Ente的? (可选的)", "hearUsExplanation": "我们不跟踪应用程序安装情况。如果您告诉我们您是在哪里找到我们的,将会有所帮助!", "viewAddOnButton": "查看附加组件", @@ -1202,5 +1203,13 @@ "descriptions": "描述", "addViewers": "{count, plural, zero {添加查看者} one {添加查看者} other {添加查看者}}", "addCollaborators": "{count, plural, zero {添加协作者} one {添加协作者} other {添加协作者}}", - "longPressAnEmailToVerifyEndToEndEncryption": "长按电子邮件以验证端到端加密。" + "longPressAnEmailToVerifyEndToEndEncryption": "长按电子邮件以验证端到端加密。", + "developerSettingsWarning": "您确定要修改开发者设置吗?", + "developerSettings": "开发者设置", + "serverEndpoint": "服务器端点", + "invalidEndpoint": "端点无效", + "invalidEndpointMessage": "抱歉,您输入的端点无效。请输入有效的端点,然后重试。", + "endpointUpdatedMessage": "端点更新成功", + "customEndpoint": "已连接至 {endpoint}", + "createCollaborativeLink": "创建协作链接" } \ No newline at end of file diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 49dbc01b1..97338f55f 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -189,8 +189,8 @@ Future _init(bool isBackground, {String via = ''}) async { // Start workers asynchronously. No need to wait for them to start Computer.shared().turnOn(workersCount: 4).ignore(); CryptoUtil.init(); - await NetworkClient.instance.init(); await Configuration.instance.init(); + await NetworkClient.instance.init(); await UserService.instance.init(); await EntityService.instance.init(); LocationService.instance.init(preferences); diff --git a/mobile/lib/services/home_widget_service.dart b/mobile/lib/services/home_widget_service.dart index c8082b448..33ef5d2bb 100644 --- a/mobile/lib/services/home_widget_service.dart +++ b/mobile/lib/services/home_widget_service.dart @@ -145,13 +145,7 @@ class HomeWidgetService { } Future countHomeWidgets() async { - return await hw.HomeWidget.getWidgetCount( - name: 'SlideshowWidgetProvider', - androidName: 'SlideshowWidgetProvider', - qualifiedAndroidName: 'io.ente.photos.SlideshowWidgetProvider', - iOSName: 'SlideshowWidget', - ) ?? - 0; + return (await hw.HomeWidget.getInstalledWidgets()).length; } Future clearHomeWidget() async { diff --git a/mobile/lib/services/ignored_files_service.dart b/mobile/lib/services/ignored_files_service.dart index 759acd157..d4a4af9f9 100644 --- a/mobile/lib/services/ignored_files_service.dart +++ b/mobile/lib/services/ignored_files_service.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:logging/logging.dart'; +import "package:photos/core/errors.dart"; import 'package:photos/db/ignored_files_db.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/models/ignored_file.dart'; @@ -47,7 +48,10 @@ class IgnoredFilesService { return false; } - String? getUploadSkipReason(Map idToReasonMap, EnteFile file) { + String? getUploadSkipReason( + Map idToReasonMap, + EnteFile file, + ) { final id = _getIgnoreID(file.localID, file.deviceFolder, file.title); if (id != null && id.isNotEmpty) { return idToReasonMap[id]; @@ -100,6 +104,12 @@ class IgnoredFilesService { for (IgnoredFile iFile in dbResult) { final id = _idForIgnoredFile(iFile); if (id != null) { + if (Platform.isIOS && + iFile.reason == InvalidReason.sourceFileMissing.name) { + // ignoreSourceFileMissing error on iOS as the file fetch from iCloud might have failed, + // but the file might be available later + continue; + } result[id] = iFile.reason; } } diff --git a/mobile/lib/services/local_file_update_service.dart b/mobile/lib/services/local_file_update_service.dart index 591cade67..e00ac6c45 100644 --- a/mobile/lib/services/local_file_update_service.dart +++ b/mobile/lib/services/local_file_update_service.dart @@ -3,6 +3,7 @@ import 'dart:core'; import 'dart:io'; import 'package:logging/logging.dart'; +import "package:photo_manager/photo_manager.dart"; import "package:photos/core/configuration.dart"; import 'package:photos/core/errors.dart'; import 'package:photos/db/file_updation_db.dart'; @@ -25,6 +26,10 @@ class LocalFileUpdateService { late Logger _logger; final String _iosLivePhotoSizeMigrationDone = 'fm_ios_live_photo_check'; final String _doneLivePhotoImport = 'fm_import_ios_live_photo_check'; + final String _androidMissingGPSImportDone = + 'fm_android_missing_gps_import_done'; + final String _androidMissingGPSCheckDone = + 'fm_android_missing_gps_check_done'; static int twoHundredKb = 200 * 1024; final List _oldMigrationKeys = [ 'fm_badCreationTime', @@ -63,6 +68,9 @@ class LocalFileUpdateService { if (!Platform.isAndroid) { await _handleLivePhotosSizedCheck(); } + if (Platform.isAndroid) { + await _androidMissingGPSCheck(); + } } catch (e, s) { _logger.severe('failed to perform migration', e, s); } finally { @@ -385,6 +393,131 @@ class LocalFileUpdateService { await _prefs.setBool(_doneLivePhotoImport, true); } + //#region Android Missing GPS specific methods ### + + Future _androidMissingGPSCheck() async { + if (_prefs.containsKey(_androidMissingGPSCheckDone)) { + return; + } + await _importAndroidBadGPSCandidate(); + // singleRunLimit indicates number of files to check during single + // invocation of this method. The limit act as a crude way to limit the + // resource consumed by the method + const int singleRunLimit = 500; + final localIDsToProcess = + await _fileUpdationDB.getLocalIDsForPotentialReUpload( + singleRunLimit, + FileUpdationDB.androidMissingGPS, + ); + if (localIDsToProcess.isNotEmpty) { + final chunksOf50 = localIDsToProcess.chunks(50); + for (final chunk in chunksOf50) { + final sTime = DateTime.now().microsecondsSinceEpoch; + final List futures = []; + final chunkOf10 = chunk.chunks(10); + for (final smallChunk in chunkOf10) { + futures.add(_checkForMissingGPS(smallChunk)); + } + await Future.wait(futures); + final eTime = DateTime.now().microsecondsSinceEpoch; + final d = Duration(microseconds: eTime - sTime); + _logger.info( + 'Performed missing GPS Location check for ${chunk.length} files ' + 'completed in ${d.inSeconds.toString()} secs', + ); + } + } else { + _logger.info('Completed android missing GPS check'); + await _prefs.setBool(_androidMissingGPSCheckDone, true); + } + } + + Future _checkForMissingGPS(List localIDs) async { + try { + final List localFiles = + await FilesDB.instance.getLocalFiles(localIDs); + final ownerID = Configuration.instance.getUserID()!; + final Set localIDsWithFile = {}; + final Set reuploadCandidate = {}; + final Set processedIDs = {}; + for (EnteFile file in localFiles) { + if (file.localID == null) continue; + // ignore files that are not uploaded or have different owner + if (!file.isUploaded || file.ownerID! != ownerID) { + processedIDs.add(file.localID!); + } + if (file.hasLocation) { + processedIDs.add(file.localID!); + } + } + for (EnteFile enteFile in localFiles) { + try { + if (enteFile.localID == null || + processedIDs.contains(enteFile.localID!)) { + continue; + } + + final localID = enteFile.localID!; + localIDsWithFile.add(localID); + final AssetEntity? entity = await AssetEntity.fromId(localID); + if (entity == null) { + processedIDs.add(localID); + } else { + final latLng = await entity.latlngAsync(); + if ((latLng.longitude ?? 0) == 0 || (latLng.latitude ?? 0) == 0) { + processedIDs.add(localID); + } else { + reuploadCandidate.add(localID); + processedIDs.add(localID); + } + } + } catch (e, s) { + processedIDs.add(enteFile.localID!); + _logger.severe('lat/long check file ${enteFile.toString()}', e, s); + } + } + for (String id in localIDs) { + // if the file with given localID doesn't exist, consider it as done. + if (!localIDsWithFile.contains(id)) { + processedIDs.add(id); + } + } + await FileUpdationDB.instance.insertMultiple( + reuploadCandidate.toList(), + FileUpdationDB.modificationTimeUpdated, + ); + await FileUpdationDB.instance.deleteByLocalIDs( + processedIDs.toList(), + FileUpdationDB.androidMissingGPS, + ); + } catch (e, s) { + _logger.severe('error while checking missing GPS', e, s); + } + } + + Future _importAndroidBadGPSCandidate() async { + if (_prefs.containsKey(_androidMissingGPSImportDone)) { + return; + } + final sTime = DateTime.now().microsecondsSinceEpoch; + _logger.info('importing files without missing GPS'); + final int ownerID = Configuration.instance.getUserID()!; + final fileLocalIDs = + await FilesDB.instance.getLocalFilesBackedUpWithoutLocation(ownerID); + await _fileUpdationDB.insertMultiple( + fileLocalIDs, + FileUpdationDB.androidMissingGPS, + ); + final eTime = DateTime.now().microsecondsSinceEpoch; + final d = Duration(microseconds: eTime - sTime); + _logger.info( + 'importing completed, total files count ${fileLocalIDs.length} and took ${d.inSeconds.toString()} seconds', + ); + await _prefs.setBool(_androidMissingGPSImportDone, true); + } + + //#endregion Android Missing GPS specific methods ### + Future getUploadData(EnteFile file) async { final mediaUploadData = await getUploadDataFromEnteFile(file); // delete the file from app's internal cache if it was copied to app diff --git a/mobile/lib/services/local_sync_service.dart b/mobile/lib/services/local_sync_service.dart index b480661cb..93b3c9437 100644 --- a/mobile/lib/services/local_sync_service.dart +++ b/mobile/lib/services/local_sync_service.dart @@ -20,6 +20,7 @@ import 'package:photos/services/app_lifecycle_service.dart'; import "package:photos/services/ignored_files_service.dart"; import 'package:photos/services/local/local_sync_util.dart'; import "package:photos/utils/debouncer.dart"; +import "package:photos/utils/photo_manager_util.dart"; import 'package:shared_preferences/shared_preferences.dart'; import 'package:sqflite/sqflite.dart'; import 'package:tuple/tuple.dart'; @@ -61,7 +62,7 @@ class LocalSyncService { return; } if (Platform.isAndroid && AppLifecycleService.instance.isForeground) { - final permissionState = await PhotoManager.requestPermissionExtend(); + final permissionState = await requestPhotoMangerPermissions(); if (permissionState != PermissionState.authorized) { _logger.severe( "sync requested with invalid permission", @@ -213,6 +214,11 @@ class LocalSyncService { _logger.warning('Invalid file received for ignoring: $file'); return; } + if (Platform.isIOS && error.reason == InvalidReason.sourceFileMissing) { + // ignoreSourceFileMissing error on iOS as the file fetch from iCloud might have failed, + // but the file might be available later + return; + } final ignored = IgnoredFile( file.localID, file.title, diff --git a/mobile/lib/services/remote_sync_service.dart b/mobile/lib/services/remote_sync_service.dart index 45bf36bab..4c5222758 100644 --- a/mobile/lib/services/remote_sync_service.dart +++ b/mobile/lib/services/remote_sync_service.dart @@ -52,6 +52,15 @@ class RemoteSyncService { bool _isExistingSyncSilent = false; static const kHasSyncedArchiveKey = "has_synced_archive"; + /* This setting is used to maintain a list of local IDs for videos that the user has manually + marked for upload, even if the global video upload setting is currently disabled. + When the global video upload setting is disabled, we typically ignore all video uploads. However, for videos that have been added to this list, we + want to still allow them to be uploaded, despite the global setting being disabled. + + This allows users to queue up videos for upload, and have them successfully upload + even if they later toggle the global video upload setting to disabled. + */ + static const _ignoreBackUpSettingsForIDs_ = "ignoreBackUpSettingsForIDs"; final String _isFirstRemoteSyncDone = "isFirstRemoteSyncDone"; // 28 Sept, 2021 9:03:20 AM IST @@ -170,7 +179,8 @@ class RemoteSyncService { e is NoActiveSubscriptionError || e is WiFiUnavailableError || e is StorageLimitExceededError || - e is SyncStopRequestedError) { + e is SyncStopRequestedError || + e is NoMediaLocationAccessError) { _logger.warning("Error executing remote sync", e, s); rethrow; } else { @@ -188,6 +198,18 @@ class RemoteSyncService { return _prefs.containsKey(_isFirstRemoteSyncDone); } + Future whiteListVideoForUpload(EnteFile file) async { + if (file.fileType == FileType.video && + !_config.shouldBackupVideos() && + file.localID != null) { + final List whitelistedIDs = + _prefs.getStringList(_ignoreBackUpSettingsForIDs_) ?? []; + whitelistedIDs.add(file.localID!); + return _prefs.setStringList(_ignoreBackUpSettingsForIDs_, whitelistedIDs); + } + return false; + } + Future _pullDiff() async { _logger.info("Pulling remote diff"); final isFirstSync = !_collectionsService.hasSyncedCollections(); @@ -523,8 +545,13 @@ class RemoteSyncService { final List filesToBeUploaded = []; int ignoredForUpload = 0; int skippedVideos = 0; + final whitelistedIDs = + (_prefs.getStringList(_ignoreBackUpSettingsForIDs_) ?? []) + .toSet(); for (var file in originalFiles) { - if (shouldRemoveVideos && file.fileType == FileType.video) { + if (shouldRemoveVideos && + (file.fileType == FileType.video && + !whitelistedIDs.contains(file.localID))) { skippedVideos++; continue; } @@ -555,6 +582,7 @@ class RemoteSyncService { final int toBeUploaded = filesToBeUploaded.length + updatedFileIDs.length; if (toBeUploaded > 0) { Bus.instance.fire(SyncStatusUpdate(SyncStatus.preparingForUpload)); + await _uploader.verifyMediaLocationAccess(); await _uploader.checkNetworkForUpload(); // verify if files upload is allowed based on their subscription plan and // storage limit. To avoid creating new endpoint, we are using diff --git a/mobile/lib/services/sync_service.dart b/mobile/lib/services/sync_service.dart index 8de3e3322..057e600df 100644 --- a/mobile/lib/services/sync_service.dart +++ b/mobile/lib/services/sync_service.dart @@ -120,6 +120,14 @@ class SyncService { } on UnauthorizedError { _logger.info("Logging user out"); Bus.instance.fire(TriggerLogoutEvent()); + } on NoMediaLocationAccessError { + _logger.severe("Not uploading due to no media location access"); + Bus.instance.fire( + SyncStatusUpdate( + SyncStatus.error, + error: NoMediaLocationAccessError(), + ), + ); } catch (e) { if (e is DioError) { if (e.type == DioErrorType.connectTimeout || diff --git a/mobile/lib/services/update_service.dart b/mobile/lib/services/update_service.dart index 156f0b6a8..21a2c59bc 100644 --- a/mobile/lib/services/update_service.dart +++ b/mobile/lib/services/update_service.dart @@ -16,7 +16,7 @@ class UpdateService { static final UpdateService instance = UpdateService._privateConstructor(); static const kUpdateAvailableShownTimeKey = "update_available_shown_time_key"; static const changeLogVersionKey = "update_change_log_key"; - static const currentChangeLogVersion = 16; + static const currentChangeLogVersion = 17; LatestVersionInfo? _latestVersion; final _logger = Logger("UpdateService"); diff --git a/mobile/lib/ui/account/email_entry_page.dart b/mobile/lib/ui/account/email_entry_page.dart index 888542f16..143f593ef 100644 --- a/mobile/lib/ui/account/email_entry_page.dart +++ b/mobile/lib/ui/account/email_entry_page.dart @@ -148,7 +148,9 @@ class _EmailEntryPageState extends State { style: Theme.of(context).textTheme.titleMedium, autofillHints: const [AutofillHints.email], decoration: InputDecoration( - fillColor: _emailIsValid ? _validFieldValueColor : null, + fillColor: _emailIsValid + ? _validFieldValueColor + : getEnteColorScheme(context).fillFaint, filled: true, hintText: S.of(context).email, contentPadding: const EdgeInsets.symmetric( @@ -195,8 +197,9 @@ class _EmailEntryPageState extends State { enableSuggestions: true, autofillHints: const [AutofillHints.newPassword], decoration: InputDecoration( - fillColor: - _passwordIsValid ? _validFieldValueColor : null, + fillColor: _passwordIsValid + ? _validFieldValueColor + : getEnteColorScheme(context).fillFaint, filled: true, hintText: S.of(context).password, contentPadding: const EdgeInsets.symmetric( @@ -265,7 +268,7 @@ class _EmailEntryPageState extends State { decoration: InputDecoration( fillColor: _passwordsMatch && _passwordIsValid ? _validFieldValueColor - : null, + : getEnteColorScheme(context).fillFaint, filled: true, hintText: S.of(context).confirmPassword, contentPadding: const EdgeInsets.symmetric( @@ -343,7 +346,7 @@ class _EmailEntryPageState extends State { child: TextFormField( style: Theme.of(context).textTheme.titleMedium, decoration: InputDecoration( - fillColor: null, + fillColor: getEnteColorScheme(context).fillFaint, filled: true, contentPadding: const EdgeInsets.symmetric( horizontal: 16, diff --git a/mobile/lib/ui/account/login_page.dart b/mobile/lib/ui/account/login_page.dart index 546a5f3b9..7d79dc856 100644 --- a/mobile/lib/ui/account/login_page.dart +++ b/mobile/lib/ui/account/login_page.dart @@ -29,18 +29,18 @@ class _LoginPageState extends State { final Logger _logger = Logger('_LoginPageState'); @override - void initState() { + void didChangeDependencies() { + super.didChangeDependencies(); if ((_config.getEmail() ?? '').isNotEmpty) { updateEmail(_config.getEmail()!); } else if (kDebugMode) { updateEmail(const String.fromEnvironment("email")); } - super.initState(); } @override Widget build(BuildContext context) { - final isKeypadOpen = MediaQuery.of(context).viewInsets.bottom > 100; + final isKeypadOpen = MediaQuery.viewInsetsOf(context).bottom > 100; FloatingActionButtonLocation? fabLocation() { if (isKeypadOpen) { @@ -237,7 +237,7 @@ class _LoginPageState extends State { if (_emailIsValid) { _emailInputFieldColor = const Color.fromRGBO(45, 194, 98, 0.2); } else { - _emailInputFieldColor = null; + _emailInputFieldColor = getEnteColorScheme(context).fillFaint; } } } diff --git a/mobile/lib/ui/account/login_pwd_verification_page.dart b/mobile/lib/ui/account/login_pwd_verification_page.dart index 884a5a4c7..ac974c20d 100644 --- a/mobile/lib/ui/account/login_pwd_verification_page.dart +++ b/mobile/lib/ui/account/login_pwd_verification_page.dart @@ -251,6 +251,7 @@ class _LoginPasswordVerificationPageState borderSide: BorderSide.none, borderRadius: BorderRadius.circular(6), ), + fillColor: getEnteColorScheme(context).fillFaint, suffixIcon: _passwordInFocus ? IconButton( icon: Icon( diff --git a/mobile/lib/ui/account/ott_verification_page.dart b/mobile/lib/ui/account/ott_verification_page.dart index 9dee22e16..d03861055 100644 --- a/mobile/lib/ui/account/ott_verification_page.dart +++ b/mobile/lib/ui/account/ott_verification_page.dart @@ -171,6 +171,7 @@ class _OTTVerificationPageState extends State { borderSide: BorderSide.none, borderRadius: BorderRadius.circular(6), ), + fillColor: getEnteColorScheme(context).fillFaint, ), controller: _verificationCodeController, autofocus: false, diff --git a/mobile/lib/ui/account/password_entry_page.dart b/mobile/lib/ui/account/password_entry_page.dart index a5099e333..54b7af850 100644 --- a/mobile/lib/ui/account/password_entry_page.dart +++ b/mobile/lib/ui/account/password_entry_page.dart @@ -12,6 +12,7 @@ import "package:photos/generated/l10n.dart"; import "package:photos/l10n/l10n.dart"; import "package:photos/models/key_gen_result.dart"; import 'package:photos/services/user_service.dart'; +import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/account/recovery_key_page.dart'; import 'package:photos/ui/common/dynamic_fab.dart'; import 'package:photos/ui/common/web_page.dart'; @@ -218,8 +219,9 @@ class _PasswordEntryPageState extends State { child: TextFormField( autofillHints: const [AutofillHints.newPassword], decoration: InputDecoration( - fillColor: - _isPasswordValid ? _validFieldValueColor : null, + fillColor: _isPasswordValid + ? _validFieldValueColor + : getEnteColorScheme(context).fillFaint, filled: true, hintText: S.of(context).password, contentPadding: const EdgeInsets.all(20), @@ -282,7 +284,9 @@ class _PasswordEntryPageState extends State { autofillHints: const [AutofillHints.newPassword], onEditingComplete: () => TextInput.finishAutofillContext(), decoration: InputDecoration( - fillColor: _passwordsMatch ? _validFieldValueColor : null, + fillColor: _passwordsMatch + ? _validFieldValueColor + : getEnteColorScheme(context).fillFaint, filled: true, hintText: S.of(context).confirmPassword, contentPadding: const EdgeInsets.symmetric( diff --git a/mobile/lib/ui/account/password_reentry_page.dart b/mobile/lib/ui/account/password_reentry_page.dart index cfbc30c10..d3f6be564 100644 --- a/mobile/lib/ui/account/password_reentry_page.dart +++ b/mobile/lib/ui/account/password_reentry_page.dart @@ -222,6 +222,7 @@ class _PasswordReentryPageState extends State { decoration: InputDecoration( hintText: S.of(context).enterYourPassword, filled: true, + fillColor: getEnteColorScheme(context).fillFaint, contentPadding: const EdgeInsets.all(20), border: UnderlineInputBorder( borderSide: BorderSide.none, diff --git a/mobile/lib/ui/account/recovery_page.dart b/mobile/lib/ui/account/recovery_page.dart index d5c651f92..4b3d49995 100644 --- a/mobile/lib/ui/account/recovery_page.dart +++ b/mobile/lib/ui/account/recovery_page.dart @@ -103,6 +103,7 @@ class _RecoveryPageState extends State { child: TextFormField( decoration: InputDecoration( filled: true, + fillColor: getEnteColorScheme(context).fillFaint, hintText: S.of(context).enterYourRecoveryKey, contentPadding: const EdgeInsets.all(20), border: UnderlineInputBorder( diff --git a/mobile/lib/ui/account/request_pwd_verification_page.dart b/mobile/lib/ui/account/request_pwd_verification_page.dart index 9da169dea..e29d56886 100644 --- a/mobile/lib/ui/account/request_pwd_verification_page.dart +++ b/mobile/lib/ui/account/request_pwd_verification_page.dart @@ -174,6 +174,7 @@ class _RequestPasswordVerificationPageState decoration: InputDecoration( hintText: context.l10n.enterYourPassword, filled: true, + fillColor: getEnteColorScheme(context).fillFaint, contentPadding: const EdgeInsets.all(20), border: UnderlineInputBorder( borderSide: BorderSide.none, diff --git a/mobile/lib/ui/account/verify_recovery_page.dart b/mobile/lib/ui/account/verify_recovery_page.dart index 063d5f4b1..f4acc4738 100644 --- a/mobile/lib/ui/account/verify_recovery_page.dart +++ b/mobile/lib/ui/account/verify_recovery_page.dart @@ -11,6 +11,7 @@ import "package:photos/generated/l10n.dart"; import 'package:photos/services/local_authentication_service.dart'; import 'package:photos/services/user_remote_flag_service.dart'; import 'package:photos/services/user_service.dart'; +import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/account/recovery_key_page.dart'; import 'package:photos/ui/common/gradient_button.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; @@ -162,6 +163,7 @@ class _VerifyRecoveryPageState extends State { TextFormField( decoration: InputDecoration( filled: true, + fillColor: getEnteColorScheme(context).fillFaint, hintText: S.of(context).enterYourRecoveryKey, contentPadding: const EdgeInsets.all(20), border: UnderlineInputBorder( diff --git a/mobile/lib/ui/components/home_header_widget.dart b/mobile/lib/ui/components/home_header_widget.dart index 6fb8f0f6d..7f2519a19 100644 --- a/mobile/lib/ui/components/home_header_widget.dart +++ b/mobile/lib/ui/components/home_header_widget.dart @@ -10,6 +10,7 @@ import 'package:photos/ui/components/buttons/icon_button_widget.dart'; import "package:photos/ui/settings/backup/backup_folder_selection_page.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/photo_manager_util.dart"; class HomeHeaderWidget extends StatefulWidget { final Widget centerWidget; @@ -48,7 +49,7 @@ class _HomeHeaderWidgetState extends State { onTap: () async { try { final PermissionState state = - await PhotoManager.requestPermissionExtend(); + await requestPhotoMangerPermissions(); await LocalSyncService.instance.onUpdatePermission(state); } on Exception catch (e) { Logger("HomeHeaderWidget").severe( diff --git a/mobile/lib/ui/components/toggle_switch_widget.dart b/mobile/lib/ui/components/toggle_switch_widget.dart index 33477ae9b..de6507c1f 100644 --- a/mobile/lib/ui/components/toggle_switch_widget.dart +++ b/mobile/lib/ui/components/toggle_switch_widget.dart @@ -1,3 +1,6 @@ +import "dart:io"; + +import "package:flutter/cupertino.dart"; import 'package:flutter/material.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/models/execution_states.dart'; @@ -25,8 +28,8 @@ class _ToggleSwitchWidgetState extends State { @override void initState() { - toggleValue = widget.value.call(); super.initState(); + toggleValue = widget.value.call(); } @override @@ -49,54 +52,23 @@ class _ToggleSwitchWidgetState extends State { height: 31, child: FittedBox( fit: BoxFit.contain, - child: Switch.adaptive( - activeColor: enteColorScheme.primary400, - inactiveTrackColor: enteColorScheme.fillMuted, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - value: toggleValue ?? false, - onChanged: (negationOfToggleValue) async { - setState(() { - toggleValue = negationOfToggleValue; - //start showing inProgress statu icons if toggle takes more than debounce time - _debouncer.run( - () => Future( - () { - setState(() { - executionState = ExecutionState.inProgress; - }); - }, + child: Platform.isAndroid + ? Switch( + inactiveTrackColor: Colors.transparent, + activeTrackColor: enteColorScheme.primary500, + activeColor: Colors.white, + inactiveThumbColor: enteColorScheme.primary500, + trackOutlineColor: MaterialStateColor.resolveWith( + (states) => enteColorScheme.primary500, ), - ); - }); - final Stopwatch stopwatch = Stopwatch()..start(); - await widget.onChanged.call().onError( - (error, stackTrace) => _debouncer.cancelDebounce(), - ); - //for toggle feedback on short unsuccessful onChanged - await _feedbackOnUnsuccessfulToggle(stopwatch); - //debouncer gets canceled if onChanged takes less than debounce time - _debouncer.cancelDebounce(); - - final newValue = widget.value.call(); - setState(() { - if (toggleValue == newValue) { - if (executionState == ExecutionState.inProgress) { - executionState = ExecutionState.successful; - Future.delayed(const Duration(seconds: 2), () { - if (mounted) { - setState(() { - executionState = ExecutionState.idle; - }); - } - }); - } - } else { - toggleValue = !toggleValue!; - executionState = ExecutionState.idle; - } - }); - }, - ), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + value: toggleValue ?? false, + onChanged: _onChanged, + ) + : CupertinoSwitch( + value: toggleValue ?? false, + onChanged: _onChanged, + ), ), ), ], @@ -132,4 +104,47 @@ class _ToggleSwitchWidgetState extends State { ); } } + + Future _onChanged(bool negationOfToggleValue) async { + setState(() { + toggleValue = negationOfToggleValue; + //start showing inProgress statu icons if toggle takes more than debounce time + _debouncer.run( + () => Future( + () { + setState(() { + executionState = ExecutionState.inProgress; + }); + }, + ), + ); + }); + final Stopwatch stopwatch = Stopwatch()..start(); + await widget.onChanged.call().onError( + (error, stackTrace) => _debouncer.cancelDebounce(), + ); + //for toggle feedback on short unsuccessful onChanged + await _feedbackOnUnsuccessfulToggle(stopwatch); + //debouncer gets canceled if onChanged takes less than debounce time + _debouncer.cancelDebounce(); + + final newValue = widget.value.call(); + setState(() { + if (toggleValue == newValue) { + if (executionState == ExecutionState.inProgress) { + executionState = ExecutionState.successful; + Future.delayed(const Duration(seconds: 2), () { + if (mounted) { + setState(() { + executionState = ExecutionState.idle; + }); + } + }); + } + } else { + toggleValue = !toggleValue!; + executionState = ExecutionState.idle; + } + }); + } } diff --git a/mobile/lib/ui/home/grant_permissions_widget.dart b/mobile/lib/ui/home/grant_permissions_widget.dart index 29c8e5e1b..ab6aff07b 100644 --- a/mobile/lib/ui/home/grant_permissions_widget.dart +++ b/mobile/lib/ui/home/grant_permissions_widget.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:photo_manager/photo_manager.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/sync_service.dart'; +import "package:photos/utils/photo_manager_util.dart"; import "package:styled_text/styled_text.dart"; class GrantPermissionsWidget extends StatelessWidget { @@ -91,7 +92,7 @@ class GrantPermissionsWidget extends StatelessWidget { key: const ValueKey("grantPermissionButton"), child: Text(S.of(context).grantPermission), onPressed: () async { - final state = await PhotoManager.requestPermissionExtend(); + final state = await requestPhotoMangerPermissions(); if (state == PermissionState.authorized || state == PermissionState.limited) { await SyncService.instance.onPermissionGranted(state); diff --git a/mobile/lib/ui/home/home_gallery_widget.dart b/mobile/lib/ui/home/home_gallery_widget.dart index 66556213b..195eb7b95 100644 --- a/mobile/lib/ui/home/home_gallery_widget.dart +++ b/mobile/lib/ui/home/home_gallery_widget.dart @@ -46,7 +46,6 @@ class HomeGalleryWidget extends StatelessWidget { result = await FilesDB.instance.getAllLocalAndUploadedFiles( creationStartTime, creationEndTime, - ownerID!, limit: limit, asc: asc, filterOptions: filterOptions, diff --git a/mobile/lib/ui/home/landing_page_widget.dart b/mobile/lib/ui/home/landing_page_widget.dart index 119610ffa..11f043b8b 100644 --- a/mobile/lib/ui/home/landing_page_widget.dart +++ b/mobile/lib/ui/home/landing_page_widget.dart @@ -19,7 +19,10 @@ import 'package:photos/ui/components/buttons/button_widget.dart'; import 'package:photos/ui/components/dialog_widget.dart'; import 'package:photos/ui/components/models/button_type.dart'; import 'package:photos/ui/payment/subscription.dart'; +import "package:photos/ui/settings/developer_settings_page.dart"; +import "package:photos/ui/settings/developer_settings_widget.dart"; import "package:photos/ui/settings/language_picker.dart"; +import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; class LandingPageWidget extends StatefulWidget { @@ -30,7 +33,10 @@ class LandingPageWidget extends StatefulWidget { } class _LandingPageWidgetState extends State { + static const kDeveloperModeTapCountThreshold = 7; + double _featureIndex = 0; + int _developerModeTapCount = 0; @override void initState() { @@ -40,7 +46,35 @@ class _LandingPageWidgetState extends State { @override Widget build(BuildContext context) { - return Scaffold(body: _getBody(), resizeToAvoidBottomInset: false); + return Scaffold( + body: GestureDetector( + onTap: () async { + _developerModeTapCount++; + if (_developerModeTapCount >= kDeveloperModeTapCountThreshold) { + _developerModeTapCount = 0; + final result = await showChoiceDialog( + context, + title: S.of(context).developerSettings, + firstButtonLabel: S.of(context).yes, + body: S.of(context).developerSettingsWarning, + isDismissible: false, + ); + if (result?.action == ButtonAction.first) { + await Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return const DeveloperSettingsPage(); + }, + ), + ); + setState(() {}); + } + } + }, + child: _getBody(), + ), + resizeToAvoidBottomInset: false, + ); } Widget _getBody() { @@ -131,6 +165,9 @@ class _LandingPageWidgetState extends State { ), ), ), + // const DeveloperSettingsWidget() does not refresh when the endpoint is changed + // ignore: prefer_const_constructors + DeveloperSettingsWidget(), const Padding( padding: EdgeInsets.all(20), ), @@ -195,7 +232,9 @@ class _LandingPageWidgetState extends State { // No key if (Configuration.instance.getKeyAttributes() == null) { // Never had a key - page = const PasswordEntryPage(mode: PasswordEntryMode.set,); + page = const PasswordEntryPage( + mode: PasswordEntryMode.set, + ); } else if (Configuration.instance.getKey() == null) { // Yet to decrypt the key page = const PasswordReentryPage(); @@ -223,7 +262,9 @@ class _LandingPageWidgetState extends State { // No key if (Configuration.instance.getKeyAttributes() == null) { // Never had a key - page = const PasswordEntryPage(mode: PasswordEntryMode.set,); + page = const PasswordEntryPage( + mode: PasswordEntryMode.set, + ); } else if (Configuration.instance.getKey() == null) { // Yet to decrypt the key page = const PasswordReentryPage(); diff --git a/mobile/lib/ui/notification/update/change_log_page.dart b/mobile/lib/ui/notification/update/change_log_page.dart index 0160bf550..8cf629cd6 100644 --- a/mobile/lib/ui/notification/update/change_log_page.dart +++ b/mobile/lib/ui/notification/update/change_log_page.dart @@ -128,8 +128,8 @@ class _ChangeLogPageState extends State { ), ChangeLogEntry( "Bug Fixes and Performance Improvements", - 'Many a bugs were squashed in this release.\n' - '\nIf you run into any, please write to team@ente.io, or let us know on Discord! 🙏', + 'Many a bugs were squashed in this release and have improved performance on app start.\n' + '\nIf you run into any bugs, please write to team@ente.io, or let us know on Discord! 🙏', ), ]); diff --git a/mobile/lib/ui/payment/stripe_subscription_page.dart b/mobile/lib/ui/payment/stripe_subscription_page.dart index 8306c3c18..4a04d49d1 100644 --- a/mobile/lib/ui/payment/stripe_subscription_page.dart +++ b/mobile/lib/ui/payment/stripe_subscription_page.dart @@ -610,7 +610,7 @@ class _StripeSubscriptionPageState extends State { storage: _currentSubscription!.storage, price: _currentSubscription!.price, period: _currentSubscription!.period, - isActive: !_hasActiveSubscription, + isActive: _currentSubscription!.isValid(), ), ), ), diff --git a/mobile/lib/ui/settings/developer_settings_page.dart b/mobile/lib/ui/settings/developer_settings_page.dart new file mode 100644 index 000000000..c9f6357f2 --- /dev/null +++ b/mobile/lib/ui/settings/developer_settings_page.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import "package:photos/core/configuration.dart"; +import "package:photos/core/network/network.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/ui/common/gradient_button.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/toast_util.dart"; + +class DeveloperSettingsPage extends StatefulWidget { + const DeveloperSettingsPage({super.key}); + + @override + State createState() => _DeveloperSettingsPageState(); +} + +class _DeveloperSettingsPageState extends State { + final _logger = Logger('DeveloperSettingsPage'); + final _urlController = TextEditingController(); + + @override + void dispose() { + _urlController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _logger.info( + "Current endpoint is: ${Configuration.instance.getHttpEndpoint()}", + ); + return Scaffold( + appBar: AppBar( + title: Text(S.of(context).developerSettings), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + TextField( + controller: _urlController, + decoration: InputDecoration( + labelText: S.of(context).serverEndpoint, + hintText: Configuration.instance.getHttpEndpoint(), + ), + autofocus: true, + ), + const SizedBox(height: 40), + GradientButton( + onTap: () async { + final url = _urlController.text; + _logger.info("Entered endpoint: $url"); + try { + final uri = Uri.parse(url); + if ((uri.scheme == "http" || uri.scheme == "https")) { + await _ping(url); + await Configuration.instance.setHttpEndpoint(url); + showToast(context, S.of(context).endpointUpdatedMessage); + Navigator.of(context).pop(); + } else { + throw const FormatException(); + } + } catch (e) { + // ignore: unawaited_futures + showErrorDialog( + context, + S.of(context).invalidEndpoint, + S.of(context).invalidEndpointMessage, + ); + } + }, + text: S.of(context).save, + ), + ], + ), + ), + ); + } + + Future _ping(String endpoint) async { + try { + final response = + await NetworkClient.instance.getDio().get('$endpoint/ping'); + if (response.data['message'] != 'pong') { + throw Exception('Invalid response'); + } + } catch (e) { + throw Exception('Error occurred: $e'); + } + } +} diff --git a/mobile/lib/ui/settings/developer_settings_widget.dart b/mobile/lib/ui/settings/developer_settings_widget.dart new file mode 100644 index 000000000..b77d647c6 --- /dev/null +++ b/mobile/lib/ui/settings/developer_settings_widget.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import "package:photos/core/configuration.dart"; +import "package:photos/core/constants.dart"; +import "package:photos/generated/l10n.dart"; + +class DeveloperSettingsWidget extends StatelessWidget { + const DeveloperSettingsWidget({super.key}); + + @override + Widget build(BuildContext context) { + final endpoint = Configuration.instance.getHttpEndpoint(); + if (endpoint != kDefaultProductionEndpoint) { + final endpointURI = Uri.parse(endpoint); + return Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Text( + S + .of(context) + .customEndpoint("${endpointURI.host}:${endpointURI.port}"), + style: Theme.of(context).textTheme.bodySmall, + ), + ); + } else { + return const SizedBox.shrink(); + } + } +} diff --git a/mobile/lib/ui/settings_page.dart b/mobile/lib/ui/settings_page.dart index 85ce16afb..51db27595 100644 --- a/mobile/lib/ui/settings_page.dart +++ b/mobile/lib/ui/settings_page.dart @@ -18,6 +18,7 @@ import 'package:photos/ui/settings/account_section_widget.dart'; import 'package:photos/ui/settings/app_version_widget.dart'; import 'package:photos/ui/settings/backup/backup_section_widget.dart'; import 'package:photos/ui/settings/debug_section_widget.dart'; +import "package:photos/ui/settings/developer_settings_widget.dart"; import 'package:photos/ui/settings/general_section_widget.dart'; import 'package:photos/ui/settings/inherited_settings_state.dart'; import 'package:photos/ui/settings/security_section_widget.dart'; @@ -144,6 +145,7 @@ class SettingsPage extends StatelessWidget { contents.addAll([sectionSpacing, const DebugSectionWidget()]); } contents.add(const AppVersionWidget()); + contents.add(const DeveloperSettingsWidget()); contents.add( const Padding( padding: EdgeInsets.only(bottom: 60), diff --git a/mobile/lib/ui/sharing/share_collection_page.dart b/mobile/lib/ui/sharing/share_collection_page.dart index 8e515fc68..24e701159 100644 --- a/mobile/lib/ui/sharing/share_collection_page.dart +++ b/mobile/lib/ui/sharing/share_collection_page.dart @@ -260,15 +260,15 @@ class _ShareCollectionPageState extends State { height: 24, ), MenuSectionTitle( - title: S.of(context).collaborativeLink, + title: S.of(context).collectPhotos, iconData: Icons.public, ), MenuItemWidget( captionedTextWidget: CaptionedTextWidget( - title: S.of(context).collectPhotos, + title: S.of(context).createCollaborativeLink, makeTextBold: true, ), - leadingIcon: Icons.download_sharp, + leadingIcon: Icons.people_alt_outlined, menuItemColor: getEnteColorScheme(context).fillFaint, showOnlyLoadingState: true, onTap: () async { diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index 1cc8ad754..802b40be8 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -80,7 +80,6 @@ class _HomeWidgetState extends State { final _logger = Logger("HomeWidgetState"); final _selectedFiles = SelectedFiles(); - final GlobalKey shareButtonKey = GlobalKey(); final PageController _pageController = PageController(); int _selectedTabIndex = 0; @@ -285,7 +284,7 @@ class _HomeWidgetState extends State { void _initMediaShareSubscription() { // For sharing images coming from outside the app while the app is in the memory _intentDataStreamSubscription = - ReceiveSharingIntent.getMediaStream().listen( + ReceiveSharingIntent.instance.getMediaStream().listen( (List value) { setState(() { _shouldRenderCreateCollectionSheet = true; @@ -297,7 +296,9 @@ class _HomeWidgetState extends State { }, ); // For sharing images coming from outside the app while the app is closed - ReceiveSharingIntent.getInitialMedia().then((List value) { + ReceiveSharingIntent.instance + .getInitialMedia() + .then((List value) { if (mounted) { setState(() { _sharedFiles = value; @@ -381,7 +382,7 @@ class _HomeWidgetState extends State { //So to stop showing multiple CreateCollectionSheets, this flag //needs to be set to false the first time it is rendered. _shouldRenderCreateCollectionSheet = false; - ReceiveSharingIntent.reset(); + ReceiveSharingIntent.instance.reset(); Future.delayed(const Duration(milliseconds: 10), () { showCollectionActionSheet( context, diff --git a/mobile/lib/ui/viewer/file/detail_page.dart b/mobile/lib/ui/viewer/file/detail_page.dart index 779243c27..4368590ea 100644 --- a/mobile/lib/ui/viewer/file/detail_page.dart +++ b/mobile/lib/ui/viewer/file/detail_page.dart @@ -140,6 +140,7 @@ class _DetailPageState extends State { ), extendBodyBehindAppBar: true, resizeToAvoidBottomInset: false, + backgroundColor: Colors.black, body: Center( child: Stack( children: [ @@ -165,6 +166,7 @@ class _DetailPageState extends State { Widget _buildPageView(BuildContext context) { return PageView.builder( + clipBehavior: Clip.none, itemBuilder: (context, index) { final file = _files![index]; _preloadFiles(index); diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index 0921c88e4..126f3093d 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -133,134 +133,135 @@ class FileAppBarState extends State { ), ); } - actions.add( - PopupMenuButton( - itemBuilder: (context) { - final List items = []; - if (widget.file.isRemoteFile) { - items.add( - PopupMenuItem( - value: 1, - child: Row( - children: [ - Icon( - Platform.isAndroid - ? Icons.download - : CupertinoIcons.cloud_download, - color: Theme.of(context).iconTheme.color, - ), - const Padding( - padding: EdgeInsets.all(8), - ), - Text(S.of(context).download), - ], - ), + + final List items = []; + if (widget.file.isRemoteFile) { + items.add( + PopupMenuItem( + value: 1, + child: Row( + children: [ + Icon( + Platform.isAndroid + ? Icons.download + : CupertinoIcons.cloud_download, + color: Theme.of(context).iconTheme.color, ), - ); - } - // options for files owned by the user - if (isOwnedByUser && !isFileHidden && isFileUploaded) { - final bool isArchived = - widget.file.magicMetadata.visibility == archiveVisibility; - items.add( - PopupMenuItem( - value: 2, - child: Row( - children: [ - Icon( - isArchived ? Icons.unarchive : Icons.archive_outlined, - color: Theme.of(context).iconTheme.color, - ), - const Padding( - padding: EdgeInsets.all(8), - ), - Text( - isArchived - ? S.of(context).unarchive - : S.of(context).archive, - ), - ], - ), + const Padding( + padding: EdgeInsets.all(8), ), - ); - } - if ((widget.file.fileType == FileType.image || - widget.file.fileType == FileType.livePhoto) && - Platform.isAndroid) { - items.add( - PopupMenuItem( - value: 3, - child: Row( - children: [ - Icon( - Icons.wallpaper_outlined, - color: Theme.of(context).iconTheme.color, - ), - const Padding( - padding: EdgeInsets.all(8), - ), - Text(S.of(context).setAs), - ], - ), + Text(S.of(context).download), + ], + ), + ), + ); + } + // options for files owned by the user + if (isOwnedByUser && !isFileHidden && isFileUploaded) { + final bool isArchived = + widget.file.magicMetadata.visibility == archiveVisibility; + items.add( + PopupMenuItem( + value: 2, + child: Row( + children: [ + Icon( + isArchived ? Icons.unarchive : Icons.archive_outlined, + color: Theme.of(context).iconTheme.color, ), - ); - } - if (isOwnedByUser && widget.file.isUploaded) { - if (!isFileHidden) { - items.add( - PopupMenuItem( - value: 4, - child: Row( - children: [ - Icon( - Icons.visibility_off, - color: Theme.of(context).iconTheme.color, - ), - const Padding( - padding: EdgeInsets.all(8), - ), - Text(S.of(context).hide), - ], - ), + const Padding( + padding: EdgeInsets.all(8), + ), + Text( + isArchived ? S.of(context).unarchive : S.of(context).archive, + ), + ], + ), + ), + ); + } + if ((widget.file.fileType == FileType.image || + widget.file.fileType == FileType.livePhoto) && + Platform.isAndroid) { + items.add( + PopupMenuItem( + value: 3, + child: Row( + children: [ + Icon( + Icons.wallpaper_outlined, + color: Theme.of(context).iconTheme.color, + ), + const Padding( + padding: EdgeInsets.all(8), + ), + Text(S.of(context).setAs), + ], + ), + ), + ); + } + if (isOwnedByUser && widget.file.isUploaded) { + if (!isFileHidden) { + items.add( + PopupMenuItem( + value: 4, + child: Row( + children: [ + Icon( + Icons.visibility_off, + color: Theme.of(context).iconTheme.color, ), - ); - } else { - items.add( - PopupMenuItem( - value: 5, - child: Row( - children: [ - Icon( - Icons.visibility, - color: Theme.of(context).iconTheme.color, - ), - const Padding( - padding: EdgeInsets.all(8), - ), - Text(S.of(context).unhide), - ], - ), + const Padding( + padding: EdgeInsets.all(8), ), - ); + Text(S.of(context).hide), + ], + ), + ), + ); + } else { + items.add( + PopupMenuItem( + value: 5, + child: Row( + children: [ + Icon( + Icons.visibility, + color: Theme.of(context).iconTheme.color, + ), + const Padding( + padding: EdgeInsets.all(8), + ), + Text(S.of(context).unhide), + ], + ), + ), + ); + } + } + if (items.isNotEmpty) { + actions.add( + PopupMenuButton( + itemBuilder: (context) { + return items; + }, + onSelected: (dynamic value) async { + if (value == 1) { + await _download(widget.file); + } else if (value == 2) { + await _toggleFileArchiveStatus(widget.file); + } else if (value == 3) { + await _setAs(widget.file); + } else if (value == 4) { + await _handleHideRequest(context); + } else if (value == 5) { + await _handleUnHideRequest(context); } - } - return items; - }, - onSelected: (dynamic value) async { - if (value == 1) { - await _download(widget.file); - } else if (value == 2) { - await _toggleFileArchiveStatus(widget.file); - } else if (value == 3) { - await _setAs(widget.file); - } else if (value == 4) { - await _handleHideRequest(context); - } else if (value == 5) { - await _handleUnHideRequest(context); - } - }, - ), - ); + }, + ), + ); + } return AppBar( iconTheme: const IconThemeData(color: Colors.white), //same for both themes diff --git a/mobile/lib/ui/viewer/file/zoomable_image.dart b/mobile/lib/ui/viewer/file/zoomable_image.dart index 933ff748a..ff6bceb73 100644 --- a/mobile/lib/ui/viewer/file/zoomable_image.dart +++ b/mobile/lib/ui/viewer/file/zoomable_image.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import "package:flutter_image_compress/flutter_image_compress.dart"; import 'package:logging/logging.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photos/core/cache/thumbnail_in_memory_cache.dart'; @@ -50,6 +51,7 @@ class _ZoomableImageState extends State { bool _loadedLargeThumbnail = false; bool _loadingFinalImage = false; bool _loadedFinalImage = false; + bool _convertToSupportedFormat = false; ValueChanged? _scaleStateChangedCallback; bool _isZooming = false; PhotoViewController _photoViewController = PhotoViewController(); @@ -57,6 +59,7 @@ class _ZoomableImageState extends State { @override void initState() { + super.initState(); _photo = widget.photo; _logger = Logger("ZoomableImage"); _logger.info('initState for ${_photo.generatedID} with tag ${_photo.tag}'); @@ -68,7 +71,6 @@ class _ZoomableImageState extends State { debugPrint("isZooming = $_isZooming, currentState $value"); // _logger.info('is reakky zooming $_isZooming with state $value'); }; - super.initState(); } @override @@ -133,7 +135,9 @@ class _ZoomableImageState extends State { height: screenRelativeImageHeight, child: Hero( tag: widget.tagPrefix! + _photo.tag, - child: const EnteLoadingWidget(), + child: const EnteLoadingWidget( + color: Colors.white, + ), ), ), ); @@ -141,7 +145,9 @@ class _ZoomableImageState extends State { ), ); } else { - content = const EnteLoadingWidget(); + content = const EnteLoadingWidget( + color: Colors.white, + ); } final GestureDragUpdateCallback? verticalDragCallback = _isZooming @@ -194,11 +200,8 @@ class _ZoomableImageState extends State { _loadingFinalImage = true; getFileFromServer(_photo).then((file) { if (file != null) { - _onFinalImageLoaded( - Image.file( - file, - gaplessPlayback: true, - ).image, + _onFileLoaded( + file, ); } else { _loadingFinalImage = false; @@ -239,7 +242,9 @@ class _ZoomableImageState extends State { _isGIF(), // since on iOS GIFs playback only when origin-files are loaded ).then((file) { if (file != null && file.existsSync()) { - _onFinalImageLoaded(Image.file(file).image); + _onFileLoaded( + file, + ); } else { _logger.info("File was deleted " + _photo.toString()); if (_photo.uploadedFileID != null) { @@ -277,24 +282,45 @@ class _ZoomableImageState extends State { } } - void _onFinalImageLoaded(ImageProvider imageProvider) { + void _onFileLoaded(File file) { + final imageProvider = Image.file( + file, + gaplessPlayback: true, + ).image; + if (mounted) { - precacheImage(imageProvider, context).then((value) async { - if (mounted) { - await _updatePhotoViewController( - previewImageProvider: _imageProvider, - finalImageProvider: imageProvider, - ); - setState(() { - _imageProvider = imageProvider; - _loadedFinalImage = true; - _logger.info("Final image loaded"); - }); + precacheImage( + imageProvider, + context, + onError: (exception, _) async { + _logger + .info(exception.toString() + ". Filename: ${_photo.displayName}"); + if (exception.toString().contains( + "Codec failed to produce an image, possibly due to invalid image data", + )) { + unawaited(_loadInSupportedFormat(file)); + } + }, + ).then((value) { + if (mounted && !_loadedFinalImage && !_convertToSupportedFormat) { + _updateViewWithFinalImage(imageProvider); } }); } } + Future _updateViewWithFinalImage(ImageProvider imageProvider) async { + await _updatePhotoViewController( + previewImageProvider: _imageProvider, + finalImageProvider: imageProvider, + ); + setState(() { + _imageProvider = imageProvider; + _loadedFinalImage = true; + _logger.info("Final image loaded"); + }); + } + Future _updatePhotoViewController({ required ImageProvider? previewImageProvider, required ImageProvider finalImageProvider, @@ -348,4 +374,28 @@ class _ZoomableImageState extends State { } bool _isGIF() => _photo.displayName.toLowerCase().endsWith(".gif"); + + Future _loadInSupportedFormat(File file) async { + _logger.info("Compressing ${_photo.displayName} to viewable format"); + _convertToSupportedFormat = true; + + final compressedFile = + await FlutterImageCompress.compressWithFile(file.path); + + if (compressedFile != null) { + final imageProvider = MemoryImage(compressedFile); + + unawaited( + precacheImage(imageProvider, context).then((value) { + if (mounted) { + _updateViewWithFinalImage(imageProvider); + } + }), + ); + } else { + _logger.severe( + "Failed to compress image ${_photo.displayName} to viewable format", + ); + } + } } diff --git a/mobile/lib/ui/viewer/file_details/upload_icon_widget.dart b/mobile/lib/ui/viewer/file_details/upload_icon_widget.dart index 1d724d4b7..a0cc47f78 100644 --- a/mobile/lib/ui/viewer/file_details/upload_icon_widget.dart +++ b/mobile/lib/ui/viewer/file_details/upload_icon_widget.dart @@ -125,6 +125,8 @@ class _UpdateIconWidgetState extends State { .id; await FilesDB.instance.insert(widget.file); } + await RemoteSyncService.instance + .whiteListVideoForUpload(widget.file); RemoteSyncService.instance.sync().ignore(); if (mounted) { setState(() { diff --git a/mobile/lib/ui/viewer/gallery/gallery.dart b/mobile/lib/ui/viewer/gallery/gallery.dart index 432587cf2..8213158f9 100644 --- a/mobile/lib/ui/viewer/gallery/gallery.dart +++ b/mobile/lib/ui/viewer/gallery/gallery.dart @@ -108,6 +108,7 @@ class GalleryState extends State { @override void initState() { + super.initState(); _logTag = "Gallery_${widget.tagPrefix}${kDebugMode ? "_" + widget.albumName! : ""}"; _logger = Logger(_logTag); @@ -172,7 +173,6 @@ class GalleryState extends State { _setFilesAndReload(result.files); } }); - super.initState(); } void _setFilesAndReload(List files) { diff --git a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart index 539cbc182..1026bd7fd 100644 --- a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart +++ b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart @@ -86,7 +86,6 @@ class _GalleryAppBarWidgetState extends State { late Function() _selectedFilesListener; String? _appBarTitle; late CollectionActions collectionActions; - final GlobalKey shareButtonKey = GlobalKey(); bool isQuickLink = false; late bool isInternalUser; late GalleryType galleryType; diff --git a/mobile/lib/ui/viewer/gallery/hooks/add_photos_sheet.dart b/mobile/lib/ui/viewer/gallery/hooks/add_photos_sheet.dart index 0f2510d74..0ccdc93e1 100644 --- a/mobile/lib/ui/viewer/gallery/hooks/add_photos_sheet.dart +++ b/mobile/lib/ui/viewer/gallery/hooks/add_photos_sheet.dart @@ -2,6 +2,7 @@ import "dart:math"; import "package:flutter/foundation.dart"; import "package:flutter/material.dart"; +import "package:flutter_animate/flutter_animate.dart"; import "package:modal_bottom_sheet/modal_bottom_sheet.dart"; import "package:photos/core/configuration.dart"; import "package:photos/db/files_db.dart"; @@ -15,12 +16,14 @@ import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/actions/collection/collection_file_actions.dart"; import "package:photos/ui/actions/collection/collection_sharing_actions.dart"; +import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/components/bottom_of_title_bar_widget.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/viewer/gallery/gallery.dart"; import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/photo_manager_util.dart"; import 'package:wechat_assets_picker/wechat_assets_picker.dart'; Future showAddPhotosSheet( @@ -90,33 +93,9 @@ class AddPhotosPhotoWidget extends StatelessWidget { showCloseButton: true, ), Expanded( - child: Gallery( - inSelectionMode: true, - asyncLoader: ( - creationStartTime, - creationEndTime, { - limit, - asc, - }) { - return FilesDB.instance - .getAllPendingOrUploadedFiles( - creationStartTime, - creationEndTime, - Configuration.instance.getUserID()!, - limit: limit, - asc: asc, - filterOptions: DBFilterOptions( - hideIgnoredForUpload: true, - dedupeUploadID: true, - ignoredCollectionIDs: hiddenCollectionIDs, - ), - applyOwnerCheck: true, - ); - }, - tagPrefix: "pick_add_photos_gallery", + child: DelayedGallery( + hiddenCollectionIDs: hiddenCollectionIDs, selectedFiles: selectedFiles, - showSelectAllByDefault: true, - sortAsyncFn: () => false, ), ), ], @@ -203,7 +182,7 @@ class AddPhotosPhotoWidget extends StatelessWidget { } } catch (e) { if (e is StateError) { - final PermissionState ps = await PhotoManager.requestPermissionExtend(); + final PermissionState ps = await requestPhotoMangerPermissions(); if (ps != PermissionState.authorized && ps != PermissionState.limited) { await showChoiceDialog( context, @@ -226,3 +205,71 @@ class AddPhotosPhotoWidget extends StatelessWidget { } } } + +class DelayedGallery extends StatefulWidget { + const DelayedGallery({ + super.key, + required this.hiddenCollectionIDs, + required this.selectedFiles, + }); + + final Set hiddenCollectionIDs; + final SelectedFiles selectedFiles; + + @override + State createState() => _DelayedGalleryState(); +} + +class _DelayedGalleryState extends State { + bool _showGallery = false; + + @override + void initState() { + super.initState(); + Future.delayed(const Duration(milliseconds: 500), () { + if (mounted) { + setState(() { + _showGallery = true; + }); + } + }); + } + + @override + Widget build(BuildContext context) { + if (_showGallery) { + return Gallery( + inSelectionMode: true, + asyncLoader: ( + creationStartTime, + creationEndTime, { + limit, + asc, + }) { + return FilesDB.instance.getAllPendingOrUploadedFiles( + creationStartTime, + creationEndTime, + Configuration.instance.getUserID()!, + limit: limit, + asc: asc, + filterOptions: DBFilterOptions( + hideIgnoredForUpload: true, + dedupeUploadID: true, + ignoredCollectionIDs: widget.hiddenCollectionIDs, + ), + applyOwnerCheck: true, + ); + }, + tagPrefix: "pick_add_photos_gallery", + selectedFiles: widget.selectedFiles, + showSelectAllByDefault: true, + sortAsyncFn: () => false, + ).animate().fadeIn( + duration: const Duration(milliseconds: 175), + curve: Curves.easeOutCirc, + ); + } else { + return const EnteLoadingWidget(); + } + } +} diff --git a/mobile/lib/ui/viewer/search/search_widget.dart b/mobile/lib/ui/viewer/search/search_widget.dart index c624a78b3..2beaa1ec1 100644 --- a/mobile/lib/ui/viewer/search/search_widget.dart +++ b/mobile/lib/ui/viewer/search/search_widget.dart @@ -142,6 +142,7 @@ class SearchWidgetState extends State { //TODO: Extract string hintText: "Search", filled: true, + fillColor: getEnteColorScheme(context).fillFaint, border: const UnderlineInputBorder( borderSide: BorderSide.none, ), diff --git a/mobile/lib/utils/dialog_util.dart b/mobile/lib/utils/dialog_util.dart index ae4425620..f9bd733ae 100644 --- a/mobile/lib/utils/dialog_util.dart +++ b/mobile/lib/utils/dialog_util.dart @@ -291,7 +291,6 @@ ProgressDialog createProgressDialog( context, type: ProgressDialogType.normal, isDismissible: isDismissible, - barrierColor: Colors.black12, ); dialog.style( message: message, diff --git a/mobile/lib/utils/file_uploader.dart b/mobile/lib/utils/file_uploader.dart index 89a12f147..7c898f985 100644 --- a/mobile/lib/utils/file_uploader.dart +++ b/mobile/lib/utils/file_uploader.dart @@ -9,6 +9,7 @@ import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; +import "package:permission_handler/permission_handler.dart"; import 'package:photos/core/configuration.dart'; import "package:photos/core/constants.dart"; import 'package:photos/core/errors.dart'; @@ -363,6 +364,15 @@ class FileUploader { } } + Future verifyMediaLocationAccess() async { + if (Platform.isAndroid) { + final bool hasPermission = await Permission.accessMediaLocation.isGranted; + if (!hasPermission) { + throw NoMediaLocationAccessError(); + } + } + } + Future forceUpload(EnteFile file, int collectionID) async { _hasInitiatedForceUpload = true; return _tryToUpload(file, collectionID, true); diff --git a/mobile/lib/utils/photo_manager_util.dart b/mobile/lib/utils/photo_manager_util.dart new file mode 100644 index 000000000..273d0b362 --- /dev/null +++ b/mobile/lib/utils/photo_manager_util.dart @@ -0,0 +1,12 @@ +import "package:photo_manager/photo_manager.dart"; + +Future requestPhotoMangerPermissions() { + return PhotoManager.requestPermissionExtend( + requestOption: const PermissionRequestOption( + androidPermission: AndroidPermission( + type: RequestType.common, + mediaLocation: true, + ), + ), + ); +} diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 970383016..766926859 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.0" async: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" url: "https://pub.dev" source: hosted - version: "2.4.8" + version: "2.4.9" build_runner_core: dependency: transitive description: @@ -213,10 +213,10 @@ packages: dependency: transitive description: name: built_value - sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb url: "https://pub.dev" source: hosted - version: "8.9.1" + version: "8.9.2" cached_network_image: dependency: "direct main" description: @@ -814,10 +814,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.0.19" flutter_secure_storage: dependency: "direct main" description: @@ -920,10 +920,10 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "57247f692f35f068cae297549a46a9a097100685c6780fe67177503eea5ed4e5" + sha256: a434911f643466d78462625df76fd9eb13e57348ff43fe1f77bbe909522c67a1 url: "https://pub.dev" source: hosted - version: "2.4.7" + version: "2.5.2" freezed_annotation: dependency: "direct main" description: @@ -980,12 +980,11 @@ packages: home_widget: dependency: "direct main" description: - path: "." - ref: main - resolved-ref: "19b5389186b8b96a0c11c29674cf15cbd7855f6b" - url: "https://github.com/ente-io/FlutterHomeWidget" - source: git - version: "0.4.1" + name: home_widget + sha256: "29565bfee4b32eaf9e7e8b998d504618b779a74b2b1ac62dd4dac7468e66f1a3" + url: "https://pub.dev" + source: hosted + version: "0.5.0" html: dependency: transitive description: @@ -1062,10 +1061,10 @@ packages: dependency: transitive description: name: image_editor_ohos - sha256: "2f6ae408f7879387a64dcac096ad9db0dc5e0985f6106d6f2a9b969c8932b09c" + sha256: aee8fa1490fedbb98583dfaebb4162c295abeb0044e94f2eb2ad52ae419e6f6e url: "https://pub.dev" source: hosted - version: "0.0.5" + version: "0.0.7" image_editor_platform_interface: dependency: transitive description: @@ -1086,10 +1085,10 @@ packages: dependency: transitive description: name: in_app_purchase_android - sha256: "996da8020228658c71eddb30f2a2e723d87d5eef77d8007f9206969605e8f803" + sha256: b9d4ecf70c51ab46222502c050b1535f6249caf9d768c4abd856ea16a18a882d url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.3.3+1" in_app_purchase_platform_interface: dependency: transitive description: @@ -1574,18 +1573,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.4" path_provider_foundation: dependency: transitive description: @@ -1626,6 +1625,54 @@ packages: url: "https://pub.dev" source: hosted version: "1.11.1" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" + url: "https://pub.dev" + source: hosted + version: "11.3.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" + url: "https://pub.dev" + source: hosted + version: "12.0.5" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 + url: "https://pub.dev" + source: hosted + version: "9.4.4" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" + url: "https://pub.dev" + source: hosted + version: "0.1.1" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" + url: "https://pub.dev" + source: hosted + version: "4.2.1" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" petitparser: dependency: transitive description: @@ -1686,10 +1733,10 @@ packages: dependency: "direct main" description: name: pointycastle - sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" + sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333" url: "https://pub.dev" source: hosted - version: "3.7.4" + version: "3.8.0" polylabel: dependency: transitive description: @@ -1766,10 +1813,10 @@ packages: dependency: "direct main" description: name: receive_sharing_intent - sha256: "8fdf5927934041264becf65199ef8057b8b176e879d95ffa0420cd2a6219c0fd" + sha256: fe02f858ac9f8d44d62e1964dadded000bb48dea424085ed280d542a61c4e8ba url: "https://pub.dev" source: hosted - version: "1.6.7" + version: "1.7.0" rxdart: dependency: transitive description: @@ -1846,18 +1893,18 @@ packages: dependency: "direct main" description: name: sentry - sha256: a460aa48568d47140dd0557410b624d344ffb8c05555107ac65035c1097cf1ad + sha256: fe99a06970b909a491b7f89d54c9b5119772e3a48a400308a6e129625b333f5b url: "https://pub.dev" source: hosted - version: "7.18.0" + version: "7.19.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "3d0d1d4e0e407d276ae8128d123263ccbc37e988bae906765efd6f37d544f4c6" + sha256: fc013d4a753447320f62989b1871fdc1f20c77befcc8be3e38774dd7402e7a62 url: "https://pub.dev" source: hosted - version: "7.18.0" + version: "7.19.0" share_plus: dependency: "direct main" description: @@ -1878,18 +1925,18 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_foundation: dependency: transitive description: @@ -2055,6 +2102,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.20" + sqlite_async: + dependency: "direct main" + description: + name: sqlite_async + sha256: b252fd3a53766460b2f240e082517d3bc1cce7682a1550817f0f799d4a7a4087 + url: "https://pub.dev" + source: hosted + version: "0.5.2" stack_trace: dependency: transitive description: @@ -2267,18 +2322,18 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" + sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.2.6" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 + sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_ios: dependency: transitive description: @@ -2356,18 +2411,18 @@ packages: dependency: transitive description: name: video_player_android - sha256: "4dd9b8b86d70d65eecf3dcabfcdfbb9c9115d244d022654aba49a00336d540c2" + sha256: "821cff3446bbde255e8d03c12fe1f9810c69fee2c26c394545b13d824ba63c2e" url: "https://pub.dev" source: hosted - version: "2.4.12" + version: "2.4.13" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: "309e3962795e761be010869bae65c0b0e45b5230c5cee1bec72197ca7db040ed" + sha256: "00c49b1d68071341397cf760b982c1e26ed9232464c8506ee08378a5cca5070d" url: "https://pub.dev" source: hosted - version: "2.5.6" + version: "2.5.7" video_player_platform_interface: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index dee9c6705..060b93d84 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.8.72+592 +version: 0.8.77+597 publish_to: none environment: @@ -91,10 +91,7 @@ dependencies: fluttertoast: ^8.0.6 freezed_annotation: ^2.2.0 google_nav_bar: ^5.0.5 - home_widget: - git: - url: https://github.com/ente-io/FlutterHomeWidget - ref: main + home_widget: ^0.5.0 html_unescape: ^2.0.0 http: ^1.1.0 image: ^4.0.17 @@ -133,13 +130,14 @@ dependencies: path: #dart path_provider: ^2.1.1 pedantic: ^1.9.2 + permission_handler: ^11.0.1 photo_manager: ^3.0.0 photo_view: ^0.14.0 pinput: ^1.2.2 pointycastle: ^3.7.3 provider: ^6.0.0 quiver: ^3.0.1 - receive_sharing_intent: ^1.6.7 + receive_sharing_intent: ^1.7.0 scrollable_positioned_list: ^0.3.5 sentry: ^7.9.0 sentry_flutter: ^7.9.0 @@ -148,7 +146,8 @@ dependencies: sqflite: ^2.3.0 sqflite_migration: ^0.3.0 sqlite3: ^2.1.0 - sqlite3_flutter_libs: ^0.5.19+1 + sqlite3_flutter_libs: ^0.5.20 + sqlite_async: ^0.5.2 step_progress_indicator: ^1.0.2 styled_text: ^7.0.0 syncfusion_flutter_core: ^19.2.49 diff --git a/mobile/scripts/app_init_perf_test.sh b/mobile/scripts/app_init_perf_test.sh new file mode 100755 index 000000000..d9c846917 --- /dev/null +++ b/mobile/scripts/app_init_perf_test.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Make sure to go through app_init_test.dart and +# fill in email and password. +# Specify destination directory for the perf results in perf_driver.dart. +# Specify the report_key of the test in perf_driver.dart. `report_key`` of +# `traceAction`` in app_init_test.dart. + +# On first run, app will start from login page. from second run onwards, +# app will start from home page. --keep-app-running is for starting the +# app from home page instead of logging in on every run. + +export ENDPOINT="https://api.ente.io" + +flutter drive \ + --driver=test_driver/perf_driver.dart \ + --target=integration_test/app_init_test.dart \ + --dart-define=endpoint=$ENDPOINT \ + --profile --flavor independent \ + --no-dds \ + --keep-app-running + +exit $? diff --git a/mobile/gallery_scroll_perf_test.sh b/mobile/scripts/gallery_scroll_perf_test.sh similarity index 78% rename from mobile/gallery_scroll_perf_test.sh rename to mobile/scripts/gallery_scroll_perf_test.sh index 3faee8c2d..bc0b1a400 100755 --- a/mobile/gallery_scroll_perf_test.sh +++ b/mobile/scripts/gallery_scroll_perf_test.sh @@ -3,7 +3,8 @@ # Make sure to go through home_gallery_scroll_test.dart and # fill in email and password. # Specify destination directory for the perf results in perf_driver.dart. - +# Specify the report_key of the test in perf_driver.dart. `report_key`` of +# `traceAction`` in app_init_test.dart. export ENDPOINT="https://api.ente.io" diff --git a/mobile/test_driver/perf_driver.dart b/mobile/test_driver/perf_driver.dart index ecc0bd6b0..c1d6ba169 100644 --- a/mobile/test_driver/perf_driver.dart +++ b/mobile/test_driver/perf_driver.dart @@ -8,13 +8,14 @@ Future main() { responseDataCallback: (data) async { if (data != null) { final timeline = driver.Timeline.fromJson( - data['home_gallery_scrolling_summary'] as Map, + data['*`report_key` of traceAction of integration test*'] + as Map, ); final summary = driver.TimelineSummary.summarize(timeline); await summary.writeTimelineToFile( - 'home_gallery_scrolling_summary', + '*title of file*', pretty: true, includeSummary: true, //Specify destination directory for the timeline files. diff --git a/server/README.md b/server/README.md index 66e17e5bd..10e1d9880 100644 --- a/server/README.md +++ b/server/README.md @@ -97,7 +97,7 @@ Overall, there are [three approaches](RUNNING.md) you can take: * Run without Docker Everything that you might needed to run museum is all in here, since this is the -setup we ourselves use in production. +code we ourselves use in production. > [!TIP] > diff --git a/server/RUNNING.md b/server/RUNNING.md index 132bc7801..9410650e0 100644 --- a/server/RUNNING.md +++ b/server/RUNNING.md @@ -44,6 +44,12 @@ Or interact with the MinIO S3 API Or open the MinIO dashboard at (user: test/password: testtest). +> [!NOTE] +> +> While we've provided a MinIO based Docker compose file to make it easy for +> people to get started, if you're running it in production we recommend using +> an external S3. + > [!NOTE] > > If something seems amiss, ensure that Docker has read access to the parent diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 958054cab..4cbc00612 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -37,7 +37,6 @@ import ( embeddingCtrl "github.com/ente-io/museum/pkg/controller/embedding" "github.com/ente-io/museum/pkg/controller/family" kexCtrl "github.com/ente-io/museum/pkg/controller/kex" - "github.com/ente-io/museum/pkg/controller/locationtag" "github.com/ente-io/museum/pkg/controller/lock" remoteStoreCtrl "github.com/ente-io/museum/pkg/controller/remotestore" "github.com/ente-io/museum/pkg/controller/storagebonus" @@ -50,7 +49,6 @@ import ( "github.com/ente-io/museum/pkg/repo/datacleanup" "github.com/ente-io/museum/pkg/repo/embedding" "github.com/ente-io/museum/pkg/repo/kex" - locationtagRepo "github.com/ente-io/museum/pkg/repo/locationtag" "github.com/ente-io/museum/pkg/repo/passkey" "github.com/ente-io/museum/pkg/repo/remotestore" storageBonusRepo "github.com/ente-io/museum/pkg/repo/storagebonus" @@ -150,7 +148,6 @@ func main() { twoFactorRecoveryRepo := &two_factor_recovery.Repository{Db: db, SecretEncryptionKey: secretEncryptionKeyBytes} billingRepo := &repo.BillingRepository{DB: db} userEntityRepo := &userEntityRepo.Repository{DB: db} - locationTagRepository := &locationtagRepo.Repository{DB: db} authRepo := &authenticatorRepo.Repository{DB: db} remoteStoreRepository := &remotestore.Repository{DB: db} dataCleanupRepository := &datacleanup.Repository{DB: db} @@ -641,13 +638,6 @@ func main() { privateAPI.DELETE("/user-entity/entity", userEntityHandler.DeleteEntity) privateAPI.GET("/user-entity/entity/diff", userEntityHandler.GetDiff) - locationTagController := &locationtag.Controller{Repo: locationTagRepository} - locationTagHandler := &api.LocationTagHandler{Controller: locationTagController} - privateAPI.POST("/locationtag/create", locationTagHandler.Create) - privateAPI.POST("/locationtag/update", locationTagHandler.Update) - privateAPI.DELETE("/locationtag/delete", locationTagHandler.Delete) - privateAPI.GET("/locationtag/diff", locationTagHandler.GetDiff) - authenticatorController := &authenticatorCtrl.Controller{Repo: authRepo} authenticatorHandler := &api.AuthenticatorHandler{Controller: authenticatorController} diff --git a/server/compose.yaml b/server/compose.yaml index 6972fc364..a7d5a2c39 100644 --- a/server/compose.yaml +++ b/server/compose.yaml @@ -17,6 +17,7 @@ services: - custom-logs:/var/logs - ./museum.yaml:/museum.yaml:ro - ./scripts/compose/credentials.yaml:/credentials.yaml:ro + - ./data:/data:ro networks: - internal diff --git a/server/configurations/local.yaml b/server/configurations/local.yaml index 80274df19..bbad3f278 100644 --- a/server/configurations/local.yaml +++ b/server/configurations/local.yaml @@ -76,6 +76,9 @@ db: host: localhost port: 5432 name: ente_db + # You might want to set this to "require" for production + # See https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-PROTECTION + sslmode: disable # These can be specified here, or alternatively provided via the environment # as ENTE_DB_USER and ENTE_DB_PASSWORD. user: @@ -157,8 +160,24 @@ key: jwt: secret: i2DecQmfGreG6q1vBj5tCokhlN41gcfS2cjOs9Po-u8= +# SMTP configuration (optional) +# +# Configure credentials here for sending mails from museum (e.g. OTP emails). +# +# The smtp credentials will be used if the host is specified. Otherwise it will +# try to use the transmail credentials. Ideally, one of smtp or transmail should +# be configured for a production instance. +smtp: + host: + port: + username: + password: + # Zoho Zeptomail config (optional) -# Use case: Sending emails +# +# This is an alternative to the `smtp` configuration for sending emails. If this +# is set (and SMTP credentials are not set), then museum will use the transmail +# SDK for sending emails using Zoho Zeptomail. transmail: # Transmail token # Mail agent: dev @@ -221,6 +240,14 @@ zoho: list-key: topic-ids: +# Listmonk Campaigns config (optional) +# Use case: Sending emails +listmonk: + server-url: + username: + password: + list-ids: + # Various low-level configuration options internal: # If false (the default), then museum will notify the external world of diff --git a/server/ente/locationtag.go b/server/ente/locationtag.go deleted file mode 100644 index 61c191006..000000000 --- a/server/ente/locationtag.go +++ /dev/null @@ -1,59 +0,0 @@ -package ente - -import ( - "database/sql/driver" - "encoding/json" - "github.com/ente-io/stacktrace" - "github.com/google/uuid" -) - -// LocationTag represents a location tag in the system. The location information -// is stored in an encrypted as Attributes -type LocationTag struct { - ID uuid.UUID `json:"id"` - OwnerID int64 `json:"ownerId,omitempty"` - EncryptedKey string `json:"encryptedKey" binding:"required"` - KeyDecryptionNonce string `json:"keyDecryptionNonce" binding:"required"` - Attributes LocationTagAttribute `json:"attributes" binding:"required"` - IsDeleted bool `json:"isDeleted"` - Provider string `json:"provider,omitempty"` - CreatedAt int64 `json:"createdAt,omitempty"` // utc epoch microseconds - UpdatedAt int64 `json:"updatedAt,omitempty"` // utc epoch microseconds -} - -// LocationTagAttribute holds encrypted data about user's location tag. -type LocationTagAttribute struct { - Version int `json:"version,omitempty" binding:"required"` - EncryptedData string `json:"encryptedData,omitempty" binding:"required"` - DecryptionNonce string `json:"decryptionNonce,omitempty" binding:"required"` -} - -// Value implements the driver.Valuer interface. This method -// simply returns the JSON-encoded representation of the struct. -func (la LocationTagAttribute) Value() (driver.Value, error) { - return json.Marshal(la) -} - -// Scan implements the sql.Scanner interface. This method -// simply decodes a JSON-encoded value into the struct fields. -func (la *LocationTagAttribute) Scan(value interface{}) error { - b, ok := value.([]byte) - if !ok { - return stacktrace.NewError("type assertion to []byte failed") - } - return json.Unmarshal(b, &la) -} - -// DeleteLocationTagRequest is request structure for deleting a location tag -type DeleteLocationTagRequest struct { - ID uuid.UUID `json:"id" binding:"required"` - OwnerID int64 // should be populated from req headers -} - -// GetLocationTagDiffRequest is request struct for fetching locationTag changes -type GetLocationTagDiffRequest struct { - // SinceTime *int64. Pointer allows us to pass 0 value otherwise binding fails for zero Value. - SinceTime *int64 `form:"sinceTime" binding:"required"` - Limit int16 `form:"limit" binding:"required"` - OwnerID int64 // should be populated from req headers -} diff --git a/server/ente/userentity/entity.go b/server/ente/userentity/entity.go index 729b69e45..71baa3ae9 100644 --- a/server/ente/userentity/entity.go +++ b/server/ente/userentity/entity.go @@ -8,6 +8,7 @@ type EntityType string const ( Location EntityType = "location" + Person EntityType = "person" ) type EntityKey struct { diff --git a/server/migrations/82_drop_location_tag_table.down.sql b/server/migrations/82_drop_location_tag_table.down.sql new file mode 100644 index 000000000..9f7060a47 --- /dev/null +++ b/server/migrations/82_drop_location_tag_table.down.sql @@ -0,0 +1 @@ +-- no-op diff --git a/server/migrations/82_drop_location_tag_table.up.sql b/server/migrations/82_drop_location_tag_table.up.sql new file mode 100644 index 000000000..096ded0d7 --- /dev/null +++ b/server/migrations/82_drop_location_tag_table.up.sql @@ -0,0 +1,2 @@ +DROP TRIGGER IF EXISTS update_location_tag_updated_at ON location_tag; +DROP TABLE location_tag; diff --git a/server/migrations/83_fix_ott_index.down.sql b/server/migrations/83_fix_ott_index.down.sql new file mode 100644 index 000000000..5eab1e6a2 --- /dev/null +++ b/server/migrations/83_fix_ott_index.down.sql @@ -0,0 +1,9 @@ +BEGIN; +ALTER TABLE + otts DROP CONSTRAINT IF EXISTS unique_otts_emailhash_app_ott; + +ALTER TABLE + otts + ADD + CONSTRAINT unique_otts_emailhash_ott UNIQUE (ott, email_hash); +COMMIT; \ No newline at end of file diff --git a/server/migrations/83_fix_ott_index.up.sql b/server/migrations/83_fix_ott_index.up.sql new file mode 100644 index 000000000..4c9015f85 --- /dev/null +++ b/server/migrations/83_fix_ott_index.up.sql @@ -0,0 +1,9 @@ +BEGIN; +ALTER TABLE + otts DROP CONSTRAINT IF EXISTS unique_otts_emailhash_ott; + +ALTER TABLE + otts + ADD + CONSTRAINT unique_otts_emailhash_app_ott UNIQUE (ott,app, email_hash); +COMMIT; \ No newline at end of file diff --git a/server/pkg/api/locationtag.go b/server/pkg/api/locationtag.go deleted file mode 100644 index ad61b4778..000000000 --- a/server/pkg/api/locationtag.go +++ /dev/null @@ -1,88 +0,0 @@ -package api - -import ( - "fmt" - "net/http" - - "github.com/ente-io/museum/ente" - "github.com/ente-io/museum/pkg/controller/locationtag" - "github.com/ente-io/museum/pkg/utils/auth" - "github.com/ente-io/museum/pkg/utils/handler" - "github.com/ente-io/stacktrace" - "github.com/gin-gonic/gin" -) - -// LocationTagHandler expose request handlers to all location tag requests -type LocationTagHandler struct { - Controller *locationtag.Controller -} - -// Create handler for creating a new location tag -func (h *LocationTagHandler) Create(c *gin.Context) { - var request ente.LocationTag - if err := c.ShouldBindJSON(&request); err != nil { - handler.Error(c, - stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err))) - return - } - request.OwnerID = auth.GetUserID(c.Request.Header) - resp, err := h.Controller.Create(c, request) - if err != nil { - handler.Error(c, stacktrace.Propagate(err, "Failed to create locationTag")) - return - } - c.JSON(http.StatusOK, resp) -} - -// Update handler for updating location tag -func (h *LocationTagHandler) Update(c *gin.Context) { - var request ente.LocationTag - if err := c.ShouldBindJSON(&request); err != nil { - handler.Error(c, - stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err))) - return - } - request.OwnerID = auth.GetUserID(c.Request.Header) - resp, err := h.Controller.Update(c, request) - if err != nil { - handler.Error(c, stacktrace.Propagate(err, "Failed to update locationTag")) - return - } - c.JSON(http.StatusOK, gin.H{"locationTag": resp}) -} - -// Delete handler for deleting location tag -func (h *LocationTagHandler) Delete(c *gin.Context) { - var request ente.DeleteLocationTagRequest - if err := c.ShouldBindJSON(&request); err != nil { - handler.Error(c, - stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err))) - return - } - request.OwnerID = auth.GetUserID(c.Request.Header) - _, err := h.Controller.Delete(c, request) - if err != nil { - handler.Error(c, stacktrace.Propagate(err, "Failed to delete locationTag")) - return - } - c.Status(http.StatusOK) -} - -// GetDiff handler for fetching diff of location tag changes -func (h *LocationTagHandler) GetDiff(c *gin.Context) { - var request ente.GetLocationTagDiffRequest - if err := c.ShouldBindQuery(&request); err != nil { - handler.Error(c, - stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err))) - return - } - request.OwnerID = auth.GetUserID(c.Request.Header) - locationTags, err := h.Controller.GetDiff(c, request) - if err != nil { - handler.Error(c, stacktrace.Propagate(err, "Failed to fetch locationTag diff")) - return - } - c.JSON(http.StatusOK, gin.H{ - "diff": locationTags, - }) -} diff --git a/server/pkg/controller/collection.go b/server/pkg/controller/collection.go index 6e51072ad..15c06fa33 100644 --- a/server/pkg/controller/collection.go +++ b/server/pkg/controller/collection.go @@ -488,6 +488,15 @@ func (c *CollectionController) GetDiffV2(ctx *gin.Context, cID int64, userID int if diff[idx].OwnerID != userID { diff[idx].MagicMetadata = nil } + if diff[idx].Metadata.EncryptedData == "-" && !diff[idx].IsDeleted { + // This indicates that the file is deleted, but we still have a stale entry in the collection + log.WithFields(log.Fields{ + "file_id": diff[idx].ID, + "collection_id": cID, + "updated_at": diff[idx].UpdationTime, + }).Warning("stale collection_file found") + diff[idx].IsDeleted = true + } } return diff, hasMore, nil } diff --git a/server/pkg/controller/embedding/controller.go b/server/pkg/controller/embedding/controller.go index 7f2f5dd80..d6e78209f 100644 --- a/server/pkg/controller/embedding/controller.go +++ b/server/pkg/controller/embedding/controller.go @@ -275,7 +275,9 @@ func (c *Controller) uploadObject(obj ente.EmbeddingObject, key string) (int, er return len(embeddingObj), nil } -var globalFetchSemaphore = make(chan struct{}, 300) +var globalDiffFetchSemaphore = make(chan struct{}, 300) + +var globalFileFetchSemaphore = make(chan struct{}, 400) func (c *Controller) getEmbeddingObjectsParallel(objectKeys []string) ([]ente.EmbeddingObject, error) { var wg sync.WaitGroup @@ -285,10 +287,10 @@ func (c *Controller) getEmbeddingObjectsParallel(objectKeys []string) ([]ente.Em for i, objectKey := range objectKeys { wg.Add(1) - globalFetchSemaphore <- struct{}{} // Acquire from global semaphore + globalDiffFetchSemaphore <- struct{}{} // Acquire from global semaphore go func(i int, objectKey string) { defer wg.Done() - defer func() { <-globalFetchSemaphore }() // Release back to global semaphore + defer func() { <-globalDiffFetchSemaphore }() // Release back to global semaphore obj, err := c.getEmbeddingObject(objectKey, downloader) if err != nil { @@ -322,10 +324,10 @@ func (c *Controller) getEmbeddingObjectsParallelV2(userID int64, dbEmbeddingRows for i, dbEmbeddingRow := range dbEmbeddingRows { wg.Add(1) - globalFetchSemaphore <- struct{}{} // Acquire from global semaphore + globalFileFetchSemaphore <- struct{}{} // Acquire from global semaphore go func(i int, dbEmbeddingRow ente.Embedding) { defer wg.Done() - defer func() { <-globalFetchSemaphore }() // Release back to global semaphore + defer func() { <-globalFileFetchSemaphore }() // Release back to global semaphore objectKey := c.getObjectKey(userID, dbEmbeddingRow.FileID, dbEmbeddingRow.Model) obj, err := c.getEmbeddingObject(objectKey, downloader) if err != nil { @@ -373,8 +375,8 @@ func (c *Controller) _validateGetFileEmbeddingsRequest(ctx *gin.Context, userID if len(req.FileIDs) == 0 { return ente.NewBadRequestWithMessage("fileIDs are required") } - if len(req.FileIDs) > 100 { - return ente.NewBadRequestWithMessage("fileIDs should be less than or equal to 100") + if len(req.FileIDs) > 200 { + return ente.NewBadRequestWithMessage("fileIDs should be less than or equal to 200") } if err := c.AccessCtrl.VerifyFileOwnership(ctx, &access.VerifyFileOwnershipParams{ ActorUserId: userID, diff --git a/server/pkg/controller/locationtag/controller.go b/server/pkg/controller/locationtag/controller.go deleted file mode 100644 index 9b9618117..000000000 --- a/server/pkg/controller/locationtag/controller.go +++ /dev/null @@ -1,31 +0,0 @@ -package locationtag - -import ( - "github.com/ente-io/museum/ente" - "github.com/ente-io/museum/pkg/repo/locationtag" - "github.com/gin-gonic/gin" -) - -// Controller is interface for exposing business logic related to location tags -type Controller struct { - Repo *locationtag.Repository -} - -// Create a new location tag in the system -func (c *Controller) Create(ctx *gin.Context, req ente.LocationTag) (ente.LocationTag, error) { - return c.Repo.Create(ctx, req) -} -func (c *Controller) Update(ctx *gin.Context, req ente.LocationTag) (ente.LocationTag, error) { - // todo: verify ownership before updating - panic("implement me") -} - -// Delete the location tag for the given id and ownerId -func (c *Controller) Delete(ctx *gin.Context, req ente.DeleteLocationTagRequest) (bool, error) { - return c.Repo.Delete(ctx, req.ID.String(), req.OwnerID) -} - -// GetDiff fetches the locationTags which have changed after the specified time -func (c *Controller) GetDiff(ctx *gin.Context, req ente.GetLocationTagDiffRequest) ([]ente.LocationTag, error) { - return c.Repo.GetDiff(ctx, req.OwnerID, *req.SinceTime, req.Limit) -} diff --git a/server/pkg/controller/mailing_lists.go b/server/pkg/controller/mailing_lists.go index 0cd51e54f..239d71c34 100644 --- a/server/pkg/controller/mailing_lists.go +++ b/server/pkg/controller/mailing_lists.go @@ -3,9 +3,10 @@ package controller import ( "fmt" "net/url" + "strconv" "strings" - "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/pkg/external/listmonk" "github.com/ente-io/museum/pkg/external/zoho" "github.com/ente-io/stacktrace" log "github.com/sirupsen/logrus" @@ -21,10 +22,12 @@ import ( // // See also: Syncing emails with Zoho Campaigns type MailingListsController struct { - zohoAccessToken string - zohoListKey string - zohoTopicIds string - zohoCredentials zoho.Credentials + zohoAccessToken string + zohoListKey string + zohoTopicIds string + zohoCredentials zoho.Credentials + listmonkListIDs []int + listmonkCredentials listmonk.Credentials } // Return a new instance of MailingListsController @@ -57,15 +60,28 @@ func NewMailingListsController() *MailingListsController { // we'll use the refresh token to create an access token on demand. zohoAccessToken := viper.GetString("zoho.access_token") + listmonkCredentials := listmonk.Credentials{ + BaseURL: viper.GetString("listmonk.server-url"), + Username: viper.GetString("listmonk.username"), + Password: viper.GetString("listmonk.password"), + } + + // An array of integer values indicating the id of listmonk campaign + // mailing list to which the subscriber needs to added + listmonkListIDs := viper.GetIntSlice("listmonk.list-ids") + return &MailingListsController{ - zohoCredentials: zohoCredentials, - zohoListKey: zohoListKey, - zohoTopicIds: zohoTopicIds, - zohoAccessToken: zohoAccessToken, + zohoCredentials: zohoCredentials, + zohoListKey: zohoListKey, + zohoTopicIds: zohoTopicIds, + zohoAccessToken: zohoAccessToken, + listmonkCredentials: listmonkCredentials, + listmonkListIDs: listmonkListIDs, } } -// Add the given email address to our default Zoho Campaigns list. +// Add the given email address to our default Zoho Campaigns list +// or Listmonk Campaigns List // // It is valid to resubscribe an email that has previously been unsubscribe. // @@ -76,37 +92,72 @@ func NewMailingListsController() *MailingListsController { // the email addresses of our customers in a Zoho Campaign "list", and subscribe // or unsubscribe them to this list. func (c *MailingListsController) Subscribe(email string) error { - if c.shouldSkip() { - return stacktrace.Propagate(ente.ErrNotImplemented, "") + if !(c.shouldSkipZoho()) { + // Need to set "Signup Form Disabled" in the list settings since we use this + // list to keep track of emails that have already been verified. + // + // > You can use this API to add contacts to your mailing lists. For signup + // form enabled mailing lists, the contacts will receive a confirmation + // email. For signup form disabled lists, contacts will be added without + // any confirmations. + // + // https://www.zoho.com/campaigns/help/developers/contact-subscribe.html + err := c.doListActionZoho("listsubscribe", email) + if err != nil { + return stacktrace.Propagate(err, "") + } } - - // Need to set "Signup Form Disabled" in the list settings since we use this - // list to keep track of emails that have already been verified. - // - // > You can use this API to add contacts to your mailing lists. For signup - // form enabled mailing lists, the contacts will receive a confirmation - // email. For signup form disabled lists, contacts will be added without - // any confirmations. - // - // https://www.zoho.com/campaigns/help/developers/contact-subscribe.html - return c.doListAction("listsubscribe", email) + if !(c.shouldSkipListmonk()) { + err := c.listmonkSubscribe(email) + if err != nil { + return stacktrace.Propagate(err, "") + } + } + return nil } -// Unsubscribe the given email address to our default Zoho Campaigns list. +// Unsubscribe the given email address to our default Zoho Campaigns list +// or Listmonk Campaigns List // // See: [Note: Syncing emails with Zoho Campaigns] func (c *MailingListsController) Unsubscribe(email string) error { - if c.shouldSkip() { - return stacktrace.Propagate(ente.ErrNotImplemented, "") + if !(c.shouldSkipZoho()) { + // https://www.zoho.com/campaigns/help/developers/contact-unsubscribe.html + err := c.doListActionZoho("listunsubscribe", email) + if err != nil { + return stacktrace.Propagate(err, "") + } } - - // https://www.zoho.com/campaigns/help/developers/contact-unsubscribe.html - return c.doListAction("listunsubscribe", email) + if !(c.shouldSkipListmonk()) { + err := c.listmonkUnsubscribe(email) + if err != nil { + return stacktrace.Propagate(err, "") + } + } + return nil } -func (c *MailingListsController) shouldSkip() bool { +// shouldSkipZoho() checks if the MailingListsController +// should be skipped due to missing credentials. +func (c *MailingListsController) shouldSkipZoho() bool { if c.zohoCredentials.RefreshToken == "" { - log.Info("Skipping mailing list update because credentials are not configured") + log.Info("Skipping Zoho mailing list update because credentials are not configured") + return true + } + return false +} + +// shouldSkipListmonk() checks if the Listmonk mailing list +// should be skipped due to missing credentials +// listmonklistIDs value. +// +// ListmonkListIDs is an optional field for subscribing an email address +// (user gets added to the default list), +// but is a required field for unsubscribing an email address +func (c *MailingListsController) shouldSkipListmonk() bool { + if c.listmonkCredentials.BaseURL == "" || c.listmonkCredentials.Username == "" || + c.listmonkCredentials.Password == "" || len(c.listmonkListIDs) == 0 { + log.Info("Skipping Listmonk mailing list because credentials are not configured") return true } return false @@ -114,7 +165,7 @@ func (c *MailingListsController) shouldSkip() bool { // Both the listsubscribe and listunsubscribe Zoho Campaigns API endpoints work // similarly, so use this function to keep the common code. -func (c *MailingListsController) doListAction(action string, email string) error { +func (c *MailingListsController) doListActionZoho(action string, email string) error { // Query escape the email so that any pluses get converted to %2B. escapedEmail := url.QueryEscape(email) contactInfo := fmt.Sprintf("{Contact+Email: \"%s\"}", escapedEmail) @@ -158,3 +209,30 @@ func (c *MailingListsController) doListAction(action string, email string) error return stacktrace.Propagate(err, "") } + +// Subscribes an email address to a particular listmonk campaign mailing list +func (c *MailingListsController) listmonkSubscribe(email string) error { + data := map[string]interface{}{ + "email": email, + "lists": c.listmonkListIDs, + } + return listmonk.SendRequest("POST", c.listmonkCredentials.BaseURL+"/api/subscribers", data, + c.listmonkCredentials.Username, c.listmonkCredentials.Password) +} + +// Unsubscribes an email address to a particular listmonk campaign mailing list +func (c *MailingListsController) listmonkUnsubscribe(email string) error { + // Listmonk doesn't provide an endpoint for unsubscribing users + // from a particular list directly via their email + // + // Thus, fetching subscriberID through email address, + // and then calling the endpoint to delete that user + id, err := listmonk.GetSubscriberID(c.listmonkCredentials.BaseURL+"/api/subscribers", + c.listmonkCredentials.Username, c.listmonkCredentials.Password, email) + if err != nil { + stacktrace.Propagate(err, "") + } + + return listmonk.SendRequest("DELETE", c.listmonkCredentials.BaseURL+"/api/subscribers/"+strconv.Itoa(id), + map[string]interface{}{}, c.listmonkCredentials.Username, c.listmonkCredentials.Password) +} diff --git a/server/pkg/controller/user/userauth.go b/server/pkg/controller/user/userauth.go index bbc9942de..087e00194 100644 --- a/server/pkg/controller/user/userauth.go +++ b/server/pkg/controller/user/userauth.go @@ -136,23 +136,24 @@ func (c *UserController) SendEmailOTT(context *gin.Context, email string, client // verifyEmailOtt should be deprecated in favor of verifyEmailOttWithSession once clients are updated. func (c *UserController) verifyEmailOtt(context *gin.Context, email string, ott string) error { ott = strings.TrimSpace(ott) + app := auth.GetApp(context) emailHash, err := crypto.GetHash(email, c.HashingKey) if err != nil { return stacktrace.Propagate(err, "") } - wrongAttempt, err := c.UserAuthRepo.GetMaxWrongAttempts(emailHash) + wrongAttempt, err := c.UserAuthRepo.GetMaxWrongAttempts(emailHash, app) if err != nil { return stacktrace.Propagate(err, "") } if wrongAttempt >= OTTWrongAttemptLimit { - msg := "Too many wrong attempts for ott verification" + msg := fmt.Sprintf("Too many wrong ott verification attemp for app %s", app) go c.DiscordController.NotifyPotentialAbuse(msg) return stacktrace.Propagate(ente.ErrTooManyBadRequest, "User needs to wait before active ott are expired") } - otts, err := c.UserAuthRepo.GetValidOTTs(emailHash, auth.GetApp(context)) - log.Info("Valid otts for " + emailHash + " are " + strings.Join(otts, ",")) + otts, err := c.UserAuthRepo.GetValidOTTs(emailHash, app) + log.Infof("Valid ott (app: %s) for %s are %s", app, emailHash, strings.Join(otts, ",")) if err != nil { return stacktrace.Propagate(err, "") } @@ -166,12 +167,12 @@ func (c *UserController) verifyEmailOtt(context *gin.Context, email string, ott } } if !isValidOTT { - if err = c.UserAuthRepo.RecordWrongAttemptForActiveOtt(emailHash); err != nil { + if err = c.UserAuthRepo.RecordWrongAttemptForActiveOtt(emailHash, app); err != nil { log.WithError(err).Warn("Failed to track wrong attempt") } return stacktrace.Propagate(ente.ErrIncorrectOTT, "") } - err = c.UserAuthRepo.RemoveOTT(emailHash, ott) + err = c.UserAuthRepo.RemoveOTT(emailHash, ott, app) if err != nil { return stacktrace.Propagate(err, "") } diff --git a/server/pkg/external/listmonk/api.go b/server/pkg/external/listmonk/api.go new file mode 100644 index 000000000..338a54c3e --- /dev/null +++ b/server/pkg/external/listmonk/api.go @@ -0,0 +1,118 @@ +package listmonk + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + + "github.com/ente-io/stacktrace" +) + +// Listmonk credentials to interact with the Listmonk API. +// It specifies BaseURL (url of the running listmonk server, +// Listmonk Username and Password. +// Visit https://listmonk.app/ to learn more about running +// Listmonk locally +type Credentials struct { + BaseURL string + Username string + Password string +} + +// GetSubscriberID returns subscriber id of the provided email address, +// else returns an error if email was not found +func GetSubscriberID(endpoint string, username string, password string, subscriberEmail string) (int, error) { + // Struct for the received API response. + // Can define other fields as well that can be + // extracted from response JSON + type SubscriberResponse struct { + Data struct { + Results []struct { + ID int `json:"id"` + } `json:"results"` + } `json:"data"` + } + + // Constructing query parameters + queryParams := url.Values{} + queryParams.Set("query", fmt.Sprintf("subscribers.email = '%s'", subscriberEmail)) + + // Constructing the URL with query parameters + endpointURL, err := url.Parse(endpoint) + if err != nil { + return 0, stacktrace.Propagate(err, "") + } + endpointURL.RawQuery = queryParams.Encode() + + req, err := http.NewRequest("GET", endpointURL.String(), nil) + if err != nil { + return 0, stacktrace.Propagate(err, "") + } + + req.SetBasicAuth(username, password) + + // Sending the HTTP request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return 0, stacktrace.Propagate(err, "") + } + defer resp.Body.Close() + + // Reading the response body + body, err := io.ReadAll(resp.Body) + if err != nil { + return 0, stacktrace.Propagate(err, "") + } + + // Parsing the JSON response + var subscriberResp SubscriberResponse + if err := json.Unmarshal(body, &subscriberResp); err != nil { + return 0, stacktrace.Propagate(err, "") + } + + // Checking if there are any subscribers found + if len(subscriberResp.Data.Results) == 0 { + return 0, stacktrace.Propagate(err, "") + } + + // Extracting the ID from the response + id := subscriberResp.Data.Results[0].ID + + return id, nil +} + +// SendRequest sends a request to the specified Listmonk API endpoint +// with the provided method and data +// after authentication with the provided credentials (username, password) +func SendRequest(method string, url string, data interface{}, username string, password string) error { + jsonData, err := json.Marshal(data) + if err != nil { + return stacktrace.Propagate(err, "") + } + + client := &http.Client{} + req, err := http.NewRequest(method, url, bytes.NewBuffer(jsonData)) + if err != nil { + return stacktrace.Propagate(err, "") + } + + req.SetBasicAuth(username, password) + req.Header.Set("Content-Type", "application/json") + + // Send request + resp, err := client.Do(req) + if err != nil { + return stacktrace.Propagate(err, "") + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return stacktrace.Propagate(err, "") + } + + return nil +} diff --git a/server/pkg/repo/authenticator/entity.go b/server/pkg/repo/authenticator/entity.go index d9a68e84e..056d0043b 100644 --- a/server/pkg/repo/authenticator/entity.go +++ b/server/pkg/repo/authenticator/entity.go @@ -5,6 +5,7 @@ import ( "database/sql" "errors" "fmt" + "github.com/ente-io/museum/ente" model "github.com/ente-io/museum/ente/authenticator" "github.com/ente-io/stacktrace" @@ -43,7 +44,10 @@ func (r *Repository) Get(ctx context.Context, userID int64, id uuid.UUID) (model ) err := row.Scan(&res.ID, &res.UserID, &res.EncryptedData, &res.Header, &res.IsDeleted, &res.CreatedAt, &res.UpdatedAt) if err != nil { - return model.Entity{}, stacktrace.Propagate(err, "failed to getTotpEntry") + if errors.Is(err, sql.ErrNoRows) { + return model.Entity{}, &ente.ErrNotFoundError + } + return model.Entity{}, stacktrace.Propagate(err, "failed to auth entity with id=%s", id) } return res, nil } @@ -70,6 +74,16 @@ func (r *Repository) Update(ctx context.Context, userID int64, req model.UpdateE return stacktrace.Propagate(err, "") } if affected != 1 { + dbEntity, dbEntityErr := r.Get(ctx, userID, req.ID) + if dbEntityErr != nil { + return stacktrace.Propagate(dbEntityErr, fmt.Sprintf("failed to get entity for update with id=%s", req.ID)) + } + if dbEntity.IsDeleted { + return stacktrace.Propagate(ente.NewBadRequestWithMessage("entity is already deleted"), "") + } else if *dbEntity.EncryptedData == req.EncryptedData && *dbEntity.Header == req.Header { + logrus.WithField("id", req.ID).Info("entity is already updated") + return nil + } return stacktrace.Propagate(errors.New("exactly one row should be updated"), "") } return nil diff --git a/server/pkg/repo/locationtag/repository.go b/server/pkg/repo/locationtag/repository.go deleted file mode 100644 index 0373ff6cd..000000000 --- a/server/pkg/repo/locationtag/repository.go +++ /dev/null @@ -1,89 +0,0 @@ -package locationtag - -import ( - "context" - "database/sql" - "fmt" - "github.com/ente-io/museum/ente" - "github.com/ente-io/stacktrace" - "github.com/google/uuid" - "github.com/sirupsen/logrus" -) - -// Repository defines the methods for inserting, updating and retrieving -// locationTag related entities from the underlying repository -type Repository struct { - DB *sql.DB -} - -// Create inserts a new &{ente.LocationTag} entry -func (r *Repository) Create(ctx context.Context, locationTag ente.LocationTag) (ente.LocationTag, error) { - err := r.DB.QueryRow(`INSERT into location_tag( - id, - user_id, - encrypted_key, - key_decryption_nonce, - attributes) VALUES ($1,$2,$3,$4,$5) RETURNING id,created_at,updated_at`, - uuid.New(), //$1 id - locationTag.OwnerID, // $2 user_id - locationTag.EncryptedKey, // $3 encrypted_key - locationTag.KeyDecryptionNonce, // $4 key_decryption_nonce - locationTag.Attributes). // %5 attributes - Scan(&locationTag.ID, &locationTag.CreatedAt, &locationTag.UpdatedAt) - if err != nil { - return ente.LocationTag{}, stacktrace.Propagate(err, "Failed to create locationTag") - } - return locationTag, nil -} - -// GetDiff returns the &{[]ente.LocationTag} which have been added or -// modified after the given sinceTime -func (r *Repository) GetDiff(ctx context.Context, ownerID int64, sinceTime int64, limit int16) ([]ente.LocationTag, error) { - rows, err := r.DB.Query(`SELECT - id, user_id, provider, encrypted_key, key_decryption_nonce, - attributes, is_deleted, created_at, updated_at - FROM location_tag - WHERE user_id = $1 - and updated_at > $2 - ORDER BY updated_at - LIMIT $3`, - ownerID, // $1 - sinceTime, // %2 - limit, // $3 - ) - if err != nil { - return nil, stacktrace.Propagate(err, "GetDiff query failed") - } - return convertRowsToLocationTags(rows) -} - -func (r *Repository) Delete(ctx context.Context, id string, ownerID int64) (bool, error) { - _, err := r.DB.ExecContext(ctx, - `UPDATE location_tag SET is_deleted=$1, attributes=$2 where id=$3 and user_id = $4`, - true, `{}`, // $1 is_deleted, $2 attr - id, ownerID) // $3 tagId, $4 ownerID - if err != nil { - return false, stacktrace.Propagate(err, fmt.Sprintf("faield to delele tag with id=%s", id)) - } - return true, nil -} - -func convertRowsToLocationTags(rows *sql.Rows) ([]ente.LocationTag, error) { - defer func() { - if err := rows.Close(); err != nil { - logrus.Error(err) - } - }() - locationTags := make([]ente.LocationTag, 0) - for rows.Next() { - tag := ente.LocationTag{} - err := rows.Scan( - &tag.ID, &tag.OwnerID, &tag.Provider, &tag.EncryptedKey, &tag.KeyDecryptionNonce, - &tag.Attributes, &tag.IsDeleted, &tag.CreatedAt, &tag.UpdatedAt) - if err != nil { - return nil, stacktrace.Propagate(err, "Failed to convert rowToLocationTag") - } - locationTags = append(locationTags, tag) - } - return locationTags, nil -} diff --git a/server/pkg/repo/userauth.go b/server/pkg/repo/userauth.go index c5f86e8ec..c182e9e87 100644 --- a/server/pkg/repo/userauth.go +++ b/server/pkg/repo/userauth.go @@ -20,14 +20,14 @@ type UserAuthRepository struct { func (repo *UserAuthRepository) AddOTT(emailHash string, app ente.App, ott string, expirationTime int64) error { _, err := repo.DB.Exec(`INSERT INTO otts(email_hash, ott, creation_time, expiration_time, app) VALUES($1, $2, $3, $4, $5) - ON CONFLICT ON CONSTRAINT unique_otts_emailhash_ott DO UPDATE SET creation_time = $3, expiration_time = $4`, + ON CONFLICT ON CONSTRAINT unique_otts_emailhash_app_ott DO UPDATE SET creation_time = $3, expiration_time = $4`, emailHash, ott, time.Microseconds(), expirationTime, app) return stacktrace.Propagate(err, "") } // RemoveOTT removes the specified OTT (to be used when an OTT has been consumed) -func (repo *UserAuthRepository) RemoveOTT(emailHash string, ott string) error { - _, err := repo.DB.Exec(`DELETE FROM otts WHERE email_hash = $1 AND ott = $2`, emailHash, ott) +func (repo *UserAuthRepository) RemoveOTT(emailHash string, ott string, app ente.App) error { + _, err := repo.DB.Exec(`DELETE FROM otts WHERE email_hash = $1 AND ott = $2 AND app = $3`, emailHash, ott, app) return stacktrace.Propagate(err, "") } @@ -69,9 +69,9 @@ func (repo *UserAuthRepository) GetValidOTTs(emailHash string, app ente.App) ([] return otts, nil } -func (repo *UserAuthRepository) GetMaxWrongAttempts(emailHash string) (int, error) { - row := repo.DB.QueryRow(`SELECT COALESCE(MAX(wrong_attempt),0) FROM otts WHERE email_hash = $1 AND expiration_time > $2`, - emailHash, time.Microseconds()) +func (repo *UserAuthRepository) GetMaxWrongAttempts(emailHash string, app ente.App) (int, error) { + row := repo.DB.QueryRow(`SELECT COALESCE(MAX(wrong_attempt),0) FROM otts WHERE email_hash = $1 AND expiration_time > $2 AND app = $3`, + emailHash, time.Microseconds(), app) var wrongAttempt int if err := row.Scan(&wrongAttempt); err != nil { return 0, stacktrace.Propagate(err, "Failed to scan row") @@ -81,9 +81,9 @@ func (repo *UserAuthRepository) GetMaxWrongAttempts(emailHash string) (int, erro // RecordWrongAttemptForActiveOtt increases the wrong_attempt count for given emailHash and active ott. // Assuming tha we keep deleting expired OTT, max(wrong_attempt) can be used to track brute-force attack -func (repo *UserAuthRepository) RecordWrongAttemptForActiveOtt(emailHash string) error { +func (repo *UserAuthRepository) RecordWrongAttemptForActiveOtt(emailHash string, app ente.App) error { _, err := repo.DB.Exec(`UPDATE otts SET wrong_attempt = otts.wrong_attempt + 1 - WHERE email_hash = $1 AND expiration_time > $2`, emailHash, time.Microseconds()) + WHERE email_hash = $1 AND expiration_time > $2 AND app=$3`, emailHash, time.Microseconds(), app) if err != nil { return stacktrace.Propagate(err, "Failed to update wrong attempt count") } diff --git a/server/pkg/utils/config/config.go b/server/pkg/utils/config/config.go index ed0bbb6e3..a12381e45 100644 --- a/server/pkg/utils/config/config.go +++ b/server/pkg/utils/config/config.go @@ -103,12 +103,13 @@ func doesFileExist(path string) (bool, error) { func GetPGInfo() string { return fmt.Sprintf("host=%s port=%d user=%s "+ - "password=%s dbname=%s sslmode=disable", + "password=%s dbname=%s sslmode=%s", viper.GetString("db.host"), viper.GetInt("db.port"), viper.GetString("db.user"), viper.GetString("db.password"), - viper.GetString("db.name")) + viper.GetString("db.name"), + viper.GetString("db.sslmode")) } func IsLocalEnvironment() bool { diff --git a/server/pkg/utils/email/email.go b/server/pkg/utils/email/email.go index 89993882c..46202313e 100644 --- a/server/pkg/utils/email/email.go +++ b/server/pkg/utils/email/email.go @@ -10,6 +10,7 @@ import ( "encoding/json" "html/template" "net/http" + "net/smtp" "strings" "github.com/ente-io/museum/ente" @@ -20,6 +21,78 @@ import ( // Send sends an email func Send(toEmails []string, fromName string, fromEmail string, subject string, htmlBody string, inlineImages []map[string]interface{}) error { + smtpHost := viper.GetString("smtp.host") + if smtpHost != "" { + return sendViaSMTP(toEmails, fromName, fromEmail, subject, htmlBody, inlineImages) + } else { + return sendViaTransmail(toEmails, fromName, fromEmail, subject, htmlBody, inlineImages) + } +} + +func sendViaSMTP(toEmails []string, fromName string, fromEmail string, subject string, htmlBody string, inlineImages []map[string]interface{}) error { + if len(toEmails) == 0 { + return ente.ErrBadRequest + } + + smtpServer := viper.GetString("smtp.host") + smtpPort := viper.GetString("smtp.port") + smtpUsername := viper.GetString("smtp.username") + smtpPassword := viper.GetString("smtp.password") + + var emailMessage string + + // Construct 'emailAddresses' with comma-separated email addresses + var emailAddresses string + for i, email := range toEmails { + if i != 0 { + emailAddresses += "," + } + emailAddresses += email + } + + header := "From: " + fromName + " <" + fromEmail + ">\n" + + "To: " + emailAddresses + "\n" + + "Subject: " + subject + "\n" + + "MIME-Version: 1.0\n" + + "Content-Type: multipart/related; boundary=boundary\n\n" + + "--boundary\n" + htmlContent := "Content-Type: text/html; charset=us-ascii\n\n" + htmlBody + "\n" + + emailMessage = header + htmlContent + + if inlineImages == nil { + emailMessage += "--boundary--" + } else { + for _, inlineImage := range inlineImages { + + emailMessage += "--boundary\n" + var mimeType = inlineImage["mime_type"].(string) + var contentID = inlineImage["cid"].(string) + var imgBase64Str = inlineImage["content"].(string) + + var image = "Content-Type: " + mimeType + "\n" + + "Content-Transfer-Encoding: base64\n" + + "Content-ID: <" + contentID + ">\n" + + "Content-Disposition: inline\n\n" + imgBase64Str + "\n" + + emailMessage += image + } + emailMessage += "--boundary--" + } + + // Send the email to each recipient + for _, toEmail := range toEmails { + auth := smtp.PlainAuth("", smtpUsername, smtpPassword, smtpServer) + err := smtp.SendMail(smtpServer+":"+smtpPort, auth, fromEmail, []string{toEmail}, []byte(emailMessage)) + if err != nil { + return stacktrace.Propagate(err, "") + } + } + + return nil +} + +func sendViaTransmail(toEmails []string, fromName string, fromEmail string, subject string, htmlBody string, inlineImages []map[string]interface{}) error { if len(toEmails) == 0 { return ente.ErrBadRequest } @@ -69,6 +142,7 @@ func SendTemplatedEmail(to []string, fromName string, fromEmail string, subject if err != nil { return stacktrace.Propagate(err, "") } + return Send(to, fromName, fromEmail, subject, body, inlineImages) } diff --git a/server/scripts/deploy/README.md b/server/scripts/deploy/README.md index 35e1ec079..b44f77f64 100644 --- a/server/scripts/deploy/README.md +++ b/server/scripts/deploy/README.md @@ -62,7 +62,7 @@ To bring up an additional museum node: sudo mkdir -p /root/museum/data/billing sudo mv *.json /root/museum/data/billing/ -* If not running behind Nginx, add the TLS credentials (otherwise add the to +* If not running behind Nginx, add the TLS credentials (otherwise add them to Nginx) sudo tee /root/museum/credentials/tls.cert diff --git a/server/scripts/deploy/museum.nginx.conf b/server/scripts/deploy/museum.nginx.conf index 65ed19b49..ad3ee59f1 100644 --- a/server/scripts/deploy/museum.nginx.conf +++ b/server/scripts/deploy/museum.nginx.conf @@ -4,11 +4,15 @@ upstream museum { # https://nginx.org/en/docs/http/ngx_http_upstream_module.html server host.docker.internal:8080 max_conns=50; + + # Keep these many connections alive to upstream (requires HTTP/1.1) + keepalive 20; } server { - listen 443 ssl http2; - listen [::]:443 ssl http2; + listen 443 ssl; + listen [::]:443 ssl; + http2 on; ssl_certificate /etc/ssl/certs/cert.pem; ssl_certificate_key /etc/ssl/private/key.pem; @@ -16,6 +20,8 @@ server { location / { proxy_pass http://museum; + proxy_http_version 1.1; + proxy_set_header Connection ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/web/.gitignore b/web/.gitignore index 0046043bd..68554d3ae 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -8,9 +8,14 @@ node_modules/ .vscode/ # Local env files -.env .env*.local +# tsc +*.tsbuildinfo + +# Vite +dist + # Next.js .next/ out/ diff --git a/web/.prettierignore b/web/.prettierignore index 602eea657..c94d62482 100644 --- a/web/.prettierignore +++ b/web/.prettierignore @@ -1,3 +1,2 @@ thirdparty/ public/ -*.md diff --git a/web/.prettierrc.json b/web/.prettierrc.json index 8b0652597..7cf8c86c7 100644 --- a/web/.prettierrc.json +++ b/web/.prettierrc.json @@ -1,5 +1,6 @@ { "tabWidth": 4, + "proseWrap": "always", "plugins": [ "prettier-plugin-organize-imports", "prettier-plugin-packagejson" diff --git a/web/README.md b/web/README.md index 36eb1fb25..d33c03904 100644 --- a/web/README.md +++ b/web/README.md @@ -4,8 +4,8 @@ Source code for Ente's various web apps and supporting websites. Live versions are at: -* Ente Photos: [web.ente.io](https://web.ente.io) -* Ente Auth: [auth.ente.io](https://auth.ente.io) +- Ente Photos: [web.ente.io](https://web.ente.io) +- Ente Auth: [auth.ente.io](https://auth.ente.io) To know more about Ente, see [our main README](../README.md) or visit [ente.io](https://ente.io). @@ -32,7 +32,7 @@ yarn dev That's it. The web app will automatically hot reload when you make changes. -If you're new to web development and unsure about how to get started, or are +If you're new to web development and unsure about how to get started, or are facing some problems when running the above steps, see [docs/new](docs/new.md). ## Other apps @@ -49,17 +49,17 @@ For more details about development workflows, see [docs/dev](docs/dev.md). As a brief overview, this directory contains the following apps: -* `apps/photos`: A fully functional web client for Ente Photos. -* `apps/auth`: A view only client for Ente Auth. Currently you can only view - your 2FA codes using this web app. For adding and editing your 2FA codes, - please use the Ente Auth [mobile/desktop app](../auth/README.md) instead. +- `apps/photos`: A fully functional web client for Ente Photos. +- `apps/auth`: A view only client for Ente Auth. Currently you can only view + your 2FA codes using this web app. For adding and editing your 2FA codes, + please use the Ente Auth [mobile/desktop app](../auth/README.md) instead. These two are the public facing apps. There are other part of the code which are accessed as features within the main apps, but in terms of code are independently maintained and deployed: -* `apps/accounts`: Passkey support (Coming soon) -* `apps/cast`: Chromecast support (Coming soon) +- `apps/accounts`: Passkey support (Coming soon) +- `apps/cast`: Chromecast support (Coming soon) > [!NOTE] > @@ -81,12 +81,12 @@ City coordinates from [Simple Maps](https://simplemaps.com/data/world-cities) [![Crowdin](https://badges.crowdin.net/ente-photos-web/localized.svg)](https://crowdin.com/project/ente-photos-web) -If you're interested in helping out with translation, please visit our [Crowdin -project](https://crowdin.com/project/ente-photos-web) to get started. Thank you -for your support. +If you're interested in helping out with translation, please visit our +[Crowdin project](https://crowdin.com/project/ente-photos-web) to get started. +Thank you for your support. -If your language is not listed for translation, please [create a GitHub -issue](https://github.com/ente-io/ente/issues/new?title=Request+for+New+Language+Translation&body=Language+name%3A) +If your language is not listed for translation, please +[create a GitHub issue](https://github.com/ente-io/ente/issues/new?title=Request+for+New+Language+Translation&body=Language+name%3A) to have it added. ## Contribute diff --git a/web/apps/accounts/public/favicon.ico b/web/apps/accounts/public/favicon.ico deleted file mode 100644 index 4570eb8d9..000000000 Binary files a/web/apps/accounts/public/favicon.ico and /dev/null differ diff --git a/web/apps/accounts/public/locales/bg-BG/translation.json b/web/apps/accounts/public/locales/bg-BG/translation.json deleted file mode 100644 index 03faf16c2..000000000 --- a/web/apps/accounts/public/locales/bg-BG/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Личен бекъп
на твоите спомени
", - "HERO_SLIDE_1": "Криптиран от край до край по подразбиране", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/de-DE/translation.json b/web/apps/accounts/public/locales/de-DE/translation.json deleted file mode 100644 index 9a1c4073c..000000000 --- a/web/apps/accounts/public/locales/de-DE/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Private Sicherungen
für deine Erinnerungen
", - "HERO_SLIDE_1": "Standardmäßig Ende-zu-Ende verschlüsselt", - "HERO_SLIDE_2_TITLE": "
Sicher gespeichert
in einem Luftschutzbunker
", - "HERO_SLIDE_2": "Entwickelt um zu bewahren", - "HERO_SLIDE_3_TITLE": "
Verfügbar
überall
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Anmelden", - "SIGN_UP": "Registrieren", - "NEW_USER": "Neu bei ente", - "EXISTING_USER": "Existierender Benutzer", - "ENTER_NAME": "Name eingeben", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Füge einen Namen hinzu, damit deine Freunde wissen, wem sie für diese tollen Fotos zu danken haben!", - "ENTER_EMAIL": "E-Mail-Adresse eingeben", - "EMAIL_ERROR": "Geben Sie eine gültige E-Mail-Adresse ein", - "REQUIRED": "Erforderlich", - "EMAIL_SENT": "Bestätigungscode an {{email}} gesendet", - "CHECK_INBOX": "Bitte überprüfe deinen E-Mail-Posteingang (und Spam), um die Verifizierung abzuschließen", - "ENTER_OTT": "Bestätigungscode", - "RESEND_MAIL": "Code erneut senden", - "VERIFY": "Überprüfen", - "UNKNOWN_ERROR": "Ein Fehler ist aufgetreten, bitte versuche es erneut", - "INVALID_CODE": "Falscher Bestätigungscode", - "EXPIRED_CODE": "Ihr Bestätigungscode ist abgelaufen", - "SENDING": "Wird gesendet...", - "SENT": "Gesendet!", - "PASSWORD": "Passwort", - "LINK_PASSWORD": "Passwort zum Entsperren des Albums eingeben", - "RETURN_PASSPHRASE_HINT": "Passwort", - "SET_PASSPHRASE": "Passwort setzen", - "VERIFY_PASSPHRASE": "Einloggen", - "INCORRECT_PASSPHRASE": "Falsches Passwort", - "ENTER_ENC_PASSPHRASE": "Bitte gib ein Passwort ein, mit dem wir deine Daten verschlüsseln können", - "PASSPHRASE_DISCLAIMER": "Wir speichern dein Passwort nicht. Wenn du es vergisst, können wir dir nicht helfen, deine Daten ohne einen Wiederherstellungsschlüssel wiederherzustellen.", - "WELCOME_TO_ENTE_HEADING": "Willkommen bei ", - "WELCOME_TO_ENTE_SUBHEADING": "Ende-zu-Ende verschlüsselte Fotospeicherung und Freigabe", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Wo deine besten Fotos leben", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generierung von Verschlüsselungsschlüsseln...", - "PASSPHRASE_HINT": "Passwort", - "CONFIRM_PASSPHRASE": "Passwort bestätigen", - "REFERRAL_CODE_HINT": "Wie hast du von Ente erfahren? (optional)", - "REFERRAL_INFO": "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!", - "PASSPHRASE_MATCH_ERROR": "Die Passwörter stimmen nicht überein", - "CREATE_COLLECTION": "Neues Album", - "ENTER_ALBUM_NAME": "Albumname", - "CLOSE_OPTION": "Schließen (Esc)", - "ENTER_FILE_NAME": "Dateiname", - "CLOSE": "Schließen", - "NO": "Nein", - "NOTHING_HERE": "Hier gibt es noch nichts zu sehen 👀", - "UPLOAD": "Hochladen", - "IMPORT": "Importieren", - "ADD_PHOTOS": "Fotos hinzufügen", - "ADD_MORE_PHOTOS": "Mehr Fotos hinzufügen", - "add_photos_one": "Eine Datei hinzufügen", - "add_photos_other": "{{count, number}} Dateien hinzufügen", - "SELECT_PHOTOS": "Foto auswählen", - "FILE_UPLOAD": "Datei hochladen", - "UPLOAD_STAGE_MESSAGE": { - "0": "Hochladen wird vorbereitet", - "1": "Lese Google-Metadaten", - "2": "Metadaten von {{uploadCounter.finished, number}} / {{uploadCounter.total, number}} Dateien extrahiert", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} Dateien verarbeitet", - "4": "Verbleibende Uploads werden abgebrochen", - "5": "Sicherung abgeschlossen" - }, - "FILE_NOT_UPLOADED_LIST": "Die folgenden Dateien wurden nicht hochgeladen", - "SUBSCRIPTION_EXPIRED": "Abonnement abgelaufen", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Dein Abonnement ist abgelaufen, bitte erneuere es", - "STORAGE_QUOTA_EXCEEDED": "Speichergrenze überschritten", - "INITIAL_LOAD_DELAY_WARNING": "Das erste Laden kann einige Zeit in Anspruch nehmen", - "USER_DOES_NOT_EXIST": "Leider konnte kein Benutzer mit dieser E-Mail gefunden werden", - "NO_ACCOUNT": "Kein Konto vorhanden", - "ACCOUNT_EXISTS": "Es ist bereits ein Account vorhanden", - "CREATE": "Erstellen", - "DOWNLOAD": "Herunterladen", - "DOWNLOAD_OPTION": "Herunterladen (D)", - "DOWNLOAD_FAVORITES": "Favoriten herunterladen", - "DOWNLOAD_UNCATEGORIZED": "Download unkategorisiert", - "DOWNLOAD_HIDDEN_ITEMS": "Versteckte Dateien herunterladen", - "COPY_OPTION": "Als PNG kopieren (Strg / Cmd - C)", - "TOGGLE_FULLSCREEN": "Vollbild umschalten (F)", - "ZOOM_IN_OUT": "Herein-/Herauszoomen", - "PREVIOUS": "Vorherige (←)", - "NEXT": "Weitere (→)", - "TITLE_PHOTOS": "Ente Fotos", - "TITLE_ALBUMS": "Ente Fotos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Lade dein erstes Foto hoch", - "IMPORT_YOUR_FOLDERS": "Importiere deiner Ordner", - "UPLOAD_DROPZONE_MESSAGE": "Loslassen, um Dateien zu sichern", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Loslassen, um beobachteten Ordner hinzuzufügen", - "TRASH_FILES_TITLE": "Dateien löschen?", - "TRASH_FILE_TITLE": "Datei löschen?", - "DELETE_FILES_TITLE": "Sofort löschen?", - "DELETE_FILES_MESSAGE": "Ausgewählte Dateien werden dauerhaft aus Ihrem Ente-Konto gelöscht.", - "DELETE": "Löschen", - "DELETE_OPTION": "Löschen (DEL)", - "FAVORITE_OPTION": "Zu Favoriten hinzufügen (L)", - "UNFAVORITE_OPTION": "Von Favoriten entfernen (L)", - "MULTI_FOLDER_UPLOAD": "Mehrere Ordner erkannt", - "UPLOAD_STRATEGY_CHOICE": "Möchtest du sie hochladen in", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Ein einzelnes Album", - "OR": "oder", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Getrennte Alben", - "SESSION_EXPIRED_MESSAGE": "Ihre Sitzung ist abgelaufen. Bitte loggen Sie sich erneut ein, um fortzufahren", - "SESSION_EXPIRED": "Sitzung abgelaufen", - "PASSWORD_GENERATION_FAILED": "Dein Browser konnte keinen starken Schlüssel generieren, der den Verschlüsselungsstandards des Entes entspricht, bitte versuche die mobile App oder einen anderen Browser zu verwenden", - "CHANGE_PASSWORD": "Passwort ändern", - "GO_BACK": "Zurück", - "RECOVERY_KEY": "Wiederherstellungsschlüssel", - "SAVE_LATER": "Auf später verschieben", - "SAVE": "Schlüssel speichern", - "RECOVERY_KEY_DESCRIPTION": "Falls du dein Passwort vergisst, kannst du deine Daten nur mit diesem Schlüssel wiederherstellen.", - "RECOVER_KEY_GENERATION_FAILED": "Wiederherstellungsschlüssel konnte nicht generiert werden, bitte versuche es erneut", - "KEY_NOT_STORED_DISCLAIMER": "Wir speichern diesen Schlüssel nicht, also speichere ihn bitte an einem sicheren Ort", - "FORGOT_PASSWORD": "Passwort vergessen", - "RECOVER_ACCOUNT": "Konto wiederherstellen", - "RECOVERY_KEY_HINT": "Wiederherstellungsschlüssel", - "RECOVER": "Wiederherstellen", - "NO_RECOVERY_KEY": "Kein Wiederherstellungsschlüssel?", - "INCORRECT_RECOVERY_KEY": "Falscher Wiederherstellungs-Schlüssel", - "SORRY": "Entschuldigung", - "NO_RECOVERY_KEY_MESSAGE": "Aufgrund unseres Ende-zu-Ende-Verschlüsselungsprotokolls können Ihre Daten nicht ohne Ihr Passwort oder Ihren Wiederherstellungsschlüssel entschlüsselt werden", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Bitte sende eine E-Mail an {{emailID}} von deiner registrierten E-Mail-Adresse", - "CONTACT_SUPPORT": "Support kontaktieren", - "REQUEST_FEATURE": "Feature anfragen", - "SUPPORT": "Support", - "CONFIRM": "Bestätigen", - "CANCEL": "Abbrechen", - "LOGOUT": "Ausloggen", - "DELETE_ACCOUNT": "Konto löschen", - "DELETE_ACCOUNT_MESSAGE": "

Bitte sende eine E-Mail an {{emailID}} mit deiner registrierten E-Mail-Adresse.

Deine Anfrage wird innerhalb von 72 Stunden bearbeitet.

", - "LOGOUT_MESSAGE": "Sind sie sicher, dass sie sich ausloggen möchten?", - "CHANGE_EMAIL": "E-Mail-Adresse ändern", - "OK": "OK", - "SUCCESS": "Erfolgreich", - "ERROR": "Fehler", - "MESSAGE": "Nachricht", - "INSTALL_MOBILE_APP": "Installiere unsere Android oder iOS App, um automatisch alle deine Fotos zu sichern", - "DOWNLOAD_APP_MESSAGE": "Entschuldigung, dieser Vorgang wird derzeit nur von unserer Desktop-App unterstützt", - "DOWNLOAD_APP": "Desktopanwendung herunterladen", - "EXPORT": "Daten exportieren", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "Abonnieren", - "MANAGEMENT_PORTAL": "Zahlungsmethode verwalten", - "MANAGE_FAMILY_PORTAL": "Familiengruppe verwalten", - "LEAVE_FAMILY_PLAN": "Familienabo verlassen", - "LEAVE": "Verlassen", - "LEAVE_FAMILY_CONFIRM": "Bist du sicher, dass du den Familien-Tarif verlassen möchtest?", - "CHOOSE_PLAN": "Wähle dein Abonnement", - "MANAGE_PLAN": "Verwalte dein Abonnement", - "ACTIVE": "Aktiv", - "OFFLINE_MSG": "Du bist offline, gecachte Erinnerungen werden angezeigt", - "FREE_SUBSCRIPTION_INFO": "Du bist auf dem kostenlosen Plan, der am {{date, dateTime}} ausläuft", - "FAMILY_SUBSCRIPTION_INFO": "Sie haben einen Familienplan verwaltet von", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Erneuert am {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Endet am {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Ihr Abo endet am {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Dein {{storage, string}} Add-on ist gültig bis {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Sie haben Ihr Speichervolumen überschritten, bitte upgraden Sie", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Wir haben deine Zahlung erhalten

Dein Abonnement ist gültig bis {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Dein Kauf wurde abgebrochen. Bitte versuche es erneut, wenn du abonnieren willst", - "SUBSCRIPTION_PURCHASE_FAILED": "Kauf des Abonnements fehlgeschlagen Bitte versuchen Sie es erneut", - "SUBSCRIPTION_UPDATE_FAILED": "Aktualisierung des Abonnements fehlgeschlagen Bitte versuchen Sie es erneut", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Es tut uns leid, die Zahlung ist fehlgeschlagen, als wir versuchten Ihre Karte zu belasten. Bitte aktualisieren Sie Ihre Zahlungsmethode und versuchen Sie es erneut", - "STRIPE_AUTHENTICATION_FAILED": "Wir können deine Zahlungsmethode nicht authentifizieren. Bitte wähle eine andere Zahlungsmethode und versuche es erneut", - "UPDATE_PAYMENT_METHOD": "Zahlungsmethode aktualisieren", - "MONTHLY": "Monatlich", - "YEARLY": "Jährlich", - "UPDATE_SUBSCRIPTION_MESSAGE": "Sind Sie sicher, dass Sie Ihren Tarif ändern möchten?", - "UPDATE_SUBSCRIPTION": "Plan ändern", - "CANCEL_SUBSCRIPTION": "Abonnement kündigen", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Alle deine Daten werden am Ende dieses Abrechnungszeitraums von unseren Servern gelöscht.

Bist du sicher, dass du dein Abonnement kündigen möchtest?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Bist du sicher, dass du dein Abonnement beenden möchtest?

", - "SUBSCRIPTION_CANCEL_FAILED": "Abonnement konnte nicht storniert werden", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abonnement erfolgreich beendet", - "REACTIVATE_SUBSCRIPTION": "Abonnement reaktivieren", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Nach der Reaktivierung wird am {{date, dateTime}} abgerechnet", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Abonnement erfolgreich aktiviert ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Reaktivierung der Abonnementverlängerung fehlgeschlagen", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Vielen Dank", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Mobiles Abonnement kündigen", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Bitte kündige dein Abonnement in der mobilen App, um hier ein Abonnement zu aktivieren", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Bitte kontaktiere uns über {{emailID}}, um dein Abo zu verwalten", - "RENAME": "Umbenennen", - "RENAME_FILE": "Datei umbenennen", - "RENAME_COLLECTION": "Album umbenennen", - "DELETE_COLLECTION_TITLE": "Album löschen?", - "DELETE_COLLECTION": "Album löschen", - "DELETE_COLLECTION_MESSAGE": "Auch die Fotos (und Videos) in diesem Album aus allen anderen Alben löschen, die sie enthalten?", - "DELETE_PHOTOS": "Fotos löschen", - "KEEP_PHOTOS": "Fotos behalten", - "SHARE": "Teilen", - "SHARE_COLLECTION": "Album teilen", - "SHAREES": "Geteilt mit", - "SHARE_WITH_SELF": "Du kannst nicht mit dir selbst teilen", - "ALREADY_SHARED": "Hoppla, Sie teilen dies bereits mit {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Albumfreigabe nicht erlaubt", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Freigabe ist für kostenlose Konten deaktiviert", - "DOWNLOAD_COLLECTION": "Album herunterladen", - "DOWNLOAD_COLLECTION_MESSAGE": "

Bist du sicher, dass du das komplette Album herunterladen möchtest?

Alle Dateien werden der Warteschlange zum sequenziellen Download hinzugefügt

", - "CREATE_ALBUM_FAILED": "Fehler beim Erstellen des Albums, bitte versuche es erneut", - "SEARCH": "Suchen", - "SEARCH_RESULTS": "Ergebnisse durchsuchen", - "NO_RESULTS": "Keine Ergebnisse gefunden", - "SEARCH_HINT": "Suche nach Alben, Datum, Beschreibungen, ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Standort", - "CITY": "Ort", - "DATE": "Datum", - "FILE_NAME": "Dateiname", - "THING": "Inhalt", - "FILE_CAPTION": "Beschreibung", - "FILE_TYPE": "Dateityp", - "CLIP": "Magie" - }, - "photos_count_zero": "Keine Erinnerungen", - "photos_count_one": "Eine Erinnerung", - "photos_count_other": "{{count, number}} Erinnerungen", - "TERMS_AND_CONDITIONS": "Ich stimme den Bedingungen und Datenschutzrichtlinien zu", - "ADD_TO_COLLECTION": "Zum Album hinzufügen", - "SELECTED": "ausgewählt", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Dieses Video kann in deinem Browser nicht abgespielt werden", - "PEOPLE": "Personen", - "INDEXING_SCHEDULED": "Indizierung ist geplant...", - "ANALYZING_PHOTOS": "Indiziere Fotos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indiziere Personen in {{indexStatus.nSyncedFiles,number}} Fotos...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles,number}} Fotos wurden indiziert", - "UNIDENTIFIED_FACES": "unidentifizierte Gesichter", - "OBJECTS": "Objekte", - "TEXT": "Text", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Dateiname", - "CAPTION_PLACEHOLDER": "Eine Beschreibung hinzufügen", - "LOCATION": "Standort", - "SHOW_ON_MAP": "In OpenStreetMap öffnen", - "MAP": "Karte", - "MAP_SETTINGS": "Karten\nEinstellungen", - "ENABLE_MAPS": "Karten aktivieren?", - "ENABLE_MAP": "Karte aktivieren", - "DISABLE_MAPS": "Karten deaktivieren?", - "ENABLE_MAP_DESCRIPTION": "

Dies wird deine Fotos auf einer Weltkarte anzeigen.

Die Karte wird von OpenStreetMap gehostet und die genauen Standorte deiner Fotos werden niemals geteilt.

Diese Funktion kannst du jederzeit in den Einstellungen deaktivieren.

", - "DISABLE_MAP_DESCRIPTION": "

Dies wird die Anzeige deiner Fotos auf einer Weltkarte deaktivieren.

Du kannst diese Funktion jederzeit in den Einstellungen aktivieren.

", - "DISABLE_MAP": "Karte deaktivieren", - "DETAILS": "Details", - "VIEW_EXIF": "Alle EXIF-Daten anzeigen", - "NO_EXIF": "Keine EXIF-Daten", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Zwei-Faktor", - "TWO_FACTOR_AUTHENTICATION": "Zwei-Faktor-Authentifizierung", - "TWO_FACTOR_QR_INSTRUCTION": "Scanne den QR-Code unten mit deiner bevorzugten Authentifizierungs-App", - "ENTER_CODE_MANUALLY": "Geben Sie den Code manuell ein", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Bitte gib diesen Code in deiner bevorzugten Authentifizierungs-App ein", - "SCAN_QR_CODE": "QR‐Code stattdessen scannen", - "ENABLE_TWO_FACTOR": "Zwei-Faktor-Authentifizierung aktivieren", - "ENABLE": "Aktivieren", - "LOST_DEVICE": "Zwei-Faktor-Gerät verloren", - "INCORRECT_CODE": "Falscher Code", - "TWO_FACTOR_INFO": "Fügen Sie eine zusätzliche Sicherheitsebene hinzu, indem Sie mehr als Ihre E-Mail und Ihr Passwort benötigen, um sich mit Ihrem Account anzumelden", - "DISABLE_TWO_FACTOR_LABEL": "Deaktiviere die Zwei-Faktor-Authentifizierung", - "UPDATE_TWO_FACTOR_LABEL": "Authentifizierungsgerät aktualisieren", - "DISABLE": "Deaktivieren", - "RECONFIGURE": "Neu einrichten", - "UPDATE_TWO_FACTOR": "Zweiten Faktor aktualisieren", - "UPDATE_TWO_FACTOR_MESSAGE": "Fahren Sie fort, werden alle Ihre zuvor konfigurierten Authentifikatoren ungültig", - "UPDATE": "Aktualisierung", - "DISABLE_TWO_FACTOR": "Zweiten Faktor deaktivieren", - "DISABLE_TWO_FACTOR_MESSAGE": "Bist du sicher, dass du die Zwei-Faktor-Authentifizierung deaktivieren willst", - "TWO_FACTOR_DISABLE_FAILED": "Fehler beim Deaktivieren des zweiten Faktors, bitte versuchen Sie es erneut", - "EXPORT_DATA": "Daten exportieren", - "SELECT_FOLDER": "Ordner auswählen", - "DESTINATION": "Zielort", - "START": "Start", - "LAST_EXPORT_TIME": "Letztes Exportdatum", - "EXPORT_AGAIN": "Neusynchronisation", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Lokaler Speicher nicht zugänglich", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Ihr Browser oder ein Addon blockiert ente vor der Speicherung von Daten im lokalen Speicher. Bitte versuchen Sie, den Browser-Modus zu wechseln und die Seite neu zu laden.", - "SEND_OTT": "OTP senden", - "EMAIl_ALREADY_OWNED": "Diese E-Mail wird bereits verwendet", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "Fehlgeschlagene Uploads erneut probieren", - "FAILED_UPLOADS": "Fehlgeschlagene Uploads ", - "SKIPPED_FILES": "Ignorierte Uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Das Vorschaubild konnte nicht erzeugt werden", - "UNSUPPORTED_FILES": "Nicht unterstützte Dateien", - "SUCCESSFUL_UPLOADS": "Erfolgreiche Uploads", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "ente unterstützt diese Dateiformate noch nicht", - "BLOCKED_UPLOADS": "Blockierte Uploads", - "SKIPPED_VIDEOS": "Übersprungene Videos", - "INPROGRESS_METADATA_EXTRACTION": "In Bearbeitung", - "INPROGRESS_UPLOADS": "Upload läuft", - "TOO_LARGE_UPLOADS": "Große Dateien", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Zu wenig Speicher", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Diese Dateien wurden nicht hochgeladen, da sie die maximale Größe für Ihren Speicherplan überschreiten", - "TOO_LARGE_INFO": "Diese Dateien wurden nicht hochgeladen, da sie unsere maximale Dateigröße überschreiten", - "THUMBNAIL_GENERATION_FAILED_INFO": "Diese Dateien wurden hochgeladen, aber leider konnten wir nicht die Thumbnails für sie generieren.", - "UPLOAD_TO_COLLECTION": "In Album hochladen", - "UNCATEGORIZED": "Unkategorisiert", - "ARCHIVE": "Archiv", - "FAVORITES": "Favoriten", - "ARCHIVE_COLLECTION": "Album archivieren", - "ARCHIVE_SECTION_NAME": "Archiv", - "ALL_SECTION_NAME": "Alle", - "MOVE_TO_COLLECTION": "Zum Album verschieben", - "UNARCHIVE": "Dearchivieren", - "UNARCHIVE_COLLECTION": "Album dearchivieren", - "HIDE_COLLECTION": "Album ausblenden", - "UNHIDE_COLLECTION": "Album wieder einblenden", - "MOVE": "Verschieben", - "ADD": "Hinzufügen", - "REMOVE": "Entfernen", - "YES_REMOVE": "Ja, entfernen", - "REMOVE_FROM_COLLECTION": "Aus Album entfernen", - "TRASH": "Papierkorb", - "MOVE_TO_TRASH": "In Papierkorb verschieben", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "Dauerhaft löschen", - "RESTORE": "Wiederherstellen", - "RESTORE_TO_COLLECTION": "In Album wiederherstellen", - "EMPTY_TRASH": "Papierkorb leeren", - "EMPTY_TRASH_TITLE": "Papierkorb leeren?", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "Ja, verlassen", - "LEAVE_ALBUM": "Album verlassen", - "LEAVE_SHARED_ALBUM_TITLE": "Geteiltes Album verlassen?", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "Dateien in einem freigegebenen Album können nicht gelöscht werden", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Einige der Elemente, die du entfernst, wurden von anderen Nutzern hinzugefügt und du wirst den Zugriff auf sie verlieren.", - "SORT_BY_CREATION_TIME_ASCENDING": "Ältestem", - "SORT_BY_UPDATION_TIME_DESCENDING": "Zuletzt aktualisiert", - "SORT_BY_NAME": "Name", - "COMPRESS_THUMBNAILS": "Vorschaubilder komprimieren", - "THUMBNAIL_REPLACED": "Vorschaubilder komprimiert", - "FIX_THUMBNAIL": "Komprimiere", - "FIX_THUMBNAIL_LATER": "Später komprimieren", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "Zeit reparieren", - "FIX_CREATION_TIME_IN_PROGRESS": "Zeit wird repariert", - "CREATION_TIME_UPDATED": "Datei-Zeit aktualisiert", - "UPDATE_CREATION_TIME_NOT_STARTED": "Wählen Sie die Option, die Sie verwenden möchten", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "Maximal 5000 Zeichen", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "Benutzerdefinierte Zeit", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Fehler beim Öffnen der Pläne", - "INSTALL": "Installieren", - "SHARING_DETAILS": "Details teilen", - "MODIFY_SHARING": "Freigabe ändern", - "ADD_COLLABORATORS": "Bearbeiter hinzufügen", - "ADD_NEW_EMAIL": "Neue E-Mail-Adresse hinzufügen", - "shared_with_people_zero": "Mit bestimmten Personen teilen", - "shared_with_people_one": "Geteilt mit einer Person", - "shared_with_people_other": "Geteilt mit {{count, number}} Personen", - "participants_zero": "Keine Teilnehmer", - "participants_one": "1 Teilnehmer", - "participants_other": "{{count, number}} Teilnehmer", - "ADD_VIEWERS": "Betrachter hinzufügen", - "PARTICIPANTS": "Teilnehmer", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "Ja, zu \"Beobachter\" ändern", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "Berechtigung ändern?", - "REMOVE_PARTICIPANT": "Entfernen?", - "CONFIRM_REMOVE": "Ja, entfernen", - "MANAGE": "Verwalten", - "ADDED_AS": "Hinzugefügt als", - "COLLABORATOR_RIGHTS": "Bearbeiter können Fotos & Videos zu dem geteilten Album hinzufügen", - "REMOVE_PARTICIPANT_HEAD": "Teilnehmer entfernen", - "OWNER": "Besitzer", - "COLLABORATORS": "Bearbeiter", - "ADD_MORE": "Mehr hinzufügen", - "VIEWERS": "Zuschauer", - "OR_ADD_EXISTING": "Oder eine Vorherige auswählen", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - Nicht gefunden", - "LINK_EXPIRED": "Link ist abgelaufen", - "LINK_EXPIRED_MESSAGE": "Dieser Link ist abgelaufen oder wurde deaktiviert!", - "MANAGE_LINK": "Link verwalten", - "LINK_TOO_MANY_REQUESTS": "Sorry, dieses Album wurde auf zu vielen Geräten angezeigt!", - "FILE_DOWNLOAD": "Downloads erlauben", - "LINK_PASSWORD_LOCK": "Passwort Sperre", - "PUBLIC_COLLECT": "Hinzufügen von Fotos erlauben", - "LINK_DEVICE_LIMIT": "Geräte Limit", - "NO_DEVICE_LIMIT": "Keins", - "LINK_EXPIRY": "Ablaufdatum des Links", - "NEVER": "Niemals", - "DISABLE_FILE_DOWNLOAD": "Download deaktivieren", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "Enthält schädliche Inhalte", - "COPYRIGHT": "Verletzung des Urheberrechts von jemandem, den ich repräsentieren darf", - "SHARED_USING": "Freigegeben über ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Passwort-Sperre deaktivieren", - "DISABLE_PASSWORD_MESSAGE": "Sind Sie sicher, dass Sie die Passwort-Sperre deaktivieren möchten?", - "PASSWORD_LOCK": "Passwort Sperre", - "LOCK": "Sperren", - "DOWNLOAD_UPLOAD_LOGS": "Debug-Logs", - "UPLOAD_FILES": "Datei", - "UPLOAD_DIRS": "Ordner", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "Authenticator", - "NO_DUPLICATES_FOUND": "Du hast keine Duplikate, die gelöscht werden können", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "Dateien", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "Hochladen stoppen?", - "YES_STOP_UPLOADS": "Ja, Hochladen stoppen", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "", - "ALL_ALBUMS": "Alle Alben", - "ALBUMS": "Alben", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "Gib den 6-stelligen Code aus\ndeiner Authentifizierungs-App ein.", - "CREATE_ACCOUNT": "Account erstellen", - "COPIED": "Kopiert", - "CANVAS_BLOCKED_TITLE": "Vorschaubild konnte nicht erstellt werden", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "Jetzt upgraden", - "RENEW_NOW": "", - "STORAGE": "Speicher", - "USED": "verwendet", - "YOU": "Sie", - "FAMILY": "Familie", - "FREE": "frei", - "OF": "von", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "Ordner hinzufügen", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "Ja, Stopp", - "MONTH_SHORT": "", - "YEAR": "Jahr", - "FAMILY_PLAN": "Familientarif", - "DOWNLOAD_LOGS": "Logs herunterladen", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "Ordner ändern", - "TWO_MONTHS_FREE": "Erhalte 2 Monate kostenlos bei Jahresabonnements", - "GB": "GB", - "POPULAR": "Beliebt", - "FREE_PLAN_OPTION_LABEL": "Mit kostenloser Testversion fortfahren", - "FREE_PLAN_DESCRIPTION": "1 GB für 1 Jahr", - "CURRENT_USAGE": "Aktuelle Nutzung ist {{usage}}", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "Authentifizieren", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "Egal", - "UPDATE_AVAILABLE": "Neue Version verfügbar", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "Jetzt installieren", - "INSTALL_ON_NEXT_LAUNCH": "Beim nächsten Start installieren", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "Diese Version ignorieren", - "TODAY": "Heute", - "YESTERDAY": "Gestern", - "NAME_PLACEHOLDER": "Name...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "Beta deaktivieren", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "Erweitert", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "Passwortstärke: Schwach", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "Passwortstärke: Stark", - "PREFERENCES": "Einstellungen", - "LANGUAGE": "Sprache", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "nach einer Stunde", - "DAY": "nach einem Tag", - "WEEK": "nach 1 Woche", - "MONTH": "nach einem Monat", - "YEAR": "nach einem Jahr" - }, - "COPY_LINK": "Link kopieren", - "DONE": "Fertig", - "LINK_SHARE_TITLE": "Oder einen Link teilen", - "REMOVE_LINK": "Link entfernen", - "CREATE_PUBLIC_SHARING": "Öffentlichen Link erstellen", - "PUBLIC_LINK_CREATED": "Öffentlicher Link erstellt", - "PUBLIC_LINK_ENABLED": "Öffentlicher Link aktiviert", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "Export gestartet", - "IN_PROGRESS": "", - "FINISH": "Export abgeschlossen", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "Kontolöschung bestätigen", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "Weiter", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "Versteckt", - "HIDE": "Ausblenden", - "UNHIDE": "Einblenden", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Sortieren nach", - "NEWEST_FIRST": "Neueste zuerst", - "OLDEST_FIRST": "Älteste zuerst", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Diese Datei konnte nicht in der Vorschau angezeigt werden. Klicken Sie hier, um das Original herunterzuladen.", - "SELECT_COLLECTION": "Album auswählen", - "PIN_ALBUM": "Album anheften", - "UNPIN_ALBUM": "Album lösen", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/es-ES/translation.json b/web/apps/accounts/public/locales/es-ES/translation.json deleted file mode 100644 index a29165e4e..000000000 --- a/web/apps/accounts/public/locales/es-ES/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Copias de seguridad privadas
para su recuerdos
", - "HERO_SLIDE_1": "Encriptado de extremo a extremo por defecto", - "HERO_SLIDE_2_TITLE": "
Almacenado de forma segura
en un refugio de llenos
", - "HERO_SLIDE_2": "Diseñado para superar", - "HERO_SLIDE_3_TITLE": "
Disponible
en todas partes
", - "HERO_SLIDE_3": "Android, iOS, web, computadora", - "LOGIN": "Conectar", - "SIGN_UP": "Registro", - "NEW_USER": "Nuevo en ente", - "EXISTING_USER": "Usuario existente", - "ENTER_NAME": "Introducir nombre", - "PUBLIC_UPLOADER_NAME_MESSAGE": "¡Añade un nombre para que tus amigos sepan a quién dar las gracias por estas fotos geniales!", - "ENTER_EMAIL": "Introducir email", - "EMAIL_ERROR": "Introduce un email válido", - "REQUIRED": "Requerido", - "EMAIL_SENT": "Código de verificación enviado al {{email}}", - "CHECK_INBOX": "Revisa tu bandeja de entrada (y spam) para completar la verificación", - "ENTER_OTT": "Código de verificación", - "RESEND_MAIL": "Reenviar el código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Se produjo un error. Por favor, inténtalo de nuevo", - "INVALID_CODE": "Código de verificación inválido", - "EXPIRED_CODE": "Código de verificación expirado", - "SENDING": "Enviando...", - "SENT": "Enviado!", - "PASSWORD": "Contraseña", - "LINK_PASSWORD": "Introducir contraseña para desbloquear el álbum", - "RETURN_PASSPHRASE_HINT": "Contraseña", - "SET_PASSPHRASE": "Definir contraseña", - "VERIFY_PASSPHRASE": "Ingresar", - "INCORRECT_PASSPHRASE": "Contraseña incorrecta", - "ENTER_ENC_PASSPHRASE": "Introducir una contraseña que podamos usar para cifrar sus datos", - "PASSPHRASE_DISCLAIMER": "No guardamos su contraseña, así que si la olvida, no podremos ayudarte a recuperar tus datos sin una clave de recuperación.", - "WELCOME_TO_ENTE_HEADING": "Bienvenido a ", - "WELCOME_TO_ENTE_SUBHEADING": "Almacenamiento y compartición de fotos cifradas de extremo a extremo", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Donde vivan su mejores fotos", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generando claves de encriptación...", - "PASSPHRASE_HINT": "Contraseña", - "CONFIRM_PASSPHRASE": "Confirmar contraseña", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Las contraseñas no coinciden", - "CREATE_COLLECTION": "Nuevo álbum", - "ENTER_ALBUM_NAME": "Nombre del álbum", - "CLOSE_OPTION": "Cerrar (Esc)", - "ENTER_FILE_NAME": "Nombre del archivo", - "CLOSE": "Cerrar", - "NO": "No", - "NOTHING_HERE": "Nada para ver aquí aún 👀", - "UPLOAD": "Cargar", - "IMPORT": "Importar", - "ADD_PHOTOS": "Añadir fotos", - "ADD_MORE_PHOTOS": "Añadir más fotos", - "add_photos_one": "Añadir 1 foto", - "add_photos_other": "Añadir {{count}} fotos", - "SELECT_PHOTOS": "Seleccionar fotos", - "FILE_UPLOAD": "Subir archivo", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparando la subida", - "1": "Leyendo archivos de metadatos de google", - "2": "{{uploadCounter.finished}} / {{uploadCounter.total}} archivos metadatos extraídos", - "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} archivos metadatos extraídos", - "4": "Cancelar subidas restantes", - "5": "Copia de seguridad completa" - }, - "FILE_NOT_UPLOADED_LIST": "Los siguientes archivos no se han subido", - "SUBSCRIPTION_EXPIRED": "Suscripción caducada", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Tu suscripción ha caducado, por favor renuévala", - "STORAGE_QUOTA_EXCEEDED": "Límite de datos excedido", - "INITIAL_LOAD_DELAY_WARNING": "La primera carga puede tomar algún tiempo", - "USER_DOES_NOT_EXIST": "Lo sentimos, no se pudo encontrar un usuario con ese email", - "NO_ACCOUNT": "No tienes una cuenta", - "ACCOUNT_EXISTS": "Ya tienes una cuenta", - "CREATE": "Crear", - "DOWNLOAD": "Descargar", - "DOWNLOAD_OPTION": "Descargar (D)", - "DOWNLOAD_FAVORITES": "Descargar favoritos", - "DOWNLOAD_UNCATEGORIZED": "Descargar no categorizados", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "Copiar como PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Alternar pantalla completa (F)", - "ZOOM_IN_OUT": "Acercar/alejar", - "PREVIOUS": "Anterior (←)", - "NEXT": "Siguiente (→)", - "TITLE_PHOTOS": "ente Fotos", - "TITLE_ALBUMS": "ente Fotos", - "TITLE_AUTH": "ente Auth", - "UPLOAD_FIRST_PHOTO": "Carga tu primer archivo", - "IMPORT_YOUR_FOLDERS": "Importar tus carpetas", - "UPLOAD_DROPZONE_MESSAGE": "Soltar para respaldar tus archivos", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Soltar para añadir carpeta vigilada", - "TRASH_FILES_TITLE": "Eliminar archivos?", - "TRASH_FILE_TITLE": "Eliminar archivo?", - "DELETE_FILES_TITLE": "Eliminar inmediatamente?", - "DELETE_FILES_MESSAGE": "Los archivos seleccionados serán eliminados permanentemente de tu cuenta ente.", - "DELETE": "Eliminar", - "DELETE_OPTION": "Eliminar (DEL)", - "FAVORITE_OPTION": "Favorito (L)", - "UNFAVORITE_OPTION": "No favorito (L)", - "MULTI_FOLDER_UPLOAD": "Múltiples carpetas detectadas", - "UPLOAD_STRATEGY_CHOICE": "Quieres subirlos a", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un solo álbum", - "OR": "o", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Separar álbumes", - "SESSION_EXPIRED_MESSAGE": "Tu sesión ha caducado. Inicia sesión de nuevo para continuar", - "SESSION_EXPIRED": "Sesión caducado", - "PASSWORD_GENERATION_FAILED": "Su navegador no ha podido generar una clave fuerte que cumpla con los estándares de cifrado de la entidad, por favor intente usar la aplicación móvil u otro navegador", - "CHANGE_PASSWORD": "Cambiar contraseña", - "GO_BACK": "Retroceder", - "RECOVERY_KEY": "Clave de recuperación", - "SAVE_LATER": "Hacer más tarde", - "SAVE": "Guardar Clave", - "RECOVERY_KEY_DESCRIPTION": "Si olvida su contraseña, la única forma de recuperar sus datos es con esta clave.", - "RECOVER_KEY_GENERATION_FAILED": "El código de recuperación no pudo ser generado, por favor inténtalo de nuevo", - "KEY_NOT_STORED_DISCLAIMER": "No almacenamos esta clave, así que por favor guarde esto en un lugar seguro", - "FORGOT_PASSWORD": "Contraseña olvidada", - "RECOVER_ACCOUNT": "Recuperar cuenta", - "RECOVERY_KEY_HINT": "Clave de recuperación", - "RECOVER": "Recuperar", - "NO_RECOVERY_KEY": "No hay clave de recuperación?", - "INCORRECT_RECOVERY_KEY": "Clave de recuperación incorrecta", - "SORRY": "Lo sentimos", - "NO_RECOVERY_KEY_MESSAGE": "Debido a la naturaleza de nuestro protocolo de cifrado de extremo a extremo, sus datos no pueden ser descifrados sin su contraseña o clave de recuperación", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Por favor, envíe un email a {{emailID}} desde su dirección de correo electrónico registrada", - "CONTACT_SUPPORT": "Contacta con soporte", - "REQUEST_FEATURE": "Solicitar una función", - "SUPPORT": "Soporte", - "CONFIRM": "Confirmar", - "CANCEL": "Cancelar", - "LOGOUT": "Cerrar sesión", - "DELETE_ACCOUNT": "Eliminar cuenta", - "DELETE_ACCOUNT_MESSAGE": "

Por favor, envíe un email a {{emailID}} desde su dirección de correo electrónico registrada

Su solicitud será procesada en 72 horas.

", - "LOGOUT_MESSAGE": "Seguro que quiere cerrar la sesión?", - "CHANGE_EMAIL": "Cambiar email", - "OK": "OK", - "SUCCESS": "Completado", - "ERROR": "Error", - "MESSAGE": "Mensaje", - "INSTALL_MOBILE_APP": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos", - "DOWNLOAD_APP_MESSAGE": "Lo sentimos, esta operación sólo es compatible con nuestra aplicación de computadora", - "DOWNLOAD_APP": "Descargar aplicación de computadora", - "EXPORT": "Exportar datos", - "SUBSCRIPTION": "Suscripción", - "SUBSCRIBE": "Suscribir", - "MANAGEMENT_PORTAL": "Gestionar métodos de pago", - "MANAGE_FAMILY_PORTAL": "Administrar familia", - "LEAVE_FAMILY_PLAN": "Dejar plan familiar", - "LEAVE": "Dejar", - "LEAVE_FAMILY_CONFIRM": "Está seguro de que desea abandonar el plan familiar?", - "CHOOSE_PLAN": "Elije tu plan", - "MANAGE_PLAN": "Administra tu suscripción", - "ACTIVE": "Activo", - "OFFLINE_MSG": "Estás desconectado, se están mostrando recuerdos en caché", - "FREE_SUBSCRIPTION_INFO": "Estás en el plan gratis que expira el {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Estás en un plan familiar administrado por", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Se renueva en {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina el {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Tu suscripción será cancelada el {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Ha excedido su cuota de almacenamiento, por favor actualice", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Hemos recibido tu pago

¡Tu suscripción es válida hasta {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Tu compra ha sido cancelada, por favor inténtalo de nuevo si quieres suscribirte", - "SUBSCRIPTION_PURCHASE_FAILED": "Compra de suscripción fallida, por favor inténtalo de nuevo", - "SUBSCRIPTION_UPDATE_FAILED": "Suscripción actualizada falló, inténtelo de nuevo", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Lo sentimos, el pago falló cuando intentamos cargar a su tarjeta, por favor actualice su método de pago y vuelva a intentarlo", - "STRIPE_AUTHENTICATION_FAILED": "No podemos autenticar tu método de pago. Por favor, elige un método de pago diferente e inténtalo de nuevo", - "UPDATE_PAYMENT_METHOD": "Actualizar medio de pago", - "MONTHLY": "Mensual", - "YEARLY": "Anual", - "UPDATE_SUBSCRIPTION_MESSAGE": "Seguro de que desea cambiar su plan?", - "UPDATE_SUBSCRIPTION": "Cambiar de plan", - "CANCEL_SUBSCRIPTION": "Cancelar suscripción", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Todos tus datos serán eliminados de nuestros servidores al final de este periodo de facturación.

¿Está seguro de que desea cancelar su suscripción?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "No se pudo cancelar la suscripción", - "SUBSCRIPTION_CANCEL_SUCCESS": "Suscripción cancelada correctamente", - "REACTIVATE_SUBSCRIPTION": "Reactivar la suscripción", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Una vez reactivado, serás facturado el {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Suscripción activada correctamente ", - "SUBSCRIPTION_ACTIVATE_FAILED": "No se pudo reactivar las renovaciones de suscripción", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Gracias", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancelar suscripción a móviles", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Por favor, cancele su suscripción de la aplicación móvil para activar una suscripción aquí", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Por favor, contáctenos en {{emailID}} para gestionar su suscripción", - "RENAME": "Renombrar", - "RENAME_FILE": "Renombrar archivo", - "RENAME_COLLECTION": "Renombrar álbum", - "DELETE_COLLECTION_TITLE": "Eliminar álbum?", - "DELETE_COLLECTION": "Eliminar álbum", - "DELETE_COLLECTION_MESSAGE": "También eliminar las fotos (y los vídeos) presentes en este álbum de todos álbumes de los que forman parte?", - "DELETE_PHOTOS": "Eliminar fotos", - "KEEP_PHOTOS": "Conservar fotos", - "SHARE": "Compartir", - "SHARE_COLLECTION": "Compartir álbum", - "SHAREES": "Compartido con", - "SHARE_WITH_SELF": "Uy, no puedes compartir contigo mismo", - "ALREADY_SHARED": "Uy, ya estás compartiendo esto con {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Compartir álbum no permitido", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Compartir está desactivado para cuentas gratis", - "DOWNLOAD_COLLECTION": "Descargar álbum", - "DOWNLOAD_COLLECTION_MESSAGE": "

¿Está seguro de que desea descargar el álbum completo?

Todos los archivos se pondrán en cola para su descarga secuencialmente

", - "CREATE_ALBUM_FAILED": "Error al crear el álbum, inténtalo de nuevo", - "SEARCH": "Buscar", - "SEARCH_RESULTS": "Buscar resultados", - "NO_RESULTS": "No se han encontrado resultados", - "SEARCH_HINT": "Buscar álbumes, fechas...", - "SEARCH_TYPE": { - "COLLECTION": "Álbum", - "LOCATION": "Localización", - "CITY": "", - "DATE": "Fecha", - "FILE_NAME": "Nombre del archivo", - "THING": "Contenido", - "FILE_CAPTION": "Descripción", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "No hay recuerdos", - "photos_count_one": "1 recuerdo", - "photos_count_other": "{{count}} recuerdos", - "TERMS_AND_CONDITIONS": "Acepto los términos y política de privacidad", - "ADD_TO_COLLECTION": "Añadir al álbum", - "SELECTED": "seleccionado", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Este vídeo no se puede reproducir en tu navegador", - "PEOPLE": "Personajes", - "INDEXING_SCHEDULED": "el indexado está programado...", - "ANALYZING_PHOTOS": "analizando nuevas fotos {{indexStatus.nSyncedFiles}} de {{indexStatus.nTotalFiles}} hecho)...", - "INDEXING_PEOPLE": "indexando personas en {{indexStatus.nSyncedFiles}} fotos... ", - "INDEXING_DONE": "fotos {{indexStatus.nSyncedFiles}} indexadas", - "UNIDENTIFIED_FACES": "caras no identificadas", - "OBJECTS": "objetos", - "TEXT": "texto", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Nombre del archivo", - "CAPTION_PLACEHOLDER": "Añadir una descripción", - "LOCATION": "Localización", - "SHOW_ON_MAP": "Ver en OpenStreetMap", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "Detalles", - "VIEW_EXIF": "Ver todos los datos de EXIF", - "NO_EXIF": "No hay datos EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Dos factores", - "TWO_FACTOR_AUTHENTICATION": "Autenticación de dos factores", - "TWO_FACTOR_QR_INSTRUCTION": "Escanea el código QR de abajo con tu aplicación de autenticación favorita", - "ENTER_CODE_MANUALLY": "Ingrese el código manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Por favor, introduce este código en tu aplicación de autenticación favorita", - "SCAN_QR_CODE": "Escanear código QR en su lugar", - "ENABLE_TWO_FACTOR": "Activar dos factores", - "ENABLE": "Activar", - "LOST_DEVICE": "Perdido el dispositivo de doble factor", - "INCORRECT_CODE": "Código incorrecto", - "TWO_FACTOR_INFO": "Añade una capa adicional de seguridad al requerir más de tu email y contraseña para iniciar sesión en tu cuenta", - "DISABLE_TWO_FACTOR_LABEL": "Deshabilitar la autenticación de dos factores", - "UPDATE_TWO_FACTOR_LABEL": "Actualice su dispositivo de autenticación", - "DISABLE": "Desactivar", - "RECONFIGURE": "Reconfigurar", - "UPDATE_TWO_FACTOR": "Actualizar doble factor", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuar adelante anulará los autenticadores previamente configurados", - "UPDATE": "Actualizar", - "DISABLE_TWO_FACTOR": "Desactivar doble factor", - "DISABLE_TWO_FACTOR_MESSAGE": "¿Estás seguro de que desea deshabilitar la autenticación de doble factor?", - "TWO_FACTOR_DISABLE_FAILED": "Error al desactivar dos factores, inténtalo de nuevo", - "EXPORT_DATA": "Exportar datos", - "SELECT_FOLDER": "Seleccionar carpeta", - "DESTINATION": "Destinación", - "START": "Inicio", - "LAST_EXPORT_TIME": "Fecha de la última exportación", - "EXPORT_AGAIN": "Resinc", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Almacenamiento local inaccesible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Su navegador o un addon está bloqueando a ente de guardar datos en almacenamiento local. Por favor, intente cargar esta página después de cambiar su modo de navegación.", - "SEND_OTT": "Enviar OTP", - "EMAIl_ALREADY_OWNED": "Email ya tomado", - "ETAGS_BLOCKED": "

No hemos podido subir los siguientes archivos debido a la configuración de tu navegador.

Por favor, deshabilite cualquier complemento que pueda estar impidiendo que ente utilice eTags para subir archivos grandes, o utilice nuestra aplicación de escritorio para una experiencia de importación más fiable.

", - "SKIPPED_VIDEOS_INFO": "

Actualmente no podemos añadir vídeos a través de enlaces públicos.

Para compartir vídeos, por favor regístrate en ente y comparte con los destinatarios a través de su correo electrónico.

", - "LIVE_PHOTOS_DETECTED": "Los archivos de foto y vídeo de tus fotos en vivo se han fusionado en un solo archivo", - "RETRY_FAILED": "Reintentar subidas fallidas", - "FAILED_UPLOADS": "Subidas fallidas ", - "SKIPPED_FILES": "Subidas ignoradas", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Generación de miniaturas fallida", - "UNSUPPORTED_FILES": "Archivos no soportados", - "SUCCESSFUL_UPLOADS": "Subidas exitosas", - "SKIPPED_INFO": "Se han omitido ya que hay archivos con nombres coincidentes en el mismo álbum", - "UNSUPPORTED_INFO": "ente no soporta estos formatos de archivo aún", - "BLOCKED_UPLOADS": "Subidas bloqueadas", - "SKIPPED_VIDEOS": "Vídeos saltados", - "INPROGRESS_METADATA_EXTRACTION": "En proceso", - "INPROGRESS_UPLOADS": "Subidas en progreso", - "TOO_LARGE_UPLOADS": "Archivos grandes", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Espacio insuficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Estos archivos no se han subido porque exceden el límite de tamaño máximo para tu plan de almacenamiento", - "TOO_LARGE_INFO": "Estos archivos no se han subido porque exceden nuestro límite máximo de tamaño de archivo", - "THUMBNAIL_GENERATION_FAILED_INFO": "Estos archivos fueron cargados, pero por desgracia no pudimos generar las miniaturas para ellos.", - "UPLOAD_TO_COLLECTION": "Subir al álbum", - "UNCATEGORIZED": "No clasificado", - "ARCHIVE": "Archivo", - "FAVORITES": "Favoritos", - "ARCHIVE_COLLECTION": "Archivo álbum", - "ARCHIVE_SECTION_NAME": "Archivo", - "ALL_SECTION_NAME": "Todo", - "MOVE_TO_COLLECTION": "Mover al álbum", - "UNARCHIVE": "Desarchivar", - "UNARCHIVE_COLLECTION": "Desarchivar álbum", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "Mover", - "ADD": "Añadir", - "REMOVE": "Eliminar", - "YES_REMOVE": "Sí, eliminar", - "REMOVE_FROM_COLLECTION": "Eliminar del álbum", - "TRASH": "Papelera", - "MOVE_TO_TRASH": "Mover a la papelera", - "TRASH_FILES_MESSAGE": "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera.", - "TRASH_FILE_MESSAGE": "El archivo será eliminado de todos los álbumes y movido a la papelera.", - "DELETE_PERMANENTLY": "Eliminar para siempre", - "RESTORE": "Restaurar", - "RESTORE_TO_COLLECTION": "Restaurar al álbum", - "EMPTY_TRASH": "Vaciar papelera", - "EMPTY_TRASH_TITLE": "Vaciar papelera?", - "EMPTY_TRASH_MESSAGE": "Estos archivos serán eliminados permanentemente de su cuenta ente.", - "LEAVE_SHARED_ALBUM": "Sí, dejar", - "LEAVE_ALBUM": "Dejar álbum", - "LEAVE_SHARED_ALBUM_TITLE": "¿Dejar álbum compartido?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Dejará el álbum, y dejará de ser visible para usted.", - "NOT_FILE_OWNER": "No puedes eliminar archivos de un álbum compartido", - "CONFIRM_SELF_REMOVE_MESSAGE": "Los elementos seleccionados serán eliminados de este álbum. Los elementos que estén sólo en este álbum serán movidos a Sin categorizar.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Algunos de los elementos que estás eliminando fueron añadidos por otras personas, y perderás el acceso a ellos.", - "SORT_BY_CREATION_TIME_ASCENDING": "Antiguo", - "SORT_BY_UPDATION_TIME_DESCENDING": "Última actualización", - "SORT_BY_NAME": "Nombre", - "COMPRESS_THUMBNAILS": "Comprimir las miniaturas", - "THUMBNAIL_REPLACED": "Miniaturas comprimidas", - "FIX_THUMBNAIL": "Comprimir", - "FIX_THUMBNAIL_LATER": "Comprimir más tarde", - "REPLACE_THUMBNAIL_NOT_STARTED": "Algunas de tus miniaturas de vídeos pueden ser comprimidas para ahorrar espacio. ¿Te gustaría que ente las comprima?", - "REPLACE_THUMBNAIL_COMPLETED": "Todas las miniaturas se comprimieron con éxito", - "REPLACE_THUMBNAIL_NOOP": "No tienes miniaturas que se puedan comprimir más", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "No se pudieron comprimir algunas de tus miniaturas, por favor inténtalo de nuevo", - "FIX_CREATION_TIME": "Fijar hora", - "FIX_CREATION_TIME_IN_PROGRESS": "Fijar hora", - "CREATION_TIME_UPDATED": "Hora del archivo actualizada", - "UPDATE_CREATION_TIME_NOT_STARTED": "Seleccione la cartera que desea utilizar", - "UPDATE_CREATION_TIME_COMPLETED": "Todos los archivos se han actualizado correctamente", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "Fallo en la hora del archivo para algunos archivos, por favor inténtelo de nuevo", - "CAPTION_CHARACTER_LIMIT": "Máximo 5000 caracteres", - "DATE_TIME_ORIGINAL": "EXIF: Fecha original", - "DATE_TIME_DIGITIZED": "EXIF: Fecha Digitalizado", - "METADATA_DATE": "", - "CUSTOM_TIME": "Hora personalizada", - "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planes", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Error al abrir los planes", - "INSTALL": "Instalar", - "SHARING_DETAILS": "Compartir detalles", - "MODIFY_SHARING": "Modificar compartir", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "Propietario", - "COLLABORATORS": "Colaboradores", - "ADD_MORE": "Añadir más", - "VIEWERS": "", - "OR_ADD_EXISTING": "O elige uno existente", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - No Encontrado", - "LINK_EXPIRED": "Enlace expirado", - "LINK_EXPIRED_MESSAGE": "Este enlace ha caducado o ha sido desactivado!", - "MANAGE_LINK": "Administrar enlace", - "LINK_TOO_MANY_REQUESTS": "Este álbum es demasiado popular para que podamos manejarlo!", - "FILE_DOWNLOAD": "Permitir descargas", - "LINK_PASSWORD_LOCK": "Contraseña bloqueada", - "PUBLIC_COLLECT": "Permitir añadir fotos", - "LINK_DEVICE_LIMIT": "Límites del dispositivo", - "NO_DEVICE_LIMIT": "Ninguno", - "LINK_EXPIRY": "Enlace vencio", - "NEVER": "Nunca", - "DISABLE_FILE_DOWNLOAD": "Deshabilitar descarga", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

¿Está seguro que desea desactivar el botón de descarga de archivos?

Los visualizadores todavía pueden tomar capturas de pantalla o guardar una copia de sus fotos usando herramientas externas.

", - "MALICIOUS_CONTENT": "Contiene contenido malicioso", - "COPYRIGHT": "Infracciones sobre los derechos de autor de alguien que estoy autorizado a representar", - "SHARED_USING": "Compartido usando ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Usa el código {{referralCode}} para obtener 10 GB gratis", - "LIVE": "VIVO", - "DISABLE_PASSWORD": "Desactivar contraseña", - "DISABLE_PASSWORD_MESSAGE": "Seguro que quieres cambiar la contrasena?", - "PASSWORD_LOCK": "Contraseña bloqueada", - "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuración", - "UPLOAD_FILES": "Archivo", - "UPLOAD_DIRS": "Carpeta", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Deduplicar archivos", - "AUTHENTICATOR_SECTION": "Autenticación", - "NO_DUPLICATES_FOUND": "No tienes archivos duplicados que puedan ser borrados", - "CLUB_BY_CAPTURE_TIME": "Club por tiempo de captura", - "FILES": "Archivos", - "EACH": "Cada", - "DEDUPLICATE_BASED_ON_SIZE": "Los siguientes archivos fueron organizados en base a sus tamaños, por favor revise y elimine elementos que cree que son duplicados", - "STOP_ALL_UPLOADS_MESSAGE": "¿Está seguro que desea detener todas las subidas en curso?", - "STOP_UPLOADS_HEADER": "Detener las subidas?", - "YES_STOP_UPLOADS": "Sí, detener las subidas", - "STOP_DOWNLOADS_HEADER": "¿Detener las descargas?", - "YES_STOP_DOWNLOADS": "Sí, detener las descargas", - "STOP_ALL_DOWNLOADS_MESSAGE": "¿Estás seguro de que quieres detener todas las descargas en curso?", - "albums_one": "1 álbum", - "albums_other": "{{count}} álbumes", - "ALL_ALBUMS": "Todos los álbumes", - "ALBUMS": "Álbumes", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "Ingrese el código de seis dígitos de su aplicación de autenticación a continuación.", - "CREATE_ACCOUNT": "Crear cuenta", - "COPIED": "Copiado", - "CANVAS_BLOCKED_TITLE": "No se puede generar la miniatura", - "CANVAS_BLOCKED_MESSAGE": "

Parece que su navegador ha deshabilitado el acceso al lienzo, que es necesario para generar miniaturas para tus fotos

Por favor, activa el acceso al lienzo de tu navegador, o revisa nuestra aplicación de escritorio

", - "WATCH_FOLDERS": "Ver carpetas", - "UPGRADE_NOW": "Mejorar ahora", - "RENEW_NOW": "Renovar ahora", - "STORAGE": "Almacén", - "USED": "usado", - "YOU": "Usted", - "FAMILY": "Familia", - "FREE": "gratis", - "OF": "de", - "WATCHED_FOLDERS": "Ver carpetas", - "NO_FOLDERS_ADDED": "No hay carpetas añadidas!", - "FOLDERS_AUTOMATICALLY_MONITORED": "Las carpetas que añadas aquí serán supervisadas automáticamente", - "UPLOAD_NEW_FILES_TO_ENTE": "Subir nuevos archivos a ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Eliminar archivos borrados de ente", - "ADD_FOLDER": "Añadir carpeta", - "STOP_WATCHING": "Dejar de ver", - "STOP_WATCHING_FOLDER": "Dejar de ver carpeta?", - "STOP_WATCHING_DIALOG_MESSAGE": "Tus archivos existentes no serán eliminados, pero ente dejará de actualizar automáticamente el álbum enlazado en caso de cambios en esta carpeta.", - "YES_STOP": "Sí, detener", - "MONTH_SHORT": "mes", - "YEAR": "año", - "FAMILY_PLAN": "Plan familiar", - "DOWNLOAD_LOGS": "Descargar logs", - "DOWNLOAD_LOGS_MESSAGE": "

Esto descargará los registros de depuración, que puede enviarnos por correo electrónico para ayudarnos a depurar su problema.

Tenga en cuenta que los nombres de los archivos se incluirán para ayudar al seguimiento de problemas con archivos específicos.

", - "CHANGE_FOLDER": "Cambiar carpeta", - "TWO_MONTHS_FREE": "Obtén 2 meses gratis en planes anuales", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continuar con el plan gratuito", - "FREE_PLAN_DESCRIPTION": "1 GB por 1 año", - "CURRENT_USAGE": "El uso actual es {{usage}}", - "WEAK_DEVICE": "El navegador web que está utilizando no es lo suficientemente poderoso para cifrar sus fotos. Por favor, intente iniciar sesión en ente en su computadora, o descargue la aplicación ente para móvil/escritorio.", - "DRAG_AND_DROP_HINT": "O arrastre y suelte en la ventana ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Los datos subidos se eliminarán y su cuenta se eliminará de forma permanente.

Esta acción no es reversible.", - "AUTHENTICATE": "Autenticado", - "UPLOADED_TO_SINGLE_COLLECTION": "Subir a una sola colección", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Subir a colecciones separadas", - "NEVERMIND": "No importa", - "UPDATE_AVAILABLE": "Actualizacion disponible", - "UPDATE_INSTALLABLE_MESSAGE": "Una nueva versión de ente está lista para ser instalada.", - "INSTALL_NOW": "Instalar ahora", - "INSTALL_ON_NEXT_LAUNCH": "Instalar en el próximo lanzamiento", - "UPDATE_AVAILABLE_MESSAGE": "Una nueva versión de ente ha sido lanzada, pero no se puede descargar e instalar automáticamente.", - "DOWNLOAD_AND_INSTALL": "Descargar e instalar", - "IGNORE_THIS_VERSION": "Ignorar esta versión", - "TODAY": "Hoy", - "YESTERDAY": "Ayer", - "NAME_PLACEHOLDER": "Nombre...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "No se puede crear álbumes de mezcla de archivos/carpetas", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Has arrastrado y soltado una mezcla de archivos y carpetas.

Por favor proporcione sólo archivos o carpetas cuando seleccione la opción de crear álbumes separados

", - "CHOSE_THEME": "Elegir tema", - "ML_SEARCH": "Buscar ML (beta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Esto permitirá el aprendizaje automático en el dispositivo y la búsqueda facial que comenzará a analizar las fotos subidas localmente.

Para la primera ejecución después de iniciar sesión o habilitar esta función, se descargarán todas las imágenes en el dispositivo local para analizarlas. Así que por favor actívalo sólo si dispones ancho de banda y el almacenamiento suficiente para el procesamiento local de todas las imágenes en tu biblioteca de fotos.

Si esta es la primera vez que está habilitando, también le pediremos su permiso para procesar los datos faciales.

", - "ML_MORE_DETAILS": "Más detalles", - "ENABLE_FACE_SEARCH": "Activar búsqueda facial", - "ENABLE_FACE_SEARCH_TITLE": "Activar búsqueda facial?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Si activas la búsqueda facial, ente extraerá la geometría facial de tus fotos. Esto sucederá en su dispositivo y cualquier dato biométrico generado será cifrado de extremo a extremo.

Haga clic aquí para obtener más detalles sobre esta característica en nuestra política de privacidad

", - "DISABLE_BETA": "Desactivar beta", - "DISABLE_FACE_SEARCH": "Desactivar búsqueda facial", - "DISABLE_FACE_SEARCH_TITLE": "Desactivar búsqueda facial?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente dejará de procesar la geometría facial, y también desactivará la búsqueda ML (beta)

Puede volver a activar la búsqueda facial si lo desea, ya que esta operación es segura.

", - "ADVANCED": "Avanzado", - "FACE_SEARCH_CONFIRMATION": "Comprendo y deseo permitir que ente procese la geometría de la cara", - "LABS": "Labs", - "YOURS": "tuyo", - "PASSPHRASE_STRENGTH_WEAK": "Fortaleza de la contraseña: débil", - "PASSPHRASE_STRENGTH_MODERATE": "Fortaleza de contraseña: Moderar", - "PASSPHRASE_STRENGTH_STRONG": "Fortaleza de contraseña: fuerte", - "PREFERENCES": "Preferencias", - "LANGUAGE": "Idioma", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Archivo de exportación inválido", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

El directorio de exportación seleccionado no existe.

Por favor, seleccione un directorio válido.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Falló la verificación de la suscripción", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "después de una hora", - "DAY": "después de un día", - "WEEK": "después de una semana", - "MONTH": "después de un mes", - "YEAR": "después de un año" - }, - "COPY_LINK": "Copiar enlace", - "DONE": "Hecho", - "LINK_SHARE_TITLE": "O comparte un enlace", - "REMOVE_LINK": "Eliminar enlace", - "CREATE_PUBLIC_SHARING": "Crear un enlace público", - "PUBLIC_LINK_CREATED": "Enlace público creado", - "PUBLIC_LINK_ENABLED": "Enlace público activado", - "COLLECT_PHOTOS": "Obtener fotos", - "PUBLIC_COLLECT_SUBTEXT": "Permitir a las personas con el enlace añadir fotos al álbum compartido.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} archivos exportados", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "Exportar iniciando", - "IN_PROGRESS": "Exportación ya en curso", - "FINISH": "Exportación finalizada", - "UP_TO_DATE": "No hay nuevos archivos para exportar" - }, - "CONTINUOUS_EXPORT": "Sincronizar continuamente", - "TOTAL_ITEMS": "Total de elementos", - "PENDING_ITEMS": "Elementos pendientes", - "EXPORT_STARTING": "Exportar iniciando...", - "DELETE_ACCOUNT_REASON_LABEL": "¿Cuál es la razón principal por la que eliminas tu cuenta?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Selecciona una razón", - "DELETE_REASON": { - "MISSING_FEATURE": "Falta una característica clave que necesito", - "BROKEN_BEHAVIOR": "La aplicación o una característica determinada no se comporta como creo que debería", - "FOUND_ANOTHER_SERVICE": "He encontrado otro servicio que me gusta más", - "NOT_LISTED": "Mi motivo no se encuentra en la lista" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Lamentamos que te vayas. Explica por qué te vas para ayudarnos a mejorar.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Sugerencias", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Sí, quiero eliminar permanentemente esta cuenta y todos sus datos", - "CONFIRM_DELETE_ACCOUNT": "Corfirmar borrado de cuenta", - "FEEDBACK_REQUIRED": "Ayúdanos con esta información", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Qué hace mejor el otro servicio?", - "RECOVER_TWO_FACTOR": "Recuperar dos factores", - "at": "a las", - "AUTH_NEXT": "siguiente", - "AUTH_DOWNLOAD_MOBILE_APP": "Descarga nuestra aplicación móvil para administrar tus secretos", - "HIDDEN": "", - "HIDE": "Ocultar", - "UNHIDE": "Mostrar", - "UNHIDE_TO_COLLECTION": "Hacer visible al álbum", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "Video", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "Transformar", - "COLORS": "Colores", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/fi-FI/translation.json b/web/apps/accounts/public/locales/fi-FI/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/accounts/public/locales/fi-FI/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/fr-FR/translation.json b/web/apps/accounts/public/locales/fr-FR/translation.json deleted file mode 100644 index 43d959069..000000000 --- a/web/apps/accounts/public/locales/fr-FR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Sauvegardes privées
pour vos souvenirs
", - "HERO_SLIDE_1": "Chiffrement de bout en bout par défaut", - "HERO_SLIDE_2_TITLE": "
Sécurisé
dans un abri antiatomique
", - "HERO_SLIDE_2": "Conçu pour survivre", - "HERO_SLIDE_3_TITLE": "
Disponible
en tout lieu
", - "HERO_SLIDE_3": "Android, iOS, Web, Ordinateur", - "LOGIN": "Connexion", - "SIGN_UP": "Inscription", - "NEW_USER": "Nouveau sur ente", - "EXISTING_USER": "Utilisateur existant", - "ENTER_NAME": "Saisir un nom", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Ajouter un nom afin que vos amis sachent qui remercier pour ces magnifiques photos!", - "ENTER_EMAIL": "Saisir l'adresse e-mail", - "EMAIL_ERROR": "Saisir un e-mail valide", - "REQUIRED": "Nécessaire", - "EMAIL_SENT": "Code de vérification envoyé à {{email}}", - "CHECK_INBOX": "Veuillez consulter votre boite de réception (et indésirables) pour poursuivre la vérification", - "ENTER_OTT": "Code de vérification", - "RESEND_MAIL": "Renvoyer le code", - "VERIFY": "Vérifier", - "UNKNOWN_ERROR": "Quelque chose s'est mal passé, veuillez recommencer", - "INVALID_CODE": "Code de vérification non valide", - "EXPIRED_CODE": "Votre code de vérification a expiré", - "SENDING": "Envoi...", - "SENT": "Envoyé!", - "PASSWORD": "Mot de passe", - "LINK_PASSWORD": "Saisir le mot de passe pour déverrouiller l'album", - "RETURN_PASSPHRASE_HINT": "Mot de passe", - "SET_PASSPHRASE": "Définir le mot de passe", - "VERIFY_PASSPHRASE": "Connexion", - "INCORRECT_PASSPHRASE": "Mot de passe non valide", - "ENTER_ENC_PASSPHRASE": "Veuillez saisir un mot de passe que nous pourrons utiliser pour chiffrer vos données", - "PASSPHRASE_DISCLAIMER": "Nous ne stockons pas votre mot de passe, donc si vous le perdez, nous ne pourrons pas vous aider à récupérer vos données sans une clé de récupération.", - "WELCOME_TO_ENTE_HEADING": "Bienvenue sur ", - "WELCOME_TO_ENTE_SUBHEADING": "Stockage et partage photo avec cryptage de bout en bout", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Là où vivent vos meilleures photos", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Génération des clés de chiffrement...", - "PASSPHRASE_HINT": "Mot de passe", - "CONFIRM_PASSPHRASE": "Confirmer le mot de passe", - "REFERRAL_CODE_HINT": "Comment avez-vous entendu parler de Ente? (facultatif)", - "REFERRAL_INFO": "Nous ne suivons pas les installations d'applications. Il serait utile que vous nous disiez comment vous nous avez trouvés !", - "PASSPHRASE_MATCH_ERROR": "Les mots de passe ne correspondent pas", - "CREATE_COLLECTION": "Nouvel album", - "ENTER_ALBUM_NAME": "Nom de l'album", - "CLOSE_OPTION": "Fermer (Échap)", - "ENTER_FILE_NAME": "Nom du fichier", - "CLOSE": "Fermer", - "NO": "Non", - "NOTHING_HERE": "Il n'y a encore rien à voir ici 👀", - "UPLOAD": "Charger", - "IMPORT": "Importer", - "ADD_PHOTOS": "Ajouter des photos", - "ADD_MORE_PHOTOS": "Ajouter plus de photos", - "add_photos_one": "Ajouter une photo", - "add_photos_other": "Ajouter {{count}} photos", - "SELECT_PHOTOS": "Sélectionner des photos", - "FILE_UPLOAD": "Fichier chargé", - "UPLOAD_STAGE_MESSAGE": { - "0": "Préparation du chargement", - "1": "Lecture des fichiers de métadonnées de Google", - "2": "Métadonnées des fichiers {{uploadCounter.finished}} / {{uploadCounter.total}} extraites", - "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} fichiers sauvegardés", - "4": "Annulation des chargements restants", - "5": "Sauvegarde terminée" - }, - "FILE_NOT_UPLOADED_LIST": "Les fichiers suivants n'ont pas été chargés", - "SUBSCRIPTION_EXPIRED": "Abonnement expiré", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Votre abonnement a expiré, veuillez le renouveler ", - "STORAGE_QUOTA_EXCEEDED": "Limite de stockage atteinte", - "INITIAL_LOAD_DELAY_WARNING": "La première consultation peut prendre du temps", - "USER_DOES_NOT_EXIST": "Désolé, impossible de trouver un utilisateur avec cet e-mail", - "NO_ACCOUNT": "Je n'ai pas de compte", - "ACCOUNT_EXISTS": "J'ai déjà un compte", - "CREATE": "Créer", - "DOWNLOAD": "Télécharger", - "DOWNLOAD_OPTION": "Télécharger (D)", - "DOWNLOAD_FAVORITES": "Télécharger les favoris", - "DOWNLOAD_UNCATEGORIZED": "Télécharger les hors catégories", - "DOWNLOAD_HIDDEN_ITEMS": "Télécharger les fichiers masqués", - "COPY_OPTION": "Copier en PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Plein écran (F)", - "ZOOM_IN_OUT": "Zoom +/-", - "PREVIOUS": "Précédent (←)", - "NEXT": "Suivant (→)", - "TITLE_PHOTOS": "Ente Photos", - "TITLE_ALBUMS": "Ente Photos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Chargez votre 1ere photo", - "IMPORT_YOUR_FOLDERS": "Importez vos dossiers", - "UPLOAD_DROPZONE_MESSAGE": "Déposez pour sauvegarder vos fichiers", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Déposez pour ajouter un dossier surveillé", - "TRASH_FILES_TITLE": "Supprimer les fichiers ?", - "TRASH_FILE_TITLE": "Supprimer le fichier ?", - "DELETE_FILES_TITLE": "Supprimer immédiatement?", - "DELETE_FILES_MESSAGE": "Les fichiers sélectionnés seront définitivement supprimés de votre compte ente.", - "DELETE": "Supprimer", - "DELETE_OPTION": "Supprimer (DEL)", - "FAVORITE_OPTION": "Favori (L)", - "UNFAVORITE_OPTION": "Non favori (L)", - "MULTI_FOLDER_UPLOAD": "Plusieurs dossiers détectés", - "UPLOAD_STRATEGY_CHOICE": "Voulez-vous les charger dans", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un seul album", - "OR": "ou", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Albums séparés", - "SESSION_EXPIRED_MESSAGE": "Votre session a expiré, veuillez vous reconnecter pour poursuivre", - "SESSION_EXPIRED": "Session expiré", - "PASSWORD_GENERATION_FAILED": "Votre navigateur ne permet pas de générer une clé forte correspondant aux standards de chiffrement de ente, veuillez réessayer en utilisant l'appli mobile ou un autre navigateur", - "CHANGE_PASSWORD": "Modifier le mot de passe", - "GO_BACK": "Retour", - "RECOVERY_KEY": "Clé de récupération", - "SAVE_LATER": "Plus tard", - "SAVE": "Sauvegarder la clé", - "RECOVERY_KEY_DESCRIPTION": "Si vous oubliez votre mot de passe, la seule façon de récupérer vos données sera grâce à cette clé.", - "RECOVER_KEY_GENERATION_FAILED": "Le code de récupération ne peut être généré, veuillez réessayer", - "KEY_NOT_STORED_DISCLAIMER": "Nous ne stockons pas cette clé, veuillez donc la sauvegarder dans un endroit sûr", - "FORGOT_PASSWORD": "Mot de passe oublié", - "RECOVER_ACCOUNT": "Récupérer le compte", - "RECOVERY_KEY_HINT": "Clé de récupération", - "RECOVER": "Récupérer", - "NO_RECOVERY_KEY": "Pas de clé de récupération?", - "INCORRECT_RECOVERY_KEY": "Clé de récupération non valide", - "SORRY": "Désolé", - "NO_RECOVERY_KEY_MESSAGE": "En raison de notre protocole de chiffrement de bout en bout, vos données ne peuvent être décryptées sans votre mot de passe ou clé de récupération", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Veuillez envoyer un e-mail à {{emailID}} depuis votre adresse enregistrée", - "CONTACT_SUPPORT": "Contacter le support", - "REQUEST_FEATURE": "Soumettre une idée", - "SUPPORT": "Support", - "CONFIRM": "Confirmer", - "CANCEL": "Annuler", - "LOGOUT": "Déconnexion", - "DELETE_ACCOUNT": "Supprimer le compte", - "DELETE_ACCOUNT_MESSAGE": "

Veuillez envoyer un e-mail à {{emailID}}depuis Votre adresse enregistrée.

Votre demande sera traitée dans les 72 heures.

", - "LOGOUT_MESSAGE": "Voulez-vous vraiment vous déconnecter?", - "CHANGE_EMAIL": "Modifier l'e-mail", - "OK": "Ok", - "SUCCESS": "Parfait", - "ERROR": "Erreur", - "MESSAGE": "Message", - "INSTALL_MOBILE_APP": "Installez notre application Android or iOS pour sauvegarder automatiquement toutes vos photos", - "DOWNLOAD_APP_MESSAGE": "Désolé, cette opération est actuellement supportée uniquement sur notre appli pour ordinateur", - "DOWNLOAD_APP": "Télécharger l'appli pour ordinateur", - "EXPORT": "Exporter des données", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "S'abonner", - "MANAGEMENT_PORTAL": "Gérer le mode de paiement", - "MANAGE_FAMILY_PORTAL": "Gérer la famille", - "LEAVE_FAMILY_PLAN": "Quitter le plan famille", - "LEAVE": "Quitter", - "LEAVE_FAMILY_CONFIRM": "Êtes-vous certains de vouloir quitter le plan famille?", - "CHOOSE_PLAN": "Choisir votre plan", - "MANAGE_PLAN": "Gérer votre abonnement", - "ACTIVE": "Actif", - "OFFLINE_MSG": "Vous êtes hors-ligne, les mémoires cache sont affichées", - "FREE_SUBSCRIPTION_INFO": "Vous êtes sur le plan gratuit qui expire le {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Vous êtes sur le plan famille géré par", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renouveler le {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Pris fin le {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Votre abonnement sera annulé le {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Votre module {{storage, string}} est valable jusqu'au {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Vous avez dépassé votre quota de stockage, veuillez mettre à niveau ", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Nous avons reçu votre paiement

Votre abonnement est valide jusqu'au {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Votre achat est annulé, veuillez réessayer si vous souhaitez vous abonner", - "SUBSCRIPTION_PURCHASE_FAILED": "Échec lors de l'achat de l'abonnement, veuillez réessayer", - "SUBSCRIPTION_UPDATE_FAILED": "Échec lors de la mise à niveau de l'abonnement, veuillez réessayer", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Désolé, échec de paiement lors de la saisie de votre carte, veuillez mettr eà jour votre moyen de paiement et réessayer", - "STRIPE_AUTHENTICATION_FAILED": "Nous n'avons pas pu authentifier votre moyen de paiement. Veuillez choisir un moyen différent et réessayer", - "UPDATE_PAYMENT_METHOD": "Mise à jour du moyen de paiement", - "MONTHLY": "Mensuel", - "YEARLY": "Annuel", - "UPDATE_SUBSCRIPTION_MESSAGE": "Êtes-vous certains de vouloir changer de plan?", - "UPDATE_SUBSCRIPTION": "Changer de plan", - "CANCEL_SUBSCRIPTION": "Annuler l'abonnement", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Toutes vos données seront supprimées de nos serveurs à la fin de cette période d'abonnement.

Voulez-vous vraiment annuler votre abonnement?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "Êtes-vous sûr de vouloir annuler votre abonnement ", - "SUBSCRIPTION_CANCEL_FAILED": "Échec lors de l'annulation de l'abonnement", - "SUBSCRIPTION_CANCEL_SUCCESS": "Votre abonnement a bien été annulé", - "REACTIVATE_SUBSCRIPTION": "Réactiver l'abonnement", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Une fois réactivée, vous serrez facturé de {{val, datetime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Votre abonnement est bien activé ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Échec lors de la réactivation de l'abonnement", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Merci", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Annuler l'abonnement mobile", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Veuillez annuler votre abonnement depuis l'appli mobile pour activer un abonnement ici", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Veuillez nous contacter à {{emailID}} pour gérer votre abonnement", - "RENAME": "Renommer", - "RENAME_FILE": "Renommer le fichier", - "RENAME_COLLECTION": "Renommer l'album", - "DELETE_COLLECTION_TITLE": "Supprimer l'album?", - "DELETE_COLLECTION": "Supprimer l'album", - "DELETE_COLLECTION_MESSAGE": "Supprimer aussi les photos (et vidéos) présentes dans cet album depuis tous les autres albums dont ils font partie?", - "DELETE_PHOTOS": "Supprimer des photos", - "KEEP_PHOTOS": "Conserver des photos", - "SHARE": "Partager", - "SHARE_COLLECTION": "Partager l'album", - "SHAREES": "Partager avec", - "SHARE_WITH_SELF": "Oups, vous ne pouvez pas partager avec vous-même", - "ALREADY_SHARED": "Oups, vous partager déjà cela avec {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Partage d'album non autorisé", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Le partage est désactivé pour les comptes gratuits", - "DOWNLOAD_COLLECTION": "Télécharger l'album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Êtes-vous certains de vouloir télécharger l'album complet?

Tous les fichiers seront mis en file d'attente pour un téléchargement fractionné

", - "CREATE_ALBUM_FAILED": "Échec de création de l'album , veuillez réessayer", - "SEARCH": "Recherche", - "SEARCH_RESULTS": "Résultats de la recherche", - "NO_RESULTS": "Aucun résultat trouvé", - "SEARCH_HINT": "Recherche d'albums, dates, descriptions, ...", - "SEARCH_TYPE": { - "COLLECTION": "l'album", - "LOCATION": "Emplacement", - "CITY": "Adresse", - "DATE": "Date", - "FILE_NAME": "Nom de fichier", - "THING": "Chose", - "FILE_CAPTION": "Description", - "FILE_TYPE": "Type de fichier", - "CLIP": "Magique" - }, - "photos_count_zero": "Pas de souvenirs", - "photos_count_one": "1 souvenir", - "photos_count_other": "{{count}} souvenirs", - "TERMS_AND_CONDITIONS": "J'accepte les conditions et la politique de confidentialité", - "ADD_TO_COLLECTION": "Ajouter à l'album", - "SELECTED": "Sélectionné", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Cette vidéo ne peut pas être lue sur votre navigateur", - "PEOPLE": "Visages", - "INDEXING_SCHEDULED": "L'indexation est planifiée...", - "ANALYZING_PHOTOS": "analyse des nouvelles photos {{indexStatus.nSyncedFiles}} sur {{indexStatus.nTotalFiles}} effectué)...", - "INDEXING_PEOPLE": "indexation des visages dans {{indexStatus.nSyncedFiles}} photos...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles}} photos indexées", - "UNIDENTIFIED_FACES": "visages non-identifiés", - "OBJECTS": "objets", - "TEXT": "texte", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Nom de fichier", - "CAPTION_PLACEHOLDER": "Ajouter une description", - "LOCATION": "Emplacement", - "SHOW_ON_MAP": "Visualiser sur OpenStreetMap", - "MAP": "Carte", - "MAP_SETTINGS": "Paramètres de la carte", - "ENABLE_MAPS": "Activer la carte?", - "ENABLE_MAP": "Activer la carte", - "DISABLE_MAPS": "Désactiver la carte?", - "ENABLE_MAP_DESCRIPTION": "

Cette fonction affiche vos photos sur une carte du monde.

La carte est hébergée par OpenStreetMap, et les emplacements exacts de vos photos ne sont jamais partagés.

Vous pouvez désactiver cette fonction à tout moment dans des paramètres.

", - "DISABLE_MAP_DESCRIPTION": "

Cette fonction désactive l'affichage de vos photos sur une carte du monde.

Vous pouvez activer cette fonction à tout moment dans les Paramètres.

", - "DISABLE_MAP": "Désactiver la carte", - "DETAILS": "Détails", - "VIEW_EXIF": "Visualiser toutes les données EXIF", - "NO_EXIF": "Aucune donnée EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Double authentification", - "TWO_FACTOR_AUTHENTICATION": "Authentification double-facteur", - "TWO_FACTOR_QR_INSTRUCTION": "Scannez le QRCode ci-dessous avec une appli d'authentification", - "ENTER_CODE_MANUALLY": "Saisir le code manuellement", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Veuillez saisir ce code dans votre appli d'authentification", - "SCAN_QR_CODE": "Scannez le QRCode de préférence", - "ENABLE_TWO_FACTOR": "Activer la double-authentification", - "ENABLE": "Activer", - "LOST_DEVICE": "Perte de l'appareil identificateur", - "INCORRECT_CODE": "Code non valide", - "TWO_FACTOR_INFO": "Rajoutez une couche de sécurité supplémentaire afin de pas utiliser simplement votre e-mail et mot de passe pour vous connecter à votre compte", - "DISABLE_TWO_FACTOR_LABEL": "Désactiver la double-authentification", - "UPDATE_TWO_FACTOR_LABEL": "Mise à jour de votre appareil identificateur", - "DISABLE": "Désactiver", - "RECONFIGURE": "Reconfigurer", - "UPDATE_TWO_FACTOR": "Mise à jour de la double-authentification", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuer annulera tous les identificateurs précédemment configurés", - "UPDATE": "Mise à jour", - "DISABLE_TWO_FACTOR": "Désactiver la double-authentification", - "DISABLE_TWO_FACTOR_MESSAGE": "Êtes-vous certains de vouloir désactiver la double-authentification", - "TWO_FACTOR_DISABLE_FAILED": "Échec de désactivation de la double-authentification, veuillez réessayer", - "EXPORT_DATA": "Exporter les données", - "SELECT_FOLDER": "Sélectionner un dossier", - "DESTINATION": "Destination", - "START": "Démarrer", - "LAST_EXPORT_TIME": "Horaire du dernier export", - "EXPORT_AGAIN": "Resynchro", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Stockage local non accessible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Votre navigateur ou un complément bloque ente qui ne peut sauvegarder les données sur votre stockage local. Veuillez relancer cette page après avoir changé de mode de navigation.", - "SEND_OTT": "Envoyer l'OTP", - "EMAIl_ALREADY_OWNED": "Cet e-mail est déjà pris", - "ETAGS_BLOCKED": "

Nosu n'avons pas pu charger les fichiers suivants à cause de la configuration de votre navigateur.

Veuillez désactiver tous les compléments qui pourraient empêcher ente d'utiliser les eTags pour charger de larges fichiers, ou bien utilisez notre appli pour ordinateurpour une meilleure expérience lors des chargements.

", - "SKIPPED_VIDEOS_INFO": "

Actuellement, nous ne supportons pas l'ajout de videos via des liens publics.

Pour partager des vidéos, veuillez vous connecter àente et partager en utilisant l'e-mail concerné.

", - "LIVE_PHOTOS_DETECTED": "Les fichiers photos et vidéos depuis votre espace Live Photos ont été fusionnés en un seul fichier", - "RETRY_FAILED": "Réessayer les chargements ayant échoués", - "FAILED_UPLOADS": "Chargements échoués ", - "SKIPPED_FILES": "Chargements ignorés", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Échec de création d'une miniature", - "UNSUPPORTED_FILES": "Fichiers non supportés", - "SUCCESSFUL_UPLOADS": "Chargements réussis", - "SKIPPED_INFO": "Ignorés car il y a des fichiers avec des noms identiques dans le même album", - "UNSUPPORTED_INFO": "ente ne supporte pas encore ces formats de fichiers", - "BLOCKED_UPLOADS": "Chargements bloqués", - "SKIPPED_VIDEOS": "Vidéos ignorées", - "INPROGRESS_METADATA_EXTRACTION": "En cours", - "INPROGRESS_UPLOADS": "Chargements en cours", - "TOO_LARGE_UPLOADS": "Gros fichiers", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Stockage insuffisant", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Ces fichiers n'ont pas été chargés car ils dépassent la taille maximale de votre plan de stockage", - "TOO_LARGE_INFO": "Ces fichiers n'ont pas été chargés car ils dépassent notre taille limite par fichier", - "THUMBNAIL_GENERATION_FAILED_INFO": "Ces fichiers sont bien chargés, mais nous ne pouvons pas créer de miniatures pour eux.", - "UPLOAD_TO_COLLECTION": "Charger dans l'album", - "UNCATEGORIZED": "Aucune catégorie", - "ARCHIVE": "Archiver", - "FAVORITES": "Favoris", - "ARCHIVE_COLLECTION": "Archiver l'album", - "ARCHIVE_SECTION_NAME": "Archivé", - "ALL_SECTION_NAME": "Tous", - "MOVE_TO_COLLECTION": "Déplacer vers l'album", - "UNARCHIVE": "Désarchiver", - "UNARCHIVE_COLLECTION": "Désarchiver l'album", - "HIDE_COLLECTION": "Masquer l'album", - "UNHIDE_COLLECTION": "Dévoiler l'album", - "MOVE": "Déplacer", - "ADD": "Ajouter", - "REMOVE": "Retirer", - "YES_REMOVE": "Oui, retirer", - "REMOVE_FROM_COLLECTION": "Retirer de l'album", - "TRASH": "Corbeille", - "MOVE_TO_TRASH": "Déplacer vers la corbeille", - "TRASH_FILES_MESSAGE": "Les fichiers sélectionnés seront retirés de tous les albums puis déplacés dans la corbeille.", - "TRASH_FILE_MESSAGE": "Le fichier sera retiré de tous les albums puis déplacé dans la corbeille.", - "DELETE_PERMANENTLY": "Supprimer définitivement", - "RESTORE": "Restaurer", - "RESTORE_TO_COLLECTION": "Restaurer vers l'album", - "EMPTY_TRASH": "Corbeille vide", - "EMPTY_TRASH_TITLE": "Vider la corbeille ?", - "EMPTY_TRASH_MESSAGE": "Ces fichiers seront définitivement supprimés de votre compte ente.", - "LEAVE_SHARED_ALBUM": "Oui, quitter", - "LEAVE_ALBUM": "Quitter l'album", - "LEAVE_SHARED_ALBUM_TITLE": "Quitter l'album partagé?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Vous allez quitter cet album, il ne sera plus visible pour vous.", - "NOT_FILE_OWNER": "Vous ne pouvez pas supprimer les fichiers d'un album partagé", - "CONFIRM_SELF_REMOVE_MESSAGE": "Choisir les objets qui seront retirés de cet album. Ceux qui sont présents uniquement dans cet album seront déplacés comme hors catégorie.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Certains des objets que vous êtes en train de retirer ont été ajoutés par d'autres personnes, vous perdrez l'accès vers ces objets.", - "SORT_BY_CREATION_TIME_ASCENDING": "Plus anciens", - "SORT_BY_UPDATION_TIME_DESCENDING": "Dernière mise à jour", - "SORT_BY_NAME": "Nom", - "COMPRESS_THUMBNAILS": "Compresser les miniatures", - "THUMBNAIL_REPLACED": "Les miniatures sont compressées", - "FIX_THUMBNAIL": "Compresser", - "FIX_THUMBNAIL_LATER": "Compresser plus tard", - "REPLACE_THUMBNAIL_NOT_STARTED": "Certaines miniatures de vidéos peuvent être compressées pour gagner de la place. Voulez-vous que ente les compresse?", - "REPLACE_THUMBNAIL_COMPLETED": "Toutes les miniatures ont été compressées", - "REPLACE_THUMBNAIL_NOOP": "Vous n'avez aucune miniature qui peut être encore plus compressée", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Impossible de compresser certaines miniatures, veuillez réessayer", - "FIX_CREATION_TIME": "Réajuster l'heure", - "FIX_CREATION_TIME_IN_PROGRESS": "Réajustement de l'heure", - "CREATION_TIME_UPDATED": "L'heure du fichier a été réajustée", - "UPDATE_CREATION_TIME_NOT_STARTED": "Sélectionnez l'option que vous souhaitez utiliser", - "UPDATE_CREATION_TIME_COMPLETED": "Mise à jour effectuée pour tous les fichiers", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "L'heure du fichier n'a pas été mise à jour pour certains fichiers, veuillez réessayer", - "CAPTION_CHARACTER_LIMIT": "5000 caractères max", - "DATE_TIME_ORIGINAL": "EXIF:DateTimeOriginal", - "DATE_TIME_DIGITIZED": "EXIF:DateTimeDigitized", - "METADATA_DATE": "EXIF:MetadataDate", - "CUSTOM_TIME": "Heure personnalisée", - "REOPEN_PLAN_SELECTOR_MODAL": "Rouvrir les plans", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Échec pour rouvrir les plans", - "INSTALL": "Installer", - "SHARING_DETAILS": "Détails du partage", - "MODIFY_SHARING": "Modifier le partage", - "ADD_COLLABORATORS": "Ajouter des collaborateurs", - "ADD_NEW_EMAIL": "Ajouter un nouvel email", - "shared_with_people_zero": "Partager avec des personnes spécifiques", - "shared_with_people_one": "Partagé avec 1 personne", - "shared_with_people_other": "Partagé avec {{count, number}} personnes", - "participants_zero": "Aucun participant", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", - "ADD_VIEWERS": "Ajouter un observateur", - "PARTICIPANTS": "Participants", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} ne pourra plus ajouter de photos à l'album

Il pourra toujours supprimer les photos qu'il a ajoutées

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} pourra ajouter des photos à l'album", - "CONVERT_TO_VIEWER": "Oui, convertir en observateur", - "CONVERT_TO_COLLABORATOR": "Oui, convertir en collaborateur", - "CHANGE_PERMISSION": "Modifier la permission?", - "REMOVE_PARTICIPANT": "Retirer?", - "CONFIRM_REMOVE": "Oui, supprimer", - "MANAGE": "Gérer", - "ADDED_AS": "Ajouté comme", - "COLLABORATOR_RIGHTS": "Les collaborateurs peuvent ajouter des photos et des vidéos à l'album partagé", - "REMOVE_PARTICIPANT_HEAD": "Supprimer le participant", - "OWNER": "Propriétaire", - "COLLABORATORS": "Collaborateurs", - "ADD_MORE": "Ajouter plus", - "VIEWERS": "Visionneurs", - "OR_ADD_EXISTING": "ou sélectionner un fichier existant", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} sera supprimé de l'album

Toutes les photos ajoutées par cette personne seront également supprimées de l'album

", - "NOT_FOUND": "404 - non trouvé", - "LINK_EXPIRED": "Lien expiré", - "LINK_EXPIRED_MESSAGE": "Ce lien à soit expiré soit est supprimé!", - "MANAGE_LINK": "Gérer le lien", - "LINK_TOO_MANY_REQUESTS": "Désolé, cet album a été consulté sur trop d'appareils !", - "FILE_DOWNLOAD": "Autoriser les téléchargements", - "LINK_PASSWORD_LOCK": "Verrou par mot de passe", - "PUBLIC_COLLECT": "Autoriser l'ajout de photos", - "LINK_DEVICE_LIMIT": "Limite d'appareil", - "NO_DEVICE_LIMIT": "Aucune", - "LINK_EXPIRY": "Expiration du lien", - "NEVER": "Jamais", - "DISABLE_FILE_DOWNLOAD": "Désactiver le téléchargement", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Êtes-vous certains de vouloir désactiver le bouton de téléchargement pour les fichiers?

Ceux qui les visualisent pourront tout de même faire des captures d'écrans ou sauvegarder une copie de vos photos en utilisant des outils externes.

", - "MALICIOUS_CONTENT": "Contient du contenu malveillant", - "COPYRIGHT": "Enfreint les droits d'une personne que je réprésente", - "SHARED_USING": "Partagé en utilisant ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Utilisez le code {{referralCode}} pour obtenir 10 Go gratuits", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Désactiver le verrouillage par mot de passe", - "DISABLE_PASSWORD_MESSAGE": "Êtes-vous certains de vouloir désactiver le verrouillage par mot de passe ?", - "PASSWORD_LOCK": "Mot de passe verrou", - "LOCK": "Verrouiller", - "DOWNLOAD_UPLOAD_LOGS": "Journaux de débugs", - "UPLOAD_FILES": "Fichier", - "UPLOAD_DIRS": "Dossier", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Déduplication de fichiers", - "AUTHENTICATOR_SECTION": "Authentificateur", - "NO_DUPLICATES_FOUND": "Vous n'avez aucun fichier dédupliqué pouvant être nettoyé", - "CLUB_BY_CAPTURE_TIME": "Durée de la capture par club", - "FILES": "Fichiers", - "EACH": "Chacun", - "DEDUPLICATE_BASED_ON_SIZE": "Les fichiers suivants ont été clubbed, basé sur leurs tailles, veuillez corriger et supprimer les objets que vous pensez être dupliqués", - "STOP_ALL_UPLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", - "STOP_UPLOADS_HEADER": "Arrêter les chargements ?", - "YES_STOP_UPLOADS": "Oui, arrêter tout", - "STOP_DOWNLOADS_HEADER": "Arrêter le téléchargement ?", - "YES_STOP_DOWNLOADS": "Oui, arrêter les téléchargements", - "STOP_ALL_DOWNLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", - "albums_one": "1 album", - "albums_other": "{{count}} albums", - "ALL_ALBUMS": "Tous les albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "Tous les albums masqués", - "HIDDEN_ALBUMS": "Albums masqués", - "HIDDEN_ITEMS": "Éléments masqués", - "HIDDEN_ITEMS_SECTION_NAME": "Éléments masqués", - "ENTER_TWO_FACTOR_OTP": "Saisir le code à 6 caractères de votre appli d'authentification.", - "CREATE_ACCOUNT": "Créer un compte", - "COPIED": "Copié", - "CANVAS_BLOCKED_TITLE": "Impossible de créer une miniature", - "CANVAS_BLOCKED_MESSAGE": "

Il semblerait que votre navigateur ait désactivé l'accès au canevas, qui est nécessaire pour créer les miniatures de vos photos

Veuillez activer l'accès au canevas du navigateur, ou consulter notre appli pour ordinateur

", - "WATCH_FOLDERS": "Voir les dossiers", - "UPGRADE_NOW": "Mettre à niveau maintenant", - "RENEW_NOW": "Renouveler maintenant", - "STORAGE": "Stockage", - "USED": "utilisé", - "YOU": "Vous", - "FAMILY": "Famille", - "FREE": "gratuit", - "OF": "de", - "WATCHED_FOLDERS": "Voir les dossiers", - "NO_FOLDERS_ADDED": "Aucun dossiers d'ajouté!", - "FOLDERS_AUTOMATICALLY_MONITORED": "Les dossiers que vous ajoutez ici seront supervisés automatiquement", - "UPLOAD_NEW_FILES_TO_ENTE": "Charger de nouveaux fichiers sur ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Retirer de ente les fichiers supprimés", - "ADD_FOLDER": "Ajouter un dossier", - "STOP_WATCHING": "Arrêter de voir", - "STOP_WATCHING_FOLDER": "Arrêter de voir le dossier?", - "STOP_WATCHING_DIALOG_MESSAGE": "Vos fichiers existants ne seront pas supprimés, mais ente arrêtera automatiquement de mettre à jour le lien de l'album à chaque changements sur ce dossier.", - "YES_STOP": "Oui, arrêter", - "MONTH_SHORT": "mo", - "YEAR": "année", - "FAMILY_PLAN": "Plan famille", - "DOWNLOAD_LOGS": "Télécharger les logs", - "DOWNLOAD_LOGS_MESSAGE": "

Cela va télécharger les journaux de débug, que vous pourrez nosu envoyer par e-mail pour nous aider à résoudre votre problàme .

Veuillez noter que les noms de fichiers seront inclus .

", - "CHANGE_FOLDER": "Modifier le dossier", - "TWO_MONTHS_FREE": "Obtenir 2 mois gratuits sur les plans annuels", - "GB": "Go", - "POPULAR": "Populaire", - "FREE_PLAN_OPTION_LABEL": "Poursuivre avec la version d'essai gratuite", - "FREE_PLAN_DESCRIPTION": "1 Go pour 1 an", - "CURRENT_USAGE": "L'utilisation actuelle est de {{usage}}", - "WEAK_DEVICE": "Le navigateur que vous utilisez n'est pas assez puissant pour chiffrer vos photos. Veuillez essayer de vous connecter à ente sur votre ordinateur, ou télécharger l'appli ente mobile/ordinateur.", - "DRAG_AND_DROP_HINT": "Sinon glissez déposez dans la fenêtre ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "

Vos données chargées seront programmées pour suppression, et votre comptre sera supprimé définitivement .

Cette action n'est pas reversible.

", - "AUTHENTICATE": "Authentification", - "UPLOADED_TO_SINGLE_COLLECTION": "Chargé dans une seule collection", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Chargé dans des collections séparées", - "NEVERMIND": "Peu-importe", - "UPDATE_AVAILABLE": "Une mise à jour est disponible", - "UPDATE_INSTALLABLE_MESSAGE": "Une nouvelle version de ente est prête à être installée.", - "INSTALL_NOW": "Installer maintenant", - "INSTALL_ON_NEXT_LAUNCH": "Installer au prochain démarrage", - "UPDATE_AVAILABLE_MESSAGE": "Une nouvelle version de ente est sortie, mais elle ne peut pas être automatiquement téléchargée puis installée.", - "DOWNLOAD_AND_INSTALL": "Télécharger et installer", - "IGNORE_THIS_VERSION": "Ignorer cette version", - "TODAY": "Aujourd'hui", - "YESTERDAY": "Hier", - "NAME_PLACEHOLDER": "Nom...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Impossible de créer des albums depuis un mix fichier/dossier", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Vous avez glissé déposé un mélange de fichiers et dossiers.

Veuillez sélectionner soit uniquement des fichiers, ou des dossiers lors du choix d'options pour créer des albums séparés

", - "CHOSE_THEME": "Choisir un thème", - "ML_SEARCH": "ML search (beta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Ceci activera l'apprentissage automatique sur l'appareil et la recherche faciale qui commencera à analyser vos photos chargées.

Pour la première exécution après la connexion ou l'activation de cette fonctionnalité, cela téléchargera toutes les images sur l'appareil local pour les analyser. Veuillez donc activer ceci uniquement si vous avez de la bande passante et le traitement local de toutes les images dans votre photothèque.

Si c'est la première fois que vous activez ceci, nous vous demanderons également la permission de traiter les données faciales.

", - "ML_MORE_DETAILS": "Plus de détails", - "ENABLE_FACE_SEARCH": "Activer la recherche faciale", - "ENABLE_FACE_SEARCH_TITLE": "Activer la recherche faciale ?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face search, ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", - "DISABLE_BETA": "Désactiver la bêta", - "DISABLE_FACE_SEARCH": "Désactiver la recherche faciale", - "DISABLE_FACE_SEARCH_TITLE": "Désactiver la recherche faciale ?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente will stop processing face geometry, and will also disable ML search (beta)

You can reenable face search again if you wish, so this operation is safe

", - "ADVANCED": "Avancé", - "FACE_SEARCH_CONFIRMATION": "Je comprends, et je souhaite permettre à ente de traiter la géométrie faciale", - "LABS": "Labs", - "YOURS": "Le vôtre", - "PASSPHRASE_STRENGTH_WEAK": "Sécurité du mot de passe : faible", - "PASSPHRASE_STRENGTH_MODERATE": "Sécurité du mot de passe : moyenne", - "PASSPHRASE_STRENGTH_STRONG": "Sécurité du mot de passe : forte", - "PREFERENCES": "Préférences", - "LANGUAGE": "Langue", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Dossier d'export invalide", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Le dossier d'export que vous avez sélectionné n'existe pas

Veuillez sélectionner un dossier valide

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Échec de la vérification de l'abonnement", - "STORAGE_UNITS": { - "B": "o", - "KB": "Ko", - "MB": "Mo", - "GB": "Go", - "TB": "To" - }, - "AFTER_TIME": { - "HOUR": "dans une heure", - "DAY": "dans un jour", - "WEEK": "dans une semaine", - "MONTH": "dans un mois", - "YEAR": "dans un an" - }, - "COPY_LINK": "Copier le lien", - "DONE": "Terminé", - "LINK_SHARE_TITLE": "Ou partager un lien", - "REMOVE_LINK": "Supprimer le lien", - "CREATE_PUBLIC_SHARING": "Créer un lien public", - "PUBLIC_LINK_CREATED": "Lien public créé", - "PUBLIC_LINK_ENABLED": "Lien public activé", - "COLLECT_PHOTOS": "Récupérer les photos", - "PUBLIC_COLLECT_SUBTEXT": "Autoriser les personnes ayant le lien d'ajouter des photos à l'album partagé.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} fichiers exportés", - "MIGRATING_EXPORT": "Préparations...", - "RENAMING_COLLECTION_FOLDERS": "Renommage des dossiers de l'album en cours...", - "TRASHING_DELETED_FILES": "Mise à la corbeille des fichiers supprimés...", - "TRASHING_DELETED_COLLECTIONS": "Mise à la corbeille des albums supprimés...", - "EXPORT_NOTIFICATION": { - "START": "L'export a démarré", - "IN_PROGRESS": "Un export est déjà en cours", - "FINISH": "Export terminé", - "UP_TO_DATE": "Aucun nouveau fichier à exporter" - }, - "CONTINUOUS_EXPORT": "Synchronisation en continu", - "TOTAL_ITEMS": "Total d'objets", - "PENDING_ITEMS": "Objets en attente", - "EXPORT_STARTING": "Démarrage de l'export...", - "DELETE_ACCOUNT_REASON_LABEL": "Quelle est la raison principale de la suppression de votre compte ?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Choisir une raison", - "DELETE_REASON": { - "MISSING_FEATURE": "Il manque une fonctionnalité essentielle dont j'ai besoin", - "BROKEN_BEHAVIOR": "L'application ou une certaine fonctionnalité ne se comporte pas comme je pense qu'elle devrait", - "FOUND_ANOTHER_SERVICE": "J'ai trouvé un autre service que je préfère", - "NOT_LISTED": "Ma raison n'est pas listée" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Nous sommes désolés de vous voir partir. Expliquez-nous les raisons de votre départ pour que nous puissions nous améliorer.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Vos commentaires", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Oui, je veux supprimer définitivement ce compte et toutes ses données", - "CONFIRM_DELETE_ACCOUNT": "Confirmer la suppression du compte", - "FEEDBACK_REQUIRED": "Merci de nous aider avec cette information", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Qu'est-ce que l'autre service fait de mieux ?", - "RECOVER_TWO_FACTOR": "Récupérer la double-authentification", - "at": "à", - "AUTH_NEXT": "suivant", - "AUTH_DOWNLOAD_MOBILE_APP": "Téléchargez notre application mobile pour gérer vos secrets", - "HIDDEN": "Masqué", - "HIDE": "Masquer", - "UNHIDE": "Dévoiler", - "UNHIDE_TO_COLLECTION": "Afficher dans l'album", - "SORT_BY": "Trier par", - "NEWEST_FIRST": "Plus récent en premier", - "OLDEST_FIRST": "Plus ancien en premier", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Ce fichier n'a pas pu être aperçu. Cliquez ici pour télécharger l'original.", - "SELECT_COLLECTION": "Sélectionner album", - "PIN_ALBUM": "Épingler l'album", - "UNPIN_ALBUM": "Désépingler l'album", - "DOWNLOAD_COMPLETE": "Téléchargement terminé", - "DOWNLOADING_COLLECTION": "Téléchargement de {{name}}", - "DOWNLOAD_FAILED": "Échec du téléchargement", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} fichiers", - "CHRISTMAS": "Noël", - "CHRISTMAS_EVE": "Réveillon de Noël", - "NEW_YEAR": "Nouvel an", - "NEW_YEAR_EVE": "Réveillon de Nouvel An", - "IMAGE": "Image", - "VIDEO": "Vidéo", - "LIVE_PHOTO": "Photos en direct", - "CONVERT": "Convertir", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Êtes-vous sûr de vouloir fermer l'éditeur ?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Téléchargez votre image modifiée ou enregistrez une copie sur ente pour maintenir vos modifications.", - "BRIGHTNESS": "Luminosité", - "CONTRAST": "Contraste", - "SATURATION": "Saturation", - "BLUR": "Flou", - "INVERT_COLORS": "Inverser les couleurs", - "ASPECT_RATIO": "Ratio de l'image", - "SQUARE": "Carré", - "ROTATE_LEFT": "Pivoter vers la gauche", - "ROTATE_RIGHT": "Pivoter vers la droite", - "FLIP_VERTICALLY": "Basculer verticalement", - "FLIP_HORIZONTALLY": "Retourner horizontalement", - "DOWNLOAD_EDITED": "Téléchargement modifié", - "SAVE_A_COPY_TO_ENTE": "Enregistrer une copie dans ente", - "RESTORE_ORIGINAL": "Restaurer l'original", - "TRANSFORM": "Transformer", - "COLORS": "Couleurs", - "FLIP": "Retourner", - "ROTATION": "Rotation", - "RESET": "Réinitialiser", - "PHOTO_EDITOR": "Éditeur de photos", - "FASTER_UPLOAD": "Chargements plus rapides", - "FASTER_UPLOAD_DESCRIPTION": "Router les chargements vers les serveurs à proximité", - "MAGIC_SEARCH_STATUS": "Statut de la recherche magique", - "INDEXED_ITEMS": "Éléments indexés", - "CAST_ALBUM_TO_TV": "Jouer l'album sur la TV", - "ENTER_CAST_PIN_CODE": "Entrez le code que vous voyez sur la TV ci-dessous pour appairer cet appareil.", - "PAIR_DEVICE_TO_TV": "Associer les appareils", - "TV_NOT_FOUND": "TV introuvable. Avez-vous entré le code PIN correctement ?", - "AUTO_CAST_PAIR": "Paire automatique", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "La paire automatique nécessite la connexion aux serveurs Google et ne fonctionne qu'avec les appareils pris en charge par Chromecast. Google ne recevra pas de données sensibles, telles que vos photos.", - "PAIR_WITH_PIN": "Associer avec le code PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Choisissez un périphérique compatible avec la caste à partir de la fenêtre pop-up du navigateur.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "L'association avec le code PIN fonctionne pour tout appareil grand écran sur lequel vous voulez lire votre album.", - "VISIT_CAST_ENTE_IO": "Visitez cast.ente.io sur l'appareil que vous voulez associer.", - "CAST_AUTO_PAIR_FAILED": "La paire automatique de Chromecast a échoué. Veuillez réessayer.", - "CACHE_DIRECTORY": "Dossier du cache", - "FREEHAND": "Main levée", - "APPLY_CROP": "Appliquer le recadrage", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Au moins une transformation ou un ajustement de couleur doit être effectué avant de sauvegarder.", - "PASSKEYS": "Clés d'accès", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/it-IT/translation.json b/web/apps/accounts/public/locales/it-IT/translation.json deleted file mode 100644 index ae450e5fe..000000000 --- a/web/apps/accounts/public/locales/it-IT/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backup privati
dei tuoi ricordi
", - "HERO_SLIDE_1": "Crittografia end-to-end", - "HERO_SLIDE_2_TITLE": "
Salvati in modo sicuro
in un rifugio antiatomico
", - "HERO_SLIDE_2": "Progettato per sopravvivere", - "HERO_SLIDE_3_TITLE": "
Disponibile
ovunque
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Accedi", - "SIGN_UP": "Registrati", - "NEW_USER": "Nuovo utente", - "EXISTING_USER": "Accedi", - "ENTER_NAME": "Inserisci il nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Aggiungi un nome in modo che i tuoi amici sappiano chi ringraziare per queste fantastiche foto!", - "ENTER_EMAIL": "Inserisci l'indirizzo email", - "EMAIL_ERROR": "Inserisci un indirizzo email valido", - "REQUIRED": "Campo obbligatorio", - "EMAIL_SENT": "Codice di verifica inviato a {{email}}", - "CHECK_INBOX": "Controlla la tua casella di posta (e lo spam) per completare la verifica", - "ENTER_OTT": "Codice di verifica", - "RESEND_MAIL": "Reinvia codice", - "VERIFY": "Verifica", - "UNKNOWN_ERROR": "Qualcosa è andato storto, per favore riprova", - "INVALID_CODE": "Codice di verifica non valido", - "EXPIRED_CODE": "Il tuo codice di verifica è scaduto", - "SENDING": "Invio in corso...", - "SENT": "Inviato!", - "PASSWORD": "Password", - "LINK_PASSWORD": "Inserisci la password per sbloccare l'album", - "RETURN_PASSPHRASE_HINT": "Password", - "SET_PASSPHRASE": "Imposta una password", - "VERIFY_PASSPHRASE": "Accedi", - "INCORRECT_PASSPHRASE": "Password sbagliata", - "ENTER_ENC_PASSPHRASE": "Inserisci una password per crittografare i tuoi dati", - "PASSPHRASE_DISCLAIMER": "Non memorizziamo la tua password, quindi se la dimentichi, non saremo in grado di aiutarti a recuperare i tuoi dati senza una chiave di recupero.", - "WELCOME_TO_ENTE_HEADING": "Benvenuto su ", - "WELCOME_TO_ENTE_SUBHEADING": "Archiviazione e condivisione di foto crittografate end-to-end", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Dove vivono le tue migliori foto", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generazione delle chiavi di crittografia...", - "PASSPHRASE_HINT": "Password", - "CONFIRM_PASSPHRASE": "Conferma la password", - "REFERRAL_CODE_HINT": "Come hai conosciuto Ente? (opzionale)", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Le password non corrispondono", - "CREATE_COLLECTION": "Nuovo album", - "ENTER_ALBUM_NAME": "Nome album", - "CLOSE_OPTION": "Chiudi (Esc)", - "ENTER_FILE_NAME": "Nome del file", - "CLOSE": "Chiudi", - "NO": "No", - "NOTHING_HERE": "Nulla da vedere qui! 👀", - "UPLOAD": "Carica", - "IMPORT": "Importa", - "ADD_PHOTOS": "Aggiungi foto", - "ADD_MORE_PHOTOS": "Aggiungi altre foto", - "add_photos_one": "Aggiungi elemento", - "add_photos_other": "Aggiungi {{count, number}} elementi", - "SELECT_PHOTOS": "Seleziona foto", - "FILE_UPLOAD": "Carica file", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparazione all'upload", - "1": "Lettura dei file metadati di google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} file metadati estratti", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} file salvati", - "4": "Annullamento dei caricamenti rimanenti", - "5": "Backup completato" - }, - "FILE_NOT_UPLOADED_LIST": "I seguenti file non sono stati caricati", - "SUBSCRIPTION_EXPIRED": "Abbonamento scaduto", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Il tuo abbonamento è scaduto, per favore rinnova", - "STORAGE_QUOTA_EXCEEDED": "Limite d'archiviazione superato", - "INITIAL_LOAD_DELAY_WARNING": "Il primo caricamento potrebbe richiedere del tempo", - "USER_DOES_NOT_EXIST": "Purtroppo non abbiamo trovato nessun account con quell'indirizzo e-mail", - "NO_ACCOUNT": "Non ho un account", - "ACCOUNT_EXISTS": "Ho già un account", - "CREATE": "Crea", - "DOWNLOAD": "Scarica", - "DOWNLOAD_OPTION": "Scarica (D)", - "DOWNLOAD_FAVORITES": "Scarica i preferiti", - "DOWNLOAD_UNCATEGORIZED": "Scarica i file senza categoria", - "DOWNLOAD_HIDDEN_ITEMS": "Scarica gli elementi nascosti", - "COPY_OPTION": "Copia come PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Attiva/disattiva schermo intero (F)", - "ZOOM_IN_OUT": "Zoom in/out", - "PREVIOUS": "Precedente (←)", - "NEXT": "Successivo (→)", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "Carica la tua prima foto", - "IMPORT_YOUR_FOLDERS": "Importa una cartella", - "UPLOAD_DROPZONE_MESSAGE": "Rilascia per eseguire il backup dei file", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Rilascia per aggiungere la cartella osservata", - "TRASH_FILES_TITLE": "Elimina file?", - "TRASH_FILE_TITLE": "Eliminare il file?", - "DELETE_FILES_TITLE": "Eliminare immediatamente?", - "DELETE_FILES_MESSAGE": "I file selezionati verranno eliminati definitivamente dal tuo account ente.", - "DELETE": "Cancella", - "DELETE_OPTION": "Cancella (DEL)", - "FAVORITE_OPTION": "Preferito (L)", - "UNFAVORITE_OPTION": "Rimuovi dai preferiti (L)", - "MULTI_FOLDER_UPLOAD": "Selezionate più cartelle", - "UPLOAD_STRATEGY_CHOICE": "Vuoi caricarli in", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un album singolo", - "OR": "o", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Album separati", - "SESSION_EXPIRED_MESSAGE": "La sessione è scaduta. Per continuare, esegui nuovamente l'accesso", - "SESSION_EXPIRED": "Sessione scaduta", - "PASSWORD_GENERATION_FAILED": "Il tuo browser non è stato in grado di generare una chiave forte che soddisfa gli standard di crittografia ente, prova ad usare l'app per dispositivi mobili o un altro browser", - "CHANGE_PASSWORD": "Cambia password", - "GO_BACK": "Torna indietro", - "RECOVERY_KEY": "Chiave di recupero", - "SAVE_LATER": "Fallo più tardi", - "SAVE": "Salva Chiave", - "RECOVERY_KEY_DESCRIPTION": "Se dimentichi la tua password, l'unico modo per recuperare i tuoi dati è con questa chiave.", - "RECOVER_KEY_GENERATION_FAILED": "Impossibile generare il codice di recupero, riprova", - "KEY_NOT_STORED_DISCLAIMER": "Non memorizziamo questa chiave, quindi salvala in un luogo sicuro", - "FORGOT_PASSWORD": "Password dimenticata", - "RECOVER_ACCOUNT": "Recupera account", - "RECOVERY_KEY_HINT": "Chiave di recupero", - "RECOVER": "Recupera", - "NO_RECOVERY_KEY": "Nessuna chiave di recupero?", - "INCORRECT_RECOVERY_KEY": "Chiave di recupero errata", - "SORRY": "Siamo spiacenti", - "NO_RECOVERY_KEY_MESSAGE": "A causa della natura del nostro protocollo di crittografia end-to-end, i tuoi dati non possono essere decifrati senza la tua password o chiave di ripristino", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Per favore invia un'email a {{emailID}} dal tuo indirizzo email registrato", - "CONTACT_SUPPORT": "Contatta il supporto", - "REQUEST_FEATURE": "Richiedi una funzionalità", - "SUPPORT": "Supporto", - "CONFIRM": "Conferma", - "CANCEL": "Annulla", - "LOGOUT": "Disconnettiti", - "DELETE_ACCOUNT": "Elimina account", - "DELETE_ACCOUNT_MESSAGE": "

Per favore invia una email a {{emailID}} dal tuo indirizzo email registrato.

La tua richiesta verrà elaborata entro 72 ore.

", - "LOGOUT_MESSAGE": "Sei sicuro di volerti disconnettere?", - "CHANGE_EMAIL": "Cambia email", - "OK": "OK", - "SUCCESS": "Operazione riuscita", - "ERROR": "Errore", - "MESSAGE": "Messaggio", - "INSTALL_MOBILE_APP": "Installa la nostra app Android o iOS per eseguire il backup automatico di tutte le tue foto", - "DOWNLOAD_APP_MESSAGE": "Siamo spiacenti, questa operazione è attualmente supportata solo sulla nostra app desktop", - "DOWNLOAD_APP": "Scarica l'app per desktop", - "EXPORT": "Esporta Dati", - "SUBSCRIPTION": "Abbonamento", - "SUBSCRIBE": "Iscriviti", - "MANAGEMENT_PORTAL": "Gestisci i metodi di pagamento", - "MANAGE_FAMILY_PORTAL": "Gestisci piano famiglia", - "LEAVE_FAMILY_PLAN": "Abbandona il piano famiglia", - "LEAVE": "Lascia", - "LEAVE_FAMILY_CONFIRM": "Sei sicuro di voler uscire dal piano famiglia?", - "CHOOSE_PLAN": "Scegli il tuo piano", - "MANAGE_PLAN": "Gestisci il tuo abbonamento", - "ACTIVE": "Attivo", - "OFFLINE_MSG": "Sei offline, i ricordi memorizzati nella cache vengono mostrati", - "FREE_SUBSCRIPTION_INFO": "Sei sul piano gratuito che scade il {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Fai parte di un piano famiglia gestito da", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Si rinnova il {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina il {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Il tuo abbonamento verrà annullato il {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Hai superato la quota di archiviazione assegnata, si prega di aggiornare ", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Abbiamo ricevuto il tuo pagamento

Il tuo abbonamento è valido fino a {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Il tuo acquisto è stato annullato, riprova se vuoi iscriverti", - "SUBSCRIPTION_PURCHASE_FAILED": "Acquisto abbonamento non riuscito, riprova", - "SUBSCRIPTION_UPDATE_FAILED": "L'aggiornamento dell'abbonamento non è riuscito, riprova", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Siamo spiacenti, il pagamento non è andato a buon fine quando abbiamo provato ad addebitare alla sua carta, la preghiamo di aggiornare il suo metodo di pagamento e riprovare", - "STRIPE_AUTHENTICATION_FAILED": "Non siamo in grado di autenticare il tuo metodo di pagamento. Per favore scegli un metodo di pagamento diverso e riprova", - "UPDATE_PAYMENT_METHOD": "Aggiorna metodo di pagamento", - "MONTHLY": "Mensile", - "YEARLY": "Annuale", - "UPDATE_SUBSCRIPTION_MESSAGE": "Sei sicuro di voler cambiare il piano?", - "UPDATE_SUBSCRIPTION": "Cambia piano", - "CANCEL_SUBSCRIPTION": "Annulla abbonamento", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Tutti i tuoi dati saranno cancellati dai nostri server alla fine di questo periodo di fatturazione.

Sei sicuro di voler annullare il tuo abbonamento?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "Impossibile annullare l'abbonamento", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abbonamento annullato con successo", - "REACTIVATE_SUBSCRIPTION": "Riattiva abbonamento", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Una volta riattivato, ti verrà addebitato il valore di {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Iscrizione attivata con successo ", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Grazie", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Annulla abbonamento mobile", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Per favore contattaci su {{emailID}} per gestire il tuo abbonamento", - "RENAME": "Rinomina", - "RENAME_FILE": "Rinomina file", - "RENAME_COLLECTION": "Rinomina album", - "DELETE_COLLECTION_TITLE": "Eliminare l'album?", - "DELETE_COLLECTION": "Elimina album", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "Elimina foto", - "KEEP_PHOTOS": "Mantieni foto", - "SHARE": "Condividi", - "SHARE_COLLECTION": "Condividi album", - "SHAREES": "Condividi con", - "SHARE_WITH_SELF": "Ops, non puoi condividere a te stesso", - "ALREADY_SHARED": "Ops, lo stai già condividendo con {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Condividere gli album non è consentito", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "La condivisione è disabilitata per gli account free", - "DOWNLOAD_COLLECTION": "Scarica album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Sei sicuro di volere scaricare l'album interamente?

Tutti i file saranno messi in coda per il download

", - "CREATE_ALBUM_FAILED": "Operazione di creazione dell'album fallita, per favore riprova", - "SEARCH": "Ricerca", - "SEARCH_RESULTS": "Risultati della ricerca", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Posizione", - "CITY": "Posizione", - "DATE": "Data", - "FILE_NAME": "Nome file", - "THING": "Contenuto", - "FILE_CAPTION": "Descrizione", - "FILE_TYPE": "Tipo del file", - "CLIP": "" - }, - "photos_count_zero": "Nessuna memoria", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "Aggiungi all'album", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Questo video non può essere riprodotto nel tuo browser", - "PEOPLE": "Persone", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "volti non identificati", - "OBJECTS": "", - "TEXT": "testo", - "INFO": "Info ", - "INFO_OPTION": "", - "FILE_NAME": "Nome file", - "CAPTION_PLACEHOLDER": "Aggiungi una descrizione", - "LOCATION": "Posizione", - "SHOW_ON_MAP": "Guarda su OpenStreetMap", - "MAP": "Mappa", - "MAP_SETTINGS": "Impostazioni Mappa", - "ENABLE_MAPS": "Attivare Mappa?", - "ENABLE_MAP": "Attivare mappa", - "DISABLE_MAPS": "Disattivare Mappa?", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Due fattori", - "TWO_FACTOR_AUTHENTICATION": "Autenticazione a due fattori", - "TWO_FACTOR_QR_INSTRUCTION": "Scansiona il codice QR qui sotto con la tua app di autenticazione preferita", - "ENTER_CODE_MANUALLY": "Inserisci il codice manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Inserisci questo codice nella tua app di autenticazione preferita", - "SCAN_QR_CODE": "Oppure scansiona il codice QR", - "ENABLE_TWO_FACTOR": "Attiva due fattori", - "ENABLE": "Attiva", - "LOST_DEVICE": "", - "INCORRECT_CODE": "Codice errato", - "TWO_FACTOR_INFO": "Aggiungi un ulteriore livello di sicurezza richiedendo più informazioni rispetto a email e password per eseguire l'accesso al tuo account", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "Esporta dati", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "Invia OTP", - "EMAIl_ALREADY_OWNED": "Email già in uso", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "Caricamento fallito ", - "SKIPPED_FILES": "Ignora caricamenti", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "Caricamenti eseguiti con successo", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "Video saltati", - "INPROGRESS_METADATA_EXTRACTION": "In corso", - "INPROGRESS_UPLOADS": "Caricamenti in corso", - "TOO_LARGE_UPLOADS": "File pesanti", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Spazio insufficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Questi file non sono stati caricati perché supererebbero la capacità massima del tuo piano di spazio d'archiviazione", - "TOO_LARGE_INFO": "Questi file non sono stati caricati perché superano il nostro limite di pesantezza di un file", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "Archivio", - "FAVORITES": "Preferiti", - "ARCHIVE_COLLECTION": "Album archiviato", - "ARCHIVE_SECTION_NAME": "Archivio", - "ALL_SECTION_NAME": "Tutto", - "MOVE_TO_COLLECTION": "Sposta nell'album", - "UNARCHIVE": "Rimuovi dall'archivio", - "UNARCHIVE_COLLECTION": "Rimuovi album dall'archivio", - "HIDE_COLLECTION": "Nascondi album", - "UNHIDE_COLLECTION": "Rimuovi album dai nascosti", - "MOVE": "Sposta", - "ADD": "Aggiungi", - "REMOVE": "Rimuovi", - "YES_REMOVE": "Sì, rimuovi", - "REMOVE_FROM_COLLECTION": "Rimuovi dall'album", - "TRASH": "Cestino", - "MOVE_TO_TRASH": "Sposta nel cestino", - "TRASH_FILES_MESSAGE": "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino.", - "TRASH_FILE_MESSAGE": "Il file verrà eliminato da tutti gli album e spostato nel cestino.", - "DELETE_PERMANENTLY": "Elimina definitivamente", - "RESTORE": "Ripristina", - "RESTORE_TO_COLLECTION": "Ripristina nell'album", - "EMPTY_TRASH": "Svuota il cestino", - "EMPTY_TRASH_TITLE": "Vuoi svuotare il cestino?", - "EMPTY_TRASH_MESSAGE": "I file selezionati verranno eliminati definitivamente dal tuo account ente.", - "LEAVE_SHARED_ALBUM": "Sì, esci", - "LEAVE_ALBUM": "Abbandona l'album", - "LEAVE_SHARED_ALBUM_TITLE": "Abbandonare l'album condiviso?", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "Meno recente", - "SORT_BY_UPDATION_TIME_DESCENDING": "Ultimo aggiornamento", - "SORT_BY_NAME": "Nome", - "COMPRESS_THUMBNAILS": "Comprimi miniature", - "THUMBNAIL_REPLACED": "Miniature compresse", - "FIX_THUMBNAIL": "Comprimi", - "FIX_THUMBNAIL_LATER": "Comprimi più tardi", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "Installa", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Nessun partecipante", - "participants_one": "1 partecipante", - "participants_other": "{{count, number}} partecipanti", - "ADD_VIEWERS": "", - "PARTICIPANTS": "Partecipanti", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "Rimuovere?", - "CONFIRM_REMOVE": "Sì, rimuovi", - "MANAGE": "Gestisci", - "ADDED_AS": "Aggiunto come", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "Rimuovi partecipante", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - non trovato", - "LINK_EXPIRED": "Link scaduto", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "Cartella", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Album", - "ALL_ALBUMS": "Tutti gli Album", - "ALBUMS": "Album", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "Crea account", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "Tu", - "FAMILY": "Famiglia", - "FREE": "gratis", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "Ancora nessuna cartella aggiunta!", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "Cambia Cartella", - "TWO_MONTHS_FREE": "Ottieni 2 mesi gratis sui piani annuali", - "GB": "GB", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "1 GB per 1 anno", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "Autenticati", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "Oggi", - "YESTERDAY": "Ieri", - "NAME_PLACEHOLDER": "Nome...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "Seleziona tema", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "Più dettagli", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "Avanzate", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "Sicurezza password: Debole", - "PASSPHRASE_STRENGTH_MODERATE": "Sicurezza password: Moderata", - "PASSPHRASE_STRENGTH_STRONG": "Sicurezza password: Forte", - "PREFERENCES": "", - "LANGUAGE": "Lingua", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "dopo un'ora", - "DAY": "dopo un giorno", - "WEEK": "dopo una settimana", - "MONTH": "dopo un mese", - "YEAR": "dopo un anno" - }, - "COPY_LINK": "Copia link", - "DONE": "Fatto", - "LINK_SHARE_TITLE": "O condividi un link", - "REMOVE_LINK": "Rimuovi link", - "CREATE_PUBLIC_SHARING": "Crea link pubblico", - "PUBLIC_LINK_CREATED": "Link pubblick creato", - "PUBLIC_LINK_ENABLED": "Link pubblico attivato", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Seleziona un motivo", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/ko-KR/translation.json b/web/apps/accounts/public/locales/ko-KR/translation.json deleted file mode 100644 index 4fbe6c077..000000000 --- a/web/apps/accounts/public/locales/ko-KR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "추억을 안전하게 백업하세요", - "HERO_SLIDE_1": "종단간 암호화가 기본지원입니다", - "HERO_SLIDE_2_TITLE": "낙진대피소에 안전하게 보관됩니다", - "HERO_SLIDE_2": "오랫동안 보존할 수 있도록한 설계", - "HERO_SLIDE_3_TITLE": "
어디에서나
이용가능
", - "HERO_SLIDE_3": "안드로이드, iOS, 웹, 데스크탑", - "LOGIN": "로그인", - "SIGN_UP": "회원가입", - "NEW_USER": "ente의 새소식", - "EXISTING_USER": "기존 사용자", - "ENTER_NAME": "이름 입력", - "PUBLIC_UPLOADER_NAME_MESSAGE": "친구들이 이 멋진 사진에 대해 고마워할 수 있도록 이름을 추가하세요!", - "ENTER_EMAIL": "이메일 주소를 입력하세요", - "EMAIL_ERROR": "올바른 이메일을 입력하세요", - "REQUIRED": "필수", - "EMAIL_SENT": "{{email}} 로 인증 코드가 전송되었습니다", - "CHECK_INBOX": "인증을 완료하기 위해 당신의 메일 수신함(그리고 스팸 수신함)을 확인하세요.", - "ENTER_OTT": "인증 코드", - "RESEND_MAIL": "코드 재전송하기", - "VERIFY": "인증", - "UNKNOWN_ERROR": "문제가 생긴 것 같아요. 다시 시도하세요", - "INVALID_CODE": "잘못된 인증 코드", - "EXPIRED_CODE": "입력한 인증 코드가 만료되었습니다", - "SENDING": "전송 중...", - "SENT": "발송 완료!", - "PASSWORD": "비밀번호", - "LINK_PASSWORD": "앨범 잠금해제를 위해 비밀번호를 입력하세요", - "RETURN_PASSPHRASE_HINT": "비밀번호", - "SET_PASSPHRASE": "비밀번호 설정", - "VERIFY_PASSPHRASE": "로그인", - "INCORRECT_PASSPHRASE": "잘못된 비밀번호입니다", - "ENTER_ENC_PASSPHRASE": "당신의 데이터를 암호화하는 데 사용할 수 있는 비밀번호를 입력하세요", - "PASSPHRASE_DISCLAIMER": "우리는 귀하의 비밀번호를 저장하지 않습니다. 만약 비밀번호를 잊어버린 경우 복구 키 없다면 데이터 복구를 도와드릴 수 없습니다.", - "WELCOME_TO_ENTE_HEADING": "환영합니다 ", - "WELCOME_TO_ENTE_SUBHEADING": "End-to-End 암호화된 사진 저장 및 공유", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "당신 최고의 사진이 있는 곳", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "암호 키 생성 중...", - "PASSPHRASE_HINT": "비밀번호", - "CONFIRM_PASSPHRASE": "비밀번호 확인", - "REFERRAL_CODE_HINT": "어떻게 Ente에 대해 들으셨나요? (선택사항)", - "REFERRAL_INFO": "우리는 앱 설치를 추적하지 않습니다. 우리를 알게 된 곳을 남겨주시면 우리에게 도움이 될꺼에요!", - "PASSPHRASE_MATCH_ERROR": "비밀번호가 일치하지 않습니다", - "CREATE_COLLECTION": "새 앨범", - "ENTER_ALBUM_NAME": "앨범 이름", - "CLOSE_OPTION": "닫기 (Esc)", - "ENTER_FILE_NAME": "파일 이름", - "CLOSE": "닫기", - "NO": "아니오", - "NOTHING_HERE": "아직 볼 수 있는 것이 없어요 👀", - "UPLOAD": "업로드", - "IMPORT": "가져오기", - "ADD_PHOTOS": "사진 추가", - "ADD_MORE_PHOTOS": "사진 더 추가하기", - "add_photos_one": "아이템 하나 추가", - "add_photos_other": "아이템 {{count, number}} 개 추가하기", - "SELECT_PHOTOS": "사진 선택하기", - "FILE_UPLOAD": "파일 업로드", - "UPLOAD_STAGE_MESSAGE": { - "0": "업로드 준비중", - "1": "구글 메타데이타 파일들 읽는중", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 파일 메타데이터가 추출되었습니다", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 파일이 처리되었습니다", - "4": "남은 업로드 취소중", - "5": "백업 완료" - }, - "FILE_NOT_UPLOADED_LIST": "아래 파일들은 업로드 되지 않았습니다", - "SUBSCRIPTION_EXPIRED": "구독 만료", - "SUBSCRIPTION_EXPIRED_MESSAGE": "당신 구독이 만료되었으니, 구독을 갱신해주세요", - "STORAGE_QUOTA_EXCEEDED": "스토리지 제한이 초과되었습니다", - "INITIAL_LOAD_DELAY_WARNING": "처음 로딩시 다소 시간이 걸릴 수 있습니다", - "USER_DOES_NOT_EXIST": "죄송합니다. 해당 이메일을 사용하는 사용자를 찾을 수 없습니다", - "NO_ACCOUNT": "계정이 없습니다", - "ACCOUNT_EXISTS": "이미 계정이 있습니다", - "CREATE": "만들기", - "DOWNLOAD": "다운로드", - "DOWNLOAD_OPTION": "다운로드 (D)", - "DOWNLOAD_FAVORITES": "즐겨찾기 다운로드", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/nl-NL/translation.json b/web/apps/accounts/public/locales/nl-NL/translation.json deleted file mode 100644 index 15d9bfdba..000000000 --- a/web/apps/accounts/public/locales/nl-NL/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Privé back-ups
voor uw herinneringen
", - "HERO_SLIDE_1": "Standaard end-to-end versleuteld", - "HERO_SLIDE_2_TITLE": "
Veilig opgeslagen
in een kernbunker
", - "HERO_SLIDE_2": "Ontworpen om levenslang mee te gaan", - "HERO_SLIDE_3_TITLE": "
Overal
beschikbaar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Inloggen", - "SIGN_UP": "Registreren", - "NEW_USER": "Nieuw bij ente", - "EXISTING_USER": "Bestaande gebruiker", - "ENTER_NAME": "Naam invoeren", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Voeg een naam toe zodat je vrienden weten wie ze moeten bedanken voor deze geweldige foto's!", - "ENTER_EMAIL": "Vul e-mailadres in", - "EMAIL_ERROR": "Vul een geldig e-mailadres in", - "REQUIRED": "Vereist", - "EMAIL_SENT": "Verificatiecode verzonden naar {{email}}", - "CHECK_INBOX": "Controleer je inbox (en spam) om verificatie te voltooien", - "ENTER_OTT": "Verificatiecode", - "RESEND_MAIL": "Code opnieuw versturen", - "VERIFY": "Verifiëren", - "UNKNOWN_ERROR": "Er is iets fout gegaan, probeer het opnieuw", - "INVALID_CODE": "Ongeldige verificatiecode", - "EXPIRED_CODE": "Uw verificatiecode is verlopen", - "SENDING": "Verzenden...", - "SENT": "Verzonden!", - "PASSWORD": "Wachtwoord", - "LINK_PASSWORD": "Voer wachtwoord in om het album te ontgrendelen", - "RETURN_PASSPHRASE_HINT": "Wachtwoord", - "SET_PASSPHRASE": "Wachtwoord instellen", - "VERIFY_PASSPHRASE": "Aanmelden", - "INCORRECT_PASSPHRASE": "Onjuist wachtwoord", - "ENTER_ENC_PASSPHRASE": "Voer een wachtwoord in dat we kunnen gebruiken om je gegevens te versleutelen", - "PASSPHRASE_DISCLAIMER": "We slaan je wachtwoord niet op, dus als je het vergeet, zullen we u niet kunnen helpen uw data te herstellen zonder een herstelcode.", - "WELCOME_TO_ENTE_HEADING": "Welkom bij ", - "WELCOME_TO_ENTE_SUBHEADING": "Foto opslag en delen met end to end encryptie", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Waar je beste foto's leven", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Encryptiecodes worden gegenereerd...", - "PASSPHRASE_HINT": "Wachtwoord", - "CONFIRM_PASSPHRASE": "Wachtwoord bevestigen", - "REFERRAL_CODE_HINT": "Hoe hoorde je over Ente? (optioneel)", - "REFERRAL_INFO": "Wij gebruiken geen tracking. Het zou helpen als je ons vertelt waar je ons gevonden hebt!", - "PASSPHRASE_MATCH_ERROR": "Wachtwoorden komen niet overeen", - "CREATE_COLLECTION": "Nieuw album", - "ENTER_ALBUM_NAME": "Album naam", - "CLOSE_OPTION": "Sluiten (Esc)", - "ENTER_FILE_NAME": "Bestandsnaam", - "CLOSE": "Sluiten", - "NO": "Nee", - "NOTHING_HERE": "Nog niets te zien hier 👀", - "UPLOAD": "Uploaden", - "IMPORT": "Importeren", - "ADD_PHOTOS": "Foto's toevoegen", - "ADD_MORE_PHOTOS": "Meer foto's toevoegen", - "add_photos_one": "1 foto toevoegen", - "add_photos_other": "{{count, number}} foto's toevoegen", - "SELECT_PHOTOS": "Selecteer foto's", - "FILE_UPLOAD": "Bestand uploaden", - "UPLOAD_STAGE_MESSAGE": { - "0": "Upload wordt voorbereid", - "1": "Lezen van Google metadata bestanden", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} bestanden metadata uitgepakt", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} bestanden geback-upt", - "4": "Resterende uploads worden geannuleerd", - "5": "Back-up voltooid" - }, - "FILE_NOT_UPLOADED_LIST": "De volgende bestanden zijn niet geüpload", - "SUBSCRIPTION_EXPIRED": "Abonnement verlopen", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Uw abonnement is verlopen, gelieve vernieuwen", - "STORAGE_QUOTA_EXCEEDED": "Opslaglimiet overschreden", - "INITIAL_LOAD_DELAY_WARNING": "Eerste keer laden kan enige tijd duren", - "USER_DOES_NOT_EXIST": "Sorry, we konden geen account met dat e-mailadres vinden", - "NO_ACCOUNT": "Heb nog geen account", - "ACCOUNT_EXISTS": "Heb al een account", - "CREATE": "Creëren", - "DOWNLOAD": "Downloaden", - "DOWNLOAD_OPTION": "Downloaden (D)", - "DOWNLOAD_FAVORITES": "Favorieten downloaden", - "DOWNLOAD_UNCATEGORIZED": "Ongecategoriseerd downloaden", - "DOWNLOAD_HIDDEN_ITEMS": "Verborgen bestanden downloaden", - "COPY_OPTION": "Kopiëren als PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Schakelen volledig scherm modus (F)", - "ZOOM_IN_OUT": "In/uitzoomen", - "PREVIOUS": "Vorige (←)", - "NEXT": "Volgende (→)", - "TITLE_PHOTOS": "Ente Foto's", - "TITLE_ALBUMS": "Ente Foto's", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Je eerste foto uploaden", - "IMPORT_YOUR_FOLDERS": "Importeer uw mappen", - "UPLOAD_DROPZONE_MESSAGE": "Sleep om een back-up van je bestanden te maken", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Sleep om map aan watched folders toe te voegen", - "TRASH_FILES_TITLE": "Bestanden verwijderen?", - "TRASH_FILE_TITLE": "Verwijder bestand?", - "DELETE_FILES_TITLE": "Onmiddellijk verwijderen?", - "DELETE_FILES_MESSAGE": "Geselecteerde bestanden zullen permanent worden verwijderd van je ente account.", - "DELETE": "Verwijderen", - "DELETE_OPTION": "Verwijderen (DEL)", - "FAVORITE_OPTION": "Favoriet (L)", - "UNFAVORITE_OPTION": "Verwijderen uit Favorieten (L)", - "MULTI_FOLDER_UPLOAD": "Meerdere mappen gedetecteerd", - "UPLOAD_STRATEGY_CHOICE": "Wilt u deze uploaden naar", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Één enkel album", - "OR": "of", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Aparte albums maken", - "SESSION_EXPIRED_MESSAGE": "Uw sessie is verlopen. Meld u opnieuw aan om verder te gaan", - "SESSION_EXPIRED": "Sessie verlopen", - "PASSWORD_GENERATION_FAILED": "Uw browser kon geen sterke sleutel genereren die voldoet aan onze versleutelingsstandaarden. Probeer de mobiele app of een andere browser te gebruiken", - "CHANGE_PASSWORD": "Wachtwoord wijzigen", - "GO_BACK": "Ga terug", - "RECOVERY_KEY": "Herstelsleutel", - "SAVE_LATER": "Doe dit later", - "SAVE": "Sleutel opslaan", - "RECOVERY_KEY_DESCRIPTION": "Als je je wachtwoord vergeet, kun je alleen met deze sleutel je gegevens herstellen.", - "RECOVER_KEY_GENERATION_FAILED": "Herstelcode kon niet worden gegenereerd, probeer het opnieuw", - "KEY_NOT_STORED_DISCLAIMER": "We slaan deze sleutel niet op, bewaar dit op een veilige plaats", - "FORGOT_PASSWORD": "Wachtwoord vergeten", - "RECOVER_ACCOUNT": "Account herstellen", - "RECOVERY_KEY_HINT": "Herstelsleutel", - "RECOVER": "Herstellen", - "NO_RECOVERY_KEY": "Geen herstelsleutel?", - "INCORRECT_RECOVERY_KEY": "Onjuiste herstelsleutel", - "SORRY": "Sorry", - "NO_RECOVERY_KEY_MESSAGE": "Door de aard van ons end-to-end encryptieprotocol kunnen je gegevens niet worden ontsleuteld zonder je wachtwoord of herstelsleutel", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Stuur een e-mail naar {{emailID}} vanaf het door jou geregistreerde e-mailadres", - "CONTACT_SUPPORT": "Klantenservice", - "REQUEST_FEATURE": "Vraag nieuwe functie aan", - "SUPPORT": "Ondersteuning", - "CONFIRM": "Bevestigen", - "CANCEL": "Annuleren", - "LOGOUT": "Uitloggen", - "DELETE_ACCOUNT": "Account verwijderen", - "DELETE_ACCOUNT_MESSAGE": "

Stuur een e-mail naar {{emailID}} vanaf uw geregistreerde e-mailadres.

Uw aanvraag wordt binnen 72 uur verwerkt.

", - "LOGOUT_MESSAGE": "Weet u zeker dat u wilt uitloggen?", - "CHANGE_EMAIL": "E-mail wijzigen", - "OK": "Oké", - "SUCCESS": "Succes", - "ERROR": "Foutmelding", - "MESSAGE": "Melding", - "INSTALL_MOBILE_APP": "Installeer onze Android of iOS app om automatisch een back-up te maken van al uw foto's", - "DOWNLOAD_APP_MESSAGE": "Sorry, deze bewerking wordt momenteel alleen ondersteund op onze desktop app", - "DOWNLOAD_APP": "Download de desktop app", - "EXPORT": "Data exporteren", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "Abonneren", - "MANAGEMENT_PORTAL": "Betaalmethode beheren", - "MANAGE_FAMILY_PORTAL": "Familie abonnement beheren", - "LEAVE_FAMILY_PLAN": "Familie abonnement verlaten", - "LEAVE": "Verlaten", - "LEAVE_FAMILY_CONFIRM": "Weet je zeker dat je het familie-plan wilt verlaten?", - "CHOOSE_PLAN": "Kies uw abonnement", - "MANAGE_PLAN": "Beheer uw abonnement", - "ACTIVE": "Actief", - "OFFLINE_MSG": "Je bent offline, lokaal opgeslagen herinneringen worden getoond", - "FREE_SUBSCRIPTION_INFO": "Je hebt het gratis abonnement dat verloopt op {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "U hebt een familieplan dat beheerd wordt door", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Vernieuwt op {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Eindigt op {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Uw abonnement loopt af op {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Jouw {{storage, string}} add-on is geldig tot {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "U heeft uw opslaglimiet overschreden, gelieve upgraden", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

We hebben uw betaling ontvangen

Uw abonnement is geldig tot {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Uw aankoop is geannuleerd, probeer het opnieuw als u zich wilt abonneren", - "SUBSCRIPTION_PURCHASE_FAILED": "Betaling van abonnement mislukt Probeer het opnieuw", - "SUBSCRIPTION_UPDATE_FAILED": "Niet gelukt om abonnement bij te werken, probeer het opnieuw", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Het spijt ons, maar de betaling is mislukt bij het in rekening brengen van uw kaart, gelieve uw betaalmethode bij te werken en het opnieuw te proberen", - "STRIPE_AUTHENTICATION_FAILED": "We zijn niet in staat om uw betaalmethode te verifiëren. Kies een andere betaalmethode en probeer het opnieuw", - "UPDATE_PAYMENT_METHOD": "Betalingsmethode bijwerken", - "MONTHLY": "Maandelijks", - "YEARLY": "Jaarlijks", - "UPDATE_SUBSCRIPTION_MESSAGE": "Weet u zeker dat u uw abonnement wilt wijzigen?", - "UPDATE_SUBSCRIPTION": "Abonnement wijzigen", - "CANCEL_SUBSCRIPTION": "Abonnement opzeggen", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Al je gegevens zullen worden verwijderd van onze servers aan het einde van deze factureringsperiode.

Weet u zeker dat u uw abonnement wilt opzeggen?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Weet je zeker dat je je abonnement wilt opzeggen?

", - "SUBSCRIPTION_CANCEL_FAILED": "Abonnement opzeggen mislukt", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abonnement succesvol geannuleerd", - "REACTIVATE_SUBSCRIPTION": "Abonnement opnieuw activeren", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Zodra je weer bent geactiveerd, zal je worden gefactureerd op {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Abonnement succesvol geactiveerd ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Heractiveren van abonnementsverlenging is mislukt", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Bedankt", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Mobiel abonnement opzeggen", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Annuleer je abonnement via de mobiele app om je abonnement hier te activeren", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Neem contact met ons op via {{emailID}} om uw abonnement te beheren", - "RENAME": "Naam wijzigen", - "RENAME_FILE": "Bestandsnaam wijzigen", - "RENAME_COLLECTION": "Albumnaam wijzigen", - "DELETE_COLLECTION_TITLE": "Verwijder album?", - "DELETE_COLLECTION": "Verwijder album", - "DELETE_COLLECTION_MESSAGE": "Verwijder de foto's (en video's) van dit album ook uit alle andere albums waar deze deel van uitmaken?", - "DELETE_PHOTOS": "Foto's verwijderen", - "KEEP_PHOTOS": "Foto's behouden", - "SHARE": "Delen", - "SHARE_COLLECTION": "Album delen", - "SHAREES": "Gedeeld met", - "SHARE_WITH_SELF": "Oeps, je kunt niet met jezelf delen", - "ALREADY_SHARED": "Oeps, je deelt dit al met {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Album delen niet toegestaan", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Delen is uitgeschakeld voor gratis accounts", - "DOWNLOAD_COLLECTION": "Download album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Weet je zeker dat je het volledige album wilt downloaden?

Alle bestanden worden in de wachtrij geplaatst voor downloaden

", - "CREATE_ALBUM_FAILED": "Aanmaken van album mislukt, probeer het opnieuw", - "SEARCH": "Zoeken", - "SEARCH_RESULTS": "Zoekresultaten", - "NO_RESULTS": "Geen resultaten gevonden", - "SEARCH_HINT": "Zoeken naar albums, datums ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Locatie", - "CITY": "Locatie", - "DATE": "Datum", - "FILE_NAME": "Bestandsnaam", - "THING": "Inhoud", - "FILE_CAPTION": "Omschrijving", - "FILE_TYPE": "Bestandstype", - "CLIP": "Magische" - }, - "photos_count_zero": "Geen herinneringen", - "photos_count_one": "1 herinnering", - "photos_count_other": "{{count, number}} herinneringen", - "TERMS_AND_CONDITIONS": "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid", - "ADD_TO_COLLECTION": "Toevoegen aan album", - "SELECTED": "geselecteerd", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Deze video kan niet afgespeeld worden op uw browser", - "PEOPLE": "Personen", - "INDEXING_SCHEDULED": "indexering is gepland...", - "ANALYZING_PHOTOS": "analyseren van nieuwe foto's {{indexStatus.nSyncedFiles}} van {{indexStatus.nTotalFiles}} gedaan)...", - "INDEXING_PEOPLE": "mensen indexeren in {{indexStatus.nSyncedFiles}} foto's...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles}} geïndexeerde foto's", - "UNIDENTIFIED_FACES": "ongeïdentificeerde gezichten", - "OBJECTS": "objecten", - "TEXT": "tekst", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Bestandsnaam", - "CAPTION_PLACEHOLDER": "Voeg een beschrijving toe", - "LOCATION": "Locatie", - "SHOW_ON_MAP": "Bekijk op OpenStreetMap", - "MAP": "Kaart", - "MAP_SETTINGS": "Kaart instellingen", - "ENABLE_MAPS": "Kaarten inschakelen?", - "ENABLE_MAP": "Kaarten inschakelen", - "DISABLE_MAPS": "Kaarten uitzetten?", - "ENABLE_MAP_DESCRIPTION": "

Dit toont jouw foto's op een wereldkaart.

Deze kaart wordt gehost door Open Street Map, en de exacte locaties van jouw foto's worden nooit gedeeld.

Je kunt deze functie op elk gewenst moment uitschakelen via de instellingen.

", - "DISABLE_MAP_DESCRIPTION": "

Dit schakelt de weergave van je foto's op een wereldkaart uit.

Je kunt deze functie op elk gewenst moment inschakelen via Instellingen.

", - "DISABLE_MAP": "Kaarten uitzetten", - "DETAILS": "Details", - "VIEW_EXIF": "Bekijk alle EXIF gegevens", - "NO_EXIF": "Geen EXIF gegevens", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Tweestaps", - "TWO_FACTOR_AUTHENTICATION": "Tweestapsverificatie", - "TWO_FACTOR_QR_INSTRUCTION": "Scan de onderstaande QR-code met uw favoriete verificatie app", - "ENTER_CODE_MANUALLY": "Voer de code handmatig in", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Voer deze code in in uw favoriete verificatie app", - "SCAN_QR_CODE": "Scan QR-code in plaats daarvan", - "ENABLE_TWO_FACTOR": "Tweestapsverificatie inschakelen", - "ENABLE": "Inschakelen", - "LOST_DEVICE": "Tweestapsverificatie apparaat verloren", - "INCORRECT_CODE": "Onjuiste code", - "TWO_FACTOR_INFO": "Voeg een extra beveiligingslaag toe door meer dan uw e-mailadres en wachtwoord te vereisen om in te loggen op uw account", - "DISABLE_TWO_FACTOR_LABEL": "Schakel tweestapsverificatie uit", - "UPDATE_TWO_FACTOR_LABEL": "Update uw verificatie apparaat", - "DISABLE": "Uitschakelen", - "RECONFIGURE": "Herconfigureren", - "UPDATE_TWO_FACTOR": "Tweestapsverificatie bijwerken", - "UPDATE_TWO_FACTOR_MESSAGE": "Verder gaan zal elk eerder geconfigureerde verificatie apparaat ontzeggen", - "UPDATE": "Bijwerken", - "DISABLE_TWO_FACTOR": "Tweestapsverificatie uitschakelen", - "DISABLE_TWO_FACTOR_MESSAGE": "Weet u zeker dat u tweestapsverificatie wilt uitschakelen", - "TWO_FACTOR_DISABLE_FAILED": "Uitschakelen van tweestapsverificatie is mislukt, probeer het opnieuw", - "EXPORT_DATA": "Gegevens exporteren", - "SELECT_FOLDER": "Map selecteren", - "DESTINATION": "Bestemming", - "START": "Start", - "LAST_EXPORT_TIME": "Tijd laatste export", - "EXPORT_AGAIN": "Opnieuw synchroniseren", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Lokale opslag niet toegankelijk", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Je browser of een extensie blokkeert ente om gegevens op te slaan in de lokale opslag. Probeer deze pagina te laden na het aanpassen van de browser surfmodus.", - "SEND_OTT": "Stuur OTP", - "EMAIl_ALREADY_OWNED": "E-mail al in gebruik", - "ETAGS_BLOCKED": "

We kunnen de volgende bestanden niet uploaden vanwege uw browserconfiguratie.

Schakel alle extensies uit die mogelijk voorkomen dat ente eTags kan gebruiken om grote bestanden te uploaden, of gebruik onze desktop app voor een betrouwbaardere import ervaring.

", - "SKIPPED_VIDEOS_INFO": "

We ondersteunen het toevoegen van video's via openbare links momenteel niet.

Om video's te delen, meld je aan bij ente en deel met de beoogde ontvangers via hun e-mail

", - "LIVE_PHOTOS_DETECTED": "De foto en video bestanden van je Live Photos zijn samengevoegd tot één enkel bestand", - "RETRY_FAILED": "Probeer mislukte uploads nogmaals", - "FAILED_UPLOADS": "Mislukte uploads ", - "SKIPPED_FILES": "Genegeerde uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generatie mislukt", - "UNSUPPORTED_FILES": "Niet-ondersteunde bestanden", - "SUCCESSFUL_UPLOADS": "Succesvolle uploads", - "SKIPPED_INFO": "Deze zijn overgeslagen omdat er bestanden zijn met overeenkomende namen in hetzelfde album", - "UNSUPPORTED_INFO": "ente ondersteunt deze bestandsformaten nog niet", - "BLOCKED_UPLOADS": "Geblokkeerde uploads", - "SKIPPED_VIDEOS": "Overgeslagen video's", - "INPROGRESS_METADATA_EXTRACTION": "In behandeling", - "INPROGRESS_UPLOADS": "Bezig met uploaden", - "TOO_LARGE_UPLOADS": "Grote bestanden", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Onvoldoende opslagruimte", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Deze bestanden zijn niet geüpload omdat ze de maximale grootte van uw opslagplan overschrijden", - "TOO_LARGE_INFO": "Deze bestanden zijn niet geüpload omdat ze onze limiet voor bestandsgrootte overschrijden", - "THUMBNAIL_GENERATION_FAILED_INFO": "Deze bestanden zijn geüpload, maar helaas konden we geen thumbnails voor ze genereren.", - "UPLOAD_TO_COLLECTION": "Uploaden naar album", - "UNCATEGORIZED": "Ongecategoriseerd", - "ARCHIVE": "Archiveren", - "FAVORITES": "Favorieten", - "ARCHIVE_COLLECTION": "Album archiveren", - "ARCHIVE_SECTION_NAME": "Archief", - "ALL_SECTION_NAME": "Alle", - "MOVE_TO_COLLECTION": "Verplaats naar album", - "UNARCHIVE": "Uit archief halen", - "UNARCHIVE_COLLECTION": "Album uit archief halen", - "HIDE_COLLECTION": "Verberg album", - "UNHIDE_COLLECTION": "Album zichtbaar maken", - "MOVE": "Verplaatsen", - "ADD": "Toevoegen", - "REMOVE": "Verwijderen", - "YES_REMOVE": "Ja, verwijderen", - "REMOVE_FROM_COLLECTION": "Verwijderen uit album", - "TRASH": "Prullenbak", - "MOVE_TO_TRASH": "Verplaatsen naar prullenbak", - "TRASH_FILES_MESSAGE": "De geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak.", - "TRASH_FILE_MESSAGE": "Het bestand wordt uit alle albums verwijderd en verplaatst naar de prullenbak.", - "DELETE_PERMANENTLY": "Permanent verwijderen", - "RESTORE": "Herstellen", - "RESTORE_TO_COLLECTION": "Terugzetten naar album", - "EMPTY_TRASH": "Prullenbak leegmaken", - "EMPTY_TRASH_TITLE": "Prullenbak leegmaken?", - "EMPTY_TRASH_MESSAGE": "Geselecteerde bestanden zullen permanent worden verwijderd van uw ente account.", - "LEAVE_SHARED_ALBUM": "Ja, verwijderen", - "LEAVE_ALBUM": "Album verlaten", - "LEAVE_SHARED_ALBUM_TITLE": "Gedeeld album verwijderen?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Je verlaat het album, en het zal niet meer zichtbaar voor je zijn.", - "NOT_FILE_OWNER": "U kunt bestanden niet verwijderen in een gedeeld album", - "CONFIRM_SELF_REMOVE_MESSAGE": "De geselecteerde items worden verwijderd uit dit album. De items die alleen in dit album staan, worden verplaatst naar 'Niet gecategoriseerd'.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Sommige van de items die u verwijdert zijn door andere mensen toegevoegd, en u verliest de toegang daartoe.", - "SORT_BY_CREATION_TIME_ASCENDING": "Oudste", - "SORT_BY_UPDATION_TIME_DESCENDING": "Laatst gewijzigd op", - "SORT_BY_NAME": "Naam", - "COMPRESS_THUMBNAILS": "Comprimeren van thumbnails", - "THUMBNAIL_REPLACED": "Thumbnails gecomprimeerd", - "FIX_THUMBNAIL": "Comprimeren", - "FIX_THUMBNAIL_LATER": "Later comprimeren", - "REPLACE_THUMBNAIL_NOT_STARTED": "Sommige van uw video thumbnails kunnen worden gecomprimeerd om ruimte te besparen. Wilt u dat ente ze comprimeert?", - "REPLACE_THUMBNAIL_COMPLETED": "Alle thumbnails zijn gecomprimeerd", - "REPLACE_THUMBNAIL_NOOP": "Je hebt geen thumbnails die verder gecomprimeerd kunnen worden", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Kon sommige van uw thumbnails niet comprimeren, probeer het opnieuw", - "FIX_CREATION_TIME": "Herstel tijd", - "FIX_CREATION_TIME_IN_PROGRESS": "Tijd aan het herstellen", - "CREATION_TIME_UPDATED": "Bestandstijd bijgewerkt", - "UPDATE_CREATION_TIME_NOT_STARTED": "Selecteer de optie die u wilt gebruiken", - "UPDATE_CREATION_TIME_COMPLETED": "Alle bestanden succesvol bijgewerkt", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "Bestandstijd update mislukt voor sommige bestanden, probeer het opnieuw", - "CAPTION_CHARACTER_LIMIT": "5000 tekens max", - "DATE_TIME_ORIGINAL": "EXIF:DatumTijdOrigineel", - "DATE_TIME_DIGITIZED": "EXIF:DatumTijdDigitaliseerd", - "METADATA_DATE": "EXIF:MetadataDatum", - "CUSTOM_TIME": "Aangepaste tijd", - "REOPEN_PLAN_SELECTOR_MODAL": "Abonnementen heropenen", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Kon abonnementen niet openen", - "INSTALL": "Installeren", - "SHARING_DETAILS": "Delen van informatie", - "MODIFY_SHARING": "Delen wijzigen", - "ADD_COLLABORATORS": "Samenwerker toevoegen", - "ADD_NEW_EMAIL": "Nieuw e-mailadres toevoegen", - "shared_with_people_zero": "Delen met specifieke mensen", - "shared_with_people_one": "Gedeeld met 1 persoon", - "shared_with_people_other": "Gedeeld met {{count, number}} mensen", - "participants_zero": "Geen deelnemers", - "participants_one": "1 deelnemer", - "participants_other": "{{count, number}} deelnemers", - "ADD_VIEWERS": "Voeg kijkers toe", - "PARTICIPANTS": "Deelnemers", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} zullen geen foto's meer kunnen toevoegen aan dit album

Ze zullen nog steeds bestaande foto's kunnen verwijderen die door hen zijn toegevoegd

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} zal foto's aan het album kunnen toevoegen", - "CONVERT_TO_VIEWER": "Ja, converteren naar kijker", - "CONVERT_TO_COLLABORATOR": "Ja, converteren naar samenwerker", - "CHANGE_PERMISSION": "Rechten aanpassen?", - "REMOVE_PARTICIPANT": "Verwijderen?", - "CONFIRM_REMOVE": "Ja, verwijderen", - "MANAGE": "Beheren", - "ADDED_AS": "Toegevoegd als", - "COLLABORATOR_RIGHTS": "Samenwerkers kunnen foto's en video's toevoegen aan het gedeelde album", - "REMOVE_PARTICIPANT_HEAD": "Deelnemer verwijderen", - "OWNER": "Eigenaar", - "COLLABORATORS": "Samenwerker", - "ADD_MORE": "Meer toevoegen", - "VIEWERS": "Kijkers", - "OR_ADD_EXISTING": "Of kies een bestaande", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} zullen worden verwijderd uit het gedeelde album

Alle door hen toegevoegde foto's worden ook uit het album verwijderd

", - "NOT_FOUND": "404 - niet gevonden", - "LINK_EXPIRED": "Link verlopen", - "LINK_EXPIRED_MESSAGE": "Deze link is verlopen of uitgeschakeld!", - "MANAGE_LINK": "Link beheren", - "LINK_TOO_MANY_REQUESTS": "Dit album is te populair voor ons om te verwerken!", - "FILE_DOWNLOAD": "Downloads toestaan", - "LINK_PASSWORD_LOCK": "Wachtwoord versleuteling", - "PUBLIC_COLLECT": "Foto's toevoegen toestaan", - "LINK_DEVICE_LIMIT": "Apparaat limiet", - "NO_DEVICE_LIMIT": "Geen", - "LINK_EXPIRY": "Vervaldatum link", - "NEVER": "Nooit", - "DISABLE_FILE_DOWNLOAD": "Download uitschakelen", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Weet u zeker dat u de downloadknop voor bestanden wilt uitschakelen?

Kijkers kunnen nog steeds screenshots maken of een kopie van uw foto's opslaan met behulp van externe hulpmiddelen.

", - "MALICIOUS_CONTENT": "Bevat kwaadwillende inhoud", - "COPYRIGHT": "Schending van het auteursrecht van iemand die ik mag vertegenwoordigen", - "SHARED_USING": "Gedeeld via ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Gebruik code {{referralCode}} om 10 GB gratis te krijgen", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Schakel cijfercode vergrendeling uit", - "DISABLE_PASSWORD_MESSAGE": "Weet u zeker dat u de cijfercode vergrendeling wilt uitschakelen?", - "PASSWORD_LOCK": "Cijfercode vergrendeling", - "LOCK": "Vergrendeling", - "DOWNLOAD_UPLOAD_LOGS": "Logboeken voor foutmeldingen", - "UPLOAD_FILES": "Bestand", - "UPLOAD_DIRS": "Map", - "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", - "DEDUPLICATE_FILES": "Dubbele bestanden verwijderen", - "AUTHENTICATOR_SECTION": "Verificatie apparaat", - "NO_DUPLICATES_FOUND": "Je hebt geen dubbele bestanden die kunnen worden gewist", - "CLUB_BY_CAPTURE_TIME": "Samenvoegen op tijd", - "FILES": "Bestanden", - "EACH": "Elke", - "DEDUPLICATE_BASED_ON_SIZE": "De volgende bestanden zijn samengevoegd op basis van hun groottes. Controleer en verwijder items waarvan je denkt dat ze dubbel zijn", - "STOP_ALL_UPLOADS_MESSAGE": "Weet u zeker dat u wilt stoppen met alle uploads die worden uitgevoerd?", - "STOP_UPLOADS_HEADER": "Stoppen met uploaden?", - "YES_STOP_UPLOADS": "Ja, stop uploaden", - "STOP_DOWNLOADS_HEADER": "Downloaden stoppen?", - "YES_STOP_DOWNLOADS": "Ja, downloads stoppen", - "STOP_ALL_DOWNLOADS_MESSAGE": "Weet je zeker dat je wilt stoppen met alle downloads die worden uitgevoerd?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", - "ALL_ALBUMS": "Alle albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "Alle verborgen albums", - "HIDDEN_ALBUMS": "Verborgen albums", - "HIDDEN_ITEMS": "Verborgen bestanden", - "HIDDEN_ITEMS_SECTION_NAME": "Verborgen_items", - "ENTER_TWO_FACTOR_OTP": "Voer de 6-cijferige code van uw verificatie app in.", - "CREATE_ACCOUNT": "Account aanmaken", - "COPIED": "Gekopieerd", - "CANVAS_BLOCKED_TITLE": "Kan thumbnail niet genereren", - "CANVAS_BLOCKED_MESSAGE": "

Het lijkt erop dat uw browser geen toegang heeft tot canvas, die nodig is om thumbnails voor uw foto's te genereren

Schakel toegang tot het canvas van uw browser in, of bekijk onze desktop app

", - "WATCH_FOLDERS": "Monitor mappen", - "UPGRADE_NOW": "Nu upgraden", - "RENEW_NOW": "Nu verlengen", - "STORAGE": "Opslagruimte", - "USED": "gebruikt", - "YOU": "Jij", - "FAMILY": "Familie", - "FREE": "free", - "OF": "van", - "WATCHED_FOLDERS": "Gemonitorde mappen", - "NO_FOLDERS_ADDED": "Nog geen mappen toegevoegd!", - "FOLDERS_AUTOMATICALLY_MONITORED": "De mappen die u hier toevoegt worden automatisch gemonitord", - "UPLOAD_NEW_FILES_TO_ENTE": "Nieuwe bestanden uploaden naar ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Verwijderde bestanden van ente opruimen", - "ADD_FOLDER": "Map toevoegen", - "STOP_WATCHING": "Stop monitoren", - "STOP_WATCHING_FOLDER": "Stop monitoren van map?", - "STOP_WATCHING_DIALOG_MESSAGE": "Uw bestaande bestanden zullen niet worden verwijderd, maar ente stopt met het automatisch bijwerken van het gekoppelde ente album bij wijzigingen in deze map.", - "YES_STOP": "Ja, stop", - "MONTH_SHORT": "mo", - "YEAR": "jaar", - "FAMILY_PLAN": "Familie abonnement", - "DOWNLOAD_LOGS": "Logboek downloaden", - "DOWNLOAD_LOGS_MESSAGE": "

Dit zal logboeken downloaden, die u ons kunt e-mailen om te helpen bij het debuggen van uw probleem.

Houd er rekening mee dat bestandsnamen worden opgenomen om problemen met specifieke bestanden bij te houden.

", - "CHANGE_FOLDER": "Map wijzigen", - "TWO_MONTHS_FREE": "Krijg 2 maanden gratis op jaarlijkse abonnementen", - "GB": "GB", - "POPULAR": "Populair", - "FREE_PLAN_OPTION_LABEL": "Doorgaan met gratis account", - "FREE_PLAN_DESCRIPTION": "1 GB voor 1 jaar", - "CURRENT_USAGE": "Huidig gebruik is {{usage}}", - "WEAK_DEVICE": "De webbrowser die u gebruikt is niet krachtig genoeg om uw foto's te versleutelen. Probeer in te loggen op uw computer, of download de ente mobiel/desktop app.", - "DRAG_AND_DROP_HINT": "Of sleep en plaats in het ente venster", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Uw geüploade gegevens worden gepland voor verwijdering, en uw account zal permanent worden verwijderd.

Deze actie is onomkeerbaar.", - "AUTHENTICATE": "Verifiëren", - "UPLOADED_TO_SINGLE_COLLECTION": "Geüpload naar enkele collectie", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Geüpload naar verschillende collecties", - "NEVERMIND": "Laat maar", - "UPDATE_AVAILABLE": "Update beschikbaar", - "UPDATE_INSTALLABLE_MESSAGE": "Er staat een nieuwe versie van ente klaar om te worden geïnstalleerd.", - "INSTALL_NOW": "Nu installeren", - "INSTALL_ON_NEXT_LAUNCH": "Installeren bij volgende start", - "UPDATE_AVAILABLE_MESSAGE": "Er is een nieuwe versie van ente vrijgegeven, maar deze kan niet automatisch worden gedownload en geïnstalleerd.", - "DOWNLOAD_AND_INSTALL": "Downloaden en installeren", - "IGNORE_THIS_VERSION": "Negeer deze versie", - "TODAY": "Vandaag", - "YESTERDAY": "Gisteren", - "NAME_PLACEHOLDER": "Naam...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Kan geen albums maken uit bestand/map mix", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Je hebt een mix van bestanden en mappen gesleept en laten vallen.

Geef ofwel alleen bestanden aan, of alleen mappen bij het selecteren van de optie om afzonderlijke albums te maken

", - "CHOSE_THEME": "Kies thema", - "ML_SEARCH": "ML zoeken (bèta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Dit zal algoritmes op het apparaat inschakelen die zullen beginnen met het lokaal analyseren van uw geüploade foto's.

Voor het eerst na inloggen of het inschakelen van deze functie zal het alle afbeeldingen op het lokale apparaat downloaden om ze te analyseren. Schakel dit dus alleen in als je akkoord bent met gegevensverbruik en lokale verwerking van alle afbeeldingen in uw fotobibliotheek.

Als dit de eerste keer is dat uw dit inschakelt, vragen we u ook om toestemming om gegevens te verwerken.

", - "ML_MORE_DETAILS": "Meer details", - "ENABLE_FACE_SEARCH": "Zoeken op gezichten inschakelen", - "ENABLE_FACE_SEARCH_TITLE": "Zoeken op gezichten inschakelen?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Als u zoeken op gezichten inschakelt, analyseert ente de gezichtsgeometrie uit uw foto's. Dit gebeurt op uw apparaat en alle gegenereerde biometrische gegevens worden end-to-end versleuteld.

Klik hier voor meer informatie over deze functie in ons privacybeleid

", - "DISABLE_BETA": "Bèta uitschakelen", - "DISABLE_FACE_SEARCH": "Zoeken op gezichten uitschakelen", - "DISABLE_FACE_SEARCH_TITLE": "Zoeken op gezichten uitschakelen?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente zal stoppen met het analyseren van de gezichtsgeometrie, en zal ML zoeken (beta) uitschakelen

U kan zoeken op gezichten opnieuw inschakelen wanneer u wilt, dus deze handeling is veilig.

", - "ADVANCED": "Geavanceerd", - "FACE_SEARCH_CONFIRMATION": "Ik begrijp het, en wil ente toestaan om gezichten te analyseren", - "LABS": "Lab's", - "YOURS": "jouw", - "PASSPHRASE_STRENGTH_WEAK": "Wachtwoord sterkte: Zwak", - "PASSPHRASE_STRENGTH_MODERATE": "Wachtwoord sterkte: Matig", - "PASSPHRASE_STRENGTH_STRONG": "Wachtwoord sterkte: Sterk", - "PREFERENCES": "Instellingen", - "LANGUAGE": "Taal", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Ongeldige export map", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

De export map die u heeft geselecteerd bestaat niet.

Selecteer een geldige map.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Abonnementsverificatie mislukt", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "na één uur", - "DAY": "na één dag", - "WEEK": "na één week", - "MONTH": "na één maand", - "YEAR": "na één jaar" - }, - "COPY_LINK": "Link kopiëren", - "DONE": "Voltooid", - "LINK_SHARE_TITLE": "Of deel een link", - "REMOVE_LINK": "Link verwijderen", - "CREATE_PUBLIC_SHARING": "Maak publieke link", - "PUBLIC_LINK_CREATED": "Publieke link aangemaakt", - "PUBLIC_LINK_ENABLED": "Publieke link ingeschakeld", - "COLLECT_PHOTOS": "Foto's verzamelen", - "PUBLIC_COLLECT_SUBTEXT": "Sta toe dat mensen met de link ook foto's kunnen toevoegen aan het gedeelde album.", - "STOP_EXPORT": "Stoppen", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} bestanden geëxporteerd", - "MIGRATING_EXPORT": "Voorbereiden...", - "RENAMING_COLLECTION_FOLDERS": "Albumnamen hernoemen...", - "TRASHING_DELETED_FILES": "Verwijderde bestanden naar prullenbak...", - "TRASHING_DELETED_COLLECTIONS": "Verwijderde albums naar prullenbak...", - "EXPORT_NOTIFICATION": { - "START": "Exporteren begonnen", - "IN_PROGRESS": "Exporteren is al bezig", - "FINISH": "Exporteren voltooid", - "UP_TO_DATE": "Geen nieuwe bestanden om te exporteren" - }, - "CONTINUOUS_EXPORT": "Continue synchroniseren", - "TOTAL_ITEMS": "Totaal aantal bestanden", - "PENDING_ITEMS": "Bestanden in behandeling", - "EXPORT_STARTING": "Exporteren begonnen...", - "DELETE_ACCOUNT_REASON_LABEL": "Wat is de belangrijkste reden waarom je jouw account verwijdert?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Kies een reden", - "DELETE_REASON": { - "MISSING_FEATURE": "Ik mis een belangrijke functie", - "BROKEN_BEHAVIOR": "De app of een bepaalde functie functioneert niet zoals ik verwacht", - "FOUND_ANOTHER_SERVICE": "Ik heb een andere dienst gevonden die me beter bevalt", - "NOT_LISTED": "Mijn reden wordt niet vermeld" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "We vinden het jammer je te zien gaan. Deel alsjeblieft je feedback om ons te helpen verbeteren.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Feedback", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Ja, ik wil permanent mijn account inclusief alle gegevens verwijderen", - "CONFIRM_DELETE_ACCOUNT": "Account verwijderen bevestigen", - "FEEDBACK_REQUIRED": "Help ons alsjeblieft met deze informatie", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Wat doet de andere dienst beter?", - "RECOVER_TWO_FACTOR": "Herstel tweestaps", - "at": "om", - "AUTH_NEXT": "volgende", - "AUTH_DOWNLOAD_MOBILE_APP": "Download onze mobiele app om uw geheimen te beheren", - "HIDDEN": "Verborgen", - "HIDE": "Verbergen", - "UNHIDE": "Zichtbaar maken", - "UNHIDE_TO_COLLECTION": "Zichtbaar maken in album", - "SORT_BY": "Sorteren op", - "NEWEST_FIRST": "Nieuwste eerst", - "OLDEST_FIRST": "Oudste eerst", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Dit bestand kan niet worden bekeken in de app, klik hier om het origineel te downloaden", - "SELECT_COLLECTION": "Album selecteren", - "PIN_ALBUM": "Album bovenaan vastzetten", - "UNPIN_ALBUM": "Album losmaken", - "DOWNLOAD_COMPLETE": "Download compleet", - "DOWNLOADING_COLLECTION": "{{name}} downloaden", - "DOWNLOAD_FAILED": "Download mislukt", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} bestanden", - "CHRISTMAS": "Kerst", - "CHRISTMAS_EVE": "Kerstavond", - "NEW_YEAR": "Nieuwjaar", - "NEW_YEAR_EVE": "Oudjaarsavond", - "IMAGE": "Afbeelding", - "VIDEO": "Video", - "LIVE_PHOTO": "Live foto", - "CONVERT": "Converteren", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Weet u zeker dat u de editor wilt afsluiten?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Download uw bewerkte afbeelding of sla een kopie op in ente om uw wijzigingen te behouden.", - "BRIGHTNESS": "Helderheid", - "CONTRAST": "Contrast", - "SATURATION": "Saturatie", - "BLUR": "Vervagen", - "INVERT_COLORS": "Kleuren omkeren", - "ASPECT_RATIO": "Beeldverhouding", - "SQUARE": "Vierkant", - "ROTATE_LEFT": "Roteer links", - "ROTATE_RIGHT": "Roteer rechts", - "FLIP_VERTICALLY": "Verticaal spiegelen", - "FLIP_HORIZONTALLY": "Horizontaal spiegelen", - "DOWNLOAD_EDITED": "Download Bewerkt", - "SAVE_A_COPY_TO_ENTE": "Kopie in ente opslaan", - "RESTORE_ORIGINAL": "Origineel herstellen", - "TRANSFORM": "Transformeer", - "COLORS": "Kleuren", - "FLIP": "Omdraaien", - "ROTATION": "Draaiing", - "RESET": "Herstellen", - "PHOTO_EDITOR": "Fotobewerker", - "FASTER_UPLOAD": "Snellere uploads", - "FASTER_UPLOAD_DESCRIPTION": "Uploaden door nabije servers", - "MAGIC_SEARCH_STATUS": "Magische Zoekfunctie Status", - "INDEXED_ITEMS": "Geïndexeerde bestanden", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "Cache map", - "FREEHAND": "Losse hand", - "APPLY_CROP": "Bijsnijden toepassen", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Tenminste één transformatie of kleuraanpassing moet worden uitgevoerd voordat u opslaat.", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/pt-BR/translation.json b/web/apps/accounts/public/locales/pt-BR/translation.json deleted file mode 100644 index 0da001742..000000000 --- a/web/apps/accounts/public/locales/pt-BR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backups privados
para as suas memórias
", - "HERO_SLIDE_1": "Criptografia de ponta a ponta por padrão", - "HERO_SLIDE_2_TITLE": "
Armazenado com segurança
em um abrigo avançado
", - "HERO_SLIDE_2": "Feito para ter logenvidade", - "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registrar", - "NEW_USER": "Novo no ente", - "EXISTING_USER": "Usuário existente", - "ENTER_NAME": "Insira o nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Adicione um nome para que os seus amigos saibam a quem agradecer por estas ótimas fotos!", - "ENTER_EMAIL": "Insira o endereço de e-mail", - "EMAIL_ERROR": "Inserir um endereço de e-mail válido", - "REQUIRED": "Obrigatório", - "EMAIL_SENT": "Código de verificação enviado para {{email}}", - "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", - "ENTER_OTT": "Código de verificação", - "RESEND_MAIL": "Reenviar código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Ocorreu um erro. Tente novamente", - "INVALID_CODE": "Código de verificação inválido", - "EXPIRED_CODE": "O seu código de verificação expirou", - "SENDING": "Enviando...", - "SENT": "Enviado!", - "PASSWORD": "Senha", - "LINK_PASSWORD": "Insira a senha para desbloquear o álbum", - "RETURN_PASSPHRASE_HINT": "Senha", - "SET_PASSPHRASE": "Definir senha", - "VERIFY_PASSPHRASE": "Iniciar sessão", - "INCORRECT_PASSPHRASE": "Palavra-passe incorreta", - "ENTER_ENC_PASSPHRASE": "Por favor, digite uma senha que podemos usar para criptografar seus dados", - "PASSPHRASE_DISCLAIMER": "Não armazenamos sua senha, portanto, se você esquecê-la, não poderemos ajudarna recuperação de seus dados sem uma chave de recuperação.", - "WELCOME_TO_ENTE_HEADING": "Bem-vindo ao ", - "WELCOME_TO_ENTE_SUBHEADING": "Armazenamento criptografado de ponta a ponta de fotos e compartilhamento", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Onde suas melhores fotos vivem", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Gerando chaves de criptografia...", - "PASSPHRASE_HINT": "Senha", - "CONFIRM_PASSPHRASE": "Confirmar senha", - "REFERRAL_CODE_HINT": "Como você ouviu sobre o Ente? (opcional)", - "REFERRAL_INFO": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", - "PASSPHRASE_MATCH_ERROR": "As senhas não coincidem", - "CREATE_COLLECTION": "Novo álbum", - "ENTER_ALBUM_NAME": "Nome do álbum", - "CLOSE_OPTION": "Fechar (Esc)", - "ENTER_FILE_NAME": "Nome do arquivo", - "CLOSE": "Fechar", - "NO": "Não", - "NOTHING_HERE": "Nada para ver aqui! 👀", - "UPLOAD": "Enviar", - "IMPORT": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", - "SELECT_PHOTOS": "Selecionar fotos", - "FILE_UPLOAD": "Envio de Arquivo", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparando para enviar", - "1": "Lendo arquivos de metadados do google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} metadados dos arquivos extraídos", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} arquivos processados", - "4": "Cancelando envios restante", - "5": "Backup concluído" - }, - "FILE_NOT_UPLOADED_LIST": "Os seguintes arquivos não foram enviados", - "SUBSCRIPTION_EXPIRED": "Assinatura expirada", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Sua assinatura expirou, por favor renove-a", - "STORAGE_QUOTA_EXCEEDED": "Limite de armazenamento excedido", - "INITIAL_LOAD_DELAY_WARNING": "Primeiro carregamento pode levar algum tempo", - "USER_DOES_NOT_EXIST": "Desculpe, não foi possível encontrar um usuário com este e-mail", - "NO_ACCOUNT": "Não possui uma conta", - "ACCOUNT_EXISTS": "Já possui uma conta", - "CREATE": "Criar", - "DOWNLOAD": "Baixar", - "DOWNLOAD_OPTION": "Baixar (D)", - "DOWNLOAD_FAVORITES": "Baixar favoritos", - "DOWNLOAD_UNCATEGORIZED": "Baixar não categorizado", - "DOWNLOAD_HIDDEN_ITEMS": "Baixar itens ocultos", - "COPY_OPTION": "Copiar como PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Mudar para tela cheia (F)", - "ZOOM_IN_OUT": "Ampliar/Reduzir", - "PREVIOUS": "Anterior (←)", - "NEXT": "Próximo (→)", - "TITLE_PHOTOS": "Ente Fotos", - "TITLE_ALBUMS": "Ente Fotos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Envie sua primeira foto", - "IMPORT_YOUR_FOLDERS": "Importar suas pastas", - "UPLOAD_DROPZONE_MESSAGE": "Arraste para salvar seus arquivos", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Arraste para adicionar pasta monitorada", - "TRASH_FILES_TITLE": "Excluir arquivos?", - "TRASH_FILE_TITLE": "Excluir arquivo?", - "DELETE_FILES_TITLE": "Excluir imediatamente?", - "DELETE_FILES_MESSAGE": "Os arquivos selecionados serão excluídos permanentemente da sua conta ente.", - "DELETE": "Excluir", - "DELETE_OPTION": "Excluir (DEL)", - "FAVORITE_OPTION": "Favorito (L)", - "UNFAVORITE_OPTION": "Remover Favorito (L)", - "MULTI_FOLDER_UPLOAD": "Várias pastas detectadas", - "UPLOAD_STRATEGY_CHOICE": "Gostaria de enviá-los para", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Um único álbum", - "OR": "ou", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Álbuns separados", - "SESSION_EXPIRED_MESSAGE": "A sua sessão expirou. Por favor inicie sessão novamente para continuar", - "SESSION_EXPIRED": "Sessão expirada", - "PASSWORD_GENERATION_FAILED": "Seu navegador foi incapaz de gerar uma chave forte que atende aos padrões de criptografia, por favor, tente usar o aplicativo móvel ou outro navegador", - "CHANGE_PASSWORD": "Alterar senha", - "GO_BACK": "Voltar", - "RECOVERY_KEY": "Chave de recuperação", - "SAVE_LATER": "Fazer isso mais tarde", - "SAVE": "Salvar Chave", - "RECOVERY_KEY_DESCRIPTION": "Caso você esqueça sua senha, a única maneira de recuperar seus dados é com essa chave.", - "RECOVER_KEY_GENERATION_FAILED": "Não foi possível gerar o código de recuperação, tente novamente", - "KEY_NOT_STORED_DISCLAIMER": "Não armazenamos essa chave, por favor, salve essa chave de palavras em um lugar seguro", - "FORGOT_PASSWORD": "Esqueci a senha", - "RECOVER_ACCOUNT": "Recuperar conta", - "RECOVERY_KEY_HINT": "Chave de recuperação", - "RECOVER": "Recuperar", - "NO_RECOVERY_KEY": "Não possui a chave de recuperação?", - "INCORRECT_RECOVERY_KEY": "Chave de recuperação incorreta", - "SORRY": "Desculpe", - "NO_RECOVERY_KEY_MESSAGE": "Devido à natureza do nosso protocolo de criptografia de ponta a ponta, seus dados não podem ser descriptografados sem sua senha ou chave de recuperação", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Por favor, envie um e-mail para {{emailID}} a partir do seu endereço de e-mail registrado", - "CONTACT_SUPPORT": "Falar com o suporte", - "REQUEST_FEATURE": "Solicitar Funcionalidade", - "SUPPORT": "Suporte", - "CONFIRM": "Confirmar", - "CANCEL": "Cancelar", - "LOGOUT": "Encerrar sessão", - "DELETE_ACCOUNT": "Excluir conta", - "DELETE_ACCOUNT_MESSAGE": "

Por favor, envie um e-mail para {{emailID}} a partir do seu endereço de e-mail registrado.

Seu pedido será processado dentro de 72 horas.

", - "LOGOUT_MESSAGE": "Você tem certeza que deseja encerrar a sessão?", - "CHANGE_EMAIL": "Mudar e-mail", - "OK": "Aceitar", - "SUCCESS": "Bem-sucedido", - "ERROR": "Erro", - "MESSAGE": "Mensagem", - "INSTALL_MOBILE_APP": "Instale nosso aplicativo Android ou iOS para fazer backup automático de todas as suas fotos", - "DOWNLOAD_APP_MESSAGE": "Desculpe, esta operação só é suportada em nosso aplicativo para computador", - "DOWNLOAD_APP": "Baixar aplicativo para computador", - "EXPORT": "Exportar dados", - "SUBSCRIPTION": "Assinatura", - "SUBSCRIBE": "Assinar", - "MANAGEMENT_PORTAL": "Gerenciar métodos de pagamento", - "MANAGE_FAMILY_PORTAL": "Gerenciar Família", - "LEAVE_FAMILY_PLAN": "Sair do plano familiar", - "LEAVE": "Sair", - "LEAVE_FAMILY_CONFIRM": "Tem certeza que deseja sair do plano familiar?", - "CHOOSE_PLAN": "Escolha seu plano", - "MANAGE_PLAN": "Gerenciar sua assinatura", - "ACTIVE": "Ativo", - "OFFLINE_MSG": "Você está offline, memórias em cache estão sendo mostradas", - "FREE_SUBSCRIPTION_INFO": "Você está no plano gratuito que expira em {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Você está em um plano familiar gerenciado por", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renovações em {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina em {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Sua assinatura será cancelada em {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Seu complemento {{storage, string}} é válido até o dia {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Você excedeu sua cota de armazenamento, por favor atualize", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Recebemos o seu pagamento

Sua assinatura é válida até {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Sua compra foi cancelada, por favor, tente novamente se quiser assinar", - "SUBSCRIPTION_PURCHASE_FAILED": "Falha na compra de assinatura, tente novamente", - "SUBSCRIPTION_UPDATE_FAILED": "Falha ao atualizar assinatura, tente novamente", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Desculpe-nos, o pagamento falhou quando tentamos cobrar o seu cartão, por favor atualize seu método de pagamento e tente novamente", - "STRIPE_AUTHENTICATION_FAILED": "Não foi possível autenticar seu método de pagamento. Por favor, escolha outro método de pagamento e tente novamente", - "UPDATE_PAYMENT_METHOD": "Atualizar forma de pagamento", - "MONTHLY": "Mensal", - "YEARLY": "Anual", - "UPDATE_SUBSCRIPTION_MESSAGE": "Tem certeza que deseja trocar de plano?", - "UPDATE_SUBSCRIPTION": "Mudar de plano", - "CANCEL_SUBSCRIPTION": "Cancelar assinatura", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Todos os seus dados serão excluídos dos nossos servidores no final deste período de cobrança.

Você tem certeza que deseja cancelar sua assinatura?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Tem certeza que deseja cancelar sua assinatura?

", - "SUBSCRIPTION_CANCEL_FAILED": "Falha ao cancelar a assinatura", - "SUBSCRIPTION_CANCEL_SUCCESS": "Assinatura cancelada com sucesso", - "REACTIVATE_SUBSCRIPTION": "Reativar assinatura", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Uma vez reativado, você será cobrado em {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Assinatura ativada com sucesso ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Falha ao reativar as renovações de assinaturas", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Obrigado", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancelar assinatura móvel", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Por favor, cancele sua assinatura do aplicativo móvel para ativar uma assinatura aqui", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Entre em contato com {{emailID}} para gerenciar sua assinatura", - "RENAME": "Renomear", - "RENAME_FILE": "Renomear arquivo", - "RENAME_COLLECTION": "Renomear álbum", - "DELETE_COLLECTION_TITLE": "Excluir álbum?", - "DELETE_COLLECTION": "Excluir álbum", - "DELETE_COLLECTION_MESSAGE": "Também excluir as fotos (e vídeos) presentes neste álbum de todos os outros álbuns dos quais eles fazem parte?", - "DELETE_PHOTOS": "Excluir fotos", - "KEEP_PHOTOS": "Manter fotos", - "SHARE": "Compartilhar", - "SHARE_COLLECTION": "Compartilhar álbum", - "SHAREES": "Compartilhado com", - "SHARE_WITH_SELF": "Você não pode compartilhar consigo mesmo", - "ALREADY_SHARED": "Ops, você já está compartilhando isso com {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Álbum compartilhado não permitido", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Compartilhamento está desabilitado para contas gratuitas", - "DOWNLOAD_COLLECTION": "Baixar álbum", - "DOWNLOAD_COLLECTION_MESSAGE": "

Tem certeza que deseja baixar o álbum completo?

Todos os arquivos serão colocados na fila para baixar sequencialmente

", - "CREATE_ALBUM_FAILED": "Falha ao criar álbum, por favor tente novamente", - "SEARCH": "Pesquisar", - "SEARCH_RESULTS": "Resultados de pesquisa", - "NO_RESULTS": "Nenhum resultado encontrado", - "SEARCH_HINT": "Pesquisar por álbuns, datas, descrições, ...", - "SEARCH_TYPE": { - "COLLECTION": "Álbum", - "LOCATION": "Local", - "CITY": "Local", - "DATE": "Data", - "FILE_NAME": "Nome do arquivo", - "THING": "Conteúdo", - "FILE_CAPTION": "Descrição", - "FILE_TYPE": "Tipo de arquivo", - "CLIP": "Mágica" - }, - "photos_count_zero": "Sem memórias", - "photos_count_one": "1 memória", - "photos_count_other": "{{count, number}} memórias", - "TERMS_AND_CONDITIONS": "Eu concordo com os termos e a política de privacidade", - "ADD_TO_COLLECTION": "Adicionar ao álbum", - "SELECTED": "selecionado", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Este vídeo não pode ser reproduzido no seu navegador", - "PEOPLE": "Pessoas", - "INDEXING_SCHEDULED": "Indexação está programada...", - "ANALYZING_PHOTOS": "Indexando fotos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indexando pessoas em {{indexStatus.nSyncedFiles,number}} fotos...", - "INDEXING_DONE": "Foram indexadas {{indexStatus.nSyncedFiles,number}} fotos", - "UNIDENTIFIED_FACES": "rostos não identificados", - "OBJECTS": "objetos", - "TEXT": "texto", - "INFO": "Informação ", - "INFO_OPTION": "Informação (I)", - "FILE_NAME": "Nome do arquivo", - "CAPTION_PLACEHOLDER": "Adicionar uma descrição", - "LOCATION": "Local", - "SHOW_ON_MAP": "Ver no OpenStreetMap", - "MAP": "Mapa", - "MAP_SETTINGS": "Ajustes do mapa", - "ENABLE_MAPS": "Habilitar mapa?", - "ENABLE_MAP": "Habilitar mapa", - "DISABLE_MAPS": "Desativar Mapas?", - "ENABLE_MAP_DESCRIPTION": "Isto mostrará suas fotos em um mapa do mundo.

Este mapa é hospedado pelo OpenStreetMap , e os exatos locais de suas fotos nunca são compartilhados.

Você pode desativar esse recurso a qualquer momento nas Configurações.

", - "DISABLE_MAP_DESCRIPTION": "

Isto irá desativar a exibição de suas fotos em um mapa mundial.

Você pode ativar este recurso a qualquer momento nas Configurações.

", - "DISABLE_MAP": "Desabilitar mapa", - "DETAILS": "Detalhes", - "VIEW_EXIF": "Ver todos os dados EXIF", - "NO_EXIF": "Sem dados EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Dois fatores", - "TWO_FACTOR_AUTHENTICATION": "Autenticação de dois fatores", - "TWO_FACTOR_QR_INSTRUCTION": "Digitalize o código QR abaixo com o seu aplicativo de autenticador favorito", - "ENTER_CODE_MANUALLY": "Inserir código manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Por favor, insira este código no seu aplicativo autenticador favorito", - "SCAN_QR_CODE": "Em vez disso, escaneie um Código QR", - "ENABLE_TWO_FACTOR": "Ativar autenticação de dois fatores", - "ENABLE": "Habilitar", - "LOST_DEVICE": "Dispositivo de dois fatores perdido", - "INCORRECT_CODE": "Código incorreto", - "TWO_FACTOR_INFO": "Adicione uma camada adicional de segurança, exigindo mais do que seu e-mail e senha para entrar na sua conta", - "DISABLE_TWO_FACTOR_LABEL": "Desativar autenticação de dois fatores", - "UPDATE_TWO_FACTOR_LABEL": "Atualize seu dispositivo autenticador", - "DISABLE": "Desativar", - "RECONFIGURE": "Reconfigurar", - "UPDATE_TWO_FACTOR": "Atualizar dois fatores", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuar adiante anulará qualquer autenticador configurado anteriormente", - "UPDATE": "Atualização", - "DISABLE_TWO_FACTOR": "Desativar autenticação de dois fatores", - "DISABLE_TWO_FACTOR_MESSAGE": "Você tem certeza de que deseja desativar a autenticação de dois fatores", - "TWO_FACTOR_DISABLE_FAILED": "Não foi possível desativar dois fatores, por favor tente novamente", - "EXPORT_DATA": "Exportar dados", - "SELECT_FOLDER": "Selecione a pasta", - "DESTINATION": "Destino", - "START": "Iniciar", - "LAST_EXPORT_TIME": "Data da última exportação", - "EXPORT_AGAIN": "Resincronizar", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Armazenamento local não acessível", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Seu navegador ou uma extensão está bloqueando o ente de salvar os dados no armazenamento local. Por favor, tente carregar esta página depois de alternar o modo de navegação.", - "SEND_OTT": "Enviar códigos OTP", - "EMAIl_ALREADY_OWNED": "Este e-mail já está em uso", - "ETAGS_BLOCKED": "

Não foi possível fazer o envio dos seguintes arquivos devido à configuração do seu navegador.

Por favor, desative quaisquer complementos que possam estar impedindo o ente de utilizar eTags para enviar arquivos grandes, ou utilize nosso aplicativo para computador para uma experiência de importação mais confiável.

", - "SKIPPED_VIDEOS_INFO": "

Atualmente, não oferecemos suporte para adicionar vídeos através de links públicos.

Para compartilhar vídeos, por favor, faça cadastro no ente e compartilhe com os destinatários pretendidos usando seus e-mails.

", - "LIVE_PHOTOS_DETECTED": "Os arquivos de foto e vídeo das suas Fotos em Movimento foram mesclados em um único arquivo", - "RETRY_FAILED": "Repetir envios que falharam", - "FAILED_UPLOADS": "Envios com falhas ", - "SKIPPED_FILES": "Envios ignorados", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Falha ao gerar miniaturas", - "UNSUPPORTED_FILES": "Arquivos não suportados", - "SUCCESSFUL_UPLOADS": "Envios bem sucedidos", - "SKIPPED_INFO": "Ignorar estes como existem arquivos com nomes correspondentes no mesmo álbum", - "UNSUPPORTED_INFO": "ente ainda não suporta estes formatos de arquivo", - "BLOCKED_UPLOADS": "Envios bloqueados", - "SKIPPED_VIDEOS": "Vídeos ignorados", - "INPROGRESS_METADATA_EXTRACTION": "Em andamento", - "INPROGRESS_UPLOADS": "Envios em andamento", - "TOO_LARGE_UPLOADS": "Arquivos grandes", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Armazenamento insuficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Estes arquivos não foram carregados pois excedem o tamanho máximo para seu plano de armazenamento", - "TOO_LARGE_INFO": "Estes arquivos não foram carregados pois excedem nosso limite máximo de tamanho de arquivo", - "THUMBNAIL_GENERATION_FAILED_INFO": "Estes arquivos foram enviados, mas infelizmente não conseguimos gerar as miniaturas para eles.", - "UPLOAD_TO_COLLECTION": "Enviar para o álbum", - "UNCATEGORIZED": "Sem categoria", - "ARCHIVE": "Arquivar", - "FAVORITES": "Favoritos", - "ARCHIVE_COLLECTION": "Arquivar álbum", - "ARCHIVE_SECTION_NAME": "Arquivar", - "ALL_SECTION_NAME": "Todos", - "MOVE_TO_COLLECTION": "Mover para álbum", - "UNARCHIVE": "Desarquivar", - "UNARCHIVE_COLLECTION": "Desarquivar álbum", - "HIDE_COLLECTION": "Ocultar álbum", - "UNHIDE_COLLECTION": "Reexibir álbum", - "MOVE": "Mover", - "ADD": "Adicionar", - "REMOVE": "Remover", - "YES_REMOVE": "Sim, remover", - "REMOVE_FROM_COLLECTION": "Remover do álbum", - "TRASH": "Lixeira", - "MOVE_TO_TRASH": "Mover para a lixeira", - "TRASH_FILES_MESSAGE": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.", - "TRASH_FILE_MESSAGE": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.", - "DELETE_PERMANENTLY": "Excluir permanentemente", - "RESTORE": "Restaurar", - "RESTORE_TO_COLLECTION": "Restaurar para álbum", - "EMPTY_TRASH": "Esvaziar a lixeira", - "EMPTY_TRASH_TITLE": "Esvaziar a lixeira?", - "EMPTY_TRASH_MESSAGE": "Estes arquivos serão excluídos permanentemente da sua conta do ente.", - "LEAVE_SHARED_ALBUM": "Sim, sair", - "LEAVE_ALBUM": "Sair do álbum", - "LEAVE_SHARED_ALBUM_TITLE": "Sair do álbum compartilhado?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Você deixará o álbum e ele deixará de ser visível para você.", - "NOT_FILE_OWNER": "Você não pode excluir arquivos em um álbum compartilhado", - "CONFIRM_SELF_REMOVE_MESSAGE": "Os itens selecionados serão removidos deste álbum. Itens que estão somente neste álbum serão movidos a aba Sem Categoria.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Alguns dos itens que você está removendo foram adicionados por outras pessoas, e você perderá o acesso a eles.", - "SORT_BY_CREATION_TIME_ASCENDING": "Mais antigo", - "SORT_BY_UPDATION_TIME_DESCENDING": "Última atualização", - "SORT_BY_NAME": "Nome", - "COMPRESS_THUMBNAILS": "Compactar miniaturas", - "THUMBNAIL_REPLACED": "Miniaturas compactadas", - "FIX_THUMBNAIL": "Compactar", - "FIX_THUMBNAIL_LATER": "Compactar depois", - "REPLACE_THUMBNAIL_NOT_STARTED": "Algumas miniaturas de seus vídeos podem ser compactadas para economizar espaço. Você gostaria de compactá-las?", - "REPLACE_THUMBNAIL_COMPLETED": "Miniaturas compactadas com sucesso", - "REPLACE_THUMBNAIL_NOOP": "Você não tem nenhuma miniatura que possa ser compactadas mais", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Não foi possível compactar algumas das suas miniaturas, por favor tente novamente", - "FIX_CREATION_TIME": "Corrigir hora", - "FIX_CREATION_TIME_IN_PROGRESS": "Corrigindo horário", - "CREATION_TIME_UPDATED": "Hora do arquivo atualizado", - "UPDATE_CREATION_TIME_NOT_STARTED": "Selecione a carteira que você deseja usar", - "UPDATE_CREATION_TIME_COMPLETED": "Todos os arquivos atualizados com sucesso", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "A atualização do horário falhou para alguns arquivos, por favor, tente novamente", - "CAPTION_CHARACTER_LIMIT": "5000 caracteres no máximo", - "DATE_TIME_ORIGINAL": "Data e Hora Original", - "DATE_TIME_DIGITIZED": "Data e Hora Digitalizada", - "METADATA_DATE": "Data de Metadados", - "CUSTOM_TIME": "Tempo personalizado", - "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planos", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Falha ao abrir planos", - "INSTALL": "Instalar", - "SHARING_DETAILS": "Detalhes de compartilhamento", - "MODIFY_SHARING": "Modificar compartilhamento", - "ADD_COLLABORATORS": "Adicionar colaboradores", - "ADD_NEW_EMAIL": "Adicionar um novo email", - "shared_with_people_zero": "Compartilhar com pessoas específicas", - "shared_with_people_one": "Compartilhado com 1 pessoa", - "shared_with_people_other": "Compartilhado com {{count, number}} pessoas", - "participants_zero": "Nenhum participante", - "participants_one": "1 participante", - "participants_other": "{{count, number}} participantes", - "ADD_VIEWERS": "Adicionar visualizações", - "PARTICIPANTS": "Participantes", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} Não poderá adicionar mais fotos a este álbum

Eles ainda poderão remover as fotos existentes adicionadas por eles

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} poderá adicionar fotos ao álbum", - "CONVERT_TO_VIEWER": "Sim, converter para visualizador", - "CONVERT_TO_COLLABORATOR": "Sim, converter para colaborador", - "CHANGE_PERMISSION": "Alterar permissões?", - "REMOVE_PARTICIPANT": "Remover?", - "CONFIRM_REMOVE": "Sim, remover", - "MANAGE": "Gerenciar", - "ADDED_AS": "Adicionado como", - "COLLABORATOR_RIGHTS": "Os colaboradores podem adicionar fotos e vídeos ao álbum compartilhado", - "REMOVE_PARTICIPANT_HEAD": "Remover participante", - "OWNER": "Proprietário", - "COLLABORATORS": "Colaboradores", - "ADD_MORE": "Adicionar mais", - "VIEWERS": "Visualizações", - "OR_ADD_EXISTING": "Ou escolha um existente", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} será removido deste álbum compartilhado

Quaisquer fotos adicionadas por eles também serão removidas do álbum

", - "NOT_FOUND": "404 Página não encontrada", - "LINK_EXPIRED": "Link expirado", - "LINK_EXPIRED_MESSAGE": "Este link expirou ou foi desativado!", - "MANAGE_LINK": "Gerenciar link", - "LINK_TOO_MANY_REQUESTS": "Desculpe, este álbum foi visualizado em muitos dispositivos!", - "FILE_DOWNLOAD": "Permitir transferências", - "LINK_PASSWORD_LOCK": "Bloqueio de senha", - "PUBLIC_COLLECT": "Permitir adicionar fotos", - "LINK_DEVICE_LIMIT": "Limite de dispositivos", - "NO_DEVICE_LIMIT": "Nenhum", - "LINK_EXPIRY": "Expiração do link", - "NEVER": "Nunca", - "DISABLE_FILE_DOWNLOAD": "Desabilitar transferência", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Tem certeza de que deseja desativar o botão de download para arquivos?

Os visualizadores ainda podem capturar imagens da tela ou salvar uma cópia de suas fotos usando ferramentas externas.

", - "MALICIOUS_CONTENT": "Contém conteúdo malicioso", - "COPYRIGHT": "Viola os direitos autorais de alguém que estou autorizado a representar", - "SHARED_USING": "Compartilhar usando ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Use o código {{referralCode}} para obter 10 GB de graça", - "LIVE": "AO VIVO", - "DISABLE_PASSWORD": "Desativar bloqueio por senha", - "DISABLE_PASSWORD_MESSAGE": "Tem certeza que deseja desativar o bloqueio por senha?", - "PASSWORD_LOCK": "Bloqueio de senha", - "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuração", - "UPLOAD_FILES": "Arquivo", - "UPLOAD_DIRS": "Pasta", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Arquivos Deduplicados", - "AUTHENTICATOR_SECTION": "Autenticação", - "NO_DUPLICATES_FOUND": "Você não tem arquivos duplicados que possam ser limpos", - "CLUB_BY_CAPTURE_TIME": "Agrupar por tempo de captura", - "FILES": "Arquivos", - "EACH": "Cada", - "DEDUPLICATE_BASED_ON_SIZE": "Os seguintes arquivos foram listados com base em seus tamanhos, por favor, reveja e exclua os itens que você acredita que são duplicados", - "STOP_ALL_UPLOADS_MESSAGE": "Tem certeza que deseja parar todos os envios em andamento?", - "STOP_UPLOADS_HEADER": "Parar envios?", - "YES_STOP_UPLOADS": "Sim, parar envios", - "STOP_DOWNLOADS_HEADER": "Parar transferências?", - "YES_STOP_DOWNLOADS": "Sim, parar transferências", - "STOP_ALL_DOWNLOADS_MESSAGE": "Tem certeza que deseja parar todos as transferências em andamento?", - "albums_one": "1 Álbum", - "albums_other": "{{count, number}} Álbuns", - "ALL_ALBUMS": "Todos os álbuns", - "ALBUMS": "Álbuns", - "ALL_HIDDEN_ALBUMS": "Todos os álbuns ocultos", - "HIDDEN_ALBUMS": "Álbuns ocultos", - "HIDDEN_ITEMS": "Itens ocultos", - "HIDDEN_ITEMS_SECTION_NAME": "Itens_ocultos", - "ENTER_TWO_FACTOR_OTP": "Digite o código de 6 dígitos de\nseu aplicativo autenticador.", - "CREATE_ACCOUNT": "Criar uma conta", - "COPIED": "Copiado", - "CANVAS_BLOCKED_TITLE": "Não foi possível gerar miniatura", - "CANVAS_BLOCKED_MESSAGE": "

Parece que o seu navegador desativou o acesso à tela que é necessário para gerar miniaturas para as suas fotos

Por favor, habilite o acesso à tela do seu navegador, ou veja nosso aplicativo para computador

", - "WATCH_FOLDERS": "Pastas monitoradas", - "UPGRADE_NOW": "Aprimorar agora", - "RENEW_NOW": "Renovar agora", - "STORAGE": "Armazenamento", - "USED": "usado", - "YOU": "Você", - "FAMILY": "Família", - "FREE": "grátis", - "OF": "de", - "WATCHED_FOLDERS": "Pastas monitoradas", - "NO_FOLDERS_ADDED": "Nenhuma pasta adicionada ainda!", - "FOLDERS_AUTOMATICALLY_MONITORED": "As pastas que você adicionar aqui serão monitoradas automaticamente", - "UPLOAD_NEW_FILES_TO_ENTE": "Enviar novos arquivos para o ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Remover arquivos excluídos do ente", - "ADD_FOLDER": "Adicionar pasta", - "STOP_WATCHING": "Parar de acompanhar", - "STOP_WATCHING_FOLDER": "Parar de acompanhar a pasta?", - "STOP_WATCHING_DIALOG_MESSAGE": "Seus arquivos existentes não serão excluídos, mas ente irá parar de atualizar automaticamente o álbum associado em alterações nesta pasta.", - "YES_STOP": "Sim, parar", - "MONTH_SHORT": "mês", - "YEAR": "ano", - "FAMILY_PLAN": "Plano familiar", - "DOWNLOAD_LOGS": "Baixar logs", - "DOWNLOAD_LOGS_MESSAGE": "

Isto irá baixar os logs de depuração, que você pode enviar para nós para ajudar a depurar seu problema.

Por favor, note que os nomes de arquivos serão incluídos para ajudar a rastrear problemas com arquivos específicos.

", - "CHANGE_FOLDER": "Alterar pasta", - "TWO_MONTHS_FREE": "Obtenha 2 meses gratuitos em planos anuais", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continuar com teste gratuito", - "FREE_PLAN_DESCRIPTION": "1 GB por 1 ano", - "CURRENT_USAGE": "O uso atual é {{usage}}", - "WEAK_DEVICE": "O navegador da web que você está usando não é poderoso o suficiente para criptografar suas fotos. Por favor, tente entrar para o ente no computador ou baixe o aplicativo móvel.", - "DRAG_AND_DROP_HINT": "Ou arraste e solte na janela ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Seus dados enviados serão agendados para exclusão e sua conta será excluída permanentemente.

Essa ação não é reversível.", - "AUTHENTICATE": "Autenticar", - "UPLOADED_TO_SINGLE_COLLECTION": "Enviado para coleção única", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Enviada para separar coleções", - "NEVERMIND": "Esquecer", - "UPDATE_AVAILABLE": "Atualização disponível", - "UPDATE_INSTALLABLE_MESSAGE": "Uma nova versão do ente está pronta para ser instalada.", - "INSTALL_NOW": "Instalar agora", - "INSTALL_ON_NEXT_LAUNCH": "Instalar na próxima inicialização", - "UPDATE_AVAILABLE_MESSAGE": "Uma nova versão do ente foi lançada, mas não pode ser baixada e instalada automaticamente.", - "DOWNLOAD_AND_INSTALL": "Baixar e instalar", - "IGNORE_THIS_VERSION": "Ignorar esta versão", - "TODAY": "Hoje", - "YESTERDAY": "Ontem", - "NAME_PLACEHOLDER": "Nome...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Não foi possível criar álbuns a partir da mistura de arquivos/pastas", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Você arrastou e deixou uma mistura de arquivos e pastas.

Por favor, forneça apenas arquivos ou apenas pastas ao selecionar a opção para criar álbuns separados

", - "CHOSE_THEME": "Escolher tema", - "ML_SEARCH": "Reconhecimento facial", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Isso permitirá aprendizado de máquina no dispositivo e busca facial, iniciando a análise de suas fotos enviadas localmente.

Na primeira execução após o login ou habilitação desta funcionalidade, será feito o download de todas as imagens no dispositivo local para análise. Portanto, ative isso apenas se estiver confortável com o consumo de largura de banda e processamento local de todas as imagens em sua biblioteca de fotos.

Se esta for a primeira vez que você está habilitando isso, também solicitaremos sua permissão para processar dados faciais.

", - "ML_MORE_DETAILS": "Mais detalhes", - "ENABLE_FACE_SEARCH": "Habilitar reconhecimento facial", - "ENABLE_FACE_SEARCH_TITLE": "Habilitar reconhecimento facial?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos. Isso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta.

Por favor, clique aqui para obter mais detalhes sobre esta funcionalidade em nossa política de privacidade

", - "DISABLE_BETA": "Pausar reconhecimento", - "DISABLE_FACE_SEARCH": "Desativar reconhecimento facial", - "DISABLE_FACE_SEARCH_TITLE": "Desativar reconhecimento facial?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

Ente irá parar de processar geometria facial.

Você pode reativar o reconhecimento facial novamente, se desejar, então esta operação está segura.

", - "ADVANCED": "Avançado", - "FACE_SEARCH_CONFIRMATION": "Eu entendo, e desejo permitir que o ente processe a geometria do rosto", - "LABS": "Laboratórios", - "YOURS": "seu", - "PASSPHRASE_STRENGTH_WEAK": "Força da senha: fraca", - "PASSPHRASE_STRENGTH_MODERATE": "Força da senha: moderada", - "PASSPHRASE_STRENGTH_STRONG": "Força da senha: forte", - "PREFERENCES": "Preferências", - "LANGUAGE": "Idioma", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Diretório de exportação inválido", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

O diretório de exportação que você selecionou não existe.

Por favor, selecione um diretório válido.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Falha na verificação de assinatura", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "após uma hora", - "DAY": "após um dia", - "WEEK": "após uma semana", - "MONTH": "após um mês", - "YEAR": "após um ano" - }, - "COPY_LINK": "Copiar link", - "DONE": "Concluído", - "LINK_SHARE_TITLE": "Ou compartilhe um link", - "REMOVE_LINK": "Remover link", - "CREATE_PUBLIC_SHARING": "Criar link público", - "PUBLIC_LINK_CREATED": "Link público criado", - "PUBLIC_LINK_ENABLED": "Link público ativado", - "COLLECT_PHOTOS": "Coletar fotos", - "PUBLIC_COLLECT_SUBTEXT": "Permita que as pessoas com o link também adicionem fotos ao álbum compartilhado.", - "STOP_EXPORT": "Parar", - "EXPORT_PROGRESS": "{{progress.success, number}} / {{progress.total, number}} itens sincronizados", - "MIGRATING_EXPORT": "Preparando...", - "RENAMING_COLLECTION_FOLDERS": "Renomeando pastas do álbum...", - "TRASHING_DELETED_FILES": "Descartando arquivos excluídos...", - "TRASHING_DELETED_COLLECTIONS": "Descartando álbuns excluídos...", - "EXPORT_NOTIFICATION": { - "START": "Exportação iniciada", - "IN_PROGRESS": "Exportação já em andamento", - "FINISH": "Exportação finalizada", - "UP_TO_DATE": "Não há arquivos novos para exportar" - }, - "CONTINUOUS_EXPORT": "Sincronizar continuamente", - "TOTAL_ITEMS": "Total de itens", - "PENDING_ITEMS": "Itens pendentes", - "EXPORT_STARTING": "Iniciando a exportação...", - "DELETE_ACCOUNT_REASON_LABEL": "Qual é o principal motivo para você excluir sua conta?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Selecione um motivo", - "DELETE_REASON": { - "MISSING_FEATURE": "Está faltando um recurso que eu preciso", - "BROKEN_BEHAVIOR": "O aplicativo ou um determinado recurso não está funcionando como eu acredito que deveria", - "FOUND_ANOTHER_SERVICE": "Encontrei outro serviço que gosto mais", - "NOT_LISTED": "Meu motivo não está listado" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Sentimos muito em vê-lo partir. Explique por que você está partindo para nos ajudar a melhorar.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Comentários", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Sim, desejo excluir permanentemente esta conta e todos os seus dados", - "CONFIRM_DELETE_ACCOUNT": "Confirmar exclusão da conta", - "FEEDBACK_REQUIRED": "Por favor, ajude-nos com esta informação", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "O que o outro serviço faz melhor?", - "RECOVER_TWO_FACTOR": "Recuperar dois fatores", - "at": "em", - "AUTH_NEXT": "próximo", - "AUTH_DOWNLOAD_MOBILE_APP": "Baixe nosso aplicativo móvel para gerenciar seus segredos", - "HIDDEN": "Escondido", - "HIDE": "Ocultar", - "UNHIDE": "Desocultar", - "UNHIDE_TO_COLLECTION": "Reexibir para o álbum", - "SORT_BY": "Ordenar por", - "NEWEST_FIRST": "Mais recentes primeiro", - "OLDEST_FIRST": "Mais antigo primeiro", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Este arquivo não pôde ser pré-visualizado. Clique aqui para baixar o original.", - "SELECT_COLLECTION": "Selecionar álbum", - "PIN_ALBUM": "Fixar álbum", - "UNPIN_ALBUM": "Desafixar álbum", - "DOWNLOAD_COMPLETE": "Transferência concluída", - "DOWNLOADING_COLLECTION": "Transferindo {{name}}", - "DOWNLOAD_FAILED": "Falha ao baixar", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} arquivos", - "CHRISTMAS": "Natal", - "CHRISTMAS_EVE": "Véspera de Natal", - "NEW_YEAR": "Ano Novo", - "NEW_YEAR_EVE": "Véspera de Ano Novo", - "IMAGE": "Imagem", - "VIDEO": "Vídeo", - "LIVE_PHOTO": "Fotos em movimento", - "CONVERT": "Converter", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Tem certeza de que deseja fechar o editor?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Baixe sua imagem editada ou salve uma cópia para o ente para persistir nas alterações.", - "BRIGHTNESS": "Brilho", - "CONTRAST": "Contraste", - "SATURATION": "Saturação", - "BLUR": "Desfoque", - "INVERT_COLORS": "Inverter Cores", - "ASPECT_RATIO": "Proporção da imagem", - "SQUARE": "Quadrado", - "ROTATE_LEFT": "Girar para a Esquerda", - "ROTATE_RIGHT": "Girar para a Direita", - "FLIP_VERTICALLY": "Inverter verticalmente", - "FLIP_HORIZONTALLY": "Inverter horizontalmente", - "DOWNLOAD_EDITED": "Transferência Editada", - "SAVE_A_COPY_TO_ENTE": "Salvar uma cópia para o ente", - "RESTORE_ORIGINAL": "Restaurar original", - "TRANSFORM": "Transformar", - "COLORS": "Cores", - "FLIP": "Inverter", - "ROTATION": "Rotação", - "RESET": "Redefinir", - "PHOTO_EDITOR": "Editor de Fotos", - "FASTER_UPLOAD": "Envios mais rápidos", - "FASTER_UPLOAD_DESCRIPTION": "Rotas enviam em servidores próximos", - "MAGIC_SEARCH_STATUS": "Estado da busca mágica", - "INDEXED_ITEMS": "Itens indexados", - "CAST_ALBUM_TO_TV": "Reproduzir álbum na TV", - "ENTER_CAST_PIN_CODE": "Digite o código que você vê na TV abaixo para parear este dispositivo.", - "PAIR_DEVICE_TO_TV": "Parear dispositivos", - "TV_NOT_FOUND": "TV não encontrada. Você inseriu o PIN correto?", - "AUTO_CAST_PAIR": "Pareamento automático", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "O Auto Pair requer a conexão com servidores do Google e só funciona com dispositivos Chromecast. O Google não receberá dados confidenciais, como suas fotos.", - "PAIR_WITH_PIN": "Parear com PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Escolha um dispositivo compatível com casts no navegador popup.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "Parear com o PIN funciona para qualquer dispositivo de tela grande onde você deseja reproduzir seu álbum.", - "VISIT_CAST_ENTE_IO": "Acesse cast.ente.io no dispositivo que você deseja parear.", - "CAST_AUTO_PAIR_FAILED": "Chromecast Auto Pair falhou. Por favor, tente novamente.", - "CACHE_DIRECTORY": "Pasta de Cache", - "FREEHAND": "Mão livre", - "APPLY_CROP": "Aplicar Recorte", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Pelo menos uma transformação ou ajuste de cor deve ser feito antes de salvar.", - "PASSKEYS": "Chaves de acesso", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/pt-PT/translation.json b/web/apps/accounts/public/locales/pt-PT/translation.json deleted file mode 100644 index 230980326..000000000 --- a/web/apps/accounts/public/locales/pt-PT/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backups privados
para as suas memórias
", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registar", - "NEW_USER": "Novo no ente", - "EXISTING_USER": "Utilizador existente", - "ENTER_NAME": "Insira o nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Adicione um nome para que os seus amigos saibam a quem agradecer por estas ótimas fotos!", - "ENTER_EMAIL": "Insira o endereço de email", - "EMAIL_ERROR": "Inserir um endereço de email válido", - "REQUIRED": "Obrigatório", - "EMAIL_SENT": "Código de verificação enviado para {{email}}", - "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", - "ENTER_OTT": "Código de verificação", - "RESEND_MAIL": "Reenviar código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Ocorreu um erro. Tente novamente", - "INVALID_CODE": "Código de verificação inválido", - "EXPIRED_CODE": "O seu código de verificação expirou", - "SENDING": "A enviar...", - "SENT": "Enviado!", - "PASSWORD": "Palavra-passe", - "LINK_PASSWORD": "Introduza a palavra-passe para desbloquear o álbum", - "RETURN_PASSPHRASE_HINT": "Palavra-passe", - "SET_PASSPHRASE": "Definir palavra-passe", - "VERIFY_PASSPHRASE": "Entrar", - "INCORRECT_PASSPHRASE": "Palavra-passe incorreta", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Bem-vindo ao ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "Novo álbum", - "ENTER_ALBUM_NAME": "Nome do álbum", - "CLOSE_OPTION": "Fechar (Esc)", - "ENTER_FILE_NAME": "Nome do ficheiro", - "CLOSE": "Fechar", - "NO": "Não", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", - "SELECT_PHOTOS": "Selecionar fotos", - "FILE_UPLOAD": "Enviar Ficheiro", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "Não possui uma conta", - "ACCOUNT_EXISTS": "Já possui uma conta", - "CREATE": "Criar", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/ru-RU/translation.json b/web/apps/accounts/public/locales/ru-RU/translation.json deleted file mode 100644 index c85db2236..000000000 --- a/web/apps/accounts/public/locales/ru-RU/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Личные резервные копии
для твоих воспоминаний
", - "HERO_SLIDE_1": "Сквозное шифрование по умолчанию", - "HERO_SLIDE_2_TITLE": "
Надежно хранится
в убежище от радиоактивных осадков
", - "HERO_SLIDE_2": "Созданный для того, чтобы пережить", - "HERO_SLIDE_3_TITLE": "
Доступно
везде
", - "HERO_SLIDE_3": "Android, iOS, Веб, ПК", - "LOGIN": "Авторизоваться", - "SIGN_UP": "Регистрация", - "NEW_USER": "Новенький в ente", - "EXISTING_USER": "Существующий пользователь", - "ENTER_NAME": "Введите имя", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Добавьте имя, чтобы ваши друзья знали, кого благодарить за эти замечательные фотографии!", - "ENTER_EMAIL": "Введите адрес электронной почты", - "EMAIL_ERROR": "Введите действительный адрес электронной почты", - "REQUIRED": "Требуется", - "EMAIL_SENT": "Проверочный код отправлен на
{{email}}", - "CHECK_INBOX": "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения проверки", - "ENTER_OTT": "Проверочный код", - "RESEND_MAIL": "Отправить код еще раз", - "VERIFY": "Подтвердить", - "UNKNOWN_ERROR": "Что-то пошло не так, Попробуйте еще раз", - "INVALID_CODE": "Неверный код подтверждения", - "EXPIRED_CODE": "Срок действия вашего проверочного кода истек", - "SENDING": "Отправка...", - "SENT": "Отправлено!", - "PASSWORD": "Пароль", - "LINK_PASSWORD": "Введите пароль, чтобы разблокировать альбом", - "RETURN_PASSPHRASE_HINT": "Пароль", - "SET_PASSPHRASE": "Установить пароль", - "VERIFY_PASSPHRASE": "Войти", - "INCORRECT_PASSPHRASE": "Неверный пароль", - "ENTER_ENC_PASSPHRASE": "Пожалуйста, введите пароль, который мы можем использовать для шифрования ваших данных", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Добро пожаловать в ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Где живут ваши лучшие фотографии", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Генерируем ключи шифрования...", - "PASSPHRASE_HINT": "Пароль", - "CONFIRM_PASSPHRASE": "Подтвердите пароль", - "REFERRAL_CODE_HINT": "Как вы узнали о Ente? (необязательно)", - "REFERRAL_INFO": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!", - "PASSPHRASE_MATCH_ERROR": "Пароли не совпадают", - "CREATE_COLLECTION": "Новый альбом", - "ENTER_ALBUM_NAME": "Название альбома", - "CLOSE_OPTION": "Закрыть (Esc)", - "ENTER_FILE_NAME": "Имя файла", - "CLOSE": "Закрыть", - "NO": "Нет", - "NOTHING_HERE": "Здесь нечего смотреть! 👀", - "UPLOAD": "Загрузить", - "IMPORT": "Импорт", - "ADD_PHOTOS": "Добавить фотографии", - "ADD_MORE_PHOTOS": "Добавить больше фото", - "add_photos_one": "Добавить 1 элемент", - "add_photos_other": "Добавить {{count, number}} элементов", - "SELECT_PHOTOS": "Выбрать фотографии", - "FILE_UPLOAD": "Загрузка файла", - "UPLOAD_STAGE_MESSAGE": { - "0": "Подготовка к загрузке", - "1": "Чтение файлов метаданных Google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов извлечены", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов обработано", - "4": "Отмена оставшихся загрузок", - "5": "Резервное копирование завершено" - }, - "FILE_NOT_UPLOADED_LIST": "Следующие файлы не были загружены", - "SUBSCRIPTION_EXPIRED": "Подписка закончилась", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Срок действия вашей подписки истек, пожалуйста, продлите", - "STORAGE_QUOTA_EXCEEDED": "Превышен лимит хранения", - "INITIAL_LOAD_DELAY_WARNING": "Первая загрузка может занять некоторое время", - "USER_DOES_NOT_EXIST": "Пользователь с таким email не найден", - "NO_ACCOUNT": "У вас нет учетной записи", - "ACCOUNT_EXISTS": "Уже есть аккаунт", - "CREATE": "Создать", - "DOWNLOAD": "Скачать", - "DOWNLOAD_OPTION": "Скачать (D)", - "DOWNLOAD_FAVORITES": "Скачать избранные", - "DOWNLOAD_UNCATEGORIZED": "Скачать без категорий", - "DOWNLOAD_HIDDEN_ITEMS": "Скачать скрытые элементы", - "COPY_OPTION": "Скопировать как PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Полноэкранный режим (F)", - "ZOOM_IN_OUT": "Увеличить/уменьшить", - "PREVIOUS": "Предыдущий (←)", - "NEXT": "Следующий (→)", - "TITLE_PHOTOS": "Ente Фото", - "TITLE_ALBUMS": "Ente Фото", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "Загрузите своё первое фото", - "IMPORT_YOUR_FOLDERS": "Импортируйте папки", - "UPLOAD_DROPZONE_MESSAGE": "Перетащите для резервного копирования файлов", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Перетащите, чтобы добавить просматриваемую папку", - "TRASH_FILES_TITLE": "Удалить файлы?", - "TRASH_FILE_TITLE": "Удалить файл?", - "DELETE_FILES_TITLE": "Удалить немедленно?", - "DELETE_FILES_MESSAGE": "Выбранные файлы будут безвозвратно удалены из вашей учетной записи ente.", - "DELETE": "Удалить", - "DELETE_OPTION": "Удалить (DEL)", - "FAVORITE_OPTION": "Избранное (L)", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "Обнаружено несколько папок", - "UPLOAD_STRATEGY_CHOICE": "Вы хотите загрузить их в", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Один альбом", - "OR": "или", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Отдельные альбомы", - "SESSION_EXPIRED_MESSAGE": "Истёк срок действия вашей сессии. Для продолжения, пожалуйста, войдите снова", - "SESSION_EXPIRED": "Время сессии истекло", - "PASSWORD_GENERATION_FAILED": "Вашему браузеру не удалось сгенерировать надежный ключ, соответствующий стандартам шифрования ente, пожалуйста, попробуйте использовать мобильное приложение или другой браузер", - "CHANGE_PASSWORD": "Изменить пароль", - "GO_BACK": "Вернуться назад", - "RECOVERY_KEY": "Ключ восстановления", - "SAVE_LATER": "Сделать позже", - "SAVE": "Сохранить ключ", - "RECOVERY_KEY_DESCRIPTION": "Если вы забыли свой пароль, то восстановить данные можно только с помощью этого ключа.", - "RECOVER_KEY_GENERATION_FAILED": "Не удалось сгенерировать код восстановления, пожалуйста, повторите попытку", - "KEY_NOT_STORED_DISCLAIMER": "Мы не храним этот ключ, поэтому, пожалуйста, сохраните его в надежном месте", - "FORGOT_PASSWORD": "Забыл пароль", - "RECOVER_ACCOUNT": "Восстановить аккаунт", - "RECOVERY_KEY_HINT": "Ключ восстановления", - "RECOVER": "Восстановить", - "NO_RECOVERY_KEY": "Нет ключа восстановления?", - "INCORRECT_RECOVERY_KEY": "Неправильный ключ восстановления", - "SORRY": "Извините", - "NO_RECOVERY_KEY_MESSAGE": "Из-за природы нашего сквозного протокола шифрования ваши данные не могут быть расшифрованы без вашего пароля или ключа восстановления", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Пожалуйста, отправьте электронное письмо на адрес {{emailID}} с вашего зарегистрированного адреса электронной почты", - "CONTACT_SUPPORT": "Связаться с поддержкой", - "REQUEST_FEATURE": "Запросить функцию", - "SUPPORT": "Поддержка", - "CONFIRM": "Подтвердить", - "CANCEL": "Отменить", - "LOGOUT": "Выйти", - "DELETE_ACCOUNT": "Удалить аккаунт", - "DELETE_ACCOUNT_MESSAGE": "

Пожалуйста, отправьте письмо по адресу {{emailID}} с вашего зарегистрированного адреса электронной почты.

Ваш запрос будет обработан в течение 72 часов

", - "LOGOUT_MESSAGE": "Вы уверены, что хотите выйти?", - "CHANGE_EMAIL": "Изменить адрес электронной почты", - "OK": "ОК", - "SUCCESS": "Успешно", - "ERROR": "Ошибка", - "MESSAGE": "Сообщение", - "INSTALL_MOBILE_APP": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "Загрузить приложение для компьютера", - "EXPORT": "Экспортировать данные", - "SUBSCRIPTION": "Подписка", - "SUBSCRIBE": "Подписаться", - "MANAGEMENT_PORTAL": "Управлять платёжной информацией", - "MANAGE_FAMILY_PORTAL": "Управление семьёй", - "LEAVE_FAMILY_PLAN": "Покинуть семейный план", - "LEAVE": "Выйти", - "LEAVE_FAMILY_CONFIRM": "Вы уверены, что хотите покинуть семейный план?", - "CHOOSE_PLAN": "Выбери свой план", - "MANAGE_PLAN": "Управление подпиской", - "ACTIVE": "Активный", - "OFFLINE_MSG": "Вы не в сети, кэшированные воспоминания отображаются", - "FREE_SUBSCRIPTION_INFO": "Вы используете бесплатный тарифный план, истекающий {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Вы используете семейный план, управляемый", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Продление {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "Обновить платёжную информацию", - "MONTHLY": "Ежемесячно", - "YEARLY": "Ежегодно", - "UPDATE_SUBSCRIPTION_MESSAGE": "Хотите сменить текущий план?", - "UPDATE_SUBSCRIPTION": "Изменить план", - "CANCEL_SUBSCRIPTION": "Отменить подписку", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Все ваши данные будут удалены с наших серверов в конце этого расчетного периода.

Вы уверены, что хотите отменить свою подписку?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Вы уверены, что хотите отменить свою подписку?

", - "SUBSCRIPTION_CANCEL_FAILED": "Не удалось отменить подписку", - "SUBSCRIPTION_CANCEL_SUCCESS": "Подписка успешно отменена", - "REACTIVATE_SUBSCRIPTION": "Возобновить подписку", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "После повторной активации вам будет выставлен счет в {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Подписка успешно активирована ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Не удалось повторно активировать продление подписки", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Спасибо", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Отменить мобильную подписку", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Пожалуйста, отмените свою подписку в мобильном приложении, чтобы активировать подписку здесь", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Пожалуйста, свяжитесь с {{emailID}} для управления подпиской", - "RENAME": "Переименовать", - "RENAME_FILE": "Переименовать файл", - "RENAME_COLLECTION": "Переименовать альбом", - "DELETE_COLLECTION_TITLE": "Удалить альбом?", - "DELETE_COLLECTION": "Удалить альбом", - "DELETE_COLLECTION_MESSAGE": "Также удалить фотографии (и видео), которые есть в этом альбоме из всех других альбомов, где они есть?", - "DELETE_PHOTOS": "Удалить фото", - "KEEP_PHOTOS": "Оставить фото", - "SHARE": "Поделиться", - "SHARE_COLLECTION": "Поделиться альбомом", - "SHAREES": "Поделиться с", - "SHARE_WITH_SELF": "Ой, Вы не можете поделиться с самим собой", - "ALREADY_SHARED": "Упс, Вы уже делились этим с {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Делиться альбомом запрещено", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Совместное использование отключено для бесплатных аккаунтов", - "DOWNLOAD_COLLECTION": "Загрузить альбом", - "DOWNLOAD_COLLECTION_MESSAGE": "

Вы уверены, что хотите загрузить альбом полностью?

Все файлы будут последовательно помещены в очередь на загрузку

", - "CREATE_ALBUM_FAILED": "Не удалось создать альбом, пожалуйста, попробуйте еще раз", - "SEARCH": "Поиск", - "SEARCH_RESULTS": "Результаты поиска", - "NO_RESULTS": "Ничего не найдено", - "SEARCH_HINT": "Поиск альбомов, дат, описаний, ...", - "SEARCH_TYPE": { - "COLLECTION": "Альбом", - "LOCATION": "Местоположение", - "CITY": "Местоположение", - "DATE": "Дата", - "FILE_NAME": "Имя файла", - "THING": "Содержимое", - "FILE_CAPTION": "Описание", - "FILE_TYPE": "Тип файла", - "CLIP": "" - }, - "photos_count_zero": "Воспоминания отсутствуют", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "Добавить в альбом", - "SELECTED": "выбрано", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Это видео нельзя воспроизвести в вашем браузере", - "PEOPLE": "Люди", - "INDEXING_SCHEDULED": "Индексация запланирована...", - "ANALYZING_PHOTOS": "Индексирование фотографий ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Индексирование людей на {{indexStatus.nSyncedFiles,number}} фотографиях...", - "INDEXING_DONE": "Проиндексировано {{indexStatus.nSyncedFiles,number}} фотографий", - "UNIDENTIFIED_FACES": "нераспознанные лица", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "Двухфакторная аутентификация", - "TWO_FACTOR_QR_INSTRUCTION": "Сканируйте QR-код ниже с вашим любимым приложением для проверки подлинности", - "ENTER_CODE_MANUALLY": "Введите код вручную", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Пожалуйста, введите этот код в вашем любимом приложении для аутентификации", - "SCAN_QR_CODE": "Сканировать QR-код вместо", - "ENABLE_TWO_FACTOR": "Включить двухфакторную аутентификацию", - "ENABLE": "Включить", - "LOST_DEVICE": "Потеряно двухфакторное устройство", - "INCORRECT_CODE": "Неверный код", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "Отключить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "Отключить", - "RECONFIGURE": "Перенастроить", - "UPDATE_TWO_FACTOR": "Обновить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "Обновить", - "DISABLE_TWO_FACTOR": "Отключить двухфакторную аутентификацию", - "DISABLE_TWO_FACTOR_MESSAGE": "Вы уверены, что хотите отключить двухфакторную аутентификацию", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "Экспортировать данные", - "SELECT_FOLDER": "Выбрать папку", - "DESTINATION": "Место назначения", - "START": "Начать", - "LAST_EXPORT_TIME": "Время последнего экспорта", - "EXPORT_AGAIN": "Синхронизировать заново", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Локальное хранилище недоступно", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "Отправить одноразовый код", - "EMAIl_ALREADY_OWNED": "Почта уже использована", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "Скрыть", - "UNHIDE": "Показать", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Сортировать по", - "NEWEST_FIRST": "Сначала новые", - "OLDEST_FIRST": "Сначала старые", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "Выбрать альбом", - "PIN_ALBUM": "Закрепить альбом", - "UNPIN_ALBUM": "Открепить альбом", - "DOWNLOAD_COMPLETE": "Загрузка завершена", - "DOWNLOADING_COLLECTION": "Загрузка {{name}}", - "DOWNLOAD_FAILED": "Загрузка не удалась", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} файлов", - "CHRISTMAS": "Рождество", - "CHRISTMAS_EVE": "Канун Рождества", - "NEW_YEAR": "Новый год", - "NEW_YEAR_EVE": "Канун Нового года", - "IMAGE": "Изображение", - "VIDEO": "Видео", - "LIVE_PHOTO": "Живое фото", - "CONVERT": "Преобразовать", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Вы уверены, что хотите закрыть редактор?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Загрузите отредактированное изображение или сохраните копию в ente, чтобы сохранить внесенные изменения.", - "BRIGHTNESS": "Яркость", - "CONTRAST": "Контраст", - "SATURATION": "Насыщенность", - "BLUR": "Размытие", - "INVERT_COLORS": "Инвертировать Цвета", - "ASPECT_RATIO": "Соотношение Сторон", - "SQUARE": "Квадрат", - "ROTATE_LEFT": "Повернуть влево", - "ROTATE_RIGHT": "Повернуть вправо", - "FLIP_VERTICALLY": "Отразить вертикально", - "FLIP_HORIZONTALLY": "Отразить горизонтально", - "DOWNLOAD_EDITED": "Скачать отредактированный", - "SAVE_A_COPY_TO_ENTE": "Сохранить копию в ente", - "RESTORE_ORIGINAL": "Восстановить оригинал", - "TRANSFORM": "Преобразовать", - "COLORS": "Цвета", - "FLIP": "Перевернуть", - "ROTATION": "", - "RESET": "Сбросить", - "PHOTO_EDITOR": "Редактор фото", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "Статус волшебного поиска", - "INDEXED_ITEMS": "Индексированные элементы", - "CAST_ALBUM_TO_TV": "Воспроизвести альбом на ТВ", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/sv-SE/translation.json b/web/apps/accounts/public/locales/sv-SE/translation.json deleted file mode 100644 index f88535795..000000000 --- a/web/apps/accounts/public/locales/sv-SE/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "Ange namn", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "Ange e-postadress", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "Lösenord", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "Lösenord", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "Logga in", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Välkommen till ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "Lösenord", - "CONFIRM_PASSPHRASE": "Bekräfta lösenord", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Lösenorden matchar inte", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "Filnamn", - "CLOSE": "Stäng", - "NO": "Nej", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "Radera", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "eller", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "Ändra lösenord", - "GO_BACK": "", - "RECOVERY_KEY": "Återställningsnyckel", - "SAVE_LATER": "", - "SAVE": "Spara nyckel", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "Glömt lösenord", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "Ingen återställningsnyckel?", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "Bekräfta", - "CANCEL": "Avbryt", - "LOGOUT": "Logga ut", - "DELETE_ACCOUNT": "Radera konto", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "Meddelande", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "Prenumerera", - "MANAGEMENT_PORTAL": "Hantera betalningsmetod", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "Hantera din prenumeration", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "Sök", - "SEARCH_RESULTS": "Sökresultat", - "NO_RESULTS": "Inga resultat hittades", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "Datum", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "Beskrivning", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Inga deltagare", - "participants_one": "1 deltagare", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "Deltagare", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "Fil", - "UPLOAD_DIRS": "Mapp", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "Filer", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 album", - "albums_other": "{{count, number}} album", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "Lägg till mapp", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "mån", - "YEAR": "år", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "GB", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "Namn...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "Språk", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "Kopiera länk", - "DONE": "Klar", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Sortera efter", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "Bild", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "Färger", - "FLIP": "", - "ROTATION": "", - "RESET": "Återställ", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/public/locales/zh-CN/translation.json b/web/apps/accounts/public/locales/zh-CN/translation.json deleted file mode 100644 index 0a72e1c70..000000000 --- a/web/apps/accounts/public/locales/zh-CN/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
私人备份
为您的回忆
", - "HERO_SLIDE_1": "默认端到端加密", - "HERO_SLIDE_2_TITLE": "
安全地存放
在一个掩护所中
", - "HERO_SLIDE_2": "经久耐用", - "HERO_SLIDE_3_TITLE": "
可用于
各处
", - "HERO_SLIDE_3": "安卓, iOS, 网页端, 桌面端", - "LOGIN": "登录", - "SIGN_UP": "注册", - "NEW_USER": "刚来到 ente", - "EXISTING_USER": "现有用户", - "ENTER_NAME": "输入名字", - "PUBLIC_UPLOADER_NAME_MESSAGE": "请添加一个名字,以便您的朋友知晓该感谢谁拍摄了这些精美的照片!", - "ENTER_EMAIL": "请输入电子邮件地址", - "EMAIL_ERROR": "请输入有效的电子邮件", - "REQUIRED": "必需的", - "EMAIL_SENT": "验证码已发送至
{{email}}", - "CHECK_INBOX": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证", - "ENTER_OTT": "验证码", - "RESEND_MAIL": "重新发送验证码", - "VERIFY": "验证", - "UNKNOWN_ERROR": "出了点问题,请重试", - "INVALID_CODE": "验证码无效", - "EXPIRED_CODE": "您的验证码已过期", - "SENDING": "发送中……", - "SENT": "已发送!", - "PASSWORD": "密码", - "LINK_PASSWORD": "输入密码来解锁相册", - "RETURN_PASSPHRASE_HINT": "密码", - "SET_PASSPHRASE": "设置密码", - "VERIFY_PASSPHRASE": "登录", - "INCORRECT_PASSPHRASE": "密码错误", - "ENTER_ENC_PASSPHRASE": "请输入我们可以用来加密您数据的密码", - "PASSPHRASE_DISCLAIMER": "我们不会存储您的密码,因此如果您忘记密码, 我们将无法帮助您在没有恢复密钥的情况下恢复您的数据。", - "WELCOME_TO_ENTE_HEADING": "欢迎来到 ", - "WELCOME_TO_ENTE_SUBHEADING": "端到端加密的照片存储和共享", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "可以让您存放照片的最好的地方", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "正在生成加密密钥...", - "PASSPHRASE_HINT": "密码", - "CONFIRM_PASSPHRASE": "请确认密码", - "REFERRAL_CODE_HINT": "您是如何知道Ente的? (可选的)", - "REFERRAL_INFO": "我们不跟踪应用程序安装情况,如果您告诉我们您是在哪里找到我们的,将会有所帮助!", - "PASSPHRASE_MATCH_ERROR": "两次输入的密码不一致", - "CREATE_COLLECTION": "新建相册", - "ENTER_ALBUM_NAME": "相册名称", - "CLOSE_OPTION": "关闭 (或按Esc键)", - "ENTER_FILE_NAME": "文件名", - "CLOSE": "关闭", - "NO": "否", - "NOTHING_HERE": "这里空空如也 👀", - "UPLOAD": "上传", - "IMPORT": "导入", - "ADD_PHOTOS": "添加照片", - "ADD_MORE_PHOTOS": "添加更多的照片", - "add_photos_one": "添加1个项目", - "add_photos_other": "添加 {{count, number}} 个项目", - "SELECT_PHOTOS": "选择图片", - "FILE_UPLOAD": "上传文件", - "UPLOAD_STAGE_MESSAGE": { - "0": "正在准备上传", - "1": "正在读取 Google 元数据文件", - "2": "文件元数据提取状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", - "3": "文件备份状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", - "4": "正在取消剩余的上传内容", - "5": "备份完成" - }, - "FILE_NOT_UPLOADED_LIST": "以下文件未上传", - "SUBSCRIPTION_EXPIRED": "您的订阅已过期", - "SUBSCRIPTION_EXPIRED_MESSAGE": "您的订阅已过期,请 续期", - "STORAGE_QUOTA_EXCEEDED": "已超出存储限制", - "INITIAL_LOAD_DELAY_WARNING": "第一次加载可能需要一些时间", - "USER_DOES_NOT_EXIST": "抱歉,找不到该电子邮件的用户", - "NO_ACCOUNT": "没有账号", - "ACCOUNT_EXISTS": "已有账户", - "CREATE": "创建", - "DOWNLOAD": "下载", - "DOWNLOAD_OPTION": "下载 (D)", - "DOWNLOAD_FAVORITES": "下载收藏", - "DOWNLOAD_UNCATEGORIZED": "下载未分类的", - "DOWNLOAD_HIDDEN_ITEMS": "下载隐藏项目", - "COPY_OPTION": "复制为 PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "切换至全屏 (F)", - "ZOOM_IN_OUT": "放大/缩小", - "PREVIOUS": "上一个 (←)", - "NEXT": "下一个 (→)", - "TITLE_PHOTOS": "Ente 照片", - "TITLE_ALBUMS": "Ente 照片", - "TITLE_AUTH": "Ente 验证器", - "UPLOAD_FIRST_PHOTO": "上传您的第一张照片", - "IMPORT_YOUR_FOLDERS": "导入您的文件夹", - "UPLOAD_DROPZONE_MESSAGE": "拖放以备份您的文件", - "WATCH_FOLDER_DROPZONE_MESSAGE": "拖放以添加观看的文件夹", - "TRASH_FILES_TITLE": "要删除文件吗?", - "TRASH_FILE_TITLE": "要删除文件吗?", - "DELETE_FILES_TITLE": "要立即删除吗?", - "DELETE_FILES_MESSAGE": "所选文件将从您的账户中永久删除。", - "DELETE": "删除", - "DELETE_OPTION": "删除(DEL)", - "FAVORITE_OPTION": "收藏 (L)", - "UNFAVORITE_OPTION": "取消收藏 (L)", - "MULTI_FOLDER_UPLOAD": "检测到多个文件夹", - "UPLOAD_STRATEGY_CHOICE": "你想要上传他们到", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "单个相册", - "OR": "或者", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "独立相册", - "SESSION_EXPIRED_MESSAGE": "您的会话已过期,请重新登录以继续", - "SESSION_EXPIRED": "会话已过期", - "PASSWORD_GENERATION_FAILED": "您的浏览器无法生成一个符合ente加密标准的强密钥,请尝试使用移动应用程序或其他浏览器", - "CHANGE_PASSWORD": "修改密码", - "GO_BACK": "返回", - "RECOVERY_KEY": "恢复密钥", - "SAVE_LATER": "稍后再做", - "SAVE": "保存密钥", - "RECOVERY_KEY_DESCRIPTION": "如果您忘记了密码,恢复数据的唯一方法就是使用此密钥。", - "RECOVER_KEY_GENERATION_FAILED": "无法生成恢复代码,请重试", - "KEY_NOT_STORED_DISCLAIMER": "我们不存储此密钥,因此请将其保存在安全的地方", - "FORGOT_PASSWORD": "忘记密码", - "RECOVER_ACCOUNT": "恢复账户", - "RECOVERY_KEY_HINT": "恢复密钥", - "RECOVER": "恢复", - "NO_RECOVERY_KEY": "没有恢复密钥?", - "INCORRECT_RECOVERY_KEY": "不正确的恢复密钥", - "SORRY": "抱歉", - "NO_RECOVERY_KEY_MESSAGE": "由于我们端到端加密协议的性质,如果没有您的密码或恢复密钥,您的数据将无法解密", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "请用您注册ente账户的电子邮箱发一封邮件给 {{emailID}}", - "CONTACT_SUPPORT": "联系支持", - "REQUEST_FEATURE": "功能建议", - "SUPPORT": "支持", - "CONFIRM": "确认", - "CANCEL": "取消", - "LOGOUT": "退出登录", - "DELETE_ACCOUNT": "删除账户", - "DELETE_ACCOUNT_MESSAGE": "

请从您注册的电子邮件地址发送一封电子邮件到 {{emailID}}

。您的请求将在72小时内处理。

", - "LOGOUT_MESSAGE": "你确定要退出登录吗?", - "CHANGE_EMAIL": "更换邮箱", - "OK": "确定", - "SUCCESS": "成功", - "ERROR": "错误", - "MESSAGE": "消息", - "INSTALL_MOBILE_APP": "安装我们的 AndroidiOS 应用程序来自动备份您的所有照片", - "DOWNLOAD_APP_MESSAGE": "抱歉,目前只有我们的桌面应用程序支持此操作", - "DOWNLOAD_APP": "下载桌面应用程序", - "EXPORT": "导出数据", - "SUBSCRIPTION": "订阅", - "SUBSCRIBE": "订阅", - "MANAGEMENT_PORTAL": "管理付款方式", - "MANAGE_FAMILY_PORTAL": "管理家庭", - "LEAVE_FAMILY_PLAN": "离开家庭计划", - "LEAVE": "离开", - "LEAVE_FAMILY_CONFIRM": "您确定要离开家庭计划吗?", - "CHOOSE_PLAN": "选择您的计划", - "MANAGE_PLAN": "管理您的订阅", - "ACTIVE": "已激活", - "OFFLINE_MSG": "您处于离线状态,正在显示已缓存的回忆", - "FREE_SUBSCRIPTION_INFO": "您使用的是将于{{date, dateTime}} 过期的免费计划", - "FAMILY_SUBSCRIPTION_INFO": "您正在使用由 管理的家庭计划", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "于 {{date, dateTime}} 续费", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "结束于 {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "您的订阅将于 {{date, dateTime}} 取消", - "ADD_ON_AVAILABLE_TILL": "您的 {{storage, string}} 插件有效期至 {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "您已超过您的存储配额,请 升级", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

我们已经收到您的付款

您的订阅有效期至 {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "您的购买已取消,如果您想订阅,请重试", - "SUBSCRIPTION_PURCHASE_FAILED": "订阅购买失败,请重试", - "SUBSCRIPTION_UPDATE_FAILED": "订阅更新失败,请重试", - "UPDATE_PAYMENT_METHOD_MESSAGE": "很抱歉,我们尝试从您的卡中扣款时支付失败,请更新您的付款方式并重试", - "STRIPE_AUTHENTICATION_FAILED": "我们无法验证您的付款方式。请选择不同的付款方式并重试", - "UPDATE_PAYMENT_METHOD": "更新付款方式", - "MONTHLY": "每月", - "YEARLY": "每年", - "UPDATE_SUBSCRIPTION_MESSAGE": "您确定要更改您的计划吗?", - "UPDATE_SUBSCRIPTION": "更改计划", - "CANCEL_SUBSCRIPTION": "取消订阅", - "CANCEL_SUBSCRIPTION_MESSAGE": "

您的所有数据将在此计费期结束时从我们的服务器中删除。

您确定要取消您的订阅吗?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

您确定要取消订阅吗?

", - "SUBSCRIPTION_CANCEL_FAILED": "取消订阅失败", - "SUBSCRIPTION_CANCEL_SUCCESS": "订阅成功取消", - "REACTIVATE_SUBSCRIPTION": "重新激活订阅", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "重新激活后,您将在 {{date, dateTime}} 前支付费用", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "订阅已成功激活 ", - "SUBSCRIPTION_ACTIVATE_FAILED": "无法重新激活订阅续费", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "非常感谢您", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "取消手机订阅", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "请从手机应用取消您的订阅以激活这里的订阅", - "MAIL_TO_MANAGE_SUBSCRIPTION": "请联系我们 {{emailID}} 来管理您的订阅", - "RENAME": "重命名", - "RENAME_FILE": "重命名文件", - "RENAME_COLLECTION": "重命名相册", - "DELETE_COLLECTION_TITLE": "要删除相册吗?", - "DELETE_COLLECTION": "删除相册", - "DELETE_COLLECTION_MESSAGE": "也删除此相册中存在的照片(和视频),从 他们所加入的所有 个其他相册?", - "DELETE_PHOTOS": "删除照片", - "KEEP_PHOTOS": "保留照片", - "SHARE": "分享", - "SHARE_COLLECTION": "分享相册", - "SHAREES": "已分享给", - "SHARE_WITH_SELF": "哎呀,您不能与自己分享", - "ALREADY_SHARED": "哎呀,您已经和 {{email}} 分享了", - "SHARING_BAD_REQUEST_ERROR": "不允许分享相册", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "免费账户禁用共享", - "DOWNLOAD_COLLECTION": "下载相册", - "DOWNLOAD_COLLECTION_MESSAGE": "

您确定要下载完整相册吗?

所有文件都将按顺序排队进行下载

", - "CREATE_ALBUM_FAILED": "相册创建失败,请重试", - "SEARCH": "搜索", - "SEARCH_RESULTS": "搜索结果", - "NO_RESULTS": "未找到任何结果", - "SEARCH_HINT": "搜索相册、日期...", - "SEARCH_TYPE": { - "COLLECTION": "相册", - "LOCATION": "地理位置", - "CITY": "位置", - "DATE": "日期", - "FILE_NAME": "文件名", - "THING": "内容", - "FILE_CAPTION": "说明", - "FILE_TYPE": "文件类型", - "CLIP": "魔法" - }, - "photos_count_zero": "没有回忆", - "photos_count_one": "1个回忆", - "photos_count_other": "{{count, number}} 个回忆", - "TERMS_AND_CONDITIONS": "我同意 条款隐私政策", - "ADD_TO_COLLECTION": "添加到相册", - "SELECTED": "已选", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "此视频无法在您的浏览器中播放", - "PEOPLE": "人物", - "INDEXING_SCHEDULED": "索引已安排...", - "ANALYZING_PHOTOS": "分析 {{indexStatus.nTotalFiles}} 的新照片{{indexStatus.nSyncedFiles}} 已完成)...", - "INDEXING_PEOPLE": "正在为 {{indexStatus.nSyncedFiles}} 张照片中的人物建立索引...", - "INDEXING_DONE": "已索引 {{indexStatus.nSyncedFiles}} 张照片", - "UNIDENTIFIED_FACES": "身份不明的面孔", - "OBJECTS": "对象", - "TEXT": "文本", - "INFO": "图片信息 ", - "INFO_OPTION": "图片信息 (I)", - "FILE_NAME": "文件名", - "CAPTION_PLACEHOLDER": "添加说明", - "LOCATION": "地理位置", - "SHOW_ON_MAP": "在 OpenStreetMap 上查看", - "MAP": "地图", - "MAP_SETTINGS": "地图设置", - "ENABLE_MAPS": "要启用地图吗?", - "ENABLE_MAP": "启用地图", - "DISABLE_MAPS": "要禁用地图吗?", - "ENABLE_MAP_DESCRIPTION": "

这将在世界地图上显示您的照片。

该地图由 OpenStreetMap 托管,并且您照片的确切位置永远不会共享。

您可以随时从“设置”中禁用此功能。

", - "DISABLE_MAP_DESCRIPTION": "

这将禁止在世界地图上显示您的照片。

您可以随时从“设置”中启用此功能。

", - "DISABLE_MAP": "禁用地图", - "DETAILS": "详情", - "VIEW_EXIF": "查看所有 EXIF 数据", - "NO_EXIF": "无 EXIF 数据", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "双因素", - "TWO_FACTOR_AUTHENTICATION": "双因素认证", - "TWO_FACTOR_QR_INSTRUCTION": "使用您最喜欢的身份验证器应用程序(2FA)扫描下面的二维码", - "ENTER_CODE_MANUALLY": "请手动输入代码", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "请在您最喜欢的验证器应用中输入此代码", - "SCAN_QR_CODE": "改为扫描二维码", - "ENABLE_TWO_FACTOR": "启用双因素认证", - "ENABLE": "启用", - "LOST_DEVICE": "丢失了双因素认证设备", - "INCORRECT_CODE": "代码错误", - "TWO_FACTOR_INFO": "登录您的账户不仅需要您的电子邮件和密码,还需要额外的安全层", - "DISABLE_TWO_FACTOR_LABEL": "禁用双因素认证", - "UPDATE_TWO_FACTOR_LABEL": "更新您的身份验证器设备", - "DISABLE": "禁用", - "RECONFIGURE": "重新配置", - "UPDATE_TWO_FACTOR": "更新双因素认证", - "UPDATE_TWO_FACTOR_MESSAGE": "向前继续将使之前配置的任何身份验证器无效", - "UPDATE": "更新", - "DISABLE_TWO_FACTOR": "禁用双因素认证", - "DISABLE_TWO_FACTOR_MESSAGE": "您确定要禁用您的双因素认证吗?", - "TWO_FACTOR_DISABLE_FAILED": "禁用双因素认证失败,请再试一次", - "EXPORT_DATA": "导出数据", - "SELECT_FOLDER": "选择文件夹", - "DESTINATION": "目标位置", - "START": "开始", - "LAST_EXPORT_TIME": "最后一次导出时间", - "EXPORT_AGAIN": "重新同步", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "无法访问本地存储", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "您的浏览器或插件阻止 ente 将数据保存到本地存储。 请在切换浏览模式后再尝试加载此页面。", - "SEND_OTT": "发送 OTP", - "EMAIl_ALREADY_OWNED": "电子邮箱已被注册", - "ETAGS_BLOCKED": "

由于您的浏览器配置,我们无法上传以下文件。

请禁用任何可能阻止ente 使用 eTags 上传大文件的附加组件, 或者使用我们的 桌面应用程序 获取更可靠的导入体验。

", - "SKIPPED_VIDEOS_INFO": "

目前,我们不支持在公共链接内添加视频。

若要分享视频,请 注册 并通过电子邮件与预定收件人分享。

", - "LIVE_PHOTOS_DETECTED": "Live Photos 中的照片和视频文件已合并为一个文件", - "RETRY_FAILED": "重试上传失败的文件", - "FAILED_UPLOADS": "上传失败 ", - "SKIPPED_FILES": "已忽略的上传内容", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "缩略图生成失败", - "UNSUPPORTED_FILES": "不支持的文件", - "SUCCESSFUL_UPLOADS": "上传成功", - "SKIPPED_INFO": "跳过这些,因为在同一相册中有具有匹配名称的文件", - "UNSUPPORTED_INFO": "ente 尚不支持这些文件格式", - "BLOCKED_UPLOADS": "已阻止上传", - "SKIPPED_VIDEOS": "已跳过的视频", - "INPROGRESS_METADATA_EXTRACTION": "进行中", - "INPROGRESS_UPLOADS": "上传进行中", - "TOO_LARGE_UPLOADS": "大文件", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "存储空间不足", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "这些文件没有上传,因为它们超过了您的存储计划的最大大小限制", - "TOO_LARGE_INFO": "这些文件没有上传,因为它们超过了我们的最大文件大小限制", - "THUMBNAIL_GENERATION_FAILED_INFO": "这些文件已上传,但遗憾的是,我们无法为它们生成缩略图。", - "UPLOAD_TO_COLLECTION": "上传至相册", - "UNCATEGORIZED": "未分类的", - "ARCHIVE": "存档", - "FAVORITES": "收藏", - "ARCHIVE_COLLECTION": "存档相册", - "ARCHIVE_SECTION_NAME": "存档", - "ALL_SECTION_NAME": "全部", - "MOVE_TO_COLLECTION": "移动到相册", - "UNARCHIVE": "取消存档", - "UNARCHIVE_COLLECTION": "取消存档相册", - "HIDE_COLLECTION": "隐藏相册", - "UNHIDE_COLLECTION": "取消隐藏相册", - "MOVE": "移动", - "ADD": "添加", - "REMOVE": "移除", - "YES_REMOVE": "是,移除", - "REMOVE_FROM_COLLECTION": "从相册中移除", - "TRASH": "回收站", - "MOVE_TO_TRASH": "移动到回收站", - "TRASH_FILES_MESSAGE": "选中的文件将从所有相册中删除并移动到回收站。", - "TRASH_FILE_MESSAGE": "该文件将从所有相册中删除并移动到回收站。", - "DELETE_PERMANENTLY": "永久删除", - "RESTORE": "恢复", - "RESTORE_TO_COLLECTION": "恢复到相册", - "EMPTY_TRASH": "清空回收站", - "EMPTY_TRASH_TITLE": "要清空回收站吗?", - "EMPTY_TRASH_MESSAGE": "这些文件将从您的 ente 账户中永久删除。", - "LEAVE_SHARED_ALBUM": "是,离开", - "LEAVE_ALBUM": "离开相册", - "LEAVE_SHARED_ALBUM_TITLE": "要离开共享相册吗?", - "LEAVE_SHARED_ALBUM_MESSAGE": "您将离开相册,它将不再对您可见。", - "NOT_FILE_OWNER": "您不能删除共享相册中的文件", - "CONFIRM_SELF_REMOVE_MESSAGE": "所选项目将从该相册中删除。 仅在此相册中的项目将移至未分类。", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "您要删除的某些项目是由其他人添加的,您将无法访问它们。", - "SORT_BY_CREATION_TIME_ASCENDING": "最早的", - "SORT_BY_UPDATION_TIME_DESCENDING": "最后更新", - "SORT_BY_NAME": "名称", - "COMPRESS_THUMBNAILS": "压缩缩略图", - "THUMBNAIL_REPLACED": "缩略图已压缩", - "FIX_THUMBNAIL": "压缩", - "FIX_THUMBNAIL_LATER": "稍后压缩", - "REPLACE_THUMBNAIL_NOT_STARTED": "您的一些视频缩略图可以被压缩以节省空间,您想要ente 压缩它们吗?", - "REPLACE_THUMBNAIL_COMPLETED": "已成功压缩所有缩略图", - "REPLACE_THUMBNAIL_NOOP": "您没有可以进一步压缩的缩略图", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "无法压缩您的一些缩略图,请重试", - "FIX_CREATION_TIME": "固定时间", - "FIX_CREATION_TIME_IN_PROGRESS": "正在固定时间", - "CREATION_TIME_UPDATED": "文件时间已更新", - "UPDATE_CREATION_TIME_NOT_STARTED": "选择您想要使用的选项", - "UPDATE_CREATION_TIME_COMPLETED": "已成功更新所有文件", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "部分文件的文件时间更新失败,请重试", - "CAPTION_CHARACTER_LIMIT": "5000个字符上限", - "DATE_TIME_ORIGINAL": "EXIF:日期 时间 原始文件", - "DATE_TIME_DIGITIZED": "EXIF:日期 时间 数字化", - "METADATA_DATE": "EXIF:元数据日期", - "CUSTOM_TIME": "自定义时间", - "REOPEN_PLAN_SELECTOR_MODAL": "重新启动计划", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "未能打开计划", - "INSTALL": "安装", - "SHARING_DETAILS": "共享的详细信息", - "MODIFY_SHARING": "更改共享", - "ADD_COLLABORATORS": "添加协作者", - "ADD_NEW_EMAIL": "添加新的电子邮件", - "shared_with_people_zero": "与特定人员分享", - "shared_with_people_one": "已与1个人共享", - "shared_with_people_other": "已与 {count, number} 个人共享", - "participants_zero": "暂无参与者", - "participants_one": "1 名参与者", - "participants_other": "{{count, number}} 名参与者", - "ADD_VIEWERS": "添加查看者", - "PARTICIPANTS": "参与者", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} 将无法向相册添加更多照片

他们仍然可以删除他们添加的照片

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} 将能够将照片添加到相册", - "CONVERT_TO_VIEWER": "是的,转换为查看者", - "CONVERT_TO_COLLABORATOR": "是,转换为协作者", - "CHANGE_PERMISSION": "要修改权限吗?", - "REMOVE_PARTICIPANT": "要移除吗?", - "CONFIRM_REMOVE": "是,移除", - "MANAGE": "管理", - "ADDED_AS": "已添加为", - "COLLABORATOR_RIGHTS": "协作者可以将照片和视频添加到共享相册中", - "REMOVE_PARTICIPANT_HEAD": "移除参与者", - "OWNER": "所有者", - "COLLABORATORS": "协作者", - "ADD_MORE": "添加更多", - "VIEWERS": "查看者", - "OR_ADD_EXISTING": "或选择一个现有的", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} 将从相册中删除

他们添加的所有照片也将从相册中删除

", - "NOT_FOUND": "404 - 未找到", - "LINK_EXPIRED": "链接已过期", - "LINK_EXPIRED_MESSAGE": "此链接已过期或已被禁用!", - "MANAGE_LINK": "管理链接", - "LINK_TOO_MANY_REQUESTS": "这个相册太受欢迎,我们无法处理!", - "FILE_DOWNLOAD": "允许下载", - "LINK_PASSWORD_LOCK": "密码锁", - "PUBLIC_COLLECT": "允许添加照片", - "LINK_DEVICE_LIMIT": "设备限制", - "NO_DEVICE_LIMIT": "无", - "LINK_EXPIRY": "链接过期", - "NEVER": "永不", - "DISABLE_FILE_DOWNLOAD": "禁止下载", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

您确定要禁用文件下载按钮吗?

观看者仍然可以使用外部工具进行屏幕截图或保存您的照片副本。

", - "MALICIOUS_CONTENT": "哈哈哈急急急", - "COPYRIGHT": "不不不急急急就是", - "SHARED_USING": "分享方式 ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "使用代码 {{referralCode}} 获得 10 GB 免费空间", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "禁用密码锁", - "DISABLE_PASSWORD_MESSAGE": "您确定要禁用密码锁吗?", - "PASSWORD_LOCK": "密码锁", - "LOCK": "锁定", - "DOWNLOAD_UPLOAD_LOGS": "调试日志", - "UPLOAD_FILES": "文件", - "UPLOAD_DIRS": "文件夹", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "删除重复文件", - "AUTHENTICATOR_SECTION": "身份验证器", - "NO_DUPLICATES_FOUND": "您没有可以清除的重复文件", - "CLUB_BY_CAPTURE_TIME": "按抓取时间断开", - "FILES": "文件", - "EACH": "每个", - "DEDUPLICATE_BASED_ON_SIZE": "以下文件根据大小进行了合并,请检查并删除您认为重复的项目", - "STOP_ALL_UPLOADS_MESSAGE": "您确定要停止所有正在进行的上传吗?", - "STOP_UPLOADS_HEADER": "要停止上传吗?", - "YES_STOP_UPLOADS": "是的,停止上传", - "STOP_DOWNLOADS_HEADER": "要停止下载吗?", - "YES_STOP_DOWNLOADS": "是,停止下载", - "STOP_ALL_DOWNLOADS_MESSAGE": "您确定要停止所有正在进行的下载?", - "albums_one": "1个相册", - "albums_other": "{{count, number}} 个相册", - "ALL_ALBUMS": "所有相册", - "ALBUMS": "相册", - "ALL_HIDDEN_ALBUMS": "所有隐藏的相册", - "HIDDEN_ALBUMS": "隐藏的相册", - "HIDDEN_ITEMS": "隐藏的项目", - "HIDDEN_ITEMS_SECTION_NAME": "隐藏的项目", - "ENTER_TWO_FACTOR_OTP": "请输入您从身份验证应用上获得的6位数代码", - "CREATE_ACCOUNT": "创建账户", - "COPIED": "已复制", - "CANVAS_BLOCKED_TITLE": "无法生成缩略图", - "CANVAS_BLOCKED_MESSAGE": "

看起来您的浏览器已禁用了需要为您的照片生成缩略图的canvas访问权限

请允许访问您浏览器的canvas, 或使用我们的桌面应用程序

", - "WATCH_FOLDERS": "观看文件夹", - "UPGRADE_NOW": "立即升级", - "RENEW_NOW": "立即续费", - "STORAGE": "存储空间", - "USED": "已使用", - "YOU": "您", - "FAMILY": "家庭", - "FREE": "空闲", - "OF": "/", - "WATCHED_FOLDERS": "观看文件夹", - "NO_FOLDERS_ADDED": "尚未添加任何文件夹!", - "FOLDERS_AUTOMATICALLY_MONITORED": "您在此处添加的文件夹将自动监控", - "UPLOAD_NEW_FILES_TO_ENTE": "上传新文件至 ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "从ente 移除已删除的文件", - "ADD_FOLDER": "添加文件夹", - "STOP_WATCHING": "停止监控", - "STOP_WATCHING_FOLDER": "要停止监控文件夹?", - "STOP_WATCHING_DIALOG_MESSAGE": "您现有的文件不会被删除,但 ente 将停止自动更新链接的 ente 相册在此文件夹中的更改。", - "YES_STOP": "是的,停止", - "MONTH_SHORT": "月", - "YEAR": "年", - "FAMILY_PLAN": "家庭计划", - "DOWNLOAD_LOGS": "下载日志", - "DOWNLOAD_LOGS_MESSAGE": "

这将下载调试日志,您可以发送电子邮件给我们来帮助调试您的问题。

请注意文件名将被包含,以帮助跟踪特定文件中的问题。

", - "CHANGE_FOLDER": "更改文件夹", - "TWO_MONTHS_FREE": "在年度计划上免费获得 2 个月", - "GB": "GB", - "POPULAR": "流行的", - "FREE_PLAN_OPTION_LABEL": "继续免费试用", - "FREE_PLAN_DESCRIPTION": "1 GB 1年", - "CURRENT_USAGE": "当前使用量是 {{usage}}", - "WEAK_DEVICE": "您使用的网络浏览器功能不够强大,无法加密您的照片。 请尝试在电脑上登录ente,或下载ente移动/桌面应用程序。", - "DRAG_AND_DROP_HINT": "或者拖动并拖动到 ente 窗口", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "您上传的数据将被安排删除,您的账户将被永久删除。

此操作不可逆。", - "AUTHENTICATE": "身份认证", - "UPLOADED_TO_SINGLE_COLLECTION": "已上传到单个收藏", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "已上传到单独收藏", - "NEVERMIND": "没关系", - "UPDATE_AVAILABLE": "有可用的更新", - "UPDATE_INSTALLABLE_MESSAGE": "新版本的 ente 已准备好安装。", - "INSTALL_NOW": "立即安装", - "INSTALL_ON_NEXT_LAUNCH": "在下次启动时安装", - "UPDATE_AVAILABLE_MESSAGE": "新版本的 ente 已发布,但无法自动下载和安装。", - "DOWNLOAD_AND_INSTALL": "下载并安装", - "IGNORE_THIS_VERSION": "忽略该版本", - "TODAY": "今天", - "YESTERDAY": "昨天", - "NAME_PLACEHOLDER": "名称...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "无法从文件/文件夹组合中创建相册", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

你已拖放了文件和文件夹的组合。

选择创建单独相册的选项时,请只提供文件或只提供文件夹

", - "CHOSE_THEME": "选择主题", - "ML_SEARCH": "ML 搜索 (测试版)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

这将启用设备上的机器学习和面部搜索,这将开始分析您上传的本地照片。

在登录或启用此功能后第一次运行时,它将下载本地设备上的所有图像来分析。 所以请只在您可以使用带宽和本地处理您的照片库中的所有图像时启用此功能。

如果这是您首次启用此功能,我们也会请求您处理面部数据的许可。

", - "ML_MORE_DETAILS": "更多详情", - "ENABLE_FACE_SEARCH": "启用面部搜索", - "ENABLE_FACE_SEARCH_TITLE": "要启用面部搜索吗?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

如果您启用面部搜索,ente 将从照片中提取脸部几何形状。 这将发生在您的设备上,任何生成的生物测定数据都将是端到端加密的。

请单击此处以在我们的隐私政策中了解有关此功能的更多详细信息

", - "DISABLE_BETA": "禁用beta", - "DISABLE_FACE_SEARCH": "禁用面部搜索", - "DISABLE_FACE_SEARCH_TITLE": "要禁用面部搜索吗?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente 将停止处理面部的几何形状, 并将禁用 ML 搜索 (测试版)

如果您愿意,您可以重新启用面部搜索,因此该操作是安全的。

", - "ADVANCED": "高级设置", - "FACE_SEARCH_CONFIRMATION": "我理解,并希望允许ente处理面部几何形状", - "LABS": "实验室", - "YOURS": "你的", - "PASSPHRASE_STRENGTH_WEAK": "密码强度:较弱", - "PASSPHRASE_STRENGTH_MODERATE": "密码强度:中度", - "PASSPHRASE_STRENGTH_STRONG": "密码强度:强", - "PREFERENCES": "首选项", - "LANGUAGE": "语言", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "无效的导出目录", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

您选择的导出目录不存在。

请选择一个有效的目录。

", - "SUBSCRIPTION_VERIFICATION_ERROR": "订阅验证失败", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "1小时后", - "DAY": "一天后", - "WEEK": "一周后", - "MONTH": "一个月后", - "YEAR": "一年后" - }, - "COPY_LINK": "复制链接", - "DONE": "已完成", - "LINK_SHARE_TITLE": "或共享一个链接", - "REMOVE_LINK": "移除链接", - "CREATE_PUBLIC_SHARING": "创建公开链接", - "PUBLIC_LINK_CREATED": "公开链接已创建", - "PUBLIC_LINK_ENABLED": "公开链接已启用", - "COLLECT_PHOTOS": "收集照片", - "PUBLIC_COLLECT_SUBTEXT": "允许具有链接的人也将照片添加到共享相册。", - "STOP_EXPORT": "停止", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} 个文件已导出", - "MIGRATING_EXPORT": "准备中...", - "RENAMING_COLLECTION_FOLDERS": "正在重命名相册文件夹...", - "TRASHING_DELETED_FILES": "正在回收删除的文件...", - "TRASHING_DELETED_COLLECTIONS": "正在回收已删除的相册...", - "EXPORT_NOTIFICATION": { - "START": "导出已开始", - "IN_PROGRESS": "导出已在进行中", - "FINISH": "导出完成", - "UP_TO_DATE": "没有新文件可导出" - }, - "CONTINUOUS_EXPORT": "持续同步", - "TOTAL_ITEMS": "项目总计", - "PENDING_ITEMS": "待处理的项目", - "EXPORT_STARTING": "导出开始...", - "DELETE_ACCOUNT_REASON_LABEL": "您删除账户的主要原因是什么?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "选择一个原因", - "DELETE_REASON": { - "MISSING_FEATURE": "找不到我想要的功能", - "BROKEN_BEHAVIOR": "该应用或某个功能不符合我认为应该做的行为", - "FOUND_ANOTHER_SERVICE": "我发现另一个产品更好用", - "NOT_LISTED": "我的原因未被列出" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "我们很抱歉看到您离开。请解释您为什么要离开来帮助我们改进。", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "反馈", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "是的,我想永久删除此账户及其相关数据", - "CONFIRM_DELETE_ACCOUNT": "确认删除账户", - "FEEDBACK_REQUIRED": "请帮助我们了解这个信息", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "其他服务做得更好?", - "RECOVER_TWO_FACTOR": "恢复双因素认证", - "at": "在", - "AUTH_NEXT": "下一个", - "AUTH_DOWNLOAD_MOBILE_APP": "下载我们的移动应用程序来管理您的密钥", - "HIDDEN": "已隐藏", - "HIDE": "隐藏", - "UNHIDE": "取消隐藏", - "UNHIDE_TO_COLLECTION": "取消隐藏到相册", - "SORT_BY": "排序方式", - "NEWEST_FIRST": "最新在前", - "OLDEST_FIRST": "最旧在前", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "无法预览此文件。点击这里下载原始文件。", - "SELECT_COLLECTION": "选择相册", - "PIN_ALBUM": "置顶相册", - "UNPIN_ALBUM": "取消置顶相册", - "DOWNLOAD_COMPLETE": "下载完成", - "DOWNLOADING_COLLECTION": "正在下载 {{name}}", - "DOWNLOAD_FAILED": "下载失败", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} 个文件", - "CHRISTMAS": "圣诞", - "CHRISTMAS_EVE": "平安夜", - "NEW_YEAR": "新年", - "NEW_YEAR_EVE": "除夕", - "IMAGE": "图像", - "VIDEO": "视频", - "LIVE_PHOTO": "实况照片", - "CONVERT": "转换", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "您确定要关闭编辑器吗?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "下载已编辑的图片或将副本保存到 ente 以保留您的更改。", - "BRIGHTNESS": "亮度", - "CONTRAST": "对比度", - "SATURATION": "饱和度", - "BLUR": "模糊", - "INVERT_COLORS": "反相颜色", - "ASPECT_RATIO": "长宽比", - "SQUARE": "面积", - "ROTATE_LEFT": "向左旋转", - "ROTATE_RIGHT": "向右旋转", - "FLIP_VERTICALLY": "垂直翻转", - "FLIP_HORIZONTALLY": "水平翻转", - "DOWNLOAD_EDITED": "下载已编辑图片", - "SAVE_A_COPY_TO_ENTE": "保存副本到 ente", - "RESTORE_ORIGINAL": "复原", - "TRANSFORM": "转换", - "COLORS": "颜色", - "FLIP": "上下翻转", - "ROTATION": "回转", - "RESET": "重设", - "PHOTO_EDITOR": "照片编辑器", - "FASTER_UPLOAD": "更快上传", - "FASTER_UPLOAD_DESCRIPTION": "通过附近的服务器路由上传", - "MAGIC_SEARCH_STATUS": "魔法搜索状态", - "INDEXED_ITEMS": "索引项目", - "CAST_ALBUM_TO_TV": "在电视上播放相册", - "ENTER_CAST_PIN_CODE": "输入您在下面的电视上看到的代码来配对此设备。", - "PAIR_DEVICE_TO_TV": "配对设备", - "TV_NOT_FOUND": "未找到电视。您输入的 PIN 码正确吗?", - "AUTO_CAST_PAIR": "自动配对", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "自动配对需要连接到 Google 服务器,且仅适用于支持 Chromecast 的设备。Google 不会接收敏感数据,例如您的照片。", - "PAIR_WITH_PIN": "用 PIN 配对", - "CHOOSE_DEVICE_FROM_BROWSER": "从浏览器弹出窗口中选择兼容 Cast 的设备。", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "用 PIN 配对适用于任何大屏幕设备,您可以在这些设备上播放您的相册。", - "VISIT_CAST_ENTE_IO": "在您要配对的设备上访问 cast.ente.io 。", - "CAST_AUTO_PAIR_FAILED": "Chromecast 自动配对失败。请再试一次。", - "CACHE_DIRECTORY": "缓存文件夹", - "FREEHAND": "手画", - "APPLY_CROP": "应用裁剪", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "保存之前必须至少执行一项转换或颜色调整。", - "PASSKEYS": "通行密钥", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/accounts/src/pages/_app.tsx b/web/apps/accounts/src/pages/_app.tsx index 03d675a2f..40a4a1458 100644 --- a/web/apps/accounts/src/pages/_app.tsx +++ b/web/apps/accounts/src/pages/_app.tsx @@ -1,7 +1,7 @@ -import { setupI18n } from "@/ui/i18n"; -import { CacheProvider } from "@emotion/react"; +import { CustomHead } from "@/next/components/Head"; +import { setupI18n } from "@/next/i18n"; +import { logUnhandledErrorsAndRejections } from "@/next/log-web"; import { APPS, APP_TITLES } from "@ente/shared/apps/constants"; -import { EnteAppProps } from "@ente/shared/apps/types"; import { Overlay } from "@ente/shared/components/Container"; import DialogBoxV2 from "@ente/shared/components/DialogBoxV2"; import { @@ -15,10 +15,10 @@ import HTTPService from "@ente/shared/network/HTTPService"; import { LS_KEYS, getData } from "@ente/shared/storage/localStorage"; import { getTheme } from "@ente/shared/themes"; import { THEME_COLOR } from "@ente/shared/themes/constants"; -import createEmotionCache from "@ente/shared/themes/createEmotionCache"; import { CssBaseline, useMediaQuery } from "@mui/material"; import { ThemeProvider } from "@mui/material/styles"; -import Head from "next/head"; +import { t } from "i18next"; +import { AppProps } from "next/app"; import { useRouter } from "next/router"; import { createContext, useEffect, useState } from "react"; import "styles/global.css"; @@ -31,10 +31,7 @@ interface AppContextProps { export const AppContext = createContext({} as AppContextProps); -// Client-side cache, shared for the whole session of the user in the browser. -const clientSideEmotionCache = createEmotionCache(); - -export default function App(props: EnteAppProps) { +export default function App({ Component, pageProps }: AppProps) { const [isI18nReady, setIsI18nReady] = useState(false); const [showNavbar, setShowNavBar] = useState(false); @@ -54,16 +51,12 @@ export default function App(props: EnteAppProps) { const router = useRouter(); - const { - Component, - emotionCache = clientSideEmotionCache, - pageProps, - } = props; - const [themeColor] = useLocalState(LS_KEYS.THEME, THEME_COLOR.DARK); useEffect(() => { setupI18n().finally(() => setIsI18nReady(true)); + logUnhandledErrorsAndRejections(true); + return () => logUnhandledErrorsAndRejections(false); }, []); const setupPackageName = () => { @@ -85,16 +78,13 @@ export default function App(props: EnteAppProps) { const theme = getTheme(themeColor, APPS.PHOTOS); - // TODO: Localise APP_TITLES + const title = isI18nReady + ? t("TITLE", { context: APPS.ACCOUNTS }) + : APP_TITLES.get(APPS.ACCOUNTS); + return ( - - - {APP_TITLES.get(APPS.ACCOUNTS)} - - + <> + @@ -128,9 +118,9 @@ export default function App(props: EnteAppProps) { )} {showNavbar && } - + {isI18nReady && } - + ); } diff --git a/web/apps/accounts/src/pages/_document.tsx b/web/apps/accounts/src/pages/_document.tsx deleted file mode 100644 index 09d4d5782..000000000 --- a/web/apps/accounts/src/pages/_document.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import DocumentPage, { - EnteDocumentProps, -} from "@ente/shared/next/pages/_document"; - -export default function Document(props: EnteDocumentProps) { - return ; -} diff --git a/web/apps/accounts/src/pages/account-handoff.tsx b/web/apps/accounts/src/pages/account-handoff.tsx index fcb363960..45d8fa968 100644 --- a/web/apps/accounts/src/pages/account-handoff.tsx +++ b/web/apps/accounts/src/pages/account-handoff.tsx @@ -1,8 +1,8 @@ +import log from "@/next/log"; import { VerticallyCentered } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import { ACCOUNTS_PAGES } from "@ente/shared/constants/pages"; import HTTPService from "@ente/shared/network/HTTPService"; -import { logError } from "@ente/shared/sentry"; import { LS_KEYS, getData, setData } from "@ente/shared/storage/localStorage"; import { useRouter } from "next/router"; import { useEffect } from "react"; @@ -16,7 +16,7 @@ const AccountHandoff = () => { router.push(ACCOUNTS_PAGES.PASSKEYS); } catch (e) { - logError(e, "Failed to deserialize and set passed user data"); + log.error("Failed to deserialize and set passed user data", e); router.push(ACCOUNTS_PAGES.LOGIN); } }; diff --git a/web/apps/accounts/src/pages/credentials/index.tsx b/web/apps/accounts/src/pages/credentials/index.tsx index 453a61315..306efc7b8 100644 --- a/web/apps/accounts/src/pages/credentials/index.tsx +++ b/web/apps/accounts/src/pages/credentials/index.tsx @@ -1,17 +1,9 @@ import CredentialPage from "@ente/accounts/pages/credentials"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { useContext } from "react"; import { AppContext } from "../_app"; export default function Credential() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/accounts/src/pages/generate/index.tsx b/web/apps/accounts/src/pages/generate/index.tsx index 84d8f5227..ff1b6aa1f 100644 --- a/web/apps/accounts/src/pages/generate/index.tsx +++ b/web/apps/accounts/src/pages/generate/index.tsx @@ -1,17 +1,9 @@ import GeneratePage from "@ente/accounts/pages/generate"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Generate() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/accounts/src/pages/login/index.tsx b/web/apps/accounts/src/pages/login/index.tsx index a6ca13492..0631a7bd1 100644 --- a/web/apps/accounts/src/pages/login/index.tsx +++ b/web/apps/accounts/src/pages/login/index.tsx @@ -1,17 +1,9 @@ import LoginPage from "@ente/accounts/pages/login"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { useContext } from "react"; import { AppContext } from "../_app"; export default function Login() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/accounts/src/pages/passkeys/flow/Recover.tsx b/web/apps/accounts/src/pages/passkeys/flow/Recover.tsx index aea836f6e..f992e3961 100644 --- a/web/apps/accounts/src/pages/passkeys/flow/Recover.tsx +++ b/web/apps/accounts/src/pages/passkeys/flow/Recover.tsx @@ -1,17 +1,14 @@ import { TwoFactorType } from "@ente/accounts/constants/twofactor"; import RecoverPage from "@ente/accounts/pages/recover"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Recover() { const appContext = useContext(AppContext); - const router = useRouter(); return ( diff --git a/web/apps/accounts/src/pages/passkeys/flow/index.tsx b/web/apps/accounts/src/pages/passkeys/flow/index.tsx index 1f082bf6b..baf44c7e3 100644 --- a/web/apps/accounts/src/pages/passkeys/flow/index.tsx +++ b/web/apps/accounts/src/pages/passkeys/flow/index.tsx @@ -1,3 +1,4 @@ +import log from "@/next/log"; import { APPS, CLIENT_PACKAGE_NAMES } from "@ente/shared/apps/constants"; import { CenteredFlex, @@ -7,13 +8,11 @@ import EnteButton from "@ente/shared/components/EnteButton"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import FormPaper from "@ente/shared/components/Form/FormPaper"; import HTTPService from "@ente/shared/network/HTTPService"; -import { logError } from "@ente/shared/sentry"; import { LS_KEYS, setData } from "@ente/shared/storage/localStorage"; import InfoIcon from "@mui/icons-material/Info"; import { Box, Typography } from "@mui/material"; import { t } from "i18next"; import _sodium from "libsodium-wrappers"; -import Image from "next/image"; import { useEffect, useState } from "react"; import { BeginPasskeyAuthenticationResponse, @@ -74,7 +73,7 @@ const PasskeysFlow = () => { try { beginData = await beginAuthentication(passkeySessionID); } catch (e) { - logError(e, "Couldn't begin passkey authentication"); + log.error("Couldn't begin passkey authentication", e); setErrored(true); return; } finally { @@ -90,7 +89,7 @@ const PasskeysFlow = () => { try { credential = await getCredential(beginData.options.publicKey); } catch (e) { - logError(e, "Couldn't get credential"); + log.error("Couldn't get credential", e); continue; } finally { tries++; @@ -118,7 +117,7 @@ const PasskeysFlow = () => { beginData.ceremonySessionID, ); } catch (e) { - logError(e, "Couldn't finish passkey authentication"); + log.error("Couldn't finish passkey authentication", e); setErrored(true); setLoading(false); return; @@ -297,7 +296,7 @@ const PasskeysFlow = () => { {t("PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER")} - ente Logo Circular { try { newCredential = await navigator.credentials.create(options); } catch (e) { - logError(e, "Error creating credential"); + log.error("Error creating credential", e); setFieldError("Failed to create credential"); return; } diff --git a/web/apps/accounts/src/pages/recover/index.tsx b/web/apps/accounts/src/pages/recover/index.tsx index 6f718a207..2692225b2 100644 --- a/web/apps/accounts/src/pages/recover/index.tsx +++ b/web/apps/accounts/src/pages/recover/index.tsx @@ -1,17 +1,9 @@ import RecoverPage from "@ente/accounts/pages/recover"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Recover() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/accounts/src/pages/signup/index.tsx b/web/apps/accounts/src/pages/signup/index.tsx index 1e0f576a6..40d073cf5 100644 --- a/web/apps/accounts/src/pages/signup/index.tsx +++ b/web/apps/accounts/src/pages/signup/index.tsx @@ -1,17 +1,9 @@ import SignupPage from "@ente/accounts/pages/signup"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Sigup() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/accounts/src/pages/two-factor/recover/index.tsx b/web/apps/accounts/src/pages/two-factor/recover/index.tsx index e6b2036fa..af5765323 100644 --- a/web/apps/accounts/src/pages/two-factor/recover/index.tsx +++ b/web/apps/accounts/src/pages/two-factor/recover/index.tsx @@ -1,17 +1,11 @@ import TwoFactorRecoverPage from "@ente/accounts/pages/two-factor/recover"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function TwoFactorRecover() { const appContext = useContext(AppContext); - const router = useRouter(); return ( - + ); } diff --git a/web/apps/accounts/src/pages/two-factor/setup/index.tsx b/web/apps/accounts/src/pages/two-factor/setup/index.tsx index f1b0e8f76..f1283e870 100644 --- a/web/apps/accounts/src/pages/two-factor/setup/index.tsx +++ b/web/apps/accounts/src/pages/two-factor/setup/index.tsx @@ -1,17 +1,11 @@ import TwoFactorSetupPage from "@ente/accounts/pages/two-factor/setup"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function TwoFactorSetup() { const appContext = useContext(AppContext); - const router = useRouter(); return ( - + ); } diff --git a/web/apps/accounts/src/pages/two-factor/verify/index.tsx b/web/apps/accounts/src/pages/two-factor/verify/index.tsx index b17882d3b..fd4c2ce09 100644 --- a/web/apps/accounts/src/pages/two-factor/verify/index.tsx +++ b/web/apps/accounts/src/pages/two-factor/verify/index.tsx @@ -1,17 +1,11 @@ import TwoFactorVerifyPage from "@ente/accounts/pages/two-factor/verify"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function TwoFactorVerify() { const appContext = useContext(AppContext); - const router = useRouter(); return ( - + ); } diff --git a/web/apps/accounts/src/pages/verify/index.tsx b/web/apps/accounts/src/pages/verify/index.tsx index 467419d0a..b09480858 100644 --- a/web/apps/accounts/src/pages/verify/index.tsx +++ b/web/apps/accounts/src/pages/verify/index.tsx @@ -1,17 +1,9 @@ import VerifyPage from "@ente/accounts/pages/verify"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Verify() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/accounts/src/services/passkeysService.ts b/web/apps/accounts/src/services/passkeysService.ts index ecc6ad406..27f9773e5 100644 --- a/web/apps/accounts/src/services/passkeysService.ts +++ b/web/apps/accounts/src/services/passkeysService.ts @@ -1,8 +1,9 @@ +import log from "@/next/log"; import HTTPService from "@ente/shared/network/HTTPService"; import { getEndpoint } from "@ente/shared/network/api"; -import { logError } from "@ente/shared/sentry"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; import _sodium from "libsodium-wrappers"; + const ENDPOINT = getEndpoint(); export const getPasskeys = async () => { @@ -16,7 +17,7 @@ export const getPasskeys = async () => { ); return await response.data; } catch (e) { - logError(e, "get passkeys failed"); + log.error("get passkeys failed", e); throw e; } }; @@ -33,7 +34,7 @@ export const renamePasskey = async (id: string, name: string) => { ); return await response.data; } catch (e) { - logError(e, "rename passkey failed"); + log.error("rename passkey failed", e); throw e; } }; @@ -50,7 +51,7 @@ export const deletePasskey = async (id: string) => { ); return await response.data; } catch (e) { - logError(e, "delete passkey failed"); + log.error("delete passkey failed", e); throw e; } }; @@ -68,7 +69,7 @@ export const getPasskeyRegistrationOptions = async () => { ); return await response.data; } catch (e) { - logError(e, "get passkey registration options failed"); + log.error("get passkey registration options failed", e); throw e; } }; @@ -116,7 +117,7 @@ export const finishPasskeyRegistration = async ( ); return await response.data; } catch (e) { - logError(e, "finish passkey registration failed"); + log.error("finish passkey registration failed", e); throw e; } }; @@ -142,7 +143,7 @@ export const beginPasskeyAuthentication = async ( return data.data; } catch (e) { - logError(e, "begin passkey authentication failed"); + log.error("begin passkey authentication failed", e); throw e; } }; @@ -194,7 +195,7 @@ export const finishPasskeyAuthentication = async ( return data.data; } catch (e) { - logError(e, "finish passkey authentication failed"); + log.error("finish passkey authentication failed", e); throw e; } }; diff --git a/web/apps/accounts/src/styles/global.css b/web/apps/accounts/src/styles/global.css index 0ea6c125d..98ad85a9b 100644 --- a/web/apps/accounts/src/styles/global.css +++ b/web/apps/accounts/src/styles/global.css @@ -150,21 +150,6 @@ body { background-color: #51cd7c; } -.carousel-inner { - padding-bottom: 50px !important; -} - -.carousel-indicators li { - width: 10px; - height: 10px; - border-radius: 50%; - margin-right: 12px; -} - -.carousel-indicators .active { - background-color: #51cd7c; -} - div.otp-input input { width: 36px !important; height: 36px; diff --git a/web/apps/auth/public/locales/de-DE/translation.json b/web/apps/auth/public/locales/de-DE/translation.json deleted file mode 100644 index 9a1c4073c..000000000 --- a/web/apps/auth/public/locales/de-DE/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Private Sicherungen
für deine Erinnerungen
", - "HERO_SLIDE_1": "Standardmäßig Ende-zu-Ende verschlüsselt", - "HERO_SLIDE_2_TITLE": "
Sicher gespeichert
in einem Luftschutzbunker
", - "HERO_SLIDE_2": "Entwickelt um zu bewahren", - "HERO_SLIDE_3_TITLE": "
Verfügbar
überall
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Anmelden", - "SIGN_UP": "Registrieren", - "NEW_USER": "Neu bei ente", - "EXISTING_USER": "Existierender Benutzer", - "ENTER_NAME": "Name eingeben", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Füge einen Namen hinzu, damit deine Freunde wissen, wem sie für diese tollen Fotos zu danken haben!", - "ENTER_EMAIL": "E-Mail-Adresse eingeben", - "EMAIL_ERROR": "Geben Sie eine gültige E-Mail-Adresse ein", - "REQUIRED": "Erforderlich", - "EMAIL_SENT": "Bestätigungscode an {{email}} gesendet", - "CHECK_INBOX": "Bitte überprüfe deinen E-Mail-Posteingang (und Spam), um die Verifizierung abzuschließen", - "ENTER_OTT": "Bestätigungscode", - "RESEND_MAIL": "Code erneut senden", - "VERIFY": "Überprüfen", - "UNKNOWN_ERROR": "Ein Fehler ist aufgetreten, bitte versuche es erneut", - "INVALID_CODE": "Falscher Bestätigungscode", - "EXPIRED_CODE": "Ihr Bestätigungscode ist abgelaufen", - "SENDING": "Wird gesendet...", - "SENT": "Gesendet!", - "PASSWORD": "Passwort", - "LINK_PASSWORD": "Passwort zum Entsperren des Albums eingeben", - "RETURN_PASSPHRASE_HINT": "Passwort", - "SET_PASSPHRASE": "Passwort setzen", - "VERIFY_PASSPHRASE": "Einloggen", - "INCORRECT_PASSPHRASE": "Falsches Passwort", - "ENTER_ENC_PASSPHRASE": "Bitte gib ein Passwort ein, mit dem wir deine Daten verschlüsseln können", - "PASSPHRASE_DISCLAIMER": "Wir speichern dein Passwort nicht. Wenn du es vergisst, können wir dir nicht helfen, deine Daten ohne einen Wiederherstellungsschlüssel wiederherzustellen.", - "WELCOME_TO_ENTE_HEADING": "Willkommen bei ", - "WELCOME_TO_ENTE_SUBHEADING": "Ende-zu-Ende verschlüsselte Fotospeicherung und Freigabe", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Wo deine besten Fotos leben", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generierung von Verschlüsselungsschlüsseln...", - "PASSPHRASE_HINT": "Passwort", - "CONFIRM_PASSPHRASE": "Passwort bestätigen", - "REFERRAL_CODE_HINT": "Wie hast du von Ente erfahren? (optional)", - "REFERRAL_INFO": "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!", - "PASSPHRASE_MATCH_ERROR": "Die Passwörter stimmen nicht überein", - "CREATE_COLLECTION": "Neues Album", - "ENTER_ALBUM_NAME": "Albumname", - "CLOSE_OPTION": "Schließen (Esc)", - "ENTER_FILE_NAME": "Dateiname", - "CLOSE": "Schließen", - "NO": "Nein", - "NOTHING_HERE": "Hier gibt es noch nichts zu sehen 👀", - "UPLOAD": "Hochladen", - "IMPORT": "Importieren", - "ADD_PHOTOS": "Fotos hinzufügen", - "ADD_MORE_PHOTOS": "Mehr Fotos hinzufügen", - "add_photos_one": "Eine Datei hinzufügen", - "add_photos_other": "{{count, number}} Dateien hinzufügen", - "SELECT_PHOTOS": "Foto auswählen", - "FILE_UPLOAD": "Datei hochladen", - "UPLOAD_STAGE_MESSAGE": { - "0": "Hochladen wird vorbereitet", - "1": "Lese Google-Metadaten", - "2": "Metadaten von {{uploadCounter.finished, number}} / {{uploadCounter.total, number}} Dateien extrahiert", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} Dateien verarbeitet", - "4": "Verbleibende Uploads werden abgebrochen", - "5": "Sicherung abgeschlossen" - }, - "FILE_NOT_UPLOADED_LIST": "Die folgenden Dateien wurden nicht hochgeladen", - "SUBSCRIPTION_EXPIRED": "Abonnement abgelaufen", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Dein Abonnement ist abgelaufen, bitte erneuere es", - "STORAGE_QUOTA_EXCEEDED": "Speichergrenze überschritten", - "INITIAL_LOAD_DELAY_WARNING": "Das erste Laden kann einige Zeit in Anspruch nehmen", - "USER_DOES_NOT_EXIST": "Leider konnte kein Benutzer mit dieser E-Mail gefunden werden", - "NO_ACCOUNT": "Kein Konto vorhanden", - "ACCOUNT_EXISTS": "Es ist bereits ein Account vorhanden", - "CREATE": "Erstellen", - "DOWNLOAD": "Herunterladen", - "DOWNLOAD_OPTION": "Herunterladen (D)", - "DOWNLOAD_FAVORITES": "Favoriten herunterladen", - "DOWNLOAD_UNCATEGORIZED": "Download unkategorisiert", - "DOWNLOAD_HIDDEN_ITEMS": "Versteckte Dateien herunterladen", - "COPY_OPTION": "Als PNG kopieren (Strg / Cmd - C)", - "TOGGLE_FULLSCREEN": "Vollbild umschalten (F)", - "ZOOM_IN_OUT": "Herein-/Herauszoomen", - "PREVIOUS": "Vorherige (←)", - "NEXT": "Weitere (→)", - "TITLE_PHOTOS": "Ente Fotos", - "TITLE_ALBUMS": "Ente Fotos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Lade dein erstes Foto hoch", - "IMPORT_YOUR_FOLDERS": "Importiere deiner Ordner", - "UPLOAD_DROPZONE_MESSAGE": "Loslassen, um Dateien zu sichern", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Loslassen, um beobachteten Ordner hinzuzufügen", - "TRASH_FILES_TITLE": "Dateien löschen?", - "TRASH_FILE_TITLE": "Datei löschen?", - "DELETE_FILES_TITLE": "Sofort löschen?", - "DELETE_FILES_MESSAGE": "Ausgewählte Dateien werden dauerhaft aus Ihrem Ente-Konto gelöscht.", - "DELETE": "Löschen", - "DELETE_OPTION": "Löschen (DEL)", - "FAVORITE_OPTION": "Zu Favoriten hinzufügen (L)", - "UNFAVORITE_OPTION": "Von Favoriten entfernen (L)", - "MULTI_FOLDER_UPLOAD": "Mehrere Ordner erkannt", - "UPLOAD_STRATEGY_CHOICE": "Möchtest du sie hochladen in", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Ein einzelnes Album", - "OR": "oder", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Getrennte Alben", - "SESSION_EXPIRED_MESSAGE": "Ihre Sitzung ist abgelaufen. Bitte loggen Sie sich erneut ein, um fortzufahren", - "SESSION_EXPIRED": "Sitzung abgelaufen", - "PASSWORD_GENERATION_FAILED": "Dein Browser konnte keinen starken Schlüssel generieren, der den Verschlüsselungsstandards des Entes entspricht, bitte versuche die mobile App oder einen anderen Browser zu verwenden", - "CHANGE_PASSWORD": "Passwort ändern", - "GO_BACK": "Zurück", - "RECOVERY_KEY": "Wiederherstellungsschlüssel", - "SAVE_LATER": "Auf später verschieben", - "SAVE": "Schlüssel speichern", - "RECOVERY_KEY_DESCRIPTION": "Falls du dein Passwort vergisst, kannst du deine Daten nur mit diesem Schlüssel wiederherstellen.", - "RECOVER_KEY_GENERATION_FAILED": "Wiederherstellungsschlüssel konnte nicht generiert werden, bitte versuche es erneut", - "KEY_NOT_STORED_DISCLAIMER": "Wir speichern diesen Schlüssel nicht, also speichere ihn bitte an einem sicheren Ort", - "FORGOT_PASSWORD": "Passwort vergessen", - "RECOVER_ACCOUNT": "Konto wiederherstellen", - "RECOVERY_KEY_HINT": "Wiederherstellungsschlüssel", - "RECOVER": "Wiederherstellen", - "NO_RECOVERY_KEY": "Kein Wiederherstellungsschlüssel?", - "INCORRECT_RECOVERY_KEY": "Falscher Wiederherstellungs-Schlüssel", - "SORRY": "Entschuldigung", - "NO_RECOVERY_KEY_MESSAGE": "Aufgrund unseres Ende-zu-Ende-Verschlüsselungsprotokolls können Ihre Daten nicht ohne Ihr Passwort oder Ihren Wiederherstellungsschlüssel entschlüsselt werden", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Bitte sende eine E-Mail an {{emailID}} von deiner registrierten E-Mail-Adresse", - "CONTACT_SUPPORT": "Support kontaktieren", - "REQUEST_FEATURE": "Feature anfragen", - "SUPPORT": "Support", - "CONFIRM": "Bestätigen", - "CANCEL": "Abbrechen", - "LOGOUT": "Ausloggen", - "DELETE_ACCOUNT": "Konto löschen", - "DELETE_ACCOUNT_MESSAGE": "

Bitte sende eine E-Mail an {{emailID}} mit deiner registrierten E-Mail-Adresse.

Deine Anfrage wird innerhalb von 72 Stunden bearbeitet.

", - "LOGOUT_MESSAGE": "Sind sie sicher, dass sie sich ausloggen möchten?", - "CHANGE_EMAIL": "E-Mail-Adresse ändern", - "OK": "OK", - "SUCCESS": "Erfolgreich", - "ERROR": "Fehler", - "MESSAGE": "Nachricht", - "INSTALL_MOBILE_APP": "Installiere unsere Android oder iOS App, um automatisch alle deine Fotos zu sichern", - "DOWNLOAD_APP_MESSAGE": "Entschuldigung, dieser Vorgang wird derzeit nur von unserer Desktop-App unterstützt", - "DOWNLOAD_APP": "Desktopanwendung herunterladen", - "EXPORT": "Daten exportieren", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "Abonnieren", - "MANAGEMENT_PORTAL": "Zahlungsmethode verwalten", - "MANAGE_FAMILY_PORTAL": "Familiengruppe verwalten", - "LEAVE_FAMILY_PLAN": "Familienabo verlassen", - "LEAVE": "Verlassen", - "LEAVE_FAMILY_CONFIRM": "Bist du sicher, dass du den Familien-Tarif verlassen möchtest?", - "CHOOSE_PLAN": "Wähle dein Abonnement", - "MANAGE_PLAN": "Verwalte dein Abonnement", - "ACTIVE": "Aktiv", - "OFFLINE_MSG": "Du bist offline, gecachte Erinnerungen werden angezeigt", - "FREE_SUBSCRIPTION_INFO": "Du bist auf dem kostenlosen Plan, der am {{date, dateTime}} ausläuft", - "FAMILY_SUBSCRIPTION_INFO": "Sie haben einen Familienplan verwaltet von", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Erneuert am {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Endet am {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Ihr Abo endet am {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Dein {{storage, string}} Add-on ist gültig bis {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Sie haben Ihr Speichervolumen überschritten, bitte upgraden Sie", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Wir haben deine Zahlung erhalten

Dein Abonnement ist gültig bis {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Dein Kauf wurde abgebrochen. Bitte versuche es erneut, wenn du abonnieren willst", - "SUBSCRIPTION_PURCHASE_FAILED": "Kauf des Abonnements fehlgeschlagen Bitte versuchen Sie es erneut", - "SUBSCRIPTION_UPDATE_FAILED": "Aktualisierung des Abonnements fehlgeschlagen Bitte versuchen Sie es erneut", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Es tut uns leid, die Zahlung ist fehlgeschlagen, als wir versuchten Ihre Karte zu belasten. Bitte aktualisieren Sie Ihre Zahlungsmethode und versuchen Sie es erneut", - "STRIPE_AUTHENTICATION_FAILED": "Wir können deine Zahlungsmethode nicht authentifizieren. Bitte wähle eine andere Zahlungsmethode und versuche es erneut", - "UPDATE_PAYMENT_METHOD": "Zahlungsmethode aktualisieren", - "MONTHLY": "Monatlich", - "YEARLY": "Jährlich", - "UPDATE_SUBSCRIPTION_MESSAGE": "Sind Sie sicher, dass Sie Ihren Tarif ändern möchten?", - "UPDATE_SUBSCRIPTION": "Plan ändern", - "CANCEL_SUBSCRIPTION": "Abonnement kündigen", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Alle deine Daten werden am Ende dieses Abrechnungszeitraums von unseren Servern gelöscht.

Bist du sicher, dass du dein Abonnement kündigen möchtest?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Bist du sicher, dass du dein Abonnement beenden möchtest?

", - "SUBSCRIPTION_CANCEL_FAILED": "Abonnement konnte nicht storniert werden", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abonnement erfolgreich beendet", - "REACTIVATE_SUBSCRIPTION": "Abonnement reaktivieren", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Nach der Reaktivierung wird am {{date, dateTime}} abgerechnet", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Abonnement erfolgreich aktiviert ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Reaktivierung der Abonnementverlängerung fehlgeschlagen", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Vielen Dank", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Mobiles Abonnement kündigen", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Bitte kündige dein Abonnement in der mobilen App, um hier ein Abonnement zu aktivieren", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Bitte kontaktiere uns über {{emailID}}, um dein Abo zu verwalten", - "RENAME": "Umbenennen", - "RENAME_FILE": "Datei umbenennen", - "RENAME_COLLECTION": "Album umbenennen", - "DELETE_COLLECTION_TITLE": "Album löschen?", - "DELETE_COLLECTION": "Album löschen", - "DELETE_COLLECTION_MESSAGE": "Auch die Fotos (und Videos) in diesem Album aus allen anderen Alben löschen, die sie enthalten?", - "DELETE_PHOTOS": "Fotos löschen", - "KEEP_PHOTOS": "Fotos behalten", - "SHARE": "Teilen", - "SHARE_COLLECTION": "Album teilen", - "SHAREES": "Geteilt mit", - "SHARE_WITH_SELF": "Du kannst nicht mit dir selbst teilen", - "ALREADY_SHARED": "Hoppla, Sie teilen dies bereits mit {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Albumfreigabe nicht erlaubt", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Freigabe ist für kostenlose Konten deaktiviert", - "DOWNLOAD_COLLECTION": "Album herunterladen", - "DOWNLOAD_COLLECTION_MESSAGE": "

Bist du sicher, dass du das komplette Album herunterladen möchtest?

Alle Dateien werden der Warteschlange zum sequenziellen Download hinzugefügt

", - "CREATE_ALBUM_FAILED": "Fehler beim Erstellen des Albums, bitte versuche es erneut", - "SEARCH": "Suchen", - "SEARCH_RESULTS": "Ergebnisse durchsuchen", - "NO_RESULTS": "Keine Ergebnisse gefunden", - "SEARCH_HINT": "Suche nach Alben, Datum, Beschreibungen, ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Standort", - "CITY": "Ort", - "DATE": "Datum", - "FILE_NAME": "Dateiname", - "THING": "Inhalt", - "FILE_CAPTION": "Beschreibung", - "FILE_TYPE": "Dateityp", - "CLIP": "Magie" - }, - "photos_count_zero": "Keine Erinnerungen", - "photos_count_one": "Eine Erinnerung", - "photos_count_other": "{{count, number}} Erinnerungen", - "TERMS_AND_CONDITIONS": "Ich stimme den Bedingungen und Datenschutzrichtlinien zu", - "ADD_TO_COLLECTION": "Zum Album hinzufügen", - "SELECTED": "ausgewählt", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Dieses Video kann in deinem Browser nicht abgespielt werden", - "PEOPLE": "Personen", - "INDEXING_SCHEDULED": "Indizierung ist geplant...", - "ANALYZING_PHOTOS": "Indiziere Fotos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indiziere Personen in {{indexStatus.nSyncedFiles,number}} Fotos...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles,number}} Fotos wurden indiziert", - "UNIDENTIFIED_FACES": "unidentifizierte Gesichter", - "OBJECTS": "Objekte", - "TEXT": "Text", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Dateiname", - "CAPTION_PLACEHOLDER": "Eine Beschreibung hinzufügen", - "LOCATION": "Standort", - "SHOW_ON_MAP": "In OpenStreetMap öffnen", - "MAP": "Karte", - "MAP_SETTINGS": "Karten\nEinstellungen", - "ENABLE_MAPS": "Karten aktivieren?", - "ENABLE_MAP": "Karte aktivieren", - "DISABLE_MAPS": "Karten deaktivieren?", - "ENABLE_MAP_DESCRIPTION": "

Dies wird deine Fotos auf einer Weltkarte anzeigen.

Die Karte wird von OpenStreetMap gehostet und die genauen Standorte deiner Fotos werden niemals geteilt.

Diese Funktion kannst du jederzeit in den Einstellungen deaktivieren.

", - "DISABLE_MAP_DESCRIPTION": "

Dies wird die Anzeige deiner Fotos auf einer Weltkarte deaktivieren.

Du kannst diese Funktion jederzeit in den Einstellungen aktivieren.

", - "DISABLE_MAP": "Karte deaktivieren", - "DETAILS": "Details", - "VIEW_EXIF": "Alle EXIF-Daten anzeigen", - "NO_EXIF": "Keine EXIF-Daten", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Zwei-Faktor", - "TWO_FACTOR_AUTHENTICATION": "Zwei-Faktor-Authentifizierung", - "TWO_FACTOR_QR_INSTRUCTION": "Scanne den QR-Code unten mit deiner bevorzugten Authentifizierungs-App", - "ENTER_CODE_MANUALLY": "Geben Sie den Code manuell ein", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Bitte gib diesen Code in deiner bevorzugten Authentifizierungs-App ein", - "SCAN_QR_CODE": "QR‐Code stattdessen scannen", - "ENABLE_TWO_FACTOR": "Zwei-Faktor-Authentifizierung aktivieren", - "ENABLE": "Aktivieren", - "LOST_DEVICE": "Zwei-Faktor-Gerät verloren", - "INCORRECT_CODE": "Falscher Code", - "TWO_FACTOR_INFO": "Fügen Sie eine zusätzliche Sicherheitsebene hinzu, indem Sie mehr als Ihre E-Mail und Ihr Passwort benötigen, um sich mit Ihrem Account anzumelden", - "DISABLE_TWO_FACTOR_LABEL": "Deaktiviere die Zwei-Faktor-Authentifizierung", - "UPDATE_TWO_FACTOR_LABEL": "Authentifizierungsgerät aktualisieren", - "DISABLE": "Deaktivieren", - "RECONFIGURE": "Neu einrichten", - "UPDATE_TWO_FACTOR": "Zweiten Faktor aktualisieren", - "UPDATE_TWO_FACTOR_MESSAGE": "Fahren Sie fort, werden alle Ihre zuvor konfigurierten Authentifikatoren ungültig", - "UPDATE": "Aktualisierung", - "DISABLE_TWO_FACTOR": "Zweiten Faktor deaktivieren", - "DISABLE_TWO_FACTOR_MESSAGE": "Bist du sicher, dass du die Zwei-Faktor-Authentifizierung deaktivieren willst", - "TWO_FACTOR_DISABLE_FAILED": "Fehler beim Deaktivieren des zweiten Faktors, bitte versuchen Sie es erneut", - "EXPORT_DATA": "Daten exportieren", - "SELECT_FOLDER": "Ordner auswählen", - "DESTINATION": "Zielort", - "START": "Start", - "LAST_EXPORT_TIME": "Letztes Exportdatum", - "EXPORT_AGAIN": "Neusynchronisation", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Lokaler Speicher nicht zugänglich", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Ihr Browser oder ein Addon blockiert ente vor der Speicherung von Daten im lokalen Speicher. Bitte versuchen Sie, den Browser-Modus zu wechseln und die Seite neu zu laden.", - "SEND_OTT": "OTP senden", - "EMAIl_ALREADY_OWNED": "Diese E-Mail wird bereits verwendet", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "Fehlgeschlagene Uploads erneut probieren", - "FAILED_UPLOADS": "Fehlgeschlagene Uploads ", - "SKIPPED_FILES": "Ignorierte Uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Das Vorschaubild konnte nicht erzeugt werden", - "UNSUPPORTED_FILES": "Nicht unterstützte Dateien", - "SUCCESSFUL_UPLOADS": "Erfolgreiche Uploads", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "ente unterstützt diese Dateiformate noch nicht", - "BLOCKED_UPLOADS": "Blockierte Uploads", - "SKIPPED_VIDEOS": "Übersprungene Videos", - "INPROGRESS_METADATA_EXTRACTION": "In Bearbeitung", - "INPROGRESS_UPLOADS": "Upload läuft", - "TOO_LARGE_UPLOADS": "Große Dateien", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Zu wenig Speicher", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Diese Dateien wurden nicht hochgeladen, da sie die maximale Größe für Ihren Speicherplan überschreiten", - "TOO_LARGE_INFO": "Diese Dateien wurden nicht hochgeladen, da sie unsere maximale Dateigröße überschreiten", - "THUMBNAIL_GENERATION_FAILED_INFO": "Diese Dateien wurden hochgeladen, aber leider konnten wir nicht die Thumbnails für sie generieren.", - "UPLOAD_TO_COLLECTION": "In Album hochladen", - "UNCATEGORIZED": "Unkategorisiert", - "ARCHIVE": "Archiv", - "FAVORITES": "Favoriten", - "ARCHIVE_COLLECTION": "Album archivieren", - "ARCHIVE_SECTION_NAME": "Archiv", - "ALL_SECTION_NAME": "Alle", - "MOVE_TO_COLLECTION": "Zum Album verschieben", - "UNARCHIVE": "Dearchivieren", - "UNARCHIVE_COLLECTION": "Album dearchivieren", - "HIDE_COLLECTION": "Album ausblenden", - "UNHIDE_COLLECTION": "Album wieder einblenden", - "MOVE": "Verschieben", - "ADD": "Hinzufügen", - "REMOVE": "Entfernen", - "YES_REMOVE": "Ja, entfernen", - "REMOVE_FROM_COLLECTION": "Aus Album entfernen", - "TRASH": "Papierkorb", - "MOVE_TO_TRASH": "In Papierkorb verschieben", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "Dauerhaft löschen", - "RESTORE": "Wiederherstellen", - "RESTORE_TO_COLLECTION": "In Album wiederherstellen", - "EMPTY_TRASH": "Papierkorb leeren", - "EMPTY_TRASH_TITLE": "Papierkorb leeren?", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "Ja, verlassen", - "LEAVE_ALBUM": "Album verlassen", - "LEAVE_SHARED_ALBUM_TITLE": "Geteiltes Album verlassen?", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "Dateien in einem freigegebenen Album können nicht gelöscht werden", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Einige der Elemente, die du entfernst, wurden von anderen Nutzern hinzugefügt und du wirst den Zugriff auf sie verlieren.", - "SORT_BY_CREATION_TIME_ASCENDING": "Ältestem", - "SORT_BY_UPDATION_TIME_DESCENDING": "Zuletzt aktualisiert", - "SORT_BY_NAME": "Name", - "COMPRESS_THUMBNAILS": "Vorschaubilder komprimieren", - "THUMBNAIL_REPLACED": "Vorschaubilder komprimiert", - "FIX_THUMBNAIL": "Komprimiere", - "FIX_THUMBNAIL_LATER": "Später komprimieren", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "Zeit reparieren", - "FIX_CREATION_TIME_IN_PROGRESS": "Zeit wird repariert", - "CREATION_TIME_UPDATED": "Datei-Zeit aktualisiert", - "UPDATE_CREATION_TIME_NOT_STARTED": "Wählen Sie die Option, die Sie verwenden möchten", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "Maximal 5000 Zeichen", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "Benutzerdefinierte Zeit", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Fehler beim Öffnen der Pläne", - "INSTALL": "Installieren", - "SHARING_DETAILS": "Details teilen", - "MODIFY_SHARING": "Freigabe ändern", - "ADD_COLLABORATORS": "Bearbeiter hinzufügen", - "ADD_NEW_EMAIL": "Neue E-Mail-Adresse hinzufügen", - "shared_with_people_zero": "Mit bestimmten Personen teilen", - "shared_with_people_one": "Geteilt mit einer Person", - "shared_with_people_other": "Geteilt mit {{count, number}} Personen", - "participants_zero": "Keine Teilnehmer", - "participants_one": "1 Teilnehmer", - "participants_other": "{{count, number}} Teilnehmer", - "ADD_VIEWERS": "Betrachter hinzufügen", - "PARTICIPANTS": "Teilnehmer", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "Ja, zu \"Beobachter\" ändern", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "Berechtigung ändern?", - "REMOVE_PARTICIPANT": "Entfernen?", - "CONFIRM_REMOVE": "Ja, entfernen", - "MANAGE": "Verwalten", - "ADDED_AS": "Hinzugefügt als", - "COLLABORATOR_RIGHTS": "Bearbeiter können Fotos & Videos zu dem geteilten Album hinzufügen", - "REMOVE_PARTICIPANT_HEAD": "Teilnehmer entfernen", - "OWNER": "Besitzer", - "COLLABORATORS": "Bearbeiter", - "ADD_MORE": "Mehr hinzufügen", - "VIEWERS": "Zuschauer", - "OR_ADD_EXISTING": "Oder eine Vorherige auswählen", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - Nicht gefunden", - "LINK_EXPIRED": "Link ist abgelaufen", - "LINK_EXPIRED_MESSAGE": "Dieser Link ist abgelaufen oder wurde deaktiviert!", - "MANAGE_LINK": "Link verwalten", - "LINK_TOO_MANY_REQUESTS": "Sorry, dieses Album wurde auf zu vielen Geräten angezeigt!", - "FILE_DOWNLOAD": "Downloads erlauben", - "LINK_PASSWORD_LOCK": "Passwort Sperre", - "PUBLIC_COLLECT": "Hinzufügen von Fotos erlauben", - "LINK_DEVICE_LIMIT": "Geräte Limit", - "NO_DEVICE_LIMIT": "Keins", - "LINK_EXPIRY": "Ablaufdatum des Links", - "NEVER": "Niemals", - "DISABLE_FILE_DOWNLOAD": "Download deaktivieren", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "Enthält schädliche Inhalte", - "COPYRIGHT": "Verletzung des Urheberrechts von jemandem, den ich repräsentieren darf", - "SHARED_USING": "Freigegeben über ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Passwort-Sperre deaktivieren", - "DISABLE_PASSWORD_MESSAGE": "Sind Sie sicher, dass Sie die Passwort-Sperre deaktivieren möchten?", - "PASSWORD_LOCK": "Passwort Sperre", - "LOCK": "Sperren", - "DOWNLOAD_UPLOAD_LOGS": "Debug-Logs", - "UPLOAD_FILES": "Datei", - "UPLOAD_DIRS": "Ordner", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "Authenticator", - "NO_DUPLICATES_FOUND": "Du hast keine Duplikate, die gelöscht werden können", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "Dateien", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "Hochladen stoppen?", - "YES_STOP_UPLOADS": "Ja, Hochladen stoppen", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "", - "ALL_ALBUMS": "Alle Alben", - "ALBUMS": "Alben", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "Gib den 6-stelligen Code aus\ndeiner Authentifizierungs-App ein.", - "CREATE_ACCOUNT": "Account erstellen", - "COPIED": "Kopiert", - "CANVAS_BLOCKED_TITLE": "Vorschaubild konnte nicht erstellt werden", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "Jetzt upgraden", - "RENEW_NOW": "", - "STORAGE": "Speicher", - "USED": "verwendet", - "YOU": "Sie", - "FAMILY": "Familie", - "FREE": "frei", - "OF": "von", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "Ordner hinzufügen", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "Ja, Stopp", - "MONTH_SHORT": "", - "YEAR": "Jahr", - "FAMILY_PLAN": "Familientarif", - "DOWNLOAD_LOGS": "Logs herunterladen", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "Ordner ändern", - "TWO_MONTHS_FREE": "Erhalte 2 Monate kostenlos bei Jahresabonnements", - "GB": "GB", - "POPULAR": "Beliebt", - "FREE_PLAN_OPTION_LABEL": "Mit kostenloser Testversion fortfahren", - "FREE_PLAN_DESCRIPTION": "1 GB für 1 Jahr", - "CURRENT_USAGE": "Aktuelle Nutzung ist {{usage}}", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "Authentifizieren", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "Egal", - "UPDATE_AVAILABLE": "Neue Version verfügbar", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "Jetzt installieren", - "INSTALL_ON_NEXT_LAUNCH": "Beim nächsten Start installieren", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "Diese Version ignorieren", - "TODAY": "Heute", - "YESTERDAY": "Gestern", - "NAME_PLACEHOLDER": "Name...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "Beta deaktivieren", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "Erweitert", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "Passwortstärke: Schwach", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "Passwortstärke: Stark", - "PREFERENCES": "Einstellungen", - "LANGUAGE": "Sprache", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "nach einer Stunde", - "DAY": "nach einem Tag", - "WEEK": "nach 1 Woche", - "MONTH": "nach einem Monat", - "YEAR": "nach einem Jahr" - }, - "COPY_LINK": "Link kopieren", - "DONE": "Fertig", - "LINK_SHARE_TITLE": "Oder einen Link teilen", - "REMOVE_LINK": "Link entfernen", - "CREATE_PUBLIC_SHARING": "Öffentlichen Link erstellen", - "PUBLIC_LINK_CREATED": "Öffentlicher Link erstellt", - "PUBLIC_LINK_ENABLED": "Öffentlicher Link aktiviert", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "Export gestartet", - "IN_PROGRESS": "", - "FINISH": "Export abgeschlossen", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "Kontolöschung bestätigen", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "Weiter", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "Versteckt", - "HIDE": "Ausblenden", - "UNHIDE": "Einblenden", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Sortieren nach", - "NEWEST_FIRST": "Neueste zuerst", - "OLDEST_FIRST": "Älteste zuerst", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Diese Datei konnte nicht in der Vorschau angezeigt werden. Klicken Sie hier, um das Original herunterzuladen.", - "SELECT_COLLECTION": "Album auswählen", - "PIN_ALBUM": "Album anheften", - "UNPIN_ALBUM": "Album lösen", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/en-US/translation.json b/web/apps/auth/public/locales/en-US/translation.json deleted file mode 100644 index de8d2fe2a..000000000 --- a/web/apps/auth/public/locales/en-US/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Private backups
for your memories
", - "HERO_SLIDE_1": "End-to-end encrypted by default", - "HERO_SLIDE_2_TITLE": "
Safely stored
at a fallout shelter
", - "HERO_SLIDE_2": "Designed to outlive", - "HERO_SLIDE_3_TITLE": "
Available
everywhere
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Login", - "SIGN_UP": "Signup", - "NEW_USER": "New to ente", - "EXISTING_USER": "Existing user", - "ENTER_NAME": "Enter name", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Add a name so that your friends know who to thank for these great photos!", - "ENTER_EMAIL": "Enter email address", - "EMAIL_ERROR": "Enter a valid email", - "REQUIRED": "Required", - "EMAIL_SENT": "Verification code sent to {{email}}", - "CHECK_INBOX": "Please check your inbox (and spam) to complete verification", - "ENTER_OTT": "Verification code", - "RESEND_MAIL": "Resend code", - "VERIFY": "Verify", - "UNKNOWN_ERROR": "Something went wrong, please try again", - "INVALID_CODE": "Invalid verification code", - "EXPIRED_CODE": "Your verification code has expired", - "SENDING": "Sending...", - "SENT": "Sent!", - "PASSWORD": "Password", - "LINK_PASSWORD": "Enter password to unlock the album", - "RETURN_PASSPHRASE_HINT": "Password", - "SET_PASSPHRASE": "Set password", - "VERIFY_PASSPHRASE": "Sign in", - "INCORRECT_PASSPHRASE": "Incorrect password", - "ENTER_ENC_PASSPHRASE": "Please enter a password that we can use to encrypt your data", - "PASSPHRASE_DISCLAIMER": "We don't store your password, so if you forget it, we will not be able to help you recover your data without a recovery key.", - "WELCOME_TO_ENTE_HEADING": "Welcome to ", - "WELCOME_TO_ENTE_SUBHEADING": "End to end encrypted photo storage and sharing", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Where your best photos live", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generating encryption keys...", - "PASSPHRASE_HINT": "Password", - "CONFIRM_PASSPHRASE": "Confirm password", - "REFERRAL_CODE_HINT": "How did you hear about Ente? (optional)", - "REFERRAL_INFO": "We don't track app installs, It'd help us if you told us where you found us!", - "PASSPHRASE_MATCH_ERROR": "Passwords don't match", - "CREATE_COLLECTION": "New album", - "ENTER_ALBUM_NAME": "Album name", - "CLOSE_OPTION": "Close (Esc)", - "ENTER_FILE_NAME": "File name", - "CLOSE": "Close", - "NO": "No", - "NOTHING_HERE": "Nothing to see here yet 👀", - "UPLOAD": "Upload", - "IMPORT": "Import", - "ADD_PHOTOS": "Add photos", - "ADD_MORE_PHOTOS": "Add more photos", - "add_photos_one": "Add 1 item", - "add_photos_other": "Add {{count, number}} items", - "SELECT_PHOTOS": "Select photos", - "FILE_UPLOAD": "File Upload", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparing to upload", - "1": "Reading google metadata files", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} files metadata extracted", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} files processed", - "4": "Cancelling remaining uploads", - "5": "Backup complete" - }, - "FILE_NOT_UPLOADED_LIST": "The following files were not uploaded", - "SUBSCRIPTION_EXPIRED": "Subscription expired", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Your subscription has expired, please renew", - "STORAGE_QUOTA_EXCEEDED": "Storage limit exceeded", - "INITIAL_LOAD_DELAY_WARNING": "First load may take some time", - "USER_DOES_NOT_EXIST": "Sorry, could not find a user with that email", - "NO_ACCOUNT": "Don't have an account", - "ACCOUNT_EXISTS": "Already have an account", - "CREATE": "Create", - "DOWNLOAD": "Download", - "DOWNLOAD_OPTION": "Download (D)", - "DOWNLOAD_FAVORITES": "Download favorites", - "DOWNLOAD_UNCATEGORIZED": "Download uncategorized", - "DOWNLOAD_HIDDEN_ITEMS": "Download hidden items", - "COPY_OPTION": "Copy as PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Toggle fullscreen (F)", - "ZOOM_IN_OUT": "Zoom in/out", - "PREVIOUS": "Previous (←)", - "NEXT": "Next (→)", - "TITLE_PHOTOS": "Ente Photos", - "TITLE_ALBUMS": "Ente Photos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Upload your first photo", - "IMPORT_YOUR_FOLDERS": "Import your folders", - "UPLOAD_DROPZONE_MESSAGE": "Drop to backup your files", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Drop to add watched folder", - "TRASH_FILES_TITLE": "Delete files?", - "TRASH_FILE_TITLE": "Delete file?", - "DELETE_FILES_TITLE": "Delete immediately?", - "DELETE_FILES_MESSAGE": "Selected files will be permanently deleted from your ente account.", - "DELETE": "Delete", - "DELETE_OPTION": "Delete (DEL)", - "FAVORITE_OPTION": "Favorite (L)", - "UNFAVORITE_OPTION": "Unfavorite (L)", - "MULTI_FOLDER_UPLOAD": "Multiple folders detected", - "UPLOAD_STRATEGY_CHOICE": "Would you like to upload them into", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "A single album", - "OR": "or", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Separate albums", - "SESSION_EXPIRED_MESSAGE": "Your session has expired, please login again to continue", - "SESSION_EXPIRED": "Session expired", - "PASSWORD_GENERATION_FAILED": "Your browser was unable to generate a strong key that meets ente's encryption standards, please try using the mobile app or another browser", - "CHANGE_PASSWORD": "Change password", - "GO_BACK": "Go back", - "RECOVERY_KEY": "Recovery key", - "SAVE_LATER": "Do this later", - "SAVE": "Save Key", - "RECOVERY_KEY_DESCRIPTION": "If you forget your password, the only way you can recover your data is with this key.", - "RECOVER_KEY_GENERATION_FAILED": "Recovery code could not be generated, please try again", - "KEY_NOT_STORED_DISCLAIMER": "We don't store this key, so please save this in a safe place", - "FORGOT_PASSWORD": "Forgot password", - "RECOVER_ACCOUNT": "Recover account", - "RECOVERY_KEY_HINT": "Recovery key", - "RECOVER": "Recover", - "NO_RECOVERY_KEY": "No recovery key?", - "INCORRECT_RECOVERY_KEY": "Incorrect recovery key", - "SORRY": "Sorry", - "NO_RECOVERY_KEY_MESSAGE": "Due to the nature of our end-to-end encryption protocol, your data cannot be decrypted without your password or recovery key", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Please drop an email to {{emailID}} from your registered email address", - "CONTACT_SUPPORT": "Contact support", - "REQUEST_FEATURE": "Request Feature", - "SUPPORT": "Support", - "CONFIRM": "Confirm", - "CANCEL": "Cancel", - "LOGOUT": "Logout", - "DELETE_ACCOUNT": "Delete account", - "DELETE_ACCOUNT_MESSAGE": "

Please send an email to {{emailID}} from your registered email address.

Your request will be processed within 72 hours.

", - "LOGOUT_MESSAGE": "Are you sure you want to logout?", - "CHANGE_EMAIL": "Change email", - "OK": "OK", - "SUCCESS": "Success", - "ERROR": "Error", - "MESSAGE": "Message", - "INSTALL_MOBILE_APP": "Install our Android or iOS app to automatically backup all your photos", - "DOWNLOAD_APP_MESSAGE": "Sorry, this operation is currently only supported on our desktop app", - "DOWNLOAD_APP": "Download desktop app", - "EXPORT": "Export Data", - "SUBSCRIPTION": "Subscription", - "SUBSCRIBE": "Subscribe", - "MANAGEMENT_PORTAL": "Manage payment method", - "MANAGE_FAMILY_PORTAL": "Manage family", - "LEAVE_FAMILY_PLAN": "Leave family plan", - "LEAVE": "Leave", - "LEAVE_FAMILY_CONFIRM": "Are you sure that you want to leave family plan?", - "CHOOSE_PLAN": "Choose your plan", - "MANAGE_PLAN": "Manage your subscription", - "ACTIVE": "Active", - "OFFLINE_MSG": "You are offline, cached memories are being shown", - "FREE_SUBSCRIPTION_INFO": "You are on the free plan that expires on {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "You are on a family plan managed by", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renews on {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Ends on {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Your subscription will be cancelled on {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Your {{storage, string}} add-on is valid till {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "You have exceeded your storage quota, please upgrade", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

We've received your payment

Your subscription is valid till {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Your purchase was canceled, please try again if you want to subscribe", - "SUBSCRIPTION_PURCHASE_FAILED": "Subscription purchase failed , please try again", - "SUBSCRIPTION_UPDATE_FAILED": "Subscription updated failed , please try again", - "UPDATE_PAYMENT_METHOD_MESSAGE": "We are sorry, payment failed when we tried to charge your card, please update your payment method and try again", - "STRIPE_AUTHENTICATION_FAILED": "We are unable to authenticate your payment method. please choose a different payment method and try again", - "UPDATE_PAYMENT_METHOD": "Update payment method", - "MONTHLY": "Monthly", - "YEARLY": "Yearly", - "UPDATE_SUBSCRIPTION_MESSAGE": "Are you sure you want to change your plan?", - "UPDATE_SUBSCRIPTION": "Change plan", - "CANCEL_SUBSCRIPTION": "Cancel subscription", - "CANCEL_SUBSCRIPTION_MESSAGE": "

All of your data will be deleted from our servers at the end of this billing period.

Are you sure that you want to cancel your subscription?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Are you sure you want to cancel your subscription?

", - "SUBSCRIPTION_CANCEL_FAILED": "Failed to cancel subscription", - "SUBSCRIPTION_CANCEL_SUCCESS": "Subscription canceled successfully", - "REACTIVATE_SUBSCRIPTION": "Reactivate subscription", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Once reactivated, you will be billed on {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Subscription activated successfully ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Failed to reactivate subscription renewals", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Thank you", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancel mobile subscription", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Please cancel your subscription from the mobile app to activate a subscription here", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Please contact us at {{emailID}} to manage your subscription", - "RENAME": "Rename", - "RENAME_FILE": "Rename file", - "RENAME_COLLECTION": "Rename album", - "DELETE_COLLECTION_TITLE": "Delete album?", - "DELETE_COLLECTION": "Delete album", - "DELETE_COLLECTION_MESSAGE": "Also delete the photos (and videos) present in this album from all other albums they are part of?", - "DELETE_PHOTOS": "Delete photos", - "KEEP_PHOTOS": "Keep photos", - "SHARE": "Share", - "SHARE_COLLECTION": "Share album", - "SHAREES": "Shared with", - "SHARE_WITH_SELF": "Oops, you cannot share with yourself", - "ALREADY_SHARED": "Oops, you're already sharing this with {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Sharing album not allowed", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Sharing is disabled for free accounts", - "DOWNLOAD_COLLECTION": "Download album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Are you sure you want to download the complete album?

All files will be queued for download sequentially

", - "CREATE_ALBUM_FAILED": "Failed to create album , please try again", - "SEARCH": "Search", - "SEARCH_RESULTS": "Search results", - "NO_RESULTS": "No results found", - "SEARCH_HINT": "Search for albums, dates, descriptions, ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Location", - "CITY": "Location", - "DATE": "Date", - "FILE_NAME": "File name", - "THING": "Content", - "FILE_CAPTION": "Description", - "FILE_TYPE": "File type", - "CLIP": "Magic" - }, - "photos_count_zero": "No memories", - "photos_count_one": "1 memory", - "photos_count_other": "{{count, number}} memories", - "TERMS_AND_CONDITIONS": "I agree to the terms and privacy policy", - "ADD_TO_COLLECTION": "Add to album", - "SELECTED": "selected", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "This video cannot be played on your browser", - "PEOPLE": "People", - "INDEXING_SCHEDULED": "Indexing is scheduled...", - "ANALYZING_PHOTOS": "Indexing photos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indexing people in {{indexStatus.nSyncedFiles,number}} photos...", - "INDEXING_DONE": "Indexed {{indexStatus.nSyncedFiles,number}} photos", - "UNIDENTIFIED_FACES": "unidentified faces", - "OBJECTS": "objects", - "TEXT": "text", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "File name", - "CAPTION_PLACEHOLDER": "Add a description", - "LOCATION": "Location", - "SHOW_ON_MAP": "View on OpenStreetMap", - "MAP": "Map", - "MAP_SETTINGS": "Map Settings", - "ENABLE_MAPS": "Enable Maps?", - "ENABLE_MAP": "Enable map", - "DISABLE_MAPS": "Disable Maps?", - "ENABLE_MAP_DESCRIPTION": "

This will show your photos on a world map.

The map is hosted by OpenStreetMap, and the exact locations of your photos are never shared.

You can disable this feature anytime from Settings.

", - "DISABLE_MAP_DESCRIPTION": "

This will disable the display of your photos on a world map.

You can enable this feature anytime from Settings.

", - "DISABLE_MAP": "Disable map", - "DETAILS": "Details", - "VIEW_EXIF": "View all EXIF data", - "NO_EXIF": "No EXIF data", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Two-factor", - "TWO_FACTOR_AUTHENTICATION": "Two-factor authentication", - "TWO_FACTOR_QR_INSTRUCTION": "Scan the QR code below with your favorite authenticator app", - "ENTER_CODE_MANUALLY": "Enter the code manually", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Please enter this code in your favorite authenticator app", - "SCAN_QR_CODE": "Scan QR code instead", - "ENABLE_TWO_FACTOR": "Enable two-factor", - "ENABLE": "Enable", - "LOST_DEVICE": "Lost two-factor device", - "INCORRECT_CODE": "Incorrect code", - "TWO_FACTOR_INFO": "Add an additional layer of security by requiring more than your email and password to log in to your account", - "DISABLE_TWO_FACTOR_LABEL": "Disable two-factor authentication", - "UPDATE_TWO_FACTOR_LABEL": "Update your authenticator device", - "DISABLE": "Disable", - "RECONFIGURE": "Reconfigure", - "UPDATE_TWO_FACTOR": "Update two-factor", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuing forward will void any previously configured authenticators", - "UPDATE": "Update", - "DISABLE_TWO_FACTOR": "Disable two-factor", - "DISABLE_TWO_FACTOR_MESSAGE": "Are you sure you want to disable your two-factor authentication", - "TWO_FACTOR_DISABLE_FAILED": "Failed to disable two factor, please try again", - "EXPORT_DATA": "Export data", - "SELECT_FOLDER": "Select folder", - "DESTINATION": "Destination", - "START": "Start", - "LAST_EXPORT_TIME": "Last export time", - "EXPORT_AGAIN": "Resync", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Local storage not accessible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Your browser or an addon is blocking ente from saving data into local storage. please try loading this page after switching your browsing mode.", - "SEND_OTT": "Send OTP", - "EMAIl_ALREADY_OWNED": "Email already taken", - "ETAGS_BLOCKED": "

We were unable to upload the following files because of your browser configuration.

Please disable any addons that might be preventing ente from using eTags to upload large files, or use our desktop app for a more reliable import experience.

", - "SKIPPED_VIDEOS_INFO": "

Presently we do not support adding videos via public links.

To share videos, please signup for ente and share with the intended recipients using their email.

", - "LIVE_PHOTOS_DETECTED": "The photo and video files from your Live Photos have been merged into a single file", - "RETRY_FAILED": "Retry failed uploads", - "FAILED_UPLOADS": "Failed uploads ", - "SKIPPED_FILES": "Ignored uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generation failed", - "UNSUPPORTED_FILES": "Unsupported files", - "SUCCESSFUL_UPLOADS": "Successful uploads", - "SKIPPED_INFO": "Skipped these as there are files with matching names in the same album", - "UNSUPPORTED_INFO": "ente does not support these file formats yet", - "BLOCKED_UPLOADS": "Blocked uploads", - "SKIPPED_VIDEOS": "Skipped videos", - "INPROGRESS_METADATA_EXTRACTION": "In progress", - "INPROGRESS_UPLOADS": "Uploads in progress", - "TOO_LARGE_UPLOADS": "Large files", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Insufficient storage", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "These files were not uploaded as they exceed the maximum size limit for your storage plan", - "TOO_LARGE_INFO": "These files were not uploaded as they exceed our maximum file size limit", - "THUMBNAIL_GENERATION_FAILED_INFO": "These files were uploaded, but unfortunately we could not generate the thumbnails for them.", - "UPLOAD_TO_COLLECTION": "Upload to album", - "UNCATEGORIZED": "Uncategorized", - "ARCHIVE": "Archive", - "FAVORITES": "Favorites", - "ARCHIVE_COLLECTION": "Archive album", - "ARCHIVE_SECTION_NAME": "Archive", - "ALL_SECTION_NAME": "All", - "MOVE_TO_COLLECTION": "Move to album", - "UNARCHIVE": "Unarchive", - "UNARCHIVE_COLLECTION": "Unarchive album", - "HIDE_COLLECTION": "Hide album", - "UNHIDE_COLLECTION": "Unhide album", - "MOVE": "Move", - "ADD": "Add", - "REMOVE": "Remove", - "YES_REMOVE": "Yes, remove", - "REMOVE_FROM_COLLECTION": "Remove from album", - "TRASH": "Trash", - "MOVE_TO_TRASH": "Move to trash", - "TRASH_FILES_MESSAGE": "Selected files will be removed from all albums and moved to trash.", - "TRASH_FILE_MESSAGE": "The file will be removed from all albums and moved to trash.", - "DELETE_PERMANENTLY": "Delete permanently", - "RESTORE": "Restore", - "RESTORE_TO_COLLECTION": "Restore to album", - "EMPTY_TRASH": "Empty trash", - "EMPTY_TRASH_TITLE": "Empty trash?", - "EMPTY_TRASH_MESSAGE": "These files will be permanently deleted from your ente account.", - "LEAVE_SHARED_ALBUM": "Yes, leave", - "LEAVE_ALBUM": "Leave album", - "LEAVE_SHARED_ALBUM_TITLE": "Leave shared album?", - "LEAVE_SHARED_ALBUM_MESSAGE": "You will leave the album, and it will stop being visible to you.", - "NOT_FILE_OWNER": "You cannot delete files in a shared album", - "CONFIRM_SELF_REMOVE_MESSAGE": "Selected items will be removed from this album. Items which are only in this album will be moved to Uncategorized.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Some of the items you are removing were added by other people, and you will lose access to them.", - "SORT_BY_CREATION_TIME_ASCENDING": "Oldest", - "SORT_BY_UPDATION_TIME_DESCENDING": "Last updated", - "SORT_BY_NAME": "Name", - "COMPRESS_THUMBNAILS": "Compress thumbnails", - "THUMBNAIL_REPLACED": "Thumbnails compressed", - "FIX_THUMBNAIL": "Compress", - "FIX_THUMBNAIL_LATER": "Compress later", - "REPLACE_THUMBNAIL_NOT_STARTED": "Some of your videos thumbnails can be compressed to save space. would you like ente to compress them?", - "REPLACE_THUMBNAIL_COMPLETED": "Successfully compressed all thumbnails", - "REPLACE_THUMBNAIL_NOOP": "You have no thumbnails that can be compressed further", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Could not compress some of your thumbnails, please retry", - "FIX_CREATION_TIME": "Fix time", - "FIX_CREATION_TIME_IN_PROGRESS": "Fixing time", - "CREATION_TIME_UPDATED": "File time updated", - "UPDATE_CREATION_TIME_NOT_STARTED": "Select the option you want to use", - "UPDATE_CREATION_TIME_COMPLETED": "Successfully updated all files", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "File time updation failed for some files, please retry", - "CAPTION_CHARACTER_LIMIT": "5000 characters max", - "DATE_TIME_ORIGINAL": "EXIF:DateTimeOriginal", - "DATE_TIME_DIGITIZED": "EXIF:DateTimeDigitized", - "METADATA_DATE": "EXIF:MetadataDate", - "CUSTOM_TIME": "Custom time", - "REOPEN_PLAN_SELECTOR_MODAL": "Re-open plans", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Failed to open plans", - "INSTALL": "Install", - "SHARING_DETAILS": "Sharing details", - "MODIFY_SHARING": "Modify sharing", - "ADD_COLLABORATORS": "Add collaborators", - "ADD_NEW_EMAIL": "Add a new email", - "shared_with_people_zero": "Share with specific people", - "shared_with_people_one": "Shared with 1 person", - "shared_with_people_other": "Shared with {{count, number}} people", - "participants_zero": "No participants", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", - "ADD_VIEWERS": "Add viewers", - "PARTICIPANTS": "Participants", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} will not be able to add more photos to the album

They will still be able to remove photos added by them

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} will be able to add photos to the album", - "CONVERT_TO_VIEWER": "Yes, convert to viewer", - "CONVERT_TO_COLLABORATOR": "Yes, convert to collaborator", - "CHANGE_PERMISSION": "Change permission?", - "REMOVE_PARTICIPANT": "Remove?", - "CONFIRM_REMOVE": "Yes, remove", - "MANAGE": "Manage", - "ADDED_AS": "Added as", - "COLLABORATOR_RIGHTS": "Collaborators can add photos and videos to the shared album", - "REMOVE_PARTICIPANT_HEAD": "Remove participant", - "OWNER": "Owner", - "COLLABORATORS": "Collaborators", - "ADD_MORE": "Add more", - "VIEWERS": "Viewers", - "OR_ADD_EXISTING": "Or pick an existing one", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} will be removed from the album

Any photos added by them will also be removed from the album

", - "NOT_FOUND": "404 - not found", - "LINK_EXPIRED": "Link expired", - "LINK_EXPIRED_MESSAGE": "This link has either expired or been disabled!", - "MANAGE_LINK": "Manage link", - "LINK_TOO_MANY_REQUESTS": "Sorry, this album has been viewed on too many devices!", - "FILE_DOWNLOAD": "Allow downloads", - "LINK_PASSWORD_LOCK": "Password lock", - "PUBLIC_COLLECT": "Allow adding photos", - "LINK_DEVICE_LIMIT": "Device limit", - "NO_DEVICE_LIMIT": "None", - "LINK_EXPIRY": "Link expiry", - "NEVER": "Never", - "DISABLE_FILE_DOWNLOAD": "Disable download", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Are you sure that you want to disable the download button for files?

Viewers can still take screenshots or save a copy of your photos using external tools.

", - "MALICIOUS_CONTENT": "Contains malicious content", - "COPYRIGHT": "Infringes on the copyright of someone I am authorized to represent", - "SHARED_USING": "Shared using ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Use code {{referralCode}} to get 10 GB free", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Disable password lock", - "DISABLE_PASSWORD_MESSAGE": "Are you sure that you want to disable the password lock?", - "PASSWORD_LOCK": "Password lock", - "LOCK": "Lock", - "DOWNLOAD_UPLOAD_LOGS": "Debug logs", - "UPLOAD_FILES": "File", - "UPLOAD_DIRS": "Folder", - "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", - "DEDUPLICATE_FILES": "Deduplicate files", - "AUTHENTICATOR_SECTION": "Authenticator", - "NO_DUPLICATES_FOUND": "You've no duplicate files that can be cleared", - "CLUB_BY_CAPTURE_TIME": "Club by capture time", - "FILES": "Files", - "EACH": "Each", - "DEDUPLICATE_BASED_ON_SIZE": "The following files were clubbed based on their sizes, please review and delete items you believe are duplicates", - "STOP_ALL_UPLOADS_MESSAGE": "Are you sure that you want to stop all the uploads in progress?", - "STOP_UPLOADS_HEADER": "Stop uploads?", - "YES_STOP_UPLOADS": "Yes, stop uploads", - "STOP_DOWNLOADS_HEADER": "Stop downloads?", - "YES_STOP_DOWNLOADS": "Yes, stop downloads", - "STOP_ALL_DOWNLOADS_MESSAGE": "Are you sure that you want to stop all the downloads in progress?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", - "ALL_ALBUMS": "All Albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "All hidden albums", - "HIDDEN_ALBUMS": "Hidden albums", - "HIDDEN_ITEMS": "Hidden items", - "HIDDEN_ITEMS_SECTION_NAME": "Hidden_items", - "ENTER_TWO_FACTOR_OTP": "Enter the 6-digit code from your authenticator app.", - "CREATE_ACCOUNT": "Create account", - "COPIED": "Copied", - "CANVAS_BLOCKED_TITLE": "Unable to generate thumbnail", - "CANVAS_BLOCKED_MESSAGE": "

It looks like your browser has disabled access to canvas, which is necessary to generate thumbnails for your photos

Please enable access to your browser's canvas, or check out our desktop app

", - "WATCH_FOLDERS": "Watch folders", - "UPGRADE_NOW": "Upgrade now", - "RENEW_NOW": "Renew now", - "STORAGE": "Storage", - "USED": "used", - "YOU": "You", - "FAMILY": "Family", - "FREE": "free", - "OF": "of", - "WATCHED_FOLDERS": "Watched folders", - "NO_FOLDERS_ADDED": "No folders added yet!", - "FOLDERS_AUTOMATICALLY_MONITORED": "The folders you add here will monitored to automatically", - "UPLOAD_NEW_FILES_TO_ENTE": "Upload new files to ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Remove deleted files from ente", - "ADD_FOLDER": "Add folder", - "STOP_WATCHING": "Stop watching", - "STOP_WATCHING_FOLDER": "Stop watching folder?", - "STOP_WATCHING_DIALOG_MESSAGE": "Your existing files will not be deleted, but ente will stop automatically updating the linked ente album on changes in this folder.", - "YES_STOP": "Yes, stop", - "MONTH_SHORT": "mo", - "YEAR": "year", - "FAMILY_PLAN": "Family plan", - "DOWNLOAD_LOGS": "Download logs", - "DOWNLOAD_LOGS_MESSAGE": "

This will download debug logs, which you can email to us to help debug your issue.

Please note that file names will be included to help track issues with specific files.

", - "CHANGE_FOLDER": "Change Folder", - "TWO_MONTHS_FREE": "Get 2 months free on yearly plans", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continue with free trial", - "FREE_PLAN_DESCRIPTION": "1 GB for 1 year", - "CURRENT_USAGE": "Current usage is {{usage}}", - "WEAK_DEVICE": "The web browser you're using is not powerful enough to encrypt your photos. Please try to log in to ente on your computer, or download the ente mobile/desktop app.", - "DRAG_AND_DROP_HINT": "Or drag and drop into the ente window", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Your uploaded data will be scheduled for deletion, and your account will be permanently deleted.

This action is not reversible.", - "AUTHENTICATE": "Authenticate", - "UPLOADED_TO_SINGLE_COLLECTION": "Uploaded to single collection", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Uploaded to separate collections", - "NEVERMIND": "Nevermind", - "UPDATE_AVAILABLE": "Update available", - "UPDATE_INSTALLABLE_MESSAGE": "A new version of ente is ready to be installed.", - "INSTALL_NOW": "Install now", - "INSTALL_ON_NEXT_LAUNCH": "Install on next launch", - "UPDATE_AVAILABLE_MESSAGE": "A new version of ente has been released, but it cannot be automatically downloaded and installed.", - "DOWNLOAD_AND_INSTALL": "Download and install", - "IGNORE_THIS_VERSION": "Ignore this version", - "TODAY": "Today", - "YESTERDAY": "Yesterday", - "NAME_PLACEHOLDER": "Name...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Cannot create albums from file/folder mix", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

You have dragged and dropped a mixture of files and folders.

Please provide either only files, or only folders when selecting option to create separate albums

", - "CHOSE_THEME": "Choose theme", - "ML_SEARCH": "Face recognition", - "ENABLE_ML_SEARCH_DESCRIPTION": "

This will enable on-device machine learning and face search which will start analyzing your uploaded photos locally.

For the first run after login or enabling this feature, it will download all images on local device to analyze them. So please only enable this if you are ok with bandwidth and local processing of all images in your photo library.

If this is the first time you're enabling this, we'll also ask your permission to process face data.

", - "ML_MORE_DETAILS": "More details", - "ENABLE_FACE_SEARCH": "Enable face recognition", - "ENABLE_FACE_SEARCH_TITLE": "Enable face recognition?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face recognition, ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", - "DISABLE_BETA": "Pause recognition", - "DISABLE_FACE_SEARCH": "Disable face recognition", - "DISABLE_FACE_SEARCH_TITLE": "Disable face recognition?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

Ente will stop processing face geometry.

You can reenable face recognition again if you wish, so this operation is safe.

", - "ADVANCED": "Advanced", - "FACE_SEARCH_CONFIRMATION": "I understand, and wish to allow ente to process face geometry", - "LABS": "Labs", - "YOURS": "yours", - "PASSPHRASE_STRENGTH_WEAK": "Password strength: Weak", - "PASSPHRASE_STRENGTH_MODERATE": "Password strength: Moderate", - "PASSPHRASE_STRENGTH_STRONG": "Password strength: Strong", - "PREFERENCES": "Preferences", - "LANGUAGE": "Language", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Invalid export directory", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

The export directory you have selected does not exist.

Please select a valid directory.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Subscription verification failed", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "after an hour", - "DAY": "after a day", - "WEEK": "after a week", - "MONTH": "after a month", - "YEAR": "after a year" - }, - "COPY_LINK": "Copy link", - "DONE": "Done", - "LINK_SHARE_TITLE": "Or share a link", - "REMOVE_LINK": "Remove link", - "CREATE_PUBLIC_SHARING": "Create public link", - "PUBLIC_LINK_CREATED": "Public link created", - "PUBLIC_LINK_ENABLED": "Public link enabled", - "COLLECT_PHOTOS": "Collect photos", - "PUBLIC_COLLECT_SUBTEXT": "Allow people with the link to also add photos to the shared album.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success, number}} / {{progress.total, number}} items synced", - "MIGRATING_EXPORT": "Preparing...", - "RENAMING_COLLECTION_FOLDERS": "Renaming album folders...", - "TRASHING_DELETED_FILES": "Trashing deleted files...", - "TRASHING_DELETED_COLLECTIONS": "Trashing deleted albums...", - "EXPORT_NOTIFICATION": { - "START": "Export started", - "IN_PROGRESS": "Export already in progress", - "FINISH": "Export finished", - "UP_TO_DATE": "No new files to export" - }, - "CONTINUOUS_EXPORT": "Sync continuously", - "TOTAL_ITEMS": "Total items", - "PENDING_ITEMS": "Pending items", - "EXPORT_STARTING": "Export starting...", - "DELETE_ACCOUNT_REASON_LABEL": "What is the main reason you are deleting your account?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Select a reason", - "DELETE_REASON": { - "MISSING_FEATURE": "It's missing a key feature that I need", - "BROKEN_BEHAVIOR": "The app or a certain feature does not behave as I think it should", - "FOUND_ANOTHER_SERVICE": "I found another service that I like better", - "NOT_LISTED": "My reason isn't listed" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "We are sorry to see you go. Please explain why you are leaving to help us improve.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Feedback", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Yes, I want to permanently delete this account and all its data", - "CONFIRM_DELETE_ACCOUNT": "Confirm Account Deletion", - "FEEDBACK_REQUIRED": "Kindly help us with this information", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "What does the other service do better?", - "RECOVER_TWO_FACTOR": "Recover two-factor", - "at": "at", - "AUTH_NEXT": "next", - "AUTH_DOWNLOAD_MOBILE_APP": "Download our mobile app to manage your secrets", - "HIDDEN": "Hidden", - "HIDE": "Hide", - "UNHIDE": "Unhide", - "UNHIDE_TO_COLLECTION": "Unhide to album", - "SORT_BY": "Sort by", - "NEWEST_FIRST": "Newest first", - "OLDEST_FIRST": "Oldest first", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "This file could not be previewed. Click here to download the original.", - "SELECT_COLLECTION": "Select album", - "PIN_ALBUM": "Pin album", - "UNPIN_ALBUM": "Unpin album", - "DOWNLOAD_COMPLETE": "Download complete", - "DOWNLOADING_COLLECTION": "Downloading {{name}}", - "DOWNLOAD_FAILED": "Download failed", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} files", - "CHRISTMAS": "Christmas", - "CHRISTMAS_EVE": "Christmas Eve", - "NEW_YEAR": "New Year", - "NEW_YEAR_EVE": "New Year's Eve", - "IMAGE": "Image", - "VIDEO": "Video", - "LIVE_PHOTO": "Live Photo", - "CONVERT": "Convert", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Are you sure you want to close the editor?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Download your edited image or save a copy to ente to persist your changes.", - "BRIGHTNESS": "Brightness", - "CONTRAST": "Contrast", - "SATURATION": "Saturation", - "BLUR": "Blur", - "INVERT_COLORS": "Invert Colors", - "ASPECT_RATIO": "Aspect Ratio", - "SQUARE": "Square", - "ROTATE_LEFT": "Rotate Left", - "ROTATE_RIGHT": "Rotate Right", - "FLIP_VERTICALLY": "Flip Vertically", - "FLIP_HORIZONTALLY": "Flip Horizontally", - "DOWNLOAD_EDITED": "Download Edited", - "SAVE_A_COPY_TO_ENTE": "Save a copy to ente", - "RESTORE_ORIGINAL": "Restore Original", - "TRANSFORM": "Transform", - "COLORS": "Colors", - "FLIP": "Flip", - "ROTATION": "Rotation", - "RESET": "Reset", - "PHOTO_EDITOR": "Photo Editor", - "FASTER_UPLOAD": "Faster uploads", - "FASTER_UPLOAD_DESCRIPTION": "Route uploads through nearby servers", - "MAGIC_SEARCH_STATUS": "Magic Search Status", - "INDEXED_ITEMS": "Indexed items", - "CAST_ALBUM_TO_TV": "Play album on TV", - "ENTER_CAST_PIN_CODE": "Enter the code you see on the TV below to pair this device.", - "PAIR_DEVICE_TO_TV": "Pair devices", - "TV_NOT_FOUND": "TV not found. Did you enter the PIN correctly?", - "AUTO_CAST_PAIR": "Auto Pair", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "Auto Pair requires connecting to Google servers and only works with Chromecast supported devices. Google will not receive sensitive data, such as your photos.", - "PAIR_WITH_PIN": "Pair with PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Choose a cast-compatible device from the browser popup.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "Pair with PIN works for any large screen device you want to play your album on.", - "VISIT_CAST_ENTE_IO": "Visit cast.ente.io on the device you want to pair.", - "CAST_AUTO_PAIR_FAILED": "Chromecast Auto Pair failed. Please try again.", - "CACHE_DIRECTORY": "Cache folder", - "FREEHAND": "Freehand", - "APPLY_CROP": "Apply Crop", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "At least one transformation or color adjustment must be performed before saving.", - "PASSKEYS": "Passkeys", - "DELETE_PASSKEY": "Delete passkey", - "DELETE_PASSKEY_CONFIRMATION": "Are you sure you want to delete this passkey? This action is irreversible.", - "RENAME_PASSKEY": "Rename passkey", - "ADD_PASSKEY": "Add passkey", - "ENTER_PASSKEY_NAME": "Enter passkey name", - "PASSKEYS_DESCRIPTION": "Passkeys are a modern and secure second-factor for your Ente account. They use on-device biometric authentication for convenience and security.", - "CREATED_AT": "Created at", - "PASSKEY_LOGIN_FAILED": "Passkey login failed", - "PASSKEY_LOGIN_URL_INVALID": "The login URL is invalid.", - "PASSKEY_LOGIN_ERRORED": "An error occurred while logging in with passkey.", - "TRY_AGAIN": "Try again", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "Follow the steps from your browser to continue logging in.", - "LOGIN_WITH_PASSKEY": "Login with passkey" -} diff --git a/web/apps/auth/public/locales/es-ES/translation.json b/web/apps/auth/public/locales/es-ES/translation.json deleted file mode 100644 index a29165e4e..000000000 --- a/web/apps/auth/public/locales/es-ES/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Copias de seguridad privadas
para su recuerdos
", - "HERO_SLIDE_1": "Encriptado de extremo a extremo por defecto", - "HERO_SLIDE_2_TITLE": "
Almacenado de forma segura
en un refugio de llenos
", - "HERO_SLIDE_2": "Diseñado para superar", - "HERO_SLIDE_3_TITLE": "
Disponible
en todas partes
", - "HERO_SLIDE_3": "Android, iOS, web, computadora", - "LOGIN": "Conectar", - "SIGN_UP": "Registro", - "NEW_USER": "Nuevo en ente", - "EXISTING_USER": "Usuario existente", - "ENTER_NAME": "Introducir nombre", - "PUBLIC_UPLOADER_NAME_MESSAGE": "¡Añade un nombre para que tus amigos sepan a quién dar las gracias por estas fotos geniales!", - "ENTER_EMAIL": "Introducir email", - "EMAIL_ERROR": "Introduce un email válido", - "REQUIRED": "Requerido", - "EMAIL_SENT": "Código de verificación enviado al {{email}}", - "CHECK_INBOX": "Revisa tu bandeja de entrada (y spam) para completar la verificación", - "ENTER_OTT": "Código de verificación", - "RESEND_MAIL": "Reenviar el código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Se produjo un error. Por favor, inténtalo de nuevo", - "INVALID_CODE": "Código de verificación inválido", - "EXPIRED_CODE": "Código de verificación expirado", - "SENDING": "Enviando...", - "SENT": "Enviado!", - "PASSWORD": "Contraseña", - "LINK_PASSWORD": "Introducir contraseña para desbloquear el álbum", - "RETURN_PASSPHRASE_HINT": "Contraseña", - "SET_PASSPHRASE": "Definir contraseña", - "VERIFY_PASSPHRASE": "Ingresar", - "INCORRECT_PASSPHRASE": "Contraseña incorrecta", - "ENTER_ENC_PASSPHRASE": "Introducir una contraseña que podamos usar para cifrar sus datos", - "PASSPHRASE_DISCLAIMER": "No guardamos su contraseña, así que si la olvida, no podremos ayudarte a recuperar tus datos sin una clave de recuperación.", - "WELCOME_TO_ENTE_HEADING": "Bienvenido a ", - "WELCOME_TO_ENTE_SUBHEADING": "Almacenamiento y compartición de fotos cifradas de extremo a extremo", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Donde vivan su mejores fotos", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generando claves de encriptación...", - "PASSPHRASE_HINT": "Contraseña", - "CONFIRM_PASSPHRASE": "Confirmar contraseña", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Las contraseñas no coinciden", - "CREATE_COLLECTION": "Nuevo álbum", - "ENTER_ALBUM_NAME": "Nombre del álbum", - "CLOSE_OPTION": "Cerrar (Esc)", - "ENTER_FILE_NAME": "Nombre del archivo", - "CLOSE": "Cerrar", - "NO": "No", - "NOTHING_HERE": "Nada para ver aquí aún 👀", - "UPLOAD": "Cargar", - "IMPORT": "Importar", - "ADD_PHOTOS": "Añadir fotos", - "ADD_MORE_PHOTOS": "Añadir más fotos", - "add_photos_one": "Añadir 1 foto", - "add_photos_other": "Añadir {{count}} fotos", - "SELECT_PHOTOS": "Seleccionar fotos", - "FILE_UPLOAD": "Subir archivo", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparando la subida", - "1": "Leyendo archivos de metadatos de google", - "2": "{{uploadCounter.finished}} / {{uploadCounter.total}} archivos metadatos extraídos", - "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} archivos metadatos extraídos", - "4": "Cancelar subidas restantes", - "5": "Copia de seguridad completa" - }, - "FILE_NOT_UPLOADED_LIST": "Los siguientes archivos no se han subido", - "SUBSCRIPTION_EXPIRED": "Suscripción caducada", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Tu suscripción ha caducado, por favor renuévala", - "STORAGE_QUOTA_EXCEEDED": "Límite de datos excedido", - "INITIAL_LOAD_DELAY_WARNING": "La primera carga puede tomar algún tiempo", - "USER_DOES_NOT_EXIST": "Lo sentimos, no se pudo encontrar un usuario con ese email", - "NO_ACCOUNT": "No tienes una cuenta", - "ACCOUNT_EXISTS": "Ya tienes una cuenta", - "CREATE": "Crear", - "DOWNLOAD": "Descargar", - "DOWNLOAD_OPTION": "Descargar (D)", - "DOWNLOAD_FAVORITES": "Descargar favoritos", - "DOWNLOAD_UNCATEGORIZED": "Descargar no categorizados", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "Copiar como PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Alternar pantalla completa (F)", - "ZOOM_IN_OUT": "Acercar/alejar", - "PREVIOUS": "Anterior (←)", - "NEXT": "Siguiente (→)", - "TITLE_PHOTOS": "ente Fotos", - "TITLE_ALBUMS": "ente Fotos", - "TITLE_AUTH": "ente Auth", - "UPLOAD_FIRST_PHOTO": "Carga tu primer archivo", - "IMPORT_YOUR_FOLDERS": "Importar tus carpetas", - "UPLOAD_DROPZONE_MESSAGE": "Soltar para respaldar tus archivos", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Soltar para añadir carpeta vigilada", - "TRASH_FILES_TITLE": "Eliminar archivos?", - "TRASH_FILE_TITLE": "Eliminar archivo?", - "DELETE_FILES_TITLE": "Eliminar inmediatamente?", - "DELETE_FILES_MESSAGE": "Los archivos seleccionados serán eliminados permanentemente de tu cuenta ente.", - "DELETE": "Eliminar", - "DELETE_OPTION": "Eliminar (DEL)", - "FAVORITE_OPTION": "Favorito (L)", - "UNFAVORITE_OPTION": "No favorito (L)", - "MULTI_FOLDER_UPLOAD": "Múltiples carpetas detectadas", - "UPLOAD_STRATEGY_CHOICE": "Quieres subirlos a", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un solo álbum", - "OR": "o", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Separar álbumes", - "SESSION_EXPIRED_MESSAGE": "Tu sesión ha caducado. Inicia sesión de nuevo para continuar", - "SESSION_EXPIRED": "Sesión caducado", - "PASSWORD_GENERATION_FAILED": "Su navegador no ha podido generar una clave fuerte que cumpla con los estándares de cifrado de la entidad, por favor intente usar la aplicación móvil u otro navegador", - "CHANGE_PASSWORD": "Cambiar contraseña", - "GO_BACK": "Retroceder", - "RECOVERY_KEY": "Clave de recuperación", - "SAVE_LATER": "Hacer más tarde", - "SAVE": "Guardar Clave", - "RECOVERY_KEY_DESCRIPTION": "Si olvida su contraseña, la única forma de recuperar sus datos es con esta clave.", - "RECOVER_KEY_GENERATION_FAILED": "El código de recuperación no pudo ser generado, por favor inténtalo de nuevo", - "KEY_NOT_STORED_DISCLAIMER": "No almacenamos esta clave, así que por favor guarde esto en un lugar seguro", - "FORGOT_PASSWORD": "Contraseña olvidada", - "RECOVER_ACCOUNT": "Recuperar cuenta", - "RECOVERY_KEY_HINT": "Clave de recuperación", - "RECOVER": "Recuperar", - "NO_RECOVERY_KEY": "No hay clave de recuperación?", - "INCORRECT_RECOVERY_KEY": "Clave de recuperación incorrecta", - "SORRY": "Lo sentimos", - "NO_RECOVERY_KEY_MESSAGE": "Debido a la naturaleza de nuestro protocolo de cifrado de extremo a extremo, sus datos no pueden ser descifrados sin su contraseña o clave de recuperación", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Por favor, envíe un email a {{emailID}} desde su dirección de correo electrónico registrada", - "CONTACT_SUPPORT": "Contacta con soporte", - "REQUEST_FEATURE": "Solicitar una función", - "SUPPORT": "Soporte", - "CONFIRM": "Confirmar", - "CANCEL": "Cancelar", - "LOGOUT": "Cerrar sesión", - "DELETE_ACCOUNT": "Eliminar cuenta", - "DELETE_ACCOUNT_MESSAGE": "

Por favor, envíe un email a {{emailID}} desde su dirección de correo electrónico registrada

Su solicitud será procesada en 72 horas.

", - "LOGOUT_MESSAGE": "Seguro que quiere cerrar la sesión?", - "CHANGE_EMAIL": "Cambiar email", - "OK": "OK", - "SUCCESS": "Completado", - "ERROR": "Error", - "MESSAGE": "Mensaje", - "INSTALL_MOBILE_APP": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos", - "DOWNLOAD_APP_MESSAGE": "Lo sentimos, esta operación sólo es compatible con nuestra aplicación de computadora", - "DOWNLOAD_APP": "Descargar aplicación de computadora", - "EXPORT": "Exportar datos", - "SUBSCRIPTION": "Suscripción", - "SUBSCRIBE": "Suscribir", - "MANAGEMENT_PORTAL": "Gestionar métodos de pago", - "MANAGE_FAMILY_PORTAL": "Administrar familia", - "LEAVE_FAMILY_PLAN": "Dejar plan familiar", - "LEAVE": "Dejar", - "LEAVE_FAMILY_CONFIRM": "Está seguro de que desea abandonar el plan familiar?", - "CHOOSE_PLAN": "Elije tu plan", - "MANAGE_PLAN": "Administra tu suscripción", - "ACTIVE": "Activo", - "OFFLINE_MSG": "Estás desconectado, se están mostrando recuerdos en caché", - "FREE_SUBSCRIPTION_INFO": "Estás en el plan gratis que expira el {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Estás en un plan familiar administrado por", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Se renueva en {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina el {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Tu suscripción será cancelada el {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Ha excedido su cuota de almacenamiento, por favor actualice", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Hemos recibido tu pago

¡Tu suscripción es válida hasta {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Tu compra ha sido cancelada, por favor inténtalo de nuevo si quieres suscribirte", - "SUBSCRIPTION_PURCHASE_FAILED": "Compra de suscripción fallida, por favor inténtalo de nuevo", - "SUBSCRIPTION_UPDATE_FAILED": "Suscripción actualizada falló, inténtelo de nuevo", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Lo sentimos, el pago falló cuando intentamos cargar a su tarjeta, por favor actualice su método de pago y vuelva a intentarlo", - "STRIPE_AUTHENTICATION_FAILED": "No podemos autenticar tu método de pago. Por favor, elige un método de pago diferente e inténtalo de nuevo", - "UPDATE_PAYMENT_METHOD": "Actualizar medio de pago", - "MONTHLY": "Mensual", - "YEARLY": "Anual", - "UPDATE_SUBSCRIPTION_MESSAGE": "Seguro de que desea cambiar su plan?", - "UPDATE_SUBSCRIPTION": "Cambiar de plan", - "CANCEL_SUBSCRIPTION": "Cancelar suscripción", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Todos tus datos serán eliminados de nuestros servidores al final de este periodo de facturación.

¿Está seguro de que desea cancelar su suscripción?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "No se pudo cancelar la suscripción", - "SUBSCRIPTION_CANCEL_SUCCESS": "Suscripción cancelada correctamente", - "REACTIVATE_SUBSCRIPTION": "Reactivar la suscripción", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Una vez reactivado, serás facturado el {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Suscripción activada correctamente ", - "SUBSCRIPTION_ACTIVATE_FAILED": "No se pudo reactivar las renovaciones de suscripción", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Gracias", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancelar suscripción a móviles", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Por favor, cancele su suscripción de la aplicación móvil para activar una suscripción aquí", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Por favor, contáctenos en {{emailID}} para gestionar su suscripción", - "RENAME": "Renombrar", - "RENAME_FILE": "Renombrar archivo", - "RENAME_COLLECTION": "Renombrar álbum", - "DELETE_COLLECTION_TITLE": "Eliminar álbum?", - "DELETE_COLLECTION": "Eliminar álbum", - "DELETE_COLLECTION_MESSAGE": "También eliminar las fotos (y los vídeos) presentes en este álbum de todos álbumes de los que forman parte?", - "DELETE_PHOTOS": "Eliminar fotos", - "KEEP_PHOTOS": "Conservar fotos", - "SHARE": "Compartir", - "SHARE_COLLECTION": "Compartir álbum", - "SHAREES": "Compartido con", - "SHARE_WITH_SELF": "Uy, no puedes compartir contigo mismo", - "ALREADY_SHARED": "Uy, ya estás compartiendo esto con {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Compartir álbum no permitido", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Compartir está desactivado para cuentas gratis", - "DOWNLOAD_COLLECTION": "Descargar álbum", - "DOWNLOAD_COLLECTION_MESSAGE": "

¿Está seguro de que desea descargar el álbum completo?

Todos los archivos se pondrán en cola para su descarga secuencialmente

", - "CREATE_ALBUM_FAILED": "Error al crear el álbum, inténtalo de nuevo", - "SEARCH": "Buscar", - "SEARCH_RESULTS": "Buscar resultados", - "NO_RESULTS": "No se han encontrado resultados", - "SEARCH_HINT": "Buscar álbumes, fechas...", - "SEARCH_TYPE": { - "COLLECTION": "Álbum", - "LOCATION": "Localización", - "CITY": "", - "DATE": "Fecha", - "FILE_NAME": "Nombre del archivo", - "THING": "Contenido", - "FILE_CAPTION": "Descripción", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "No hay recuerdos", - "photos_count_one": "1 recuerdo", - "photos_count_other": "{{count}} recuerdos", - "TERMS_AND_CONDITIONS": "Acepto los términos y política de privacidad", - "ADD_TO_COLLECTION": "Añadir al álbum", - "SELECTED": "seleccionado", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Este vídeo no se puede reproducir en tu navegador", - "PEOPLE": "Personajes", - "INDEXING_SCHEDULED": "el indexado está programado...", - "ANALYZING_PHOTOS": "analizando nuevas fotos {{indexStatus.nSyncedFiles}} de {{indexStatus.nTotalFiles}} hecho)...", - "INDEXING_PEOPLE": "indexando personas en {{indexStatus.nSyncedFiles}} fotos... ", - "INDEXING_DONE": "fotos {{indexStatus.nSyncedFiles}} indexadas", - "UNIDENTIFIED_FACES": "caras no identificadas", - "OBJECTS": "objetos", - "TEXT": "texto", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Nombre del archivo", - "CAPTION_PLACEHOLDER": "Añadir una descripción", - "LOCATION": "Localización", - "SHOW_ON_MAP": "Ver en OpenStreetMap", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "Detalles", - "VIEW_EXIF": "Ver todos los datos de EXIF", - "NO_EXIF": "No hay datos EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Dos factores", - "TWO_FACTOR_AUTHENTICATION": "Autenticación de dos factores", - "TWO_FACTOR_QR_INSTRUCTION": "Escanea el código QR de abajo con tu aplicación de autenticación favorita", - "ENTER_CODE_MANUALLY": "Ingrese el código manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Por favor, introduce este código en tu aplicación de autenticación favorita", - "SCAN_QR_CODE": "Escanear código QR en su lugar", - "ENABLE_TWO_FACTOR": "Activar dos factores", - "ENABLE": "Activar", - "LOST_DEVICE": "Perdido el dispositivo de doble factor", - "INCORRECT_CODE": "Código incorrecto", - "TWO_FACTOR_INFO": "Añade una capa adicional de seguridad al requerir más de tu email y contraseña para iniciar sesión en tu cuenta", - "DISABLE_TWO_FACTOR_LABEL": "Deshabilitar la autenticación de dos factores", - "UPDATE_TWO_FACTOR_LABEL": "Actualice su dispositivo de autenticación", - "DISABLE": "Desactivar", - "RECONFIGURE": "Reconfigurar", - "UPDATE_TWO_FACTOR": "Actualizar doble factor", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuar adelante anulará los autenticadores previamente configurados", - "UPDATE": "Actualizar", - "DISABLE_TWO_FACTOR": "Desactivar doble factor", - "DISABLE_TWO_FACTOR_MESSAGE": "¿Estás seguro de que desea deshabilitar la autenticación de doble factor?", - "TWO_FACTOR_DISABLE_FAILED": "Error al desactivar dos factores, inténtalo de nuevo", - "EXPORT_DATA": "Exportar datos", - "SELECT_FOLDER": "Seleccionar carpeta", - "DESTINATION": "Destinación", - "START": "Inicio", - "LAST_EXPORT_TIME": "Fecha de la última exportación", - "EXPORT_AGAIN": "Resinc", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Almacenamiento local inaccesible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Su navegador o un addon está bloqueando a ente de guardar datos en almacenamiento local. Por favor, intente cargar esta página después de cambiar su modo de navegación.", - "SEND_OTT": "Enviar OTP", - "EMAIl_ALREADY_OWNED": "Email ya tomado", - "ETAGS_BLOCKED": "

No hemos podido subir los siguientes archivos debido a la configuración de tu navegador.

Por favor, deshabilite cualquier complemento que pueda estar impidiendo que ente utilice eTags para subir archivos grandes, o utilice nuestra aplicación de escritorio para una experiencia de importación más fiable.

", - "SKIPPED_VIDEOS_INFO": "

Actualmente no podemos añadir vídeos a través de enlaces públicos.

Para compartir vídeos, por favor regístrate en ente y comparte con los destinatarios a través de su correo electrónico.

", - "LIVE_PHOTOS_DETECTED": "Los archivos de foto y vídeo de tus fotos en vivo se han fusionado en un solo archivo", - "RETRY_FAILED": "Reintentar subidas fallidas", - "FAILED_UPLOADS": "Subidas fallidas ", - "SKIPPED_FILES": "Subidas ignoradas", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Generación de miniaturas fallida", - "UNSUPPORTED_FILES": "Archivos no soportados", - "SUCCESSFUL_UPLOADS": "Subidas exitosas", - "SKIPPED_INFO": "Se han omitido ya que hay archivos con nombres coincidentes en el mismo álbum", - "UNSUPPORTED_INFO": "ente no soporta estos formatos de archivo aún", - "BLOCKED_UPLOADS": "Subidas bloqueadas", - "SKIPPED_VIDEOS": "Vídeos saltados", - "INPROGRESS_METADATA_EXTRACTION": "En proceso", - "INPROGRESS_UPLOADS": "Subidas en progreso", - "TOO_LARGE_UPLOADS": "Archivos grandes", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Espacio insuficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Estos archivos no se han subido porque exceden el límite de tamaño máximo para tu plan de almacenamiento", - "TOO_LARGE_INFO": "Estos archivos no se han subido porque exceden nuestro límite máximo de tamaño de archivo", - "THUMBNAIL_GENERATION_FAILED_INFO": "Estos archivos fueron cargados, pero por desgracia no pudimos generar las miniaturas para ellos.", - "UPLOAD_TO_COLLECTION": "Subir al álbum", - "UNCATEGORIZED": "No clasificado", - "ARCHIVE": "Archivo", - "FAVORITES": "Favoritos", - "ARCHIVE_COLLECTION": "Archivo álbum", - "ARCHIVE_SECTION_NAME": "Archivo", - "ALL_SECTION_NAME": "Todo", - "MOVE_TO_COLLECTION": "Mover al álbum", - "UNARCHIVE": "Desarchivar", - "UNARCHIVE_COLLECTION": "Desarchivar álbum", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "Mover", - "ADD": "Añadir", - "REMOVE": "Eliminar", - "YES_REMOVE": "Sí, eliminar", - "REMOVE_FROM_COLLECTION": "Eliminar del álbum", - "TRASH": "Papelera", - "MOVE_TO_TRASH": "Mover a la papelera", - "TRASH_FILES_MESSAGE": "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera.", - "TRASH_FILE_MESSAGE": "El archivo será eliminado de todos los álbumes y movido a la papelera.", - "DELETE_PERMANENTLY": "Eliminar para siempre", - "RESTORE": "Restaurar", - "RESTORE_TO_COLLECTION": "Restaurar al álbum", - "EMPTY_TRASH": "Vaciar papelera", - "EMPTY_TRASH_TITLE": "Vaciar papelera?", - "EMPTY_TRASH_MESSAGE": "Estos archivos serán eliminados permanentemente de su cuenta ente.", - "LEAVE_SHARED_ALBUM": "Sí, dejar", - "LEAVE_ALBUM": "Dejar álbum", - "LEAVE_SHARED_ALBUM_TITLE": "¿Dejar álbum compartido?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Dejará el álbum, y dejará de ser visible para usted.", - "NOT_FILE_OWNER": "No puedes eliminar archivos de un álbum compartido", - "CONFIRM_SELF_REMOVE_MESSAGE": "Los elementos seleccionados serán eliminados de este álbum. Los elementos que estén sólo en este álbum serán movidos a Sin categorizar.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Algunos de los elementos que estás eliminando fueron añadidos por otras personas, y perderás el acceso a ellos.", - "SORT_BY_CREATION_TIME_ASCENDING": "Antiguo", - "SORT_BY_UPDATION_TIME_DESCENDING": "Última actualización", - "SORT_BY_NAME": "Nombre", - "COMPRESS_THUMBNAILS": "Comprimir las miniaturas", - "THUMBNAIL_REPLACED": "Miniaturas comprimidas", - "FIX_THUMBNAIL": "Comprimir", - "FIX_THUMBNAIL_LATER": "Comprimir más tarde", - "REPLACE_THUMBNAIL_NOT_STARTED": "Algunas de tus miniaturas de vídeos pueden ser comprimidas para ahorrar espacio. ¿Te gustaría que ente las comprima?", - "REPLACE_THUMBNAIL_COMPLETED": "Todas las miniaturas se comprimieron con éxito", - "REPLACE_THUMBNAIL_NOOP": "No tienes miniaturas que se puedan comprimir más", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "No se pudieron comprimir algunas de tus miniaturas, por favor inténtalo de nuevo", - "FIX_CREATION_TIME": "Fijar hora", - "FIX_CREATION_TIME_IN_PROGRESS": "Fijar hora", - "CREATION_TIME_UPDATED": "Hora del archivo actualizada", - "UPDATE_CREATION_TIME_NOT_STARTED": "Seleccione la cartera que desea utilizar", - "UPDATE_CREATION_TIME_COMPLETED": "Todos los archivos se han actualizado correctamente", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "Fallo en la hora del archivo para algunos archivos, por favor inténtelo de nuevo", - "CAPTION_CHARACTER_LIMIT": "Máximo 5000 caracteres", - "DATE_TIME_ORIGINAL": "EXIF: Fecha original", - "DATE_TIME_DIGITIZED": "EXIF: Fecha Digitalizado", - "METADATA_DATE": "", - "CUSTOM_TIME": "Hora personalizada", - "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planes", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Error al abrir los planes", - "INSTALL": "Instalar", - "SHARING_DETAILS": "Compartir detalles", - "MODIFY_SHARING": "Modificar compartir", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "Propietario", - "COLLABORATORS": "Colaboradores", - "ADD_MORE": "Añadir más", - "VIEWERS": "", - "OR_ADD_EXISTING": "O elige uno existente", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - No Encontrado", - "LINK_EXPIRED": "Enlace expirado", - "LINK_EXPIRED_MESSAGE": "Este enlace ha caducado o ha sido desactivado!", - "MANAGE_LINK": "Administrar enlace", - "LINK_TOO_MANY_REQUESTS": "Este álbum es demasiado popular para que podamos manejarlo!", - "FILE_DOWNLOAD": "Permitir descargas", - "LINK_PASSWORD_LOCK": "Contraseña bloqueada", - "PUBLIC_COLLECT": "Permitir añadir fotos", - "LINK_DEVICE_LIMIT": "Límites del dispositivo", - "NO_DEVICE_LIMIT": "Ninguno", - "LINK_EXPIRY": "Enlace vencio", - "NEVER": "Nunca", - "DISABLE_FILE_DOWNLOAD": "Deshabilitar descarga", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

¿Está seguro que desea desactivar el botón de descarga de archivos?

Los visualizadores todavía pueden tomar capturas de pantalla o guardar una copia de sus fotos usando herramientas externas.

", - "MALICIOUS_CONTENT": "Contiene contenido malicioso", - "COPYRIGHT": "Infracciones sobre los derechos de autor de alguien que estoy autorizado a representar", - "SHARED_USING": "Compartido usando ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Usa el código {{referralCode}} para obtener 10 GB gratis", - "LIVE": "VIVO", - "DISABLE_PASSWORD": "Desactivar contraseña", - "DISABLE_PASSWORD_MESSAGE": "Seguro que quieres cambiar la contrasena?", - "PASSWORD_LOCK": "Contraseña bloqueada", - "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuración", - "UPLOAD_FILES": "Archivo", - "UPLOAD_DIRS": "Carpeta", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Deduplicar archivos", - "AUTHENTICATOR_SECTION": "Autenticación", - "NO_DUPLICATES_FOUND": "No tienes archivos duplicados que puedan ser borrados", - "CLUB_BY_CAPTURE_TIME": "Club por tiempo de captura", - "FILES": "Archivos", - "EACH": "Cada", - "DEDUPLICATE_BASED_ON_SIZE": "Los siguientes archivos fueron organizados en base a sus tamaños, por favor revise y elimine elementos que cree que son duplicados", - "STOP_ALL_UPLOADS_MESSAGE": "¿Está seguro que desea detener todas las subidas en curso?", - "STOP_UPLOADS_HEADER": "Detener las subidas?", - "YES_STOP_UPLOADS": "Sí, detener las subidas", - "STOP_DOWNLOADS_HEADER": "¿Detener las descargas?", - "YES_STOP_DOWNLOADS": "Sí, detener las descargas", - "STOP_ALL_DOWNLOADS_MESSAGE": "¿Estás seguro de que quieres detener todas las descargas en curso?", - "albums_one": "1 álbum", - "albums_other": "{{count}} álbumes", - "ALL_ALBUMS": "Todos los álbumes", - "ALBUMS": "Álbumes", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "Ingrese el código de seis dígitos de su aplicación de autenticación a continuación.", - "CREATE_ACCOUNT": "Crear cuenta", - "COPIED": "Copiado", - "CANVAS_BLOCKED_TITLE": "No se puede generar la miniatura", - "CANVAS_BLOCKED_MESSAGE": "

Parece que su navegador ha deshabilitado el acceso al lienzo, que es necesario para generar miniaturas para tus fotos

Por favor, activa el acceso al lienzo de tu navegador, o revisa nuestra aplicación de escritorio

", - "WATCH_FOLDERS": "Ver carpetas", - "UPGRADE_NOW": "Mejorar ahora", - "RENEW_NOW": "Renovar ahora", - "STORAGE": "Almacén", - "USED": "usado", - "YOU": "Usted", - "FAMILY": "Familia", - "FREE": "gratis", - "OF": "de", - "WATCHED_FOLDERS": "Ver carpetas", - "NO_FOLDERS_ADDED": "No hay carpetas añadidas!", - "FOLDERS_AUTOMATICALLY_MONITORED": "Las carpetas que añadas aquí serán supervisadas automáticamente", - "UPLOAD_NEW_FILES_TO_ENTE": "Subir nuevos archivos a ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Eliminar archivos borrados de ente", - "ADD_FOLDER": "Añadir carpeta", - "STOP_WATCHING": "Dejar de ver", - "STOP_WATCHING_FOLDER": "Dejar de ver carpeta?", - "STOP_WATCHING_DIALOG_MESSAGE": "Tus archivos existentes no serán eliminados, pero ente dejará de actualizar automáticamente el álbum enlazado en caso de cambios en esta carpeta.", - "YES_STOP": "Sí, detener", - "MONTH_SHORT": "mes", - "YEAR": "año", - "FAMILY_PLAN": "Plan familiar", - "DOWNLOAD_LOGS": "Descargar logs", - "DOWNLOAD_LOGS_MESSAGE": "

Esto descargará los registros de depuración, que puede enviarnos por correo electrónico para ayudarnos a depurar su problema.

Tenga en cuenta que los nombres de los archivos se incluirán para ayudar al seguimiento de problemas con archivos específicos.

", - "CHANGE_FOLDER": "Cambiar carpeta", - "TWO_MONTHS_FREE": "Obtén 2 meses gratis en planes anuales", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continuar con el plan gratuito", - "FREE_PLAN_DESCRIPTION": "1 GB por 1 año", - "CURRENT_USAGE": "El uso actual es {{usage}}", - "WEAK_DEVICE": "El navegador web que está utilizando no es lo suficientemente poderoso para cifrar sus fotos. Por favor, intente iniciar sesión en ente en su computadora, o descargue la aplicación ente para móvil/escritorio.", - "DRAG_AND_DROP_HINT": "O arrastre y suelte en la ventana ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Los datos subidos se eliminarán y su cuenta se eliminará de forma permanente.

Esta acción no es reversible.", - "AUTHENTICATE": "Autenticado", - "UPLOADED_TO_SINGLE_COLLECTION": "Subir a una sola colección", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Subir a colecciones separadas", - "NEVERMIND": "No importa", - "UPDATE_AVAILABLE": "Actualizacion disponible", - "UPDATE_INSTALLABLE_MESSAGE": "Una nueva versión de ente está lista para ser instalada.", - "INSTALL_NOW": "Instalar ahora", - "INSTALL_ON_NEXT_LAUNCH": "Instalar en el próximo lanzamiento", - "UPDATE_AVAILABLE_MESSAGE": "Una nueva versión de ente ha sido lanzada, pero no se puede descargar e instalar automáticamente.", - "DOWNLOAD_AND_INSTALL": "Descargar e instalar", - "IGNORE_THIS_VERSION": "Ignorar esta versión", - "TODAY": "Hoy", - "YESTERDAY": "Ayer", - "NAME_PLACEHOLDER": "Nombre...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "No se puede crear álbumes de mezcla de archivos/carpetas", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Has arrastrado y soltado una mezcla de archivos y carpetas.

Por favor proporcione sólo archivos o carpetas cuando seleccione la opción de crear álbumes separados

", - "CHOSE_THEME": "Elegir tema", - "ML_SEARCH": "Buscar ML (beta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Esto permitirá el aprendizaje automático en el dispositivo y la búsqueda facial que comenzará a analizar las fotos subidas localmente.

Para la primera ejecución después de iniciar sesión o habilitar esta función, se descargarán todas las imágenes en el dispositivo local para analizarlas. Así que por favor actívalo sólo si dispones ancho de banda y el almacenamiento suficiente para el procesamiento local de todas las imágenes en tu biblioteca de fotos.

Si esta es la primera vez que está habilitando, también le pediremos su permiso para procesar los datos faciales.

", - "ML_MORE_DETAILS": "Más detalles", - "ENABLE_FACE_SEARCH": "Activar búsqueda facial", - "ENABLE_FACE_SEARCH_TITLE": "Activar búsqueda facial?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Si activas la búsqueda facial, ente extraerá la geometría facial de tus fotos. Esto sucederá en su dispositivo y cualquier dato biométrico generado será cifrado de extremo a extremo.

Haga clic aquí para obtener más detalles sobre esta característica en nuestra política de privacidad

", - "DISABLE_BETA": "Desactivar beta", - "DISABLE_FACE_SEARCH": "Desactivar búsqueda facial", - "DISABLE_FACE_SEARCH_TITLE": "Desactivar búsqueda facial?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente dejará de procesar la geometría facial, y también desactivará la búsqueda ML (beta)

Puede volver a activar la búsqueda facial si lo desea, ya que esta operación es segura.

", - "ADVANCED": "Avanzado", - "FACE_SEARCH_CONFIRMATION": "Comprendo y deseo permitir que ente procese la geometría de la cara", - "LABS": "Labs", - "YOURS": "tuyo", - "PASSPHRASE_STRENGTH_WEAK": "Fortaleza de la contraseña: débil", - "PASSPHRASE_STRENGTH_MODERATE": "Fortaleza de contraseña: Moderar", - "PASSPHRASE_STRENGTH_STRONG": "Fortaleza de contraseña: fuerte", - "PREFERENCES": "Preferencias", - "LANGUAGE": "Idioma", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Archivo de exportación inválido", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

El directorio de exportación seleccionado no existe.

Por favor, seleccione un directorio válido.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Falló la verificación de la suscripción", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "después de una hora", - "DAY": "después de un día", - "WEEK": "después de una semana", - "MONTH": "después de un mes", - "YEAR": "después de un año" - }, - "COPY_LINK": "Copiar enlace", - "DONE": "Hecho", - "LINK_SHARE_TITLE": "O comparte un enlace", - "REMOVE_LINK": "Eliminar enlace", - "CREATE_PUBLIC_SHARING": "Crear un enlace público", - "PUBLIC_LINK_CREATED": "Enlace público creado", - "PUBLIC_LINK_ENABLED": "Enlace público activado", - "COLLECT_PHOTOS": "Obtener fotos", - "PUBLIC_COLLECT_SUBTEXT": "Permitir a las personas con el enlace añadir fotos al álbum compartido.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} archivos exportados", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "Exportar iniciando", - "IN_PROGRESS": "Exportación ya en curso", - "FINISH": "Exportación finalizada", - "UP_TO_DATE": "No hay nuevos archivos para exportar" - }, - "CONTINUOUS_EXPORT": "Sincronizar continuamente", - "TOTAL_ITEMS": "Total de elementos", - "PENDING_ITEMS": "Elementos pendientes", - "EXPORT_STARTING": "Exportar iniciando...", - "DELETE_ACCOUNT_REASON_LABEL": "¿Cuál es la razón principal por la que eliminas tu cuenta?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Selecciona una razón", - "DELETE_REASON": { - "MISSING_FEATURE": "Falta una característica clave que necesito", - "BROKEN_BEHAVIOR": "La aplicación o una característica determinada no se comporta como creo que debería", - "FOUND_ANOTHER_SERVICE": "He encontrado otro servicio que me gusta más", - "NOT_LISTED": "Mi motivo no se encuentra en la lista" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Lamentamos que te vayas. Explica por qué te vas para ayudarnos a mejorar.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Sugerencias", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Sí, quiero eliminar permanentemente esta cuenta y todos sus datos", - "CONFIRM_DELETE_ACCOUNT": "Corfirmar borrado de cuenta", - "FEEDBACK_REQUIRED": "Ayúdanos con esta información", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Qué hace mejor el otro servicio?", - "RECOVER_TWO_FACTOR": "Recuperar dos factores", - "at": "a las", - "AUTH_NEXT": "siguiente", - "AUTH_DOWNLOAD_MOBILE_APP": "Descarga nuestra aplicación móvil para administrar tus secretos", - "HIDDEN": "", - "HIDE": "Ocultar", - "UNHIDE": "Mostrar", - "UNHIDE_TO_COLLECTION": "Hacer visible al álbum", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "Video", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "Transformar", - "COLORS": "Colores", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/fa-IR/translation.json b/web/apps/auth/public/locales/fa-IR/translation.json deleted file mode 100644 index 2d21fcb3d..000000000 --- a/web/apps/auth/public/locales/fa-IR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "به خوش آمدید", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/fr-FR/translation.json b/web/apps/auth/public/locales/fr-FR/translation.json deleted file mode 100644 index 43d959069..000000000 --- a/web/apps/auth/public/locales/fr-FR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Sauvegardes privées
pour vos souvenirs
", - "HERO_SLIDE_1": "Chiffrement de bout en bout par défaut", - "HERO_SLIDE_2_TITLE": "
Sécurisé
dans un abri antiatomique
", - "HERO_SLIDE_2": "Conçu pour survivre", - "HERO_SLIDE_3_TITLE": "
Disponible
en tout lieu
", - "HERO_SLIDE_3": "Android, iOS, Web, Ordinateur", - "LOGIN": "Connexion", - "SIGN_UP": "Inscription", - "NEW_USER": "Nouveau sur ente", - "EXISTING_USER": "Utilisateur existant", - "ENTER_NAME": "Saisir un nom", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Ajouter un nom afin que vos amis sachent qui remercier pour ces magnifiques photos!", - "ENTER_EMAIL": "Saisir l'adresse e-mail", - "EMAIL_ERROR": "Saisir un e-mail valide", - "REQUIRED": "Nécessaire", - "EMAIL_SENT": "Code de vérification envoyé à
{{email}}", - "CHECK_INBOX": "Veuillez consulter votre boite de réception (et indésirables) pour poursuivre la vérification", - "ENTER_OTT": "Code de vérification", - "RESEND_MAIL": "Renvoyer le code", - "VERIFY": "Vérifier", - "UNKNOWN_ERROR": "Quelque chose s'est mal passé, veuillez recommencer", - "INVALID_CODE": "Code de vérification non valide", - "EXPIRED_CODE": "Votre code de vérification a expiré", - "SENDING": "Envoi...", - "SENT": "Envoyé!", - "PASSWORD": "Mot de passe", - "LINK_PASSWORD": "Saisir le mot de passe pour déverrouiller l'album", - "RETURN_PASSPHRASE_HINT": "Mot de passe", - "SET_PASSPHRASE": "Définir le mot de passe", - "VERIFY_PASSPHRASE": "Connexion", - "INCORRECT_PASSPHRASE": "Mot de passe non valide", - "ENTER_ENC_PASSPHRASE": "Veuillez saisir un mot de passe que nous pourrons utiliser pour chiffrer vos données", - "PASSPHRASE_DISCLAIMER": "Nous ne stockons pas votre mot de passe, donc si vous le perdez, nous ne pourrons pas vous aider à récupérer vos données sans une clé de récupération.", - "WELCOME_TO_ENTE_HEADING": "Bienvenue sur ", - "WELCOME_TO_ENTE_SUBHEADING": "Stockage et partage photo avec cryptage de bout en bout", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Là où vivent vos meilleures photos", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Génération des clés de chiffrement...", - "PASSPHRASE_HINT": "Mot de passe", - "CONFIRM_PASSPHRASE": "Confirmer le mot de passe", - "REFERRAL_CODE_HINT": "Comment avez-vous entendu parler de Ente? (facultatif)", - "REFERRAL_INFO": "Nous ne suivons pas les installations d'applications. Il serait utile que vous nous disiez comment vous nous avez trouvés !", - "PASSPHRASE_MATCH_ERROR": "Les mots de passe ne correspondent pas", - "CREATE_COLLECTION": "Nouvel album", - "ENTER_ALBUM_NAME": "Nom de l'album", - "CLOSE_OPTION": "Fermer (Échap)", - "ENTER_FILE_NAME": "Nom du fichier", - "CLOSE": "Fermer", - "NO": "Non", - "NOTHING_HERE": "Il n'y a encore rien à voir ici 👀", - "UPLOAD": "Charger", - "IMPORT": "Importer", - "ADD_PHOTOS": "Ajouter des photos", - "ADD_MORE_PHOTOS": "Ajouter plus de photos", - "add_photos_one": "Ajouter une photo", - "add_photos_other": "Ajouter {{count}} photos", - "SELECT_PHOTOS": "Sélectionner des photos", - "FILE_UPLOAD": "Fichier chargé", - "UPLOAD_STAGE_MESSAGE": { - "0": "Préparation du chargement", - "1": "Lecture des fichiers de métadonnées de Google", - "2": "Métadonnées des fichiers {{uploadCounter.finished}} / {{uploadCounter.total}} extraites", - "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} fichiers sauvegardés", - "4": "Annulation des chargements restants", - "5": "Sauvegarde terminée" - }, - "FILE_NOT_UPLOADED_LIST": "Les fichiers suivants n'ont pas été chargés", - "SUBSCRIPTION_EXPIRED": "Abonnement expiré", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Votre abonnement a expiré, veuillez le renouveler ", - "STORAGE_QUOTA_EXCEEDED": "Limite de stockage atteinte", - "INITIAL_LOAD_DELAY_WARNING": "La première consultation peut prendre du temps", - "USER_DOES_NOT_EXIST": "Désolé, impossible de trouver un utilisateur avec cet e-mail", - "NO_ACCOUNT": "Je n'ai pas de compte", - "ACCOUNT_EXISTS": "J'ai déjà un compte", - "CREATE": "Créer", - "DOWNLOAD": "Télécharger", - "DOWNLOAD_OPTION": "Télécharger (D)", - "DOWNLOAD_FAVORITES": "Télécharger les favoris", - "DOWNLOAD_UNCATEGORIZED": "Télécharger les hors catégories", - "DOWNLOAD_HIDDEN_ITEMS": "Télécharger les fichiers masqués", - "COPY_OPTION": "Copier en PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Plein écran (F)", - "ZOOM_IN_OUT": "Zoom +/-", - "PREVIOUS": "Précédent (←)", - "NEXT": "Suivant (→)", - "TITLE_PHOTOS": "Ente Photos", - "TITLE_ALBUMS": "Ente Photos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Chargez votre 1ere photo", - "IMPORT_YOUR_FOLDERS": "Importez vos dossiers", - "UPLOAD_DROPZONE_MESSAGE": "Déposez pour sauvegarder vos fichiers", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Déposez pour ajouter un dossier surveillé", - "TRASH_FILES_TITLE": "Supprimer les fichiers ?", - "TRASH_FILE_TITLE": "Supprimer le fichier ?", - "DELETE_FILES_TITLE": "Supprimer immédiatement?", - "DELETE_FILES_MESSAGE": "Les fichiers sélectionnés seront définitivement supprimés de votre compte ente.", - "DELETE": "Supprimer", - "DELETE_OPTION": "Supprimer (DEL)", - "FAVORITE_OPTION": "Favori (L)", - "UNFAVORITE_OPTION": "Non favori (L)", - "MULTI_FOLDER_UPLOAD": "Plusieurs dossiers détectés", - "UPLOAD_STRATEGY_CHOICE": "Voulez-vous les charger dans", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un seul album", - "OR": "ou", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Albums séparés", - "SESSION_EXPIRED_MESSAGE": "Votre session a expiré, veuillez vous reconnecter pour poursuivre", - "SESSION_EXPIRED": "Session expiré", - "PASSWORD_GENERATION_FAILED": "Votre navigateur ne permet pas de générer une clé forte correspondant aux standards de chiffrement de ente, veuillez réessayer en utilisant l'appli mobile ou un autre navigateur", - "CHANGE_PASSWORD": "Modifier le mot de passe", - "GO_BACK": "Retour", - "RECOVERY_KEY": "Clé de récupération", - "SAVE_LATER": "Plus tard", - "SAVE": "Sauvegarder la clé", - "RECOVERY_KEY_DESCRIPTION": "Si vous oubliez votre mot de passe, la seule façon de récupérer vos données sera grâce à cette clé.", - "RECOVER_KEY_GENERATION_FAILED": "Le code de récupération ne peut être généré, veuillez réessayer", - "KEY_NOT_STORED_DISCLAIMER": "Nous ne stockons pas cette clé, veuillez donc la sauvegarder dans un endroit sûr", - "FORGOT_PASSWORD": "Mot de passe oublié", - "RECOVER_ACCOUNT": "Récupérer le compte", - "RECOVERY_KEY_HINT": "Clé de récupération", - "RECOVER": "Récupérer", - "NO_RECOVERY_KEY": "Pas de clé de récupération?", - "INCORRECT_RECOVERY_KEY": "Clé de récupération non valide", - "SORRY": "Désolé", - "NO_RECOVERY_KEY_MESSAGE": "En raison de notre protocole de chiffrement de bout en bout, vos données ne peuvent être décryptées sans votre mot de passe ou clé de récupération", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Veuillez envoyer un e-mail à {{emailID}} depuis votre adresse enregistrée", - "CONTACT_SUPPORT": "Contacter le support", - "REQUEST_FEATURE": "Soumettre une idée", - "SUPPORT": "Support", - "CONFIRM": "Confirmer", - "CANCEL": "Annuler", - "LOGOUT": "Déconnexion", - "DELETE_ACCOUNT": "Supprimer le compte", - "DELETE_ACCOUNT_MESSAGE": "

Veuillez envoyer un e-mail à {{emailID}}depuis Votre adresse enregistrée.

Votre demande sera traitée dans les 72 heures.

", - "LOGOUT_MESSAGE": "Voulez-vous vraiment vous déconnecter?", - "CHANGE_EMAIL": "Modifier l'e-mail", - "OK": "Ok", - "SUCCESS": "Parfait", - "ERROR": "Erreur", - "MESSAGE": "Message", - "INSTALL_MOBILE_APP": "Installez notre application Android or iOS pour sauvegarder automatiquement toutes vos photos", - "DOWNLOAD_APP_MESSAGE": "Désolé, cette opération est actuellement supportée uniquement sur notre appli pour ordinateur", - "DOWNLOAD_APP": "Télécharger l'appli pour ordinateur", - "EXPORT": "Exporter des données", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "S'abonner", - "MANAGEMENT_PORTAL": "Gérer le mode de paiement", - "MANAGE_FAMILY_PORTAL": "Gérer la famille", - "LEAVE_FAMILY_PLAN": "Quitter le plan famille", - "LEAVE": "Quitter", - "LEAVE_FAMILY_CONFIRM": "Êtes-vous certains de vouloir quitter le plan famille?", - "CHOOSE_PLAN": "Choisir votre plan", - "MANAGE_PLAN": "Gérer votre abonnement", - "ACTIVE": "Actif", - "OFFLINE_MSG": "Vous êtes hors-ligne, les mémoires cache sont affichées", - "FREE_SUBSCRIPTION_INFO": "Vous êtes sur le plan gratuit qui expire le {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Vous êtes sur le plan famille géré par", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renouveler le {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Pris fin le {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Votre abonnement sera annulé le {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Votre module {{storage, string}} est valable jusqu'au {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Vous avez dépassé votre quota de stockage, veuillez mettre à niveau ", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Nous avons reçu votre paiement

Votre abonnement est valide jusqu'au {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Votre achat est annulé, veuillez réessayer si vous souhaitez vous abonner", - "SUBSCRIPTION_PURCHASE_FAILED": "Échec lors de l'achat de l'abonnement, veuillez réessayer", - "SUBSCRIPTION_UPDATE_FAILED": "Échec lors de la mise à niveau de l'abonnement, veuillez réessayer", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Désolé, échec de paiement lors de la saisie de votre carte, veuillez mettr eà jour votre moyen de paiement et réessayer", - "STRIPE_AUTHENTICATION_FAILED": "Nous n'avons pas pu authentifier votre moyen de paiement. Veuillez choisir un moyen différent et réessayer", - "UPDATE_PAYMENT_METHOD": "Mise à jour du moyen de paiement", - "MONTHLY": "Mensuel", - "YEARLY": "Annuel", - "UPDATE_SUBSCRIPTION_MESSAGE": "Êtes-vous certains de vouloir changer de plan?", - "UPDATE_SUBSCRIPTION": "Changer de plan", - "CANCEL_SUBSCRIPTION": "Annuler l'abonnement", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Toutes vos données seront supprimées de nos serveurs à la fin de cette période d'abonnement.

Voulez-vous vraiment annuler votre abonnement?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "Êtes-vous sûr de vouloir annuler votre abonnement ", - "SUBSCRIPTION_CANCEL_FAILED": "Échec lors de l'annulation de l'abonnement", - "SUBSCRIPTION_CANCEL_SUCCESS": "Votre abonnement a bien été annulé", - "REACTIVATE_SUBSCRIPTION": "Réactiver l'abonnement", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Une fois réactivée, vous serrez facturé de {{val, datetime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Votre abonnement est bien activé ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Échec lors de la réactivation de l'abonnement", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Merci", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Annuler l'abonnement mobile", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Veuillez annuler votre abonnement depuis l'appli mobile pour activer un abonnement ici", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Veuillez nous contacter à {{emailID}} pour gérer votre abonnement", - "RENAME": "Renommer", - "RENAME_FILE": "Renommer le fichier", - "RENAME_COLLECTION": "Renommer l'album", - "DELETE_COLLECTION_TITLE": "Supprimer l'album?", - "DELETE_COLLECTION": "Supprimer l'album", - "DELETE_COLLECTION_MESSAGE": "Supprimer aussi les photos (et vidéos) présentes dans cet album depuis tous les autres albums dont ils font partie?", - "DELETE_PHOTOS": "Supprimer des photos", - "KEEP_PHOTOS": "Conserver des photos", - "SHARE": "Partager", - "SHARE_COLLECTION": "Partager l'album", - "SHAREES": "Partager avec", - "SHARE_WITH_SELF": "Oups, vous ne pouvez pas partager avec vous-même", - "ALREADY_SHARED": "Oups, vous partager déjà cela avec {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Partage d'album non autorisé", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Le partage est désactivé pour les comptes gratuits", - "DOWNLOAD_COLLECTION": "Télécharger l'album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Êtes-vous certains de vouloir télécharger l'album complet?

Tous les fichiers seront mis en file d'attente pour un téléchargement fractionné

", - "CREATE_ALBUM_FAILED": "Échec de création de l'album , veuillez réessayer", - "SEARCH": "Recherche", - "SEARCH_RESULTS": "Résultats de la recherche", - "NO_RESULTS": "Aucun résultat trouvé", - "SEARCH_HINT": "Recherche d'albums, dates, descriptions, ...", - "SEARCH_TYPE": { - "COLLECTION": "l'album", - "LOCATION": "Emplacement", - "CITY": "Adresse", - "DATE": "Date", - "FILE_NAME": "Nom de fichier", - "THING": "Chose", - "FILE_CAPTION": "Description", - "FILE_TYPE": "Type de fichier", - "CLIP": "Magique" - }, - "photos_count_zero": "Pas de souvenirs", - "photos_count_one": "1 souvenir", - "photos_count_other": "{{count}} souvenirs", - "TERMS_AND_CONDITIONS": "J'accepte les conditions et la politique de confidentialité", - "ADD_TO_COLLECTION": "Ajouter à l'album", - "SELECTED": "Sélectionné", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Cette vidéo ne peut pas être lue sur votre navigateur", - "PEOPLE": "Visages", - "INDEXING_SCHEDULED": "L'indexation est planifiée...", - "ANALYZING_PHOTOS": "analyse des nouvelles photos {{indexStatus.nSyncedFiles}} sur {{indexStatus.nTotalFiles}} effectué)...", - "INDEXING_PEOPLE": "indexation des visages dans {{indexStatus.nSyncedFiles}} photos...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles}} photos indexées", - "UNIDENTIFIED_FACES": "visages non-identifiés", - "OBJECTS": "objets", - "TEXT": "texte", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Nom de fichier", - "CAPTION_PLACEHOLDER": "Ajouter une description", - "LOCATION": "Emplacement", - "SHOW_ON_MAP": "Visualiser sur OpenStreetMap", - "MAP": "Carte", - "MAP_SETTINGS": "Paramètres de la carte", - "ENABLE_MAPS": "Activer la carte?", - "ENABLE_MAP": "Activer la carte", - "DISABLE_MAPS": "Désactiver la carte?", - "ENABLE_MAP_DESCRIPTION": "

Cette fonction affiche vos photos sur une carte du monde.

La carte est hébergée par OpenStreetMap, et les emplacements exacts de vos photos ne sont jamais partagés.

Vous pouvez désactiver cette fonction à tout moment dans des paramètres.

", - "DISABLE_MAP_DESCRIPTION": "

Cette fonction désactive l'affichage de vos photos sur une carte du monde.

Vous pouvez activer cette fonction à tout moment dans les Paramètres.

", - "DISABLE_MAP": "Désactiver la carte", - "DETAILS": "Détails", - "VIEW_EXIF": "Visualiser toutes les données EXIF", - "NO_EXIF": "Aucune donnée EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Double authentification", - "TWO_FACTOR_AUTHENTICATION": "Authentification double-facteur", - "TWO_FACTOR_QR_INSTRUCTION": "Scannez le QRCode ci-dessous avec une appli d'authentification", - "ENTER_CODE_MANUALLY": "Saisir le code manuellement", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Veuillez saisir ce code dans votre appli d'authentification", - "SCAN_QR_CODE": "Scannez le QRCode de préférence", - "ENABLE_TWO_FACTOR": "Activer la double-authentification", - "ENABLE": "Activer", - "LOST_DEVICE": "Perte de l'appareil identificateur", - "INCORRECT_CODE": "Code non valide", - "TWO_FACTOR_INFO": "Rajoutez une couche de sécurité supplémentaire afin de pas utiliser simplement votre e-mail et mot de passe pour vous connecter à votre compte", - "DISABLE_TWO_FACTOR_LABEL": "Désactiver la double-authentification", - "UPDATE_TWO_FACTOR_LABEL": "Mise à jour de votre appareil identificateur", - "DISABLE": "Désactiver", - "RECONFIGURE": "Reconfigurer", - "UPDATE_TWO_FACTOR": "Mise à jour de la double-authentification", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuer annulera tous les identificateurs précédemment configurés", - "UPDATE": "Mise à jour", - "DISABLE_TWO_FACTOR": "Désactiver la double-authentification", - "DISABLE_TWO_FACTOR_MESSAGE": "Êtes-vous certains de vouloir désactiver la double-authentification", - "TWO_FACTOR_DISABLE_FAILED": "Échec de désactivation de la double-authentification, veuillez réessayer", - "EXPORT_DATA": "Exporter les données", - "SELECT_FOLDER": "Sélectionner un dossier", - "DESTINATION": "Destination", - "START": "Démarrer", - "LAST_EXPORT_TIME": "Horaire du dernier export", - "EXPORT_AGAIN": "Resynchro", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Stockage local non accessible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Votre navigateur ou un complément bloque ente qui ne peut sauvegarder les données sur votre stockage local. Veuillez relancer cette page après avoir changé de mode de navigation.", - "SEND_OTT": "Envoyer l'OTP", - "EMAIl_ALREADY_OWNED": "Cet e-mail est déjà pris", - "ETAGS_BLOCKED": "

Nosu n'avons pas pu charger les fichiers suivants à cause de la configuration de votre navigateur.

Veuillez désactiver tous les compléments qui pourraient empêcher ente d'utiliser les eTags pour charger de larges fichiers, ou bien utilisez notre appli pour ordinateurpour une meilleure expérience lors des chargements.

", - "SKIPPED_VIDEOS_INFO": "

Actuellement, nous ne supportons pas l'ajout de videos via des liens publics.

Pour partager des vidéos, veuillez vous connecter àente et partager en utilisant l'e-mail concerné.

", - "LIVE_PHOTOS_DETECTED": "Les fichiers photos et vidéos depuis votre espace Live Photos ont été fusionnés en un seul fichier", - "RETRY_FAILED": "Réessayer les chargements ayant échoués", - "FAILED_UPLOADS": "Chargements échoués ", - "SKIPPED_FILES": "Chargements ignorés", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Échec de création d'une miniature", - "UNSUPPORTED_FILES": "Fichiers non supportés", - "SUCCESSFUL_UPLOADS": "Chargements réussis", - "SKIPPED_INFO": "Ignorés car il y a des fichiers avec des noms identiques dans le même album", - "UNSUPPORTED_INFO": "ente ne supporte pas encore ces formats de fichiers", - "BLOCKED_UPLOADS": "Chargements bloqués", - "SKIPPED_VIDEOS": "Vidéos ignorées", - "INPROGRESS_METADATA_EXTRACTION": "En cours", - "INPROGRESS_UPLOADS": "Chargements en cours", - "TOO_LARGE_UPLOADS": "Gros fichiers", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Stockage insuffisant", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Ces fichiers n'ont pas été chargés car ils dépassent la taille maximale de votre plan de stockage", - "TOO_LARGE_INFO": "Ces fichiers n'ont pas été chargés car ils dépassent notre taille limite par fichier", - "THUMBNAIL_GENERATION_FAILED_INFO": "Ces fichiers sont bien chargés, mais nous ne pouvons pas créer de miniatures pour eux.", - "UPLOAD_TO_COLLECTION": "Charger dans l'album", - "UNCATEGORIZED": "Aucune catégorie", - "ARCHIVE": "Archiver", - "FAVORITES": "Favoris", - "ARCHIVE_COLLECTION": "Archiver l'album", - "ARCHIVE_SECTION_NAME": "Archivé", - "ALL_SECTION_NAME": "Tous", - "MOVE_TO_COLLECTION": "Déplacer vers l'album", - "UNARCHIVE": "Désarchiver", - "UNARCHIVE_COLLECTION": "Désarchiver l'album", - "HIDE_COLLECTION": "Masquer l'album", - "UNHIDE_COLLECTION": "Dévoiler l'album", - "MOVE": "Déplacer", - "ADD": "Ajouter", - "REMOVE": "Retirer", - "YES_REMOVE": "Oui, retirer", - "REMOVE_FROM_COLLECTION": "Retirer de l'album", - "TRASH": "Corbeille", - "MOVE_TO_TRASH": "Déplacer vers la corbeille", - "TRASH_FILES_MESSAGE": "Les fichiers sélectionnés seront retirés de tous les albums puis déplacés dans la corbeille.", - "TRASH_FILE_MESSAGE": "Le fichier sera retiré de tous les albums puis déplacé dans la corbeille.", - "DELETE_PERMANENTLY": "Supprimer définitivement", - "RESTORE": "Restaurer", - "RESTORE_TO_COLLECTION": "Restaurer vers l'album", - "EMPTY_TRASH": "Corbeille vide", - "EMPTY_TRASH_TITLE": "Vider la corbeille ?", - "EMPTY_TRASH_MESSAGE": "Ces fichiers seront définitivement supprimés de votre compte ente.", - "LEAVE_SHARED_ALBUM": "Oui, quitter", - "LEAVE_ALBUM": "Quitter l'album", - "LEAVE_SHARED_ALBUM_TITLE": "Quitter l'album partagé?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Vous allez quitter cet album, il ne sera plus visible pour vous.", - "NOT_FILE_OWNER": "Vous ne pouvez pas supprimer les fichiers d'un album partagé", - "CONFIRM_SELF_REMOVE_MESSAGE": "Choisir les objets qui seront retirés de cet album. Ceux qui sont présents uniquement dans cet album seront déplacés comme hors catégorie.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Certains des objets que vous êtes en train de retirer ont été ajoutés par d'autres personnes, vous perdrez l'accès vers ces objets.", - "SORT_BY_CREATION_TIME_ASCENDING": "Plus anciens", - "SORT_BY_UPDATION_TIME_DESCENDING": "Dernière mise à jour", - "SORT_BY_NAME": "Nom", - "COMPRESS_THUMBNAILS": "Compresser les miniatures", - "THUMBNAIL_REPLACED": "Les miniatures sont compressées", - "FIX_THUMBNAIL": "Compresser", - "FIX_THUMBNAIL_LATER": "Compresser plus tard", - "REPLACE_THUMBNAIL_NOT_STARTED": "Certaines miniatures de vidéos peuvent être compressées pour gagner de la place. Voulez-vous que ente les compresse?", - "REPLACE_THUMBNAIL_COMPLETED": "Toutes les miniatures ont été compressées", - "REPLACE_THUMBNAIL_NOOP": "Vous n'avez aucune miniature qui peut être encore plus compressée", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Impossible de compresser certaines miniatures, veuillez réessayer", - "FIX_CREATION_TIME": "Réajuster l'heure", - "FIX_CREATION_TIME_IN_PROGRESS": "Réajustement de l'heure", - "CREATION_TIME_UPDATED": "L'heure du fichier a été réajustée", - "UPDATE_CREATION_TIME_NOT_STARTED": "Sélectionnez l'option que vous souhaitez utiliser", - "UPDATE_CREATION_TIME_COMPLETED": "Mise à jour effectuée pour tous les fichiers", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "L'heure du fichier n'a pas été mise à jour pour certains fichiers, veuillez réessayer", - "CAPTION_CHARACTER_LIMIT": "5000 caractères max", - "DATE_TIME_ORIGINAL": "EXIF:DateTimeOriginal", - "DATE_TIME_DIGITIZED": "EXIF:DateTimeDigitized", - "METADATA_DATE": "EXIF:MetadataDate", - "CUSTOM_TIME": "Heure personnalisée", - "REOPEN_PLAN_SELECTOR_MODAL": "Rouvrir les plans", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Échec pour rouvrir les plans", - "INSTALL": "Installer", - "SHARING_DETAILS": "Détails du partage", - "MODIFY_SHARING": "Modifier le partage", - "ADD_COLLABORATORS": "Ajouter des collaborateurs", - "ADD_NEW_EMAIL": "Ajouter un nouvel email", - "shared_with_people_zero": "Partager avec des personnes spécifiques", - "shared_with_people_one": "Partagé avec 1 personne", - "shared_with_people_other": "Partagé avec {{count, number}} personnes", - "participants_zero": "Aucun participant", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", - "ADD_VIEWERS": "Ajouter un observateur", - "PARTICIPANTS": "Participants", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} ne pourra plus ajouter de photos à l'album

Il pourra toujours supprimer les photos qu'il a ajoutées

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} pourra ajouter des photos à l'album", - "CONVERT_TO_VIEWER": "Oui, convertir en observateur", - "CONVERT_TO_COLLABORATOR": "Oui, convertir en collaborateur", - "CHANGE_PERMISSION": "Modifier la permission?", - "REMOVE_PARTICIPANT": "Retirer?", - "CONFIRM_REMOVE": "Oui, supprimer", - "MANAGE": "Gérer", - "ADDED_AS": "Ajouté comme", - "COLLABORATOR_RIGHTS": "Les collaborateurs peuvent ajouter des photos et des vidéos à l'album partagé", - "REMOVE_PARTICIPANT_HEAD": "Supprimer le participant", - "OWNER": "Propriétaire", - "COLLABORATORS": "Collaborateurs", - "ADD_MORE": "Ajouter plus", - "VIEWERS": "Visionneurs", - "OR_ADD_EXISTING": "ou sélectionner un fichier existant", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} sera supprimé de l'album

Toutes les photos ajoutées par cette personne seront également supprimées de l'album

", - "NOT_FOUND": "404 - non trouvé", - "LINK_EXPIRED": "Lien expiré", - "LINK_EXPIRED_MESSAGE": "Ce lien à soit expiré soit est supprimé!", - "MANAGE_LINK": "Gérer le lien", - "LINK_TOO_MANY_REQUESTS": "Désolé, cet album a été consulté sur trop d'appareils !", - "FILE_DOWNLOAD": "Autoriser les téléchargements", - "LINK_PASSWORD_LOCK": "Verrou par mot de passe", - "PUBLIC_COLLECT": "Autoriser l'ajout de photos", - "LINK_DEVICE_LIMIT": "Limite d'appareil", - "NO_DEVICE_LIMIT": "Aucune", - "LINK_EXPIRY": "Expiration du lien", - "NEVER": "Jamais", - "DISABLE_FILE_DOWNLOAD": "Désactiver le téléchargement", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Êtes-vous certains de vouloir désactiver le bouton de téléchargement pour les fichiers?

Ceux qui les visualisent pourront tout de même faire des captures d'écrans ou sauvegarder une copie de vos photos en utilisant des outils externes.

", - "MALICIOUS_CONTENT": "Contient du contenu malveillant", - "COPYRIGHT": "Enfreint les droits d'une personne que je réprésente", - "SHARED_USING": "Partagé en utilisant ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Utilisez le code {{referralCode}} pour obtenir 10 Go gratuits", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Désactiver le verrouillage par mot de passe", - "DISABLE_PASSWORD_MESSAGE": "Êtes-vous certains de vouloir désactiver le verrouillage par mot de passe ?", - "PASSWORD_LOCK": "Mot de passe verrou", - "LOCK": "Verrouiller", - "DOWNLOAD_UPLOAD_LOGS": "Journaux de débugs", - "UPLOAD_FILES": "Fichier", - "UPLOAD_DIRS": "Dossier", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Déduplication de fichiers", - "AUTHENTICATOR_SECTION": "Authentificateur", - "NO_DUPLICATES_FOUND": "Vous n'avez aucun fichier dédupliqué pouvant être nettoyé", - "CLUB_BY_CAPTURE_TIME": "Durée de la capture par club", - "FILES": "Fichiers", - "EACH": "Chacun", - "DEDUPLICATE_BASED_ON_SIZE": "Les fichiers suivants ont été clubbed, basé sur leurs tailles, veuillez corriger et supprimer les objets que vous pensez être dupliqués", - "STOP_ALL_UPLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", - "STOP_UPLOADS_HEADER": "Arrêter les chargements ?", - "YES_STOP_UPLOADS": "Oui, arrêter tout", - "STOP_DOWNLOADS_HEADER": "Arrêter le téléchargement ?", - "YES_STOP_DOWNLOADS": "Oui, arrêter les téléchargements", - "STOP_ALL_DOWNLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", - "albums_one": "1 album", - "albums_other": "{{count}} albums", - "ALL_ALBUMS": "Tous les albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "Tous les albums masqués", - "HIDDEN_ALBUMS": "Albums masqués", - "HIDDEN_ITEMS": "Éléments masqués", - "HIDDEN_ITEMS_SECTION_NAME": "Éléments masqués", - "ENTER_TWO_FACTOR_OTP": "Saisir le code à 6 caractères de votre appli d'authentification.", - "CREATE_ACCOUNT": "Créer un compte", - "COPIED": "Copié", - "CANVAS_BLOCKED_TITLE": "Impossible de créer une miniature", - "CANVAS_BLOCKED_MESSAGE": "

Il semblerait que votre navigateur ait désactivé l'accès au canevas, qui est nécessaire pour créer les miniatures de vos photos

Veuillez activer l'accès au canevas du navigateur, ou consulter notre appli pour ordinateur

", - "WATCH_FOLDERS": "Voir les dossiers", - "UPGRADE_NOW": "Mettre à niveau maintenant", - "RENEW_NOW": "Renouveler maintenant", - "STORAGE": "Stockage", - "USED": "utilisé", - "YOU": "Vous", - "FAMILY": "Famille", - "FREE": "gratuit", - "OF": "de", - "WATCHED_FOLDERS": "Voir les dossiers", - "NO_FOLDERS_ADDED": "Aucun dossiers d'ajouté!", - "FOLDERS_AUTOMATICALLY_MONITORED": "Les dossiers que vous ajoutez ici seront supervisés automatiquement", - "UPLOAD_NEW_FILES_TO_ENTE": "Charger de nouveaux fichiers sur ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Retirer de ente les fichiers supprimés", - "ADD_FOLDER": "Ajouter un dossier", - "STOP_WATCHING": "Arrêter de voir", - "STOP_WATCHING_FOLDER": "Arrêter de voir le dossier?", - "STOP_WATCHING_DIALOG_MESSAGE": "Vos fichiers existants ne seront pas supprimés, mais ente arrêtera automatiquement de mettre à jour le lien de l'album à chaque changements sur ce dossier.", - "YES_STOP": "Oui, arrêter", - "MONTH_SHORT": "mo", - "YEAR": "année", - "FAMILY_PLAN": "Plan famille", - "DOWNLOAD_LOGS": "Télécharger les logs", - "DOWNLOAD_LOGS_MESSAGE": "

Cela va télécharger les journaux de débug, que vous pourrez nosu envoyer par e-mail pour nous aider à résoudre votre problàme .

Veuillez noter que les noms de fichiers seront inclus .

", - "CHANGE_FOLDER": "Modifier le dossier", - "TWO_MONTHS_FREE": "Obtenir 2 mois gratuits sur les plans annuels", - "GB": "Go", - "POPULAR": "Populaire", - "FREE_PLAN_OPTION_LABEL": "Poursuivre avec la version d'essai gratuite", - "FREE_PLAN_DESCRIPTION": "1 Go pour 1 an", - "CURRENT_USAGE": "L'utilisation actuelle est de {{usage}}", - "WEAK_DEVICE": "Le navigateur que vous utilisez n'est pas assez puissant pour chiffrer vos photos. Veuillez essayer de vous connecter à ente sur votre ordinateur, ou télécharger l'appli ente mobile/ordinateur.", - "DRAG_AND_DROP_HINT": "Sinon glissez déposez dans la fenêtre ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "

Vos données chargées seront programmées pour suppression, et votre comptre sera supprimé définitivement .

Cette action n'est pas reversible.

", - "AUTHENTICATE": "Authentification", - "UPLOADED_TO_SINGLE_COLLECTION": "Chargé dans une seule collection", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Chargé dans des collections séparées", - "NEVERMIND": "Peu-importe", - "UPDATE_AVAILABLE": "Une mise à jour est disponible", - "UPDATE_INSTALLABLE_MESSAGE": "Une nouvelle version de ente est prête à être installée.", - "INSTALL_NOW": "Installer maintenant", - "INSTALL_ON_NEXT_LAUNCH": "Installer au prochain démarrage", - "UPDATE_AVAILABLE_MESSAGE": "Une nouvelle version de ente est sortie, mais elle ne peut pas être automatiquement téléchargée puis installée.", - "DOWNLOAD_AND_INSTALL": "Télécharger et installer", - "IGNORE_THIS_VERSION": "Ignorer cette version", - "TODAY": "Aujourd'hui", - "YESTERDAY": "Hier", - "NAME_PLACEHOLDER": "Nom...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Impossible de créer des albums depuis un mix fichier/dossier", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Vous avez glissé déposé un mélange de fichiers et dossiers.

Veuillez sélectionner soit uniquement des fichiers, ou des dossiers lors du choix d'options pour créer des albums séparés

", - "CHOSE_THEME": "Choisir un thème", - "ML_SEARCH": "ML search (beta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Ceci activera l'apprentissage automatique sur l'appareil et la recherche faciale qui commencera à analyser vos photos chargées.

Pour la première exécution après la connexion ou l'activation de cette fonctionnalité, cela téléchargera toutes les images sur l'appareil local pour les analyser. Veuillez donc activer ceci uniquement si vous avez de la bande passante et le traitement local de toutes les images dans votre photothèque.

Si c'est la première fois que vous activez ceci, nous vous demanderons également la permission de traiter les données faciales.

", - "ML_MORE_DETAILS": "Plus de détails", - "ENABLE_FACE_SEARCH": "Activer la recherche faciale", - "ENABLE_FACE_SEARCH_TITLE": "Activer la recherche faciale ?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face search, ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", - "DISABLE_BETA": "Désactiver la bêta", - "DISABLE_FACE_SEARCH": "Désactiver la recherche faciale", - "DISABLE_FACE_SEARCH_TITLE": "Désactiver la recherche faciale ?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente will stop processing face geometry, and will also disable ML search (beta)

You can reenable face search again if you wish, so this operation is safe

", - "ADVANCED": "Avancé", - "FACE_SEARCH_CONFIRMATION": "Je comprends, et je souhaite permettre à ente de traiter la géométrie faciale", - "LABS": "Labs", - "YOURS": "Le vôtre", - "PASSPHRASE_STRENGTH_WEAK": "Sécurité du mot de passe : faible", - "PASSPHRASE_STRENGTH_MODERATE": "Sécurité du mot de passe : moyenne", - "PASSPHRASE_STRENGTH_STRONG": "Sécurité du mot de passe : forte", - "PREFERENCES": "Préférences", - "LANGUAGE": "Langue", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Dossier d'export invalide", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Le dossier d'export que vous avez sélectionné n'existe pas

Veuillez sélectionner un dossier valide

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Échec de la vérification de l'abonnement", - "STORAGE_UNITS": { - "B": "o", - "KB": "Ko", - "MB": "Mo", - "GB": "Go", - "TB": "To" - }, - "AFTER_TIME": { - "HOUR": "dans une heure", - "DAY": "dans un jour", - "WEEK": "dans une semaine", - "MONTH": "dans un mois", - "YEAR": "dans un an" - }, - "COPY_LINK": "Copier le lien", - "DONE": "Terminé", - "LINK_SHARE_TITLE": "Ou partager un lien", - "REMOVE_LINK": "Supprimer le lien", - "CREATE_PUBLIC_SHARING": "Créer un lien public", - "PUBLIC_LINK_CREATED": "Lien public créé", - "PUBLIC_LINK_ENABLED": "Lien public activé", - "COLLECT_PHOTOS": "Récupérer les photos", - "PUBLIC_COLLECT_SUBTEXT": "Autoriser les personnes ayant le lien d'ajouter des photos à l'album partagé.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} fichiers exportés", - "MIGRATING_EXPORT": "Préparations...", - "RENAMING_COLLECTION_FOLDERS": "Renommage des dossiers de l'album en cours...", - "TRASHING_DELETED_FILES": "Mise à la corbeille des fichiers supprimés...", - "TRASHING_DELETED_COLLECTIONS": "Mise à la corbeille des albums supprimés...", - "EXPORT_NOTIFICATION": { - "START": "L'export a démarré", - "IN_PROGRESS": "Un export est déjà en cours", - "FINISH": "Export terminé", - "UP_TO_DATE": "Aucun nouveau fichier à exporter" - }, - "CONTINUOUS_EXPORT": "Synchronisation en continu", - "TOTAL_ITEMS": "Total d'objets", - "PENDING_ITEMS": "Objets en attente", - "EXPORT_STARTING": "Démarrage de l'export...", - "DELETE_ACCOUNT_REASON_LABEL": "Quelle est la raison principale de la suppression de votre compte ?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Choisir une raison", - "DELETE_REASON": { - "MISSING_FEATURE": "Il manque une fonctionnalité essentielle dont j'ai besoin", - "BROKEN_BEHAVIOR": "L'application ou une certaine fonctionnalité ne se comporte pas comme je pense qu'elle devrait", - "FOUND_ANOTHER_SERVICE": "J'ai trouvé un autre service que je préfère", - "NOT_LISTED": "Ma raison n'est pas listée" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Nous sommes désolés de vous voir partir. Expliquez-nous les raisons de votre départ pour que nous puissions nous améliorer.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Vos commentaires", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Oui, je veux supprimer définitivement ce compte et toutes ses données", - "CONFIRM_DELETE_ACCOUNT": "Confirmer la suppression du compte", - "FEEDBACK_REQUIRED": "Merci de nous aider avec cette information", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Qu'est-ce que l'autre service fait de mieux ?", - "RECOVER_TWO_FACTOR": "Récupérer la double-authentification", - "at": "à", - "AUTH_NEXT": "suivant", - "AUTH_DOWNLOAD_MOBILE_APP": "Téléchargez notre application mobile pour gérer vos secrets", - "HIDDEN": "Masqué", - "HIDE": "Masquer", - "UNHIDE": "Dévoiler", - "UNHIDE_TO_COLLECTION": "Afficher dans l'album", - "SORT_BY": "Trier par", - "NEWEST_FIRST": "Plus récent en premier", - "OLDEST_FIRST": "Plus ancien en premier", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Ce fichier n'a pas pu être aperçu. Cliquez ici pour télécharger l'original.", - "SELECT_COLLECTION": "Sélectionner album", - "PIN_ALBUM": "Épingler l'album", - "UNPIN_ALBUM": "Désépingler l'album", - "DOWNLOAD_COMPLETE": "Téléchargement terminé", - "DOWNLOADING_COLLECTION": "Téléchargement de {{name}}", - "DOWNLOAD_FAILED": "Échec du téléchargement", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} fichiers", - "CHRISTMAS": "Noël", - "CHRISTMAS_EVE": "Réveillon de Noël", - "NEW_YEAR": "Nouvel an", - "NEW_YEAR_EVE": "Réveillon de Nouvel An", - "IMAGE": "Image", - "VIDEO": "Vidéo", - "LIVE_PHOTO": "Photos en direct", - "CONVERT": "Convertir", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Êtes-vous sûr de vouloir fermer l'éditeur ?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Téléchargez votre image modifiée ou enregistrez une copie sur ente pour maintenir vos modifications.", - "BRIGHTNESS": "Luminosité", - "CONTRAST": "Contraste", - "SATURATION": "Saturation", - "BLUR": "Flou", - "INVERT_COLORS": "Inverser les couleurs", - "ASPECT_RATIO": "Ratio de l'image", - "SQUARE": "Carré", - "ROTATE_LEFT": "Pivoter vers la gauche", - "ROTATE_RIGHT": "Pivoter vers la droite", - "FLIP_VERTICALLY": "Basculer verticalement", - "FLIP_HORIZONTALLY": "Retourner horizontalement", - "DOWNLOAD_EDITED": "Téléchargement modifié", - "SAVE_A_COPY_TO_ENTE": "Enregistrer une copie dans ente", - "RESTORE_ORIGINAL": "Restaurer l'original", - "TRANSFORM": "Transformer", - "COLORS": "Couleurs", - "FLIP": "Retourner", - "ROTATION": "Rotation", - "RESET": "Réinitialiser", - "PHOTO_EDITOR": "Éditeur de photos", - "FASTER_UPLOAD": "Chargements plus rapides", - "FASTER_UPLOAD_DESCRIPTION": "Router les chargements vers les serveurs à proximité", - "MAGIC_SEARCH_STATUS": "Statut de la recherche magique", - "INDEXED_ITEMS": "Éléments indexés", - "CAST_ALBUM_TO_TV": "Jouer l'album sur la TV", - "ENTER_CAST_PIN_CODE": "Entrez le code que vous voyez sur la TV ci-dessous pour appairer cet appareil.", - "PAIR_DEVICE_TO_TV": "Associer les appareils", - "TV_NOT_FOUND": "TV introuvable. Avez-vous entré le code PIN correctement ?", - "AUTO_CAST_PAIR": "Paire automatique", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "La paire automatique nécessite la connexion aux serveurs Google et ne fonctionne qu'avec les appareils pris en charge par Chromecast. Google ne recevra pas de données sensibles, telles que vos photos.", - "PAIR_WITH_PIN": "Associer avec le code PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Choisissez un périphérique compatible avec la caste à partir de la fenêtre pop-up du navigateur.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "L'association avec le code PIN fonctionne pour tout appareil grand écran sur lequel vous voulez lire votre album.", - "VISIT_CAST_ENTE_IO": "Visitez cast.ente.io sur l'appareil que vous voulez associer.", - "CAST_AUTO_PAIR_FAILED": "La paire automatique de Chromecast a échoué. Veuillez réessayer.", - "CACHE_DIRECTORY": "Dossier du cache", - "FREEHAND": "Main levée", - "APPLY_CROP": "Appliquer le recadrage", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Au moins une transformation ou un ajustement de couleur doit être effectué avant de sauvegarder.", - "PASSKEYS": "Clés d'accès", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/it-IT/translation.json b/web/apps/auth/public/locales/it-IT/translation.json deleted file mode 100644 index ae450e5fe..000000000 --- a/web/apps/auth/public/locales/it-IT/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backup privati
dei tuoi ricordi
", - "HERO_SLIDE_1": "Crittografia end-to-end", - "HERO_SLIDE_2_TITLE": "
Salvati in modo sicuro
in un rifugio antiatomico
", - "HERO_SLIDE_2": "Progettato per sopravvivere", - "HERO_SLIDE_3_TITLE": "
Disponibile
ovunque
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Accedi", - "SIGN_UP": "Registrati", - "NEW_USER": "Nuovo utente", - "EXISTING_USER": "Accedi", - "ENTER_NAME": "Inserisci il nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Aggiungi un nome in modo che i tuoi amici sappiano chi ringraziare per queste fantastiche foto!", - "ENTER_EMAIL": "Inserisci l'indirizzo email", - "EMAIL_ERROR": "Inserisci un indirizzo email valido", - "REQUIRED": "Campo obbligatorio", - "EMAIL_SENT": "Codice di verifica inviato a {{email}}", - "CHECK_INBOX": "Controlla la tua casella di posta (e lo spam) per completare la verifica", - "ENTER_OTT": "Codice di verifica", - "RESEND_MAIL": "Reinvia codice", - "VERIFY": "Verifica", - "UNKNOWN_ERROR": "Qualcosa è andato storto, per favore riprova", - "INVALID_CODE": "Codice di verifica non valido", - "EXPIRED_CODE": "Il tuo codice di verifica è scaduto", - "SENDING": "Invio in corso...", - "SENT": "Inviato!", - "PASSWORD": "Password", - "LINK_PASSWORD": "Inserisci la password per sbloccare l'album", - "RETURN_PASSPHRASE_HINT": "Password", - "SET_PASSPHRASE": "Imposta una password", - "VERIFY_PASSPHRASE": "Accedi", - "INCORRECT_PASSPHRASE": "Password sbagliata", - "ENTER_ENC_PASSPHRASE": "Inserisci una password per crittografare i tuoi dati", - "PASSPHRASE_DISCLAIMER": "Non memorizziamo la tua password, quindi se la dimentichi, non saremo in grado di aiutarti a recuperare i tuoi dati senza una chiave di recupero.", - "WELCOME_TO_ENTE_HEADING": "Benvenuto su ", - "WELCOME_TO_ENTE_SUBHEADING": "Archiviazione e condivisione di foto crittografate end-to-end", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Dove vivono le tue migliori foto", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generazione delle chiavi di crittografia...", - "PASSPHRASE_HINT": "Password", - "CONFIRM_PASSPHRASE": "Conferma la password", - "REFERRAL_CODE_HINT": "Come hai conosciuto Ente? (opzionale)", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Le password non corrispondono", - "CREATE_COLLECTION": "Nuovo album", - "ENTER_ALBUM_NAME": "Nome album", - "CLOSE_OPTION": "Chiudi (Esc)", - "ENTER_FILE_NAME": "Nome del file", - "CLOSE": "Chiudi", - "NO": "No", - "NOTHING_HERE": "Nulla da vedere qui! 👀", - "UPLOAD": "Carica", - "IMPORT": "Importa", - "ADD_PHOTOS": "Aggiungi foto", - "ADD_MORE_PHOTOS": "Aggiungi altre foto", - "add_photos_one": "Aggiungi elemento", - "add_photos_other": "Aggiungi {{count, number}} elementi", - "SELECT_PHOTOS": "Seleziona foto", - "FILE_UPLOAD": "Carica file", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparazione all'upload", - "1": "Lettura dei file metadati di google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} file metadati estratti", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} file salvati", - "4": "Annullamento dei caricamenti rimanenti", - "5": "Backup completato" - }, - "FILE_NOT_UPLOADED_LIST": "I seguenti file non sono stati caricati", - "SUBSCRIPTION_EXPIRED": "Abbonamento scaduto", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Il tuo abbonamento è scaduto, per favore rinnova", - "STORAGE_QUOTA_EXCEEDED": "Limite d'archiviazione superato", - "INITIAL_LOAD_DELAY_WARNING": "Il primo caricamento potrebbe richiedere del tempo", - "USER_DOES_NOT_EXIST": "Purtroppo non abbiamo trovato nessun account con quell'indirizzo e-mail", - "NO_ACCOUNT": "Non ho un account", - "ACCOUNT_EXISTS": "Ho già un account", - "CREATE": "Crea", - "DOWNLOAD": "Scarica", - "DOWNLOAD_OPTION": "Scarica (D)", - "DOWNLOAD_FAVORITES": "Scarica i preferiti", - "DOWNLOAD_UNCATEGORIZED": "Scarica i file senza categoria", - "DOWNLOAD_HIDDEN_ITEMS": "Scarica gli elementi nascosti", - "COPY_OPTION": "Copia come PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Attiva/disattiva schermo intero (F)", - "ZOOM_IN_OUT": "Zoom in/out", - "PREVIOUS": "Precedente (←)", - "NEXT": "Successivo (→)", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "Carica la tua prima foto", - "IMPORT_YOUR_FOLDERS": "Importa una cartella", - "UPLOAD_DROPZONE_MESSAGE": "Rilascia per eseguire il backup dei file", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Rilascia per aggiungere la cartella osservata", - "TRASH_FILES_TITLE": "Elimina file?", - "TRASH_FILE_TITLE": "Eliminare il file?", - "DELETE_FILES_TITLE": "Eliminare immediatamente?", - "DELETE_FILES_MESSAGE": "I file selezionati verranno eliminati definitivamente dal tuo account ente.", - "DELETE": "Cancella", - "DELETE_OPTION": "Cancella (DEL)", - "FAVORITE_OPTION": "Preferito (L)", - "UNFAVORITE_OPTION": "Rimuovi dai preferiti (L)", - "MULTI_FOLDER_UPLOAD": "Selezionate più cartelle", - "UPLOAD_STRATEGY_CHOICE": "Vuoi caricarli in", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un album singolo", - "OR": "o", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Album separati", - "SESSION_EXPIRED_MESSAGE": "La sessione è scaduta. Per continuare, esegui nuovamente l'accesso", - "SESSION_EXPIRED": "Sessione scaduta", - "PASSWORD_GENERATION_FAILED": "Il tuo browser non è stato in grado di generare una chiave forte che soddisfa gli standard di crittografia ente, prova ad usare l'app per dispositivi mobili o un altro browser", - "CHANGE_PASSWORD": "Cambia password", - "GO_BACK": "Torna indietro", - "RECOVERY_KEY": "Chiave di recupero", - "SAVE_LATER": "Fallo più tardi", - "SAVE": "Salva Chiave", - "RECOVERY_KEY_DESCRIPTION": "Se dimentichi la tua password, l'unico modo per recuperare i tuoi dati è con questa chiave.", - "RECOVER_KEY_GENERATION_FAILED": "Impossibile generare il codice di recupero, riprova", - "KEY_NOT_STORED_DISCLAIMER": "Non memorizziamo questa chiave, quindi salvala in un luogo sicuro", - "FORGOT_PASSWORD": "Password dimenticata", - "RECOVER_ACCOUNT": "Recupera account", - "RECOVERY_KEY_HINT": "Chiave di recupero", - "RECOVER": "Recupera", - "NO_RECOVERY_KEY": "Nessuna chiave di recupero?", - "INCORRECT_RECOVERY_KEY": "Chiave di recupero errata", - "SORRY": "Siamo spiacenti", - "NO_RECOVERY_KEY_MESSAGE": "A causa della natura del nostro protocollo di crittografia end-to-end, i tuoi dati non possono essere decifrati senza la tua password o chiave di ripristino", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Per favore invia un'email a {{emailID}} dal tuo indirizzo email registrato", - "CONTACT_SUPPORT": "Contatta il supporto", - "REQUEST_FEATURE": "Richiedi una funzionalità", - "SUPPORT": "Supporto", - "CONFIRM": "Conferma", - "CANCEL": "Annulla", - "LOGOUT": "Disconnettiti", - "DELETE_ACCOUNT": "Elimina account", - "DELETE_ACCOUNT_MESSAGE": "

Per favore invia una email a {{emailID}} dal tuo indirizzo email registrato.

La tua richiesta verrà elaborata entro 72 ore.

", - "LOGOUT_MESSAGE": "Sei sicuro di volerti disconnettere?", - "CHANGE_EMAIL": "Cambia email", - "OK": "OK", - "SUCCESS": "Operazione riuscita", - "ERROR": "Errore", - "MESSAGE": "Messaggio", - "INSTALL_MOBILE_APP": "Installa la nostra app Android o iOS per eseguire il backup automatico di tutte le tue foto", - "DOWNLOAD_APP_MESSAGE": "Siamo spiacenti, questa operazione è attualmente supportata solo sulla nostra app desktop", - "DOWNLOAD_APP": "Scarica l'app per desktop", - "EXPORT": "Esporta Dati", - "SUBSCRIPTION": "Abbonamento", - "SUBSCRIBE": "Iscriviti", - "MANAGEMENT_PORTAL": "Gestisci i metodi di pagamento", - "MANAGE_FAMILY_PORTAL": "Gestisci piano famiglia", - "LEAVE_FAMILY_PLAN": "Abbandona il piano famiglia", - "LEAVE": "Lascia", - "LEAVE_FAMILY_CONFIRM": "Sei sicuro di voler uscire dal piano famiglia?", - "CHOOSE_PLAN": "Scegli il tuo piano", - "MANAGE_PLAN": "Gestisci il tuo abbonamento", - "ACTIVE": "Attivo", - "OFFLINE_MSG": "Sei offline, i ricordi memorizzati nella cache vengono mostrati", - "FREE_SUBSCRIPTION_INFO": "Sei sul piano gratuito che scade il {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Fai parte di un piano famiglia gestito da", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Si rinnova il {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina il {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Il tuo abbonamento verrà annullato il {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Hai superato la quota di archiviazione assegnata, si prega di aggiornare ", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Abbiamo ricevuto il tuo pagamento

Il tuo abbonamento è valido fino a {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Il tuo acquisto è stato annullato, riprova se vuoi iscriverti", - "SUBSCRIPTION_PURCHASE_FAILED": "Acquisto abbonamento non riuscito, riprova", - "SUBSCRIPTION_UPDATE_FAILED": "L'aggiornamento dell'abbonamento non è riuscito, riprova", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Siamo spiacenti, il pagamento non è andato a buon fine quando abbiamo provato ad addebitare alla sua carta, la preghiamo di aggiornare il suo metodo di pagamento e riprovare", - "STRIPE_AUTHENTICATION_FAILED": "Non siamo in grado di autenticare il tuo metodo di pagamento. Per favore scegli un metodo di pagamento diverso e riprova", - "UPDATE_PAYMENT_METHOD": "Aggiorna metodo di pagamento", - "MONTHLY": "Mensile", - "YEARLY": "Annuale", - "UPDATE_SUBSCRIPTION_MESSAGE": "Sei sicuro di voler cambiare il piano?", - "UPDATE_SUBSCRIPTION": "Cambia piano", - "CANCEL_SUBSCRIPTION": "Annulla abbonamento", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Tutti i tuoi dati saranno cancellati dai nostri server alla fine di questo periodo di fatturazione.

Sei sicuro di voler annullare il tuo abbonamento?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "Impossibile annullare l'abbonamento", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abbonamento annullato con successo", - "REACTIVATE_SUBSCRIPTION": "Riattiva abbonamento", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Una volta riattivato, ti verrà addebitato il valore di {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Iscrizione attivata con successo ", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Grazie", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Annulla abbonamento mobile", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Per favore contattaci su {{emailID}} per gestire il tuo abbonamento", - "RENAME": "Rinomina", - "RENAME_FILE": "Rinomina file", - "RENAME_COLLECTION": "Rinomina album", - "DELETE_COLLECTION_TITLE": "Eliminare l'album?", - "DELETE_COLLECTION": "Elimina album", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "Elimina foto", - "KEEP_PHOTOS": "Mantieni foto", - "SHARE": "Condividi", - "SHARE_COLLECTION": "Condividi album", - "SHAREES": "Condividi con", - "SHARE_WITH_SELF": "Ops, non puoi condividere a te stesso", - "ALREADY_SHARED": "Ops, lo stai già condividendo con {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Condividere gli album non è consentito", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "La condivisione è disabilitata per gli account free", - "DOWNLOAD_COLLECTION": "Scarica album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Sei sicuro di volere scaricare l'album interamente?

Tutti i file saranno messi in coda per il download

", - "CREATE_ALBUM_FAILED": "Operazione di creazione dell'album fallita, per favore riprova", - "SEARCH": "Ricerca", - "SEARCH_RESULTS": "Risultati della ricerca", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Posizione", - "CITY": "Posizione", - "DATE": "Data", - "FILE_NAME": "Nome file", - "THING": "Contenuto", - "FILE_CAPTION": "Descrizione", - "FILE_TYPE": "Tipo del file", - "CLIP": "" - }, - "photos_count_zero": "Nessuna memoria", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "Aggiungi all'album", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Questo video non può essere riprodotto nel tuo browser", - "PEOPLE": "Persone", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "volti non identificati", - "OBJECTS": "", - "TEXT": "testo", - "INFO": "Info ", - "INFO_OPTION": "", - "FILE_NAME": "Nome file", - "CAPTION_PLACEHOLDER": "Aggiungi una descrizione", - "LOCATION": "Posizione", - "SHOW_ON_MAP": "Guarda su OpenStreetMap", - "MAP": "Mappa", - "MAP_SETTINGS": "Impostazioni Mappa", - "ENABLE_MAPS": "Attivare Mappa?", - "ENABLE_MAP": "Attivare mappa", - "DISABLE_MAPS": "Disattivare Mappa?", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Due fattori", - "TWO_FACTOR_AUTHENTICATION": "Autenticazione a due fattori", - "TWO_FACTOR_QR_INSTRUCTION": "Scansiona il codice QR qui sotto con la tua app di autenticazione preferita", - "ENTER_CODE_MANUALLY": "Inserisci il codice manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Inserisci questo codice nella tua app di autenticazione preferita", - "SCAN_QR_CODE": "Oppure scansiona il codice QR", - "ENABLE_TWO_FACTOR": "Attiva due fattori", - "ENABLE": "Attiva", - "LOST_DEVICE": "", - "INCORRECT_CODE": "Codice errato", - "TWO_FACTOR_INFO": "Aggiungi un ulteriore livello di sicurezza richiedendo più informazioni rispetto a email e password per eseguire l'accesso al tuo account", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "Esporta dati", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "Invia OTP", - "EMAIl_ALREADY_OWNED": "Email già in uso", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "Caricamento fallito ", - "SKIPPED_FILES": "Ignora caricamenti", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "Caricamenti eseguiti con successo", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "Video saltati", - "INPROGRESS_METADATA_EXTRACTION": "In corso", - "INPROGRESS_UPLOADS": "Caricamenti in corso", - "TOO_LARGE_UPLOADS": "File pesanti", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Spazio insufficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Questi file non sono stati caricati perché supererebbero la capacità massima del tuo piano di spazio d'archiviazione", - "TOO_LARGE_INFO": "Questi file non sono stati caricati perché superano il nostro limite di pesantezza di un file", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "Archivio", - "FAVORITES": "Preferiti", - "ARCHIVE_COLLECTION": "Album archiviato", - "ARCHIVE_SECTION_NAME": "Archivio", - "ALL_SECTION_NAME": "Tutto", - "MOVE_TO_COLLECTION": "Sposta nell'album", - "UNARCHIVE": "Rimuovi dall'archivio", - "UNARCHIVE_COLLECTION": "Rimuovi album dall'archivio", - "HIDE_COLLECTION": "Nascondi album", - "UNHIDE_COLLECTION": "Rimuovi album dai nascosti", - "MOVE": "Sposta", - "ADD": "Aggiungi", - "REMOVE": "Rimuovi", - "YES_REMOVE": "Sì, rimuovi", - "REMOVE_FROM_COLLECTION": "Rimuovi dall'album", - "TRASH": "Cestino", - "MOVE_TO_TRASH": "Sposta nel cestino", - "TRASH_FILES_MESSAGE": "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino.", - "TRASH_FILE_MESSAGE": "Il file verrà eliminato da tutti gli album e spostato nel cestino.", - "DELETE_PERMANENTLY": "Elimina definitivamente", - "RESTORE": "Ripristina", - "RESTORE_TO_COLLECTION": "Ripristina nell'album", - "EMPTY_TRASH": "Svuota il cestino", - "EMPTY_TRASH_TITLE": "Vuoi svuotare il cestino?", - "EMPTY_TRASH_MESSAGE": "I file selezionati verranno eliminati definitivamente dal tuo account ente.", - "LEAVE_SHARED_ALBUM": "Sì, esci", - "LEAVE_ALBUM": "Abbandona l'album", - "LEAVE_SHARED_ALBUM_TITLE": "Abbandonare l'album condiviso?", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "Meno recente", - "SORT_BY_UPDATION_TIME_DESCENDING": "Ultimo aggiornamento", - "SORT_BY_NAME": "Nome", - "COMPRESS_THUMBNAILS": "Comprimi miniature", - "THUMBNAIL_REPLACED": "Miniature compresse", - "FIX_THUMBNAIL": "Comprimi", - "FIX_THUMBNAIL_LATER": "Comprimi più tardi", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "Installa", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Nessun partecipante", - "participants_one": "1 partecipante", - "participants_other": "{{count, number}} partecipanti", - "ADD_VIEWERS": "", - "PARTICIPANTS": "Partecipanti", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "Rimuovere?", - "CONFIRM_REMOVE": "Sì, rimuovi", - "MANAGE": "Gestisci", - "ADDED_AS": "Aggiunto come", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "Rimuovi partecipante", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - non trovato", - "LINK_EXPIRED": "Link scaduto", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "Cartella", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Album", - "ALL_ALBUMS": "Tutti gli Album", - "ALBUMS": "Album", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "Crea account", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "Tu", - "FAMILY": "Famiglia", - "FREE": "gratis", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "Ancora nessuna cartella aggiunta!", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "Cambia Cartella", - "TWO_MONTHS_FREE": "Ottieni 2 mesi gratis sui piani annuali", - "GB": "GB", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "1 GB per 1 anno", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "Autenticati", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "Oggi", - "YESTERDAY": "Ieri", - "NAME_PLACEHOLDER": "Nome...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "Seleziona tema", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "Più dettagli", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "Avanzate", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "Sicurezza password: Debole", - "PASSPHRASE_STRENGTH_MODERATE": "Sicurezza password: Moderata", - "PASSPHRASE_STRENGTH_STRONG": "Sicurezza password: Forte", - "PREFERENCES": "", - "LANGUAGE": "Lingua", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "dopo un'ora", - "DAY": "dopo un giorno", - "WEEK": "dopo una settimana", - "MONTH": "dopo un mese", - "YEAR": "dopo un anno" - }, - "COPY_LINK": "Copia link", - "DONE": "Fatto", - "LINK_SHARE_TITLE": "O condividi un link", - "REMOVE_LINK": "Rimuovi link", - "CREATE_PUBLIC_SHARING": "Crea link pubblico", - "PUBLIC_LINK_CREATED": "Link pubblick creato", - "PUBLIC_LINK_ENABLED": "Link pubblico attivato", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Seleziona un motivo", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/ko-KR/translation.json b/web/apps/auth/public/locales/ko-KR/translation.json deleted file mode 100644 index 4fbe6c077..000000000 --- a/web/apps/auth/public/locales/ko-KR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "추억을 안전하게 백업하세요", - "HERO_SLIDE_1": "종단간 암호화가 기본지원입니다", - "HERO_SLIDE_2_TITLE": "낙진대피소에 안전하게 보관됩니다", - "HERO_SLIDE_2": "오랫동안 보존할 수 있도록한 설계", - "HERO_SLIDE_3_TITLE": "
어디에서나
이용가능
", - "HERO_SLIDE_3": "안드로이드, iOS, 웹, 데스크탑", - "LOGIN": "로그인", - "SIGN_UP": "회원가입", - "NEW_USER": "ente의 새소식", - "EXISTING_USER": "기존 사용자", - "ENTER_NAME": "이름 입력", - "PUBLIC_UPLOADER_NAME_MESSAGE": "친구들이 이 멋진 사진에 대해 고마워할 수 있도록 이름을 추가하세요!", - "ENTER_EMAIL": "이메일 주소를 입력하세요", - "EMAIL_ERROR": "올바른 이메일을 입력하세요", - "REQUIRED": "필수", - "EMAIL_SENT": "{{email}} 로 인증 코드가 전송되었습니다", - "CHECK_INBOX": "인증을 완료하기 위해 당신의 메일 수신함(그리고 스팸 수신함)을 확인하세요.", - "ENTER_OTT": "인증 코드", - "RESEND_MAIL": "코드 재전송하기", - "VERIFY": "인증", - "UNKNOWN_ERROR": "문제가 생긴 것 같아요. 다시 시도하세요", - "INVALID_CODE": "잘못된 인증 코드", - "EXPIRED_CODE": "입력한 인증 코드가 만료되었습니다", - "SENDING": "전송 중...", - "SENT": "발송 완료!", - "PASSWORD": "비밀번호", - "LINK_PASSWORD": "앨범 잠금해제를 위해 비밀번호를 입력하세요", - "RETURN_PASSPHRASE_HINT": "비밀번호", - "SET_PASSPHRASE": "비밀번호 설정", - "VERIFY_PASSPHRASE": "로그인", - "INCORRECT_PASSPHRASE": "잘못된 비밀번호입니다", - "ENTER_ENC_PASSPHRASE": "당신의 데이터를 암호화하는 데 사용할 수 있는 비밀번호를 입력하세요", - "PASSPHRASE_DISCLAIMER": "우리는 귀하의 비밀번호를 저장하지 않습니다. 만약 비밀번호를 잊어버린 경우 복구 키 없다면 데이터 복구를 도와드릴 수 없습니다.", - "WELCOME_TO_ENTE_HEADING": "환영합니다 ", - "WELCOME_TO_ENTE_SUBHEADING": "End-to-End 암호화된 사진 저장 및 공유", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "당신 최고의 사진이 있는 곳", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "암호 키 생성 중...", - "PASSPHRASE_HINT": "비밀번호", - "CONFIRM_PASSPHRASE": "비밀번호 확인", - "REFERRAL_CODE_HINT": "어떻게 Ente에 대해 들으셨나요? (선택사항)", - "REFERRAL_INFO": "우리는 앱 설치를 추적하지 않습니다. 우리를 알게 된 곳을 남겨주시면 우리에게 도움이 될꺼에요!", - "PASSPHRASE_MATCH_ERROR": "비밀번호가 일치하지 않습니다", - "CREATE_COLLECTION": "새 앨범", - "ENTER_ALBUM_NAME": "앨범 이름", - "CLOSE_OPTION": "닫기 (Esc)", - "ENTER_FILE_NAME": "파일 이름", - "CLOSE": "닫기", - "NO": "아니오", - "NOTHING_HERE": "아직 볼 수 있는 것이 없어요 👀", - "UPLOAD": "업로드", - "IMPORT": "가져오기", - "ADD_PHOTOS": "사진 추가", - "ADD_MORE_PHOTOS": "사진 더 추가하기", - "add_photos_one": "아이템 하나 추가", - "add_photos_other": "아이템 {{count, number}} 개 추가하기", - "SELECT_PHOTOS": "사진 선택하기", - "FILE_UPLOAD": "파일 업로드", - "UPLOAD_STAGE_MESSAGE": { - "0": "업로드 준비중", - "1": "구글 메타데이타 파일들 읽는중", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 파일 메타데이터가 추출되었습니다", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 파일이 처리되었습니다", - "4": "남은 업로드 취소중", - "5": "백업 완료" - }, - "FILE_NOT_UPLOADED_LIST": "아래 파일들은 업로드 되지 않았습니다", - "SUBSCRIPTION_EXPIRED": "구독 만료", - "SUBSCRIPTION_EXPIRED_MESSAGE": "당신 구독이 만료되었으니, 구독을 갱신해주세요", - "STORAGE_QUOTA_EXCEEDED": "스토리지 제한이 초과되었습니다", - "INITIAL_LOAD_DELAY_WARNING": "처음 로딩시 다소 시간이 걸릴 수 있습니다", - "USER_DOES_NOT_EXIST": "죄송합니다. 해당 이메일을 사용하는 사용자를 찾을 수 없습니다", - "NO_ACCOUNT": "계정이 없습니다", - "ACCOUNT_EXISTS": "이미 계정이 있습니다", - "CREATE": "만들기", - "DOWNLOAD": "다운로드", - "DOWNLOAD_OPTION": "다운로드 (D)", - "DOWNLOAD_FAVORITES": "즐겨찾기 다운로드", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/nl-NL/translation.json b/web/apps/auth/public/locales/nl-NL/translation.json deleted file mode 100644 index 15d9bfdba..000000000 --- a/web/apps/auth/public/locales/nl-NL/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Privé back-ups
voor uw herinneringen
", - "HERO_SLIDE_1": "Standaard end-to-end versleuteld", - "HERO_SLIDE_2_TITLE": "
Veilig opgeslagen
in een kernbunker
", - "HERO_SLIDE_2": "Ontworpen om levenslang mee te gaan", - "HERO_SLIDE_3_TITLE": "
Overal
beschikbaar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Inloggen", - "SIGN_UP": "Registreren", - "NEW_USER": "Nieuw bij ente", - "EXISTING_USER": "Bestaande gebruiker", - "ENTER_NAME": "Naam invoeren", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Voeg een naam toe zodat je vrienden weten wie ze moeten bedanken voor deze geweldige foto's!", - "ENTER_EMAIL": "Vul e-mailadres in", - "EMAIL_ERROR": "Vul een geldig e-mailadres in", - "REQUIRED": "Vereist", - "EMAIL_SENT": "Verificatiecode verzonden naar {{email}}", - "CHECK_INBOX": "Controleer je inbox (en spam) om verificatie te voltooien", - "ENTER_OTT": "Verificatiecode", - "RESEND_MAIL": "Code opnieuw versturen", - "VERIFY": "Verifiëren", - "UNKNOWN_ERROR": "Er is iets fout gegaan, probeer het opnieuw", - "INVALID_CODE": "Ongeldige verificatiecode", - "EXPIRED_CODE": "Uw verificatiecode is verlopen", - "SENDING": "Verzenden...", - "SENT": "Verzonden!", - "PASSWORD": "Wachtwoord", - "LINK_PASSWORD": "Voer wachtwoord in om het album te ontgrendelen", - "RETURN_PASSPHRASE_HINT": "Wachtwoord", - "SET_PASSPHRASE": "Wachtwoord instellen", - "VERIFY_PASSPHRASE": "Aanmelden", - "INCORRECT_PASSPHRASE": "Onjuist wachtwoord", - "ENTER_ENC_PASSPHRASE": "Voer een wachtwoord in dat we kunnen gebruiken om je gegevens te versleutelen", - "PASSPHRASE_DISCLAIMER": "We slaan je wachtwoord niet op, dus als je het vergeet, zullen we u niet kunnen helpen uw data te herstellen zonder een herstelcode.", - "WELCOME_TO_ENTE_HEADING": "Welkom bij ", - "WELCOME_TO_ENTE_SUBHEADING": "Foto opslag en delen met end to end encryptie", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Waar je beste foto's leven", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Encryptiecodes worden gegenereerd...", - "PASSPHRASE_HINT": "Wachtwoord", - "CONFIRM_PASSPHRASE": "Wachtwoord bevestigen", - "REFERRAL_CODE_HINT": "Hoe hoorde je over Ente? (optioneel)", - "REFERRAL_INFO": "Wij gebruiken geen tracking. Het zou helpen als je ons vertelt waar je ons gevonden hebt!", - "PASSPHRASE_MATCH_ERROR": "Wachtwoorden komen niet overeen", - "CREATE_COLLECTION": "Nieuw album", - "ENTER_ALBUM_NAME": "Album naam", - "CLOSE_OPTION": "Sluiten (Esc)", - "ENTER_FILE_NAME": "Bestandsnaam", - "CLOSE": "Sluiten", - "NO": "Nee", - "NOTHING_HERE": "Nog niets te zien hier 👀", - "UPLOAD": "Uploaden", - "IMPORT": "Importeren", - "ADD_PHOTOS": "Foto's toevoegen", - "ADD_MORE_PHOTOS": "Meer foto's toevoegen", - "add_photos_one": "1 foto toevoegen", - "add_photos_other": "{{count, number}} foto's toevoegen", - "SELECT_PHOTOS": "Selecteer foto's", - "FILE_UPLOAD": "Bestand uploaden", - "UPLOAD_STAGE_MESSAGE": { - "0": "Upload wordt voorbereid", - "1": "Lezen van Google metadata bestanden", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} bestanden metadata uitgepakt", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} bestanden geback-upt", - "4": "Resterende uploads worden geannuleerd", - "5": "Back-up voltooid" - }, - "FILE_NOT_UPLOADED_LIST": "De volgende bestanden zijn niet geüpload", - "SUBSCRIPTION_EXPIRED": "Abonnement verlopen", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Uw abonnement is verlopen, gelieve vernieuwen", - "STORAGE_QUOTA_EXCEEDED": "Opslaglimiet overschreden", - "INITIAL_LOAD_DELAY_WARNING": "Eerste keer laden kan enige tijd duren", - "USER_DOES_NOT_EXIST": "Sorry, we konden geen account met dat e-mailadres vinden", - "NO_ACCOUNT": "Heb nog geen account", - "ACCOUNT_EXISTS": "Heb al een account", - "CREATE": "Creëren", - "DOWNLOAD": "Downloaden", - "DOWNLOAD_OPTION": "Downloaden (D)", - "DOWNLOAD_FAVORITES": "Favorieten downloaden", - "DOWNLOAD_UNCATEGORIZED": "Ongecategoriseerd downloaden", - "DOWNLOAD_HIDDEN_ITEMS": "Verborgen bestanden downloaden", - "COPY_OPTION": "Kopiëren als PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Schakelen volledig scherm modus (F)", - "ZOOM_IN_OUT": "In/uitzoomen", - "PREVIOUS": "Vorige (←)", - "NEXT": "Volgende (→)", - "TITLE_PHOTOS": "Ente Foto's", - "TITLE_ALBUMS": "Ente Foto's", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Je eerste foto uploaden", - "IMPORT_YOUR_FOLDERS": "Importeer uw mappen", - "UPLOAD_DROPZONE_MESSAGE": "Sleep om een back-up van je bestanden te maken", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Sleep om map aan watched folders toe te voegen", - "TRASH_FILES_TITLE": "Bestanden verwijderen?", - "TRASH_FILE_TITLE": "Verwijder bestand?", - "DELETE_FILES_TITLE": "Onmiddellijk verwijderen?", - "DELETE_FILES_MESSAGE": "Geselecteerde bestanden zullen permanent worden verwijderd van je ente account.", - "DELETE": "Verwijderen", - "DELETE_OPTION": "Verwijderen (DEL)", - "FAVORITE_OPTION": "Favoriet (L)", - "UNFAVORITE_OPTION": "Verwijderen uit Favorieten (L)", - "MULTI_FOLDER_UPLOAD": "Meerdere mappen gedetecteerd", - "UPLOAD_STRATEGY_CHOICE": "Wilt u deze uploaden naar", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Één enkel album", - "OR": "of", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Aparte albums maken", - "SESSION_EXPIRED_MESSAGE": "Uw sessie is verlopen. Meld u opnieuw aan om verder te gaan", - "SESSION_EXPIRED": "Sessie verlopen", - "PASSWORD_GENERATION_FAILED": "Uw browser kon geen sterke sleutel genereren die voldoet aan onze versleutelingsstandaarden. Probeer de mobiele app of een andere browser te gebruiken", - "CHANGE_PASSWORD": "Wachtwoord wijzigen", - "GO_BACK": "Ga terug", - "RECOVERY_KEY": "Herstelsleutel", - "SAVE_LATER": "Doe dit later", - "SAVE": "Sleutel opslaan", - "RECOVERY_KEY_DESCRIPTION": "Als je je wachtwoord vergeet, kun je alleen met deze sleutel je gegevens herstellen.", - "RECOVER_KEY_GENERATION_FAILED": "Herstelcode kon niet worden gegenereerd, probeer het opnieuw", - "KEY_NOT_STORED_DISCLAIMER": "We slaan deze sleutel niet op, bewaar dit op een veilige plaats", - "FORGOT_PASSWORD": "Wachtwoord vergeten", - "RECOVER_ACCOUNT": "Account herstellen", - "RECOVERY_KEY_HINT": "Herstelsleutel", - "RECOVER": "Herstellen", - "NO_RECOVERY_KEY": "Geen herstelsleutel?", - "INCORRECT_RECOVERY_KEY": "Onjuiste herstelsleutel", - "SORRY": "Sorry", - "NO_RECOVERY_KEY_MESSAGE": "Door de aard van ons end-to-end encryptieprotocol kunnen je gegevens niet worden ontsleuteld zonder je wachtwoord of herstelsleutel", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Stuur een e-mail naar {{emailID}} vanaf het door jou geregistreerde e-mailadres", - "CONTACT_SUPPORT": "Klantenservice", - "REQUEST_FEATURE": "Vraag nieuwe functie aan", - "SUPPORT": "Ondersteuning", - "CONFIRM": "Bevestigen", - "CANCEL": "Annuleren", - "LOGOUT": "Uitloggen", - "DELETE_ACCOUNT": "Account verwijderen", - "DELETE_ACCOUNT_MESSAGE": "

Stuur een e-mail naar {{emailID}} vanaf uw geregistreerde e-mailadres.

Uw aanvraag wordt binnen 72 uur verwerkt.

", - "LOGOUT_MESSAGE": "Weet u zeker dat u wilt uitloggen?", - "CHANGE_EMAIL": "E-mail wijzigen", - "OK": "Oké", - "SUCCESS": "Succes", - "ERROR": "Foutmelding", - "MESSAGE": "Melding", - "INSTALL_MOBILE_APP": "Installeer onze Android of iOS app om automatisch een back-up te maken van al uw foto's", - "DOWNLOAD_APP_MESSAGE": "Sorry, deze bewerking wordt momenteel alleen ondersteund op onze desktop app", - "DOWNLOAD_APP": "Download de desktop app", - "EXPORT": "Data exporteren", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "Abonneren", - "MANAGEMENT_PORTAL": "Betaalmethode beheren", - "MANAGE_FAMILY_PORTAL": "Familie abonnement beheren", - "LEAVE_FAMILY_PLAN": "Familie abonnement verlaten", - "LEAVE": "Verlaten", - "LEAVE_FAMILY_CONFIRM": "Weet je zeker dat je het familie-plan wilt verlaten?", - "CHOOSE_PLAN": "Kies uw abonnement", - "MANAGE_PLAN": "Beheer uw abonnement", - "ACTIVE": "Actief", - "OFFLINE_MSG": "Je bent offline, lokaal opgeslagen herinneringen worden getoond", - "FREE_SUBSCRIPTION_INFO": "Je hebt het gratis abonnement dat verloopt op {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "U hebt een familieplan dat beheerd wordt door", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Vernieuwt op {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Eindigt op {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Uw abonnement loopt af op {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Jouw {{storage, string}} add-on is geldig tot {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "U heeft uw opslaglimiet overschreden, gelieve upgraden", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

We hebben uw betaling ontvangen

Uw abonnement is geldig tot {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Uw aankoop is geannuleerd, probeer het opnieuw als u zich wilt abonneren", - "SUBSCRIPTION_PURCHASE_FAILED": "Betaling van abonnement mislukt Probeer het opnieuw", - "SUBSCRIPTION_UPDATE_FAILED": "Niet gelukt om abonnement bij te werken, probeer het opnieuw", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Het spijt ons, maar de betaling is mislukt bij het in rekening brengen van uw kaart, gelieve uw betaalmethode bij te werken en het opnieuw te proberen", - "STRIPE_AUTHENTICATION_FAILED": "We zijn niet in staat om uw betaalmethode te verifiëren. Kies een andere betaalmethode en probeer het opnieuw", - "UPDATE_PAYMENT_METHOD": "Betalingsmethode bijwerken", - "MONTHLY": "Maandelijks", - "YEARLY": "Jaarlijks", - "UPDATE_SUBSCRIPTION_MESSAGE": "Weet u zeker dat u uw abonnement wilt wijzigen?", - "UPDATE_SUBSCRIPTION": "Abonnement wijzigen", - "CANCEL_SUBSCRIPTION": "Abonnement opzeggen", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Al je gegevens zullen worden verwijderd van onze servers aan het einde van deze factureringsperiode.

Weet u zeker dat u uw abonnement wilt opzeggen?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Weet je zeker dat je je abonnement wilt opzeggen?

", - "SUBSCRIPTION_CANCEL_FAILED": "Abonnement opzeggen mislukt", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abonnement succesvol geannuleerd", - "REACTIVATE_SUBSCRIPTION": "Abonnement opnieuw activeren", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Zodra je weer bent geactiveerd, zal je worden gefactureerd op {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Abonnement succesvol geactiveerd ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Heractiveren van abonnementsverlenging is mislukt", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Bedankt", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Mobiel abonnement opzeggen", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Annuleer je abonnement via de mobiele app om je abonnement hier te activeren", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Neem contact met ons op via {{emailID}} om uw abonnement te beheren", - "RENAME": "Naam wijzigen", - "RENAME_FILE": "Bestandsnaam wijzigen", - "RENAME_COLLECTION": "Albumnaam wijzigen", - "DELETE_COLLECTION_TITLE": "Verwijder album?", - "DELETE_COLLECTION": "Verwijder album", - "DELETE_COLLECTION_MESSAGE": "Verwijder de foto's (en video's) van dit album ook uit alle andere albums waar deze deel van uitmaken?", - "DELETE_PHOTOS": "Foto's verwijderen", - "KEEP_PHOTOS": "Foto's behouden", - "SHARE": "Delen", - "SHARE_COLLECTION": "Album delen", - "SHAREES": "Gedeeld met", - "SHARE_WITH_SELF": "Oeps, je kunt niet met jezelf delen", - "ALREADY_SHARED": "Oeps, je deelt dit al met {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Album delen niet toegestaan", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Delen is uitgeschakeld voor gratis accounts", - "DOWNLOAD_COLLECTION": "Download album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Weet je zeker dat je het volledige album wilt downloaden?

Alle bestanden worden in de wachtrij geplaatst voor downloaden

", - "CREATE_ALBUM_FAILED": "Aanmaken van album mislukt, probeer het opnieuw", - "SEARCH": "Zoeken", - "SEARCH_RESULTS": "Zoekresultaten", - "NO_RESULTS": "Geen resultaten gevonden", - "SEARCH_HINT": "Zoeken naar albums, datums ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Locatie", - "CITY": "Locatie", - "DATE": "Datum", - "FILE_NAME": "Bestandsnaam", - "THING": "Inhoud", - "FILE_CAPTION": "Omschrijving", - "FILE_TYPE": "Bestandstype", - "CLIP": "Magische" - }, - "photos_count_zero": "Geen herinneringen", - "photos_count_one": "1 herinnering", - "photos_count_other": "{{count, number}} herinneringen", - "TERMS_AND_CONDITIONS": "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid", - "ADD_TO_COLLECTION": "Toevoegen aan album", - "SELECTED": "geselecteerd", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Deze video kan niet afgespeeld worden op uw browser", - "PEOPLE": "Personen", - "INDEXING_SCHEDULED": "indexering is gepland...", - "ANALYZING_PHOTOS": "analyseren van nieuwe foto's {{indexStatus.nSyncedFiles}} van {{indexStatus.nTotalFiles}} gedaan)...", - "INDEXING_PEOPLE": "mensen indexeren in {{indexStatus.nSyncedFiles}} foto's...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles}} geïndexeerde foto's", - "UNIDENTIFIED_FACES": "ongeïdentificeerde gezichten", - "OBJECTS": "objecten", - "TEXT": "tekst", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Bestandsnaam", - "CAPTION_PLACEHOLDER": "Voeg een beschrijving toe", - "LOCATION": "Locatie", - "SHOW_ON_MAP": "Bekijk op OpenStreetMap", - "MAP": "Kaart", - "MAP_SETTINGS": "Kaart instellingen", - "ENABLE_MAPS": "Kaarten inschakelen?", - "ENABLE_MAP": "Kaarten inschakelen", - "DISABLE_MAPS": "Kaarten uitzetten?", - "ENABLE_MAP_DESCRIPTION": "

Dit toont jouw foto's op een wereldkaart.

Deze kaart wordt gehost door Open Street Map, en de exacte locaties van jouw foto's worden nooit gedeeld.

Je kunt deze functie op elk gewenst moment uitschakelen via de instellingen.

", - "DISABLE_MAP_DESCRIPTION": "

Dit schakelt de weergave van je foto's op een wereldkaart uit.

Je kunt deze functie op elk gewenst moment inschakelen via Instellingen.

", - "DISABLE_MAP": "Kaarten uitzetten", - "DETAILS": "Details", - "VIEW_EXIF": "Bekijk alle EXIF gegevens", - "NO_EXIF": "Geen EXIF gegevens", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Tweestaps", - "TWO_FACTOR_AUTHENTICATION": "Tweestapsverificatie", - "TWO_FACTOR_QR_INSTRUCTION": "Scan de onderstaande QR-code met uw favoriete verificatie app", - "ENTER_CODE_MANUALLY": "Voer de code handmatig in", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Voer deze code in in uw favoriete verificatie app", - "SCAN_QR_CODE": "Scan QR-code in plaats daarvan", - "ENABLE_TWO_FACTOR": "Tweestapsverificatie inschakelen", - "ENABLE": "Inschakelen", - "LOST_DEVICE": "Tweestapsverificatie apparaat verloren", - "INCORRECT_CODE": "Onjuiste code", - "TWO_FACTOR_INFO": "Voeg een extra beveiligingslaag toe door meer dan uw e-mailadres en wachtwoord te vereisen om in te loggen op uw account", - "DISABLE_TWO_FACTOR_LABEL": "Schakel tweestapsverificatie uit", - "UPDATE_TWO_FACTOR_LABEL": "Update uw verificatie apparaat", - "DISABLE": "Uitschakelen", - "RECONFIGURE": "Herconfigureren", - "UPDATE_TWO_FACTOR": "Tweestapsverificatie bijwerken", - "UPDATE_TWO_FACTOR_MESSAGE": "Verder gaan zal elk eerder geconfigureerde verificatie apparaat ontzeggen", - "UPDATE": "Bijwerken", - "DISABLE_TWO_FACTOR": "Tweestapsverificatie uitschakelen", - "DISABLE_TWO_FACTOR_MESSAGE": "Weet u zeker dat u tweestapsverificatie wilt uitschakelen", - "TWO_FACTOR_DISABLE_FAILED": "Uitschakelen van tweestapsverificatie is mislukt, probeer het opnieuw", - "EXPORT_DATA": "Gegevens exporteren", - "SELECT_FOLDER": "Map selecteren", - "DESTINATION": "Bestemming", - "START": "Start", - "LAST_EXPORT_TIME": "Tijd laatste export", - "EXPORT_AGAIN": "Opnieuw synchroniseren", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Lokale opslag niet toegankelijk", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Je browser of een extensie blokkeert ente om gegevens op te slaan in de lokale opslag. Probeer deze pagina te laden na het aanpassen van de browser surfmodus.", - "SEND_OTT": "Stuur OTP", - "EMAIl_ALREADY_OWNED": "E-mail al in gebruik", - "ETAGS_BLOCKED": "

We kunnen de volgende bestanden niet uploaden vanwege uw browserconfiguratie.

Schakel alle extensies uit die mogelijk voorkomen dat ente eTags kan gebruiken om grote bestanden te uploaden, of gebruik onze desktop app voor een betrouwbaardere import ervaring.

", - "SKIPPED_VIDEOS_INFO": "

We ondersteunen het toevoegen van video's via openbare links momenteel niet.

Om video's te delen, meld je aan bij ente en deel met de beoogde ontvangers via hun e-mail

", - "LIVE_PHOTOS_DETECTED": "De foto en video bestanden van je Live Photos zijn samengevoegd tot één enkel bestand", - "RETRY_FAILED": "Probeer mislukte uploads nogmaals", - "FAILED_UPLOADS": "Mislukte uploads ", - "SKIPPED_FILES": "Genegeerde uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generatie mislukt", - "UNSUPPORTED_FILES": "Niet-ondersteunde bestanden", - "SUCCESSFUL_UPLOADS": "Succesvolle uploads", - "SKIPPED_INFO": "Deze zijn overgeslagen omdat er bestanden zijn met overeenkomende namen in hetzelfde album", - "UNSUPPORTED_INFO": "ente ondersteunt deze bestandsformaten nog niet", - "BLOCKED_UPLOADS": "Geblokkeerde uploads", - "SKIPPED_VIDEOS": "Overgeslagen video's", - "INPROGRESS_METADATA_EXTRACTION": "In behandeling", - "INPROGRESS_UPLOADS": "Bezig met uploaden", - "TOO_LARGE_UPLOADS": "Grote bestanden", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Onvoldoende opslagruimte", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Deze bestanden zijn niet geüpload omdat ze de maximale grootte van uw opslagplan overschrijden", - "TOO_LARGE_INFO": "Deze bestanden zijn niet geüpload omdat ze onze limiet voor bestandsgrootte overschrijden", - "THUMBNAIL_GENERATION_FAILED_INFO": "Deze bestanden zijn geüpload, maar helaas konden we geen thumbnails voor ze genereren.", - "UPLOAD_TO_COLLECTION": "Uploaden naar album", - "UNCATEGORIZED": "Ongecategoriseerd", - "ARCHIVE": "Archiveren", - "FAVORITES": "Favorieten", - "ARCHIVE_COLLECTION": "Album archiveren", - "ARCHIVE_SECTION_NAME": "Archief", - "ALL_SECTION_NAME": "Alle", - "MOVE_TO_COLLECTION": "Verplaats naar album", - "UNARCHIVE": "Uit archief halen", - "UNARCHIVE_COLLECTION": "Album uit archief halen", - "HIDE_COLLECTION": "Verberg album", - "UNHIDE_COLLECTION": "Album zichtbaar maken", - "MOVE": "Verplaatsen", - "ADD": "Toevoegen", - "REMOVE": "Verwijderen", - "YES_REMOVE": "Ja, verwijderen", - "REMOVE_FROM_COLLECTION": "Verwijderen uit album", - "TRASH": "Prullenbak", - "MOVE_TO_TRASH": "Verplaatsen naar prullenbak", - "TRASH_FILES_MESSAGE": "De geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak.", - "TRASH_FILE_MESSAGE": "Het bestand wordt uit alle albums verwijderd en verplaatst naar de prullenbak.", - "DELETE_PERMANENTLY": "Permanent verwijderen", - "RESTORE": "Herstellen", - "RESTORE_TO_COLLECTION": "Terugzetten naar album", - "EMPTY_TRASH": "Prullenbak leegmaken", - "EMPTY_TRASH_TITLE": "Prullenbak leegmaken?", - "EMPTY_TRASH_MESSAGE": "Geselecteerde bestanden zullen permanent worden verwijderd van uw ente account.", - "LEAVE_SHARED_ALBUM": "Ja, verwijderen", - "LEAVE_ALBUM": "Album verlaten", - "LEAVE_SHARED_ALBUM_TITLE": "Gedeeld album verwijderen?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Je verlaat het album, en het zal niet meer zichtbaar voor je zijn.", - "NOT_FILE_OWNER": "U kunt bestanden niet verwijderen in een gedeeld album", - "CONFIRM_SELF_REMOVE_MESSAGE": "De geselecteerde items worden verwijderd uit dit album. De items die alleen in dit album staan, worden verplaatst naar 'Niet gecategoriseerd'.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Sommige van de items die u verwijdert zijn door andere mensen toegevoegd, en u verliest de toegang daartoe.", - "SORT_BY_CREATION_TIME_ASCENDING": "Oudste", - "SORT_BY_UPDATION_TIME_DESCENDING": "Laatst gewijzigd op", - "SORT_BY_NAME": "Naam", - "COMPRESS_THUMBNAILS": "Comprimeren van thumbnails", - "THUMBNAIL_REPLACED": "Thumbnails gecomprimeerd", - "FIX_THUMBNAIL": "Comprimeren", - "FIX_THUMBNAIL_LATER": "Later comprimeren", - "REPLACE_THUMBNAIL_NOT_STARTED": "Sommige van uw video thumbnails kunnen worden gecomprimeerd om ruimte te besparen. Wilt u dat ente ze comprimeert?", - "REPLACE_THUMBNAIL_COMPLETED": "Alle thumbnails zijn gecomprimeerd", - "REPLACE_THUMBNAIL_NOOP": "Je hebt geen thumbnails die verder gecomprimeerd kunnen worden", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Kon sommige van uw thumbnails niet comprimeren, probeer het opnieuw", - "FIX_CREATION_TIME": "Herstel tijd", - "FIX_CREATION_TIME_IN_PROGRESS": "Tijd aan het herstellen", - "CREATION_TIME_UPDATED": "Bestandstijd bijgewerkt", - "UPDATE_CREATION_TIME_NOT_STARTED": "Selecteer de optie die u wilt gebruiken", - "UPDATE_CREATION_TIME_COMPLETED": "Alle bestanden succesvol bijgewerkt", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "Bestandstijd update mislukt voor sommige bestanden, probeer het opnieuw", - "CAPTION_CHARACTER_LIMIT": "5000 tekens max", - "DATE_TIME_ORIGINAL": "EXIF:DatumTijdOrigineel", - "DATE_TIME_DIGITIZED": "EXIF:DatumTijdDigitaliseerd", - "METADATA_DATE": "EXIF:MetadataDatum", - "CUSTOM_TIME": "Aangepaste tijd", - "REOPEN_PLAN_SELECTOR_MODAL": "Abonnementen heropenen", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Kon abonnementen niet openen", - "INSTALL": "Installeren", - "SHARING_DETAILS": "Delen van informatie", - "MODIFY_SHARING": "Delen wijzigen", - "ADD_COLLABORATORS": "Samenwerker toevoegen", - "ADD_NEW_EMAIL": "Nieuw e-mailadres toevoegen", - "shared_with_people_zero": "Delen met specifieke mensen", - "shared_with_people_one": "Gedeeld met 1 persoon", - "shared_with_people_other": "Gedeeld met {{count, number}} mensen", - "participants_zero": "Geen deelnemers", - "participants_one": "1 deelnemer", - "participants_other": "{{count, number}} deelnemers", - "ADD_VIEWERS": "Voeg kijkers toe", - "PARTICIPANTS": "Deelnemers", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} zullen geen foto's meer kunnen toevoegen aan dit album

Ze zullen nog steeds bestaande foto's kunnen verwijderen die door hen zijn toegevoegd

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} zal foto's aan het album kunnen toevoegen", - "CONVERT_TO_VIEWER": "Ja, converteren naar kijker", - "CONVERT_TO_COLLABORATOR": "Ja, converteren naar samenwerker", - "CHANGE_PERMISSION": "Rechten aanpassen?", - "REMOVE_PARTICIPANT": "Verwijderen?", - "CONFIRM_REMOVE": "Ja, verwijderen", - "MANAGE": "Beheren", - "ADDED_AS": "Toegevoegd als", - "COLLABORATOR_RIGHTS": "Samenwerkers kunnen foto's en video's toevoegen aan het gedeelde album", - "REMOVE_PARTICIPANT_HEAD": "Deelnemer verwijderen", - "OWNER": "Eigenaar", - "COLLABORATORS": "Samenwerker", - "ADD_MORE": "Meer toevoegen", - "VIEWERS": "Kijkers", - "OR_ADD_EXISTING": "Of kies een bestaande", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} zullen worden verwijderd uit het gedeelde album

Alle door hen toegevoegde foto's worden ook uit het album verwijderd

", - "NOT_FOUND": "404 - niet gevonden", - "LINK_EXPIRED": "Link verlopen", - "LINK_EXPIRED_MESSAGE": "Deze link is verlopen of uitgeschakeld!", - "MANAGE_LINK": "Link beheren", - "LINK_TOO_MANY_REQUESTS": "Dit album is te populair voor ons om te verwerken!", - "FILE_DOWNLOAD": "Downloads toestaan", - "LINK_PASSWORD_LOCK": "Wachtwoord versleuteling", - "PUBLIC_COLLECT": "Foto's toevoegen toestaan", - "LINK_DEVICE_LIMIT": "Apparaat limiet", - "NO_DEVICE_LIMIT": "Geen", - "LINK_EXPIRY": "Vervaldatum link", - "NEVER": "Nooit", - "DISABLE_FILE_DOWNLOAD": "Download uitschakelen", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Weet u zeker dat u de downloadknop voor bestanden wilt uitschakelen?

Kijkers kunnen nog steeds screenshots maken of een kopie van uw foto's opslaan met behulp van externe hulpmiddelen.

", - "MALICIOUS_CONTENT": "Bevat kwaadwillende inhoud", - "COPYRIGHT": "Schending van het auteursrecht van iemand die ik mag vertegenwoordigen", - "SHARED_USING": "Gedeeld via ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Gebruik code {{referralCode}} om 10 GB gratis te krijgen", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Schakel cijfercode vergrendeling uit", - "DISABLE_PASSWORD_MESSAGE": "Weet u zeker dat u de cijfercode vergrendeling wilt uitschakelen?", - "PASSWORD_LOCK": "Cijfercode vergrendeling", - "LOCK": "Vergrendeling", - "DOWNLOAD_UPLOAD_LOGS": "Logboeken voor foutmeldingen", - "UPLOAD_FILES": "Bestand", - "UPLOAD_DIRS": "Map", - "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", - "DEDUPLICATE_FILES": "Dubbele bestanden verwijderen", - "AUTHENTICATOR_SECTION": "Verificatie apparaat", - "NO_DUPLICATES_FOUND": "Je hebt geen dubbele bestanden die kunnen worden gewist", - "CLUB_BY_CAPTURE_TIME": "Samenvoegen op tijd", - "FILES": "Bestanden", - "EACH": "Elke", - "DEDUPLICATE_BASED_ON_SIZE": "De volgende bestanden zijn samengevoegd op basis van hun groottes. Controleer en verwijder items waarvan je denkt dat ze dubbel zijn", - "STOP_ALL_UPLOADS_MESSAGE": "Weet u zeker dat u wilt stoppen met alle uploads die worden uitgevoerd?", - "STOP_UPLOADS_HEADER": "Stoppen met uploaden?", - "YES_STOP_UPLOADS": "Ja, stop uploaden", - "STOP_DOWNLOADS_HEADER": "Downloaden stoppen?", - "YES_STOP_DOWNLOADS": "Ja, downloads stoppen", - "STOP_ALL_DOWNLOADS_MESSAGE": "Weet je zeker dat je wilt stoppen met alle downloads die worden uitgevoerd?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", - "ALL_ALBUMS": "Alle albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "Alle verborgen albums", - "HIDDEN_ALBUMS": "Verborgen albums", - "HIDDEN_ITEMS": "Verborgen bestanden", - "HIDDEN_ITEMS_SECTION_NAME": "Verborgen_items", - "ENTER_TWO_FACTOR_OTP": "Voer de 6-cijferige code van uw verificatie app in.", - "CREATE_ACCOUNT": "Account aanmaken", - "COPIED": "Gekopieerd", - "CANVAS_BLOCKED_TITLE": "Kan thumbnail niet genereren", - "CANVAS_BLOCKED_MESSAGE": "

Het lijkt erop dat uw browser geen toegang heeft tot canvas, die nodig is om thumbnails voor uw foto's te genereren

Schakel toegang tot het canvas van uw browser in, of bekijk onze desktop app

", - "WATCH_FOLDERS": "Monitor mappen", - "UPGRADE_NOW": "Nu upgraden", - "RENEW_NOW": "Nu verlengen", - "STORAGE": "Opslagruimte", - "USED": "gebruikt", - "YOU": "Jij", - "FAMILY": "Familie", - "FREE": "free", - "OF": "van", - "WATCHED_FOLDERS": "Gemonitorde mappen", - "NO_FOLDERS_ADDED": "Nog geen mappen toegevoegd!", - "FOLDERS_AUTOMATICALLY_MONITORED": "De mappen die u hier toevoegt worden automatisch gemonitord", - "UPLOAD_NEW_FILES_TO_ENTE": "Nieuwe bestanden uploaden naar ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Verwijderde bestanden van ente opruimen", - "ADD_FOLDER": "Map toevoegen", - "STOP_WATCHING": "Stop monitoren", - "STOP_WATCHING_FOLDER": "Stop monitoren van map?", - "STOP_WATCHING_DIALOG_MESSAGE": "Uw bestaande bestanden zullen niet worden verwijderd, maar ente stopt met het automatisch bijwerken van het gekoppelde ente album bij wijzigingen in deze map.", - "YES_STOP": "Ja, stop", - "MONTH_SHORT": "mo", - "YEAR": "jaar", - "FAMILY_PLAN": "Familie abonnement", - "DOWNLOAD_LOGS": "Logboek downloaden", - "DOWNLOAD_LOGS_MESSAGE": "

Dit zal logboeken downloaden, die u ons kunt e-mailen om te helpen bij het debuggen van uw probleem.

Houd er rekening mee dat bestandsnamen worden opgenomen om problemen met specifieke bestanden bij te houden.

", - "CHANGE_FOLDER": "Map wijzigen", - "TWO_MONTHS_FREE": "Krijg 2 maanden gratis op jaarlijkse abonnementen", - "GB": "GB", - "POPULAR": "Populair", - "FREE_PLAN_OPTION_LABEL": "Doorgaan met gratis account", - "FREE_PLAN_DESCRIPTION": "1 GB voor 1 jaar", - "CURRENT_USAGE": "Huidig gebruik is {{usage}}", - "WEAK_DEVICE": "De webbrowser die u gebruikt is niet krachtig genoeg om uw foto's te versleutelen. Probeer in te loggen op uw computer, of download de ente mobiel/desktop app.", - "DRAG_AND_DROP_HINT": "Of sleep en plaats in het ente venster", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Uw geüploade gegevens worden gepland voor verwijdering, en uw account zal permanent worden verwijderd.

Deze actie is onomkeerbaar.", - "AUTHENTICATE": "Verifiëren", - "UPLOADED_TO_SINGLE_COLLECTION": "Geüpload naar enkele collectie", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Geüpload naar verschillende collecties", - "NEVERMIND": "Laat maar", - "UPDATE_AVAILABLE": "Update beschikbaar", - "UPDATE_INSTALLABLE_MESSAGE": "Er staat een nieuwe versie van ente klaar om te worden geïnstalleerd.", - "INSTALL_NOW": "Nu installeren", - "INSTALL_ON_NEXT_LAUNCH": "Installeren bij volgende start", - "UPDATE_AVAILABLE_MESSAGE": "Er is een nieuwe versie van ente vrijgegeven, maar deze kan niet automatisch worden gedownload en geïnstalleerd.", - "DOWNLOAD_AND_INSTALL": "Downloaden en installeren", - "IGNORE_THIS_VERSION": "Negeer deze versie", - "TODAY": "Vandaag", - "YESTERDAY": "Gisteren", - "NAME_PLACEHOLDER": "Naam...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Kan geen albums maken uit bestand/map mix", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Je hebt een mix van bestanden en mappen gesleept en laten vallen.

Geef ofwel alleen bestanden aan, of alleen mappen bij het selecteren van de optie om afzonderlijke albums te maken

", - "CHOSE_THEME": "Kies thema", - "ML_SEARCH": "ML zoeken (bèta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Dit zal algoritmes op het apparaat inschakelen die zullen beginnen met het lokaal analyseren van uw geüploade foto's.

Voor het eerst na inloggen of het inschakelen van deze functie zal het alle afbeeldingen op het lokale apparaat downloaden om ze te analyseren. Schakel dit dus alleen in als je akkoord bent met gegevensverbruik en lokale verwerking van alle afbeeldingen in uw fotobibliotheek.

Als dit de eerste keer is dat uw dit inschakelt, vragen we u ook om toestemming om gegevens te verwerken.

", - "ML_MORE_DETAILS": "Meer details", - "ENABLE_FACE_SEARCH": "Zoeken op gezichten inschakelen", - "ENABLE_FACE_SEARCH_TITLE": "Zoeken op gezichten inschakelen?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Als u zoeken op gezichten inschakelt, analyseert ente de gezichtsgeometrie uit uw foto's. Dit gebeurt op uw apparaat en alle gegenereerde biometrische gegevens worden end-to-end versleuteld.

Klik hier voor meer informatie over deze functie in ons privacybeleid

", - "DISABLE_BETA": "Bèta uitschakelen", - "DISABLE_FACE_SEARCH": "Zoeken op gezichten uitschakelen", - "DISABLE_FACE_SEARCH_TITLE": "Zoeken op gezichten uitschakelen?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente zal stoppen met het analyseren van de gezichtsgeometrie, en zal ML zoeken (beta) uitschakelen

U kan zoeken op gezichten opnieuw inschakelen wanneer u wilt, dus deze handeling is veilig.

", - "ADVANCED": "Geavanceerd", - "FACE_SEARCH_CONFIRMATION": "Ik begrijp het, en wil ente toestaan om gezichten te analyseren", - "LABS": "Lab's", - "YOURS": "jouw", - "PASSPHRASE_STRENGTH_WEAK": "Wachtwoord sterkte: Zwak", - "PASSPHRASE_STRENGTH_MODERATE": "Wachtwoord sterkte: Matig", - "PASSPHRASE_STRENGTH_STRONG": "Wachtwoord sterkte: Sterk", - "PREFERENCES": "Instellingen", - "LANGUAGE": "Taal", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Ongeldige export map", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

De export map die u heeft geselecteerd bestaat niet.

Selecteer een geldige map.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Abonnementsverificatie mislukt", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "na één uur", - "DAY": "na één dag", - "WEEK": "na één week", - "MONTH": "na één maand", - "YEAR": "na één jaar" - }, - "COPY_LINK": "Link kopiëren", - "DONE": "Voltooid", - "LINK_SHARE_TITLE": "Of deel een link", - "REMOVE_LINK": "Link verwijderen", - "CREATE_PUBLIC_SHARING": "Maak publieke link", - "PUBLIC_LINK_CREATED": "Publieke link aangemaakt", - "PUBLIC_LINK_ENABLED": "Publieke link ingeschakeld", - "COLLECT_PHOTOS": "Foto's verzamelen", - "PUBLIC_COLLECT_SUBTEXT": "Sta toe dat mensen met de link ook foto's kunnen toevoegen aan het gedeelde album.", - "STOP_EXPORT": "Stoppen", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} bestanden geëxporteerd", - "MIGRATING_EXPORT": "Voorbereiden...", - "RENAMING_COLLECTION_FOLDERS": "Albumnamen hernoemen...", - "TRASHING_DELETED_FILES": "Verwijderde bestanden naar prullenbak...", - "TRASHING_DELETED_COLLECTIONS": "Verwijderde albums naar prullenbak...", - "EXPORT_NOTIFICATION": { - "START": "Exporteren begonnen", - "IN_PROGRESS": "Exporteren is al bezig", - "FINISH": "Exporteren voltooid", - "UP_TO_DATE": "Geen nieuwe bestanden om te exporteren" - }, - "CONTINUOUS_EXPORT": "Continue synchroniseren", - "TOTAL_ITEMS": "Totaal aantal bestanden", - "PENDING_ITEMS": "Bestanden in behandeling", - "EXPORT_STARTING": "Exporteren begonnen...", - "DELETE_ACCOUNT_REASON_LABEL": "Wat is de belangrijkste reden waarom je jouw account verwijdert?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Kies een reden", - "DELETE_REASON": { - "MISSING_FEATURE": "Ik mis een belangrijke functie", - "BROKEN_BEHAVIOR": "De app of een bepaalde functie functioneert niet zoals ik verwacht", - "FOUND_ANOTHER_SERVICE": "Ik heb een andere dienst gevonden die me beter bevalt", - "NOT_LISTED": "Mijn reden wordt niet vermeld" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "We vinden het jammer je te zien gaan. Deel alsjeblieft je feedback om ons te helpen verbeteren.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Feedback", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Ja, ik wil permanent mijn account inclusief alle gegevens verwijderen", - "CONFIRM_DELETE_ACCOUNT": "Account verwijderen bevestigen", - "FEEDBACK_REQUIRED": "Help ons alsjeblieft met deze informatie", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Wat doet de andere dienst beter?", - "RECOVER_TWO_FACTOR": "Herstel tweestaps", - "at": "om", - "AUTH_NEXT": "volgende", - "AUTH_DOWNLOAD_MOBILE_APP": "Download onze mobiele app om uw geheimen te beheren", - "HIDDEN": "Verborgen", - "HIDE": "Verbergen", - "UNHIDE": "Zichtbaar maken", - "UNHIDE_TO_COLLECTION": "Zichtbaar maken in album", - "SORT_BY": "Sorteren op", - "NEWEST_FIRST": "Nieuwste eerst", - "OLDEST_FIRST": "Oudste eerst", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Dit bestand kan niet worden bekeken in de app, klik hier om het origineel te downloaden", - "SELECT_COLLECTION": "Album selecteren", - "PIN_ALBUM": "Album bovenaan vastzetten", - "UNPIN_ALBUM": "Album losmaken", - "DOWNLOAD_COMPLETE": "Download compleet", - "DOWNLOADING_COLLECTION": "{{name}} downloaden", - "DOWNLOAD_FAILED": "Download mislukt", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} bestanden", - "CHRISTMAS": "Kerst", - "CHRISTMAS_EVE": "Kerstavond", - "NEW_YEAR": "Nieuwjaar", - "NEW_YEAR_EVE": "Oudjaarsavond", - "IMAGE": "Afbeelding", - "VIDEO": "Video", - "LIVE_PHOTO": "Live foto", - "CONVERT": "Converteren", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Weet u zeker dat u de editor wilt afsluiten?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Download uw bewerkte afbeelding of sla een kopie op in ente om uw wijzigingen te behouden.", - "BRIGHTNESS": "Helderheid", - "CONTRAST": "Contrast", - "SATURATION": "Saturatie", - "BLUR": "Vervagen", - "INVERT_COLORS": "Kleuren omkeren", - "ASPECT_RATIO": "Beeldverhouding", - "SQUARE": "Vierkant", - "ROTATE_LEFT": "Roteer links", - "ROTATE_RIGHT": "Roteer rechts", - "FLIP_VERTICALLY": "Verticaal spiegelen", - "FLIP_HORIZONTALLY": "Horizontaal spiegelen", - "DOWNLOAD_EDITED": "Download Bewerkt", - "SAVE_A_COPY_TO_ENTE": "Kopie in ente opslaan", - "RESTORE_ORIGINAL": "Origineel herstellen", - "TRANSFORM": "Transformeer", - "COLORS": "Kleuren", - "FLIP": "Omdraaien", - "ROTATION": "Draaiing", - "RESET": "Herstellen", - "PHOTO_EDITOR": "Fotobewerker", - "FASTER_UPLOAD": "Snellere uploads", - "FASTER_UPLOAD_DESCRIPTION": "Uploaden door nabije servers", - "MAGIC_SEARCH_STATUS": "Magische Zoekfunctie Status", - "INDEXED_ITEMS": "Geïndexeerde bestanden", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "Cache map", - "FREEHAND": "Losse hand", - "APPLY_CROP": "Bijsnijden toepassen", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Tenminste één transformatie of kleuraanpassing moet worden uitgevoerd voordat u opslaat.", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/pt-BR/translation.json b/web/apps/auth/public/locales/pt-BR/translation.json deleted file mode 100644 index 0da001742..000000000 --- a/web/apps/auth/public/locales/pt-BR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backups privados
para as suas memórias
", - "HERO_SLIDE_1": "Criptografia de ponta a ponta por padrão", - "HERO_SLIDE_2_TITLE": "
Armazenado com segurança
em um abrigo avançado
", - "HERO_SLIDE_2": "Feito para ter logenvidade", - "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registrar", - "NEW_USER": "Novo no ente", - "EXISTING_USER": "Usuário existente", - "ENTER_NAME": "Insira o nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Adicione um nome para que os seus amigos saibam a quem agradecer por estas ótimas fotos!", - "ENTER_EMAIL": "Insira o endereço de e-mail", - "EMAIL_ERROR": "Inserir um endereço de e-mail válido", - "REQUIRED": "Obrigatório", - "EMAIL_SENT": "Código de verificação enviado para {{email}}", - "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", - "ENTER_OTT": "Código de verificação", - "RESEND_MAIL": "Reenviar código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Ocorreu um erro. Tente novamente", - "INVALID_CODE": "Código de verificação inválido", - "EXPIRED_CODE": "O seu código de verificação expirou", - "SENDING": "Enviando...", - "SENT": "Enviado!", - "PASSWORD": "Senha", - "LINK_PASSWORD": "Insira a senha para desbloquear o álbum", - "RETURN_PASSPHRASE_HINT": "Senha", - "SET_PASSPHRASE": "Definir senha", - "VERIFY_PASSPHRASE": "Iniciar sessão", - "INCORRECT_PASSPHRASE": "Palavra-passe incorreta", - "ENTER_ENC_PASSPHRASE": "Por favor, digite uma senha que podemos usar para criptografar seus dados", - "PASSPHRASE_DISCLAIMER": "Não armazenamos sua senha, portanto, se você esquecê-la, não poderemos ajudarna recuperação de seus dados sem uma chave de recuperação.", - "WELCOME_TO_ENTE_HEADING": "Bem-vindo ao ", - "WELCOME_TO_ENTE_SUBHEADING": "Armazenamento criptografado de ponta a ponta de fotos e compartilhamento", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Onde suas melhores fotos vivem", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Gerando chaves de criptografia...", - "PASSPHRASE_HINT": "Senha", - "CONFIRM_PASSPHRASE": "Confirmar senha", - "REFERRAL_CODE_HINT": "Como você ouviu sobre o Ente? (opcional)", - "REFERRAL_INFO": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", - "PASSPHRASE_MATCH_ERROR": "As senhas não coincidem", - "CREATE_COLLECTION": "Novo álbum", - "ENTER_ALBUM_NAME": "Nome do álbum", - "CLOSE_OPTION": "Fechar (Esc)", - "ENTER_FILE_NAME": "Nome do arquivo", - "CLOSE": "Fechar", - "NO": "Não", - "NOTHING_HERE": "Nada para ver aqui! 👀", - "UPLOAD": "Enviar", - "IMPORT": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", - "SELECT_PHOTOS": "Selecionar fotos", - "FILE_UPLOAD": "Envio de Arquivo", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparando para enviar", - "1": "Lendo arquivos de metadados do google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} metadados dos arquivos extraídos", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} arquivos processados", - "4": "Cancelando envios restante", - "5": "Backup concluído" - }, - "FILE_NOT_UPLOADED_LIST": "Os seguintes arquivos não foram enviados", - "SUBSCRIPTION_EXPIRED": "Assinatura expirada", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Sua assinatura expirou, por favor renove-a", - "STORAGE_QUOTA_EXCEEDED": "Limite de armazenamento excedido", - "INITIAL_LOAD_DELAY_WARNING": "Primeiro carregamento pode levar algum tempo", - "USER_DOES_NOT_EXIST": "Desculpe, não foi possível encontrar um usuário com este e-mail", - "NO_ACCOUNT": "Não possui uma conta", - "ACCOUNT_EXISTS": "Já possui uma conta", - "CREATE": "Criar", - "DOWNLOAD": "Baixar", - "DOWNLOAD_OPTION": "Baixar (D)", - "DOWNLOAD_FAVORITES": "Baixar favoritos", - "DOWNLOAD_UNCATEGORIZED": "Baixar não categorizado", - "DOWNLOAD_HIDDEN_ITEMS": "Baixar itens ocultos", - "COPY_OPTION": "Copiar como PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Mudar para tela cheia (F)", - "ZOOM_IN_OUT": "Ampliar/Reduzir", - "PREVIOUS": "Anterior (←)", - "NEXT": "Próximo (→)", - "TITLE_PHOTOS": "Ente Fotos", - "TITLE_ALBUMS": "Ente Fotos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Envie sua primeira foto", - "IMPORT_YOUR_FOLDERS": "Importar suas pastas", - "UPLOAD_DROPZONE_MESSAGE": "Arraste para salvar seus arquivos", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Arraste para adicionar pasta monitorada", - "TRASH_FILES_TITLE": "Excluir arquivos?", - "TRASH_FILE_TITLE": "Excluir arquivo?", - "DELETE_FILES_TITLE": "Excluir imediatamente?", - "DELETE_FILES_MESSAGE": "Os arquivos selecionados serão excluídos permanentemente da sua conta ente.", - "DELETE": "Excluir", - "DELETE_OPTION": "Excluir (DEL)", - "FAVORITE_OPTION": "Favorito (L)", - "UNFAVORITE_OPTION": "Remover Favorito (L)", - "MULTI_FOLDER_UPLOAD": "Várias pastas detectadas", - "UPLOAD_STRATEGY_CHOICE": "Gostaria de enviá-los para", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Um único álbum", - "OR": "ou", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Álbuns separados", - "SESSION_EXPIRED_MESSAGE": "A sua sessão expirou. Por favor inicie sessão novamente para continuar", - "SESSION_EXPIRED": "Sessão expirada", - "PASSWORD_GENERATION_FAILED": "Seu navegador foi incapaz de gerar uma chave forte que atende aos padrões de criptografia, por favor, tente usar o aplicativo móvel ou outro navegador", - "CHANGE_PASSWORD": "Alterar senha", - "GO_BACK": "Voltar", - "RECOVERY_KEY": "Chave de recuperação", - "SAVE_LATER": "Fazer isso mais tarde", - "SAVE": "Salvar Chave", - "RECOVERY_KEY_DESCRIPTION": "Caso você esqueça sua senha, a única maneira de recuperar seus dados é com essa chave.", - "RECOVER_KEY_GENERATION_FAILED": "Não foi possível gerar o código de recuperação, tente novamente", - "KEY_NOT_STORED_DISCLAIMER": "Não armazenamos essa chave, por favor, salve essa chave de palavras em um lugar seguro", - "FORGOT_PASSWORD": "Esqueci a senha", - "RECOVER_ACCOUNT": "Recuperar conta", - "RECOVERY_KEY_HINT": "Chave de recuperação", - "RECOVER": "Recuperar", - "NO_RECOVERY_KEY": "Não possui a chave de recuperação?", - "INCORRECT_RECOVERY_KEY": "Chave de recuperação incorreta", - "SORRY": "Desculpe", - "NO_RECOVERY_KEY_MESSAGE": "Devido à natureza do nosso protocolo de criptografia de ponta a ponta, seus dados não podem ser descriptografados sem sua senha ou chave de recuperação", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Por favor, envie um e-mail para {{emailID}} a partir do seu endereço de e-mail registrado", - "CONTACT_SUPPORT": "Falar com o suporte", - "REQUEST_FEATURE": "Solicitar Funcionalidade", - "SUPPORT": "Suporte", - "CONFIRM": "Confirmar", - "CANCEL": "Cancelar", - "LOGOUT": "Encerrar sessão", - "DELETE_ACCOUNT": "Excluir conta", - "DELETE_ACCOUNT_MESSAGE": "

Por favor, envie um e-mail para {{emailID}} a partir do seu endereço de e-mail registrado.

Seu pedido será processado dentro de 72 horas.

", - "LOGOUT_MESSAGE": "Você tem certeza que deseja encerrar a sessão?", - "CHANGE_EMAIL": "Mudar e-mail", - "OK": "Aceitar", - "SUCCESS": "Bem-sucedido", - "ERROR": "Erro", - "MESSAGE": "Mensagem", - "INSTALL_MOBILE_APP": "Instale nosso aplicativo Android ou iOS para fazer backup automático de todas as suas fotos", - "DOWNLOAD_APP_MESSAGE": "Desculpe, esta operação só é suportada em nosso aplicativo para computador", - "DOWNLOAD_APP": "Baixar aplicativo para computador", - "EXPORT": "Exportar dados", - "SUBSCRIPTION": "Assinatura", - "SUBSCRIBE": "Assinar", - "MANAGEMENT_PORTAL": "Gerenciar métodos de pagamento", - "MANAGE_FAMILY_PORTAL": "Gerenciar Família", - "LEAVE_FAMILY_PLAN": "Sair do plano familiar", - "LEAVE": "Sair", - "LEAVE_FAMILY_CONFIRM": "Tem certeza que deseja sair do plano familiar?", - "CHOOSE_PLAN": "Escolha seu plano", - "MANAGE_PLAN": "Gerenciar sua assinatura", - "ACTIVE": "Ativo", - "OFFLINE_MSG": "Você está offline, memórias em cache estão sendo mostradas", - "FREE_SUBSCRIPTION_INFO": "Você está no plano gratuito que expira em {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Você está em um plano familiar gerenciado por", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renovações em {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina em {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Sua assinatura será cancelada em {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Seu complemento {{storage, string}} é válido até o dia {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Você excedeu sua cota de armazenamento, por favor atualize", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Recebemos o seu pagamento

Sua assinatura é válida até {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Sua compra foi cancelada, por favor, tente novamente se quiser assinar", - "SUBSCRIPTION_PURCHASE_FAILED": "Falha na compra de assinatura, tente novamente", - "SUBSCRIPTION_UPDATE_FAILED": "Falha ao atualizar assinatura, tente novamente", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Desculpe-nos, o pagamento falhou quando tentamos cobrar o seu cartão, por favor atualize seu método de pagamento e tente novamente", - "STRIPE_AUTHENTICATION_FAILED": "Não foi possível autenticar seu método de pagamento. Por favor, escolha outro método de pagamento e tente novamente", - "UPDATE_PAYMENT_METHOD": "Atualizar forma de pagamento", - "MONTHLY": "Mensal", - "YEARLY": "Anual", - "UPDATE_SUBSCRIPTION_MESSAGE": "Tem certeza que deseja trocar de plano?", - "UPDATE_SUBSCRIPTION": "Mudar de plano", - "CANCEL_SUBSCRIPTION": "Cancelar assinatura", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Todos os seus dados serão excluídos dos nossos servidores no final deste período de cobrança.

Você tem certeza que deseja cancelar sua assinatura?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Tem certeza que deseja cancelar sua assinatura?

", - "SUBSCRIPTION_CANCEL_FAILED": "Falha ao cancelar a assinatura", - "SUBSCRIPTION_CANCEL_SUCCESS": "Assinatura cancelada com sucesso", - "REACTIVATE_SUBSCRIPTION": "Reativar assinatura", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Uma vez reativado, você será cobrado em {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Assinatura ativada com sucesso ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Falha ao reativar as renovações de assinaturas", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Obrigado", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancelar assinatura móvel", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Por favor, cancele sua assinatura do aplicativo móvel para ativar uma assinatura aqui", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Entre em contato com {{emailID}} para gerenciar sua assinatura", - "RENAME": "Renomear", - "RENAME_FILE": "Renomear arquivo", - "RENAME_COLLECTION": "Renomear álbum", - "DELETE_COLLECTION_TITLE": "Excluir álbum?", - "DELETE_COLLECTION": "Excluir álbum", - "DELETE_COLLECTION_MESSAGE": "Também excluir as fotos (e vídeos) presentes neste álbum de todos os outros álbuns dos quais eles fazem parte?", - "DELETE_PHOTOS": "Excluir fotos", - "KEEP_PHOTOS": "Manter fotos", - "SHARE": "Compartilhar", - "SHARE_COLLECTION": "Compartilhar álbum", - "SHAREES": "Compartilhado com", - "SHARE_WITH_SELF": "Você não pode compartilhar consigo mesmo", - "ALREADY_SHARED": "Ops, você já está compartilhando isso com {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Álbum compartilhado não permitido", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Compartilhamento está desabilitado para contas gratuitas", - "DOWNLOAD_COLLECTION": "Baixar álbum", - "DOWNLOAD_COLLECTION_MESSAGE": "

Tem certeza que deseja baixar o álbum completo?

Todos os arquivos serão colocados na fila para baixar sequencialmente

", - "CREATE_ALBUM_FAILED": "Falha ao criar álbum, por favor tente novamente", - "SEARCH": "Pesquisar", - "SEARCH_RESULTS": "Resultados de pesquisa", - "NO_RESULTS": "Nenhum resultado encontrado", - "SEARCH_HINT": "Pesquisar por álbuns, datas, descrições, ...", - "SEARCH_TYPE": { - "COLLECTION": "Álbum", - "LOCATION": "Local", - "CITY": "Local", - "DATE": "Data", - "FILE_NAME": "Nome do arquivo", - "THING": "Conteúdo", - "FILE_CAPTION": "Descrição", - "FILE_TYPE": "Tipo de arquivo", - "CLIP": "Mágica" - }, - "photos_count_zero": "Sem memórias", - "photos_count_one": "1 memória", - "photos_count_other": "{{count, number}} memórias", - "TERMS_AND_CONDITIONS": "Eu concordo com os termos e a política de privacidade", - "ADD_TO_COLLECTION": "Adicionar ao álbum", - "SELECTED": "selecionado", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Este vídeo não pode ser reproduzido no seu navegador", - "PEOPLE": "Pessoas", - "INDEXING_SCHEDULED": "Indexação está programada...", - "ANALYZING_PHOTOS": "Indexando fotos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indexando pessoas em {{indexStatus.nSyncedFiles,number}} fotos...", - "INDEXING_DONE": "Foram indexadas {{indexStatus.nSyncedFiles,number}} fotos", - "UNIDENTIFIED_FACES": "rostos não identificados", - "OBJECTS": "objetos", - "TEXT": "texto", - "INFO": "Informação ", - "INFO_OPTION": "Informação (I)", - "FILE_NAME": "Nome do arquivo", - "CAPTION_PLACEHOLDER": "Adicionar uma descrição", - "LOCATION": "Local", - "SHOW_ON_MAP": "Ver no OpenStreetMap", - "MAP": "Mapa", - "MAP_SETTINGS": "Ajustes do mapa", - "ENABLE_MAPS": "Habilitar mapa?", - "ENABLE_MAP": "Habilitar mapa", - "DISABLE_MAPS": "Desativar Mapas?", - "ENABLE_MAP_DESCRIPTION": "Isto mostrará suas fotos em um mapa do mundo.

Este mapa é hospedado pelo OpenStreetMap , e os exatos locais de suas fotos nunca são compartilhados.

Você pode desativar esse recurso a qualquer momento nas Configurações.

", - "DISABLE_MAP_DESCRIPTION": "

Isto irá desativar a exibição de suas fotos em um mapa mundial.

Você pode ativar este recurso a qualquer momento nas Configurações.

", - "DISABLE_MAP": "Desabilitar mapa", - "DETAILS": "Detalhes", - "VIEW_EXIF": "Ver todos os dados EXIF", - "NO_EXIF": "Sem dados EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Dois fatores", - "TWO_FACTOR_AUTHENTICATION": "Autenticação de dois fatores", - "TWO_FACTOR_QR_INSTRUCTION": "Digitalize o código QR abaixo com o seu aplicativo de autenticador favorito", - "ENTER_CODE_MANUALLY": "Inserir código manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Por favor, insira este código no seu aplicativo autenticador favorito", - "SCAN_QR_CODE": "Em vez disso, escaneie um Código QR", - "ENABLE_TWO_FACTOR": "Ativar autenticação de dois fatores", - "ENABLE": "Habilitar", - "LOST_DEVICE": "Dispositivo de dois fatores perdido", - "INCORRECT_CODE": "Código incorreto", - "TWO_FACTOR_INFO": "Adicione uma camada adicional de segurança, exigindo mais do que seu e-mail e senha para entrar na sua conta", - "DISABLE_TWO_FACTOR_LABEL": "Desativar autenticação de dois fatores", - "UPDATE_TWO_FACTOR_LABEL": "Atualize seu dispositivo autenticador", - "DISABLE": "Desativar", - "RECONFIGURE": "Reconfigurar", - "UPDATE_TWO_FACTOR": "Atualizar dois fatores", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuar adiante anulará qualquer autenticador configurado anteriormente", - "UPDATE": "Atualização", - "DISABLE_TWO_FACTOR": "Desativar autenticação de dois fatores", - "DISABLE_TWO_FACTOR_MESSAGE": "Você tem certeza de que deseja desativar a autenticação de dois fatores", - "TWO_FACTOR_DISABLE_FAILED": "Não foi possível desativar dois fatores, por favor tente novamente", - "EXPORT_DATA": "Exportar dados", - "SELECT_FOLDER": "Selecione a pasta", - "DESTINATION": "Destino", - "START": "Iniciar", - "LAST_EXPORT_TIME": "Data da última exportação", - "EXPORT_AGAIN": "Resincronizar", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Armazenamento local não acessível", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Seu navegador ou uma extensão está bloqueando o ente de salvar os dados no armazenamento local. Por favor, tente carregar esta página depois de alternar o modo de navegação.", - "SEND_OTT": "Enviar códigos OTP", - "EMAIl_ALREADY_OWNED": "Este e-mail já está em uso", - "ETAGS_BLOCKED": "

Não foi possível fazer o envio dos seguintes arquivos devido à configuração do seu navegador.

Por favor, desative quaisquer complementos que possam estar impedindo o ente de utilizar eTags para enviar arquivos grandes, ou utilize nosso aplicativo para computador para uma experiência de importação mais confiável.

", - "SKIPPED_VIDEOS_INFO": "

Atualmente, não oferecemos suporte para adicionar vídeos através de links públicos.

Para compartilhar vídeos, por favor, faça cadastro no ente e compartilhe com os destinatários pretendidos usando seus e-mails.

", - "LIVE_PHOTOS_DETECTED": "Os arquivos de foto e vídeo das suas Fotos em Movimento foram mesclados em um único arquivo", - "RETRY_FAILED": "Repetir envios que falharam", - "FAILED_UPLOADS": "Envios com falhas ", - "SKIPPED_FILES": "Envios ignorados", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Falha ao gerar miniaturas", - "UNSUPPORTED_FILES": "Arquivos não suportados", - "SUCCESSFUL_UPLOADS": "Envios bem sucedidos", - "SKIPPED_INFO": "Ignorar estes como existem arquivos com nomes correspondentes no mesmo álbum", - "UNSUPPORTED_INFO": "ente ainda não suporta estes formatos de arquivo", - "BLOCKED_UPLOADS": "Envios bloqueados", - "SKIPPED_VIDEOS": "Vídeos ignorados", - "INPROGRESS_METADATA_EXTRACTION": "Em andamento", - "INPROGRESS_UPLOADS": "Envios em andamento", - "TOO_LARGE_UPLOADS": "Arquivos grandes", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Armazenamento insuficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Estes arquivos não foram carregados pois excedem o tamanho máximo para seu plano de armazenamento", - "TOO_LARGE_INFO": "Estes arquivos não foram carregados pois excedem nosso limite máximo de tamanho de arquivo", - "THUMBNAIL_GENERATION_FAILED_INFO": "Estes arquivos foram enviados, mas infelizmente não conseguimos gerar as miniaturas para eles.", - "UPLOAD_TO_COLLECTION": "Enviar para o álbum", - "UNCATEGORIZED": "Sem categoria", - "ARCHIVE": "Arquivar", - "FAVORITES": "Favoritos", - "ARCHIVE_COLLECTION": "Arquivar álbum", - "ARCHIVE_SECTION_NAME": "Arquivar", - "ALL_SECTION_NAME": "Todos", - "MOVE_TO_COLLECTION": "Mover para álbum", - "UNARCHIVE": "Desarquivar", - "UNARCHIVE_COLLECTION": "Desarquivar álbum", - "HIDE_COLLECTION": "Ocultar álbum", - "UNHIDE_COLLECTION": "Reexibir álbum", - "MOVE": "Mover", - "ADD": "Adicionar", - "REMOVE": "Remover", - "YES_REMOVE": "Sim, remover", - "REMOVE_FROM_COLLECTION": "Remover do álbum", - "TRASH": "Lixeira", - "MOVE_TO_TRASH": "Mover para a lixeira", - "TRASH_FILES_MESSAGE": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.", - "TRASH_FILE_MESSAGE": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.", - "DELETE_PERMANENTLY": "Excluir permanentemente", - "RESTORE": "Restaurar", - "RESTORE_TO_COLLECTION": "Restaurar para álbum", - "EMPTY_TRASH": "Esvaziar a lixeira", - "EMPTY_TRASH_TITLE": "Esvaziar a lixeira?", - "EMPTY_TRASH_MESSAGE": "Estes arquivos serão excluídos permanentemente da sua conta do ente.", - "LEAVE_SHARED_ALBUM": "Sim, sair", - "LEAVE_ALBUM": "Sair do álbum", - "LEAVE_SHARED_ALBUM_TITLE": "Sair do álbum compartilhado?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Você deixará o álbum e ele deixará de ser visível para você.", - "NOT_FILE_OWNER": "Você não pode excluir arquivos em um álbum compartilhado", - "CONFIRM_SELF_REMOVE_MESSAGE": "Os itens selecionados serão removidos deste álbum. Itens que estão somente neste álbum serão movidos a aba Sem Categoria.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Alguns dos itens que você está removendo foram adicionados por outras pessoas, e você perderá o acesso a eles.", - "SORT_BY_CREATION_TIME_ASCENDING": "Mais antigo", - "SORT_BY_UPDATION_TIME_DESCENDING": "Última atualização", - "SORT_BY_NAME": "Nome", - "COMPRESS_THUMBNAILS": "Compactar miniaturas", - "THUMBNAIL_REPLACED": "Miniaturas compactadas", - "FIX_THUMBNAIL": "Compactar", - "FIX_THUMBNAIL_LATER": "Compactar depois", - "REPLACE_THUMBNAIL_NOT_STARTED": "Algumas miniaturas de seus vídeos podem ser compactadas para economizar espaço. Você gostaria de compactá-las?", - "REPLACE_THUMBNAIL_COMPLETED": "Miniaturas compactadas com sucesso", - "REPLACE_THUMBNAIL_NOOP": "Você não tem nenhuma miniatura que possa ser compactadas mais", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Não foi possível compactar algumas das suas miniaturas, por favor tente novamente", - "FIX_CREATION_TIME": "Corrigir hora", - "FIX_CREATION_TIME_IN_PROGRESS": "Corrigindo horário", - "CREATION_TIME_UPDATED": "Hora do arquivo atualizado", - "UPDATE_CREATION_TIME_NOT_STARTED": "Selecione a carteira que você deseja usar", - "UPDATE_CREATION_TIME_COMPLETED": "Todos os arquivos atualizados com sucesso", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "A atualização do horário falhou para alguns arquivos, por favor, tente novamente", - "CAPTION_CHARACTER_LIMIT": "5000 caracteres no máximo", - "DATE_TIME_ORIGINAL": "Data e Hora Original", - "DATE_TIME_DIGITIZED": "Data e Hora Digitalizada", - "METADATA_DATE": "Data de Metadados", - "CUSTOM_TIME": "Tempo personalizado", - "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planos", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Falha ao abrir planos", - "INSTALL": "Instalar", - "SHARING_DETAILS": "Detalhes de compartilhamento", - "MODIFY_SHARING": "Modificar compartilhamento", - "ADD_COLLABORATORS": "Adicionar colaboradores", - "ADD_NEW_EMAIL": "Adicionar um novo email", - "shared_with_people_zero": "Compartilhar com pessoas específicas", - "shared_with_people_one": "Compartilhado com 1 pessoa", - "shared_with_people_other": "Compartilhado com {{count, number}} pessoas", - "participants_zero": "Nenhum participante", - "participants_one": "1 participante", - "participants_other": "{{count, number}} participantes", - "ADD_VIEWERS": "Adicionar visualizações", - "PARTICIPANTS": "Participantes", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} Não poderá adicionar mais fotos a este álbum

Eles ainda poderão remover as fotos existentes adicionadas por eles

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} poderá adicionar fotos ao álbum", - "CONVERT_TO_VIEWER": "Sim, converter para visualizador", - "CONVERT_TO_COLLABORATOR": "Sim, converter para colaborador", - "CHANGE_PERMISSION": "Alterar permissões?", - "REMOVE_PARTICIPANT": "Remover?", - "CONFIRM_REMOVE": "Sim, remover", - "MANAGE": "Gerenciar", - "ADDED_AS": "Adicionado como", - "COLLABORATOR_RIGHTS": "Os colaboradores podem adicionar fotos e vídeos ao álbum compartilhado", - "REMOVE_PARTICIPANT_HEAD": "Remover participante", - "OWNER": "Proprietário", - "COLLABORATORS": "Colaboradores", - "ADD_MORE": "Adicionar mais", - "VIEWERS": "Visualizações", - "OR_ADD_EXISTING": "Ou escolha um existente", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} será removido deste álbum compartilhado

Quaisquer fotos adicionadas por eles também serão removidas do álbum

", - "NOT_FOUND": "404 Página não encontrada", - "LINK_EXPIRED": "Link expirado", - "LINK_EXPIRED_MESSAGE": "Este link expirou ou foi desativado!", - "MANAGE_LINK": "Gerenciar link", - "LINK_TOO_MANY_REQUESTS": "Desculpe, este álbum foi visualizado em muitos dispositivos!", - "FILE_DOWNLOAD": "Permitir transferências", - "LINK_PASSWORD_LOCK": "Bloqueio de senha", - "PUBLIC_COLLECT": "Permitir adicionar fotos", - "LINK_DEVICE_LIMIT": "Limite de dispositivos", - "NO_DEVICE_LIMIT": "Nenhum", - "LINK_EXPIRY": "Expiração do link", - "NEVER": "Nunca", - "DISABLE_FILE_DOWNLOAD": "Desabilitar transferência", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Tem certeza de que deseja desativar o botão de download para arquivos?

Os visualizadores ainda podem capturar imagens da tela ou salvar uma cópia de suas fotos usando ferramentas externas.

", - "MALICIOUS_CONTENT": "Contém conteúdo malicioso", - "COPYRIGHT": "Viola os direitos autorais de alguém que estou autorizado a representar", - "SHARED_USING": "Compartilhar usando ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Use o código {{referralCode}} para obter 10 GB de graça", - "LIVE": "AO VIVO", - "DISABLE_PASSWORD": "Desativar bloqueio por senha", - "DISABLE_PASSWORD_MESSAGE": "Tem certeza que deseja desativar o bloqueio por senha?", - "PASSWORD_LOCK": "Bloqueio de senha", - "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuração", - "UPLOAD_FILES": "Arquivo", - "UPLOAD_DIRS": "Pasta", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Arquivos Deduplicados", - "AUTHENTICATOR_SECTION": "Autenticação", - "NO_DUPLICATES_FOUND": "Você não tem arquivos duplicados que possam ser limpos", - "CLUB_BY_CAPTURE_TIME": "Agrupar por tempo de captura", - "FILES": "Arquivos", - "EACH": "Cada", - "DEDUPLICATE_BASED_ON_SIZE": "Os seguintes arquivos foram listados com base em seus tamanhos, por favor, reveja e exclua os itens que você acredita que são duplicados", - "STOP_ALL_UPLOADS_MESSAGE": "Tem certeza que deseja parar todos os envios em andamento?", - "STOP_UPLOADS_HEADER": "Parar envios?", - "YES_STOP_UPLOADS": "Sim, parar envios", - "STOP_DOWNLOADS_HEADER": "Parar transferências?", - "YES_STOP_DOWNLOADS": "Sim, parar transferências", - "STOP_ALL_DOWNLOADS_MESSAGE": "Tem certeza que deseja parar todos as transferências em andamento?", - "albums_one": "1 Álbum", - "albums_other": "{{count, number}} Álbuns", - "ALL_ALBUMS": "Todos os álbuns", - "ALBUMS": "Álbuns", - "ALL_HIDDEN_ALBUMS": "Todos os álbuns ocultos", - "HIDDEN_ALBUMS": "Álbuns ocultos", - "HIDDEN_ITEMS": "Itens ocultos", - "HIDDEN_ITEMS_SECTION_NAME": "Itens_ocultos", - "ENTER_TWO_FACTOR_OTP": "Digite o código de 6 dígitos de\nseu aplicativo autenticador.", - "CREATE_ACCOUNT": "Criar uma conta", - "COPIED": "Copiado", - "CANVAS_BLOCKED_TITLE": "Não foi possível gerar miniatura", - "CANVAS_BLOCKED_MESSAGE": "

Parece que o seu navegador desativou o acesso à tela que é necessário para gerar miniaturas para as suas fotos

Por favor, habilite o acesso à tela do seu navegador, ou veja nosso aplicativo para computador

", - "WATCH_FOLDERS": "Pastas monitoradas", - "UPGRADE_NOW": "Aprimorar agora", - "RENEW_NOW": "Renovar agora", - "STORAGE": "Armazenamento", - "USED": "usado", - "YOU": "Você", - "FAMILY": "Família", - "FREE": "grátis", - "OF": "de", - "WATCHED_FOLDERS": "Pastas monitoradas", - "NO_FOLDERS_ADDED": "Nenhuma pasta adicionada ainda!", - "FOLDERS_AUTOMATICALLY_MONITORED": "As pastas que você adicionar aqui serão monitoradas automaticamente", - "UPLOAD_NEW_FILES_TO_ENTE": "Enviar novos arquivos para o ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Remover arquivos excluídos do ente", - "ADD_FOLDER": "Adicionar pasta", - "STOP_WATCHING": "Parar de acompanhar", - "STOP_WATCHING_FOLDER": "Parar de acompanhar a pasta?", - "STOP_WATCHING_DIALOG_MESSAGE": "Seus arquivos existentes não serão excluídos, mas ente irá parar de atualizar automaticamente o álbum associado em alterações nesta pasta.", - "YES_STOP": "Sim, parar", - "MONTH_SHORT": "mês", - "YEAR": "ano", - "FAMILY_PLAN": "Plano familiar", - "DOWNLOAD_LOGS": "Baixar logs", - "DOWNLOAD_LOGS_MESSAGE": "

Isto irá baixar os logs de depuração, que você pode enviar para nós para ajudar a depurar seu problema.

Por favor, note que os nomes de arquivos serão incluídos para ajudar a rastrear problemas com arquivos específicos.

", - "CHANGE_FOLDER": "Alterar pasta", - "TWO_MONTHS_FREE": "Obtenha 2 meses gratuitos em planos anuais", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continuar com teste gratuito", - "FREE_PLAN_DESCRIPTION": "1 GB por 1 ano", - "CURRENT_USAGE": "O uso atual é {{usage}}", - "WEAK_DEVICE": "O navegador da web que você está usando não é poderoso o suficiente para criptografar suas fotos. Por favor, tente entrar para o ente no computador ou baixe o aplicativo móvel.", - "DRAG_AND_DROP_HINT": "Ou arraste e solte na janela ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Seus dados enviados serão agendados para exclusão e sua conta será excluída permanentemente.

Essa ação não é reversível.", - "AUTHENTICATE": "Autenticar", - "UPLOADED_TO_SINGLE_COLLECTION": "Enviado para coleção única", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Enviada para separar coleções", - "NEVERMIND": "Esquecer", - "UPDATE_AVAILABLE": "Atualização disponível", - "UPDATE_INSTALLABLE_MESSAGE": "Uma nova versão do ente está pronta para ser instalada.", - "INSTALL_NOW": "Instalar agora", - "INSTALL_ON_NEXT_LAUNCH": "Instalar na próxima inicialização", - "UPDATE_AVAILABLE_MESSAGE": "Uma nova versão do ente foi lançada, mas não pode ser baixada e instalada automaticamente.", - "DOWNLOAD_AND_INSTALL": "Baixar e instalar", - "IGNORE_THIS_VERSION": "Ignorar esta versão", - "TODAY": "Hoje", - "YESTERDAY": "Ontem", - "NAME_PLACEHOLDER": "Nome...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Não foi possível criar álbuns a partir da mistura de arquivos/pastas", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Você arrastou e deixou uma mistura de arquivos e pastas.

Por favor, forneça apenas arquivos ou apenas pastas ao selecionar a opção para criar álbuns separados

", - "CHOSE_THEME": "Escolher tema", - "ML_SEARCH": "Reconhecimento facial", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Isso permitirá aprendizado de máquina no dispositivo e busca facial, iniciando a análise de suas fotos enviadas localmente.

Na primeira execução após o login ou habilitação desta funcionalidade, será feito o download de todas as imagens no dispositivo local para análise. Portanto, ative isso apenas se estiver confortável com o consumo de largura de banda e processamento local de todas as imagens em sua biblioteca de fotos.

Se esta for a primeira vez que você está habilitando isso, também solicitaremos sua permissão para processar dados faciais.

", - "ML_MORE_DETAILS": "Mais detalhes", - "ENABLE_FACE_SEARCH": "Habilitar reconhecimento facial", - "ENABLE_FACE_SEARCH_TITLE": "Habilitar reconhecimento facial?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos. Isso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta.

Por favor, clique aqui para obter mais detalhes sobre esta funcionalidade em nossa política de privacidade

", - "DISABLE_BETA": "Pausar reconhecimento", - "DISABLE_FACE_SEARCH": "Desativar reconhecimento facial", - "DISABLE_FACE_SEARCH_TITLE": "Desativar reconhecimento facial?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

Ente irá parar de processar geometria facial.

Você pode reativar o reconhecimento facial novamente, se desejar, então esta operação está segura.

", - "ADVANCED": "Avançado", - "FACE_SEARCH_CONFIRMATION": "Eu entendo, e desejo permitir que o ente processe a geometria do rosto", - "LABS": "Laboratórios", - "YOURS": "seu", - "PASSPHRASE_STRENGTH_WEAK": "Força da senha: fraca", - "PASSPHRASE_STRENGTH_MODERATE": "Força da senha: moderada", - "PASSPHRASE_STRENGTH_STRONG": "Força da senha: forte", - "PREFERENCES": "Preferências", - "LANGUAGE": "Idioma", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Diretório de exportação inválido", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

O diretório de exportação que você selecionou não existe.

Por favor, selecione um diretório válido.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Falha na verificação de assinatura", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "após uma hora", - "DAY": "após um dia", - "WEEK": "após uma semana", - "MONTH": "após um mês", - "YEAR": "após um ano" - }, - "COPY_LINK": "Copiar link", - "DONE": "Concluído", - "LINK_SHARE_TITLE": "Ou compartilhe um link", - "REMOVE_LINK": "Remover link", - "CREATE_PUBLIC_SHARING": "Criar link público", - "PUBLIC_LINK_CREATED": "Link público criado", - "PUBLIC_LINK_ENABLED": "Link público ativado", - "COLLECT_PHOTOS": "Coletar fotos", - "PUBLIC_COLLECT_SUBTEXT": "Permita que as pessoas com o link também adicionem fotos ao álbum compartilhado.", - "STOP_EXPORT": "Parar", - "EXPORT_PROGRESS": "{{progress.success, number}} / {{progress.total, number}} itens sincronizados", - "MIGRATING_EXPORT": "Preparando...", - "RENAMING_COLLECTION_FOLDERS": "Renomeando pastas do álbum...", - "TRASHING_DELETED_FILES": "Descartando arquivos excluídos...", - "TRASHING_DELETED_COLLECTIONS": "Descartando álbuns excluídos...", - "EXPORT_NOTIFICATION": { - "START": "Exportação iniciada", - "IN_PROGRESS": "Exportação já em andamento", - "FINISH": "Exportação finalizada", - "UP_TO_DATE": "Não há arquivos novos para exportar" - }, - "CONTINUOUS_EXPORT": "Sincronizar continuamente", - "TOTAL_ITEMS": "Total de itens", - "PENDING_ITEMS": "Itens pendentes", - "EXPORT_STARTING": "Iniciando a exportação...", - "DELETE_ACCOUNT_REASON_LABEL": "Qual é o principal motivo para você excluir sua conta?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Selecione um motivo", - "DELETE_REASON": { - "MISSING_FEATURE": "Está faltando um recurso que eu preciso", - "BROKEN_BEHAVIOR": "O aplicativo ou um determinado recurso não está funcionando como eu acredito que deveria", - "FOUND_ANOTHER_SERVICE": "Encontrei outro serviço que gosto mais", - "NOT_LISTED": "Meu motivo não está listado" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Sentimos muito em vê-lo partir. Explique por que você está partindo para nos ajudar a melhorar.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Comentários", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Sim, desejo excluir permanentemente esta conta e todos os seus dados", - "CONFIRM_DELETE_ACCOUNT": "Confirmar exclusão da conta", - "FEEDBACK_REQUIRED": "Por favor, ajude-nos com esta informação", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "O que o outro serviço faz melhor?", - "RECOVER_TWO_FACTOR": "Recuperar dois fatores", - "at": "em", - "AUTH_NEXT": "próximo", - "AUTH_DOWNLOAD_MOBILE_APP": "Baixe nosso aplicativo móvel para gerenciar seus segredos", - "HIDDEN": "Escondido", - "HIDE": "Ocultar", - "UNHIDE": "Desocultar", - "UNHIDE_TO_COLLECTION": "Reexibir para o álbum", - "SORT_BY": "Ordenar por", - "NEWEST_FIRST": "Mais recentes primeiro", - "OLDEST_FIRST": "Mais antigo primeiro", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Este arquivo não pôde ser pré-visualizado. Clique aqui para baixar o original.", - "SELECT_COLLECTION": "Selecionar álbum", - "PIN_ALBUM": "Fixar álbum", - "UNPIN_ALBUM": "Desafixar álbum", - "DOWNLOAD_COMPLETE": "Transferência concluída", - "DOWNLOADING_COLLECTION": "Transferindo {{name}}", - "DOWNLOAD_FAILED": "Falha ao baixar", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} arquivos", - "CHRISTMAS": "Natal", - "CHRISTMAS_EVE": "Véspera de Natal", - "NEW_YEAR": "Ano Novo", - "NEW_YEAR_EVE": "Véspera de Ano Novo", - "IMAGE": "Imagem", - "VIDEO": "Vídeo", - "LIVE_PHOTO": "Fotos em movimento", - "CONVERT": "Converter", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Tem certeza de que deseja fechar o editor?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Baixe sua imagem editada ou salve uma cópia para o ente para persistir nas alterações.", - "BRIGHTNESS": "Brilho", - "CONTRAST": "Contraste", - "SATURATION": "Saturação", - "BLUR": "Desfoque", - "INVERT_COLORS": "Inverter Cores", - "ASPECT_RATIO": "Proporção da imagem", - "SQUARE": "Quadrado", - "ROTATE_LEFT": "Girar para a Esquerda", - "ROTATE_RIGHT": "Girar para a Direita", - "FLIP_VERTICALLY": "Inverter verticalmente", - "FLIP_HORIZONTALLY": "Inverter horizontalmente", - "DOWNLOAD_EDITED": "Transferência Editada", - "SAVE_A_COPY_TO_ENTE": "Salvar uma cópia para o ente", - "RESTORE_ORIGINAL": "Restaurar original", - "TRANSFORM": "Transformar", - "COLORS": "Cores", - "FLIP": "Inverter", - "ROTATION": "Rotação", - "RESET": "Redefinir", - "PHOTO_EDITOR": "Editor de Fotos", - "FASTER_UPLOAD": "Envios mais rápidos", - "FASTER_UPLOAD_DESCRIPTION": "Rotas enviam em servidores próximos", - "MAGIC_SEARCH_STATUS": "Estado da busca mágica", - "INDEXED_ITEMS": "Itens indexados", - "CAST_ALBUM_TO_TV": "Reproduzir álbum na TV", - "ENTER_CAST_PIN_CODE": "Digite o código que você vê na TV abaixo para parear este dispositivo.", - "PAIR_DEVICE_TO_TV": "Parear dispositivos", - "TV_NOT_FOUND": "TV não encontrada. Você inseriu o PIN correto?", - "AUTO_CAST_PAIR": "Pareamento automático", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "O Auto Pair requer a conexão com servidores do Google e só funciona com dispositivos Chromecast. O Google não receberá dados confidenciais, como suas fotos.", - "PAIR_WITH_PIN": "Parear com PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Escolha um dispositivo compatível com casts no navegador popup.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "Parear com o PIN funciona para qualquer dispositivo de tela grande onde você deseja reproduzir seu álbum.", - "VISIT_CAST_ENTE_IO": "Acesse cast.ente.io no dispositivo que você deseja parear.", - "CAST_AUTO_PAIR_FAILED": "Chromecast Auto Pair falhou. Por favor, tente novamente.", - "CACHE_DIRECTORY": "Pasta de Cache", - "FREEHAND": "Mão livre", - "APPLY_CROP": "Aplicar Recorte", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Pelo menos uma transformação ou ajuste de cor deve ser feito antes de salvar.", - "PASSKEYS": "Chaves de acesso", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/pt-PT/translation.json b/web/apps/auth/public/locales/pt-PT/translation.json deleted file mode 100644 index 230980326..000000000 --- a/web/apps/auth/public/locales/pt-PT/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backups privados
para as suas memórias
", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registar", - "NEW_USER": "Novo no ente", - "EXISTING_USER": "Utilizador existente", - "ENTER_NAME": "Insira o nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Adicione um nome para que os seus amigos saibam a quem agradecer por estas ótimas fotos!", - "ENTER_EMAIL": "Insira o endereço de email", - "EMAIL_ERROR": "Inserir um endereço de email válido", - "REQUIRED": "Obrigatório", - "EMAIL_SENT": "Código de verificação enviado para {{email}}", - "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", - "ENTER_OTT": "Código de verificação", - "RESEND_MAIL": "Reenviar código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Ocorreu um erro. Tente novamente", - "INVALID_CODE": "Código de verificação inválido", - "EXPIRED_CODE": "O seu código de verificação expirou", - "SENDING": "A enviar...", - "SENT": "Enviado!", - "PASSWORD": "Palavra-passe", - "LINK_PASSWORD": "Introduza a palavra-passe para desbloquear o álbum", - "RETURN_PASSPHRASE_HINT": "Palavra-passe", - "SET_PASSPHRASE": "Definir palavra-passe", - "VERIFY_PASSPHRASE": "Entrar", - "INCORRECT_PASSPHRASE": "Palavra-passe incorreta", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Bem-vindo ao ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "Novo álbum", - "ENTER_ALBUM_NAME": "Nome do álbum", - "CLOSE_OPTION": "Fechar (Esc)", - "ENTER_FILE_NAME": "Nome do ficheiro", - "CLOSE": "Fechar", - "NO": "Não", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", - "SELECT_PHOTOS": "Selecionar fotos", - "FILE_UPLOAD": "Enviar Ficheiro", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "Não possui uma conta", - "ACCOUNT_EXISTS": "Já possui uma conta", - "CREATE": "Criar", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/ru-RU/translation.json b/web/apps/auth/public/locales/ru-RU/translation.json deleted file mode 100644 index c85db2236..000000000 --- a/web/apps/auth/public/locales/ru-RU/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Личные резервные копии
для твоих воспоминаний
", - "HERO_SLIDE_1": "Сквозное шифрование по умолчанию", - "HERO_SLIDE_2_TITLE": "
Надежно хранится
в убежище от радиоактивных осадков
", - "HERO_SLIDE_2": "Созданный для того, чтобы пережить", - "HERO_SLIDE_3_TITLE": "
Доступно
везде
", - "HERO_SLIDE_3": "Android, iOS, Веб, ПК", - "LOGIN": "Авторизоваться", - "SIGN_UP": "Регистрация", - "NEW_USER": "Новенький в ente", - "EXISTING_USER": "Существующий пользователь", - "ENTER_NAME": "Введите имя", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Добавьте имя, чтобы ваши друзья знали, кого благодарить за эти замечательные фотографии!", - "ENTER_EMAIL": "Введите адрес электронной почты", - "EMAIL_ERROR": "Введите действительный адрес электронной почты", - "REQUIRED": "Требуется", - "EMAIL_SENT": "Проверочный код отправлен на
{{email}}", - "CHECK_INBOX": "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения проверки", - "ENTER_OTT": "Проверочный код", - "RESEND_MAIL": "Отправить код еще раз", - "VERIFY": "Подтвердить", - "UNKNOWN_ERROR": "Что-то пошло не так, Попробуйте еще раз", - "INVALID_CODE": "Неверный код подтверждения", - "EXPIRED_CODE": "Срок действия вашего проверочного кода истек", - "SENDING": "Отправка...", - "SENT": "Отправлено!", - "PASSWORD": "Пароль", - "LINK_PASSWORD": "Введите пароль, чтобы разблокировать альбом", - "RETURN_PASSPHRASE_HINT": "Пароль", - "SET_PASSPHRASE": "Установить пароль", - "VERIFY_PASSPHRASE": "Войти", - "INCORRECT_PASSPHRASE": "Неверный пароль", - "ENTER_ENC_PASSPHRASE": "Пожалуйста, введите пароль, который мы можем использовать для шифрования ваших данных", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Добро пожаловать в ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Где живут ваши лучшие фотографии", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Генерируем ключи шифрования...", - "PASSPHRASE_HINT": "Пароль", - "CONFIRM_PASSPHRASE": "Подтвердите пароль", - "REFERRAL_CODE_HINT": "Как вы узнали о Ente? (необязательно)", - "REFERRAL_INFO": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!", - "PASSPHRASE_MATCH_ERROR": "Пароли не совпадают", - "CREATE_COLLECTION": "Новый альбом", - "ENTER_ALBUM_NAME": "Название альбома", - "CLOSE_OPTION": "Закрыть (Esc)", - "ENTER_FILE_NAME": "Имя файла", - "CLOSE": "Закрыть", - "NO": "Нет", - "NOTHING_HERE": "Здесь нечего смотреть! 👀", - "UPLOAD": "Загрузить", - "IMPORT": "Импорт", - "ADD_PHOTOS": "Добавить фотографии", - "ADD_MORE_PHOTOS": "Добавить больше фото", - "add_photos_one": "Добавить 1 элемент", - "add_photos_other": "Добавить {{count, number}} элементов", - "SELECT_PHOTOS": "Выбрать фотографии", - "FILE_UPLOAD": "Загрузка файла", - "UPLOAD_STAGE_MESSAGE": { - "0": "Подготовка к загрузке", - "1": "Чтение файлов метаданных Google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов извлечены", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов обработано", - "4": "Отмена оставшихся загрузок", - "5": "Резервное копирование завершено" - }, - "FILE_NOT_UPLOADED_LIST": "Следующие файлы не были загружены", - "SUBSCRIPTION_EXPIRED": "Подписка закончилась", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Срок действия вашей подписки истек, пожалуйста, продлите", - "STORAGE_QUOTA_EXCEEDED": "Превышен лимит хранения", - "INITIAL_LOAD_DELAY_WARNING": "Первая загрузка может занять некоторое время", - "USER_DOES_NOT_EXIST": "Пользователь с таким email не найден", - "NO_ACCOUNT": "У вас нет учетной записи", - "ACCOUNT_EXISTS": "Уже есть аккаунт", - "CREATE": "Создать", - "DOWNLOAD": "Скачать", - "DOWNLOAD_OPTION": "Скачать (D)", - "DOWNLOAD_FAVORITES": "Скачать избранные", - "DOWNLOAD_UNCATEGORIZED": "Скачать без категорий", - "DOWNLOAD_HIDDEN_ITEMS": "Скачать скрытые элементы", - "COPY_OPTION": "Скопировать как PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Полноэкранный режим (F)", - "ZOOM_IN_OUT": "Увеличить/уменьшить", - "PREVIOUS": "Предыдущий (←)", - "NEXT": "Следующий (→)", - "TITLE_PHOTOS": "Ente Фото", - "TITLE_ALBUMS": "Ente Фото", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "Загрузите своё первое фото", - "IMPORT_YOUR_FOLDERS": "Импортируйте папки", - "UPLOAD_DROPZONE_MESSAGE": "Перетащите для резервного копирования файлов", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Перетащите, чтобы добавить просматриваемую папку", - "TRASH_FILES_TITLE": "Удалить файлы?", - "TRASH_FILE_TITLE": "Удалить файл?", - "DELETE_FILES_TITLE": "Удалить немедленно?", - "DELETE_FILES_MESSAGE": "Выбранные файлы будут безвозвратно удалены из вашей учетной записи ente.", - "DELETE": "Удалить", - "DELETE_OPTION": "Удалить (DEL)", - "FAVORITE_OPTION": "Избранное (L)", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "Обнаружено несколько папок", - "UPLOAD_STRATEGY_CHOICE": "Вы хотите загрузить их в", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Один альбом", - "OR": "или", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Отдельные альбомы", - "SESSION_EXPIRED_MESSAGE": "Истёк срок действия вашей сессии. Для продолжения, пожалуйста, войдите снова", - "SESSION_EXPIRED": "Время сессии истекло", - "PASSWORD_GENERATION_FAILED": "Вашему браузеру не удалось сгенерировать надежный ключ, соответствующий стандартам шифрования ente, пожалуйста, попробуйте использовать мобильное приложение или другой браузер", - "CHANGE_PASSWORD": "Изменить пароль", - "GO_BACK": "Вернуться назад", - "RECOVERY_KEY": "Ключ восстановления", - "SAVE_LATER": "Сделать позже", - "SAVE": "Сохранить ключ", - "RECOVERY_KEY_DESCRIPTION": "Если вы забыли свой пароль, то восстановить данные можно только с помощью этого ключа.", - "RECOVER_KEY_GENERATION_FAILED": "Не удалось сгенерировать код восстановления, пожалуйста, повторите попытку", - "KEY_NOT_STORED_DISCLAIMER": "Мы не храним этот ключ, поэтому, пожалуйста, сохраните его в надежном месте", - "FORGOT_PASSWORD": "Забыл пароль", - "RECOVER_ACCOUNT": "Восстановить аккаунт", - "RECOVERY_KEY_HINT": "Ключ восстановления", - "RECOVER": "Восстановить", - "NO_RECOVERY_KEY": "Нет ключа восстановления?", - "INCORRECT_RECOVERY_KEY": "Неправильный ключ восстановления", - "SORRY": "Извините", - "NO_RECOVERY_KEY_MESSAGE": "Из-за природы нашего сквозного протокола шифрования ваши данные не могут быть расшифрованы без вашего пароля или ключа восстановления", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Пожалуйста, отправьте электронное письмо на адрес {{emailID}} с вашего зарегистрированного адреса электронной почты", - "CONTACT_SUPPORT": "Связаться с поддержкой", - "REQUEST_FEATURE": "Запросить функцию", - "SUPPORT": "Поддержка", - "CONFIRM": "Подтвердить", - "CANCEL": "Отменить", - "LOGOUT": "Выйти", - "DELETE_ACCOUNT": "Удалить аккаунт", - "DELETE_ACCOUNT_MESSAGE": "

Пожалуйста, отправьте письмо по адресу {{emailID}} с вашего зарегистрированного адреса электронной почты.

Ваш запрос будет обработан в течение 72 часов

", - "LOGOUT_MESSAGE": "Вы уверены, что хотите выйти?", - "CHANGE_EMAIL": "Изменить адрес электронной почты", - "OK": "ОК", - "SUCCESS": "Успешно", - "ERROR": "Ошибка", - "MESSAGE": "Сообщение", - "INSTALL_MOBILE_APP": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "Загрузить приложение для компьютера", - "EXPORT": "Экспортировать данные", - "SUBSCRIPTION": "Подписка", - "SUBSCRIBE": "Подписаться", - "MANAGEMENT_PORTAL": "Управлять платёжной информацией", - "MANAGE_FAMILY_PORTAL": "Управление семьёй", - "LEAVE_FAMILY_PLAN": "Покинуть семейный план", - "LEAVE": "Выйти", - "LEAVE_FAMILY_CONFIRM": "Вы уверены, что хотите покинуть семейный план?", - "CHOOSE_PLAN": "Выбери свой план", - "MANAGE_PLAN": "Управление подпиской", - "ACTIVE": "Активный", - "OFFLINE_MSG": "Вы не в сети, кэшированные воспоминания отображаются", - "FREE_SUBSCRIPTION_INFO": "Вы используете бесплатный тарифный план, истекающий {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Вы используете семейный план, управляемый", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Продление {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "Обновить платёжную информацию", - "MONTHLY": "Ежемесячно", - "YEARLY": "Ежегодно", - "UPDATE_SUBSCRIPTION_MESSAGE": "Хотите сменить текущий план?", - "UPDATE_SUBSCRIPTION": "Изменить план", - "CANCEL_SUBSCRIPTION": "Отменить подписку", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Все ваши данные будут удалены с наших серверов в конце этого расчетного периода.

Вы уверены, что хотите отменить свою подписку?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Вы уверены, что хотите отменить свою подписку?

", - "SUBSCRIPTION_CANCEL_FAILED": "Не удалось отменить подписку", - "SUBSCRIPTION_CANCEL_SUCCESS": "Подписка успешно отменена", - "REACTIVATE_SUBSCRIPTION": "Возобновить подписку", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "После повторной активации вам будет выставлен счет в {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Подписка успешно активирована ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Не удалось повторно активировать продление подписки", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Спасибо", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Отменить мобильную подписку", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Пожалуйста, отмените свою подписку в мобильном приложении, чтобы активировать подписку здесь", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Пожалуйста, свяжитесь с {{emailID}} для управления подпиской", - "RENAME": "Переименовать", - "RENAME_FILE": "Переименовать файл", - "RENAME_COLLECTION": "Переименовать альбом", - "DELETE_COLLECTION_TITLE": "Удалить альбом?", - "DELETE_COLLECTION": "Удалить альбом", - "DELETE_COLLECTION_MESSAGE": "Также удалить фотографии (и видео), которые есть в этом альбоме из всех других альбомов, где они есть?", - "DELETE_PHOTOS": "Удалить фото", - "KEEP_PHOTOS": "Оставить фото", - "SHARE": "Поделиться", - "SHARE_COLLECTION": "Поделиться альбомом", - "SHAREES": "Поделиться с", - "SHARE_WITH_SELF": "Ой, Вы не можете поделиться с самим собой", - "ALREADY_SHARED": "Упс, Вы уже делились этим с {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Делиться альбомом запрещено", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Совместное использование отключено для бесплатных аккаунтов", - "DOWNLOAD_COLLECTION": "Загрузить альбом", - "DOWNLOAD_COLLECTION_MESSAGE": "

Вы уверены, что хотите загрузить альбом полностью?

Все файлы будут последовательно помещены в очередь на загрузку

", - "CREATE_ALBUM_FAILED": "Не удалось создать альбом, пожалуйста, попробуйте еще раз", - "SEARCH": "Поиск", - "SEARCH_RESULTS": "Результаты поиска", - "NO_RESULTS": "Ничего не найдено", - "SEARCH_HINT": "Поиск альбомов, дат, описаний, ...", - "SEARCH_TYPE": { - "COLLECTION": "Альбом", - "LOCATION": "Местоположение", - "CITY": "Местоположение", - "DATE": "Дата", - "FILE_NAME": "Имя файла", - "THING": "Содержимое", - "FILE_CAPTION": "Описание", - "FILE_TYPE": "Тип файла", - "CLIP": "" - }, - "photos_count_zero": "Воспоминания отсутствуют", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "Добавить в альбом", - "SELECTED": "выбрано", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Это видео нельзя воспроизвести в вашем браузере", - "PEOPLE": "Люди", - "INDEXING_SCHEDULED": "Индексация запланирована...", - "ANALYZING_PHOTOS": "Индексирование фотографий ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Индексирование людей на {{indexStatus.nSyncedFiles,number}} фотографиях...", - "INDEXING_DONE": "Проиндексировано {{indexStatus.nSyncedFiles,number}} фотографий", - "UNIDENTIFIED_FACES": "нераспознанные лица", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "Двухфакторная аутентификация", - "TWO_FACTOR_QR_INSTRUCTION": "Сканируйте QR-код ниже с вашим любимым приложением для проверки подлинности", - "ENTER_CODE_MANUALLY": "Введите код вручную", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Пожалуйста, введите этот код в вашем любимом приложении для аутентификации", - "SCAN_QR_CODE": "Сканировать QR-код вместо", - "ENABLE_TWO_FACTOR": "Включить двухфакторную аутентификацию", - "ENABLE": "Включить", - "LOST_DEVICE": "Потеряно двухфакторное устройство", - "INCORRECT_CODE": "Неверный код", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "Отключить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "Отключить", - "RECONFIGURE": "Перенастроить", - "UPDATE_TWO_FACTOR": "Обновить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "Обновить", - "DISABLE_TWO_FACTOR": "Отключить двухфакторную аутентификацию", - "DISABLE_TWO_FACTOR_MESSAGE": "Вы уверены, что хотите отключить двухфакторную аутентификацию", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "Экспортировать данные", - "SELECT_FOLDER": "Выбрать папку", - "DESTINATION": "Место назначения", - "START": "Начать", - "LAST_EXPORT_TIME": "Время последнего экспорта", - "EXPORT_AGAIN": "Синхронизировать заново", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Локальное хранилище недоступно", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "Отправить одноразовый код", - "EMAIl_ALREADY_OWNED": "Почта уже использована", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "Скрыть", - "UNHIDE": "Показать", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Сортировать по", - "NEWEST_FIRST": "Сначала новые", - "OLDEST_FIRST": "Сначала старые", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "Выбрать альбом", - "PIN_ALBUM": "Закрепить альбом", - "UNPIN_ALBUM": "Открепить альбом", - "DOWNLOAD_COMPLETE": "Загрузка завершена", - "DOWNLOADING_COLLECTION": "Загрузка {{name}}", - "DOWNLOAD_FAILED": "Загрузка не удалась", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} файлов", - "CHRISTMAS": "Рождество", - "CHRISTMAS_EVE": "Канун Рождества", - "NEW_YEAR": "Новый год", - "NEW_YEAR_EVE": "Канун Нового года", - "IMAGE": "Изображение", - "VIDEO": "Видео", - "LIVE_PHOTO": "Живое фото", - "CONVERT": "Преобразовать", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Вы уверены, что хотите закрыть редактор?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Загрузите отредактированное изображение или сохраните копию в ente, чтобы сохранить внесенные изменения.", - "BRIGHTNESS": "Яркость", - "CONTRAST": "Контраст", - "SATURATION": "Насыщенность", - "BLUR": "Размытие", - "INVERT_COLORS": "Инвертировать Цвета", - "ASPECT_RATIO": "Соотношение Сторон", - "SQUARE": "Квадрат", - "ROTATE_LEFT": "Повернуть влево", - "ROTATE_RIGHT": "Повернуть вправо", - "FLIP_VERTICALLY": "Отразить вертикально", - "FLIP_HORIZONTALLY": "Отразить горизонтально", - "DOWNLOAD_EDITED": "Скачать отредактированный", - "SAVE_A_COPY_TO_ENTE": "Сохранить копию в ente", - "RESTORE_ORIGINAL": "Восстановить оригинал", - "TRANSFORM": "Преобразовать", - "COLORS": "Цвета", - "FLIP": "Перевернуть", - "ROTATION": "", - "RESET": "Сбросить", - "PHOTO_EDITOR": "Редактор фото", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "Статус волшебного поиска", - "INDEXED_ITEMS": "Индексированные элементы", - "CAST_ALBUM_TO_TV": "Воспроизвести альбом на ТВ", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/sv-SE/translation.json b/web/apps/auth/public/locales/sv-SE/translation.json deleted file mode 100644 index f88535795..000000000 --- a/web/apps/auth/public/locales/sv-SE/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "Ange namn", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "Ange e-postadress", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "Lösenord", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "Lösenord", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "Logga in", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Välkommen till ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "Lösenord", - "CONFIRM_PASSPHRASE": "Bekräfta lösenord", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Lösenorden matchar inte", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "Filnamn", - "CLOSE": "Stäng", - "NO": "Nej", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "Radera", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "eller", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "Ändra lösenord", - "GO_BACK": "", - "RECOVERY_KEY": "Återställningsnyckel", - "SAVE_LATER": "", - "SAVE": "Spara nyckel", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "Glömt lösenord", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "Ingen återställningsnyckel?", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "Bekräfta", - "CANCEL": "Avbryt", - "LOGOUT": "Logga ut", - "DELETE_ACCOUNT": "Radera konto", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "Meddelande", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "Prenumerera", - "MANAGEMENT_PORTAL": "Hantera betalningsmetod", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "Hantera din prenumeration", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "Sök", - "SEARCH_RESULTS": "Sökresultat", - "NO_RESULTS": "Inga resultat hittades", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "Datum", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "Beskrivning", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Inga deltagare", - "participants_one": "1 deltagare", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "Deltagare", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "Fil", - "UPLOAD_DIRS": "Mapp", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "Filer", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 album", - "albums_other": "{{count, number}} album", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "Lägg till mapp", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "mån", - "YEAR": "år", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "GB", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "Namn...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "Språk", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "Kopiera länk", - "DONE": "Klar", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Sortera efter", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "Bild", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "Färger", - "FLIP": "", - "ROTATION": "", - "RESET": "Återställ", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/th-TH/translation.json b/web/apps/auth/public/locales/th-TH/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/auth/public/locales/th-TH/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/tr-TR/translation.json b/web/apps/auth/public/locales/tr-TR/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/auth/public/locales/tr-TR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/public/locales/zh-CN/translation.json b/web/apps/auth/public/locales/zh-CN/translation.json deleted file mode 100644 index 0a72e1c70..000000000 --- a/web/apps/auth/public/locales/zh-CN/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
私人备份
为您的回忆
", - "HERO_SLIDE_1": "默认端到端加密", - "HERO_SLIDE_2_TITLE": "
安全地存放
在一个掩护所中
", - "HERO_SLIDE_2": "经久耐用", - "HERO_SLIDE_3_TITLE": "
可用于
各处
", - "HERO_SLIDE_3": "安卓, iOS, 网页端, 桌面端", - "LOGIN": "登录", - "SIGN_UP": "注册", - "NEW_USER": "刚来到 ente", - "EXISTING_USER": "现有用户", - "ENTER_NAME": "输入名字", - "PUBLIC_UPLOADER_NAME_MESSAGE": "请添加一个名字,以便您的朋友知晓该感谢谁拍摄了这些精美的照片!", - "ENTER_EMAIL": "请输入电子邮件地址", - "EMAIL_ERROR": "请输入有效的电子邮件", - "REQUIRED": "必需的", - "EMAIL_SENT": "验证码已发送至
{{email}}", - "CHECK_INBOX": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证", - "ENTER_OTT": "验证码", - "RESEND_MAIL": "重新发送验证码", - "VERIFY": "验证", - "UNKNOWN_ERROR": "出了点问题,请重试", - "INVALID_CODE": "验证码无效", - "EXPIRED_CODE": "您的验证码已过期", - "SENDING": "发送中……", - "SENT": "已发送!", - "PASSWORD": "密码", - "LINK_PASSWORD": "输入密码来解锁相册", - "RETURN_PASSPHRASE_HINT": "密码", - "SET_PASSPHRASE": "设置密码", - "VERIFY_PASSPHRASE": "登录", - "INCORRECT_PASSPHRASE": "密码错误", - "ENTER_ENC_PASSPHRASE": "请输入我们可以用来加密您数据的密码", - "PASSPHRASE_DISCLAIMER": "我们不会存储您的密码,因此如果您忘记密码, 我们将无法帮助您在没有恢复密钥的情况下恢复您的数据。", - "WELCOME_TO_ENTE_HEADING": "欢迎来到 ", - "WELCOME_TO_ENTE_SUBHEADING": "端到端加密的照片存储和共享", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "可以让您存放照片的最好的地方", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "正在生成加密密钥...", - "PASSPHRASE_HINT": "密码", - "CONFIRM_PASSPHRASE": "请确认密码", - "REFERRAL_CODE_HINT": "您是如何知道Ente的? (可选的)", - "REFERRAL_INFO": "我们不跟踪应用程序安装情况,如果您告诉我们您是在哪里找到我们的,将会有所帮助!", - "PASSPHRASE_MATCH_ERROR": "两次输入的密码不一致", - "CREATE_COLLECTION": "新建相册", - "ENTER_ALBUM_NAME": "相册名称", - "CLOSE_OPTION": "关闭 (或按Esc键)", - "ENTER_FILE_NAME": "文件名", - "CLOSE": "关闭", - "NO": "否", - "NOTHING_HERE": "这里空空如也 👀", - "UPLOAD": "上传", - "IMPORT": "导入", - "ADD_PHOTOS": "添加照片", - "ADD_MORE_PHOTOS": "添加更多的照片", - "add_photos_one": "添加1个项目", - "add_photos_other": "添加 {{count, number}} 个项目", - "SELECT_PHOTOS": "选择图片", - "FILE_UPLOAD": "上传文件", - "UPLOAD_STAGE_MESSAGE": { - "0": "正在准备上传", - "1": "正在读取 Google 元数据文件", - "2": "文件元数据提取状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", - "3": "文件备份状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", - "4": "正在取消剩余的上传内容", - "5": "备份完成" - }, - "FILE_NOT_UPLOADED_LIST": "以下文件未上传", - "SUBSCRIPTION_EXPIRED": "您的订阅已过期", - "SUBSCRIPTION_EXPIRED_MESSAGE": "您的订阅已过期,请 续期", - "STORAGE_QUOTA_EXCEEDED": "已超出存储限制", - "INITIAL_LOAD_DELAY_WARNING": "第一次加载可能需要一些时间", - "USER_DOES_NOT_EXIST": "抱歉,找不到该电子邮件的用户", - "NO_ACCOUNT": "没有账号", - "ACCOUNT_EXISTS": "已有账户", - "CREATE": "创建", - "DOWNLOAD": "下载", - "DOWNLOAD_OPTION": "下载 (D)", - "DOWNLOAD_FAVORITES": "下载收藏", - "DOWNLOAD_UNCATEGORIZED": "下载未分类的", - "DOWNLOAD_HIDDEN_ITEMS": "下载隐藏项目", - "COPY_OPTION": "复制为 PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "切换至全屏 (F)", - "ZOOM_IN_OUT": "放大/缩小", - "PREVIOUS": "上一个 (←)", - "NEXT": "下一个 (→)", - "TITLE_PHOTOS": "Ente 照片", - "TITLE_ALBUMS": "Ente 照片", - "TITLE_AUTH": "Ente 验证器", - "UPLOAD_FIRST_PHOTO": "上传您的第一张照片", - "IMPORT_YOUR_FOLDERS": "导入您的文件夹", - "UPLOAD_DROPZONE_MESSAGE": "拖放以备份您的文件", - "WATCH_FOLDER_DROPZONE_MESSAGE": "拖放以添加观看的文件夹", - "TRASH_FILES_TITLE": "要删除文件吗?", - "TRASH_FILE_TITLE": "要删除文件吗?", - "DELETE_FILES_TITLE": "要立即删除吗?", - "DELETE_FILES_MESSAGE": "所选文件将从您的账户中永久删除。", - "DELETE": "删除", - "DELETE_OPTION": "删除(DEL)", - "FAVORITE_OPTION": "收藏 (L)", - "UNFAVORITE_OPTION": "取消收藏 (L)", - "MULTI_FOLDER_UPLOAD": "检测到多个文件夹", - "UPLOAD_STRATEGY_CHOICE": "你想要上传他们到", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "单个相册", - "OR": "或者", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "独立相册", - "SESSION_EXPIRED_MESSAGE": "您的会话已过期,请重新登录以继续", - "SESSION_EXPIRED": "会话已过期", - "PASSWORD_GENERATION_FAILED": "您的浏览器无法生成一个符合ente加密标准的强密钥,请尝试使用移动应用程序或其他浏览器", - "CHANGE_PASSWORD": "修改密码", - "GO_BACK": "返回", - "RECOVERY_KEY": "恢复密钥", - "SAVE_LATER": "稍后再做", - "SAVE": "保存密钥", - "RECOVERY_KEY_DESCRIPTION": "如果您忘记了密码,恢复数据的唯一方法就是使用此密钥。", - "RECOVER_KEY_GENERATION_FAILED": "无法生成恢复代码,请重试", - "KEY_NOT_STORED_DISCLAIMER": "我们不存储此密钥,因此请将其保存在安全的地方", - "FORGOT_PASSWORD": "忘记密码", - "RECOVER_ACCOUNT": "恢复账户", - "RECOVERY_KEY_HINT": "恢复密钥", - "RECOVER": "恢复", - "NO_RECOVERY_KEY": "没有恢复密钥?", - "INCORRECT_RECOVERY_KEY": "不正确的恢复密钥", - "SORRY": "抱歉", - "NO_RECOVERY_KEY_MESSAGE": "由于我们端到端加密协议的性质,如果没有您的密码或恢复密钥,您的数据将无法解密", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "请用您注册ente账户的电子邮箱发一封邮件给 {{emailID}}", - "CONTACT_SUPPORT": "联系支持", - "REQUEST_FEATURE": "功能建议", - "SUPPORT": "支持", - "CONFIRM": "确认", - "CANCEL": "取消", - "LOGOUT": "退出登录", - "DELETE_ACCOUNT": "删除账户", - "DELETE_ACCOUNT_MESSAGE": "

请从您注册的电子邮件地址发送一封电子邮件到 {{emailID}}

。您的请求将在72小时内处理。

", - "LOGOUT_MESSAGE": "你确定要退出登录吗?", - "CHANGE_EMAIL": "更换邮箱", - "OK": "确定", - "SUCCESS": "成功", - "ERROR": "错误", - "MESSAGE": "消息", - "INSTALL_MOBILE_APP": "安装我们的 AndroidiOS 应用程序来自动备份您的所有照片", - "DOWNLOAD_APP_MESSAGE": "抱歉,目前只有我们的桌面应用程序支持此操作", - "DOWNLOAD_APP": "下载桌面应用程序", - "EXPORT": "导出数据", - "SUBSCRIPTION": "订阅", - "SUBSCRIBE": "订阅", - "MANAGEMENT_PORTAL": "管理付款方式", - "MANAGE_FAMILY_PORTAL": "管理家庭", - "LEAVE_FAMILY_PLAN": "离开家庭计划", - "LEAVE": "离开", - "LEAVE_FAMILY_CONFIRM": "您确定要离开家庭计划吗?", - "CHOOSE_PLAN": "选择您的计划", - "MANAGE_PLAN": "管理您的订阅", - "ACTIVE": "已激活", - "OFFLINE_MSG": "您处于离线状态,正在显示已缓存的回忆", - "FREE_SUBSCRIPTION_INFO": "您使用的是将于{{date, dateTime}} 过期的免费计划", - "FAMILY_SUBSCRIPTION_INFO": "您正在使用由 管理的家庭计划", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "于 {{date, dateTime}} 续费", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "结束于 {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "您的订阅将于 {{date, dateTime}} 取消", - "ADD_ON_AVAILABLE_TILL": "您的 {{storage, string}} 插件有效期至 {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "您已超过您的存储配额,请 升级", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

我们已经收到您的付款

您的订阅有效期至 {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "您的购买已取消,如果您想订阅,请重试", - "SUBSCRIPTION_PURCHASE_FAILED": "订阅购买失败,请重试", - "SUBSCRIPTION_UPDATE_FAILED": "订阅更新失败,请重试", - "UPDATE_PAYMENT_METHOD_MESSAGE": "很抱歉,我们尝试从您的卡中扣款时支付失败,请更新您的付款方式并重试", - "STRIPE_AUTHENTICATION_FAILED": "我们无法验证您的付款方式。请选择不同的付款方式并重试", - "UPDATE_PAYMENT_METHOD": "更新付款方式", - "MONTHLY": "每月", - "YEARLY": "每年", - "UPDATE_SUBSCRIPTION_MESSAGE": "您确定要更改您的计划吗?", - "UPDATE_SUBSCRIPTION": "更改计划", - "CANCEL_SUBSCRIPTION": "取消订阅", - "CANCEL_SUBSCRIPTION_MESSAGE": "

您的所有数据将在此计费期结束时从我们的服务器中删除。

您确定要取消您的订阅吗?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

您确定要取消订阅吗?

", - "SUBSCRIPTION_CANCEL_FAILED": "取消订阅失败", - "SUBSCRIPTION_CANCEL_SUCCESS": "订阅成功取消", - "REACTIVATE_SUBSCRIPTION": "重新激活订阅", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "重新激活后,您将在 {{date, dateTime}} 前支付费用", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "订阅已成功激活 ", - "SUBSCRIPTION_ACTIVATE_FAILED": "无法重新激活订阅续费", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "非常感谢您", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "取消手机订阅", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "请从手机应用取消您的订阅以激活这里的订阅", - "MAIL_TO_MANAGE_SUBSCRIPTION": "请联系我们 {{emailID}} 来管理您的订阅", - "RENAME": "重命名", - "RENAME_FILE": "重命名文件", - "RENAME_COLLECTION": "重命名相册", - "DELETE_COLLECTION_TITLE": "要删除相册吗?", - "DELETE_COLLECTION": "删除相册", - "DELETE_COLLECTION_MESSAGE": "也删除此相册中存在的照片(和视频),从 他们所加入的所有 个其他相册?", - "DELETE_PHOTOS": "删除照片", - "KEEP_PHOTOS": "保留照片", - "SHARE": "分享", - "SHARE_COLLECTION": "分享相册", - "SHAREES": "已分享给", - "SHARE_WITH_SELF": "哎呀,您不能与自己分享", - "ALREADY_SHARED": "哎呀,您已经和 {{email}} 分享了", - "SHARING_BAD_REQUEST_ERROR": "不允许分享相册", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "免费账户禁用共享", - "DOWNLOAD_COLLECTION": "下载相册", - "DOWNLOAD_COLLECTION_MESSAGE": "

您确定要下载完整相册吗?

所有文件都将按顺序排队进行下载

", - "CREATE_ALBUM_FAILED": "相册创建失败,请重试", - "SEARCH": "搜索", - "SEARCH_RESULTS": "搜索结果", - "NO_RESULTS": "未找到任何结果", - "SEARCH_HINT": "搜索相册、日期...", - "SEARCH_TYPE": { - "COLLECTION": "相册", - "LOCATION": "地理位置", - "CITY": "位置", - "DATE": "日期", - "FILE_NAME": "文件名", - "THING": "内容", - "FILE_CAPTION": "说明", - "FILE_TYPE": "文件类型", - "CLIP": "魔法" - }, - "photos_count_zero": "没有回忆", - "photos_count_one": "1个回忆", - "photos_count_other": "{{count, number}} 个回忆", - "TERMS_AND_CONDITIONS": "我同意 条款隐私政策", - "ADD_TO_COLLECTION": "添加到相册", - "SELECTED": "已选", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "此视频无法在您的浏览器中播放", - "PEOPLE": "人物", - "INDEXING_SCHEDULED": "索引已安排...", - "ANALYZING_PHOTOS": "分析 {{indexStatus.nTotalFiles}} 的新照片{{indexStatus.nSyncedFiles}} 已完成)...", - "INDEXING_PEOPLE": "正在为 {{indexStatus.nSyncedFiles}} 张照片中的人物建立索引...", - "INDEXING_DONE": "已索引 {{indexStatus.nSyncedFiles}} 张照片", - "UNIDENTIFIED_FACES": "身份不明的面孔", - "OBJECTS": "对象", - "TEXT": "文本", - "INFO": "图片信息 ", - "INFO_OPTION": "图片信息 (I)", - "FILE_NAME": "文件名", - "CAPTION_PLACEHOLDER": "添加说明", - "LOCATION": "地理位置", - "SHOW_ON_MAP": "在 OpenStreetMap 上查看", - "MAP": "地图", - "MAP_SETTINGS": "地图设置", - "ENABLE_MAPS": "要启用地图吗?", - "ENABLE_MAP": "启用地图", - "DISABLE_MAPS": "要禁用地图吗?", - "ENABLE_MAP_DESCRIPTION": "

这将在世界地图上显示您的照片。

该地图由 OpenStreetMap 托管,并且您照片的确切位置永远不会共享。

您可以随时从“设置”中禁用此功能。

", - "DISABLE_MAP_DESCRIPTION": "

这将禁止在世界地图上显示您的照片。

您可以随时从“设置”中启用此功能。

", - "DISABLE_MAP": "禁用地图", - "DETAILS": "详情", - "VIEW_EXIF": "查看所有 EXIF 数据", - "NO_EXIF": "无 EXIF 数据", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "双因素", - "TWO_FACTOR_AUTHENTICATION": "双因素认证", - "TWO_FACTOR_QR_INSTRUCTION": "使用您最喜欢的身份验证器应用程序(2FA)扫描下面的二维码", - "ENTER_CODE_MANUALLY": "请手动输入代码", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "请在您最喜欢的验证器应用中输入此代码", - "SCAN_QR_CODE": "改为扫描二维码", - "ENABLE_TWO_FACTOR": "启用双因素认证", - "ENABLE": "启用", - "LOST_DEVICE": "丢失了双因素认证设备", - "INCORRECT_CODE": "代码错误", - "TWO_FACTOR_INFO": "登录您的账户不仅需要您的电子邮件和密码,还需要额外的安全层", - "DISABLE_TWO_FACTOR_LABEL": "禁用双因素认证", - "UPDATE_TWO_FACTOR_LABEL": "更新您的身份验证器设备", - "DISABLE": "禁用", - "RECONFIGURE": "重新配置", - "UPDATE_TWO_FACTOR": "更新双因素认证", - "UPDATE_TWO_FACTOR_MESSAGE": "向前继续将使之前配置的任何身份验证器无效", - "UPDATE": "更新", - "DISABLE_TWO_FACTOR": "禁用双因素认证", - "DISABLE_TWO_FACTOR_MESSAGE": "您确定要禁用您的双因素认证吗?", - "TWO_FACTOR_DISABLE_FAILED": "禁用双因素认证失败,请再试一次", - "EXPORT_DATA": "导出数据", - "SELECT_FOLDER": "选择文件夹", - "DESTINATION": "目标位置", - "START": "开始", - "LAST_EXPORT_TIME": "最后一次导出时间", - "EXPORT_AGAIN": "重新同步", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "无法访问本地存储", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "您的浏览器或插件阻止 ente 将数据保存到本地存储。 请在切换浏览模式后再尝试加载此页面。", - "SEND_OTT": "发送 OTP", - "EMAIl_ALREADY_OWNED": "电子邮箱已被注册", - "ETAGS_BLOCKED": "

由于您的浏览器配置,我们无法上传以下文件。

请禁用任何可能阻止ente 使用 eTags 上传大文件的附加组件, 或者使用我们的 桌面应用程序 获取更可靠的导入体验。

", - "SKIPPED_VIDEOS_INFO": "

目前,我们不支持在公共链接内添加视频。

若要分享视频,请 注册 并通过电子邮件与预定收件人分享。

", - "LIVE_PHOTOS_DETECTED": "Live Photos 中的照片和视频文件已合并为一个文件", - "RETRY_FAILED": "重试上传失败的文件", - "FAILED_UPLOADS": "上传失败 ", - "SKIPPED_FILES": "已忽略的上传内容", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "缩略图生成失败", - "UNSUPPORTED_FILES": "不支持的文件", - "SUCCESSFUL_UPLOADS": "上传成功", - "SKIPPED_INFO": "跳过这些,因为在同一相册中有具有匹配名称的文件", - "UNSUPPORTED_INFO": "ente 尚不支持这些文件格式", - "BLOCKED_UPLOADS": "已阻止上传", - "SKIPPED_VIDEOS": "已跳过的视频", - "INPROGRESS_METADATA_EXTRACTION": "进行中", - "INPROGRESS_UPLOADS": "上传进行中", - "TOO_LARGE_UPLOADS": "大文件", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "存储空间不足", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "这些文件没有上传,因为它们超过了您的存储计划的最大大小限制", - "TOO_LARGE_INFO": "这些文件没有上传,因为它们超过了我们的最大文件大小限制", - "THUMBNAIL_GENERATION_FAILED_INFO": "这些文件已上传,但遗憾的是,我们无法为它们生成缩略图。", - "UPLOAD_TO_COLLECTION": "上传至相册", - "UNCATEGORIZED": "未分类的", - "ARCHIVE": "存档", - "FAVORITES": "收藏", - "ARCHIVE_COLLECTION": "存档相册", - "ARCHIVE_SECTION_NAME": "存档", - "ALL_SECTION_NAME": "全部", - "MOVE_TO_COLLECTION": "移动到相册", - "UNARCHIVE": "取消存档", - "UNARCHIVE_COLLECTION": "取消存档相册", - "HIDE_COLLECTION": "隐藏相册", - "UNHIDE_COLLECTION": "取消隐藏相册", - "MOVE": "移动", - "ADD": "添加", - "REMOVE": "移除", - "YES_REMOVE": "是,移除", - "REMOVE_FROM_COLLECTION": "从相册中移除", - "TRASH": "回收站", - "MOVE_TO_TRASH": "移动到回收站", - "TRASH_FILES_MESSAGE": "选中的文件将从所有相册中删除并移动到回收站。", - "TRASH_FILE_MESSAGE": "该文件将从所有相册中删除并移动到回收站。", - "DELETE_PERMANENTLY": "永久删除", - "RESTORE": "恢复", - "RESTORE_TO_COLLECTION": "恢复到相册", - "EMPTY_TRASH": "清空回收站", - "EMPTY_TRASH_TITLE": "要清空回收站吗?", - "EMPTY_TRASH_MESSAGE": "这些文件将从您的 ente 账户中永久删除。", - "LEAVE_SHARED_ALBUM": "是,离开", - "LEAVE_ALBUM": "离开相册", - "LEAVE_SHARED_ALBUM_TITLE": "要离开共享相册吗?", - "LEAVE_SHARED_ALBUM_MESSAGE": "您将离开相册,它将不再对您可见。", - "NOT_FILE_OWNER": "您不能删除共享相册中的文件", - "CONFIRM_SELF_REMOVE_MESSAGE": "所选项目将从该相册中删除。 仅在此相册中的项目将移至未分类。", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "您要删除的某些项目是由其他人添加的,您将无法访问它们。", - "SORT_BY_CREATION_TIME_ASCENDING": "最早的", - "SORT_BY_UPDATION_TIME_DESCENDING": "最后更新", - "SORT_BY_NAME": "名称", - "COMPRESS_THUMBNAILS": "压缩缩略图", - "THUMBNAIL_REPLACED": "缩略图已压缩", - "FIX_THUMBNAIL": "压缩", - "FIX_THUMBNAIL_LATER": "稍后压缩", - "REPLACE_THUMBNAIL_NOT_STARTED": "您的一些视频缩略图可以被压缩以节省空间,您想要ente 压缩它们吗?", - "REPLACE_THUMBNAIL_COMPLETED": "已成功压缩所有缩略图", - "REPLACE_THUMBNAIL_NOOP": "您没有可以进一步压缩的缩略图", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "无法压缩您的一些缩略图,请重试", - "FIX_CREATION_TIME": "固定时间", - "FIX_CREATION_TIME_IN_PROGRESS": "正在固定时间", - "CREATION_TIME_UPDATED": "文件时间已更新", - "UPDATE_CREATION_TIME_NOT_STARTED": "选择您想要使用的选项", - "UPDATE_CREATION_TIME_COMPLETED": "已成功更新所有文件", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "部分文件的文件时间更新失败,请重试", - "CAPTION_CHARACTER_LIMIT": "5000个字符上限", - "DATE_TIME_ORIGINAL": "EXIF:日期 时间 原始文件", - "DATE_TIME_DIGITIZED": "EXIF:日期 时间 数字化", - "METADATA_DATE": "EXIF:元数据日期", - "CUSTOM_TIME": "自定义时间", - "REOPEN_PLAN_SELECTOR_MODAL": "重新启动计划", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "未能打开计划", - "INSTALL": "安装", - "SHARING_DETAILS": "共享的详细信息", - "MODIFY_SHARING": "更改共享", - "ADD_COLLABORATORS": "添加协作者", - "ADD_NEW_EMAIL": "添加新的电子邮件", - "shared_with_people_zero": "与特定人员分享", - "shared_with_people_one": "已与1个人共享", - "shared_with_people_other": "已与 {count, number} 个人共享", - "participants_zero": "暂无参与者", - "participants_one": "1 名参与者", - "participants_other": "{{count, number}} 名参与者", - "ADD_VIEWERS": "添加查看者", - "PARTICIPANTS": "参与者", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} 将无法向相册添加更多照片

他们仍然可以删除他们添加的照片

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} 将能够将照片添加到相册", - "CONVERT_TO_VIEWER": "是的,转换为查看者", - "CONVERT_TO_COLLABORATOR": "是,转换为协作者", - "CHANGE_PERMISSION": "要修改权限吗?", - "REMOVE_PARTICIPANT": "要移除吗?", - "CONFIRM_REMOVE": "是,移除", - "MANAGE": "管理", - "ADDED_AS": "已添加为", - "COLLABORATOR_RIGHTS": "协作者可以将照片和视频添加到共享相册中", - "REMOVE_PARTICIPANT_HEAD": "移除参与者", - "OWNER": "所有者", - "COLLABORATORS": "协作者", - "ADD_MORE": "添加更多", - "VIEWERS": "查看者", - "OR_ADD_EXISTING": "或选择一个现有的", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} 将从相册中删除

他们添加的所有照片也将从相册中删除

", - "NOT_FOUND": "404 - 未找到", - "LINK_EXPIRED": "链接已过期", - "LINK_EXPIRED_MESSAGE": "此链接已过期或已被禁用!", - "MANAGE_LINK": "管理链接", - "LINK_TOO_MANY_REQUESTS": "这个相册太受欢迎,我们无法处理!", - "FILE_DOWNLOAD": "允许下载", - "LINK_PASSWORD_LOCK": "密码锁", - "PUBLIC_COLLECT": "允许添加照片", - "LINK_DEVICE_LIMIT": "设备限制", - "NO_DEVICE_LIMIT": "无", - "LINK_EXPIRY": "链接过期", - "NEVER": "永不", - "DISABLE_FILE_DOWNLOAD": "禁止下载", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

您确定要禁用文件下载按钮吗?

观看者仍然可以使用外部工具进行屏幕截图或保存您的照片副本。

", - "MALICIOUS_CONTENT": "哈哈哈急急急", - "COPYRIGHT": "不不不急急急就是", - "SHARED_USING": "分享方式 ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "使用代码 {{referralCode}} 获得 10 GB 免费空间", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "禁用密码锁", - "DISABLE_PASSWORD_MESSAGE": "您确定要禁用密码锁吗?", - "PASSWORD_LOCK": "密码锁", - "LOCK": "锁定", - "DOWNLOAD_UPLOAD_LOGS": "调试日志", - "UPLOAD_FILES": "文件", - "UPLOAD_DIRS": "文件夹", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "删除重复文件", - "AUTHENTICATOR_SECTION": "身份验证器", - "NO_DUPLICATES_FOUND": "您没有可以清除的重复文件", - "CLUB_BY_CAPTURE_TIME": "按抓取时间断开", - "FILES": "文件", - "EACH": "每个", - "DEDUPLICATE_BASED_ON_SIZE": "以下文件根据大小进行了合并,请检查并删除您认为重复的项目", - "STOP_ALL_UPLOADS_MESSAGE": "您确定要停止所有正在进行的上传吗?", - "STOP_UPLOADS_HEADER": "要停止上传吗?", - "YES_STOP_UPLOADS": "是的,停止上传", - "STOP_DOWNLOADS_HEADER": "要停止下载吗?", - "YES_STOP_DOWNLOADS": "是,停止下载", - "STOP_ALL_DOWNLOADS_MESSAGE": "您确定要停止所有正在进行的下载?", - "albums_one": "1个相册", - "albums_other": "{{count, number}} 个相册", - "ALL_ALBUMS": "所有相册", - "ALBUMS": "相册", - "ALL_HIDDEN_ALBUMS": "所有隐藏的相册", - "HIDDEN_ALBUMS": "隐藏的相册", - "HIDDEN_ITEMS": "隐藏的项目", - "HIDDEN_ITEMS_SECTION_NAME": "隐藏的项目", - "ENTER_TWO_FACTOR_OTP": "请输入您从身份验证应用上获得的6位数代码", - "CREATE_ACCOUNT": "创建账户", - "COPIED": "已复制", - "CANVAS_BLOCKED_TITLE": "无法生成缩略图", - "CANVAS_BLOCKED_MESSAGE": "

看起来您的浏览器已禁用了需要为您的照片生成缩略图的canvas访问权限

请允许访问您浏览器的canvas, 或使用我们的桌面应用程序

", - "WATCH_FOLDERS": "观看文件夹", - "UPGRADE_NOW": "立即升级", - "RENEW_NOW": "立即续费", - "STORAGE": "存储空间", - "USED": "已使用", - "YOU": "您", - "FAMILY": "家庭", - "FREE": "空闲", - "OF": "/", - "WATCHED_FOLDERS": "观看文件夹", - "NO_FOLDERS_ADDED": "尚未添加任何文件夹!", - "FOLDERS_AUTOMATICALLY_MONITORED": "您在此处添加的文件夹将自动监控", - "UPLOAD_NEW_FILES_TO_ENTE": "上传新文件至 ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "从ente 移除已删除的文件", - "ADD_FOLDER": "添加文件夹", - "STOP_WATCHING": "停止监控", - "STOP_WATCHING_FOLDER": "要停止监控文件夹?", - "STOP_WATCHING_DIALOG_MESSAGE": "您现有的文件不会被删除,但 ente 将停止自动更新链接的 ente 相册在此文件夹中的更改。", - "YES_STOP": "是的,停止", - "MONTH_SHORT": "月", - "YEAR": "年", - "FAMILY_PLAN": "家庭计划", - "DOWNLOAD_LOGS": "下载日志", - "DOWNLOAD_LOGS_MESSAGE": "

这将下载调试日志,您可以发送电子邮件给我们来帮助调试您的问题。

请注意文件名将被包含,以帮助跟踪特定文件中的问题。

", - "CHANGE_FOLDER": "更改文件夹", - "TWO_MONTHS_FREE": "在年度计划上免费获得 2 个月", - "GB": "GB", - "POPULAR": "流行的", - "FREE_PLAN_OPTION_LABEL": "继续免费试用", - "FREE_PLAN_DESCRIPTION": "1 GB 1年", - "CURRENT_USAGE": "当前使用量是 {{usage}}", - "WEAK_DEVICE": "您使用的网络浏览器功能不够强大,无法加密您的照片。 请尝试在电脑上登录ente,或下载ente移动/桌面应用程序。", - "DRAG_AND_DROP_HINT": "或者拖动并拖动到 ente 窗口", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "您上传的数据将被安排删除,您的账户将被永久删除。

此操作不可逆。", - "AUTHENTICATE": "身份认证", - "UPLOADED_TO_SINGLE_COLLECTION": "已上传到单个收藏", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "已上传到单独收藏", - "NEVERMIND": "没关系", - "UPDATE_AVAILABLE": "有可用的更新", - "UPDATE_INSTALLABLE_MESSAGE": "新版本的 ente 已准备好安装。", - "INSTALL_NOW": "立即安装", - "INSTALL_ON_NEXT_LAUNCH": "在下次启动时安装", - "UPDATE_AVAILABLE_MESSAGE": "新版本的 ente 已发布,但无法自动下载和安装。", - "DOWNLOAD_AND_INSTALL": "下载并安装", - "IGNORE_THIS_VERSION": "忽略该版本", - "TODAY": "今天", - "YESTERDAY": "昨天", - "NAME_PLACEHOLDER": "名称...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "无法从文件/文件夹组合中创建相册", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

你已拖放了文件和文件夹的组合。

选择创建单独相册的选项时,请只提供文件或只提供文件夹

", - "CHOSE_THEME": "选择主题", - "ML_SEARCH": "ML 搜索 (测试版)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

这将启用设备上的机器学习和面部搜索,这将开始分析您上传的本地照片。

在登录或启用此功能后第一次运行时,它将下载本地设备上的所有图像来分析。 所以请只在您可以使用带宽和本地处理您的照片库中的所有图像时启用此功能。

如果这是您首次启用此功能,我们也会请求您处理面部数据的许可。

", - "ML_MORE_DETAILS": "更多详情", - "ENABLE_FACE_SEARCH": "启用面部搜索", - "ENABLE_FACE_SEARCH_TITLE": "要启用面部搜索吗?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

如果您启用面部搜索,ente 将从照片中提取脸部几何形状。 这将发生在您的设备上,任何生成的生物测定数据都将是端到端加密的。

请单击此处以在我们的隐私政策中了解有关此功能的更多详细信息

", - "DISABLE_BETA": "禁用beta", - "DISABLE_FACE_SEARCH": "禁用面部搜索", - "DISABLE_FACE_SEARCH_TITLE": "要禁用面部搜索吗?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente 将停止处理面部的几何形状, 并将禁用 ML 搜索 (测试版)

如果您愿意,您可以重新启用面部搜索,因此该操作是安全的。

", - "ADVANCED": "高级设置", - "FACE_SEARCH_CONFIRMATION": "我理解,并希望允许ente处理面部几何形状", - "LABS": "实验室", - "YOURS": "你的", - "PASSPHRASE_STRENGTH_WEAK": "密码强度:较弱", - "PASSPHRASE_STRENGTH_MODERATE": "密码强度:中度", - "PASSPHRASE_STRENGTH_STRONG": "密码强度:强", - "PREFERENCES": "首选项", - "LANGUAGE": "语言", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "无效的导出目录", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

您选择的导出目录不存在。

请选择一个有效的目录。

", - "SUBSCRIPTION_VERIFICATION_ERROR": "订阅验证失败", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "1小时后", - "DAY": "一天后", - "WEEK": "一周后", - "MONTH": "一个月后", - "YEAR": "一年后" - }, - "COPY_LINK": "复制链接", - "DONE": "已完成", - "LINK_SHARE_TITLE": "或共享一个链接", - "REMOVE_LINK": "移除链接", - "CREATE_PUBLIC_SHARING": "创建公开链接", - "PUBLIC_LINK_CREATED": "公开链接已创建", - "PUBLIC_LINK_ENABLED": "公开链接已启用", - "COLLECT_PHOTOS": "收集照片", - "PUBLIC_COLLECT_SUBTEXT": "允许具有链接的人也将照片添加到共享相册。", - "STOP_EXPORT": "停止", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} 个文件已导出", - "MIGRATING_EXPORT": "准备中...", - "RENAMING_COLLECTION_FOLDERS": "正在重命名相册文件夹...", - "TRASHING_DELETED_FILES": "正在回收删除的文件...", - "TRASHING_DELETED_COLLECTIONS": "正在回收已删除的相册...", - "EXPORT_NOTIFICATION": { - "START": "导出已开始", - "IN_PROGRESS": "导出已在进行中", - "FINISH": "导出完成", - "UP_TO_DATE": "没有新文件可导出" - }, - "CONTINUOUS_EXPORT": "持续同步", - "TOTAL_ITEMS": "项目总计", - "PENDING_ITEMS": "待处理的项目", - "EXPORT_STARTING": "导出开始...", - "DELETE_ACCOUNT_REASON_LABEL": "您删除账户的主要原因是什么?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "选择一个原因", - "DELETE_REASON": { - "MISSING_FEATURE": "找不到我想要的功能", - "BROKEN_BEHAVIOR": "该应用或某个功能不符合我认为应该做的行为", - "FOUND_ANOTHER_SERVICE": "我发现另一个产品更好用", - "NOT_LISTED": "我的原因未被列出" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "我们很抱歉看到您离开。请解释您为什么要离开来帮助我们改进。", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "反馈", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "是的,我想永久删除此账户及其相关数据", - "CONFIRM_DELETE_ACCOUNT": "确认删除账户", - "FEEDBACK_REQUIRED": "请帮助我们了解这个信息", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "其他服务做得更好?", - "RECOVER_TWO_FACTOR": "恢复双因素认证", - "at": "在", - "AUTH_NEXT": "下一个", - "AUTH_DOWNLOAD_MOBILE_APP": "下载我们的移动应用程序来管理您的密钥", - "HIDDEN": "已隐藏", - "HIDE": "隐藏", - "UNHIDE": "取消隐藏", - "UNHIDE_TO_COLLECTION": "取消隐藏到相册", - "SORT_BY": "排序方式", - "NEWEST_FIRST": "最新在前", - "OLDEST_FIRST": "最旧在前", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "无法预览此文件。点击这里下载原始文件。", - "SELECT_COLLECTION": "选择相册", - "PIN_ALBUM": "置顶相册", - "UNPIN_ALBUM": "取消置顶相册", - "DOWNLOAD_COMPLETE": "下载完成", - "DOWNLOADING_COLLECTION": "正在下载 {{name}}", - "DOWNLOAD_FAILED": "下载失败", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} 个文件", - "CHRISTMAS": "圣诞", - "CHRISTMAS_EVE": "平安夜", - "NEW_YEAR": "新年", - "NEW_YEAR_EVE": "除夕", - "IMAGE": "图像", - "VIDEO": "视频", - "LIVE_PHOTO": "实况照片", - "CONVERT": "转换", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "您确定要关闭编辑器吗?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "下载已编辑的图片或将副本保存到 ente 以保留您的更改。", - "BRIGHTNESS": "亮度", - "CONTRAST": "对比度", - "SATURATION": "饱和度", - "BLUR": "模糊", - "INVERT_COLORS": "反相颜色", - "ASPECT_RATIO": "长宽比", - "SQUARE": "面积", - "ROTATE_LEFT": "向左旋转", - "ROTATE_RIGHT": "向右旋转", - "FLIP_VERTICALLY": "垂直翻转", - "FLIP_HORIZONTALLY": "水平翻转", - "DOWNLOAD_EDITED": "下载已编辑图片", - "SAVE_A_COPY_TO_ENTE": "保存副本到 ente", - "RESTORE_ORIGINAL": "复原", - "TRANSFORM": "转换", - "COLORS": "颜色", - "FLIP": "上下翻转", - "ROTATION": "回转", - "RESET": "重设", - "PHOTO_EDITOR": "照片编辑器", - "FASTER_UPLOAD": "更快上传", - "FASTER_UPLOAD_DESCRIPTION": "通过附近的服务器路由上传", - "MAGIC_SEARCH_STATUS": "魔法搜索状态", - "INDEXED_ITEMS": "索引项目", - "CAST_ALBUM_TO_TV": "在电视上播放相册", - "ENTER_CAST_PIN_CODE": "输入您在下面的电视上看到的代码来配对此设备。", - "PAIR_DEVICE_TO_TV": "配对设备", - "TV_NOT_FOUND": "未找到电视。您输入的 PIN 码正确吗?", - "AUTO_CAST_PAIR": "自动配对", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "自动配对需要连接到 Google 服务器,且仅适用于支持 Chromecast 的设备。Google 不会接收敏感数据,例如您的照片。", - "PAIR_WITH_PIN": "用 PIN 配对", - "CHOOSE_DEVICE_FROM_BROWSER": "从浏览器弹出窗口中选择兼容 Cast 的设备。", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "用 PIN 配对适用于任何大屏幕设备,您可以在这些设备上播放您的相册。", - "VISIT_CAST_ENTE_IO": "在您要配对的设备上访问 cast.ente.io 。", - "CAST_AUTO_PAIR_FAILED": "Chromecast 自动配对失败。请再试一次。", - "CACHE_DIRECTORY": "缓存文件夹", - "FREEHAND": "手画", - "APPLY_CROP": "应用裁剪", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "保存之前必须至少执行一项转换或颜色调整。", - "PASSKEYS": "通行密钥", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/auth/src/pages/404.tsx b/web/apps/auth/src/pages/404.tsx index edb4ae7f7..6cca72b77 100644 --- a/web/apps/auth/src/pages/404.tsx +++ b/web/apps/auth/src/pages/404.tsx @@ -1,17 +1,9 @@ import { APPS } from "@ente/shared/apps/constants"; import NotFoundPage from "@ente/shared/next/pages/404"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function NotFound() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/_app.tsx b/web/apps/auth/src/pages/_app.tsx index c06531ab4..bf1093c90 100644 --- a/web/apps/auth/src/pages/_app.tsx +++ b/web/apps/auth/src/pages/_app.tsx @@ -1,7 +1,14 @@ -import AppNavbar from "@ente/shared/components/Navbar/app"; -import { t } from "i18next"; -import { createContext, useEffect, useRef, useState } from "react"; - +import { CustomHead } from "@/next/components/Head"; +import { setupI18n } from "@/next/i18n"; +import { + logStartupBanner, + logUnhandledErrorsAndRejections, +} from "@/next/log-web"; +import { + APPS, + APP_TITLES, + CLIENT_PACKAGE_NAMES, +} from "@ente/shared/apps/constants"; import { Overlay } from "@ente/shared/components/Container"; import DialogBoxV2 from "@ente/shared/components/DialogBoxV2"; import { @@ -10,32 +17,22 @@ import { } from "@ente/shared/components/DialogBoxV2/types"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import { MessageContainer } from "@ente/shared/components/MessageContainer"; -import { - clearLogsIfLocalStorageLimitExceeded, - logStartupMessage, -} from "@ente/shared/logging/web"; -import HTTPService from "@ente/shared/network/HTTPService"; -import { LS_KEYS } from "@ente/shared/storage/localStorage"; -import { CssBaseline, useMediaQuery } from "@mui/material"; -import { ThemeProvider } from "@mui/material/styles"; -import Head from "next/head"; -import { useRouter } from "next/router"; -import LoadingBar from "react-top-loading-bar"; - -import { setupI18n } from "@/ui/i18n"; -import { CacheProvider } from "@emotion/react"; -import { - APP_TITLES, - APPS, - CLIENT_PACKAGE_NAMES, -} from "@ente/shared/apps/constants"; -import { EnteAppProps } from "@ente/shared/apps/types"; +import AppNavbar from "@ente/shared/components/Navbar/app"; import { PHOTOS_PAGES as PAGES } from "@ente/shared/constants/pages"; import { useLocalState } from "@ente/shared/hooks/useLocalState"; +import HTTPService from "@ente/shared/network/HTTPService"; +import { LS_KEYS, getData } from "@ente/shared/storage/localStorage"; import { getTheme } from "@ente/shared/themes"; import { THEME_COLOR } from "@ente/shared/themes/constants"; -import createEmotionCache from "@ente/shared/themes/createEmotionCache"; import { SetTheme } from "@ente/shared/themes/types"; +import type { User } from "@ente/shared/user/types"; +import { CssBaseline, useMediaQuery } from "@mui/material"; +import { ThemeProvider } from "@mui/material/styles"; +import { t } from "i18next"; +import { AppProps } from "next/app"; +import { useRouter } from "next/router"; +import { createContext, useEffect, useRef, useState } from "react"; +import LoadingBar from "react-top-loading-bar"; import "../../public/css/global.css"; type AppContextType = { @@ -51,15 +48,7 @@ type AppContextType = { export const AppContext = createContext(null); -// Client-side cache, shared for the whole session of the user in the browser. -const clientSideEmotionCache = createEmotionCache(); - -export default function App(props: EnteAppProps) { - const { - Component, - emotionCache = clientSideEmotionCache, - pageProps, - } = props; +export default function App({ Component, pageProps }: AppProps) { const router = useRouter(); const [isI18nReady, setIsI18nReady] = useState(false); const [loading, setLoading] = useState(false); @@ -79,15 +68,14 @@ export default function App(props: EnteAppProps) { ); useEffect(() => { - //setup i18n setupI18n().finally(() => setIsI18nReady(true)); - // set client package name in headers + const userId = (getData(LS_KEYS.USER) as User)?.id; + logStartupBanner(APPS.AUTH, userId); + logUnhandledErrorsAndRejections(true); HTTPService.setHeaders({ "X-Client-Package": CLIENT_PACKAGE_NAMES.get(APPS.AUTH), }); - // setup logging - clearLogsIfLocalStorageLimitExceeded(); - logStartupMessage(APPS.AUTH); + return () => logUnhandledErrorsAndRejections(false); }, []); const setUserOnline = () => setOffline(false); @@ -140,19 +128,13 @@ export default function App(props: EnteAppProps) { content: t("UNKNOWN_ERROR"), }); + const title = isI18nReady + ? t("TITLE", { context: APPS.AUTH }) + : APP_TITLES.get(APPS.AUTH); + return ( - - - - {isI18nReady - ? t("TITLE", { context: APPS.AUTH }) - : APP_TITLES.get(APPS.AUTH)} - - - + <> + @@ -195,9 +177,11 @@ export default function App(props: EnteAppProps) { )} - + {isI18nReady && ( + + )} - + ); } diff --git a/web/apps/auth/src/pages/_document.tsx b/web/apps/auth/src/pages/_document.tsx deleted file mode 100644 index 09d4d5782..000000000 --- a/web/apps/auth/src/pages/_document.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import DocumentPage, { - EnteDocumentProps, -} from "@ente/shared/next/pages/_document"; - -export default function Document(props: EnteDocumentProps) { - return ; -} diff --git a/web/apps/auth/src/pages/auth/index.tsx b/web/apps/auth/src/pages/auth/index.tsx index 6d8bbecc2..55dc33ce6 100644 --- a/web/apps/auth/src/pages/auth/index.tsx +++ b/web/apps/auth/src/pages/auth/index.tsx @@ -122,19 +122,6 @@ const AuthenticatorCodesPage = () => {
- ); }; diff --git a/web/apps/auth/src/pages/change-email/index.tsx b/web/apps/auth/src/pages/change-email/index.tsx index 3bd1e89ab..8be39d9e8 100644 --- a/web/apps/auth/src/pages/change-email/index.tsx +++ b/web/apps/auth/src/pages/change-email/index.tsx @@ -1,17 +1,9 @@ import ChangeEmailPage from "@ente/accounts/pages/change-email"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function ChangeEmail() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/change-password/index.tsx b/web/apps/auth/src/pages/change-password/index.tsx index 567748755..612288049 100644 --- a/web/apps/auth/src/pages/change-password/index.tsx +++ b/web/apps/auth/src/pages/change-password/index.tsx @@ -1,17 +1,9 @@ import ChangePasswordPage from "@ente/accounts/pages/change-password"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function ChangePassword() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/credentials/index.tsx b/web/apps/auth/src/pages/credentials/index.tsx index c73a22089..9b3c0c9c5 100644 --- a/web/apps/auth/src/pages/credentials/index.tsx +++ b/web/apps/auth/src/pages/credentials/index.tsx @@ -1,17 +1,9 @@ import CredentialPage from "@ente/accounts/pages/credentials"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Credential() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/generate/index.tsx b/web/apps/auth/src/pages/generate/index.tsx index fe488e0c2..df3851357 100644 --- a/web/apps/auth/src/pages/generate/index.tsx +++ b/web/apps/auth/src/pages/generate/index.tsx @@ -1,17 +1,9 @@ import GeneratePage from "@ente/accounts/pages/generate"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Generate() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/login/index.tsx b/web/apps/auth/src/pages/login/index.tsx index 434a31557..ee2407b54 100644 --- a/web/apps/auth/src/pages/login/index.tsx +++ b/web/apps/auth/src/pages/login/index.tsx @@ -1,17 +1,9 @@ import LoginPage from "@ente/accounts/pages/login"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Login() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/recover/index.tsx b/web/apps/auth/src/pages/recover/index.tsx index 9629de5d6..64404ca35 100644 --- a/web/apps/auth/src/pages/recover/index.tsx +++ b/web/apps/auth/src/pages/recover/index.tsx @@ -1,17 +1,9 @@ import RecoverPage from "@ente/accounts/pages/recover"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Recover() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/signup/index.tsx b/web/apps/auth/src/pages/signup/index.tsx index b7cbccd97..d272b5c51 100644 --- a/web/apps/auth/src/pages/signup/index.tsx +++ b/web/apps/auth/src/pages/signup/index.tsx @@ -1,17 +1,9 @@ import SignupPage from "@ente/accounts/pages/signup"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Sigup() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/two-factor/recover/index.tsx b/web/apps/auth/src/pages/two-factor/recover/index.tsx index 965a77755..a67c7b816 100644 --- a/web/apps/auth/src/pages/two-factor/recover/index.tsx +++ b/web/apps/auth/src/pages/two-factor/recover/index.tsx @@ -1,17 +1,9 @@ import TwoFactorRecoverPage from "@ente/accounts/pages/two-factor/recover"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function TwoFactorRecover() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/two-factor/setup/index.tsx b/web/apps/auth/src/pages/two-factor/setup/index.tsx index 4a027ded6..b007ab01b 100644 --- a/web/apps/auth/src/pages/two-factor/setup/index.tsx +++ b/web/apps/auth/src/pages/two-factor/setup/index.tsx @@ -1,17 +1,9 @@ import TwoFactorSetupPage from "@ente/accounts/pages/two-factor/setup"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function TwoFactorSetup() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/two-factor/verify/index.tsx b/web/apps/auth/src/pages/two-factor/verify/index.tsx index 1c90e49a8..2243a4354 100644 --- a/web/apps/auth/src/pages/two-factor/verify/index.tsx +++ b/web/apps/auth/src/pages/two-factor/verify/index.tsx @@ -1,17 +1,9 @@ import TwoFactorVerifyPage from "@ente/accounts/pages/two-factor/verify"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; -import { AppContext } from "pages/_app"; import { useContext } from "react"; +import { AppContext } from "../../_app"; export default function TwoFactorVerify() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/pages/verify/index.tsx b/web/apps/auth/src/pages/verify/index.tsx index ff3317cab..5171462e7 100644 --- a/web/apps/auth/src/pages/verify/index.tsx +++ b/web/apps/auth/src/pages/verify/index.tsx @@ -1,17 +1,9 @@ import VerifyPage from "@ente/accounts/pages/verify"; import { APPS } from "@ente/shared/apps/constants"; -import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import { useContext } from "react"; export default function Verify() { const appContext = useContext(AppContext); - const router = useRouter(); - return ( - - ); + return ; } diff --git a/web/apps/auth/src/services/index.ts b/web/apps/auth/src/services/index.ts index 893ddfb66..5fd032215 100644 --- a/web/apps/auth/src/services/index.ts +++ b/web/apps/auth/src/services/index.ts @@ -1,8 +1,8 @@ +import log from "@/next/log"; import ComlinkCryptoWorker from "@ente/shared/crypto"; import { ApiError, CustomError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import { getEndpoint } from "@ente/shared/network/api"; -import { logError } from "@ente/shared/sentry"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; import { getActualKey } from "@ente/shared/user"; import { HttpStatusCode } from "axios"; @@ -35,10 +35,7 @@ export const getAuthCodes = async (): Promise => { ); return Code.fromRawData(entity.id, decryptedCode); } catch (e) { - logError( - Error("failed to parse code"), - "codeId = " + entity.id, - ); + log.error(`failed to parse codeId = ${entity.id}`); return null; } }), @@ -62,7 +59,7 @@ export const getAuthCodes = async (): Promise => { return filteredAuthCodes; } catch (e) { if (e.message !== CustomError.AUTH_KEY_NOT_FOUND) { - logError(e, "get authenticator entities failed"); + log.error("get authenticator entities failed", e); } throw e; } @@ -85,7 +82,7 @@ export const getAuthKey = async (): Promise => { ) { throw Error(CustomError.AUTH_KEY_NOT_FOUND); } else { - logError(e, "Get key failed"); + log.error("Get key failed", e); throw e; } } @@ -109,7 +106,7 @@ export const getDiff = async ( ); return resp.data.diff; } catch (e) { - logError(e, "Get diff failed"); + log.error("Get diff failed", e); throw e; } }; diff --git a/web/apps/cast/package.json b/web/apps/cast/package.json index e544cd370..ee318ef61 100644 --- a/web/apps/cast/package.json +++ b/web/apps/cast/package.json @@ -9,8 +9,5 @@ "@ente/shared": "*", "jszip": "3.10.1", "mime-types": "^2.1.35" - }, - "devDependencies": { - "sass": "^1.69.5" } } diff --git a/web/apps/cast/public/favicon.ico b/web/apps/cast/public/favicon.ico deleted file mode 100644 index 4570eb8d9..000000000 Binary files a/web/apps/cast/public/favicon.ico and /dev/null differ diff --git a/web/apps/cast/public/images/favicon.png b/web/apps/cast/public/images/favicon.png new file mode 100644 index 000000000..fcb8d1054 Binary files /dev/null and b/web/apps/cast/public/images/favicon.png differ diff --git a/web/apps/cast/public/locales/bg-BG/translation.json b/web/apps/cast/public/locales/bg-BG/translation.json deleted file mode 100644 index 03faf16c2..000000000 --- a/web/apps/cast/public/locales/bg-BG/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Личен бекъп
на твоите спомени
", - "HERO_SLIDE_1": "Криптиран от край до край по подразбиране", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/de-DE/translation.json b/web/apps/cast/public/locales/de-DE/translation.json deleted file mode 100644 index 9a1c4073c..000000000 --- a/web/apps/cast/public/locales/de-DE/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Private Sicherungen
für deine Erinnerungen
", - "HERO_SLIDE_1": "Standardmäßig Ende-zu-Ende verschlüsselt", - "HERO_SLIDE_2_TITLE": "
Sicher gespeichert
in einem Luftschutzbunker
", - "HERO_SLIDE_2": "Entwickelt um zu bewahren", - "HERO_SLIDE_3_TITLE": "
Verfügbar
überall
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Anmelden", - "SIGN_UP": "Registrieren", - "NEW_USER": "Neu bei ente", - "EXISTING_USER": "Existierender Benutzer", - "ENTER_NAME": "Name eingeben", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Füge einen Namen hinzu, damit deine Freunde wissen, wem sie für diese tollen Fotos zu danken haben!", - "ENTER_EMAIL": "E-Mail-Adresse eingeben", - "EMAIL_ERROR": "Geben Sie eine gültige E-Mail-Adresse ein", - "REQUIRED": "Erforderlich", - "EMAIL_SENT": "Bestätigungscode an {{email}} gesendet", - "CHECK_INBOX": "Bitte überprüfe deinen E-Mail-Posteingang (und Spam), um die Verifizierung abzuschließen", - "ENTER_OTT": "Bestätigungscode", - "RESEND_MAIL": "Code erneut senden", - "VERIFY": "Überprüfen", - "UNKNOWN_ERROR": "Ein Fehler ist aufgetreten, bitte versuche es erneut", - "INVALID_CODE": "Falscher Bestätigungscode", - "EXPIRED_CODE": "Ihr Bestätigungscode ist abgelaufen", - "SENDING": "Wird gesendet...", - "SENT": "Gesendet!", - "PASSWORD": "Passwort", - "LINK_PASSWORD": "Passwort zum Entsperren des Albums eingeben", - "RETURN_PASSPHRASE_HINT": "Passwort", - "SET_PASSPHRASE": "Passwort setzen", - "VERIFY_PASSPHRASE": "Einloggen", - "INCORRECT_PASSPHRASE": "Falsches Passwort", - "ENTER_ENC_PASSPHRASE": "Bitte gib ein Passwort ein, mit dem wir deine Daten verschlüsseln können", - "PASSPHRASE_DISCLAIMER": "Wir speichern dein Passwort nicht. Wenn du es vergisst, können wir dir nicht helfen, deine Daten ohne einen Wiederherstellungsschlüssel wiederherzustellen.", - "WELCOME_TO_ENTE_HEADING": "Willkommen bei ", - "WELCOME_TO_ENTE_SUBHEADING": "Ende-zu-Ende verschlüsselte Fotospeicherung und Freigabe", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Wo deine besten Fotos leben", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generierung von Verschlüsselungsschlüsseln...", - "PASSPHRASE_HINT": "Passwort", - "CONFIRM_PASSPHRASE": "Passwort bestätigen", - "REFERRAL_CODE_HINT": "Wie hast du von Ente erfahren? (optional)", - "REFERRAL_INFO": "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!", - "PASSPHRASE_MATCH_ERROR": "Die Passwörter stimmen nicht überein", - "CREATE_COLLECTION": "Neues Album", - "ENTER_ALBUM_NAME": "Albumname", - "CLOSE_OPTION": "Schließen (Esc)", - "ENTER_FILE_NAME": "Dateiname", - "CLOSE": "Schließen", - "NO": "Nein", - "NOTHING_HERE": "Hier gibt es noch nichts zu sehen 👀", - "UPLOAD": "Hochladen", - "IMPORT": "Importieren", - "ADD_PHOTOS": "Fotos hinzufügen", - "ADD_MORE_PHOTOS": "Mehr Fotos hinzufügen", - "add_photos_one": "Eine Datei hinzufügen", - "add_photos_other": "{{count, number}} Dateien hinzufügen", - "SELECT_PHOTOS": "Foto auswählen", - "FILE_UPLOAD": "Datei hochladen", - "UPLOAD_STAGE_MESSAGE": { - "0": "Hochladen wird vorbereitet", - "1": "Lese Google-Metadaten", - "2": "Metadaten von {{uploadCounter.finished, number}} / {{uploadCounter.total, number}} Dateien extrahiert", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} Dateien verarbeitet", - "4": "Verbleibende Uploads werden abgebrochen", - "5": "Sicherung abgeschlossen" - }, - "FILE_NOT_UPLOADED_LIST": "Die folgenden Dateien wurden nicht hochgeladen", - "SUBSCRIPTION_EXPIRED": "Abonnement abgelaufen", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Dein Abonnement ist abgelaufen, bitte erneuere es", - "STORAGE_QUOTA_EXCEEDED": "Speichergrenze überschritten", - "INITIAL_LOAD_DELAY_WARNING": "Das erste Laden kann einige Zeit in Anspruch nehmen", - "USER_DOES_NOT_EXIST": "Leider konnte kein Benutzer mit dieser E-Mail gefunden werden", - "NO_ACCOUNT": "Kein Konto vorhanden", - "ACCOUNT_EXISTS": "Es ist bereits ein Account vorhanden", - "CREATE": "Erstellen", - "DOWNLOAD": "Herunterladen", - "DOWNLOAD_OPTION": "Herunterladen (D)", - "DOWNLOAD_FAVORITES": "Favoriten herunterladen", - "DOWNLOAD_UNCATEGORIZED": "Download unkategorisiert", - "DOWNLOAD_HIDDEN_ITEMS": "Versteckte Dateien herunterladen", - "COPY_OPTION": "Als PNG kopieren (Strg / Cmd - C)", - "TOGGLE_FULLSCREEN": "Vollbild umschalten (F)", - "ZOOM_IN_OUT": "Herein-/Herauszoomen", - "PREVIOUS": "Vorherige (←)", - "NEXT": "Weitere (→)", - "TITLE_PHOTOS": "Ente Fotos", - "TITLE_ALBUMS": "Ente Fotos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Lade dein erstes Foto hoch", - "IMPORT_YOUR_FOLDERS": "Importiere deiner Ordner", - "UPLOAD_DROPZONE_MESSAGE": "Loslassen, um Dateien zu sichern", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Loslassen, um beobachteten Ordner hinzuzufügen", - "TRASH_FILES_TITLE": "Dateien löschen?", - "TRASH_FILE_TITLE": "Datei löschen?", - "DELETE_FILES_TITLE": "Sofort löschen?", - "DELETE_FILES_MESSAGE": "Ausgewählte Dateien werden dauerhaft aus Ihrem Ente-Konto gelöscht.", - "DELETE": "Löschen", - "DELETE_OPTION": "Löschen (DEL)", - "FAVORITE_OPTION": "Zu Favoriten hinzufügen (L)", - "UNFAVORITE_OPTION": "Von Favoriten entfernen (L)", - "MULTI_FOLDER_UPLOAD": "Mehrere Ordner erkannt", - "UPLOAD_STRATEGY_CHOICE": "Möchtest du sie hochladen in", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Ein einzelnes Album", - "OR": "oder", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Getrennte Alben", - "SESSION_EXPIRED_MESSAGE": "Ihre Sitzung ist abgelaufen. Bitte loggen Sie sich erneut ein, um fortzufahren", - "SESSION_EXPIRED": "Sitzung abgelaufen", - "PASSWORD_GENERATION_FAILED": "Dein Browser konnte keinen starken Schlüssel generieren, der den Verschlüsselungsstandards des Entes entspricht, bitte versuche die mobile App oder einen anderen Browser zu verwenden", - "CHANGE_PASSWORD": "Passwort ändern", - "GO_BACK": "Zurück", - "RECOVERY_KEY": "Wiederherstellungsschlüssel", - "SAVE_LATER": "Auf später verschieben", - "SAVE": "Schlüssel speichern", - "RECOVERY_KEY_DESCRIPTION": "Falls du dein Passwort vergisst, kannst du deine Daten nur mit diesem Schlüssel wiederherstellen.", - "RECOVER_KEY_GENERATION_FAILED": "Wiederherstellungsschlüssel konnte nicht generiert werden, bitte versuche es erneut", - "KEY_NOT_STORED_DISCLAIMER": "Wir speichern diesen Schlüssel nicht, also speichere ihn bitte an einem sicheren Ort", - "FORGOT_PASSWORD": "Passwort vergessen", - "RECOVER_ACCOUNT": "Konto wiederherstellen", - "RECOVERY_KEY_HINT": "Wiederherstellungsschlüssel", - "RECOVER": "Wiederherstellen", - "NO_RECOVERY_KEY": "Kein Wiederherstellungsschlüssel?", - "INCORRECT_RECOVERY_KEY": "Falscher Wiederherstellungs-Schlüssel", - "SORRY": "Entschuldigung", - "NO_RECOVERY_KEY_MESSAGE": "Aufgrund unseres Ende-zu-Ende-Verschlüsselungsprotokolls können Ihre Daten nicht ohne Ihr Passwort oder Ihren Wiederherstellungsschlüssel entschlüsselt werden", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Bitte sende eine E-Mail an {{emailID}} von deiner registrierten E-Mail-Adresse", - "CONTACT_SUPPORT": "Support kontaktieren", - "REQUEST_FEATURE": "Feature anfragen", - "SUPPORT": "Support", - "CONFIRM": "Bestätigen", - "CANCEL": "Abbrechen", - "LOGOUT": "Ausloggen", - "DELETE_ACCOUNT": "Konto löschen", - "DELETE_ACCOUNT_MESSAGE": "

Bitte sende eine E-Mail an {{emailID}} mit deiner registrierten E-Mail-Adresse.

Deine Anfrage wird innerhalb von 72 Stunden bearbeitet.

", - "LOGOUT_MESSAGE": "Sind sie sicher, dass sie sich ausloggen möchten?", - "CHANGE_EMAIL": "E-Mail-Adresse ändern", - "OK": "OK", - "SUCCESS": "Erfolgreich", - "ERROR": "Fehler", - "MESSAGE": "Nachricht", - "INSTALL_MOBILE_APP": "Installiere unsere Android oder iOS App, um automatisch alle deine Fotos zu sichern", - "DOWNLOAD_APP_MESSAGE": "Entschuldigung, dieser Vorgang wird derzeit nur von unserer Desktop-App unterstützt", - "DOWNLOAD_APP": "Desktopanwendung herunterladen", - "EXPORT": "Daten exportieren", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "Abonnieren", - "MANAGEMENT_PORTAL": "Zahlungsmethode verwalten", - "MANAGE_FAMILY_PORTAL": "Familiengruppe verwalten", - "LEAVE_FAMILY_PLAN": "Familienabo verlassen", - "LEAVE": "Verlassen", - "LEAVE_FAMILY_CONFIRM": "Bist du sicher, dass du den Familien-Tarif verlassen möchtest?", - "CHOOSE_PLAN": "Wähle dein Abonnement", - "MANAGE_PLAN": "Verwalte dein Abonnement", - "ACTIVE": "Aktiv", - "OFFLINE_MSG": "Du bist offline, gecachte Erinnerungen werden angezeigt", - "FREE_SUBSCRIPTION_INFO": "Du bist auf dem kostenlosen Plan, der am {{date, dateTime}} ausläuft", - "FAMILY_SUBSCRIPTION_INFO": "Sie haben einen Familienplan verwaltet von", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Erneuert am {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Endet am {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Ihr Abo endet am {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Dein {{storage, string}} Add-on ist gültig bis {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Sie haben Ihr Speichervolumen überschritten, bitte upgraden Sie", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Wir haben deine Zahlung erhalten

Dein Abonnement ist gültig bis {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Dein Kauf wurde abgebrochen. Bitte versuche es erneut, wenn du abonnieren willst", - "SUBSCRIPTION_PURCHASE_FAILED": "Kauf des Abonnements fehlgeschlagen Bitte versuchen Sie es erneut", - "SUBSCRIPTION_UPDATE_FAILED": "Aktualisierung des Abonnements fehlgeschlagen Bitte versuchen Sie es erneut", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Es tut uns leid, die Zahlung ist fehlgeschlagen, als wir versuchten Ihre Karte zu belasten. Bitte aktualisieren Sie Ihre Zahlungsmethode und versuchen Sie es erneut", - "STRIPE_AUTHENTICATION_FAILED": "Wir können deine Zahlungsmethode nicht authentifizieren. Bitte wähle eine andere Zahlungsmethode und versuche es erneut", - "UPDATE_PAYMENT_METHOD": "Zahlungsmethode aktualisieren", - "MONTHLY": "Monatlich", - "YEARLY": "Jährlich", - "UPDATE_SUBSCRIPTION_MESSAGE": "Sind Sie sicher, dass Sie Ihren Tarif ändern möchten?", - "UPDATE_SUBSCRIPTION": "Plan ändern", - "CANCEL_SUBSCRIPTION": "Abonnement kündigen", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Alle deine Daten werden am Ende dieses Abrechnungszeitraums von unseren Servern gelöscht.

Bist du sicher, dass du dein Abonnement kündigen möchtest?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Bist du sicher, dass du dein Abonnement beenden möchtest?

", - "SUBSCRIPTION_CANCEL_FAILED": "Abonnement konnte nicht storniert werden", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abonnement erfolgreich beendet", - "REACTIVATE_SUBSCRIPTION": "Abonnement reaktivieren", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Nach der Reaktivierung wird am {{date, dateTime}} abgerechnet", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Abonnement erfolgreich aktiviert ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Reaktivierung der Abonnementverlängerung fehlgeschlagen", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Vielen Dank", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Mobiles Abonnement kündigen", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Bitte kündige dein Abonnement in der mobilen App, um hier ein Abonnement zu aktivieren", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Bitte kontaktiere uns über {{emailID}}, um dein Abo zu verwalten", - "RENAME": "Umbenennen", - "RENAME_FILE": "Datei umbenennen", - "RENAME_COLLECTION": "Album umbenennen", - "DELETE_COLLECTION_TITLE": "Album löschen?", - "DELETE_COLLECTION": "Album löschen", - "DELETE_COLLECTION_MESSAGE": "Auch die Fotos (und Videos) in diesem Album aus allen anderen Alben löschen, die sie enthalten?", - "DELETE_PHOTOS": "Fotos löschen", - "KEEP_PHOTOS": "Fotos behalten", - "SHARE": "Teilen", - "SHARE_COLLECTION": "Album teilen", - "SHAREES": "Geteilt mit", - "SHARE_WITH_SELF": "Du kannst nicht mit dir selbst teilen", - "ALREADY_SHARED": "Hoppla, Sie teilen dies bereits mit {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Albumfreigabe nicht erlaubt", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Freigabe ist für kostenlose Konten deaktiviert", - "DOWNLOAD_COLLECTION": "Album herunterladen", - "DOWNLOAD_COLLECTION_MESSAGE": "

Bist du sicher, dass du das komplette Album herunterladen möchtest?

Alle Dateien werden der Warteschlange zum sequenziellen Download hinzugefügt

", - "CREATE_ALBUM_FAILED": "Fehler beim Erstellen des Albums, bitte versuche es erneut", - "SEARCH": "Suchen", - "SEARCH_RESULTS": "Ergebnisse durchsuchen", - "NO_RESULTS": "Keine Ergebnisse gefunden", - "SEARCH_HINT": "Suche nach Alben, Datum, Beschreibungen, ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Standort", - "CITY": "Ort", - "DATE": "Datum", - "FILE_NAME": "Dateiname", - "THING": "Inhalt", - "FILE_CAPTION": "Beschreibung", - "FILE_TYPE": "Dateityp", - "CLIP": "Magie" - }, - "photos_count_zero": "Keine Erinnerungen", - "photos_count_one": "Eine Erinnerung", - "photos_count_other": "{{count, number}} Erinnerungen", - "TERMS_AND_CONDITIONS": "Ich stimme den Bedingungen und Datenschutzrichtlinien zu", - "ADD_TO_COLLECTION": "Zum Album hinzufügen", - "SELECTED": "ausgewählt", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Dieses Video kann in deinem Browser nicht abgespielt werden", - "PEOPLE": "Personen", - "INDEXING_SCHEDULED": "Indizierung ist geplant...", - "ANALYZING_PHOTOS": "Indiziere Fotos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indiziere Personen in {{indexStatus.nSyncedFiles,number}} Fotos...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles,number}} Fotos wurden indiziert", - "UNIDENTIFIED_FACES": "unidentifizierte Gesichter", - "OBJECTS": "Objekte", - "TEXT": "Text", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Dateiname", - "CAPTION_PLACEHOLDER": "Eine Beschreibung hinzufügen", - "LOCATION": "Standort", - "SHOW_ON_MAP": "In OpenStreetMap öffnen", - "MAP": "Karte", - "MAP_SETTINGS": "Karten\nEinstellungen", - "ENABLE_MAPS": "Karten aktivieren?", - "ENABLE_MAP": "Karte aktivieren", - "DISABLE_MAPS": "Karten deaktivieren?", - "ENABLE_MAP_DESCRIPTION": "

Dies wird deine Fotos auf einer Weltkarte anzeigen.

Die Karte wird von OpenStreetMap gehostet und die genauen Standorte deiner Fotos werden niemals geteilt.

Diese Funktion kannst du jederzeit in den Einstellungen deaktivieren.

", - "DISABLE_MAP_DESCRIPTION": "

Dies wird die Anzeige deiner Fotos auf einer Weltkarte deaktivieren.

Du kannst diese Funktion jederzeit in den Einstellungen aktivieren.

", - "DISABLE_MAP": "Karte deaktivieren", - "DETAILS": "Details", - "VIEW_EXIF": "Alle EXIF-Daten anzeigen", - "NO_EXIF": "Keine EXIF-Daten", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Zwei-Faktor", - "TWO_FACTOR_AUTHENTICATION": "Zwei-Faktor-Authentifizierung", - "TWO_FACTOR_QR_INSTRUCTION": "Scanne den QR-Code unten mit deiner bevorzugten Authentifizierungs-App", - "ENTER_CODE_MANUALLY": "Geben Sie den Code manuell ein", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Bitte gib diesen Code in deiner bevorzugten Authentifizierungs-App ein", - "SCAN_QR_CODE": "QR‐Code stattdessen scannen", - "ENABLE_TWO_FACTOR": "Zwei-Faktor-Authentifizierung aktivieren", - "ENABLE": "Aktivieren", - "LOST_DEVICE": "Zwei-Faktor-Gerät verloren", - "INCORRECT_CODE": "Falscher Code", - "TWO_FACTOR_INFO": "Fügen Sie eine zusätzliche Sicherheitsebene hinzu, indem Sie mehr als Ihre E-Mail und Ihr Passwort benötigen, um sich mit Ihrem Account anzumelden", - "DISABLE_TWO_FACTOR_LABEL": "Deaktiviere die Zwei-Faktor-Authentifizierung", - "UPDATE_TWO_FACTOR_LABEL": "Authentifizierungsgerät aktualisieren", - "DISABLE": "Deaktivieren", - "RECONFIGURE": "Neu einrichten", - "UPDATE_TWO_FACTOR": "Zweiten Faktor aktualisieren", - "UPDATE_TWO_FACTOR_MESSAGE": "Fahren Sie fort, werden alle Ihre zuvor konfigurierten Authentifikatoren ungültig", - "UPDATE": "Aktualisierung", - "DISABLE_TWO_FACTOR": "Zweiten Faktor deaktivieren", - "DISABLE_TWO_FACTOR_MESSAGE": "Bist du sicher, dass du die Zwei-Faktor-Authentifizierung deaktivieren willst", - "TWO_FACTOR_DISABLE_FAILED": "Fehler beim Deaktivieren des zweiten Faktors, bitte versuchen Sie es erneut", - "EXPORT_DATA": "Daten exportieren", - "SELECT_FOLDER": "Ordner auswählen", - "DESTINATION": "Zielort", - "START": "Start", - "LAST_EXPORT_TIME": "Letztes Exportdatum", - "EXPORT_AGAIN": "Neusynchronisation", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Lokaler Speicher nicht zugänglich", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Ihr Browser oder ein Addon blockiert ente vor der Speicherung von Daten im lokalen Speicher. Bitte versuchen Sie, den Browser-Modus zu wechseln und die Seite neu zu laden.", - "SEND_OTT": "OTP senden", - "EMAIl_ALREADY_OWNED": "Diese E-Mail wird bereits verwendet", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "Fehlgeschlagene Uploads erneut probieren", - "FAILED_UPLOADS": "Fehlgeschlagene Uploads ", - "SKIPPED_FILES": "Ignorierte Uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Das Vorschaubild konnte nicht erzeugt werden", - "UNSUPPORTED_FILES": "Nicht unterstützte Dateien", - "SUCCESSFUL_UPLOADS": "Erfolgreiche Uploads", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "ente unterstützt diese Dateiformate noch nicht", - "BLOCKED_UPLOADS": "Blockierte Uploads", - "SKIPPED_VIDEOS": "Übersprungene Videos", - "INPROGRESS_METADATA_EXTRACTION": "In Bearbeitung", - "INPROGRESS_UPLOADS": "Upload läuft", - "TOO_LARGE_UPLOADS": "Große Dateien", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Zu wenig Speicher", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Diese Dateien wurden nicht hochgeladen, da sie die maximale Größe für Ihren Speicherplan überschreiten", - "TOO_LARGE_INFO": "Diese Dateien wurden nicht hochgeladen, da sie unsere maximale Dateigröße überschreiten", - "THUMBNAIL_GENERATION_FAILED_INFO": "Diese Dateien wurden hochgeladen, aber leider konnten wir nicht die Thumbnails für sie generieren.", - "UPLOAD_TO_COLLECTION": "In Album hochladen", - "UNCATEGORIZED": "Unkategorisiert", - "ARCHIVE": "Archiv", - "FAVORITES": "Favoriten", - "ARCHIVE_COLLECTION": "Album archivieren", - "ARCHIVE_SECTION_NAME": "Archiv", - "ALL_SECTION_NAME": "Alle", - "MOVE_TO_COLLECTION": "Zum Album verschieben", - "UNARCHIVE": "Dearchivieren", - "UNARCHIVE_COLLECTION": "Album dearchivieren", - "HIDE_COLLECTION": "Album ausblenden", - "UNHIDE_COLLECTION": "Album wieder einblenden", - "MOVE": "Verschieben", - "ADD": "Hinzufügen", - "REMOVE": "Entfernen", - "YES_REMOVE": "Ja, entfernen", - "REMOVE_FROM_COLLECTION": "Aus Album entfernen", - "TRASH": "Papierkorb", - "MOVE_TO_TRASH": "In Papierkorb verschieben", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "Dauerhaft löschen", - "RESTORE": "Wiederherstellen", - "RESTORE_TO_COLLECTION": "In Album wiederherstellen", - "EMPTY_TRASH": "Papierkorb leeren", - "EMPTY_TRASH_TITLE": "Papierkorb leeren?", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "Ja, verlassen", - "LEAVE_ALBUM": "Album verlassen", - "LEAVE_SHARED_ALBUM_TITLE": "Geteiltes Album verlassen?", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "Dateien in einem freigegebenen Album können nicht gelöscht werden", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Einige der Elemente, die du entfernst, wurden von anderen Nutzern hinzugefügt und du wirst den Zugriff auf sie verlieren.", - "SORT_BY_CREATION_TIME_ASCENDING": "Ältestem", - "SORT_BY_UPDATION_TIME_DESCENDING": "Zuletzt aktualisiert", - "SORT_BY_NAME": "Name", - "COMPRESS_THUMBNAILS": "Vorschaubilder komprimieren", - "THUMBNAIL_REPLACED": "Vorschaubilder komprimiert", - "FIX_THUMBNAIL": "Komprimiere", - "FIX_THUMBNAIL_LATER": "Später komprimieren", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "Zeit reparieren", - "FIX_CREATION_TIME_IN_PROGRESS": "Zeit wird repariert", - "CREATION_TIME_UPDATED": "Datei-Zeit aktualisiert", - "UPDATE_CREATION_TIME_NOT_STARTED": "Wählen Sie die Option, die Sie verwenden möchten", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "Maximal 5000 Zeichen", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "Benutzerdefinierte Zeit", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Fehler beim Öffnen der Pläne", - "INSTALL": "Installieren", - "SHARING_DETAILS": "Details teilen", - "MODIFY_SHARING": "Freigabe ändern", - "ADD_COLLABORATORS": "Bearbeiter hinzufügen", - "ADD_NEW_EMAIL": "Neue E-Mail-Adresse hinzufügen", - "shared_with_people_zero": "Mit bestimmten Personen teilen", - "shared_with_people_one": "Geteilt mit einer Person", - "shared_with_people_other": "Geteilt mit {{count, number}} Personen", - "participants_zero": "Keine Teilnehmer", - "participants_one": "1 Teilnehmer", - "participants_other": "{{count, number}} Teilnehmer", - "ADD_VIEWERS": "Betrachter hinzufügen", - "PARTICIPANTS": "Teilnehmer", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "Ja, zu \"Beobachter\" ändern", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "Berechtigung ändern?", - "REMOVE_PARTICIPANT": "Entfernen?", - "CONFIRM_REMOVE": "Ja, entfernen", - "MANAGE": "Verwalten", - "ADDED_AS": "Hinzugefügt als", - "COLLABORATOR_RIGHTS": "Bearbeiter können Fotos & Videos zu dem geteilten Album hinzufügen", - "REMOVE_PARTICIPANT_HEAD": "Teilnehmer entfernen", - "OWNER": "Besitzer", - "COLLABORATORS": "Bearbeiter", - "ADD_MORE": "Mehr hinzufügen", - "VIEWERS": "Zuschauer", - "OR_ADD_EXISTING": "Oder eine Vorherige auswählen", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - Nicht gefunden", - "LINK_EXPIRED": "Link ist abgelaufen", - "LINK_EXPIRED_MESSAGE": "Dieser Link ist abgelaufen oder wurde deaktiviert!", - "MANAGE_LINK": "Link verwalten", - "LINK_TOO_MANY_REQUESTS": "Sorry, dieses Album wurde auf zu vielen Geräten angezeigt!", - "FILE_DOWNLOAD": "Downloads erlauben", - "LINK_PASSWORD_LOCK": "Passwort Sperre", - "PUBLIC_COLLECT": "Hinzufügen von Fotos erlauben", - "LINK_DEVICE_LIMIT": "Geräte Limit", - "NO_DEVICE_LIMIT": "Keins", - "LINK_EXPIRY": "Ablaufdatum des Links", - "NEVER": "Niemals", - "DISABLE_FILE_DOWNLOAD": "Download deaktivieren", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "Enthält schädliche Inhalte", - "COPYRIGHT": "Verletzung des Urheberrechts von jemandem, den ich repräsentieren darf", - "SHARED_USING": "Freigegeben über ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Passwort-Sperre deaktivieren", - "DISABLE_PASSWORD_MESSAGE": "Sind Sie sicher, dass Sie die Passwort-Sperre deaktivieren möchten?", - "PASSWORD_LOCK": "Passwort Sperre", - "LOCK": "Sperren", - "DOWNLOAD_UPLOAD_LOGS": "Debug-Logs", - "UPLOAD_FILES": "Datei", - "UPLOAD_DIRS": "Ordner", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "Authenticator", - "NO_DUPLICATES_FOUND": "Du hast keine Duplikate, die gelöscht werden können", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "Dateien", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "Hochladen stoppen?", - "YES_STOP_UPLOADS": "Ja, Hochladen stoppen", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "", - "ALL_ALBUMS": "Alle Alben", - "ALBUMS": "Alben", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "Gib den 6-stelligen Code aus\ndeiner Authentifizierungs-App ein.", - "CREATE_ACCOUNT": "Account erstellen", - "COPIED": "Kopiert", - "CANVAS_BLOCKED_TITLE": "Vorschaubild konnte nicht erstellt werden", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "Jetzt upgraden", - "RENEW_NOW": "", - "STORAGE": "Speicher", - "USED": "verwendet", - "YOU": "Sie", - "FAMILY": "Familie", - "FREE": "frei", - "OF": "von", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "Ordner hinzufügen", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "Ja, Stopp", - "MONTH_SHORT": "", - "YEAR": "Jahr", - "FAMILY_PLAN": "Familientarif", - "DOWNLOAD_LOGS": "Logs herunterladen", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "Ordner ändern", - "TWO_MONTHS_FREE": "Erhalte 2 Monate kostenlos bei Jahresabonnements", - "GB": "GB", - "POPULAR": "Beliebt", - "FREE_PLAN_OPTION_LABEL": "Mit kostenloser Testversion fortfahren", - "FREE_PLAN_DESCRIPTION": "1 GB für 1 Jahr", - "CURRENT_USAGE": "Aktuelle Nutzung ist {{usage}}", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "Authentifizieren", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "Egal", - "UPDATE_AVAILABLE": "Neue Version verfügbar", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "Jetzt installieren", - "INSTALL_ON_NEXT_LAUNCH": "Beim nächsten Start installieren", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "Diese Version ignorieren", - "TODAY": "Heute", - "YESTERDAY": "Gestern", - "NAME_PLACEHOLDER": "Name...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "Beta deaktivieren", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "Erweitert", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "Passwortstärke: Schwach", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "Passwortstärke: Stark", - "PREFERENCES": "Einstellungen", - "LANGUAGE": "Sprache", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "nach einer Stunde", - "DAY": "nach einem Tag", - "WEEK": "nach 1 Woche", - "MONTH": "nach einem Monat", - "YEAR": "nach einem Jahr" - }, - "COPY_LINK": "Link kopieren", - "DONE": "Fertig", - "LINK_SHARE_TITLE": "Oder einen Link teilen", - "REMOVE_LINK": "Link entfernen", - "CREATE_PUBLIC_SHARING": "Öffentlichen Link erstellen", - "PUBLIC_LINK_CREATED": "Öffentlicher Link erstellt", - "PUBLIC_LINK_ENABLED": "Öffentlicher Link aktiviert", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "Export gestartet", - "IN_PROGRESS": "", - "FINISH": "Export abgeschlossen", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "Kontolöschung bestätigen", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "Weiter", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "Versteckt", - "HIDE": "Ausblenden", - "UNHIDE": "Einblenden", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Sortieren nach", - "NEWEST_FIRST": "Neueste zuerst", - "OLDEST_FIRST": "Älteste zuerst", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Diese Datei konnte nicht in der Vorschau angezeigt werden. Klicken Sie hier, um das Original herunterzuladen.", - "SELECT_COLLECTION": "Album auswählen", - "PIN_ALBUM": "Album anheften", - "UNPIN_ALBUM": "Album lösen", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/en-US/translation.json b/web/apps/cast/public/locales/en-US/translation.json deleted file mode 100644 index de8d2fe2a..000000000 --- a/web/apps/cast/public/locales/en-US/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Private backups
for your memories
", - "HERO_SLIDE_1": "End-to-end encrypted by default", - "HERO_SLIDE_2_TITLE": "
Safely stored
at a fallout shelter
", - "HERO_SLIDE_2": "Designed to outlive", - "HERO_SLIDE_3_TITLE": "
Available
everywhere
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Login", - "SIGN_UP": "Signup", - "NEW_USER": "New to ente", - "EXISTING_USER": "Existing user", - "ENTER_NAME": "Enter name", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Add a name so that your friends know who to thank for these great photos!", - "ENTER_EMAIL": "Enter email address", - "EMAIL_ERROR": "Enter a valid email", - "REQUIRED": "Required", - "EMAIL_SENT": "Verification code sent to {{email}}", - "CHECK_INBOX": "Please check your inbox (and spam) to complete verification", - "ENTER_OTT": "Verification code", - "RESEND_MAIL": "Resend code", - "VERIFY": "Verify", - "UNKNOWN_ERROR": "Something went wrong, please try again", - "INVALID_CODE": "Invalid verification code", - "EXPIRED_CODE": "Your verification code has expired", - "SENDING": "Sending...", - "SENT": "Sent!", - "PASSWORD": "Password", - "LINK_PASSWORD": "Enter password to unlock the album", - "RETURN_PASSPHRASE_HINT": "Password", - "SET_PASSPHRASE": "Set password", - "VERIFY_PASSPHRASE": "Sign in", - "INCORRECT_PASSPHRASE": "Incorrect password", - "ENTER_ENC_PASSPHRASE": "Please enter a password that we can use to encrypt your data", - "PASSPHRASE_DISCLAIMER": "We don't store your password, so if you forget it, we will not be able to help you recover your data without a recovery key.", - "WELCOME_TO_ENTE_HEADING": "Welcome to ", - "WELCOME_TO_ENTE_SUBHEADING": "End to end encrypted photo storage and sharing", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Where your best photos live", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generating encryption keys...", - "PASSPHRASE_HINT": "Password", - "CONFIRM_PASSPHRASE": "Confirm password", - "REFERRAL_CODE_HINT": "How did you hear about Ente? (optional)", - "REFERRAL_INFO": "We don't track app installs, It'd help us if you told us where you found us!", - "PASSPHRASE_MATCH_ERROR": "Passwords don't match", - "CREATE_COLLECTION": "New album", - "ENTER_ALBUM_NAME": "Album name", - "CLOSE_OPTION": "Close (Esc)", - "ENTER_FILE_NAME": "File name", - "CLOSE": "Close", - "NO": "No", - "NOTHING_HERE": "Nothing to see here yet 👀", - "UPLOAD": "Upload", - "IMPORT": "Import", - "ADD_PHOTOS": "Add photos", - "ADD_MORE_PHOTOS": "Add more photos", - "add_photos_one": "Add 1 item", - "add_photos_other": "Add {{count, number}} items", - "SELECT_PHOTOS": "Select photos", - "FILE_UPLOAD": "File Upload", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparing to upload", - "1": "Reading google metadata files", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} files metadata extracted", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} files processed", - "4": "Cancelling remaining uploads", - "5": "Backup complete" - }, - "FILE_NOT_UPLOADED_LIST": "The following files were not uploaded", - "SUBSCRIPTION_EXPIRED": "Subscription expired", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Your subscription has expired, please renew", - "STORAGE_QUOTA_EXCEEDED": "Storage limit exceeded", - "INITIAL_LOAD_DELAY_WARNING": "First load may take some time", - "USER_DOES_NOT_EXIST": "Sorry, could not find a user with that email", - "NO_ACCOUNT": "Don't have an account", - "ACCOUNT_EXISTS": "Already have an account", - "CREATE": "Create", - "DOWNLOAD": "Download", - "DOWNLOAD_OPTION": "Download (D)", - "DOWNLOAD_FAVORITES": "Download favorites", - "DOWNLOAD_UNCATEGORIZED": "Download uncategorized", - "DOWNLOAD_HIDDEN_ITEMS": "Download hidden items", - "COPY_OPTION": "Copy as PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Toggle fullscreen (F)", - "ZOOM_IN_OUT": "Zoom in/out", - "PREVIOUS": "Previous (←)", - "NEXT": "Next (→)", - "TITLE_PHOTOS": "Ente Photos", - "TITLE_ALBUMS": "Ente Photos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Upload your first photo", - "IMPORT_YOUR_FOLDERS": "Import your folders", - "UPLOAD_DROPZONE_MESSAGE": "Drop to backup your files", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Drop to add watched folder", - "TRASH_FILES_TITLE": "Delete files?", - "TRASH_FILE_TITLE": "Delete file?", - "DELETE_FILES_TITLE": "Delete immediately?", - "DELETE_FILES_MESSAGE": "Selected files will be permanently deleted from your ente account.", - "DELETE": "Delete", - "DELETE_OPTION": "Delete (DEL)", - "FAVORITE_OPTION": "Favorite (L)", - "UNFAVORITE_OPTION": "Unfavorite (L)", - "MULTI_FOLDER_UPLOAD": "Multiple folders detected", - "UPLOAD_STRATEGY_CHOICE": "Would you like to upload them into", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "A single album", - "OR": "or", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Separate albums", - "SESSION_EXPIRED_MESSAGE": "Your session has expired, please login again to continue", - "SESSION_EXPIRED": "Session expired", - "PASSWORD_GENERATION_FAILED": "Your browser was unable to generate a strong key that meets ente's encryption standards, please try using the mobile app or another browser", - "CHANGE_PASSWORD": "Change password", - "GO_BACK": "Go back", - "RECOVERY_KEY": "Recovery key", - "SAVE_LATER": "Do this later", - "SAVE": "Save Key", - "RECOVERY_KEY_DESCRIPTION": "If you forget your password, the only way you can recover your data is with this key.", - "RECOVER_KEY_GENERATION_FAILED": "Recovery code could not be generated, please try again", - "KEY_NOT_STORED_DISCLAIMER": "We don't store this key, so please save this in a safe place", - "FORGOT_PASSWORD": "Forgot password", - "RECOVER_ACCOUNT": "Recover account", - "RECOVERY_KEY_HINT": "Recovery key", - "RECOVER": "Recover", - "NO_RECOVERY_KEY": "No recovery key?", - "INCORRECT_RECOVERY_KEY": "Incorrect recovery key", - "SORRY": "Sorry", - "NO_RECOVERY_KEY_MESSAGE": "Due to the nature of our end-to-end encryption protocol, your data cannot be decrypted without your password or recovery key", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Please drop an email to {{emailID}} from your registered email address", - "CONTACT_SUPPORT": "Contact support", - "REQUEST_FEATURE": "Request Feature", - "SUPPORT": "Support", - "CONFIRM": "Confirm", - "CANCEL": "Cancel", - "LOGOUT": "Logout", - "DELETE_ACCOUNT": "Delete account", - "DELETE_ACCOUNT_MESSAGE": "

Please send an email to {{emailID}} from your registered email address.

Your request will be processed within 72 hours.

", - "LOGOUT_MESSAGE": "Are you sure you want to logout?", - "CHANGE_EMAIL": "Change email", - "OK": "OK", - "SUCCESS": "Success", - "ERROR": "Error", - "MESSAGE": "Message", - "INSTALL_MOBILE_APP": "Install our Android or iOS app to automatically backup all your photos", - "DOWNLOAD_APP_MESSAGE": "Sorry, this operation is currently only supported on our desktop app", - "DOWNLOAD_APP": "Download desktop app", - "EXPORT": "Export Data", - "SUBSCRIPTION": "Subscription", - "SUBSCRIBE": "Subscribe", - "MANAGEMENT_PORTAL": "Manage payment method", - "MANAGE_FAMILY_PORTAL": "Manage family", - "LEAVE_FAMILY_PLAN": "Leave family plan", - "LEAVE": "Leave", - "LEAVE_FAMILY_CONFIRM": "Are you sure that you want to leave family plan?", - "CHOOSE_PLAN": "Choose your plan", - "MANAGE_PLAN": "Manage your subscription", - "ACTIVE": "Active", - "OFFLINE_MSG": "You are offline, cached memories are being shown", - "FREE_SUBSCRIPTION_INFO": "You are on the free plan that expires on {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "You are on a family plan managed by", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renews on {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Ends on {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Your subscription will be cancelled on {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Your {{storage, string}} add-on is valid till {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "You have exceeded your storage quota, please upgrade", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

We've received your payment

Your subscription is valid till {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Your purchase was canceled, please try again if you want to subscribe", - "SUBSCRIPTION_PURCHASE_FAILED": "Subscription purchase failed , please try again", - "SUBSCRIPTION_UPDATE_FAILED": "Subscription updated failed , please try again", - "UPDATE_PAYMENT_METHOD_MESSAGE": "We are sorry, payment failed when we tried to charge your card, please update your payment method and try again", - "STRIPE_AUTHENTICATION_FAILED": "We are unable to authenticate your payment method. please choose a different payment method and try again", - "UPDATE_PAYMENT_METHOD": "Update payment method", - "MONTHLY": "Monthly", - "YEARLY": "Yearly", - "UPDATE_SUBSCRIPTION_MESSAGE": "Are you sure you want to change your plan?", - "UPDATE_SUBSCRIPTION": "Change plan", - "CANCEL_SUBSCRIPTION": "Cancel subscription", - "CANCEL_SUBSCRIPTION_MESSAGE": "

All of your data will be deleted from our servers at the end of this billing period.

Are you sure that you want to cancel your subscription?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Are you sure you want to cancel your subscription?

", - "SUBSCRIPTION_CANCEL_FAILED": "Failed to cancel subscription", - "SUBSCRIPTION_CANCEL_SUCCESS": "Subscription canceled successfully", - "REACTIVATE_SUBSCRIPTION": "Reactivate subscription", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Once reactivated, you will be billed on {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Subscription activated successfully ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Failed to reactivate subscription renewals", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Thank you", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancel mobile subscription", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Please cancel your subscription from the mobile app to activate a subscription here", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Please contact us at {{emailID}} to manage your subscription", - "RENAME": "Rename", - "RENAME_FILE": "Rename file", - "RENAME_COLLECTION": "Rename album", - "DELETE_COLLECTION_TITLE": "Delete album?", - "DELETE_COLLECTION": "Delete album", - "DELETE_COLLECTION_MESSAGE": "Also delete the photos (and videos) present in this album from all other albums they are part of?", - "DELETE_PHOTOS": "Delete photos", - "KEEP_PHOTOS": "Keep photos", - "SHARE": "Share", - "SHARE_COLLECTION": "Share album", - "SHAREES": "Shared with", - "SHARE_WITH_SELF": "Oops, you cannot share with yourself", - "ALREADY_SHARED": "Oops, you're already sharing this with {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Sharing album not allowed", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Sharing is disabled for free accounts", - "DOWNLOAD_COLLECTION": "Download album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Are you sure you want to download the complete album?

All files will be queued for download sequentially

", - "CREATE_ALBUM_FAILED": "Failed to create album , please try again", - "SEARCH": "Search", - "SEARCH_RESULTS": "Search results", - "NO_RESULTS": "No results found", - "SEARCH_HINT": "Search for albums, dates, descriptions, ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Location", - "CITY": "Location", - "DATE": "Date", - "FILE_NAME": "File name", - "THING": "Content", - "FILE_CAPTION": "Description", - "FILE_TYPE": "File type", - "CLIP": "Magic" - }, - "photos_count_zero": "No memories", - "photos_count_one": "1 memory", - "photos_count_other": "{{count, number}} memories", - "TERMS_AND_CONDITIONS": "I agree to the terms and privacy policy", - "ADD_TO_COLLECTION": "Add to album", - "SELECTED": "selected", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "This video cannot be played on your browser", - "PEOPLE": "People", - "INDEXING_SCHEDULED": "Indexing is scheduled...", - "ANALYZING_PHOTOS": "Indexing photos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indexing people in {{indexStatus.nSyncedFiles,number}} photos...", - "INDEXING_DONE": "Indexed {{indexStatus.nSyncedFiles,number}} photos", - "UNIDENTIFIED_FACES": "unidentified faces", - "OBJECTS": "objects", - "TEXT": "text", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "File name", - "CAPTION_PLACEHOLDER": "Add a description", - "LOCATION": "Location", - "SHOW_ON_MAP": "View on OpenStreetMap", - "MAP": "Map", - "MAP_SETTINGS": "Map Settings", - "ENABLE_MAPS": "Enable Maps?", - "ENABLE_MAP": "Enable map", - "DISABLE_MAPS": "Disable Maps?", - "ENABLE_MAP_DESCRIPTION": "

This will show your photos on a world map.

The map is hosted by OpenStreetMap, and the exact locations of your photos are never shared.

You can disable this feature anytime from Settings.

", - "DISABLE_MAP_DESCRIPTION": "

This will disable the display of your photos on a world map.

You can enable this feature anytime from Settings.

", - "DISABLE_MAP": "Disable map", - "DETAILS": "Details", - "VIEW_EXIF": "View all EXIF data", - "NO_EXIF": "No EXIF data", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Two-factor", - "TWO_FACTOR_AUTHENTICATION": "Two-factor authentication", - "TWO_FACTOR_QR_INSTRUCTION": "Scan the QR code below with your favorite authenticator app", - "ENTER_CODE_MANUALLY": "Enter the code manually", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Please enter this code in your favorite authenticator app", - "SCAN_QR_CODE": "Scan QR code instead", - "ENABLE_TWO_FACTOR": "Enable two-factor", - "ENABLE": "Enable", - "LOST_DEVICE": "Lost two-factor device", - "INCORRECT_CODE": "Incorrect code", - "TWO_FACTOR_INFO": "Add an additional layer of security by requiring more than your email and password to log in to your account", - "DISABLE_TWO_FACTOR_LABEL": "Disable two-factor authentication", - "UPDATE_TWO_FACTOR_LABEL": "Update your authenticator device", - "DISABLE": "Disable", - "RECONFIGURE": "Reconfigure", - "UPDATE_TWO_FACTOR": "Update two-factor", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuing forward will void any previously configured authenticators", - "UPDATE": "Update", - "DISABLE_TWO_FACTOR": "Disable two-factor", - "DISABLE_TWO_FACTOR_MESSAGE": "Are you sure you want to disable your two-factor authentication", - "TWO_FACTOR_DISABLE_FAILED": "Failed to disable two factor, please try again", - "EXPORT_DATA": "Export data", - "SELECT_FOLDER": "Select folder", - "DESTINATION": "Destination", - "START": "Start", - "LAST_EXPORT_TIME": "Last export time", - "EXPORT_AGAIN": "Resync", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Local storage not accessible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Your browser or an addon is blocking ente from saving data into local storage. please try loading this page after switching your browsing mode.", - "SEND_OTT": "Send OTP", - "EMAIl_ALREADY_OWNED": "Email already taken", - "ETAGS_BLOCKED": "

We were unable to upload the following files because of your browser configuration.

Please disable any addons that might be preventing ente from using eTags to upload large files, or use our desktop app for a more reliable import experience.

", - "SKIPPED_VIDEOS_INFO": "

Presently we do not support adding videos via public links.

To share videos, please signup for ente and share with the intended recipients using their email.

", - "LIVE_PHOTOS_DETECTED": "The photo and video files from your Live Photos have been merged into a single file", - "RETRY_FAILED": "Retry failed uploads", - "FAILED_UPLOADS": "Failed uploads ", - "SKIPPED_FILES": "Ignored uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generation failed", - "UNSUPPORTED_FILES": "Unsupported files", - "SUCCESSFUL_UPLOADS": "Successful uploads", - "SKIPPED_INFO": "Skipped these as there are files with matching names in the same album", - "UNSUPPORTED_INFO": "ente does not support these file formats yet", - "BLOCKED_UPLOADS": "Blocked uploads", - "SKIPPED_VIDEOS": "Skipped videos", - "INPROGRESS_METADATA_EXTRACTION": "In progress", - "INPROGRESS_UPLOADS": "Uploads in progress", - "TOO_LARGE_UPLOADS": "Large files", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Insufficient storage", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "These files were not uploaded as they exceed the maximum size limit for your storage plan", - "TOO_LARGE_INFO": "These files were not uploaded as they exceed our maximum file size limit", - "THUMBNAIL_GENERATION_FAILED_INFO": "These files were uploaded, but unfortunately we could not generate the thumbnails for them.", - "UPLOAD_TO_COLLECTION": "Upload to album", - "UNCATEGORIZED": "Uncategorized", - "ARCHIVE": "Archive", - "FAVORITES": "Favorites", - "ARCHIVE_COLLECTION": "Archive album", - "ARCHIVE_SECTION_NAME": "Archive", - "ALL_SECTION_NAME": "All", - "MOVE_TO_COLLECTION": "Move to album", - "UNARCHIVE": "Unarchive", - "UNARCHIVE_COLLECTION": "Unarchive album", - "HIDE_COLLECTION": "Hide album", - "UNHIDE_COLLECTION": "Unhide album", - "MOVE": "Move", - "ADD": "Add", - "REMOVE": "Remove", - "YES_REMOVE": "Yes, remove", - "REMOVE_FROM_COLLECTION": "Remove from album", - "TRASH": "Trash", - "MOVE_TO_TRASH": "Move to trash", - "TRASH_FILES_MESSAGE": "Selected files will be removed from all albums and moved to trash.", - "TRASH_FILE_MESSAGE": "The file will be removed from all albums and moved to trash.", - "DELETE_PERMANENTLY": "Delete permanently", - "RESTORE": "Restore", - "RESTORE_TO_COLLECTION": "Restore to album", - "EMPTY_TRASH": "Empty trash", - "EMPTY_TRASH_TITLE": "Empty trash?", - "EMPTY_TRASH_MESSAGE": "These files will be permanently deleted from your ente account.", - "LEAVE_SHARED_ALBUM": "Yes, leave", - "LEAVE_ALBUM": "Leave album", - "LEAVE_SHARED_ALBUM_TITLE": "Leave shared album?", - "LEAVE_SHARED_ALBUM_MESSAGE": "You will leave the album, and it will stop being visible to you.", - "NOT_FILE_OWNER": "You cannot delete files in a shared album", - "CONFIRM_SELF_REMOVE_MESSAGE": "Selected items will be removed from this album. Items which are only in this album will be moved to Uncategorized.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Some of the items you are removing were added by other people, and you will lose access to them.", - "SORT_BY_CREATION_TIME_ASCENDING": "Oldest", - "SORT_BY_UPDATION_TIME_DESCENDING": "Last updated", - "SORT_BY_NAME": "Name", - "COMPRESS_THUMBNAILS": "Compress thumbnails", - "THUMBNAIL_REPLACED": "Thumbnails compressed", - "FIX_THUMBNAIL": "Compress", - "FIX_THUMBNAIL_LATER": "Compress later", - "REPLACE_THUMBNAIL_NOT_STARTED": "Some of your videos thumbnails can be compressed to save space. would you like ente to compress them?", - "REPLACE_THUMBNAIL_COMPLETED": "Successfully compressed all thumbnails", - "REPLACE_THUMBNAIL_NOOP": "You have no thumbnails that can be compressed further", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Could not compress some of your thumbnails, please retry", - "FIX_CREATION_TIME": "Fix time", - "FIX_CREATION_TIME_IN_PROGRESS": "Fixing time", - "CREATION_TIME_UPDATED": "File time updated", - "UPDATE_CREATION_TIME_NOT_STARTED": "Select the option you want to use", - "UPDATE_CREATION_TIME_COMPLETED": "Successfully updated all files", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "File time updation failed for some files, please retry", - "CAPTION_CHARACTER_LIMIT": "5000 characters max", - "DATE_TIME_ORIGINAL": "EXIF:DateTimeOriginal", - "DATE_TIME_DIGITIZED": "EXIF:DateTimeDigitized", - "METADATA_DATE": "EXIF:MetadataDate", - "CUSTOM_TIME": "Custom time", - "REOPEN_PLAN_SELECTOR_MODAL": "Re-open plans", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Failed to open plans", - "INSTALL": "Install", - "SHARING_DETAILS": "Sharing details", - "MODIFY_SHARING": "Modify sharing", - "ADD_COLLABORATORS": "Add collaborators", - "ADD_NEW_EMAIL": "Add a new email", - "shared_with_people_zero": "Share with specific people", - "shared_with_people_one": "Shared with 1 person", - "shared_with_people_other": "Shared with {{count, number}} people", - "participants_zero": "No participants", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", - "ADD_VIEWERS": "Add viewers", - "PARTICIPANTS": "Participants", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} will not be able to add more photos to the album

They will still be able to remove photos added by them

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} will be able to add photos to the album", - "CONVERT_TO_VIEWER": "Yes, convert to viewer", - "CONVERT_TO_COLLABORATOR": "Yes, convert to collaborator", - "CHANGE_PERMISSION": "Change permission?", - "REMOVE_PARTICIPANT": "Remove?", - "CONFIRM_REMOVE": "Yes, remove", - "MANAGE": "Manage", - "ADDED_AS": "Added as", - "COLLABORATOR_RIGHTS": "Collaborators can add photos and videos to the shared album", - "REMOVE_PARTICIPANT_HEAD": "Remove participant", - "OWNER": "Owner", - "COLLABORATORS": "Collaborators", - "ADD_MORE": "Add more", - "VIEWERS": "Viewers", - "OR_ADD_EXISTING": "Or pick an existing one", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} will be removed from the album

Any photos added by them will also be removed from the album

", - "NOT_FOUND": "404 - not found", - "LINK_EXPIRED": "Link expired", - "LINK_EXPIRED_MESSAGE": "This link has either expired or been disabled!", - "MANAGE_LINK": "Manage link", - "LINK_TOO_MANY_REQUESTS": "Sorry, this album has been viewed on too many devices!", - "FILE_DOWNLOAD": "Allow downloads", - "LINK_PASSWORD_LOCK": "Password lock", - "PUBLIC_COLLECT": "Allow adding photos", - "LINK_DEVICE_LIMIT": "Device limit", - "NO_DEVICE_LIMIT": "None", - "LINK_EXPIRY": "Link expiry", - "NEVER": "Never", - "DISABLE_FILE_DOWNLOAD": "Disable download", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Are you sure that you want to disable the download button for files?

Viewers can still take screenshots or save a copy of your photos using external tools.

", - "MALICIOUS_CONTENT": "Contains malicious content", - "COPYRIGHT": "Infringes on the copyright of someone I am authorized to represent", - "SHARED_USING": "Shared using ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Use code {{referralCode}} to get 10 GB free", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Disable password lock", - "DISABLE_PASSWORD_MESSAGE": "Are you sure that you want to disable the password lock?", - "PASSWORD_LOCK": "Password lock", - "LOCK": "Lock", - "DOWNLOAD_UPLOAD_LOGS": "Debug logs", - "UPLOAD_FILES": "File", - "UPLOAD_DIRS": "Folder", - "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", - "DEDUPLICATE_FILES": "Deduplicate files", - "AUTHENTICATOR_SECTION": "Authenticator", - "NO_DUPLICATES_FOUND": "You've no duplicate files that can be cleared", - "CLUB_BY_CAPTURE_TIME": "Club by capture time", - "FILES": "Files", - "EACH": "Each", - "DEDUPLICATE_BASED_ON_SIZE": "The following files were clubbed based on their sizes, please review and delete items you believe are duplicates", - "STOP_ALL_UPLOADS_MESSAGE": "Are you sure that you want to stop all the uploads in progress?", - "STOP_UPLOADS_HEADER": "Stop uploads?", - "YES_STOP_UPLOADS": "Yes, stop uploads", - "STOP_DOWNLOADS_HEADER": "Stop downloads?", - "YES_STOP_DOWNLOADS": "Yes, stop downloads", - "STOP_ALL_DOWNLOADS_MESSAGE": "Are you sure that you want to stop all the downloads in progress?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", - "ALL_ALBUMS": "All Albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "All hidden albums", - "HIDDEN_ALBUMS": "Hidden albums", - "HIDDEN_ITEMS": "Hidden items", - "HIDDEN_ITEMS_SECTION_NAME": "Hidden_items", - "ENTER_TWO_FACTOR_OTP": "Enter the 6-digit code from your authenticator app.", - "CREATE_ACCOUNT": "Create account", - "COPIED": "Copied", - "CANVAS_BLOCKED_TITLE": "Unable to generate thumbnail", - "CANVAS_BLOCKED_MESSAGE": "

It looks like your browser has disabled access to canvas, which is necessary to generate thumbnails for your photos

Please enable access to your browser's canvas, or check out our desktop app

", - "WATCH_FOLDERS": "Watch folders", - "UPGRADE_NOW": "Upgrade now", - "RENEW_NOW": "Renew now", - "STORAGE": "Storage", - "USED": "used", - "YOU": "You", - "FAMILY": "Family", - "FREE": "free", - "OF": "of", - "WATCHED_FOLDERS": "Watched folders", - "NO_FOLDERS_ADDED": "No folders added yet!", - "FOLDERS_AUTOMATICALLY_MONITORED": "The folders you add here will monitored to automatically", - "UPLOAD_NEW_FILES_TO_ENTE": "Upload new files to ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Remove deleted files from ente", - "ADD_FOLDER": "Add folder", - "STOP_WATCHING": "Stop watching", - "STOP_WATCHING_FOLDER": "Stop watching folder?", - "STOP_WATCHING_DIALOG_MESSAGE": "Your existing files will not be deleted, but ente will stop automatically updating the linked ente album on changes in this folder.", - "YES_STOP": "Yes, stop", - "MONTH_SHORT": "mo", - "YEAR": "year", - "FAMILY_PLAN": "Family plan", - "DOWNLOAD_LOGS": "Download logs", - "DOWNLOAD_LOGS_MESSAGE": "

This will download debug logs, which you can email to us to help debug your issue.

Please note that file names will be included to help track issues with specific files.

", - "CHANGE_FOLDER": "Change Folder", - "TWO_MONTHS_FREE": "Get 2 months free on yearly plans", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continue with free trial", - "FREE_PLAN_DESCRIPTION": "1 GB for 1 year", - "CURRENT_USAGE": "Current usage is {{usage}}", - "WEAK_DEVICE": "The web browser you're using is not powerful enough to encrypt your photos. Please try to log in to ente on your computer, or download the ente mobile/desktop app.", - "DRAG_AND_DROP_HINT": "Or drag and drop into the ente window", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Your uploaded data will be scheduled for deletion, and your account will be permanently deleted.

This action is not reversible.", - "AUTHENTICATE": "Authenticate", - "UPLOADED_TO_SINGLE_COLLECTION": "Uploaded to single collection", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Uploaded to separate collections", - "NEVERMIND": "Nevermind", - "UPDATE_AVAILABLE": "Update available", - "UPDATE_INSTALLABLE_MESSAGE": "A new version of ente is ready to be installed.", - "INSTALL_NOW": "Install now", - "INSTALL_ON_NEXT_LAUNCH": "Install on next launch", - "UPDATE_AVAILABLE_MESSAGE": "A new version of ente has been released, but it cannot be automatically downloaded and installed.", - "DOWNLOAD_AND_INSTALL": "Download and install", - "IGNORE_THIS_VERSION": "Ignore this version", - "TODAY": "Today", - "YESTERDAY": "Yesterday", - "NAME_PLACEHOLDER": "Name...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Cannot create albums from file/folder mix", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

You have dragged and dropped a mixture of files and folders.

Please provide either only files, or only folders when selecting option to create separate albums

", - "CHOSE_THEME": "Choose theme", - "ML_SEARCH": "Face recognition", - "ENABLE_ML_SEARCH_DESCRIPTION": "

This will enable on-device machine learning and face search which will start analyzing your uploaded photos locally.

For the first run after login or enabling this feature, it will download all images on local device to analyze them. So please only enable this if you are ok with bandwidth and local processing of all images in your photo library.

If this is the first time you're enabling this, we'll also ask your permission to process face data.

", - "ML_MORE_DETAILS": "More details", - "ENABLE_FACE_SEARCH": "Enable face recognition", - "ENABLE_FACE_SEARCH_TITLE": "Enable face recognition?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face recognition, ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", - "DISABLE_BETA": "Pause recognition", - "DISABLE_FACE_SEARCH": "Disable face recognition", - "DISABLE_FACE_SEARCH_TITLE": "Disable face recognition?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

Ente will stop processing face geometry.

You can reenable face recognition again if you wish, so this operation is safe.

", - "ADVANCED": "Advanced", - "FACE_SEARCH_CONFIRMATION": "I understand, and wish to allow ente to process face geometry", - "LABS": "Labs", - "YOURS": "yours", - "PASSPHRASE_STRENGTH_WEAK": "Password strength: Weak", - "PASSPHRASE_STRENGTH_MODERATE": "Password strength: Moderate", - "PASSPHRASE_STRENGTH_STRONG": "Password strength: Strong", - "PREFERENCES": "Preferences", - "LANGUAGE": "Language", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Invalid export directory", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

The export directory you have selected does not exist.

Please select a valid directory.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Subscription verification failed", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "after an hour", - "DAY": "after a day", - "WEEK": "after a week", - "MONTH": "after a month", - "YEAR": "after a year" - }, - "COPY_LINK": "Copy link", - "DONE": "Done", - "LINK_SHARE_TITLE": "Or share a link", - "REMOVE_LINK": "Remove link", - "CREATE_PUBLIC_SHARING": "Create public link", - "PUBLIC_LINK_CREATED": "Public link created", - "PUBLIC_LINK_ENABLED": "Public link enabled", - "COLLECT_PHOTOS": "Collect photos", - "PUBLIC_COLLECT_SUBTEXT": "Allow people with the link to also add photos to the shared album.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success, number}} / {{progress.total, number}} items synced", - "MIGRATING_EXPORT": "Preparing...", - "RENAMING_COLLECTION_FOLDERS": "Renaming album folders...", - "TRASHING_DELETED_FILES": "Trashing deleted files...", - "TRASHING_DELETED_COLLECTIONS": "Trashing deleted albums...", - "EXPORT_NOTIFICATION": { - "START": "Export started", - "IN_PROGRESS": "Export already in progress", - "FINISH": "Export finished", - "UP_TO_DATE": "No new files to export" - }, - "CONTINUOUS_EXPORT": "Sync continuously", - "TOTAL_ITEMS": "Total items", - "PENDING_ITEMS": "Pending items", - "EXPORT_STARTING": "Export starting...", - "DELETE_ACCOUNT_REASON_LABEL": "What is the main reason you are deleting your account?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Select a reason", - "DELETE_REASON": { - "MISSING_FEATURE": "It's missing a key feature that I need", - "BROKEN_BEHAVIOR": "The app or a certain feature does not behave as I think it should", - "FOUND_ANOTHER_SERVICE": "I found another service that I like better", - "NOT_LISTED": "My reason isn't listed" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "We are sorry to see you go. Please explain why you are leaving to help us improve.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Feedback", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Yes, I want to permanently delete this account and all its data", - "CONFIRM_DELETE_ACCOUNT": "Confirm Account Deletion", - "FEEDBACK_REQUIRED": "Kindly help us with this information", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "What does the other service do better?", - "RECOVER_TWO_FACTOR": "Recover two-factor", - "at": "at", - "AUTH_NEXT": "next", - "AUTH_DOWNLOAD_MOBILE_APP": "Download our mobile app to manage your secrets", - "HIDDEN": "Hidden", - "HIDE": "Hide", - "UNHIDE": "Unhide", - "UNHIDE_TO_COLLECTION": "Unhide to album", - "SORT_BY": "Sort by", - "NEWEST_FIRST": "Newest first", - "OLDEST_FIRST": "Oldest first", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "This file could not be previewed. Click here to download the original.", - "SELECT_COLLECTION": "Select album", - "PIN_ALBUM": "Pin album", - "UNPIN_ALBUM": "Unpin album", - "DOWNLOAD_COMPLETE": "Download complete", - "DOWNLOADING_COLLECTION": "Downloading {{name}}", - "DOWNLOAD_FAILED": "Download failed", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} files", - "CHRISTMAS": "Christmas", - "CHRISTMAS_EVE": "Christmas Eve", - "NEW_YEAR": "New Year", - "NEW_YEAR_EVE": "New Year's Eve", - "IMAGE": "Image", - "VIDEO": "Video", - "LIVE_PHOTO": "Live Photo", - "CONVERT": "Convert", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Are you sure you want to close the editor?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Download your edited image or save a copy to ente to persist your changes.", - "BRIGHTNESS": "Brightness", - "CONTRAST": "Contrast", - "SATURATION": "Saturation", - "BLUR": "Blur", - "INVERT_COLORS": "Invert Colors", - "ASPECT_RATIO": "Aspect Ratio", - "SQUARE": "Square", - "ROTATE_LEFT": "Rotate Left", - "ROTATE_RIGHT": "Rotate Right", - "FLIP_VERTICALLY": "Flip Vertically", - "FLIP_HORIZONTALLY": "Flip Horizontally", - "DOWNLOAD_EDITED": "Download Edited", - "SAVE_A_COPY_TO_ENTE": "Save a copy to ente", - "RESTORE_ORIGINAL": "Restore Original", - "TRANSFORM": "Transform", - "COLORS": "Colors", - "FLIP": "Flip", - "ROTATION": "Rotation", - "RESET": "Reset", - "PHOTO_EDITOR": "Photo Editor", - "FASTER_UPLOAD": "Faster uploads", - "FASTER_UPLOAD_DESCRIPTION": "Route uploads through nearby servers", - "MAGIC_SEARCH_STATUS": "Magic Search Status", - "INDEXED_ITEMS": "Indexed items", - "CAST_ALBUM_TO_TV": "Play album on TV", - "ENTER_CAST_PIN_CODE": "Enter the code you see on the TV below to pair this device.", - "PAIR_DEVICE_TO_TV": "Pair devices", - "TV_NOT_FOUND": "TV not found. Did you enter the PIN correctly?", - "AUTO_CAST_PAIR": "Auto Pair", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "Auto Pair requires connecting to Google servers and only works with Chromecast supported devices. Google will not receive sensitive data, such as your photos.", - "PAIR_WITH_PIN": "Pair with PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Choose a cast-compatible device from the browser popup.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "Pair with PIN works for any large screen device you want to play your album on.", - "VISIT_CAST_ENTE_IO": "Visit cast.ente.io on the device you want to pair.", - "CAST_AUTO_PAIR_FAILED": "Chromecast Auto Pair failed. Please try again.", - "CACHE_DIRECTORY": "Cache folder", - "FREEHAND": "Freehand", - "APPLY_CROP": "Apply Crop", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "At least one transformation or color adjustment must be performed before saving.", - "PASSKEYS": "Passkeys", - "DELETE_PASSKEY": "Delete passkey", - "DELETE_PASSKEY_CONFIRMATION": "Are you sure you want to delete this passkey? This action is irreversible.", - "RENAME_PASSKEY": "Rename passkey", - "ADD_PASSKEY": "Add passkey", - "ENTER_PASSKEY_NAME": "Enter passkey name", - "PASSKEYS_DESCRIPTION": "Passkeys are a modern and secure second-factor for your Ente account. They use on-device biometric authentication for convenience and security.", - "CREATED_AT": "Created at", - "PASSKEY_LOGIN_FAILED": "Passkey login failed", - "PASSKEY_LOGIN_URL_INVALID": "The login URL is invalid.", - "PASSKEY_LOGIN_ERRORED": "An error occurred while logging in with passkey.", - "TRY_AGAIN": "Try again", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "Follow the steps from your browser to continue logging in.", - "LOGIN_WITH_PASSKEY": "Login with passkey" -} diff --git a/web/apps/cast/public/locales/es-ES/translation.json b/web/apps/cast/public/locales/es-ES/translation.json deleted file mode 100644 index a29165e4e..000000000 --- a/web/apps/cast/public/locales/es-ES/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Copias de seguridad privadas
para su recuerdos
", - "HERO_SLIDE_1": "Encriptado de extremo a extremo por defecto", - "HERO_SLIDE_2_TITLE": "
Almacenado de forma segura
en un refugio de llenos
", - "HERO_SLIDE_2": "Diseñado para superar", - "HERO_SLIDE_3_TITLE": "
Disponible
en todas partes
", - "HERO_SLIDE_3": "Android, iOS, web, computadora", - "LOGIN": "Conectar", - "SIGN_UP": "Registro", - "NEW_USER": "Nuevo en ente", - "EXISTING_USER": "Usuario existente", - "ENTER_NAME": "Introducir nombre", - "PUBLIC_UPLOADER_NAME_MESSAGE": "¡Añade un nombre para que tus amigos sepan a quién dar las gracias por estas fotos geniales!", - "ENTER_EMAIL": "Introducir email", - "EMAIL_ERROR": "Introduce un email válido", - "REQUIRED": "Requerido", - "EMAIL_SENT": "Código de verificación enviado al {{email}}", - "CHECK_INBOX": "Revisa tu bandeja de entrada (y spam) para completar la verificación", - "ENTER_OTT": "Código de verificación", - "RESEND_MAIL": "Reenviar el código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Se produjo un error. Por favor, inténtalo de nuevo", - "INVALID_CODE": "Código de verificación inválido", - "EXPIRED_CODE": "Código de verificación expirado", - "SENDING": "Enviando...", - "SENT": "Enviado!", - "PASSWORD": "Contraseña", - "LINK_PASSWORD": "Introducir contraseña para desbloquear el álbum", - "RETURN_PASSPHRASE_HINT": "Contraseña", - "SET_PASSPHRASE": "Definir contraseña", - "VERIFY_PASSPHRASE": "Ingresar", - "INCORRECT_PASSPHRASE": "Contraseña incorrecta", - "ENTER_ENC_PASSPHRASE": "Introducir una contraseña que podamos usar para cifrar sus datos", - "PASSPHRASE_DISCLAIMER": "No guardamos su contraseña, así que si la olvida, no podremos ayudarte a recuperar tus datos sin una clave de recuperación.", - "WELCOME_TO_ENTE_HEADING": "Bienvenido a ", - "WELCOME_TO_ENTE_SUBHEADING": "Almacenamiento y compartición de fotos cifradas de extremo a extremo", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Donde vivan su mejores fotos", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generando claves de encriptación...", - "PASSPHRASE_HINT": "Contraseña", - "CONFIRM_PASSPHRASE": "Confirmar contraseña", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Las contraseñas no coinciden", - "CREATE_COLLECTION": "Nuevo álbum", - "ENTER_ALBUM_NAME": "Nombre del álbum", - "CLOSE_OPTION": "Cerrar (Esc)", - "ENTER_FILE_NAME": "Nombre del archivo", - "CLOSE": "Cerrar", - "NO": "No", - "NOTHING_HERE": "Nada para ver aquí aún 👀", - "UPLOAD": "Cargar", - "IMPORT": "Importar", - "ADD_PHOTOS": "Añadir fotos", - "ADD_MORE_PHOTOS": "Añadir más fotos", - "add_photos_one": "Añadir 1 foto", - "add_photos_other": "Añadir {{count}} fotos", - "SELECT_PHOTOS": "Seleccionar fotos", - "FILE_UPLOAD": "Subir archivo", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparando la subida", - "1": "Leyendo archivos de metadatos de google", - "2": "{{uploadCounter.finished}} / {{uploadCounter.total}} archivos metadatos extraídos", - "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} archivos metadatos extraídos", - "4": "Cancelar subidas restantes", - "5": "Copia de seguridad completa" - }, - "FILE_NOT_UPLOADED_LIST": "Los siguientes archivos no se han subido", - "SUBSCRIPTION_EXPIRED": "Suscripción caducada", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Tu suscripción ha caducado, por favor renuévala", - "STORAGE_QUOTA_EXCEEDED": "Límite de datos excedido", - "INITIAL_LOAD_DELAY_WARNING": "La primera carga puede tomar algún tiempo", - "USER_DOES_NOT_EXIST": "Lo sentimos, no se pudo encontrar un usuario con ese email", - "NO_ACCOUNT": "No tienes una cuenta", - "ACCOUNT_EXISTS": "Ya tienes una cuenta", - "CREATE": "Crear", - "DOWNLOAD": "Descargar", - "DOWNLOAD_OPTION": "Descargar (D)", - "DOWNLOAD_FAVORITES": "Descargar favoritos", - "DOWNLOAD_UNCATEGORIZED": "Descargar no categorizados", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "Copiar como PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Alternar pantalla completa (F)", - "ZOOM_IN_OUT": "Acercar/alejar", - "PREVIOUS": "Anterior (←)", - "NEXT": "Siguiente (→)", - "TITLE_PHOTOS": "ente Fotos", - "TITLE_ALBUMS": "ente Fotos", - "TITLE_AUTH": "ente Auth", - "UPLOAD_FIRST_PHOTO": "Carga tu primer archivo", - "IMPORT_YOUR_FOLDERS": "Importar tus carpetas", - "UPLOAD_DROPZONE_MESSAGE": "Soltar para respaldar tus archivos", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Soltar para añadir carpeta vigilada", - "TRASH_FILES_TITLE": "Eliminar archivos?", - "TRASH_FILE_TITLE": "Eliminar archivo?", - "DELETE_FILES_TITLE": "Eliminar inmediatamente?", - "DELETE_FILES_MESSAGE": "Los archivos seleccionados serán eliminados permanentemente de tu cuenta ente.", - "DELETE": "Eliminar", - "DELETE_OPTION": "Eliminar (DEL)", - "FAVORITE_OPTION": "Favorito (L)", - "UNFAVORITE_OPTION": "No favorito (L)", - "MULTI_FOLDER_UPLOAD": "Múltiples carpetas detectadas", - "UPLOAD_STRATEGY_CHOICE": "Quieres subirlos a", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un solo álbum", - "OR": "o", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Separar álbumes", - "SESSION_EXPIRED_MESSAGE": "Tu sesión ha caducado. Inicia sesión de nuevo para continuar", - "SESSION_EXPIRED": "Sesión caducado", - "PASSWORD_GENERATION_FAILED": "Su navegador no ha podido generar una clave fuerte que cumpla con los estándares de cifrado de la entidad, por favor intente usar la aplicación móvil u otro navegador", - "CHANGE_PASSWORD": "Cambiar contraseña", - "GO_BACK": "Retroceder", - "RECOVERY_KEY": "Clave de recuperación", - "SAVE_LATER": "Hacer más tarde", - "SAVE": "Guardar Clave", - "RECOVERY_KEY_DESCRIPTION": "Si olvida su contraseña, la única forma de recuperar sus datos es con esta clave.", - "RECOVER_KEY_GENERATION_FAILED": "El código de recuperación no pudo ser generado, por favor inténtalo de nuevo", - "KEY_NOT_STORED_DISCLAIMER": "No almacenamos esta clave, así que por favor guarde esto en un lugar seguro", - "FORGOT_PASSWORD": "Contraseña olvidada", - "RECOVER_ACCOUNT": "Recuperar cuenta", - "RECOVERY_KEY_HINT": "Clave de recuperación", - "RECOVER": "Recuperar", - "NO_RECOVERY_KEY": "No hay clave de recuperación?", - "INCORRECT_RECOVERY_KEY": "Clave de recuperación incorrecta", - "SORRY": "Lo sentimos", - "NO_RECOVERY_KEY_MESSAGE": "Debido a la naturaleza de nuestro protocolo de cifrado de extremo a extremo, sus datos no pueden ser descifrados sin su contraseña o clave de recuperación", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Por favor, envíe un email a {{emailID}} desde su dirección de correo electrónico registrada", - "CONTACT_SUPPORT": "Contacta con soporte", - "REQUEST_FEATURE": "Solicitar una función", - "SUPPORT": "Soporte", - "CONFIRM": "Confirmar", - "CANCEL": "Cancelar", - "LOGOUT": "Cerrar sesión", - "DELETE_ACCOUNT": "Eliminar cuenta", - "DELETE_ACCOUNT_MESSAGE": "

Por favor, envíe un email a {{emailID}} desde su dirección de correo electrónico registrada

Su solicitud será procesada en 72 horas.

", - "LOGOUT_MESSAGE": "Seguro que quiere cerrar la sesión?", - "CHANGE_EMAIL": "Cambiar email", - "OK": "OK", - "SUCCESS": "Completado", - "ERROR": "Error", - "MESSAGE": "Mensaje", - "INSTALL_MOBILE_APP": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos", - "DOWNLOAD_APP_MESSAGE": "Lo sentimos, esta operación sólo es compatible con nuestra aplicación de computadora", - "DOWNLOAD_APP": "Descargar aplicación de computadora", - "EXPORT": "Exportar datos", - "SUBSCRIPTION": "Suscripción", - "SUBSCRIBE": "Suscribir", - "MANAGEMENT_PORTAL": "Gestionar métodos de pago", - "MANAGE_FAMILY_PORTAL": "Administrar familia", - "LEAVE_FAMILY_PLAN": "Dejar plan familiar", - "LEAVE": "Dejar", - "LEAVE_FAMILY_CONFIRM": "Está seguro de que desea abandonar el plan familiar?", - "CHOOSE_PLAN": "Elije tu plan", - "MANAGE_PLAN": "Administra tu suscripción", - "ACTIVE": "Activo", - "OFFLINE_MSG": "Estás desconectado, se están mostrando recuerdos en caché", - "FREE_SUBSCRIPTION_INFO": "Estás en el plan gratis que expira el {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Estás en un plan familiar administrado por", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Se renueva en {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina el {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Tu suscripción será cancelada el {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Ha excedido su cuota de almacenamiento, por favor actualice", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Hemos recibido tu pago

¡Tu suscripción es válida hasta {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Tu compra ha sido cancelada, por favor inténtalo de nuevo si quieres suscribirte", - "SUBSCRIPTION_PURCHASE_FAILED": "Compra de suscripción fallida, por favor inténtalo de nuevo", - "SUBSCRIPTION_UPDATE_FAILED": "Suscripción actualizada falló, inténtelo de nuevo", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Lo sentimos, el pago falló cuando intentamos cargar a su tarjeta, por favor actualice su método de pago y vuelva a intentarlo", - "STRIPE_AUTHENTICATION_FAILED": "No podemos autenticar tu método de pago. Por favor, elige un método de pago diferente e inténtalo de nuevo", - "UPDATE_PAYMENT_METHOD": "Actualizar medio de pago", - "MONTHLY": "Mensual", - "YEARLY": "Anual", - "UPDATE_SUBSCRIPTION_MESSAGE": "Seguro de que desea cambiar su plan?", - "UPDATE_SUBSCRIPTION": "Cambiar de plan", - "CANCEL_SUBSCRIPTION": "Cancelar suscripción", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Todos tus datos serán eliminados de nuestros servidores al final de este periodo de facturación.

¿Está seguro de que desea cancelar su suscripción?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "No se pudo cancelar la suscripción", - "SUBSCRIPTION_CANCEL_SUCCESS": "Suscripción cancelada correctamente", - "REACTIVATE_SUBSCRIPTION": "Reactivar la suscripción", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Una vez reactivado, serás facturado el {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Suscripción activada correctamente ", - "SUBSCRIPTION_ACTIVATE_FAILED": "No se pudo reactivar las renovaciones de suscripción", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Gracias", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancelar suscripción a móviles", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Por favor, cancele su suscripción de la aplicación móvil para activar una suscripción aquí", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Por favor, contáctenos en {{emailID}} para gestionar su suscripción", - "RENAME": "Renombrar", - "RENAME_FILE": "Renombrar archivo", - "RENAME_COLLECTION": "Renombrar álbum", - "DELETE_COLLECTION_TITLE": "Eliminar álbum?", - "DELETE_COLLECTION": "Eliminar álbum", - "DELETE_COLLECTION_MESSAGE": "También eliminar las fotos (y los vídeos) presentes en este álbum de todos álbumes de los que forman parte?", - "DELETE_PHOTOS": "Eliminar fotos", - "KEEP_PHOTOS": "Conservar fotos", - "SHARE": "Compartir", - "SHARE_COLLECTION": "Compartir álbum", - "SHAREES": "Compartido con", - "SHARE_WITH_SELF": "Uy, no puedes compartir contigo mismo", - "ALREADY_SHARED": "Uy, ya estás compartiendo esto con {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Compartir álbum no permitido", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Compartir está desactivado para cuentas gratis", - "DOWNLOAD_COLLECTION": "Descargar álbum", - "DOWNLOAD_COLLECTION_MESSAGE": "

¿Está seguro de que desea descargar el álbum completo?

Todos los archivos se pondrán en cola para su descarga secuencialmente

", - "CREATE_ALBUM_FAILED": "Error al crear el álbum, inténtalo de nuevo", - "SEARCH": "Buscar", - "SEARCH_RESULTS": "Buscar resultados", - "NO_RESULTS": "No se han encontrado resultados", - "SEARCH_HINT": "Buscar álbumes, fechas...", - "SEARCH_TYPE": { - "COLLECTION": "Álbum", - "LOCATION": "Localización", - "CITY": "", - "DATE": "Fecha", - "FILE_NAME": "Nombre del archivo", - "THING": "Contenido", - "FILE_CAPTION": "Descripción", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "No hay recuerdos", - "photos_count_one": "1 recuerdo", - "photos_count_other": "{{count}} recuerdos", - "TERMS_AND_CONDITIONS": "Acepto los términos y política de privacidad", - "ADD_TO_COLLECTION": "Añadir al álbum", - "SELECTED": "seleccionado", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Este vídeo no se puede reproducir en tu navegador", - "PEOPLE": "Personajes", - "INDEXING_SCHEDULED": "el indexado está programado...", - "ANALYZING_PHOTOS": "analizando nuevas fotos {{indexStatus.nSyncedFiles}} de {{indexStatus.nTotalFiles}} hecho)...", - "INDEXING_PEOPLE": "indexando personas en {{indexStatus.nSyncedFiles}} fotos... ", - "INDEXING_DONE": "fotos {{indexStatus.nSyncedFiles}} indexadas", - "UNIDENTIFIED_FACES": "caras no identificadas", - "OBJECTS": "objetos", - "TEXT": "texto", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Nombre del archivo", - "CAPTION_PLACEHOLDER": "Añadir una descripción", - "LOCATION": "Localización", - "SHOW_ON_MAP": "Ver en OpenStreetMap", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "Detalles", - "VIEW_EXIF": "Ver todos los datos de EXIF", - "NO_EXIF": "No hay datos EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Dos factores", - "TWO_FACTOR_AUTHENTICATION": "Autenticación de dos factores", - "TWO_FACTOR_QR_INSTRUCTION": "Escanea el código QR de abajo con tu aplicación de autenticación favorita", - "ENTER_CODE_MANUALLY": "Ingrese el código manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Por favor, introduce este código en tu aplicación de autenticación favorita", - "SCAN_QR_CODE": "Escanear código QR en su lugar", - "ENABLE_TWO_FACTOR": "Activar dos factores", - "ENABLE": "Activar", - "LOST_DEVICE": "Perdido el dispositivo de doble factor", - "INCORRECT_CODE": "Código incorrecto", - "TWO_FACTOR_INFO": "Añade una capa adicional de seguridad al requerir más de tu email y contraseña para iniciar sesión en tu cuenta", - "DISABLE_TWO_FACTOR_LABEL": "Deshabilitar la autenticación de dos factores", - "UPDATE_TWO_FACTOR_LABEL": "Actualice su dispositivo de autenticación", - "DISABLE": "Desactivar", - "RECONFIGURE": "Reconfigurar", - "UPDATE_TWO_FACTOR": "Actualizar doble factor", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuar adelante anulará los autenticadores previamente configurados", - "UPDATE": "Actualizar", - "DISABLE_TWO_FACTOR": "Desactivar doble factor", - "DISABLE_TWO_FACTOR_MESSAGE": "¿Estás seguro de que desea deshabilitar la autenticación de doble factor?", - "TWO_FACTOR_DISABLE_FAILED": "Error al desactivar dos factores, inténtalo de nuevo", - "EXPORT_DATA": "Exportar datos", - "SELECT_FOLDER": "Seleccionar carpeta", - "DESTINATION": "Destinación", - "START": "Inicio", - "LAST_EXPORT_TIME": "Fecha de la última exportación", - "EXPORT_AGAIN": "Resinc", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Almacenamiento local inaccesible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Su navegador o un addon está bloqueando a ente de guardar datos en almacenamiento local. Por favor, intente cargar esta página después de cambiar su modo de navegación.", - "SEND_OTT": "Enviar OTP", - "EMAIl_ALREADY_OWNED": "Email ya tomado", - "ETAGS_BLOCKED": "

No hemos podido subir los siguientes archivos debido a la configuración de tu navegador.

Por favor, deshabilite cualquier complemento que pueda estar impidiendo que ente utilice eTags para subir archivos grandes, o utilice nuestra aplicación de escritorio para una experiencia de importación más fiable.

", - "SKIPPED_VIDEOS_INFO": "

Actualmente no podemos añadir vídeos a través de enlaces públicos.

Para compartir vídeos, por favor regístrate en ente y comparte con los destinatarios a través de su correo electrónico.

", - "LIVE_PHOTOS_DETECTED": "Los archivos de foto y vídeo de tus fotos en vivo se han fusionado en un solo archivo", - "RETRY_FAILED": "Reintentar subidas fallidas", - "FAILED_UPLOADS": "Subidas fallidas ", - "SKIPPED_FILES": "Subidas ignoradas", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Generación de miniaturas fallida", - "UNSUPPORTED_FILES": "Archivos no soportados", - "SUCCESSFUL_UPLOADS": "Subidas exitosas", - "SKIPPED_INFO": "Se han omitido ya que hay archivos con nombres coincidentes en el mismo álbum", - "UNSUPPORTED_INFO": "ente no soporta estos formatos de archivo aún", - "BLOCKED_UPLOADS": "Subidas bloqueadas", - "SKIPPED_VIDEOS": "Vídeos saltados", - "INPROGRESS_METADATA_EXTRACTION": "En proceso", - "INPROGRESS_UPLOADS": "Subidas en progreso", - "TOO_LARGE_UPLOADS": "Archivos grandes", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Espacio insuficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Estos archivos no se han subido porque exceden el límite de tamaño máximo para tu plan de almacenamiento", - "TOO_LARGE_INFO": "Estos archivos no se han subido porque exceden nuestro límite máximo de tamaño de archivo", - "THUMBNAIL_GENERATION_FAILED_INFO": "Estos archivos fueron cargados, pero por desgracia no pudimos generar las miniaturas para ellos.", - "UPLOAD_TO_COLLECTION": "Subir al álbum", - "UNCATEGORIZED": "No clasificado", - "ARCHIVE": "Archivo", - "FAVORITES": "Favoritos", - "ARCHIVE_COLLECTION": "Archivo álbum", - "ARCHIVE_SECTION_NAME": "Archivo", - "ALL_SECTION_NAME": "Todo", - "MOVE_TO_COLLECTION": "Mover al álbum", - "UNARCHIVE": "Desarchivar", - "UNARCHIVE_COLLECTION": "Desarchivar álbum", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "Mover", - "ADD": "Añadir", - "REMOVE": "Eliminar", - "YES_REMOVE": "Sí, eliminar", - "REMOVE_FROM_COLLECTION": "Eliminar del álbum", - "TRASH": "Papelera", - "MOVE_TO_TRASH": "Mover a la papelera", - "TRASH_FILES_MESSAGE": "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera.", - "TRASH_FILE_MESSAGE": "El archivo será eliminado de todos los álbumes y movido a la papelera.", - "DELETE_PERMANENTLY": "Eliminar para siempre", - "RESTORE": "Restaurar", - "RESTORE_TO_COLLECTION": "Restaurar al álbum", - "EMPTY_TRASH": "Vaciar papelera", - "EMPTY_TRASH_TITLE": "Vaciar papelera?", - "EMPTY_TRASH_MESSAGE": "Estos archivos serán eliminados permanentemente de su cuenta ente.", - "LEAVE_SHARED_ALBUM": "Sí, dejar", - "LEAVE_ALBUM": "Dejar álbum", - "LEAVE_SHARED_ALBUM_TITLE": "¿Dejar álbum compartido?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Dejará el álbum, y dejará de ser visible para usted.", - "NOT_FILE_OWNER": "No puedes eliminar archivos de un álbum compartido", - "CONFIRM_SELF_REMOVE_MESSAGE": "Los elementos seleccionados serán eliminados de este álbum. Los elementos que estén sólo en este álbum serán movidos a Sin categorizar.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Algunos de los elementos que estás eliminando fueron añadidos por otras personas, y perderás el acceso a ellos.", - "SORT_BY_CREATION_TIME_ASCENDING": "Antiguo", - "SORT_BY_UPDATION_TIME_DESCENDING": "Última actualización", - "SORT_BY_NAME": "Nombre", - "COMPRESS_THUMBNAILS": "Comprimir las miniaturas", - "THUMBNAIL_REPLACED": "Miniaturas comprimidas", - "FIX_THUMBNAIL": "Comprimir", - "FIX_THUMBNAIL_LATER": "Comprimir más tarde", - "REPLACE_THUMBNAIL_NOT_STARTED": "Algunas de tus miniaturas de vídeos pueden ser comprimidas para ahorrar espacio. ¿Te gustaría que ente las comprima?", - "REPLACE_THUMBNAIL_COMPLETED": "Todas las miniaturas se comprimieron con éxito", - "REPLACE_THUMBNAIL_NOOP": "No tienes miniaturas que se puedan comprimir más", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "No se pudieron comprimir algunas de tus miniaturas, por favor inténtalo de nuevo", - "FIX_CREATION_TIME": "Fijar hora", - "FIX_CREATION_TIME_IN_PROGRESS": "Fijar hora", - "CREATION_TIME_UPDATED": "Hora del archivo actualizada", - "UPDATE_CREATION_TIME_NOT_STARTED": "Seleccione la cartera que desea utilizar", - "UPDATE_CREATION_TIME_COMPLETED": "Todos los archivos se han actualizado correctamente", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "Fallo en la hora del archivo para algunos archivos, por favor inténtelo de nuevo", - "CAPTION_CHARACTER_LIMIT": "Máximo 5000 caracteres", - "DATE_TIME_ORIGINAL": "EXIF: Fecha original", - "DATE_TIME_DIGITIZED": "EXIF: Fecha Digitalizado", - "METADATA_DATE": "", - "CUSTOM_TIME": "Hora personalizada", - "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planes", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Error al abrir los planes", - "INSTALL": "Instalar", - "SHARING_DETAILS": "Compartir detalles", - "MODIFY_SHARING": "Modificar compartir", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "Propietario", - "COLLABORATORS": "Colaboradores", - "ADD_MORE": "Añadir más", - "VIEWERS": "", - "OR_ADD_EXISTING": "O elige uno existente", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - No Encontrado", - "LINK_EXPIRED": "Enlace expirado", - "LINK_EXPIRED_MESSAGE": "Este enlace ha caducado o ha sido desactivado!", - "MANAGE_LINK": "Administrar enlace", - "LINK_TOO_MANY_REQUESTS": "Este álbum es demasiado popular para que podamos manejarlo!", - "FILE_DOWNLOAD": "Permitir descargas", - "LINK_PASSWORD_LOCK": "Contraseña bloqueada", - "PUBLIC_COLLECT": "Permitir añadir fotos", - "LINK_DEVICE_LIMIT": "Límites del dispositivo", - "NO_DEVICE_LIMIT": "Ninguno", - "LINK_EXPIRY": "Enlace vencio", - "NEVER": "Nunca", - "DISABLE_FILE_DOWNLOAD": "Deshabilitar descarga", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

¿Está seguro que desea desactivar el botón de descarga de archivos?

Los visualizadores todavía pueden tomar capturas de pantalla o guardar una copia de sus fotos usando herramientas externas.

", - "MALICIOUS_CONTENT": "Contiene contenido malicioso", - "COPYRIGHT": "Infracciones sobre los derechos de autor de alguien que estoy autorizado a representar", - "SHARED_USING": "Compartido usando ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Usa el código {{referralCode}} para obtener 10 GB gratis", - "LIVE": "VIVO", - "DISABLE_PASSWORD": "Desactivar contraseña", - "DISABLE_PASSWORD_MESSAGE": "Seguro que quieres cambiar la contrasena?", - "PASSWORD_LOCK": "Contraseña bloqueada", - "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuración", - "UPLOAD_FILES": "Archivo", - "UPLOAD_DIRS": "Carpeta", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Deduplicar archivos", - "AUTHENTICATOR_SECTION": "Autenticación", - "NO_DUPLICATES_FOUND": "No tienes archivos duplicados que puedan ser borrados", - "CLUB_BY_CAPTURE_TIME": "Club por tiempo de captura", - "FILES": "Archivos", - "EACH": "Cada", - "DEDUPLICATE_BASED_ON_SIZE": "Los siguientes archivos fueron organizados en base a sus tamaños, por favor revise y elimine elementos que cree que son duplicados", - "STOP_ALL_UPLOADS_MESSAGE": "¿Está seguro que desea detener todas las subidas en curso?", - "STOP_UPLOADS_HEADER": "Detener las subidas?", - "YES_STOP_UPLOADS": "Sí, detener las subidas", - "STOP_DOWNLOADS_HEADER": "¿Detener las descargas?", - "YES_STOP_DOWNLOADS": "Sí, detener las descargas", - "STOP_ALL_DOWNLOADS_MESSAGE": "¿Estás seguro de que quieres detener todas las descargas en curso?", - "albums_one": "1 álbum", - "albums_other": "{{count}} álbumes", - "ALL_ALBUMS": "Todos los álbumes", - "ALBUMS": "Álbumes", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "Ingrese el código de seis dígitos de su aplicación de autenticación a continuación.", - "CREATE_ACCOUNT": "Crear cuenta", - "COPIED": "Copiado", - "CANVAS_BLOCKED_TITLE": "No se puede generar la miniatura", - "CANVAS_BLOCKED_MESSAGE": "

Parece que su navegador ha deshabilitado el acceso al lienzo, que es necesario para generar miniaturas para tus fotos

Por favor, activa el acceso al lienzo de tu navegador, o revisa nuestra aplicación de escritorio

", - "WATCH_FOLDERS": "Ver carpetas", - "UPGRADE_NOW": "Mejorar ahora", - "RENEW_NOW": "Renovar ahora", - "STORAGE": "Almacén", - "USED": "usado", - "YOU": "Usted", - "FAMILY": "Familia", - "FREE": "gratis", - "OF": "de", - "WATCHED_FOLDERS": "Ver carpetas", - "NO_FOLDERS_ADDED": "No hay carpetas añadidas!", - "FOLDERS_AUTOMATICALLY_MONITORED": "Las carpetas que añadas aquí serán supervisadas automáticamente", - "UPLOAD_NEW_FILES_TO_ENTE": "Subir nuevos archivos a ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Eliminar archivos borrados de ente", - "ADD_FOLDER": "Añadir carpeta", - "STOP_WATCHING": "Dejar de ver", - "STOP_WATCHING_FOLDER": "Dejar de ver carpeta?", - "STOP_WATCHING_DIALOG_MESSAGE": "Tus archivos existentes no serán eliminados, pero ente dejará de actualizar automáticamente el álbum enlazado en caso de cambios en esta carpeta.", - "YES_STOP": "Sí, detener", - "MONTH_SHORT": "mes", - "YEAR": "año", - "FAMILY_PLAN": "Plan familiar", - "DOWNLOAD_LOGS": "Descargar logs", - "DOWNLOAD_LOGS_MESSAGE": "

Esto descargará los registros de depuración, que puede enviarnos por correo electrónico para ayudarnos a depurar su problema.

Tenga en cuenta que los nombres de los archivos se incluirán para ayudar al seguimiento de problemas con archivos específicos.

", - "CHANGE_FOLDER": "Cambiar carpeta", - "TWO_MONTHS_FREE": "Obtén 2 meses gratis en planes anuales", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continuar con el plan gratuito", - "FREE_PLAN_DESCRIPTION": "1 GB por 1 año", - "CURRENT_USAGE": "El uso actual es {{usage}}", - "WEAK_DEVICE": "El navegador web que está utilizando no es lo suficientemente poderoso para cifrar sus fotos. Por favor, intente iniciar sesión en ente en su computadora, o descargue la aplicación ente para móvil/escritorio.", - "DRAG_AND_DROP_HINT": "O arrastre y suelte en la ventana ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Los datos subidos se eliminarán y su cuenta se eliminará de forma permanente.

Esta acción no es reversible.", - "AUTHENTICATE": "Autenticado", - "UPLOADED_TO_SINGLE_COLLECTION": "Subir a una sola colección", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Subir a colecciones separadas", - "NEVERMIND": "No importa", - "UPDATE_AVAILABLE": "Actualizacion disponible", - "UPDATE_INSTALLABLE_MESSAGE": "Una nueva versión de ente está lista para ser instalada.", - "INSTALL_NOW": "Instalar ahora", - "INSTALL_ON_NEXT_LAUNCH": "Instalar en el próximo lanzamiento", - "UPDATE_AVAILABLE_MESSAGE": "Una nueva versión de ente ha sido lanzada, pero no se puede descargar e instalar automáticamente.", - "DOWNLOAD_AND_INSTALL": "Descargar e instalar", - "IGNORE_THIS_VERSION": "Ignorar esta versión", - "TODAY": "Hoy", - "YESTERDAY": "Ayer", - "NAME_PLACEHOLDER": "Nombre...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "No se puede crear álbumes de mezcla de archivos/carpetas", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Has arrastrado y soltado una mezcla de archivos y carpetas.

Por favor proporcione sólo archivos o carpetas cuando seleccione la opción de crear álbumes separados

", - "CHOSE_THEME": "Elegir tema", - "ML_SEARCH": "Buscar ML (beta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Esto permitirá el aprendizaje automático en el dispositivo y la búsqueda facial que comenzará a analizar las fotos subidas localmente.

Para la primera ejecución después de iniciar sesión o habilitar esta función, se descargarán todas las imágenes en el dispositivo local para analizarlas. Así que por favor actívalo sólo si dispones ancho de banda y el almacenamiento suficiente para el procesamiento local de todas las imágenes en tu biblioteca de fotos.

Si esta es la primera vez que está habilitando, también le pediremos su permiso para procesar los datos faciales.

", - "ML_MORE_DETAILS": "Más detalles", - "ENABLE_FACE_SEARCH": "Activar búsqueda facial", - "ENABLE_FACE_SEARCH_TITLE": "Activar búsqueda facial?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Si activas la búsqueda facial, ente extraerá la geometría facial de tus fotos. Esto sucederá en su dispositivo y cualquier dato biométrico generado será cifrado de extremo a extremo.

Haga clic aquí para obtener más detalles sobre esta característica en nuestra política de privacidad

", - "DISABLE_BETA": "Desactivar beta", - "DISABLE_FACE_SEARCH": "Desactivar búsqueda facial", - "DISABLE_FACE_SEARCH_TITLE": "Desactivar búsqueda facial?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente dejará de procesar la geometría facial, y también desactivará la búsqueda ML (beta)

Puede volver a activar la búsqueda facial si lo desea, ya que esta operación es segura.

", - "ADVANCED": "Avanzado", - "FACE_SEARCH_CONFIRMATION": "Comprendo y deseo permitir que ente procese la geometría de la cara", - "LABS": "Labs", - "YOURS": "tuyo", - "PASSPHRASE_STRENGTH_WEAK": "Fortaleza de la contraseña: débil", - "PASSPHRASE_STRENGTH_MODERATE": "Fortaleza de contraseña: Moderar", - "PASSPHRASE_STRENGTH_STRONG": "Fortaleza de contraseña: fuerte", - "PREFERENCES": "Preferencias", - "LANGUAGE": "Idioma", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Archivo de exportación inválido", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

El directorio de exportación seleccionado no existe.

Por favor, seleccione un directorio válido.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Falló la verificación de la suscripción", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "después de una hora", - "DAY": "después de un día", - "WEEK": "después de una semana", - "MONTH": "después de un mes", - "YEAR": "después de un año" - }, - "COPY_LINK": "Copiar enlace", - "DONE": "Hecho", - "LINK_SHARE_TITLE": "O comparte un enlace", - "REMOVE_LINK": "Eliminar enlace", - "CREATE_PUBLIC_SHARING": "Crear un enlace público", - "PUBLIC_LINK_CREATED": "Enlace público creado", - "PUBLIC_LINK_ENABLED": "Enlace público activado", - "COLLECT_PHOTOS": "Obtener fotos", - "PUBLIC_COLLECT_SUBTEXT": "Permitir a las personas con el enlace añadir fotos al álbum compartido.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} archivos exportados", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "Exportar iniciando", - "IN_PROGRESS": "Exportación ya en curso", - "FINISH": "Exportación finalizada", - "UP_TO_DATE": "No hay nuevos archivos para exportar" - }, - "CONTINUOUS_EXPORT": "Sincronizar continuamente", - "TOTAL_ITEMS": "Total de elementos", - "PENDING_ITEMS": "Elementos pendientes", - "EXPORT_STARTING": "Exportar iniciando...", - "DELETE_ACCOUNT_REASON_LABEL": "¿Cuál es la razón principal por la que eliminas tu cuenta?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Selecciona una razón", - "DELETE_REASON": { - "MISSING_FEATURE": "Falta una característica clave que necesito", - "BROKEN_BEHAVIOR": "La aplicación o una característica determinada no se comporta como creo que debería", - "FOUND_ANOTHER_SERVICE": "He encontrado otro servicio que me gusta más", - "NOT_LISTED": "Mi motivo no se encuentra en la lista" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Lamentamos que te vayas. Explica por qué te vas para ayudarnos a mejorar.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Sugerencias", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Sí, quiero eliminar permanentemente esta cuenta y todos sus datos", - "CONFIRM_DELETE_ACCOUNT": "Corfirmar borrado de cuenta", - "FEEDBACK_REQUIRED": "Ayúdanos con esta información", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Qué hace mejor el otro servicio?", - "RECOVER_TWO_FACTOR": "Recuperar dos factores", - "at": "a las", - "AUTH_NEXT": "siguiente", - "AUTH_DOWNLOAD_MOBILE_APP": "Descarga nuestra aplicación móvil para administrar tus secretos", - "HIDDEN": "", - "HIDE": "Ocultar", - "UNHIDE": "Mostrar", - "UNHIDE_TO_COLLECTION": "Hacer visible al álbum", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "Video", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "Transformar", - "COLORS": "Colores", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/fa-IR/translation.json b/web/apps/cast/public/locales/fa-IR/translation.json deleted file mode 100644 index 2d21fcb3d..000000000 --- a/web/apps/cast/public/locales/fa-IR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "به خوش آمدید", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/fi-FI/translation.json b/web/apps/cast/public/locales/fi-FI/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/cast/public/locales/fi-FI/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/fr-FR/translation.json b/web/apps/cast/public/locales/fr-FR/translation.json deleted file mode 100644 index 43d959069..000000000 --- a/web/apps/cast/public/locales/fr-FR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Sauvegardes privées
pour vos souvenirs
", - "HERO_SLIDE_1": "Chiffrement de bout en bout par défaut", - "HERO_SLIDE_2_TITLE": "
Sécurisé
dans un abri antiatomique
", - "HERO_SLIDE_2": "Conçu pour survivre", - "HERO_SLIDE_3_TITLE": "
Disponible
en tout lieu
", - "HERO_SLIDE_3": "Android, iOS, Web, Ordinateur", - "LOGIN": "Connexion", - "SIGN_UP": "Inscription", - "NEW_USER": "Nouveau sur ente", - "EXISTING_USER": "Utilisateur existant", - "ENTER_NAME": "Saisir un nom", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Ajouter un nom afin que vos amis sachent qui remercier pour ces magnifiques photos!", - "ENTER_EMAIL": "Saisir l'adresse e-mail", - "EMAIL_ERROR": "Saisir un e-mail valide", - "REQUIRED": "Nécessaire", - "EMAIL_SENT": "Code de vérification envoyé à
{{email}}", - "CHECK_INBOX": "Veuillez consulter votre boite de réception (et indésirables) pour poursuivre la vérification", - "ENTER_OTT": "Code de vérification", - "RESEND_MAIL": "Renvoyer le code", - "VERIFY": "Vérifier", - "UNKNOWN_ERROR": "Quelque chose s'est mal passé, veuillez recommencer", - "INVALID_CODE": "Code de vérification non valide", - "EXPIRED_CODE": "Votre code de vérification a expiré", - "SENDING": "Envoi...", - "SENT": "Envoyé!", - "PASSWORD": "Mot de passe", - "LINK_PASSWORD": "Saisir le mot de passe pour déverrouiller l'album", - "RETURN_PASSPHRASE_HINT": "Mot de passe", - "SET_PASSPHRASE": "Définir le mot de passe", - "VERIFY_PASSPHRASE": "Connexion", - "INCORRECT_PASSPHRASE": "Mot de passe non valide", - "ENTER_ENC_PASSPHRASE": "Veuillez saisir un mot de passe que nous pourrons utiliser pour chiffrer vos données", - "PASSPHRASE_DISCLAIMER": "Nous ne stockons pas votre mot de passe, donc si vous le perdez, nous ne pourrons pas vous aider à récupérer vos données sans une clé de récupération.", - "WELCOME_TO_ENTE_HEADING": "Bienvenue sur ", - "WELCOME_TO_ENTE_SUBHEADING": "Stockage et partage photo avec cryptage de bout en bout", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Là où vivent vos meilleures photos", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Génération des clés de chiffrement...", - "PASSPHRASE_HINT": "Mot de passe", - "CONFIRM_PASSPHRASE": "Confirmer le mot de passe", - "REFERRAL_CODE_HINT": "Comment avez-vous entendu parler de Ente? (facultatif)", - "REFERRAL_INFO": "Nous ne suivons pas les installations d'applications. Il serait utile que vous nous disiez comment vous nous avez trouvés !", - "PASSPHRASE_MATCH_ERROR": "Les mots de passe ne correspondent pas", - "CREATE_COLLECTION": "Nouvel album", - "ENTER_ALBUM_NAME": "Nom de l'album", - "CLOSE_OPTION": "Fermer (Échap)", - "ENTER_FILE_NAME": "Nom du fichier", - "CLOSE": "Fermer", - "NO": "Non", - "NOTHING_HERE": "Il n'y a encore rien à voir ici 👀", - "UPLOAD": "Charger", - "IMPORT": "Importer", - "ADD_PHOTOS": "Ajouter des photos", - "ADD_MORE_PHOTOS": "Ajouter plus de photos", - "add_photos_one": "Ajouter une photo", - "add_photos_other": "Ajouter {{count}} photos", - "SELECT_PHOTOS": "Sélectionner des photos", - "FILE_UPLOAD": "Fichier chargé", - "UPLOAD_STAGE_MESSAGE": { - "0": "Préparation du chargement", - "1": "Lecture des fichiers de métadonnées de Google", - "2": "Métadonnées des fichiers {{uploadCounter.finished}} / {{uploadCounter.total}} extraites", - "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} fichiers sauvegardés", - "4": "Annulation des chargements restants", - "5": "Sauvegarde terminée" - }, - "FILE_NOT_UPLOADED_LIST": "Les fichiers suivants n'ont pas été chargés", - "SUBSCRIPTION_EXPIRED": "Abonnement expiré", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Votre abonnement a expiré, veuillez le renouveler ", - "STORAGE_QUOTA_EXCEEDED": "Limite de stockage atteinte", - "INITIAL_LOAD_DELAY_WARNING": "La première consultation peut prendre du temps", - "USER_DOES_NOT_EXIST": "Désolé, impossible de trouver un utilisateur avec cet e-mail", - "NO_ACCOUNT": "Je n'ai pas de compte", - "ACCOUNT_EXISTS": "J'ai déjà un compte", - "CREATE": "Créer", - "DOWNLOAD": "Télécharger", - "DOWNLOAD_OPTION": "Télécharger (D)", - "DOWNLOAD_FAVORITES": "Télécharger les favoris", - "DOWNLOAD_UNCATEGORIZED": "Télécharger les hors catégories", - "DOWNLOAD_HIDDEN_ITEMS": "Télécharger les fichiers masqués", - "COPY_OPTION": "Copier en PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Plein écran (F)", - "ZOOM_IN_OUT": "Zoom +/-", - "PREVIOUS": "Précédent (←)", - "NEXT": "Suivant (→)", - "TITLE_PHOTOS": "Ente Photos", - "TITLE_ALBUMS": "Ente Photos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Chargez votre 1ere photo", - "IMPORT_YOUR_FOLDERS": "Importez vos dossiers", - "UPLOAD_DROPZONE_MESSAGE": "Déposez pour sauvegarder vos fichiers", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Déposez pour ajouter un dossier surveillé", - "TRASH_FILES_TITLE": "Supprimer les fichiers ?", - "TRASH_FILE_TITLE": "Supprimer le fichier ?", - "DELETE_FILES_TITLE": "Supprimer immédiatement?", - "DELETE_FILES_MESSAGE": "Les fichiers sélectionnés seront définitivement supprimés de votre compte ente.", - "DELETE": "Supprimer", - "DELETE_OPTION": "Supprimer (DEL)", - "FAVORITE_OPTION": "Favori (L)", - "UNFAVORITE_OPTION": "Non favori (L)", - "MULTI_FOLDER_UPLOAD": "Plusieurs dossiers détectés", - "UPLOAD_STRATEGY_CHOICE": "Voulez-vous les charger dans", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un seul album", - "OR": "ou", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Albums séparés", - "SESSION_EXPIRED_MESSAGE": "Votre session a expiré, veuillez vous reconnecter pour poursuivre", - "SESSION_EXPIRED": "Session expiré", - "PASSWORD_GENERATION_FAILED": "Votre navigateur ne permet pas de générer une clé forte correspondant aux standards de chiffrement de ente, veuillez réessayer en utilisant l'appli mobile ou un autre navigateur", - "CHANGE_PASSWORD": "Modifier le mot de passe", - "GO_BACK": "Retour", - "RECOVERY_KEY": "Clé de récupération", - "SAVE_LATER": "Plus tard", - "SAVE": "Sauvegarder la clé", - "RECOVERY_KEY_DESCRIPTION": "Si vous oubliez votre mot de passe, la seule façon de récupérer vos données sera grâce à cette clé.", - "RECOVER_KEY_GENERATION_FAILED": "Le code de récupération ne peut être généré, veuillez réessayer", - "KEY_NOT_STORED_DISCLAIMER": "Nous ne stockons pas cette clé, veuillez donc la sauvegarder dans un endroit sûr", - "FORGOT_PASSWORD": "Mot de passe oublié", - "RECOVER_ACCOUNT": "Récupérer le compte", - "RECOVERY_KEY_HINT": "Clé de récupération", - "RECOVER": "Récupérer", - "NO_RECOVERY_KEY": "Pas de clé de récupération?", - "INCORRECT_RECOVERY_KEY": "Clé de récupération non valide", - "SORRY": "Désolé", - "NO_RECOVERY_KEY_MESSAGE": "En raison de notre protocole de chiffrement de bout en bout, vos données ne peuvent être décryptées sans votre mot de passe ou clé de récupération", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Veuillez envoyer un e-mail à {{emailID}} depuis votre adresse enregistrée", - "CONTACT_SUPPORT": "Contacter le support", - "REQUEST_FEATURE": "Soumettre une idée", - "SUPPORT": "Support", - "CONFIRM": "Confirmer", - "CANCEL": "Annuler", - "LOGOUT": "Déconnexion", - "DELETE_ACCOUNT": "Supprimer le compte", - "DELETE_ACCOUNT_MESSAGE": "

Veuillez envoyer un e-mail à {{emailID}}depuis Votre adresse enregistrée.

Votre demande sera traitée dans les 72 heures.

", - "LOGOUT_MESSAGE": "Voulez-vous vraiment vous déconnecter?", - "CHANGE_EMAIL": "Modifier l'e-mail", - "OK": "Ok", - "SUCCESS": "Parfait", - "ERROR": "Erreur", - "MESSAGE": "Message", - "INSTALL_MOBILE_APP": "Installez notre application Android or iOS pour sauvegarder automatiquement toutes vos photos", - "DOWNLOAD_APP_MESSAGE": "Désolé, cette opération est actuellement supportée uniquement sur notre appli pour ordinateur", - "DOWNLOAD_APP": "Télécharger l'appli pour ordinateur", - "EXPORT": "Exporter des données", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "S'abonner", - "MANAGEMENT_PORTAL": "Gérer le mode de paiement", - "MANAGE_FAMILY_PORTAL": "Gérer la famille", - "LEAVE_FAMILY_PLAN": "Quitter le plan famille", - "LEAVE": "Quitter", - "LEAVE_FAMILY_CONFIRM": "Êtes-vous certains de vouloir quitter le plan famille?", - "CHOOSE_PLAN": "Choisir votre plan", - "MANAGE_PLAN": "Gérer votre abonnement", - "ACTIVE": "Actif", - "OFFLINE_MSG": "Vous êtes hors-ligne, les mémoires cache sont affichées", - "FREE_SUBSCRIPTION_INFO": "Vous êtes sur le plan gratuit qui expire le {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Vous êtes sur le plan famille géré par", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renouveler le {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Pris fin le {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Votre abonnement sera annulé le {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Votre module {{storage, string}} est valable jusqu'au {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Vous avez dépassé votre quota de stockage, veuillez mettre à niveau ", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Nous avons reçu votre paiement

Votre abonnement est valide jusqu'au {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Votre achat est annulé, veuillez réessayer si vous souhaitez vous abonner", - "SUBSCRIPTION_PURCHASE_FAILED": "Échec lors de l'achat de l'abonnement, veuillez réessayer", - "SUBSCRIPTION_UPDATE_FAILED": "Échec lors de la mise à niveau de l'abonnement, veuillez réessayer", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Désolé, échec de paiement lors de la saisie de votre carte, veuillez mettr eà jour votre moyen de paiement et réessayer", - "STRIPE_AUTHENTICATION_FAILED": "Nous n'avons pas pu authentifier votre moyen de paiement. Veuillez choisir un moyen différent et réessayer", - "UPDATE_PAYMENT_METHOD": "Mise à jour du moyen de paiement", - "MONTHLY": "Mensuel", - "YEARLY": "Annuel", - "UPDATE_SUBSCRIPTION_MESSAGE": "Êtes-vous certains de vouloir changer de plan?", - "UPDATE_SUBSCRIPTION": "Changer de plan", - "CANCEL_SUBSCRIPTION": "Annuler l'abonnement", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Toutes vos données seront supprimées de nos serveurs à la fin de cette période d'abonnement.

Voulez-vous vraiment annuler votre abonnement?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "Êtes-vous sûr de vouloir annuler votre abonnement ", - "SUBSCRIPTION_CANCEL_FAILED": "Échec lors de l'annulation de l'abonnement", - "SUBSCRIPTION_CANCEL_SUCCESS": "Votre abonnement a bien été annulé", - "REACTIVATE_SUBSCRIPTION": "Réactiver l'abonnement", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Une fois réactivée, vous serrez facturé de {{val, datetime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Votre abonnement est bien activé ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Échec lors de la réactivation de l'abonnement", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Merci", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Annuler l'abonnement mobile", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Veuillez annuler votre abonnement depuis l'appli mobile pour activer un abonnement ici", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Veuillez nous contacter à {{emailID}} pour gérer votre abonnement", - "RENAME": "Renommer", - "RENAME_FILE": "Renommer le fichier", - "RENAME_COLLECTION": "Renommer l'album", - "DELETE_COLLECTION_TITLE": "Supprimer l'album?", - "DELETE_COLLECTION": "Supprimer l'album", - "DELETE_COLLECTION_MESSAGE": "Supprimer aussi les photos (et vidéos) présentes dans cet album depuis tous les autres albums dont ils font partie?", - "DELETE_PHOTOS": "Supprimer des photos", - "KEEP_PHOTOS": "Conserver des photos", - "SHARE": "Partager", - "SHARE_COLLECTION": "Partager l'album", - "SHAREES": "Partager avec", - "SHARE_WITH_SELF": "Oups, vous ne pouvez pas partager avec vous-même", - "ALREADY_SHARED": "Oups, vous partager déjà cela avec {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Partage d'album non autorisé", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Le partage est désactivé pour les comptes gratuits", - "DOWNLOAD_COLLECTION": "Télécharger l'album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Êtes-vous certains de vouloir télécharger l'album complet?

Tous les fichiers seront mis en file d'attente pour un téléchargement fractionné

", - "CREATE_ALBUM_FAILED": "Échec de création de l'album , veuillez réessayer", - "SEARCH": "Recherche", - "SEARCH_RESULTS": "Résultats de la recherche", - "NO_RESULTS": "Aucun résultat trouvé", - "SEARCH_HINT": "Recherche d'albums, dates, descriptions, ...", - "SEARCH_TYPE": { - "COLLECTION": "l'album", - "LOCATION": "Emplacement", - "CITY": "Adresse", - "DATE": "Date", - "FILE_NAME": "Nom de fichier", - "THING": "Chose", - "FILE_CAPTION": "Description", - "FILE_TYPE": "Type de fichier", - "CLIP": "Magique" - }, - "photos_count_zero": "Pas de souvenirs", - "photos_count_one": "1 souvenir", - "photos_count_other": "{{count}} souvenirs", - "TERMS_AND_CONDITIONS": "J'accepte les conditions et la politique de confidentialité", - "ADD_TO_COLLECTION": "Ajouter à l'album", - "SELECTED": "Sélectionné", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Cette vidéo ne peut pas être lue sur votre navigateur", - "PEOPLE": "Visages", - "INDEXING_SCHEDULED": "L'indexation est planifiée...", - "ANALYZING_PHOTOS": "analyse des nouvelles photos {{indexStatus.nSyncedFiles}} sur {{indexStatus.nTotalFiles}} effectué)...", - "INDEXING_PEOPLE": "indexation des visages dans {{indexStatus.nSyncedFiles}} photos...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles}} photos indexées", - "UNIDENTIFIED_FACES": "visages non-identifiés", - "OBJECTS": "objets", - "TEXT": "texte", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Nom de fichier", - "CAPTION_PLACEHOLDER": "Ajouter une description", - "LOCATION": "Emplacement", - "SHOW_ON_MAP": "Visualiser sur OpenStreetMap", - "MAP": "Carte", - "MAP_SETTINGS": "Paramètres de la carte", - "ENABLE_MAPS": "Activer la carte?", - "ENABLE_MAP": "Activer la carte", - "DISABLE_MAPS": "Désactiver la carte?", - "ENABLE_MAP_DESCRIPTION": "

Cette fonction affiche vos photos sur une carte du monde.

La carte est hébergée par OpenStreetMap, et les emplacements exacts de vos photos ne sont jamais partagés.

Vous pouvez désactiver cette fonction à tout moment dans des paramètres.

", - "DISABLE_MAP_DESCRIPTION": "

Cette fonction désactive l'affichage de vos photos sur une carte du monde.

Vous pouvez activer cette fonction à tout moment dans les Paramètres.

", - "DISABLE_MAP": "Désactiver la carte", - "DETAILS": "Détails", - "VIEW_EXIF": "Visualiser toutes les données EXIF", - "NO_EXIF": "Aucune donnée EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Double authentification", - "TWO_FACTOR_AUTHENTICATION": "Authentification double-facteur", - "TWO_FACTOR_QR_INSTRUCTION": "Scannez le QRCode ci-dessous avec une appli d'authentification", - "ENTER_CODE_MANUALLY": "Saisir le code manuellement", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Veuillez saisir ce code dans votre appli d'authentification", - "SCAN_QR_CODE": "Scannez le QRCode de préférence", - "ENABLE_TWO_FACTOR": "Activer la double-authentification", - "ENABLE": "Activer", - "LOST_DEVICE": "Perte de l'appareil identificateur", - "INCORRECT_CODE": "Code non valide", - "TWO_FACTOR_INFO": "Rajoutez une couche de sécurité supplémentaire afin de pas utiliser simplement votre e-mail et mot de passe pour vous connecter à votre compte", - "DISABLE_TWO_FACTOR_LABEL": "Désactiver la double-authentification", - "UPDATE_TWO_FACTOR_LABEL": "Mise à jour de votre appareil identificateur", - "DISABLE": "Désactiver", - "RECONFIGURE": "Reconfigurer", - "UPDATE_TWO_FACTOR": "Mise à jour de la double-authentification", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuer annulera tous les identificateurs précédemment configurés", - "UPDATE": "Mise à jour", - "DISABLE_TWO_FACTOR": "Désactiver la double-authentification", - "DISABLE_TWO_FACTOR_MESSAGE": "Êtes-vous certains de vouloir désactiver la double-authentification", - "TWO_FACTOR_DISABLE_FAILED": "Échec de désactivation de la double-authentification, veuillez réessayer", - "EXPORT_DATA": "Exporter les données", - "SELECT_FOLDER": "Sélectionner un dossier", - "DESTINATION": "Destination", - "START": "Démarrer", - "LAST_EXPORT_TIME": "Horaire du dernier export", - "EXPORT_AGAIN": "Resynchro", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Stockage local non accessible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Votre navigateur ou un complément bloque ente qui ne peut sauvegarder les données sur votre stockage local. Veuillez relancer cette page après avoir changé de mode de navigation.", - "SEND_OTT": "Envoyer l'OTP", - "EMAIl_ALREADY_OWNED": "Cet e-mail est déjà pris", - "ETAGS_BLOCKED": "

Nosu n'avons pas pu charger les fichiers suivants à cause de la configuration de votre navigateur.

Veuillez désactiver tous les compléments qui pourraient empêcher ente d'utiliser les eTags pour charger de larges fichiers, ou bien utilisez notre appli pour ordinateurpour une meilleure expérience lors des chargements.

", - "SKIPPED_VIDEOS_INFO": "

Actuellement, nous ne supportons pas l'ajout de videos via des liens publics.

Pour partager des vidéos, veuillez vous connecter àente et partager en utilisant l'e-mail concerné.

", - "LIVE_PHOTOS_DETECTED": "Les fichiers photos et vidéos depuis votre espace Live Photos ont été fusionnés en un seul fichier", - "RETRY_FAILED": "Réessayer les chargements ayant échoués", - "FAILED_UPLOADS": "Chargements échoués ", - "SKIPPED_FILES": "Chargements ignorés", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Échec de création d'une miniature", - "UNSUPPORTED_FILES": "Fichiers non supportés", - "SUCCESSFUL_UPLOADS": "Chargements réussis", - "SKIPPED_INFO": "Ignorés car il y a des fichiers avec des noms identiques dans le même album", - "UNSUPPORTED_INFO": "ente ne supporte pas encore ces formats de fichiers", - "BLOCKED_UPLOADS": "Chargements bloqués", - "SKIPPED_VIDEOS": "Vidéos ignorées", - "INPROGRESS_METADATA_EXTRACTION": "En cours", - "INPROGRESS_UPLOADS": "Chargements en cours", - "TOO_LARGE_UPLOADS": "Gros fichiers", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Stockage insuffisant", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Ces fichiers n'ont pas été chargés car ils dépassent la taille maximale de votre plan de stockage", - "TOO_LARGE_INFO": "Ces fichiers n'ont pas été chargés car ils dépassent notre taille limite par fichier", - "THUMBNAIL_GENERATION_FAILED_INFO": "Ces fichiers sont bien chargés, mais nous ne pouvons pas créer de miniatures pour eux.", - "UPLOAD_TO_COLLECTION": "Charger dans l'album", - "UNCATEGORIZED": "Aucune catégorie", - "ARCHIVE": "Archiver", - "FAVORITES": "Favoris", - "ARCHIVE_COLLECTION": "Archiver l'album", - "ARCHIVE_SECTION_NAME": "Archivé", - "ALL_SECTION_NAME": "Tous", - "MOVE_TO_COLLECTION": "Déplacer vers l'album", - "UNARCHIVE": "Désarchiver", - "UNARCHIVE_COLLECTION": "Désarchiver l'album", - "HIDE_COLLECTION": "Masquer l'album", - "UNHIDE_COLLECTION": "Dévoiler l'album", - "MOVE": "Déplacer", - "ADD": "Ajouter", - "REMOVE": "Retirer", - "YES_REMOVE": "Oui, retirer", - "REMOVE_FROM_COLLECTION": "Retirer de l'album", - "TRASH": "Corbeille", - "MOVE_TO_TRASH": "Déplacer vers la corbeille", - "TRASH_FILES_MESSAGE": "Les fichiers sélectionnés seront retirés de tous les albums puis déplacés dans la corbeille.", - "TRASH_FILE_MESSAGE": "Le fichier sera retiré de tous les albums puis déplacé dans la corbeille.", - "DELETE_PERMANENTLY": "Supprimer définitivement", - "RESTORE": "Restaurer", - "RESTORE_TO_COLLECTION": "Restaurer vers l'album", - "EMPTY_TRASH": "Corbeille vide", - "EMPTY_TRASH_TITLE": "Vider la corbeille ?", - "EMPTY_TRASH_MESSAGE": "Ces fichiers seront définitivement supprimés de votre compte ente.", - "LEAVE_SHARED_ALBUM": "Oui, quitter", - "LEAVE_ALBUM": "Quitter l'album", - "LEAVE_SHARED_ALBUM_TITLE": "Quitter l'album partagé?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Vous allez quitter cet album, il ne sera plus visible pour vous.", - "NOT_FILE_OWNER": "Vous ne pouvez pas supprimer les fichiers d'un album partagé", - "CONFIRM_SELF_REMOVE_MESSAGE": "Choisir les objets qui seront retirés de cet album. Ceux qui sont présents uniquement dans cet album seront déplacés comme hors catégorie.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Certains des objets que vous êtes en train de retirer ont été ajoutés par d'autres personnes, vous perdrez l'accès vers ces objets.", - "SORT_BY_CREATION_TIME_ASCENDING": "Plus anciens", - "SORT_BY_UPDATION_TIME_DESCENDING": "Dernière mise à jour", - "SORT_BY_NAME": "Nom", - "COMPRESS_THUMBNAILS": "Compresser les miniatures", - "THUMBNAIL_REPLACED": "Les miniatures sont compressées", - "FIX_THUMBNAIL": "Compresser", - "FIX_THUMBNAIL_LATER": "Compresser plus tard", - "REPLACE_THUMBNAIL_NOT_STARTED": "Certaines miniatures de vidéos peuvent être compressées pour gagner de la place. Voulez-vous que ente les compresse?", - "REPLACE_THUMBNAIL_COMPLETED": "Toutes les miniatures ont été compressées", - "REPLACE_THUMBNAIL_NOOP": "Vous n'avez aucune miniature qui peut être encore plus compressée", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Impossible de compresser certaines miniatures, veuillez réessayer", - "FIX_CREATION_TIME": "Réajuster l'heure", - "FIX_CREATION_TIME_IN_PROGRESS": "Réajustement de l'heure", - "CREATION_TIME_UPDATED": "L'heure du fichier a été réajustée", - "UPDATE_CREATION_TIME_NOT_STARTED": "Sélectionnez l'option que vous souhaitez utiliser", - "UPDATE_CREATION_TIME_COMPLETED": "Mise à jour effectuée pour tous les fichiers", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "L'heure du fichier n'a pas été mise à jour pour certains fichiers, veuillez réessayer", - "CAPTION_CHARACTER_LIMIT": "5000 caractères max", - "DATE_TIME_ORIGINAL": "EXIF:DateTimeOriginal", - "DATE_TIME_DIGITIZED": "EXIF:DateTimeDigitized", - "METADATA_DATE": "EXIF:MetadataDate", - "CUSTOM_TIME": "Heure personnalisée", - "REOPEN_PLAN_SELECTOR_MODAL": "Rouvrir les plans", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Échec pour rouvrir les plans", - "INSTALL": "Installer", - "SHARING_DETAILS": "Détails du partage", - "MODIFY_SHARING": "Modifier le partage", - "ADD_COLLABORATORS": "Ajouter des collaborateurs", - "ADD_NEW_EMAIL": "Ajouter un nouvel email", - "shared_with_people_zero": "Partager avec des personnes spécifiques", - "shared_with_people_one": "Partagé avec 1 personne", - "shared_with_people_other": "Partagé avec {{count, number}} personnes", - "participants_zero": "Aucun participant", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", - "ADD_VIEWERS": "Ajouter un observateur", - "PARTICIPANTS": "Participants", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} ne pourra plus ajouter de photos à l'album

Il pourra toujours supprimer les photos qu'il a ajoutées

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} pourra ajouter des photos à l'album", - "CONVERT_TO_VIEWER": "Oui, convertir en observateur", - "CONVERT_TO_COLLABORATOR": "Oui, convertir en collaborateur", - "CHANGE_PERMISSION": "Modifier la permission?", - "REMOVE_PARTICIPANT": "Retirer?", - "CONFIRM_REMOVE": "Oui, supprimer", - "MANAGE": "Gérer", - "ADDED_AS": "Ajouté comme", - "COLLABORATOR_RIGHTS": "Les collaborateurs peuvent ajouter des photos et des vidéos à l'album partagé", - "REMOVE_PARTICIPANT_HEAD": "Supprimer le participant", - "OWNER": "Propriétaire", - "COLLABORATORS": "Collaborateurs", - "ADD_MORE": "Ajouter plus", - "VIEWERS": "Visionneurs", - "OR_ADD_EXISTING": "ou sélectionner un fichier existant", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} sera supprimé de l'album

Toutes les photos ajoutées par cette personne seront également supprimées de l'album

", - "NOT_FOUND": "404 - non trouvé", - "LINK_EXPIRED": "Lien expiré", - "LINK_EXPIRED_MESSAGE": "Ce lien à soit expiré soit est supprimé!", - "MANAGE_LINK": "Gérer le lien", - "LINK_TOO_MANY_REQUESTS": "Désolé, cet album a été consulté sur trop d'appareils !", - "FILE_DOWNLOAD": "Autoriser les téléchargements", - "LINK_PASSWORD_LOCK": "Verrou par mot de passe", - "PUBLIC_COLLECT": "Autoriser l'ajout de photos", - "LINK_DEVICE_LIMIT": "Limite d'appareil", - "NO_DEVICE_LIMIT": "Aucune", - "LINK_EXPIRY": "Expiration du lien", - "NEVER": "Jamais", - "DISABLE_FILE_DOWNLOAD": "Désactiver le téléchargement", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Êtes-vous certains de vouloir désactiver le bouton de téléchargement pour les fichiers?

Ceux qui les visualisent pourront tout de même faire des captures d'écrans ou sauvegarder une copie de vos photos en utilisant des outils externes.

", - "MALICIOUS_CONTENT": "Contient du contenu malveillant", - "COPYRIGHT": "Enfreint les droits d'une personne que je réprésente", - "SHARED_USING": "Partagé en utilisant ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Utilisez le code {{referralCode}} pour obtenir 10 Go gratuits", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Désactiver le verrouillage par mot de passe", - "DISABLE_PASSWORD_MESSAGE": "Êtes-vous certains de vouloir désactiver le verrouillage par mot de passe ?", - "PASSWORD_LOCK": "Mot de passe verrou", - "LOCK": "Verrouiller", - "DOWNLOAD_UPLOAD_LOGS": "Journaux de débugs", - "UPLOAD_FILES": "Fichier", - "UPLOAD_DIRS": "Dossier", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Déduplication de fichiers", - "AUTHENTICATOR_SECTION": "Authentificateur", - "NO_DUPLICATES_FOUND": "Vous n'avez aucun fichier dédupliqué pouvant être nettoyé", - "CLUB_BY_CAPTURE_TIME": "Durée de la capture par club", - "FILES": "Fichiers", - "EACH": "Chacun", - "DEDUPLICATE_BASED_ON_SIZE": "Les fichiers suivants ont été clubbed, basé sur leurs tailles, veuillez corriger et supprimer les objets que vous pensez être dupliqués", - "STOP_ALL_UPLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", - "STOP_UPLOADS_HEADER": "Arrêter les chargements ?", - "YES_STOP_UPLOADS": "Oui, arrêter tout", - "STOP_DOWNLOADS_HEADER": "Arrêter le téléchargement ?", - "YES_STOP_DOWNLOADS": "Oui, arrêter les téléchargements", - "STOP_ALL_DOWNLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", - "albums_one": "1 album", - "albums_other": "{{count}} albums", - "ALL_ALBUMS": "Tous les albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "Tous les albums masqués", - "HIDDEN_ALBUMS": "Albums masqués", - "HIDDEN_ITEMS": "Éléments masqués", - "HIDDEN_ITEMS_SECTION_NAME": "Éléments masqués", - "ENTER_TWO_FACTOR_OTP": "Saisir le code à 6 caractères de votre appli d'authentification.", - "CREATE_ACCOUNT": "Créer un compte", - "COPIED": "Copié", - "CANVAS_BLOCKED_TITLE": "Impossible de créer une miniature", - "CANVAS_BLOCKED_MESSAGE": "

Il semblerait que votre navigateur ait désactivé l'accès au canevas, qui est nécessaire pour créer les miniatures de vos photos

Veuillez activer l'accès au canevas du navigateur, ou consulter notre appli pour ordinateur

", - "WATCH_FOLDERS": "Voir les dossiers", - "UPGRADE_NOW": "Mettre à niveau maintenant", - "RENEW_NOW": "Renouveler maintenant", - "STORAGE": "Stockage", - "USED": "utilisé", - "YOU": "Vous", - "FAMILY": "Famille", - "FREE": "gratuit", - "OF": "de", - "WATCHED_FOLDERS": "Voir les dossiers", - "NO_FOLDERS_ADDED": "Aucun dossiers d'ajouté!", - "FOLDERS_AUTOMATICALLY_MONITORED": "Les dossiers que vous ajoutez ici seront supervisés automatiquement", - "UPLOAD_NEW_FILES_TO_ENTE": "Charger de nouveaux fichiers sur ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Retirer de ente les fichiers supprimés", - "ADD_FOLDER": "Ajouter un dossier", - "STOP_WATCHING": "Arrêter de voir", - "STOP_WATCHING_FOLDER": "Arrêter de voir le dossier?", - "STOP_WATCHING_DIALOG_MESSAGE": "Vos fichiers existants ne seront pas supprimés, mais ente arrêtera automatiquement de mettre à jour le lien de l'album à chaque changements sur ce dossier.", - "YES_STOP": "Oui, arrêter", - "MONTH_SHORT": "mo", - "YEAR": "année", - "FAMILY_PLAN": "Plan famille", - "DOWNLOAD_LOGS": "Télécharger les logs", - "DOWNLOAD_LOGS_MESSAGE": "

Cela va télécharger les journaux de débug, que vous pourrez nosu envoyer par e-mail pour nous aider à résoudre votre problàme .

Veuillez noter que les noms de fichiers seront inclus .

", - "CHANGE_FOLDER": "Modifier le dossier", - "TWO_MONTHS_FREE": "Obtenir 2 mois gratuits sur les plans annuels", - "GB": "Go", - "POPULAR": "Populaire", - "FREE_PLAN_OPTION_LABEL": "Poursuivre avec la version d'essai gratuite", - "FREE_PLAN_DESCRIPTION": "1 Go pour 1 an", - "CURRENT_USAGE": "L'utilisation actuelle est de {{usage}}", - "WEAK_DEVICE": "Le navigateur que vous utilisez n'est pas assez puissant pour chiffrer vos photos. Veuillez essayer de vous connecter à ente sur votre ordinateur, ou télécharger l'appli ente mobile/ordinateur.", - "DRAG_AND_DROP_HINT": "Sinon glissez déposez dans la fenêtre ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "

Vos données chargées seront programmées pour suppression, et votre comptre sera supprimé définitivement .

Cette action n'est pas reversible.

", - "AUTHENTICATE": "Authentification", - "UPLOADED_TO_SINGLE_COLLECTION": "Chargé dans une seule collection", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Chargé dans des collections séparées", - "NEVERMIND": "Peu-importe", - "UPDATE_AVAILABLE": "Une mise à jour est disponible", - "UPDATE_INSTALLABLE_MESSAGE": "Une nouvelle version de ente est prête à être installée.", - "INSTALL_NOW": "Installer maintenant", - "INSTALL_ON_NEXT_LAUNCH": "Installer au prochain démarrage", - "UPDATE_AVAILABLE_MESSAGE": "Une nouvelle version de ente est sortie, mais elle ne peut pas être automatiquement téléchargée puis installée.", - "DOWNLOAD_AND_INSTALL": "Télécharger et installer", - "IGNORE_THIS_VERSION": "Ignorer cette version", - "TODAY": "Aujourd'hui", - "YESTERDAY": "Hier", - "NAME_PLACEHOLDER": "Nom...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Impossible de créer des albums depuis un mix fichier/dossier", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Vous avez glissé déposé un mélange de fichiers et dossiers.

Veuillez sélectionner soit uniquement des fichiers, ou des dossiers lors du choix d'options pour créer des albums séparés

", - "CHOSE_THEME": "Choisir un thème", - "ML_SEARCH": "ML search (beta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Ceci activera l'apprentissage automatique sur l'appareil et la recherche faciale qui commencera à analyser vos photos chargées.

Pour la première exécution après la connexion ou l'activation de cette fonctionnalité, cela téléchargera toutes les images sur l'appareil local pour les analyser. Veuillez donc activer ceci uniquement si vous avez de la bande passante et le traitement local de toutes les images dans votre photothèque.

Si c'est la première fois que vous activez ceci, nous vous demanderons également la permission de traiter les données faciales.

", - "ML_MORE_DETAILS": "Plus de détails", - "ENABLE_FACE_SEARCH": "Activer la recherche faciale", - "ENABLE_FACE_SEARCH_TITLE": "Activer la recherche faciale ?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face search, ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", - "DISABLE_BETA": "Désactiver la bêta", - "DISABLE_FACE_SEARCH": "Désactiver la recherche faciale", - "DISABLE_FACE_SEARCH_TITLE": "Désactiver la recherche faciale ?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente will stop processing face geometry, and will also disable ML search (beta)

You can reenable face search again if you wish, so this operation is safe

", - "ADVANCED": "Avancé", - "FACE_SEARCH_CONFIRMATION": "Je comprends, et je souhaite permettre à ente de traiter la géométrie faciale", - "LABS": "Labs", - "YOURS": "Le vôtre", - "PASSPHRASE_STRENGTH_WEAK": "Sécurité du mot de passe : faible", - "PASSPHRASE_STRENGTH_MODERATE": "Sécurité du mot de passe : moyenne", - "PASSPHRASE_STRENGTH_STRONG": "Sécurité du mot de passe : forte", - "PREFERENCES": "Préférences", - "LANGUAGE": "Langue", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Dossier d'export invalide", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Le dossier d'export que vous avez sélectionné n'existe pas

Veuillez sélectionner un dossier valide

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Échec de la vérification de l'abonnement", - "STORAGE_UNITS": { - "B": "o", - "KB": "Ko", - "MB": "Mo", - "GB": "Go", - "TB": "To" - }, - "AFTER_TIME": { - "HOUR": "dans une heure", - "DAY": "dans un jour", - "WEEK": "dans une semaine", - "MONTH": "dans un mois", - "YEAR": "dans un an" - }, - "COPY_LINK": "Copier le lien", - "DONE": "Terminé", - "LINK_SHARE_TITLE": "Ou partager un lien", - "REMOVE_LINK": "Supprimer le lien", - "CREATE_PUBLIC_SHARING": "Créer un lien public", - "PUBLIC_LINK_CREATED": "Lien public créé", - "PUBLIC_LINK_ENABLED": "Lien public activé", - "COLLECT_PHOTOS": "Récupérer les photos", - "PUBLIC_COLLECT_SUBTEXT": "Autoriser les personnes ayant le lien d'ajouter des photos à l'album partagé.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} fichiers exportés", - "MIGRATING_EXPORT": "Préparations...", - "RENAMING_COLLECTION_FOLDERS": "Renommage des dossiers de l'album en cours...", - "TRASHING_DELETED_FILES": "Mise à la corbeille des fichiers supprimés...", - "TRASHING_DELETED_COLLECTIONS": "Mise à la corbeille des albums supprimés...", - "EXPORT_NOTIFICATION": { - "START": "L'export a démarré", - "IN_PROGRESS": "Un export est déjà en cours", - "FINISH": "Export terminé", - "UP_TO_DATE": "Aucun nouveau fichier à exporter" - }, - "CONTINUOUS_EXPORT": "Synchronisation en continu", - "TOTAL_ITEMS": "Total d'objets", - "PENDING_ITEMS": "Objets en attente", - "EXPORT_STARTING": "Démarrage de l'export...", - "DELETE_ACCOUNT_REASON_LABEL": "Quelle est la raison principale de la suppression de votre compte ?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Choisir une raison", - "DELETE_REASON": { - "MISSING_FEATURE": "Il manque une fonctionnalité essentielle dont j'ai besoin", - "BROKEN_BEHAVIOR": "L'application ou une certaine fonctionnalité ne se comporte pas comme je pense qu'elle devrait", - "FOUND_ANOTHER_SERVICE": "J'ai trouvé un autre service que je préfère", - "NOT_LISTED": "Ma raison n'est pas listée" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Nous sommes désolés de vous voir partir. Expliquez-nous les raisons de votre départ pour que nous puissions nous améliorer.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Vos commentaires", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Oui, je veux supprimer définitivement ce compte et toutes ses données", - "CONFIRM_DELETE_ACCOUNT": "Confirmer la suppression du compte", - "FEEDBACK_REQUIRED": "Merci de nous aider avec cette information", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Qu'est-ce que l'autre service fait de mieux ?", - "RECOVER_TWO_FACTOR": "Récupérer la double-authentification", - "at": "à", - "AUTH_NEXT": "suivant", - "AUTH_DOWNLOAD_MOBILE_APP": "Téléchargez notre application mobile pour gérer vos secrets", - "HIDDEN": "Masqué", - "HIDE": "Masquer", - "UNHIDE": "Dévoiler", - "UNHIDE_TO_COLLECTION": "Afficher dans l'album", - "SORT_BY": "Trier par", - "NEWEST_FIRST": "Plus récent en premier", - "OLDEST_FIRST": "Plus ancien en premier", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Ce fichier n'a pas pu être aperçu. Cliquez ici pour télécharger l'original.", - "SELECT_COLLECTION": "Sélectionner album", - "PIN_ALBUM": "Épingler l'album", - "UNPIN_ALBUM": "Désépingler l'album", - "DOWNLOAD_COMPLETE": "Téléchargement terminé", - "DOWNLOADING_COLLECTION": "Téléchargement de {{name}}", - "DOWNLOAD_FAILED": "Échec du téléchargement", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} fichiers", - "CHRISTMAS": "Noël", - "CHRISTMAS_EVE": "Réveillon de Noël", - "NEW_YEAR": "Nouvel an", - "NEW_YEAR_EVE": "Réveillon de Nouvel An", - "IMAGE": "Image", - "VIDEO": "Vidéo", - "LIVE_PHOTO": "Photos en direct", - "CONVERT": "Convertir", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Êtes-vous sûr de vouloir fermer l'éditeur ?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Téléchargez votre image modifiée ou enregistrez une copie sur ente pour maintenir vos modifications.", - "BRIGHTNESS": "Luminosité", - "CONTRAST": "Contraste", - "SATURATION": "Saturation", - "BLUR": "Flou", - "INVERT_COLORS": "Inverser les couleurs", - "ASPECT_RATIO": "Ratio de l'image", - "SQUARE": "Carré", - "ROTATE_LEFT": "Pivoter vers la gauche", - "ROTATE_RIGHT": "Pivoter vers la droite", - "FLIP_VERTICALLY": "Basculer verticalement", - "FLIP_HORIZONTALLY": "Retourner horizontalement", - "DOWNLOAD_EDITED": "Téléchargement modifié", - "SAVE_A_COPY_TO_ENTE": "Enregistrer une copie dans ente", - "RESTORE_ORIGINAL": "Restaurer l'original", - "TRANSFORM": "Transformer", - "COLORS": "Couleurs", - "FLIP": "Retourner", - "ROTATION": "Rotation", - "RESET": "Réinitialiser", - "PHOTO_EDITOR": "Éditeur de photos", - "FASTER_UPLOAD": "Chargements plus rapides", - "FASTER_UPLOAD_DESCRIPTION": "Router les chargements vers les serveurs à proximité", - "MAGIC_SEARCH_STATUS": "Statut de la recherche magique", - "INDEXED_ITEMS": "Éléments indexés", - "CAST_ALBUM_TO_TV": "Jouer l'album sur la TV", - "ENTER_CAST_PIN_CODE": "Entrez le code que vous voyez sur la TV ci-dessous pour appairer cet appareil.", - "PAIR_DEVICE_TO_TV": "Associer les appareils", - "TV_NOT_FOUND": "TV introuvable. Avez-vous entré le code PIN correctement ?", - "AUTO_CAST_PAIR": "Paire automatique", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "La paire automatique nécessite la connexion aux serveurs Google et ne fonctionne qu'avec les appareils pris en charge par Chromecast. Google ne recevra pas de données sensibles, telles que vos photos.", - "PAIR_WITH_PIN": "Associer avec le code PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Choisissez un périphérique compatible avec la caste à partir de la fenêtre pop-up du navigateur.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "L'association avec le code PIN fonctionne pour tout appareil grand écran sur lequel vous voulez lire votre album.", - "VISIT_CAST_ENTE_IO": "Visitez cast.ente.io sur l'appareil que vous voulez associer.", - "CAST_AUTO_PAIR_FAILED": "La paire automatique de Chromecast a échoué. Veuillez réessayer.", - "CACHE_DIRECTORY": "Dossier du cache", - "FREEHAND": "Main levée", - "APPLY_CROP": "Appliquer le recadrage", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Au moins une transformation ou un ajustement de couleur doit être effectué avant de sauvegarder.", - "PASSKEYS": "Clés d'accès", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/it-IT/translation.json b/web/apps/cast/public/locales/it-IT/translation.json deleted file mode 100644 index ae450e5fe..000000000 --- a/web/apps/cast/public/locales/it-IT/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backup privati
dei tuoi ricordi
", - "HERO_SLIDE_1": "Crittografia end-to-end", - "HERO_SLIDE_2_TITLE": "
Salvati in modo sicuro
in un rifugio antiatomico
", - "HERO_SLIDE_2": "Progettato per sopravvivere", - "HERO_SLIDE_3_TITLE": "
Disponibile
ovunque
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Accedi", - "SIGN_UP": "Registrati", - "NEW_USER": "Nuovo utente", - "EXISTING_USER": "Accedi", - "ENTER_NAME": "Inserisci il nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Aggiungi un nome in modo che i tuoi amici sappiano chi ringraziare per queste fantastiche foto!", - "ENTER_EMAIL": "Inserisci l'indirizzo email", - "EMAIL_ERROR": "Inserisci un indirizzo email valido", - "REQUIRED": "Campo obbligatorio", - "EMAIL_SENT": "Codice di verifica inviato a {{email}}", - "CHECK_INBOX": "Controlla la tua casella di posta (e lo spam) per completare la verifica", - "ENTER_OTT": "Codice di verifica", - "RESEND_MAIL": "Reinvia codice", - "VERIFY": "Verifica", - "UNKNOWN_ERROR": "Qualcosa è andato storto, per favore riprova", - "INVALID_CODE": "Codice di verifica non valido", - "EXPIRED_CODE": "Il tuo codice di verifica è scaduto", - "SENDING": "Invio in corso...", - "SENT": "Inviato!", - "PASSWORD": "Password", - "LINK_PASSWORD": "Inserisci la password per sbloccare l'album", - "RETURN_PASSPHRASE_HINT": "Password", - "SET_PASSPHRASE": "Imposta una password", - "VERIFY_PASSPHRASE": "Accedi", - "INCORRECT_PASSPHRASE": "Password sbagliata", - "ENTER_ENC_PASSPHRASE": "Inserisci una password per crittografare i tuoi dati", - "PASSPHRASE_DISCLAIMER": "Non memorizziamo la tua password, quindi se la dimentichi, non saremo in grado di aiutarti a recuperare i tuoi dati senza una chiave di recupero.", - "WELCOME_TO_ENTE_HEADING": "Benvenuto su ", - "WELCOME_TO_ENTE_SUBHEADING": "Archiviazione e condivisione di foto crittografate end-to-end", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Dove vivono le tue migliori foto", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generazione delle chiavi di crittografia...", - "PASSPHRASE_HINT": "Password", - "CONFIRM_PASSPHRASE": "Conferma la password", - "REFERRAL_CODE_HINT": "Come hai conosciuto Ente? (opzionale)", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Le password non corrispondono", - "CREATE_COLLECTION": "Nuovo album", - "ENTER_ALBUM_NAME": "Nome album", - "CLOSE_OPTION": "Chiudi (Esc)", - "ENTER_FILE_NAME": "Nome del file", - "CLOSE": "Chiudi", - "NO": "No", - "NOTHING_HERE": "Nulla da vedere qui! 👀", - "UPLOAD": "Carica", - "IMPORT": "Importa", - "ADD_PHOTOS": "Aggiungi foto", - "ADD_MORE_PHOTOS": "Aggiungi altre foto", - "add_photos_one": "Aggiungi elemento", - "add_photos_other": "Aggiungi {{count, number}} elementi", - "SELECT_PHOTOS": "Seleziona foto", - "FILE_UPLOAD": "Carica file", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparazione all'upload", - "1": "Lettura dei file metadati di google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} file metadati estratti", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} file salvati", - "4": "Annullamento dei caricamenti rimanenti", - "5": "Backup completato" - }, - "FILE_NOT_UPLOADED_LIST": "I seguenti file non sono stati caricati", - "SUBSCRIPTION_EXPIRED": "Abbonamento scaduto", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Il tuo abbonamento è scaduto, per favore rinnova", - "STORAGE_QUOTA_EXCEEDED": "Limite d'archiviazione superato", - "INITIAL_LOAD_DELAY_WARNING": "Il primo caricamento potrebbe richiedere del tempo", - "USER_DOES_NOT_EXIST": "Purtroppo non abbiamo trovato nessun account con quell'indirizzo e-mail", - "NO_ACCOUNT": "Non ho un account", - "ACCOUNT_EXISTS": "Ho già un account", - "CREATE": "Crea", - "DOWNLOAD": "Scarica", - "DOWNLOAD_OPTION": "Scarica (D)", - "DOWNLOAD_FAVORITES": "Scarica i preferiti", - "DOWNLOAD_UNCATEGORIZED": "Scarica i file senza categoria", - "DOWNLOAD_HIDDEN_ITEMS": "Scarica gli elementi nascosti", - "COPY_OPTION": "Copia come PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Attiva/disattiva schermo intero (F)", - "ZOOM_IN_OUT": "Zoom in/out", - "PREVIOUS": "Precedente (←)", - "NEXT": "Successivo (→)", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "Carica la tua prima foto", - "IMPORT_YOUR_FOLDERS": "Importa una cartella", - "UPLOAD_DROPZONE_MESSAGE": "Rilascia per eseguire il backup dei file", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Rilascia per aggiungere la cartella osservata", - "TRASH_FILES_TITLE": "Elimina file?", - "TRASH_FILE_TITLE": "Eliminare il file?", - "DELETE_FILES_TITLE": "Eliminare immediatamente?", - "DELETE_FILES_MESSAGE": "I file selezionati verranno eliminati definitivamente dal tuo account ente.", - "DELETE": "Cancella", - "DELETE_OPTION": "Cancella (DEL)", - "FAVORITE_OPTION": "Preferito (L)", - "UNFAVORITE_OPTION": "Rimuovi dai preferiti (L)", - "MULTI_FOLDER_UPLOAD": "Selezionate più cartelle", - "UPLOAD_STRATEGY_CHOICE": "Vuoi caricarli in", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Un album singolo", - "OR": "o", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Album separati", - "SESSION_EXPIRED_MESSAGE": "La sessione è scaduta. Per continuare, esegui nuovamente l'accesso", - "SESSION_EXPIRED": "Sessione scaduta", - "PASSWORD_GENERATION_FAILED": "Il tuo browser non è stato in grado di generare una chiave forte che soddisfa gli standard di crittografia ente, prova ad usare l'app per dispositivi mobili o un altro browser", - "CHANGE_PASSWORD": "Cambia password", - "GO_BACK": "Torna indietro", - "RECOVERY_KEY": "Chiave di recupero", - "SAVE_LATER": "Fallo più tardi", - "SAVE": "Salva Chiave", - "RECOVERY_KEY_DESCRIPTION": "Se dimentichi la tua password, l'unico modo per recuperare i tuoi dati è con questa chiave.", - "RECOVER_KEY_GENERATION_FAILED": "Impossibile generare il codice di recupero, riprova", - "KEY_NOT_STORED_DISCLAIMER": "Non memorizziamo questa chiave, quindi salvala in un luogo sicuro", - "FORGOT_PASSWORD": "Password dimenticata", - "RECOVER_ACCOUNT": "Recupera account", - "RECOVERY_KEY_HINT": "Chiave di recupero", - "RECOVER": "Recupera", - "NO_RECOVERY_KEY": "Nessuna chiave di recupero?", - "INCORRECT_RECOVERY_KEY": "Chiave di recupero errata", - "SORRY": "Siamo spiacenti", - "NO_RECOVERY_KEY_MESSAGE": "A causa della natura del nostro protocollo di crittografia end-to-end, i tuoi dati non possono essere decifrati senza la tua password o chiave di ripristino", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Per favore invia un'email a {{emailID}} dal tuo indirizzo email registrato", - "CONTACT_SUPPORT": "Contatta il supporto", - "REQUEST_FEATURE": "Richiedi una funzionalità", - "SUPPORT": "Supporto", - "CONFIRM": "Conferma", - "CANCEL": "Annulla", - "LOGOUT": "Disconnettiti", - "DELETE_ACCOUNT": "Elimina account", - "DELETE_ACCOUNT_MESSAGE": "

Per favore invia una email a {{emailID}} dal tuo indirizzo email registrato.

La tua richiesta verrà elaborata entro 72 ore.

", - "LOGOUT_MESSAGE": "Sei sicuro di volerti disconnettere?", - "CHANGE_EMAIL": "Cambia email", - "OK": "OK", - "SUCCESS": "Operazione riuscita", - "ERROR": "Errore", - "MESSAGE": "Messaggio", - "INSTALL_MOBILE_APP": "Installa la nostra app Android o iOS per eseguire il backup automatico di tutte le tue foto", - "DOWNLOAD_APP_MESSAGE": "Siamo spiacenti, questa operazione è attualmente supportata solo sulla nostra app desktop", - "DOWNLOAD_APP": "Scarica l'app per desktop", - "EXPORT": "Esporta Dati", - "SUBSCRIPTION": "Abbonamento", - "SUBSCRIBE": "Iscriviti", - "MANAGEMENT_PORTAL": "Gestisci i metodi di pagamento", - "MANAGE_FAMILY_PORTAL": "Gestisci piano famiglia", - "LEAVE_FAMILY_PLAN": "Abbandona il piano famiglia", - "LEAVE": "Lascia", - "LEAVE_FAMILY_CONFIRM": "Sei sicuro di voler uscire dal piano famiglia?", - "CHOOSE_PLAN": "Scegli il tuo piano", - "MANAGE_PLAN": "Gestisci il tuo abbonamento", - "ACTIVE": "Attivo", - "OFFLINE_MSG": "Sei offline, i ricordi memorizzati nella cache vengono mostrati", - "FREE_SUBSCRIPTION_INFO": "Sei sul piano gratuito che scade il {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Fai parte di un piano famiglia gestito da", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Si rinnova il {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina il {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Il tuo abbonamento verrà annullato il {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Hai superato la quota di archiviazione assegnata, si prega di aggiornare ", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Abbiamo ricevuto il tuo pagamento

Il tuo abbonamento è valido fino a {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Il tuo acquisto è stato annullato, riprova se vuoi iscriverti", - "SUBSCRIPTION_PURCHASE_FAILED": "Acquisto abbonamento non riuscito, riprova", - "SUBSCRIPTION_UPDATE_FAILED": "L'aggiornamento dell'abbonamento non è riuscito, riprova", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Siamo spiacenti, il pagamento non è andato a buon fine quando abbiamo provato ad addebitare alla sua carta, la preghiamo di aggiornare il suo metodo di pagamento e riprovare", - "STRIPE_AUTHENTICATION_FAILED": "Non siamo in grado di autenticare il tuo metodo di pagamento. Per favore scegli un metodo di pagamento diverso e riprova", - "UPDATE_PAYMENT_METHOD": "Aggiorna metodo di pagamento", - "MONTHLY": "Mensile", - "YEARLY": "Annuale", - "UPDATE_SUBSCRIPTION_MESSAGE": "Sei sicuro di voler cambiare il piano?", - "UPDATE_SUBSCRIPTION": "Cambia piano", - "CANCEL_SUBSCRIPTION": "Annulla abbonamento", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Tutti i tuoi dati saranno cancellati dai nostri server alla fine di questo periodo di fatturazione.

Sei sicuro di voler annullare il tuo abbonamento?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "Impossibile annullare l'abbonamento", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abbonamento annullato con successo", - "REACTIVATE_SUBSCRIPTION": "Riattiva abbonamento", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Una volta riattivato, ti verrà addebitato il valore di {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Iscrizione attivata con successo ", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Grazie", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Annulla abbonamento mobile", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Per favore contattaci su {{emailID}} per gestire il tuo abbonamento", - "RENAME": "Rinomina", - "RENAME_FILE": "Rinomina file", - "RENAME_COLLECTION": "Rinomina album", - "DELETE_COLLECTION_TITLE": "Eliminare l'album?", - "DELETE_COLLECTION": "Elimina album", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "Elimina foto", - "KEEP_PHOTOS": "Mantieni foto", - "SHARE": "Condividi", - "SHARE_COLLECTION": "Condividi album", - "SHAREES": "Condividi con", - "SHARE_WITH_SELF": "Ops, non puoi condividere a te stesso", - "ALREADY_SHARED": "Ops, lo stai già condividendo con {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Condividere gli album non è consentito", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "La condivisione è disabilitata per gli account free", - "DOWNLOAD_COLLECTION": "Scarica album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Sei sicuro di volere scaricare l'album interamente?

Tutti i file saranno messi in coda per il download

", - "CREATE_ALBUM_FAILED": "Operazione di creazione dell'album fallita, per favore riprova", - "SEARCH": "Ricerca", - "SEARCH_RESULTS": "Risultati della ricerca", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Posizione", - "CITY": "Posizione", - "DATE": "Data", - "FILE_NAME": "Nome file", - "THING": "Contenuto", - "FILE_CAPTION": "Descrizione", - "FILE_TYPE": "Tipo del file", - "CLIP": "" - }, - "photos_count_zero": "Nessuna memoria", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "Aggiungi all'album", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Questo video non può essere riprodotto nel tuo browser", - "PEOPLE": "Persone", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "volti non identificati", - "OBJECTS": "", - "TEXT": "testo", - "INFO": "Info ", - "INFO_OPTION": "", - "FILE_NAME": "Nome file", - "CAPTION_PLACEHOLDER": "Aggiungi una descrizione", - "LOCATION": "Posizione", - "SHOW_ON_MAP": "Guarda su OpenStreetMap", - "MAP": "Mappa", - "MAP_SETTINGS": "Impostazioni Mappa", - "ENABLE_MAPS": "Attivare Mappa?", - "ENABLE_MAP": "Attivare mappa", - "DISABLE_MAPS": "Disattivare Mappa?", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Due fattori", - "TWO_FACTOR_AUTHENTICATION": "Autenticazione a due fattori", - "TWO_FACTOR_QR_INSTRUCTION": "Scansiona il codice QR qui sotto con la tua app di autenticazione preferita", - "ENTER_CODE_MANUALLY": "Inserisci il codice manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Inserisci questo codice nella tua app di autenticazione preferita", - "SCAN_QR_CODE": "Oppure scansiona il codice QR", - "ENABLE_TWO_FACTOR": "Attiva due fattori", - "ENABLE": "Attiva", - "LOST_DEVICE": "", - "INCORRECT_CODE": "Codice errato", - "TWO_FACTOR_INFO": "Aggiungi un ulteriore livello di sicurezza richiedendo più informazioni rispetto a email e password per eseguire l'accesso al tuo account", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "Esporta dati", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "Invia OTP", - "EMAIl_ALREADY_OWNED": "Email già in uso", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "Caricamento fallito ", - "SKIPPED_FILES": "Ignora caricamenti", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "Caricamenti eseguiti con successo", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "Video saltati", - "INPROGRESS_METADATA_EXTRACTION": "In corso", - "INPROGRESS_UPLOADS": "Caricamenti in corso", - "TOO_LARGE_UPLOADS": "File pesanti", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Spazio insufficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Questi file non sono stati caricati perché supererebbero la capacità massima del tuo piano di spazio d'archiviazione", - "TOO_LARGE_INFO": "Questi file non sono stati caricati perché superano il nostro limite di pesantezza di un file", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "Archivio", - "FAVORITES": "Preferiti", - "ARCHIVE_COLLECTION": "Album archiviato", - "ARCHIVE_SECTION_NAME": "Archivio", - "ALL_SECTION_NAME": "Tutto", - "MOVE_TO_COLLECTION": "Sposta nell'album", - "UNARCHIVE": "Rimuovi dall'archivio", - "UNARCHIVE_COLLECTION": "Rimuovi album dall'archivio", - "HIDE_COLLECTION": "Nascondi album", - "UNHIDE_COLLECTION": "Rimuovi album dai nascosti", - "MOVE": "Sposta", - "ADD": "Aggiungi", - "REMOVE": "Rimuovi", - "YES_REMOVE": "Sì, rimuovi", - "REMOVE_FROM_COLLECTION": "Rimuovi dall'album", - "TRASH": "Cestino", - "MOVE_TO_TRASH": "Sposta nel cestino", - "TRASH_FILES_MESSAGE": "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino.", - "TRASH_FILE_MESSAGE": "Il file verrà eliminato da tutti gli album e spostato nel cestino.", - "DELETE_PERMANENTLY": "Elimina definitivamente", - "RESTORE": "Ripristina", - "RESTORE_TO_COLLECTION": "Ripristina nell'album", - "EMPTY_TRASH": "Svuota il cestino", - "EMPTY_TRASH_TITLE": "Vuoi svuotare il cestino?", - "EMPTY_TRASH_MESSAGE": "I file selezionati verranno eliminati definitivamente dal tuo account ente.", - "LEAVE_SHARED_ALBUM": "Sì, esci", - "LEAVE_ALBUM": "Abbandona l'album", - "LEAVE_SHARED_ALBUM_TITLE": "Abbandonare l'album condiviso?", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "Meno recente", - "SORT_BY_UPDATION_TIME_DESCENDING": "Ultimo aggiornamento", - "SORT_BY_NAME": "Nome", - "COMPRESS_THUMBNAILS": "Comprimi miniature", - "THUMBNAIL_REPLACED": "Miniature compresse", - "FIX_THUMBNAIL": "Comprimi", - "FIX_THUMBNAIL_LATER": "Comprimi più tardi", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "Installa", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Nessun partecipante", - "participants_one": "1 partecipante", - "participants_other": "{{count, number}} partecipanti", - "ADD_VIEWERS": "", - "PARTICIPANTS": "Partecipanti", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "Rimuovere?", - "CONFIRM_REMOVE": "Sì, rimuovi", - "MANAGE": "Gestisci", - "ADDED_AS": "Aggiunto come", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "Rimuovi partecipante", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "404 - non trovato", - "LINK_EXPIRED": "Link scaduto", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "Cartella", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Album", - "ALL_ALBUMS": "Tutti gli Album", - "ALBUMS": "Album", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "Crea account", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "Tu", - "FAMILY": "Famiglia", - "FREE": "gratis", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "Ancora nessuna cartella aggiunta!", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "Cambia Cartella", - "TWO_MONTHS_FREE": "Ottieni 2 mesi gratis sui piani annuali", - "GB": "GB", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "1 GB per 1 anno", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "Autenticati", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "Oggi", - "YESTERDAY": "Ieri", - "NAME_PLACEHOLDER": "Nome...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "Seleziona tema", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "Più dettagli", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "Avanzate", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "Sicurezza password: Debole", - "PASSPHRASE_STRENGTH_MODERATE": "Sicurezza password: Moderata", - "PASSPHRASE_STRENGTH_STRONG": "Sicurezza password: Forte", - "PREFERENCES": "", - "LANGUAGE": "Lingua", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "dopo un'ora", - "DAY": "dopo un giorno", - "WEEK": "dopo una settimana", - "MONTH": "dopo un mese", - "YEAR": "dopo un anno" - }, - "COPY_LINK": "Copia link", - "DONE": "Fatto", - "LINK_SHARE_TITLE": "O condividi un link", - "REMOVE_LINK": "Rimuovi link", - "CREATE_PUBLIC_SHARING": "Crea link pubblico", - "PUBLIC_LINK_CREATED": "Link pubblick creato", - "PUBLIC_LINK_ENABLED": "Link pubblico attivato", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Seleziona un motivo", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/ko-KR/translation.json b/web/apps/cast/public/locales/ko-KR/translation.json deleted file mode 100644 index 4fbe6c077..000000000 --- a/web/apps/cast/public/locales/ko-KR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "추억을 안전하게 백업하세요", - "HERO_SLIDE_1": "종단간 암호화가 기본지원입니다", - "HERO_SLIDE_2_TITLE": "낙진대피소에 안전하게 보관됩니다", - "HERO_SLIDE_2": "오랫동안 보존할 수 있도록한 설계", - "HERO_SLIDE_3_TITLE": "
어디에서나
이용가능
", - "HERO_SLIDE_3": "안드로이드, iOS, 웹, 데스크탑", - "LOGIN": "로그인", - "SIGN_UP": "회원가입", - "NEW_USER": "ente의 새소식", - "EXISTING_USER": "기존 사용자", - "ENTER_NAME": "이름 입력", - "PUBLIC_UPLOADER_NAME_MESSAGE": "친구들이 이 멋진 사진에 대해 고마워할 수 있도록 이름을 추가하세요!", - "ENTER_EMAIL": "이메일 주소를 입력하세요", - "EMAIL_ERROR": "올바른 이메일을 입력하세요", - "REQUIRED": "필수", - "EMAIL_SENT": "{{email}} 로 인증 코드가 전송되었습니다", - "CHECK_INBOX": "인증을 완료하기 위해 당신의 메일 수신함(그리고 스팸 수신함)을 확인하세요.", - "ENTER_OTT": "인증 코드", - "RESEND_MAIL": "코드 재전송하기", - "VERIFY": "인증", - "UNKNOWN_ERROR": "문제가 생긴 것 같아요. 다시 시도하세요", - "INVALID_CODE": "잘못된 인증 코드", - "EXPIRED_CODE": "입력한 인증 코드가 만료되었습니다", - "SENDING": "전송 중...", - "SENT": "발송 완료!", - "PASSWORD": "비밀번호", - "LINK_PASSWORD": "앨범 잠금해제를 위해 비밀번호를 입력하세요", - "RETURN_PASSPHRASE_HINT": "비밀번호", - "SET_PASSPHRASE": "비밀번호 설정", - "VERIFY_PASSPHRASE": "로그인", - "INCORRECT_PASSPHRASE": "잘못된 비밀번호입니다", - "ENTER_ENC_PASSPHRASE": "당신의 데이터를 암호화하는 데 사용할 수 있는 비밀번호를 입력하세요", - "PASSPHRASE_DISCLAIMER": "우리는 귀하의 비밀번호를 저장하지 않습니다. 만약 비밀번호를 잊어버린 경우 복구 키 없다면 데이터 복구를 도와드릴 수 없습니다.", - "WELCOME_TO_ENTE_HEADING": "환영합니다 ", - "WELCOME_TO_ENTE_SUBHEADING": "End-to-End 암호화된 사진 저장 및 공유", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "당신 최고의 사진이 있는 곳", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "암호 키 생성 중...", - "PASSPHRASE_HINT": "비밀번호", - "CONFIRM_PASSPHRASE": "비밀번호 확인", - "REFERRAL_CODE_HINT": "어떻게 Ente에 대해 들으셨나요? (선택사항)", - "REFERRAL_INFO": "우리는 앱 설치를 추적하지 않습니다. 우리를 알게 된 곳을 남겨주시면 우리에게 도움이 될꺼에요!", - "PASSPHRASE_MATCH_ERROR": "비밀번호가 일치하지 않습니다", - "CREATE_COLLECTION": "새 앨범", - "ENTER_ALBUM_NAME": "앨범 이름", - "CLOSE_OPTION": "닫기 (Esc)", - "ENTER_FILE_NAME": "파일 이름", - "CLOSE": "닫기", - "NO": "아니오", - "NOTHING_HERE": "아직 볼 수 있는 것이 없어요 👀", - "UPLOAD": "업로드", - "IMPORT": "가져오기", - "ADD_PHOTOS": "사진 추가", - "ADD_MORE_PHOTOS": "사진 더 추가하기", - "add_photos_one": "아이템 하나 추가", - "add_photos_other": "아이템 {{count, number}} 개 추가하기", - "SELECT_PHOTOS": "사진 선택하기", - "FILE_UPLOAD": "파일 업로드", - "UPLOAD_STAGE_MESSAGE": { - "0": "업로드 준비중", - "1": "구글 메타데이타 파일들 읽는중", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 파일 메타데이터가 추출되었습니다", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 파일이 처리되었습니다", - "4": "남은 업로드 취소중", - "5": "백업 완료" - }, - "FILE_NOT_UPLOADED_LIST": "아래 파일들은 업로드 되지 않았습니다", - "SUBSCRIPTION_EXPIRED": "구독 만료", - "SUBSCRIPTION_EXPIRED_MESSAGE": "당신 구독이 만료되었으니, 구독을 갱신해주세요", - "STORAGE_QUOTA_EXCEEDED": "스토리지 제한이 초과되었습니다", - "INITIAL_LOAD_DELAY_WARNING": "처음 로딩시 다소 시간이 걸릴 수 있습니다", - "USER_DOES_NOT_EXIST": "죄송합니다. 해당 이메일을 사용하는 사용자를 찾을 수 없습니다", - "NO_ACCOUNT": "계정이 없습니다", - "ACCOUNT_EXISTS": "이미 계정이 있습니다", - "CREATE": "만들기", - "DOWNLOAD": "다운로드", - "DOWNLOAD_OPTION": "다운로드 (D)", - "DOWNLOAD_FAVORITES": "즐겨찾기 다운로드", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/nl-NL/translation.json b/web/apps/cast/public/locales/nl-NL/translation.json deleted file mode 100644 index 15d9bfdba..000000000 --- a/web/apps/cast/public/locales/nl-NL/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Privé back-ups
voor uw herinneringen
", - "HERO_SLIDE_1": "Standaard end-to-end versleuteld", - "HERO_SLIDE_2_TITLE": "
Veilig opgeslagen
in een kernbunker
", - "HERO_SLIDE_2": "Ontworpen om levenslang mee te gaan", - "HERO_SLIDE_3_TITLE": "
Overal
beschikbaar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Inloggen", - "SIGN_UP": "Registreren", - "NEW_USER": "Nieuw bij ente", - "EXISTING_USER": "Bestaande gebruiker", - "ENTER_NAME": "Naam invoeren", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Voeg een naam toe zodat je vrienden weten wie ze moeten bedanken voor deze geweldige foto's!", - "ENTER_EMAIL": "Vul e-mailadres in", - "EMAIL_ERROR": "Vul een geldig e-mailadres in", - "REQUIRED": "Vereist", - "EMAIL_SENT": "Verificatiecode verzonden naar {{email}}", - "CHECK_INBOX": "Controleer je inbox (en spam) om verificatie te voltooien", - "ENTER_OTT": "Verificatiecode", - "RESEND_MAIL": "Code opnieuw versturen", - "VERIFY": "Verifiëren", - "UNKNOWN_ERROR": "Er is iets fout gegaan, probeer het opnieuw", - "INVALID_CODE": "Ongeldige verificatiecode", - "EXPIRED_CODE": "Uw verificatiecode is verlopen", - "SENDING": "Verzenden...", - "SENT": "Verzonden!", - "PASSWORD": "Wachtwoord", - "LINK_PASSWORD": "Voer wachtwoord in om het album te ontgrendelen", - "RETURN_PASSPHRASE_HINT": "Wachtwoord", - "SET_PASSPHRASE": "Wachtwoord instellen", - "VERIFY_PASSPHRASE": "Aanmelden", - "INCORRECT_PASSPHRASE": "Onjuist wachtwoord", - "ENTER_ENC_PASSPHRASE": "Voer een wachtwoord in dat we kunnen gebruiken om je gegevens te versleutelen", - "PASSPHRASE_DISCLAIMER": "We slaan je wachtwoord niet op, dus als je het vergeet, zullen we u niet kunnen helpen uw data te herstellen zonder een herstelcode.", - "WELCOME_TO_ENTE_HEADING": "Welkom bij ", - "WELCOME_TO_ENTE_SUBHEADING": "Foto opslag en delen met end to end encryptie", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Waar je beste foto's leven", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Encryptiecodes worden gegenereerd...", - "PASSPHRASE_HINT": "Wachtwoord", - "CONFIRM_PASSPHRASE": "Wachtwoord bevestigen", - "REFERRAL_CODE_HINT": "Hoe hoorde je over Ente? (optioneel)", - "REFERRAL_INFO": "Wij gebruiken geen tracking. Het zou helpen als je ons vertelt waar je ons gevonden hebt!", - "PASSPHRASE_MATCH_ERROR": "Wachtwoorden komen niet overeen", - "CREATE_COLLECTION": "Nieuw album", - "ENTER_ALBUM_NAME": "Album naam", - "CLOSE_OPTION": "Sluiten (Esc)", - "ENTER_FILE_NAME": "Bestandsnaam", - "CLOSE": "Sluiten", - "NO": "Nee", - "NOTHING_HERE": "Nog niets te zien hier 👀", - "UPLOAD": "Uploaden", - "IMPORT": "Importeren", - "ADD_PHOTOS": "Foto's toevoegen", - "ADD_MORE_PHOTOS": "Meer foto's toevoegen", - "add_photos_one": "1 foto toevoegen", - "add_photos_other": "{{count, number}} foto's toevoegen", - "SELECT_PHOTOS": "Selecteer foto's", - "FILE_UPLOAD": "Bestand uploaden", - "UPLOAD_STAGE_MESSAGE": { - "0": "Upload wordt voorbereid", - "1": "Lezen van Google metadata bestanden", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} bestanden metadata uitgepakt", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} bestanden geback-upt", - "4": "Resterende uploads worden geannuleerd", - "5": "Back-up voltooid" - }, - "FILE_NOT_UPLOADED_LIST": "De volgende bestanden zijn niet geüpload", - "SUBSCRIPTION_EXPIRED": "Abonnement verlopen", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Uw abonnement is verlopen, gelieve vernieuwen", - "STORAGE_QUOTA_EXCEEDED": "Opslaglimiet overschreden", - "INITIAL_LOAD_DELAY_WARNING": "Eerste keer laden kan enige tijd duren", - "USER_DOES_NOT_EXIST": "Sorry, we konden geen account met dat e-mailadres vinden", - "NO_ACCOUNT": "Heb nog geen account", - "ACCOUNT_EXISTS": "Heb al een account", - "CREATE": "Creëren", - "DOWNLOAD": "Downloaden", - "DOWNLOAD_OPTION": "Downloaden (D)", - "DOWNLOAD_FAVORITES": "Favorieten downloaden", - "DOWNLOAD_UNCATEGORIZED": "Ongecategoriseerd downloaden", - "DOWNLOAD_HIDDEN_ITEMS": "Verborgen bestanden downloaden", - "COPY_OPTION": "Kopiëren als PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Schakelen volledig scherm modus (F)", - "ZOOM_IN_OUT": "In/uitzoomen", - "PREVIOUS": "Vorige (←)", - "NEXT": "Volgende (→)", - "TITLE_PHOTOS": "Ente Foto's", - "TITLE_ALBUMS": "Ente Foto's", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Je eerste foto uploaden", - "IMPORT_YOUR_FOLDERS": "Importeer uw mappen", - "UPLOAD_DROPZONE_MESSAGE": "Sleep om een back-up van je bestanden te maken", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Sleep om map aan watched folders toe te voegen", - "TRASH_FILES_TITLE": "Bestanden verwijderen?", - "TRASH_FILE_TITLE": "Verwijder bestand?", - "DELETE_FILES_TITLE": "Onmiddellijk verwijderen?", - "DELETE_FILES_MESSAGE": "Geselecteerde bestanden zullen permanent worden verwijderd van je ente account.", - "DELETE": "Verwijderen", - "DELETE_OPTION": "Verwijderen (DEL)", - "FAVORITE_OPTION": "Favoriet (L)", - "UNFAVORITE_OPTION": "Verwijderen uit Favorieten (L)", - "MULTI_FOLDER_UPLOAD": "Meerdere mappen gedetecteerd", - "UPLOAD_STRATEGY_CHOICE": "Wilt u deze uploaden naar", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Één enkel album", - "OR": "of", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Aparte albums maken", - "SESSION_EXPIRED_MESSAGE": "Uw sessie is verlopen. Meld u opnieuw aan om verder te gaan", - "SESSION_EXPIRED": "Sessie verlopen", - "PASSWORD_GENERATION_FAILED": "Uw browser kon geen sterke sleutel genereren die voldoet aan onze versleutelingsstandaarden. Probeer de mobiele app of een andere browser te gebruiken", - "CHANGE_PASSWORD": "Wachtwoord wijzigen", - "GO_BACK": "Ga terug", - "RECOVERY_KEY": "Herstelsleutel", - "SAVE_LATER": "Doe dit later", - "SAVE": "Sleutel opslaan", - "RECOVERY_KEY_DESCRIPTION": "Als je je wachtwoord vergeet, kun je alleen met deze sleutel je gegevens herstellen.", - "RECOVER_KEY_GENERATION_FAILED": "Herstelcode kon niet worden gegenereerd, probeer het opnieuw", - "KEY_NOT_STORED_DISCLAIMER": "We slaan deze sleutel niet op, bewaar dit op een veilige plaats", - "FORGOT_PASSWORD": "Wachtwoord vergeten", - "RECOVER_ACCOUNT": "Account herstellen", - "RECOVERY_KEY_HINT": "Herstelsleutel", - "RECOVER": "Herstellen", - "NO_RECOVERY_KEY": "Geen herstelsleutel?", - "INCORRECT_RECOVERY_KEY": "Onjuiste herstelsleutel", - "SORRY": "Sorry", - "NO_RECOVERY_KEY_MESSAGE": "Door de aard van ons end-to-end encryptieprotocol kunnen je gegevens niet worden ontsleuteld zonder je wachtwoord of herstelsleutel", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Stuur een e-mail naar {{emailID}} vanaf het door jou geregistreerde e-mailadres", - "CONTACT_SUPPORT": "Klantenservice", - "REQUEST_FEATURE": "Vraag nieuwe functie aan", - "SUPPORT": "Ondersteuning", - "CONFIRM": "Bevestigen", - "CANCEL": "Annuleren", - "LOGOUT": "Uitloggen", - "DELETE_ACCOUNT": "Account verwijderen", - "DELETE_ACCOUNT_MESSAGE": "

Stuur een e-mail naar {{emailID}} vanaf uw geregistreerde e-mailadres.

Uw aanvraag wordt binnen 72 uur verwerkt.

", - "LOGOUT_MESSAGE": "Weet u zeker dat u wilt uitloggen?", - "CHANGE_EMAIL": "E-mail wijzigen", - "OK": "Oké", - "SUCCESS": "Succes", - "ERROR": "Foutmelding", - "MESSAGE": "Melding", - "INSTALL_MOBILE_APP": "Installeer onze Android of iOS app om automatisch een back-up te maken van al uw foto's", - "DOWNLOAD_APP_MESSAGE": "Sorry, deze bewerking wordt momenteel alleen ondersteund op onze desktop app", - "DOWNLOAD_APP": "Download de desktop app", - "EXPORT": "Data exporteren", - "SUBSCRIPTION": "Abonnement", - "SUBSCRIBE": "Abonneren", - "MANAGEMENT_PORTAL": "Betaalmethode beheren", - "MANAGE_FAMILY_PORTAL": "Familie abonnement beheren", - "LEAVE_FAMILY_PLAN": "Familie abonnement verlaten", - "LEAVE": "Verlaten", - "LEAVE_FAMILY_CONFIRM": "Weet je zeker dat je het familie-plan wilt verlaten?", - "CHOOSE_PLAN": "Kies uw abonnement", - "MANAGE_PLAN": "Beheer uw abonnement", - "ACTIVE": "Actief", - "OFFLINE_MSG": "Je bent offline, lokaal opgeslagen herinneringen worden getoond", - "FREE_SUBSCRIPTION_INFO": "Je hebt het gratis abonnement dat verloopt op {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "U hebt een familieplan dat beheerd wordt door", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Vernieuwt op {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Eindigt op {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Uw abonnement loopt af op {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Jouw {{storage, string}} add-on is geldig tot {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "U heeft uw opslaglimiet overschreden, gelieve upgraden", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

We hebben uw betaling ontvangen

Uw abonnement is geldig tot {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Uw aankoop is geannuleerd, probeer het opnieuw als u zich wilt abonneren", - "SUBSCRIPTION_PURCHASE_FAILED": "Betaling van abonnement mislukt Probeer het opnieuw", - "SUBSCRIPTION_UPDATE_FAILED": "Niet gelukt om abonnement bij te werken, probeer het opnieuw", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Het spijt ons, maar de betaling is mislukt bij het in rekening brengen van uw kaart, gelieve uw betaalmethode bij te werken en het opnieuw te proberen", - "STRIPE_AUTHENTICATION_FAILED": "We zijn niet in staat om uw betaalmethode te verifiëren. Kies een andere betaalmethode en probeer het opnieuw", - "UPDATE_PAYMENT_METHOD": "Betalingsmethode bijwerken", - "MONTHLY": "Maandelijks", - "YEARLY": "Jaarlijks", - "UPDATE_SUBSCRIPTION_MESSAGE": "Weet u zeker dat u uw abonnement wilt wijzigen?", - "UPDATE_SUBSCRIPTION": "Abonnement wijzigen", - "CANCEL_SUBSCRIPTION": "Abonnement opzeggen", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Al je gegevens zullen worden verwijderd van onze servers aan het einde van deze factureringsperiode.

Weet u zeker dat u uw abonnement wilt opzeggen?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Weet je zeker dat je je abonnement wilt opzeggen?

", - "SUBSCRIPTION_CANCEL_FAILED": "Abonnement opzeggen mislukt", - "SUBSCRIPTION_CANCEL_SUCCESS": "Abonnement succesvol geannuleerd", - "REACTIVATE_SUBSCRIPTION": "Abonnement opnieuw activeren", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Zodra je weer bent geactiveerd, zal je worden gefactureerd op {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Abonnement succesvol geactiveerd ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Heractiveren van abonnementsverlenging is mislukt", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Bedankt", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Mobiel abonnement opzeggen", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Annuleer je abonnement via de mobiele app om je abonnement hier te activeren", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Neem contact met ons op via {{emailID}} om uw abonnement te beheren", - "RENAME": "Naam wijzigen", - "RENAME_FILE": "Bestandsnaam wijzigen", - "RENAME_COLLECTION": "Albumnaam wijzigen", - "DELETE_COLLECTION_TITLE": "Verwijder album?", - "DELETE_COLLECTION": "Verwijder album", - "DELETE_COLLECTION_MESSAGE": "Verwijder de foto's (en video's) van dit album ook uit alle andere albums waar deze deel van uitmaken?", - "DELETE_PHOTOS": "Foto's verwijderen", - "KEEP_PHOTOS": "Foto's behouden", - "SHARE": "Delen", - "SHARE_COLLECTION": "Album delen", - "SHAREES": "Gedeeld met", - "SHARE_WITH_SELF": "Oeps, je kunt niet met jezelf delen", - "ALREADY_SHARED": "Oeps, je deelt dit al met {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Album delen niet toegestaan", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Delen is uitgeschakeld voor gratis accounts", - "DOWNLOAD_COLLECTION": "Download album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Weet je zeker dat je het volledige album wilt downloaden?

Alle bestanden worden in de wachtrij geplaatst voor downloaden

", - "CREATE_ALBUM_FAILED": "Aanmaken van album mislukt, probeer het opnieuw", - "SEARCH": "Zoeken", - "SEARCH_RESULTS": "Zoekresultaten", - "NO_RESULTS": "Geen resultaten gevonden", - "SEARCH_HINT": "Zoeken naar albums, datums ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Locatie", - "CITY": "Locatie", - "DATE": "Datum", - "FILE_NAME": "Bestandsnaam", - "THING": "Inhoud", - "FILE_CAPTION": "Omschrijving", - "FILE_TYPE": "Bestandstype", - "CLIP": "Magische" - }, - "photos_count_zero": "Geen herinneringen", - "photos_count_one": "1 herinnering", - "photos_count_other": "{{count, number}} herinneringen", - "TERMS_AND_CONDITIONS": "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid", - "ADD_TO_COLLECTION": "Toevoegen aan album", - "SELECTED": "geselecteerd", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Deze video kan niet afgespeeld worden op uw browser", - "PEOPLE": "Personen", - "INDEXING_SCHEDULED": "indexering is gepland...", - "ANALYZING_PHOTOS": "analyseren van nieuwe foto's {{indexStatus.nSyncedFiles}} van {{indexStatus.nTotalFiles}} gedaan)...", - "INDEXING_PEOPLE": "mensen indexeren in {{indexStatus.nSyncedFiles}} foto's...", - "INDEXING_DONE": "{{indexStatus.nSyncedFiles}} geïndexeerde foto's", - "UNIDENTIFIED_FACES": "ongeïdentificeerde gezichten", - "OBJECTS": "objecten", - "TEXT": "tekst", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "Bestandsnaam", - "CAPTION_PLACEHOLDER": "Voeg een beschrijving toe", - "LOCATION": "Locatie", - "SHOW_ON_MAP": "Bekijk op OpenStreetMap", - "MAP": "Kaart", - "MAP_SETTINGS": "Kaart instellingen", - "ENABLE_MAPS": "Kaarten inschakelen?", - "ENABLE_MAP": "Kaarten inschakelen", - "DISABLE_MAPS": "Kaarten uitzetten?", - "ENABLE_MAP_DESCRIPTION": "

Dit toont jouw foto's op een wereldkaart.

Deze kaart wordt gehost door Open Street Map, en de exacte locaties van jouw foto's worden nooit gedeeld.

Je kunt deze functie op elk gewenst moment uitschakelen via de instellingen.

", - "DISABLE_MAP_DESCRIPTION": "

Dit schakelt de weergave van je foto's op een wereldkaart uit.

Je kunt deze functie op elk gewenst moment inschakelen via Instellingen.

", - "DISABLE_MAP": "Kaarten uitzetten", - "DETAILS": "Details", - "VIEW_EXIF": "Bekijk alle EXIF gegevens", - "NO_EXIF": "Geen EXIF gegevens", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Tweestaps", - "TWO_FACTOR_AUTHENTICATION": "Tweestapsverificatie", - "TWO_FACTOR_QR_INSTRUCTION": "Scan de onderstaande QR-code met uw favoriete verificatie app", - "ENTER_CODE_MANUALLY": "Voer de code handmatig in", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Voer deze code in in uw favoriete verificatie app", - "SCAN_QR_CODE": "Scan QR-code in plaats daarvan", - "ENABLE_TWO_FACTOR": "Tweestapsverificatie inschakelen", - "ENABLE": "Inschakelen", - "LOST_DEVICE": "Tweestapsverificatie apparaat verloren", - "INCORRECT_CODE": "Onjuiste code", - "TWO_FACTOR_INFO": "Voeg een extra beveiligingslaag toe door meer dan uw e-mailadres en wachtwoord te vereisen om in te loggen op uw account", - "DISABLE_TWO_FACTOR_LABEL": "Schakel tweestapsverificatie uit", - "UPDATE_TWO_FACTOR_LABEL": "Update uw verificatie apparaat", - "DISABLE": "Uitschakelen", - "RECONFIGURE": "Herconfigureren", - "UPDATE_TWO_FACTOR": "Tweestapsverificatie bijwerken", - "UPDATE_TWO_FACTOR_MESSAGE": "Verder gaan zal elk eerder geconfigureerde verificatie apparaat ontzeggen", - "UPDATE": "Bijwerken", - "DISABLE_TWO_FACTOR": "Tweestapsverificatie uitschakelen", - "DISABLE_TWO_FACTOR_MESSAGE": "Weet u zeker dat u tweestapsverificatie wilt uitschakelen", - "TWO_FACTOR_DISABLE_FAILED": "Uitschakelen van tweestapsverificatie is mislukt, probeer het opnieuw", - "EXPORT_DATA": "Gegevens exporteren", - "SELECT_FOLDER": "Map selecteren", - "DESTINATION": "Bestemming", - "START": "Start", - "LAST_EXPORT_TIME": "Tijd laatste export", - "EXPORT_AGAIN": "Opnieuw synchroniseren", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Lokale opslag niet toegankelijk", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Je browser of een extensie blokkeert ente om gegevens op te slaan in de lokale opslag. Probeer deze pagina te laden na het aanpassen van de browser surfmodus.", - "SEND_OTT": "Stuur OTP", - "EMAIl_ALREADY_OWNED": "E-mail al in gebruik", - "ETAGS_BLOCKED": "

We kunnen de volgende bestanden niet uploaden vanwege uw browserconfiguratie.

Schakel alle extensies uit die mogelijk voorkomen dat ente eTags kan gebruiken om grote bestanden te uploaden, of gebruik onze desktop app voor een betrouwbaardere import ervaring.

", - "SKIPPED_VIDEOS_INFO": "

We ondersteunen het toevoegen van video's via openbare links momenteel niet.

Om video's te delen, meld je aan bij ente en deel met de beoogde ontvangers via hun e-mail

", - "LIVE_PHOTOS_DETECTED": "De foto en video bestanden van je Live Photos zijn samengevoegd tot één enkel bestand", - "RETRY_FAILED": "Probeer mislukte uploads nogmaals", - "FAILED_UPLOADS": "Mislukte uploads ", - "SKIPPED_FILES": "Genegeerde uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generatie mislukt", - "UNSUPPORTED_FILES": "Niet-ondersteunde bestanden", - "SUCCESSFUL_UPLOADS": "Succesvolle uploads", - "SKIPPED_INFO": "Deze zijn overgeslagen omdat er bestanden zijn met overeenkomende namen in hetzelfde album", - "UNSUPPORTED_INFO": "ente ondersteunt deze bestandsformaten nog niet", - "BLOCKED_UPLOADS": "Geblokkeerde uploads", - "SKIPPED_VIDEOS": "Overgeslagen video's", - "INPROGRESS_METADATA_EXTRACTION": "In behandeling", - "INPROGRESS_UPLOADS": "Bezig met uploaden", - "TOO_LARGE_UPLOADS": "Grote bestanden", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Onvoldoende opslagruimte", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Deze bestanden zijn niet geüpload omdat ze de maximale grootte van uw opslagplan overschrijden", - "TOO_LARGE_INFO": "Deze bestanden zijn niet geüpload omdat ze onze limiet voor bestandsgrootte overschrijden", - "THUMBNAIL_GENERATION_FAILED_INFO": "Deze bestanden zijn geüpload, maar helaas konden we geen thumbnails voor ze genereren.", - "UPLOAD_TO_COLLECTION": "Uploaden naar album", - "UNCATEGORIZED": "Ongecategoriseerd", - "ARCHIVE": "Archiveren", - "FAVORITES": "Favorieten", - "ARCHIVE_COLLECTION": "Album archiveren", - "ARCHIVE_SECTION_NAME": "Archief", - "ALL_SECTION_NAME": "Alle", - "MOVE_TO_COLLECTION": "Verplaats naar album", - "UNARCHIVE": "Uit archief halen", - "UNARCHIVE_COLLECTION": "Album uit archief halen", - "HIDE_COLLECTION": "Verberg album", - "UNHIDE_COLLECTION": "Album zichtbaar maken", - "MOVE": "Verplaatsen", - "ADD": "Toevoegen", - "REMOVE": "Verwijderen", - "YES_REMOVE": "Ja, verwijderen", - "REMOVE_FROM_COLLECTION": "Verwijderen uit album", - "TRASH": "Prullenbak", - "MOVE_TO_TRASH": "Verplaatsen naar prullenbak", - "TRASH_FILES_MESSAGE": "De geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak.", - "TRASH_FILE_MESSAGE": "Het bestand wordt uit alle albums verwijderd en verplaatst naar de prullenbak.", - "DELETE_PERMANENTLY": "Permanent verwijderen", - "RESTORE": "Herstellen", - "RESTORE_TO_COLLECTION": "Terugzetten naar album", - "EMPTY_TRASH": "Prullenbak leegmaken", - "EMPTY_TRASH_TITLE": "Prullenbak leegmaken?", - "EMPTY_TRASH_MESSAGE": "Geselecteerde bestanden zullen permanent worden verwijderd van uw ente account.", - "LEAVE_SHARED_ALBUM": "Ja, verwijderen", - "LEAVE_ALBUM": "Album verlaten", - "LEAVE_SHARED_ALBUM_TITLE": "Gedeeld album verwijderen?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Je verlaat het album, en het zal niet meer zichtbaar voor je zijn.", - "NOT_FILE_OWNER": "U kunt bestanden niet verwijderen in een gedeeld album", - "CONFIRM_SELF_REMOVE_MESSAGE": "De geselecteerde items worden verwijderd uit dit album. De items die alleen in dit album staan, worden verplaatst naar 'Niet gecategoriseerd'.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Sommige van de items die u verwijdert zijn door andere mensen toegevoegd, en u verliest de toegang daartoe.", - "SORT_BY_CREATION_TIME_ASCENDING": "Oudste", - "SORT_BY_UPDATION_TIME_DESCENDING": "Laatst gewijzigd op", - "SORT_BY_NAME": "Naam", - "COMPRESS_THUMBNAILS": "Comprimeren van thumbnails", - "THUMBNAIL_REPLACED": "Thumbnails gecomprimeerd", - "FIX_THUMBNAIL": "Comprimeren", - "FIX_THUMBNAIL_LATER": "Later comprimeren", - "REPLACE_THUMBNAIL_NOT_STARTED": "Sommige van uw video thumbnails kunnen worden gecomprimeerd om ruimte te besparen. Wilt u dat ente ze comprimeert?", - "REPLACE_THUMBNAIL_COMPLETED": "Alle thumbnails zijn gecomprimeerd", - "REPLACE_THUMBNAIL_NOOP": "Je hebt geen thumbnails die verder gecomprimeerd kunnen worden", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Kon sommige van uw thumbnails niet comprimeren, probeer het opnieuw", - "FIX_CREATION_TIME": "Herstel tijd", - "FIX_CREATION_TIME_IN_PROGRESS": "Tijd aan het herstellen", - "CREATION_TIME_UPDATED": "Bestandstijd bijgewerkt", - "UPDATE_CREATION_TIME_NOT_STARTED": "Selecteer de optie die u wilt gebruiken", - "UPDATE_CREATION_TIME_COMPLETED": "Alle bestanden succesvol bijgewerkt", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "Bestandstijd update mislukt voor sommige bestanden, probeer het opnieuw", - "CAPTION_CHARACTER_LIMIT": "5000 tekens max", - "DATE_TIME_ORIGINAL": "EXIF:DatumTijdOrigineel", - "DATE_TIME_DIGITIZED": "EXIF:DatumTijdDigitaliseerd", - "METADATA_DATE": "EXIF:MetadataDatum", - "CUSTOM_TIME": "Aangepaste tijd", - "REOPEN_PLAN_SELECTOR_MODAL": "Abonnementen heropenen", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Kon abonnementen niet openen", - "INSTALL": "Installeren", - "SHARING_DETAILS": "Delen van informatie", - "MODIFY_SHARING": "Delen wijzigen", - "ADD_COLLABORATORS": "Samenwerker toevoegen", - "ADD_NEW_EMAIL": "Nieuw e-mailadres toevoegen", - "shared_with_people_zero": "Delen met specifieke mensen", - "shared_with_people_one": "Gedeeld met 1 persoon", - "shared_with_people_other": "Gedeeld met {{count, number}} mensen", - "participants_zero": "Geen deelnemers", - "participants_one": "1 deelnemer", - "participants_other": "{{count, number}} deelnemers", - "ADD_VIEWERS": "Voeg kijkers toe", - "PARTICIPANTS": "Deelnemers", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} zullen geen foto's meer kunnen toevoegen aan dit album

Ze zullen nog steeds bestaande foto's kunnen verwijderen die door hen zijn toegevoegd

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} zal foto's aan het album kunnen toevoegen", - "CONVERT_TO_VIEWER": "Ja, converteren naar kijker", - "CONVERT_TO_COLLABORATOR": "Ja, converteren naar samenwerker", - "CHANGE_PERMISSION": "Rechten aanpassen?", - "REMOVE_PARTICIPANT": "Verwijderen?", - "CONFIRM_REMOVE": "Ja, verwijderen", - "MANAGE": "Beheren", - "ADDED_AS": "Toegevoegd als", - "COLLABORATOR_RIGHTS": "Samenwerkers kunnen foto's en video's toevoegen aan het gedeelde album", - "REMOVE_PARTICIPANT_HEAD": "Deelnemer verwijderen", - "OWNER": "Eigenaar", - "COLLABORATORS": "Samenwerker", - "ADD_MORE": "Meer toevoegen", - "VIEWERS": "Kijkers", - "OR_ADD_EXISTING": "Of kies een bestaande", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} zullen worden verwijderd uit het gedeelde album

Alle door hen toegevoegde foto's worden ook uit het album verwijderd

", - "NOT_FOUND": "404 - niet gevonden", - "LINK_EXPIRED": "Link verlopen", - "LINK_EXPIRED_MESSAGE": "Deze link is verlopen of uitgeschakeld!", - "MANAGE_LINK": "Link beheren", - "LINK_TOO_MANY_REQUESTS": "Dit album is te populair voor ons om te verwerken!", - "FILE_DOWNLOAD": "Downloads toestaan", - "LINK_PASSWORD_LOCK": "Wachtwoord versleuteling", - "PUBLIC_COLLECT": "Foto's toevoegen toestaan", - "LINK_DEVICE_LIMIT": "Apparaat limiet", - "NO_DEVICE_LIMIT": "Geen", - "LINK_EXPIRY": "Vervaldatum link", - "NEVER": "Nooit", - "DISABLE_FILE_DOWNLOAD": "Download uitschakelen", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Weet u zeker dat u de downloadknop voor bestanden wilt uitschakelen?

Kijkers kunnen nog steeds screenshots maken of een kopie van uw foto's opslaan met behulp van externe hulpmiddelen.

", - "MALICIOUS_CONTENT": "Bevat kwaadwillende inhoud", - "COPYRIGHT": "Schending van het auteursrecht van iemand die ik mag vertegenwoordigen", - "SHARED_USING": "Gedeeld via ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Gebruik code {{referralCode}} om 10 GB gratis te krijgen", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Schakel cijfercode vergrendeling uit", - "DISABLE_PASSWORD_MESSAGE": "Weet u zeker dat u de cijfercode vergrendeling wilt uitschakelen?", - "PASSWORD_LOCK": "Cijfercode vergrendeling", - "LOCK": "Vergrendeling", - "DOWNLOAD_UPLOAD_LOGS": "Logboeken voor foutmeldingen", - "UPLOAD_FILES": "Bestand", - "UPLOAD_DIRS": "Map", - "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", - "DEDUPLICATE_FILES": "Dubbele bestanden verwijderen", - "AUTHENTICATOR_SECTION": "Verificatie apparaat", - "NO_DUPLICATES_FOUND": "Je hebt geen dubbele bestanden die kunnen worden gewist", - "CLUB_BY_CAPTURE_TIME": "Samenvoegen op tijd", - "FILES": "Bestanden", - "EACH": "Elke", - "DEDUPLICATE_BASED_ON_SIZE": "De volgende bestanden zijn samengevoegd op basis van hun groottes. Controleer en verwijder items waarvan je denkt dat ze dubbel zijn", - "STOP_ALL_UPLOADS_MESSAGE": "Weet u zeker dat u wilt stoppen met alle uploads die worden uitgevoerd?", - "STOP_UPLOADS_HEADER": "Stoppen met uploaden?", - "YES_STOP_UPLOADS": "Ja, stop uploaden", - "STOP_DOWNLOADS_HEADER": "Downloaden stoppen?", - "YES_STOP_DOWNLOADS": "Ja, downloads stoppen", - "STOP_ALL_DOWNLOADS_MESSAGE": "Weet je zeker dat je wilt stoppen met alle downloads die worden uitgevoerd?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", - "ALL_ALBUMS": "Alle albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "Alle verborgen albums", - "HIDDEN_ALBUMS": "Verborgen albums", - "HIDDEN_ITEMS": "Verborgen bestanden", - "HIDDEN_ITEMS_SECTION_NAME": "Verborgen_items", - "ENTER_TWO_FACTOR_OTP": "Voer de 6-cijferige code van uw verificatie app in.", - "CREATE_ACCOUNT": "Account aanmaken", - "COPIED": "Gekopieerd", - "CANVAS_BLOCKED_TITLE": "Kan thumbnail niet genereren", - "CANVAS_BLOCKED_MESSAGE": "

Het lijkt erop dat uw browser geen toegang heeft tot canvas, die nodig is om thumbnails voor uw foto's te genereren

Schakel toegang tot het canvas van uw browser in, of bekijk onze desktop app

", - "WATCH_FOLDERS": "Monitor mappen", - "UPGRADE_NOW": "Nu upgraden", - "RENEW_NOW": "Nu verlengen", - "STORAGE": "Opslagruimte", - "USED": "gebruikt", - "YOU": "Jij", - "FAMILY": "Familie", - "FREE": "free", - "OF": "van", - "WATCHED_FOLDERS": "Gemonitorde mappen", - "NO_FOLDERS_ADDED": "Nog geen mappen toegevoegd!", - "FOLDERS_AUTOMATICALLY_MONITORED": "De mappen die u hier toevoegt worden automatisch gemonitord", - "UPLOAD_NEW_FILES_TO_ENTE": "Nieuwe bestanden uploaden naar ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Verwijderde bestanden van ente opruimen", - "ADD_FOLDER": "Map toevoegen", - "STOP_WATCHING": "Stop monitoren", - "STOP_WATCHING_FOLDER": "Stop monitoren van map?", - "STOP_WATCHING_DIALOG_MESSAGE": "Uw bestaande bestanden zullen niet worden verwijderd, maar ente stopt met het automatisch bijwerken van het gekoppelde ente album bij wijzigingen in deze map.", - "YES_STOP": "Ja, stop", - "MONTH_SHORT": "mo", - "YEAR": "jaar", - "FAMILY_PLAN": "Familie abonnement", - "DOWNLOAD_LOGS": "Logboek downloaden", - "DOWNLOAD_LOGS_MESSAGE": "

Dit zal logboeken downloaden, die u ons kunt e-mailen om te helpen bij het debuggen van uw probleem.

Houd er rekening mee dat bestandsnamen worden opgenomen om problemen met specifieke bestanden bij te houden.

", - "CHANGE_FOLDER": "Map wijzigen", - "TWO_MONTHS_FREE": "Krijg 2 maanden gratis op jaarlijkse abonnementen", - "GB": "GB", - "POPULAR": "Populair", - "FREE_PLAN_OPTION_LABEL": "Doorgaan met gratis account", - "FREE_PLAN_DESCRIPTION": "1 GB voor 1 jaar", - "CURRENT_USAGE": "Huidig gebruik is {{usage}}", - "WEAK_DEVICE": "De webbrowser die u gebruikt is niet krachtig genoeg om uw foto's te versleutelen. Probeer in te loggen op uw computer, of download de ente mobiel/desktop app.", - "DRAG_AND_DROP_HINT": "Of sleep en plaats in het ente venster", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Uw geüploade gegevens worden gepland voor verwijdering, en uw account zal permanent worden verwijderd.

Deze actie is onomkeerbaar.", - "AUTHENTICATE": "Verifiëren", - "UPLOADED_TO_SINGLE_COLLECTION": "Geüpload naar enkele collectie", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Geüpload naar verschillende collecties", - "NEVERMIND": "Laat maar", - "UPDATE_AVAILABLE": "Update beschikbaar", - "UPDATE_INSTALLABLE_MESSAGE": "Er staat een nieuwe versie van ente klaar om te worden geïnstalleerd.", - "INSTALL_NOW": "Nu installeren", - "INSTALL_ON_NEXT_LAUNCH": "Installeren bij volgende start", - "UPDATE_AVAILABLE_MESSAGE": "Er is een nieuwe versie van ente vrijgegeven, maar deze kan niet automatisch worden gedownload en geïnstalleerd.", - "DOWNLOAD_AND_INSTALL": "Downloaden en installeren", - "IGNORE_THIS_VERSION": "Negeer deze versie", - "TODAY": "Vandaag", - "YESTERDAY": "Gisteren", - "NAME_PLACEHOLDER": "Naam...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Kan geen albums maken uit bestand/map mix", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Je hebt een mix van bestanden en mappen gesleept en laten vallen.

Geef ofwel alleen bestanden aan, of alleen mappen bij het selecteren van de optie om afzonderlijke albums te maken

", - "CHOSE_THEME": "Kies thema", - "ML_SEARCH": "ML zoeken (bèta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Dit zal algoritmes op het apparaat inschakelen die zullen beginnen met het lokaal analyseren van uw geüploade foto's.

Voor het eerst na inloggen of het inschakelen van deze functie zal het alle afbeeldingen op het lokale apparaat downloaden om ze te analyseren. Schakel dit dus alleen in als je akkoord bent met gegevensverbruik en lokale verwerking van alle afbeeldingen in uw fotobibliotheek.

Als dit de eerste keer is dat uw dit inschakelt, vragen we u ook om toestemming om gegevens te verwerken.

", - "ML_MORE_DETAILS": "Meer details", - "ENABLE_FACE_SEARCH": "Zoeken op gezichten inschakelen", - "ENABLE_FACE_SEARCH_TITLE": "Zoeken op gezichten inschakelen?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Als u zoeken op gezichten inschakelt, analyseert ente de gezichtsgeometrie uit uw foto's. Dit gebeurt op uw apparaat en alle gegenereerde biometrische gegevens worden end-to-end versleuteld.

Klik hier voor meer informatie over deze functie in ons privacybeleid

", - "DISABLE_BETA": "Bèta uitschakelen", - "DISABLE_FACE_SEARCH": "Zoeken op gezichten uitschakelen", - "DISABLE_FACE_SEARCH_TITLE": "Zoeken op gezichten uitschakelen?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente zal stoppen met het analyseren van de gezichtsgeometrie, en zal ML zoeken (beta) uitschakelen

U kan zoeken op gezichten opnieuw inschakelen wanneer u wilt, dus deze handeling is veilig.

", - "ADVANCED": "Geavanceerd", - "FACE_SEARCH_CONFIRMATION": "Ik begrijp het, en wil ente toestaan om gezichten te analyseren", - "LABS": "Lab's", - "YOURS": "jouw", - "PASSPHRASE_STRENGTH_WEAK": "Wachtwoord sterkte: Zwak", - "PASSPHRASE_STRENGTH_MODERATE": "Wachtwoord sterkte: Matig", - "PASSPHRASE_STRENGTH_STRONG": "Wachtwoord sterkte: Sterk", - "PREFERENCES": "Instellingen", - "LANGUAGE": "Taal", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Ongeldige export map", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

De export map die u heeft geselecteerd bestaat niet.

Selecteer een geldige map.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Abonnementsverificatie mislukt", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "na één uur", - "DAY": "na één dag", - "WEEK": "na één week", - "MONTH": "na één maand", - "YEAR": "na één jaar" - }, - "COPY_LINK": "Link kopiëren", - "DONE": "Voltooid", - "LINK_SHARE_TITLE": "Of deel een link", - "REMOVE_LINK": "Link verwijderen", - "CREATE_PUBLIC_SHARING": "Maak publieke link", - "PUBLIC_LINK_CREATED": "Publieke link aangemaakt", - "PUBLIC_LINK_ENABLED": "Publieke link ingeschakeld", - "COLLECT_PHOTOS": "Foto's verzamelen", - "PUBLIC_COLLECT_SUBTEXT": "Sta toe dat mensen met de link ook foto's kunnen toevoegen aan het gedeelde album.", - "STOP_EXPORT": "Stoppen", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} bestanden geëxporteerd", - "MIGRATING_EXPORT": "Voorbereiden...", - "RENAMING_COLLECTION_FOLDERS": "Albumnamen hernoemen...", - "TRASHING_DELETED_FILES": "Verwijderde bestanden naar prullenbak...", - "TRASHING_DELETED_COLLECTIONS": "Verwijderde albums naar prullenbak...", - "EXPORT_NOTIFICATION": { - "START": "Exporteren begonnen", - "IN_PROGRESS": "Exporteren is al bezig", - "FINISH": "Exporteren voltooid", - "UP_TO_DATE": "Geen nieuwe bestanden om te exporteren" - }, - "CONTINUOUS_EXPORT": "Continue synchroniseren", - "TOTAL_ITEMS": "Totaal aantal bestanden", - "PENDING_ITEMS": "Bestanden in behandeling", - "EXPORT_STARTING": "Exporteren begonnen...", - "DELETE_ACCOUNT_REASON_LABEL": "Wat is de belangrijkste reden waarom je jouw account verwijdert?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Kies een reden", - "DELETE_REASON": { - "MISSING_FEATURE": "Ik mis een belangrijke functie", - "BROKEN_BEHAVIOR": "De app of een bepaalde functie functioneert niet zoals ik verwacht", - "FOUND_ANOTHER_SERVICE": "Ik heb een andere dienst gevonden die me beter bevalt", - "NOT_LISTED": "Mijn reden wordt niet vermeld" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "We vinden het jammer je te zien gaan. Deel alsjeblieft je feedback om ons te helpen verbeteren.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Feedback", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Ja, ik wil permanent mijn account inclusief alle gegevens verwijderen", - "CONFIRM_DELETE_ACCOUNT": "Account verwijderen bevestigen", - "FEEDBACK_REQUIRED": "Help ons alsjeblieft met deze informatie", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "Wat doet de andere dienst beter?", - "RECOVER_TWO_FACTOR": "Herstel tweestaps", - "at": "om", - "AUTH_NEXT": "volgende", - "AUTH_DOWNLOAD_MOBILE_APP": "Download onze mobiele app om uw geheimen te beheren", - "HIDDEN": "Verborgen", - "HIDE": "Verbergen", - "UNHIDE": "Zichtbaar maken", - "UNHIDE_TO_COLLECTION": "Zichtbaar maken in album", - "SORT_BY": "Sorteren op", - "NEWEST_FIRST": "Nieuwste eerst", - "OLDEST_FIRST": "Oudste eerst", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Dit bestand kan niet worden bekeken in de app, klik hier om het origineel te downloaden", - "SELECT_COLLECTION": "Album selecteren", - "PIN_ALBUM": "Album bovenaan vastzetten", - "UNPIN_ALBUM": "Album losmaken", - "DOWNLOAD_COMPLETE": "Download compleet", - "DOWNLOADING_COLLECTION": "{{name}} downloaden", - "DOWNLOAD_FAILED": "Download mislukt", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} bestanden", - "CHRISTMAS": "Kerst", - "CHRISTMAS_EVE": "Kerstavond", - "NEW_YEAR": "Nieuwjaar", - "NEW_YEAR_EVE": "Oudjaarsavond", - "IMAGE": "Afbeelding", - "VIDEO": "Video", - "LIVE_PHOTO": "Live foto", - "CONVERT": "Converteren", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Weet u zeker dat u de editor wilt afsluiten?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Download uw bewerkte afbeelding of sla een kopie op in ente om uw wijzigingen te behouden.", - "BRIGHTNESS": "Helderheid", - "CONTRAST": "Contrast", - "SATURATION": "Saturatie", - "BLUR": "Vervagen", - "INVERT_COLORS": "Kleuren omkeren", - "ASPECT_RATIO": "Beeldverhouding", - "SQUARE": "Vierkant", - "ROTATE_LEFT": "Roteer links", - "ROTATE_RIGHT": "Roteer rechts", - "FLIP_VERTICALLY": "Verticaal spiegelen", - "FLIP_HORIZONTALLY": "Horizontaal spiegelen", - "DOWNLOAD_EDITED": "Download Bewerkt", - "SAVE_A_COPY_TO_ENTE": "Kopie in ente opslaan", - "RESTORE_ORIGINAL": "Origineel herstellen", - "TRANSFORM": "Transformeer", - "COLORS": "Kleuren", - "FLIP": "Omdraaien", - "ROTATION": "Draaiing", - "RESET": "Herstellen", - "PHOTO_EDITOR": "Fotobewerker", - "FASTER_UPLOAD": "Snellere uploads", - "FASTER_UPLOAD_DESCRIPTION": "Uploaden door nabije servers", - "MAGIC_SEARCH_STATUS": "Magische Zoekfunctie Status", - "INDEXED_ITEMS": "Geïndexeerde bestanden", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "Cache map", - "FREEHAND": "Losse hand", - "APPLY_CROP": "Bijsnijden toepassen", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Tenminste één transformatie of kleuraanpassing moet worden uitgevoerd voordat u opslaat.", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/pt-BR/translation.json b/web/apps/cast/public/locales/pt-BR/translation.json deleted file mode 100644 index 0da001742..000000000 --- a/web/apps/cast/public/locales/pt-BR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backups privados
para as suas memórias
", - "HERO_SLIDE_1": "Criptografia de ponta a ponta por padrão", - "HERO_SLIDE_2_TITLE": "
Armazenado com segurança
em um abrigo avançado
", - "HERO_SLIDE_2": "Feito para ter logenvidade", - "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registrar", - "NEW_USER": "Novo no ente", - "EXISTING_USER": "Usuário existente", - "ENTER_NAME": "Insira o nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Adicione um nome para que os seus amigos saibam a quem agradecer por estas ótimas fotos!", - "ENTER_EMAIL": "Insira o endereço de e-mail", - "EMAIL_ERROR": "Inserir um endereço de e-mail válido", - "REQUIRED": "Obrigatório", - "EMAIL_SENT": "Código de verificação enviado para {{email}}", - "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", - "ENTER_OTT": "Código de verificação", - "RESEND_MAIL": "Reenviar código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Ocorreu um erro. Tente novamente", - "INVALID_CODE": "Código de verificação inválido", - "EXPIRED_CODE": "O seu código de verificação expirou", - "SENDING": "Enviando...", - "SENT": "Enviado!", - "PASSWORD": "Senha", - "LINK_PASSWORD": "Insira a senha para desbloquear o álbum", - "RETURN_PASSPHRASE_HINT": "Senha", - "SET_PASSPHRASE": "Definir senha", - "VERIFY_PASSPHRASE": "Iniciar sessão", - "INCORRECT_PASSPHRASE": "Palavra-passe incorreta", - "ENTER_ENC_PASSPHRASE": "Por favor, digite uma senha que podemos usar para criptografar seus dados", - "PASSPHRASE_DISCLAIMER": "Não armazenamos sua senha, portanto, se você esquecê-la, não poderemos ajudarna recuperação de seus dados sem uma chave de recuperação.", - "WELCOME_TO_ENTE_HEADING": "Bem-vindo ao ", - "WELCOME_TO_ENTE_SUBHEADING": "Armazenamento criptografado de ponta a ponta de fotos e compartilhamento", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Onde suas melhores fotos vivem", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Gerando chaves de criptografia...", - "PASSPHRASE_HINT": "Senha", - "CONFIRM_PASSPHRASE": "Confirmar senha", - "REFERRAL_CODE_HINT": "Como você ouviu sobre o Ente? (opcional)", - "REFERRAL_INFO": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", - "PASSPHRASE_MATCH_ERROR": "As senhas não coincidem", - "CREATE_COLLECTION": "Novo álbum", - "ENTER_ALBUM_NAME": "Nome do álbum", - "CLOSE_OPTION": "Fechar (Esc)", - "ENTER_FILE_NAME": "Nome do arquivo", - "CLOSE": "Fechar", - "NO": "Não", - "NOTHING_HERE": "Nada para ver aqui! 👀", - "UPLOAD": "Enviar", - "IMPORT": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", - "SELECT_PHOTOS": "Selecionar fotos", - "FILE_UPLOAD": "Envio de Arquivo", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparando para enviar", - "1": "Lendo arquivos de metadados do google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} metadados dos arquivos extraídos", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} arquivos processados", - "4": "Cancelando envios restante", - "5": "Backup concluído" - }, - "FILE_NOT_UPLOADED_LIST": "Os seguintes arquivos não foram enviados", - "SUBSCRIPTION_EXPIRED": "Assinatura expirada", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Sua assinatura expirou, por favor renove-a", - "STORAGE_QUOTA_EXCEEDED": "Limite de armazenamento excedido", - "INITIAL_LOAD_DELAY_WARNING": "Primeiro carregamento pode levar algum tempo", - "USER_DOES_NOT_EXIST": "Desculpe, não foi possível encontrar um usuário com este e-mail", - "NO_ACCOUNT": "Não possui uma conta", - "ACCOUNT_EXISTS": "Já possui uma conta", - "CREATE": "Criar", - "DOWNLOAD": "Baixar", - "DOWNLOAD_OPTION": "Baixar (D)", - "DOWNLOAD_FAVORITES": "Baixar favoritos", - "DOWNLOAD_UNCATEGORIZED": "Baixar não categorizado", - "DOWNLOAD_HIDDEN_ITEMS": "Baixar itens ocultos", - "COPY_OPTION": "Copiar como PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Mudar para tela cheia (F)", - "ZOOM_IN_OUT": "Ampliar/Reduzir", - "PREVIOUS": "Anterior (←)", - "NEXT": "Próximo (→)", - "TITLE_PHOTOS": "Ente Fotos", - "TITLE_ALBUMS": "Ente Fotos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Envie sua primeira foto", - "IMPORT_YOUR_FOLDERS": "Importar suas pastas", - "UPLOAD_DROPZONE_MESSAGE": "Arraste para salvar seus arquivos", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Arraste para adicionar pasta monitorada", - "TRASH_FILES_TITLE": "Excluir arquivos?", - "TRASH_FILE_TITLE": "Excluir arquivo?", - "DELETE_FILES_TITLE": "Excluir imediatamente?", - "DELETE_FILES_MESSAGE": "Os arquivos selecionados serão excluídos permanentemente da sua conta ente.", - "DELETE": "Excluir", - "DELETE_OPTION": "Excluir (DEL)", - "FAVORITE_OPTION": "Favorito (L)", - "UNFAVORITE_OPTION": "Remover Favorito (L)", - "MULTI_FOLDER_UPLOAD": "Várias pastas detectadas", - "UPLOAD_STRATEGY_CHOICE": "Gostaria de enviá-los para", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Um único álbum", - "OR": "ou", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Álbuns separados", - "SESSION_EXPIRED_MESSAGE": "A sua sessão expirou. Por favor inicie sessão novamente para continuar", - "SESSION_EXPIRED": "Sessão expirada", - "PASSWORD_GENERATION_FAILED": "Seu navegador foi incapaz de gerar uma chave forte que atende aos padrões de criptografia, por favor, tente usar o aplicativo móvel ou outro navegador", - "CHANGE_PASSWORD": "Alterar senha", - "GO_BACK": "Voltar", - "RECOVERY_KEY": "Chave de recuperação", - "SAVE_LATER": "Fazer isso mais tarde", - "SAVE": "Salvar Chave", - "RECOVERY_KEY_DESCRIPTION": "Caso você esqueça sua senha, a única maneira de recuperar seus dados é com essa chave.", - "RECOVER_KEY_GENERATION_FAILED": "Não foi possível gerar o código de recuperação, tente novamente", - "KEY_NOT_STORED_DISCLAIMER": "Não armazenamos essa chave, por favor, salve essa chave de palavras em um lugar seguro", - "FORGOT_PASSWORD": "Esqueci a senha", - "RECOVER_ACCOUNT": "Recuperar conta", - "RECOVERY_KEY_HINT": "Chave de recuperação", - "RECOVER": "Recuperar", - "NO_RECOVERY_KEY": "Não possui a chave de recuperação?", - "INCORRECT_RECOVERY_KEY": "Chave de recuperação incorreta", - "SORRY": "Desculpe", - "NO_RECOVERY_KEY_MESSAGE": "Devido à natureza do nosso protocolo de criptografia de ponta a ponta, seus dados não podem ser descriptografados sem sua senha ou chave de recuperação", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Por favor, envie um e-mail para {{emailID}} a partir do seu endereço de e-mail registrado", - "CONTACT_SUPPORT": "Falar com o suporte", - "REQUEST_FEATURE": "Solicitar Funcionalidade", - "SUPPORT": "Suporte", - "CONFIRM": "Confirmar", - "CANCEL": "Cancelar", - "LOGOUT": "Encerrar sessão", - "DELETE_ACCOUNT": "Excluir conta", - "DELETE_ACCOUNT_MESSAGE": "

Por favor, envie um e-mail para {{emailID}} a partir do seu endereço de e-mail registrado.

Seu pedido será processado dentro de 72 horas.

", - "LOGOUT_MESSAGE": "Você tem certeza que deseja encerrar a sessão?", - "CHANGE_EMAIL": "Mudar e-mail", - "OK": "Aceitar", - "SUCCESS": "Bem-sucedido", - "ERROR": "Erro", - "MESSAGE": "Mensagem", - "INSTALL_MOBILE_APP": "Instale nosso aplicativo Android ou iOS para fazer backup automático de todas as suas fotos", - "DOWNLOAD_APP_MESSAGE": "Desculpe, esta operação só é suportada em nosso aplicativo para computador", - "DOWNLOAD_APP": "Baixar aplicativo para computador", - "EXPORT": "Exportar dados", - "SUBSCRIPTION": "Assinatura", - "SUBSCRIBE": "Assinar", - "MANAGEMENT_PORTAL": "Gerenciar métodos de pagamento", - "MANAGE_FAMILY_PORTAL": "Gerenciar Família", - "LEAVE_FAMILY_PLAN": "Sair do plano familiar", - "LEAVE": "Sair", - "LEAVE_FAMILY_CONFIRM": "Tem certeza que deseja sair do plano familiar?", - "CHOOSE_PLAN": "Escolha seu plano", - "MANAGE_PLAN": "Gerenciar sua assinatura", - "ACTIVE": "Ativo", - "OFFLINE_MSG": "Você está offline, memórias em cache estão sendo mostradas", - "FREE_SUBSCRIPTION_INFO": "Você está no plano gratuito que expira em {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Você está em um plano familiar gerenciado por", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renovações em {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Termina em {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Sua assinatura será cancelada em {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Seu complemento {{storage, string}} é válido até o dia {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Você excedeu sua cota de armazenamento, por favor atualize", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Recebemos o seu pagamento

Sua assinatura é válida até {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Sua compra foi cancelada, por favor, tente novamente se quiser assinar", - "SUBSCRIPTION_PURCHASE_FAILED": "Falha na compra de assinatura, tente novamente", - "SUBSCRIPTION_UPDATE_FAILED": "Falha ao atualizar assinatura, tente novamente", - "UPDATE_PAYMENT_METHOD_MESSAGE": "Desculpe-nos, o pagamento falhou quando tentamos cobrar o seu cartão, por favor atualize seu método de pagamento e tente novamente", - "STRIPE_AUTHENTICATION_FAILED": "Não foi possível autenticar seu método de pagamento. Por favor, escolha outro método de pagamento e tente novamente", - "UPDATE_PAYMENT_METHOD": "Atualizar forma de pagamento", - "MONTHLY": "Mensal", - "YEARLY": "Anual", - "UPDATE_SUBSCRIPTION_MESSAGE": "Tem certeza que deseja trocar de plano?", - "UPDATE_SUBSCRIPTION": "Mudar de plano", - "CANCEL_SUBSCRIPTION": "Cancelar assinatura", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Todos os seus dados serão excluídos dos nossos servidores no final deste período de cobrança.

Você tem certeza que deseja cancelar sua assinatura?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Tem certeza que deseja cancelar sua assinatura?

", - "SUBSCRIPTION_CANCEL_FAILED": "Falha ao cancelar a assinatura", - "SUBSCRIPTION_CANCEL_SUCCESS": "Assinatura cancelada com sucesso", - "REACTIVATE_SUBSCRIPTION": "Reativar assinatura", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Uma vez reativado, você será cobrado em {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Assinatura ativada com sucesso ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Falha ao reativar as renovações de assinaturas", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Obrigado", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancelar assinatura móvel", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Por favor, cancele sua assinatura do aplicativo móvel para ativar uma assinatura aqui", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Entre em contato com {{emailID}} para gerenciar sua assinatura", - "RENAME": "Renomear", - "RENAME_FILE": "Renomear arquivo", - "RENAME_COLLECTION": "Renomear álbum", - "DELETE_COLLECTION_TITLE": "Excluir álbum?", - "DELETE_COLLECTION": "Excluir álbum", - "DELETE_COLLECTION_MESSAGE": "Também excluir as fotos (e vídeos) presentes neste álbum de todos os outros álbuns dos quais eles fazem parte?", - "DELETE_PHOTOS": "Excluir fotos", - "KEEP_PHOTOS": "Manter fotos", - "SHARE": "Compartilhar", - "SHARE_COLLECTION": "Compartilhar álbum", - "SHAREES": "Compartilhado com", - "SHARE_WITH_SELF": "Você não pode compartilhar consigo mesmo", - "ALREADY_SHARED": "Ops, você já está compartilhando isso com {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Álbum compartilhado não permitido", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Compartilhamento está desabilitado para contas gratuitas", - "DOWNLOAD_COLLECTION": "Baixar álbum", - "DOWNLOAD_COLLECTION_MESSAGE": "

Tem certeza que deseja baixar o álbum completo?

Todos os arquivos serão colocados na fila para baixar sequencialmente

", - "CREATE_ALBUM_FAILED": "Falha ao criar álbum, por favor tente novamente", - "SEARCH": "Pesquisar", - "SEARCH_RESULTS": "Resultados de pesquisa", - "NO_RESULTS": "Nenhum resultado encontrado", - "SEARCH_HINT": "Pesquisar por álbuns, datas, descrições, ...", - "SEARCH_TYPE": { - "COLLECTION": "Álbum", - "LOCATION": "Local", - "CITY": "Local", - "DATE": "Data", - "FILE_NAME": "Nome do arquivo", - "THING": "Conteúdo", - "FILE_CAPTION": "Descrição", - "FILE_TYPE": "Tipo de arquivo", - "CLIP": "Mágica" - }, - "photos_count_zero": "Sem memórias", - "photos_count_one": "1 memória", - "photos_count_other": "{{count, number}} memórias", - "TERMS_AND_CONDITIONS": "Eu concordo com os termos e a política de privacidade", - "ADD_TO_COLLECTION": "Adicionar ao álbum", - "SELECTED": "selecionado", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Este vídeo não pode ser reproduzido no seu navegador", - "PEOPLE": "Pessoas", - "INDEXING_SCHEDULED": "Indexação está programada...", - "ANALYZING_PHOTOS": "Indexando fotos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indexando pessoas em {{indexStatus.nSyncedFiles,number}} fotos...", - "INDEXING_DONE": "Foram indexadas {{indexStatus.nSyncedFiles,number}} fotos", - "UNIDENTIFIED_FACES": "rostos não identificados", - "OBJECTS": "objetos", - "TEXT": "texto", - "INFO": "Informação ", - "INFO_OPTION": "Informação (I)", - "FILE_NAME": "Nome do arquivo", - "CAPTION_PLACEHOLDER": "Adicionar uma descrição", - "LOCATION": "Local", - "SHOW_ON_MAP": "Ver no OpenStreetMap", - "MAP": "Mapa", - "MAP_SETTINGS": "Ajustes do mapa", - "ENABLE_MAPS": "Habilitar mapa?", - "ENABLE_MAP": "Habilitar mapa", - "DISABLE_MAPS": "Desativar Mapas?", - "ENABLE_MAP_DESCRIPTION": "Isto mostrará suas fotos em um mapa do mundo.

Este mapa é hospedado pelo OpenStreetMap , e os exatos locais de suas fotos nunca são compartilhados.

Você pode desativar esse recurso a qualquer momento nas Configurações.

", - "DISABLE_MAP_DESCRIPTION": "

Isto irá desativar a exibição de suas fotos em um mapa mundial.

Você pode ativar este recurso a qualquer momento nas Configurações.

", - "DISABLE_MAP": "Desabilitar mapa", - "DETAILS": "Detalhes", - "VIEW_EXIF": "Ver todos os dados EXIF", - "NO_EXIF": "Sem dados EXIF", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Dois fatores", - "TWO_FACTOR_AUTHENTICATION": "Autenticação de dois fatores", - "TWO_FACTOR_QR_INSTRUCTION": "Digitalize o código QR abaixo com o seu aplicativo de autenticador favorito", - "ENTER_CODE_MANUALLY": "Inserir código manualmente", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Por favor, insira este código no seu aplicativo autenticador favorito", - "SCAN_QR_CODE": "Em vez disso, escaneie um Código QR", - "ENABLE_TWO_FACTOR": "Ativar autenticação de dois fatores", - "ENABLE": "Habilitar", - "LOST_DEVICE": "Dispositivo de dois fatores perdido", - "INCORRECT_CODE": "Código incorreto", - "TWO_FACTOR_INFO": "Adicione uma camada adicional de segurança, exigindo mais do que seu e-mail e senha para entrar na sua conta", - "DISABLE_TWO_FACTOR_LABEL": "Desativar autenticação de dois fatores", - "UPDATE_TWO_FACTOR_LABEL": "Atualize seu dispositivo autenticador", - "DISABLE": "Desativar", - "RECONFIGURE": "Reconfigurar", - "UPDATE_TWO_FACTOR": "Atualizar dois fatores", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuar adiante anulará qualquer autenticador configurado anteriormente", - "UPDATE": "Atualização", - "DISABLE_TWO_FACTOR": "Desativar autenticação de dois fatores", - "DISABLE_TWO_FACTOR_MESSAGE": "Você tem certeza de que deseja desativar a autenticação de dois fatores", - "TWO_FACTOR_DISABLE_FAILED": "Não foi possível desativar dois fatores, por favor tente novamente", - "EXPORT_DATA": "Exportar dados", - "SELECT_FOLDER": "Selecione a pasta", - "DESTINATION": "Destino", - "START": "Iniciar", - "LAST_EXPORT_TIME": "Data da última exportação", - "EXPORT_AGAIN": "Resincronizar", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Armazenamento local não acessível", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Seu navegador ou uma extensão está bloqueando o ente de salvar os dados no armazenamento local. Por favor, tente carregar esta página depois de alternar o modo de navegação.", - "SEND_OTT": "Enviar códigos OTP", - "EMAIl_ALREADY_OWNED": "Este e-mail já está em uso", - "ETAGS_BLOCKED": "

Não foi possível fazer o envio dos seguintes arquivos devido à configuração do seu navegador.

Por favor, desative quaisquer complementos que possam estar impedindo o ente de utilizar eTags para enviar arquivos grandes, ou utilize nosso aplicativo para computador para uma experiência de importação mais confiável.

", - "SKIPPED_VIDEOS_INFO": "

Atualmente, não oferecemos suporte para adicionar vídeos através de links públicos.

Para compartilhar vídeos, por favor, faça cadastro no ente e compartilhe com os destinatários pretendidos usando seus e-mails.

", - "LIVE_PHOTOS_DETECTED": "Os arquivos de foto e vídeo das suas Fotos em Movimento foram mesclados em um único arquivo", - "RETRY_FAILED": "Repetir envios que falharam", - "FAILED_UPLOADS": "Envios com falhas ", - "SKIPPED_FILES": "Envios ignorados", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Falha ao gerar miniaturas", - "UNSUPPORTED_FILES": "Arquivos não suportados", - "SUCCESSFUL_UPLOADS": "Envios bem sucedidos", - "SKIPPED_INFO": "Ignorar estes como existem arquivos com nomes correspondentes no mesmo álbum", - "UNSUPPORTED_INFO": "ente ainda não suporta estes formatos de arquivo", - "BLOCKED_UPLOADS": "Envios bloqueados", - "SKIPPED_VIDEOS": "Vídeos ignorados", - "INPROGRESS_METADATA_EXTRACTION": "Em andamento", - "INPROGRESS_UPLOADS": "Envios em andamento", - "TOO_LARGE_UPLOADS": "Arquivos grandes", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Armazenamento insuficiente", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "Estes arquivos não foram carregados pois excedem o tamanho máximo para seu plano de armazenamento", - "TOO_LARGE_INFO": "Estes arquivos não foram carregados pois excedem nosso limite máximo de tamanho de arquivo", - "THUMBNAIL_GENERATION_FAILED_INFO": "Estes arquivos foram enviados, mas infelizmente não conseguimos gerar as miniaturas para eles.", - "UPLOAD_TO_COLLECTION": "Enviar para o álbum", - "UNCATEGORIZED": "Sem categoria", - "ARCHIVE": "Arquivar", - "FAVORITES": "Favoritos", - "ARCHIVE_COLLECTION": "Arquivar álbum", - "ARCHIVE_SECTION_NAME": "Arquivar", - "ALL_SECTION_NAME": "Todos", - "MOVE_TO_COLLECTION": "Mover para álbum", - "UNARCHIVE": "Desarquivar", - "UNARCHIVE_COLLECTION": "Desarquivar álbum", - "HIDE_COLLECTION": "Ocultar álbum", - "UNHIDE_COLLECTION": "Reexibir álbum", - "MOVE": "Mover", - "ADD": "Adicionar", - "REMOVE": "Remover", - "YES_REMOVE": "Sim, remover", - "REMOVE_FROM_COLLECTION": "Remover do álbum", - "TRASH": "Lixeira", - "MOVE_TO_TRASH": "Mover para a lixeira", - "TRASH_FILES_MESSAGE": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.", - "TRASH_FILE_MESSAGE": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.", - "DELETE_PERMANENTLY": "Excluir permanentemente", - "RESTORE": "Restaurar", - "RESTORE_TO_COLLECTION": "Restaurar para álbum", - "EMPTY_TRASH": "Esvaziar a lixeira", - "EMPTY_TRASH_TITLE": "Esvaziar a lixeira?", - "EMPTY_TRASH_MESSAGE": "Estes arquivos serão excluídos permanentemente da sua conta do ente.", - "LEAVE_SHARED_ALBUM": "Sim, sair", - "LEAVE_ALBUM": "Sair do álbum", - "LEAVE_SHARED_ALBUM_TITLE": "Sair do álbum compartilhado?", - "LEAVE_SHARED_ALBUM_MESSAGE": "Você deixará o álbum e ele deixará de ser visível para você.", - "NOT_FILE_OWNER": "Você não pode excluir arquivos em um álbum compartilhado", - "CONFIRM_SELF_REMOVE_MESSAGE": "Os itens selecionados serão removidos deste álbum. Itens que estão somente neste álbum serão movidos a aba Sem Categoria.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Alguns dos itens que você está removendo foram adicionados por outras pessoas, e você perderá o acesso a eles.", - "SORT_BY_CREATION_TIME_ASCENDING": "Mais antigo", - "SORT_BY_UPDATION_TIME_DESCENDING": "Última atualização", - "SORT_BY_NAME": "Nome", - "COMPRESS_THUMBNAILS": "Compactar miniaturas", - "THUMBNAIL_REPLACED": "Miniaturas compactadas", - "FIX_THUMBNAIL": "Compactar", - "FIX_THUMBNAIL_LATER": "Compactar depois", - "REPLACE_THUMBNAIL_NOT_STARTED": "Algumas miniaturas de seus vídeos podem ser compactadas para economizar espaço. Você gostaria de compactá-las?", - "REPLACE_THUMBNAIL_COMPLETED": "Miniaturas compactadas com sucesso", - "REPLACE_THUMBNAIL_NOOP": "Você não tem nenhuma miniatura que possa ser compactadas mais", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Não foi possível compactar algumas das suas miniaturas, por favor tente novamente", - "FIX_CREATION_TIME": "Corrigir hora", - "FIX_CREATION_TIME_IN_PROGRESS": "Corrigindo horário", - "CREATION_TIME_UPDATED": "Hora do arquivo atualizado", - "UPDATE_CREATION_TIME_NOT_STARTED": "Selecione a carteira que você deseja usar", - "UPDATE_CREATION_TIME_COMPLETED": "Todos os arquivos atualizados com sucesso", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "A atualização do horário falhou para alguns arquivos, por favor, tente novamente", - "CAPTION_CHARACTER_LIMIT": "5000 caracteres no máximo", - "DATE_TIME_ORIGINAL": "Data e Hora Original", - "DATE_TIME_DIGITIZED": "Data e Hora Digitalizada", - "METADATA_DATE": "Data de Metadados", - "CUSTOM_TIME": "Tempo personalizado", - "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planos", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Falha ao abrir planos", - "INSTALL": "Instalar", - "SHARING_DETAILS": "Detalhes de compartilhamento", - "MODIFY_SHARING": "Modificar compartilhamento", - "ADD_COLLABORATORS": "Adicionar colaboradores", - "ADD_NEW_EMAIL": "Adicionar um novo email", - "shared_with_people_zero": "Compartilhar com pessoas específicas", - "shared_with_people_one": "Compartilhado com 1 pessoa", - "shared_with_people_other": "Compartilhado com {{count, number}} pessoas", - "participants_zero": "Nenhum participante", - "participants_one": "1 participante", - "participants_other": "{{count, number}} participantes", - "ADD_VIEWERS": "Adicionar visualizações", - "PARTICIPANTS": "Participantes", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} Não poderá adicionar mais fotos a este álbum

Eles ainda poderão remover as fotos existentes adicionadas por eles

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} poderá adicionar fotos ao álbum", - "CONVERT_TO_VIEWER": "Sim, converter para visualizador", - "CONVERT_TO_COLLABORATOR": "Sim, converter para colaborador", - "CHANGE_PERMISSION": "Alterar permissões?", - "REMOVE_PARTICIPANT": "Remover?", - "CONFIRM_REMOVE": "Sim, remover", - "MANAGE": "Gerenciar", - "ADDED_AS": "Adicionado como", - "COLLABORATOR_RIGHTS": "Os colaboradores podem adicionar fotos e vídeos ao álbum compartilhado", - "REMOVE_PARTICIPANT_HEAD": "Remover participante", - "OWNER": "Proprietário", - "COLLABORATORS": "Colaboradores", - "ADD_MORE": "Adicionar mais", - "VIEWERS": "Visualizações", - "OR_ADD_EXISTING": "Ou escolha um existente", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} será removido deste álbum compartilhado

Quaisquer fotos adicionadas por eles também serão removidas do álbum

", - "NOT_FOUND": "404 Página não encontrada", - "LINK_EXPIRED": "Link expirado", - "LINK_EXPIRED_MESSAGE": "Este link expirou ou foi desativado!", - "MANAGE_LINK": "Gerenciar link", - "LINK_TOO_MANY_REQUESTS": "Desculpe, este álbum foi visualizado em muitos dispositivos!", - "FILE_DOWNLOAD": "Permitir transferências", - "LINK_PASSWORD_LOCK": "Bloqueio de senha", - "PUBLIC_COLLECT": "Permitir adicionar fotos", - "LINK_DEVICE_LIMIT": "Limite de dispositivos", - "NO_DEVICE_LIMIT": "Nenhum", - "LINK_EXPIRY": "Expiração do link", - "NEVER": "Nunca", - "DISABLE_FILE_DOWNLOAD": "Desabilitar transferência", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Tem certeza de que deseja desativar o botão de download para arquivos?

Os visualizadores ainda podem capturar imagens da tela ou salvar uma cópia de suas fotos usando ferramentas externas.

", - "MALICIOUS_CONTENT": "Contém conteúdo malicioso", - "COPYRIGHT": "Viola os direitos autorais de alguém que estou autorizado a representar", - "SHARED_USING": "Compartilhar usando ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Use o código {{referralCode}} para obter 10 GB de graça", - "LIVE": "AO VIVO", - "DISABLE_PASSWORD": "Desativar bloqueio por senha", - "DISABLE_PASSWORD_MESSAGE": "Tem certeza que deseja desativar o bloqueio por senha?", - "PASSWORD_LOCK": "Bloqueio de senha", - "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuração", - "UPLOAD_FILES": "Arquivo", - "UPLOAD_DIRS": "Pasta", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "Arquivos Deduplicados", - "AUTHENTICATOR_SECTION": "Autenticação", - "NO_DUPLICATES_FOUND": "Você não tem arquivos duplicados que possam ser limpos", - "CLUB_BY_CAPTURE_TIME": "Agrupar por tempo de captura", - "FILES": "Arquivos", - "EACH": "Cada", - "DEDUPLICATE_BASED_ON_SIZE": "Os seguintes arquivos foram listados com base em seus tamanhos, por favor, reveja e exclua os itens que você acredita que são duplicados", - "STOP_ALL_UPLOADS_MESSAGE": "Tem certeza que deseja parar todos os envios em andamento?", - "STOP_UPLOADS_HEADER": "Parar envios?", - "YES_STOP_UPLOADS": "Sim, parar envios", - "STOP_DOWNLOADS_HEADER": "Parar transferências?", - "YES_STOP_DOWNLOADS": "Sim, parar transferências", - "STOP_ALL_DOWNLOADS_MESSAGE": "Tem certeza que deseja parar todos as transferências em andamento?", - "albums_one": "1 Álbum", - "albums_other": "{{count, number}} Álbuns", - "ALL_ALBUMS": "Todos os álbuns", - "ALBUMS": "Álbuns", - "ALL_HIDDEN_ALBUMS": "Todos os álbuns ocultos", - "HIDDEN_ALBUMS": "Álbuns ocultos", - "HIDDEN_ITEMS": "Itens ocultos", - "HIDDEN_ITEMS_SECTION_NAME": "Itens_ocultos", - "ENTER_TWO_FACTOR_OTP": "Digite o código de 6 dígitos de\nseu aplicativo autenticador.", - "CREATE_ACCOUNT": "Criar uma conta", - "COPIED": "Copiado", - "CANVAS_BLOCKED_TITLE": "Não foi possível gerar miniatura", - "CANVAS_BLOCKED_MESSAGE": "

Parece que o seu navegador desativou o acesso à tela que é necessário para gerar miniaturas para as suas fotos

Por favor, habilite o acesso à tela do seu navegador, ou veja nosso aplicativo para computador

", - "WATCH_FOLDERS": "Pastas monitoradas", - "UPGRADE_NOW": "Aprimorar agora", - "RENEW_NOW": "Renovar agora", - "STORAGE": "Armazenamento", - "USED": "usado", - "YOU": "Você", - "FAMILY": "Família", - "FREE": "grátis", - "OF": "de", - "WATCHED_FOLDERS": "Pastas monitoradas", - "NO_FOLDERS_ADDED": "Nenhuma pasta adicionada ainda!", - "FOLDERS_AUTOMATICALLY_MONITORED": "As pastas que você adicionar aqui serão monitoradas automaticamente", - "UPLOAD_NEW_FILES_TO_ENTE": "Enviar novos arquivos para o ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Remover arquivos excluídos do ente", - "ADD_FOLDER": "Adicionar pasta", - "STOP_WATCHING": "Parar de acompanhar", - "STOP_WATCHING_FOLDER": "Parar de acompanhar a pasta?", - "STOP_WATCHING_DIALOG_MESSAGE": "Seus arquivos existentes não serão excluídos, mas ente irá parar de atualizar automaticamente o álbum associado em alterações nesta pasta.", - "YES_STOP": "Sim, parar", - "MONTH_SHORT": "mês", - "YEAR": "ano", - "FAMILY_PLAN": "Plano familiar", - "DOWNLOAD_LOGS": "Baixar logs", - "DOWNLOAD_LOGS_MESSAGE": "

Isto irá baixar os logs de depuração, que você pode enviar para nós para ajudar a depurar seu problema.

Por favor, note que os nomes de arquivos serão incluídos para ajudar a rastrear problemas com arquivos específicos.

", - "CHANGE_FOLDER": "Alterar pasta", - "TWO_MONTHS_FREE": "Obtenha 2 meses gratuitos em planos anuais", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continuar com teste gratuito", - "FREE_PLAN_DESCRIPTION": "1 GB por 1 ano", - "CURRENT_USAGE": "O uso atual é {{usage}}", - "WEAK_DEVICE": "O navegador da web que você está usando não é poderoso o suficiente para criptografar suas fotos. Por favor, tente entrar para o ente no computador ou baixe o aplicativo móvel.", - "DRAG_AND_DROP_HINT": "Ou arraste e solte na janela ente", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Seus dados enviados serão agendados para exclusão e sua conta será excluída permanentemente.

Essa ação não é reversível.", - "AUTHENTICATE": "Autenticar", - "UPLOADED_TO_SINGLE_COLLECTION": "Enviado para coleção única", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Enviada para separar coleções", - "NEVERMIND": "Esquecer", - "UPDATE_AVAILABLE": "Atualização disponível", - "UPDATE_INSTALLABLE_MESSAGE": "Uma nova versão do ente está pronta para ser instalada.", - "INSTALL_NOW": "Instalar agora", - "INSTALL_ON_NEXT_LAUNCH": "Instalar na próxima inicialização", - "UPDATE_AVAILABLE_MESSAGE": "Uma nova versão do ente foi lançada, mas não pode ser baixada e instalada automaticamente.", - "DOWNLOAD_AND_INSTALL": "Baixar e instalar", - "IGNORE_THIS_VERSION": "Ignorar esta versão", - "TODAY": "Hoje", - "YESTERDAY": "Ontem", - "NAME_PLACEHOLDER": "Nome...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Não foi possível criar álbuns a partir da mistura de arquivos/pastas", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Você arrastou e deixou uma mistura de arquivos e pastas.

Por favor, forneça apenas arquivos ou apenas pastas ao selecionar a opção para criar álbuns separados

", - "CHOSE_THEME": "Escolher tema", - "ML_SEARCH": "Reconhecimento facial", - "ENABLE_ML_SEARCH_DESCRIPTION": "

Isso permitirá aprendizado de máquina no dispositivo e busca facial, iniciando a análise de suas fotos enviadas localmente.

Na primeira execução após o login ou habilitação desta funcionalidade, será feito o download de todas as imagens no dispositivo local para análise. Portanto, ative isso apenas se estiver confortável com o consumo de largura de banda e processamento local de todas as imagens em sua biblioteca de fotos.

Se esta for a primeira vez que você está habilitando isso, também solicitaremos sua permissão para processar dados faciais.

", - "ML_MORE_DETAILS": "Mais detalhes", - "ENABLE_FACE_SEARCH": "Habilitar reconhecimento facial", - "ENABLE_FACE_SEARCH_TITLE": "Habilitar reconhecimento facial?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos. Isso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta.

Por favor, clique aqui para obter mais detalhes sobre esta funcionalidade em nossa política de privacidade

", - "DISABLE_BETA": "Pausar reconhecimento", - "DISABLE_FACE_SEARCH": "Desativar reconhecimento facial", - "DISABLE_FACE_SEARCH_TITLE": "Desativar reconhecimento facial?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

Ente irá parar de processar geometria facial.

Você pode reativar o reconhecimento facial novamente, se desejar, então esta operação está segura.

", - "ADVANCED": "Avançado", - "FACE_SEARCH_CONFIRMATION": "Eu entendo, e desejo permitir que o ente processe a geometria do rosto", - "LABS": "Laboratórios", - "YOURS": "seu", - "PASSPHRASE_STRENGTH_WEAK": "Força da senha: fraca", - "PASSPHRASE_STRENGTH_MODERATE": "Força da senha: moderada", - "PASSPHRASE_STRENGTH_STRONG": "Força da senha: forte", - "PREFERENCES": "Preferências", - "LANGUAGE": "Idioma", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Diretório de exportação inválido", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

O diretório de exportação que você selecionou não existe.

Por favor, selecione um diretório válido.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Falha na verificação de assinatura", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "após uma hora", - "DAY": "após um dia", - "WEEK": "após uma semana", - "MONTH": "após um mês", - "YEAR": "após um ano" - }, - "COPY_LINK": "Copiar link", - "DONE": "Concluído", - "LINK_SHARE_TITLE": "Ou compartilhe um link", - "REMOVE_LINK": "Remover link", - "CREATE_PUBLIC_SHARING": "Criar link público", - "PUBLIC_LINK_CREATED": "Link público criado", - "PUBLIC_LINK_ENABLED": "Link público ativado", - "COLLECT_PHOTOS": "Coletar fotos", - "PUBLIC_COLLECT_SUBTEXT": "Permita que as pessoas com o link também adicionem fotos ao álbum compartilhado.", - "STOP_EXPORT": "Parar", - "EXPORT_PROGRESS": "{{progress.success, number}} / {{progress.total, number}} itens sincronizados", - "MIGRATING_EXPORT": "Preparando...", - "RENAMING_COLLECTION_FOLDERS": "Renomeando pastas do álbum...", - "TRASHING_DELETED_FILES": "Descartando arquivos excluídos...", - "TRASHING_DELETED_COLLECTIONS": "Descartando álbuns excluídos...", - "EXPORT_NOTIFICATION": { - "START": "Exportação iniciada", - "IN_PROGRESS": "Exportação já em andamento", - "FINISH": "Exportação finalizada", - "UP_TO_DATE": "Não há arquivos novos para exportar" - }, - "CONTINUOUS_EXPORT": "Sincronizar continuamente", - "TOTAL_ITEMS": "Total de itens", - "PENDING_ITEMS": "Itens pendentes", - "EXPORT_STARTING": "Iniciando a exportação...", - "DELETE_ACCOUNT_REASON_LABEL": "Qual é o principal motivo para você excluir sua conta?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Selecione um motivo", - "DELETE_REASON": { - "MISSING_FEATURE": "Está faltando um recurso que eu preciso", - "BROKEN_BEHAVIOR": "O aplicativo ou um determinado recurso não está funcionando como eu acredito que deveria", - "FOUND_ANOTHER_SERVICE": "Encontrei outro serviço que gosto mais", - "NOT_LISTED": "Meu motivo não está listado" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "Sentimos muito em vê-lo partir. Explique por que você está partindo para nos ajudar a melhorar.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Comentários", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Sim, desejo excluir permanentemente esta conta e todos os seus dados", - "CONFIRM_DELETE_ACCOUNT": "Confirmar exclusão da conta", - "FEEDBACK_REQUIRED": "Por favor, ajude-nos com esta informação", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "O que o outro serviço faz melhor?", - "RECOVER_TWO_FACTOR": "Recuperar dois fatores", - "at": "em", - "AUTH_NEXT": "próximo", - "AUTH_DOWNLOAD_MOBILE_APP": "Baixe nosso aplicativo móvel para gerenciar seus segredos", - "HIDDEN": "Escondido", - "HIDE": "Ocultar", - "UNHIDE": "Desocultar", - "UNHIDE_TO_COLLECTION": "Reexibir para o álbum", - "SORT_BY": "Ordenar por", - "NEWEST_FIRST": "Mais recentes primeiro", - "OLDEST_FIRST": "Mais antigo primeiro", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "Este arquivo não pôde ser pré-visualizado. Clique aqui para baixar o original.", - "SELECT_COLLECTION": "Selecionar álbum", - "PIN_ALBUM": "Fixar álbum", - "UNPIN_ALBUM": "Desafixar álbum", - "DOWNLOAD_COMPLETE": "Transferência concluída", - "DOWNLOADING_COLLECTION": "Transferindo {{name}}", - "DOWNLOAD_FAILED": "Falha ao baixar", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} arquivos", - "CHRISTMAS": "Natal", - "CHRISTMAS_EVE": "Véspera de Natal", - "NEW_YEAR": "Ano Novo", - "NEW_YEAR_EVE": "Véspera de Ano Novo", - "IMAGE": "Imagem", - "VIDEO": "Vídeo", - "LIVE_PHOTO": "Fotos em movimento", - "CONVERT": "Converter", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Tem certeza de que deseja fechar o editor?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Baixe sua imagem editada ou salve uma cópia para o ente para persistir nas alterações.", - "BRIGHTNESS": "Brilho", - "CONTRAST": "Contraste", - "SATURATION": "Saturação", - "BLUR": "Desfoque", - "INVERT_COLORS": "Inverter Cores", - "ASPECT_RATIO": "Proporção da imagem", - "SQUARE": "Quadrado", - "ROTATE_LEFT": "Girar para a Esquerda", - "ROTATE_RIGHT": "Girar para a Direita", - "FLIP_VERTICALLY": "Inverter verticalmente", - "FLIP_HORIZONTALLY": "Inverter horizontalmente", - "DOWNLOAD_EDITED": "Transferência Editada", - "SAVE_A_COPY_TO_ENTE": "Salvar uma cópia para o ente", - "RESTORE_ORIGINAL": "Restaurar original", - "TRANSFORM": "Transformar", - "COLORS": "Cores", - "FLIP": "Inverter", - "ROTATION": "Rotação", - "RESET": "Redefinir", - "PHOTO_EDITOR": "Editor de Fotos", - "FASTER_UPLOAD": "Envios mais rápidos", - "FASTER_UPLOAD_DESCRIPTION": "Rotas enviam em servidores próximos", - "MAGIC_SEARCH_STATUS": "Estado da busca mágica", - "INDEXED_ITEMS": "Itens indexados", - "CAST_ALBUM_TO_TV": "Reproduzir álbum na TV", - "ENTER_CAST_PIN_CODE": "Digite o código que você vê na TV abaixo para parear este dispositivo.", - "PAIR_DEVICE_TO_TV": "Parear dispositivos", - "TV_NOT_FOUND": "TV não encontrada. Você inseriu o PIN correto?", - "AUTO_CAST_PAIR": "Pareamento automático", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "O Auto Pair requer a conexão com servidores do Google e só funciona com dispositivos Chromecast. O Google não receberá dados confidenciais, como suas fotos.", - "PAIR_WITH_PIN": "Parear com PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Escolha um dispositivo compatível com casts no navegador popup.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "Parear com o PIN funciona para qualquer dispositivo de tela grande onde você deseja reproduzir seu álbum.", - "VISIT_CAST_ENTE_IO": "Acesse cast.ente.io no dispositivo que você deseja parear.", - "CAST_AUTO_PAIR_FAILED": "Chromecast Auto Pair falhou. Por favor, tente novamente.", - "CACHE_DIRECTORY": "Pasta de Cache", - "FREEHAND": "Mão livre", - "APPLY_CROP": "Aplicar Recorte", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "Pelo menos uma transformação ou ajuste de cor deve ser feito antes de salvar.", - "PASSKEYS": "Chaves de acesso", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/pt-PT/translation.json b/web/apps/cast/public/locales/pt-PT/translation.json deleted file mode 100644 index 230980326..000000000 --- a/web/apps/cast/public/locales/pt-PT/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Backups privados
para as suas memórias
", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registar", - "NEW_USER": "Novo no ente", - "EXISTING_USER": "Utilizador existente", - "ENTER_NAME": "Insira o nome", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Adicione um nome para que os seus amigos saibam a quem agradecer por estas ótimas fotos!", - "ENTER_EMAIL": "Insira o endereço de email", - "EMAIL_ERROR": "Inserir um endereço de email válido", - "REQUIRED": "Obrigatório", - "EMAIL_SENT": "Código de verificação enviado para {{email}}", - "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", - "ENTER_OTT": "Código de verificação", - "RESEND_MAIL": "Reenviar código", - "VERIFY": "Verificar", - "UNKNOWN_ERROR": "Ocorreu um erro. Tente novamente", - "INVALID_CODE": "Código de verificação inválido", - "EXPIRED_CODE": "O seu código de verificação expirou", - "SENDING": "A enviar...", - "SENT": "Enviado!", - "PASSWORD": "Palavra-passe", - "LINK_PASSWORD": "Introduza a palavra-passe para desbloquear o álbum", - "RETURN_PASSPHRASE_HINT": "Palavra-passe", - "SET_PASSPHRASE": "Definir palavra-passe", - "VERIFY_PASSPHRASE": "Entrar", - "INCORRECT_PASSPHRASE": "Palavra-passe incorreta", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Bem-vindo ao ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "Novo álbum", - "ENTER_ALBUM_NAME": "Nome do álbum", - "CLOSE_OPTION": "Fechar (Esc)", - "ENTER_FILE_NAME": "Nome do ficheiro", - "CLOSE": "Fechar", - "NO": "Não", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", - "SELECT_PHOTOS": "Selecionar fotos", - "FILE_UPLOAD": "Enviar Ficheiro", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "Não possui uma conta", - "ACCOUNT_EXISTS": "Já possui uma conta", - "CREATE": "Criar", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/ru-RU/translation.json b/web/apps/cast/public/locales/ru-RU/translation.json deleted file mode 100644 index c85db2236..000000000 --- a/web/apps/cast/public/locales/ru-RU/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Личные резервные копии
для твоих воспоминаний
", - "HERO_SLIDE_1": "Сквозное шифрование по умолчанию", - "HERO_SLIDE_2_TITLE": "
Надежно хранится
в убежище от радиоактивных осадков
", - "HERO_SLIDE_2": "Созданный для того, чтобы пережить", - "HERO_SLIDE_3_TITLE": "
Доступно
везде
", - "HERO_SLIDE_3": "Android, iOS, Веб, ПК", - "LOGIN": "Авторизоваться", - "SIGN_UP": "Регистрация", - "NEW_USER": "Новенький в ente", - "EXISTING_USER": "Существующий пользователь", - "ENTER_NAME": "Введите имя", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Добавьте имя, чтобы ваши друзья знали, кого благодарить за эти замечательные фотографии!", - "ENTER_EMAIL": "Введите адрес электронной почты", - "EMAIL_ERROR": "Введите действительный адрес электронной почты", - "REQUIRED": "Требуется", - "EMAIL_SENT": "Проверочный код отправлен на
{{email}}", - "CHECK_INBOX": "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения проверки", - "ENTER_OTT": "Проверочный код", - "RESEND_MAIL": "Отправить код еще раз", - "VERIFY": "Подтвердить", - "UNKNOWN_ERROR": "Что-то пошло не так, Попробуйте еще раз", - "INVALID_CODE": "Неверный код подтверждения", - "EXPIRED_CODE": "Срок действия вашего проверочного кода истек", - "SENDING": "Отправка...", - "SENT": "Отправлено!", - "PASSWORD": "Пароль", - "LINK_PASSWORD": "Введите пароль, чтобы разблокировать альбом", - "RETURN_PASSPHRASE_HINT": "Пароль", - "SET_PASSPHRASE": "Установить пароль", - "VERIFY_PASSPHRASE": "Войти", - "INCORRECT_PASSPHRASE": "Неверный пароль", - "ENTER_ENC_PASSPHRASE": "Пожалуйста, введите пароль, который мы можем использовать для шифрования ваших данных", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Добро пожаловать в ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Где живут ваши лучшие фотографии", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Генерируем ключи шифрования...", - "PASSPHRASE_HINT": "Пароль", - "CONFIRM_PASSPHRASE": "Подтвердите пароль", - "REFERRAL_CODE_HINT": "Как вы узнали о Ente? (необязательно)", - "REFERRAL_INFO": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!", - "PASSPHRASE_MATCH_ERROR": "Пароли не совпадают", - "CREATE_COLLECTION": "Новый альбом", - "ENTER_ALBUM_NAME": "Название альбома", - "CLOSE_OPTION": "Закрыть (Esc)", - "ENTER_FILE_NAME": "Имя файла", - "CLOSE": "Закрыть", - "NO": "Нет", - "NOTHING_HERE": "Здесь нечего смотреть! 👀", - "UPLOAD": "Загрузить", - "IMPORT": "Импорт", - "ADD_PHOTOS": "Добавить фотографии", - "ADD_MORE_PHOTOS": "Добавить больше фото", - "add_photos_one": "Добавить 1 элемент", - "add_photos_other": "Добавить {{count, number}} элементов", - "SELECT_PHOTOS": "Выбрать фотографии", - "FILE_UPLOAD": "Загрузка файла", - "UPLOAD_STAGE_MESSAGE": { - "0": "Подготовка к загрузке", - "1": "Чтение файлов метаданных Google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов извлечены", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов обработано", - "4": "Отмена оставшихся загрузок", - "5": "Резервное копирование завершено" - }, - "FILE_NOT_UPLOADED_LIST": "Следующие файлы не были загружены", - "SUBSCRIPTION_EXPIRED": "Подписка закончилась", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Срок действия вашей подписки истек, пожалуйста, продлите", - "STORAGE_QUOTA_EXCEEDED": "Превышен лимит хранения", - "INITIAL_LOAD_DELAY_WARNING": "Первая загрузка может занять некоторое время", - "USER_DOES_NOT_EXIST": "Пользователь с таким email не найден", - "NO_ACCOUNT": "У вас нет учетной записи", - "ACCOUNT_EXISTS": "Уже есть аккаунт", - "CREATE": "Создать", - "DOWNLOAD": "Скачать", - "DOWNLOAD_OPTION": "Скачать (D)", - "DOWNLOAD_FAVORITES": "Скачать избранные", - "DOWNLOAD_UNCATEGORIZED": "Скачать без категорий", - "DOWNLOAD_HIDDEN_ITEMS": "Скачать скрытые элементы", - "COPY_OPTION": "Скопировать как PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Полноэкранный режим (F)", - "ZOOM_IN_OUT": "Увеличить/уменьшить", - "PREVIOUS": "Предыдущий (←)", - "NEXT": "Следующий (→)", - "TITLE_PHOTOS": "Ente Фото", - "TITLE_ALBUMS": "Ente Фото", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "Загрузите своё первое фото", - "IMPORT_YOUR_FOLDERS": "Импортируйте папки", - "UPLOAD_DROPZONE_MESSAGE": "Перетащите для резервного копирования файлов", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Перетащите, чтобы добавить просматриваемую папку", - "TRASH_FILES_TITLE": "Удалить файлы?", - "TRASH_FILE_TITLE": "Удалить файл?", - "DELETE_FILES_TITLE": "Удалить немедленно?", - "DELETE_FILES_MESSAGE": "Выбранные файлы будут безвозвратно удалены из вашей учетной записи ente.", - "DELETE": "Удалить", - "DELETE_OPTION": "Удалить (DEL)", - "FAVORITE_OPTION": "Избранное (L)", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "Обнаружено несколько папок", - "UPLOAD_STRATEGY_CHOICE": "Вы хотите загрузить их в", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Один альбом", - "OR": "или", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Отдельные альбомы", - "SESSION_EXPIRED_MESSAGE": "Истёк срок действия вашей сессии. Для продолжения, пожалуйста, войдите снова", - "SESSION_EXPIRED": "Время сессии истекло", - "PASSWORD_GENERATION_FAILED": "Вашему браузеру не удалось сгенерировать надежный ключ, соответствующий стандартам шифрования ente, пожалуйста, попробуйте использовать мобильное приложение или другой браузер", - "CHANGE_PASSWORD": "Изменить пароль", - "GO_BACK": "Вернуться назад", - "RECOVERY_KEY": "Ключ восстановления", - "SAVE_LATER": "Сделать позже", - "SAVE": "Сохранить ключ", - "RECOVERY_KEY_DESCRIPTION": "Если вы забыли свой пароль, то восстановить данные можно только с помощью этого ключа.", - "RECOVER_KEY_GENERATION_FAILED": "Не удалось сгенерировать код восстановления, пожалуйста, повторите попытку", - "KEY_NOT_STORED_DISCLAIMER": "Мы не храним этот ключ, поэтому, пожалуйста, сохраните его в надежном месте", - "FORGOT_PASSWORD": "Забыл пароль", - "RECOVER_ACCOUNT": "Восстановить аккаунт", - "RECOVERY_KEY_HINT": "Ключ восстановления", - "RECOVER": "Восстановить", - "NO_RECOVERY_KEY": "Нет ключа восстановления?", - "INCORRECT_RECOVERY_KEY": "Неправильный ключ восстановления", - "SORRY": "Извините", - "NO_RECOVERY_KEY_MESSAGE": "Из-за природы нашего сквозного протокола шифрования ваши данные не могут быть расшифрованы без вашего пароля или ключа восстановления", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Пожалуйста, отправьте электронное письмо на адрес {{emailID}} с вашего зарегистрированного адреса электронной почты", - "CONTACT_SUPPORT": "Связаться с поддержкой", - "REQUEST_FEATURE": "Запросить функцию", - "SUPPORT": "Поддержка", - "CONFIRM": "Подтвердить", - "CANCEL": "Отменить", - "LOGOUT": "Выйти", - "DELETE_ACCOUNT": "Удалить аккаунт", - "DELETE_ACCOUNT_MESSAGE": "

Пожалуйста, отправьте письмо по адресу {{emailID}} с вашего зарегистрированного адреса электронной почты.

Ваш запрос будет обработан в течение 72 часов

", - "LOGOUT_MESSAGE": "Вы уверены, что хотите выйти?", - "CHANGE_EMAIL": "Изменить адрес электронной почты", - "OK": "ОК", - "SUCCESS": "Успешно", - "ERROR": "Ошибка", - "MESSAGE": "Сообщение", - "INSTALL_MOBILE_APP": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "Загрузить приложение для компьютера", - "EXPORT": "Экспортировать данные", - "SUBSCRIPTION": "Подписка", - "SUBSCRIBE": "Подписаться", - "MANAGEMENT_PORTAL": "Управлять платёжной информацией", - "MANAGE_FAMILY_PORTAL": "Управление семьёй", - "LEAVE_FAMILY_PLAN": "Покинуть семейный план", - "LEAVE": "Выйти", - "LEAVE_FAMILY_CONFIRM": "Вы уверены, что хотите покинуть семейный план?", - "CHOOSE_PLAN": "Выбери свой план", - "MANAGE_PLAN": "Управление подпиской", - "ACTIVE": "Активный", - "OFFLINE_MSG": "Вы не в сети, кэшированные воспоминания отображаются", - "FREE_SUBSCRIPTION_INFO": "Вы используете бесплатный тарифный план, истекающий {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Вы используете семейный план, управляемый", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Продление {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "Обновить платёжную информацию", - "MONTHLY": "Ежемесячно", - "YEARLY": "Ежегодно", - "UPDATE_SUBSCRIPTION_MESSAGE": "Хотите сменить текущий план?", - "UPDATE_SUBSCRIPTION": "Изменить план", - "CANCEL_SUBSCRIPTION": "Отменить подписку", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Все ваши данные будут удалены с наших серверов в конце этого расчетного периода.

Вы уверены, что хотите отменить свою подписку?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Вы уверены, что хотите отменить свою подписку?

", - "SUBSCRIPTION_CANCEL_FAILED": "Не удалось отменить подписку", - "SUBSCRIPTION_CANCEL_SUCCESS": "Подписка успешно отменена", - "REACTIVATE_SUBSCRIPTION": "Возобновить подписку", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "После повторной активации вам будет выставлен счет в {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Подписка успешно активирована ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Не удалось повторно активировать продление подписки", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Спасибо", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Отменить мобильную подписку", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Пожалуйста, отмените свою подписку в мобильном приложении, чтобы активировать подписку здесь", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Пожалуйста, свяжитесь с {{emailID}} для управления подпиской", - "RENAME": "Переименовать", - "RENAME_FILE": "Переименовать файл", - "RENAME_COLLECTION": "Переименовать альбом", - "DELETE_COLLECTION_TITLE": "Удалить альбом?", - "DELETE_COLLECTION": "Удалить альбом", - "DELETE_COLLECTION_MESSAGE": "Также удалить фотографии (и видео), которые есть в этом альбоме из всех других альбомов, где они есть?", - "DELETE_PHOTOS": "Удалить фото", - "KEEP_PHOTOS": "Оставить фото", - "SHARE": "Поделиться", - "SHARE_COLLECTION": "Поделиться альбомом", - "SHAREES": "Поделиться с", - "SHARE_WITH_SELF": "Ой, Вы не можете поделиться с самим собой", - "ALREADY_SHARED": "Упс, Вы уже делились этим с {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Делиться альбомом запрещено", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Совместное использование отключено для бесплатных аккаунтов", - "DOWNLOAD_COLLECTION": "Загрузить альбом", - "DOWNLOAD_COLLECTION_MESSAGE": "

Вы уверены, что хотите загрузить альбом полностью?

Все файлы будут последовательно помещены в очередь на загрузку

", - "CREATE_ALBUM_FAILED": "Не удалось создать альбом, пожалуйста, попробуйте еще раз", - "SEARCH": "Поиск", - "SEARCH_RESULTS": "Результаты поиска", - "NO_RESULTS": "Ничего не найдено", - "SEARCH_HINT": "Поиск альбомов, дат, описаний, ...", - "SEARCH_TYPE": { - "COLLECTION": "Альбом", - "LOCATION": "Местоположение", - "CITY": "Местоположение", - "DATE": "Дата", - "FILE_NAME": "Имя файла", - "THING": "Содержимое", - "FILE_CAPTION": "Описание", - "FILE_TYPE": "Тип файла", - "CLIP": "" - }, - "photos_count_zero": "Воспоминания отсутствуют", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "Добавить в альбом", - "SELECTED": "выбрано", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Это видео нельзя воспроизвести в вашем браузере", - "PEOPLE": "Люди", - "INDEXING_SCHEDULED": "Индексация запланирована...", - "ANALYZING_PHOTOS": "Индексирование фотографий ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Индексирование людей на {{indexStatus.nSyncedFiles,number}} фотографиях...", - "INDEXING_DONE": "Проиндексировано {{indexStatus.nSyncedFiles,number}} фотографий", - "UNIDENTIFIED_FACES": "нераспознанные лица", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "Двухфакторная аутентификация", - "TWO_FACTOR_QR_INSTRUCTION": "Сканируйте QR-код ниже с вашим любимым приложением для проверки подлинности", - "ENTER_CODE_MANUALLY": "Введите код вручную", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Пожалуйста, введите этот код в вашем любимом приложении для аутентификации", - "SCAN_QR_CODE": "Сканировать QR-код вместо", - "ENABLE_TWO_FACTOR": "Включить двухфакторную аутентификацию", - "ENABLE": "Включить", - "LOST_DEVICE": "Потеряно двухфакторное устройство", - "INCORRECT_CODE": "Неверный код", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "Отключить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "Отключить", - "RECONFIGURE": "Перенастроить", - "UPDATE_TWO_FACTOR": "Обновить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "Обновить", - "DISABLE_TWO_FACTOR": "Отключить двухфакторную аутентификацию", - "DISABLE_TWO_FACTOR_MESSAGE": "Вы уверены, что хотите отключить двухфакторную аутентификацию", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "Экспортировать данные", - "SELECT_FOLDER": "Выбрать папку", - "DESTINATION": "Место назначения", - "START": "Начать", - "LAST_EXPORT_TIME": "Время последнего экспорта", - "EXPORT_AGAIN": "Синхронизировать заново", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Локальное хранилище недоступно", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "Отправить одноразовый код", - "EMAIl_ALREADY_OWNED": "Почта уже использована", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "Скрыть", - "UNHIDE": "Показать", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Сортировать по", - "NEWEST_FIRST": "Сначала новые", - "OLDEST_FIRST": "Сначала старые", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "Выбрать альбом", - "PIN_ALBUM": "Закрепить альбом", - "UNPIN_ALBUM": "Открепить альбом", - "DOWNLOAD_COMPLETE": "Загрузка завершена", - "DOWNLOADING_COLLECTION": "Загрузка {{name}}", - "DOWNLOAD_FAILED": "Загрузка не удалась", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} файлов", - "CHRISTMAS": "Рождество", - "CHRISTMAS_EVE": "Канун Рождества", - "NEW_YEAR": "Новый год", - "NEW_YEAR_EVE": "Канун Нового года", - "IMAGE": "Изображение", - "VIDEO": "Видео", - "LIVE_PHOTO": "Живое фото", - "CONVERT": "Преобразовать", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Вы уверены, что хотите закрыть редактор?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Загрузите отредактированное изображение или сохраните копию в ente, чтобы сохранить внесенные изменения.", - "BRIGHTNESS": "Яркость", - "CONTRAST": "Контраст", - "SATURATION": "Насыщенность", - "BLUR": "Размытие", - "INVERT_COLORS": "Инвертировать Цвета", - "ASPECT_RATIO": "Соотношение Сторон", - "SQUARE": "Квадрат", - "ROTATE_LEFT": "Повернуть влево", - "ROTATE_RIGHT": "Повернуть вправо", - "FLIP_VERTICALLY": "Отразить вертикально", - "FLIP_HORIZONTALLY": "Отразить горизонтально", - "DOWNLOAD_EDITED": "Скачать отредактированный", - "SAVE_A_COPY_TO_ENTE": "Сохранить копию в ente", - "RESTORE_ORIGINAL": "Восстановить оригинал", - "TRANSFORM": "Преобразовать", - "COLORS": "Цвета", - "FLIP": "Перевернуть", - "ROTATION": "", - "RESET": "Сбросить", - "PHOTO_EDITOR": "Редактор фото", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "Статус волшебного поиска", - "INDEXED_ITEMS": "Индексированные элементы", - "CAST_ALBUM_TO_TV": "Воспроизвести альбом на ТВ", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/sv-SE/translation.json b/web/apps/cast/public/locales/sv-SE/translation.json deleted file mode 100644 index f88535795..000000000 --- a/web/apps/cast/public/locales/sv-SE/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "Ange namn", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "Ange e-postadress", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "Lösenord", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "Lösenord", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "Logga in", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Välkommen till ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "Lösenord", - "CONFIRM_PASSPHRASE": "Bekräfta lösenord", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "Lösenorden matchar inte", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "Filnamn", - "CLOSE": "Stäng", - "NO": "Nej", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "Radera", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "eller", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "Ändra lösenord", - "GO_BACK": "", - "RECOVERY_KEY": "Återställningsnyckel", - "SAVE_LATER": "", - "SAVE": "Spara nyckel", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "Glömt lösenord", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "Ingen återställningsnyckel?", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "Bekräfta", - "CANCEL": "Avbryt", - "LOGOUT": "Logga ut", - "DELETE_ACCOUNT": "Radera konto", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "Meddelande", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "Prenumerera", - "MANAGEMENT_PORTAL": "Hantera betalningsmetod", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "Hantera din prenumeration", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "Sök", - "SEARCH_RESULTS": "Sökresultat", - "NO_RESULTS": "Inga resultat hittades", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "Datum", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "Beskrivning", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Inga deltagare", - "participants_one": "1 deltagare", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "Deltagare", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "Fil", - "UPLOAD_DIRS": "Mapp", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "Filer", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 album", - "albums_other": "{{count, number}} album", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "Lägg till mapp", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "mån", - "YEAR": "år", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "GB", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "Namn...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "Språk", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "Kopiera länk", - "DONE": "Klar", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Sortera efter", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "Bild", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "Färger", - "FLIP": "", - "ROTATION": "", - "RESET": "Återställ", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/th-TH/translation.json b/web/apps/cast/public/locales/th-TH/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/cast/public/locales/th-TH/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/tr-TR/translation.json b/web/apps/cast/public/locales/tr-TR/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/cast/public/locales/tr-TR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/public/locales/zh-CN/translation.json b/web/apps/cast/public/locales/zh-CN/translation.json deleted file mode 100644 index 0a72e1c70..000000000 --- a/web/apps/cast/public/locales/zh-CN/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
私人备份
为您的回忆
", - "HERO_SLIDE_1": "默认端到端加密", - "HERO_SLIDE_2_TITLE": "
安全地存放
在一个掩护所中
", - "HERO_SLIDE_2": "经久耐用", - "HERO_SLIDE_3_TITLE": "
可用于
各处
", - "HERO_SLIDE_3": "安卓, iOS, 网页端, 桌面端", - "LOGIN": "登录", - "SIGN_UP": "注册", - "NEW_USER": "刚来到 ente", - "EXISTING_USER": "现有用户", - "ENTER_NAME": "输入名字", - "PUBLIC_UPLOADER_NAME_MESSAGE": "请添加一个名字,以便您的朋友知晓该感谢谁拍摄了这些精美的照片!", - "ENTER_EMAIL": "请输入电子邮件地址", - "EMAIL_ERROR": "请输入有效的电子邮件", - "REQUIRED": "必需的", - "EMAIL_SENT": "验证码已发送至
{{email}}", - "CHECK_INBOX": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证", - "ENTER_OTT": "验证码", - "RESEND_MAIL": "重新发送验证码", - "VERIFY": "验证", - "UNKNOWN_ERROR": "出了点问题,请重试", - "INVALID_CODE": "验证码无效", - "EXPIRED_CODE": "您的验证码已过期", - "SENDING": "发送中……", - "SENT": "已发送!", - "PASSWORD": "密码", - "LINK_PASSWORD": "输入密码来解锁相册", - "RETURN_PASSPHRASE_HINT": "密码", - "SET_PASSPHRASE": "设置密码", - "VERIFY_PASSPHRASE": "登录", - "INCORRECT_PASSPHRASE": "密码错误", - "ENTER_ENC_PASSPHRASE": "请输入我们可以用来加密您数据的密码", - "PASSPHRASE_DISCLAIMER": "我们不会存储您的密码,因此如果您忘记密码, 我们将无法帮助您在没有恢复密钥的情况下恢复您的数据。", - "WELCOME_TO_ENTE_HEADING": "欢迎来到 ", - "WELCOME_TO_ENTE_SUBHEADING": "端到端加密的照片存储和共享", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "可以让您存放照片的最好的地方", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "正在生成加密密钥...", - "PASSPHRASE_HINT": "密码", - "CONFIRM_PASSPHRASE": "请确认密码", - "REFERRAL_CODE_HINT": "您是如何知道Ente的? (可选的)", - "REFERRAL_INFO": "我们不跟踪应用程序安装情况,如果您告诉我们您是在哪里找到我们的,将会有所帮助!", - "PASSPHRASE_MATCH_ERROR": "两次输入的密码不一致", - "CREATE_COLLECTION": "新建相册", - "ENTER_ALBUM_NAME": "相册名称", - "CLOSE_OPTION": "关闭 (或按Esc键)", - "ENTER_FILE_NAME": "文件名", - "CLOSE": "关闭", - "NO": "否", - "NOTHING_HERE": "这里空空如也 👀", - "UPLOAD": "上传", - "IMPORT": "导入", - "ADD_PHOTOS": "添加照片", - "ADD_MORE_PHOTOS": "添加更多的照片", - "add_photos_one": "添加1个项目", - "add_photos_other": "添加 {{count, number}} 个项目", - "SELECT_PHOTOS": "选择图片", - "FILE_UPLOAD": "上传文件", - "UPLOAD_STAGE_MESSAGE": { - "0": "正在准备上传", - "1": "正在读取 Google 元数据文件", - "2": "文件元数据提取状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", - "3": "文件备份状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", - "4": "正在取消剩余的上传内容", - "5": "备份完成" - }, - "FILE_NOT_UPLOADED_LIST": "以下文件未上传", - "SUBSCRIPTION_EXPIRED": "您的订阅已过期", - "SUBSCRIPTION_EXPIRED_MESSAGE": "您的订阅已过期,请 续期", - "STORAGE_QUOTA_EXCEEDED": "已超出存储限制", - "INITIAL_LOAD_DELAY_WARNING": "第一次加载可能需要一些时间", - "USER_DOES_NOT_EXIST": "抱歉,找不到该电子邮件的用户", - "NO_ACCOUNT": "没有账号", - "ACCOUNT_EXISTS": "已有账户", - "CREATE": "创建", - "DOWNLOAD": "下载", - "DOWNLOAD_OPTION": "下载 (D)", - "DOWNLOAD_FAVORITES": "下载收藏", - "DOWNLOAD_UNCATEGORIZED": "下载未分类的", - "DOWNLOAD_HIDDEN_ITEMS": "下载隐藏项目", - "COPY_OPTION": "复制为 PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "切换至全屏 (F)", - "ZOOM_IN_OUT": "放大/缩小", - "PREVIOUS": "上一个 (←)", - "NEXT": "下一个 (→)", - "TITLE_PHOTOS": "Ente 照片", - "TITLE_ALBUMS": "Ente 照片", - "TITLE_AUTH": "Ente 验证器", - "UPLOAD_FIRST_PHOTO": "上传您的第一张照片", - "IMPORT_YOUR_FOLDERS": "导入您的文件夹", - "UPLOAD_DROPZONE_MESSAGE": "拖放以备份您的文件", - "WATCH_FOLDER_DROPZONE_MESSAGE": "拖放以添加观看的文件夹", - "TRASH_FILES_TITLE": "要删除文件吗?", - "TRASH_FILE_TITLE": "要删除文件吗?", - "DELETE_FILES_TITLE": "要立即删除吗?", - "DELETE_FILES_MESSAGE": "所选文件将从您的账户中永久删除。", - "DELETE": "删除", - "DELETE_OPTION": "删除(DEL)", - "FAVORITE_OPTION": "收藏 (L)", - "UNFAVORITE_OPTION": "取消收藏 (L)", - "MULTI_FOLDER_UPLOAD": "检测到多个文件夹", - "UPLOAD_STRATEGY_CHOICE": "你想要上传他们到", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "单个相册", - "OR": "或者", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "独立相册", - "SESSION_EXPIRED_MESSAGE": "您的会话已过期,请重新登录以继续", - "SESSION_EXPIRED": "会话已过期", - "PASSWORD_GENERATION_FAILED": "您的浏览器无法生成一个符合ente加密标准的强密钥,请尝试使用移动应用程序或其他浏览器", - "CHANGE_PASSWORD": "修改密码", - "GO_BACK": "返回", - "RECOVERY_KEY": "恢复密钥", - "SAVE_LATER": "稍后再做", - "SAVE": "保存密钥", - "RECOVERY_KEY_DESCRIPTION": "如果您忘记了密码,恢复数据的唯一方法就是使用此密钥。", - "RECOVER_KEY_GENERATION_FAILED": "无法生成恢复代码,请重试", - "KEY_NOT_STORED_DISCLAIMER": "我们不存储此密钥,因此请将其保存在安全的地方", - "FORGOT_PASSWORD": "忘记密码", - "RECOVER_ACCOUNT": "恢复账户", - "RECOVERY_KEY_HINT": "恢复密钥", - "RECOVER": "恢复", - "NO_RECOVERY_KEY": "没有恢复密钥?", - "INCORRECT_RECOVERY_KEY": "不正确的恢复密钥", - "SORRY": "抱歉", - "NO_RECOVERY_KEY_MESSAGE": "由于我们端到端加密协议的性质,如果没有您的密码或恢复密钥,您的数据将无法解密", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "请用您注册ente账户的电子邮箱发一封邮件给 {{emailID}}", - "CONTACT_SUPPORT": "联系支持", - "REQUEST_FEATURE": "功能建议", - "SUPPORT": "支持", - "CONFIRM": "确认", - "CANCEL": "取消", - "LOGOUT": "退出登录", - "DELETE_ACCOUNT": "删除账户", - "DELETE_ACCOUNT_MESSAGE": "

请从您注册的电子邮件地址发送一封电子邮件到 {{emailID}}

。您的请求将在72小时内处理。

", - "LOGOUT_MESSAGE": "你确定要退出登录吗?", - "CHANGE_EMAIL": "更换邮箱", - "OK": "确定", - "SUCCESS": "成功", - "ERROR": "错误", - "MESSAGE": "消息", - "INSTALL_MOBILE_APP": "安装我们的 AndroidiOS 应用程序来自动备份您的所有照片", - "DOWNLOAD_APP_MESSAGE": "抱歉,目前只有我们的桌面应用程序支持此操作", - "DOWNLOAD_APP": "下载桌面应用程序", - "EXPORT": "导出数据", - "SUBSCRIPTION": "订阅", - "SUBSCRIBE": "订阅", - "MANAGEMENT_PORTAL": "管理付款方式", - "MANAGE_FAMILY_PORTAL": "管理家庭", - "LEAVE_FAMILY_PLAN": "离开家庭计划", - "LEAVE": "离开", - "LEAVE_FAMILY_CONFIRM": "您确定要离开家庭计划吗?", - "CHOOSE_PLAN": "选择您的计划", - "MANAGE_PLAN": "管理您的订阅", - "ACTIVE": "已激活", - "OFFLINE_MSG": "您处于离线状态,正在显示已缓存的回忆", - "FREE_SUBSCRIPTION_INFO": "您使用的是将于{{date, dateTime}} 过期的免费计划", - "FAMILY_SUBSCRIPTION_INFO": "您正在使用由 管理的家庭计划", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "于 {{date, dateTime}} 续费", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "结束于 {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "您的订阅将于 {{date, dateTime}} 取消", - "ADD_ON_AVAILABLE_TILL": "您的 {{storage, string}} 插件有效期至 {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "您已超过您的存储配额,请 升级", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

我们已经收到您的付款

您的订阅有效期至 {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "您的购买已取消,如果您想订阅,请重试", - "SUBSCRIPTION_PURCHASE_FAILED": "订阅购买失败,请重试", - "SUBSCRIPTION_UPDATE_FAILED": "订阅更新失败,请重试", - "UPDATE_PAYMENT_METHOD_MESSAGE": "很抱歉,我们尝试从您的卡中扣款时支付失败,请更新您的付款方式并重试", - "STRIPE_AUTHENTICATION_FAILED": "我们无法验证您的付款方式。请选择不同的付款方式并重试", - "UPDATE_PAYMENT_METHOD": "更新付款方式", - "MONTHLY": "每月", - "YEARLY": "每年", - "UPDATE_SUBSCRIPTION_MESSAGE": "您确定要更改您的计划吗?", - "UPDATE_SUBSCRIPTION": "更改计划", - "CANCEL_SUBSCRIPTION": "取消订阅", - "CANCEL_SUBSCRIPTION_MESSAGE": "

您的所有数据将在此计费期结束时从我们的服务器中删除。

您确定要取消您的订阅吗?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

您确定要取消订阅吗?

", - "SUBSCRIPTION_CANCEL_FAILED": "取消订阅失败", - "SUBSCRIPTION_CANCEL_SUCCESS": "订阅成功取消", - "REACTIVATE_SUBSCRIPTION": "重新激活订阅", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "重新激活后,您将在 {{date, dateTime}} 前支付费用", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "订阅已成功激活 ", - "SUBSCRIPTION_ACTIVATE_FAILED": "无法重新激活订阅续费", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "非常感谢您", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "取消手机订阅", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "请从手机应用取消您的订阅以激活这里的订阅", - "MAIL_TO_MANAGE_SUBSCRIPTION": "请联系我们 {{emailID}} 来管理您的订阅", - "RENAME": "重命名", - "RENAME_FILE": "重命名文件", - "RENAME_COLLECTION": "重命名相册", - "DELETE_COLLECTION_TITLE": "要删除相册吗?", - "DELETE_COLLECTION": "删除相册", - "DELETE_COLLECTION_MESSAGE": "也删除此相册中存在的照片(和视频),从 他们所加入的所有 个其他相册?", - "DELETE_PHOTOS": "删除照片", - "KEEP_PHOTOS": "保留照片", - "SHARE": "分享", - "SHARE_COLLECTION": "分享相册", - "SHAREES": "已分享给", - "SHARE_WITH_SELF": "哎呀,您不能与自己分享", - "ALREADY_SHARED": "哎呀,您已经和 {{email}} 分享了", - "SHARING_BAD_REQUEST_ERROR": "不允许分享相册", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "免费账户禁用共享", - "DOWNLOAD_COLLECTION": "下载相册", - "DOWNLOAD_COLLECTION_MESSAGE": "

您确定要下载完整相册吗?

所有文件都将按顺序排队进行下载

", - "CREATE_ALBUM_FAILED": "相册创建失败,请重试", - "SEARCH": "搜索", - "SEARCH_RESULTS": "搜索结果", - "NO_RESULTS": "未找到任何结果", - "SEARCH_HINT": "搜索相册、日期...", - "SEARCH_TYPE": { - "COLLECTION": "相册", - "LOCATION": "地理位置", - "CITY": "位置", - "DATE": "日期", - "FILE_NAME": "文件名", - "THING": "内容", - "FILE_CAPTION": "说明", - "FILE_TYPE": "文件类型", - "CLIP": "魔法" - }, - "photos_count_zero": "没有回忆", - "photos_count_one": "1个回忆", - "photos_count_other": "{{count, number}} 个回忆", - "TERMS_AND_CONDITIONS": "我同意 条款隐私政策", - "ADD_TO_COLLECTION": "添加到相册", - "SELECTED": "已选", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "此视频无法在您的浏览器中播放", - "PEOPLE": "人物", - "INDEXING_SCHEDULED": "索引已安排...", - "ANALYZING_PHOTOS": "分析 {{indexStatus.nTotalFiles}} 的新照片{{indexStatus.nSyncedFiles}} 已完成)...", - "INDEXING_PEOPLE": "正在为 {{indexStatus.nSyncedFiles}} 张照片中的人物建立索引...", - "INDEXING_DONE": "已索引 {{indexStatus.nSyncedFiles}} 张照片", - "UNIDENTIFIED_FACES": "身份不明的面孔", - "OBJECTS": "对象", - "TEXT": "文本", - "INFO": "图片信息 ", - "INFO_OPTION": "图片信息 (I)", - "FILE_NAME": "文件名", - "CAPTION_PLACEHOLDER": "添加说明", - "LOCATION": "地理位置", - "SHOW_ON_MAP": "在 OpenStreetMap 上查看", - "MAP": "地图", - "MAP_SETTINGS": "地图设置", - "ENABLE_MAPS": "要启用地图吗?", - "ENABLE_MAP": "启用地图", - "DISABLE_MAPS": "要禁用地图吗?", - "ENABLE_MAP_DESCRIPTION": "

这将在世界地图上显示您的照片。

该地图由 OpenStreetMap 托管,并且您照片的确切位置永远不会共享。

您可以随时从“设置”中禁用此功能。

", - "DISABLE_MAP_DESCRIPTION": "

这将禁止在世界地图上显示您的照片。

您可以随时从“设置”中启用此功能。

", - "DISABLE_MAP": "禁用地图", - "DETAILS": "详情", - "VIEW_EXIF": "查看所有 EXIF 数据", - "NO_EXIF": "无 EXIF 数据", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "双因素", - "TWO_FACTOR_AUTHENTICATION": "双因素认证", - "TWO_FACTOR_QR_INSTRUCTION": "使用您最喜欢的身份验证器应用程序(2FA)扫描下面的二维码", - "ENTER_CODE_MANUALLY": "请手动输入代码", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "请在您最喜欢的验证器应用中输入此代码", - "SCAN_QR_CODE": "改为扫描二维码", - "ENABLE_TWO_FACTOR": "启用双因素认证", - "ENABLE": "启用", - "LOST_DEVICE": "丢失了双因素认证设备", - "INCORRECT_CODE": "代码错误", - "TWO_FACTOR_INFO": "登录您的账户不仅需要您的电子邮件和密码,还需要额外的安全层", - "DISABLE_TWO_FACTOR_LABEL": "禁用双因素认证", - "UPDATE_TWO_FACTOR_LABEL": "更新您的身份验证器设备", - "DISABLE": "禁用", - "RECONFIGURE": "重新配置", - "UPDATE_TWO_FACTOR": "更新双因素认证", - "UPDATE_TWO_FACTOR_MESSAGE": "向前继续将使之前配置的任何身份验证器无效", - "UPDATE": "更新", - "DISABLE_TWO_FACTOR": "禁用双因素认证", - "DISABLE_TWO_FACTOR_MESSAGE": "您确定要禁用您的双因素认证吗?", - "TWO_FACTOR_DISABLE_FAILED": "禁用双因素认证失败,请再试一次", - "EXPORT_DATA": "导出数据", - "SELECT_FOLDER": "选择文件夹", - "DESTINATION": "目标位置", - "START": "开始", - "LAST_EXPORT_TIME": "最后一次导出时间", - "EXPORT_AGAIN": "重新同步", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "无法访问本地存储", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "您的浏览器或插件阻止 ente 将数据保存到本地存储。 请在切换浏览模式后再尝试加载此页面。", - "SEND_OTT": "发送 OTP", - "EMAIl_ALREADY_OWNED": "电子邮箱已被注册", - "ETAGS_BLOCKED": "

由于您的浏览器配置,我们无法上传以下文件。

请禁用任何可能阻止ente 使用 eTags 上传大文件的附加组件, 或者使用我们的 桌面应用程序 获取更可靠的导入体验。

", - "SKIPPED_VIDEOS_INFO": "

目前,我们不支持在公共链接内添加视频。

若要分享视频,请 注册 并通过电子邮件与预定收件人分享。

", - "LIVE_PHOTOS_DETECTED": "Live Photos 中的照片和视频文件已合并为一个文件", - "RETRY_FAILED": "重试上传失败的文件", - "FAILED_UPLOADS": "上传失败 ", - "SKIPPED_FILES": "已忽略的上传内容", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "缩略图生成失败", - "UNSUPPORTED_FILES": "不支持的文件", - "SUCCESSFUL_UPLOADS": "上传成功", - "SKIPPED_INFO": "跳过这些,因为在同一相册中有具有匹配名称的文件", - "UNSUPPORTED_INFO": "ente 尚不支持这些文件格式", - "BLOCKED_UPLOADS": "已阻止上传", - "SKIPPED_VIDEOS": "已跳过的视频", - "INPROGRESS_METADATA_EXTRACTION": "进行中", - "INPROGRESS_UPLOADS": "上传进行中", - "TOO_LARGE_UPLOADS": "大文件", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "存储空间不足", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "这些文件没有上传,因为它们超过了您的存储计划的最大大小限制", - "TOO_LARGE_INFO": "这些文件没有上传,因为它们超过了我们的最大文件大小限制", - "THUMBNAIL_GENERATION_FAILED_INFO": "这些文件已上传,但遗憾的是,我们无法为它们生成缩略图。", - "UPLOAD_TO_COLLECTION": "上传至相册", - "UNCATEGORIZED": "未分类的", - "ARCHIVE": "存档", - "FAVORITES": "收藏", - "ARCHIVE_COLLECTION": "存档相册", - "ARCHIVE_SECTION_NAME": "存档", - "ALL_SECTION_NAME": "全部", - "MOVE_TO_COLLECTION": "移动到相册", - "UNARCHIVE": "取消存档", - "UNARCHIVE_COLLECTION": "取消存档相册", - "HIDE_COLLECTION": "隐藏相册", - "UNHIDE_COLLECTION": "取消隐藏相册", - "MOVE": "移动", - "ADD": "添加", - "REMOVE": "移除", - "YES_REMOVE": "是,移除", - "REMOVE_FROM_COLLECTION": "从相册中移除", - "TRASH": "回收站", - "MOVE_TO_TRASH": "移动到回收站", - "TRASH_FILES_MESSAGE": "选中的文件将从所有相册中删除并移动到回收站。", - "TRASH_FILE_MESSAGE": "该文件将从所有相册中删除并移动到回收站。", - "DELETE_PERMANENTLY": "永久删除", - "RESTORE": "恢复", - "RESTORE_TO_COLLECTION": "恢复到相册", - "EMPTY_TRASH": "清空回收站", - "EMPTY_TRASH_TITLE": "要清空回收站吗?", - "EMPTY_TRASH_MESSAGE": "这些文件将从您的 ente 账户中永久删除。", - "LEAVE_SHARED_ALBUM": "是,离开", - "LEAVE_ALBUM": "离开相册", - "LEAVE_SHARED_ALBUM_TITLE": "要离开共享相册吗?", - "LEAVE_SHARED_ALBUM_MESSAGE": "您将离开相册,它将不再对您可见。", - "NOT_FILE_OWNER": "您不能删除共享相册中的文件", - "CONFIRM_SELF_REMOVE_MESSAGE": "所选项目将从该相册中删除。 仅在此相册中的项目将移至未分类。", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "您要删除的某些项目是由其他人添加的,您将无法访问它们。", - "SORT_BY_CREATION_TIME_ASCENDING": "最早的", - "SORT_BY_UPDATION_TIME_DESCENDING": "最后更新", - "SORT_BY_NAME": "名称", - "COMPRESS_THUMBNAILS": "压缩缩略图", - "THUMBNAIL_REPLACED": "缩略图已压缩", - "FIX_THUMBNAIL": "压缩", - "FIX_THUMBNAIL_LATER": "稍后压缩", - "REPLACE_THUMBNAIL_NOT_STARTED": "您的一些视频缩略图可以被压缩以节省空间,您想要ente 压缩它们吗?", - "REPLACE_THUMBNAIL_COMPLETED": "已成功压缩所有缩略图", - "REPLACE_THUMBNAIL_NOOP": "您没有可以进一步压缩的缩略图", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "无法压缩您的一些缩略图,请重试", - "FIX_CREATION_TIME": "固定时间", - "FIX_CREATION_TIME_IN_PROGRESS": "正在固定时间", - "CREATION_TIME_UPDATED": "文件时间已更新", - "UPDATE_CREATION_TIME_NOT_STARTED": "选择您想要使用的选项", - "UPDATE_CREATION_TIME_COMPLETED": "已成功更新所有文件", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "部分文件的文件时间更新失败,请重试", - "CAPTION_CHARACTER_LIMIT": "5000个字符上限", - "DATE_TIME_ORIGINAL": "EXIF:日期 时间 原始文件", - "DATE_TIME_DIGITIZED": "EXIF:日期 时间 数字化", - "METADATA_DATE": "EXIF:元数据日期", - "CUSTOM_TIME": "自定义时间", - "REOPEN_PLAN_SELECTOR_MODAL": "重新启动计划", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "未能打开计划", - "INSTALL": "安装", - "SHARING_DETAILS": "共享的详细信息", - "MODIFY_SHARING": "更改共享", - "ADD_COLLABORATORS": "添加协作者", - "ADD_NEW_EMAIL": "添加新的电子邮件", - "shared_with_people_zero": "与特定人员分享", - "shared_with_people_one": "已与1个人共享", - "shared_with_people_other": "已与 {count, number} 个人共享", - "participants_zero": "暂无参与者", - "participants_one": "1 名参与者", - "participants_other": "{{count, number}} 名参与者", - "ADD_VIEWERS": "添加查看者", - "PARTICIPANTS": "参与者", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} 将无法向相册添加更多照片

他们仍然可以删除他们添加的照片

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} 将能够将照片添加到相册", - "CONVERT_TO_VIEWER": "是的,转换为查看者", - "CONVERT_TO_COLLABORATOR": "是,转换为协作者", - "CHANGE_PERMISSION": "要修改权限吗?", - "REMOVE_PARTICIPANT": "要移除吗?", - "CONFIRM_REMOVE": "是,移除", - "MANAGE": "管理", - "ADDED_AS": "已添加为", - "COLLABORATOR_RIGHTS": "协作者可以将照片和视频添加到共享相册中", - "REMOVE_PARTICIPANT_HEAD": "移除参与者", - "OWNER": "所有者", - "COLLABORATORS": "协作者", - "ADD_MORE": "添加更多", - "VIEWERS": "查看者", - "OR_ADD_EXISTING": "或选择一个现有的", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} 将从相册中删除

他们添加的所有照片也将从相册中删除

", - "NOT_FOUND": "404 - 未找到", - "LINK_EXPIRED": "链接已过期", - "LINK_EXPIRED_MESSAGE": "此链接已过期或已被禁用!", - "MANAGE_LINK": "管理链接", - "LINK_TOO_MANY_REQUESTS": "这个相册太受欢迎,我们无法处理!", - "FILE_DOWNLOAD": "允许下载", - "LINK_PASSWORD_LOCK": "密码锁", - "PUBLIC_COLLECT": "允许添加照片", - "LINK_DEVICE_LIMIT": "设备限制", - "NO_DEVICE_LIMIT": "无", - "LINK_EXPIRY": "链接过期", - "NEVER": "永不", - "DISABLE_FILE_DOWNLOAD": "禁止下载", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

您确定要禁用文件下载按钮吗?

观看者仍然可以使用外部工具进行屏幕截图或保存您的照片副本。

", - "MALICIOUS_CONTENT": "哈哈哈急急急", - "COPYRIGHT": "不不不急急急就是", - "SHARED_USING": "分享方式 ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "使用代码 {{referralCode}} 获得 10 GB 免费空间", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "禁用密码锁", - "DISABLE_PASSWORD_MESSAGE": "您确定要禁用密码锁吗?", - "PASSWORD_LOCK": "密码锁", - "LOCK": "锁定", - "DOWNLOAD_UPLOAD_LOGS": "调试日志", - "UPLOAD_FILES": "文件", - "UPLOAD_DIRS": "文件夹", - "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", - "DEDUPLICATE_FILES": "删除重复文件", - "AUTHENTICATOR_SECTION": "身份验证器", - "NO_DUPLICATES_FOUND": "您没有可以清除的重复文件", - "CLUB_BY_CAPTURE_TIME": "按抓取时间断开", - "FILES": "文件", - "EACH": "每个", - "DEDUPLICATE_BASED_ON_SIZE": "以下文件根据大小进行了合并,请检查并删除您认为重复的项目", - "STOP_ALL_UPLOADS_MESSAGE": "您确定要停止所有正在进行的上传吗?", - "STOP_UPLOADS_HEADER": "要停止上传吗?", - "YES_STOP_UPLOADS": "是的,停止上传", - "STOP_DOWNLOADS_HEADER": "要停止下载吗?", - "YES_STOP_DOWNLOADS": "是,停止下载", - "STOP_ALL_DOWNLOADS_MESSAGE": "您确定要停止所有正在进行的下载?", - "albums_one": "1个相册", - "albums_other": "{{count, number}} 个相册", - "ALL_ALBUMS": "所有相册", - "ALBUMS": "相册", - "ALL_HIDDEN_ALBUMS": "所有隐藏的相册", - "HIDDEN_ALBUMS": "隐藏的相册", - "HIDDEN_ITEMS": "隐藏的项目", - "HIDDEN_ITEMS_SECTION_NAME": "隐藏的项目", - "ENTER_TWO_FACTOR_OTP": "请输入您从身份验证应用上获得的6位数代码", - "CREATE_ACCOUNT": "创建账户", - "COPIED": "已复制", - "CANVAS_BLOCKED_TITLE": "无法生成缩略图", - "CANVAS_BLOCKED_MESSAGE": "

看起来您的浏览器已禁用了需要为您的照片生成缩略图的canvas访问权限

请允许访问您浏览器的canvas, 或使用我们的桌面应用程序

", - "WATCH_FOLDERS": "观看文件夹", - "UPGRADE_NOW": "立即升级", - "RENEW_NOW": "立即续费", - "STORAGE": "存储空间", - "USED": "已使用", - "YOU": "您", - "FAMILY": "家庭", - "FREE": "空闲", - "OF": "/", - "WATCHED_FOLDERS": "观看文件夹", - "NO_FOLDERS_ADDED": "尚未添加任何文件夹!", - "FOLDERS_AUTOMATICALLY_MONITORED": "您在此处添加的文件夹将自动监控", - "UPLOAD_NEW_FILES_TO_ENTE": "上传新文件至 ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "从ente 移除已删除的文件", - "ADD_FOLDER": "添加文件夹", - "STOP_WATCHING": "停止监控", - "STOP_WATCHING_FOLDER": "要停止监控文件夹?", - "STOP_WATCHING_DIALOG_MESSAGE": "您现有的文件不会被删除,但 ente 将停止自动更新链接的 ente 相册在此文件夹中的更改。", - "YES_STOP": "是的,停止", - "MONTH_SHORT": "月", - "YEAR": "年", - "FAMILY_PLAN": "家庭计划", - "DOWNLOAD_LOGS": "下载日志", - "DOWNLOAD_LOGS_MESSAGE": "

这将下载调试日志,您可以发送电子邮件给我们来帮助调试您的问题。

请注意文件名将被包含,以帮助跟踪特定文件中的问题。

", - "CHANGE_FOLDER": "更改文件夹", - "TWO_MONTHS_FREE": "在年度计划上免费获得 2 个月", - "GB": "GB", - "POPULAR": "流行的", - "FREE_PLAN_OPTION_LABEL": "继续免费试用", - "FREE_PLAN_DESCRIPTION": "1 GB 1年", - "CURRENT_USAGE": "当前使用量是 {{usage}}", - "WEAK_DEVICE": "您使用的网络浏览器功能不够强大,无法加密您的照片。 请尝试在电脑上登录ente,或下载ente移动/桌面应用程序。", - "DRAG_AND_DROP_HINT": "或者拖动并拖动到 ente 窗口", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "您上传的数据将被安排删除,您的账户将被永久删除。

此操作不可逆。", - "AUTHENTICATE": "身份认证", - "UPLOADED_TO_SINGLE_COLLECTION": "已上传到单个收藏", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "已上传到单独收藏", - "NEVERMIND": "没关系", - "UPDATE_AVAILABLE": "有可用的更新", - "UPDATE_INSTALLABLE_MESSAGE": "新版本的 ente 已准备好安装。", - "INSTALL_NOW": "立即安装", - "INSTALL_ON_NEXT_LAUNCH": "在下次启动时安装", - "UPDATE_AVAILABLE_MESSAGE": "新版本的 ente 已发布,但无法自动下载和安装。", - "DOWNLOAD_AND_INSTALL": "下载并安装", - "IGNORE_THIS_VERSION": "忽略该版本", - "TODAY": "今天", - "YESTERDAY": "昨天", - "NAME_PLACEHOLDER": "名称...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "无法从文件/文件夹组合中创建相册", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

你已拖放了文件和文件夹的组合。

选择创建单独相册的选项时,请只提供文件或只提供文件夹

", - "CHOSE_THEME": "选择主题", - "ML_SEARCH": "ML 搜索 (测试版)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

这将启用设备上的机器学习和面部搜索,这将开始分析您上传的本地照片。

在登录或启用此功能后第一次运行时,它将下载本地设备上的所有图像来分析。 所以请只在您可以使用带宽和本地处理您的照片库中的所有图像时启用此功能。

如果这是您首次启用此功能,我们也会请求您处理面部数据的许可。

", - "ML_MORE_DETAILS": "更多详情", - "ENABLE_FACE_SEARCH": "启用面部搜索", - "ENABLE_FACE_SEARCH_TITLE": "要启用面部搜索吗?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

如果您启用面部搜索,ente 将从照片中提取脸部几何形状。 这将发生在您的设备上,任何生成的生物测定数据都将是端到端加密的。

请单击此处以在我们的隐私政策中了解有关此功能的更多详细信息

", - "DISABLE_BETA": "禁用beta", - "DISABLE_FACE_SEARCH": "禁用面部搜索", - "DISABLE_FACE_SEARCH_TITLE": "要禁用面部搜索吗?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente 将停止处理面部的几何形状, 并将禁用 ML 搜索 (测试版)

如果您愿意,您可以重新启用面部搜索,因此该操作是安全的。

", - "ADVANCED": "高级设置", - "FACE_SEARCH_CONFIRMATION": "我理解,并希望允许ente处理面部几何形状", - "LABS": "实验室", - "YOURS": "你的", - "PASSPHRASE_STRENGTH_WEAK": "密码强度:较弱", - "PASSPHRASE_STRENGTH_MODERATE": "密码强度:中度", - "PASSPHRASE_STRENGTH_STRONG": "密码强度:强", - "PREFERENCES": "首选项", - "LANGUAGE": "语言", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "无效的导出目录", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

您选择的导出目录不存在。

请选择一个有效的目录。

", - "SUBSCRIPTION_VERIFICATION_ERROR": "订阅验证失败", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "1小时后", - "DAY": "一天后", - "WEEK": "一周后", - "MONTH": "一个月后", - "YEAR": "一年后" - }, - "COPY_LINK": "复制链接", - "DONE": "已完成", - "LINK_SHARE_TITLE": "或共享一个链接", - "REMOVE_LINK": "移除链接", - "CREATE_PUBLIC_SHARING": "创建公开链接", - "PUBLIC_LINK_CREATED": "公开链接已创建", - "PUBLIC_LINK_ENABLED": "公开链接已启用", - "COLLECT_PHOTOS": "收集照片", - "PUBLIC_COLLECT_SUBTEXT": "允许具有链接的人也将照片添加到共享相册。", - "STOP_EXPORT": "停止", - "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} 个文件已导出", - "MIGRATING_EXPORT": "准备中...", - "RENAMING_COLLECTION_FOLDERS": "正在重命名相册文件夹...", - "TRASHING_DELETED_FILES": "正在回收删除的文件...", - "TRASHING_DELETED_COLLECTIONS": "正在回收已删除的相册...", - "EXPORT_NOTIFICATION": { - "START": "导出已开始", - "IN_PROGRESS": "导出已在进行中", - "FINISH": "导出完成", - "UP_TO_DATE": "没有新文件可导出" - }, - "CONTINUOUS_EXPORT": "持续同步", - "TOTAL_ITEMS": "项目总计", - "PENDING_ITEMS": "待处理的项目", - "EXPORT_STARTING": "导出开始...", - "DELETE_ACCOUNT_REASON_LABEL": "您删除账户的主要原因是什么?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "选择一个原因", - "DELETE_REASON": { - "MISSING_FEATURE": "找不到我想要的功能", - "BROKEN_BEHAVIOR": "该应用或某个功能不符合我认为应该做的行为", - "FOUND_ANOTHER_SERVICE": "我发现另一个产品更好用", - "NOT_LISTED": "我的原因未被列出" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "我们很抱歉看到您离开。请解释您为什么要离开来帮助我们改进。", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "反馈", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "是的,我想永久删除此账户及其相关数据", - "CONFIRM_DELETE_ACCOUNT": "确认删除账户", - "FEEDBACK_REQUIRED": "请帮助我们了解这个信息", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "其他服务做得更好?", - "RECOVER_TWO_FACTOR": "恢复双因素认证", - "at": "在", - "AUTH_NEXT": "下一个", - "AUTH_DOWNLOAD_MOBILE_APP": "下载我们的移动应用程序来管理您的密钥", - "HIDDEN": "已隐藏", - "HIDE": "隐藏", - "UNHIDE": "取消隐藏", - "UNHIDE_TO_COLLECTION": "取消隐藏到相册", - "SORT_BY": "排序方式", - "NEWEST_FIRST": "最新在前", - "OLDEST_FIRST": "最旧在前", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "无法预览此文件。点击这里下载原始文件。", - "SELECT_COLLECTION": "选择相册", - "PIN_ALBUM": "置顶相册", - "UNPIN_ALBUM": "取消置顶相册", - "DOWNLOAD_COMPLETE": "下载完成", - "DOWNLOADING_COLLECTION": "正在下载 {{name}}", - "DOWNLOAD_FAILED": "下载失败", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} 个文件", - "CHRISTMAS": "圣诞", - "CHRISTMAS_EVE": "平安夜", - "NEW_YEAR": "新年", - "NEW_YEAR_EVE": "除夕", - "IMAGE": "图像", - "VIDEO": "视频", - "LIVE_PHOTO": "实况照片", - "CONVERT": "转换", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "您确定要关闭编辑器吗?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "下载已编辑的图片或将副本保存到 ente 以保留您的更改。", - "BRIGHTNESS": "亮度", - "CONTRAST": "对比度", - "SATURATION": "饱和度", - "BLUR": "模糊", - "INVERT_COLORS": "反相颜色", - "ASPECT_RATIO": "长宽比", - "SQUARE": "面积", - "ROTATE_LEFT": "向左旋转", - "ROTATE_RIGHT": "向右旋转", - "FLIP_VERTICALLY": "垂直翻转", - "FLIP_HORIZONTALLY": "水平翻转", - "DOWNLOAD_EDITED": "下载已编辑图片", - "SAVE_A_COPY_TO_ENTE": "保存副本到 ente", - "RESTORE_ORIGINAL": "复原", - "TRANSFORM": "转换", - "COLORS": "颜色", - "FLIP": "上下翻转", - "ROTATION": "回转", - "RESET": "重设", - "PHOTO_EDITOR": "照片编辑器", - "FASTER_UPLOAD": "更快上传", - "FASTER_UPLOAD_DESCRIPTION": "通过附近的服务器路由上传", - "MAGIC_SEARCH_STATUS": "魔法搜索状态", - "INDEXED_ITEMS": "索引项目", - "CAST_ALBUM_TO_TV": "在电视上播放相册", - "ENTER_CAST_PIN_CODE": "输入您在下面的电视上看到的代码来配对此设备。", - "PAIR_DEVICE_TO_TV": "配对设备", - "TV_NOT_FOUND": "未找到电视。您输入的 PIN 码正确吗?", - "AUTO_CAST_PAIR": "自动配对", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "自动配对需要连接到 Google 服务器,且仅适用于支持 Chromecast 的设备。Google 不会接收敏感数据,例如您的照片。", - "PAIR_WITH_PIN": "用 PIN 配对", - "CHOOSE_DEVICE_FROM_BROWSER": "从浏览器弹出窗口中选择兼容 Cast 的设备。", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "用 PIN 配对适用于任何大屏幕设备,您可以在这些设备上播放您的相册。", - "VISIT_CAST_ENTE_IO": "在您要配对的设备上访问 cast.ente.io 。", - "CAST_AUTO_PAIR_FAILED": "Chromecast 自动配对失败。请再试一次。", - "CACHE_DIRECTORY": "缓存文件夹", - "FREEHAND": "手画", - "APPLY_CROP": "应用裁剪", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "保存之前必须至少执行一项转换或颜色调整。", - "PASSKEYS": "通行密钥", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/cast/src/components/FilledCircleCheck.tsx b/web/apps/cast/src/components/FilledCircleCheck.tsx new file mode 100644 index 000000000..c0635f138 --- /dev/null +++ b/web/apps/cast/src/components/FilledCircleCheck.tsx @@ -0,0 +1,64 @@ +import { styled } from "@mui/material"; + +const FilledCircleCheck = () => { + return ( + + + + + + + ); +}; + +export default FilledCircleCheck; + +const Container = styled("div")` + width: 100px; + height: 100px; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + overflow: hidden; + animation: scaleIn 0.3s ease-in-out forwards; + + @keyframes scaleIn { + 0% { + transform: scale(0); + } + 50% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + } + } + + svg { + width: 100px; + height: 100px; + + circle { + fill: green; + } + + path { + transform-origin: 50% 50%; + stroke-dasharray: 48; + stroke-dashoffset: 48; + animation: strokeCheck 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.6s + forwards; + stroke: white; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; + } + } + + @keyframes strokeCheck { + 100% { + stroke-dashoffset: 0; + } + } +`; diff --git a/web/apps/cast/src/components/FilledCircleCheck/FilledCircleCheck.module.scss b/web/apps/cast/src/components/FilledCircleCheck/FilledCircleCheck.module.scss deleted file mode 100644 index 535a2448a..000000000 --- a/web/apps/cast/src/components/FilledCircleCheck/FilledCircleCheck.module.scss +++ /dev/null @@ -1,51 +0,0 @@ -.circle { - width: 100px; - height: 100px; - display: flex; - justify-content: center; - align-items: center; - border-radius: 50%; - overflow: hidden; - - &.animate { - animation: scaleIn 0.3s ease-in-out forwards; - } -} - -@keyframes scaleIn { - 0% { - transform: scale(0); - } - 50% { - transform: scale(1.1); - } - 100% { - transform: scale(1); - } -} - -.checkmark { - width: 100px; - height: 100px; - - &__circle { - fill: green; - } - - &__check { - transform-origin: 50% 50%; - stroke-dasharray: 48; - stroke-dashoffset: 48; - animation: strokeCheck 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.6s forwards; - stroke: white; - stroke-width: 2; - stroke-linecap: round; - stroke-linejoin: round; - } -} - -@keyframes strokeCheck { - 100% { - stroke-dashoffset: 0; - } -} diff --git a/web/apps/cast/src/components/FilledCircleCheck/index.tsx b/web/apps/cast/src/components/FilledCircleCheck/index.tsx deleted file mode 100644 index cce8c935f..000000000 --- a/web/apps/cast/src/components/FilledCircleCheck/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useEffect, useState } from "react"; -import styles from "./FilledCircleCheck.module.scss"; // Import our CSS module - -const FilledCircleCheck = () => { - const [animate, setAnimate] = useState(false); - - useEffect(() => { - setAnimate(true); - }, []); - - return ( -
- - - - -
- ); -}; - -export default FilledCircleCheck; diff --git a/web/apps/cast/src/components/LargeType.tsx b/web/apps/cast/src/components/LargeType.tsx index bb0728699..ecf7a201b 100644 --- a/web/apps/cast/src/components/LargeType.tsx +++ b/web/apps/cast/src/components/LargeType.tsx @@ -1,3 +1,5 @@ +import { styled } from "@mui/material"; + const colourPool = [ "#87CEFA", // Light Blue "#90EE90", // Light Green @@ -23,44 +25,41 @@ const colourPool = [ export default function LargeType({ chars }: { chars: string[] }) { return ( - + {chars.map((char, i) => ( - - - {char} - - - {i + 1} - - + {char} + ))} -
+ ); } + +const Container = styled("div")` + font-size: 4rem; + font-weight: bold; + font-family: monospace; + + line-height: 1.2; + + /* + * - We want them to be spans so that when the text is copy pasted, there + * is no extra whitespace inserted. + * + * - But we also want them to have a block level padding. + * + * To achieve both these goals, make them inline-blocks + */ + span { + display: inline-block; + padding: 0.5rem; + } +`; diff --git a/web/apps/cast/src/components/PhotoAuditorium.tsx b/web/apps/cast/src/components/PhotoAuditorium.tsx new file mode 100644 index 000000000..0042dfe95 --- /dev/null +++ b/web/apps/cast/src/components/PhotoAuditorium.tsx @@ -0,0 +1,95 @@ +import { SlideshowContext } from "pages/slideshow"; +import { useContext, useEffect, useState } from "react"; + +export default function PhotoAuditorium({ + url, + nextSlideUrl, +}: { + url: string; + nextSlideUrl: string; +}) { + const { showNextSlide } = useContext(SlideshowContext); + + const [showPreloadedNextSlide, setShowPreloadedNextSlide] = useState(false); + const [nextSlidePrerendered, setNextSlidePrerendered] = useState(false); + const [prerenderTime, setPrerenderTime] = useState(null); + + useEffect(() => { + let timeout: NodeJS.Timeout; + let timeout2: NodeJS.Timeout; + + if (nextSlidePrerendered) { + const elapsedTime = prerenderTime ? Date.now() - prerenderTime : 0; + const delayTime = Math.max(10000 - elapsedTime, 0); + + if (elapsedTime >= 10000) { + setShowPreloadedNextSlide(true); + } else { + timeout = setTimeout(() => { + setShowPreloadedNextSlide(true); + }, delayTime); + } + + if (showNextSlide) { + timeout2 = setTimeout(() => { + showNextSlide(); + setNextSlidePrerendered(false); + setPrerenderTime(null); + setShowPreloadedNextSlide(false); + }, delayTime); + } + } + + return () => { + if (timeout) clearTimeout(timeout); + if (timeout2) clearTimeout(timeout2); + }; + }, [nextSlidePrerendered, showNextSlide, prerenderTime]); + + return ( +
+
+ + { + setNextSlidePrerendered(true); + setPrerenderTime(Date.now()); + }} + /> +
+
+ ); +} diff --git a/web/apps/cast/src/components/Theatre/PhotoAuditorium.tsx b/web/apps/cast/src/components/Theatre/PhotoAuditorium.tsx index dc5a18f0b..0042dfe95 100644 --- a/web/apps/cast/src/components/Theatre/PhotoAuditorium.tsx +++ b/web/apps/cast/src/components/Theatre/PhotoAuditorium.tsx @@ -20,9 +20,9 @@ export default function PhotoAuditorium({ if (nextSlidePrerendered) { const elapsedTime = prerenderTime ? Date.now() - prerenderTime : 0; - const delayTime = Math.max(5000 - elapsedTime, 0); + const delayTime = Math.max(10000 - elapsedTime, 0); - if (elapsedTime >= 5000) { + if (elapsedTime >= 10000) { setShowPreloadedNextSlide(true); } else { timeout = setTimeout(() => { diff --git a/web/apps/cast/src/components/TimerBar.tsx b/web/apps/cast/src/components/TimerBar.tsx deleted file mode 100644 index 7f4d02171..000000000 --- a/web/apps/cast/src/components/TimerBar.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useEffect, useState } from "react"; - -export default function TimerBar({ percentage }: { percentage: number }) { - const okColor = "#75C157"; - const warningColor = "#FFC000"; - const lateColor = "#FF0000"; - - const [backgroundColor, setBackgroundColor] = useState(okColor); - - useEffect(() => { - if (percentage >= 40) { - setBackgroundColor(okColor); - } else if (percentage >= 20) { - setBackgroundColor(warningColor); - } else { - setBackgroundColor(lateColor); - } - }, [percentage]); - - return ( -
- ); -} diff --git a/web/apps/cast/src/constants/api.ts b/web/apps/cast/src/constants/api.ts deleted file mode 100644 index 17571f7f3..000000000 --- a/web/apps/cast/src/constants/api.ts +++ /dev/null @@ -1 +0,0 @@ -export const REQUEST_BATCH_SIZE = 1000; diff --git a/web/apps/cast/src/constants/apps.ts b/web/apps/cast/src/constants/apps.ts deleted file mode 100644 index f8c3f9657..000000000 --- a/web/apps/cast/src/constants/apps.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { getAlbumsURL } from "@ente/shared/network/api"; -import { runningInBrowser } from "@ente/shared/platform"; -import { PAGES } from "constants/pages"; - -export enum APPS { - PHOTOS = "PHOTOS", - AUTH = "AUTH", - ALBUMS = "ALBUMS", -} - -export const ALLOWED_APP_PAGES = new Map([ - [APPS.ALBUMS, [PAGES.SHARED_ALBUMS, PAGES.ROOT]], - [ - APPS.AUTH, - [ - PAGES.ROOT, - PAGES.LOGIN, - PAGES.SIGNUP, - PAGES.VERIFY, - PAGES.CREDENTIALS, - PAGES.RECOVER, - PAGES.CHANGE_PASSWORD, - PAGES.GENERATE, - PAGES.AUTH, - PAGES.TWO_FACTOR_VERIFY, - PAGES.TWO_FACTOR_RECOVER, - ], - ], -]); - -export const CLIENT_PACKAGE_NAMES = new Map([ - [APPS.ALBUMS, "io.ente.albums.web"], - [APPS.PHOTOS, "io.ente.photos.web"], - [APPS.AUTH, "io.ente.auth.web"], -]); - -export const getAppNameAndTitle = () => { - if (!runningInBrowser()) { - return {}; - } - const currentURL = new URL(window.location.href); - const albumsURL = new URL(getAlbumsURL()); - if (currentURL.origin === albumsURL.origin) { - return { name: APPS.ALBUMS, title: "ente Photos" }; - } else { - return { name: APPS.PHOTOS, title: "ente Photos" }; - } -}; - -export const getAppTitle = () => { - return getAppNameAndTitle().title; -}; - -export const getAppName = () => { - return getAppNameAndTitle().name; -}; diff --git a/web/apps/cast/src/constants/cache.ts b/web/apps/cast/src/constants/cache.ts deleted file mode 100644 index cf88f63a2..000000000 --- a/web/apps/cast/src/constants/cache.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum CACHES { - THUMBS = "thumbs", - FACE_CROPS = "face-crops", - FILES = "files", -} diff --git a/web/apps/cast/src/constants/collection.ts b/web/apps/cast/src/constants/collection.ts index cc2c00052..d91cfc81d 100644 --- a/web/apps/cast/src/constants/collection.ts +++ b/web/apps/cast/src/constants/collection.ts @@ -1,10 +1,3 @@ -export const ARCHIVE_SECTION = -1; -export const TRASH_SECTION = -2; -export const DUMMY_UNCATEGORIZED_COLLECTION = -3; -export const HIDDEN_ITEMS_SECTION = -4; -export const ALL_SECTION = 0; -export const DEFAULT_HIDDEN_COLLECTION_USER_FACING_NAME = "Hidden"; - export enum CollectionType { folder = "folder", favorites = "favorites", @@ -29,72 +22,3 @@ export enum CollectionSummaryType { hiddenItems = "hiddenItems", pinned = "pinned", } -export enum COLLECTION_LIST_SORT_BY { - NAME, - CREATION_TIME_ASCENDING, - UPDATION_TIME_DESCENDING, -} - -export const COLLECTION_SHARE_DEFAULT_VALID_DURATION = - 10 * 24 * 60 * 60 * 1000 * 1000; -export const COLLECTION_SHARE_DEFAULT_DEVICE_LIMIT = 4; - -export const COLLECTION_SORT_ORDER = new Map([ - [CollectionSummaryType.all, 0], - [CollectionSummaryType.hiddenItems, 0], - [CollectionSummaryType.uncategorized, 1], - [CollectionSummaryType.favorites, 2], - [CollectionSummaryType.pinned, 3], - [CollectionSummaryType.album, 4], - [CollectionSummaryType.folder, 4], - [CollectionSummaryType.incomingShareViewer, 4], - [CollectionSummaryType.incomingShareCollaborator, 4], - [CollectionSummaryType.outgoingShare, 4], - [CollectionSummaryType.sharedOnlyViaLink, 4], - [CollectionSummaryType.archived, 4], - [CollectionSummaryType.archive, 5], - [CollectionSummaryType.trash, 6], - [CollectionSummaryType.defaultHidden, 7], -]); - -export const SYSTEM_COLLECTION_TYPES = new Set([ - CollectionSummaryType.all, - CollectionSummaryType.archive, - CollectionSummaryType.trash, - CollectionSummaryType.uncategorized, - CollectionSummaryType.hiddenItems, - CollectionSummaryType.defaultHidden, -]); - -export const ADD_TO_NOT_ALLOWED_COLLECTION = new Set([ - CollectionSummaryType.all, - CollectionSummaryType.archive, - CollectionSummaryType.incomingShareViewer, - CollectionSummaryType.trash, - CollectionSummaryType.uncategorized, - CollectionSummaryType.defaultHidden, - CollectionSummaryType.hiddenItems, -]); - -export const MOVE_TO_NOT_ALLOWED_COLLECTION = new Set([ - CollectionSummaryType.all, - CollectionSummaryType.archive, - CollectionSummaryType.incomingShareViewer, - CollectionSummaryType.incomingShareCollaborator, - CollectionSummaryType.trash, - CollectionSummaryType.uncategorized, - CollectionSummaryType.defaultHidden, - CollectionSummaryType.hiddenItems, -]); - -export const OPTIONS_NOT_HAVING_COLLECTION_TYPES = new Set([ - CollectionSummaryType.all, - CollectionSummaryType.archive, -]); - -export const HIDE_FROM_COLLECTION_BAR_TYPES = new Set([ - CollectionSummaryType.trash, - CollectionSummaryType.archive, - CollectionSummaryType.uncategorized, - CollectionSummaryType.defaultHidden, -]); diff --git a/web/apps/cast/src/constants/ffmpeg.ts b/web/apps/cast/src/constants/ffmpeg.ts deleted file mode 100644 index 9ecc41eb5..000000000 --- a/web/apps/cast/src/constants/ffmpeg.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const INPUT_PATH_PLACEHOLDER = "INPUT"; -export const FFMPEG_PLACEHOLDER = "FFMPEG"; -export const OUTPUT_PATH_PLACEHOLDER = "OUTPUT"; diff --git a/web/apps/cast/src/constants/file.ts b/web/apps/cast/src/constants/file.ts index 46065136c..9be574638 100644 --- a/web/apps/cast/src/constants/file.ts +++ b/web/apps/cast/src/constants/file.ts @@ -1,14 +1,3 @@ -export const MIN_EDITED_CREATION_TIME = new Date(1800, 0, 1); -export const MAX_EDITED_CREATION_TIME = new Date(); - -export const MAX_EDITED_FILE_NAME_LENGTH = 100; -export const MAX_CAPTION_SIZE = 5000; - -export const TYPE_HEIC = "heic"; -export const TYPE_HEIF = "heif"; -export const TYPE_JPEG = "jpeg"; -export const TYPE_JPG = "jpg"; - export enum FILE_TYPE { IMAGE, VIDEO, @@ -29,15 +18,3 @@ export const RAW_FORMATS = [ "dng", "tif", ]; -export const SUPPORTED_RAW_FORMATS = [ - "heic", - "rw2", - "tiff", - "arw", - "cr3", - "cr2", - "nef", - "psd", - "dng", - "tif", -]; diff --git a/web/apps/cast/src/constants/gallery.ts b/web/apps/cast/src/constants/gallery.ts deleted file mode 100644 index 9865d2e80..000000000 --- a/web/apps/cast/src/constants/gallery.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const GAP_BTW_TILES = 4; -export const DATE_CONTAINER_HEIGHT = 48; -export const SIZE_AND_COUNT_CONTAINER_HEIGHT = 72; -export const IMAGE_CONTAINER_MAX_HEIGHT = 180; -export const IMAGE_CONTAINER_MAX_WIDTH = 180; -export const MIN_COLUMNS = 4; -export const SPACE_BTW_DATES = 44; -export const SPACE_BTW_DATES_TO_IMAGE_CONTAINER_WIDTH_RATIO = 0.244; - -export enum PLAN_PERIOD { - MONTH = "month", - YEAR = "year", -} - -export const SYNC_INTERVAL_IN_MICROSECONDS = 1000 * 60 * 5; // 5 minutes diff --git a/web/apps/cast/src/constants/pages.ts b/web/apps/cast/src/constants/pages.ts deleted file mode 100644 index af532801d..000000000 --- a/web/apps/cast/src/constants/pages.ts +++ /dev/null @@ -1,20 +0,0 @@ -export enum PAGES { - CHANGE_EMAIL = "/change-email", - CHANGE_PASSWORD = "/change-password", - CREDENTIALS = "/credentials", - GALLERY = "/gallery", - GENERATE = "/generate", - LOGIN = "/login", - RECOVER = "/recover", - SIGNUP = "/signup", - TWO_FACTOR_SETUP = "/two-factor/setup", - TWO_FACTOR_VERIFY = "/two-factor/verify", - TWO_FACTOR_RECOVER = "/two-factor/recover", - VERIFY = "/verify", - ROOT = "/", - SHARED_ALBUMS = "/shared-albums", - // ML_DEBUG = '/ml-debug', - DEDUPLICATE = "/deduplicate", - // AUTH page is used to show (auth)enticator codes - AUTH = "/auth", -} diff --git a/web/apps/cast/src/constants/upload.ts b/web/apps/cast/src/constants/upload.ts index bc6006e46..63d044fb4 100644 --- a/web/apps/cast/src/constants/upload.ts +++ b/web/apps/cast/src/constants/upload.ts @@ -1,11 +1,5 @@ -import { ENCRYPTION_CHUNK_SIZE } from "@ente/shared/crypto/constants"; import { FILE_TYPE } from "constants/file"; -import { - FileTypeInfo, - ImportSuggestion, - Location, - ParsedExtractedMetadata, -} from "types/upload"; +import { FileTypeInfo } from "types/upload"; // list of format that were missed by type-detection for some files. export const WHITELISTED_FILE_FORMATS: FileTypeInfo[] = [ @@ -45,98 +39,3 @@ export const WHITELISTED_FILE_FORMATS: FileTypeInfo[] = [ ]; export const KNOWN_NON_MEDIA_FORMATS = ["xmp", "html", "txt"]; - -export const EXIFLESS_FORMATS = ["gif", "bmp"]; - -// this is the chunk size of the un-encrypted file which is read and encrypted before uploading it as a single part. -export const MULTIPART_PART_SIZE = 20 * 1024 * 1024; - -export const FILE_READER_CHUNK_SIZE = ENCRYPTION_CHUNK_SIZE; - -export const FILE_CHUNKS_COMBINED_FOR_A_UPLOAD_PART = Math.floor( - MULTIPART_PART_SIZE / FILE_READER_CHUNK_SIZE, -); - -export const RANDOM_PERCENTAGE_PROGRESS_FOR_PUT = () => 90 + 10 * Math.random(); - -export const NULL_LOCATION: Location = { latitude: null, longitude: null }; - -export enum UPLOAD_STAGES { - START, - READING_GOOGLE_METADATA_FILES, - EXTRACTING_METADATA, - UPLOADING, - CANCELLING, - FINISH, -} - -export enum UPLOAD_STRATEGY { - SINGLE_COLLECTION, - COLLECTION_PER_FOLDER, -} - -export enum UPLOAD_RESULT { - FAILED, - ALREADY_UPLOADED, - UNSUPPORTED, - BLOCKED, - TOO_LARGE, - LARGER_THAN_AVAILABLE_STORAGE, - UPLOADED, - UPLOADED_WITH_STATIC_THUMBNAIL, - ADDED_SYMLINK, -} - -export enum PICKED_UPLOAD_TYPE { - FILES = "files", - FOLDERS = "folders", - ZIPS = "zips", -} - -export const MAX_FILE_SIZE_SUPPORTED = 4 * 1024 * 1024 * 1024; // 4 GB - -export const LIVE_PHOTO_ASSET_SIZE_LIMIT = 20 * 1024 * 1024; // 20MB - -export const NULL_EXTRACTED_METADATA: ParsedExtractedMetadata = { - location: NULL_LOCATION, - creationTime: null, - width: null, - height: null, -}; - -export const A_SEC_IN_MICROSECONDS = 1e6; - -export const DEFAULT_IMPORT_SUGGESTION: ImportSuggestion = { - rootFolderName: "", - hasNestedFolders: false, - hasRootLevelFileWithFolder: false, -}; - -export const BLACK_THUMBNAIL_BASE64 = - "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEB" + - "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQ" + - "EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARC" + - "ACWASwDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF" + - "BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk" + - "6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztL" + - "W2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAA" + - "AAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVY" + - "nLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK" + - "kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oAD" + - "AMBAAIRAxEAPwD/AD/6ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA" + - "CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg" + - "AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC" + - "gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo" + - "AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg" + - "AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg" + - "AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA" + - "CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA" + - "CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA" + - "KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg" + - "AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo" + - "AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA" + - "CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK" + - "ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA" + - "KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo" + - "AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo" + - "AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgD/9k="; diff --git a/web/apps/cast/src/constants/urls.ts b/web/apps/cast/src/constants/urls.ts deleted file mode 100644 index b5b453c31..000000000 --- a/web/apps/cast/src/constants/urls.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const ENTE_WEBSITE_LINK = "https://ente.io"; - -export const ML_BLOG_LINK = "https://ente.io/blog/desktop-ml-beta"; - -export const FACE_SEARCH_PRIVACY_POLICY_LINK = - "https://ente.io/privacy#8-biometric-information-privacy-policy"; - -export const SUPPORT_EMAIL = "support@ente.io"; - -export const APP_DOWNLOAD_URL = "https://ente.io/download/desktop"; - -export const FEEDBACK_EMAIL = "feedback@ente.io"; - -export const DELETE_ACCOUNT_EMAIL = "account-deletion@ente.io"; - -export const WEB_ROADMAP_URL = "https://github.com/ente-io/ente/discussions"; - -export const DESKTOP_ROADMAP_URL = - "https://github.com/ente-io/ente/discussions"; diff --git a/web/apps/cast/src/pages/_app.tsx b/web/apps/cast/src/pages/_app.tsx index 8874d956d..99b047d41 100644 --- a/web/apps/cast/src/pages/_app.tsx +++ b/web/apps/cast/src/pages/_app.tsx @@ -1,22 +1,28 @@ -import { APPS } from "@ente/shared/apps/constants"; +import { CustomHead } from "@/next/components/Head"; +import { logUnhandledErrorsAndRejections } from "@/next/log-web"; +import { APPS, APP_TITLES } from "@ente/shared/apps/constants"; import { getTheme } from "@ente/shared/themes"; import { THEME_COLOR } from "@ente/shared/themes/constants"; import { CssBaseline, ThemeProvider } from "@mui/material"; import type { AppProps } from "next/app"; +import { useEffect } from "react"; + import "styles/global.css"; export default function App({ Component, pageProps }: AppProps) { - return ( - - + useEffect(() => { + logUnhandledErrorsAndRejections(true); + return () => logUnhandledErrorsAndRejections(false); + }, []); -
+ return ( + <> + + + + -
-
+ + ); } diff --git a/web/apps/cast/src/pages/_document.tsx b/web/apps/cast/src/pages/_document.tsx deleted file mode 100644 index b038dc04e..000000000 --- a/web/apps/cast/src/pages/_document.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Head, Html, Main, NextScript } from "next/document"; - -export default function Document() { - return ( - - - -
- - - - ); -} diff --git a/web/apps/cast/src/pages/index.tsx b/web/apps/cast/src/pages/index.tsx index dcdee782b..ce3ec3763 100644 --- a/web/apps/cast/src/pages/index.tsx +++ b/web/apps/cast/src/pages/index.tsx @@ -1,13 +1,13 @@ +import log from "@/next/log"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import { boxSealOpen, toB64 } from "@ente/shared/crypto/internal/libsodium"; -import { useCastReceiver } from "@ente/shared/hooks/useCastReceiver"; -import { addLogLine } from "@ente/shared/logging"; import castGateway from "@ente/shared/network/cast"; import LargeType from "components/LargeType"; import _sodium from "libsodium-wrappers"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { storeCastData } from "services/cast/castService"; +import { useCastReceiver } from "../utils/useCastReceiver"; // Function to generate cryptographically secure digits const generateSecureData = (length: number): Uint8Array => { @@ -60,7 +60,7 @@ export default function PairingMode() { ); context.start(options); } catch (e) { - addLogLine(e, "failed to create cast context"); + log.error("failed to create cast context", e); } setIsCastReady(true); return () => { diff --git a/web/apps/cast/src/pages/slideshow.tsx b/web/apps/cast/src/pages/slideshow.tsx index a49d497de..692e61154 100644 --- a/web/apps/cast/src/pages/slideshow.tsx +++ b/web/apps/cast/src/pages/slideshow.tsx @@ -1,4 +1,4 @@ -import { logError } from "@ente/shared/sentry"; +import log from "@/next/log"; import PairedSuccessfullyOverlay from "components/PairedSuccessfullyOverlay"; import Theatre from "components/Theatre"; import { FILE_TYPE } from "constants/file"; @@ -54,17 +54,7 @@ export default function Slideshow() { ); } } catch (e) { - logError(e, "error during sync"); - router.push("/"); - } - }; - - const init = async () => { - try { - const castToken = window.localStorage.getItem("castToken"); - setCastToken(castToken); - } catch (e) { - logError(e, "error during sync"); + log.error("error during sync", e); router.push("/"); } }; @@ -73,7 +63,8 @@ export default function Slideshow() { if (castToken) { const intervalId = setInterval(() => { syncCastFiles(castToken); - }, 5000); + }, 10000); + syncCastFiles(castToken); return () => clearInterval(intervalId); } @@ -105,7 +96,20 @@ export default function Slideshow() { const router = useRouter(); useEffect(() => { - init(); + try { + const castToken = window.localStorage.getItem("castToken"); + // Wait 2 seconds to ensure the green tick and the confirmation + // message remains visible for at least 2 seconds before we start + // the slideshow. + const timeoutId = setTimeout(() => { + setCastToken(castToken); + }, 2000); + + return () => clearTimeout(timeoutId); + } catch (e) { + log.error("error during sync", e); + router.push("/"); + } }, []); useEffect(() => { diff --git a/web/apps/cast/src/services/InMemoryStore.ts b/web/apps/cast/src/services/InMemoryStore.ts deleted file mode 100644 index 88e77b869..000000000 --- a/web/apps/cast/src/services/InMemoryStore.ts +++ /dev/null @@ -1,31 +0,0 @@ -export enum MS_KEYS { - SRP_CONFIGURE_IN_PROGRESS = "srpConfigureInProgress", - REDIRECT_URL = "redirectUrl", -} - -type StoreType = Map, any>; - -class InMemoryStore { - private store: StoreType = new Map(); - - get(key: MS_KEYS) { - return this.store.get(key); - } - - set(key: MS_KEYS, value: any) { - this.store.set(key, value); - } - - delete(key: MS_KEYS) { - this.store.delete(key); - } - - has(key: MS_KEYS) { - return this.store.has(key); - } - clear() { - this.store.clear(); - } -} - -export default new InMemoryStore(); diff --git a/web/apps/cast/src/services/cache/cacheStorageFactory.ts b/web/apps/cast/src/services/cache/cacheStorageFactory.ts deleted file mode 100644 index c4474b29e..000000000 --- a/web/apps/cast/src/services/cache/cacheStorageFactory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { LimitedCacheStorage } from "types/cache/index"; - -class cacheStorageFactory { - getCacheStorage(): LimitedCacheStorage { - return transformBrowserCacheStorageToLimitedCacheStorage(caches); - } -} - -export const CacheStorageFactory = new cacheStorageFactory(); - -function transformBrowserCacheStorageToLimitedCacheStorage( - caches: CacheStorage, -): LimitedCacheStorage { - return { - async open(cacheName) { - const cache = await caches.open(cacheName); - return { - match: cache.match.bind(cache), - put: cache.put.bind(cache), - delete: cache.delete.bind(cache), - }; - }, - delete: caches.delete.bind(caches), - }; -} diff --git a/web/apps/cast/src/services/cache/cacheStorageService.ts b/web/apps/cast/src/services/cache/cacheStorageService.ts deleted file mode 100644 index 391aefb55..000000000 --- a/web/apps/cast/src/services/cache/cacheStorageService.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { logError } from "@ente/shared/sentry"; -import { CacheStorageFactory } from "./cacheStorageFactory"; - -const SecurityError = "SecurityError"; -const INSECURE_OPERATION = "The operation is insecure."; -async function openCache(cacheName: string) { - try { - return await CacheStorageFactory.getCacheStorage().open(cacheName); - } catch (e) { - // ignoring insecure operation error, as it is thrown in incognito mode in firefox - if (e.name === SecurityError && e.message === INSECURE_OPERATION) { - // no-op - } else { - // log and ignore, we don't want to break the caller flow, when cache is not available - logError(e, "openCache failed"); - } - } -} -async function deleteCache(cacheName: string) { - try { - return await CacheStorageFactory.getCacheStorage().delete(cacheName); - } catch (e) { - // ignoring insecure operation error, as it is thrown in incognito mode in firefox - if (e.name === SecurityError && e.message === INSECURE_OPERATION) { - // no-op - } else { - // log and ignore, we don't want to break the caller flow, when cache is not available - logError(e, "deleteCache failed"); - } - } -} - -export const CacheStorageService = { open: openCache, delete: deleteCache }; diff --git a/web/apps/cast/src/services/cast/castService.ts b/web/apps/cast/src/services/cast/castService.ts index 0f8b368a5..84636d3a1 100644 --- a/web/apps/cast/src/services/cast/castService.ts +++ b/web/apps/cast/src/services/cast/castService.ts @@ -1,10 +1,9 @@ +import log from "@/next/log"; import ComlinkCryptoWorker from "@ente/shared/crypto"; import { CustomError, parseSharingErrorCodes } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import { getEndpoint } from "@ente/shared/network/api"; -import { logError } from "@ente/shared/sentry"; import localForage from "@ente/shared/storage/localForage"; - import { Collection, CollectionPublicMagicMetadata } from "types/collection"; import { EncryptedEnteFile, EnteFile } from "types/file"; import { decryptFile, mergeMetadata, sortFiles } from "utils/file"; @@ -150,14 +149,14 @@ export const syncPublicFiles = async ( setPublicFiles([...sortFiles(mergeMetadata(files), sortAsc)]); } catch (e) { const parsedError = parseSharingErrorCodes(e); - logError(e, "failed to sync shared collection files"); + log.error("failed to sync shared collection files", e); if (parsedError.message === CustomError.TOKEN_EXPIRED) { throw e; } } return [...sortFiles(mergeMetadata(files), sortAsc)]; } catch (e) { - logError(e, "failed to get local or sync shared collection files"); + log.error("failed to get local or sync shared collection files", e); throw e; } }; @@ -217,7 +216,7 @@ const fetchFiles = async ( } while (resp.data.hasMore); return decryptedFiles; } catch (e) { - logError(e, "Get cast files failed"); + log.error("Get cast files failed", e); throw e; } }; @@ -264,7 +263,7 @@ export const getCastCollection = async ( await saveCollection(collection); return collection; } catch (e) { - logError(e, "failed to get cast collection"); + log.error("failed to get cast collection", e); throw e; } }; diff --git a/web/apps/cast/src/services/castDownloadManager.ts b/web/apps/cast/src/services/castDownloadManager.ts index b56aec928..76b37c082 100644 --- a/web/apps/cast/src/services/castDownloadManager.ts +++ b/web/apps/cast/src/services/castDownloadManager.ts @@ -1,162 +1,14 @@ -import { EnteFile } from "types/file"; -import { - createTypedObjectURL, - generateStreamFromArrayBuffer, - getRenderableFileURL, -} from "utils/file"; - +import ComlinkCryptoWorker from "@ente/shared/crypto"; import { CustomError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; -import { getCastFileURL, getCastThumbnailURL } from "@ente/shared/network/api"; -import { logError } from "@ente/shared/sentry"; -import { CACHES } from "constants/cache"; +import { getCastFileURL } from "@ente/shared/network/api"; import { FILE_TYPE } from "constants/file"; -import { LimitedCache } from "types/cache"; -import ComlinkCryptoWorker from "utils/comlink/ComlinkCryptoWorker"; -import { CacheStorageService } from "./cache/cacheStorageService"; +import { EnteFile } from "types/file"; +import { generateStreamFromArrayBuffer } from "utils/file"; class CastDownloadManager { - private fileObjectURLPromise = new Map< - string, - Promise<{ original: string[]; converted: string[] }> - >(); - private thumbnailObjectURLPromise = new Map>(); - - private fileDownloadProgress = new Map(); - - private progressUpdater: (value: Map) => void; - - setProgressUpdater(progressUpdater: (value: Map) => void) { - this.progressUpdater = progressUpdater; - } - - private async getThumbnailCache() { - try { - const thumbnailCache = await CacheStorageService.open( - CACHES.THUMBS, - ); - return thumbnailCache; - } catch (e) { - return null; - // ignore - } - } - - public async getCachedThumbnail( - file: EnteFile, - thumbnailCache?: LimitedCache, - ) { - try { - if (!thumbnailCache) { - thumbnailCache = await this.getThumbnailCache(); - } - const cacheResp: Response = await thumbnailCache?.match( - file.id.toString(), - ); - - if (cacheResp) { - return URL.createObjectURL(await cacheResp.blob()); - } - return null; - } catch (e) { - logError(e, "failed to get cached thumbnail"); - throw e; - } - } - - public async getThumbnail(file: EnteFile, castToken: string) { - try { - if (!this.thumbnailObjectURLPromise.has(file.id)) { - const downloadPromise = async () => { - const thumbnailCache = await this.getThumbnailCache(); - const cachedThumb = await this.getCachedThumbnail( - file, - thumbnailCache, - ); - if (cachedThumb) { - return cachedThumb; - } - - const thumb = await this.downloadThumb(castToken, file); - const thumbBlob = new Blob([thumb]); - try { - await thumbnailCache?.put( - file.id.toString(), - new Response(thumbBlob), - ); - } catch (e) { - // TODO: handle storage full exception. - } - return URL.createObjectURL(thumbBlob); - }; - this.thumbnailObjectURLPromise.set(file.id, downloadPromise()); - } - - return await this.thumbnailObjectURLPromise.get(file.id); - } catch (e) { - this.thumbnailObjectURLPromise.delete(file.id); - logError(e, "get castDownloadManager preview Failed"); - throw e; - } - } - - private downloadThumb = async (castToken: string, file: EnteFile) => { - const resp = await HTTPService.get( - getCastThumbnailURL(file.id), - null, - { - "X-Cast-Access-Token": castToken, - }, - { responseType: "arraybuffer" }, - ); - if (typeof resp.data === "undefined") { - throw Error(CustomError.REQUEST_FAILED); - } - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); - const decrypted = await cryptoWorker.decryptThumbnail( - new Uint8Array(resp.data), - await cryptoWorker.fromB64(file.thumbnail.decryptionHeader), - file.key, - ); - return decrypted; - }; - - getFile = async (file: EnteFile, castToken: string, forPreview = false) => { - const fileKey = forPreview ? `${file.id}_preview` : `${file.id}`; - try { - const getFilePromise = async () => { - const fileStream = await this.downloadFile(castToken, file); - const fileBlob = await new Response(fileStream).blob(); - if (forPreview) { - return await getRenderableFileURL(file, fileBlob); - } else { - const fileURL = await createTypedObjectURL( - fileBlob, - file.metadata.title, - ); - return { converted: [fileURL], original: [fileURL] }; - } - }; - - if (!this.fileObjectURLPromise.get(fileKey)) { - this.fileObjectURLPromise.set(fileKey, getFilePromise()); - } - const fileURLs = await this.fileObjectURLPromise.get(fileKey); - return fileURLs; - } catch (e) { - this.fileObjectURLPromise.delete(fileKey); - logError(e, "castDownloadManager failed to get file"); - throw e; - } - }; - - public async getCachedOriginalFile(file: EnteFile) { - return await this.fileObjectURLPromise.get(file.id.toString()); - } - async downloadFile(castToken: string, file: EnteFile) { const cryptoWorker = await ComlinkCryptoWorker.getInstance(); - const onDownloadProgress = this.trackDownloadProgress(file.id); if ( file.metadata.fileType === FILE_TYPE.IMAGE || @@ -187,9 +39,6 @@ class CastDownloadManager { }); const reader = resp.body.getReader(); - const contentLength = +resp.headers.get("Content-Length"); - let downloadedBytes = 0; - const stream = new ReadableStream({ async start(controller) { const decryptionHeader = await cryptoWorker.fromB64( @@ -208,11 +57,6 @@ class CastDownloadManager { reader.read().then(async ({ done, value }) => { // Is there more data to read? if (!done) { - downloadedBytes += value.byteLength; - onDownloadProgress({ - loaded: downloadedBytes, - total: contentLength, - }); const buffer = new Uint8Array( data.byteLength + value.byteLength, ); @@ -254,20 +98,6 @@ class CastDownloadManager { }); return stream; } - - trackDownloadProgress = (fileID: number) => { - return (event: { loaded: number; total: number }) => { - if (event.loaded === event.total) { - this.fileDownloadProgress.delete(fileID); - } else { - this.fileDownloadProgress.set( - fileID, - Math.round((event.loaded * 100) / event.total), - ); - } - this.progressUpdater(new Map(this.fileDownloadProgress)); - }; - }; } export default new CastDownloadManager(); diff --git a/web/apps/cast/src/services/events.ts b/web/apps/cast/src/services/events.ts deleted file mode 100644 index 32306fc64..000000000 --- a/web/apps/cast/src/services/events.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { EventEmitter } from "eventemitter3"; - -// When registering event handlers, -// handle errors to avoid unhandled rejection or propagation to emit call - -export enum Events { - LOGOUT = "logout", - FILE_UPLOADED = "fileUploaded", - LOCAL_FILES_UPDATED = "localFilesUpdated", -} - -export const eventBus = new EventEmitter(); diff --git a/web/apps/cast/src/services/ffmpeg/ffmpegFactory.ts b/web/apps/cast/src/services/ffmpeg/ffmpegFactory.ts deleted file mode 100644 index b3c716d99..000000000 --- a/web/apps/cast/src/services/ffmpeg/ffmpegFactory.ts +++ /dev/null @@ -1,29 +0,0 @@ -// import isElectron from 'is-electron'; -// import { ElectronFFmpeg } from 'services/electron/ffmpeg'; -import { ElectronFile } from "types/upload"; -import ComlinkFFmpegWorker from "utils/comlink/ComlinkFFmpegWorker"; - -export interface IFFmpeg { - run: ( - cmd: string[], - inputFile: File | ElectronFile, - outputFilename: string, - dontTimeout?: boolean, - ) => Promise; -} - -class FFmpegFactory { - private client: IFFmpeg; - async getFFmpegClient() { - if (!this.client) { - // if (isElectron()) { - // this.client = new ElectronFFmpeg(); - // } else { - this.client = await ComlinkFFmpegWorker.getInstance(); - // } - } - return this.client; - } -} - -export default new FFmpegFactory(); diff --git a/web/apps/cast/src/services/ffmpeg/ffmpegService.ts b/web/apps/cast/src/services/ffmpeg/ffmpegService.ts deleted file mode 100644 index 85bab9939..000000000 --- a/web/apps/cast/src/services/ffmpeg/ffmpegService.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { logError } from "@ente/shared/sentry"; -import { - FFMPEG_PLACEHOLDER, - INPUT_PATH_PLACEHOLDER, - OUTPUT_PATH_PLACEHOLDER, -} from "constants/ffmpeg"; -import { ElectronFile } from "types/upload"; -import ffmpegFactory from "./ffmpegFactory"; - -export async function convertToMP4(file: File | ElectronFile) { - try { - const ffmpegClient = await ffmpegFactory.getFFmpegClient(); - return await ffmpegClient.run( - [ - FFMPEG_PLACEHOLDER, - "-i", - INPUT_PATH_PLACEHOLDER, - "-preset", - "ultrafast", - OUTPUT_PATH_PLACEHOLDER, - ], - file, - "output.mp4", - true, - ); - } catch (e) { - logError(e, "ffmpeg convertToMP4 failed"); - throw e; - } -} diff --git a/web/apps/cast/src/services/heicConversionService.ts b/web/apps/cast/src/services/heicConversionService.ts deleted file mode 100644 index f11a9f4a4..000000000 --- a/web/apps/cast/src/services/heicConversionService.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { logError } from "@ente/shared/sentry"; -import WasmHEICConverterService from "./wasmHeicConverter/wasmHEICConverterService"; - -class HeicConversionService { - async convert(heicFileData: Blob): Promise { - try { - return await WasmHEICConverterService.convert(heicFileData); - } catch (e) { - logError(e, "failed to convert heic file"); - throw e; - } - } -} -export default new HeicConversionService(); diff --git a/web/apps/cast/src/services/livePhotoService.ts b/web/apps/cast/src/services/livePhotoService.ts index 4d96e812c..789234bd3 100644 --- a/web/apps/cast/src/services/livePhotoService.ts +++ b/web/apps/cast/src/services/livePhotoService.ts @@ -30,16 +30,3 @@ export const decodeLivePhoto = async (file: EnteFile, zipBlob: Blob) => { } return livePhoto; }; - -export const encodeLivePhoto = async (livePhoto: LivePhoto) => { - const zip = new JSZip(); - zip.file( - "image" + getFileExtensionWithDot(livePhoto.imageNameTitle), - livePhoto.image, - ); - zip.file( - "video" + getFileExtensionWithDot(livePhoto.videoNameTitle), - livePhoto.video, - ); - return await zip.generateAsync({ type: "uint8array" }); -}; diff --git a/web/apps/cast/src/services/readerService.ts b/web/apps/cast/src/services/readerService.ts index 5aa42b6d2..19f9bb931 100644 --- a/web/apps/cast/src/services/readerService.ts +++ b/web/apps/cast/src/services/readerService.ts @@ -1,58 +1,14 @@ -import { logError } from "@ente/shared/sentry"; -import { convertBytesToHumanReadable } from "@ente/shared/utils/size"; -import { ElectronFile } from "types/upload"; +import { convertBytesToHumanReadable } from "@/next/file"; +import log from "@/next/log"; -export async function getUint8ArrayView( - file: Blob | ElectronFile, -): Promise { +export async function getUint8ArrayView(file: Blob): Promise { try { return new Uint8Array(await file.arrayBuffer()); } catch (e) { - logError(e, "reading file blob failed", { - fileSize: convertBytesToHumanReadable(file.size), - }); + log.error( + `Failed to read file blob of size ${convertBytesToHumanReadable(file.size)}`, + e, + ); throw e; } } - -export function getFileStream(file: File, chunkSize: number) { - const fileChunkReader = fileChunkReaderMaker(file, chunkSize); - - const stream = new ReadableStream({ - async pull(controller: ReadableStreamDefaultController) { - const chunk = await fileChunkReader.next(); - if (chunk.done) { - controller.close(); - } else { - controller.enqueue(chunk.value); - } - }, - }); - const chunkCount = Math.ceil(file.size / chunkSize); - return { - stream, - chunkCount, - }; -} - -export async function getElectronFileStream( - file: ElectronFile, - chunkSize: number, -) { - const chunkCount = Math.ceil(file.size / chunkSize); - return { - stream: await file.stream(), - chunkCount, - }; -} - -async function* fileChunkReaderMaker(file: File, chunkSize: number) { - let offset = 0; - while (offset < file.size) { - const blob = file.slice(offset, chunkSize + offset); - const fileChunk = await getUint8ArrayView(blob); - yield fileChunk; - offset += chunkSize; - } - return null; -} diff --git a/web/apps/cast/src/services/typeDetectionService.ts b/web/apps/cast/src/services/typeDetectionService.ts index c280baf51..c52e2d80c 100644 --- a/web/apps/cast/src/services/typeDetectionService.ts +++ b/web/apps/cast/src/services/typeDetectionService.ts @@ -1,42 +1,29 @@ +import log from "@/next/log"; import { CustomError } from "@ente/shared/error"; -import { logError } from "@ente/shared/sentry"; -import { convertBytesToHumanReadable } from "@ente/shared/utils/size"; import { FILE_TYPE } from "constants/file"; import { KNOWN_NON_MEDIA_FORMATS, WHITELISTED_FILE_FORMATS, } from "constants/upload"; -import FileType, { FileTypeResult } from "file-type"; -import { ElectronFile, FileTypeInfo } from "types/upload"; +import FileType from "file-type"; +import { FileTypeInfo } from "types/upload"; import { getFileExtension } from "utils/file"; import { getUint8ArrayView } from "./readerService"; -function getFileSize(file: File | ElectronFile) { - return file.size; -} - const TYPE_VIDEO = "video"; const TYPE_IMAGE = "image"; const CHUNK_SIZE_FOR_TYPE_DETECTION = 4100; -export async function getFileType( - receivedFile: File | ElectronFile, -): Promise { +export async function getFileType(receivedFile: File): Promise { try { let fileType: FILE_TYPE; - let typeResult: FileTypeResult; - - if (receivedFile instanceof File) { - typeResult = await extractFileType(receivedFile); - } else { - typeResult = await extractElectronFileType(receivedFile); - } + const typeResult = await extractFileType(receivedFile); const mimTypeParts: string[] = typeResult.mime?.split("/"); - if (mimTypeParts?.length !== 2) { throw Error(CustomError.INVALID_MIME_TYPE(typeResult.mime)); } + switch (mimTypeParts[0]) { case TYPE_IMAGE: fileType = FILE_TYPE.IMAGE; @@ -54,7 +41,6 @@ export async function getFileType( }; } catch (e) { const fileFormat = getFileExtension(receivedFile.name); - const fileSize = convertBytesToHumanReadable(getFileSize(receivedFile)); const whiteListedFormat = WHITELISTED_FILE_FORMATS.find( (a) => a.exactType === fileFormat, ); @@ -65,16 +51,10 @@ export async function getFileType( throw Error(CustomError.UNSUPPORTED_FILE_FORMAT); } if (e.message === CustomError.NON_MEDIA_FILE) { - logError(e, "unsupported file format", { - fileFormat, - fileSize, - }); + log.error(`unsupported file format ${fileFormat}`, e); throw Error(CustomError.UNSUPPORTED_FILE_FORMAT); } - logError(e, "type detection failed", { - fileFormat, - fileSize, - }); + log.error(`type detection failed for format ${fileFormat}`, e); throw Error(CustomError.TYPE_DETECTION_FAILED(fileFormat)); } } @@ -85,14 +65,6 @@ async function extractFileType(file: File) { return getFileTypeFromBuffer(fileDataChunk); } -async function extractElectronFileType(file: ElectronFile) { - const stream = await file.stream(); - const reader = stream.getReader(); - const { value: fileDataChunk } = await reader.read(); - await reader.cancel(); - return getFileTypeFromBuffer(fileDataChunk); -} - async function getFileTypeFromBuffer(buffer: Uint8Array) { const result = await FileType.fromBuffer(buffer); if (!result?.mime) { diff --git a/web/apps/cast/src/services/wasm/ffmpeg.ts b/web/apps/cast/src/services/wasm/ffmpeg.ts deleted file mode 100644 index 50ab5a5a9..000000000 --- a/web/apps/cast/src/services/wasm/ffmpeg.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { addLogLine } from "@ente/shared/logging"; -import { promiseWithTimeout } from "@ente/shared/promise"; -import { logError } from "@ente/shared/sentry"; -import QueueProcessor from "@ente/shared/utils/queueProcessor"; -import { generateTempName } from "@ente/shared/utils/temp"; -import { createFFmpeg, FFmpeg } from "ffmpeg-wasm"; -import { getUint8ArrayView } from "services/readerService"; - -const INPUT_PATH_PLACEHOLDER = "INPUT"; -const FFMPEG_PLACEHOLDER = "FFMPEG"; -const OUTPUT_PATH_PLACEHOLDER = "OUTPUT"; - -const FFMPEG_EXECUTION_WAIT_TIME = 30 * 1000; - -export class WasmFFmpeg { - private ffmpeg: FFmpeg; - private ready: Promise = null; - private ffmpegTaskQueue = new QueueProcessor(1); - - constructor() { - this.ffmpeg = createFFmpeg({ - corePath: "/js/ffmpeg/ffmpeg-core.js", - mt: false, - }); - - this.ready = this.init(); - } - - private async init() { - if (!this.ffmpeg.isLoaded()) { - await this.ffmpeg.load(); - } - } - - async run( - cmd: string[], - inputFile: File, - outputFileName: string, - dontTimeout = false, - ) { - const response = this.ffmpegTaskQueue.queueUpRequest(() => { - if (dontTimeout) { - return this.execute(cmd, inputFile, outputFileName); - } else { - return promiseWithTimeout( - this.execute(cmd, inputFile, outputFileName), - FFMPEG_EXECUTION_WAIT_TIME, - ); - } - }); - try { - return await response.promise; - } catch (e) { - logError(e, "ffmpeg run failed"); - throw e; - } - } - - private async execute( - cmd: string[], - inputFile: File, - outputFileName: string, - ) { - let tempInputFilePath: string; - let tempOutputFilePath: string; - try { - await this.ready; - const extension = getFileExtension(inputFile.name); - const tempNameSuffix = extension ? `input.${extension}` : "input"; - tempInputFilePath = `${generateTempName(10, tempNameSuffix)}`; - this.ffmpeg.FS( - "writeFile", - tempInputFilePath, - await getUint8ArrayView(inputFile), - ); - tempOutputFilePath = `${generateTempName(10, outputFileName)}`; - - cmd = cmd.map((cmdPart) => { - if (cmdPart === FFMPEG_PLACEHOLDER) { - return ""; - } else if (cmdPart === INPUT_PATH_PLACEHOLDER) { - return tempInputFilePath; - } else if (cmdPart === OUTPUT_PATH_PLACEHOLDER) { - return tempOutputFilePath; - } else { - return cmdPart; - } - }); - addLogLine(`${cmd}`); - await this.ffmpeg.run(...cmd); - return new File( - [this.ffmpeg.FS("readFile", tempOutputFilePath)], - outputFileName, - ); - } finally { - try { - this.ffmpeg.FS("unlink", tempInputFilePath); - } catch (e) { - logError(e, "unlink input file failed"); - } - try { - this.ffmpeg.FS("unlink", tempOutputFilePath); - } catch (e) { - logError(e, "unlink output file failed"); - } - } - } -} - -function getFileExtension(filename: string) { - const lastDotPosition = filename.lastIndexOf("."); - if (lastDotPosition === -1) return null; - else { - return filename.slice(lastDotPosition + 1); - } -} diff --git a/web/apps/cast/src/services/wasmHeicConverter/wasmHEICConverterClient.ts b/web/apps/cast/src/services/wasmHeicConverter/wasmHEICConverterClient.ts deleted file mode 100644 index 03b390fb9..000000000 --- a/web/apps/cast/src/services/wasmHeicConverter/wasmHEICConverterClient.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as HeicConvert from "heic-convert"; -import { getUint8ArrayView } from "services/readerService"; - -export async function convertHEIC( - fileBlob: Blob, - format: string, -): Promise { - const filedata = await getUint8ArrayView(fileBlob); - const result = await HeicConvert({ buffer: filedata, format }); - const convertedFileData = new Uint8Array(result); - const convertedFileBlob = new Blob([convertedFileData]); - return convertedFileBlob; -} diff --git a/web/apps/cast/src/styles/global.css b/web/apps/cast/src/styles/global.css index d79f9f302..d3b720a39 100644 --- a/web/apps/cast/src/styles/global.css +++ b/web/apps/cast/src/styles/global.css @@ -1,3 +1,11 @@ +body { + height: 100vh; + width: 100%; + margin: 0; + background-color: black; + color: white; +} + #__next { height: 100%; } diff --git a/web/apps/cast/src/types/cache/index.ts b/web/apps/cast/src/types/cache/index.ts deleted file mode 100644 index 8980ca08f..000000000 --- a/web/apps/cast/src/types/cache/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface LimitedCacheStorage { - open: (cacheName: string) => Promise; - delete: (cacheName: string) => Promise; -} - -export interface LimitedCache { - match: (key: string) => Promise; - put: (key: string, data: Response) => Promise; - delete: (key: string) => Promise; -} diff --git a/web/apps/cast/src/types/cast/index.ts b/web/apps/cast/src/types/cast/index.ts deleted file mode 100644 index f082e433e..000000000 --- a/web/apps/cast/src/types/cast/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface CastPayload { - collectionID: number; - collectionKey: string; - castToken: string; -} diff --git a/web/apps/cast/src/types/gallery/index.ts b/web/apps/cast/src/types/gallery/index.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/apps/cast/src/types/upload/index.ts b/web/apps/cast/src/types/upload/index.ts index 0d38f6190..ef44b4a23 100644 --- a/web/apps/cast/src/types/upload/index.ts +++ b/web/apps/cast/src/types/upload/index.ts @@ -3,7 +3,6 @@ import { LocalFileAttributes, } from "@ente/shared/crypto/types"; import { FILE_TYPE } from "constants/file"; -import { Collection } from "types/collection"; import { FilePublicMagicMetadata, FilePublicMagicMetadataProps, @@ -39,24 +38,6 @@ export interface Metadata { deviceFolder?: string; } -export interface Location { - latitude: number; - longitude: number; -} - -export interface ParsedMetadataJSON { - creationTime: number; - modificationTime: number; - latitude: number; - longitude: number; -} - -export interface MultipartUploadURLs { - objectKey: string; - partURLs: string[]; - completeURL: string; -} - export interface FileTypeInfo { fileType: FILE_TYPE; exactType: string; @@ -65,43 +46,6 @@ export interface FileTypeInfo { videoType?: string; } -/* - * ElectronFile is a custom interface that is used to represent - * any file on disk as a File-like object in the Electron desktop app. - * - * This was added to support the auto-resuming of failed uploads - * which needed absolute paths to the files which the - * normal File interface does not provide. - */ -export interface ElectronFile { - name: string; - path: string; - size: number; - lastModified: number; - stream: () => Promise>; - blob: () => Promise; - arrayBuffer: () => Promise; -} - -export interface UploadAsset { - isLivePhoto?: boolean; - file?: File | ElectronFile; - livePhotoAssets?: LivePhotoAssets; - isElectron?: boolean; -} -export interface LivePhotoAssets { - image: globalThis.File | ElectronFile; - video: globalThis.File | ElectronFile; -} - -export interface FileWithCollection extends UploadAsset { - localID: number; - collection?: Collection; - collectionID?: number; -} - -export type ParsedMetadataJSONMap = Map; - export interface UploadURL { url: string; objectKey: string; diff --git a/web/apps/cast/src/types/upload/ui.ts b/web/apps/cast/src/types/upload/ui.ts deleted file mode 100644 index bce381213..000000000 --- a/web/apps/cast/src/types/upload/ui.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { UPLOAD_RESULT, UPLOAD_STAGES } from "constants/upload"; - -export type FileID = number; -export type FileName = string; - -export type PercentageUploaded = number; -export type UploadFileNames = Map; - -export interface UploadCounter { - finished: number; - total: number; -} - -export interface InProgressUpload { - localFileID: FileID; - progress: PercentageUploaded; -} - -export interface FinishedUpload { - localFileID: FileID; - result: UPLOAD_RESULT; -} - -export type InProgressUploads = Map; - -export type FinishedUploads = Map; - -export type SegregatedFinishedUploads = Map; - -export interface ProgressUpdater { - setPercentComplete: React.Dispatch>; - setUploadCounter: React.Dispatch>; - setUploadStage: React.Dispatch>; - setInProgressUploads: React.Dispatch< - React.SetStateAction - >; - setFinishedUploads: React.Dispatch< - React.SetStateAction - >; - setUploadFilenames: React.Dispatch>; - setHasLivePhotos: React.Dispatch>; - setUploadProgressView: React.Dispatch>; -} diff --git a/web/apps/cast/src/utils/collection/index.ts b/web/apps/cast/src/utils/collection/index.ts deleted file mode 100644 index bd6c2791d..000000000 --- a/web/apps/cast/src/utils/collection/index.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { LS_KEYS, getData } from "@ente/shared/storage/localStorage"; -import { User } from "@ente/shared/user/types"; -import { - CollectionSummaryType, - CollectionType, - HIDE_FROM_COLLECTION_BAR_TYPES, - OPTIONS_NOT_HAVING_COLLECTION_TYPES, -} from "constants/collection"; -import { COLLECTION_ROLE, Collection } from "types/collection"; -import { SUB_TYPE, VISIBILITY_STATE } from "types/magicMetadata"; - -export enum COLLECTION_OPS_TYPE { - ADD, - MOVE, - REMOVE, - RESTORE, - UNHIDE, -} - -export function getSelectedCollection( - collectionID: number, - collections: Collection[], -) { - return collections.find((collection) => collection.id === collectionID); -} - -export const shouldShowOptions = (type: CollectionSummaryType) => { - return !OPTIONS_NOT_HAVING_COLLECTION_TYPES.has(type); -}; -export const showEmptyTrashQuickOption = (type: CollectionSummaryType) => { - return type === CollectionSummaryType.trash; -}; -export const showDownloadQuickOption = (type: CollectionSummaryType) => { - return ( - type === CollectionSummaryType.folder || - type === CollectionSummaryType.favorites || - type === CollectionSummaryType.album || - type === CollectionSummaryType.uncategorized || - type === CollectionSummaryType.hiddenItems || - type === CollectionSummaryType.incomingShareViewer || - type === CollectionSummaryType.incomingShareCollaborator || - type === CollectionSummaryType.outgoingShare || - type === CollectionSummaryType.sharedOnlyViaLink || - type === CollectionSummaryType.archived || - type === CollectionSummaryType.pinned - ); -}; -export const showShareQuickOption = (type: CollectionSummaryType) => { - return ( - type === CollectionSummaryType.folder || - type === CollectionSummaryType.album || - type === CollectionSummaryType.outgoingShare || - type === CollectionSummaryType.sharedOnlyViaLink || - type === CollectionSummaryType.archived || - type === CollectionSummaryType.incomingShareViewer || - type === CollectionSummaryType.incomingShareCollaborator || - type === CollectionSummaryType.pinned - ); -}; -export const shouldBeShownOnCollectionBar = (type: CollectionSummaryType) => { - return !HIDE_FROM_COLLECTION_BAR_TYPES.has(type); -}; - -export const getUserOwnedCollections = (collections: Collection[]) => { - const user: User = getData(LS_KEYS.USER); - if (!user?.id) { - throw Error("user missing"); - } - return collections.filter((collection) => collection.owner.id === user.id); -}; - -export const isDefaultHiddenCollection = (collection: Collection) => - collection.magicMetadata?.data.subType === SUB_TYPE.DEFAULT_HIDDEN; - -export const isHiddenCollection = (collection: Collection) => - collection.magicMetadata?.data.visibility === VISIBILITY_STATE.HIDDEN; - -export const isQuickLinkCollection = (collection: Collection) => - collection.magicMetadata?.data.subType === SUB_TYPE.QUICK_LINK_COLLECTION; - -export function isOutgoingShare(collection: Collection, user: User): boolean { - return collection.owner.id === user.id && collection.sharees?.length > 0; -} - -export function isIncomingShare(collection: Collection, user: User) { - return collection.owner.id !== user.id; -} - -export function isIncomingViewerShare(collection: Collection, user: User) { - const sharee = collection.sharees?.find((sharee) => sharee.id === user.id); - return sharee?.role === COLLECTION_ROLE.VIEWER; -} - -export function isIncomingCollabShare(collection: Collection, user: User) { - const sharee = collection.sharees?.find((sharee) => sharee.id === user.id); - return sharee?.role === COLLECTION_ROLE.COLLABORATOR; -} - -export function isSharedOnlyViaLink(collection: Collection) { - return collection.publicURLs?.length && !collection.sharees?.length; -} - -export function isValidMoveTarget( - sourceCollectionID: number, - targetCollection: Collection, - user: User, -) { - return ( - sourceCollectionID !== targetCollection.id && - !isHiddenCollection(targetCollection) && - !isQuickLinkCollection(targetCollection) && - !isIncomingShare(targetCollection, user) - ); -} - -export function isValidReplacementAlbum( - collection: Collection, - user: User, - wantedCollectionName: string, -) { - return ( - collection.name === wantedCollectionName && - (collection.type === CollectionType.album || - collection.type === CollectionType.folder) && - !isHiddenCollection(collection) && - !isQuickLinkCollection(collection) && - !isIncomingShare(collection, user) - ); -} - -export function getCollectionNameMap( - collections: Collection[], -): Map { - return new Map( - collections.map((collection) => [collection.id, collection.name]), - ); -} - -export function getNonHiddenCollections( - collections: Collection[], -): Collection[] { - return collections.filter((collection) => !isHiddenCollection(collection)); -} - -export function getHiddenCollections(collections: Collection[]): Collection[] { - return collections.filter((collection) => isHiddenCollection(collection)); -} diff --git a/web/apps/cast/src/utils/comlink/ComlinkConvertWorker.ts b/web/apps/cast/src/utils/comlink/ComlinkConvertWorker.ts deleted file mode 100644 index dc15136d9..000000000 --- a/web/apps/cast/src/utils/comlink/ComlinkConvertWorker.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { runningInBrowser } from "@ente/shared/platform"; -import { Remote } from "comlink"; -import { DedicatedConvertWorker } from "worker/convert.worker"; -import { ComlinkWorker } from "./comlinkWorker"; - -class ComlinkConvertWorker { - private comlinkWorkerInstance: Remote; - - async getInstance() { - if (!this.comlinkWorkerInstance) { - this.comlinkWorkerInstance = - await getDedicatedConvertWorker().remote; - } - return this.comlinkWorkerInstance; - } -} - -export const getDedicatedConvertWorker = () => { - if (runningInBrowser()) { - const cryptoComlinkWorker = new ComlinkWorker< - typeof DedicatedConvertWorker - >( - "ente-convert-worker", - new Worker(new URL("worker/convert.worker.ts", import.meta.url)), - ); - return cryptoComlinkWorker; - } -}; - -export default new ComlinkConvertWorker(); diff --git a/web/apps/cast/src/utils/comlink/ComlinkCryptoWorker.ts b/web/apps/cast/src/utils/comlink/ComlinkCryptoWorker.ts deleted file mode 100644 index 8c108317e..000000000 --- a/web/apps/cast/src/utils/comlink/ComlinkCryptoWorker.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Remote } from "comlink"; -import { DedicatedCryptoWorker } from "worker/crypto.worker"; -import { ComlinkWorker } from "./comlinkWorker"; - -class ComlinkCryptoWorker { - private comlinkWorkerInstance: Promise>; - - async getInstance() { - if (!this.comlinkWorkerInstance) { - const comlinkWorker = getDedicatedCryptoWorker(); - this.comlinkWorkerInstance = comlinkWorker.remote; - } - return this.comlinkWorkerInstance; - } -} - -export const getDedicatedCryptoWorker = () => { - const cryptoComlinkWorker = new ComlinkWorker( - "ente-crypto-worker", - new Worker(new URL("worker/crypto.worker.ts", import.meta.url)), - ); - return cryptoComlinkWorker; -}; - -export default new ComlinkCryptoWorker(); diff --git a/web/apps/cast/src/utils/comlink/ComlinkFFmpegWorker.ts b/web/apps/cast/src/utils/comlink/ComlinkFFmpegWorker.ts deleted file mode 100644 index 77d140bdb..000000000 --- a/web/apps/cast/src/utils/comlink/ComlinkFFmpegWorker.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Remote } from "comlink"; -import { DedicatedFFmpegWorker } from "worker/ffmpeg.worker"; -import { ComlinkWorker } from "./comlinkWorker"; - -class ComlinkFFmpegWorker { - private comlinkWorkerInstance: Promise>; - - async getInstance() { - if (!this.comlinkWorkerInstance) { - const comlinkWorker = getDedicatedFFmpegWorker(); - this.comlinkWorkerInstance = comlinkWorker.remote; - } - return this.comlinkWorkerInstance; - } -} - -const getDedicatedFFmpegWorker = () => { - const cryptoComlinkWorker = new ComlinkWorker( - "ente-ffmpeg-worker", - new Worker(new URL("worker/ffmpeg.worker.ts", import.meta.url)), - ); - return cryptoComlinkWorker; -}; - -export default new ComlinkFFmpegWorker(); diff --git a/web/apps/cast/src/utils/comlink/comlinkWorker.ts b/web/apps/cast/src/utils/comlink/comlinkWorker.ts deleted file mode 100644 index 9c1aacff6..000000000 --- a/web/apps/cast/src/utils/comlink/comlinkWorker.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { addLocalLog } from "@ente/shared/logging"; -import { Remote, wrap } from "comlink"; -// import { WorkerElectronCacheStorageClient } from 'services/workerElectronCache/client'; - -export class ComlinkWorker InstanceType> { - public remote: Promise>>; - private worker: Worker; - private name: string; - - constructor(name: string, worker: Worker) { - this.name = name; - this.worker = worker; - - this.worker.onerror = (errorEvent) => { - console.error("Got error event from worker", errorEvent); - }; - addLocalLog(() => `Initiated ${this.name}`); - const comlink = wrap(this.worker); - this.remote = new comlink() as Promise>>; - // expose(WorkerElectronCacheStorageClient, this.worker); - } - - public terminate() { - this.worker.terminate(); - addLocalLog(() => `Terminated ${this.name}`); - } -} diff --git a/web/apps/cast/src/utils/file/blob.ts b/web/apps/cast/src/utils/file/blob.ts deleted file mode 100644 index cb2e8c7a2..000000000 --- a/web/apps/cast/src/utils/file/blob.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const readAsDataURL = (blob) => - new Promise((resolve, reject) => { - const fileReader = new FileReader(); - fileReader.onload = () => resolve(fileReader.result as string); - fileReader.onerror = () => reject(fileReader.error); - fileReader.readAsDataURL(blob); - }); - -export const readAsText = (blob) => - new Promise((resolve, reject) => { - const fileReader = new FileReader(); - fileReader.onload = () => resolve(fileReader.result as string); - fileReader.onerror = () => reject(fileReader.error); - fileReader.readAsText(blob); - }); diff --git a/web/apps/cast/src/utils/file/index.ts b/web/apps/cast/src/utils/file/index.ts index d3de7b76f..caa15d743 100644 --- a/web/apps/cast/src/utils/file/index.ts +++ b/web/apps/cast/src/utils/file/index.ts @@ -1,14 +1,7 @@ -import { logError } from "@ente/shared/sentry"; -import { - FILE_TYPE, - RAW_FORMATS, - SUPPORTED_RAW_FORMATS, - TYPE_HEIC, - TYPE_HEIF, -} from "constants/file"; +import log from "@/next/log"; +import ComlinkCryptoWorker from "@ente/shared/crypto"; +import { FILE_TYPE, RAW_FORMATS } from "constants/file"; import CastDownloadManager from "services/castDownloadManager"; -import * as ffmpegService from "services/ffmpeg/ffmpegService"; -import heicConversionService from "services/heicConversionService"; import { decodeLivePhoto } from "services/livePhotoService"; import { getFileType } from "services/typeDetectionService"; import { @@ -17,19 +10,6 @@ import { FileMagicMetadata, FilePublicMagicMetadata, } from "types/file"; -import { isArchivedFile } from "utils/magicMetadata"; - -import { CustomError } from "@ente/shared/error"; -import { addLocalLog, addLogLine } from "@ente/shared/logging"; -import { isPlaybackPossible } from "@ente/shared/media/video-playback"; -import { LS_KEYS, getData } from "@ente/shared/storage/localStorage"; -import { User } from "@ente/shared/user/types"; -import { convertBytesToHumanReadable } from "@ente/shared/utils/size"; -import isElectron from "is-electron"; -import { FileTypeInfo } from "types/upload"; -import ComlinkCryptoWorker from "utils/comlink/ComlinkCryptoWorker"; - -const WAIT_TIME_IMAGE_CONVERSION = 30 * 1000; export function sortFiles(files: EnteFile[], sortAsc = false) { // sort based on the time of creation time of the file, @@ -46,20 +26,6 @@ export function sortFiles(files: EnteFile[], sortAsc = false) { }); } -export function sortTrashFiles(files: EnteFile[]) { - return files.sort((a, b) => { - if (a.deleteBy === b.deleteBy) { - if (a.metadata.creationTime === b.metadata.creationTime) { - return ( - b.metadata.modificationTime - a.metadata.modificationTime - ); - } - return b.metadata.creationTime - a.metadata.creationTime; - } - return a.deleteBy - b.deleteBy; - }); -} - export async function decryptFile( file: EncryptedEnteFile, collectionKey: string, @@ -114,7 +80,7 @@ export async function decryptFile( pubMagicMetadata: filePubMagicMetadata, }; } catch (e) { - logError(e, "file decryption failed"); + log.error("file decryption failed", e); throw e; } } @@ -154,176 +120,6 @@ export function generateStreamFromArrayBuffer(data: Uint8Array) { }); } -export async function getRenderableFileURL(file: EnteFile, fileBlob: Blob) { - switch (file.metadata.fileType) { - case FILE_TYPE.IMAGE: { - const convertedBlob = await getRenderableImage( - file.metadata.title, - fileBlob, - ); - const { originalURL, convertedURL } = getFileObjectURLs( - fileBlob, - convertedBlob, - ); - return { - converted: [convertedURL], - original: [originalURL], - }; - } - case FILE_TYPE.LIVE_PHOTO: { - return await getRenderableLivePhotoURL(file, fileBlob); - } - case FILE_TYPE.VIDEO: { - const convertedBlob = await getPlayableVideo( - file.metadata.title, - fileBlob, - ); - const { originalURL, convertedURL } = getFileObjectURLs( - fileBlob, - convertedBlob, - ); - return { - converted: [convertedURL], - original: [originalURL], - }; - } - default: { - const previewURL = await createTypedObjectURL( - fileBlob, - file.metadata.title, - ); - return { - converted: [previewURL], - original: [previewURL], - }; - } - } -} - -async function getRenderableLivePhotoURL( - file: EnteFile, - fileBlob: Blob, -): Promise<{ original: string[]; converted: string[] }> { - const livePhoto = await decodeLivePhoto(file, fileBlob); - const imageBlob = new Blob([livePhoto.image]); - const videoBlob = new Blob([livePhoto.video]); - const convertedImageBlob = await getRenderableImage( - livePhoto.imageNameTitle, - imageBlob, - ); - const convertedVideoBlob = await getPlayableVideo( - livePhoto.videoNameTitle, - videoBlob, - true, - ); - const { originalURL: originalImageURL, convertedURL: convertedImageURL } = - getFileObjectURLs(imageBlob, convertedImageBlob); - - const { originalURL: originalVideoURL, convertedURL: convertedVideoURL } = - getFileObjectURLs(videoBlob, convertedVideoBlob); - return { - converted: [convertedImageURL, convertedVideoURL], - original: [originalImageURL, originalVideoURL], - }; -} - -export async function getPlayableVideo( - videoNameTitle: string, - videoBlob: Blob, - forceConvert = false, -) { - try { - const isPlayable = await isPlaybackPossible( - URL.createObjectURL(videoBlob), - ); - if (isPlayable && !forceConvert) { - return videoBlob; - } else { - if (!forceConvert && !isElectron()) { - return null; - } - addLogLine( - "video format not supported, converting it name:", - videoNameTitle, - ); - const mp4ConvertedVideo = await ffmpegService.convertToMP4( - new File([videoBlob], videoNameTitle), - ); - addLogLine("video successfully converted", videoNameTitle); - return new Blob([await mp4ConvertedVideo.arrayBuffer()]); - } - } catch (e) { - addLogLine("video conversion failed", videoNameTitle); - logError(e, "video conversion failed"); - return null; - } -} - -export async function getRenderableImage(fileName: string, imageBlob: Blob) { - let fileTypeInfo: FileTypeInfo; - try { - const tempFile = new File([imageBlob], fileName); - fileTypeInfo = await getFileType(tempFile); - addLocalLog(() => `file type info: ${JSON.stringify(fileTypeInfo)}`); - const { exactType } = fileTypeInfo; - let convertedImageBlob: Blob; - if (isRawFile(exactType)) { - try { - if (!isSupportedRawFormat(exactType)) { - throw Error(CustomError.UNSUPPORTED_RAW_FORMAT); - } - - if (!isElectron()) { - throw Error(CustomError.NOT_AVAILABLE_ON_WEB); - } - addLogLine( - `RawConverter called for ${fileName}-${convertBytesToHumanReadable( - imageBlob.size, - )}`, - ); - // convertedImageBlob = await imageProcessor.convertToJPEG( - // imageBlob, - // fileName - // ); - addLogLine(`${fileName} successfully converted`); - } catch (e) { - try { - if (!isFileHEIC(exactType)) { - throw e; - } - addLogLine( - `HEICConverter called for ${fileName}-${convertBytesToHumanReadable( - imageBlob.size, - )}`, - ); - convertedImageBlob = - await heicConversionService.convert(imageBlob); - addLogLine(`${fileName} successfully converted`); - } catch (e) { - throw Error(CustomError.NON_PREVIEWABLE_FILE); - } - } - return convertedImageBlob; - } else { - return imageBlob; - } - } catch (e) { - logError(e, "get Renderable Image failed", { fileTypeInfo }); - return null; - } -} - -export function isFileHEIC(exactType: string) { - return ( - exactType.toLowerCase().endsWith(TYPE_HEIC) || - exactType.toLowerCase().endsWith(TYPE_HEIF) - ); -} - -export function isRawFile(exactType: string) { - return RAW_FORMATS.includes(exactType.toLowerCase()); -} - export function isRawFileFromFileName(fileName: string) { for (const rawFormat of RAW_FORMATS) { if (fileName.toLowerCase().endsWith(rawFormat)) { @@ -333,10 +129,6 @@ export function isRawFileFromFileName(fileName: string) { return false; } -export function isSupportedRawFormat(exactType: string) { - return SUPPORTED_RAW_FORMATS.includes(exactType.toLowerCase()); -} - export function mergeMetadata(files: EnteFile[]): EnteFile[] { return files.map((file) => { if (file.pubMagicMetadata?.data.editedTime) { @@ -350,187 +142,24 @@ export function mergeMetadata(files: EnteFile[]): EnteFile[] { }); } -export async function getFileFromURL(fileURL: string) { - const fileBlob = await (await fetch(fileURL)).blob(); - const fileFile = new File([fileBlob], "temp"); - return fileFile; -} - -export function getUniqueFiles(files: EnteFile[]) { - const idSet = new Set(); - const uniqueFiles = files.filter((file) => { - if (!idSet.has(file.id)) { - idSet.add(file.id); - return true; - } else { - return false; - } - }); - - return uniqueFiles; -} - -export const isImageOrVideo = (fileType: FILE_TYPE) => - [FILE_TYPE.IMAGE, FILE_TYPE.VIDEO].includes(fileType); - -export const getArchivedFiles = (files: EnteFile[]) => { - return files.filter(isArchivedFile).map((file) => file.id); -}; - -export const createTypedObjectURL = async (blob: Blob, fileName: string) => { - const type = await getFileType(new File([blob], fileName)); - return URL.createObjectURL(new Blob([blob], { type: type.mimeType })); -}; - -export const getUserOwnedFiles = (files: EnteFile[]) => { - const user: User = getData(LS_KEYS.USER); - if (!user?.id) { - throw Error("user missing"); - } - return files.filter((file) => file.ownerID === user.id); -}; - -// doesn't work on firefox -export const copyFileToClipboard = async (fileUrl: string) => { - const canvas = document.createElement("canvas"); - const canvasCTX = canvas.getContext("2d"); - const image = new Image(); - - const blobPromise = new Promise((resolve, reject) => { - let timeout: NodeJS.Timeout = null; - try { - image.setAttribute("src", fileUrl); - image.onload = () => { - canvas.width = image.width; - canvas.height = image.height; - canvasCTX.drawImage(image, 0, 0, image.width, image.height); - canvas.toBlob( - (blob) => { - resolve(blob); - }, - "image/png", - 1, - ); - - clearTimeout(timeout); - }; - } catch (e) { - void logError(e, "failed to copy to clipboard"); - reject(e); - } finally { - clearTimeout(timeout); - } - timeout = setTimeout( - () => reject(Error(CustomError.WAIT_TIME_EXCEEDED)), - WAIT_TIME_IMAGE_CONVERSION, - ); - }); - - const { ClipboardItem } = window; - - await navigator.clipboard - .write([new ClipboardItem({ "image/png": blobPromise })]) - .catch((e) => logError(e, "failed to copy to clipboard")); -}; - -export function getLatestVersionFiles(files: EnteFile[]) { - const latestVersionFiles = new Map(); - files.forEach((file) => { - const uid = `${file.collectionID}-${file.id}`; - if ( - !latestVersionFiles.has(uid) || - latestVersionFiles.get(uid).updationTime < file.updationTime - ) { - latestVersionFiles.set(uid, file); - } - }); - return Array.from(latestVersionFiles.values()).filter( - (file) => !file.isDeleted, - ); -} - -export function getPersonalFiles(files: EnteFile[], user: User) { - if (!user?.id) { - throw Error("user missing"); - } - return files.filter((file) => file.ownerID === user.id); -} - -export function getIDBasedSortedFiles(files: EnteFile[]) { - return files.sort((a, b) => a.id - b.id); -} - -export function constructFileToCollectionMap(files: EnteFile[]) { - const fileToCollectionsMap = new Map(); - (files ?? []).forEach((file) => { - if (!fileToCollectionsMap.get(file.id)) { - fileToCollectionsMap.set(file.id, []); - } - fileToCollectionsMap.get(file.id).push(file.collectionID); - }); - return fileToCollectionsMap; -} - -export const shouldShowAvatar = (file: EnteFile, user: User) => { - if (!file || !user) { - return false; - } - // is Shared file - else if (file.ownerID !== user.id) { - return true; - } - // is public collected file - else if ( - file.ownerID === user.id && - file.pubMagicMetadata?.data?.uploaderName - ) { - return true; - } else { - return false; - } -}; - export const getPreviewableImage = async ( file: EnteFile, castToken: string, ): Promise => { try { - let fileBlob: Blob; - const fileURL = - await CastDownloadManager.getCachedOriginalFile(file)[0]; - if (!fileURL) { - fileBlob = await new Response( - await CastDownloadManager.downloadFile(castToken, file), - ).blob(); - } else { - fileBlob = await (await fetch(fileURL)).blob(); - } + let fileBlob = await new Response( + await CastDownloadManager.downloadFile(castToken, file), + ).blob(); if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) { const livePhoto = await decodeLivePhoto(file, fileBlob); fileBlob = new Blob([livePhoto.image]); } - const convertedBlob = await getRenderableImage( - file.metadata.title, - fileBlob, - ); - fileBlob = convertedBlob; const fileType = await getFileType( new File([fileBlob], file.metadata.title), ); - fileBlob = new Blob([fileBlob], { type: fileType.mimeType }); return fileBlob; } catch (e) { - logError(e, "failed to download file"); + log.error("failed to download file", e); } }; - -const getFileObjectURLs = (originalBlob: Blob, convertedBlob: Blob) => { - const originalURL = URL.createObjectURL(originalBlob); - const convertedURL = convertedBlob - ? convertedBlob === originalBlob - ? originalURL - : URL.createObjectURL(convertedBlob) - : null; - return { originalURL, convertedURL }; -}; diff --git a/web/apps/cast/src/utils/file/livePhoto.ts b/web/apps/cast/src/utils/file/livePhoto.ts deleted file mode 100644 index 7d687217c..000000000 --- a/web/apps/cast/src/utils/file/livePhoto.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { FILE_TYPE } from "constants/file"; -import { getFileExtension } from "utils/file"; - -const IMAGE_EXTENSIONS = [ - "heic", - "heif", - "jpeg", - "jpg", - "png", - "gif", - "bmp", - "tiff", - "webp", -]; - -const VIDEO_EXTENSIONS = [ - "mov", - "mp4", - "m4v", - "avi", - "wmv", - "flv", - "mkv", - "webm", - "3gp", - "3g2", - "avi", - "ogv", - "mpg", - "mp", -]; - -export function getFileTypeFromExtensionForLivePhotoClustering( - filename: string, -) { - const extension = getFileExtension(filename)?.toLowerCase(); - if (IMAGE_EXTENSIONS.includes(extension)) { - return FILE_TYPE.IMAGE; - } else if (VIDEO_EXTENSIONS.includes(extension)) { - return FILE_TYPE.VIDEO; - } -} diff --git a/web/apps/cast/src/utils/magicMetadata/index.ts b/web/apps/cast/src/utils/magicMetadata/index.ts deleted file mode 100644 index 7beb45772..000000000 --- a/web/apps/cast/src/utils/magicMetadata/index.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Collection } from "types/collection"; -import { EnteFile } from "types/file"; -import { MagicMetadataCore, VISIBILITY_STATE } from "types/magicMetadata"; -import ComlinkCryptoWorker from "utils/comlink/ComlinkCryptoWorker"; - -export function isArchivedFile(item: EnteFile): boolean { - if (!item || !item.magicMetadata || !item.magicMetadata.data) { - return false; - } - return item.magicMetadata.data.visibility === VISIBILITY_STATE.ARCHIVED; -} - -export function isArchivedCollection(item: Collection): boolean { - if (!item) { - return false; - } - - if (item.magicMetadata && item.magicMetadata.data) { - return item.magicMetadata.data.visibility === VISIBILITY_STATE.ARCHIVED; - } - - if (item.sharedMagicMetadata && item.sharedMagicMetadata.data) { - return ( - item.sharedMagicMetadata.data.visibility === - VISIBILITY_STATE.ARCHIVED - ); - } - return false; -} - -export function isPinnedCollection(item: Collection) { - if ( - !item || - !item.magicMetadata || - !item.magicMetadata.data || - typeof item.magicMetadata.data === "string" || - typeof item.magicMetadata.data.order === "undefined" - ) { - return false; - } - return item.magicMetadata.data.order !== 0; -} - -export async function updateMagicMetadata( - magicMetadataUpdates: T, - originalMagicMetadata?: MagicMetadataCore, - decryptionKey?: string, -): Promise> { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); - - if (!originalMagicMetadata) { - originalMagicMetadata = getNewMagicMetadata(); - } - - if (typeof originalMagicMetadata?.data === "string") { - originalMagicMetadata.data = await cryptoWorker.decryptMetadata( - originalMagicMetadata.data, - originalMagicMetadata.header, - decryptionKey, - ); - } - // copies the existing magic metadata properties of the files and updates the visibility value - // The expected behavior while updating magic metadata is to let the existing property as it is and update/add the property you want - const magicMetadataProps: T = { - ...originalMagicMetadata.data, - ...magicMetadataUpdates, - }; - - const nonEmptyMagicMetadataProps = - getNonEmptyMagicMetadataProps(magicMetadataProps); - - const magicMetadata = { - ...originalMagicMetadata, - data: nonEmptyMagicMetadataProps, - count: Object.keys(nonEmptyMagicMetadataProps).length, - }; - - return magicMetadata; -} - -export const getNewMagicMetadata = (): MagicMetadataCore => { - return { - version: 1, - data: null, - header: null, - count: 0, - }; -}; - -export const getNonEmptyMagicMetadataProps = (magicMetadataProps: T): T => { - return Object.fromEntries( - Object.entries(magicMetadataProps).filter( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - ([_, v]) => v !== null && v !== undefined, - ), - ) as T; -}; diff --git a/web/packages/shared/hooks/useCastReceiver.tsx b/web/apps/cast/src/utils/useCastReceiver.tsx similarity index 100% rename from web/packages/shared/hooks/useCastReceiver.tsx rename to web/apps/cast/src/utils/useCastReceiver.tsx diff --git a/web/apps/cast/src/worker/convert.worker.ts b/web/apps/cast/src/worker/convert.worker.ts deleted file mode 100644 index a805752ac..000000000 --- a/web/apps/cast/src/worker/convert.worker.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as Comlink from "comlink"; -import { convertHEIC } from "services/wasmHeicConverter/wasmHEICConverterClient"; - -export class DedicatedConvertWorker { - async convertHEIC(fileBlob: Blob, format: string) { - return convertHEIC(fileBlob, format); - } -} - -Comlink.expose(DedicatedConvertWorker, self); diff --git a/web/apps/cast/src/worker/crypto.worker.ts b/web/apps/cast/src/worker/crypto.worker.ts deleted file mode 100644 index ac1d52a0d..000000000 --- a/web/apps/cast/src/worker/crypto.worker.ts +++ /dev/null @@ -1,215 +0,0 @@ -import * as libsodium from "@ente/shared/crypto/internal/libsodium"; -import * as Comlink from "comlink"; -import { StateAddress } from "libsodium-wrappers"; - -const textDecoder = new TextDecoder(); -const textEncoder = new TextEncoder(); -export class DedicatedCryptoWorker { - async decryptMetadata( - encryptedMetadata: string, - header: string, - key: string, - ) { - const encodedMetadata = await libsodium.decryptChaChaOneShot( - await libsodium.fromB64(encryptedMetadata), - await libsodium.fromB64(header), - key, - ); - return JSON.parse(textDecoder.decode(encodedMetadata)); - } - - async decryptThumbnail( - fileData: Uint8Array, - header: Uint8Array, - key: string, - ) { - return libsodium.decryptChaChaOneShot(fileData, header, key); - } - - async decryptEmbedding( - encryptedEmbedding: string, - header: string, - key: string, - ) { - const encodedEmbedding = await libsodium.decryptChaChaOneShot( - await libsodium.fromB64(encryptedEmbedding), - await libsodium.fromB64(header), - key, - ); - return Float32Array.from( - JSON.parse(textDecoder.decode(encodedEmbedding)), - ); - } - - async decryptFile(fileData: Uint8Array, header: Uint8Array, key: string) { - return libsodium.decryptChaCha(fileData, header, key); - } - - async encryptMetadata(metadata: Object, key: string) { - const encodedMetadata = textEncoder.encode(JSON.stringify(metadata)); - - const { file: encryptedMetadata } = - await libsodium.encryptChaChaOneShot(encodedMetadata, key); - const { encryptedData, ...other } = encryptedMetadata; - return { - file: { - encryptedData: await libsodium.toB64(encryptedData), - ...other, - }, - key, - }; - } - - async encryptThumbnail(fileData: Uint8Array, key: string) { - return libsodium.encryptChaChaOneShot(fileData, key); - } - - async encryptEmbedding(embedding: Float32Array, key: string) { - const encodedEmbedding = textEncoder.encode( - JSON.stringify(Array.from(embedding)), - ); - const { file: encryptEmbedding } = await libsodium.encryptChaChaOneShot( - encodedEmbedding, - key, - ); - const { encryptedData, ...other } = encryptEmbedding; - return { - file: { - encryptedData: await libsodium.toB64(encryptedData), - ...other, - }, - key, - }; - } - - async encryptFile(fileData: Uint8Array) { - return libsodium.encryptChaCha(fileData); - } - - async encryptFileChunk( - data: Uint8Array, - pushState: StateAddress, - isFinalChunk: boolean, - ) { - return libsodium.encryptFileChunk(data, pushState, isFinalChunk); - } - - async initChunkEncryption() { - return libsodium.initChunkEncryption(); - } - - async initChunkDecryption(header: Uint8Array, key: Uint8Array) { - return libsodium.initChunkDecryption(header, key); - } - - async decryptFileChunk(fileData: Uint8Array, pullState: StateAddress) { - return libsodium.decryptFileChunk(fileData, pullState); - } - - async initChunkHashing() { - return libsodium.initChunkHashing(); - } - - async hashFileChunk(hashState: StateAddress, chunk: Uint8Array) { - return libsodium.hashFileChunk(hashState, chunk); - } - - async completeChunkHashing(hashState: StateAddress) { - return libsodium.completeChunkHashing(hashState); - } - - async deriveKey( - passphrase: string, - salt: string, - opsLimit: number, - memLimit: number, - ) { - return libsodium.deriveKey(passphrase, salt, opsLimit, memLimit); - } - - async deriveSensitiveKey(passphrase: string, salt: string) { - return libsodium.deriveSensitiveKey(passphrase, salt); - } - - async deriveInteractiveKey(passphrase: string, salt: string) { - return libsodium.deriveInteractiveKey(passphrase, salt); - } - - async decryptB64(data: string, nonce: string, key: string) { - return libsodium.decryptB64(data, nonce, key); - } - - async decryptToUTF8(data: string, nonce: string, key: string) { - return libsodium.decryptToUTF8(data, nonce, key); - } - - async encryptToB64(data: string, key: string) { - return libsodium.encryptToB64(data, key); - } - - async generateKeyAndEncryptToB64(data: string) { - return libsodium.generateKeyAndEncryptToB64(data); - } - - async encryptUTF8(data: string, key: string) { - return libsodium.encryptUTF8(data, key); - } - - async generateEncryptionKey() { - return libsodium.generateEncryptionKey(); - } - - async generateSaltToDeriveKey() { - return libsodium.generateSaltToDeriveKey(); - } - - async generateKeyPair() { - return libsodium.generateKeyPair(); - } - - async boxSealOpen(input: string, publicKey: string, secretKey: string) { - return libsodium.boxSealOpen(input, publicKey, secretKey); - } - - async boxSeal(input: string, publicKey: string) { - return libsodium.boxSeal(input, publicKey); - } - - async generateSubKey( - key: string, - subKeyLength: number, - subKeyID: number, - context: string, - ) { - return libsodium.generateSubKey(key, subKeyLength, subKeyID, context); - } - - async fromUTF8(string: string) { - return libsodium.fromUTF8(string); - } - async toUTF8(data: string) { - return libsodium.toUTF8(data); - } - - async toB64(data: Uint8Array) { - return libsodium.toB64(data); - } - - async toURLSafeB64(data: Uint8Array) { - return libsodium.toURLSafeB64(data); - } - - async fromB64(string: string) { - return libsodium.fromB64(string); - } - - async toHex(string: string) { - return libsodium.toHex(string); - } - - async fromHex(string: string) { - return libsodium.fromHex(string); - } -} - -Comlink.expose(DedicatedCryptoWorker, self); diff --git a/web/apps/cast/src/worker/ffmpeg.worker.ts b/web/apps/cast/src/worker/ffmpeg.worker.ts deleted file mode 100644 index d3f503abb..000000000 --- a/web/apps/cast/src/worker/ffmpeg.worker.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as Comlink from "comlink"; -import { WasmFFmpeg } from "services/wasm/ffmpeg"; - -export class DedicatedFFmpegWorker { - wasmFFmpeg: WasmFFmpeg; - constructor() { - this.wasmFFmpeg = new WasmFFmpeg(); - } - - run(cmd, inputFile, outputFileName, dontTimeout) { - return this.wasmFFmpeg.run(cmd, inputFile, outputFileName, dontTimeout); - } -} - -Comlink.expose(DedicatedFFmpegWorker, self); diff --git a/web/apps/payments/.eslintrc.cjs b/web/apps/payments/.eslintrc.cjs new file mode 100644 index 000000000..99b4b9226 --- /dev/null +++ b/web/apps/payments/.eslintrc.cjs @@ -0,0 +1,3 @@ +module.exports = { + extends: ["@/build-config/eslintrc-vite"], +}; diff --git a/web/apps/payments/.eslintrc.js b/web/apps/payments/.eslintrc.js deleted file mode 100644 index cc165fa13..000000000 --- a/web/apps/payments/.eslintrc.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - extends: ["@/build-config/eslintrc-typescript-react"], - parserOptions: { - tsconfigRootDir: __dirname, - }, - // TODO (MR): Figure out a way to not have to ignored the next config .js - ignorePatterns: [".eslintrc.js", "next.config.js"], -}; diff --git a/web/apps/payments/README.md b/web/apps/payments/README.md index 568437afd..959bedabe 100644 --- a/web/apps/payments/README.md +++ b/web/apps/payments/README.md @@ -1,28 +1,57 @@ +# Payments + Code that runs on `payments.ente.io`. It brokers between our services and Stripe's API for payments. ## Development -If you're running this to test out the payment flows end-to-end, please do a -`yarn build`, that will place the output within the `out` folder. +There are three pieces that need to be connected to have a working local setup: -Then use any tool to serve this over HTTP. For example, `python3 -m http.server -3001` will serve this directory over port `3001`. +- A client app +- This web app +- Museum -Aside that, these are the necessary configuration changes. +### Client app -### Local configuration +For the client, let us consider the Photos web app (similar configuration can be +done in the mobile client too). -Create an `.env` in this directory to point to the local museum instance, and to -define the necessary Stripe keys that can be fetched from [Stripe's developer -dashboard](https://dashboard.stripe.com). - -Assuming that your local museum instance is running on `192.168.1.2:8080`, your -`.env` should look as follows. +Add the following to `web/apps/photos/.env.local`: +```env +NEXT_PUBLIC_ENTE_ENDPOINT = http://localhost:8080 +NEXT_PUBLIC_ENTE_PAYMENTS_ENDPOINT = http://localhost:3001 ``` -NEXT_PUBLIC_ENTE_ENDPOINT = http://192.168.1.2:8080 -NEXT_PUBLIC_STRIPE_US_PUBLISHABLE_KEY = stripe_publishable_key + +Then start it locally + +```sh +yarn dev:photos +``` + +This tells it to connect to the museum and payments app running on localhost. + +> For connecting from the mobile app, you'll need to run museum on a local IP +> instead localhost. If so, just replace "http://localhost:8080" with (say) +> "http://192.168.1.2:8080" wherever mentioned. + +### Payments app + +For this (payments) web app, configure it to connect to the local museum, and +use a set of (development) Stripe keys which can be found in +[Stripe's developer dashboard](https://dashboard.stripe.com). + +Add the following to `web/apps/payments/.env.local`: + +```env +VITE_ENTE_ENDPOINT = http://localhost:8080 +VITE_STRIPE_US_PUBLISHABLE_KEY = stripe_publishable_key +``` + +Then start it locally + +```sh +yarn dev:payments ``` ### Museum @@ -32,19 +61,35 @@ NEXT_PUBLIC_STRIPE_US_PUBLISHABLE_KEY = stripe_publishable_key 2. Define this secret within your `musuem.yaml` -3. Update the `whitelisted-redirect-urls` so that it supports redirecting to - this locally running project. +3. Update the `whitelisted-redirect-urls` so that it supports redirecting to the + locally running payments app. -Assuming that your local payments app is running on `192.168.1.2:3001`, your -`museum.yaml` should look as follows. +Assuming that your local payments app is running on `localhost:3001`, your +`server/museum.yaml` should look as follows. ```yaml stripe: us: key: stripe_dev_key webhook-secret: stripe_dev_webhook_secret - whitelisted-redirect-urls: ["http://192.168.1.2:3001/frameRedirect"] + whitelisted-redirect-urls: + - "http://localhost:3000/gallery" + - "http://192.168.1.2:3001/frameRedirect" path: success: ?status=success&session_id={CHECKOUT_SESSION_ID} cancel: ?status=fail&reason=canceled ``` + +Make sure you have test plans available for museum to use, by placing them in +(say) `server/data/billing/us-testing.json`. + +Finally, start museum, for example: + +```sh +docker compose up +``` + +Now if you try to purchase a plan from your locally running photos web client, +it should redirect to the locally running payments app, and from there to +Stripe. Once the test purchase completes it should redirect back to the local +web client. diff --git a/web/apps/payments/index.html b/web/apps/payments/index.html new file mode 100644 index 000000000..8cfdfef15 --- /dev/null +++ b/web/apps/payments/index.html @@ -0,0 +1,12 @@ + + + + + + Payments | ente.io + + +
+ + + diff --git a/web/apps/payments/next.config.js b/web/apps/payments/next.config.js deleted file mode 100644 index 64a1e9867..000000000 --- a/web/apps/payments/next.config.js +++ /dev/null @@ -1,18 +0,0 @@ -// @ts-check - -/** - * Configuration for the Next.js build - * - * See also: - * - packages/next/next.config.base.js - * - https://nextjs.org/docs/pages/api-reference/next-config-js - * - * @type {import("next").NextConfig} - */ -const nextConfig = { - /* generate a static export when we run `next build` */ - output: "export", - reactStrictMode: true, -}; - -module.exports = nextConfig; diff --git a/web/apps/payments/package.json b/web/apps/payments/package.json index 0e6dd6aa3..4c8cc122f 100644 --- a/web/apps/payments/package.json +++ b/web/apps/payments/package.json @@ -2,10 +2,22 @@ "name": "payments", "version": "0.0.0", "private": true, + "type": "module", + "scripts": { + "build": "tsc && vite build", + "dev": "vite --port 3001", + "preview": "vite preview --port 3001" + }, "dependencies": { - "@/next": "*", "@stripe/stripe-js": "^1.17.0", - "axios": "^0.21.1", - "bootstrap": "4.6.0" + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@/build-config": "*", + "@types/react": "^18", + "@types/react-dom": "^18", + "@vitejs/plugin-react": "^4.2", + "vite": "^5.2" } } diff --git a/web/apps/payments/public/fonts/UFL.txt b/web/apps/payments/public/fonts/UFL.txt deleted file mode 100644 index 6e722c88d..000000000 --- a/web/apps/payments/public/fonts/UFL.txt +++ /dev/null @@ -1,96 +0,0 @@ -------------------------------- -UBUNTU FONT LICENCE Version 1.0 -------------------------------- - -PREAMBLE -This licence allows the licensed fonts to be used, studied, modified and -redistributed freely. The fonts, including any derivative works, can be -bundled, embedded, and redistributed provided the terms of this licence -are met. The fonts and derivatives, however, cannot be released under -any other licence. The requirement for fonts to remain under this -licence does not require any document created using the fonts or their -derivatives to be published under this licence, as long as the primary -purpose of the document is not to be a vehicle for the distribution of -the fonts. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this licence and clearly marked as such. This may -include source files, build scripts and documentation. - -"Original Version" refers to the collection of Font Software components -as received under this licence. - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to -a new environment. - -"Copyright Holder(s)" refers to all individuals and companies who have a -copyright ownership of the Font Software. - -"Substantially Changed" refers to Modified Versions which can be easily -identified as dissimilar to the Font Software by users of the Font -Software comparing the Original Version with the Modified Version. - -To "Propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification and with or without charging -a redistribution fee), making available to the public, and in some -countries other activities as well. - -PERMISSION & CONDITIONS -This licence does not grant any rights under trademark law and all such -rights are reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of the Font Software, to propagate the Font Software, subject to -the below conditions: - -1) Each copy of the Font Software must contain the above copyright -notice and this licence. These can be included either as stand-alone -text files, human-readable headers or in the appropriate machine- -readable metadata fields within text or binary files as long as those -fields can be easily viewed by the user. - -2) The font name complies with the following: -(a) The Original Version must retain its name, unmodified. -(b) Modified Versions which are Substantially Changed must be renamed to -avoid use of the name of the Original Version or similar names entirely. -(c) Modified Versions which are not Substantially Changed must be -renamed to both (i) retain the name of the Original Version and (ii) add -additional naming elements to distinguish the Modified Version from the -Original Version. The name of such Modified Versions must be the name of -the Original Version, with "derivative X" where X represents the name of -the new work, appended to that name. - -3) The name(s) of the Copyright Holder(s) and any contributor to the -Font Software shall not be used to promote, endorse or advertise any -Modified Version, except (i) as required by this licence, (ii) to -acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with -their explicit written permission. - -4) The Font Software, modified or unmodified, in part or in whole, must -be distributed entirely under this licence, and must not be distributed -under any other licence. The requirement for fonts to remain under this -licence does not affect any document created using the Font Software, -except any version of the Font Software extracted from a document -created using the Font Software may only be distributed under this -licence. - -TERMINATION -This licence becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER -DEALINGS IN THE FONT SOFTWARE. diff --git a/web/apps/payments/public/fonts/ubuntu-v15-latin-700.woff b/web/apps/payments/public/fonts/ubuntu-v15-latin-700.woff deleted file mode 100644 index 8f770546a..000000000 Binary files a/web/apps/payments/public/fonts/ubuntu-v15-latin-700.woff and /dev/null differ diff --git a/web/apps/payments/public/fonts/ubuntu-v15-latin-700.woff2 b/web/apps/payments/public/fonts/ubuntu-v15-latin-700.woff2 deleted file mode 100644 index e10142f55..000000000 Binary files a/web/apps/payments/public/fonts/ubuntu-v15-latin-700.woff2 and /dev/null differ diff --git a/web/apps/payments/public/fonts/ubuntu-v15-latin-regular.woff b/web/apps/payments/public/fonts/ubuntu-v15-latin-regular.woff deleted file mode 100644 index 2fc163ffb..000000000 Binary files a/web/apps/payments/public/fonts/ubuntu-v15-latin-regular.woff and /dev/null differ diff --git a/web/apps/payments/public/fonts/ubuntu-v15-latin-regular.woff2 b/web/apps/payments/public/fonts/ubuntu-v15-latin-regular.woff2 deleted file mode 100644 index a590b8a9e..000000000 Binary files a/web/apps/payments/public/fonts/ubuntu-v15-latin-regular.woff2 and /dev/null differ diff --git a/web/apps/payments/src/App.tsx b/web/apps/payments/src/App.tsx new file mode 100644 index 000000000..57ebf7921 --- /dev/null +++ b/web/apps/payments/src/App.tsx @@ -0,0 +1,21 @@ +import React, { useEffect, useRef, useState } from "react"; +import { Container } from "./components/Container"; +import { parseAndHandleRequest } from "./services/billing-service"; +import S from "./utils/strings"; + +export const App: React.FC = () => { + const [failed, setFailed] = useState(false); + const once = useRef(false); + + useEffect(() => { + if (once.current) return; + once.current = true; + parseAndHandleRequest().catch(() => { + setFailed(true); + }); + }, []); + + return {failed ? S.error_generic : }; +}; + +const Spinner: React.FC = () =>
; diff --git a/web/apps/payments/src/components/Container.tsx b/web/apps/payments/src/components/Container.tsx index 33ab44a6b..bf8c57b5d 100644 --- a/web/apps/payments/src/components/Container.tsx +++ b/web/apps/payments/src/components/Container.tsx @@ -1,9 +1,5 @@ -import styled from "@emotion/styled"; +import React from "react"; -export const Container = styled.div` - display: flex; - flex: 1; - flex-direction: column; - justify-content: center; - align-items: center; -`; +export const Container: React.FC = ({ children }) => ( +
{children}
+); diff --git a/web/apps/payments/src/components/EnteSpinner.tsx b/web/apps/payments/src/components/EnteSpinner.tsx deleted file mode 100644 index c40057045..000000000 --- a/web/apps/payments/src/components/EnteSpinner.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Spinner } from "react-bootstrap"; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export default function EnteSpinner(props: any) { - return ( - - Loading... - - ); -} diff --git a/web/apps/payments/src/main.tsx b/web/apps/payments/src/main.tsx new file mode 100644 index 000000000..4ed8c3205 --- /dev/null +++ b/web/apps/payments/src/main.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import { App } from "./App"; +import "./styles/globals.css"; + +const root = document.getElementById("root"); +if (!root) throw new Error("Could not load root element to render onto"); + +ReactDOM.createRoot(root).render( + + + , +); diff --git a/web/apps/payments/src/pages/404.tsx b/web/apps/payments/src/pages/404.tsx deleted file mode 100644 index 17911a7fc..000000000 --- a/web/apps/payments/src/pages/404.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { Container } from "components/Container"; -import constants from "utils/strings/constants"; - -export default function Home() { - return {constants.NOT_FOUND}; -} diff --git a/web/apps/payments/src/pages/_app.tsx b/web/apps/payments/src/pages/_app.tsx deleted file mode 100644 index 17db6086b..000000000 --- a/web/apps/payments/src/pages/_app.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import "bootstrap/dist/css/bootstrap.min.css"; -import type { AppProps } from "next/app"; -import Head from "next/head"; -import constants from "utils/strings/constants"; -import "../styles/globals.css"; - -function MyApp({ Component, pageProps }: AppProps) { - return ( - <> - - {constants.TITLE} - - - - ); -} -export default MyApp; diff --git a/web/apps/payments/src/pages/desktop-redirect.tsx b/web/apps/payments/src/pages/desktop-redirect.tsx deleted file mode 100644 index b945ee20a..000000000 --- a/web/apps/payments/src/pages/desktop-redirect.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { Container } from "components/Container"; -import EnteSpinner from "components/EnteSpinner"; -import * as React from "react"; - -export default function DesktopRedirect() { - React.useEffect(() => { - const currentURL = new URL(window.location.href); - const desktopRedirectURL = new URL("ente://app/gallery"); - desktopRedirectURL.search = currentURL.search; - window.location.href = desktopRedirectURL.href; - }, []); - - return ( - - - - ); -} diff --git a/web/apps/payments/src/pages/index.tsx b/web/apps/payments/src/pages/index.tsx deleted file mode 100644 index b4aad2a0e..000000000 --- a/web/apps/payments/src/pages/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Container } from "components/Container"; -import EnteSpinner from "components/EnteSpinner"; -import * as React from "react"; -import { parseAndHandleRequest } from "services/billingService"; -import { CUSTOM_ERROR } from "utils/error"; -import constants from "utils/strings/constants"; - -export default function Home() { - const [errorMessageView, setErrorMessageView] = React.useState(false); - const [loading, setLoading] = React.useState(false); - React.useEffect(() => { - async function main() { - try { - setLoading(true); - await parseAndHandleRequest(); - } catch (e: unknown) { - if ( - e instanceof Error && - e.message === CUSTOM_ERROR.DIRECT_OPEN_WITH_NO_QUERY_PARAMS - ) { - window.location.href = "https://ente.io"; - } else { - setErrorMessageView(true); - } - } - } - // TODO: audit - // eslint-disable-next-line @typescript-eslint/no-floating-promises - main(); - }, []); - - return ( - - {errorMessageView ? ( -
{constants.SOMETHING_WENT_WRONG}
- ) : ( - loading && - )} -
- ); -} diff --git a/web/apps/payments/src/services/HTTPService.ts b/web/apps/payments/src/services/HTTPService.ts deleted file mode 100644 index 834a18ae6..000000000 --- a/web/apps/payments/src/services/HTTPService.ts +++ /dev/null @@ -1,185 +0,0 @@ -// TODO: Audit -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/consistent-indexed-object-style */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import axios, { AxiosRequestConfig } from "axios"; - -interface IHTTPHeaders { - [headerKey: string]: any; -} - -interface IQueryPrams { - [paramName: string]: any; -} - -/** - * Service to manage all HTTP calls. - */ -class HTTPService { - constructor() { - axios.interceptors.response.use( - (response) => Promise.resolve(response), - (err) => { - if (!err.response) { - return Promise.reject(err); - } - const { response } = err; - return Promise.reject(response); - }, - ); - } - - /** - * header object to be append to all api calls. - */ - private headers: IHTTPHeaders = { - "content-type": "application/json", - }; - - /** - * Sets the headers to the given object. - */ - public setHeaders(headers: IHTTPHeaders) { - this.headers = headers; - } - - /** - * Adds a header to list of headers. - */ - public appendHeader(key: string, value: string) { - this.headers = { - ...this.headers, - [key]: value, - }; - } - - /** - * Removes the given header. - */ - public removeHeader(key: string) { - this.headers[key] = undefined; - } - - /** - * Returns axios interceptors. - */ - // eslint-disable-next-line class-methods-use-this - public getInterceptors() { - return axios.interceptors; - } - - /** - * Generic HTTP request. - * This is done so that developer can use any functionality - * provided by axios. Here, only the set headers are spread - * over what was sent in config. - */ - public async request(config: AxiosRequestConfig, customConfig?: any) { - // eslint-disable-next-line no-param-reassign - config.headers = { - ...this.headers, - ...config.headers, - }; - if (customConfig?.cancel) { - config.cancelToken = new axios.CancelToken( - (c) => (customConfig.cancel.exec = c), - ); - } - return await axios({ ...config, ...customConfig }); - } - - /** - * Get request. - */ - public get( - url: string, - params?: IQueryPrams, - headers?: IHTTPHeaders, - customConfig?: any, - ) { - return this.request( - { - headers, - method: "GET", - params, - url, - }, - customConfig, - ); - } - - /** - * Post request - */ - public post( - url: string, - data?: any, - params?: IQueryPrams, - headers?: IHTTPHeaders, - customConfig?: any, - ) { - return this.request( - { - data, - headers, - method: "POST", - params, - url, - }, - customConfig, - ); - } - - /** - * Put request - */ - public put( - url: string, - data: any, - params?: IQueryPrams, - headers?: IHTTPHeaders, - customConfig?: any, - ) { - return this.request( - { - data, - headers, - method: "PUT", - params, - url, - }, - customConfig, - ); - } - - /** - * Delete request - */ - public delete( - url: string, - data: any, - params?: IQueryPrams, - headers?: IHTTPHeaders, - customConfig?: any, - ) { - return this.request( - { - data, - headers, - method: "DELETE", - params, - url, - }, - customConfig, - ); - } -} - -// Creates a Singleton Service. -// This will help me maintain common headers / functionality -// at a central place. -export default new HTTPService(); diff --git a/web/apps/payments/src/services/billing-service.ts b/web/apps/payments/src/services/billing-service.ts new file mode 100644 index 000000000..35f67660c --- /dev/null +++ b/web/apps/payments/src/services/billing-service.ts @@ -0,0 +1,310 @@ +import { loadStripe } from "@stripe/stripe-js"; + +/** + * Communicate with Stripe using their JS SDK, and redirect back to the client. + * + * All necessary parameters are obtained by parsing the request parameters. + * + * In case of unrecoverable errors, this function will throw. Otherwise it will + * redirect to the client or to some fallback URL. + */ +export const parseAndHandleRequest = async () => { + try { + const urlParams = new URLSearchParams(window.location.search); + const productID = urlParams.get("productID"); + const paymentToken = urlParams.get("paymentToken"); + const action = urlParams.get("action"); + const redirectURL = urlParams.get("redirectURL"); + + if (!action && !paymentToken && !productID && !redirectURL) { + // Maybe someone attempted to directly open this page in their + // browser. Not much we can do, just redirect them to the main site. + console.log( + "None of the required query parameters were supplied, redirecting to the ente.io", + ); + redirectHome(); + return; + } + + if (!action || !paymentToken || !productID || !redirectURL) { + throw Error("Required query parameter was not provided"); + } + + switch (action) { + case "buy": + await buySubscription(productID, paymentToken, redirectURL); + break; + case "update": + await updateSubscription(productID, paymentToken, redirectURL); + break; + default: + throw Error(`Unsupported action ${action}`); + } + } catch (e) { + console.error(e); + throw e; + } +}; + +const apiOrigin = import.meta.env.VITE_ENTE_ENDPOINT ?? "https://api.ente.io"; + +type StripeAccountCountry = "US" | "IN"; + +const isStripeAccountCountry = (c: unknown): c is StripeAccountCountry => + c == "US" || c == "IN"; + +const stripePublishableKey = (accountCountry: StripeAccountCountry) => { + switch (accountCountry) { + case "US": + return ( + import.meta.env.VITE_STRIPE_US_PUBLISHABLE_KEY ?? + "pk_live_51LZ9P4G1ITnQlpAnrP6pcS7NiuJo3SnJ7gibjJlMRatkrd2EY1zlMVTVQG5RkSpLPbsHQzFfnEtgHnk1PiylIFkk00tC0LWXwi" + ); + case "IN": + return ( + import.meta.env.VITE_STRIPE_IN_PUBLISHABLE_KEY ?? + "pk_live_51HAhqDK59oeucIMOiTI6MDDM2UWUbCAJXJCGsvjJhiO8nYJz38rQq5T4iyQLDMKxqEDUfU5Hopuj4U5U4dff23oT00fHvZeodC" + ); + } +}; + +/** Return the {@link StripeAccountCountry} for the user. */ +const getUserStripeAccountCountry = async (paymentToken: string) => { + const url = `${apiOrigin}/billing/stripe-account-country`; + const res = await fetch(url, { + headers: { + "X-Auth-Token": paymentToken, + }, + }); + if (!res.ok) throw new Error(`Failed to fetch ${url}: HTTP ${res.status}`); + const json: unknown = await res.json(); + if (json && typeof json === "object" && "stripeAccountCountry" in json) { + const c = json.stripeAccountCountry; + if (isStripeAccountCountry(c)) return c; + } + throw new Error(`Unexpected response for ${url}: ${JSON.stringify(json)}`); +}; + +/** Load and return the Stripe JS SDK initialized for the given country. */ +const getStripe = async ( + redirectURL: string, + accountCountry: StripeAccountCountry, +) => { + const publishableKey = stripePublishableKey(accountCountry); + try { + const stripe = await loadStripe(publishableKey); + if (!stripe) throw new Error("Failed to load Stripe"); + return stripe; + } catch (e) { + redirectToApp(redirectURL, "fail", "stripe_error"); + throw e; + } +}; + +/** The flow when the user wants to buy a new subscription. */ +const buySubscription = async ( + productID: string, + paymentToken: string, + redirectURL: string, +) => { + try { + const accountCountry = await getUserStripeAccountCountry(paymentToken); + const stripe = await getStripe(redirectURL, accountCountry); + const sessionId = await createCheckoutSession( + productID, + paymentToken, + redirectURL, + ); + await stripe.redirectToCheckout({ sessionId }); + } catch (e) { + redirectToApp(redirectURL, "fail", "server_error"); + throw e; + } +}; + +/** Create a new checkout session on museum and return the sessionID. */ +const createCheckoutSession = async ( + productID: string, + paymentToken: string, + redirectURL: string, +): Promise => { + const params = new URLSearchParams({ productID, redirectURL }); + const url = `${apiOrigin}/billing/stripe/checkout-session?${params.toString()}`; + const res = await fetch(url, { + headers: { + "X-Auth-Token": paymentToken, + }, + }); + if (!res.ok) throw new Error(`Failed to fetch ${url}: HTTP ${res.status}`); + const json: unknown = await res.json(); + if (json && typeof json == "object" && "sessionID" in json) { + const sid = json.sessionID; + if (typeof sid == "string") return sid; + } + throw new Error(`Unexpected response for ${url}: ${JSON.stringify(json)}`); +}; + +const updateSubscription = async ( + productID: string, + paymentToken: string, + redirectURL: string, +) => { + try { + const accountCountry = await getUserStripeAccountCountry(paymentToken); + const stripe = await getStripe(redirectURL, accountCountry); + const { status, clientSecret } = await updateStripeSubscription( + paymentToken, + productID, + ); + switch (status) { + case "success": { + // Subscription was updated successfully, nothing more required + redirectToApp(redirectURL, "success"); + return; + } + + case "requires_payment_method": + redirectToApp(redirectURL, "fail", "requires_payment_method"); + return; + + case "requires_action": { + const { error } = await stripe.confirmCardPayment(clientSecret); + if (!error) { + redirectToApp(redirectURL, "success"); + } else { + console.error("Failed to confirm card payment", error); + if (error.type == "card_error") { + redirectToApp( + redirectURL, + "fail", + "requires_payment_method", + ); + } else if ( + error.type == "authentication_error" || + error.code == "payment_intent_authentication_failure" + ) { + redirectToApp( + redirectURL, + "fail", + "authentication_failed", + ); + } else { + redirectToApp(redirectURL, "fail"); + } + } + return; + } + } + } catch (e) { + redirectToApp(redirectURL, "fail", "server_error"); + throw e; + } +}; + +type PaymentStatus = "success" | "requires_action" | "requires_payment_method"; + +const isPaymentStatus = (s: unknown): s is PaymentStatus => + s == "success" || s == "requires_action" || s == "requires_payment_method"; + +interface UpdateStripeSubscriptionResponse { + status: PaymentStatus; + clientSecret: string; +} + +/** + * Make a request to museum to update an existing Stript subscription with + * {@link productID} for the user. + */ +async function updateStripeSubscription( + paymentToken: string, + productID: string, +): Promise { + const url = `${apiOrigin}/billing/stripe/update-subscription`; + const res = await fetch(url, { + method: "POST", + headers: { + "X-Auth-Token": paymentToken, + }, + body: JSON.stringify({ + productID, + }), + }); + if (!res.ok) throw new Error(`Failed to fetch ${url}: HTTP ${res.status}`); + const json: unknown = await res.json(); + if (json && typeof json == "object" && "result" in json) { + const result = json.result; + if ( + result && + typeof result == "object" && + "status" in result && + "clientSecret" in result + ) { + const status = result.status; + const clientSecret = result.clientSecret; + if (isPaymentStatus(status) && typeof clientSecret == "string") { + return { status, clientSecret }; + } + } + } + throw new Error(`Unexpected response for ${url}: ${JSON.stringify(json)}`); +} + +type RedirectStatus = "success" | "fail"; + +type FailureReason = + /** + * Unable to authenticate card or 3DS. + * + * User should be shown button for fixing card via customer portal. + */ + | "authentication_failed" + /** + * Card declined results in this error. + * + * Show button to the customer portal. + */ + | "requires_payment_method" + /** + * An error in initializing the Stripe JS SDK. + */ + | "stripe_error" + | "canceled" + | "server_error"; + +/** + * Navigate to {@link redirectURL}, passing the given values as query params. + * + * [Note: Redirects do not interrupt script execution] + * + * I have been unable to find a documentation / reference source for this, but + * in practice when I test it with a following snippet + * + * const nonce = Math.random(); + * console.log("before", nonce); + * window.location.href = "http://example.org"; + * console.log("after", nonce); + * + * I observe that the code after the navigation also runs. + */ +const redirectToApp = ( + redirectURL: string, + status: RedirectStatus, + reason?: FailureReason, +) => { + // The desktop app passes "/desktop-redirect" as `redirectURL`. + // This is just a placeholder, we want to intercept this and instead + // redirect to the ente:// scheme protocol handler that is internally being + // used by the desktop app. + if (new URL(redirectURL).pathname == "/desktop-redirect") { + redirectToApp("ente://app/gallery", status, reason); + return; + } + + let url = `${redirectURL}?status=${status}`; + if (reason) url = `${url}&reason=${reason}`; + window.location.href = url; +}; + +const redirectHome = () => { + window.location.href = "https://ente.io"; +}; diff --git a/web/apps/payments/src/services/billingService.ts b/web/apps/payments/src/services/billingService.ts deleted file mode 100644 index c7a6a17e9..000000000 --- a/web/apps/payments/src/services/billingService.ts +++ /dev/null @@ -1,287 +0,0 @@ -// TODO: Audit this and other eslints -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-confusing-void-expression */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */ -/* eslint-disable @typescript-eslint/no-unnecessary-condition */ - -import { loadStripe } from "@stripe/stripe-js"; -import { CUSTOM_ERROR } from "utils/error"; -import { logError } from "utils/sentry"; -import HTTPService from "./HTTPService"; - -const getStripePublishableKey = (stripeAccount: StripeAccountCountry) => { - if (stripeAccount === StripeAccountCountry.STRIPE_IN) { - return ( - process.env.NEXT_PUBLIC_STRIPE_IN_PUBLISHABLE_KEY ?? - "pk_live_51HAhqDK59oeucIMOiTI6MDDM2UWUbCAJXJCGsvjJhiO8nYJz38rQq5T4iyQLDMKxqEDUfU5Hopuj4U5U4dff23oT00fHvZeodC" - ); - } else if (stripeAccount === StripeAccountCountry.STRIPE_US) { - return ( - process.env.NEXT_PUBLIC_STRIPE_US_PUBLISHABLE_KEY ?? - "pk_live_51LZ9P4G1ITnQlpAnrP6pcS7NiuJo3SnJ7gibjJlMRatkrd2EY1zlMVTVQG5RkSpLPbsHQzFfnEtgHnk1PiylIFkk00tC0LWXwi" - ); - } else { - throw Error("stripe account not found"); - } -}; - -const getEndpoint = () => { - const endPoint = - process.env.NEXT_PUBLIC_ENTE_ENDPOINT ?? "https://api.ente.io"; - return endPoint; -}; -enum PAYMENT_INTENT_STATUS { - SUCCESS = "success", - REQUIRE_ACTION = "requires_action", - REQUIRE_PAYMENT_METHOD = "requires_payment_method", -} - -enum FAILURE_REASON { - // Unable to authenticate card or 3DS - // User should be showing button for fixing card via customer portal - AUTHENTICATION_FAILED = "authentication_failed", - // Card declined result in this error. Show button to the customer portal. - REQUIRE_PAYMENT_METHOD = "requires_payment_method", - STRIPE_ERROR = "stripe_error", - CANCELED = "canceled", - SERVER_ERROR = "server_error", -} - -enum STRIPE_ERROR_TYPE { - CARD_ERROR = "card_error", - AUTHENTICATION_ERROR = "authentication_error", -} - -enum STRIPE_ERROR_CODE { - AUTHENTICATION_ERROR = "payment_intent_authentication_failure", -} - -enum RESPONSE_STATUS { - success = "success", - fail = "fail", -} - -enum PaymentActionType { - Buy = "buy", - Update = "update", -} - -enum StripeAccountCountry { - STRIPE_IN = "IN", - STRIPE_US = "US", -} - -interface SubscriptionUpdateResponse { - result: { - status: PAYMENT_INTENT_STATUS; - clientSecret: string; - }; -} - -export async function parseAndHandleRequest() { - try { - const urlParams = new URLSearchParams(window.location.search); - const productID = urlParams.get("productID"); - const paymentToken = urlParams.get("paymentToken"); - const action = urlParams.get("action"); - const redirectURL = urlParams.get("redirectURL"); - if (!action && !paymentToken && !productID && !redirectURL) { - throw Error(CUSTOM_ERROR.DIRECT_OPEN_WITH_NO_QUERY_PARAMS); - } else if (!action || !paymentToken || !productID || !redirectURL) { - throw Error(CUSTOM_ERROR.MISSING_REQUIRED_QUERY_PARAM); - } - switch (action) { - case PaymentActionType.Buy: - await buyPaidSubscription(productID, paymentToken, redirectURL); - break; - case PaymentActionType.Update: - await updateSubscription(productID, paymentToken, redirectURL); - break; - default: - throw Error(CUSTOM_ERROR.INVALID_ACTION); - } - } catch (e: any) { - console.error("Error: ", JSON.stringify(e)); - if (e.message !== CUSTOM_ERROR.DIRECT_OPEN_WITH_NO_QUERY_PARAMS) { - logError(e); - } - throw e; - } -} - -async function getUserStripeAccountCountry( - paymentToken: string, -): Promise<{ stripeAccountCountry: StripeAccountCountry }> { - const response = await HTTPService.get( - `${getEndpoint()}/billing/stripe-account-country`, - undefined, - { - "X-Auth-Token": paymentToken, - }, - ); - return response.data; -} - -async function getStripe( - redirectURL: string, - stripeAccount: StripeAccountCountry, -) { - try { - const publishableKey = getStripePublishableKey(stripeAccount); - const stripe = await loadStripe(publishableKey); - - if (!stripe) { - throw Error("stripe load failed"); - } - return stripe; - } catch (e) { - logError(e, "stripe load failed"); - redirectToApp( - redirectURL, - RESPONSE_STATUS.fail, - FAILURE_REASON.STRIPE_ERROR, - ); - throw e; - } -} - -export async function buyPaidSubscription( - productID: string, - paymentToken: string, - redirectURL: string, -) { - try { - const { stripeAccountCountry } = - await getUserStripeAccountCountry(paymentToken); - const stripe = await getStripe(redirectURL, stripeAccountCountry); - const { sessionID } = await createCheckoutSession( - productID, - paymentToken, - redirectURL, - ); - await stripe.redirectToCheckout({ - sessionId: sessionID, - }); - } catch (e) { - logError(e, "subscription purchase failed"); - redirectToApp( - redirectURL, - RESPONSE_STATUS.fail, - FAILURE_REASON.SERVER_ERROR, - ); - throw e; - } -} - -async function createCheckoutSession( - productID: string, - paymentToken: string, - redirectURL: string, -): Promise<{ sessionID: string }> { - const response = await HTTPService.get( - `${getEndpoint()}/billing/stripe/checkout-session`, - { - productID, - redirectURL, - }, - { - "X-Auth-Token": paymentToken, - }, - ); - return response.data; -} - -export async function updateSubscription( - productID: string, - paymentToken: string, - redirectURL: string, -) { - try { - const { stripeAccountCountry } = - await getUserStripeAccountCountry(paymentToken); - const stripe = await getStripe(redirectURL, stripeAccountCountry); - const { result } = await subscriptionUpdateRequest( - paymentToken, - productID, - ); - switch (result.status) { - case PAYMENT_INTENT_STATUS.SUCCESS: - // subscription updated successfully - // no-op required - return redirectToApp(redirectURL, RESPONSE_STATUS.success); - - case PAYMENT_INTENT_STATUS.REQUIRE_PAYMENT_METHOD: - return redirectToApp( - redirectURL, - RESPONSE_STATUS.fail, - FAILURE_REASON.REQUIRE_PAYMENT_METHOD, - ); - case PAYMENT_INTENT_STATUS.REQUIRE_ACTION: { - const { error } = await stripe.confirmCardPayment( - result.clientSecret, - ); - if (error) { - logError( - error, - `${error.message} - subscription update failed`, - ); - if (error.type === STRIPE_ERROR_TYPE.CARD_ERROR) { - return redirectToApp( - redirectURL, - RESPONSE_STATUS.fail, - FAILURE_REASON.REQUIRE_PAYMENT_METHOD, - ); - } else if ( - error.type === STRIPE_ERROR_TYPE.AUTHENTICATION_ERROR || - error.code === STRIPE_ERROR_CODE.AUTHENTICATION_ERROR - ) { - return redirectToApp( - redirectURL, - RESPONSE_STATUS.fail, - FAILURE_REASON.AUTHENTICATION_FAILED, - ); - } else { - return redirectToApp(redirectURL, RESPONSE_STATUS.fail); - } - } else { - return redirectToApp(redirectURL, RESPONSE_STATUS.success); - } - } - } - } catch (e) { - logError(e, "subscription update failed"); - redirectToApp( - redirectURL, - RESPONSE_STATUS.fail, - FAILURE_REASON.SERVER_ERROR, - ); - throw e; - } -} - -async function subscriptionUpdateRequest( - paymentToken: string, - productID: string, -): Promise { - const response = await HTTPService.post( - `${getEndpoint()}/billing/stripe/update-subscription`, - { - productID, - }, - undefined, - { - "X-Auth-Token": paymentToken, - }, - ); - return response.data; -} - -function redirectToApp(redirectURL: string, status: string, reason?: string) { - let completePath = `${redirectURL}?status=${status}`; - if (reason) { - completePath = `${completePath}&reason=${reason}`; - } - window.location.href = completePath; -} diff --git a/web/apps/payments/src/styles/globals.css b/web/apps/payments/src/styles/globals.css index c3d1ceab6..bd4bd106b 100644 --- a/web/apps/payments/src/styles/globals.css +++ b/web/apps/payments/src/styles/globals.css @@ -1,53 +1,29 @@ -/* ubuntu-regular - latin */ -@font-face { - font-family: "Ubuntu"; - font-style: normal; - font-weight: 400; - src: - local(""), - url("/fonts/ubuntu-v15-latin-regular.woff2") format("woff2"), - /* Chrome 26+, Opera 23+, Firefox 39+ */ - url("/fonts/ubuntu-v15-latin-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* ubuntu-700 - latin */ -@font-face { - font-family: "Ubuntu"; - font-style: normal; - font-weight: 700; - src: - local(""), - url("/fonts/ubuntu-v15-latin-700.woff2") format("woff2"), - /* Chrome 26+, Opera 23+, Firefox 39+ */ - url("/fonts/ubuntu-v15-latin-700.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -html, body { - padding: 0; - margin: 0; - font-family: Arial, Helvetica, sans-serif; - height: 100%; - flex: 1; - display: flex; - flex-direction: column; - background-color: #191919 !important; - color: #aaa !important; - font-family: Ubuntu, Arial, sans-serif !important; -} -:is(h1, h2, h3, h4, h5, h6) { - color: #d7d7d7; + font-family: system-ui, sans-serif; + background-color: #191919; + color: #aaa; } -#__next { - flex: 1; +.container { display: flex; flex-direction: column; -} - -.ente-container { - display: flex; - flex: 1; - flex-direction: column; justify-content: center; align-items: center; + min-height: 100svh; +} + +.loading-spinner { + color: #28a745; + width: 2rem; + height: 2rem; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: 0.75s linear infinite spinner-border; +} + +@keyframes spinner-border { + 100% { + transform: rotate(360deg); + } } diff --git a/web/apps/payments/src/utils/common.ts b/web/apps/payments/src/utils/common.ts deleted file mode 100644 index 7796b1303..000000000 --- a/web/apps/payments/src/utils/common.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function runningInBrowser() { - return typeof window !== "undefined"; -} diff --git a/web/apps/payments/src/utils/error/index.ts b/web/apps/payments/src/utils/error/index.ts deleted file mode 100644 index c38b2bf6c..000000000 --- a/web/apps/payments/src/utils/error/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const CUSTOM_ERROR = { - DIRECT_OPEN_WITH_NO_QUERY_PARAMS: "direct open with no query params", - MISSING_REQUIRED_QUERY_PARAM: "missing required query param", - INVALID_ACTION: "invalid action", -}; diff --git a/web/apps/payments/src/utils/sentry/index.ts b/web/apps/payments/src/utils/sentry/index.ts deleted file mode 100644 index 5a2640113..000000000 --- a/web/apps/payments/src/utils/sentry/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const logError = (e: unknown, msg?: string) => { - console.error(msg, e); -}; diff --git a/web/apps/payments/src/utils/strings.ts b/web/apps/payments/src/utils/strings.ts new file mode 100644 index 000000000..7285ea8be --- /dev/null +++ b/web/apps/payments/src/utils/strings.ts @@ -0,0 +1,12 @@ +/** + * User facing strings in the app. + * + * By keeping them separate, we make our lives easier if/when we need to + * localize the corresponding pages. Right now, these are just the values in the + * default language, English. + */ +const S = { + error_generic: "Oops, something went wrong.", +}; + +export default S; diff --git a/web/apps/payments/src/utils/strings/constants.tsx b/web/apps/payments/src/utils/strings/constants.tsx deleted file mode 100644 index e08c6d558..000000000 --- a/web/apps/payments/src/utils/strings/constants.tsx +++ /dev/null @@ -1,6 +0,0 @@ -const englishConstants = { - TITLE: "Payments | ente.io", - SOMETHING_WENT_WRONG: "Oops, something went wrong.", - NOT_FOUND: "404 | This page could not be found.", -}; -export default englishConstants; diff --git a/web/apps/payments/src/vite-env.d.ts b/web/apps/payments/src/vite-env.d.ts new file mode 100644 index 000000000..90af95a13 --- /dev/null +++ b/web/apps/payments/src/vite-env.d.ts @@ -0,0 +1,32 @@ +/* Type shims provided by vite, e.g. for asset imports + https://vitejs.dev/guide/features.html#client-types */ + +/// + +/** Types for the vite injected environment variables */ +interface ImportMetaEnv { + /** + * Override the origin (scheme://host:port) of Ente's API to connect to. + * + * This is useful when testing or connecting to alternative installations. + */ + readonly VITE_ENTE_ENDPOINT: string | undefined; + /** + * Override the publishable Stripe key to use when the user's account + * country is "US". + * + * This is useful when testing. + */ + readonly VITE_STRIPE_US_PUBLISHABLE_KEY: string | undefined; + /** + * Override the publishable Stripe key to use when the user's account + * country is "IN". + * + * This is useful when testing. + */ + readonly VITE_STRIPE_IN_PUBLISHABLE_KEY: string | undefined; +} + +interface ImportMeta { + env: ImportMetaEnv; +} diff --git a/web/apps/payments/tsconfig.json b/web/apps/payments/tsconfig.json index f40d4ddd7..291fed6ca 100644 --- a/web/apps/payments/tsconfig.json +++ b/web/apps/payments/tsconfig.json @@ -1,21 +1,5 @@ { - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "baseUrl": "./src", - "incremental": true, - "allowJs": true - }, - "include": ["next-env.d.ts", "src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "next.config.js"] + "extends": "@/build-config/tsconfig-vite.json", + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/web/apps/payments/tsconfig.node.json b/web/apps/payments/tsconfig.node.json new file mode 100644 index 000000000..a8d6e3fc8 --- /dev/null +++ b/web/apps/payments/tsconfig.node.json @@ -0,0 +1,4 @@ +{ + "extends": "@/build-config/tsconfig-vite.node.json", + "include": ["vite.config.ts"] +} diff --git a/web/apps/payments/vite.config.ts b/web/apps/payments/vite.config.ts new file mode 100644 index 000000000..d89c4f445 --- /dev/null +++ b/web/apps/payments/vite.config.ts @@ -0,0 +1,7 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/web/apps/photos/.env b/web/apps/photos/.env new file mode 100644 index 000000000..2680ead9f --- /dev/null +++ b/web/apps/photos/.env @@ -0,0 +1,87 @@ +# Sample configuration file +# +# All variables are commented out by default. Copy paste this into a new file +# called `.env.local` (or create a new empty file with that name) and add the +# environment variables you want to apply. `.env.local` is gitignored, so you +# can freely customize it for your local setup. +# +# `.env.local` is picked up by Next.js when NODE_ENV is 'development' (it is +# 'production' by default, but gets set to 'development' when we run `next +# dev`). Here's a list of the various files that come into play: +# +# .env loaded in all cases +# .env.local loaded in all cases, gitignored +# .env.development only loaded for yarn dev +# .env.development.local only loaded for yarn dev, gitignored +# .env.production only loaded for yarn build +# .env.production.local only loaded for yarn build, gitignored +# +# Alternatively, these variables can be provided as environment variables, say: +# +# NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev:photos +# +# Variables prefixed with NEXT_PUBLIC_ are made available when Next.js runs our +# code in the browser (Behind the scenes, Next.js just hardcodes occurrences of +# `process.env.NEXT_PUBLIC_FOO` with the value of the `NEXT_PUBLIC_FOO` env var +# when the bundle is built). See +# https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables +# +# A development build behaves differently in some aspects: +# +# - Logs go to the browser console (in addition to the log file) +# - There is some additional logging +# - ... (search for isDevBuild to see all impacts) +# +# Note that even in development build, the app still connects to the production +# APIs by default (can be customized using the env vars below). This is usually +# a good default, for example a customer cloning this repository want to build +# and run the client from source but still use their actual Ente account. + +# The Ente API endpoint +# +# NEXT_PUBLIC_ENTE_ENDPOINT = http://localhost:3000 + +# The Ente API endpoint for accounts related functionality +# +# NEXT_PUBLIC_ENTE_ACCOUNTS_ENDPOINT = http://localhost:3001 + +# The Ente API endpoint for payments related functionality +# +# NEXT_PUBLIC_ENTE_PAYMENTS_ENDPOINT = http://localhost:3001 + +# The URL for the shared albums deployment +# +# The shared albums are served from the photos app code, and "albums.ente.io" is +# a CNAME alias to the main photo app itself. When the main index page loads, it +# checks to see if the host is "albums.ente.io", and if so, redirects to +# /shared-albums. +# +# This environment variable allows us to check for a host other than +# "albums.ente.io". By setting this to localhost:3002 and running the photos app +# on port 3002 (using `yarn dev:albums`), we can connect to it and emulate the +# production behaviour. +# +# Enhancement: Consider splitting this into a separate app/ in this repository. +# That can also reduce bundle sizes and make it load faster. +# +# NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT = http://localhost:3002 + +# The URL of the family plans web app deployment +# +# Currently the source code for the family plan related pages is in a separate +# repository (https://github.com/ente-io/families). The mobile app also uses +# these pages. +# +# Enhancement: Consider moving that into the app/ folder in this repository. +# +# NEXT_PUBLIC_ENTE_FAMILY_ENDPOINT = http://localhost:3001 + +# The JSON which describes the expected results of our integration tests. See +# `upload.test.ts` for more details of the expected format. +# +# This is perhaps easier to specify as an environment variable, since then we +# can directly read from the source file when running `yarn dev`. For example, +# +# NEXT_PUBLIC_ENTE_TEST_EXPECTED_JSON=`cat path/to/expected.json` yarn dev +# +# NEXT_PUBLIC_ENTE_TEST_EXPECTED_JSON = {} diff --git a/web/apps/photos/.env.development b/web/apps/photos/.env.development index 891e62180..a8277281d 100644 --- a/web/apps/photos/.env.development +++ b/web/apps/photos/.env.development @@ -1,79 +1,19 @@ -# Sample configuration file +# Develop against a server running on localhost # -# All variables are commented out by default. Copy paste this into a new file -# called `.env.local` (or create a new empty file with that name) and add the -# environment variables you want to apply during development. `.env.local` is -# gitignored, so you can freely customize it for your local setup. +# Copy this file to `.env.local` or `.env.development.local` and uncomment the +# variable assignments below to give you a baseline setup. For more details, see +# `.env`. # -# `.env.local` is picked up by Next.js when NODE_ENV is 'development' (it is -# 'production' by default, but gets set to 'development' when we run `next dev`) -# -# Alternatively, these variables can be provided as environment variables, say: +# Equivalent CLI command using environment variables would be # # NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev:photos # -# Variables prefixed with NEXT_PUBLIC_ are made available when Next.js runs our -# code in the browser (Behind the scenes, Next.js just hardcodes occurrences of -# `process.env.NEXT_PUBLIC_FOO` with the value of the `NEXT_PUBLIC_FOO` env var -# when the bundle is built). See -# https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables -# -# A development build behaves differently in some aspects: -# -# - Logs go to the browser console (in addition to the log file) -# - There is some additional logging -# - ... (search for isDevBuild to see all impacts) -# -# Note that even in development build, the app still connects to the production -# APIs by default (can be customized using the env vars below). This is usually -# a good default, for example a customer cloning this repository want to build -# and run the client from source but still use their actual Ente account. -# The Ente API endpoint -# -# NEXT_PUBLIC_ENTE_ENDPOINT = http://localhost:3000 +#NEXT_PUBLIC_ENTE_ENDPOINT = http://localhost:8080 -# The Ente API endpoint for accounts related functionality +# If you wish to preview how the shared albums work, you can use `yarn +# dev:albums`. The equivalent CLI command using env vars would be # -# NEXT_PUBLIC_ENTE_ACCOUNTS_ENDPOINT = http://localhost:3001 +# NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=http://localhost:3002 yarn dev:albums -# The Ente API endpoint for payments related functionality -# -# NEXT_PUBLIC_ENTE_PAYMENTS_ENDPOINT = http://localhost:3001 - -# The URL for the shared albums deployment -# -# The shared albums are served from the photos app code, and "albums.ente.io" is -# a CNAME alias to the main photo app itself. When the main index page loads, it -# checks to see if the host is "albums.ente.io", and if so, redirects to -# /shared-albums. -# -# This environment variable allows us to check for a host other than -# "albums.ente.io". By setting this to localhost:3002 and running the photos app -# on port 3002 (using `yarn dev:albums`), we can connect to it and emulate the -# production behaviour. -# -# Enhancement: Consider splitting this into a separate app/ in this repository. -# That can also reduce bundle sizes and make it load faster. -# -# NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT = http://localhost:3002 - -# The URL of the family plans web app deployment -# -# Currently the source code for the family plan related pages is in a separate -# repository (https://github.com/ente-io/families). The mobile app also uses -# these pages. -# -# Enhancement: Consider moving that into the app/ folder in this repository. -# -# NEXT_PUBLIC_ENTE_FAMILY_ENDPOINT = http://localhost:3001 - -# The JSON which describes the expected results of our integration tests. See -# `upload.test.ts` for more details of the expected format. -# -# This is perhaps easier to specify as an environment variable, since then we -# can directly read from the source file when running `yarn dev`. For example, -# -# NEXT_PUBLIC_ENTE_TEST_EXPECTED_JSON=`cat path/to/expected.json` yarn dev -# -# NEXT_PUBLIC_ENTE_TEST_EXPECTED_JSON = {} +#NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT = http://localhost:3002 diff --git a/web/apps/photos/.env.localhost b/web/apps/photos/.env.localhost deleted file mode 100644 index 9fbf1bcbf..000000000 --- a/web/apps/photos/.env.localhost +++ /dev/null @@ -1,22 +0,0 @@ -# Develop against a server running on localhost -# -# Copy this file to `.env.local`. Then if you run a local instance of the web -# client with `yarn dev:photos`, it will connect to a locally running instance -# of the server. -# -# Not everything will work, you might need to set other env vars (see -# `.env.development`), but it should give you a usable baseline setup. -# -# Equivalent CLI command using environment variables would be -# -# NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev:photos -# - -NEXT_PUBLIC_ENTE_ENDPOINT = http://localhost:8080 - -# If you wish to preview how the shared albums work, you can use `yarn -# dev:albums`. The equivalent CLI command using env vars would be -# -# NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=http://localhost:3002 yarn dev:albums - -NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT = http://localhost:3002 diff --git a/web/apps/photos/package.json b/web/apps/photos/package.json index e0098cd36..8025ef726 100644 --- a/web/apps/photos/package.json +++ b/web/apps/photos/package.json @@ -16,13 +16,11 @@ "@tensorflow/tfjs-converter": "^4.10.0", "@tensorflow/tfjs-core": "^4.10.0", "@tensorflow/tfjs-tflite": "0.0.1-alpha.7", - "@zip.js/zip.js": "2.4.2", "bip39": "^3.0.4", "blazeface-back": "^0.0.9", - "bootstrap": "^4.5.2", "bs58": "^5.0.0", "chrono-node": "^2.2.6", - "comlink": "^4.3.0", + "date-fns": "^2", "debounce": "^2.0.0", "density-clustering": "^1.3.0", "eventemitter3": "^4.0.7", @@ -45,8 +43,7 @@ "p-queue": "^7.1.0", "photoswipe": "file:./thirdparty/photoswipe", "piexifjs": "^1.0.6", - "react-bootstrap": "^1.3.0", - "react-datepicker": "^4.16.0", + "pure-react-carousel": "^1.30.1", "react-dropzone": "^11.2.4", "react-otp-input": "^2.3.1", "react-select": "^4.3.1", @@ -67,14 +64,11 @@ "@types/bs58": "^4.0.1", "@types/leaflet": "^1.9.3", "@types/photoswipe": "^4.1.1", - "@types/react-collapse": "^5.0.1", - "@types/react-datepicker": "^4.15.0", "@types/react-select": "^4.0.15", "@types/react-virtualized-auto-sizer": "^1.0.1", "@types/react-window": "^1.8.2", "@types/react-window-infinite-loader": "^1.0.3", "@types/uuid": "^9.0.2", - "@types/wicg-file-system-access": "^2020.9.5", "@types/zxcvbn": "^4.4.1" } } diff --git a/web/apps/photos/public/locales/bg-BG/translation.json b/web/apps/photos/public/locales/bg-BG/translation.json deleted file mode 100644 index 03faf16c2..000000000 --- a/web/apps/photos/public/locales/bg-BG/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Личен бекъп
на твоите спомени
", - "HERO_SLIDE_1": "Криптиран от край до край по подразбиране", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/photos/public/locales/en-US/translation.json b/web/apps/photos/public/locales/en-US/translation.json deleted file mode 100644 index b06336bf5..000000000 --- a/web/apps/photos/public/locales/en-US/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Private backups
for your memories
", - "HERO_SLIDE_1": "End-to-end encrypted by default", - "HERO_SLIDE_2_TITLE": "
Safely stored
at a fallout shelter
", - "HERO_SLIDE_2": "Designed to outlive", - "HERO_SLIDE_3_TITLE": "
Available
everywhere
", - "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Login", - "SIGN_UP": "Signup", - "NEW_USER": "New to Ente", - "EXISTING_USER": "Existing user", - "ENTER_NAME": "Enter name", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Add a name so that your friends know who to thank for these great photos!", - "ENTER_EMAIL": "Enter email address", - "EMAIL_ERROR": "Enter a valid email", - "REQUIRED": "Required", - "EMAIL_SENT": "Verification code sent to {{email}}", - "CHECK_INBOX": "Please check your inbox (and spam) to complete verification", - "ENTER_OTT": "Verification code", - "RESEND_MAIL": "Resend code", - "VERIFY": "Verify", - "UNKNOWN_ERROR": "Something went wrong, please try again", - "INVALID_CODE": "Invalid verification code", - "EXPIRED_CODE": "Your verification code has expired", - "SENDING": "Sending...", - "SENT": "Sent!", - "PASSWORD": "Password", - "LINK_PASSWORD": "Enter password to unlock the album", - "RETURN_PASSPHRASE_HINT": "Password", - "SET_PASSPHRASE": "Set password", - "VERIFY_PASSPHRASE": "Sign in", - "INCORRECT_PASSPHRASE": "Incorrect password", - "ENTER_ENC_PASSPHRASE": "Please enter a password that we can use to encrypt your data", - "PASSPHRASE_DISCLAIMER": "We don't store your password, so if you forget it, we will not be able to help you recover your data without a recovery key.", - "WELCOME_TO_ENTE_HEADING": "Welcome to ", - "WELCOME_TO_ENTE_SUBHEADING": "End to end encrypted photo storage and sharing", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Where your best photos live", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Generating encryption keys...", - "PASSPHRASE_HINT": "Password", - "CONFIRM_PASSPHRASE": "Confirm password", - "REFERRAL_CODE_HINT": "How did you hear about Ente? (optional)", - "REFERRAL_INFO": "We don't track app installs, It'd help us if you told us where you found us!", - "PASSPHRASE_MATCH_ERROR": "Passwords don't match", - "CREATE_COLLECTION": "New album", - "ENTER_ALBUM_NAME": "Album name", - "CLOSE_OPTION": "Close (Esc)", - "ENTER_FILE_NAME": "File name", - "CLOSE": "Close", - "NO": "No", - "NOTHING_HERE": "Nothing to see here yet 👀", - "UPLOAD": "Upload", - "IMPORT": "Import", - "ADD_PHOTOS": "Add photos", - "ADD_MORE_PHOTOS": "Add more photos", - "add_photos_one": "Add 1 item", - "add_photos_other": "Add {{count, number}} items", - "SELECT_PHOTOS": "Select photos", - "FILE_UPLOAD": "File Upload", - "UPLOAD_STAGE_MESSAGE": { - "0": "Preparing to upload", - "1": "Reading google metadata files", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} files metadata extracted", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} files processed", - "4": "Cancelling remaining uploads", - "5": "Backup complete" - }, - "FILE_NOT_UPLOADED_LIST": "The following files were not uploaded", - "SUBSCRIPTION_EXPIRED": "Subscription expired", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Your subscription has expired, please renew", - "STORAGE_QUOTA_EXCEEDED": "Storage limit exceeded", - "INITIAL_LOAD_DELAY_WARNING": "First load may take some time", - "USER_DOES_NOT_EXIST": "Sorry, could not find a user with that email", - "NO_ACCOUNT": "Don't have an account", - "ACCOUNT_EXISTS": "Already have an account", - "CREATE": "Create", - "DOWNLOAD": "Download", - "DOWNLOAD_OPTION": "Download (D)", - "DOWNLOAD_FAVORITES": "Download favorites", - "DOWNLOAD_UNCATEGORIZED": "Download uncategorized", - "DOWNLOAD_HIDDEN_ITEMS": "Download hidden items", - "COPY_OPTION": "Copy as PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Toggle fullscreen (F)", - "ZOOM_IN_OUT": "Zoom in/out", - "PREVIOUS": "Previous (←)", - "NEXT": "Next (→)", - "TITLE_PHOTOS": "Ente Photos", - "TITLE_ALBUMS": "Ente Photos", - "TITLE_AUTH": "Ente Auth", - "UPLOAD_FIRST_PHOTO": "Upload your first photo", - "IMPORT_YOUR_FOLDERS": "Import your folders", - "UPLOAD_DROPZONE_MESSAGE": "Drop to backup your files", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Drop to add watched folder", - "TRASH_FILES_TITLE": "Delete files?", - "TRASH_FILE_TITLE": "Delete file?", - "DELETE_FILES_TITLE": "Delete immediately?", - "DELETE_FILES_MESSAGE": "Selected files will be permanently deleted from your Ente account.", - "DELETE": "Delete", - "DELETE_OPTION": "Delete (DEL)", - "FAVORITE_OPTION": "Favorite (L)", - "UNFAVORITE_OPTION": "Unfavorite (L)", - "MULTI_FOLDER_UPLOAD": "Multiple folders detected", - "UPLOAD_STRATEGY_CHOICE": "Would you like to upload them into", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "A single album", - "OR": "or", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Separate albums", - "SESSION_EXPIRED_MESSAGE": "Your session has expired, please login again to continue", - "SESSION_EXPIRED": "Session expired", - "PASSWORD_GENERATION_FAILED": "Your browser was unable to generate a strong key that meets Ente's encryption standards, please try using the mobile app or another browser", - "CHANGE_PASSWORD": "Change password", - "GO_BACK": "Go back", - "RECOVERY_KEY": "Recovery key", - "SAVE_LATER": "Do this later", - "SAVE": "Save Key", - "RECOVERY_KEY_DESCRIPTION": "If you forget your password, the only way you can recover your data is with this key.", - "RECOVER_KEY_GENERATION_FAILED": "Recovery code could not be generated, please try again", - "KEY_NOT_STORED_DISCLAIMER": "We don't store this key, so please save this in a safe place", - "FORGOT_PASSWORD": "Forgot password", - "RECOVER_ACCOUNT": "Recover account", - "RECOVERY_KEY_HINT": "Recovery key", - "RECOVER": "Recover", - "NO_RECOVERY_KEY": "No recovery key?", - "INCORRECT_RECOVERY_KEY": "Incorrect recovery key", - "SORRY": "Sorry", - "NO_RECOVERY_KEY_MESSAGE": "Due to the nature of our end-to-end encryption protocol, your data cannot be decrypted without your password or recovery key", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Please drop an email to {{emailID}} from your registered email address", - "CONTACT_SUPPORT": "Contact support", - "REQUEST_FEATURE": "Request Feature", - "SUPPORT": "Support", - "CONFIRM": "Confirm", - "CANCEL": "Cancel", - "LOGOUT": "Logout", - "DELETE_ACCOUNT": "Delete account", - "DELETE_ACCOUNT_MESSAGE": "

Please send an email to {{emailID}} from your registered email address.

Your request will be processed within 72 hours.

", - "LOGOUT_MESSAGE": "Are you sure you want to logout?", - "CHANGE_EMAIL": "Change email", - "OK": "OK", - "SUCCESS": "Success", - "ERROR": "Error", - "MESSAGE": "Message", - "INSTALL_MOBILE_APP": "Install our Android or iOS app to automatically backup all your photos", - "DOWNLOAD_APP_MESSAGE": "Sorry, this operation is currently only supported on our desktop app", - "DOWNLOAD_APP": "Download desktop app", - "EXPORT": "Export Data", - "SUBSCRIPTION": "Subscription", - "SUBSCRIBE": "Subscribe", - "MANAGEMENT_PORTAL": "Manage payment method", - "MANAGE_FAMILY_PORTAL": "Manage family", - "LEAVE_FAMILY_PLAN": "Leave family plan", - "LEAVE": "Leave", - "LEAVE_FAMILY_CONFIRM": "Are you sure that you want to leave family plan?", - "CHOOSE_PLAN": "Choose your plan", - "MANAGE_PLAN": "Manage your subscription", - "ACTIVE": "Active", - "OFFLINE_MSG": "You are offline, cached memories are being shown", - "FREE_SUBSCRIPTION_INFO": "You are on the free plan that expires on {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "You are on a family plan managed by", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renews on {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Ends on {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Your subscription will be cancelled on {{date, dateTime}}", - "ADD_ON_AVAILABLE_TILL": "Your {{storage, string}} add-on is valid till {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "You have exceeded your storage quota, please upgrade", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

We've received your payment

Your subscription is valid till {{date, dateTime}}

", - "SUBSCRIPTION_PURCHASE_CANCELLED": "Your purchase was canceled, please try again if you want to subscribe", - "SUBSCRIPTION_PURCHASE_FAILED": "Subscription purchase failed , please try again", - "SUBSCRIPTION_UPDATE_FAILED": "Subscription updated failed , please try again", - "UPDATE_PAYMENT_METHOD_MESSAGE": "We are sorry, payment failed when we tried to charge your card, please update your payment method and try again", - "STRIPE_AUTHENTICATION_FAILED": "We are unable to authenticate your payment method. please choose a different payment method and try again", - "UPDATE_PAYMENT_METHOD": "Update payment method", - "MONTHLY": "Monthly", - "YEARLY": "Yearly", - "UPDATE_SUBSCRIPTION_MESSAGE": "Are you sure you want to change your plan?", - "UPDATE_SUBSCRIPTION": "Change plan", - "CANCEL_SUBSCRIPTION": "Cancel subscription", - "CANCEL_SUBSCRIPTION_MESSAGE": "

All of your data will be deleted from our servers at the end of this billing period.

Are you sure that you want to cancel your subscription?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Are you sure you want to cancel your subscription?

", - "SUBSCRIPTION_CANCEL_FAILED": "Failed to cancel subscription", - "SUBSCRIPTION_CANCEL_SUCCESS": "Subscription canceled successfully", - "REACTIVATE_SUBSCRIPTION": "Reactivate subscription", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "Once reactivated, you will be billed on {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Subscription activated successfully ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Failed to reactivate subscription renewals", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Thank you", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Cancel mobile subscription", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Please cancel your subscription from the mobile app to activate a subscription here", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Please contact us at {{emailID}} to manage your subscription", - "RENAME": "Rename", - "RENAME_FILE": "Rename file", - "RENAME_COLLECTION": "Rename album", - "DELETE_COLLECTION_TITLE": "Delete album?", - "DELETE_COLLECTION": "Delete album", - "DELETE_COLLECTION_MESSAGE": "Also delete the photos (and videos) present in this album from all other albums they are part of?", - "DELETE_PHOTOS": "Delete photos", - "KEEP_PHOTOS": "Keep photos", - "SHARE": "Share", - "SHARE_COLLECTION": "Share album", - "SHAREES": "Shared with", - "SHARE_WITH_SELF": "Oops, you cannot share with yourself", - "ALREADY_SHARED": "Oops, you're already sharing this with {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Sharing album not allowed", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Sharing is disabled for free accounts", - "DOWNLOAD_COLLECTION": "Download album", - "DOWNLOAD_COLLECTION_MESSAGE": "

Are you sure you want to download the complete album?

All files will be queued for download sequentially

", - "CREATE_ALBUM_FAILED": "Failed to create album , please try again", - "SEARCH": "Search", - "SEARCH_RESULTS": "Search results", - "NO_RESULTS": "No results found", - "SEARCH_HINT": "Search for albums, dates, descriptions, ...", - "SEARCH_TYPE": { - "COLLECTION": "Album", - "LOCATION": "Location", - "CITY": "Location", - "DATE": "Date", - "FILE_NAME": "File name", - "THING": "Content", - "FILE_CAPTION": "Description", - "FILE_TYPE": "File type", - "CLIP": "Magic" - }, - "photos_count_zero": "No memories", - "photos_count_one": "1 memory", - "photos_count_other": "{{count, number}} memories", - "TERMS_AND_CONDITIONS": "I agree to the terms and privacy policy", - "ADD_TO_COLLECTION": "Add to album", - "SELECTED": "selected", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "This video cannot be played on your browser", - "PEOPLE": "People", - "INDEXING_SCHEDULED": "Indexing is scheduled...", - "ANALYZING_PHOTOS": "Indexing photos ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Indexing people in {{indexStatus.nSyncedFiles,number}} photos...", - "INDEXING_DONE": "Indexed {{indexStatus.nSyncedFiles,number}} photos", - "UNIDENTIFIED_FACES": "unidentified faces", - "OBJECTS": "objects", - "TEXT": "text", - "INFO": "Info ", - "INFO_OPTION": "Info (I)", - "FILE_NAME": "File name", - "CAPTION_PLACEHOLDER": "Add a description", - "LOCATION": "Location", - "SHOW_ON_MAP": "View on OpenStreetMap", - "MAP": "Map", - "MAP_SETTINGS": "Map Settings", - "ENABLE_MAPS": "Enable Maps?", - "ENABLE_MAP": "Enable map", - "DISABLE_MAPS": "Disable Maps?", - "ENABLE_MAP_DESCRIPTION": "

This will show your photos on a world map.

The map is hosted by OpenStreetMap, and the exact locations of your photos are never shared.

You can disable this feature anytime from Settings.

", - "DISABLE_MAP_DESCRIPTION": "

This will disable the display of your photos on a world map.

You can enable this feature anytime from Settings.

", - "DISABLE_MAP": "Disable map", - "DETAILS": "Details", - "VIEW_EXIF": "View all EXIF data", - "NO_EXIF": "No EXIF data", - "EXIF": "EXIF", - "ISO": "ISO", - "TWO_FACTOR": "Two-factor", - "TWO_FACTOR_AUTHENTICATION": "Two-factor authentication", - "TWO_FACTOR_QR_INSTRUCTION": "Scan the QR code below with your favorite authenticator app", - "ENTER_CODE_MANUALLY": "Enter the code manually", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Please enter this code in your favorite authenticator app", - "SCAN_QR_CODE": "Scan QR code instead", - "ENABLE_TWO_FACTOR": "Enable two-factor", - "ENABLE": "Enable", - "LOST_DEVICE": "Lost two-factor device", - "INCORRECT_CODE": "Incorrect code", - "TWO_FACTOR_INFO": "Add an additional layer of security by requiring more than your email and password to log in to your account", - "DISABLE_TWO_FACTOR_LABEL": "Disable two-factor authentication", - "UPDATE_TWO_FACTOR_LABEL": "Update your authenticator device", - "DISABLE": "Disable", - "RECONFIGURE": "Reconfigure", - "UPDATE_TWO_FACTOR": "Update two-factor", - "UPDATE_TWO_FACTOR_MESSAGE": "Continuing forward will void any previously configured authenticators", - "UPDATE": "Update", - "DISABLE_TWO_FACTOR": "Disable two-factor", - "DISABLE_TWO_FACTOR_MESSAGE": "Are you sure you want to disable your two-factor authentication", - "TWO_FACTOR_DISABLE_FAILED": "Failed to disable two factor, please try again", - "EXPORT_DATA": "Export data", - "SELECT_FOLDER": "Select folder", - "DESTINATION": "Destination", - "START": "Start", - "LAST_EXPORT_TIME": "Last export time", - "EXPORT_AGAIN": "Resync", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Local storage not accessible", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Your browser or an addon is blocking Ente from saving data into local storage. please try loading this page after switching your browsing mode.", - "SEND_OTT": "Send OTP", - "EMAIl_ALREADY_OWNED": "Email already taken", - "ETAGS_BLOCKED": "

We were unable to upload the following files because of your browser configuration.

Please disable any addons that might be preventing Ente from using eTags to upload large files, or use our desktop app for a more reliable import experience.

", - "SKIPPED_VIDEOS_INFO": "

Presently we do not support adding videos via public links.

To share videos, please signup for Ente and share with the intended recipients using their email.

", - "LIVE_PHOTOS_DETECTED": "The photo and video files from your Live Photos have been merged into a single file", - "RETRY_FAILED": "Retry failed uploads", - "FAILED_UPLOADS": "Failed uploads ", - "SKIPPED_FILES": "Ignored uploads", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generation failed", - "UNSUPPORTED_FILES": "Unsupported files", - "SUCCESSFUL_UPLOADS": "Successful uploads", - "SKIPPED_INFO": "Skipped these as there are files with matching names in the same album", - "UNSUPPORTED_INFO": "Ente does not support these file formats yet", - "BLOCKED_UPLOADS": "Blocked uploads", - "SKIPPED_VIDEOS": "Skipped videos", - "INPROGRESS_METADATA_EXTRACTION": "In progress", - "INPROGRESS_UPLOADS": "Uploads in progress", - "TOO_LARGE_UPLOADS": "Large files", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "Insufficient storage", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "These files were not uploaded as they exceed the maximum size limit for your storage plan", - "TOO_LARGE_INFO": "These files were not uploaded as they exceed our maximum file size limit", - "THUMBNAIL_GENERATION_FAILED_INFO": "These files were uploaded, but unfortunately we could not generate the thumbnails for them.", - "UPLOAD_TO_COLLECTION": "Upload to album", - "UNCATEGORIZED": "Uncategorized", - "ARCHIVE": "Archive", - "FAVORITES": "Favorites", - "ARCHIVE_COLLECTION": "Archive album", - "ARCHIVE_SECTION_NAME": "Archive", - "ALL_SECTION_NAME": "All", - "MOVE_TO_COLLECTION": "Move to album", - "UNARCHIVE": "Unarchive", - "UNARCHIVE_COLLECTION": "Unarchive album", - "HIDE_COLLECTION": "Hide album", - "UNHIDE_COLLECTION": "Unhide album", - "MOVE": "Move", - "ADD": "Add", - "REMOVE": "Remove", - "YES_REMOVE": "Yes, remove", - "REMOVE_FROM_COLLECTION": "Remove from album", - "TRASH": "Trash", - "MOVE_TO_TRASH": "Move to trash", - "TRASH_FILES_MESSAGE": "Selected files will be removed from all albums and moved to trash.", - "TRASH_FILE_MESSAGE": "The file will be removed from all albums and moved to trash.", - "DELETE_PERMANENTLY": "Delete permanently", - "RESTORE": "Restore", - "RESTORE_TO_COLLECTION": "Restore to album", - "EMPTY_TRASH": "Empty trash", - "EMPTY_TRASH_TITLE": "Empty trash?", - "EMPTY_TRASH_MESSAGE": "These files will be permanently deleted from your Ente account.", - "LEAVE_SHARED_ALBUM": "Yes, leave", - "LEAVE_ALBUM": "Leave album", - "LEAVE_SHARED_ALBUM_TITLE": "Leave shared album?", - "LEAVE_SHARED_ALBUM_MESSAGE": "You will leave the album, and it will stop being visible to you.", - "NOT_FILE_OWNER": "You cannot delete files in a shared album", - "CONFIRM_SELF_REMOVE_MESSAGE": "Selected items will be removed from this album. Items which are only in this album will be moved to Uncategorized.", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Some of the items you are removing were added by other people, and you will lose access to them.", - "SORT_BY_CREATION_TIME_ASCENDING": "Oldest", - "SORT_BY_UPDATION_TIME_DESCENDING": "Last updated", - "SORT_BY_NAME": "Name", - "COMPRESS_THUMBNAILS": "Compress thumbnails", - "THUMBNAIL_REPLACED": "Thumbnails compressed", - "FIX_THUMBNAIL": "Compress", - "FIX_THUMBNAIL_LATER": "Compress later", - "REPLACE_THUMBNAIL_NOT_STARTED": "Some of your videos thumbnails can be compressed to save space. would you like Ente to compress them?", - "REPLACE_THUMBNAIL_COMPLETED": "Successfully compressed all thumbnails", - "REPLACE_THUMBNAIL_NOOP": "You have no thumbnails that can be compressed further", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "Could not compress some of your thumbnails, please retry", - "FIX_CREATION_TIME": "Fix time", - "FIX_CREATION_TIME_IN_PROGRESS": "Fixing time", - "CREATION_TIME_UPDATED": "File time updated", - "UPDATE_CREATION_TIME_NOT_STARTED": "Select the option you want to use", - "UPDATE_CREATION_TIME_COMPLETED": "Successfully updated all files", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "File time updation failed for some files, please retry", - "CAPTION_CHARACTER_LIMIT": "5000 characters max", - "DATE_TIME_ORIGINAL": "EXIF:DateTimeOriginal", - "DATE_TIME_DIGITIZED": "EXIF:DateTimeDigitized", - "METADATA_DATE": "EXIF:MetadataDate", - "CUSTOM_TIME": "Custom time", - "REOPEN_PLAN_SELECTOR_MODAL": "Re-open plans", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Failed to open plans", - "INSTALL": "Install", - "SHARING_DETAILS": "Sharing details", - "MODIFY_SHARING": "Modify sharing", - "ADD_COLLABORATORS": "Add collaborators", - "ADD_NEW_EMAIL": "Add a new email", - "shared_with_people_zero": "Share with specific people", - "shared_with_people_one": "Shared with 1 person", - "shared_with_people_other": "Shared with {{count, number}} people", - "participants_zero": "No participants", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", - "ADD_VIEWERS": "Add viewers", - "PARTICIPANTS": "Participants", - "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} will not be able to add more photos to the album

They will still be able to remove photos added by them

", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} will be able to add photos to the album", - "CONVERT_TO_VIEWER": "Yes, convert to viewer", - "CONVERT_TO_COLLABORATOR": "Yes, convert to collaborator", - "CHANGE_PERMISSION": "Change permission?", - "REMOVE_PARTICIPANT": "Remove?", - "CONFIRM_REMOVE": "Yes, remove", - "MANAGE": "Manage", - "ADDED_AS": "Added as", - "COLLABORATOR_RIGHTS": "Collaborators can add photos and videos to the shared album", - "REMOVE_PARTICIPANT_HEAD": "Remove participant", - "OWNER": "Owner", - "COLLABORATORS": "Collaborators", - "ADD_MORE": "Add more", - "VIEWERS": "Viewers", - "OR_ADD_EXISTING": "Or pick an existing one", - "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} will be removed from the album

Any photos added by them will also be removed from the album

", - "NOT_FOUND": "404 - not found", - "LINK_EXPIRED": "Link expired", - "LINK_EXPIRED_MESSAGE": "This link has either expired or been disabled!", - "MANAGE_LINK": "Manage link", - "LINK_TOO_MANY_REQUESTS": "Sorry, this album has been viewed on too many devices!", - "FILE_DOWNLOAD": "Allow downloads", - "LINK_PASSWORD_LOCK": "Password lock", - "PUBLIC_COLLECT": "Allow adding photos", - "LINK_DEVICE_LIMIT": "Device limit", - "NO_DEVICE_LIMIT": "None", - "LINK_EXPIRY": "Link expiry", - "NEVER": "Never", - "DISABLE_FILE_DOWNLOAD": "Disable download", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Are you sure that you want to disable the download button for files?

Viewers can still take screenshots or save a copy of your photos using external tools.

", - "MALICIOUS_CONTENT": "Contains malicious content", - "COPYRIGHT": "Infringes on the copyright of someone I am authorized to represent", - "SHARED_USING": "Shared using ", - "ENTE_IO": "ente.io", - "SHARING_REFERRAL_CODE": "Use code {{referralCode}} to get 10 GB free", - "LIVE": "LIVE", - "DISABLE_PASSWORD": "Disable password lock", - "DISABLE_PASSWORD_MESSAGE": "Are you sure that you want to disable the password lock?", - "PASSWORD_LOCK": "Password lock", - "LOCK": "Lock", - "DOWNLOAD_UPLOAD_LOGS": "Debug logs", - "UPLOAD_FILES": "File", - "UPLOAD_DIRS": "Folder", - "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", - "DEDUPLICATE_FILES": "Deduplicate files", - "AUTHENTICATOR_SECTION": "Authenticator", - "NO_DUPLICATES_FOUND": "You've no duplicate files that can be cleared", - "CLUB_BY_CAPTURE_TIME": "Club by capture time", - "FILES": "files", - "EACH": "each", - "DEDUPLICATE_BASED_ON_SIZE": "The following files were clubbed based on their sizes, please review and delete items you believe are duplicates", - "STOP_ALL_UPLOADS_MESSAGE": "Are you sure that you want to stop all the uploads in progress?", - "STOP_UPLOADS_HEADER": "Stop uploads?", - "YES_STOP_UPLOADS": "Yes, stop uploads", - "STOP_DOWNLOADS_HEADER": "Stop downloads?", - "YES_STOP_DOWNLOADS": "Yes, stop downloads", - "STOP_ALL_DOWNLOADS_MESSAGE": "Are you sure that you want to stop all the downloads in progress?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", - "ALL_ALBUMS": "All Albums", - "ALBUMS": "Albums", - "ALL_HIDDEN_ALBUMS": "All hidden albums", - "HIDDEN_ALBUMS": "Hidden albums", - "HIDDEN_ITEMS": "Hidden items", - "HIDDEN_ITEMS_SECTION_NAME": "Hidden_items", - "ENTER_TWO_FACTOR_OTP": "Enter the 6-digit code from your authenticator app.", - "CREATE_ACCOUNT": "Create account", - "COPIED": "Copied", - "CANVAS_BLOCKED_TITLE": "Unable to generate thumbnail", - "CANVAS_BLOCKED_MESSAGE": "

It looks like your browser has disabled access to canvas, which is necessary to generate thumbnails for your photos

Please enable access to your browser's canvas, or check out our desktop app

", - "WATCH_FOLDERS": "Watch folders", - "UPGRADE_NOW": "Upgrade now", - "RENEW_NOW": "Renew now", - "STORAGE": "Storage", - "USED": "used", - "YOU": "You", - "FAMILY": "Family", - "FREE": "free", - "OF": "of", - "WATCHED_FOLDERS": "Watched folders", - "NO_FOLDERS_ADDED": "No folders added yet!", - "FOLDERS_AUTOMATICALLY_MONITORED": "The folders you add here will monitored to automatically", - "UPLOAD_NEW_FILES_TO_ENTE": "Upload new files to Ente", - "REMOVE_DELETED_FILES_FROM_ENTE": "Remove deleted files from Ente", - "ADD_FOLDER": "Add folder", - "STOP_WATCHING": "Stop watching", - "STOP_WATCHING_FOLDER": "Stop watching folder?", - "STOP_WATCHING_DIALOG_MESSAGE": "Your existing files will not be deleted, but Ente will stop automatically updating the linked Ente album on changes in this folder.", - "YES_STOP": "Yes, stop", - "MONTH_SHORT": "mo", - "YEAR": "year", - "FAMILY_PLAN": "Family plan", - "DOWNLOAD_LOGS": "Download logs", - "DOWNLOAD_LOGS_MESSAGE": "

This will download debug logs, which you can email to us to help debug your issue.

Please note that file names will be included to help track issues with specific files.

", - "CHANGE_FOLDER": "Change Folder", - "TWO_MONTHS_FREE": "Get 2 months free on yearly plans", - "GB": "GB", - "POPULAR": "Popular", - "FREE_PLAN_OPTION_LABEL": "Continue with free trial", - "FREE_PLAN_DESCRIPTION": "1 GB for 1 year", - "CURRENT_USAGE": "Current usage is {{usage}}", - "WEAK_DEVICE": "The web browser you're using is not powerful enough to encrypt your photos. Please try to log in to Ente on your computer, or download the Ente mobile/desktop app.", - "DRAG_AND_DROP_HINT": "Or drag and drop into the Ente window", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "Your uploaded data will be scheduled for deletion, and your account will be permanently deleted.

This action is not reversible.", - "AUTHENTICATE": "Authenticate", - "UPLOADED_TO_SINGLE_COLLECTION": "Uploaded to single collection", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "Uploaded to separate collections", - "NEVERMIND": "Nevermind", - "UPDATE_AVAILABLE": "Update available", - "UPDATE_INSTALLABLE_MESSAGE": "A new version of Ente is ready to be installed.", - "INSTALL_NOW": "Install now", - "INSTALL_ON_NEXT_LAUNCH": "Install on next launch", - "UPDATE_AVAILABLE_MESSAGE": "A new version of Ente has been released, but it cannot be automatically downloaded and installed.", - "DOWNLOAD_AND_INSTALL": "Download and install", - "IGNORE_THIS_VERSION": "Ignore this version", - "TODAY": "Today", - "YESTERDAY": "Yesterday", - "NAME_PLACEHOLDER": "Name...", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Cannot create albums from file/folder mix", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

You have dragged and dropped a mixture of files and folders.

Please provide either only files, or only folders when selecting option to create separate albums

", - "CHOSE_THEME": "Choose theme", - "ML_SEARCH": "Face recognition", - "ENABLE_ML_SEARCH_DESCRIPTION": "

This will enable on-device machine learning and face search which will start analyzing your uploaded photos locally.

For the first run after login or enabling this feature, it will download all images on local device to analyze them. So please only enable this if you are ok with bandwidth and local processing of all images in your photo library.

If this is the first time you're enabling this, we'll also ask your permission to process face data.

", - "ML_MORE_DETAILS": "More details", - "ENABLE_FACE_SEARCH": "Enable face recognition", - "ENABLE_FACE_SEARCH_TITLE": "Enable face recognition?", - "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face recognition, Ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", - "DISABLE_BETA": "Pause recognition", - "DISABLE_FACE_SEARCH": "Disable face recognition", - "DISABLE_FACE_SEARCH_TITLE": "Disable face recognition?", - "DISABLE_FACE_SEARCH_DESCRIPTION": "

Ente will stop processing face geometry.

You can reenable face recognition again if you wish, so this operation is safe.

", - "ADVANCED": "Advanced", - "FACE_SEARCH_CONFIRMATION": "I understand, and wish to allow Ente to process face geometry", - "LABS": "Labs", - "YOURS": "yours", - "PASSPHRASE_STRENGTH_WEAK": "Password strength: Weak", - "PASSPHRASE_STRENGTH_MODERATE": "Password strength: Moderate", - "PASSPHRASE_STRENGTH_STRONG": "Password strength: Strong", - "PREFERENCES": "Preferences", - "LANGUAGE": "Language", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Invalid export directory", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

The export directory you have selected does not exist.

Please select a valid directory.

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Subscription verification failed", - "STORAGE_UNITS": { - "B": "B", - "KB": "KB", - "MB": "MB", - "GB": "GB", - "TB": "TB" - }, - "AFTER_TIME": { - "HOUR": "after an hour", - "DAY": "after a day", - "WEEK": "after a week", - "MONTH": "after a month", - "YEAR": "after a year" - }, - "COPY_LINK": "Copy link", - "DONE": "Done", - "LINK_SHARE_TITLE": "Or share a link", - "REMOVE_LINK": "Remove link", - "CREATE_PUBLIC_SHARING": "Create public link", - "PUBLIC_LINK_CREATED": "Public link created", - "PUBLIC_LINK_ENABLED": "Public link enabled", - "COLLECT_PHOTOS": "Collect photos", - "PUBLIC_COLLECT_SUBTEXT": "Allow people with the link to also add photos to the shared album.", - "STOP_EXPORT": "Stop", - "EXPORT_PROGRESS": "{{progress.success, number}} / {{progress.total, number}} items synced", - "MIGRATING_EXPORT": "Preparing...", - "RENAMING_COLLECTION_FOLDERS": "Renaming album folders...", - "TRASHING_DELETED_FILES": "Trashing deleted files...", - "TRASHING_DELETED_COLLECTIONS": "Trashing deleted albums...", - "EXPORT_NOTIFICATION": { - "START": "Export started", - "IN_PROGRESS": "Export already in progress", - "FINISH": "Export finished", - "UP_TO_DATE": "No new files to export" - }, - "CONTINUOUS_EXPORT": "Sync continuously", - "TOTAL_ITEMS": "Total items", - "PENDING_ITEMS": "Pending items", - "EXPORT_STARTING": "Export starting...", - "DELETE_ACCOUNT_REASON_LABEL": "What is the main reason you are deleting your account?", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "Select a reason", - "DELETE_REASON": { - "MISSING_FEATURE": "It's missing a key feature that I need", - "BROKEN_BEHAVIOR": "The app or a certain feature does not behave as I think it should", - "FOUND_ANOTHER_SERVICE": "I found another service that I like better", - "NOT_LISTED": "My reason isn't listed" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "We are sorry to see you go. Please explain why you are leaving to help us improve.", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "Feedback", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "Yes, I want to permanently delete this account and all its data", - "CONFIRM_DELETE_ACCOUNT": "Confirm Account Deletion", - "FEEDBACK_REQUIRED": "Kindly help us with this information", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "What does the other service do better?", - "RECOVER_TWO_FACTOR": "Recover two-factor", - "at": "at", - "AUTH_NEXT": "next", - "AUTH_DOWNLOAD_MOBILE_APP": "Download our mobile app to manage your secrets", - "HIDDEN": "Hidden", - "HIDE": "Hide", - "UNHIDE": "Unhide", - "UNHIDE_TO_COLLECTION": "Unhide to album", - "SORT_BY": "Sort by", - "NEWEST_FIRST": "Newest first", - "OLDEST_FIRST": "Oldest first", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "This file could not be previewed. Click here to download the original.", - "SELECT_COLLECTION": "Select album", - "PIN_ALBUM": "Pin album", - "UNPIN_ALBUM": "Unpin album", - "DOWNLOAD_COMPLETE": "Download complete", - "DOWNLOADING_COLLECTION": "Downloading {{name}}", - "DOWNLOAD_FAILED": "Download failed", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} files", - "CHRISTMAS": "Christmas", - "CHRISTMAS_EVE": "Christmas Eve", - "NEW_YEAR": "New Year", - "NEW_YEAR_EVE": "New Year's Eve", - "IMAGE": "Image", - "VIDEO": "Video", - "LIVE_PHOTO": "Live Photo", - "CONVERT": "Convert", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Are you sure you want to close the editor?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Download your edited image or save a copy to Ente to persist your changes.", - "BRIGHTNESS": "Brightness", - "CONTRAST": "Contrast", - "SATURATION": "Saturation", - "BLUR": "Blur", - "INVERT_COLORS": "Invert Colors", - "ASPECT_RATIO": "Aspect Ratio", - "SQUARE": "Square", - "ROTATE_LEFT": "Rotate Left", - "ROTATE_RIGHT": "Rotate Right", - "FLIP_VERTICALLY": "Flip Vertically", - "FLIP_HORIZONTALLY": "Flip Horizontally", - "DOWNLOAD_EDITED": "Download Edited", - "SAVE_A_COPY_TO_ENTE": "Save a copy to Ente", - "RESTORE_ORIGINAL": "Restore Original", - "TRANSFORM": "Transform", - "COLORS": "Colors", - "FLIP": "Flip", - "ROTATION": "Rotation", - "RESET": "Reset", - "PHOTO_EDITOR": "Photo Editor", - "FASTER_UPLOAD": "Faster uploads", - "FASTER_UPLOAD_DESCRIPTION": "Route uploads through nearby servers", - "MAGIC_SEARCH_STATUS": "Magic Search Status", - "INDEXED_ITEMS": "Indexed items", - "CAST_ALBUM_TO_TV": "Play album on TV", - "ENTER_CAST_PIN_CODE": "Enter the code you see on the TV below to pair this device.", - "PAIR_DEVICE_TO_TV": "Pair devices", - "TV_NOT_FOUND": "TV not found. Did you enter the PIN correctly?", - "AUTO_CAST_PAIR": "Auto Pair", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "Auto Pair requires connecting to Google servers and only works with Chromecast supported devices. Google will not receive sensitive data, such as your photos.", - "PAIR_WITH_PIN": "Pair with PIN", - "CHOOSE_DEVICE_FROM_BROWSER": "Choose a cast-compatible device from the browser popup.", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "Pair with PIN works for any large screen device you want to play your album on.", - "VISIT_CAST_ENTE_IO": "Visit cast.ente.io on the device you want to pair.", - "CAST_AUTO_PAIR_FAILED": "Chromecast Auto Pair failed. Please try again.", - "CACHE_DIRECTORY": "Cache folder", - "FREEHAND": "Freehand", - "APPLY_CROP": "Apply Crop", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "At least one transformation or color adjustment must be performed before saving.", - "PASSKEYS": "Passkeys", - "DELETE_PASSKEY": "Delete passkey", - "DELETE_PASSKEY_CONFIRMATION": "Are you sure you want to delete this passkey? This action is irreversible.", - "RENAME_PASSKEY": "Rename passkey", - "ADD_PASSKEY": "Add passkey", - "ENTER_PASSKEY_NAME": "Enter passkey name", - "PASSKEYS_DESCRIPTION": "Passkeys are a modern and secure second-factor for your Ente account. They use on-device biometric authentication for convenience and security.", - "CREATED_AT": "Created at", - "PASSKEY_LOGIN_FAILED": "Passkey login failed", - "PASSKEY_LOGIN_URL_INVALID": "The login URL is invalid.", - "PASSKEY_LOGIN_ERRORED": "An error occurred while logging in with passkey.", - "TRY_AGAIN": "Try again", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "Follow the steps from your browser to continue logging in.", - "LOGIN_WITH_PASSKEY": "Login with passkey" -} diff --git a/web/apps/photos/public/locales/fa-IR/translation.json b/web/apps/photos/public/locales/fa-IR/translation.json deleted file mode 100644 index 2d21fcb3d..000000000 --- a/web/apps/photos/public/locales/fa-IR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "به خوش آمدید", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/photos/public/locales/fi-FI/translation.json b/web/apps/photos/public/locales/fi-FI/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/photos/public/locales/fi-FI/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/photos/public/locales/ru-RU/translation.json b/web/apps/photos/public/locales/ru-RU/translation.json deleted file mode 100644 index 9757ae53b..000000000 --- a/web/apps/photos/public/locales/ru-RU/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "
Личные резервные копии
для твоих воспоминаний
", - "HERO_SLIDE_1": "Сквозное шифрование по умолчанию", - "HERO_SLIDE_2_TITLE": "
Надежно хранится
в убежище от радиоактивных осадков
", - "HERO_SLIDE_2": "Созданный для того, чтобы пережить", - "HERO_SLIDE_3_TITLE": "
Доступно
везде
", - "HERO_SLIDE_3": "Android, iOS, Веб, ПК", - "LOGIN": "Авторизоваться", - "SIGN_UP": "Регистрация", - "NEW_USER": "Новенький в Ente", - "EXISTING_USER": "Существующий пользователь", - "ENTER_NAME": "Введите имя", - "PUBLIC_UPLOADER_NAME_MESSAGE": "Добавьте имя, чтобы ваши друзья знали, кого благодарить за эти замечательные фотографии!", - "ENTER_EMAIL": "Введите адрес электронной почты", - "EMAIL_ERROR": "Введите действительный адрес электронной почты", - "REQUIRED": "Требуется", - "EMAIL_SENT": "Проверочный код отправлен на
{{email}}", - "CHECK_INBOX": "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения проверки", - "ENTER_OTT": "Проверочный код", - "RESEND_MAIL": "Отправить код еще раз", - "VERIFY": "Подтвердить", - "UNKNOWN_ERROR": "Что-то пошло не так, Попробуйте еще раз", - "INVALID_CODE": "Неверный код подтверждения", - "EXPIRED_CODE": "Срок действия вашего проверочного кода истек", - "SENDING": "Отправка...", - "SENT": "Отправлено!", - "PASSWORD": "Пароль", - "LINK_PASSWORD": "Введите пароль, чтобы разблокировать альбом", - "RETURN_PASSPHRASE_HINT": "Пароль", - "SET_PASSPHRASE": "Установить пароль", - "VERIFY_PASSPHRASE": "Войти", - "INCORRECT_PASSPHRASE": "Неверный пароль", - "ENTER_ENC_PASSPHRASE": "Пожалуйста, введите пароль, который мы можем использовать для шифрования ваших данных", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "Добро пожаловать в ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Где живут ваши лучшие фотографии", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Генерируем ключи шифрования...", - "PASSPHRASE_HINT": "Пароль", - "CONFIRM_PASSPHRASE": "Подтвердите пароль", - "REFERRAL_CODE_HINT": "Как вы узнали о Ente? (необязательно)", - "REFERRAL_INFO": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!", - "PASSPHRASE_MATCH_ERROR": "Пароли не совпадают", - "CREATE_COLLECTION": "Новый альбом", - "ENTER_ALBUM_NAME": "Название альбома", - "CLOSE_OPTION": "Закрыть (Esc)", - "ENTER_FILE_NAME": "Имя файла", - "CLOSE": "Закрыть", - "NO": "Нет", - "NOTHING_HERE": "Здесь нечего смотреть! 👀", - "UPLOAD": "Загрузить", - "IMPORT": "Импорт", - "ADD_PHOTOS": "Добавить фотографии", - "ADD_MORE_PHOTOS": "Добавить больше фото", - "add_photos_one": "Добавить 1 элемент", - "add_photos_other": "Добавить {{count, number}} элементов", - "SELECT_PHOTOS": "Выбрать фотографии", - "FILE_UPLOAD": "Загрузка файла", - "UPLOAD_STAGE_MESSAGE": { - "0": "Подготовка к загрузке", - "1": "Чтение файлов метаданных Google", - "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов извлечены", - "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} файлов обработано", - "4": "Отмена оставшихся загрузок", - "5": "Резервное копирование завершено" - }, - "FILE_NOT_UPLOADED_LIST": "Следующие файлы не были загружены", - "SUBSCRIPTION_EXPIRED": "Подписка закончилась", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Срок действия вашей подписки истек, пожалуйста, продлите", - "STORAGE_QUOTA_EXCEEDED": "Превышен лимит хранения", - "INITIAL_LOAD_DELAY_WARNING": "Первая загрузка может занять некоторое время", - "USER_DOES_NOT_EXIST": "Пользователь с таким email не найден", - "NO_ACCOUNT": "У вас нет учетной записи", - "ACCOUNT_EXISTS": "Уже есть аккаунт", - "CREATE": "Создать", - "DOWNLOAD": "Скачать", - "DOWNLOAD_OPTION": "Скачать (D)", - "DOWNLOAD_FAVORITES": "Скачать избранные", - "DOWNLOAD_UNCATEGORIZED": "Скачать без категорий", - "DOWNLOAD_HIDDEN_ITEMS": "Скачать скрытые элементы", - "COPY_OPTION": "Скопировать как PNG (Ctrl/Cmd - C)", - "TOGGLE_FULLSCREEN": "Полноэкранный режим (F)", - "ZOOM_IN_OUT": "Увеличить/уменьшить", - "PREVIOUS": "Предыдущий (←)", - "NEXT": "Следующий (→)", - "TITLE_PHOTOS": "Ente Фото", - "TITLE_ALBUMS": "Ente Фото", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "Загрузите своё первое фото", - "IMPORT_YOUR_FOLDERS": "Импортируйте папки", - "UPLOAD_DROPZONE_MESSAGE": "Перетащите для резервного копирования файлов", - "WATCH_FOLDER_DROPZONE_MESSAGE": "Перетащите, чтобы добавить просматриваемую папку", - "TRASH_FILES_TITLE": "Удалить файлы?", - "TRASH_FILE_TITLE": "Удалить файл?", - "DELETE_FILES_TITLE": "Удалить немедленно?", - "DELETE_FILES_MESSAGE": "Выбранные файлы будут безвозвратно удалены из вашей учетной записи ente.", - "DELETE": "Удалить", - "DELETE_OPTION": "Удалить (DEL)", - "FAVORITE_OPTION": "Избранное (L)", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "Обнаружено несколько папок", - "UPLOAD_STRATEGY_CHOICE": "Вы хотите загрузить их в", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "Один альбом", - "OR": "или", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Отдельные альбомы", - "SESSION_EXPIRED_MESSAGE": "Истёк срок действия вашей сессии. Для продолжения, пожалуйста, войдите снова", - "SESSION_EXPIRED": "Время сессии истекло", - "PASSWORD_GENERATION_FAILED": "Вашему браузеру не удалось сгенерировать надежный ключ, соответствующий стандартам шифрования ente, пожалуйста, попробуйте использовать мобильное приложение или другой браузер", - "CHANGE_PASSWORD": "Изменить пароль", - "GO_BACK": "Вернуться назад", - "RECOVERY_KEY": "Ключ восстановления", - "SAVE_LATER": "Сделать позже", - "SAVE": "Сохранить ключ", - "RECOVERY_KEY_DESCRIPTION": "Если вы забыли свой пароль, то восстановить данные можно только с помощью этого ключа.", - "RECOVER_KEY_GENERATION_FAILED": "Не удалось сгенерировать код восстановления, пожалуйста, повторите попытку", - "KEY_NOT_STORED_DISCLAIMER": "Мы не храним этот ключ, поэтому, пожалуйста, сохраните его в надежном месте", - "FORGOT_PASSWORD": "Забыл пароль", - "RECOVER_ACCOUNT": "Восстановить аккаунт", - "RECOVERY_KEY_HINT": "Ключ восстановления", - "RECOVER": "Восстановить", - "NO_RECOVERY_KEY": "Нет ключа восстановления?", - "INCORRECT_RECOVERY_KEY": "Неправильный ключ восстановления", - "SORRY": "Извините", - "NO_RECOVERY_KEY_MESSAGE": "Из-за природы нашего сквозного протокола шифрования ваши данные не могут быть расшифрованы без вашего пароля или ключа восстановления", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Пожалуйста, отправьте электронное письмо на адрес {{emailID}} с вашего зарегистрированного адреса электронной почты", - "CONTACT_SUPPORT": "Связаться с поддержкой", - "REQUEST_FEATURE": "Запросить функцию", - "SUPPORT": "Поддержка", - "CONFIRM": "Подтвердить", - "CANCEL": "Отменить", - "LOGOUT": "Выйти", - "DELETE_ACCOUNT": "Удалить аккаунт", - "DELETE_ACCOUNT_MESSAGE": "

Пожалуйста, отправьте письмо по адресу {{emailID}} с вашего зарегистрированного адреса электронной почты.

Ваш запрос будет обработан в течение 72 часов

", - "LOGOUT_MESSAGE": "Вы уверены, что хотите выйти?", - "CHANGE_EMAIL": "Изменить адрес электронной почты", - "OK": "ОК", - "SUCCESS": "Успешно", - "ERROR": "Ошибка", - "MESSAGE": "Сообщение", - "INSTALL_MOBILE_APP": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "Загрузить приложение для компьютера", - "EXPORT": "Экспортировать данные", - "SUBSCRIPTION": "Подписка", - "SUBSCRIBE": "Подписаться", - "MANAGEMENT_PORTAL": "Управлять платёжной информацией", - "MANAGE_FAMILY_PORTAL": "Управление семьёй", - "LEAVE_FAMILY_PLAN": "Покинуть семейный план", - "LEAVE": "Выйти", - "LEAVE_FAMILY_CONFIRM": "Вы уверены, что хотите покинуть семейный план?", - "CHOOSE_PLAN": "Выбери свой план", - "MANAGE_PLAN": "Управление подпиской", - "ACTIVE": "Активный", - "OFFLINE_MSG": "Вы не в сети, кэшированные воспоминания отображаются", - "FREE_SUBSCRIPTION_INFO": "Вы используете бесплатный тарифный план, истекающий {{date, dateTime}}", - "FAMILY_SUBSCRIPTION_INFO": "Вы используете семейный план, управляемый", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Продление {{date, dateTime}}", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "Обновить платёжную информацию", - "MONTHLY": "Ежемесячно", - "YEARLY": "Ежегодно", - "UPDATE_SUBSCRIPTION_MESSAGE": "Хотите сменить текущий план?", - "UPDATE_SUBSCRIPTION": "Изменить план", - "CANCEL_SUBSCRIPTION": "Отменить подписку", - "CANCEL_SUBSCRIPTION_MESSAGE": "

Все ваши данные будут удалены с наших серверов в конце этого расчетного периода.

Вы уверены, что хотите отменить свою подписку?

", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "

Вы уверены, что хотите отменить свою подписку?

", - "SUBSCRIPTION_CANCEL_FAILED": "Не удалось отменить подписку", - "SUBSCRIPTION_CANCEL_SUCCESS": "Подписка успешно отменена", - "REACTIVATE_SUBSCRIPTION": "Возобновить подписку", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "После повторной активации вам будет выставлен счет в {{date, dateTime}}", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "Подписка успешно активирована ", - "SUBSCRIPTION_ACTIVATE_FAILED": "Не удалось повторно активировать продление подписки", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "Спасибо", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "Отменить мобильную подписку", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "Пожалуйста, отмените свою подписку в мобильном приложении, чтобы активировать подписку здесь", - "MAIL_TO_MANAGE_SUBSCRIPTION": "Пожалуйста, свяжитесь с {{emailID}} для управления подпиской", - "RENAME": "Переименовать", - "RENAME_FILE": "Переименовать файл", - "RENAME_COLLECTION": "Переименовать альбом", - "DELETE_COLLECTION_TITLE": "Удалить альбом?", - "DELETE_COLLECTION": "Удалить альбом", - "DELETE_COLLECTION_MESSAGE": "Также удалить фотографии (и видео), которые есть в этом альбоме из всех других альбомов, где они есть?", - "DELETE_PHOTOS": "Удалить фото", - "KEEP_PHOTOS": "Оставить фото", - "SHARE": "Поделиться", - "SHARE_COLLECTION": "Поделиться альбомом", - "SHAREES": "Поделиться с", - "SHARE_WITH_SELF": "Ой, Вы не можете поделиться с самим собой", - "ALREADY_SHARED": "Упс, Вы уже делились этим с {{email}}", - "SHARING_BAD_REQUEST_ERROR": "Делиться альбомом запрещено", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Совместное использование отключено для бесплатных аккаунтов", - "DOWNLOAD_COLLECTION": "Загрузить альбом", - "DOWNLOAD_COLLECTION_MESSAGE": "

Вы уверены, что хотите загрузить альбом полностью?

Все файлы будут последовательно помещены в очередь на загрузку

", - "CREATE_ALBUM_FAILED": "Не удалось создать альбом, пожалуйста, попробуйте еще раз", - "SEARCH": "Поиск", - "SEARCH_RESULTS": "Результаты поиска", - "NO_RESULTS": "Ничего не найдено", - "SEARCH_HINT": "Поиск альбомов, дат, описаний, ...", - "SEARCH_TYPE": { - "COLLECTION": "Альбом", - "LOCATION": "Местоположение", - "CITY": "Местоположение", - "DATE": "Дата", - "FILE_NAME": "Имя файла", - "THING": "Содержимое", - "FILE_CAPTION": "Описание", - "FILE_TYPE": "Тип файла", - "CLIP": "" - }, - "photos_count_zero": "Воспоминания отсутствуют", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "Добавить в альбом", - "SELECTED": "выбрано", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Это видео нельзя воспроизвести в вашем браузере", - "PEOPLE": "Люди", - "INDEXING_SCHEDULED": "Индексация запланирована...", - "ANALYZING_PHOTOS": "Индексирование фотографий ({{indexStatus.nSyncedFiles,number}} / {{indexStatus.nTotalFiles,number}})", - "INDEXING_PEOPLE": "Индексирование людей на {{indexStatus.nSyncedFiles,number}} фотографиях...", - "INDEXING_DONE": "Проиндексировано {{indexStatus.nSyncedFiles,number}} фотографий", - "UNIDENTIFIED_FACES": "нераспознанные лица", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "Двухфакторная аутентификация", - "TWO_FACTOR_QR_INSTRUCTION": "Сканируйте QR-код ниже с вашим любимым приложением для проверки подлинности", - "ENTER_CODE_MANUALLY": "Введите код вручную", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Пожалуйста, введите этот код в вашем любимом приложении для аутентификации", - "SCAN_QR_CODE": "Сканировать QR-код вместо", - "ENABLE_TWO_FACTOR": "Включить двухфакторную аутентификацию", - "ENABLE": "Включить", - "LOST_DEVICE": "Потеряно двухфакторное устройство", - "INCORRECT_CODE": "Неверный код", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "Отключить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "Отключить", - "RECONFIGURE": "Перенастроить", - "UPDATE_TWO_FACTOR": "Обновить двухфакторную аутентификацию", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "Обновить", - "DISABLE_TWO_FACTOR": "Отключить двухфакторную аутентификацию", - "DISABLE_TWO_FACTOR_MESSAGE": "Вы уверены, что хотите отключить двухфакторную аутентификацию", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "Экспортировать данные", - "SELECT_FOLDER": "Выбрать папку", - "DESTINATION": "Место назначения", - "START": "Начать", - "LAST_EXPORT_TIME": "Время последнего экспорта", - "EXPORT_AGAIN": "Синхронизировать заново", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "Локальное хранилище недоступно", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "Отправить одноразовый код", - "EMAIl_ALREADY_OWNED": "Почта уже использована", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "Скрыть", - "UNHIDE": "Показать", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "Сортировать по", - "NEWEST_FIRST": "Сначала новые", - "OLDEST_FIRST": "Сначала старые", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "Выбрать альбом", - "PIN_ALBUM": "Закрепить альбом", - "UNPIN_ALBUM": "Открепить альбом", - "DOWNLOAD_COMPLETE": "Загрузка завершена", - "DOWNLOADING_COLLECTION": "Загрузка {{name}}", - "DOWNLOAD_FAILED": "Загрузка не удалась", - "DOWNLOAD_PROGRESS": "{{progress.current}} / {{progress.total}} файлов", - "CHRISTMAS": "Рождество", - "CHRISTMAS_EVE": "Канун Рождества", - "NEW_YEAR": "Новый год", - "NEW_YEAR_EVE": "Канун Нового года", - "IMAGE": "Изображение", - "VIDEO": "Видео", - "LIVE_PHOTO": "Живое фото", - "CONVERT": "Преобразовать", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "Вы уверены, что хотите закрыть редактор?", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "Загрузите отредактированное изображение или сохраните копию в ente, чтобы сохранить внесенные изменения.", - "BRIGHTNESS": "Яркость", - "CONTRAST": "Контраст", - "SATURATION": "Насыщенность", - "BLUR": "Размытие", - "INVERT_COLORS": "Инвертировать Цвета", - "ASPECT_RATIO": "Соотношение Сторон", - "SQUARE": "Квадрат", - "ROTATE_LEFT": "Повернуть влево", - "ROTATE_RIGHT": "Повернуть вправо", - "FLIP_VERTICALLY": "Отразить вертикально", - "FLIP_HORIZONTALLY": "Отразить горизонтально", - "DOWNLOAD_EDITED": "Скачать отредактированный", - "SAVE_A_COPY_TO_ENTE": "Сохранить копию в ente", - "RESTORE_ORIGINAL": "Восстановить оригинал", - "TRANSFORM": "Преобразовать", - "COLORS": "Цвета", - "FLIP": "Перевернуть", - "ROTATION": "", - "RESET": "Сбросить", - "PHOTO_EDITOR": "Редактор фото", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "Статус волшебного поиска", - "INDEXED_ITEMS": "Индексированные элементы", - "CAST_ALBUM_TO_TV": "Воспроизвести альбом на ТВ", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/photos/public/locales/th-TH/translation.json b/web/apps/photos/public/locales/th-TH/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/photos/public/locales/th-TH/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/photos/public/locales/tr-TR/translation.json b/web/apps/photos/public/locales/tr-TR/translation.json deleted file mode 100644 index 888ed7093..000000000 --- a/web/apps/photos/public/locales/tr-TR/translation.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "HERO_SLIDE_1_TITLE": "", - "HERO_SLIDE_1": "", - "HERO_SLIDE_2_TITLE": "", - "HERO_SLIDE_2": "", - "HERO_SLIDE_3_TITLE": "", - "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", - "NEW_USER": "", - "EXISTING_USER": "", - "ENTER_NAME": "", - "PUBLIC_UPLOADER_NAME_MESSAGE": "", - "ENTER_EMAIL": "", - "EMAIL_ERROR": "", - "REQUIRED": "", - "EMAIL_SENT": "", - "CHECK_INBOX": "", - "ENTER_OTT": "", - "RESEND_MAIL": "", - "VERIFY": "", - "UNKNOWN_ERROR": "", - "INVALID_CODE": "", - "EXPIRED_CODE": "", - "SENDING": "", - "SENT": "", - "PASSWORD": "", - "LINK_PASSWORD": "", - "RETURN_PASSPHRASE_HINT": "", - "SET_PASSPHRASE": "", - "VERIFY_PASSPHRASE": "", - "INCORRECT_PASSPHRASE": "", - "ENTER_ENC_PASSPHRASE": "", - "PASSPHRASE_DISCLAIMER": "", - "WELCOME_TO_ENTE_HEADING": "", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", - "PASSPHRASE_HINT": "", - "CONFIRM_PASSPHRASE": "", - "REFERRAL_CODE_HINT": "", - "REFERRAL_INFO": "", - "PASSPHRASE_MATCH_ERROR": "", - "CREATE_COLLECTION": "", - "ENTER_ALBUM_NAME": "", - "CLOSE_OPTION": "", - "ENTER_FILE_NAME": "", - "CLOSE": "", - "NO": "", - "NOTHING_HERE": "", - "UPLOAD": "", - "IMPORT": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", - "SELECT_PHOTOS": "", - "FILE_UPLOAD": "", - "UPLOAD_STAGE_MESSAGE": { - "0": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - }, - "FILE_NOT_UPLOADED_LIST": "", - "SUBSCRIPTION_EXPIRED": "", - "SUBSCRIPTION_EXPIRED_MESSAGE": "", - "STORAGE_QUOTA_EXCEEDED": "", - "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", - "NO_ACCOUNT": "", - "ACCOUNT_EXISTS": "", - "CREATE": "", - "DOWNLOAD": "", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "TITLE_PHOTOS": "", - "TITLE_ALBUMS": "", - "TITLE_AUTH": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", - "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", - "RECOVERY_KEY_DESCRIPTION": "", - "RECOVER_KEY_GENERATION_FAILED": "", - "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", - "NO_RECOVERY_KEY_MESSAGE": "", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "CANCEL": "", - "LOGOUT": "", - "DELETE_ACCOUNT": "", - "DELETE_ACCOUNT_MESSAGE": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", - "INSTALL_MOBILE_APP": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "ACTIVE": "", - "OFFLINE_MSG": "", - "FREE_SUBSCRIPTION_INFO": "", - "FAMILY_SUBSCRIPTION_INFO": "", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", - "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", - "ADD_ON_AVAILABLE_TILL": "", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", - "SUBSCRIPTION_PURCHASE_CANCELLED": "", - "SUBSCRIPTION_PURCHASE_FAILED": "", - "SUBSCRIPTION_UPDATE_FAILED": "", - "UPDATE_PAYMENT_METHOD_MESSAGE": "", - "STRIPE_AUTHENTICATION_FAILED": "", - "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION_MESSAGE": "", - "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", - "REACTIVATE_SUBSCRIPTION_MESSAGE": "", - "SUBSCRIPTION_ACTIVATE_SUCCESS": "", - "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE": "", - "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", - "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", - "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE": "", - "SHARE_COLLECTION": "", - "SHAREES": "", - "SHARE_WITH_SELF": "", - "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", - "DOWNLOAD_COLLECTION_MESSAGE": "", - "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", - "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" - }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count_other": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", - "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", - "PEOPLE": "", - "INDEXING_SCHEDULED": "", - "ANALYZING_PHOTOS": "", - "INDEXING_PEOPLE": "", - "INDEXING_DONE": "", - "UNIDENTIFIED_FACES": "", - "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", - "ENABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "VIEW_EXIF": "", - "NO_EXIF": "", - "EXIF": "", - "ISO": "", - "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", - "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", - "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", - "ENABLE_TWO_FACTOR": "", - "ENABLE": "", - "LOST_DEVICE": "", - "INCORRECT_CODE": "", - "TWO_FACTOR_INFO": "", - "DISABLE_TWO_FACTOR_LABEL": "", - "UPDATE_TWO_FACTOR_LABEL": "", - "DISABLE": "", - "RECONFIGURE": "", - "UPDATE_TWO_FACTOR": "", - "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", - "DISABLE_TWO_FACTOR": "", - "DISABLE_TWO_FACTOR_MESSAGE": "", - "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", - "SELECT_FOLDER": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", - "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", - "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", - "ETAGS_BLOCKED": "", - "SKIPPED_VIDEOS_INFO": "", - "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", - "FAILED_UPLOADS": "", - "SKIPPED_FILES": "", - "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", - "UNSUPPORTED_FILES": "", - "SUCCESSFUL_UPLOADS": "", - "SKIPPED_INFO": "", - "UNSUPPORTED_INFO": "", - "BLOCKED_UPLOADS": "", - "SKIPPED_VIDEOS": "", - "INPROGRESS_METADATA_EXTRACTION": "", - "INPROGRESS_UPLOADS": "", - "TOO_LARGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", - "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", - "TOO_LARGE_INFO": "", - "THUMBNAIL_GENERATION_FAILED_INFO": "", - "UPLOAD_TO_COLLECTION": "", - "UNCATEGORIZED": "", - "ARCHIVE": "", - "FAVORITES": "", - "ARCHIVE_COLLECTION": "", - "ARCHIVE_SECTION_NAME": "", - "ALL_SECTION_NAME": "", - "MOVE_TO_COLLECTION": "", - "UNARCHIVE": "", - "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", - "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", - "TRASH_FILES_MESSAGE": "", - "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", - "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", - "EMPTY_TRASH_MESSAGE": "", - "LEAVE_SHARED_ALBUM": "", - "LEAVE_ALBUM": "", - "LEAVE_SHARED_ALBUM_TITLE": "", - "LEAVE_SHARED_ALBUM_MESSAGE": "", - "NOT_FILE_OWNER": "", - "CONFIRM_SELF_REMOVE_MESSAGE": "", - "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", - "SORT_BY_CREATION_TIME_ASCENDING": "", - "SORT_BY_UPDATION_TIME_DESCENDING": "", - "SORT_BY_NAME": "", - "COMPRESS_THUMBNAILS": "", - "THUMBNAIL_REPLACED": "", - "FIX_THUMBNAIL": "", - "FIX_THUMBNAIL_LATER": "", - "REPLACE_THUMBNAIL_NOT_STARTED": "", - "REPLACE_THUMBNAIL_COMPLETED": "", - "REPLACE_THUMBNAIL_NOOP": "", - "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", - "FIX_CREATION_TIME": "", - "FIX_CREATION_TIME_IN_PROGRESS": "", - "CREATION_TIME_UPDATED": "", - "UPDATE_CREATION_TIME_NOT_STARTED": "", - "UPDATE_CREATION_TIME_COMPLETED": "", - "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", - "CAPTION_CHARACTER_LIMIT": "", - "DATE_TIME_ORIGINAL": "", - "DATE_TIME_DIGITIZED": "", - "METADATA_DATE": "", - "CUSTOM_TIME": "", - "REOPEN_PLAN_SELECTOR_MODAL": "", - "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", - "SHARING_DETAILS": "", - "MODIFY_SHARING": "", - "ADD_COLLABORATORS": "", - "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", - "ADD_VIEWERS": "", - "PARTICIPANTS": "", - "CHANGE_PERMISSIONS_TO_VIEWER": "", - "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", - "CONVERT_TO_VIEWER": "", - "CONVERT_TO_COLLABORATOR": "", - "CHANGE_PERMISSION": "", - "REMOVE_PARTICIPANT": "", - "CONFIRM_REMOVE": "", - "MANAGE": "", - "ADDED_AS": "", - "COLLABORATOR_RIGHTS": "", - "REMOVE_PARTICIPANT_HEAD": "", - "OWNER": "", - "COLLABORATORS": "", - "ADD_MORE": "", - "VIEWERS": "", - "OR_ADD_EXISTING": "", - "REMOVE_PARTICIPANT_MESSAGE": "", - "NOT_FOUND": "", - "LINK_EXPIRED": "", - "LINK_EXPIRED_MESSAGE": "", - "MANAGE_LINK": "", - "LINK_TOO_MANY_REQUESTS": "", - "FILE_DOWNLOAD": "", - "LINK_PASSWORD_LOCK": "", - "PUBLIC_COLLECT": "", - "LINK_DEVICE_LIMIT": "", - "NO_DEVICE_LIMIT": "", - "LINK_EXPIRY": "", - "NEVER": "", - "DISABLE_FILE_DOWNLOAD": "", - "DISABLE_FILE_DOWNLOAD_MESSAGE": "", - "MALICIOUS_CONTENT": "", - "COPYRIGHT": "", - "SHARED_USING": "", - "ENTE_IO": "", - "SHARING_REFERRAL_CODE": "", - "LIVE": "", - "DISABLE_PASSWORD": "", - "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", - "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", - "UPLOAD_FILES": "", - "UPLOAD_DIRS": "", - "UPLOAD_GOOGLE_TAKEOUT": "", - "DEDUPLICATE_FILES": "", - "AUTHENTICATOR_SECTION": "", - "NO_DUPLICATES_FOUND": "", - "CLUB_BY_CAPTURE_TIME": "", - "FILES": "", - "EACH": "", - "DEDUPLICATE_BASED_ON_SIZE": "", - "STOP_ALL_UPLOADS_MESSAGE": "", - "STOP_UPLOADS_HEADER": "", - "YES_STOP_UPLOADS": "", - "STOP_DOWNLOADS_HEADER": "", - "YES_STOP_DOWNLOADS": "", - "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", - "ALL_ALBUMS": "", - "ALBUMS": "", - "ALL_HIDDEN_ALBUMS": "", - "HIDDEN_ALBUMS": "", - "HIDDEN_ITEMS": "", - "HIDDEN_ITEMS_SECTION_NAME": "", - "ENTER_TWO_FACTOR_OTP": "", - "CREATE_ACCOUNT": "", - "COPIED": "", - "CANVAS_BLOCKED_TITLE": "", - "CANVAS_BLOCKED_MESSAGE": "", - "WATCH_FOLDERS": "", - "UPGRADE_NOW": "", - "RENEW_NOW": "", - "STORAGE": "", - "USED": "", - "YOU": "", - "FAMILY": "", - "FREE": "", - "OF": "", - "WATCHED_FOLDERS": "", - "NO_FOLDERS_ADDED": "", - "FOLDERS_AUTOMATICALLY_MONITORED": "", - "UPLOAD_NEW_FILES_TO_ENTE": "", - "REMOVE_DELETED_FILES_FROM_ENTE": "", - "ADD_FOLDER": "", - "STOP_WATCHING": "", - "STOP_WATCHING_FOLDER": "", - "STOP_WATCHING_DIALOG_MESSAGE": "", - "YES_STOP": "", - "MONTH_SHORT": "", - "YEAR": "", - "FAMILY_PLAN": "", - "DOWNLOAD_LOGS": "", - "DOWNLOAD_LOGS_MESSAGE": "", - "CHANGE_FOLDER": "", - "TWO_MONTHS_FREE": "", - "GB": "", - "POPULAR": "", - "FREE_PLAN_OPTION_LABEL": "", - "FREE_PLAN_DESCRIPTION": "", - "CURRENT_USAGE": "", - "WEAK_DEVICE": "", - "DRAG_AND_DROP_HINT": "", - "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", - "AUTHENTICATE": "", - "UPLOADED_TO_SINGLE_COLLECTION": "", - "UPLOADED_TO_SEPARATE_COLLECTIONS": "", - "NEVERMIND": "", - "UPDATE_AVAILABLE": "", - "UPDATE_INSTALLABLE_MESSAGE": "", - "INSTALL_NOW": "", - "INSTALL_ON_NEXT_LAUNCH": "", - "UPDATE_AVAILABLE_MESSAGE": "", - "DOWNLOAD_AND_INSTALL": "", - "IGNORE_THIS_VERSION": "", - "TODAY": "", - "YESTERDAY": "", - "NAME_PLACEHOLDER": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", - "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", - "CHOSE_THEME": "", - "ML_SEARCH": "", - "ENABLE_ML_SEARCH_DESCRIPTION": "", - "ML_MORE_DETAILS": "", - "ENABLE_FACE_SEARCH": "", - "ENABLE_FACE_SEARCH_TITLE": "", - "ENABLE_FACE_SEARCH_DESCRIPTION": "", - "DISABLE_BETA": "", - "DISABLE_FACE_SEARCH": "", - "DISABLE_FACE_SEARCH_TITLE": "", - "DISABLE_FACE_SEARCH_DESCRIPTION": "", - "ADVANCED": "", - "FACE_SEARCH_CONFIRMATION": "", - "LABS": "", - "YOURS": "", - "PASSPHRASE_STRENGTH_WEAK": "", - "PASSPHRASE_STRENGTH_MODERATE": "", - "PASSPHRASE_STRENGTH_STRONG": "", - "PREFERENCES": "", - "LANGUAGE": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", - "SUBSCRIPTION_VERIFICATION_ERROR": "", - "STORAGE_UNITS": { - "B": "", - "KB": "", - "MB": "", - "GB": "", - "TB": "" - }, - "AFTER_TIME": { - "HOUR": "", - "DAY": "", - "WEEK": "", - "MONTH": "", - "YEAR": "" - }, - "COPY_LINK": "", - "DONE": "", - "LINK_SHARE_TITLE": "", - "REMOVE_LINK": "", - "CREATE_PUBLIC_SHARING": "", - "PUBLIC_LINK_CREATED": "", - "PUBLIC_LINK_ENABLED": "", - "COLLECT_PHOTOS": "", - "PUBLIC_COLLECT_SUBTEXT": "", - "STOP_EXPORT": "", - "EXPORT_PROGRESS": "", - "MIGRATING_EXPORT": "", - "RENAMING_COLLECTION_FOLDERS": "", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", - "EXPORT_NOTIFICATION": { - "START": "", - "IN_PROGRESS": "", - "FINISH": "", - "UP_TO_DATE": "" - }, - "CONTINUOUS_EXPORT": "", - "TOTAL_ITEMS": "", - "PENDING_ITEMS": "", - "EXPORT_STARTING": "", - "DELETE_ACCOUNT_REASON_LABEL": "", - "DELETE_ACCOUNT_REASON_PLACEHOLDER": "", - "DELETE_REASON": { - "MISSING_FEATURE": "", - "BROKEN_BEHAVIOR": "", - "FOUND_ANOTHER_SERVICE": "", - "NOT_LISTED": "" - }, - "DELETE_ACCOUNT_FEEDBACK_LABEL": "", - "DELETE_ACCOUNT_FEEDBACK_PLACEHOLDER": "", - "CONFIRM_DELETE_ACCOUNT_CHECKBOX_LABEL": "", - "CONFIRM_DELETE_ACCOUNT": "", - "FEEDBACK_REQUIRED": "", - "FEEDBACK_REQUIRED_FOUND_ANOTHER_SERVICE": "", - "RECOVER_TWO_FACTOR": "", - "at": "", - "AUTH_NEXT": "", - "AUTH_DOWNLOAD_MOBILE_APP": "", - "HIDDEN": "", - "HIDE": "", - "UNHIDE": "", - "UNHIDE_TO_COLLECTION": "", - "SORT_BY": "", - "NEWEST_FIRST": "", - "OLDEST_FIRST": "", - "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", - "SELECT_COLLECTION": "", - "PIN_ALBUM": "", - "UNPIN_ALBUM": "", - "DOWNLOAD_COMPLETE": "", - "DOWNLOADING_COLLECTION": "", - "DOWNLOAD_FAILED": "", - "DOWNLOAD_PROGRESS": "", - "CHRISTMAS": "", - "CHRISTMAS_EVE": "", - "NEW_YEAR": "", - "NEW_YEAR_EVE": "", - "IMAGE": "", - "VIDEO": "", - "LIVE_PHOTO": "", - "CONVERT": "", - "CONFIRM_EDITOR_CLOSE_MESSAGE": "", - "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", - "BRIGHTNESS": "", - "CONTRAST": "", - "SATURATION": "", - "BLUR": "", - "INVERT_COLORS": "", - "ASPECT_RATIO": "", - "SQUARE": "", - "ROTATE_LEFT": "", - "ROTATE_RIGHT": "", - "FLIP_VERTICALLY": "", - "FLIP_HORIZONTALLY": "", - "DOWNLOAD_EDITED": "", - "SAVE_A_COPY_TO_ENTE": "", - "RESTORE_ORIGINAL": "", - "TRANSFORM": "", - "COLORS": "", - "FLIP": "", - "ROTATION": "", - "RESET": "", - "PHOTO_EDITOR": "", - "FASTER_UPLOAD": "", - "FASTER_UPLOAD_DESCRIPTION": "", - "MAGIC_SEARCH_STATUS": "", - "INDEXED_ITEMS": "", - "CAST_ALBUM_TO_TV": "", - "ENTER_CAST_PIN_CODE": "", - "PAIR_DEVICE_TO_TV": "", - "TV_NOT_FOUND": "", - "AUTO_CAST_PAIR": "", - "AUTO_CAST_PAIR_REQUIRES_CONNECTION_TO_GOOGLE": "", - "PAIR_WITH_PIN": "", - "CHOOSE_DEVICE_FROM_BROWSER": "", - "PAIR_WITH_PIN_WORKS_FOR_ANY_LARGE_SCREEN_DEVICE": "", - "VISIT_CAST_ENTE_IO": "", - "CAST_AUTO_PAIR_FAILED": "", - "CACHE_DIRECTORY": "", - "FREEHAND": "", - "APPLY_CROP": "", - "PHOTO_EDIT_REQUIRED_TO_SAVE": "", - "PASSKEYS": "", - "DELETE_PASSKEY": "", - "DELETE_PASSKEY_CONFIRMATION": "", - "RENAME_PASSKEY": "", - "ADD_PASSKEY": "", - "ENTER_PASSKEY_NAME": "", - "PASSKEYS_DESCRIPTION": "", - "CREATED_AT": "", - "PASSKEY_LOGIN_FAILED": "", - "PASSKEY_LOGIN_URL_INVALID": "", - "PASSKEY_LOGIN_ERRORED": "", - "TRY_AGAIN": "", - "PASSKEY_FOLLOW_THE_STEPS_FROM_YOUR_BROWSER": "", - "LOGIN_WITH_PASSKEY": "" -} diff --git a/web/apps/photos/src/components/AuthenticateUserModal.tsx b/web/apps/photos/src/components/AuthenticateUserModal.tsx index 7459982bc..97f47e7fb 100644 --- a/web/apps/photos/src/components/AuthenticateUserModal.tsx +++ b/web/apps/photos/src/components/AuthenticateUserModal.tsx @@ -1,14 +1,14 @@ -import { useContext, useEffect, useState } from "react"; - +import log from "@/next/log"; import DialogBoxV2 from "@ente/shared/components/DialogBoxV2"; import VerifyMasterPasswordForm, { VerifyMasterPasswordFormProps, } from "@ente/shared/components/VerifyMasterPasswordForm"; -import { logError } from "@ente/shared/sentry"; -import { getData, LS_KEYS } from "@ente/shared/storage/localStorage"; +import { LS_KEYS, getData } from "@ente/shared/storage/localStorage"; import { KeyAttributes, User } from "@ente/shared/user/types"; import { t } from "i18next"; import { AppContext } from "pages/_app"; +import { useContext, useEffect, useState } from "react"; + interface Iprops { open: boolean; onClose: () => void; @@ -51,7 +51,7 @@ export default function AuthenticateUserModal({ setKeyAttributes(keyAttributes); } } catch (e) { - logError(e, "AuthenticateUserModal initialization failed"); + log.error("AuthenticateUserModal initialization failed", e); onClose(); somethingWentWrong(); } diff --git a/web/apps/photos/src/components/Collections/CollectionOptions/AlbumCastDialog.tsx b/web/apps/photos/src/components/Collections/CollectionOptions/AlbumCastDialog.tsx index f477ae9bf..8a5cb2c90 100644 --- a/web/apps/photos/src/components/Collections/CollectionOptions/AlbumCastDialog.tsx +++ b/web/apps/photos/src/components/Collections/CollectionOptions/AlbumCastDialog.tsx @@ -1,3 +1,4 @@ +import log from "@/next/log"; import { VerticallyCentered } from "@ente/shared/components/Container"; import DialogBoxV2 from "@ente/shared/components/DialogBoxV2"; import EnteButton from "@ente/shared/components/EnteButton"; @@ -6,15 +7,14 @@ import SingleInputForm, { SingleInputFormProps, } from "@ente/shared/components/SingleInputForm"; import { boxSeal } from "@ente/shared/crypto/internal/libsodium"; -import { loadSender } from "@ente/shared/hooks/useCastSender"; -import { addLogLine } from "@ente/shared/logging"; import castGateway from "@ente/shared/network/cast"; -import { logError } from "@ente/shared/sentry"; -import { Typography } from "@mui/material"; +import { Link, Typography } from "@mui/material"; import { t } from "i18next"; import { useEffect, useState } from "react"; +import { Trans } from "react-i18next"; import { Collection } from "types/collection"; import { v4 as uuidv4 } from "uuid"; +import { loadSender } from "../../../utils/useCastSender"; interface Props { show: boolean; @@ -104,7 +104,7 @@ export default function AlbumCastDialog(props: Props) { await instance.requestSession(); } catch (e) { setView("auto-cast-error"); - logError(e, "Error requesting session"); + log.error("Error requesting session", e); return; } const session = instance.getCurrentSession(); @@ -123,7 +123,7 @@ export default function AlbumCastDialog(props: Props) { }) .catch((e) => { setView("auto-cast-error"); - logError(e, "Error casting to TV"); + log.error("Error casting to TV", e); }); } }, @@ -132,10 +132,10 @@ export default function AlbumCastDialog(props: Props) { session .sendMessage("urn:x-cast:pair-request", {}) .then(() => { - addLogLine("Message sent successfully"); + log.debug(() => "Message sent successfully"); }) - .catch((error) => { - logError(error, "Error sending message"); + .catch((e) => { + log.error("Error sending message", e); }); }); } @@ -220,12 +220,26 @@ export default function AlbumCastDialog(props: Props) { )} {view === "pin" && ( <> - {t("VISIT_CAST_ENTE_IO")} + + + ), + }} + values={{ url: "cast.ente.io" }} + /> + {t("ENTER_CAST_PIN_CODE")} diff --git a/web/apps/photos/src/components/Collections/CollectionOptions/index.tsx b/web/apps/photos/src/components/Collections/CollectionOptions/index.tsx index f39f73b9c..ffdc6ad1f 100644 --- a/web/apps/photos/src/components/Collections/CollectionOptions/index.tsx +++ b/web/apps/photos/src/components/Collections/CollectionOptions/index.tsx @@ -1,6 +1,6 @@ +import log from "@/next/log"; import { HorizontalFlex } from "@ente/shared/components/Container"; import OverflowMenu from "@ente/shared/components/OverflowMenu/menu"; -import { logError } from "@ente/shared/sentry"; import MoreHoriz from "@mui/icons-material/MoreHoriz"; import { Box } from "@mui/material"; import { @@ -161,22 +161,15 @@ const CollectionOptions = (props: CollectionOptionsProps) => { case CollectionActions.SHOW_ALBUM_CAST_DIALOG: callback = showCastAlbumDialog; break; - default: - logError( - Error("invalid collection action "), - "handleCollectionAction failed", - ); - { - action; - } + log.error(`invalid collection action ${action}`); } return async (...args: any) => { try { loader && startLoading(); await callback(...args); } catch (e) { - logError(e, "collection action failed", { action }); + log.error(`collection action ${action} failed`, e); setDialogMessage({ title: t("ERROR"), content: t("UNKNOWN_ERROR"), diff --git a/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageParticipant.tsx b/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageParticipant.tsx index e47edd591..74bf9828c 100644 --- a/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageParticipant.tsx +++ b/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageParticipant.tsx @@ -1,4 +1,4 @@ -import { logError } from "@ente/shared/sentry"; +import log from "@/next/log"; import BlockIcon from "@mui/icons-material/Block"; import DoneIcon from "@mui/icons-material/Done"; import ModeEditIcon from "@mui/icons-material/ModeEdit"; @@ -63,8 +63,7 @@ export default function ManageParticipant({ selectedParticipant.role = newRole; await galleryContext.syncWithRemote(false, true); } catch (e) { - const errorMessage = handleSharingErrors(e); - logError(e, errorMessage); + log.error(handleSharingErrors(e), e); } }; @@ -84,7 +83,7 @@ export default function ManageParticipant({ buttonText = t("CONVERT_TO_VIEWER"); } else if (newRole === "COLLABORATOR") { - contentText = t(`CHANGE_PERMISSIONS_TO_COLLABORATOR`, { + contentText = t("CHANGE_PERMISSIONS_TO_COLLABORATOR", { selectedEmail: selectedEmail, }); buttonText = t("CONVERT_TO_COLLABORATOR"); diff --git a/web/apps/photos/src/components/DeleteAccountModal.tsx b/web/apps/photos/src/components/DeleteAccountModal.tsx index 87cfe64bd..744fbf312 100644 --- a/web/apps/photos/src/components/DeleteAccountModal.tsx +++ b/web/apps/photos/src/components/DeleteAccountModal.tsx @@ -1,8 +1,8 @@ +import log from "@/next/log"; import { logoutUser } from "@ente/accounts/services/user"; import DialogBoxV2 from "@ente/shared/components/DialogBoxV2"; import EnteButton from "@ente/shared/components/EnteButton"; import { DELETE_ACCOUNT_EMAIL } from "@ente/shared/constants/urls"; -import { logError } from "@ente/shared/sentry"; import { Button, Link, Stack } from "@mui/material"; import { Formik, FormikHelpers } from "formik"; import { t } from "i18next"; @@ -92,7 +92,7 @@ const DeleteAccountModal = ({ open, onClose }: Iprops) => { askToMailForDeletion(); } } catch (e) { - logError(e, "Error while initiating account deletion"); + log.error("Error while initiating account deletion", e); somethingWentWrong(); } finally { setLoading(false); @@ -147,7 +147,7 @@ const DeleteAccountModal = ({ open, onClose }: Iprops) => { await deleteAccount(decryptedChallenge, reason, feedback); logoutUser(); } catch (e) { - logError(e, "solveChallengeAndDeleteAccount failed"); + log.error("solveChallengeAndDeleteAccount failed", e); somethingWentWrong(); } finally { setLoading(false); diff --git a/web/apps/photos/src/components/Directory/index.tsx b/web/apps/photos/src/components/Directory/index.tsx index a87202771..a99581134 100644 --- a/web/apps/photos/src/components/Directory/index.tsx +++ b/web/apps/photos/src/components/Directory/index.tsx @@ -1,6 +1,6 @@ +import { ensureElectron } from "@/next/electron"; +import log from "@/next/log"; import LinkButton from "@ente/shared/components/LinkButton"; -import ElectronAPIs from "@ente/shared/electron"; -import { logError } from "@ente/shared/sentry"; import { Tooltip } from "@mui/material"; import { styled } from "@mui/material/styles"; @@ -19,9 +19,9 @@ const DirectoryPathContainer = styled(LinkButton)( export const DirectoryPath = ({ width, path }) => { const handleClick = async () => { try { - await ElectronAPIs.openDirectory(path); + await ensureElectron().openDirectory(path); } catch (e) { - logError(e, "openDirectory failed"); + log.error("openDirectory failed", e); } }; return ( diff --git a/web/apps/photos/src/components/ExportInProgress.tsx b/web/apps/photos/src/components/ExportInProgress.tsx index 3324be5c4..ce2da895c 100644 --- a/web/apps/photos/src/components/ExportInProgress.tsx +++ b/web/apps/photos/src/components/ExportInProgress.tsx @@ -7,11 +7,11 @@ import { Button, DialogActions, DialogContent, + LinearProgress, styled, } from "@mui/material"; import { ExportStage } from "constants/export"; import { t } from "i18next"; -import { ProgressBar } from "react-bootstrap"; import { Trans } from "react-i18next"; import { ExportProgress } from "types/export"; @@ -69,21 +69,19 @@ export default function ExportInProgress(props: Props) { )} - + {showIndeterminateProgress() ? ( + + ) : ( + + )} diff --git a/web/apps/photos/src/components/ExportModal.tsx b/web/apps/photos/src/components/ExportModal.tsx index 211a70b1b..877dee90f 100644 --- a/web/apps/photos/src/components/ExportModal.tsx +++ b/web/apps/photos/src/components/ExportModal.tsx @@ -1,11 +1,10 @@ +import log from "@/next/log"; import { SpaceBetweenFlex, VerticallyCenteredFlex, } from "@ente/shared/components/Container"; import DialogTitleWithCloseButton from "@ente/shared/components/DialogBox/TitleWithCloseButton"; import { CustomError } from "@ente/shared/error"; -import { addLogLine } from "@ente/shared/logging"; -import { logError } from "@ente/shared/sentry"; import { Box, Button, @@ -68,7 +67,7 @@ export default function ExportModal(props: Props) { setContinuousExport(exportSettings?.continuousExport ?? false); void syncExportRecord(exportSettings?.folder); } catch (e) { - logError(e, "export on mount useEffect failed"); + log.error("export on mount useEffect failed", e); } }, []); @@ -123,7 +122,7 @@ export default function ExportModal(props: Props) { setPendingExports(pendingExports); } catch (e) { if (e.message !== CustomError.EXPORT_FOLDER_DOES_NOT_EXIST) { - logError(e, "syncExportRecord failed"); + log.error("syncExportRecord failed", e); } } }; @@ -135,12 +134,12 @@ export default function ExportModal(props: Props) { const handleChangeExportDirectoryClick = async () => { try { const newFolder = await exportService.changeExportDirectory(); - addLogLine(`Export folder changed to ${newFolder}`); + log.info(`Export folder changed to ${newFolder}`); updateExportFolder(newFolder); void syncExportRecord(newFolder); } catch (e) { if (e.message !== CustomError.SELECT_FOLDER_ABORTED) { - logError(e, "handleChangeExportDirectoryClick failed"); + log.error("handleChangeExportDirectoryClick failed", e); } } }; @@ -156,7 +155,7 @@ export default function ExportModal(props: Props) { } updateContinuousExport(newContinuousExport); } catch (e) { - logError(e, "onContinuousExportChange failed"); + log.error("onContinuousExportChange failed", e); } }; @@ -166,7 +165,7 @@ export default function ExportModal(props: Props) { await exportService.scheduleExport(); } catch (e) { if (e.message !== CustomError.EXPORT_FOLDER_DOES_NOT_EXIST) { - logError(e, "scheduleExport failed"); + log.error("scheduleExport failed", e); } } }; diff --git a/web/apps/photos/src/components/FilesDownloadProgress.tsx b/web/apps/photos/src/components/FilesDownloadProgress.tsx index 8999de370..81c01369f 100644 --- a/web/apps/photos/src/components/FilesDownloadProgress.tsx +++ b/web/apps/photos/src/components/FilesDownloadProgress.tsx @@ -1,7 +1,5 @@ -import ElectronAPIs from "@ente/shared/electron"; import Notification from "components/Notification"; import { t } from "i18next"; -import isElectron from "is-electron"; import { AppContext } from "pages/_app"; import { GalleryContext } from "pages/gallery"; import { useContext } from "react"; @@ -101,8 +99,9 @@ export const FilesDownloadProgress: React.FC = ({ const handleOnClick = (id: number) => () => { const attributes = attributesList.find((attr) => attr.id === id); - if (isElectron()) { - ElectronAPIs.openDirectory(attributes.downloadDirPath); + const electron = globalThis.electron; + if (electron) { + electron.openDirectory(attributes.downloadDirPath); } else { if (attributes.isHidden) { galleryContext.openHiddenSection(() => { @@ -136,7 +135,7 @@ export const FilesDownloadProgress: React.FC = ({ title: isFilesDownloadCompletedWithErrors(attributes) ? t("DOWNLOAD_FAILED") : isFilesDownloadCompleted(attributes) - ? t(`DOWNLOAD_COMPLETE`) + ? t("DOWNLOAD_COMPLETE") : t("DOWNLOADING_COLLECTION", { name: attributes.folderName, }), diff --git a/web/apps/photos/src/components/FixCreationTime.tsx b/web/apps/photos/src/components/FixCreationTime.tsx new file mode 100644 index 000000000..62c31539a --- /dev/null +++ b/web/apps/photos/src/components/FixCreationTime.tsx @@ -0,0 +1,264 @@ +import DialogBox from "@ente/shared/components/DialogBox/"; +import { + Button, + FormControl, + FormControlLabel, + FormLabel, + LinearProgress, + Radio, + RadioGroup, +} from "@mui/material"; +import { ComfySpan } from "components/ExportInProgress"; +import { useFormik } from "formik"; +import { t } from "i18next"; +import { GalleryContext } from "pages/gallery"; +import React, { useContext, useEffect, useState } from "react"; +import { updateCreationTimeWithExif } from "services/updateCreationTimeWithExif"; +import { EnteFile } from "types/file"; +import EnteDateTimePicker from "./EnteDateTimePicker"; + +export interface FixCreationTimeAttributes { + files: EnteFile[]; +} + +type Step = "running" | "completed" | "completed-with-errors"; + +export type FixOption = + | "date-time-original" + | "date-time-digitized" + | "metadata-date" + | "custom-time"; + +interface FormValues { + option: FixOption; + /** + * Date.toISOString() + * + * Formik doesn't have native support for JS dates, so we instead keep the + * corresponding date's ISO string representation as the form state. + */ + customTimeString: string; +} + +interface FixCreationTimeProps { + isOpen: boolean; + show: () => void; + hide: () => void; + attributes: FixCreationTimeAttributes; +} + +const FixCreationTime: React.FC = (props) => { + const [step, setStep] = useState(); + const [progressTracker, setProgressTracker] = useState({ + current: 0, + total: 0, + }); + + const galleryContext = useContext(GalleryContext); + + useEffect(() => { + // TODO (MR): Not sure why this is needed + if (props.attributes && props.isOpen && step !== "running") { + setStep(undefined); + } + }, [props.isOpen]); + + const onSubmit = async (values: FormValues) => { + console.log({ values }); + setStep("running"); + const completedWithErrors = await updateCreationTimeWithExif( + props.attributes.files, + values.option, + new Date(values.customTimeString), + setProgressTracker, + ); + setStep(completedWithErrors ? "completed-with-errors" : "completed"); + await galleryContext.syncWithRemote(); + }; + + const title = + step === "running" + ? t("FIX_CREATION_TIME_IN_PROGRESS") + : t("FIX_CREATION_TIME"); + + const message = messageForStep(step); + + if (!props.attributes) { + return <>; + } + + return ( + +
+ {message &&
{message}
} + + {step === "running" && ( + + )} + + +
+
+ ); +}; + +export default FixCreationTime; + +const messageForStep = (step?: Step) => { + switch (step) { + case undefined: + return undefined; + case "running": + return undefined; + case "completed": + return t("UPDATE_CREATION_TIME_COMPLETED"); + case "completed-with-errors": + return t("UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR"); + } +}; + +interface OptionsFormProps { + step?: Step; + onSubmit: (values: FormValues) => void | Promise; + hide: () => void; +} + +const OptionsForm: React.FC = ({ step, onSubmit, hide }) => { + const { values, handleChange, handleSubmit } = useFormik({ + initialValues: { + option: "date-time-original", + customTimeString: new Date().toISOString(), + }, + validateOnBlur: false, + onSubmit, + }); + + return ( + <> + {(step === undefined || step === "completed-with-errors") && ( +
+
+ + + {t("UPDATE_CREATION_TIME_NOT_STARTED")} + + + + } + label={t("DATE_TIME_ORIGINAL")} + /> + } + label={t("DATE_TIME_DIGITIZED")} + /> + } + label={t("METADATA_DATE")} + /> + } + label={t("CUSTOM_TIME")} + /> + + {values.option === "custom-time" && ( + + handleChange("customTimeString")( + d.toISOString(), + ) + } + /> + )} + +
+ )} +