Merge branch 'generic_group_by' into group_by_size

This commit is contained in:
Neeraj Gupta
2024-06-04 12:45:32 +05:30
216 changed files with 8050 additions and 4791 deletions

View File

@@ -1,45 +1,43 @@
name: "Deploy (staff)"
on:
# Run on every push to main that changes web/apps/staff/
# Run on every push to main that changes infra/staff/
push:
branches: [main]
paths:
- "web/apps/staff/**"
- ".github/workflows/web-deploy-staff.yml"
- "infra/staff/**"
- ".github/workflows/infra-deploy-staff.yml"
# Also allow manually running the workflow
workflow_dispatch:
jobs:
deploy:
lint:
runs-on: ubuntu-latest
defaults:
run:
working-directory: web
working-directory: infra/staff
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"
cache-dependency-path: "infra/staff/yarn.lock"
- name: Install dependencies
run: yarn install
- name: Build staff
run: yarn build:staff
- name: Build
run: yarn build
- name: Publish staff
- name: Publish
uses: cloudflare/wrangler-action@v3
with:
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/staff web/apps/staff/dist
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/staff infra/staff/dist

34
.github/workflows/infra-lint-staff.yml vendored Normal file
View File

@@ -0,0 +1,34 @@
name: "Lint (staff)"
on:
# Run on every push to a branch other than main that changes infra/staff/
push:
branches-ignore: [main]
paths:
- "infra/staff/**"
- ".github/workflows/infra-deploy-staff.yml"
jobs:
deploy:
runs-on: ubuntu-latest
defaults:
run:
working-directory: infra/staff
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup node and enable yarn caching
uses: actions/setup-node@v4
with:
node-version: 20
cache: "yarn"
cache-dependency-path: "infra/staff/yarn.lock"
- name: Install dependencies
run: yarn install
- name: Lint
run: yarn lint

View File

@@ -9,6 +9,7 @@ on:
- ".github/workflows/mobile-lint.yml"
env:
FLUTTER_VERSION: "3.22.0"
jobs:

View File

@@ -9,7 +9,7 @@ on:
- "photos-v*"
env:
FLUTTER_VERSION: "3.19.3"
FLUTTER_VERSION: "3.22.0"
jobs:
build:

View File

@@ -12,9 +12,10 @@ There are many ways to contribute, and most of them don't require writing code.
## Spread the word
This is perhaps the most impactful contribution you can make. Spread the word.
Online on your favorite social media channels. Offline to your friends and
family who are looking for a privacy-friendly alternative to big tech.
This is perhaps the most impactful contribution you can make. [Spread the
word](https://help.ente.io/photos/features/referral-program/). Online on your
favorite social media channels. Offline to your friends and family who are
looking for a privacy-friendly alternative to big tech.
## Engage with the community
@@ -76,7 +77,10 @@ us](https://github.com/ente-io/ente/discussions). Discussing your idea with us
first ensures that everyone is on the same page before you start working on your
change.
## Star
## Leave a review or star
If you haven't already done so, consider [starring this
repository](https://github.com/ente-io/ente/stargazers).
repository](https://github.com/ente-io/ente/stargazers) or leaving a review on
[PlayStore](https://play.google.com/store/apps/details?id=io.ente.auth),
[AppStore](https://apps.apple.com/us/app/ente-authenticator/id6444121398) or
[AlternativeTo](https://alternativeto.net/software/ente-authenticator/).

View File

@@ -60,8 +60,8 @@ Our labour of love. Two years ago, while building Ente Photos, we realized that
there was no open source end-to-end encrypted authenticator app. We already had
the building blocks, so we built one.
Ente Auth is currently free. If in the future we convert this to a paid service,
existing users will be grandfathered in.
Ente Auth is free, and will remain free forever. If you like the service and
want to give back, please check out Ente Photos or spread the word.
<br />

View File

@@ -95,13 +95,10 @@ more, see [docs/adding-icons](docs/adding-icons.md).
## 💚 Contribute
For more ways to contribute, see [../CONTRIBUTING.md](../CONTRIBUTING.md).
The best way to support this project is by checking out [Ente
Photos](../mobile/README.md) or spreading the word.
You can also support us by giving this project a ⭐ star on GitHub or by leaving
a review on
[PlayStore](https://play.google.com/store/apps/details?id=io.ente.auth),
[AppStore](https://apps.apple.com/us/app/ente-authenticator/id6444121398) or
[AlternativeTo](https://alternativeto.net/software/ente-authenticator/).
For more ways to contribute, see [../CONTRIBUTING.md](../CONTRIBUTING.md).
## ⭐️ About

View File

@@ -18,10 +18,10 @@
"title": "AscendEX"
},
{
"title": "BitMEX"
"title": "Bitfinex"
},
{
"title": "Bitfinex"
"title": "BitMEX"
},
{
"title": "Bitvavo",
@@ -32,13 +32,12 @@
},
{
"title": "Bloom Host",
"slug": "bloom_host"
"slug": "bloom_host",
"altNames": ["Bloom Host Billing"]
},
{
"title": "BorgBase",
"altNames": [
"borg"
],
"altNames": ["borg"],
"slug": "BorgBase"
},
{
@@ -57,10 +56,10 @@
"hex": "D14633"
},
{
"title": "ConfigCat"
"title": "Cloudflare"
},
{
"title": "Cloudflare"
"title": "ConfigCat"
},
{
"title": "Control D",
@@ -72,9 +71,7 @@
},
{
"title": "DCS",
"altNames": [
"Digital Combat Simulator"
],
"altNames": ["Digital Combat Simulator"],
"slug": "dcs"
},
{
@@ -83,6 +80,9 @@
{
"title": "Discourse"
},
{
"title": "Doppler"
},
{
"title": "dus.net",
"slug": "dusnet"
@@ -117,14 +117,15 @@
{
"title": "GitLab"
},
{
"title": "GMX"
},
{
"title": "Google"
},
{
"title": "Gosuslugi",
"altNames": [
"Госуслуги"
],
"altNames": ["Госуслуги"],
"slug": "Gosuslugi"
},
{
@@ -135,21 +136,21 @@
"slug": "healthchecks"
},
{
"title": "ING"
"title": "IceDrive",
"slug": "Icedrive"
},
{
"title": "INWX"
"title": "ING"
},
{
"title": "Instagram"
},
{
"title": "IVPN",
"slug": "IVPN"
"title": "INWX"
},
{
"title": "IceDrive",
"slug": "Icedrive"
"title": "IVPN",
"slug": "IVPN"
},
{
"title": "Jagex",
@@ -158,10 +159,6 @@
{
"title": "Kagi"
},
{
"title": "KPN",
"color": "00CC00"
},
{
"title": "Kick",
"hex": "53FC19"
@@ -172,6 +169,10 @@
{
"title": "Koofr"
},
{
"title": "KPN",
"color": "00CC00"
},
{
"title": "Kraken",
"hex": "5848D5"
@@ -190,27 +191,21 @@
{
"title": "Letterboxd"
},
{
"title": "Local",
"slug": "local_wp",
"altNames": ["LocalWP", "Local WP", "Local Wordpress"]
},
{
"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"
],
"slug": "ecloud"
"slug": "mercado_livre",
"altNames": ["Mercado Libre", "MercadoLibre", "MercadoLivre"]
},
{
"title": "Microsoft"
@@ -221,6 +216,11 @@
{
"title": "Mozilla"
},
{
"title": "Murena",
"altNames": ["eCloud"],
"slug": "ecloud"
},
{
"title": "MyFRITZ!Net",
"slug": "myfritz"
@@ -294,6 +294,10 @@
{
"title": "Proxmox"
},
{
"title": "Real-Debrid",
"slug": "real_debrid"
},
{
"title": "Revolt",
"hex": "858585"
@@ -302,6 +306,10 @@
"title": "Rockstar Games",
"slug": "rockstar_games"
},
{
"title": "RuneMate",
"hex": "2ECC71"
},
{
"title": "Rust Language Forum",
"slug": "rust_language_forum",
@@ -331,6 +339,9 @@
"slug": "standardnotes",
"hex": "2173E6"
},
{
"title": "Surfshark"
},
{
"title": "Synology DSM",
"slug": "synology_dsm"
@@ -341,7 +352,8 @@
"hex": "FFFFFF"
},
{
"title": "Techlore"
"title": "Techlore",
"altNames": ["Techlore Courses", "Techlore Forums"]
},
{
"title": "Termius",
@@ -399,19 +411,27 @@
"slug": "wyze"
},
{
"title": "X",
"title": "WorkOS",
"slug": "workos",
"altNames": [
"twitter"
],
"Work OS"
]
},
{
"title": "X",
"altNames": ["twitter"],
"slug": "x"
},
{
"title": "Yandex",
"altNames": [
"Ya",
"Яндекс"
],
"altNames": ["Ya", "Яндекс"],
"slug": "Yandex"
},
{
"title": "YNAB",
"altNames": ["You Need A Budget"],
"slug": "ynab",
"hex": "3B5EDA"
}
]
}
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -0,0 +1 @@
<svg fill="none" height="800" viewBox="0 0 800 800" width="800" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="0" cy="0" gradientTransform="matrix(-423.0004 -300.00003 172.7003 -243.50762 861 448)" gradientUnits="userSpaceOnUse" r="1"><stop offset="0" stop-color="#ea5926"/><stop offset="1" stop-color="#ea5a25" stop-opacity="0"/></radialGradient><radialGradient id="b" cx="0" cy="0" gradientTransform="matrix(-318.99928 -110.0022 110.0022 -318.99928 800 736)" gradientUnits="userSpaceOnUse" r="1"><stop offset="0" stop-color="#ea5a25"/><stop offset="1" stop-color="#ed5a21" stop-opacity="0"/></radialGradient><linearGradient id="c" gradientUnits="userSpaceOnUse" x1="505" x2="1.46826" y1="-305" y2="800.669"><stop offset="0" stop-color="#ff9efa"/><stop offset=".426562" stop-color="#ac50f7"/><stop offset=".646435" stop-color="#6b13f5"/></linearGradient><clipPath id="d"><path d="m0 0h500v500h-500z" transform="translate(150 150)"/></clipPath><rect fill="url(#c)" height="800" rx="400" width="800"/><rect fill="url(#a)" height="800" rx="400" width="800"/><rect fill="url(#b)" height="800" rx="400" width="800"/><g clip-path="url(#d)" fill="#fff"><path d="m467.396 151.3c-21.021-5.632-42.449 7.589-46.843 28.903l-19.94 96.716c-13.025 63.174-62.376 112.549-125.545 125.603l-94.873 19.607c-21.312 4.405-34.527 25.833-28.894 46.854 5.633 21.023 27.796 32.974 48.456 26.128l92.327-30.593c61.386-20.341 128.989-2.227 171.981 46.082l64.666 72.664c14.467 16.255 39.63 16.987 55.017 1.6 15.39-15.389 14.655-40.558-1.607-55.023l-73.135-65.056c-48.44-43.09-66.604-110.866-46.202-172.405l30.71-92.633c6.847-20.655-5.099-42.815-26.118-48.447z"/><path d="m216.103 272.283c-17.191-15.554-17.86-42.331-1.467-58.723 16.393-16.393 43.169-15.724 58.723 1.467l48.898 54.045c13.189 14.578 12.631 36.937-1.27 50.838s-36.261 14.46-50.839 1.271zm380.232 29.881c22.065-7.11 45.589 5.698 51.589 28.091s-7.967 45.248-30.632 50.122l-71.253 15.325c-19.22 4.133-38.305-7.53-43.393-26.52-5.088-18.989 5.608-38.632 24.32-44.662zm-217.826 315.811c-4.875 22.664-27.73 36.632-50.122 30.632-22.393-6-35.202-29.524-28.091-51.589l22.355-69.37c6.03-18.711 25.673-29.407 44.663-24.319 18.989 5.088 30.653 24.173 26.519 43.392z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<circle cx="512" cy="512" r="512" style="fill:#004788"/>
<path d="m736.6 506.6 50.1-83.3h-51.1L709 465.6l-28.6-42.3h-56l59 83.2-59 93.9h56l31.9-53.4 37.8 53.4h50l-63.5-93.8zm-185.1-83.4-38 94.8-36-94.8h-45.4L402 600.6h45.9l14.8-102.2h.5l40.7 102.2h18.4l42.6-102.2h.6l12.9 102.2h46.1l-26.9-177.4h-46.1zm-233.8 78.5v36.1h37.6c-2 20.2-17.3 30.6-37.1 30.6-30.1 0-46.4-27.7-46.4-55.2s15.6-55.6 45.7-55.6c18.5 0 31.7 11.2 38.1 27.9l43.5-18.2c-15.2-32.9-43.2-49.2-79.5-49.2-56.8 0-95.5 37.6-95.5 94.8 0 55.4 38.5 93 93.9 93 29.4 0 55.4-10.5 72.6-34.6 15.4-21.8 17.6-43.9 18-69.7h-90.9z" style="fill:#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 825 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="320px" height="320px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.992" fill="#52bb7b" d="M 146.5,-0.5 C 155.167,-0.5 163.833,-0.5 172.5,-0.5C 183.052,2.2756 192.719,6.94227 201.5,13.5C 234.5,46.5 267.5,79.5 300.5,112.5C 318.79,135.86 322.456,161.527 311.5,189.5C 308.11,195.357 304.443,201.023 300.5,206.5C 268.052,239.07 235.385,271.404 202.5,303.5C 201.614,304.325 201.281,305.325 201.5,306.5C 197.68,307.84 194.347,310.006 191.5,313C 185.322,315.892 178.989,318.059 172.5,319.5C 163.833,319.5 155.167,319.5 146.5,319.5C 139.355,317.751 132.355,315.418 125.5,312.5C 125.5,311.5 125.5,310.5 125.5,309.5C 122.643,308.667 119.977,307.334 117.5,305.5C 84.5,272.5 51.5,239.5 18.5,206.5C 0.210219,183.14 -3.45645,157.473 7.5,129.5C 10.89,123.643 14.5567,117.977 18.5,112.5C 51.5,79.5 84.5,46.5 117.5,13.5C 126.281,6.94227 135.948,2.2756 146.5,-0.5 Z"/></g>
<g><path style="opacity:1" fill="#fafdfb" d="M 151.5,41.5 C 152.47,57.4524 152.803,73.4524 152.5,89.5C 129.661,112.506 106.994,135.672 84.5,159C 105.661,180.994 126.994,202.828 148.5,224.5C 149.031,226.544 150.198,228.211 152,229.5C 152.5,244.496 152.667,259.496 152.5,274.5C 152.141,276.371 151.141,277.871 149.5,279C 146.833,279.667 144.167,279.667 141.5,279C 111.333,248.833 81.1667,218.667 51,188.5C 47.074,183.63 43.4073,178.63 40,173.5C 34.8493,157.438 38.1826,143.438 50,131.5C 80.1667,101.333 110.333,71.1667 140.5,41C 143.702,39.5167 147.036,39.1834 150.5,40C 151.056,40.3826 151.389,40.8826 151.5,41.5 Z"/></g>
<g><path style="opacity:1" fill="#fbfdfc" d="M 279.5,148.5 C 280.903,153.387 281.569,158.387 281.5,163.5C 279.693,171.198 276.193,178.198 271,184.5C 239.5,216 208,247.5 176.5,279C 173.833,279.667 171.167,279.667 168.5,279C 167.177,278.184 166.511,277.017 166.5,275.5C 166.197,259.786 166.531,244.119 167.5,228.5C 189.951,205.881 212.284,183.048 234.5,160C 212.374,136.874 189.874,114.04 167,91.5C 166.536,90.9056 166.369,90.2389 166.5,89.5C 166.212,73.4649 166.545,57.4649 167.5,41.5C 167.611,40.8826 167.944,40.3826 168.5,40C 171.964,39.1834 175.298,39.5167 178.5,41C 208.667,71.1667 238.833,101.333 269,131.5C 271.667,134.833 274.333,138.167 277,141.5C 278.411,143.65 279.245,145.984 279.5,148.5 Z"/></g>
<g><path style="opacity:1" fill="#cfecdb" d="M 151.5,41.5 C 152.117,41.6107 152.617,41.944 153,42.5C 153.828,58.3388 153.661,74.0054 152.5,89.5C 152.803,73.4524 152.47,57.4524 151.5,41.5 Z"/></g>
<g><path style="opacity:1" fill="#cfecda" d="M 167.5,41.5 C 166.545,57.4649 166.212,73.4649 166.5,89.5C 165.339,74.0054 165.172,58.3388 166,42.5C 166.383,41.944 166.883,41.6107 167.5,41.5 Z"/></g>
<g><path style="opacity:1" fill="#57bd7e" d="M 138.5,63.5 C 139.654,69.987 139.821,76.6536 139,83.5C 114.597,107.948 90.0967,132.281 65.5,156.5C 62.1667,161.167 58.8333,165.833 55.5,170.5C 50.2141,162.481 50.3807,154.481 56,146.5C 83.2852,118.477 110.785,90.8102 138.5,63.5 Z"/></g>
<g><path style="opacity:1" fill="#59be80" d="M 179.5,63.5 C 180.473,63.9867 181.473,64.4867 182.5,65C 203.99,87.4562 225.823,109.623 248,131.5C 250.67,138.156 249.67,144.156 245,149.5C 223.333,127.833 201.667,106.167 180,84.5C 179.5,77.5079 179.334,70.5079 179.5,63.5 Z"/></g>
<g><path style="opacity:1" fill="#fafdfb" d="M 144.5,113.5 C 153.839,113.334 163.173,113.5 172.5,114C 173.416,114.374 174.25,114.874 175,115.5C 175.667,118.167 175.667,120.833 175,123.5C 164.243,124.653 153.41,124.82 142.5,124C 140.522,121.503 140.022,118.669 141,115.5C 142.302,114.915 143.469,114.249 144.5,113.5 Z"/></g>
<g><path style="opacity:1" fill="#f2faf4" d="M 122.5,142.5 C 122.287,139.549 122.954,136.882 124.5,134.5C 147.094,133.345 169.761,133.178 192.5,134C 193.416,134.374 194.25,134.874 195,135.5C 195.667,137.833 195.667,140.167 195,142.5C 194.5,143.667 193.667,144.5 192.5,145C 170.167,145.667 147.833,145.667 125.5,145C 124.309,144.302 123.309,143.469 122.5,142.5 Z"/></g>
<g><path style="opacity:1" fill="#addfc0" d="M 124.5,134.5 C 122.954,136.882 122.287,139.549 122.5,142.5C 120.816,139.282 121.483,136.615 124.5,134.5 Z"/></g>
<g><path style="opacity:1" fill="#57bd7f" d="M 265.5,151.5 C 267.083,157.318 266.75,162.985 264.5,168.5C 262.887,171.286 261.054,173.953 259,176.5C 232.986,202.68 206.82,228.68 180.5,254.5C 179.167,247.833 179.167,241.167 180.5,234.5C 206.181,209.652 231.348,184.319 256,158.5C 258.478,155.71 260.312,152.544 261.5,149C 263.615,148.464 264.948,149.297 265.5,151.5 Z"/></g>
<g><path style="opacity:1" fill="#f1f9f4" d="M 105.5,153.5 C 141.168,153.333 176.835,153.5 212.5,154C 215.57,156.569 216.237,159.736 214.5,163.5C 213.975,164.192 213.308,164.692 212.5,165C 176.833,165.667 141.167,165.667 105.5,165C 100.193,161.036 100.193,157.202 105.5,153.5 Z"/></g>
<g><path style="opacity:1" fill="#94d5ad" d="M 279.5,148.5 C 281.13,150.026 281.963,152.026 282,154.5C 282.805,157.696 282.638,160.696 281.5,163.5C 281.569,158.387 280.903,153.387 279.5,148.5 Z"/></g>
<g><path style="opacity:1" fill="#a5dcba" d="M 265.5,151.5 C 266.117,151.611 266.617,151.944 267,152.5C 269.288,158.528 268.454,163.861 264.5,168.5C 266.75,162.985 267.083,157.318 265.5,151.5 Z"/></g>
<g><path style="opacity:1" fill="#5abe80" d="M 73.5,169.5 C 95.4114,190.911 117.245,212.577 139,234.5C 139.667,241.5 139.667,248.5 139,255.5C 115.895,233.306 93.2279,210.64 71,187.5C 69.4661,183.289 69.1327,178.956 70,174.5C 70.6972,172.416 71.8639,170.749 73.5,169.5 Z"/></g>
<g><path style="opacity:1" fill="#fefefe" d="M 122.5,182.5 C 122.448,180.097 122.781,177.764 123.5,175.5C 146.761,174.345 170.094,174.178 193.5,175C 196.167,178.333 196.167,181.667 193.5,185C 170.5,185.667 147.5,185.667 124.5,185C 123.619,184.292 122.953,183.458 122.5,182.5 Z"/></g>
<g><path style="opacity:1" fill="#a0dab7" d="M 123.5,175.5 C 122.781,177.764 122.448,180.097 122.5,182.5C 121.853,181.726 121.52,180.726 121.5,179.5C 121.34,177.645 122.007,176.312 123.5,175.5 Z"/></g>
<g><path style="opacity:1" fill="#fbfdfc" d="M 143.5,194.5 C 153.506,194.334 163.506,194.5 173.5,195C 176.936,198.06 177.269,201.393 174.5,205C 164.167,205.667 153.833,205.667 143.5,205C 141.09,204.242 140.09,202.575 140.5,200C 140.12,197.297 141.12,195.463 143.5,194.5 Z"/></g>
<g><path style="opacity:1" fill="#d2eddd" d="M 148.5,224.5 C 150.129,225.625 151.629,226.959 153,228.5C 153.828,244.006 153.661,259.339 152.5,274.5C 152.667,259.496 152.5,244.496 152,229.5C 150.198,228.211 149.031,226.544 148.5,224.5 Z"/></g>
<g><path style="opacity:1" fill="#d1eddc" d="M 167.5,228.5 C 166.531,244.119 166.197,259.786 166.5,275.5C 165.339,260.339 165.172,245.006 166,229.5C 166.383,228.944 166.883,228.611 167.5,228.5 Z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 90 90" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path d="M45.155.025c-.033.034-1.094.1-2.34.167-1.245.05-2.49.134-2.776.168-.27.05-1.077.167-1.767.267-3.282.468-7.49 1.656-10.738 3.043A45.529 45.529 0 0 0 3.787 27.014C1.867 31.28.52 36.462.117 41.027-.1 43.57 0 48.97.304 50.56c.033.167.117.736.168 1.237.084.753.522 2.793 1.027 4.766.05.184.134.585.185.87.05.3.151.552.219.552.067 0 .134.1.134.234 0 .518.943 3.093 1.111 2.993.1-.05.118-.017.067.067-.151.25.286 1.254.472 1.103.067-.083.084-.033.016.084-.084.134.085.72.421 1.421.572 1.238 2.541 4.816 2.844 5.184.101.117.489.686.859 1.271.64 1.003 2.827 3.78 3.787 4.833 6.547 7.04 14.39 11.655 23.293 13.729 1.161.267 2.474.535 2.911.602.455.05.993.133 1.178.184 2.188.418 11.075.418 12.74-.017.136-.05.523-.117.842-.167 2.794-.435 7.204-1.64 9.257-2.525.32-.15.74-.318.926-.385.185-.067 1.094-.485 2.02-.92 7.304-3.444 13.598-8.88 18.193-15.735 1.8-2.659 2.912-4.816 4.207-8.16.556-1.422 1.549-4.633 1.7-5.469.034-.234.135-.685.22-1.003.083-.318.201-.853.252-1.17.05-.318.117-.77.168-1.004.505-2.642.64-8.31.27-11.12-.203-1.555-.809-4.348-1.01-4.732-.068-.117-.455.953-.876 2.458-.404 1.455-.757 2.642-.774 2.625-.017-.016-.084-.485-.135-1.02-.185-1.923-.269-2.525-.673-4.515-.437-2.19-1.313-5.05-2.053-6.772-.572-1.304-1.767-3.512-1.902-3.512-.067 0-.118 1.305-.118 2.876-.05 8.78-1.144 16.455-3.231 22.558-1.094 3.228-3.333 8.01-4.965 10.652-3.905 6.271-9.863 11.187-16.763 13.846-1.464.552-4.746 1.472-5.975 1.656-4.948.769-8.87.685-13.33-.268-12.942-2.76-23.377-13.36-25.868-26.32-.387-1.99-.42-2.174-.555-3.997-.168-2.408-.084-5.802.202-7.124.034-.217.118-.685.168-1.02.05-.334.286-1.354.522-2.257.236-.92.438-1.773.471-1.906.354-1.505 2.44-5.987 3.67-7.943 2.558-4.014 6.479-7.927 10.586-10.552 3.786-2.408 9.054-4.33 13.784-5.017 1.211-.167 6.361-.217 7.657-.05 3.3.385 3.753.452 5.89.836 7.71 1.405 15.4 4.716 24.455 10.569 1.212.802 2.222 1.354 2.222 1.237 0-.334-1.633-3.06-2.66-4.448-1.834-2.508-4.291-5.033-6.832-7.023-.808-.652-1.448-1.187-1.38-1.187.05 0 .387.1.723.234 1.515.568 4.46 1.455 4.612 1.404.1-.033-.522-.769-1.397-1.622-4.208-4.197-9.678-7.441-15.905-9.43C56.465 1.63 53.587.91 52.325.726c-.37-.066-1.28-.2-2.02-.317-.757-.117-2.154-.234-3.113-.268-.976-.017-1.801-.067-1.868-.117-.05-.033-.135-.033-.169 0Z" fill="#B8D995"/><path d="m44.845 89.975.048-.012.296-.031.676-.048 1.32-.076 1.47-.073 1.167-.08.14-.015.195-.033.803-.122.768-.112c3.282-.468 7.49-1.656 10.738-3.043a45.525 45.525 0 0 0 23.747-23.344c1.92-4.265 3.266-9.448 3.67-14.013.023-.276.043-.585.06-.92l.027-.699.019-.751.01-.788c-.01-1.452-.079-2.806-.21-3.8l-.056-.396-.068-.432-.08-.456-.133-.708-.192-.926-.143-.634-.09-.372-.084-.319-.075-.254a1.629 1.629 0 0 0-.089-.236c-.012-.022-.035-.004-.066.05l-.054.104-.066.153-.119.314-.138.404-.154.483-.164.55-.606 2.13-.222.731-.056.16c-.002.003-.003.005-.004.004l-.014-.051-.021-.128-.041-.302-.045-.395-.116-1.16-.065-.567-.069-.521-.079-.516a28.33 28.33 0 0 0-.045-.267l-.106-.579-.207-1.049c-.437-2.19-1.313-5.05-2.053-6.772l-.142-.316-.245-.515-.178-.358-.368-.716-.27-.502-.248-.44-.144-.246-.124-.196c-.092-.141-.157-.223-.183-.223-.01 0-.018.024-.026.07l-.017.12-.015.173-.026.486-.023.822-.01.993v.212c-.051 8.78-1.145 16.455-3.232 22.558a44.95 44.95 0 0 1-1.008 2.655l-.403.954c-1.108 2.57-2.466 5.282-3.554 7.043-3.905 6.271-9.863 11.187-16.763 13.846l-.233.086-.536.184-.297.097-.638.2-.678.201-.346.1-.694.193-.34.091-.657.17-.603.144c-.38.087-.707.153-.953.19-4.767.74-8.58.69-12.841-.167l-.862-.122-.822-.132-.938-.164-.365-.065c-7.708-1.405-15.4-4.716-24.454-10.569l-.505-.327-.466-.29-.412-.244-.346-.191-.186-.095a3.307 3.307 0 0 0-.078-.036l-.125-.051c-.067-.023-.104-.025-.104-.003 0 .048.033.144.094.279l.109.229.145.277.175.318.309.536.35.58.374.6.382.59.25.373.243.35.228.316c1.72 2.351 3.987 4.718 6.358 6.644l.616.493.734.603.336.289.107.098c.055.054.078.083.062.083l-.072-.014-.14-.04-.185-.06-.214-.076-.274-.104-.536-.19-.59-.2-.823-.265-.993-.305-.833-.238-.369-.095-.174-.038-.106-.015a.08.08 0 0 0-.026.002c-.028.009 0 .072.074.178l.11.145.149.18.185.211.218.237.247.257.27.273.144.14c4.067 4.058 9.314 7.225 15.285 9.229l.62.203c.198.065.408.131.625.198l.673.2.702.198.714.191.356.092.696.173.662.155.61.133.538.106c.165.03.316.056.449.076l.584.095 1.436.222.245.035.58.068c.209.022.43.043.656.062l.68.052c.337.023.664.04.952.05l.53.014.745.033.327.025.153.018.092.019.021.009c.05.033.135.033.169 0Z" fill="#9FD3EE"/></g></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,8 @@
<svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg" fill="#2ecc71">
<symbol id="a" viewBox="0 0 1000 1000" style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision">
<path d="M456.557 954.142c-51.209-5.834-105.636-23.11-164.89-52.34-77.345-38.153-130.132-84.108-171.904-149.652-13.757-21.586-34.244-56.915-41.287-71.198-26.53-53.794-41.318-128.813-39.427-200 3.104-116.883 48.87-223.866 132.312-309.3C245.728 95.508 343.98 48.75 449.405 39.326c16.075-1.437 42.857-1.633 42.857-.314 0 .84-9.912 36.005-15.619 55.41-2.335 7.94-2.459 8.099-5.794 7.366-5.02-1.103-38.597 1.5-54.588 4.23-78.184 13.352-148.872 53.08-205.858 115.696-44.404 48.79-73.222 96.544-90.72 150.33-9.247 28.422-13.436 51.91-15.467 86.718-4.603 78.927 3.852 137.972 26.617 185.88 11.44 24.075 41.212 74.137 53.452 89.88 12.95 16.658 45.5 53.571 47.225 53.557 1.003-.008 6.645-1.359 12.538-3.002 33.243-9.268 71.782-16.19 110.119-19.778 23.046-2.158 81.589-1.805 105.952.637 80.53 8.074 152.793 28.04 218.763 60.442 14.585 7.164 22.502 10.436 24.057 9.942 4.456-1.414 34.073-21.892 46.466-32.127 36.789-30.385 55.405-51.859 83.62-96.456 12.304-19.447 33.186-60.968 40.115-79.762 11.156-30.26 17.905-59.183 20.418-87.5 1.58-17.803.844-74.678-1.255-97.024-5.875-62.539-19.14-96.584-65.864-169.047-18.12-28.102-30.924-44.798-47.526-61.974-33.977-35.15-76.434-63.926-121.175-82.126-7.53-3.063-13.868-5.732-14.086-5.932-.217-.2 2.595-13.79 6.25-30.202 3.655-16.412 6.646-30.065 6.646-30.34 0-.699 20.397 5.54 29.894 9.143 48.79 18.51 94.215 50.387 138.598 97.264 28.447 30.046 56.905 68.452 77.93 105.172 23.918 41.775 43.482 101.062 51.717 156.733 12.077 81.642 3.119 156.375-27.337 228.05-26.303 61.906-59.852 113.54-102.193 157.284-24.676 25.493-52.838 48.34-76.347 61.935-5.239 3.03-14.647 8.58-20.908 12.333-39.579 23.728-89.618 43.541-136.83 54.177-30.244 6.813-50.423 9.032-86.31 9.49-23.602.3-37.675-.07-48.205-1.27z"/>
<path d="M500.595 722.575c-49.27-3.036-105.94-12.2-150.595-24.354-49.438-13.455-103.365-35.123-141.369-56.803-12.536-7.15-12.797-7.387-12.786-11.562.006-2.343 1.876-23.814 4.155-47.713 2.28-23.899 4.15-44.297 4.155-45.328.01-1.554-3.775-2.292-22.044-4.298-12.131-1.332-22.383-2.75-22.782-3.148-.891-.891 9.648-113.624 10.723-114.698.423-.423 11.314.114 24.203 1.193 12.89 1.08 23.606 1.79 23.816 1.581.27-.27 14.667-126.689 14.667-128.792 0-.604 20.651-7.884 29.762-10.492 34.467-9.866 97.903-19.388 152.496-22.89l12.614-.81 1.922-15.477c1.056-8.512 2.076-15.622 2.266-15.799.19-.177 12.08.182 26.425.797 14.344.616 26.479.695 26.966.176.487-.52 15.317-42.194 32.956-92.61 31.657-90.487 32.112-91.672 35.394-92.059 4.302-.507 31.608 2.981 39.318 5.023 3.274.867 5.892 2.055 5.818 2.64-.073.584-8.608 42.17-18.966 92.413-10.358 50.243-18.592 91.591-18.298 91.886.294.294 13.353 2.995 29.019 6.003 15.666 3.007 28.707 5.69 28.979 5.963.272.272-.376 8.106-1.44 17.409-1.065 9.303-1.681 17.168-1.37 17.479.31.31 6.685 1.808 14.166 3.328 27.185 5.523 59.165 15.788 92.694 29.752 18.402 7.665 72.77 34.438 74.732 36.802.998 1.202-.2 17.922-4.742 66.131-3.342 35.487-5.827 64.772-5.52 65.079.306.306 10.781 1.422 23.278 2.48 19.132 1.62 22.722 2.221 22.722 3.81 0 3.471-10.586 114.581-10.95 114.934-.198.192-11.208-.558-24.467-1.666-16.147-1.35-24.13-1.608-24.176-.783-.038.678-2.583 22.36-5.656 48.182l-5.587 46.95-15.475 3.924c-48.273 12.242-94.678 20.005-144.642 24.197-20.767 1.742-81.67 2.427-102.38 1.15zm83.334-73.78c32.215-2.204 65.058-6.745 96.16-13.295 10.325-2.175 12.312-2.962 12.758-5.05.29-1.36 5.928-54.426 12.529-117.924 11.371-109.385 11.891-115.53 9.9-116.986-4.135-3.024-25.054-13.273-39.086-19.15-47.244-19.786-97.576-32.17-158.928-39.105-26.75-3.023-100.774-3.013-129.096.019-24.927 2.667-45.3 5.631-67.127 9.764l-16.763 3.175-.677 4.938c-2.761 20.122-25.65 226.992-25.376 229.34.296 2.531 2.763 4.19 16.42 11.041C351.133 623.9 427.686 643.701 500 648.678c20.699 1.425 63.937 1.485 83.929.117z"/>
<path d="M441.221 506.496c-2.209-.959-9.779-7.098-16.821-13.644-7.043-6.545-13.208-11.9-13.7-11.9-.494 0-7.17 4.746-14.838 10.547-9.216 6.972-15.442 10.829-18.369 11.378-12.159 2.28-25.707-8.772-25.707-20.972 0-10.383 3.31-14.929 22.964-31.532 20.158-17.029 29.05-20.901 41.876-18.239 9.676 2.01 17.414 8.276 33.054 26.77 15.838 18.73 19.347 24.737 19.36 33.152.007 5.098-.483 6.196-4.344 9.734-6.791 6.223-15.813 8.032-23.475 4.706zm171.214 16.261c-2.91-1.89-9.834-8.05-15.385-13.69-5.55-5.642-10.54-10.257-11.088-10.257-.547 0-6.88 4.576-14.073 10.17-14.107 10.97-16.86 12.449-23.195 12.449-6.057 0-11.222-2.58-16.19-8.084-7.604-8.428-8.187-17.083-1.791-26.58 4.035-5.992 31.416-29.148 38.829-32.838 12.562-6.252 26.061-4.757 37.253 4.125 3.083 2.446 11.776 11.884 19.318 20.973 14.946 18.01 19.353 26.332 17.938 33.874-2.207 11.769-20.08 17.341-31.616 9.858z"/>
</symbol>
<use xlink:href="#a" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<circle cx="512" cy="512" r="512" style="fill:#178a9e"/>
<path d="M706 356.3v-.3c-.3-4.3-.6-9.3-.9-14.6-.6-10-1.3-20.8-1.9-29-1-5.7-2.4-10.8-4-15.4-10.2-22.6-30.1-33.5-51.1-38.7-9.6-1.7-21.3-2-33.8-2.3H493.7c-77.7 4.2-110.3 49.2-119.1 73.1-34 101.7-55.2 233.5-70.5 328.6-.3 1.9-.6 3.7-.9 5.5l-5 45.2c-.3 7.1.4 14.9 2.3 22.4 9.5 27.6 38.3 50.8 101.7 27.7 59.9-26 130.6-58.4 203.7-94.7 41.6-24 102.6-79.2 105.8-148.9-.5-51.6-2.2-105.8-5.7-158.6zm-96.3 38.2c0 6-4.9 10.9-10.9 10.9-36.3 0-65.6 29.4-65.6 65.6v40.2c0 67.5-54.7 122.1-122.1 122.1-5.9 0-10.6-4.8-10.6-10.6v-33.3c0-6 4.9-10.9 10.9-10.9 36.3 0 65.6-29.4 65.6-65.6v-40.2c0-67.4 54.7-122.1 122.1-122.1 5.9 0 10.6 4.8 10.6 10.6v33.3z" style="fill:#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 934 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300px" height="260px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.989" fill="#6262f1" d="M 81.5,-0.5 C 112.5,-0.5 143.5,-0.5 174.5,-0.5C 169.154,3.68235 164.654,8.68235 161,14.5C 138.96,52.7486 116.793,90.9152 94.5,129C 111.174,158.016 127.84,187.016 144.5,216C 139.386,225.729 133.886,235.229 128,244.5C 121.475,251.672 113.642,256.672 104.5,259.5C 97.5,259.5 90.5,259.5 83.5,259.5C 73.8126,256.222 65.6459,250.556 59,242.5C 38.6208,208.399 18.7875,174.065 -0.5,139.5C -0.5,132.833 -0.5,126.167 -0.5,119.5C 19.3711,84.4302 39.5378,49.4302 60,14.5C 65.987,7.65895 73.1537,2.65895 81.5,-0.5 Z"/></g>
<g><path style="opacity:0.989" fill="#6262f1" d="M 193.5,-0.5 C 200.833,-0.5 208.167,-0.5 215.5,-0.5C 225.781,2.8978 234.281,8.8978 241,17.5C 260.794,51.4318 280.294,85.4318 299.5,119.5C 299.5,125.833 299.5,132.167 299.5,138.5C 279.641,173.869 259.475,209.203 239,244.5C 232.912,251.778 225.412,256.778 216.5,259.5C 185.833,259.5 155.167,259.5 124.5,259.5C 129.821,254.339 134.654,248.672 139,242.5C 160.081,205.337 181.414,168.337 203,131.5C 203.635,129.365 203.301,127.365 202,125.5C 185.781,98.2288 169.947,70.7288 154.5,43C 159.614,33.2707 165.114,23.7707 171,14.5C 177.343,7.59119 184.843,2.59119 193.5,-0.5 Z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,20 @@
<svg width="576" height="569" viewBox="0 0 576 569" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M464.493 260.334H359.255C357.022 260.334 354.236 261.878 353.078 263.765L290.011 366.435C288.854 368.323 286.969 368.313 285.812 366.435L223.411 263.786C222.264 261.898 219.488 260.344 217.255 260.344H111.526C109.293 260.344 108.473 261.838 109.723 263.675L234.392 446.992C235.641 448.819 236.655 452.129 236.655 454.33V564.377C236.655 566.577 238.489 568.383 240.722 568.383H335.255C337.488 568.383 339.322 566.577 339.322 564.377V454.33C339.322 452.129 340.346 448.819 341.586 446.992L466.285 263.675C467.535 261.848 466.715 260.344 464.482 260.344L464.493 260.334Z" fill="#3B5EDA"/>
<path d="M280.775 101.732C283.521 103.236 286.184 104.457 287.587 104.457C288.99 104.457 291.347 103.62 294.379 101.732C353.983 64.118 304.386 17.9556 287.587 0.566406C270.778 17.9556 221.181 64.118 280.775 101.732Z" fill="#3B5EDA"/>
<path d="M218.089 238.947C221.48 238.675 224.624 238.201 225.884 237.363C227.154 236.525 228.763 234.386 230.34 230.884C261.09 161.69 188.241 149.479 162.49 143.756C157.952 169.381 141.44 240.35 218.089 238.937V238.947Z" fill="#3B5EDA"/>
<path d="M120.44 223.836C123.308 222.029 125.858 220.172 126.585 218.85C127.313 217.528 127.722 214.884 127.456 211.069C121.812 135.739 51.6162 158.488 26.1416 165.3C34.2951 190.037 53.3678 260.39 120.44 223.836V223.836Z" fill="#3B5EDA"/>
<path d="M132.607 350.144C133.826 347.016 134.747 344.018 134.532 342.535C134.317 341.041 133.047 338.69 130.538 335.773C80.5514 278.509 37.8274 337.912 21.4487 358.309C42.9285 373.428 100.71 418.823 132.596 350.144H132.607Z" fill="#3B5EDA"/>
<path d="M287.578 120.822C274.426 135.446 235.615 174.241 282.242 205.86C284.393 207.122 286.472 208.151 287.578 208.151C288.684 208.151 290.518 207.445 292.895 205.86C339.532 174.241 300.73 135.436 287.578 120.822Z" fill="#3B5EDA"/>
<path d="M159.196 382.333C158.448 381.818 156.861 381.445 154.495 381.425C107.786 381.233 115.561 425.518 117.487 441.525C133.384 437.71 178.218 429.404 161.706 386.36C160.846 384.513 159.934 382.848 159.186 382.333H159.196Z" fill="#3B5EDA"/>
<path d="M282.242 306.502C284.393 307.763 286.472 308.793 287.578 308.793C288.684 308.793 290.518 308.086 292.894 306.502C339.531 274.882 300.73 236.077 287.578 221.463C274.426 236.087 235.615 274.882 282.242 306.502Z" fill="#3B5EDA"/>
<path d="M85.4788 282.937C86.9436 280.939 88.1727 278.991 88.2751 277.911C88.3776 276.831 87.8244 274.964 86.4416 272.492C58.6623 223.887 15.9587 258.494 0 270.09C13.6028 284.31 49.3517 325.87 85.4893 282.937H85.4788Z" fill="#3B5EDA"/>
<path d="M133.537 149.101C136.036 148.93 138.341 148.607 139.242 147.981C140.143 147.355 141.25 145.751 142.284 143.116C162.279 90.9288 107.939 80.8768 88.6822 76.2646C86.3468 95.6621 76.9434 149.353 133.547 149.101H133.537Z" fill="#3B5EDA"/>
<path d="M210.076 132.318C212.831 132.792 215.433 133.054 216.591 132.621C217.748 132.187 219.387 130.733 221.23 128.14C257.286 76.719 200.949 51.3166 181.262 41.1737C173.395 61.6511 148.453 117.522 210.076 132.318V132.318Z" fill="#3B5EDA"/>
<path d="M349.542 237.37C350.812 238.207 353.946 238.672 357.337 238.954C433.976 240.367 417.464 169.398 412.937 143.773C387.185 149.486 314.336 161.707 345.086 230.901C346.664 234.393 348.272 236.542 349.542 237.38V237.37Z" fill="#3B5EDA"/>
<path d="M448 211.065C447.734 214.879 448.143 217.524 448.871 218.846C449.598 220.168 452.148 222.035 455.016 223.832C522.098 260.376 541.171 190.032 549.314 165.296C523.839 158.494 453.644 135.735 448 211.065V211.065Z" fill="#3B5EDA"/>
<path d="M444.868 335.773C442.359 338.69 441.089 341.051 440.874 342.535C440.659 344.018 441.59 347.016 442.809 350.144C474.696 418.823 532.478 373.428 553.957 358.309C537.579 337.912 494.865 278.509 444.868 335.773V335.773Z" fill="#3B5EDA"/>
<path d="M420.923 381.408C418.557 381.428 416.969 381.811 416.222 382.316C415.474 382.821 414.562 384.486 413.702 386.343C397.2 429.387 442.024 437.693 457.921 441.508C459.847 425.511 467.621 381.216 420.913 381.408H420.923Z" fill="#3B5EDA"/>
<path d="M488.991 272.502C487.598 274.974 487.055 276.841 487.158 277.921C487.26 279.001 488.479 280.949 489.954 282.947C526.092 325.87 561.84 284.32 575.443 270.099C559.484 258.513 516.781 223.907 489.002 272.502H488.991Z" fill="#3B5EDA"/>
<path d="M436.185 147.981C437.086 148.596 439.391 148.919 441.89 149.101C498.493 149.353 489.091 95.6621 486.755 76.2646C467.498 80.8768 413.148 90.9389 433.153 143.116C434.177 145.751 435.283 147.365 436.195 147.981H436.185Z" fill="#3B5EDA"/>
<path d="M358.842 132.621C359.999 133.054 362.591 132.792 365.357 132.318C426.979 117.522 402.037 61.6411 394.171 41.1737C374.494 51.3166 318.156 76.719 354.202 128.14C356.046 130.733 357.684 132.187 358.842 132.621V132.621Z" fill="#3B5EDA"/>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -20,6 +20,8 @@
"codeIssuerHint": "Aussteller",
"codeSecretKeyHint": "Geheimer Schlüssel",
"codeAccountHint": "Konto (you@domain.com)",
"codeTagHint": "Tag",
"accountKeyType": "Art des Keys",
"sessionExpired": "Sitzung abgelaufen",
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
@@ -156,6 +158,7 @@
}
}
},
"invalidQRCode": "Ungültiger QR-Code",
"noRecoveryKeyTitle": "Kein Wiederherstellungsschlüssel?",
"enterEmailHint": "Geben Sie Ihre E-Mail Adresse ein",
"invalidEmailTitle": "Ungültige E-Mail Adresse",
@@ -420,5 +423,18 @@
"invalidEndpoint": "Ungültiger Endpunkt",
"invalidEndpointMessage": "Der eingegebene Endpunkt ist ungültig. Bitte geben Sie einen gültigen Endpunkt ein und versuchen Sie es erneut.",
"endpointUpdatedMessage": "Endpunkt erfolgreich aktualisiert",
"customEndpoint": "Mit {endpoint} verbunden"
"customEndpoint": "Mit {endpoint} verbunden",
"pinText": "Anpinnen",
"unpinText": "Lösen",
"pinnedCodeMessage": "{code} wurde angepinnt",
"unpinnedCodeMessage": "{code} wurde Losgelöst",
"tags": "Tags",
"createNewTag": "Neuen Tag erstellen",
"tag": "Tag",
"create": "Erstellen",
"editTag": "Tag bearbeiten",
"deleteTagTitle": "Tag löschen?",
"deleteTagMessage": "Sind Sie sicher, dass Sie diesen Code löschen wollen? Diese Aktion ist unumkehrbar.",
"somethingWentWrongParsingCode": "Wir konnten {x} Codes nicht parsen.",
"updateNotAvailable": "Update ist nicht verfügbar"
}

View File

@@ -20,6 +20,8 @@
"codeIssuerHint": "Émetteur",
"codeSecretKeyHint": "Clé secrète",
"codeAccountHint": "Compte (vous@exemple.com)",
"codeTagHint": "Tag",
"accountKeyType": "Type de clé",
"sessionExpired": "Session expirée",
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
@@ -77,12 +79,14 @@
"data": "Données",
"importCodes": "Importer les codes",
"importTypePlainText": "Texte brut",
"importTypeEnteEncrypted": "Export chiffré Ente",
"passwordForDecryptingExport": "Mot de passe pour déchiffrer l'exportation",
"passwordEmptyError": "Le mot de passe ne peut pas être vide",
"importFromApp": "Importer des codes depuis {appName}",
"importGoogleAuthGuide": "Exportez vos comptes depuis Google Authenticator vers un code QR en utilisant l'option \"Transférer des comptes\". Ensuite, en utilisant un autre appareil, scannez le code QR.\n\nAstuce : Vous pouvez utiliser la webcam de votre ordinateur portable pour prendre une photo du code QR.",
"importSelectJsonFile": "Sélectionnez un fichier JSON",
"importSelectAppExport": "Sélectionnez le fichier d'exportation {appName}",
"importEnteEncGuide": "Sélectionnez le fichier chiffré JSON exporté depuis Ente",
"importRaivoGuide": "Utilisez l'option \"Exporter les OTPs vers l'archive Zip\" dans les paramètres de Raivo.\n\nExtrayez le fichier zip et importez le fichier JSON.",
"importBitwardenGuide": "Utilisez l'option « Exporter le coffre » dans les outils Bitwarden et importez le fichier JSON non chiffré.",
"importAegisGuide": "Utilisez l'option \"Exporter le coffre-fort\" dans les paramètres d'Aegis.\n\nSi votre coffre-fort est crypté, vous devrez saisir le mot de passe du coffre-fort pour déchiffrer le coffre-fort.",
@@ -112,18 +116,22 @@
"copied": "Copié",
"pleaseTryAgain": "Veuillez réessayer",
"existingUser": "Utilisateur existant",
"newUser": "Nouveau dans Ente",
"delete": "Supprimer",
"enterYourPasswordHint": "Saisir votre mot de passe",
"forgotPassword": "Mot de passe oublié",
"oops": "Oups",
"suggestFeatures": "Suggérer des fonctionnalités",
"faq": "FAQ",
"faq_q_1": "Quelle est la sécurité de Auth?",
"faq_a_1": "Tous les codes que vous sauvegardez via ente sont chiffrés de bout en bout. Cela signifie que vous seul pouvez accéder à vos codes. Nos applications sont open source et notre cryptographie ont fait l'objet d'un audit externe.",
"faq_q_2": "Puis-je accéder à mes codes sur mon ordinateur ?",
"faq_a_2": "Vous pouvez accéder à vos codes sur le web via auth.ente.io.",
"faq_q_3": "Comment puis-je supprimer des codes ?",
"faq_a_3": "Vous pouvez supprimer un code en glissant vers la gauche.",
"faq_q_4": "Comment puis-je soutenir le projet ?",
"faq_a_4": "Vous pouvez soutenir le développement de ce projet en vous abonnant à notre application Photos, ente.io.",
"faq_q_5": "Comment puis-je activer le verrouillage FaceID dans Auth",
"faq_a_5": "Vous pouvez activer le verrouillage FaceID dans Paramètres → Sécurité → Écran de verrouillage.",
"somethingWentWrongMessage": "Quelque chose s'est mal passé, veuillez recommencer",
"leaveFamily": "Quitter le plan familial",
@@ -150,6 +158,7 @@
}
}
},
"invalidQRCode": "QR code non valide",
"noRecoveryKeyTitle": "Pas de clé de récupération ?",
"enterEmailHint": "Entrez votre adresse e-mail",
"invalidEmailTitle": "Adresse e-mail invalide",
@@ -343,6 +352,7 @@
"deleteCodeAuthMessage": "Authentification requise pour supprimer le code",
"showQRAuthMessage": "Authentification requise pour afficher le code QR",
"confirmAccountDeleteTitle": "Confirmer la suppression du compte",
"confirmAccountDeleteMessage": "Ce compte est lié à d'autres applications ente, si vous en utilisez une.\n\nVos données téléchargées, dans toutes les applications ente, seront planifiées pour suppression, et votre compte sera définitivement supprimé.",
"androidBiometricHint": "Vérifier lidentité",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
@@ -413,5 +423,18 @@
"invalidEndpoint": "Point de terminaison non valide",
"invalidEndpointMessage": "Désolé, le point de terminaison que vous avez entré n'est pas valide. Veuillez en entrer un valide puis réessayez.",
"endpointUpdatedMessage": "Point de terminaison mis à jour avec succès",
"customEndpoint": "Connecté à {endpoint}"
"customEndpoint": "Connecté à {endpoint}",
"pinText": "Épingler",
"unpinText": "Désépingler",
"pinnedCodeMessage": "{code} a été épinglé",
"unpinnedCodeMessage": "{code} a été désépinglé",
"tags": "Tags",
"createNewTag": "Créer un nouveau tag",
"tag": "Tag",
"create": "Créer",
"editTag": "Modifier le tag",
"deleteTagTitle": "Supprimer le tag ?",
"deleteTagMessage": "Êtes-vous sûr de vouloir supprimer ce tag ? Cette action est irréversible.",
"somethingWentWrongParsingCode": "Impossible d'analyser les codes {x}.",
"updateNotAvailable": "Mise à jour non disponible"
}

View File

@@ -7,7 +7,7 @@
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "Proteja seus códigos 2FA",
"onBoardingGetStarted": "Vamos Começar",
"onBoardingGetStarted": "Introdução",
"setupFirstAccount": "Configure sua primeira conta",
"importScanQrCode": "Escanear QR code",
"qrCode": "QR Code",
@@ -31,13 +31,13 @@
"timeBasedKeyType": "Baseado no horário (TOTP)",
"counterBasedKeyType": "Baseado em um contador (HOTP)",
"saveAction": "Salvar",
"nextTotpTitle": "próximo",
"deleteCodeTitle": "Excluir código?",
"nextTotpTitle": "avançar",
"deleteCodeTitle": "Apagar código?",
"deleteCodeMessage": "Tem certeza de que deseja excluir este código? Esta ação é irreversível.",
"viewLogsAction": "Ver logs",
"sendLogsDescription": "Isto irá compartilhar seus logs para nos ajudar a depurar seu problema. Embora tomemos precauções para garantir que informações sensíveis não sejam enviadas, encorajamos você a ver esses logs antes de compartilhá-los.",
"preparingLogsTitle": "Preparando logs...",
"emailLogsTitle": "Logs por e-mail",
"emailLogsTitle": "Logs (e-mail)",
"emailLogsMessage": "Por favor, envie os logs para {email}",
"@emailLogsMessage": {
"placeholders": {
@@ -48,9 +48,9 @@
},
"copyEmailAction": "Copiar e-mail",
"exportLogsAction": "Exportar logs",
"reportABug": "Reportar um problema",
"reportABug": "Informar um problema",
"crashAndErrorReporting": "Reporte de erros e falhas",
"reportBug": "Reportar problema",
"reportBug": "Informar problema",
"emailUsMessage": "Por favor, envie um e-mail para {email}",
"@emailUsMessage": {
"placeholders": {
@@ -105,14 +105,14 @@
"authToChangeYourPassword": "Por favor, autentique-se para alterar sua senha",
"authToViewSecrets": "Por favor, autentique-se para ver as suas chaves secretas",
"authToInitiateSignIn": "Por favor, autentique-se para iniciar o login para um backup.",
"ok": "Ok",
"ok": "OK",
"cancel": "Cancelar",
"yes": "Sim",
"no": "Não",
"email": "E-mail",
"support": "Suporte",
"general": "Geral",
"settings": "Configurações",
"settings": "Ajustes",
"copied": "Copiado",
"pleaseTryAgain": "Por favor, tente novamente",
"existingUser": "Usuário Existente",
@@ -120,7 +120,7 @@
"delete": "Excluir",
"enterYourPasswordHint": "Insira sua senha",
"forgotPassword": "Esqueci a senha",
"oops": "Oops",
"oops": "Opa",
"suggestFeatures": "Sugerir funcionalidades",
"faq": "Perguntas frequentes",
"faq_q_1": "Quão seguro é o Auth?",
@@ -139,7 +139,7 @@
"inFamilyPlanMessage": "Você está em um plano familiar!",
"swipeHint": "Deslize para a esquerda para editar ou remover os códigos",
"scan": "Escanear",
"scanACode": "Escanear um código",
"scanACode": "Escanear código",
"verify": "Verificar",
"verifyEmail": "Verificar e-mail",
"enterCodeHint": "Digite o código de 6 dígitos de\nseu aplicativo autenticador",
@@ -185,7 +185,7 @@
"lockScreenEnablePreSteps": "Para ativar o bloqueio de tela, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.",
"viewActiveSessions": "Ver sessões ativas",
"authToViewYourActiveSessions": "Por favor, autentique-se para ver as sessões ativas",
"searchHint": "Pesquisar...",
"searchHint": "Buscar...",
"search": "Pesquisar",
"sorryUnableToGenCode": "Desculpe, não foi possível gerar um código para {issuerName}",
"noResult": "Nenhum resultado",
@@ -239,10 +239,10 @@
"howItWorks": "Como funciona",
"ackPasswordLostWarning": "Eu entendo que se eu perder minha senha, posso perder meus dados, já que meus dados são <underline>criptografados de ponta a ponta</underline>.",
"loginTerms": "Ao clicar em login, eu concordo com os <u-terms>termos de serviço</u-terms> e a <u-policy>política de privacidade</u-policy>",
"logInLabel": "Login",
"logout": "Encerrar sessão",
"logInLabel": "Entrar",
"logout": "Sair",
"areYouSureYouWantToLogout": "Você tem certeza que deseja encerrar a sessão?",
"yesLogout": "Sim, encerrar sessão",
"yesLogout": "Sim, sair",
"exit": "Sair",
"verifyingRecoveryKey": "Verificando chave de recuperação...",
"recoveryKeyVerified": "Chave de recuperação verificada",
@@ -282,7 +282,7 @@
"description": "Text for the button to confirm the user understands the warning"
},
"authToExportCodes": "Por favor, autentique-se para exportar seus códigos",
"importSuccessTitle": "Yay!",
"importSuccessTitle": "Oba!",
"importSuccessDesc": "Você importou {count} códigos!",
"@importSuccessDesc": {
"placeholders": {
@@ -317,7 +317,7 @@
"thisWillLogYouOutOfTheFollowingDevice": "Isso fará com que você saia do seguinte dispositivo:",
"terminateSession": "Encerrar sessão?",
"terminate": "Encerrar",
"thisDevice": "Este dispositivo",
"thisDevice": "Esse dispositivo",
"toResetVerifyEmail": "Para redefinir a sua senha, por favor verifique o seu email primeiro.",
"thisEmailIsAlreadyInUse": "Este e-mail já está em uso",
"verificationFailedPleaseTryAgain": "Falha na verificação. Por favor, tente novamente",
@@ -339,7 +339,7 @@
"export": "Exportar",
"useOffline": "Usar sem backups",
"signInToBackup": "Entre para fazer backup de seus códigos",
"singIn": "Iniciar sessão",
"singIn": "Entrar",
"sigInBackupReminder": "Por favor, exporte seus códigos para garantir que você tenha um backup do qual você possa restaurar.",
"offlineModeWarning": "Você escolheu prosseguir sem backups. Por favor, faça backups manuais para ter certeza de que seus códigos estão seguros.",
"showLargeIcons": "Mostrar ícones grandes",
@@ -361,7 +361,7 @@
"@androidBiometricNotRecognized": {
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
},
"androidBiometricSuccess": "Bem-sucedido",
"androidBiometricSuccess": "Êxito",
"@androidBiometricSuccess": {
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
},
@@ -401,7 +401,7 @@
"@iOSGoToSettingsDescription": {
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
},
"iOSOkButton": "Ok",
"iOSOkButton": "OK",
"@iOSOkButton": {
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
},
@@ -425,13 +425,15 @@
"endpointUpdatedMessage": "Endpoint atualizado com sucesso",
"customEndpoint": "Conectado a {endpoint}",
"pinText": "Fixar",
"unpinText": "Desafixar",
"pinnedCodeMessage": "{code} foi fixado",
"unpinnedCodeMessage": "{code} foi desafixado",
"tags": "Etiquetas",
"createNewTag": "Criar etiqueta",
"tag": "Etiqueta",
"create": "Criar",
"editTag": "Editar etiqueta",
"deleteTagTitle": "Excluir etiqueta?",
"deleteTagTitle": "Apagar etiqueta?",
"deleteTagMessage": "Tem certeza de que deseja excluir esta etiqueta? Essa ação é irreversível.",
"somethingWentWrongParsingCode": "Não foi possível analisar os códigos {x}.",
"updateNotAvailable": "Atualização não está disponível"

View File

@@ -20,6 +20,8 @@
"codeIssuerHint": "Эмитент",
"codeSecretKeyHint": "Секретный ключ",
"codeAccountHint": "Аккаунт (you@domain.com)",
"codeTagHint": "Метка",
"accountKeyType": "Тип ключа",
"sessionExpired": "Сеанс истек",
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
@@ -77,16 +79,19 @@
"data": "Данные",
"importCodes": "Импортировать коды",
"importTypePlainText": "Обычный текст",
"importTypeEnteEncrypted": "Ente Зашифрованный экспорт",
"passwordForDecryptingExport": "Пароль для расшифровки экспорта",
"passwordEmptyError": "Пароль не может быть пустым",
"importFromApp": "Импорт кодов из {appName}",
"importGoogleAuthGuide": "Экспортируйте учетные записи из Google Authenticator в QR-код, используя опцию «Перенести учетные записи». Затем с помощью другого устройства отсканируйте QR-код.\n\nСовет: Чтобы сфотографировать QR-код, можно воспользоваться веб-камерой ноутбука.",
"importSelectJsonFile": "Выбрать JSON-файл",
"importSelectAppExport": "Выбрать файл экспорта {appName}",
"importEnteEncGuide": "Выберите зашифрованный JSON файл, экспортированный из Ente",
"importRaivoGuide": "Используйте опцию «Export OTPs to Zip archive» в настройках Raivo.\n\nРаспакуйте zip-архив и импортируйте JSON-файл.",
"importBitwardenGuide": "Используйте опцию \"Экспортировать хранилище\" в Bitwarden Tools и импортируйте незашифрованный JSON файл.",
"importAegisGuide": "Используйте опцию «Экспортировать хранилище» в настройках Aegis.\n\nЕсли ваше хранилище зашифровано, то для его расшифровки потребуется ввести пароль хранилища.",
"import2FasGuide": "Используйте опцию \"Settings->Backup -Export\" в 2FAS.\n\nЕсли ваша резервная копия зашифрована, то для расшифровки резервной копии необходимо ввести пароль",
"importLastpassGuide": "Используйте опцию \"Перенести аккаунты\" в настройках Lastpass Authenticator и нажмите на \"Экспортировать учетные записи в файл\". Импортируйте загружённый JSON файл.",
"exportCodes": "Экспортировать коды",
"importLabel": "Импорт",
"importInstruction": "Пожалуйста, выберите файл, содержащий список ваших кодов в следующем формате",
@@ -99,6 +104,7 @@
"authToChangeYourEmail": "Пожалуйста, авторизуйтесь, чтобы изменить адрес электронной почты",
"authToChangeYourPassword": "Пожалуйста, авторизуйтесь, чтобы изменить пароль",
"authToViewSecrets": "Пожалуйста, авторизуйтесь для просмотра ваших секретов",
"authToInitiateSignIn": "Пожалуйста, авторизуйтесь, чтобы начать вход для резервного копирования.",
"ok": "Ок",
"cancel": "Отменить",
"yes": "Да",
@@ -110,18 +116,22 @@
"copied": "Скопировано",
"pleaseTryAgain": "Пожалуйста, попробуйте ещё раз",
"existingUser": "Существующий пользователь",
"newUser": "Впервые здесь, в Ente",
"delete": "Удалить",
"enterYourPasswordHint": "Введите пароль",
"forgotPassword": "Забыл пароль",
"oops": "Ой",
"suggestFeatures": "Предложить идеи",
"faq": "FAQ",
"faq_q_1": "Насколько безопасен Auth?",
"faq_a_1": "Все коды, которые вы резервируете с помощью Auth, хранятся в зашифрованном виде. Это означает, что только вы можете получить доступ к своим кодам. Наши приложения имеют открытый исходный код, а наша криптография прошла внешний аудит.",
"faq_q_2": "Могу ли я получить доступ к моим кодам на компьютере?",
"faq_a_2": "Вы можете получить доступ к своим кодам на сайте @ auth.ente.io.",
"faq_q_3": "Как я могу удалить коды?",
"faq_a_3": "Вы можете удалить код, проведя пальцем влево по этому элементу.",
"faq_q_4": "Как я могу поддержать этот проект?",
"faq_a_4": "Вы можете поддержать развитие этого проекта, подписавшись на наше приложение Photos @ ente.io.",
"faq_q_5": "Как мне включить FaceID в Auth",
"faq_a_5": "Вы можете включить блокировку FaceID в Настройки → Безопасность → Экран блокировки.",
"somethingWentWrongMessage": "Что-то пошло не так. Попробуйте еще раз",
"leaveFamily": "Покинуть семью",
@@ -135,6 +145,8 @@
"enterCodeHint": "Введите 6-значный код из\nвашего приложения-аутентификатора",
"lostDeviceTitle": "Потеряно устройство?",
"twoFactorAuthTitle": "Двухфакторная аутентификация",
"passkeyAuthTitle": "Проверка с помощью пароля",
"verifyPasskey": "Подтвердить пароль",
"recoverAccount": "Восстановить аккаунт",
"enterRecoveryKeyHint": "Введите свой ключ восстановления",
"recover": "Восстановить",
@@ -146,6 +158,7 @@
}
}
},
"invalidQRCode": "Неверный QR-код",
"noRecoveryKeyTitle": "Нет ключа восстановления?",
"enterEmailHint": "Введите свою почту",
"invalidEmailTitle": "Неверный адрес электронной почты",
@@ -190,6 +203,8 @@
"saveKey": "Сохранить ключ",
"save": "Сохранить",
"send": "Отправить",
"saveOrSendDescription": "Вы хотите сохранить это в хранилище (папку загрузок по умолчанию) или отправить в другие приложения?",
"saveOnlyDescription": "Вы хотите сохранить это в хранилище (по умолчанию папка загрузок)?",
"back": "Вернуться",
"createAccount": "Создать аккаунт",
"passwordStrength": "Мощность пароля: {passwordStrengthValue}",
@@ -337,6 +352,7 @@
"deleteCodeAuthMessage": "Аутентификация для удаления кода",
"showQRAuthMessage": "Аутентификация для отображения QR-кода",
"confirmAccountDeleteTitle": "Подтвердить удаление аккаунта",
"confirmAccountDeleteMessage": "Эта учетная запись связана с другими приложениями Ente, если вы ими пользуетесь.\n\nЗагруженные вами данные во всех приложениях ente будут запланированы к удалению, а ваша учетная запись будет удалена без возможности восстановления.",
"androidBiometricHint": "Подтвердите личность",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
@@ -397,12 +413,28 @@
"doNotSignOut": "Не выходить",
"hearUsWhereTitle": "Как вы узнали о Ente? (необязательно)",
"hearUsExplanation": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения",
"recoveryKeySaved": "Ключ восстановления сохранён в папке Загрузки!",
"waitingForBrowserRequest": "Ожидание запроса браузера...",
"waitingForVerification": "Ожидание подтверждения...",
"passkey": "Ключ",
"developerSettingsWarning": "Вы уверены, что хотите изменить настройки разработчика?",
"developerSettings": "Настройки разработчика",
"serverEndpoint": "Конечная точка сервера",
"invalidEndpoint": "Неверная конечная точка",
"invalidEndpointMessage": "Извините, введенная вами конечная точка неверна. Пожалуйста, введите корректную конечную точку и повторите попытку.",
"endpointUpdatedMessage": "Конечная точка успешно обновлена",
"customEndpoint": "Подключено к {endpoint}"
"customEndpoint": "Подключено к {endpoint}",
"pinText": "Прикрепить",
"unpinText": "Открепить",
"pinnedCodeMessage": "{code} прикреплен",
"unpinnedCodeMessage": "{code} откреплен",
"tags": "Метки",
"createNewTag": "Создать новую метку",
"tag": "Метка",
"create": "Создать",
"editTag": "Изменить метку",
"deleteTagTitle": "Удалить метку?",
"deleteTagMessage": "Вы уверены, что хотите удалить эту метку? Это действие необратимо.",
"somethingWentWrongParsingCode": "Мы не смогли разобрать коды {x}.",
"updateNotAvailable": "Обновление недоступно"
}

View File

@@ -61,6 +61,7 @@
"welcomeBack": "Välkommen tillbaka!",
"changePassword": "Ändra lösenord",
"importCodes": "Importera koder",
"exportCodes": "Exportera koder",
"cancel": "Avbryt",
"yes": "Ja",
"no": "Nej",
@@ -76,6 +77,7 @@
"scan": "Skanna",
"twoFactorAuthTitle": "Tvåfaktorsautentisering",
"enterRecoveryKeyHint": "Ange din återställningsnyckel",
"invalidQRCode": "Ogiltig QR-kod",
"noRecoveryKeyTitle": "Ingen återställningsnyckel?",
"enterEmailHint": "Ange din e-postadress",
"invalidEmailTitle": "Ogiltig e-postadress",
@@ -143,6 +145,8 @@
},
"pendingSyncs": "Varning",
"activeSessions": "Aktiva sessioner",
"incorrectCode": "Felaktig kod",
"incorrectRecoveryKey": "Felaktig återställningsnyckel",
"enterPassword": "Ange lösenord",
"export": "Exportera",
"singIn": "Logga in",

View File

@@ -20,6 +20,8 @@
"codeIssuerHint": "Yayınlayan",
"codeSecretKeyHint": "Gizli Anahtar",
"codeAccountHint": "Hesap (ornek@domain.com)",
"codeTagHint": "Etiket",
"accountKeyType": "Anahtar türü",
"sessionExpired": "Oturum süresi doldu",
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
@@ -46,7 +48,7 @@
},
"copyEmailAction": "E-postayı Kopyala",
"exportLogsAction": "Günlüğü dışa aktar",
"reportABug": "Bir hata bildir",
"reportABug": "Hata bildirin",
"crashAndErrorReporting": "Çökme ve hata bildirimi",
"reportBug": "Hata bildir",
"emailUsMessage": "Lütfen bize {email} adresinden ulaşın",
@@ -77,12 +79,14 @@
"data": "Veri",
"importCodes": "Kodu içe aktar",
"importTypePlainText": "Salt metin",
"importTypeEnteEncrypted": "Ente Şifreli dışa aktarma",
"passwordForDecryptingExport": "Dışa aktarımın şifresini çözmek için parola",
"passwordEmptyError": "Şifre boş olamaz",
"importFromApp": "Kodları {appName} uygulamasından içe aktarın",
"importGoogleAuthGuide": "\"Hesapları Aktar\" seçeneğini kullanarak hesaplarınızı Google Authenticator'dan bir QR koduna aktarın. Ardından başka bir cihaz kullanarak QR kodunu tarayın.\n\nİpucu: QR kodunun fotoğrafını çekmek için dizüstü bilgisayarınızın kamerasını kullanabilirsiniz.",
"importSelectJsonFile": "JSON dosyasını seçin",
"importSelectAppExport": "{appName} dışarı aktarma dosyasını seçin",
"importEnteEncGuide": "Ente'den dışa aktarılan şifrelenmiş JSON dosyasını seçin",
"importRaivoGuide": "Raivo'nun ayarlarında \"OTP'leri Zip arşivine aktar\" seçeneğini kullanın.\n\nZip dosyasını çıkarın ve JSON dosyasını içe aktarın.",
"importBitwardenGuide": "Bitwarden Tools içindeki \"Kasayı dışa aktar\" seçeneğini kullanın ve şifrelenmemiş JSON dosyasını içe aktarın.",
"importAegisGuide": "Aegis'in Ayarlarında \"Kasayı dışa aktar\" seçeneğini kullanın.\n\nKasanız şifrelenmişse, kasanın şifresini çözmek için kasa parolasını girmeniz gerekecektir.",
@@ -112,18 +116,22 @@
"copied": "Kopyalandı",
"pleaseTryAgain": "Lütfen tekrar deneyin",
"existingUser": "Mevcut kullanıcı",
"newUser": "Ente'de Yeni",
"delete": "Sil",
"enterYourPasswordHint": "Parolanızı girin",
"forgotPassword": "Şifremi unuttum",
"oops": "Hay aksi",
"suggestFeatures": "Özellik önerin",
"faq": "SSS",
"faq_q_1": "Kimlik doğrulayıcı ne kadar güvenli?",
"faq_a_1": "Auth aracılığıyla yedeklediğiniz tüm kodlar uçtan uca şifrelenmiş olarak saklanır. Böylece kodlarınıza yalnızca siz erişebilirsiniz. Uygulamalarımız açık kaynaklıdır ve şifrelememiz dış denetimden geçmiştir.",
"faq_q_2": "Kodlarıma masaüstünden erişebilir miyim?",
"faq_a_2": "Kodlarınıza internet üzerinden @ auth.ente.io adresinden erişebilirsiniz.",
"faq_q_3": "Kodları nasıl silebilirim?",
"faq_a_3": "Bir kodu, o öğenin üzerinde sola kaydırarak silebilirsiniz.",
"faq_q_4": "Bu projeye nasıl destek olabilirim?",
"faq_a_4": "Fotoğraflar uygulamamıza @ ente.io abone olarak bu projenin geliştirilmesine destek olabilirsiniz.",
"faq_q_5": "Auth'ta FaceID kilidini nasıl etkinleştirebilirim",
"faq_a_5": "FaceID kilidini Ayarlar → Güvenlik → Kilit Ekranı altında etkinleştirebilirsiniz.",
"somethingWentWrongMessage": "Bir şeyler ters gitti, lütfen tekrar deneyin",
"leaveFamily": "Aile planından ayrıl",
@@ -137,6 +145,8 @@
"enterCodeHint": "Kimlik doğrulayıcı uygulamanızdaki 6 haneli doğrulama kodunu girin",
"lostDeviceTitle": "Cihazınızı mı kaybettiniz?",
"twoFactorAuthTitle": "İki faktörlü kimlik doğrulama",
"passkeyAuthTitle": "Geçiş anahtarı doğrulaması",
"verifyPasskey": "Geçiş anahtarını doğrula",
"recoverAccount": "Hesap kurtarma",
"enterRecoveryKeyHint": "Kurtarma anahtarınızı girin",
"recover": "Kurtar",
@@ -148,6 +158,7 @@
}
}
},
"invalidQRCode": "Geçersiz QR kodu",
"noRecoveryKeyTitle": "Kurtarma anahtarınız yok mu?",
"enterEmailHint": "E-posta adresinizi girin",
"invalidEmailTitle": "Geçersiz e-posta adresi",
@@ -190,6 +201,10 @@
"recoveryKeySaveDescription": "Biz bu anahtarı saklamıyoruz, lütfen. bu 24 kelimelik anahtarı güvenli bir yerde saklayın.",
"doThisLater": "Bunu daha sonra yap",
"saveKey": "Anahtarı kaydet",
"save": "Kaydet",
"send": "Gönder",
"saveOrSendDescription": "Bunu belleğinize mi kaydedeceksiniz (İndirilenler klasörü varsayılandır) yoksa diğer uygulamalara mı göndereceksiniz?",
"saveOnlyDescription": "Bunu belleğinize kaydetmek ister misiniz? (İndirilenler klasörü varsayılandır)",
"back": "Geri",
"createAccount": "Hesap oluştur",
"passwordStrength": "Şifre gücü: {passwordStrengthValue}",
@@ -337,6 +352,7 @@
"deleteCodeAuthMessage": "Kodu silmek için doğrulama yapın",
"showQRAuthMessage": "QR kodunu göstermek için doğrulama yapın",
"confirmAccountDeleteTitle": "Hesap silme işlemini onayla",
"confirmAccountDeleteMessage": "Kullandığınız Ente uygulamaları varsa bu hesap diğer Ente uygulamalarıyla bağlantılıdır.\n\nTüm Ente uygulamalarına yüklediğiniz veriler ve hesabınız kalıcı olarak silinecektir.",
"androidBiometricHint": "Kimliği doğrula",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
@@ -396,5 +412,29 @@
"signOutOtherDevices": "Diğer cihazlardan çıkış yap",
"doNotSignOut": "Çıkış yapma",
"hearUsWhereTitle": "Ente'yi nereden duydunuz? (opsiyonel)",
"hearUsExplanation": "Biz uygulama kurulumlarını takip etmiyoruz. Bizi nereden duyduğunuzdan bahsetmeniz bize çok yardımcı olacak!"
"hearUsExplanation": "Biz uygulama kurulumlarını takip etmiyoruz. Bizi nereden duyduğunuzdan bahsetmeniz bize çok yardımcı olacak!",
"recoveryKeySaved": "Kurtarma anahtarı İndirilenler klasörüne kaydedildi!",
"waitingForBrowserRequest": "Tarayıcı isteği bekleniyor...",
"waitingForVerification": "Doğrulama bekleniyor...",
"passkey": "Geçiş anahtarı",
"developerSettingsWarning": "Geliştirici ayarlarını değiştirmekten emin misiniz?",
"developerSettings": "Geliştirici ayarları",
"serverEndpoint": "Sunucu uç noktası",
"invalidEndpoint": "Geçersiz uç nokta",
"invalidEndpointMessage": "Üzgünüz, girdiğiniz uç nokta geçersiz. Lütfen geçerli bir uç nokta girin ve tekrar deneyin.",
"endpointUpdatedMessage": "Uç nokta başarıyla güncellendi",
"customEndpoint": "Bağlandı: {endpoint}",
"pinText": "Sabitle",
"unpinText": "Sabitlemeyi kaldır",
"pinnedCodeMessage": "{code} sabitlendi",
"unpinnedCodeMessage": "{code} sabitlemesi kaldırıldı",
"tags": "Etiketler",
"createNewTag": "Yeni etiket oluştur",
"tag": "Etiket",
"create": "Oluştur",
"editTag": "Etiketi düzenle",
"deleteTagTitle": "Etiket silinsin mi?",
"deleteTagMessage": "Bu etiketi silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
"somethingWentWrongParsingCode": "{x} kodu ayrıştıramadık.",
"updateNotAvailable": "Güncelleme mevcut değil"
}

View File

@@ -6,6 +6,7 @@ import 'dart:typed_data';
import 'package:convert/convert.dart';
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/models/code.dart';
import 'package:ente_auth/models/code_display.dart';
import 'package:ente_auth/services/authenticator_service.dart';
import 'package:ente_auth/store/code_store.dart';
import 'package:ente_auth/ui/common/progress_dialog.dart';
@@ -76,7 +77,7 @@ Future<void> _pickAegisJsonFile(BuildContext context) async {
await showErrorDialog(
context,
context.l10n.sorry,
context.l10n.importFailureDesc,
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
);
}
}
@@ -126,8 +127,19 @@ Future<int?> _processAegisExportFile(
} else {
aegisDB = decodedJson['db'];
}
final Map<String, String> groupIDToName = {};
try {
for (var item in aegisDB?['groups']) {
groupIDToName[item['uuid']] = item['name'];
}
} catch (e) {
Logger("AegisImport").warning("Failed to parse groups", e);
}
final parsedCodes = [];
for (var item in aegisDB?['entries']) {
bool isFavorite = item['favorite'] ?? false;
List<String> tags = [];
var kind = item['type'];
var account = item['name'];
var issuer = item['issuer'];
@@ -137,20 +149,27 @@ Future<int?> _processAegisExportFile(
var digits = item['info']['digits'];
var counter = item['info']['counter'];
for (var group in item['groups']) {
if (groupIDToName.containsKey(group)) {
tags.add(groupIDToName[group]!);
}
}
// Build the OTP URL
String otpUrl;
if (kind.toLowerCase() == 'totp') {
if (kind.toLowerCase() == 'totp' || kind.toLowerCase() == 'steam') {
otpUrl =
'otpauth://$kind/$issuer:$account?secret=$secret&issuer=$issuer&algorithm=$algorithm&digits=$digits&period=$timer';
} else if (kind.toLowerCase() == 'hotp') {
otpUrl =
'otpauth://$kind/$issuer:$account?secret=$secret&issuer=$issuer&algorithm=$algorithm&digits=$digits&counter=$counter';
} else {
throw Exception('Invalid OTP type');
throw Exception('Invalid OTP type: $kind');
}
parsedCodes.add(Code.fromOTPAuthUrl(otpUrl));
Code code = Code.fromOTPAuthUrl(otpUrl);
code = code.copyWith(display: CodeDisplay(pinned: isFavorite, tags: tags));
parsedCodes.add(code);
}
for (final code in parsedCodes) {

View File

@@ -4,6 +4,7 @@ import 'dart:io';
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/models/code.dart';
import 'package:ente_auth/models/code_display.dart';
import 'package:ente_auth/services/authenticator_service.dart';
import 'package:ente_auth/store/code_store.dart';
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
@@ -14,6 +15,7 @@ import 'package:ente_auth/utils/dialog_util.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
Future<void> showBitwardenImportInstruction(BuildContext context) async {
final l10n = context.l10n;
@@ -60,12 +62,13 @@ Future<void> _pickBitwardenJsonFile(BuildContext context) async {
if (count != null) {
await importSuccessDialog(context, count);
}
} catch (e) {
} catch (e, s) {
Logger("BitwardenImport").severe('Failed to import', e, s);
await progressDialog.hide();
await showErrorDialog(
context,
context.l10n.sorry,
context.l10n.importFailureDesc,
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
);
}
}
@@ -78,19 +81,36 @@ Future<int?> _processBitwardenExportFile(
final jsonString = await file.readAsString();
final data = jsonDecode(jsonString);
List<dynamic> jsonArray = data['items'];
final Map<String, String> folderIdToName = {};
try {
for (var item in data['folders']) {
folderIdToName[item['id']] = item['name'];
}
} catch (e) {
debugPrint("Failed to get folder details $e");
}
final parsedCodes = [];
for (var item in jsonArray) {
if (item['login'] != null && item['login']['totp'] != null) {
var totp = item['login']['totp'];
String? folderID = item['folderId'];
Code code;
if (totp.contains("otpauth://")) {
code = Code.fromOTPAuthUrl(totp);
} else if (totp.contains("steam://")) {
var secret = totp.split("steam://")[1];
code = Code.fromAccountAndSecret(
Type.steam,
item['login']['username'],
item['name'],
secret,
null,
Code.steamDigits,
);
} else {
var issuer = item['name'];
var account = item['login']['username'];
code = Code.fromAccountAndSecret(
Type.totp,
account,
@@ -100,6 +120,11 @@ Future<int?> _processBitwardenExportFile(
Code.defaultDigits,
);
}
if (folderID != null && folderIdToName.containsKey(folderID)) {
code = code.copyWith(
display: CodeDisplay(tags: [folderIdToName[folderID]!]),
);
}
parsedCodes.add(code);
}

View File

@@ -14,6 +14,7 @@ import 'package:ente_auth/utils/dialog_util.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
Future<void> showLastpassImportInstruction(BuildContext context) async {
final l10n = context.l10n;
@@ -60,12 +61,13 @@ Future<void> _pickLastpassJsonFile(BuildContext context) async {
if (count != null) {
await importSuccessDialog(context, count);
}
} catch (e) {
} catch (e, s) {
Logger('LastPassImport').severe('exception while processing import', e, s);
await progressDialog.hide();
await showErrorDialog(
context,
context.l10n.sorry,
context.l10n.importFailureDesc,
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
);
}
}

View File

@@ -14,6 +14,7 @@ import 'package:ente_auth/utils/dialog_util.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
Future<void> showRaivoImportInstruction(BuildContext context) async {
final l10n = context.l10n;
@@ -60,12 +61,13 @@ Future<void> _pickRaivoJsonFile(BuildContext context) async {
if (count != null) {
await importSuccessDialog(context, count);
}
} catch (e) {
} catch (e, s) {
Logger("RaivoImport").severe('Failed to import', e, s);
await progressDialog.hide();
await showErrorDialog(
context,
context.l10n.sorry,
context.l10n.importFailureDesc,
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
);
}
}

View File

@@ -72,7 +72,7 @@ Future<void> _pick2FasFile(BuildContext context) async {
await showErrorDialog(
context,
context.l10n.sorry,
context.l10n.importFailureDesc,
"${context.l10n.importFailureDesc}\n Error: ${e.toString()}",
);
}
}

View File

@@ -4,7 +4,7 @@ import 'package:otp/otp.dart' as otp;
import 'package:steam_totp/steam_totp.dart';
String getOTP(Code code) {
if (code.type == Type.steam) {
if (code.type == Type.steam || code.issuer.toLowerCase() == 'steam') {
return _getSteamCode(code);
}
if (code.type == Type.hotp) {
@@ -39,7 +39,7 @@ String _getSteamCode(Code code, [bool isNext = false]) {
}
String getNextTotp(Code code) {
if (code.type == Type.steam) {
if (code.type == Type.steam || code.issuer.toLowerCase() == 'steam') {
return _getSteamCode(code, true);
}
return otp.OTP.generateTOTPCodeString(

View File

@@ -1,6 +1,6 @@
name: ente_auth
description: ente two-factor authenticator
version: 3.0.4+304
version: 3.0.7+307
publish_to: none
environment:

View File

@@ -113,3 +113,23 @@ func DecryptChaChaBase64(data string, key []byte, nonce string) (string, []byte,
}
return base64.StdEncoding.EncodeToString(decryptedData), decryptedData, nil
}
func DecryptChaChaBase64Auth(data string, key []byte, nonce string) (string, []byte, error) {
// Decode data from base64
dataBytes, err := base64.StdEncoding.DecodeString(data)
if err != nil {
// 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)
if err != nil {
return "", nil, fmt.Errorf("invalid nonce: %v", err)
}
// Decrypt data
decryptedData, err := decryptChaCha20poly1305V2(dataBytes, key, nonceBytes)
if err != nil {
return "", nil, fmt.Errorf("failed to decrypt data: %v", err)
}
return base64.StdEncoding.EncodeToString(decryptedData), decryptedData, nil
}

View File

@@ -88,6 +88,23 @@ func decryptChaCha20poly1305(data []byte, key []byte, nonce []byte) ([]byte, err
return decoded, nil
}
// decryptChaCha20poly1305V2 is used only to decrypt Ente Auth data. Ente Auth use new version of LibSodium.
// In that version, the final tag value is 0x0 instead of TagFinal.
func decryptChaCha20poly1305V2(data []byte, key []byte, nonce []byte) ([]byte, error) {
decryptor, err := NewDecryptor(key, nonce)
if err != nil {
return nil, err
}
decoded, tag, err := decryptor.Pull(data)
if tag != TagFinal && tag != TagMessage {
return nil, errors.New("invalid tag")
}
if err != nil {
return nil, err
}
return decoded, nil
}
//func SecretBoxOpenLibSodium(c []byte, n []byte, k []byte) ([]byte, error) {
// var cp sodium.Bytes = c
// res, err := cp.SecretBoxOpen(sodium.SecretBoxNonce{Bytes: n}, sodium.SecretBoxKey{Bytes: k})

View File

@@ -15,7 +15,7 @@ import (
"strings"
)
var AppVersion = "0.1.13"
var AppVersion = "0.1.14"
func main() {
cliDBPath, err := GetCLIConfigPath()

View File

@@ -55,7 +55,7 @@ func DecryptExport(inputPath string, outputPath string) error {
return fmt.Errorf("error deriving key: %v", err)
}
_, decryptedData, err := eCrypto.DecryptChaChaBase64(export.EncryptedData, key, export.EncryptionNonce)
_, decryptedData, err := eCrypto.DecryptChaChaBase64Auth(export.EncryptedData, key, export.EncryptionNonce)
if err != nil {
fmt.Printf("\nerror decrypting data %v", err)
fmt.Println("\nPlease check your password and try again")

View File

@@ -5,12 +5,19 @@ name: "Release"
# For more details, see `docs/release.md` in ente-io/ente.
on:
# Trigger manually or `gh workflow run desktop-release.yml`.
# Trigger manually or `gh workflow run desktop-release.yml --source=foo`.
workflow_dispatch:
inputs:
source:
description: "Branch (ente-io/ente) to build"
type: string
schedule:
# Run everyday at ~8:00 AM IST (except Sundays).
# See: [Note: Run workflow every 24 hours]
#
- cron: "45 2 * * 1-6"
push:
# Run when a tag matching the pattern "v*"" is pushed.
#
# See: [Note: Testing release workflows that are triggered by tags].
tags:
- "v*"
@@ -30,9 +37,13 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
with:
# Checkout the desktop/rc branch from the source repository.
# If triggered by a tag, checkout photosd-$tag from the source
# repository. Otherwise checkout $source (default: "main").
repository: ente-io/ente
ref: desktop/rc
ref:
"${{ startsWith(github.ref, 'refs/tags/v') &&
format('photosd-{0}', github.ref_name) || ( inputs.source
|| 'main' ) }}"
submodules: recursive
- name: Setup node
@@ -64,10 +75,8 @@ jobs:
# (No need to define this secret in the repo settings)
github_token: ${{ secrets.GITHUB_TOKEN }}
# If the commit is tagged with a version (e.g. "v1.0.0"),
# create a (draft) release after building. Otherwise upload
# assets to the existing draft named after the version.
release: ${{ startsWith(github.ref, 'refs/tags/v') }}
# Passes `--publish always` to electron-builder
release: true
mac_certs: ${{ secrets.MAC_CERTS }}
mac_certs_password: ${{ secrets.MAC_CERTS_PASSWORD }}
@@ -77,4 +86,13 @@ jobs:
APPLE_APP_SPECIFIC_PASSWORD:
${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
# Default is "draft", but since our nightly builds update
# existing pre-releases, set this to "prerelease".
EP_PRE_RELEASE: true
# By default, electron-builder does not update releases that
# were more than 2 hours ago. Override this to allow us to
# continually update our nightly pre-releases.
EP_GH_IGNORE_TIME: true
# Workaround recommended in
# https://github.com/electron-userland/electron-builder/issues/3179
USE_HARD_LINKS: false

View File

@@ -1,6 +1,11 @@
# CHANGELOG
## v1.7.0 (Unreleased)
## v1.7.1 (Unreleased)
- Remember the window size across app restarts.
- Revert changes to the Linux icon.
## v1.7.0
v1.7 is a major rewrite to improve the security of our app. In particular, the
UI and the native parts of the app now run isolated from each other and

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1,65 +1,94 @@
## Releases
Conceptually, the release is straightforward: We trigger a GitHub workflow that
creates a draft release with artifacts built. When ready, we publish that
release. The download links on our website, and existing apps already check the
latest GitHub release and update accordingly.
Conceptually, the release is straightforward:
The complication comes by the fact that electron-builder's auto updaterr (the
1. We trigger a GitHub workflow that creates a (pre-)release with the build.
2. When ready, we make that release the latest.
3. The download links on our website, and existing apps already check the
latest GitHub release and update automatically.
The complication comes by the fact that electron-builder's auto updater (the
mechanism that we use for auto updates) doesn't work with monorepos. So we need
to keep a separate (non-mono) repository just for doing releases.
to keep a separate repository just for holding the releases.
- Source code lives here, in [ente-io/ente](https://github.com/ente-io/ente).
- Releases are done from
[ente-io/photos-desktop](https://github.com/ente-io/photos-desktop).
## Workflow - Release Candidates
## Workflow - Release candidates
Leading up to the release, we can make one or more draft releases that are not
intended to be published, but serve as test release candidates.
Nightly RC builds of `main` are published by a scheduled workflow automatically.
If needed, these builds can also be manually updated, and the branch of the
source repository to build (default "main") also specified:
The workflow for making such "rc" builds is:
```sh
gh workflow run desktop-release.yml --source=<branch>
```
1. Update `package.json` in the source repo to use version `1.x.x-rc`. Create a
new draft release in the release repo with title `1.x.x-rc`. In the tag
input enter `v1.x.x-rc` and select the option to "create a new tag on
publish".
2. Push code to the `desktop/rc` branch in the source repo.
3. Trigger the GitHub action in the release repo
```sh
gh workflow run desktop-release.yml
```
We can do steps 2 and 3 multiple times: each time it'll just update the
artifacts attached to the same draft.
Each such workflow run will update the artifacts attached to the same
(pre-existing) pre-release.
## Workflow - Release
1. Update source repo to set version `1.x.x` in `package.json` and finialize
the CHANGELOG.
1. Update source repo to set version `1.x.x` in `package.json` and finalize the
CHANGELOG.
2. Push code to the `desktop/rc` branch in the source repo.
2. Merge PR then tag the merge commit on `main` in the source repo:
3. In the release repo
```sh
git tag photosd-v1.x.x
git push origin photosd-v1.x.x
```
3. In the release repo:
```sh
./.github/trigger-release.sh v1.x.x
```
4. If the build is successful, tag `desktop/rc` in the source repo.
This'll trigger the workflow and create a new pre-release. We can edit this to
add the release notes, convert it to a release. Once it is marked as latest, the
release goes live.
We are done at this point, and can now create a new pre-release to host
subsequent nightly builds.
1. Update `package.json` in the source repo to use version `1.x.x-rc`, and
merge these changes into `main`.
2. In the release repo:
```sh
# Assuming we're on desktop/rc that just got build
git tag photosd-v1.x.x
git push origin photosd-v1.x.x
git tag 1.x.x-rc
git push origin 1.x.x-rc
```
## Post build
3. Once the workflow finishes and the pre-release is created, edit its
description to "Nightly builds".
4. Delete the pre-release for the previous (already released) version.
## Workflow - Extra pre-releases
To create extra one off pre-releases in addition to the nightly `1.x.x-rc` ones,
1. In your branch in the source repository, set the version in `package.json`
to something different, say `1.x.x-my-test`.
2. Create a new pre-release in the release repo with title `1.x.x-test`. In the
tag input enter `v1.x.x-test` and select the option to "create a new tag on
publish".
3. Trigger the workflow in the release repo:
```sh
gh workflow run desktop-release.yml --source=my-branch
```
## Details
The GitHub Action runs on Windows, Linux and macOS. It produces the artifacts
defined in the `build` value in `package.json`.
@@ -87,8 +116,3 @@ everything is automated:
now their maintainers automatically bump the SHA, version number and the
(derived from the version) URL in the formula when their tools notice a new
release on our GitHub.
We can also publish the draft releases by checking the "pre-release" option.
Such releases don't cause any of the channels (our website, or the desktop app
auto updater, or brew) to be notified, instead these are useful for giving links
to pre-release builds to customers.

View File

@@ -23,6 +23,7 @@ linux:
- target: pacman
arch: [x64, arm64]
category: Photography
icon: ./build/icon.icns
mac:
target:
target: default

43
desktop/eslint.config.mjs Normal file
View File

@@ -0,0 +1,43 @@
// @ts-check
import js from "@eslint/js";
import ts from "typescript-eslint";
export default ts.config(
js.configs.recommended,
...ts.configs.strictTypeChecked,
...ts.configs.stylisticTypeChecked,
{
// typescript-eslint needs this enabling type checked rules.
languageOptions: {
parserOptions: {
project: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
{
// The list of (minimatch) globs to ignore. This needs to be the only
// key in this configuration object.
ignores: ["eslint.config.mjs", "app/", "out/", "dist/"],
},
{
// Rule customizations.
rules: {
// Allow numbers to be used in template literals.
"@typescript-eslint/restrict-template-expressions": [
"error",
{
allowNumber: true,
},
],
// Allow void expressions as the entire body of an arrow function.
"@typescript-eslint/no-confusing-void-expression": [
"error",
{
ignoreArrowShorthand: true,
},
],
},
},
);

View File

@@ -1,6 +1,6 @@
{
"name": "ente",
"version": "1.7.0-rc",
"version": "1.7.1-rc",
"private": true,
"description": "Desktop client for Ente Photos",
"repository": "github:ente-io/photos-desktop",
@@ -17,8 +17,8 @@
"dev-main": "tsc && electron .",
"dev-renderer": "cd ../web && yarn install && yarn dev:photos",
"postinstall": "electron-builder install-app-deps",
"lint": "yarn prettier --check --log-level warn . && eslint --ext .ts src && yarn tsc",
"lint-fix": "yarn prettier --write --log-level warn . && eslint --fix --ext .ts src && yarn tsc"
"lint": "yarn prettier --check --log-level warn . && yarn eslint && yarn tsc",
"lint-fix": "yarn prettier --write --log-level warn . && yarn eslint && yarn tsc"
},
"resolutions": {
"jackspeak": "2.1.1"
@@ -30,29 +30,30 @@
"compare-versions": "^6.1",
"electron-log": "^5.1",
"electron-store": "^8.2",
"electron-updater": "^6.1",
"electron-updater": "^6.2",
"ffmpeg-static": "^5.2",
"html-entities": "^2.5",
"jpeg-js": "^0.4",
"next-electron-server": "^1",
"node-stream-zip": "^1.15",
"onnxruntime-node": "^1.17"
"onnxruntime-node": "^1.18"
},
"devDependencies": {
"@eslint/js": "^9.4.0",
"@tsconfig/node20": "^20.1.4",
"@types/auto-launch": "^5.0",
"@types/eslint__js": "^8.42.3",
"@types/ffmpeg-static": "^3.0",
"@typescript-eslint/eslint-plugin": "^7",
"@typescript-eslint/parser": "^7",
"concurrently": "^8",
"electron": "^30",
"electron-builder": "25.0.0-alpha.6",
"eslint": "^8",
"electron-builder": "25.0.0-alpha.8",
"eslint": "^9.4.0",
"prettier": "^3",
"prettier-plugin-organize-imports": "^3",
"prettier-plugin-packagejson": "^2",
"shx": "^0.3",
"typescript": "^5"
"typescript": "^5",
"typescript-eslint": "8.0.0-alpha.10"
},
"packageManager": "yarn@1.22.21",
"productName": "ente"

View File

@@ -143,12 +143,22 @@ const registerPrivilegedSchemes = () => {
* This window will show the HTML served from {@link rendererURL}.
*/
const createMainWindow = () => {
const icon = nativeImage.createFromPath(
path.join(isDev ? "build" : process.resourcesPath, "window-icon.png"),
);
const bounds = windowBounds();
// Create the main window. This'll show our web content.
const window = new BrowserWindow({
webPreferences: {
preload: path.join(__dirname, "preload.js"),
sandbox: true,
},
icon,
// Set the window's position and size (if we have one saved).
...(bounds ?? {}),
// Enforce a minimum size
...minimumWindowSize(),
// The color to show in the window until the web content gets loaded.
// See: https://www.electronjs.org/docs/latest/api/browser-window#setting-the-backgroundcolor-property
backgroundColor: "black",
@@ -162,8 +172,10 @@ const createMainWindow = () => {
// On macOS, also hide the dock icon on macOS.
if (process.platform == "darwin") app.dock.hide();
} else {
// Show our window (maximizing it) otherwise.
window.maximize();
// Show our window otherwise.
//
// If we did not give it an explicit size, maximize it
bounds ? window.show() : window.maximize();
}
// Open the DevTools automatically when running in dev mode
@@ -209,11 +221,64 @@ const createMainWindow = () => {
return window;
};
/**
* The position and size to use when showing the main window.
*
* The return value is `undefined` if the app's window was maximized the last
* time around, and so if we should restore it to the maximized state.
*
* Otherwise it returns the position and size of the window the last time the
* app quit.
*
* If there is no such saved value (or if it is the first time the user is
* running the app), return a default size.
*/
const windowBounds = () => {
if (userPreferences.get("isWindowMaximized")) return undefined;
const bounds = userPreferences.get("windowBounds");
if (bounds) return bounds;
// Default size. Picked arbitrarily as something that should look good on
// first launch. We don't provide a position to let Electron center the app.
return { width: 1170, height: 710 };
};
/**
* If for some reason {@link windowBounds} is outside the screen's bounds (e.g.
* if the user's screen resolution has changed), then the previously saved
* bounds might not be appropriate.
*
* Luckily, if we try to set an x/y position that is outside the screen's
* bounds, then Electron automatically clamps x + width and y + height to lie
* within the screen's available space, and we do not need to tackle such out of
* bounds cases specifically.
*
* However there is no minimum window size the Electron enforces by default. As
* a safety valve, provide an (arbitrary) minimum size so that the user can
* resize it back to sanity if something I cannot currently anticipate happens.
*/
const minimumWindowSize = () => ({ minWidth: 200, minHeight: 200 });
/**
* Sibling of {@link windowBounds}, see that function's documentation for more
* details.
*/
const saveWindowBounds = (window: BrowserWindow) => {
if (window.isMaximized()) {
userPreferences.set("isWindowMaximized", true);
userPreferences.delete("windowBounds");
} else {
userPreferences.delete("isWindowMaximized");
userPreferences.set("windowBounds", window.getBounds());
}
};
/**
* Automatically set the save path for user initiated downloads to the system's
* "downloads" directory instead of asking the user to select a save location.
*/
export const setDownloadPath = (webContents: WebContents) => {
const setDownloadPath = (webContents: WebContents) => {
webContents.session.on("will-download", (_, item) => {
item.setSavePath(
uniqueSavePath(app.getPath("downloads"), item.getFilename()),
@@ -241,7 +306,7 @@ const uniqueSavePath = (dirPath: string, fileName: string) => {
*
* @param webContents The renderer to configure.
*/
export const allowExternalLinks = (webContents: WebContents) =>
const allowExternalLinks = (webContents: WebContents) =>
// By default, if the user were open a link, say
// https://github.com/ente-io/ente/discussions, then it would open a _new_
// BrowserWindow within our app.
@@ -273,7 +338,7 @@ export const allowExternalLinks = (webContents: WebContents) =>
* "Access-Control-Allow-Origin: *" or do a echo-back of `Origin`, we add a
* workaround here instead, intercepting the ACAO header and allowing `*`.
*/
export const allowAllCORSOrigins = (webContents: WebContents) =>
const allowAllCORSOrigins = (webContents: WebContents) =>
webContents.session.webRequest.onHeadersReceived(
({ responseHeaders }, callback) => {
const headers: NonNullable<typeof responseHeaders> = {};
@@ -322,6 +387,13 @@ const setupTrayItem = (mainWindow: BrowserWindow) => {
* once most people have upgraded to newer versions.
*/
const deleteLegacyDiskCacheDirIfExists = async () => {
const removeIfExists = async (dirPath: string) => {
if (existsSync(dirPath)) {
log.info(`Removing legacy disk cache from ${dirPath}`);
await fs.rm(dirPath, { recursive: true });
}
};
// [Note: Getting the cache path]
//
// The existing code was passing "cache" as a parameter to getPath.
@@ -338,9 +410,18 @@ const deleteLegacyDiskCacheDirIfExists = async () => {
//
// @ts-expect-error "cache" works but is not part of the public API.
const cacheDir = path.join(app.getPath("cache"), "ente");
if (existsSync(cacheDir)) {
log.info(`Removing legacy disk cache from ${cacheDir}`);
await fs.rm(cacheDir, { recursive: true });
if (process.platform == "win32") {
// On Windows the cache dir is the same as the app data (!). So deleting
// the ente subfolder of the cache dir is equivalent to deleting the
// user data dir.
//
// Obviously, that's not good. So instead of Windows we explicitly
// delete the named cache directories.
await removeIfExists(path.join(cacheDir, "thumbs"));
await removeIfExists(path.join(cacheDir, "files"));
await removeIfExists(path.join(cacheDir, "face-crops"));
} else {
await removeIfExists(cacheDir);
}
};
@@ -428,7 +509,10 @@ const main = () => {
// app, e.g. by clicking on its dock icon.
app.on("activate", () => mainWindow?.show());
app.on("before-quit", allowWindowClose);
app.on("before-quit", () => {
if (mainWindow) saveWindowBounds(mainWindow);
allowWindowClose();
});
};
main();

View File

@@ -12,19 +12,22 @@ import { watchReset } from "./watch";
* See: [Note: Do not throw during logout].
*/
export const logout = (watcher: FSWatcher) => {
const ignoreError = (label: string, e: unknown) =>
log.error(`Ignoring error during logout (${label})`, e);
try {
watchReset(watcher);
} catch (e) {
log.error("Ignoring error during logout (FS watch)", e);
ignoreError("FS watch", e);
}
try {
clearConvertToMP4Results();
} catch (e) {
log.error("Ignoring error during logout (convert-to-mp4)", e);
ignoreError("convert-to-mp4", e);
}
try {
clearStores();
} catch (e) {
log.error("Ignoring error during logout (native stores)", e);
ignoreError("native stores", e);
}
};

View File

@@ -1,21 +1,47 @@
import Store, { Schema } from "electron-store";
interface UserPreferences {
/**
* If true, then the user has set a preference to also hide the dock icon on
* macOS whenever the app is hidden. The tray icon is always visible and can
* then be used to reopen the app when needed.
*/
hideDockIcon?: boolean;
skipAppVersion?: string;
muteUpdateNotificationVersion?: string;
/**
* The last position and size of our app's window.
*
* This value is saved when the app is about to quit, and is used to restore
* the window to the previous state when it restarts. It is only saved if
* the app is not maximized (when the app was maximized when it was being
* quit then {@link isWindowMaximized} will be set instead).
*/
windowBounds?: {
x: number;
y: number;
width: number;
height: number;
};
/**
* `true` if the app's main window is maximized the last time it was closed.
*/
isWindowMaximized?: boolean;
}
const userPreferencesSchema: Schema<UserPreferences> = {
hideDockIcon: {
type: "boolean",
},
skipAppVersion: {
type: "string",
},
muteUpdateNotificationVersion: {
type: "string",
hideDockIcon: { type: "boolean" },
skipAppVersion: { type: "string" },
muteUpdateNotificationVersion: { type: "string" },
windowBounds: {
properties: {
x: { type: "number" },
y: { type: "number" },
width: { type: "number" },
height: { type: "number" },
},
},
isWindowMaximized: { type: "boolean" },
};
export const userPreferences = new Store({

View File

@@ -19,7 +19,6 @@
* 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;

View File

@@ -1,4 +1,3 @@
/* eslint-disable no-unused-vars */
/**
* @file The preload script
*

View File

@@ -373,7 +373,6 @@ export default class {
return token + "</w>";
}
// eslint-disable-next-line no-constant-condition
while (1) {
let bigram: [string, string] | null = null;
let minRank = Infinity;

View File

@@ -32,6 +32,6 @@
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true
},
/* Transpile all `.ts` files in `src/` */
"include": ["src/**/*.ts"]
/* Include all `.ts` files in `src/` */
"include": ["src"]
}

View File

@@ -65,10 +65,10 @@
fs-extra "^9.0.1"
promise-retry "^2.0.1"
"@electron/osx-sign@1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8"
integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==
"@electron/osx-sign@1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.3.0.tgz#bd6fb60c519b76ca8a000e5801f5685690e8adad"
integrity sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==
dependencies:
compare-version "^0.1.2"
debug "^4.3.4"
@@ -122,49 +122,54 @@
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
"@eslint/eslintrc@^2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
"@eslint/config-array@^0.15.1":
version "0.15.1"
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.15.1.tgz#1fa78b422d98f4e7979f2211a1fde137e26c7d61"
integrity sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==
dependencies:
"@eslint/object-schema" "^2.1.3"
debug "^4.3.1"
minimatch "^3.0.5"
"@eslint/eslintrc@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6"
integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
espree "^9.6.0"
globals "^13.19.0"
espree "^10.0.1"
globals "^14.0.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/js@8.57.0":
version "8.57.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
"@eslint/js@9.4.0", "@eslint/js@^9.4.0":
version "9.4.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.4.0.tgz#96a2edd37ec0551ce5f9540705be23951c008a0c"
integrity sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==
"@eslint/object-schema@^2.1.3":
version "2.1.3"
resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.3.tgz#e65ae80ee2927b4fd8c5c26b15ecacc2b2a6cc2a"
integrity sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==
"@gar/promisify@^1.1.3":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
"@humanwhocodes/config-array@^0.11.14":
version "0.11.14"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
dependencies:
"@humanwhocodes/object-schema" "^2.0.2"
debug "^4.3.1"
minimatch "^3.0.5"
"@humanwhocodes/module-importer@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
"@humanwhocodes/object-schema@^2.0.2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
"@humanwhocodes/retry@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570"
integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==
"@isaacs/fs-minipass@^4.0.0":
version "4.0.1"
@@ -281,6 +286,26 @@
dependencies:
"@types/ms" "*"
"@types/eslint@*":
version "8.56.10"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d"
integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
"@types/eslint__js@^8.42.3":
version "8.42.3"
resolved "https://registry.yarnpkg.com/@types/eslint__js/-/eslint__js-8.42.3.tgz#d1fa13e5c1be63a10b4e3afe992779f81c1179a0"
integrity sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==
dependencies:
"@types/eslint" "*"
"@types/estree@*":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
"@types/ffmpeg-static@^3.0":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/ffmpeg-static/-/ffmpeg-static-3.0.3.tgz#605358ac6304507a75c2fd5fd861534837b19e2f"
@@ -298,7 +323,7 @@
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4"
integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==
"@types/json-schema@^7.0.15":
"@types/json-schema@*", "@types/json-schema@^7.0.15":
version "7.0.15"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
@@ -316,9 +341,9 @@
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
"@types/node@*", "@types/node@^20.9.0":
version "20.12.12"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050"
integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==
version "20.13.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.13.0.tgz#011a76bc1e71ae9a026dddcfd7039084f752c4b6"
integrity sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==
dependencies:
undici-types "~5.26.4"
@@ -359,16 +384,16 @@
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@^7":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f"
integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==
"@typescript-eslint/eslint-plugin@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.10.tgz#a102e40da7b72a2981cb2da43064d9b3c865ca58"
integrity sha512-jsNKqn41nIS8jz5Li5xsueGEBBmRYLaflUKlclEkj8cWrO1tMK1/7xITeiVz7ZlNFZF2nop2NlXrbLtRpLEzhg==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "7.8.0"
"@typescript-eslint/type-utils" "7.8.0"
"@typescript-eslint/utils" "7.8.0"
"@typescript-eslint/visitor-keys" "7.8.0"
"@typescript-eslint/scope-manager" "8.0.0-alpha.10"
"@typescript-eslint/type-utils" "8.0.0-alpha.10"
"@typescript-eslint/utils" "8.0.0-alpha.10"
"@typescript-eslint/visitor-keys" "8.0.0-alpha.10"
debug "^4.3.4"
graphemer "^1.4.0"
ignore "^5.3.1"
@@ -376,47 +401,47 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/parser@^7":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.8.0.tgz#1e1db30c8ab832caffee5f37e677dbcb9357ddc8"
integrity sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==
"@typescript-eslint/parser@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.0.0-alpha.10.tgz#fbefd39da010d65407b985f2b5c6e0a79bc8a6f4"
integrity sha512-4EerPviLfBKgExHARehJgWrCtX2a7+PXBc0LBPlH93ypSgj0LU1ejMgjrB0gcfd6bJ7LN/UGNAAy3B7/Y785sA==
dependencies:
"@typescript-eslint/scope-manager" "7.8.0"
"@typescript-eslint/types" "7.8.0"
"@typescript-eslint/typescript-estree" "7.8.0"
"@typescript-eslint/visitor-keys" "7.8.0"
"@typescript-eslint/scope-manager" "8.0.0-alpha.10"
"@typescript-eslint/types" "8.0.0-alpha.10"
"@typescript-eslint/typescript-estree" "8.0.0-alpha.10"
"@typescript-eslint/visitor-keys" "8.0.0-alpha.10"
debug "^4.3.4"
"@typescript-eslint/scope-manager@7.8.0":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047"
integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==
"@typescript-eslint/scope-manager@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.10.tgz#25506ce51ab64e99f2bc0b7d3f0f82656e14a794"
integrity sha512-SUU0yhqehjuWilWRJWfhcxf6eMKVrZ3bpV2w6NF6GmBHR3FJo6oWZYLVXP04s6//INxpC2ynvKSglo4LRzWVTw==
dependencies:
"@typescript-eslint/types" "7.8.0"
"@typescript-eslint/visitor-keys" "7.8.0"
"@typescript-eslint/types" "8.0.0-alpha.10"
"@typescript-eslint/visitor-keys" "8.0.0-alpha.10"
"@typescript-eslint/type-utils@7.8.0":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz#9de166f182a6e4d1c5da76e94880e91831e3e26f"
integrity sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==
"@typescript-eslint/type-utils@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.10.tgz#d27f0fdd81450380887b3a07297440ba3588a70e"
integrity sha512-6aTcbnDZWKgKr3gquECJSFyvXWLSKtUHrk2ZXDP4DEzmzTDjrkY7tIQpqv4SczPQJ+3/aky3ArPhtnQYJbAMzg==
dependencies:
"@typescript-eslint/typescript-estree" "7.8.0"
"@typescript-eslint/utils" "7.8.0"
"@typescript-eslint/typescript-estree" "8.0.0-alpha.10"
"@typescript-eslint/utils" "8.0.0-alpha.10"
debug "^4.3.4"
ts-api-utils "^1.3.0"
"@typescript-eslint/types@7.8.0":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d"
integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==
"@typescript-eslint/types@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.0.0-alpha.10.tgz#89be400c6a1751fe86f5917ed8087ec100e002da"
integrity sha512-prbN+b/I4yH6H43WmyenMz8K5e34Hs73BQuWXR4wwij3Cg2xNGLPcpjr2cKWKlH4dZQPTz6R6oBeC+LfaoKi8g==
"@typescript-eslint/typescript-estree@7.8.0":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c"
integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==
"@typescript-eslint/typescript-estree@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.10.tgz#e850056d2a5029688269a60206dec3bbd7beb953"
integrity sha512-8wBUIhu6IRa440hv5/0ZEnb5JLp/UsfzIXYKRwICUOMTVj2ss1n+w3m1CtT5ghVWy5Z05qkscsbhlKFmZguU8w==
dependencies:
"@typescript-eslint/types" "7.8.0"
"@typescript-eslint/visitor-keys" "7.8.0"
"@typescript-eslint/types" "8.0.0-alpha.10"
"@typescript-eslint/visitor-keys" "8.0.0-alpha.10"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
@@ -424,32 +449,27 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/utils@7.8.0":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd"
integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==
"@typescript-eslint/utils@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.0.0-alpha.10.tgz#b77f743227353bfa493e95409c0e079044c9258e"
integrity sha512-WZyNf49CuvaW/whz/B8XjYwXE/wm/EQAXq+Vqgp6BrJb8SC3bMCwGuUxReNDN1o+dNdOC96ofVSvqa8NUQ65Jg==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@types/json-schema" "^7.0.15"
"@types/semver" "^7.5.8"
"@typescript-eslint/scope-manager" "7.8.0"
"@typescript-eslint/types" "7.8.0"
"@typescript-eslint/typescript-estree" "7.8.0"
"@typescript-eslint/scope-manager" "8.0.0-alpha.10"
"@typescript-eslint/types" "8.0.0-alpha.10"
"@typescript-eslint/typescript-estree" "8.0.0-alpha.10"
semver "^7.6.0"
"@typescript-eslint/visitor-keys@7.8.0":
version "7.8.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91"
integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==
"@typescript-eslint/visitor-keys@8.0.0-alpha.10":
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.10.tgz#d0a9250c69cc2f73c7f423c36183d222a329e260"
integrity sha512-UohTNnT7S29uQgXsGZY489nWmoBBSJucNdRvog62R1QX9pQQb2pKVV1kHepUxoY2vd+M4tb9SQwZQ3gPNgqQ6w==
dependencies:
"@typescript-eslint/types" "7.8.0"
"@typescript-eslint/types" "8.0.0-alpha.10"
eslint-visitor-keys "^3.4.3"
"@ungap/structured-clone@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
"@xmldom/xmldom@^0.8.8":
version "0.8.10"
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
@@ -465,7 +485,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^8.9.0:
acorn@^8.11.3:
version "8.11.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
@@ -554,14 +574,14 @@ app-builder-bin@4.0.0:
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0"
integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==
app-builder-lib@25.0.0-alpha.6:
version "25.0.0-alpha.6"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.0.0-alpha.6.tgz#3edb49843b249a1dd52b32a80f9787677bc5a32b"
integrity sha512-kXveR7MFTJXBwb2xB2geKWeWP+YGcJ3IzWRgTEV96zwyo4IxzE5xRXcndSQQglmlzw/VoM5Mx322E9ErYbMCVg==
app-builder-lib@25.0.0-alpha.8:
version "25.0.0-alpha.8"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.0.0-alpha.8.tgz#e8065005b0b5d43f22153ac72101f71bf4e1022b"
integrity sha512-d/pcaTcDv3gfdl9AGGP/DKvc+A+TdJmG15f+vqPeEGKOoqLE0ukReaEevXAtH3wOOs5CqgX6QgNPdszeeqFn3Q==
dependencies:
"@develar/schema-utils" "~2.6.5"
"@electron/notarize" "2.3.0"
"@electron/osx-sign" "1.0.5"
"@electron/osx-sign" "1.3.0"
"@electron/rebuild" "3.6.0"
"@electron/universal" "2.0.1"
"@malept/flatpak-bundler" "^0.4.0"
@@ -573,7 +593,7 @@ app-builder-lib@25.0.0-alpha.6:
chromium-pickle-js "^0.2.0"
debug "^4.3.4"
ejs "^3.1.8"
electron-publish "25.0.0-alpha.6"
electron-publish "25.0.0-alpha.7"
form-data "^4.0.0"
fs-extra "^10.1.0"
hosted-git-info "^4.1.0"
@@ -582,7 +602,7 @@ app-builder-lib@25.0.0-alpha.6:
js-yaml "^4.1.0"
lazy-val "^1.0.5"
minimatch "^5.1.1"
read-config-file "6.3.2"
read-config-file "6.4.0"
sanitize-filename "^1.6.3"
semver "^7.3.8"
tar "^6.1.12"
@@ -718,7 +738,14 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
braces@^3.0.2, braces@~3.0.2:
braces@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.1.1"
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@@ -743,10 +770,10 @@ buffer@^5.1.0, buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
builder-util-runtime@9.2.3:
version "9.2.3"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz#0a82c7aca8eadef46d67b353c638f052c206b83c"
integrity sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==
builder-util-runtime@9.2.4:
version "9.2.4"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a"
integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==
dependencies:
debug "^4.3.4"
sax "^1.2.4"
@@ -1007,6 +1034,14 @@ conf@^10.2.0:
pkg-up "^3.1.0"
semver "^7.3.5"
config-file-ts@0.2.8-rc1:
version "0.2.8-rc1"
resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz#fb7fc6ccb2e313f69dbeb78f1db0b00038049de0"
integrity sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==
dependencies:
glob "^10.3.12"
typescript "^5.4.3"
config-file-ts@^0.2.4:
version "0.2.6"
resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027"
@@ -1055,13 +1090,20 @@ debounce-fn@^4.0.0:
dependencies:
mimic-fn "^3.0.0"
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
debug@^4.1.0, debug@^4.1.1, debug@^4.3.4:
version "4.3.5"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
dependencies:
ms "2.1.2"
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
@@ -1149,12 +1191,12 @@ dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
dmg-builder@25.0.0-alpha.6:
version "25.0.0-alpha.6"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.0.0-alpha.6.tgz#1a13008de0543c3080595534ab294cde2a5e57e8"
integrity sha512-GStVExwsuumGN6rPGJksA5bLN5n5QEQd5iQrGKyBSxuwR1+LWidFkM+anroXnANIyTwbppk2S7+808vHjT/Eyw==
dmg-builder@25.0.0-alpha.8:
version "25.0.0-alpha.8"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.0.0-alpha.8.tgz#fe887023ffc9ce72dfd2472303a76ec008a156d2"
integrity sha512-1/Sfl1sQugHkHEobFafyx1HcmgkFj8pV7HFEK0NQ8bH5K2qsGvknjAeHjtYhV2sBoSNGod4P0SfbScS6p6h4eg==
dependencies:
app-builder-lib "25.0.0-alpha.6"
app-builder-lib "25.0.0-alpha.8"
builder-util "25.0.0-alpha.6"
builder-util-runtime "9.2.5-alpha.2"
fs-extra "^10.1.0"
@@ -1177,13 +1219,6 @@ dmg-license@^1.0.11:
smart-buffer "^4.0.2"
verror "^1.10.0"
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
dot-prop@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083"
@@ -1191,11 +1226,23 @@ dot-prop@^6.0.1:
dependencies:
is-obj "^2.0.0"
dotenv-expand@^11.0.6:
version "11.0.6"
resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.6.tgz#f2c840fd924d7c77a94eff98f153331d876882d3"
integrity sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==
dependencies:
dotenv "^16.4.4"
dotenv-expand@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
dotenv@^16.4.4, dotenv@^16.4.5:
version "16.4.5"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
dotenv@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05"
@@ -1208,16 +1255,16 @@ ejs@^3.1.8:
dependencies:
jake "^10.8.5"
electron-builder@25.0.0-alpha.6:
version "25.0.0-alpha.6"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.0.0-alpha.6.tgz#a72f96f7029539ac28f92ce5c83f872ba3b6e7c1"
integrity sha512-qXzzdID2W9hhx3TXddwXv1C5HsqjF6bKnftUtywAB/gtDwu+neifPZvnXDNHI4ZamRrZpJJH59esfkqkc2KNSQ==
electron-builder@25.0.0-alpha.8:
version "25.0.0-alpha.8"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.0.0-alpha.8.tgz#7238623cf7a753d0da31f16daea8767d0ef6d572"
integrity sha512-nfrtTljEZackbhJE1BcK+RFXrPvrkrBo0TgR0gH2GxNhPiRTwj/S24K3zHbYj6vBaDVtnqlS6Mqm8tMUrRU4tA==
dependencies:
app-builder-lib "25.0.0-alpha.6"
app-builder-lib "25.0.0-alpha.8"
builder-util "25.0.0-alpha.6"
builder-util-runtime "9.2.5-alpha.2"
chalk "^4.1.2"
dmg-builder "25.0.0-alpha.6"
dmg-builder "25.0.0-alpha.8"
fs-extra "^10.1.0"
is-ci "^3.0.0"
lazy-val "^1.0.5"
@@ -1226,14 +1273,14 @@ electron-builder@25.0.0-alpha.6:
yargs "^17.6.2"
electron-log@^5.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.1.2.tgz#fb40ad7f4ae694dd0e4c02c662d1a65c03e1243e"
integrity sha512-Cpg4hAZ27yM9wzE77c4TvgzxzavZ+dVltCczParXN+Vb3jocojCSAuSMCVOI9fhFuuOR+iuu3tZLX1cu0y0kgQ==
version "5.1.5"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.1.5.tgz#70d5051fc5ab7669b2592f53f72034867269c96e"
integrity sha512-vuq10faUAxRbILgQx7yHoMObKZDEfj7hMSZrJPsVrDNeCpV/HN11dU7QuY4UDUe055pzBxhSCB3m0+6D3Aktjw==
electron-publish@25.0.0-alpha.6:
version "25.0.0-alpha.6"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.0.0-alpha.6.tgz#8af3cb6e2435c00b8c71de43c330483808df5924"
integrity sha512-Hin+6j+jiXBc5g6Wlv9JB5Xu7MADBHxZAndt4WE7luCw7b3+OJdQeDvD/uYiCLpiG8cc2NLxu4MyBSVu86MrJA==
electron-publish@25.0.0-alpha.7:
version "25.0.0-alpha.7"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.0.0-alpha.7.tgz#3c1944c8890b22d5f674772bf16c5382da248861"
integrity sha512-d9R6Jnds3PjzBM4Wt3nRn9ramkbM3kBzt9a6WHQL4/09ByyZGZ1Cu9GS9atRCkH3tBJlOIotUYVhVO36lk3sAA==
dependencies:
"@types/fs-extra" "^9.0.11"
builder-util "25.0.0-alpha.6"
@@ -1251,12 +1298,12 @@ electron-store@^8.2:
conf "^10.2.0"
type-fest "^2.17.0"
electron-updater@^6.1:
version "6.1.8"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.1.8.tgz#17637bca165322f4e526b13c99165f43e6f697d8"
integrity sha512-hhOTfaFAd6wRHAfUaBhnAOYc+ymSGCWJLtFkw4xJqOvtpHmIdNHnXDV9m1MHC+A6q08Abx4Ykgyz/R5DGKNAMQ==
electron-updater@^6.2:
version "6.2.1"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.2.1.tgz#1c9adb9ba2a21a5dc50a8c434c45360d5e9fe6c9"
integrity sha512-83eKIPW14qwZqUUM6wdsIRwVKZyjmHxQ4/8G+1C6iS5PdDt7b1umYQyj1/qPpH510GmHEQe4q0kCPe3qmb3a0Q==
dependencies:
builder-util-runtime "9.2.3"
builder-util-runtime "9.2.4"
fs-extra "^10.1.0"
js-yaml "^4.1.0"
lazy-val "^1.0.5"
@@ -1266,9 +1313,9 @@ electron-updater@^6.1:
tiny-typed-emitter "^2.1.0"
electron@^30:
version "30.0.6"
resolved "https://registry.yarnpkg.com/electron/-/electron-30.0.6.tgz#9ddea5f68396ecca88ad7c2c466a30fc9c16144b"
integrity sha512-PkhEPFdpYcTzjAO3gMHZ+map7g2+xCrMDedo/L1i0ir2BRXvAB93IkTJX497U6Srb/09r2cFt+k20VPNVCdw3Q==
version "30.0.9"
resolved "https://registry.yarnpkg.com/electron/-/electron-30.0.9.tgz#b11400e4642a4b635e79244ba365f1d401ee60b5"
integrity sha512-ArxgdGHVu3o5uaP+Tqj8cJDvU03R6vrGrOqiMs7JXLnvQHMqXJIIxmFKQAIdJW8VoT3ac3hD21tA7cPO10RLow==
dependencies:
"@electron/get" "^2.0.0"
"@types/node" "^20.9.0"
@@ -1330,54 +1377,55 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-scope@^7.2.2:
version "7.2.2"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
eslint-scope@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc"
integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@^8:
version "8.57.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668"
integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
eslint-visitor-keys@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb"
integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
eslint@^9.4.0:
version "9.4.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.4.0.tgz#79150c3610ae606eb131f1d648d5f43b3d45f3cd"
integrity sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.6.1"
"@eslint/eslintrc" "^2.1.4"
"@eslint/js" "8.57.0"
"@humanwhocodes/config-array" "^0.11.14"
"@eslint/config-array" "^0.15.1"
"@eslint/eslintrc" "^3.1.0"
"@eslint/js" "9.4.0"
"@humanwhocodes/module-importer" "^1.0.1"
"@humanwhocodes/retry" "^0.3.0"
"@nodelib/fs.walk" "^1.2.8"
"@ungap/structured-clone" "^1.2.0"
ajv "^6.12.4"
chalk "^4.0.0"
cross-spawn "^7.0.2"
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
eslint-scope "^7.2.2"
eslint-visitor-keys "^3.4.3"
espree "^9.6.1"
eslint-scope "^8.0.1"
eslint-visitor-keys "^4.0.0"
espree "^10.0.1"
esquery "^1.4.2"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
file-entry-cache "^8.0.0"
find-up "^5.0.0"
glob-parent "^6.0.2"
globals "^13.19.0"
graphemer "^1.4.0"
ignore "^5.2.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
is-path-inside "^3.0.3"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
@@ -1387,14 +1435,14 @@ eslint@^8:
strip-ansi "^6.0.1"
text-table "^0.2.0"
espree@^9.6.0, espree@^9.6.1:
version "9.6.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
espree@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-10.0.1.tgz#600e60404157412751ba4a6f3a2ee1a42433139f"
integrity sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==
dependencies:
acorn "^8.9.0"
acorn "^8.11.3"
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.4.1"
eslint-visitor-keys "^4.0.0"
esquery@^1.4.2:
version "1.5.0"
@@ -1491,12 +1539,12 @@ ffmpeg-static@^5.2:
https-proxy-agent "^5.0.0"
progress "^2.0.3"
file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
file-entry-cache@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f"
integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
dependencies:
flat-cache "^3.0.4"
flat-cache "^4.0.0"
filelist@^1.0.4:
version "1.0.4"
@@ -1505,10 +1553,10 @@ filelist@^1.0.4:
dependencies:
minimatch "^5.0.1"
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
fill-range@^7.0.1, fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
dependencies:
to-regex-range "^5.0.1"
@@ -1527,14 +1575,13 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
flat-cache@^3.0.4:
version "3.2.0"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
flat-cache@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c"
integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
dependencies:
flatted "^3.2.9"
keyv "^4.5.3"
rimraf "^3.0.2"
keyv "^4.5.4"
flatted@^3.2.9:
version "3.3.1"
@@ -1678,7 +1725,7 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
glob@^10.3.10, glob@^10.3.7:
glob@^10.3.10:
version "10.3.12"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b"
integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==
@@ -1689,6 +1736,17 @@ glob@^10.3.10, glob@^10.3.7:
minipass "^7.0.4"
path-scurry "^1.10.2"
glob@^10.3.12, glob@^10.3.7:
version "10.4.1"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2"
integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==
dependencies:
foreground-child "^3.1.0"
jackspeak "^3.1.2"
minimatch "^9.0.4"
minipass "^7.1.2"
path-scurry "^1.11.1"
glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
@@ -1724,12 +1782,10 @@ global-agent@^3.0.0:
semver "^7.3.2"
serialize-error "^7.0.1"
globals@^13.19.0:
version "13.24.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
dependencies:
type-fest "^0.20.2"
globals@^14.0.0:
version "14.0.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globalthis@^1.0.1:
version "1.0.4"
@@ -2048,7 +2104,7 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
jackspeak@2.1.1, jackspeak@^2.3.6:
jackspeak@2.1.1, jackspeak@^2.3.6, jackspeak@^3.1.2:
version "2.1.1"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.1.1.tgz#2a42db4cfbb7e55433c28b6f75d8b796af9669cd"
integrity sha512-juf9stUEwUaILepraGOWIJTLwg48bUnBmRqd2ln2Os1sW987zeoj/hzhbvRB95oMuS2ZTpjULmdwHNX4rzZIZw==
@@ -2114,7 +2170,7 @@ json-stringify-safe@^5.0.1:
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
json5@^2.2.0:
json5@^2.2.0, json5@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -2135,7 +2191,7 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
keyv@^4.0.0, keyv@^4.5.3:
keyv@^4.0.0, keyv@^4.5.4:
version "4.5.4"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
@@ -2255,11 +2311,11 @@ merge2@^1.3.0, merge2@^1.4.1:
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.4:
version "4.0.5"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
version "4.0.7"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5"
integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
dependencies:
braces "^3.0.2"
braces "^3.0.3"
picomatch "^2.3.1"
mime-db@1.52.0:
@@ -2376,10 +2432,10 @@ minipass@^5.0.0:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4:
version "7.0.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c"
integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.0, minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minizlib@^2.1.1, minizlib@^2.1.2:
version "2.1.2"
@@ -2526,17 +2582,17 @@ onetime@^5.1.0, onetime@^5.1.2:
dependencies:
mimic-fn "^2.1.0"
onnxruntime-common@1.17.3:
version "1.17.3"
resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.17.3.tgz#aadc456477873a540ee3d611ae9cd4f3de7c43e5"
integrity sha512-IkbaDelNVX8cBfHFgsNADRIq2TlXMFWW+nG55mwWvQT4i0NZb32Jf35Pf6h9yjrnK78RjcnlNYaI37w394ovMw==
onnxruntime-common@1.18.0:
version "1.18.0"
resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz#b904dc6ff134e7f21a3eab702fac17538f59e116"
integrity sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==
onnxruntime-node@^1.17:
version "1.17.3"
resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.17.3.tgz#53b8b7ef68bf3834bba9d7be592e4c2d718d2018"
integrity sha512-NtbN1pfApTSEjVq46LrJ396aPP2Gjhy+oYZi5Bu1leDXAEvVap/BQ8CZELiLs7z0UnXy3xjJW23HiB4P3//FIw==
onnxruntime-node@^1.18:
version "1.18.0"
resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.18.0.tgz#ad3947365ca038ec3a16fa4c48972708ccd294e9"
integrity sha512-iTnFcxKpmywCatx8ov4GTbECe3tJk2Bp1OA2mWRJde78q+7tpPYBhKMnwhlaoKy9oKQcy4UoEuuhoy2PSD13ww==
dependencies:
onnxruntime-common "1.17.3"
onnxruntime-common "1.18.0"
tar "^7.0.1"
optionator@^0.9.3:
@@ -2648,10 +2704,10 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-scurry@^1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7"
integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==
path-scurry@^1.10.2, path-scurry@^1.11.1:
version "1.11.1"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
dependencies:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
@@ -2706,9 +2762,9 @@ prettier-plugin-packagejson@^2:
synckit "0.9.0"
prettier@^3:
version "3.2.5"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
version "3.3.0"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.0.tgz#d173ea0524a691d4c0b1181752f2b46724328cdf"
integrity sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==
progress@^2.0.3:
version "2.0.3"
@@ -2770,6 +2826,18 @@ read-config-file@6.3.2:
json5 "^2.2.0"
lazy-val "^1.0.4"
read-config-file@6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.4.0.tgz#970542833216cccff6b1d83320495003dcf85a45"
integrity sha512-uB5QOBeF84PT61GlV11OTV4jUGHAO3iDEOP6v9ygxhG6Bs9PLg7WsjNT6mtIX2G+x8lJTr4ZWNeG6LDTKkNf2Q==
dependencies:
config-file-ts "0.2.8-rc1"
dotenv "^16.4.5"
dotenv-expand "^11.0.6"
js-yaml "^4.1.0"
json5 "^2.2.3"
lazy-val "^1.0.5"
readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
@@ -2860,9 +2928,9 @@ rimraf@^3.0.2:
glob "^7.1.3"
rimraf@^5.0.5:
version "5.0.5"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf"
integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==
version "5.0.7"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74"
integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==
dependencies:
glob "^10.3.7"
@@ -2924,12 +2992,12 @@ semver@^6.2.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.3.2:
semver@^7.3.2, semver@^7.6.0:
version "7.6.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.6.0:
semver@^7.3.5, semver@^7.3.8, semver@^7.5.3:
version "7.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
@@ -3169,13 +3237,13 @@ tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2:
yallist "^4.0.0"
tar@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-7.0.1.tgz#8f6ccebcd91b69e9767a6fc4892799e8b0e606d5"
integrity sha512-IjMhdQMZFpKsHEQT3woZVxBtCQY+0wk3CVxdRkGXEgyGa0dNS/ehPvOMr2nmfC7x5Zj2N+l6yZUpmICjLGS35w==
version "7.2.0"
resolved "https://registry.yarnpkg.com/tar/-/tar-7.2.0.tgz#f03ae6ecd2e2bab880f2ef33450f502e761d7548"
integrity sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w==
dependencies:
"@isaacs/fs-minipass" "^4.0.0"
chownr "^3.0.0"
minipass "^5.0.0"
minipass "^7.1.0"
minizlib "^3.0.1"
mkdirp "^3.0.1"
yallist "^5.0.0"
@@ -3251,11 +3319,6 @@ type-fest@^0.13.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
type-fest@^2.17.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"
@@ -3266,7 +3329,16 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript@^5, typescript@^5.3.3:
typescript-eslint@8.0.0-alpha.10:
version "8.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.0.0-alpha.10.tgz#2172d41ab30c8447927c3823c5a549b9c09be89f"
integrity sha512-iMbN7boDtUmcSDor/J022+H4G018W3r3RSUUr7yoghMTmFuKVIkI89xJHDg82DBGYkA0xOoDNPBr7XfRFbEXKQ==
dependencies:
"@typescript-eslint/eslint-plugin" "8.0.0-alpha.10"
"@typescript-eslint/parser" "8.0.0-alpha.10"
"@typescript-eslint/utils" "8.0.0-alpha.10"
typescript@^5, typescript@^5.3.3, typescript@^5.4.3:
version "5.4.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611"
integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==

View File

@@ -5,8 +5,6 @@ description: Guide for importing from Steam Authenticator to Ente Auth
# Migrating from Steam Authenticator
A guide written by an ente.io lover
> [!WARNING]
>
> Steam Authenticator code is only supported after auth-v3.0.3, check the app's

View File

@@ -87,3 +87,13 @@ Yes, Ente Photos has undergone a thorough security audit conducted by Cure53, in
collaboration with Symbolic Software. Cure53 is a prominent German cybersecurity
firm, while Symbolic Software specializes in applied cryptography. Please find
the full report here: https://ente.io/blog/cryptography-audit/
## How can I delete my account?
You can delete your account at any time by using the "Delete account" option in
the settings. For security reasons, we request you to delete your account on
your own instead of contacting support to ask them to delete your account.
Note that both Ente photos and Ente auth data will be deleted when you delete
your account (irrespective of which app you delete it from) since both photos
and auth use the same underlying account.

View File

@@ -57,3 +57,39 @@ apps:
(For more details, see
[local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml)
in the server's source code).
## Dockerfile example
Here is an example of a Dockerfile by @Dylanger on our community Discord. This
runs a standalone self-hosted version of the public albums app in production
mode.
```Dockerfile
FROM node:20-alpine as builder
WORKDIR /app
COPY . .
ARG NEXT_PUBLIC_ENTE_ENDPOINT=https://your.ente.tld.api
ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your.albums.tld.api
RUN yarn install && yarn build
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/apps/photos/out .
RUN npm install -g serve
ENV PORT=3000
EXPOSE ${PORT}
CMD serve -s . -l tcp://0.0.0.0:${PORT}
```
Note that this only runs the public albums app, but the same principle can be
used to run both the normal Ente photos app and the public albums app. There is
a slightly more involved example showing how to do this also provided by in a
community contributed guide about
[configuring external S3](/self-hosting/guides/external-s3).

View File

@@ -37,7 +37,7 @@ endpoint:
(Another
[example](https://github.com/ente-io/ente/blob/main/cli/config.yaml.example))
## Web appps and Photos desktop app
## Web apps and Photos desktop app
You will need to build the app from source and use the
`NEXT_PUBLIC_ENTE_ENDPOINT` environment variable to tell it which server to

View File

@@ -41,7 +41,7 @@ NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev
That's about it. If you open http://localhost:3000, you will be able to create
an account on a Ente Photos web app running on your machine, and this web app
will be connecting to the server running on your local machine at
localhost:8080.
`localhost:8080`.
For the mobile apps, you don't even need to build, and can install normal Ente
apps and configure them to use your

1
infra/staff/.env.local Normal file
View File

@@ -0,0 +1 @@
VITE_ENTE_ENDPOINT = http://localhost:8080

View File

@@ -3,20 +3,17 @@ module.exports = {
root: true,
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/strict-type-checked",
"plugin:@typescript-eslint/stylistic-type-checked",
"plugin:react/recommended",
"plugin:react-hooks/recommended",
"plugin:react/jsx-runtime",
],
plugins: ["@typescript-eslint"],
plugins: ["@typescript-eslint", "react-refresh"],
parserOptions: { project: true },
parser: "@typescript-eslint/parser",
parserOptions: {
project: true,
},
ignorePatterns: [".eslintrc.js", "app", "out", "dist"],
env: {
es2022: true,
node: true,
},
ignorePatterns: [".eslintrc.cjs", "vite.config.ts", "dist"],
settings: { react: { version: "18.2" } },
rules: {
/* Allow numbers to be used in template literals */
"@typescript-eslint/restrict-template-expressions": [
@@ -32,5 +29,9 @@ module.exports = {
ignoreArrowShorthand: true,
},
],
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
},
};

17
infra/staff/.gitignore vendored Normal file
View File

@@ -0,0 +1,17 @@
# Node
node_modules/
# macOS
.DS_Store
# Editors
.vscode/
# Local env files
.env*.local
# tsc
*.tsbuildinfo
# Vite
dist

View File

@@ -0,0 +1,8 @@
{
"tabWidth": 4,
"proseWrap": "always",
"plugins": [
"prettier-plugin-organize-imports",
"prettier-plugin-packagejson"
]
}

19
infra/staff/README.md Normal file
View File

@@ -0,0 +1,19 @@
## Staff dashboard
Web app for staff members to help with support and other administration.
### Development
Use `yarn dev` to run a local dev server with hot reload.
> [!TIP]
>
> See [web/docs/new.md](../../web/docs/new.md) for help in setting up your
> editor to do the formatting and linting. You can also run the formatter and
> linter manually using `yarn lint`, and `yarn lint-fix` to fix them. These
> commands automatically run on every PR.
### Deployment
The app gets redeployed whenever a PR is merged into main. See
[web/docs/deploy.md](../../web/docs/deploy.md) for more details.

35
infra/staff/package.json Normal file
View File

@@ -0,0 +1,35 @@
{
"name": "staff",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"build": "tsc && vite build",
"dev": "vite",
"lint": "yarn prettier --check --log-level warn . && yarn eslint && yarn tsc",
"lint-fix": "yarn prettier --write --log-level warn . && yarn eslint --fix && yarn tsc",
"preview": "vite preview"
},
"dependencies": {
"react": "^18",
"react-dom": "^18",
"zod": "^3"
},
"devDependencies": {
"@types/react": "^18",
"@types/react-dom": "^18",
"@typescript-eslint/eslint-plugin": "^7",
"@typescript-eslint/parser": "^7",
"@vitejs/plugin-react": "^4.2",
"eslint": "^8",
"eslint-plugin-react": "^7.34",
"eslint-plugin-react-hooks": "^4.6",
"eslint-plugin-react-refresh": "^0.4.7",
"prettier": "^3",
"prettier-plugin-organize-imports": "^3.2",
"prettier-plugin-packagejson": "^2.5",
"typescript": "^5",
"vite": "^5.2"
},
"packageManager": "yarn@1.22.21"
}

View File

@@ -1,10 +1,10 @@
import { object, type InferType } from "yup";
import { z } from "zod";
const apiOrigin = import.meta.env.VITE_ENTE_ENDPOINT ?? "https://api.ente.io";
const userDetailsSchema = object({});
const UserDetails = z.object({}).passthrough();
export type UserDetails = InferType<typeof userDetailsSchema>;
export type UserDetails = z.infer<typeof UserDetails>;
/** Fetch details of the user associated with the given {@link authToken}. */
export const getUserDetails = async (
@@ -17,5 +17,5 @@ export const getUserDetails = async (
},
});
if (!res.ok) throw new Error(`Failed to fetch ${url}: HTTP ${res.status}`);
return await userDetailsSchema.validate(await res.json());
return UserDetails.parse(await res.json());
};

48
infra/staff/tsconfig.json Normal file
View File

@@ -0,0 +1,48 @@
{
/* TSConfig file used for typechecking the files in src/.
*
* The base configuration was generated using `yarn create vite`. This was
* already almost the same as the `tsconfig-typecheck.json` we use
* elsewhere, with one or two differences.
*
* For more details about the flags vite cares about, see
* https://vitejs.dev/guide/features.html#typescript-compiler-options
*/
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "esnext",
"skipLibCheck": true,
/* Bundler mode. */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
/* Linting. */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
/*
* On top of the generated configuration, we've mostly added additional
* strictness checks.
*/
/* Require the `type` modifier when importing types. */
"verbatimModuleSyntax": true,
/* Stricter than strict. */
"noImplicitReturns": true,
/* e.g. makes array indexing returns undefined. */
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}

View File

@@ -0,0 +1,15 @@
{
/* TSConfig file used for typechecking vite's config file itself.
*
* These are vite defaults, generated using `yarn create vite`.
*/
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"strict": true
},
"include": ["vite.config.ts"]
}

2654
infra/staff/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,30 +1,30 @@
Entre est une application simple qui sauvegarde et organisé vos photos et vidéos.
Entre est une application simple qui sauvegarde et organise vos photos et vidéos.
Si vous recherchez une alternative respectueuse de la vie privée pour préserver vos souvenirs, 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.
Si vous recherchez une alternative respectueuse de votre vie privée pour préserver vos souvenirs, 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).
Nous avons des applications pour Android, iOS, Web et Ordinateur, et vos photos seront synchronisées de manière transparente entre tous vos appareils avec une méthode de chiffrement de bout en bout (e2ee).
Ente vous permet également de partager vos albums avec vos proches. Vous pouvez soit les partager directement avec d'autres utilisateurs Ente, chiffrés de bout en bout ou avec des liens visibles publiquement.
Vos données chiffrées sont stockées à travers de multiples endroits, dont un abri antiatomique à Paris. Nous prenons la postérité au sérieux et facilitons la conservation de vos souvenirs.
Vos données chiffrées sont stockées dans de multiples endroits, 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
- Sauvegardes en qualité originale, car chaque pixel est important
- Abonnement familiaux, pour que vous puissiez partager l'espace de stockage avec votre famille
- 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 et être configurés pour expirer
- Liens vers les albums, qui peuvent être protégés par un mot de passe et être configurés pour expirer
- Possibilité de libérer de l'espace en supprimant les fichiers qui ont été sauvegardés en toute sécurité
- Éditeur d'images, pour ajouter des touches de finition
- Favoriser, cacher et revivre vos souvenirs, car ils sont précieux
- Favoris, 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 !
💲 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.
Nous ne proposons pas d'abonnements gratuits à vie, car il est important pour nous de rester pérenne 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.

View File

@@ -1,9 +1,9 @@
import "dart:async";
import 'dart:convert';
import "dart:io";
import 'dart:typed_data';
import 'package:bip39/bip39.dart' as bip39;
import "package:flutter/services.dart";
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart';
@@ -97,37 +97,58 @@ class Configuration {
);
Future<void> init() async {
_preferences = await SharedPreferences.getInstance();
_secureStorage = const FlutterSecureStorage();
_documentsDirectory = (await getApplicationDocumentsDirectory()).path;
_tempDocumentsDirPath = _documentsDirectory + "/temp/";
final tempDocumentsDir = Directory(_tempDocumentsDirPath);
await _cleanUpStaleFiles(tempDocumentsDir);
tempDocumentsDir.createSync(recursive: true);
final tempDirectoryPath = (await getTemporaryDirectory()).path;
_thumbnailCacheDirectory = tempDirectoryPath + "/thumbnail-cache";
Directory(_thumbnailCacheDirectory).createSync(recursive: true);
_sharedTempMediaDirectory = tempDirectoryPath + "/ente-shared-media";
Directory(_sharedTempMediaDirectory).createSync(recursive: true);
_sharedDocumentsMediaDirectory = _documentsDirectory + "/ente-shared-media";
Directory(_sharedDocumentsMediaDirectory).createSync(recursive: true);
if (!_preferences.containsKey(tokenKey)) {
await _secureStorage.deleteAll(iOptions: _secureStorageOptionsIOS);
} else {
_key = await _secureStorage.read(
key: keyKey,
iOptions: _secureStorageOptionsIOS,
);
_secretKey = await _secureStorage.read(
key: secretKeyKey,
iOptions: _secureStorageOptionsIOS,
);
if (_key == null) {
await logout(autoLogout: true);
try {
_preferences = await SharedPreferences.getInstance();
_secureStorage = const FlutterSecureStorage();
_documentsDirectory = (await getApplicationDocumentsDirectory()).path;
_tempDocumentsDirPath = _documentsDirectory + "/temp/";
final tempDocumentsDir = Directory(_tempDocumentsDirPath);
await _cleanUpStaleFiles(tempDocumentsDir);
tempDocumentsDir.createSync(recursive: true);
final tempDirectoryPath = (await getTemporaryDirectory()).path;
_thumbnailCacheDirectory = tempDirectoryPath + "/thumbnail-cache";
Directory(_thumbnailCacheDirectory).createSync(recursive: true);
_sharedTempMediaDirectory = tempDirectoryPath + "/ente-shared-media";
Directory(_sharedTempMediaDirectory).createSync(recursive: true);
_sharedDocumentsMediaDirectory =
_documentsDirectory + "/ente-shared-media";
Directory(_sharedDocumentsMediaDirectory).createSync(recursive: true);
if (!_preferences.containsKey(tokenKey)) {
await _secureStorage.deleteAll(iOptions: _secureStorageOptionsIOS);
} else {
_key = await _secureStorage.read(
key: keyKey,
iOptions: _secureStorageOptionsIOS,
);
_secretKey = await _secureStorage.read(
key: secretKeyKey,
iOptions: _secureStorageOptionsIOS,
);
if (_key == null) {
await logout(autoLogout: true);
}
await _migrateSecurityStorageToFirstUnlock();
}
SuperLogging.setUserID(await _getOrCreateAnonymousUserID()).ignore();
} catch (e, s) {
_logger.severe("Configuration init failed", e, s);
/*
Check if it's a known is related to reading secret from secure storage
on android https://github.com/mogol/flutter_secure_storage/issues/541
*/
if (e is PlatformException) {
final PlatformException error = e;
final bool isBadPaddingError =
error.toString().contains('BadPaddingException') ||
(error.message ?? '').contains('BadPaddingException');
if (isBadPaddingError) {
await logout(autoLogout: true);
return;
}
} else {
rethrow;
}
await _migrateSecurityStorageToFirstUnlock();
}
SuperLogging.setUserID(await _getOrCreateAnonymousUserID()).ignore();
}
// _cleanUpStaleFiles deletes all files in the temp directory that are older
@@ -167,14 +188,16 @@ class Configuration {
}
Future<void> logout({bool autoLogout = false}) async {
if (SyncService.instance.isSyncInProgress()) {
SyncService.instance.stopSync();
try {
await SyncService.instance
.existingSync()
.timeout(const Duration(seconds: 5));
} catch (e) {
// ignore
if (!autoLogout) {
if (SyncService.instance.isSyncInProgress()) {
SyncService.instance.stopSync();
try {
await SyncService.instance
.existingSync()
.timeout(const Duration(seconds: 5));
} catch (e) {
// ignore
}
}
}
await _preferences.clear();

View File

@@ -22,61 +22,55 @@ extension DeviceFiles on FilesDB {
ConflictAlgorithm conflictAlgorithm = ConflictAlgorithm.ignore,
}) async {
debugPrint("Inserting missing PathIDToLocalIDMapping");
final db = await database;
var batch = db.batch();
final parameterSets = <List<Object?>>[];
int batchCounter = 0;
for (MapEntry e in mappingToAdd.entries) {
final String pathID = e.key;
for (String localID in e.value) {
parameterSets.add([localID, pathID]);
batchCounter++;
if (batchCounter == 400) {
await batch.commit(noResult: true);
batch = db.batch();
await _insertBatch(parameterSets, conflictAlgorithm);
parameterSets.clear();
batchCounter = 0;
}
batch.insert(
"device_files",
{
"id": localID,
"path_id": pathID,
},
conflictAlgorithm: conflictAlgorithm,
);
batchCounter++;
}
}
await batch.commit(noResult: true);
await _insertBatch(parameterSets, conflictAlgorithm);
parameterSets.clear();
batchCounter = 0;
}
Future<void> deletePathIDToLocalIDMapping(
Map<String, Set<String>> mappingsToRemove,
) async {
debugPrint("removing PathIDToLocalIDMapping");
final db = await database;
var batch = db.batch();
final parameterSets = <List<Object?>>[];
int batchCounter = 0;
for (MapEntry e in mappingsToRemove.entries) {
final String pathID = e.key;
for (String localID in e.value) {
parameterSets.add([localID, pathID]);
batchCounter++;
if (batchCounter == 400) {
await batch.commit(noResult: true);
batch = db.batch();
await _deleteBatch(parameterSets);
parameterSets.clear();
batchCounter = 0;
}
batch.delete(
"device_files",
where: 'id = ? AND path_id = ?',
whereArgs: [localID, pathID],
);
batchCounter++;
}
}
await batch.commit(noResult: true);
await _deleteBatch(parameterSets);
parameterSets.clear();
batchCounter = 0;
}
Future<Map<String, int>> getDevicePathIDToImportedFileCount() async {
try {
final db = await database;
final rows = await db.rawQuery(
final db = await sqliteAsyncDB;
final rows = await db.getAll(
'''
SELECT count(*) as count, path_id
FROM device_files
@@ -96,8 +90,8 @@ extension DeviceFiles on FilesDB {
Future<Map<String, Set<String>>> getDevicePathIDToLocalIDMap() async {
try {
final db = await database;
final rows = await db.rawQuery(
final db = await sqliteAsyncDB;
final rows = await db.getAll(
''' SELECT id, path_id FROM device_files; ''',
);
final result = <String, Set<String>>{};
@@ -116,8 +110,8 @@ extension DeviceFiles on FilesDB {
}
Future<Set<String>> getDevicePathIDs() async {
final Database db = await database;
final rows = await db.rawQuery(
final db = await sqliteAsyncDB;
final rows = await db.getAll(
'''
SELECT id FROM device_collections
''',
@@ -133,34 +127,42 @@ extension DeviceFiles on FilesDB {
List<LocalPathAsset> localPathAssets, {
bool shouldAutoBackup = false,
}) async {
final Database db = await database;
final db = await sqliteAsyncDB;
final Map<String, Set<String>> pathIDToLocalIDsMap = {};
try {
final batch = db.batch();
final Set<String> existingPathIds = await getDevicePathIDs();
final parameterSetsForUpdate = <List<Object?>>[];
final parameterSetsForInsert = <List<Object?>>[];
for (LocalPathAsset localPathAsset in localPathAssets) {
if (localPathAsset.localIDs.isNotEmpty) {
pathIDToLocalIDsMap[localPathAsset.pathID] = localPathAsset.localIDs;
}
if (existingPathIds.contains(localPathAsset.pathID)) {
batch.rawUpdate(
"UPDATE device_collections SET name = ? where id = "
"?",
[localPathAsset.pathName, localPathAsset.pathID],
);
parameterSetsForUpdate
.add([localPathAsset.pathName, localPathAsset.pathID]);
} else if (localPathAsset.localIDs.isNotEmpty) {
batch.insert(
"device_collections",
{
"id": localPathAsset.pathID,
"name": localPathAsset.pathName,
"should_backup": shouldAutoBackup ? _sqlBoolTrue : _sqlBoolFalse,
},
conflictAlgorithm: ConflictAlgorithm.ignore,
);
parameterSetsForInsert.add([
localPathAsset.pathID,
localPathAsset.pathName,
shouldAutoBackup ? _sqlBoolTrue : _sqlBoolFalse,
]);
}
}
await batch.commit(noResult: true);
await db.executeBatch(
'''
INSERT OR IGNORE INTO device_collections (id, name, should_backup) VALUES (?, ?, ?);
''',
parameterSetsForInsert,
);
await db.executeBatch(
'''
UPDATE device_collections SET name = ? WHERE id = ?;
''',
parameterSetsForUpdate,
);
// add the mappings for localIDs
if (pathIDToLocalIDsMap.isNotEmpty) {
await insertPathIDToLocalIDMapping(pathIDToLocalIDsMap);
@@ -177,7 +179,7 @@ extension DeviceFiles on FilesDB {
}) async {
bool hasUpdated = false;
try {
final Database db = await database;
final db = await sqliteAsyncDB;
final Set<String> existingPathIds = await getDevicePathIDs();
for (Tuple2<AssetPathEntity, String> tup in devicePathInfo) {
final AssetPathEntity pathEntity = tup.item1;
@@ -185,35 +187,42 @@ extension DeviceFiles on FilesDB {
final String localID = tup.item2;
final bool shouldUpdate = existingPathIds.contains(pathEntity.id);
if (shouldUpdate) {
final rowUpdated = await db.rawUpdate(
"UPDATE device_collections SET name = ?, cover_id = ?, count"
" = ? where id = ? AND (name != ? OR cover_id != ? OR count != ?)",
[
pathEntity.name,
localID,
assetCount,
pathEntity.id,
pathEntity.name,
localID,
assetCount,
],
);
final rowUpdated = await db.writeTransaction((tx) async {
await tx.execute(
"UPDATE device_collections SET name = ?, cover_id = ?, count"
" = ? where id = ? AND (name != ? OR cover_id != ? OR count != ?)",
[
pathEntity.name,
localID,
assetCount,
pathEntity.id,
pathEntity.name,
localID,
assetCount,
],
);
final result = await tx.get("SELECT changes();");
return result["changes()"] as int;
});
if (rowUpdated > 0) {
_logger.fine("Updated $rowUpdated rows for ${pathEntity.name}");
hasUpdated = true;
}
} else {
hasUpdated = true;
await db.insert(
"device_collections",
{
"id": pathEntity.id,
"name": pathEntity.name,
"count": assetCount,
"cover_id": localID,
"should_backup": shouldBackup ? _sqlBoolTrue : _sqlBoolFalse,
},
conflictAlgorithm: ConflictAlgorithm.ignore,
await db.execute(
'''
INSERT INTO device_collections (id, name, count, cover_id, should_backup)
VALUES (?, ?, ?, ?, ?);
''',
[
pathEntity.id,
pathEntity.name,
assetCount,
localID,
shouldBackup ? _sqlBoolTrue : _sqlBoolFalse,
],
);
}
}
@@ -231,15 +240,17 @@ extension DeviceFiles on FilesDB {
// feature, where we delete files which are backed up. Deleting such
// entries here result in us losing out on the information that
// those folders were marked for automatic backup.
await db.delete(
"device_collections",
where: 'id = ? and should_backup = $_sqlBoolFalse ',
whereArgs: [pathID],
await db.execute(
'''
DELETE FROM device_collections WHERE id = ? AND should_backup = $_sqlBoolFalse;
''',
[pathID],
);
await db.delete(
"device_files",
where: 'path_id = ?',
whereArgs: [pathID],
await db.execute(
'''
DELETE FROM device_files WHERE path_id = ?;
''',
[pathID],
);
}
}
@@ -253,8 +264,8 @@ extension DeviceFiles on FilesDB {
// getDeviceSyncCollectionIDs returns the collectionIDs for the
// deviceCollections which are marked for auto-backup
Future<Set<int>> getDeviceSyncCollectionIDs() async {
final Database db = await database;
final rows = await db.rawQuery(
final db = await sqliteAsyncDB;
final rows = await db.getAll(
'''
SELECT collection_id FROM device_collections where should_backup =
$_sqlBoolTrue
@@ -268,40 +279,47 @@ extension DeviceFiles on FilesDB {
return result;
}
Future<void> updateDevicePathSyncStatus(Map<String, bool> syncStatus) async {
final db = await database;
var batch = db.batch();
Future<void> updateDevicePathSyncStatus(
Map<String, bool> syncStatus,
) async {
final db = await sqliteAsyncDB;
int batchCounter = 0;
final parameterSets = <List<Object?>>[];
for (MapEntry e in syncStatus.entries) {
final String pathID = e.key;
parameterSets.add([e.value ? _sqlBoolTrue : _sqlBoolFalse, pathID]);
batchCounter++;
if (batchCounter == 400) {
await batch.commit(noResult: true);
batch = db.batch();
await db.executeBatch(
'''
UPDATE device_collections SET should_backup = ? WHERE id = ?;
''',
parameterSets,
);
parameterSets.clear();
batchCounter = 0;
}
batch.update(
"device_collections",
{
"should_backup": e.value ? _sqlBoolTrue : _sqlBoolFalse,
},
where: 'id = ?',
whereArgs: [pathID],
);
batchCounter++;
}
await batch.commit(noResult: true);
await db.executeBatch(
'''
UPDATE device_collections SET should_backup = ? WHERE id = ?;
''',
parameterSets,
);
}
Future<void> updateDeviceCollection(
String pathID,
int collectionID,
) async {
final db = await database;
await db.update(
"device_collections",
{"collection_id": collectionID},
where: 'id = ?',
whereArgs: [pathID],
final db = await sqliteAsyncDB;
await db.execute(
'''
UPDATE device_collections SET collection_id = ? WHERE id = ?;
''',
[collectionID, pathID],
);
return;
}
@@ -314,7 +332,7 @@ extension DeviceFiles on FilesDB {
int? limit,
bool? asc,
}) async {
final db = await database;
final db = await sqliteAsyncDB;
final order = (asc ?? false ? 'ASC' : 'DESC');
final String rawQuery = '''
SELECT *
@@ -329,7 +347,7 @@ extension DeviceFiles on FilesDB {
ORDER BY ${FilesDB.columnCreationTime} $order , ${FilesDB.columnModificationTime} $order
''' +
(limit != null ? ' limit $limit;' : ';');
final results = await db.rawQuery(rawQuery);
final results = await db.getAll(rawQuery);
final files = convertToFiles(results);
final dedupe = deduplicateByLocalID(files);
return FileLoadResult(dedupe, files.length == limit);
@@ -339,7 +357,7 @@ extension DeviceFiles on FilesDB {
String pathID,
int ownerID,
) async {
final db = await database;
final db = await sqliteAsyncDB;
const String rawQuery = '''
SELECT ${FilesDB.columnLocalID}, ${FilesDB.columnUploadedFileID},
${FilesDB.columnFileSize}
@@ -351,7 +369,7 @@ extension DeviceFiles on FilesDB {
${FilesDB.columnLocalID} IN
(SELECT id FROM device_files where path_id = ?)
''';
final results = await db.rawQuery(rawQuery, [ownerID, pathID]);
final results = await db.getAll(rawQuery, [ownerID, pathID]);
final localIDs = <String>{};
final uploadedIDs = <int>{};
int localSize = 0;
@@ -375,17 +393,17 @@ extension DeviceFiles on FilesDB {
"$includeCoverThumbnail",
);
try {
final db = await database;
final db = await sqliteAsyncDB;
final coverFiles = <EnteFile>[];
if (includeCoverThumbnail) {
final fileRows = await db.rawQuery(
final fileRows = await db.getAll(
'''SELECT * FROM FILES where local_id in (select cover_id from device_collections) group by local_id;
''',
);
final files = convertToFiles(fileRows);
coverFiles.addAll(files);
}
final deviceCollectionRows = await db.rawQuery(
final deviceCollectionRows = await db.getAll(
'''SELECT * from device_collections''',
);
final List<DeviceCollection> deviceCollections = [];
@@ -433,8 +451,8 @@ extension DeviceFiles on FilesDB {
Future<EnteFile?> getDeviceCollectionThumbnail(String pathID) async {
debugPrint("Call fallback method to get potential thumbnail");
final db = await database;
final fileRows = await db.rawQuery(
final db = await sqliteAsyncDB;
final fileRows = await db.getAll(
'''SELECT * FROM FILES f JOIN device_files df on f.local_id = df.id
and df.path_id= ? order by f.creation_time DESC limit 1;
''',
@@ -447,4 +465,28 @@ extension DeviceFiles on FilesDB {
return null;
}
}
Future<void> _insertBatch(
List<List<Object?>> parameterSets,
ConflictAlgorithm conflictAlgorithm,
) async {
final db = await sqliteAsyncDB;
await db.executeBatch(
'''
INSERT OR ${conflictAlgorithm.name.toUpperCase()}
INTO device_files (id, path_id) VALUES (?, ?);
''',
parameterSets,
);
}
Future<void> _deleteBatch(List<List<Object?>> parameterSets) async {
final db = await sqliteAsyncDB;
await db.executeBatch(
'''
DELETE FROM device_files WHERE id = ? AND path_id = ?;
''',
parameterSets,
);
}
}

View File

@@ -10,53 +10,78 @@ extension EntitiesDB on FilesDB {
ConflictAlgorithm conflictAlgorithm = ConflictAlgorithm.replace,
}) async {
debugPrint("entitiesDB: upsertEntities ${data.length} entities");
final db = await database;
var batch = db.batch();
final db = await sqliteAsyncDB;
final parameterSets = <List<Object?>>[];
int batchCounter = 0;
for (LocalEntityData e in data) {
parameterSets.add([
e.id,
e.type.name,
e.ownerID,
e.data,
e.updatedAt,
]);
batchCounter++;
if (batchCounter == 400) {
await batch.commit(noResult: true);
batch = db.batch();
await db.executeBatch(
'''
INSERT OR ${conflictAlgorithm.name.toUpperCase()}
INTO entities (id, type, ownerID, data, updatedAt)
VALUES (?, ?, ?, ?, ?)
''',
parameterSets,
);
parameterSets.clear();
batchCounter = 0;
}
batch.insert(
"entities",
e.toJson(),
conflictAlgorithm: conflictAlgorithm,
);
batchCounter++;
}
await batch.commit(noResult: true);
await db.executeBatch(
'''
INSERT OR ${conflictAlgorithm.name.toUpperCase()}
INTO entities (id, type, ownerID, data, updatedAt)
VALUES (?, ?, ?, ?, ?)
''',
parameterSets,
);
}
Future<void> deleteEntities(
List<String> ids,
) async {
final db = await database;
var batch = db.batch();
final db = await sqliteAsyncDB;
final parameterSets = <List<Object?>>[];
int batchCounter = 0;
for (String id in ids) {
if (batchCounter == 400) {
await batch.commit(noResult: true);
batch = db.batch();
batchCounter = 0;
}
batch.delete(
"entities",
where: "id = ?",
whereArgs: [id],
parameterSets.add(
[id],
);
batchCounter++;
if (batchCounter == 400) {
await db.executeBatch(
'''
DELETE FROM entities WHERE id = ?
''',
parameterSets,
);
parameterSets.clear();
batchCounter = 0;
}
}
await batch.commit(noResult: true);
await db.executeBatch(
'''
DELETE FROM entities WHERE id = ?
''',
parameterSets,
);
}
Future<List<LocalEntityData>> getEntities(EntityType type) async {
final db = await database;
final List<Map<String, dynamic>> maps = await db.query(
"entities",
where: "type = ?",
whereArgs: [type.typeToString()],
final db = await sqliteAsyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
'SELECT * FROM entities WHERE type = ?',
[type.name],
);
return List.generate(maps.length, (i) {
return LocalEntityData.fromJson(maps[i]);
@@ -64,11 +89,10 @@ extension EntitiesDB on FilesDB {
}
Future<LocalEntityData?> getEntity(EntityType type, String id) async {
final db = await database;
final List<Map<String, dynamic>> maps = await db.query(
"entities",
where: "type = ? AND id = ?",
whereArgs: [type.typeToString(), id],
final db = await sqliteAsyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
'SELECT * FROM entities WHERE type = ? AND id = ?',
[type.name, id],
);
if (maps.isEmpty) {
return null;

File diff suppressed because it is too large Load Diff

View File

@@ -35,6 +35,15 @@ class FaceMLDataDB {
static final FaceMLDataDB instance = FaceMLDataDB._privateConstructor();
static final _migrationScripts = [
createFacesTable,
createFaceClustersTable,
createClusterPersonTable,
createClusterSummaryTable,
createNotPersonFeedbackTable,
fcClusterIDIndex,
];
// only have a single app-wide reference to the database
static Future<SqliteDatabase>? _sqliteAsyncDBFuture;
@@ -50,17 +59,42 @@ class FaceMLDataDB {
_logger.info("Opening sqlite_async access: DB path " + databaseDirectory);
final asyncDBConnection =
SqliteDatabase(path: databaseDirectory, maxReaders: 2);
await _onCreate(asyncDBConnection);
final stopwatch = Stopwatch()..start();
_logger.info("FaceMLDataDB: Starting migration");
await _migrate(asyncDBConnection);
_logger.info(
"FaceMLDataDB Migration took ${stopwatch.elapsedMilliseconds} ms",
);
stopwatch.stop();
return asyncDBConnection;
}
Future<void> _onCreate(SqliteDatabase asyncDBConnection) async {
await asyncDBConnection.execute(createFacesTable);
await asyncDBConnection.execute(createFaceClustersTable);
await asyncDBConnection.execute(createClusterPersonTable);
await asyncDBConnection.execute(createClusterSummaryTable);
await asyncDBConnection.execute(createNotPersonFeedbackTable);
await asyncDBConnection.execute(fcClusterIDIndex);
Future<void> _migrate(
SqliteDatabase database,
) async {
final result = await database.execute('PRAGMA user_version');
final currentVersion = result[0]['user_version'] as int;
final toVersion = _migrationScripts.length;
if (currentVersion < toVersion) {
_logger.info("Migrating database from $currentVersion to $toVersion");
await database.writeTransaction((tx) async {
for (int i = currentVersion + 1; i <= toVersion; i++) {
try {
await tx.execute(_migrationScripts[i - 1]);
} catch (e) {
_logger.severe("Error running migration script index ${i - 1}", e);
rethrow;
}
}
await tx.execute('PRAGMA user_version = $toVersion');
});
} else if (currentVersion > toVersion) {
throw AssertionError(
"currentVersion($currentVersion) cannot be greater than toVersion($toVersion)",
);
}
}
// bulkInsertFaces inserts the faces in the database in batches of 1000.
@@ -195,10 +229,10 @@ class FaceMLDataDB {
final db = await instance.asyncDB;
await db.execute(deleteFacesTable);
await db.execute(dropClusterPersonTable);
await db.execute(dropClusterSummaryTable);
await db.execute(deletePersonTable);
await db.execute(dropNotPersonFeedbackTable);
await db.execute(deleteFaceClustersTable);
await db.execute(deleteClusterPersonTable);
await db.execute(deleteClusterSummaryTable);
await db.execute(deleteNotPersonFeedbackTable);
}
Future<Iterable<Uint8List>> getFaceEmbeddingsForCluster(
@@ -734,7 +768,7 @@ class FaceMLDataDB {
try {
final db = await instance.asyncDB;
await db.execute(dropFaceClustersTable);
await db.execute(deleteFaceClustersTable);
await db.execute(createFaceClustersTable);
await db.execute(fcClusterIDIndex);
} catch (e, s) {
@@ -807,6 +841,18 @@ class FaceMLDataDB {
await db.executeBatch(sql, parameterSets);
}
Future<void> removeNotPersonFeedback({
required String personID,
required int clusterID,
}) async {
final db = await instance.asyncDB;
const String sql = '''
DELETE FROM $notPersonFeedback WHERE $personIdColumn = ? AND $clusterIDColumn = ?
''';
await db.execute(sql, [personID, clusterID]);
}
Future<void> removeClusterToPerson({
required String personID,
required int clusterID,
@@ -945,16 +991,15 @@ class FaceMLDataDB {
if (faces) {
await db.execute(deleteFacesTable);
await db.execute(createFacesTable);
await db.execute(dropFaceClustersTable);
await db.execute(deleteFaceClustersTable);
await db.execute(createFaceClustersTable);
await db.execute(fcClusterIDIndex);
}
await db.execute(deletePersonTable);
await db.execute(dropClusterPersonTable);
await db.execute(dropNotPersonFeedbackTable);
await db.execute(dropClusterSummaryTable);
await db.execute(dropFaceClustersTable);
await db.execute(deleteClusterPersonTable);
await db.execute(deleteNotPersonFeedbackTable);
await db.execute(deleteClusterSummaryTable);
await db.execute(deleteFaceClustersTable);
await db.execute(createClusterPersonTable);
await db.execute(createNotPersonFeedbackTable);
@@ -972,9 +1017,8 @@ class FaceMLDataDB {
final db = await instance.asyncDB;
// Drop the tables
await db.execute(deletePersonTable);
await db.execute(dropClusterPersonTable);
await db.execute(dropNotPersonFeedbackTable);
await db.execute(deleteClusterPersonTable);
await db.execute(deleteNotPersonFeedbackTable);
// Recreate the tables
await db.execute(createClusterPersonTable);

View File

@@ -29,7 +29,7 @@ const createFacesTable = '''CREATE TABLE IF NOT EXISTS $facesTable (
);
''';
const deleteFacesTable = 'DROP TABLE IF EXISTS $facesTable';
const deleteFacesTable = 'DELETE FROM $facesTable';
// End of Faces Table Fields & Schema Queries
//##region Face Clusters Table Fields & Schema Queries
@@ -48,15 +48,9 @@ CREATE TABLE IF NOT EXISTS $faceClustersTable (
// -- Creating a non-unique index on clusterID for query optimization
const fcClusterIDIndex =
'''CREATE INDEX IF NOT EXISTS idx_fcClusterID ON $faceClustersTable($fcClusterID);''';
const dropFaceClustersTable = 'DROP TABLE IF EXISTS $faceClustersTable';
const deleteFaceClustersTable = 'DELETE FROM $faceClustersTable';
//##endregion
// People Table Fields & Schema Queries
const personTable = 'person';
const deletePersonTable = 'DROP TABLE IF EXISTS $personTable';
//End People Table Fields & Schema Queries
// Clusters Table Fields & Schema Queries
const clusterPersonTable = 'cluster_person';
const personIdColumn = 'person_id';
@@ -69,7 +63,7 @@ CREATE TABLE IF NOT EXISTS $clusterPersonTable (
PRIMARY KEY($personIdColumn, $clusterIDColumn)
);
''';
const dropClusterPersonTable = 'DROP TABLE IF EXISTS $clusterPersonTable';
const deleteClusterPersonTable = 'DELETE FROM $clusterPersonTable';
// End Clusters Table Fields & Schema Queries
/// Cluster Summary Table Fields & Schema Queries
@@ -85,7 +79,7 @@ CREATE TABLE IF NOT EXISTS $clusterSummaryTable (
);
''';
const dropClusterSummaryTable = 'DROP TABLE IF EXISTS $clusterSummaryTable';
const deleteClusterSummaryTable = 'DELETE FROM $clusterSummaryTable';
/// End Cluster Summary Table Fields & Schema Queries
@@ -99,5 +93,5 @@ CREATE TABLE IF NOT EXISTS $notPersonFeedback (
PRIMARY KEY($personIdColumn, $clusterIDColumn)
);
''';
const dropNotPersonFeedbackTable = 'DROP TABLE IF EXISTS $notPersonFeedback';
const deleteNotPersonFeedbackTable = 'DELETE FROM $notPersonFeedback';
// End Clusters Table Fields & Schema Queries

View File

@@ -50,8 +50,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Enter person name"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"indexingIsPaused": MessageLookupByLibrary.simpleMessage(

View File

@@ -41,13 +41,16 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "Version: ${versionValue}";
static String m8(paymentProvider) =>
static String m8(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} frei";
static String m9(paymentProvider) =>
"Bitte kündigen Sie Ihr aktuelles Abo über ${paymentProvider} zuerst";
static String m9(user) =>
static String m10(user) =>
"Der Nutzer \"${user}\" wird keine weiteren Fotos zum Album hinzufügen können.\n\nJedoch kann er weiterhin vorhandene Bilder, welche durch ihn hinzugefügt worden sind, wieder entfernen";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true':
'Deine Familiengruppe hat bereits ${storageAmountInGb} GB erhalten',
@@ -55,50 +58,47 @@ class MessageLookup extends MessageLookupByLibrary {
'other': 'Du hast bereits ${storageAmountInGb} GB erhalten!',
})}";
static String m11(albumName) =>
static String m12(albumName) =>
"Kollaborativer Link für ${albumName} erstellt";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"Bitte kontaktiere <green>${familyAdminEmail}</green> um dein Abo zu verwalten";
static String m13(provider) =>
static String m14(provider) =>
"Bitte kontaktieren Sie uns über support@ente.io, um Ihr ${provider} Abo zu verwalten.";
static String m14(count) =>
static String m15(count) =>
"${Intl.plural(count, one: 'Lösche ${count} Element', other: 'Lösche ${count} Elemente')}";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"Lösche ${currentlyDeleting} / ${totalCount}";
static String m16(albumName) =>
static String m17(albumName) =>
"Der öffentliche Link zum Zugriff auf \"${albumName}\" wird entfernt.";
static String m17(supportEmail) =>
static String m18(supportEmail) =>
"Bitte sende eine E-Mail an ${supportEmail} von deiner registrierten E-Mail-Adresse";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"Du hast ${Intl.plural(count, one: '${count} duplizierte Datei', other: '${count} dupliziere Dateien')} gelöscht und (${storageSaved}!) freigegeben";
static String m19(count, formattedSize) =>
static String m20(count, formattedSize) =>
"${count} Dateien, ${formattedSize} jede";
static String m20(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}";
static String m21(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}";
static String m21(email) =>
static String m22(email) =>
"${email} hat kein Ente-Konto.\n\nSenden Sie eine Einladung, um Fotos zu teilen.";
static String m22(count, formattedNumber) =>
static String m23(count, formattedNumber) =>
"${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert";
static String m23(count, formattedNumber) =>
static String m24(count, formattedNumber) =>
"${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} in diesem Album wurde(n) sicher gespeichert";
static String m24(storageAmountInGB) =>
static String m25(storageAmountInGB) =>
"${storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} kostenlos";
static String m26(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}";
static String m27(count) =>
@@ -368,6 +368,7 @@ class MessageLookup extends MessageLookupByLibrary {
"authenticationSuccessful": MessageLookupByLibrary.simpleMessage(
"Authentifizierung erfogreich!"),
"available": MessageLookupByLibrary.simpleMessage("Verfügbar"),
"availableStorageSpace": m8,
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Gesicherte Ordner"),
"backup": MessageLookupByLibrary.simpleMessage("Backup"),
@@ -393,10 +394,10 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Du kannst nur Dateien entfernen, die dir gehören"),
"cancel": MessageLookupByLibrary.simpleMessage("Abbrechen"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Abonnement kündigen"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Konnte geteilte Dateien nicht löschen"),
"castInstruction": MessageLookupByLibrary.simpleMessage(
@@ -421,7 +422,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Freien Speicher einlösen"),
"claimMore": MessageLookupByLibrary.simpleMessage("Mehr einlösen!"),
"claimed": MessageLookupByLibrary.simpleMessage("Eingelöst"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"cleanUncategorized":
MessageLookupByLibrary.simpleMessage("Unkategorisiert leeren"),
"cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage(
@@ -448,7 +449,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Erstelle einen Link, um anderen zu ermöglichen, Fotos in deinem geteilten Album hinzuzufügen und zu sehen - ohne dass diese ein Konto von ente.io oder die App benötigen. Ideal, um Fotos von Events zu sammeln."),
"collaborativeLink":
MessageLookupByLibrary.simpleMessage("Gemeinschaftlicher Link"),
"collaborativeLinkCreatedFor": m11,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("Bearbeiter"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
@@ -475,10 +476,10 @@ class MessageLookup extends MessageLookupByLibrary {
"Wiederherstellungsschlüssel bestätigen"),
"confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Bestätigen Sie ihren Wiederherstellungsschlüssel"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Support kontaktieren"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("Kontakte"),
"contents": MessageLookupByLibrary.simpleMessage("Inhalte"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Weiter"),
@@ -558,11 +559,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Vom Gerät löschen"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Auf ente.io löschen"),
"deleteItemCount": m14,
"deleteItemCount": m15,
"deleteLocation":
MessageLookupByLibrary.simpleMessage("Standort löschen"),
"deletePhotos": MessageLookupByLibrary.simpleMessage("Fotos löschen"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Es fehlt eine zentrale Funktion, die ich benötige"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -582,8 +583,6 @@ class MessageLookup extends MessageLookupByLibrary {
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Entwickelt um zu bewahren"),
"details": MessageLookupByLibrary.simpleMessage("Details"),
"devAccountChanged": MessageLookupByLibrary.simpleMessage(
"Das Entwicklerkonto, das wir verwenden, um ente im App Store zu veröffentlichen, hat sich geändert. Aus diesem Grund musst du dich erneut anmelden.\n\nWir entschuldigen uns für die Unannehmlichkeiten, aber das war unvermeidlich."),
"deviceCodeHint": MessageLookupByLibrary.simpleMessage("Code eingeben"),
"deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage(
"Dateien, die zu diesem Album hinzugefügt werden, werden automatisch zu ente hochgeladen."),
@@ -598,7 +597,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Zuschauer können weiterhin Screenshots oder mit anderen externen Programmen Kopien der Bilder machen."),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Bitte beachten Sie:"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor": MessageLookupByLibrary.simpleMessage(
"Zweiten Faktor (2FA) deaktivieren"),
"disablingTwofactorAuthentication":
@@ -621,9 +620,9 @@ class MessageLookup extends MessageLookupByLibrary {
"Herunterladen fehlgeschlagen"),
"downloading":
MessageLookupByLibrary.simpleMessage("Wird heruntergeladen..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"duplicateItemsGroup": m19,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"duplicateItemsGroup": m20,
"edit": MessageLookupByLibrary.simpleMessage("Bearbeiten"),
"editLocation":
MessageLookupByLibrary.simpleMessage("Standort bearbeiten"),
@@ -636,8 +635,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Änderungen des Standorts werden nur in ente sichtbar sein"),
"eligible": MessageLookupByLibrary.simpleMessage("zulässig"),
"email": MessageLookupByLibrary.simpleMessage("E-Mail"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailVerificationToggle":
MessageLookupByLibrary.simpleMessage("E-Mail-Verifizierung"),
"emailYourLogs": MessageLookupByLibrary.simpleMessage(
@@ -706,8 +705,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Daten exportieren"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"faces": MessageLookupByLibrary.simpleMessage("Gesichter"),
"failedToApplyCode": MessageLookupByLibrary.simpleMessage(
"Der Code konnte nicht aktiviert werden"),
@@ -743,8 +740,8 @@ class MessageLookup extends MessageLookupByLibrary {
"fileTypes": MessageLookupByLibrary.simpleMessage("Dateitypen"),
"fileTypesAndNames":
MessageLookupByLibrary.simpleMessage("Dateitypen und -namen"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted":
MessageLookupByLibrary.simpleMessage("Dateien gelöscht"),
"findPeopleByName": MessageLookupByLibrary.simpleMessage(
@@ -757,8 +754,7 @@ class MessageLookup extends MessageLookupByLibrary {
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage(
"Kostenlos hinzugefügter Speicherplatz"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable": MessageLookupByLibrary.simpleMessage(
"Freier Speicherplatz nutzbar"),
"freeTrial":
@@ -928,8 +924,6 @@ class MessageLookup extends MessageLookupByLibrary {
"machineLearning":
MessageLookupByLibrary.simpleMessage("Maschinelles Lernen"),
"magicSearch": MessageLookupByLibrary.simpleMessage("Magische Suche"),
"magicSearchDescription": MessageLookupByLibrary.simpleMessage(
"Bitte beachten Sie, dass dies mehr Bandbreite nutzt und zu einem höheren Akkuverbrauch führt, bis alle Elemente indiziert sind."),
"manage": MessageLookupByLibrary.simpleMessage("Verwalten"),
"manageDeviceStorage":
MessageLookupByLibrary.simpleMessage("Gerätespeicher verwalten"),

View File

@@ -41,64 +41,64 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "Version: ${versionValue}";
static String m8(paymentProvider) =>
static String m8(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} free";
static String m9(paymentProvider) =>
"Please cancel your existing subscription from ${paymentProvider} first";
static String m9(user) =>
static String m10(user) =>
"${user} will not be able to add more photos to this album\n\nThey will still be able to remove existing photos added by them";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true': 'Your family has claimed ${storageAmountInGb} GB so far',
'false': 'You have claimed ${storageAmountInGb} GB so far',
'other': 'You have claimed ${storageAmountInGb} GB so far!',
})}";
static String m11(albumName) => "Collaborative link created for ${albumName}";
static String m12(albumName) => "Collaborative link created for ${albumName}";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"Please contact <green>${familyAdminEmail}</green> to manage your subscription";
static String m13(provider) =>
static String m14(provider) =>
"Please contact us at support@ente.io to manage your ${provider} subscription.";
static String m69(endpoint) => "Connected to ${endpoint}";
static String m14(count) =>
static String m15(count) =>
"${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"Deleting ${currentlyDeleting} / ${totalCount}";
static String m16(albumName) =>
static String m17(albumName) =>
"This will remove the public link for accessing \"${albumName}\".";
static String m17(supportEmail) =>
static String m18(supportEmail) =>
"Please drop an email to ${supportEmail} from your registered email address";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"You have cleaned up ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, saving (${storageSaved}!)";
static String m19(count, formattedSize) =>
static String m20(count, formattedSize) =>
"${count} files, ${formattedSize} each";
static String m20(newEmail) => "Email changed to ${newEmail}";
static String m21(newEmail) => "Email changed to ${newEmail}";
static String m21(email) =>
static String m22(email) =>
"${email} does not have an Ente account.\n\nSend them an invite to share photos.";
static String m22(count, formattedNumber) =>
static String m23(count, formattedNumber) =>
"${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely";
static String m23(count, formattedNumber) =>
static String m24(count, formattedNumber) =>
"${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} in this album has been backed up safely";
static String m24(storageAmountInGB) =>
static String m25(storageAmountInGB) =>
"${storageAmountInGB} GB each time someone signs up for a paid plan and applies your code";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} free";
static String m26(endDate) => "Free trial valid till ${endDate}";
static String m27(count) =>
@@ -362,10 +362,13 @@ class MessageLookup extends MessageLookupByLibrary {
"You\'ll see available Cast devices here."),
"autoCastiOSPermission": MessageLookupByLibrary.simpleMessage(
"Make sure Local Network permissions are turned on for the Ente Photos app, in Settings."),
"autoLogoutMessage": MessageLookupByLibrary.simpleMessage(
"Due to technical glitch, you have been logged out. Our apologies for the inconvenience."),
"autoPair": MessageLookupByLibrary.simpleMessage("Auto pair"),
"autoPairDesc": MessageLookupByLibrary.simpleMessage(
"Auto pair works only with devices that support Chromecast."),
"available": MessageLookupByLibrary.simpleMessage("Available"),
"availableStorageSpace": m8,
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Backed up folders"),
"backup": MessageLookupByLibrary.simpleMessage("Backup"),
@@ -389,10 +392,10 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Can only remove files owned by you"),
"cancel": MessageLookupByLibrary.simpleMessage("Cancel"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Cancel subscription"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"cannotDeleteSharedFiles":
MessageLookupByLibrary.simpleMessage("Cannot delete shared files"),
"castIPMismatchBody": MessageLookupByLibrary.simpleMessage(
@@ -420,7 +423,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Claim free storage"),
"claimMore": MessageLookupByLibrary.simpleMessage("Claim more!"),
"claimed": MessageLookupByLibrary.simpleMessage("Claimed"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"cleanUncategorized":
MessageLookupByLibrary.simpleMessage("Clean Uncategorized"),
"cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage(
@@ -447,7 +450,7 @@ class MessageLookup extends MessageLookupByLibrary {
"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,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("Collaborator"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
@@ -476,10 +479,10 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Confirm your recovery key"),
"connectToDevice":
MessageLookupByLibrary.simpleMessage("Connect to device"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Contact support"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("Contacts"),
"contents": MessageLookupByLibrary.simpleMessage("Contents"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Continue"),
@@ -557,11 +560,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Delete from device"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Delete from Ente"),
"deleteItemCount": m14,
"deleteItemCount": m15,
"deleteLocation":
MessageLookupByLibrary.simpleMessage("Delete location"),
"deletePhotos": MessageLookupByLibrary.simpleMessage("Delete photos"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Its missing a key feature that I need"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -581,8 +584,6 @@ class MessageLookup extends MessageLookupByLibrary {
"designedToOutlive":
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."),
"developerSettings":
MessageLookupByLibrary.simpleMessage("Developer settings"),
"developerSettingsWarning": MessageLookupByLibrary.simpleMessage(
@@ -602,7 +603,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Viewers can still take screenshots or save a copy of your photos using external tools"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Please note"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor":
MessageLookupByLibrary.simpleMessage("Disable two-factor"),
"disablingTwofactorAuthentication":
@@ -623,9 +624,9 @@ class MessageLookup extends MessageLookupByLibrary {
"downloadFailed":
MessageLookupByLibrary.simpleMessage("Download failed"),
"downloading": MessageLookupByLibrary.simpleMessage("Downloading..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"duplicateItemsGroup": m19,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"duplicateItemsGroup": m20,
"edit": MessageLookupByLibrary.simpleMessage("Edit"),
"editLocation": MessageLookupByLibrary.simpleMessage("Edit location"),
"editLocationTagTitle":
@@ -636,8 +637,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Edits to location will only be seen within Ente"),
"eligible": MessageLookupByLibrary.simpleMessage("eligible"),
"email": MessageLookupByLibrary.simpleMessage("Email"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailVerificationToggle":
MessageLookupByLibrary.simpleMessage("Email verification"),
"emailYourLogs":
@@ -704,8 +705,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Export your data"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"faces": MessageLookupByLibrary.simpleMessage("Faces"),
"failedToApplyCode":
MessageLookupByLibrary.simpleMessage("Failed to apply code"),
@@ -740,8 +739,8 @@ class MessageLookup extends MessageLookupByLibrary {
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"fileTypesAndNames":
MessageLookupByLibrary.simpleMessage("File types and names"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted": MessageLookupByLibrary.simpleMessage("Files deleted"),
"filesSavedToGallery":
MessageLookupByLibrary.simpleMessage("Files saved to gallery"),
@@ -755,8 +754,7 @@ class MessageLookup extends MessageLookupByLibrary {
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"freeStorageClaimed":
MessageLookupByLibrary.simpleMessage("Free storage claimed"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable":
MessageLookupByLibrary.simpleMessage("Free storage usable"),
"freeTrial": MessageLookupByLibrary.simpleMessage("Free trial"),
@@ -814,7 +812,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Incorrect recovery key"),
"indexedItems": MessageLookupByLibrary.simpleMessage("Indexed items"),
"indexingIsPaused": MessageLookupByLibrary.simpleMessage(
"Indexing is paused, will automatically resume when device is ready"),
"Indexing is paused. It will automatically resume when device is ready."),
"insecureDevice":
MessageLookupByLibrary.simpleMessage("Insecure device"),
"installManually":
@@ -921,8 +919,6 @@ class MessageLookup extends MessageLookupByLibrary {
"machineLearning":
MessageLookupByLibrary.simpleMessage("Machine learning"),
"magicSearch": MessageLookupByLibrary.simpleMessage("Magic search"),
"magicSearchDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"manage": MessageLookupByLibrary.simpleMessage("Manage"),
"manageDeviceStorage":
MessageLookupByLibrary.simpleMessage("Manage device storage"),
@@ -939,6 +935,8 @@ class MessageLookup extends MessageLookupByLibrary {
"matrix": MessageLookupByLibrary.simpleMessage("Matrix"),
"memoryCount": m33,
"merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"),
"mlIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."),
"mobileWebDesktop":
MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"),
"moderateStrength": MessageLookupByLibrary.simpleMessage("Moderate"),
@@ -1226,7 +1224,7 @@ class MessageLookup extends MessageLookupByLibrary {
"searchDatesEmptySection": MessageLookupByLibrary.simpleMessage(
"Search by a date, month or year"),
"searchFaceEmptySection": MessageLookupByLibrary.simpleMessage(
"Persons will be shown here once indexing is done"),
"People will be shown here once indexing is done"),
"searchFileTypesAndNamesEmptySection":
MessageLookupByLibrary.simpleMessage("File types and names"),
"searchHint1":

View File

@@ -38,13 +38,13 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "Versión: ${versionValue}";
static String m8(paymentProvider) =>
static String m9(paymentProvider) =>
"Por favor, cancele primero su suscripción existente de ${paymentProvider}";
static String m9(user) =>
static String m10(user) =>
"${user} no podrá añadir más fotos a este álbum\n\nTodavía podrán eliminar las fotos ya añadidas por ellos";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true':
'Su familia ha reclamado ${storageAmountInGb} GB hasta el momento',
@@ -54,44 +54,41 @@ class MessageLookup extends MessageLookupByLibrary {
'¡Tú has reclamado ${storageAmountInGb} GB hasta el momento!',
})}";
static String m11(albumName) =>
static String m12(albumName) =>
"Enlace colaborativo creado para ${albumName}";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"Por favor contacta con <green>${familyAdminEmail}</green> para administrar tu suscripción";
static String m13(provider) =>
static String m14(provider) =>
"Por favor, contáctenos en support@ente.io para gestionar su suscripción a ${provider}.";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"Borrando ${currentlyDeleting} / ${totalCount}";
static String m16(albumName) =>
static String m17(albumName) =>
"Esto eliminará el enlace público para acceder a \"${albumName}\".";
static String m17(supportEmail) =>
static String m18(supportEmail) =>
"Por favor, envíe un email a ${supportEmail} desde su dirección de correo electrónico registrada";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"¡Has limpiado ${Intl.plural(count, one: '${count} archivo duplicado', other: '${count} archivos duplicados')}, ahorrando (${storageSaved}!)";
static String m20(newEmail) => "Correo cambiado a ${newEmail}";
static String m21(newEmail) => "Correo cambiado a ${newEmail}";
static String m21(email) =>
static String m22(email) =>
"${email} no tiene una cuenta ente.\n\nEnvíale una invitación para compartir fotos.";
static String m22(count, formattedNumber) =>
static String m23(count, formattedNumber) =>
"${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este dispositivo han sido respaldados de forma segura";
static String m23(count, formattedNumber) =>
static String m24(count, formattedNumber) =>
"${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este álbum ha sido respaldado de forma segura";
static String m24(storageAmountInGB) =>
static String m25(storageAmountInGB) =>
"${storageAmountInGB} GB cada vez que alguien se registra en un plan de pago y aplica tu código";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} gratis";
static String m26(endDate) => "Prueba gratuita válida hasta${endDate}";
static String m27(count) =>
@@ -335,10 +332,10 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Sólo puede eliminar archivos de tu propiedad"),
"cancel": MessageLookupByLibrary.simpleMessage("Cancelar"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Cancelar suscripción"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"centerPoint": MessageLookupByLibrary.simpleMessage("Punto central"),
"changeEmail":
MessageLookupByLibrary.simpleMessage("Cambiar correo electrónico"),
@@ -359,7 +356,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Reclamar almacenamiento gratis"),
"claimMore": MessageLookupByLibrary.simpleMessage("¡Reclama más!"),
"claimed": MessageLookupByLibrary.simpleMessage("Reclamado"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"clearCaches": MessageLookupByLibrary.simpleMessage("Limpiar caché"),
"click": MessageLookupByLibrary.simpleMessage("• Click"),
"clickOnTheOverflowMenu": MessageLookupByLibrary.simpleMessage(
@@ -379,7 +376,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Crea un enlace para que la gente pueda añadir y ver fotos en tu álbum compartido sin necesidad de la aplicación ente o una cuenta. Genial para recolectar fotos de eventos."),
"collaborativeLink":
MessageLookupByLibrary.simpleMessage("Enlace colaborativo"),
"collaborativeLinkCreatedFor": m11,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("Colaborador"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
@@ -404,10 +401,10 @@ class MessageLookup extends MessageLookupByLibrary {
"Confirmar clave de recuperación"),
"confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Confirme su clave de recuperación"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Contactar con soporte"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("Contacts"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"),
"continueOnFreeTrial": MessageLookupByLibrary.simpleMessage(
@@ -482,7 +479,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Borrar la ubicación"),
"deletePhotos":
MessageLookupByLibrary.simpleMessage("Borrar las fotos"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Falta una característica clave que necesito"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -503,8 +500,6 @@ class MessageLookup extends MessageLookupByLibrary {
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Diseñado para sobrevivir"),
"details": MessageLookupByLibrary.simpleMessage("Detalles"),
"devAccountChanged": MessageLookupByLibrary.simpleMessage(
"La cuenta de desarrollador que utilizamos para publicar ente en la App Store ha cambiado. Por eso, tendrás que iniciar sesión de nuevo.\n\nNuestras disculpas por las molestias, pero esto era inevitable."),
"deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage(
"Los archivos añadidos a este álbum de dispositivo se subirán automáticamente a ente."),
"deviceLockExplanation": MessageLookupByLibrary.simpleMessage(
@@ -516,7 +511,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Los espectadores todavía pueden tomar capturas de pantalla o guardar una copia de sus fotos usando herramientas externas"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Por favor tenga en cuenta"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor":
MessageLookupByLibrary.simpleMessage("Deshabilitar dos factores"),
"disablingTwofactorAuthentication":
@@ -537,8 +532,8 @@ class MessageLookup extends MessageLookupByLibrary {
"downloadFailed":
MessageLookupByLibrary.simpleMessage("Descarga fallida"),
"downloading": MessageLookupByLibrary.simpleMessage("Descargando..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"edit": MessageLookupByLibrary.simpleMessage("Editar"),
"editLocation": MessageLookupByLibrary.simpleMessage("Edit location"),
"editLocationTagTitle":
@@ -550,8 +545,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Edits to location will only be seen within Ente"),
"eligible": MessageLookupByLibrary.simpleMessage("elegible"),
"email": MessageLookupByLibrary.simpleMessage("Correo electrónico"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailYourLogs": MessageLookupByLibrary.simpleMessage(
"Envíe sus registros por correo electrónico"),
"empty": MessageLookupByLibrary.simpleMessage("Vaciar"),
@@ -615,8 +610,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Exportar tus datos"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"failedToApplyCode":
MessageLookupByLibrary.simpleMessage("Error al aplicar el código"),
"failedToCancel":
@@ -646,8 +639,8 @@ class MessageLookup extends MessageLookupByLibrary {
"fileSavedToGallery": MessageLookupByLibrary.simpleMessage(
"Archivo guardado en la galería"),
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted":
MessageLookupByLibrary.simpleMessage("Archivos eliminados"),
"flip": MessageLookupByLibrary.simpleMessage("Voltear"),
@@ -658,8 +651,7 @@ class MessageLookup extends MessageLookupByLibrary {
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage(
"Almacenamiento gratuito reclamado"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable": MessageLookupByLibrary.simpleMessage(
"Almacenamiento libre disponible"),
"freeTrial": MessageLookupByLibrary.simpleMessage("Prueba gratuita"),

View File

@@ -38,13 +38,16 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "Version : ${versionValue}";
static String m8(paymentProvider) =>
static String m8(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} libre";
static String m9(paymentProvider) =>
"Veuillez d\'abord annuler votre abonnement existant de ${paymentProvider}";
static String m9(user) =>
static String m10(user) =>
"${user} ne pourra pas ajouter plus de photos à cet album\n\nIl pourrait toujours supprimer les photos existantes ajoutées par eux";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true':
'Votre famille a demandé ${storageAmountInGb} GB jusqu\'à présent',
@@ -54,49 +57,46 @@ class MessageLookup extends MessageLookupByLibrary {
'Vous avez réclamé ${storageAmountInGb} GB jusqu\'à présent!',
})}";
static String m11(albumName) => "Lien collaboratif créé pour ${albumName}";
static String m12(albumName) => "Lien collaboratif créé pour ${albumName}";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"Veuillez contacter <green>${familyAdminEmail}</green> pour gérer votre abonnement";
static String m13(provider) =>
static String m14(provider) =>
"Veuillez nous contacter à support@ente.io pour gérer votre abonnement ${provider}.";
static String m14(count) =>
static String m15(count) =>
"${Intl.plural(count, one: 'Supprimer le fichier', other: 'Supprimer ${count} fichiers')}";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"Suppression de ${currentlyDeleting} / ${totalCount}";
static String m16(albumName) =>
static String m17(albumName) =>
"Cela supprimera le lien public pour accéder à \"${albumName}\".";
static String m17(supportEmail) =>
static String m18(supportEmail) =>
"Veuillez envoyer un e-mail à ${supportEmail} depuis votre adresse enregistrée";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"Vous avez nettoyé ${Intl.plural(count, one: '${count} fichier dupliqué', other: '${count} fichiers dupliqués')}, sauvegarde (${storageSaved}!)";
static String m19(count, formattedSize) =>
static String m20(count, formattedSize) =>
"${count} fichiers, ${formattedSize} chacun";
static String m20(newEmail) => "L\'e-mail a été changé en ${newEmail}";
static String m21(newEmail) => "L\'e-mail a été changé en ${newEmail}";
static String m21(email) =>
static String m22(email) =>
"${email} n\'a pas de compte ente.\n\nEnvoyez une invitation pour partager des photos.";
static String m22(count, formattedNumber) =>
static String m23(count, formattedNumber) =>
"${Intl.plural(count, one: '1 fichier sur cet appareil a été sauvegardé en toute sécurité', other: '${formattedNumber} fichiers sur cet appareil ont été sauvegardés en toute sécurité')}";
static String m23(count, formattedNumber) =>
static String m24(count, formattedNumber) =>
"${Intl.plural(count, one: '1 fichier dans cet album a été sauvegardé en toute sécurité', other: '${formattedNumber} fichiers dans cet album ont été sauvegardés en toute sécurité')}";
static String m24(storageAmountInGB) =>
static String m25(storageAmountInGB) =>
"${storageAmountInGB} Go chaque fois que quelqu\'un s\'inscrit à une offre payante et applique votre code";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} libre";
static String m26(endDate) => "Essai gratuit valide jusquau ${endDate}";
static String m27(count) =>
@@ -362,6 +362,7 @@ class MessageLookup extends MessageLookupByLibrary {
"authenticationSuccessful":
MessageLookupByLibrary.simpleMessage("Authentification réussie!"),
"available": MessageLookupByLibrary.simpleMessage("Disponible"),
"availableStorageSpace": m8,
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Dossiers sauvegardés"),
"backup": MessageLookupByLibrary.simpleMessage("Sauvegarde"),
@@ -388,10 +389,10 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Vous ne pouvez supprimer que les fichiers que vous possédez"),
"cancel": MessageLookupByLibrary.simpleMessage("Annuler"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Annuler l\'abonnement"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Les fichiers partagés ne peuvent pas être supprimés"),
"centerPoint": MessageLookupByLibrary.simpleMessage("Point central"),
@@ -414,7 +415,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Réclamer le stockage gratuit"),
"claimMore": MessageLookupByLibrary.simpleMessage("Réclamez plus !"),
"claimed": MessageLookupByLibrary.simpleMessage("Réclamée"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"clearCaches":
MessageLookupByLibrary.simpleMessage("Nettoyer le cache"),
"click": MessageLookupByLibrary.simpleMessage("• Click"),
@@ -437,7 +438,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Créez un lien pour permettre aux gens d\'ajouter et de voir des photos dans votre album partagé sans avoir besoin d\'une application ente ou d\'un compte. Idéal pour collecter des photos d\'événement."),
"collaborativeLink":
MessageLookupByLibrary.simpleMessage("Lien collaboratif"),
"collaborativeLinkCreatedFor": m11,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("Collaborateur"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
@@ -465,10 +466,10 @@ class MessageLookup extends MessageLookupByLibrary {
"Confirmer la clé de récupération"),
"confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Confirmer la clé de récupération"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Contacter l\'assistance"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("Contacts"),
"contents": MessageLookupByLibrary.simpleMessage("Contenus"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Continuer"),
@@ -551,12 +552,12 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Supprimer de l\'appareil"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Supprimer de ente"),
"deleteItemCount": m14,
"deleteItemCount": m15,
"deleteLocation":
MessageLookupByLibrary.simpleMessage("Supprimer la localisation"),
"deletePhotos":
MessageLookupByLibrary.simpleMessage("Supprimer des photos"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Il manque une fonction clé dont j\'ai besoin"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -577,8 +578,6 @@ class MessageLookup extends MessageLookupByLibrary {
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Conçu pour survivre"),
"details": MessageLookupByLibrary.simpleMessage("Détails"),
"devAccountChanged": MessageLookupByLibrary.simpleMessage(
"Le compte développeur que nous utilisons pour publier ente sur l\'App Store a changé. Pour cette raison, vous devrez vous connecter à nouveau.\n\nNous nous excusons pour la gêne occasionnée, mais cela était inévitable."),
"deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage(
"Les fichiers ajoutés à cet album seront automatiquement téléchargés sur ente."),
"deviceLockExplanation": MessageLookupByLibrary.simpleMessage(
@@ -590,7 +589,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Les téléspectateurs peuvent toujours prendre des captures d\'écran ou enregistrer une copie de vos photos en utilisant des outils externes"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Veuillez remarquer"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor": MessageLookupByLibrary.simpleMessage(
"Désactiver la double-authentification"),
"disablingTwofactorAuthentication":
@@ -611,9 +610,9 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Échec du téléchargement"),
"downloading":
MessageLookupByLibrary.simpleMessage("Téléchargement en cours..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"duplicateItemsGroup": m19,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"duplicateItemsGroup": m20,
"edit": MessageLookupByLibrary.simpleMessage("Éditer"),
"editLocation": MessageLookupByLibrary.simpleMessage("Edit location"),
"editLocationTagTitle":
@@ -625,8 +624,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Edits to location will only be seen within Ente"),
"eligible": MessageLookupByLibrary.simpleMessage("éligible"),
"email": MessageLookupByLibrary.simpleMessage("E-mail"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailVerificationToggle": MessageLookupByLibrary.simpleMessage(
"Vérification de l\'adresse e-mail"),
"emailYourLogs":
@@ -694,8 +693,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Exportez vos données"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"faces": MessageLookupByLibrary.simpleMessage("Visages"),
"failedToApplyCode": MessageLookupByLibrary.simpleMessage(
"Impossible d\'appliquer le code"),
@@ -731,8 +728,8 @@ class MessageLookup extends MessageLookupByLibrary {
"fileTypes": MessageLookupByLibrary.simpleMessage("Types de fichiers"),
"fileTypesAndNames":
MessageLookupByLibrary.simpleMessage("Types et noms de fichiers"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted":
MessageLookupByLibrary.simpleMessage("Fichiers supprimés"),
"flip": MessageLookupByLibrary.simpleMessage("Retourner"),
@@ -743,8 +740,7 @@ class MessageLookup extends MessageLookupByLibrary {
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"freeStorageClaimed":
MessageLookupByLibrary.simpleMessage("Stockage gratuit réclamé"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable":
MessageLookupByLibrary.simpleMessage("Stockage gratuit utilisable"),
"freeTrial": MessageLookupByLibrary.simpleMessage("Essai gratuit"),

View File

@@ -38,13 +38,16 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "Versione: ${versionValue}";
static String m8(paymentProvider) =>
static String m8(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} liberi";
static String m9(paymentProvider) =>
"Annulla prima il tuo abbonamento esistente da ${paymentProvider}";
static String m9(user) =>
static String m10(user) =>
"${user} non sarà più in grado di aggiungere altre foto a questo album\n\nSarà ancora in grado di rimuovere le foto esistenti aggiunte da lui o lei";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true':
'Il tuo piano famiglia ha già richiesto ${storageAmountInGb} GB finora',
@@ -52,48 +55,45 @@ class MessageLookup extends MessageLookupByLibrary {
'other': 'Hai già richiesto ${storageAmountInGb} GB finora!',
})}";
static String m11(albumName) => "Link collaborativo creato per ${albumName}";
static String m12(albumName) => "Link collaborativo creato per ${albumName}";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"Contatta <green>${familyAdminEmail}</green> per gestire il tuo abbonamento";
static String m13(provider) =>
static String m14(provider) =>
"Scrivi all\'indirizzo support@ente.io per gestire il tuo abbonamento ${provider}.";
static String m14(count) =>
static String m15(count) =>
"${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementi')}";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"Eliminazione di ${currentlyDeleting} / ${totalCount}";
static String m16(albumName) =>
static String m17(albumName) =>
"Questo rimuoverà il link pubblico per accedere a \"${albumName}\".";
static String m17(supportEmail) =>
static String m18(supportEmail) =>
"Per favore invia un\'email a ${supportEmail} dall\'indirizzo email con cui ti sei registrato";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"Hai ripulito ${Intl.plural(count, one: '${count} doppione', other: '${count} doppioni')}, salvando (${storageSaved}!)";
static String m19(count, formattedSize) =>
static String m20(count, formattedSize) =>
"${count} file, ${formattedSize} l\'uno";
static String m20(newEmail) => "Email cambiata in ${newEmail}";
static String m21(newEmail) => "Email cambiata in ${newEmail}";
static String m21(email) =>
static String m22(email) =>
"${email} non ha un account su ente.\n\nInvia un invito per condividere foto.";
static String m22(count, formattedNumber) =>
"${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro";
static String m23(count, formattedNumber) =>
"${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro";
static String m24(storageAmountInGB) =>
"${storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice";
static String m24(count, formattedNumber) =>
"${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} liberi";
static String m25(storageAmountInGB) =>
"${storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice";
static String m26(endDate) => "La prova gratuita termina il ${endDate}";
@@ -353,6 +353,7 @@ class MessageLookup extends MessageLookupByLibrary {
"authenticationSuccessful":
MessageLookupByLibrary.simpleMessage("Autenticazione riuscita!"),
"available": MessageLookupByLibrary.simpleMessage("Disponibile"),
"availableStorageSpace": m8,
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Cartelle salvate"),
"backup": MessageLookupByLibrary.simpleMessage("Backup"),
@@ -375,10 +376,10 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Puoi rimuovere solo i file di tua proprietà"),
"cancel": MessageLookupByLibrary.simpleMessage("Annulla"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Annulla abbonamento"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Impossibile eliminare i file condivisi"),
"centerPoint": MessageLookupByLibrary.simpleMessage("Punto centrale"),
@@ -401,7 +402,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Richiedi spazio gratuito"),
"claimMore": MessageLookupByLibrary.simpleMessage("Richiedine di più!"),
"claimed": MessageLookupByLibrary.simpleMessage("Riscattato"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"clearCaches": MessageLookupByLibrary.simpleMessage("Svuota cache"),
"click": MessageLookupByLibrary.simpleMessage("• Clic"),
"clickOnTheOverflowMenu":
@@ -423,7 +424,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Crea un link per consentire alle persone di aggiungere e visualizzare foto nel tuo album condiviso senza bisogno di un\'applicazione o di un account ente. Ottimo per raccogliere foto di un evento."),
"collaborativeLink":
MessageLookupByLibrary.simpleMessage("Link collaborativo"),
"collaborativeLinkCreatedFor": m11,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("Collaboratore"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
@@ -451,10 +452,10 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Conferma chiave di recupero"),
"confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Conferma la tua chiave di recupero"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Contatta il supporto"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("Contacts"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Continua"),
"continueOnFreeTrial":
@@ -532,11 +533,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Elimina dal dispositivo"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Elimina da ente"),
"deleteItemCount": m14,
"deleteItemCount": m15,
"deleteLocation":
MessageLookupByLibrary.simpleMessage("Elimina posizione"),
"deletePhotos": MessageLookupByLibrary.simpleMessage("Elimina foto"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Manca una caratteristica chiave di cui ho bisogno"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -557,8 +558,6 @@ class MessageLookup extends MessageLookupByLibrary {
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Progettato per sopravvivere"),
"details": MessageLookupByLibrary.simpleMessage("Dettagli"),
"devAccountChanged": MessageLookupByLibrary.simpleMessage(
"L\'account sviluppatore che utilizziamo per pubblicare ente su App Store è cambiato. Per questo motivo dovrai effettuare nuovamente il login.\n\nCi dispiace per il disagio, ma era inevitabile."),
"deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage(
"I file aggiunti in questa cartella del dispositivo verranno automaticamente caricati su ente."),
"deviceLockExplanation": MessageLookupByLibrary.simpleMessage(
@@ -570,7 +569,7 @@ class MessageLookup extends MessageLookupByLibrary {
"I visualizzatori possono scattare screenshot o salvare una copia delle foto utilizzando strumenti esterni"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Nota bene"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor": MessageLookupByLibrary.simpleMessage(
"Disabilita autenticazione a due fattori"),
"disablingTwofactorAuthentication":
@@ -591,9 +590,9 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Scaricamento fallito"),
"downloading":
MessageLookupByLibrary.simpleMessage("Scaricamento in corso..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"duplicateItemsGroup": m19,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"duplicateItemsGroup": m20,
"edit": MessageLookupByLibrary.simpleMessage("Modifica"),
"editLocation": MessageLookupByLibrary.simpleMessage("Edit location"),
"editLocationTagTitle":
@@ -604,8 +603,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Edits to location will only be seen within Ente"),
"eligible": MessageLookupByLibrary.simpleMessage("idoneo"),
"email": MessageLookupByLibrary.simpleMessage("Email"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailVerificationToggle":
MessageLookupByLibrary.simpleMessage("Verifica Email"),
"emailYourLogs": MessageLookupByLibrary.simpleMessage(
@@ -671,8 +670,6 @@ class MessageLookup extends MessageLookupByLibrary {
"exportYourData": MessageLookupByLibrary.simpleMessage("Esporta dati"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"failedToApplyCode": MessageLookupByLibrary.simpleMessage(
"Impossibile applicare il codice"),
"failedToCancel":
@@ -704,8 +701,8 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Aggiungi descrizione..."),
"fileSavedToGallery":
MessageLookupByLibrary.simpleMessage("File salvato nella galleria"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted": MessageLookupByLibrary.simpleMessage("File eliminati"),
"flip": MessageLookupByLibrary.simpleMessage("Capovolgi"),
"forYourMemories":
@@ -715,8 +712,7 @@ class MessageLookup extends MessageLookupByLibrary {
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"freeStorageClaimed":
MessageLookupByLibrary.simpleMessage("Spazio gratuito richiesto"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable":
MessageLookupByLibrary.simpleMessage("Spazio libero utilizzabile"),
"freeTrial": MessageLookupByLibrary.simpleMessage("Prova gratuita"),

View File

@@ -50,8 +50,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Enter person name"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"indexingIsPaused": MessageLookupByLibrary.simpleMessage(

View File

@@ -41,13 +41,16 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "Versie: ${versionValue}";
static String m8(paymentProvider) =>
static String m8(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} vrij";
static String m9(paymentProvider) =>
"Annuleer eerst uw bestaande abonnement bij ${paymentProvider}";
static String m9(user) =>
static String m10(user) =>
"${user} zal geen foto\'s meer kunnen toevoegen aan dit album\n\nDe gebruiker zal nog steeds bestaande foto\'s kunnen verwijderen die door hen zijn toegevoegd";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true':
'Jouw familie heeft ${storageAmountInGb} GB geclaimd tot nu toe',
@@ -55,52 +58,49 @@ class MessageLookup extends MessageLookupByLibrary {
'other': 'Je hebt ${storageAmountInGb} GB geclaimd tot nu toe!',
})}";
static String m11(albumName) =>
static String m12(albumName) =>
"Gezamenlijke link aangemaakt voor ${albumName}";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"Neem contact op met <green>${familyAdminEmail}</green> om uw abonnement te beheren";
static String m13(provider) =>
static String m14(provider) =>
"Neem contact met ons op via support@ente.io om uw ${provider} abonnement te beheren.";
static String m69(endpoint) => "Verbonden met ${endpoint}";
static String m14(count) =>
static String m15(count) =>
"${Intl.plural(count, one: 'Verwijder ${count} bestand', other: 'Verwijder ${count} bestanden')}";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"Verwijderen van ${currentlyDeleting} / ${totalCount}";
static String m16(albumName) =>
static String m17(albumName) =>
"Dit verwijdert de openbare link voor toegang tot \"${albumName}\".";
static String m17(supportEmail) =>
static String m18(supportEmail) =>
"Stuur een e-mail naar ${supportEmail} vanaf het door jou geregistreerde e-mailadres";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"Je hebt ${Intl.plural(count, one: '${count} dubbel bestand', other: '${count} dubbele bestanden')} opgeruimd, totaal (${storageSaved}!)";
static String m19(count, formattedSize) =>
static String m20(count, formattedSize) =>
"${count} bestanden, elk ${formattedSize}";
static String m20(newEmail) => "E-mailadres gewijzigd naar ${newEmail}";
static String m21(newEmail) => "E-mailadres gewijzigd naar ${newEmail}";
static String m21(email) =>
static String m22(email) =>
"${email} heeft geen Ente account.\n\nStuur ze een uitnodiging om foto\'s te delen.";
static String m22(count, formattedNumber) =>
static String m23(count, formattedNumber) =>
"${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt";
static String m23(count, formattedNumber) =>
static String m24(count, formattedNumber) =>
"${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album is veilig geback-upt";
static String m24(storageAmountInGB) =>
static String m25(storageAmountInGB) =>
"${storageAmountInGB} GB telkens als iemand zich aanmeldt voor een betaald abonnement en je code toepast";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} vrij";
static String m26(endDate) => "Gratis proefversie geldig tot ${endDate}";
static String m27(count) =>
@@ -377,6 +377,7 @@ class MessageLookup extends MessageLookupByLibrary {
"autoPairDesc": MessageLookupByLibrary.simpleMessage(
"Automatisch koppelen werkt alleen met apparaten die Chromecast ondersteunen."),
"available": MessageLookupByLibrary.simpleMessage("Beschikbaar"),
"availableStorageSpace": m8,
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Back-up mappen"),
"backup": MessageLookupByLibrary.simpleMessage("Back-up"),
@@ -401,10 +402,10 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Kan alleen bestanden verwijderen die jouw eigendom zijn"),
"cancel": MessageLookupByLibrary.simpleMessage("Annuleer"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Abonnement opzeggen"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Kan gedeelde bestanden niet verwijderen"),
"castIPMismatchBody": MessageLookupByLibrary.simpleMessage(
@@ -432,7 +433,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Claim gratis opslag"),
"claimMore": MessageLookupByLibrary.simpleMessage("Claim meer!"),
"claimed": MessageLookupByLibrary.simpleMessage("Geclaimd"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"cleanUncategorized":
MessageLookupByLibrary.simpleMessage("Ongecategoriseerd opschonen"),
"cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage(
@@ -459,7 +460,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Maak een link waarmee mensen foto\'s in jouw gedeelde album kunnen toevoegen en bekijken zonder dat ze daarvoor een Ente app of account nodig hebben. Handig voor het verzamelen van foto\'s van evenementen."),
"collaborativeLink":
MessageLookupByLibrary.simpleMessage("Gezamenlijke link"),
"collaborativeLinkCreatedFor": m11,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("Samenwerker"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
@@ -489,10 +490,10 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Bevestig herstelsleutel"),
"connectToDevice": MessageLookupByLibrary.simpleMessage(
"Verbinding maken met apparaat"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Contacteer klantenservice"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("Contacten"),
"contents": MessageLookupByLibrary.simpleMessage("Inhoud"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Doorgaan"),
@@ -572,12 +573,12 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Verwijder van apparaat"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Verwijder van Ente"),
"deleteItemCount": m14,
"deleteItemCount": m15,
"deleteLocation":
MessageLookupByLibrary.simpleMessage("Verwijder locatie"),
"deletePhotos":
MessageLookupByLibrary.simpleMessage("Foto\'s verwijderen"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Ik mis een belangrijke functie"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -598,8 +599,6 @@ class MessageLookup extends MessageLookupByLibrary {
"designedToOutlive": MessageLookupByLibrary.simpleMessage(
"Ontworpen om levenslang mee te gaan"),
"details": MessageLookupByLibrary.simpleMessage("Details"),
"devAccountChanged": MessageLookupByLibrary.simpleMessage(
"Het ontwikkelaarsaccount dat we gebruiken om te publiceren in de App Store is veranderd. Daarom moet je opnieuw inloggen.\n\nOnze excuses voor het ongemak, helaas was dit onvermijdelijk."),
"developerSettings":
MessageLookupByLibrary.simpleMessage("Ontwikkelaarsinstellingen"),
"developerSettingsWarning": MessageLookupByLibrary.simpleMessage(
@@ -619,7 +618,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Kijkers kunnen nog steeds screenshots maken of een kopie van je foto\'s opslaan met behulp van externe tools"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Let op"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor": MessageLookupByLibrary.simpleMessage(
"Tweestapsverificatie uitschakelen"),
"disablingTwofactorAuthentication":
@@ -640,9 +639,9 @@ class MessageLookup extends MessageLookupByLibrary {
"downloadFailed":
MessageLookupByLibrary.simpleMessage("Download mislukt"),
"downloading": MessageLookupByLibrary.simpleMessage("Downloaden..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"duplicateItemsGroup": m19,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"duplicateItemsGroup": m20,
"edit": MessageLookupByLibrary.simpleMessage("Bewerken"),
"editLocation":
MessageLookupByLibrary.simpleMessage("Locatie bewerken"),
@@ -655,8 +654,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Bewerkte locatie wordt alleen gezien binnen Ente"),
"eligible": MessageLookupByLibrary.simpleMessage("gerechtigd"),
"email": MessageLookupByLibrary.simpleMessage("E-mail"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailVerificationToggle":
MessageLookupByLibrary.simpleMessage("E-mailverificatie"),
"emailYourLogs":
@@ -727,8 +726,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Exporteer je gegevens"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"faces": MessageLookupByLibrary.simpleMessage("Gezichten"),
"failedToApplyCode":
MessageLookupByLibrary.simpleMessage("Code toepassen mislukt"),
@@ -766,8 +763,8 @@ class MessageLookup extends MessageLookupByLibrary {
"fileTypes": MessageLookupByLibrary.simpleMessage("Bestandstype"),
"fileTypesAndNames":
MessageLookupByLibrary.simpleMessage("Bestandstypen en namen"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted":
MessageLookupByLibrary.simpleMessage("Bestanden verwijderd"),
"filesSavedToGallery": MessageLookupByLibrary.simpleMessage(
@@ -780,8 +777,7 @@ class MessageLookup extends MessageLookupByLibrary {
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"freeStorageClaimed":
MessageLookupByLibrary.simpleMessage("Gratis opslag geclaimd"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable":
MessageLookupByLibrary.simpleMessage("Gratis opslag bruikbaar"),
"freeTrial": MessageLookupByLibrary.simpleMessage("Gratis proefversie"),
@@ -952,8 +948,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Machine Learning"),
"magicSearch":
MessageLookupByLibrary.simpleMessage("Magische zoekfunctie"),
"magicSearchDescription": MessageLookupByLibrary.simpleMessage(
"Houd er rekening mee dat dit zal resulteren in een hoger internet- en batterijverbruik totdat alle items zijn geïndexeerd."),
"manage": MessageLookupByLibrary.simpleMessage("Beheren"),
"manageDeviceStorage":
MessageLookupByLibrary.simpleMessage("Apparaatopslag beheren"),

View File

@@ -67,8 +67,6 @@ class MessageLookup extends MessageLookupByLibrary {
"Skriv inn e-postadressen din"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"feedback": MessageLookupByLibrary.simpleMessage("Tilbakemelding"),
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),

View File

@@ -115,8 +115,6 @@ class MessageLookup extends MessageLookupByLibrary {
"Wprowadź swój klucz odzyskiwania"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"feedback": MessageLookupByLibrary.simpleMessage("Informacja zwrotna"),
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"forgotPassword":

View File

@@ -41,13 +41,16 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "Versão: ${versionValue}";
static String m8(paymentProvider) =>
static String m8(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} livre";
static String m9(paymentProvider) =>
"Por favor, cancele sua assinatura existente do ${paymentProvider} primeiro";
static String m9(user) =>
static String m10(user) =>
"${user} Não poderá adicionar mais fotos a este álbum\n\nEles ainda poderão remover as fotos existentes adicionadas por eles";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true':
'Sua família reeinvindicou ${storageAmountInGb} GB até agora',
@@ -55,51 +58,48 @@ class MessageLookup extends MessageLookupByLibrary {
'other': 'Você reeinvindicou ${storageAmountInGb} GB até agora',
})}";
static String m11(albumName) => "Link colaborativo criado para ${albumName}";
static String m12(albumName) => "Link colaborativo criado para ${albumName}";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"Entre em contato com <green>${familyAdminEmail}</green> para gerenciar sua assinatura";
static String m13(provider) =>
static String m14(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) =>
static String m15(count) =>
"${Intl.plural(count, one: 'Excluir ${count} item', other: 'Excluir ${count} itens')}";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"Excluindo ${currentlyDeleting} / ${totalCount}";
static String m16(albumName) =>
static String m17(albumName) =>
"Isso removerá o link público para acessar \"${albumName}\".";
static String m17(supportEmail) =>
static String m18(supportEmail) =>
"Por favor, envie um e-mail para ${supportEmail} a partir do seu endereço de e-mail registrado";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"Você limpou ${Intl.plural(count, one: '${count} arquivo duplicado', other: '${count} arquivos duplicados')}, salvando (${storageSaved}!)";
static String m19(count, formattedSize) =>
static String m20(count, formattedSize) =>
"${count} Arquivos, ${formattedSize} cada";
static String m20(newEmail) => "E-mail alterado para ${newEmail}";
static String m21(newEmail) => "E-mail alterado para ${newEmail}";
static String m21(email) =>
static String m22(email) =>
"${email} não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos.";
static String m22(count, formattedNumber) =>
static String m23(count, formattedNumber) =>
"${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste dispositivo teve um backup seguro";
static String m23(count, formattedNumber) =>
static String m24(count, formattedNumber) =>
"${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste álbum teve um backup seguro";
static String m24(storageAmountInGB) =>
static String m25(storageAmountInGB) =>
"${storageAmountInGB} GB cada vez que alguém se inscrever para um plano pago e aplica o seu código";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} livre";
static String m26(endDate) => "Teste gratuito acaba em ${endDate}";
static String m27(count) =>
@@ -375,6 +375,7 @@ class MessageLookup extends MessageLookupByLibrary {
"autoPairDesc": MessageLookupByLibrary.simpleMessage(
"O pareamento automático funciona apenas com dispositivos que suportam o Chromecast."),
"available": MessageLookupByLibrary.simpleMessage("Disponível"),
"availableStorageSpace": m8,
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Backup de pastas concluído"),
"backup": MessageLookupByLibrary.simpleMessage("Backup"),
@@ -400,10 +401,10 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Só é possível remover arquivos de sua propriedade"),
"cancel": MessageLookupByLibrary.simpleMessage("Cancelar"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Cancelar assinatura"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Não é possível excluir arquivos compartilhados"),
"castIPMismatchBody": MessageLookupByLibrary.simpleMessage(
@@ -431,7 +432,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Reivindicar armazenamento gratuito"),
"claimMore": MessageLookupByLibrary.simpleMessage("Reivindique mais!"),
"claimed": MessageLookupByLibrary.simpleMessage("Reivindicado"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"cleanUncategorized":
MessageLookupByLibrary.simpleMessage("Limpar Sem Categoria"),
"cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage(
@@ -458,7 +459,7 @@ class MessageLookup extends MessageLookupByLibrary {
"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,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("Colaborador"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
@@ -487,10 +488,10 @@ class MessageLookup extends MessageLookupByLibrary {
"Confirme sua chave de recuperação"),
"connectToDevice":
MessageLookupByLibrary.simpleMessage("Conectar ao dispositivo"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Contate o suporte"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("Contatos"),
"contents": MessageLookupByLibrary.simpleMessage("Conteúdos"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"),
@@ -569,10 +570,10 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Excluir do dispositivo"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Excluir do Ente"),
"deleteItemCount": m14,
"deleteItemCount": m15,
"deleteLocation": MessageLookupByLibrary.simpleMessage("Excluir Local"),
"deletePhotos": MessageLookupByLibrary.simpleMessage("Excluir fotos"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Está faltando um recurso-chave que eu preciso"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -592,8 +593,6 @@ class MessageLookup extends MessageLookupByLibrary {
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Feito para ter longevidade"),
"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 entrar novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável."),
"developerSettings": MessageLookupByLibrary.simpleMessage(
"Configurações de desenvolvedor"),
"developerSettingsWarning": MessageLookupByLibrary.simpleMessage(
@@ -613,7 +612,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Os espectadores ainda podem tirar screenshots ou salvar uma cópia de suas fotos usando ferramentas externas"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Observe"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor": MessageLookupByLibrary.simpleMessage(
"Desativar autenticação de dois fatores"),
"disablingTwofactorAuthentication":
@@ -629,7 +628,7 @@ class MessageLookup extends MessageLookupByLibrary {
"doYouWantToDiscardTheEditsYouHaveMade":
MessageLookupByLibrary.simpleMessage(
"Você quer descartar as edições que você fez?"),
"done": MessageLookupByLibrary.simpleMessage("Concluído"),
"done": MessageLookupByLibrary.simpleMessage("Pronto"),
"doubleYourStorage":
MessageLookupByLibrary.simpleMessage("Dobre seu armazenamento"),
"download": MessageLookupByLibrary.simpleMessage("Baixar"),
@@ -637,9 +636,9 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Falha no download"),
"downloading":
MessageLookupByLibrary.simpleMessage("Fazendo download..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"duplicateItemsGroup": m19,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"duplicateItemsGroup": m20,
"edit": MessageLookupByLibrary.simpleMessage("Editar"),
"editLocation": MessageLookupByLibrary.simpleMessage("Editar local"),
"editLocationTagTitle":
@@ -650,8 +649,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Edições para local só serão vistas dentro do Ente"),
"eligible": MessageLookupByLibrary.simpleMessage("elegível"),
"email": MessageLookupByLibrary.simpleMessage("E-mail"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailVerificationToggle":
MessageLookupByLibrary.simpleMessage("Verificação de e-mail"),
"emailYourLogs":
@@ -721,8 +720,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Exportar seus dados"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Reconhecimento facial"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados."),
"faces": MessageLookupByLibrary.simpleMessage("Rostos"),
"failedToApplyCode":
MessageLookupByLibrary.simpleMessage("Falha ao aplicar o código"),
@@ -758,8 +755,8 @@ class MessageLookup extends MessageLookupByLibrary {
"fileTypes": MessageLookupByLibrary.simpleMessage("Tipos de arquivo"),
"fileTypesAndNames":
MessageLookupByLibrary.simpleMessage("Tipos de arquivo e nomes"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted":
MessageLookupByLibrary.simpleMessage("Arquivos excluídos"),
"filesSavedToGallery":
@@ -775,8 +772,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Rostos encontrados"),
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage(
"Armazenamento gratuito reivindicado"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable": MessageLookupByLibrary.simpleMessage(
"Armazenamento livre utilizável"),
"freeTrial": MessageLookupByLibrary.simpleMessage("Teste gratuito"),
@@ -820,7 +816,7 @@ class MessageLookup extends MessageLookupByLibrary {
"A autenticação biométrica não está configurada no seu dispositivo. Por favor, ative o Touch ID ou o Face ID no seu telefone."),
"iOSLockOut": MessageLookupByLibrary.simpleMessage(
"A Autenticação Biométrica está desativada. Por favor, bloqueie e desbloqueie sua tela para ativá-la."),
"iOSOkButton": MessageLookupByLibrary.simpleMessage("Aceitar"),
"iOSOkButton": MessageLookupByLibrary.simpleMessage("Tudo bem"),
"ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorar"),
"ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage(
"Alguns arquivos neste álbum são ignorados do envio porque eles tinham sido anteriormente excluídos do Ente."),
@@ -837,7 +833,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Chave de recuperação incorreta"),
"indexedItems": MessageLookupByLibrary.simpleMessage("Itens indexados"),
"indexingIsPaused": MessageLookupByLibrary.simpleMessage(
"Indexing is paused, will automatically resume when device is ready"),
"A indexação está pausada, será retomada automaticamente quando o dispositivo estiver pronto."),
"insecureDevice":
MessageLookupByLibrary.simpleMessage("Dispositivo não seguro"),
"installManually":
@@ -950,8 +946,6 @@ class MessageLookup extends MessageLookupByLibrary {
"machineLearning":
MessageLookupByLibrary.simpleMessage("Aprendizagem de máquina"),
"magicSearch": MessageLookupByLibrary.simpleMessage("Busca mágica"),
"magicSearchDescription": MessageLookupByLibrary.simpleMessage(
"Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados."),
"manage": MessageLookupByLibrary.simpleMessage("Gerenciar"),
"manageDeviceStorage": MessageLookupByLibrary.simpleMessage(
"Gerenciar o armazenamento do dispositivo"),
@@ -969,6 +963,8 @@ class MessageLookup extends MessageLookupByLibrary {
"matrix": MessageLookupByLibrary.simpleMessage("Matrix"),
"memoryCount": m33,
"merchandise": MessageLookupByLibrary.simpleMessage("Produtos"),
"mlIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados."),
"mobileWebDesktop":
MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"),
"moderateStrength": MessageLookupByLibrary.simpleMessage("Moderada"),
@@ -1029,11 +1025,11 @@ class MessageLookup extends MessageLookupByLibrary {
"nothingToSeeHere":
MessageLookupByLibrary.simpleMessage("Nada para ver aqui! 👀"),
"notifications": MessageLookupByLibrary.simpleMessage("Notificações"),
"ok": MessageLookupByLibrary.simpleMessage("Ok"),
"ok": MessageLookupByLibrary.simpleMessage("OK"),
"onDevice": MessageLookupByLibrary.simpleMessage("No dispositivo"),
"onEnte": MessageLookupByLibrary.simpleMessage(
"Em <branding>ente</branding>"),
"oops": MessageLookupByLibrary.simpleMessage("Ops"),
"oops": MessageLookupByLibrary.simpleMessage("Opa"),
"oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage(
"Ops, não foi possível salvar edições"),
"oopsSomethingWentWrong":
@@ -1314,7 +1310,7 @@ class MessageLookup extends MessageLookupByLibrary {
"As pastas selecionadas serão criptografadas e armazenadas em backup"),
"selectedItemsWillBeDeletedFromAllAlbumsAndMoved":
MessageLookupByLibrary.simpleMessage(
"Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo."),
"Os itens selecionados serão excluídos de todos os álbuns e movidos para a lixeira."),
"selectedPhotos": m46,
"selectedPhotosWithYours": m47,
"send": MessageLookupByLibrary.simpleMessage("Enviar"),

View File

@@ -41,59 +41,56 @@ class MessageLookup extends MessageLookupByLibrary {
static String m7(versionValue) => "版本: ${versionValue}";
static String m8(paymentProvider) => "请先取消您现有的订阅 ${paymentProvider}";
static String m9(paymentProvider) => "请先取消您现有的订阅 ${paymentProvider}";
static String m9(user) => "${user} 将无法添加更多照片到此相册\n\n他们仍然能够删除他们添加的现有照片";
static String m10(user) => "${user} 将无法添加更多照片到此相册\n\n他们仍然能够删除他们添加的现有照片";
static String m10(isFamilyMember, storageAmountInGb) =>
static String m11(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true': '到目前为止,您的家庭已经领取了 ${storageAmountInGb} GB',
'false': '到目前为止,您已经领取了 ${storageAmountInGb} GB',
'other': '到目前为止,您已经领取了${storageAmountInGb} GB',
})}";
static String m11(albumName) => "${albumName} 创建了协作链接";
static String m12(albumName) => "${albumName} 创建了协作链接";
static String m12(familyAdminEmail) =>
static String m13(familyAdminEmail) =>
"请联系 <green>${familyAdminEmail}</green> 来管理您的订阅";
static String m13(provider) =>
static String m14(provider) =>
"请通过support@ente.io 用英语联系我们来管理您的 ${provider} 订阅。";
static String m69(endpoint) => "已连接至 ${endpoint}";
static String m14(count) =>
static String m15(count) =>
"${Intl.plural(count, one: '删除 ${count} 个项目', other: '删除 ${count} 个项目')}";
static String m15(currentlyDeleting, totalCount) =>
static String m16(currentlyDeleting, totalCount) =>
"正在删除 ${currentlyDeleting} /共 ${totalCount}";
static String m16(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。";
static String m17(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。";
static String m17(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}";
static String m18(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}";
static String m18(count, storageSaved) =>
static String m19(count, storageSaved) =>
"您已经清理了 ${Intl.plural(count, other: '${count} 个重复文件')}, 释放了 (${storageSaved}!)";
static String m19(count, formattedSize) =>
static String m20(count, formattedSize) =>
"${count} 个文件,每个文件 ${formattedSize}";
static String m20(newEmail) => "电子邮件已更改为 ${newEmail}";
static String m21(newEmail) => "电子邮件已更改为 ${newEmail}";
static String m21(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。";
static String m22(count, formattedNumber) =>
"此设备上的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份";
static String m22(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。";
static String m23(count, formattedNumber) =>
"此设备上的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份";
static String m24(count, formattedNumber) =>
"此相册中的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份";
static String m24(storageAmountInGB) =>
static String m25(storageAmountInGB) =>
"每当有人使用您的代码注册付费计划时您将获得${storageAmountInGB} GB";
static String m25(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} 空闲";
static String m26(endDate) => "免费试用有效期至 ${endDate}";
static String m27(count) =>
@@ -124,7 +121,7 @@ class MessageLookup extends MessageLookupByLibrary {
static String m37(providerName) => "如果您被收取费用,请用英语与 ${providerName} 的客服聊天";
static String m38(endDate) => "免费试用有效期至 ${endDate}\n您可以随后购买付费计划。";
static String m38(endDate) => "免费试用有效期至 ${endDate}\n在此之后您可以选择付费计划。";
static String m39(toEmail) => "请给我们发送电子邮件至 ${toEmail}";
@@ -206,6 +203,7 @@ class MessageLookup extends MessageLookupByLibrary {
"ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage(
"我明白,如果我丢失密码,我可能会丢失我的数据,因为我的数据是 <underline>端到端加密的</underline>。"),
"activeSessions": MessageLookupByLibrary.simpleMessage("已登录的设备"),
"addAName": MessageLookupByLibrary.simpleMessage("添加一个名称"),
"addANewEmail": MessageLookupByLibrary.simpleMessage("添加新的电子邮件"),
"addCollaborator": MessageLookupByLibrary.simpleMessage("添加协作者"),
"addCollaborators": m0,
@@ -346,9 +344,9 @@ class MessageLookup extends MessageLookupByLibrary {
"canOnlyRemoveFilesOwnedByYou":
MessageLookupByLibrary.simpleMessage("只能删除您拥有的文件"),
"cancel": MessageLookupByLibrary.simpleMessage("取消"),
"cancelOtherSubscription": m8,
"cancelOtherSubscription": m9,
"cancelSubscription": MessageLookupByLibrary.simpleMessage("取消订阅"),
"cannotAddMorePhotosAfterBecomingViewer": m9,
"cannotAddMorePhotosAfterBecomingViewer": m10,
"cannotDeleteSharedFiles":
MessageLookupByLibrary.simpleMessage("无法删除共享文件"),
"castIPMismatchBody":
@@ -370,7 +368,7 @@ class MessageLookup extends MessageLookupByLibrary {
"claimFreeStorage": MessageLookupByLibrary.simpleMessage("领取免费存储"),
"claimMore": MessageLookupByLibrary.simpleMessage("领取更多!"),
"claimed": MessageLookupByLibrary.simpleMessage("已领取"),
"claimedStorageSoFar": m10,
"claimedStorageSoFar": m11,
"cleanUncategorized": MessageLookupByLibrary.simpleMessage("清除未分类的"),
"cleanUncategorizedDescription":
MessageLookupByLibrary.simpleMessage("从“未分类”中删除其他相册中存在的所有文件"),
@@ -382,8 +380,7 @@ class MessageLookup extends MessageLookupByLibrary {
"close": MessageLookupByLibrary.simpleMessage("关闭"),
"clubByCaptureTime": MessageLookupByLibrary.simpleMessage("按拍摄时间分组"),
"clubByFileName": MessageLookupByLibrary.simpleMessage("按文件名排序"),
"clusteringProgress":
MessageLookupByLibrary.simpleMessage("Clustering progress"),
"clusteringProgress": MessageLookupByLibrary.simpleMessage("聚类进展"),
"codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("代码已应用"),
"codeCopiedToClipboard":
MessageLookupByLibrary.simpleMessage("代码已复制到剪贴板"),
@@ -391,7 +388,7 @@ class MessageLookup extends MessageLookupByLibrary {
"collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage(
"创建一个链接来让他人无需 Ente 应用程序或账户即可在您的共享相册中添加和查看照片。非常适合收集活动照片。"),
"collaborativeLink": MessageLookupByLibrary.simpleMessage("协作链接"),
"collaborativeLinkCreatedFor": m11,
"collaborativeLinkCreatedFor": m12,
"collaborator": MessageLookupByLibrary.simpleMessage("协作者"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage("协作者可以将照片和视频添加到共享相册中。"),
@@ -413,9 +410,9 @@ class MessageLookup extends MessageLookupByLibrary {
"confirmYourRecoveryKey":
MessageLookupByLibrary.simpleMessage("确认您的恢复密钥"),
"connectToDevice": MessageLookupByLibrary.simpleMessage("连接到设备"),
"contactFamilyAdmin": m12,
"contactFamilyAdmin": m13,
"contactSupport": MessageLookupByLibrary.simpleMessage("联系支持"),
"contactToManageSubscription": m13,
"contactToManageSubscription": m14,
"contacts": MessageLookupByLibrary.simpleMessage("联系人"),
"contents": MessageLookupByLibrary.simpleMessage("内容"),
"continueLabel": MessageLookupByLibrary.simpleMessage("继续"),
@@ -476,10 +473,10 @@ class MessageLookup extends MessageLookupByLibrary {
"deleteFromBoth": MessageLookupByLibrary.simpleMessage("同时从两者中删除"),
"deleteFromDevice": MessageLookupByLibrary.simpleMessage("从设备中删除"),
"deleteFromEnte": MessageLookupByLibrary.simpleMessage("从 Ente 中删除"),
"deleteItemCount": m14,
"deleteItemCount": m15,
"deleteLocation": MessageLookupByLibrary.simpleMessage("删除位置"),
"deletePhotos": MessageLookupByLibrary.simpleMessage("删除照片"),
"deleteProgress": m15,
"deleteProgress": m16,
"deleteReason1": MessageLookupByLibrary.simpleMessage("找不到我想要的功能"),
"deleteReason2":
MessageLookupByLibrary.simpleMessage("应用或某个功能没有按我的预期运行"),
@@ -495,8 +492,6 @@ class MessageLookup extends MessageLookupByLibrary {
"deselectAll": MessageLookupByLibrary.simpleMessage("取消全选"),
"designedToOutlive": MessageLookupByLibrary.simpleMessage("经久耐用"),
"details": MessageLookupByLibrary.simpleMessage("详情"),
"devAccountChanged": MessageLookupByLibrary.simpleMessage(
"我们用于在 App Store 上发布 Ente 的开发者账户已更改。因此,您需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。"),
"developerSettings": MessageLookupByLibrary.simpleMessage("开发者设置"),
"developerSettingsWarning":
MessageLookupByLibrary.simpleMessage("您确定要修改开发者设置吗?"),
@@ -512,7 +507,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("查看者仍然可以使用外部工具截图或保存您的照片副本"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("请注意"),
"disableLinkMessage": m16,
"disableLinkMessage": m17,
"disableTwofactor": MessageLookupByLibrary.simpleMessage("禁用双重认证"),
"disablingTwofactorAuthentication":
MessageLookupByLibrary.simpleMessage("正在禁用双重认证..."),
@@ -529,9 +524,9 @@ class MessageLookup extends MessageLookupByLibrary {
"download": MessageLookupByLibrary.simpleMessage("下载"),
"downloadFailed": MessageLookupByLibrary.simpleMessage("下載失敗"),
"downloading": MessageLookupByLibrary.simpleMessage("正在下载..."),
"dropSupportEmail": m17,
"duplicateFileCountWithStorageSaved": m18,
"duplicateItemsGroup": m19,
"dropSupportEmail": m18,
"duplicateFileCountWithStorageSaved": m19,
"duplicateItemsGroup": m20,
"edit": MessageLookupByLibrary.simpleMessage("编辑"),
"editLocation": MessageLookupByLibrary.simpleMessage("编辑位置"),
"editLocationTagTitle": MessageLookupByLibrary.simpleMessage("编辑位置"),
@@ -540,8 +535,8 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("对位置的编辑只能在 Ente 内看到"),
"eligible": MessageLookupByLibrary.simpleMessage("符合资格"),
"email": MessageLookupByLibrary.simpleMessage("电子邮件地址"),
"emailChangedTo": m20,
"emailNoEnteAccount": m21,
"emailChangedTo": m21,
"emailNoEnteAccount": m22,
"emailVerificationToggle":
MessageLookupByLibrary.simpleMessage("电子邮件验证"),
"emailYourLogs": MessageLookupByLibrary.simpleMessage("通过电子邮件发送您的日志"),
@@ -576,6 +571,7 @@ class MessageLookup extends MessageLookupByLibrary {
"enterPassword": MessageLookupByLibrary.simpleMessage("输入密码"),
"enterPasswordToEncrypt":
MessageLookupByLibrary.simpleMessage("输入我们可以用来加密您的数据的密码"),
"enterPersonName": MessageLookupByLibrary.simpleMessage("输入人物名称"),
"enterReferralCode": MessageLookupByLibrary.simpleMessage("输入推荐代码"),
"enterThe6digitCodeFromnyourAuthenticatorApp":
MessageLookupByLibrary.simpleMessage("从你的身份验证器应用中\n输入6位数字代码"),
@@ -594,10 +590,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("此链接已过期。请选择新的过期时间或禁用链接有效期。"),
"exportLogs": MessageLookupByLibrary.simpleMessage("导出日志"),
"exportYourData": MessageLookupByLibrary.simpleMessage("导出您的数据"),
"faceRecognition":
MessageLookupByLibrary.simpleMessage("Face recognition"),
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
"faceRecognition": MessageLookupByLibrary.simpleMessage("人脸识别"),
"faces": MessageLookupByLibrary.simpleMessage("人脸"),
"failedToApplyCode": MessageLookupByLibrary.simpleMessage("无法使用此代码"),
"failedToCancel": MessageLookupByLibrary.simpleMessage("取消失败"),
@@ -624,18 +617,18 @@ class MessageLookup extends MessageLookupByLibrary {
"fileSavedToGallery": MessageLookupByLibrary.simpleMessage("文件已保存到相册"),
"fileTypes": MessageLookupByLibrary.simpleMessage("文件类型"),
"fileTypesAndNames": MessageLookupByLibrary.simpleMessage("文件类型和名称"),
"filesBackedUpFromDevice": m22,
"filesBackedUpInAlbum": m23,
"filesBackedUpFromDevice": m23,
"filesBackedUpInAlbum": m24,
"filesDeleted": MessageLookupByLibrary.simpleMessage("文件已删除"),
"filesSavedToGallery":
MessageLookupByLibrary.simpleMessage("多个文件已保存到相册"),
"findPeopleByName": MessageLookupByLibrary.simpleMessage("按名称快速查找人物"),
"flip": MessageLookupByLibrary.simpleMessage("上下翻转"),
"forYourMemories": MessageLookupByLibrary.simpleMessage("为您的回忆"),
"forgotPassword": MessageLookupByLibrary.simpleMessage("忘记密码"),
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
"foundFaces": MessageLookupByLibrary.simpleMessage("已找到的人脸"),
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage("已领取的免费存储"),
"freeStorageOnReferralSuccess": m24,
"freeStorageSpace": m25,
"freeStorageOnReferralSuccess": m25,
"freeStorageUsable": MessageLookupByLibrary.simpleMessage("可用的免费存储"),
"freeTrial": MessageLookupByLibrary.simpleMessage("免费试用"),
"freeTrialValidTill": m26,
@@ -686,8 +679,8 @@ class MessageLookup extends MessageLookupByLibrary {
"incorrectRecoveryKeyTitle":
MessageLookupByLibrary.simpleMessage("不正确的恢复密钥"),
"indexedItems": MessageLookupByLibrary.simpleMessage("已索引项目"),
"indexingIsPaused": MessageLookupByLibrary.simpleMessage(
"Indexing is paused, will automatically resume when device is ready"),
"indexingIsPaused":
MessageLookupByLibrary.simpleMessage("索引已暂停。当设备准备就绪时,它将自动恢复。"),
"insecureDevice": MessageLookupByLibrary.simpleMessage("设备不安全"),
"installManually": MessageLookupByLibrary.simpleMessage("手动安装"),
"invalidEmailAddress":
@@ -779,8 +772,6 @@ class MessageLookup extends MessageLookupByLibrary {
"lostDevice": MessageLookupByLibrary.simpleMessage("设备丢失?"),
"machineLearning": MessageLookupByLibrary.simpleMessage("机器学习"),
"magicSearch": MessageLookupByLibrary.simpleMessage("魔法搜索"),
"magicSearchDescription": MessageLookupByLibrary.simpleMessage(
"请注意,在所有项目完成索引之前,这将使用更高的带宽和电量。"),
"manage": MessageLookupByLibrary.simpleMessage("管理"),
"manageDeviceStorage": MessageLookupByLibrary.simpleMessage("管理设备存储"),
"manageFamily": MessageLookupByLibrary.simpleMessage("管理家庭计划"),
@@ -795,6 +786,8 @@ class MessageLookup extends MessageLookupByLibrary {
"matrix": MessageLookupByLibrary.simpleMessage("Matrix"),
"memoryCount": m33,
"merchandise": MessageLookupByLibrary.simpleMessage("商品"),
"mlIndexingDescription": MessageLookupByLibrary.simpleMessage(
"请注意,机器学习将使用更高的带宽和更多的电量,直到所有项目都被索引为止。"),
"mobileWebDesktop":
MessageLookupByLibrary.simpleMessage("移动端, 网页端, 桌面端"),
"moderateStrength": MessageLookupByLibrary.simpleMessage("中等"),
@@ -880,6 +873,7 @@ class MessageLookup extends MessageLookupByLibrary {
"paymentFailedTalkToProvider": m37,
"pendingItems": MessageLookupByLibrary.simpleMessage("待处理项目"),
"pendingSync": MessageLookupByLibrary.simpleMessage("正在等待同步"),
"people": MessageLookupByLibrary.simpleMessage("人物"),
"peopleUsingYourCode": MessageLookupByLibrary.simpleMessage("使用您的代码的人"),
"permDeleteWarning":
MessageLookupByLibrary.simpleMessage("回收站中的所有项目将被永久删除\n\n此操作无法撤消"),
@@ -979,6 +973,7 @@ class MessageLookup extends MessageLookupByLibrary {
"removeLink": MessageLookupByLibrary.simpleMessage("移除链接"),
"removeParticipant": MessageLookupByLibrary.simpleMessage("移除参与者"),
"removeParticipantBody": m43,
"removePersonLabel": MessageLookupByLibrary.simpleMessage("移除人物标签"),
"removePublicLink": MessageLookupByLibrary.simpleMessage("删除公开链接"),
"removeShareItemsWarning":
MessageLookupByLibrary.simpleMessage("您要删除的某些项目是由其他人添加的,您将无法访问它们"),
@@ -1025,7 +1020,7 @@ class MessageLookup extends MessageLookupByLibrary {
"searchDatesEmptySection":
MessageLookupByLibrary.simpleMessage("按日期搜索,月份或年份"),
"searchFaceEmptySection":
MessageLookupByLibrary.simpleMessage("查找一个人的所有照片"),
MessageLookupByLibrary.simpleMessage("待索引完成后,人物将显示在此处"),
"searchFileTypesAndNamesEmptySection":
MessageLookupByLibrary.simpleMessage("文件类型和名称"),
"searchHint1": MessageLookupByLibrary.simpleMessage("在设备上快速搜索"),

View File

@@ -2876,11 +2876,11 @@ class S {
);
}
/// `Please note that this will result in a higher bandwidth and battery usage until all items are indexed.`
String get magicSearchDescription {
/// `Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.`
String get mlIndexingDescription {
return Intl.message(
'Please note that this will result in a higher bandwidth and battery usage until all items are indexed.',
name: 'magicSearchDescription',
'Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.',
name: 'mlIndexingDescription',
desc: '',
args: [],
);
@@ -4735,11 +4735,11 @@ 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.`
String get devAccountChanged {
/// `Due to technical glitch, you have been logged out. Our apologies for the inconvenience.`
String get autoLogoutMessage {
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.',
name: 'devAccountChanged',
'Due to technical glitch, you have been logged out. Our apologies for the inconvenience.',
name: 'autoLogoutMessage',
desc: '',
args: [],
);
@@ -6969,10 +6969,10 @@ class S {
);
}
/// `Persons will be shown here once indexing is done`
/// `People will be shown here once indexing is done`
String get searchFaceEmptySection {
return Intl.message(
'Persons will be shown here once indexing is done',
'People will be shown here once indexing is done',
name: 'searchFaceEmptySection',
desc: '',
args: [],
@@ -7402,10 +7402,10 @@ class S {
}
/// `{freeAmount} {storageUnit} free`
String freeStorageSpace(Object freeAmount, Object storageUnit) {
String availableStorageSpace(Object freeAmount, Object storageUnit) {
return Intl.message(
'$freeAmount $storageUnit free',
name: 'freeStorageSpace',
name: 'availableStorageSpace',
desc: '',
args: [freeAmount, storageUnit],
);
@@ -8764,16 +8764,6 @@ class S {
);
}
/// `Please note that this will result in a higher bandwidth and battery usage until all items are indexed.`
String get faceRecognitionIndexingDescription {
return Intl.message(
'Please note that this will result in a higher bandwidth and battery usage until all items are indexed.',
name: 'faceRecognitionIndexingDescription',
desc: '',
args: [],
);
}
/// `Found faces`
String get foundFaces {
return Intl.message(
@@ -8794,10 +8784,10 @@ class S {
);
}
/// `Indexing is paused, will automatically resume when device is ready`
/// `Indexing is paused. It will automatically resume when device is ready.`
String get indexingIsPaused {
return Intl.message(
'Indexing is paused, will automatically resume when device is ready',
'Indexing is paused. It will automatically resume when device is ready.',
name: 'indexingIsPaused',
desc: '',
args: [],

View File

@@ -23,7 +23,7 @@
"sendEmail": "E-Mail senden",
"deleteRequestSLAText": "Deine Anfrage wird innerhalb von 72 Stunden bearbeitet.",
"deleteEmailRequest": "Bitte sende eine E-Mail an <warning>account-deletion@ente.io</warning> von Deiner bei uns hinterlegten E-Mail-Adresse.",
"entePhotosPerm": "ente <i>benötigt die Erlaubnis</i>, deine Fotos aufzubewahren",
"entePhotosPerm": "",
"ok": "Ok",
"createAccount": "Konto erstellen",
"createNewAccount": "Neues Konto erstellen",
@@ -48,7 +48,7 @@
"sorry": "Entschuldigung",
"noRecoveryKeyNoDecryption": "Aufgrund unseres Ende-zu-Ende-Verschlüsselungsprotokolls können deine Daten nicht ohne dein Passwort oder deinen Wiederherstellungs-Schlüssel entschlüsselt werden",
"verifyEmail": "E-Mail-Adresse verifizieren",
"toResetVerifyEmail": "Um Ihr Passwort zurückzusetzen, verifizieren Sie bitte zuerst Ihre E-Mail Adresse.",
"toResetVerifyEmail": "Um dein Passwort zurückzusetzen, verifiziere bitte zuerst deine E-Mail Adresse.",
"checkInboxAndSpamFolder": "Bitte überprüfe deinen E-Mail-Posteingang (und Spam), um die Verifizierung abzuschließen",
"tapToEnterCode": "Antippen, um den Code einzugeben",
"resendEmail": "E-Mail erneut senden",
@@ -143,7 +143,7 @@
"lostDevice": "Gerät verloren?",
"verifyingRecoveryKey": "Wiederherstellungs-Schlüssel wird überprüft...",
"recoveryKeyVerified": "Wiederherstellungs-Schlüssel überprüft",
"recoveryKeySuccessBody": "Sehr gut! Ihr Wiederherstellungsschlüssel ist gültig. Vielen Dank für die Verifizierung.\n\nBitte vergessen Sie nicht eine Kopie Ihres Wiederherstellungsschlüssels sicher aufzubewahren.",
"recoveryKeySuccessBody": "Sehr gut! Dein Wiederherstellungsschlüssel ist gültig. Vielen Dank für die Verifizierung.\n\nBitte vergiss nicht eine Kopie des Wiederherstellungsschlüssels sicher aufzubewahren.",
"invalidRecoveryKey": "Der von Ihnen eingegebene Wiederherstellungsschlüssel ist nicht gültig. Bitte stellen Sie sicher das aus 24 Wörtern zusammen gesetzt ist und jedes dieser Worte richtig geschrieben wurde.\n\nSollten Sie den Wiederherstellungscode eingegeben haben, stellen Sie bitte sicher, dass dieser 64 Worte lang ist und ebenfall richtig geschrieben wurde.",
"invalidKey": "Ungültiger Schlüssel",
"tryAgain": "Erneut versuchen",
@@ -225,7 +225,7 @@
},
"description": "Number of participants in an album, including the album owner."
},
"collabLinkSectionDescription": "Erstelle einen Link, um anderen zu ermöglichen, Fotos in deinem geteilten Album hinzuzufügen und zu sehen - ohne dass diese ein Konto von ente.io oder die App benötigen. Ideal, um Fotos von Events zu sammeln.",
"collabLinkSectionDescription": "Erstelle einen Link, mit dem andere Fotos in dem geteilten Album sehen und selbst welche hinzufügen können - ohne dass sie die ein Ente-Konto oder die App benötigen. Ideal um gemeinsam Fotos von Events zu sammeln.",
"collectPhotos": "Fotos sammeln",
"collaborativeLink": "Gemeinschaftlicher Link",
"shareWithNonenteUsers": "Mit Nicht-Ente-Benutzern teilen",
@@ -235,7 +235,7 @@
"linkHasExpired": "Link ist abgelaufen",
"publicLinkEnabled": "Öffentlicher Link aktiviert",
"shareALink": "Einen Link teilen",
"sharedAlbumSectionDescription": "Erstelle gemeinsame Alben mit anderen ente Benutzern, einschließlich solchen im kostenlosen Tarif.",
"sharedAlbumSectionDescription": "Erstelle gemeinsam mit anderen Ente-Nutzern geteilte Alben, inkl. Nutzern ohne Bezahltarif.",
"shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Teile mit bestimmten Personen} =1 {Teilen mit 1 Person} other {Teilen mit {numberOfPeople} Personen}}",
"@shareWithPeopleSectionTitle": {
"placeholders": {
@@ -259,12 +259,12 @@
},
"verificationId": "Verifizierungs-ID",
"verifyEmailID": "Verifiziere {email}",
"emailNoEnteAccount": "{email} hat kein Ente-Konto.\n\nSenden Sie eine Einladung, um Fotos zu teilen.",
"emailNoEnteAccount": "{email} hat kein Ente-Konto.\n\nSende eine Einladung, um Fotos zu teilen.",
"shareMyVerificationID": "Hier ist meine Verifizierungs-ID: {verificationID} für ente.io.",
"shareTextConfirmOthersVerificationID": "Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: {verificationID}",
"somethingWentWrong": "Irgendetwas ging schief",
"sendInvite": "Einladung senden",
"shareTextRecommendUsingEnte": "Lade ente herunter, damit wir einfach Fotos und Videos in höchster Qualität teilen können\n\nhttps://ente.io",
"shareTextRecommendUsingEnte": "Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io",
"done": "Fertig",
"applyCodeTitle": "Code nutzen",
"enterCodeDescription": "Gib den Code deines Freundes ein, damit sie beide kostenlosen Speicherplatz erhalten",
@@ -281,7 +281,7 @@
"claimMore": "Mehr einlösen!",
"theyAlsoGetXGb": "Diese erhalten auch {storageAmountInGB} GB",
"freeStorageOnReferralSuccess": "{storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet",
"shareTextReferralCode": "ente Weiterempfehlungs-Code: {referralCode} \n\nEinlösen unter Einstellungen → Allgemein → Weiterempfehlungen, um {referralStorageInGB} GB kostenlos zu erhalten, sobald Sie einen kostenpflichtigen Tarif abgeschlossen haben\n\nhttps://ente.io",
"shareTextReferralCode": "Ente Weiterempfehlungs-Code: {referralCode} \n\nEinlösen unter Einstellungen → Allgemein → Weiterempfehlungen, um {referralStorageInGB} GB kostenlos zu erhalten, sobald Sie einen kostenpflichtigen Tarif abgeschlossen haben\n\nhttps://ente.io",
"claimFreeStorage": "Freien Speicher einlösen",
"inviteYourFriends": "Lade deine Freunde ein",
"failedToFetchReferralDetails": "Die Weiterempfehlungs-Details können nicht abgerufen werden. Bitte versuche es später erneut.",
@@ -304,6 +304,7 @@
}
},
"faq": "Häufig gestellte Fragen",
"help": "Hilfe",
"oopsSomethingWentWrong": "Ups. Leider ist ein Fehler aufgetreten",
"peopleUsingYourCode": "Leute, die deinen Code verwenden",
"eligible": "zulässig",
@@ -333,7 +334,7 @@
"removeParticipantBody": "{userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt",
"keepPhotos": "Fotos behalten",
"deletePhotos": "Fotos löschen",
"inviteToEnte": "Zu ente einladen",
"inviteToEnte": "Zu Ente einladen",
"removePublicLink": "Öffentlichen Link entfernen",
"disableLinkMessage": "Der öffentliche Link zum Zugriff auf \"{albumName}\" wird entfernt.",
"sharing": "Teilt...",
@@ -349,10 +350,10 @@
"videoSmallCase": "Video",
"photoSmallCase": "Foto",
"singleFileDeleteHighlight": "Es wird aus allen Alben gelöscht.",
"singleFileInBothLocalAndRemote": "Dieses {fileType} existiert auf ente.io und deinem Gerät.",
"singleFileInRemoteOnly": "Dieses {fileType} wird auf ente.io gelöscht.",
"singleFileInBothLocalAndRemote": "Diese Datei ist sowohl in Ente als auch auf deinem Gerät.",
"singleFileInRemoteOnly": "Diese Datei wird von Ente gelöscht.",
"singleFileDeleteFromDevice": "Dieses {fileType} wird von deinem Gerät gelöscht.",
"deleteFromEnte": "Auf ente.io löschen",
"deleteFromEnte": "Von Ente löschen",
"yesDelete": "Ja, löschen",
"movedToTrash": "In den Papierkorb verschoben",
"deleteFromDevice": "Vom Gerät löschen",
@@ -408,7 +409,7 @@
"manageDeviceStorage": "Gerätespeicher verwalten",
"machineLearning": "Maschinelles Lernen",
"magicSearch": "Magische Suche",
"magicSearchDescription": "Bitte beachten Sie, dass dies mehr Bandbreite nutzt und zu einem höheren Akkuverbrauch führt, bis alle Elemente indiziert sind.",
"mlIndexingDescription": "Bitte beachten Sie, dass Machine Learning zu einem höheren Bandbreiten- und Batterieverbrauch führt, bis alle Elemente indiziert sind.",
"loadingModel": "Lade Modelle herunter...",
"waitingForWifi": "Warte auf WLAN...",
"status": "Status",
@@ -444,7 +445,7 @@
"backupOverMobileData": "Über mobile Daten sichern",
"backupVideos": "Videos sichern",
"disableAutoLock": "Automatische Sperre deaktivieren",
"deviceLockExplanation": "Das Sperren des Gerätes verhindern, solange 'ente' im Vordergrund geöffnet ist und eine Sicherung läuft. \nDies wird für gewöhnlich nicht benötigt, kann aber dabei helfen große Transfers schneller durchzuführen.",
"deviceLockExplanation": "Verhindern, dass der Bildschirm gesperrt wird, während die App im Vordergrund ist und eine Sicherung läuft. Das ist normalerweise nicht notwendig, kann aber dabei helfen, große Uploads wie einen Erstimport schneller abzuschließen.",
"about": "Allgemeine Informationen",
"weAreOpenSource": "Unser Quellcode ist offen einsehbar!",
"privacy": "Datenschutz",
@@ -464,7 +465,7 @@
"authToInitiateAccountDeletion": "Bitte authentifizieren, um die Löschung des Kontos einzuleiten",
"areYouSureYouWantToLogout": "Sind sie sicher, dass Sie sich abmelden wollen?",
"yesLogout": "Ja, ausloggen",
"aNewVersionOfEnteIsAvailable": "Eine neuere Version von 'ente' ist verfügbar.",
"aNewVersionOfEnteIsAvailable": "Eine neue Version von Ente ist verfügbar.",
"update": "Updaten",
"installManually": "Manuell installieren",
"criticalUpdateAvailable": "Kritisches Update ist verfügbar!",
@@ -553,11 +554,11 @@
"systemTheme": "System",
"freeTrial": "Kostenlose Testphase",
"selectYourPlan": "Wähle dein Abo aus",
"enteSubscriptionPitch": "ente sichert deine Erinnerungsstücke, sodass sie immer für dich verfügbar sind, auch wenn du dein Gerät verlieren solltest.",
"enteSubscriptionPitch": "Ente sichert deine Erinnerungen, sodass sie dir nie verloren gehen, selbst wenn du dein Gerät verlierst.",
"enteSubscriptionShareWithFamily": "Deine Familie kann zu deinem Abo hinzugefügt werden.",
"currentUsageIs": "Aktuell genutzt werden ",
"@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 Abo",
"appstoreSubscription": "AppStore Abo",
"subAlreadyLinkedErrMessage": "Ihr {id} ist bereits mit einem anderen 'ente'-Konto verknüpft.\nWenn Sie Ihre {id} mit diesem Konto verwenden möchten, kontaktieren Sie bitte unseren Support'",
"subAlreadyLinkedErrMessage": "Ihr {id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn Sie Ihre {id} mit diesem Konto verwenden möchten, kontaktieren Sie bitte unseren Support",
"visitWebToManage": "Bitte rufen Sie \"web.ente.io\" auf um ihr Abo zu verwalten",
"couldNotUpdateSubscription": "Abo konnte nicht aktualisiert werden",
"pleaseContactSupportAndWeWillBeHappyToHelp": "Bitte kontaktieren Sie uns über support@ente.io wo wir Ihnen gerne weiterhelfen.",
@@ -640,7 +641,7 @@
"thankYou": "Vielen Dank",
"failedToVerifyPaymentStatus": "Überprüfung des Zahlungsstatus fehlgeschlagen",
"pleaseWaitForSometimeBeforeRetrying": "Bitte warte kurz, bevor du es erneut versuchst",
"paymentFailedWithReason": "Leider ist deine Zahlung aus folgendem Grund fehlgeschlagen: {reason}",
"paymentFailedMessage": "Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!",
"youAreOnAFamilyPlan": "Du bist im Familien-Tarif!",
"contactFamilyAdmin": "Bitte kontaktiere <green>{familyAdminEmail}</green> um dein Abo zu verwalten",
"leaveFamily": "Familienabo verlassen",
@@ -664,9 +665,9 @@
"everywhere": "überall",
"androidIosWebDesktop": "Android, iOS, Web, Desktop",
"mobileWebDesktop": "Mobil, Web, Desktop",
"newToEnte": "Neu bei ente",
"newToEnte": "Neu bei Ente",
"pleaseLoginAgain": "Bitte logge dich erneut ein",
"devAccountChanged": "Das Entwicklerkonto, das wir verwenden, um ente im App Store zu veröffentlichen, hat sich geändert. Aus diesem Grund musst du dich erneut anmelden.\n\nWir entschuldigen uns für die Unannehmlichkeiten, aber das war unvermeidlich.",
"autoLogoutMessage": "Aufgrund technischer Störungen wurden Sie abgemeldet. Wir entschuldigen uns für die Unannehmlichkeiten.",
"yourSubscriptionHasExpired": "Dein Abonnement ist abgelaufen",
"storageLimitExceeded": "Speichergrenze überschritten",
"upgrade": "Upgrade",
@@ -677,12 +678,12 @@
},
"backupFailed": "Sicherung fehlgeschlagen",
"couldNotBackUpTryLater": "Deine Daten konnten nicht gesichert werden.\nWir versuchen es später erneut.",
"enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "ente kann Dateien nur verschlüsselt sichern, wenn du uns darauf Zugriff gewährst",
"enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente kann Dateien nur verschlüsseln und sichern, wenn du den Zugriff darauf gewährst",
"pleaseGrantPermissions": "Bitte erteile die nötigen Berechtigungen",
"grantPermission": "Zugriff gewähren",
"privateSharing": "Privates Teilen",
"shareOnlyWithThePeopleYouWant": "Teile mit ausgewählten Personen",
"usePublicLinksForPeopleNotOnEnte": "Nutze öffentliche Links für Personen ohne ente.io Konto",
"usePublicLinksForPeopleNotOnEnte": "Verwenden Sie öffentliche Links für Personen, die kein Ente-Konto haben",
"allowPeopleToAddPhotos": "Erlaube anderen das Hinzufügen von Fotos",
"shareAnAlbumNow": "Teile jetzt ein Album",
"collectEventPhotos": "Gemeinsam Event-Fotos sammeln",
@@ -694,7 +695,7 @@
},
"onDevice": "Auf dem Gerät",
"@onEnte": {
"description": "The text displayed above albums backed up to ente",
"description": "The text displayed above albums backed up to Ente",
"type": "text"
},
"onEnte": "Auf <branding>ente</branding>",
@@ -740,7 +741,7 @@
"saveCollage": "Collage speichern",
"collageSaved": "Collage in Galerie gespeichert",
"collageLayout": "Layout",
"addToEnte": "Zu ente hinzufügen",
"addToEnte": "Zu Ente hinzufügen",
"addToAlbum": "Zum Album hinzufügen",
"delete": "Löschen",
"hide": "Ausblenden",
@@ -805,10 +806,10 @@
"photosAddedByYouWillBeRemovedFromTheAlbum": "Von dir hinzugefügte Fotos werden vom Album entfernt",
"youveNoFilesInThisAlbumThatCanBeDeleted": "Du hast keine Dateien in diesem Album, die gelöscht werden können",
"youDontHaveAnyArchivedItems": "Du hast keine archivierten Elemente.",
"ignoredFolderUploadReason": "Einige Dateien in diesem Album werden beim Upload ignoriert, weil sie zuvor auf ente gelöscht wurden.",
"ignoredFolderUploadReason": "Ein paar Dateien in diesem Album werden nicht hochgeladen, weil sie in der Vergangenheit schonmal aus Ente gelöscht wurden.",
"resetIgnoredFiles": "Ignorierte Dateien zurücksetzen",
"deviceFilesAutoUploading": "Dateien, die zu diesem Album hinzugefügt werden, werden automatisch zu ente hochgeladen.",
"turnOnBackupForAutoUpload": "Aktiviere die Sicherung, um automatisch neu hinzugefügte Dateien dieses Ordners auf ente hochzuladen.",
"deviceFilesAutoUploading": "Dateien, die zu diesem Album hinzugefügt werden, werden automatisch zu Ente hochgeladen.",
"turnOnBackupForAutoUpload": "Aktiviere die Sicherung, um neue Dateien in diesem Ordner automatisch zu Ente hochzuladen.",
"noHiddenPhotosOrVideos": "Keine versteckten Fotos oder Videos",
"toHideAPhotoOrVideo": "Foto oder Video verstecken",
"openTheItem": "• Element öffnen",
@@ -834,6 +835,7 @@
"close": "Schließen",
"setAs": "Festlegen als",
"fileSavedToGallery": "Datei in Galerie gespeichert",
"filesSavedToGallery": "Dateien in Galerie gespeichert",
"fileFailedToSaveToGallery": "Fehler beim Speichern der Datei in der Galerie",
"download": "Herunterladen",
"pressAndHoldToPlayVideo": "Gedrückt halten, um Video abzuspielen",
@@ -885,7 +887,7 @@
"@freeUpSpaceSaving": {
"description": "Text to tell user how much space they can free up by deleting items from the device"
},
"freeUpAccessPostDelete": "Sie können immer noch {count, plural, one {darauf} other {auf sie}} auf ente zugreifen, solange Sie ein aktives Abonnement haben",
"freeUpAccessPostDelete": "Du kannst immernoch über Ente {count, plural, one {darauf} other {auf sie}} zugreifen, solange du ein aktives Abo hast",
"@freeUpAccessPostDelete": {
"placeholders": {
"count": {
@@ -936,7 +938,7 @@
"renameFile": "Datei umbenennen",
"enterFileName": "Dateinamen eingeben",
"filesDeleted": "Dateien gelöscht",
"selectedFilesAreNotOnEnte": "Ausgewählte Dateien sind nicht auf ente",
"selectedFilesAreNotOnEnte": "Ausgewählte Dateien sind nicht auf Ente",
"thisActionCannotBeUndone": "Diese Aktion kann nicht rückgängig gemacht werden",
"emptyTrash": "Papierkorb leeren?",
"permDeleteWarning": "Alle Elemente im Papierkorb werden dauerhaft gelöscht\n\nDiese Aktion kann nicht rückgängig gemacht werden",
@@ -945,7 +947,7 @@
"permanentlyDeleteFromDevice": "Endgültig vom Gerät löschen?",
"someOfTheFilesYouAreTryingToDeleteAre": "Einige der Dateien, die Sie löschen möchten, sind nur auf Ihrem Gerät verfügbar und können nicht wiederhergestellt werden, wenn sie gelöscht wurden",
"theyWillBeDeletedFromAllAlbums": "Sie werden aus allen Alben gelöscht.",
"someItemsAreInBothEnteAndYourDevice": "Einige Elemente sind sowohl auf ente als auch auf Ihrem Gerät.",
"someItemsAreInBothEnteAndYourDevice": "Einige Elemente sind sowohl auf Ente als auch auf deinem Gerät.",
"selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben.",
"theseItemsWillBeDeletedFromYourDevice": "Diese Elemente werden von deinem Gerät gelöscht.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam.",
@@ -985,7 +987,7 @@
"fileTypesAndNames": "Dateitypen und -namen",
"location": "Standort",
"moments": "Momente",
"searchFaceEmptySection": "Finde alle Foto von einer Person",
"searchFaceEmptySection": "Personen werden hier angezeigt, sobald die Indizierung abgeschlossen ist",
"searchDatesEmptySection": "Suche nach Datum, Monat oder Jahr",
"searchLocationEmptySection": "Gruppiere Fotos, die innerhalb des Radius eines bestimmten Fotos aufgenommen wurden",
"searchPeopleEmptySection": "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können",
@@ -1040,7 +1042,7 @@
"@storageUsageInfo": {
"description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used"
},
"freeStorageSpace": "{freeAmount} {storageUnit} kostenlos",
"availableStorageSpace": "{freeAmount} {storageUnit} frei",
"appVersion": "Version: {versionValue}",
"verifyIDLabel": "Überprüfen",
"fileInfoAddDescHint": "Beschreibung hinzufügen …",
@@ -1051,7 +1053,7 @@
},
"setRadius": "Radius festlegen",
"familyPlanPortalTitle": "Familie",
"familyPlanOverview": "Fügen Sie 5 Familienmitglieder zu Ihrem bestehenden Abo hinzu, ohne extra zu bezahlen.\n\nJedes Mitglied erhält einen eigenen privaten Raum und kann die Dateien von anderen nicht sehen, wenn sie nicht freigegeben werden.\n\nFamilien-Abos sind für Kunden verfügbar, die ein kostenpflichtiges ente Abonnement haben.\n\nMelden Sie sich jetzt an, um loszulegen!",
"familyPlanOverview": "Füge kostenlos 5 Familienmitglieder zu deinem bestehenden Abo hinzu.\n\nJedes Mitglied bekommt seinen eigenen privaten Bereich und kann die Dateien der anderen nur sehen, wenn sie geteilt werden.\n\nFamilien-Abos stehen Nutzern mit einem Bezahltarif zur Verfügung.\n\nMelde dich jetzt an, um loszulegen!",
"androidBiometricHint": "Identität verifizieren",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
@@ -1129,7 +1131,7 @@
"noAlbumsSharedByYouYet": "Noch keine Alben von dir geteilt",
"sharedWithYou": "Mit dir geteilt",
"sharedByYou": "Von dir geteilt",
"inviteYourFriendsToEnte": "Lade deine Freunde zu ente ein",
"inviteYourFriendsToEnte": "Lade deine Freunde zu Ente ein",
"failedToDownloadVideo": "Herunterladen des Videos fehlgeschlagen",
"hiding": "Verstecken...",
"unhiding": "Einblenden...",
@@ -1139,7 +1141,7 @@
"addToHiddenAlbum": "Zum versteckten Album hinzufügen",
"moveToHiddenAlbum": "Zu verstecktem Album verschieben",
"fileTypes": "Dateitypen",
"deleteConfirmDialogBody": "Dieses Konto ist mit anderen ente Apps verknüpft, sofern du diese benutzt.\\n\\nDeine hochgeladenen Daten werden zur permanenten Löschung freigegeben. Dies gilt für alle ente Apps.",
"deleteConfirmDialogBody": "Dieses Konto ist mit anderen Ente-Apps verknüpft, falls du welche verwendest. Deine hochgeladenen Daten werden in allen Ente-Apps zur Löschung vorgemerkt und dein Konto wird endgültig gelöscht.",
"hearUsWhereTitle": "Wie hast du von Ente erfahren? (optional)",
"hearUsExplanation": "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!",
"viewAddOnButton": "Zeige Add-ons",
@@ -1169,6 +1171,7 @@
}
},
"faces": "Gesichter",
"people": "Personen",
"contents": "Inhalte",
"addNew": "Hinzufügen",
"@addNew": {
@@ -1185,10 +1188,8 @@
"selectALocation": "Standort auswählen",
"selectALocationFirst": "Wähle zuerst einen Standort",
"changeLocationOfSelectedItems": "Standort der gewählten Elemente ändern?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Änderungen des Standorts werden nur in ente sichtbar sein",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"cleanUncategorized": "Unkategorisiert leeren",
"addAName": "Add a name",
"findPeopleByName": "Find people quickly by searching by name",
"cleanUncategorizedDescription": "Entferne alle Dateien von \"Unkategorisiert\" die in anderen Alben vorhanden sind",
"waitingForVerification": "Warte auf Bestätigung...",
"passkey": "Passkey",
@@ -1202,16 +1203,37 @@
"joinDiscord": "Discord beitreten",
"locations": "Orte",
"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.",
"createCollaborativeLink": "Create collaborative link",
"search": "Search",
"enterPersonName": "Enter person name",
"removePersonLabel": "Remove person label",
"faceRecognition": "Face recognition",
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
"foundFaces": "Found faces",
"clusteringProgress": "Clustering progress",
"indexingIsPaused": "Indexing is paused, will automatically resume when device is ready"
"addAName": "Füge einen Namen hinzu",
"findPeopleByName": "Finde Personen schnell nach Namen",
"addViewers": "{count, plural, one {Betrachter} other {Betrachter}} hinzufügen",
"addCollaborators": "{count, plural, one {Teilnehmer} other {Teilnehmer}} hinzufügen",
"longPressAnEmailToVerifyEndToEndEncryption": "Lange auf eine E-Mail drücken, um die Ende-zu-Ende-Verschlüsselung zu überprüfen.",
"developerSettingsWarning": "Bist du sicher, dass du Entwicklereinstellungen bearbeiten willst?",
"developerSettings": "Entwicklereinstellungen",
"serverEndpoint": "Server Endpunkt",
"invalidEndpoint": "Ungültiger Endpunkt",
"invalidEndpointMessage": "Der eingegebene Endpunkt ist ungültig. Gib einen gültigen Endpunkt ein und versuch es nochmal.",
"endpointUpdatedMessage": "Endpunkt erfolgreich geändert",
"customEndpoint": "Verbunden mit {endpoint}",
"createCollaborativeLink": "Gemeinschaftlichen Link erstellen",
"search": "Suche",
"enterPersonName": "Namen der Person eingeben",
"removePersonLabel": "Personenetikett entfernen",
"autoPairDesc": "Automatisches Verbinden funktioniert nur mit Geräten, die Chromecast unterstützen.",
"manualPairDesc": "\"Mit PIN verbinden\" funktioniert mit jedem Bildschirm, auf dem du dein Album sehen möchtest.",
"connectToDevice": "Mit Gerät verbinden",
"autoCastDialogBody": "Verfügbare Cast-Geräte werden hier angezeigt.",
"autoCastiOSPermission": "Stelle sicher, dass die Ente-App auf das lokale Netzwerk zugreifen darf. Das kannst du in den Einstellungen unter \"Datenschutz\".",
"noDeviceFound": "Kein Gerät gefunden",
"stopCastingTitle": "Übertragung beenden",
"stopCastingBody": "Möchtest du die Übertragung beenden?",
"castIPMismatchTitle": "Album konnte nicht auf den Bildschirm übertragen werden",
"castIPMismatchBody": "Stelle sicher, dass du im selben Netzwerk bist wie der Fernseher.",
"pairingComplete": "Verbunden",
"autoPair": "Automatisch verbinden",
"pairWithPin": "Mit PIN verbinden",
"faceRecognition": "Gesichtserkennung",
"foundFaces": "Gesichter gefunden",
"clusteringProgress": "Fortschritt beim Clustering",
"indexingIsPaused": "Die Indizierung ist unterbrochen. Sie wird automatisch fortgesetzt, wenn das Gerät bereit ist."
}

View File

@@ -409,7 +409,7 @@
"manageDeviceStorage": "Manage device storage",
"machineLearning": "Machine learning",
"magicSearch": "Magic search",
"magicSearchDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
"mlIndexingDescription": "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.",
"loadingModel": "Downloading models...",
"waitingForWifi": "Waiting for WiFi...",
"status": "Status",
@@ -667,7 +667,7 @@
"mobileWebDesktop": "Mobile, Web, Desktop",
"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.",
"autoLogoutMessage": "Due to technical glitch, you have been logged out. Our apologies for the inconvenience.",
"yourSubscriptionHasExpired": "Your subscription has expired",
"storageLimitExceeded": "Storage limit exceeded",
"upgrade": "Upgrade",
@@ -987,7 +987,7 @@
"fileTypesAndNames": "File types and names",
"location": "Location",
"moments": "Moments",
"searchFaceEmptySection": "Persons will be shown here once indexing is done",
"searchFaceEmptySection": "People will be shown here once indexing is done",
"searchDatesEmptySection": "Search by a date, month or year",
"searchLocationEmptySection": "Group photos that are taken within some radius of a photo",
"searchPeopleEmptySection": "Invite people, and you'll see all photos shared by them here",
@@ -1042,7 +1042,7 @@
"@storageUsageInfo": {
"description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used"
},
"freeStorageSpace": "{freeAmount} {storageUnit} free",
"availableStorageSpace": "{freeAmount} {storageUnit} free",
"appVersion": "Version: {versionValue}",
"verifyIDLabel": "Verify",
"fileInfoAddDescHint": "Add a description...",
@@ -1233,8 +1233,7 @@
"autoPair": "Auto pair",
"pairWithPin": "Pair with PIN",
"faceRecognition": "Face recognition",
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
"foundFaces": "Found faces",
"clusteringProgress": "Clustering progress",
"indexingIsPaused": "Indexing is paused, will automatically resume when device is ready"
}
"indexingIsPaused": "Indexing is paused. It will automatically resume when device is ready."
}

View File

@@ -949,7 +949,6 @@
"@storageUsageInfo": {
"description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used"
},
"freeStorageSpace": "{freeAmount} {storageUnit} gratis",
"appVersion": "Versión: {versionValue}",
"verifyIDLabel": "Verificar",
"fileInfoAddDescHint": "Añadir una descripción...",

View File

@@ -1014,7 +1014,7 @@
"@storageUsageInfo": {
"description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used"
},
"freeStorageSpace": "{freeAmount} {storageUnit} libre",
"availableStorageSpace": "{freeAmount} {storageUnit} libre",
"appVersion": "Version : {versionValue}",
"verifyIDLabel": "Vérifier",
"fileInfoAddDescHint": "Ajouter une description...",

View File

@@ -1004,7 +1004,7 @@
"@storageUsageInfo": {
"description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used"
},
"freeStorageSpace": "{freeAmount} {storageUnit} liberi",
"availableStorageSpace": "{freeAmount} {storageUnit} liberi",
"appVersion": "Versione: {versionValue}",
"verifyIDLabel": "Verifica",
"fileInfoAddDescHint": "Aggiungi descrizione...",

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