Merge branch 'main' into f-droid

This commit is contained in:
ashilkn
2024-12-09 12:51:05 +05:30
282 changed files with 4681 additions and 3460 deletions

View File

@@ -22,6 +22,18 @@ jobs:
with:
submodules: recursive
- name: Verify custom icons are lowercase including optional understores, and end with .svg
run: |
find assets/custom-icons -type f -name "*.svg" | while read -r file; do
if [[ "$(basename "$file")" != "$(basename "$file" | tr '[:upper:]' '[:lower:]' | tr ' ' '_')" ]]; then
echo "File name is not lowercase: $file"
exit 1
fi
done
- name: Verify custom icon JSON
run: cat assets/custom-icons/_data/custom-icons.json | jq empty
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
uses: subosito/flutter-action@v2
with:
@@ -32,6 +44,3 @@ jobs:
- run: flutter pub get
- run: flutter analyze --no-fatal-infos
- name: Verify custom icon JSON
run: cat assets/custom-icons/_data/custom-icons.json | jq empty

View File

@@ -66,16 +66,19 @@ best to start small. Consider some well-scoped changes, say like adding more
[custom icons to auth](auth/docs/adding-icons.md).
Each of the individual product/platform specific directories in this repository
have instructions on setting up a dev environment and making changes. The issues
and discussions (feature requests) labelled "good first issues" should be good
starting points. Once you have a bearing, you can head on to issues or
discussions labelled "help wanted".
have instructions on setting up a dev environment.
If you're planning on adding a new feature or making any other substantial
change, please [discuss it with
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.
For anything beyond trivial bug fixes, please use [features requests and
discussions](https://github.com/ente-io/ente/discussions) instead of performing
code changes directly.
> [!TIP]
>
> Please remember that code is a important, but small, part of the overall big
> picture that makes a product a joy to use. Something that's easy in code is
> not necessarily the right choice for the product as a whole. So we'll repeat -
> there are other ways to contribute than code that we'd request you to
> consider.
## Leave a review or star

View File

@@ -1,7 +1,8 @@
{
"icons": [
{
"title": "1xBet"
"title": "1xBet",
"slug": "1x_bet"
},
{
"title": "23andme"
@@ -45,13 +46,15 @@
},
{
"title": "BaiduCloud",
"slug": "baidu_cloud",
"altNames": [
"百度云",
"baiduyun"
]
},
{
"title": "Band"
"title": "Band",
"slug": "band"
},
{
"title": "Battle.net",
@@ -63,6 +66,7 @@
},
{
"title": "BBS.NGA",
"slug": "bbs_nga",
"altNames": [
"NGA玩家社区",
"NGA社区"
@@ -76,6 +80,7 @@
},
{
"title": "Binance",
"slug": "binance_exchange",
"altNames": [
"币安"
]
@@ -123,13 +128,6 @@
{
"title": "Bitwarden"
},
{
"title": "Bloom Host",
"slug": "bloom_host",
"altNames": [
"Bloom Host Billing"
]
},
{
"title": "Blockchain",
"altNames": [
@@ -146,7 +144,8 @@
]
},
{
"title": "Bluesky"
"title": "Bluesky",
"slug": "blue_sky"
},
{
"title": "Booking",
@@ -156,16 +155,11 @@
},
{
"title": "BorgBase",
"slug": "borg_base",
"altNames": [
"borg"
]
},
{
"title": "Booking",
"altNames": [
"Booking.com"
]
},
{
"title": "Brave Creators",
"slug": "brave_creators",
@@ -175,6 +169,9 @@
"Brave Browser"
]
},
{
"title": "Bugzilla"
},
{
"title": "Bybit"
},
@@ -191,7 +188,8 @@
]
},
{
"title": "CERN"
"title": "CERN",
"slug": "cern"
},
{
"title": "ChangeNOW"
@@ -268,6 +266,9 @@
{
"title": "Doppler"
},
{
"title": "Dropbox"
},
{
"title": "dus.net",
"slug": "dusnet"
@@ -285,12 +286,16 @@
"Murena"
]
},
{
"title": "eneba"
},
{
"title": "ente",
"hex": "1DB954"
},
{
"title": "enom"
"title": "enom",
"slug": "enom_v1"
},
{
"title": "Epic Games",
@@ -303,6 +308,13 @@
{
"title": "Estateguru"
},
{
"title": "Fidelity",
"slug": "fidelity",
"altNames": [
"Fidelity Investments"
]
},
{
"title": "Filen"
},
@@ -330,7 +342,7 @@
},
{
"title": "Gosuslugi",
"slug": "Gosuslugi",
"slug": "gosuslugi",
"altNames": [
"Госуслуги"
]
@@ -342,6 +354,15 @@
"Government Gateway"
]
},
{
"title": "Government of Canada",
"slug": "canada_flag",
"altNames": [
"CRA",
"CRA/ARC",
"Canada Revenue Agency"
]
},
{
"title": "Guideline"
},
@@ -368,11 +389,12 @@
]
},
{
"title": "IceDrive"
"title": "IceDrive",
"slug": "ice_drive"
},
{
"title": "ID.me",
"slug": "IDme"
"slug": "id_me"
},
{
"title": "Infomaniak"
@@ -400,7 +422,8 @@
"hex": "000000"
},
{
"title": "IVPN"
"title": "IVPN",
"slug": "ivpn"
},
{
"title": "Jagex",
@@ -430,6 +453,7 @@
},
{
"title": "Ko-fi",
"slug": "ko_fi",
"altNames": [
"Ko fi",
"Kofi"
@@ -457,6 +481,7 @@
},
{
"title": "Lark",
"slug": "lark",
"altNames": [
"飞书"
]
@@ -466,7 +491,7 @@
},
{
"title": "Linux.Do",
"slug": "LINUX_DO",
"slug": "linux_do",
"altNames": [
"LINUX DO",
"LinxDo"
@@ -499,6 +524,10 @@
],
"hex": "6364FF"
},
{
"title": "matlab",
"altNames": ["mathworks"]
},
{
"title": "Mercado Livre",
"slug": "mercado_livre",
@@ -509,7 +538,7 @@
]
},
{
"title": "Microsoft"
"title": "microsoft"
},
{
"title": "Microsoft 365",
@@ -565,6 +594,7 @@
},
{
"title": "NeteaseMail",
"slug": "netease_mail",
"altNames": [
"网易邮箱",
"Mail.163"
@@ -584,7 +614,7 @@
"hex": "858585"
},
{
"title": "Nintendo",
"title": "nintendo",
"altNames": [
"任天堂"
]
@@ -592,6 +622,12 @@
{
"title": "Njalla"
},
{
"title": "nordvpn",
"slug": "nordaccount",
"hex": "#4687FF",
"altNames": "Nord Account"
},
{
"title": "Notesnook"
},
@@ -634,10 +670,12 @@
"hex": "f08222"
},
{
"title": "pCloud"
"title": "pCloud",
"slug": "pcloud"
},
{
"title": "PebbleHost",
"slug": "pebble_host",
"altNames": [
"Pebble Host"
]
@@ -675,6 +713,10 @@
{
"title": "Proxmox"
},
{
"title": "Pushover",
"slug": "pushover"
},
{
"title": "qiniuyun",
"altNames": [
@@ -689,6 +731,9 @@
"Raindrop"
]
},
{
"title": "randstad"
},
{
"title": "Real-Debrid",
"slug": "real_debrid"
@@ -710,6 +755,7 @@
},
{
"title": "Restream",
"slug": "restream",
"altNames": [
"restream.io"
]
@@ -779,6 +825,9 @@
{
"title": "Snapchat"
},
{
"title": "SpaceHey"
},
{
"title": "Standard Notes",
"slug": "standardnotes"
@@ -832,6 +881,7 @@
},
{
"title": "Terabit",
"slug": "terabit",
"altNames": [
"Terabit Hosting",
"terabit.io"
@@ -924,7 +974,8 @@
]
},
{
"title": "WARGAMING.NET"
"title": "WARGAMING.NET",
"slug": "wargamingnet"
},
{
"title": "Wealthfront"
@@ -946,6 +997,9 @@
{
"title": "Wise"
},
{
"title": "Wolvesville"
},
{
"title": "WorkOS",
"altNames": [
@@ -960,6 +1014,7 @@
},
{
"title": "Yandex",
"slug": "yandex",
"altNames": [
"Ya",
"Яндекс"

View File

Before

Width:  |  Height:  |  Size: 481 B

After

Width:  |  Height:  |  Size: 481 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" vector-effect="non-scaling-stroke" viewBox="0 0 500 500">
<g fill="#F0B90B">
<path d="m0 250 56.452-56.451L112.903 250l-56.451 56.451L0 250zm96.774-96.774L250 0l153.226 153.226-56.452 56.451L250 112.903l-96.774 96.774-56.452-56.451z"/>
<path d="M193.549 250 250 193.549 306.451 250 250 306.451 193.549 250z"/>
<path d="m153.226 290.323-56.452 56.451L250 500l153.226-153.226-56.452-56.451L250 387.097l-96.774-96.774zM387.097 250l56.452-56.451L500 250l-56.451 56.451L387.097 250z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 561 B

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 662 B

After

Width:  |  Height:  |  Size: 662 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" viewBox="0 0 9600 4800">
<title>Flag of Canada</title>
<path fill="#f00" d="m0 0h2400l99 99h4602l99-99h2400v4800h-2400l-99-99h-4602l-99 99H0z"/>
<path fill="#fff" d="m2400 0h4800v4800h-4800zm2490 4430-45-863a95 95 0 0 1 111-98l859 151-116-320a65 65 0 0 1 20-73l941-762-212-99a65 65 0 0 1-34-79l186-572-542 115a65 65 0 0 1-73-38l-105-247-423 454a65 65 0 0 1-111-57l204-1052-327 189a65 65 0 0 1-91-27l-332-652-332 652a65 65 0 0 1-91 27l-327-189 204 1052a65 65 0 0 1-111 57l-423-454-105 247a65 65 0 0 1-73 38l-542-115 186 572a65 65 0 0 1-34 79l-212 99 941 762a65 65 0 0 1 20 73l-116 320 859-151a95 95 0 0 1 111 98l-45 863z"/>
</svg>

After

Width:  |  Height:  |  Size: 699 B

View File

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 242 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.1 MiB

After

Width:  |  Height:  |  Size: 785 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" vector-effect="non-scaling-stroke" viewBox="0 0 500 500">
<g fill="#0061fe">
<path d="M125.022 38.07.055 117.545l124.967 79.473 124.988-79.473 124.968 79.473 124.967-79.473-124.967-79.473-124.968 79.473-124.988-79.473z"/>
<path d="M125.022 355.967.055 276.492l124.967-79.475 124.988 79.475-124.988 79.475zm124.988-79.475 124.968-79.475 124.967 79.475-124.967 79.475-124.968-79.475zm0 185.438-124.988-79.474 124.988-79.473 124.968 79.473L250.01 461.93z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 531 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="480px" height="480px"><path fill="#66bb6a" d="M11.622,31.768c0.46,0.787-0.09,1.951-1.229,2.6S7.58,35.391,7.12,34.604 c-0.46-0.787,0.469-2.436,1.607-3.086C9.866,30.869,11.162,30.981,11.622,31.768z"/><path fill="#66bb6a" d="M18.766,27.808c0.115,0.812,1.256,1.326,2.549,1.148c1.293-0.178,2.841-0.851,2.726-1.663 c-0.115-0.812-1.85-1.457-3.142-1.279C19.606,26.192,18.651,26.996,18.766,27.808z"/><path fill="#aa2c2c" d="M38.352,14.876l-0.031-3.849L36,8c0,0-1.355-1.052-1.589-1.197c-1.12-0.693-2.797-1.453-3.463-0.064 c-0.364,0.759,0.694,2.314,1.053,3.074c1.571,3.325,1.03,4.822-0.387,10.514L38.352,14.876z"/><path fill="#fb8c00" d="M8.277,15.795l-3.124,2.422c0,0-1.153,0.451-1.153,4.569c0,2.343,0.867,4.499,2.434,4.183 c0.856-0.172,1.44-2.013,1.828-2.783c1.697-3.367,3.271-3.852,8.841-6.227L8.277,15.795z"/><path fill="#43a047" d="M23.888,32.502l4.786,8.997c0,0,0.96,0.758,4.539-1.295c2.037-1.169,3.484-2.983,2.438-4.163 c-0.571-0.644-2.457-0.198-3.319-0.172C27.413,36.017,23.888,32.502,23.888,32.502z"/><path fill="#ff1744" d="M42.266,21.316c0.913-0.806,1.803-1.836,1.73-2.356c-0.101-0.721-1.156-0.865-2.133-0.775 c-0.418-3.378-3.511-9.378-8.003-11.683c1.233,3.926,0.175,8.972-5.791,14.952c-0.009,0.009-0.018,0.018-0.027,0.027 c-2.091,2.075-2.671,5.223-1.299,7.845c2.05,3.92,6.758,4.705,9.863,2.354l0.008-0.008c0.296-0.253,0.593-0.507,0.866-0.784 c0.094-0.079,0.172-0.158,0.258-0.245c0.683-0.693,1.276-1.443,1.794-2.229c1.418-0.78,3.332-2.199,3.332-2.864 c0-0.563-0.716-0.808-1.577-0.869c0.001-0.003,0.002-0.007,0.003-0.01c1.288-0.8,2.677-1.913,2.677-2.48 C43.967,21.6,43.18,21.361,42.266,21.316z"/><path fill="#66bb6a" d="M14.786,23.021c3.086-0.244,5.884,1.626,7.033,4.519c0.005,0.012,2.976,9.717,10.954,12.963 c-0.809,0.511-1.675,0.943-2.594,1.308c-8.356,3.319-17.821-0.551-21.142-8.657c-0.049-0.12-0.093-0.228-0.132-0.352 c-0.156-0.38-0.279-0.773-0.402-1.167l-0.004-0.011C7.498,27.633,10.172,23.386,14.786,23.021z"/><path fill="#ffb74d" d="M26.375,8.221c0.324-0.298,0.526-0.67,0.526-1.081c0-0.356-0.147-0.686-0.397-0.962 c0.241-0.206,0.397-0.476,0.397-0.777c0-0.282-0.144-0.53-0.357-0.731c0.048-0.052,0.099-0.092,0.144-0.151 c0.431-0.564,0.526-1.208,0.212-1.438c-0.314-0.23-0.918,0.04-1.35,0.604c-0.148,0.193-0.24,0.392-0.306,0.584 c-0.73,0.071-1.304,0.54-1.304,1.132c0,0.021,0.014,0.038,0.015,0.058c-0.804,0.149-1.437,0.597-1.677,1.175 C13.537,5.445,5.434,11.67,4.165,20.541c-0.14,0.976-0.194,1.94-0.151,2.894c6.823-5.257,16.795-2.954,16.809-2.953 c3.104,0.459,6.137-1.018,7.464-3.803C29.813,13.479,28.756,10.123,26.375,8.221z"/></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,11 @@
<svg width="49" height="48" viewBox="0 0 49 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_933_28141)">
<path d="M24.9434 48C38.1983 48 48.9434 37.2548 48.9434 24C48.9434 10.7452 38.1983 0 24.9434 0C11.6886 0 0.94342 10.7452 0.94342 24C0.94342 37.2548 11.6886 48 24.9434 48Z" fill="white"/>
<path d="M22.5996 27.795H29.2838L31.2396 29.0631H22.3059L18.3011 41.4571C16.0258 40.544 13.9543 39.1883 12.2067 37.4686C10.4592 35.7489 9.07035 33.6995 8.12074 31.4391C7.17113 29.1787 6.67963 26.7523 6.67472 24.3005C6.66982 21.8487 7.15161 19.4204 8.09217 17.1562C9.94318 12.7412 13.423 9.20846 17.8095 7.29094C22.196 5.37342 27.1523 5.2184 31.6501 6.85805C36.1478 8.4977 39.8416 11.8061 41.9649 16.0968C44.0882 20.3874 44.478 25.3309 43.0534 29.9013C41.9853 33.3728 39.9048 36.4463 37.0784 38.7276L32.1423 30.5031L39.0128 34.3359C39.0128 34.3359 39.0701 34.2929 39.0128 34.2499L30.0576 26.484L41.685 28.2607C41.728 28.2607 41.7423 28.2607 41.7423 28.2607L41.6707 28.1962L30.6952 24.3204L42.1005 21.5622C42.1005 21.5622 42.1005 21.5622 42.1005 21.5049L30.4229 22.2714L39.5787 15.3365C39.5787 15.3365 39.5214 15.2792 39.4999 15.3365L29.2122 20.552L34.879 10.5222C34.879 10.5222 34.879 10.4649 34.8432 10.5222L27.4355 19.1837L28.8683 7.721C28.8683 7.721 28.8253 7.67801 28.7895 7.721L25.3722 18.8326L22.3847 7.36995C22.3847 7.36995 22.3202 7.33413 22.2987 7.36995L23.1226 19.2625L16.0802 10.0923C16.0802 10.0923 16.0373 10.0923 16.0158 10.0923L21.3459 20.244L11.2731 14.749C11.2731 14.749 11.2158 14.749 11.2158 14.792L20.1781 22.1496L8.71545 20.9389C8.67247 20.9389 8.67247 20.9962 8.71545 21.0177L19.8343 24.2631L8.79426 27.5013C8.78949 27.506 8.78571 27.5115 8.78312 27.5177C8.78054 27.5238 8.77921 27.5304 8.77921 27.5371C8.77921 27.5438 8.78054 27.5504 8.78312 27.5565C8.78571 27.5627 8.78949 27.5683 8.79426 27.5729L20.1781 26.2834L11.2373 33.8416C11.2373 33.8416 11.1943 33.8846 11.2373 33.9061L11.3519 33.8631L18.5161 30.1162L20.1925 27.444H22.1053L20.7799 26.5055L25.2074 19.3986L22.5996 27.795Z" fill="#368727"/>
</g>
<defs>
<clipPath id="clip0_933_28141">
<rect width="49" height="48" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="2 3.299999999999999 28 25.43" xmlns="http://www.w3.org/2000/svg" width="2500" height="2128"><linearGradient id="a" gradientTransform="matrix(1 0 0 -1 0 32)" gradientUnits="userSpaceOnUse" x1="16.803" x2="15.013" y1="16.631" y2="22.411"><stop offset="0" stop-color="#512"/><stop offset=".23" stop-color="#523"/><stop offset=".36" stop-color="#534"/><stop offset=".51" stop-color="#645"/><stop offset=".66" stop-color="#568"/><stop offset=".84" stop-color="#29d"/></linearGradient><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="29.71" x2="11.71" y1="18.983" y2="14.563"><stop offset=".081" stop-color="#c33"/><stop offset=".189" stop-color="#de5239"/><stop offset=".313" stop-color="#f06e3e"/><stop offset=".421" stop-color="#fa8042"/><stop offset=".5" stop-color="#fe8643"/><stop offset=".58" stop-color="#fa7f42"/><stop offset=".696" stop-color="#ef6c3e"/><stop offset=".833" stop-color="#dc4c37"/><stop offset=".916" stop-color="#cf3633"/></linearGradient><path d="M2 17.55l7.97-3.22a20.7 20.7 0 0 1 2.72-2.95c.66-.35 1.9-.16 4.17-2.98 2.2-2.75 2.9-5.1 3.93-5.1 1.63 0 2.83 3.52 4.65 8.85A115.629 115.629 0 0 0 30 24.12c-1.9-1.77-3.52-3.68-5.37-3.63-1.72.04-3.63 2.08-5.72 4.7-1.66 2.1-3.86 3.54-4.72 3.51 0 0-2.22-6.28-4.08-7.3a2.641 2.641 0 0 0-2.39.2L2 17.54z" fill="#49d"/><path d="M19.8 4.02c-.67.9-1.48 2.55-2.94 4.38-2.27 2.82-3.5 2.63-4.17 2.98a19.674 19.674 0 0 0-2.72 2.95l3.3 2.41c2.8-3.82 4.3-7.96 5.47-10.64a13.579 13.579 0 0 1 1.06-2.08z" fill="url(#a)"/><path d="M20.8 3.3c-2.18 0-3.67 11.48-11.72 17.89 2.26-.37 4.22 5.24 5.12 7.51 4-.68 7.2-8.33 10.43-8.21 1.85.07 3.47 1.86 5.37 3.63C25.66 15 23.63 3.3 20.8 3.3z" fill="url(#b)"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg8"
version="1.1"
viewBox="0 0 600 200"
height="200"
width="600">
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-626.49998)"
id="layer1">
<rect
y="626.5"
x="0"
height="200"
width="600"
id="rect80"
style="opacity:1;vector-effect:none;fill:#e60012;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.00000095;stroke-miterlimit:4;stroke-dasharray:none;paint-order:stroke markers fill" />
<path
d="M 110.9662,789.5669 C 70.8232,789.5533 44.000009,761.10508 44.000009,726.61229 v 0 c 0,-34.49278 26.884385,-63.26737 66.904991,-63.17898 h 378.19 c 40.02061,-0.0884 66.90499,28.6862 66.90499,63.17898 v 0 c 0,34.49279 -26.82319,62.94101 -66.96618,62.95461 z m 0.12238,-110.61761 c -31.779868,0.0612 -51.287026,21.30216 -51.287026,47.58141 v 0 c 0,26.27245 19.38477,47.69021 51.287026,47.57462 h 377.82284 c 31.90226,0.10879 51.29383,-21.30217 51.29383,-47.57462 v 0 c 0,-26.27245 -19.50716,-47.51342 -51.28703,-47.57462 z m 398.14591,22.17927 c 2.8897,0 4.32435,0.9791 4.32435,2.9169 0,1.33266 -0.82952,2.33895 -2.20977,2.68572 l 2.26416,4.52152 h -2.74011 l -1.9378,-4.14756 h -1.20347 v 4.14756 h -2.46814 v -10.12414 z m -0.22438,-3.95718 c -5.04507,0 -9.13824,4.09317 -9.13824,9.13824 0,5.04507 4.09317,9.13824 9.13824,9.13824 5.04508,0 9.13825,-4.09317 9.13825,-9.13824 0,-5.04507 -4.09317,-9.13824 -9.13825,-9.13824 z m 7.39083,9.14504 c 0,4.07957 -3.31125,7.39083 -7.39083,7.39083 -4.07957,0 -7.39082,-3.31126 -7.39082,-7.39083 0,-4.07957 3.31125,-7.39083 7.39082,-7.39083 4.07958,0 7.39083,3.30446 7.39083,7.39083 z m -8.66909,-0.69353 h 1.20347 c 1.40745,0 2.08738,-0.42835 2.08738,-1.43465 0,-1.05389 -0.72752,-1.50944 -2.20977,-1.50944 h -1.08108 z M 301.19668,730.3655 c -0.0272,-3.46084 0.0476,-5.77259 1.18307,-7.74439 1.39386,-2.43414 3.95719,-3.59002 6.28254,-3.60362 h -0.007 c 2.32536,0.0136 4.88869,1.16948 6.28255,3.60362 1.13548,1.97859 1.18307,4.29035 1.15588,7.75119 z m 14.83604,11.90555 c 0,0 0.0136,0.17679 0.0136,2.39335 0,7.22085 -4.7527,8.82548 -7.39083,8.82548 -2.63812,0 -7.47241,-1.60463 -7.47241,-8.82548 0,-2.16217 0.0136,-8.15234 0.0136,-8.15234 0,0 33.63607,0.0136 33.63607,-0.007 0,-12.24552 -11.82396,-22.39006 -26.34724,-22.39006 -14.52328,0 -26.29284,9.92696 -26.29284,22.17248 0,12.24552 11.76956,22.16568 26.29284,22.16568 12.04834,0 22.22687,-6.87408 25.33415,-16.1959 z m 56.18252,-27.49632 c 6.6769,-0.19038 20.22108,4.18157 20.12589,19.81313 -0.0136,2.77411 -0.007,21.48575 -0.007,21.48575 h -17.73934 c 0,0 0,-23.46434 0,-25.93249 0,-3.44044 -3.29086,-7.26843 -8.15915,-7.26843 -4.86149,0 -8.47871,3.82799 -8.47871,7.26843 0,1.68623 0.0204,25.93249 0.0204,25.93249 h -17.72574 l 0.0136,-39.48347 17.71895,-0.0136 c 0,0 -0.0204,3.17526 0,4.15436 3.41324,-3.25686 8.33593,-5.78619 14.23091,-5.95618 z m -145.11041,0 c 6.6769,-0.19038 20.22109,4.18157 20.1259,19.81313 -0.0136,2.77411 -0.007,21.48575 -0.007,21.48575 h -17.73935 c 0,0 0,-23.46434 0,-25.93249 0,-3.44044 -3.29085,-7.26843 -8.15914,-7.26843 -4.86149,0 -8.47871,3.82799 -8.47871,7.26843 0,1.68623 0.0204,25.93249 0.0204,25.93249 h -17.72574 l -0.007,-39.48347 17.73934,-0.0136 c 0,0 -0.0204,3.17526 0,4.15436 3.41325,-3.25686 8.32913,-5.78619 14.23091,-5.95618 z m 203.72027,-18.0657 h 17.62376 v 59.37818 H 430.7979 c 0,0 -0.007,-1.9174 -0.007,-2.28456 -6.83328,4.29035 -14.54367,4.28355 -20.54744,1.48224 -1.61144,-0.74792 -12.21153,-5.83379 -12.21153,-19.57515 0,-10.42331 9.83178,-21.80532 22.70283,-20.67663 4.23595,0.37396 7.24804,1.9174 10.10374,3.52203 -0.0136,-9.13825 -0.0136,-21.84611 -0.0136,-21.84611 z m 0.12919,39.43587 c 0,0 0,-4.94989 0,-7.05767 0,-6.10576 -4.21556,-7.66279 -6.98967,-7.66279 -2.8421,0 -7.00327,1.55703 -7.00327,7.66279 0,2.02619 0.007,7.03727 0.007,7.03727 0,0 -0.007,4.92268 -0.007,7.02366 0,6.09896 4.16117,7.6968 6.99647,7.6968 2.78091,0 7.00327,-1.59784 7.00327,-7.6968 0,-2.53613 -0.007,-7.00326 -0.007,-7.00326 z m 56.57687,-0.11559 c 0,0 -0.007,5.96977 -0.007,8.36312 0,6.29614 -3.71921,8.89347 -7.29563,8.89347 -3.58323,0 -7.31604,-2.59733 -7.31604,-8.89347 0,-2.39335 0.007,-8.51271 0.007,-8.51271 0,0 0.0136,-5.84058 0.0136,-8.23393 0,-6.26895 3.73961,-8.84588 7.29564,-8.84588 3.56282,0 7.29563,2.57693 7.29563,8.84588 0,2.39335 -0.007,6.81968 0.0136,8.40392 z m -7.17325,-22.12489 c -14.41449,0 -26.09566,9.92697 -26.09566,22.17248 0,12.24552 11.68797,22.17248 26.09566,22.17248 14.41449,0 26.09567,-9.92696 26.09567,-22.17248 0,-12.24551 -11.68118,-22.17248 -26.09567,-22.17248 z m -312.95082,-5.07226 v -12.13673 h 17.89572 v 12.13673 z m 0.0408,47.25505 v -39.49027 l 17.85493,0.007 v 39.48347 z m 89.58062,0 0.007,-39.40868 h -9.70938 v -5.86098 l 9.71618,-0.007 -0.0136,-7.99596 h 17.86853 v 7.98916 h 9.66859 v 5.87458 h -9.66859 l 0.0136,39.40868 z m -162.244609,0 0.0068,-59.37818 h 18.500859 l 25.59252,41.40766 -0.0136,-41.40766 h 18.35808 v 59.37818 h -18.33089 l -25.7285,-41.40767 v 41.40767 z"
style="fill:#ffffff;stroke-width:1"
id="path29" />
</g>
<style
type="text/css"
id="style7">.logo{fill:#939598}</style>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>NordVPN</title><path d="M2.2838 21.5414A11.9866 11.9866 0 010 14.4832C0 7.8418 5.3727 2.4586 12 2.4586c6.6279 0 12 5.3832 12 12.0246a11.9853 11.9853 0 01-2.2838 7.0582l-5.7636-9.3783-.5565.9419.5645 2.6186L12 8.9338l-2.45 4.1447.5707 2.6451-2.0764-3.5555-5.7605 9.3733z"/></svg>

After

Width:  |  Height:  |  Size: 356 B

View File

Before

Width:  |  Height:  |  Size: 902 B

After

Width:  |  Height:  |  Size: 902 B

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="600px" height="600px" viewBox="0 0 600 600" version="1.1" xmlns="http://www.w3.org/2000/svg">
<g id="layer1" stroke="none" stroke-width="1">
<ellipse style="fill: rgb(36, 157, 241); fill-rule: evenodd; stroke: rgb(255, 255, 255); stroke-width: 0;" transform="matrix(-0.674571, 0.73821, -0.73821, -0.674571, 556.833239, 241.613465)" cx="216.308" cy="152.076" rx="296.855" ry="296.855"/>
<path d="M 280.949 172.514 L 355.429 162.714 L 282.909 326.374 L 282.909 326.374 C 295.649 325.394 308.142 321.067 320.389 313.394 L 320.389 313.394 L 320.389 313.394 C 332.642 305.714 343.916 296.077 354.209 284.484 L 354.209 284.484 L 354.209 284.484 C 364.496 272.884 373.396 259.981 380.909 245.774 L 380.909 245.774 L 380.909 245.774 C 388.422 231.561 393.812 217.594 397.079 203.874 L 397.079 203.874 L 397.079 203.874 C 399.039 195.381 399.939 187.214 399.779 179.374 L 399.779 179.374 L 399.779 179.374 C 399.612 171.534 397.569 164.674 393.649 158.794 L 393.649 158.794 L 393.649 158.794 C 389.729 152.914 383.766 148.177 375.759 144.584 L 375.759 144.584 L 375.759 144.584 C 367.759 140.991 356.899 139.194 343.179 139.194 L 343.179 139.194 L 343.179 139.194 C 327.172 139.194 311.409 141.807 295.889 147.034 L 295.889 147.034 L 295.889 147.034 C 280.376 152.261 266.002 159.857 252.769 169.824 L 252.769 169.824 L 252.769 169.824 C 239.542 179.784 228.029 192.197 218.229 207.064 L 218.229 207.064 L 218.229 207.064 C 208.429 221.924 201.406 238.827 197.159 257.774 L 197.159 257.774 L 197.159 257.774 C 195.526 263.981 194.546 268.961 194.219 272.714 L 194.219 272.714 L 194.219 272.714 C 193.892 276.474 193.812 279.577 193.979 282.024 L 193.979 282.024 L 193.979 282.024 C 194.139 284.477 194.462 286.357 194.949 287.664 L 194.949 287.664 L 194.949 287.664 C 195.442 288.971 195.852 290.277 196.179 291.584 L 196.179 291.584 L 196.179 291.584 C 179.519 291.584 167.349 288.234 159.669 281.534 L 159.669 281.534 L 159.669 281.534 C 151.996 274.841 150.119 263.164 154.039 246.504 L 154.039 246.504 L 154.039 246.504 C 157.959 229.191 166.862 212.694 180.749 197.014 L 180.749 197.014 L 180.749 197.014 C 194.629 181.334 211.122 167.531 230.229 155.604 L 230.229 155.604 L 230.229 155.604 C 249.342 143.684 270.249 134.214 292.949 127.194 L 292.949 127.194 L 292.949 127.194 C 315.656 120.167 337.789 116.654 359.349 116.654 L 359.349 116.654 L 359.349 116.654 C 378.296 116.654 394.219 119.347 407.119 124.734 L 407.119 124.734 L 407.119 124.734 C 420.026 130.127 430.072 137.234 437.259 146.054 L 437.259 146.054 L 437.259 146.054 C 444.446 154.874 448.936 165.164 450.729 176.924 L 450.729 176.924 L 450.729 176.924 C 452.529 188.684 451.959 200.934 449.019 213.674 L 449.019 213.674 L 449.019 213.674 C 445.426 229.027 438.646 244.464 428.679 259.984 L 428.679 259.984 L 428.679 259.984 C 418.719 275.497 406.226 289.544 391.199 302.124 L 391.199 302.124 L 391.199 302.124 C 376.172 314.697 358.939 324.904 339.499 332.744 L 339.499 332.744 L 339.499 332.744 C 320.066 340.584 299.406 344.504 277.519 344.504 L 277.519 344.504 L 275.069 344.504 L 212.839 484.154 L 142.279 484.154 L 280.949 172.514 Z" transform="matrix(1, 0, 0, 1, 0, 0)" style="fill: rgb(255, 255, 255); fill-rule: nonzero; white-space: pre;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="990.35431" height="207.28346" id="svg2">
<defs id="defs4"/>
<g transform="translate(116.92129,-338.61963)" id="layer1">
<g transform="translate(35.40372,35.392161)" id="g31225">
<path d="M -28.795615,415.09001 C -28.795615,415.09001 -59.115451,384.77025 -59.125465,384.77025 C -60.927824,382.91774 -63.370971,381.90646 -66.024482,381.90646 L -116.92129,381.90646 L -116.92129,401.27187 L -61.19811,401.27187 C -56.952604,401.27187 -52.957357,402.92402 -49.953371,405.92801 C -46.949465,408.93191 -45.297309,412.91715 -45.297309,417.17275 L -45.297309,472.88583 L -25.941913,472.88583 L -25.941913,421.98902 C -25.941913,419.34561 -26.953202,416.89237 -28.795615,415.09001" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path38"/>
<path d="M 25.195234,381.90646 C 22.551768,381.90646 20.09856,382.91774 18.296201,384.77025 L -12.023635,415.09001 C -13.866049,416.89237 -14.877338,419.34561 -14.877338,421.98902 L -14.877338,472.88583 L 4.4780586,472.88583 L 4.4780586,417.17275 C 4.4780586,408.40119 11.607388,401.27187 20.378939,401.27187 L 76.09204,401.27187 L 76.09204,381.90646 L 25.195234,381.90646" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path42"/>
<path d="M 209.20675,379.69354 C 199.83445,379.69354 190.17176,386.31226 185.7059,395.80471 L 185.5557,396.11513 L 184.29404,396.11513 L 184.29404,381.90646 L 169.60477,381.90646 L 169.60477,472.88583 L 185.36545,472.88583 L 185.36545,431.53162 C 185.36545,408.36114 195.43867,393.39152 211.00911,393.39152 C 214.37352,393.39152 217.30737,393.91222 219.85071,394.8434 L 219.85071,380.85511 C 216.47628,380.17419 213.99302,379.69354 209.20675,379.69354" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path46"/>
<path d="M 694.79406,388.47511 C 688.87629,382.54732 679.95458,379.67351 667.50825,379.67351 C 657.2648,379.67351 647.27168,382.50727 637.79925,388.04452 L 638.61032,401.2218 C 645.55944,395.64449 655.47244,392.18997 664.8047,392.18997 C 672.78517,392.18997 678.48265,394.01236 682.23757,397.76728 C 686.21279,401.73249 688.06522,407.81047 688.06522,416.88235 L 688.06522,417.47315 L 687.48446,417.4331 C 680.77566,417.07261 676.03944,417.07261 669.49085,417.08262 C 658.30617,417.07261 643.26643,420.16664 634.56501,428.86809 C 629.74868,433.68437 627.30548,439.74233 627.30548,446.85171 C 627.30548,455.20262 629.70863,461.83135 634.44485,466.57761 C 640.04219,472.16493 649.04401,475.11877 660.47902,475.11877 C 676.93061,475.11877 685.55192,465.50616 688.49579,461.37073 L 688.656,461.14041 L 689.85757,461.14041 L 689.85757,472.8658 L 703.82591,472.8658 L 703.82591,417.17275 C 703.82591,403.93539 700.88205,394.55301 694.79406,388.47511 z M 688.06522,428.93819 L 688.06522,437.61954 C 688.06522,444.83907 685.75219,450.99717 681.39648,455.43293 C 676.7704,460.12912 670.04157,462.60239 661.92091,462.61241 C 656.97442,462.61241 651.83768,460.53968 648.5033,457.21526 C 645.72966,454.43165 644.24772,450.88702 644.24772,446.95185 C 644.24772,430.37005 666.9375,428.5777 676.70031,428.5777 C 678.51268,428.5777 680.35511,428.66782 682.12743,428.75795 C 683.89976,428.84807 685.72215,428.93819 687.5145,428.93819 L 688.06522,428.93819" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path50"/>
<path d="M 285.2165,388.47511 C 279.28873,382.54732 270.36701,379.67351 257.92068,379.67351 C 247.67724,379.67351 237.68412,382.50727 228.21168,388.04452 L 229.02275,401.2218 C 235.97188,395.64449 245.88488,392.18997 255.21713,392.18997 C 263.1976,392.18997 268.9051,394.01236 272.65001,397.76728 C 276.62523,401.73249 278.47766,407.81047 278.47766,416.88235 L 278.47766,417.47315 L 277.8969,417.4331 C 271.1981,417.07261 266.46189,417.07261 259.90328,417.08262 C 248.72861,417.07261 233.67886,420.16664 224.98746,428.86809 C 220.16112,433.68437 217.71791,439.74233 217.71791,446.85171 C 217.71791,455.20262 220.12107,461.83135 224.86729,466.57761 C 230.45463,472.16493 239.45645,475.11877 250.89145,475.11877 C 267.34305,475.11877 275.96436,465.50616 278.90823,461.37073 L 279.07845,461.14041 L 280.27001,461.14041 L 280.27001,472.8658 L 294.24836,472.8658 L 294.24836,417.17275 C 294.24836,403.93539 291.28447,394.55301 285.2165,388.47511 z M 278.47766,428.93819 L 278.47766,437.61954 C 278.47766,444.83907 276.16463,450.99717 271.80891,455.43293 C 267.19285,460.12912 260.454,462.60239 252.33335,462.61241 C 247.38685,462.61241 242.25011,460.53968 238.92575,457.21526 C 236.1421,454.43165 234.67016,450.88702 234.67016,446.95185 C 234.67016,430.37005 257.35994,428.5777 267.11274,428.5777 C 268.92512,428.5777 270.76754,428.66782 272.54988,428.75795 C 274.31219,428.84807 276.13459,428.93819 277.92694,428.93819 L 278.47766,428.93819" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path54"/>
<path d="M 379.59037,388.13464 C 373.973,382.51728 365.87236,379.67351 355.50876,379.67351 C 342.50169,379.67351 330.55601,386.25218 325.79976,396.05504 L 325.64957,396.37548 L 324.38792,396.37548 L 324.38792,381.92648 L 309.16794,381.92648 L 309.16794,472.88583 L 324.93864,472.88583 L 324.93864,430.84068 C 324.93864,419.03519 327.24166,409.67292 331.78763,403.02416 C 336.70408,395.83475 344.02369,392.18997 353.54618,392.18997 C 367.97512,393.0811 373.6025,402.4634 373.6025,425.67393 L 373.6025,472.88583 L 389.37321,472.88583 L 389.37321,418.61462 C 389.37321,404.87658 386.07888,394.62311 379.59037,388.13464" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path58"/>
<path d="M 533.222,420.44702 C 524.52058,416.4718 516.29979,412.72689 516.29979,403.99547 C 516.29979,396.81599 522.87843,392.18997 533.06179,392.18997 C 536.77666,392.18997 546.07887,394.27271 550.45461,396.5957 L 551.76634,383.16808 C 544.79719,381.06532 538.58904,379.67351 531.25943,379.67351 C 520.74563,379.67351 512.20441,382.65747 506.56701,388.29486 C 501.78074,393.0811 499.35755,399.51957 499.35755,407.43997 C 499.35755,421.45839 511.46344,427.37616 522.14746,432.60299 C 530.91898,436.87862 539.18983,440.93395 539.18983,448.81429 C 539.18983,452.37896 538.01829,455.36283 535.70526,457.67588 C 531.25943,462.12174 524.18013,462.60239 521.35643,462.60239 C 516.85052,462.60239 507.67848,460.66986 500.73937,456.45431 L 499.91829,470.32252 C 508.10904,474.55809 517.39122,475.11877 524.59067,475.11877 C 533.09183,475.11877 540.86203,472.70559 546.44936,468.29986 C 552.78767,463.30326 556.14208,455.94362 556.14208,446.9919 C 556.14208,430.90077 543.9661,425.3535 533.222,420.44702" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path62"/>
<path d="M 611.11423,462.61241 C 607.20911,462.61241 603.6244,461.16044 601.01097,458.55708 C 597.92692,455.47298 596.3048,450.97714 596.3048,445.55997 L 596.3048,394.42292 L 620.66677,394.42292 L 620.66677,381.90646 L 596.3048,381.90646 L 596.3048,355.4017 L 580.52408,360.46832 L 580.52408,381.90646 L 559.76684,381.90646 L 559.76684,394.42292 L 580.52408,394.42292 L 580.52408,449.00455 C 580.52408,457.29537 582.747,463.71382 587.13276,468.08958 C 591.78887,472.75565 598.88818,475.11877 608.22043,475.11877 C 613.54742,475.11877 618.79431,473.68691 622.10866,472.74564 L 622.10866,459.71857 C 618.8644,461.61105 615.17957,462.61241 611.11423,462.61241" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path66"/>
<path d="M 786.85488,338.61963 L 786.85488,394.38286 L 785.63328,394.38286 L 785.47307,394.12251 C 779.53527,384.52993 769.44203,379.67351 755.47369,379.67351 C 744.8097,379.67351 735.94807,383.11801 729.14915,389.91698 C 720.8883,398.17784 716.34234,410.88448 716.34234,425.68395 C 716.34234,442.11546 721.31887,456.51439 730.00027,465.18573 C 736.58891,471.78442 745.10008,475.11877 755.29346,475.11877 C 770.87391,475.11877 781.47782,467.46874 786.20403,460.29936 L 786.36424,460.04902 L 787.56581,460.04902 L 787.56581,472.8658 L 802.62558,472.8658 L 802.62558,338.61963 L 786.85488,338.61963 z M 786.85488,427.57643 C 786.85488,438.71102 783.04989,449.15475 776.67152,455.53306 C 771.98537,460.22926 766.12768,462.61241 759.25866,462.61241 C 753.08055,462.61241 747.71351,460.3294 743.32775,455.83347 C 735.5876,447.89304 733.08431,435.35664 733.28457,427.04571 C 733.03424,415.32032 736.34859,405.06684 742.36649,398.90875 C 746.73222,394.45296 752.35961,392.18997 759.07843,392.18997 C 766.01753,392.18997 771.95533,394.60308 776.71157,399.35936 C 783.16003,405.80784 786.85488,416.09128 786.85488,427.57643" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path70"/>
<path d="M 472.51232,338.61963 L 472.51232,394.38286 L 471.29072,394.38286 L 471.13051,394.12251 C 465.1827,384.52993 455.08945,379.67351 441.13114,379.67351 C 430.45712,379.67351 421.5955,383.11801 414.80658,389.91698 C 406.54575,398.17784 401.98976,410.88448 401.98976,425.68395 C 401.98976,442.11546 406.97631,456.51439 415.64769,465.18573 C 422.23633,471.78442 430.74751,475.11877 440.95089,475.11877 C 456.52134,475.11877 467.12525,467.46874 471.85145,460.29936 L 472.01166,460.04902 L 473.22325,460.04902 L 473.22325,472.8658 L 488.27301,472.8658 L 488.27301,338.61963 L 472.51232,338.61963 z M 472.51232,427.57643 C 472.51232,438.71102 468.69731,449.15475 462.32896,455.53306 C 457.63279,460.22926 451.7751,462.61241 444.9161,462.61241 C 438.72798,462.61241 433.37095,460.3294 428.9852,455.83347 C 421.24503,447.89304 418.73173,435.35664 418.94201,427.04571 C 418.69168,415.32032 421.99602,405.06684 428.02393,398.90875 C 432.38966,394.45296 438.00704,392.18997 444.73587,392.18997 C 451.67497,392.18997 457.60275,394.60308 462.359,399.35936 C 468.80746,405.80784 472.51232,416.09128 472.51232,427.57643" style="fill:#007cc5;fill-rule:nonzero;stroke:none" id="path74"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -0,0 +1 @@
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 720 720" xml:space="preserve"><style>.st0{fill:#1d4ed8}</style><path class="st0" d="M402.8 425H705v259.9H402.8z"/><circle vector-effect="non-scaling-stroke" class="st0" cx="553.9" cy="429.9" r="151.1"/><circle vector-effect="non-scaling-stroke" class="st0" cx="553.9" cy="144.8" r="109.7"/><path d="M174.2 180.3H383v140.6c0 87.8-71.3 159.2-159.2 159.2h-49.7C86.3 480 15 412.9 15 330.2c0-82.8 71.3-149.9 159.2-149.9m-66.7 92v28.9c2.5-2.9 4.9-5.1 7.2-6.8 2.4-1.7 5-2.9 7.8-3.7 2.9-.8 5.9-1.3 9.2-1.3 5 0 9.3 1 13.2 3.1 3.8 2.1 6.8 5.1 9 9.1 1.4 2.3 2.3 4.9 2.8 7.8s.7 6.2.7 10v37.3c0 3.9-.9 6.9-2.7 8.9s-4.2 3-7.1 3c-6.4 0-9.6-4-9.6-11.9v-32.9c0-6.2-.9-11-2.8-14.4s-5.4-5-10.6-5c-3.5 0-6.6 1-9.4 3s-4.9 4.7-6.2 8.1c-1 2.9-1.6 8.1-1.6 15.5v25.8c0 3.9-.9 6.8-2.6 8.8s-4.2 3-7.2 3c-6.4 0-9.6-4-9.6-11.9v-84.5c0-4 .8-6.9 2.5-8.9s4.1-3 7.1-3q4.65 0 7.2 3 2.7 3.15 2.7 9m85.5 50.4h35.3q-.75-10.05-5.4-15c-3.1-3.3-7.2-5-12.3-5-4.9 0-8.8 1.7-12 5-3 3.5-4.9 8.5-5.6 15m84.8 48.4 1.8-4.4-24-60.4c-1.5-3.5-2.2-6-2.2-7.6 0-1.7.4-3.2 1.3-4.6s2-2.6 3.5-3.4c1.5-.9 3.1-1.3 4.7-1.3 2.8 0 4.9.9 6.4 2.7 1.4 1.8 2.7 4.3 3.8 7.7l16.5 48 15.6-44.6c1.2-3.6 2.4-6.4 3.4-8.5 1-2 2.1-3.4 3.2-4.1s2.7-1.1 4.7-1.1q2.25 0 4.2 1.2c1.4.8 2.4 1.8 3.1 3.2.7 1.3 1.1 2.7 1.1 4.2q-.3 1.35-.9 3.9c-.4 1.7-1 3.4-1.6 5.1L297 373.4c-2.2 5.9-4.3 10.4-6.4 13.8-2.1 3.3-4.9 5.9-8.3 7.7-3.5 1.8-8.1 2.7-14 2.7-5.7 0-10-.6-12.8-1.9-2.9-1.2-4.3-3.5-4.3-6.8 0-2.2.7-4 2-5.2q2.1-1.8 6-1.8c1 0 2.1.1 3.1.4 1.2.3 2.3.4 3.2.4 2.2 0 4-.3 5.3-1s2.4-1.8 3.5-3.5c1-1.5 2.2-3.9 3.5-7.1m-46.7-37.3H193q0 6.6 2.7 11.7c1.7 3.4 4 5.9 6.9 7.6s6.1 2.6 9.5 2.6c2.3 0 4.5-.3 6.4-.8s3.8-1.4 5.6-2.6 3.5-2.4 5-3.7 3.5-3.1 5.9-5.4c1-.9 2.4-1.3 4.3-1.3 2 0 3.6.5 4.9 1.6 1.2 1.1 1.9 2.6 1.9 4.6 0 1.8-.7 3.8-2.1 6.2s-3.5 4.6-6.2 6.8q-4.2 3.3-10.5 5.4c-4.2 1.4-9.1 2.1-14.5 2.1-12.5 0-22.3-3.6-29.2-10.7s-10.4-16.8-10.4-29.1c0-5.8.9-11.1 2.6-16s4.2-9.1 7.5-12.7c3.3-3.5 7.3-6.2 12.1-8.1s10.1-2.8 16-2.8c7.6 0 14.1 1.6 19.6 4.8 5.4 3.2 9.5 7.4 12.2 12.5s4.1 10.3 4.1 15.6c0 4.9-1.4 8.1-4.2 9.5-2.9 1.5-6.9 2.2-12 2.2" style="fill-rule:evenodd;clip-rule:evenodd;fill:#1d4ed8"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,22 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="logosandtypes_com" data-name="logosandtypes com" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 150 150">
<defs>
<style>
.cls-1 {
fill: none;
}
.cls-2 {
fill: #005ed9;
}
</style>
</defs>
<g id="Layer_3" data-name="Layer 3">
<g id="Layer_3-2" data-name="Layer 3">
<g id="Layer_2" data-name="Layer 2">
<path id="Layer_3-3" data-name="Layer 3" class="cls-1" d="M0,0H150V150H0V0Z"/>
</g>
</g>
</g>
<path class="cls-2" d="M133.15,14.8h-7.69v7.69h7.69v-7.69Zm-26.9,53.84v-15.4h0s15.37,0,15.37,0v15.38h15.37c.26,14.25-.82,26.68-8.06,39.12-20.96,36.88-72.74,41.85-100.21,9.49h0c-6.41-7.45-11.02-16.51-13.18-26.18-1.1-5.25-1.58-11.92-1.58-17.55V15.76h30.75l.06,58.57c.15,7.58,1.52,15.37,6.05,21.31,13.04,17.66,40.64,16.06,51.33-3.18,3.84-6.42,4.19-16.61,4.09-23.82h0Zm3.84-42.31h11.53v11.53h15.38v15.38h-15.38v-15.37h-11.53v-11.53Z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg xmlns="http://www.w3.org/2000/svg"
aria-label="Ubiquiti" role="img"
viewBox="0 0 512 512"><rect
width="512" height="512"
rx="15"
fill="#399cdb"/><path d="M112 94v18h18V94h-18zm288 0c-82 0-90 31-90 61v172a147 147 0 01-3 28c43-9 72-36 86-82l7-23V94zm-234 18v18h18v-18h-18zm-18 18v18h18v-18h-18zm36 9v18h18v-18h-18zm-72 4v147c0 73 53 128 144 128 0 0-54-30-54-91V197h-18v66h-18v-39h-18v17h-18v-98h-18zm54 18v18h18v-18h-18zm-18 27v18h18v-18h-18zm252 87c-19 64-65 92-131 89-24-1-43-7-57-16 10 42 46 63 48 64l10 6c82-5 130-59 130-128v-15z" fill="#ffffff"/></svg>

Before

Width:  |  Height:  |  Size: 968 B

After

Width:  |  Height:  |  Size: 679 B

View File

@@ -1,5 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96">
<g style="mix-blend-mode:difference">
<path fill="white" fill-rule="evenodd" d="M47.77,1A47,47,0,1,1,1,48.23V48A46.87,46.87,0,0,1,47.71,1Zm0,9a38.12,38.12,0,0,1,19.13,71A82.23,82.23,0,0,0,69.84,54.5c2.44.69,3.82,1.08,6.27,1.87A128.54,128.54,0,0,0,66.2,36.09,81.28,81.28,0,0,1,53.06,54.25l7.84-.49c-6.75,12.12-16.27,18-28.33,19.71-2.75-13.71-.69-36,14.7-46.48l1.56,7.48c3-4.83,8.93-11.22,13.34-15.67a41.77,41.77,0,0,0-22.83-2.15c1.27,1.09,2.84,2.47,4.11,3.55C26.1,27.57,16.57,39.68,10.3,53.76A38.3,38.3,0,0,1,47.77,9.94Z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 634 B

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:#df1b1a"/>
<path d="M512 256c-141 0-255.7 114.2-255.7 255.7C256.3 653.3 370.5 768 512 768s255.7-115.3 255.7-256.3S653.5 256 512 256zm104.5 435.3c12.9-45 18.2-91.1 16.1-144.2 13.4 3.8 20.9 5.9 34.3 10.2-15.5-39.1-32.2-74.5-54.2-110.4-19.3 37-45.6 71.8-71.8 99.2l42.9-2.7c-37 65.9-89 98.1-154.9 107.2-15-74.5-3.8-196.2 80.4-253.1l8.6 40.7c16.6-26.3 48.8-61.1 72.9-85.2-38.1-15-82-19.8-124.9-11.8 7 5.9 15.5 13.4 22.5 19.3-94.9 40.2-146.9 106.2-181.2 182.8-1.6-10.2-2.1-20.9-2.1-31.1 0-114.7 92.8-207.5 207-207.5 114.7 0 207.5 92.8 207.5 207.5-.1 76.2-41.4 143.2-103.1 179.1z" style="fill:#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 865 B

View File

@@ -0,0 +1 @@
<svg data-name="Layer 1" viewBox="0 0 100 100" width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M36.907 4.866s-.886 17.406 2.163 25.78c-4.782 4.193-10.152 8.97-10.992 10.12-1.383 1.896-.351 10.035-5.008 13.495-2.347 1.742-7.423 5.036-11.881 7.875-4.395 2.798-8.19 5.152-8.19 5.152s1.472 1.471 3.786 3.432c3.927 3.327 10.273 8.063 15.937 9.408 2.482.589 5.448.303 8.553-.315a73 73 0 0 0 3.092-.693c6.223-1.522 12.542-3.63 16.312-2.143a4.9 4.9 0 0 1 1.662 1.063c1.966 1.935 3.105 3.853 3.76 5.494.219.547.382 1.063.506 1.54.248.95.332 1.74.354 2.292a6 6 0 0 1-.018.867s.319-.53.797-1.414c1.434-2.652 4.304-8.49 4.316-12.775 0 0 .186.098.504.299s.768.502 1.295.912c1.318 1.024 3.117 2.716 4.543 5.146a16.7 16.7 0 0 1 1.979 5.186c.535 2.672.503 5.843-.534 9.549 0 0 .228-.22.62-.627 2.738-2.857 13.431-15.019 9.24-26.795 0 0 2.258 1.105 4.638 2.925.595.456 1.197.954 1.774 1.493 1.441 1.347 2.723 2.937 3.318 4.674q.18.52.27 1.058s1.178-4.477.185-9.732a21 21 0 0 0-.435-1.84c-1.019-3.569-3.157-7.29-7.395-10.09 0 0 .61-.09 1.606-.156s2.38-.108 3.923-.012c.772.048 1.584.13 2.409.262 2.474.394 5.062 1.229 7.004 2.886 0 0-.038-.183-.125-.51-.611-2.284-3.648-11.622-13.131-14.804 0 0 8.243-2.074 12.117-7.633 0 0-3.578-.009-7.402-.763a28 28 0 0 1-2.297-.55c-1.516-.432-2.965-1.009-4.133-1.775l-.012-.031c-.207-.64-3.59-10.958-7.644-16.82a82 82 0 0 0-9.17-10.867s-6.478 9.16-7.971 17.072c0 0-1.614-.505-3.99-.363l.01-.02s-3.634-3.942-8.832-10.092-7.512-7.16-7.512-7.16z" fill="#50474d" stroke="#fff" stroke-width="6" stroke-linecap="round" stroke-linejoin="round" paint-order="stroke fill markers"/><path d="M36.91 4.863s-1.118 21.902 3.455 28.392c4.572 6.49 12.89-11.14 12.89-11.14s-3.633-3.943-8.831-10.092-7.514-7.16-7.514-7.16" fill="#50474d"/><path d="M89.706 77.861c-.962-5.735-10.001-10.15-10.001-10.15 4.79 13.459-9.858 27.42-9.858 27.42 4.148-14.82-7.788-21.09-7.788-21.09-.016 5.712-5.112 14.19-5.112 14.19s.639-5.034-4.603-10.194c-3.797-3.735-12.908.157-21.065 1.772-3.105.617-6.071.905-8.554.316-5.664-1.345-12.009-6.081-15.937-9.409-2.314-1.96-3.786-3.432-3.786-3.432s3.796-2.353 8.19-5.152c4.459-2.839 9.535-6.133 11.882-7.875 4.657-3.46 3.624-11.598 5.007-13.493 1.385-1.897 17.458-15.771 17.458-15.771 5.937-4.396 11.697-2.495 11.697-2.495 1.493-7.912 7.97-17.071 7.97-17.071a82 82 0 0 1 9.17 10.866c4.055 5.862 7.438 16.18 7.645 16.82l.01.032c4.672 3.064 13.833 3.086 13.833 3.086-3.874 5.559-12.117 7.633-12.117 7.633C94.585 47.5 97.002 59.178 97.002 59.178c-5.178-4.42-14.941-2.98-14.941-2.98 11.37 7.511 7.645 21.663 7.645 21.663" fill="#5f5358"/><path d="M32.896 53.522s2.977-5.13 4.849-5.962 8.812-1.69 8.812-1.69-3.436 4.739-5.825 5.297c-2.388.558-7.836 2.355-7.836 2.355" fill="#efe5b6"/><path d="M11.392 67.886c-.287.572-2.023 1.429-2.21 1.58-.184.153-.24-.822-.24-.822l-1.482-.19-.306 1.254-.366 1.008c-2.314-1.96-3.786-3.432-3.786-3.432s3.796-2.353 8.19-5.152c0 0 .489 5.184.2 5.754m78.314 9.975c-.962-5.735-10.001-10.15-10.001-10.15 4.79 13.459-9.858 27.42-9.858 27.42 4.148-14.82-7.788-21.09-7.788-21.09-.016 5.712-5.112 14.19-5.112 14.19s.639-5.034-4.603-10.194c-3.797-3.735-12.908.157-21.065 1.772 0 0 10.42-6.481 18.06-6.289s8.868 4.436 8.868 4.436 2.056-6.791.157-10.31c0 0 7.45-.641 13.206 3.23 0 0-2.3-9.532-7.585-11.71 0 0 8.575-1.607 13.548.622 0 0 .966-5.154-6.411-8.438 0 0 6.675-1.915 12.723-.041 0 0-4.525-7.29-10.312-9.015 0 0 9.039-1.497 11.896-3.51a15.6 15.6 0 0 1-3.398-5.639c4.672 3.064 13.833 3.086 13.833 3.086-3.874 5.559-12.117 7.633-12.117 7.633 10.838 3.637 13.255 15.314 13.255 15.314-5.178-4.42-14.941-2.98-14.941-2.98 11.37 7.511 7.645 21.663 7.645 21.663M66.061 11.993s6.107 8.076 6.856 13.876c.75 5.801-.285 8.9-.285 8.9s-3.086-5.19-8.535-8.297c-5.45-3.107 1.964-14.48 1.964-14.48z" fill="#50474d"/></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 503 B

After

Width:  |  Height:  |  Size: 503 B

View File

@@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

View File

@@ -260,4 +260,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: b4e3a7eabb03395b66e81fc061789f61526ee6bb
COCOAPODS: 1.15.2
COCOAPODS: 1.16.2

View File

@@ -444,6 +444,100 @@
"$(inherited)",
"@executable_path/Frameworks",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-l\"swiftCoreGraphics\"",
"-framework",
"\"AVFoundation\"",
"-framework",
"\"AVKit\"",
"-framework",
"\"DKImagePickerController\"",
"-framework",
"\"DKPhotoGallery\"",
"-framework",
"\"Foundation\"",
"-framework",
"\"ImageIO\"",
"-framework",
"\"LocalAuthentication\"",
"-framework",
"\"MTBBarcodeScanner\"",
"-framework",
"\"OrderedSet\"",
"-framework",
"\"Photos\"",
"-framework",
"\"QuartzCore\"",
"-framework",
"\"SDWebImage\"",
"-framework",
"\"Sentry\"",
"-framework",
"\"SwiftyGif\"",
"-framework",
"\"Toast\"",
"-framework",
"\"UIKit\"",
"-framework",
"\"app_links\"",
"-framework",
"\"connectivity_plus\"",
"-framework",
"\"device_info_plus\"",
"-framework",
"\"file_picker\"",
"-framework",
"\"file_saver\"",
"-framework",
"\"fk_user_agent\"",
"-framework",
"\"flutter_email_sender\"",
"-framework",
"\"flutter_inappwebview_ios\"",
"-framework",
"\"flutter_local_authentication\"",
"-framework",
"\"flutter_local_notifications\"",
"-framework",
"\"flutter_native_splash\"",
"-framework",
"\"flutter_secure_storage\"",
"-framework",
"\"fluttertoast\"",
"-framework",
"\"local_auth_darwin\"",
"-framework",
"\"move_to_background\"",
"-framework",
"\"package_info_plus\"",
"-framework",
"\"path_provider_foundation\"",
"-framework",
"\"privacy_screen\"",
"-framework",
"\"qr_code_scanner\"",
"-framework",
"\"sentry_flutter\"",
"-framework",
"\"share_plus\"",
"-framework",
"\"shared_preferences_foundation\"",
"-framework",
"\"sodium_libs\"",
"-framework",
"\"sqflite\"",
"-framework",
"\"sqlite3\"",
"-framework",
"\"sqlite3_flutter_libs\"",
"-framework",
"\"url_launcher_ios\"",
"-weak_framework",
"\"LinkPresentation\"",
"-weak_framework",
SwiftUI,
);
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -592,6 +686,100 @@
"$(inherited)",
"@executable_path/Frameworks",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-l\"swiftCoreGraphics\"",
"-framework",
"\"AVFoundation\"",
"-framework",
"\"AVKit\"",
"-framework",
"\"DKImagePickerController\"",
"-framework",
"\"DKPhotoGallery\"",
"-framework",
"\"Foundation\"",
"-framework",
"\"ImageIO\"",
"-framework",
"\"LocalAuthentication\"",
"-framework",
"\"MTBBarcodeScanner\"",
"-framework",
"\"OrderedSet\"",
"-framework",
"\"Photos\"",
"-framework",
"\"QuartzCore\"",
"-framework",
"\"SDWebImage\"",
"-framework",
"\"Sentry\"",
"-framework",
"\"SwiftyGif\"",
"-framework",
"\"Toast\"",
"-framework",
"\"UIKit\"",
"-framework",
"\"app_links\"",
"-framework",
"\"connectivity_plus\"",
"-framework",
"\"device_info_plus\"",
"-framework",
"\"file_picker\"",
"-framework",
"\"file_saver\"",
"-framework",
"\"fk_user_agent\"",
"-framework",
"\"flutter_email_sender\"",
"-framework",
"\"flutter_inappwebview_ios\"",
"-framework",
"\"flutter_local_authentication\"",
"-framework",
"\"flutter_local_notifications\"",
"-framework",
"\"flutter_native_splash\"",
"-framework",
"\"flutter_secure_storage\"",
"-framework",
"\"fluttertoast\"",
"-framework",
"\"local_auth_darwin\"",
"-framework",
"\"move_to_background\"",
"-framework",
"\"package_info_plus\"",
"-framework",
"\"path_provider_foundation\"",
"-framework",
"\"privacy_screen\"",
"-framework",
"\"qr_code_scanner\"",
"-framework",
"\"sentry_flutter\"",
"-framework",
"\"share_plus\"",
"-framework",
"\"shared_preferences_foundation\"",
"-framework",
"\"sodium_libs\"",
"-framework",
"\"sqflite\"",
"-framework",
"\"sqlite3\"",
"-framework",
"\"sqlite3_flutter_libs\"",
"-framework",
"\"url_launcher_ios\"",
"-weak_framework",
"\"LinkPresentation\"",
"-weak_framework",
SwiftUI,
);
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

View File

@@ -72,7 +72,7 @@ class _AppState extends State<App>
}
});
locale = widget.locale;
UpdateService.instance.shouldUpdate().then((shouldUpdate) {
UpdateService.instance.showUpdateNotification().then((shouldUpdate) {
if (shouldUpdate) {
Future.delayed(Duration.zero, () {
showDialog(
@@ -112,7 +112,10 @@ class _AppState extends State<App>
@override
Widget build(BuildContext context) {
if (Platform.isAndroid || kDebugMode) {
if (Platform.isAndroid ||
Platform.isWindows ||
Platform.isLinux ||
kDebugMode) {
return AdaptiveTheme(
light: lightThemeData,
dark: darkThemeData,

View File

@@ -328,6 +328,10 @@
}
}
},
"manualSort": "Custom",
"editOrder": "Edit order",
"mostFrequentlyUsed": "Frequently used",
"mostRecentlyUsed": "Recently used",
"activeSessions": "Active sessions",
"somethingWentWrongPleaseTryAgain": "Something went wrong, please try again",
"thisWillLogYouOutOfThisDevice": "This will log you out of this device!",
@@ -449,6 +453,8 @@
"unpinText": "Unpin",
"pinnedCodeMessage": "{code} has been pinned",
"unpinnedCodeMessage": "{code} has been unpinned",
"pinned": "Pinned",
"tags": "Tags",
"createNewTag": "Create New Tag",
"tag": "Tag",

View File

@@ -6,34 +6,51 @@
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "Asegure sus códigos 2FA",
"onBoardingBody": "Realice una copia de seguridad segura de sus códigos 2FA",
"onBoardingGetStarted": "Primeros pasos",
"setupFirstAccount": "Configura tu primera cuenta",
"importScanQrCode": "Escanear un código QR",
"qrCode": "Código QR",
"importEnterSetupKey": "Ingrese una llave de configuración",
"importEnterSetupKey": "Ingrese una clave de configuración",
"importAccountPageTitle": "Ingrese los detalles de la cuenta",
"secretCanNotBeEmpty": "El secreto no puede estar vacío",
"bothIssuerAndAccountCanNotBeEmpty": "El emisor y la cuenta no pueden estar vacíos",
"bothIssuerAndAccountCanNotBeEmpty": "Ni el emisor ni la cuenta pueden estar vacíos",
"incorrectDetails": "Detalles incorrectos",
"pleaseVerifyDetails": "Por favor, confirma los detalles e intentar otra vez",
"pleaseVerifyDetails": "Por favor, confirma los detalles e inténtalo de nuevo",
"codeIssuerHint": "Emisor",
"codeSecretKeyHint": "Llave Secreta",
"codeSecretKeyHint": "Clave secreta",
"secret": "Secreto",
"all": "Todos",
"notes": "Notas",
"notesLengthLimit": "Las notas pueden tener como máximo {count} caracteres",
"@notesLengthLimit": {
"description": "Text to indicate the maximum number of characters allowed for notes",
"placeholders": {
"count": {
"description": "The maximum number of characters allowed for notes",
"type": "int",
"example": "100"
}
}
},
"codeAccountHint": "Cuenta (tu@dominio.com)",
"codeTagHint": "Marcado",
"accountKeyType": "Tipo de llave",
"codeTagHint": "Etiqueta",
"accountKeyType": "Tipo de clave",
"sessionExpired": "La sesión ha expirado",
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
},
"pleaseLoginAgain": "Por favor, vuelva a iniciar sesión",
"pleaseLoginAgain": "Por favor, vuelve a iniciar sesión",
"loggingOut": "Cerrando sesión...",
"timeBasedKeyType": "Basado en el tiempo (TOTP)",
"counterBasedKeyType": "Basado en Contador (HOTP)",
"counterBasedKeyType": "Basado en contador (HOTP)",
"saveAction": "Guardar",
"nextTotpTitle": "siguiente",
"deleteCodeTitle": "¿Eliminar código?",
"deleteCodeMessage": "¿Está seguro que desea eliminar este código? Esta acción es irreversible.",
"deleteCodeMessage": "¿Estás seguro de que quieres eliminar este código? Esta acción es irreversible.",
"trashCode": "¿Enviar código a la papelera?",
"trashCodeMessage": "¿Estás seguro de que quieres enviar el código de la cuenta {account} a la papelera?",
"trash": "Papelera",
"viewLogsAction": "Ver Registros",
"sendLogsDescription": "Esto enviará registros para ayudarnos a depurar su problema. Aunque tomamos precauciones para asegurarnos que no se registre información sensible, le recomendamos que consulte estos registros antes de compartirlos.",
"preparingLogsTitle": "Preparando registros...",
@@ -65,9 +82,9 @@
"merchandise": "Mercancías",
"verifyPassword": "Verificar contraseña",
"pleaseWait": "Por favor, espere...",
"generatingEncryptionKeysTitle": "Generando claves de encriptación...",
"generatingEncryptionKeysTitle": "Generando claves de cifrado...",
"recreatePassword": "Recrear contraseña",
"recreatePasswordMessage": "El dispositivo actual no es lo suficientemente potente para verificar su contraseña, así que necesitamos regenerarlo una vez de una manera que funcione con todos los dispositivos.\n\nPor favor Inicie sesión usando su clave de recuperación y regenere su contraseña (puede volver a utilizar la misma si lo desea).",
"recreatePasswordMessage": "El dispositivo actual no es lo suficientemente potente como para verificar tu contraseña, por lo que debemos regenerarlo una vez de una manera que funcione con todos los dispositivos.\n\nPor favor, inicia sesión con tu clave de recuperación y regenera tu contraseña (puedes volver a usar la misma si lo deseas).",
"useRecoveryKey": "Usar clave de recuperación",
"incorrectPasswordTitle": "Contraseña incorrecta",
"welcomeBack": "¡Te damos la bienvenida otra vez!",
@@ -79,32 +96,33 @@
"data": "Datos",
"importCodes": "Importar códigos",
"importTypePlainText": "Texto sin formato",
"importTypeEnteEncrypted": "Exportación cifrada Ente",
"passwordForDecryptingExport": "Contraseña para descifrar exportación",
"importTypeEnteEncrypted": "Exportación cifrada de Ente",
"passwordForDecryptingExport": "Contraseña para descifrar la exportación",
"passwordEmptyError": "La contraseña no puede estar vacía",
"importFromApp": "Importar códigos de {appName}",
"importGoogleAuthGuide": "Exportar tus cuentas desde Google Authenticator a un código QR usando la opción \"Transferir Cuentas\". A continuación, usando otro dispositivo, escanee el código QR.\n\nConsejo: Puede usar la webcam de su portátil para tomar una foto del código QR.",
"importGoogleAuthGuide": "Exporta tus cuentas desde Google Authenticator a un código QR usando la opción \"Transferir Cuentas\". A continuación, usando otro dispositivo, escanea el código QR.\n\nConsejo: Puedes usar la webcam de tu portátil para tomar una foto del código QR.",
"importSelectJsonFile": "Seleccione el archivo JSON",
"importSelectAppExport": "Seleccione el archivo de exportación de {appName}",
"importEnteEncGuide": "Seleccione el archivo JSON cifrado exportado desde Ente",
"importRaivoGuide": "Utilice la opción \"Exportar códigos a un archivo de Zip\" en la configuración de Raivo.\n\nExtraiga el archivo zip e importe el archivo JSON.",
"importBitwardenGuide": "Use la opción \"Exportar caja fuerte\" dentro del menú Herramientas de Bitwarden e importe el fichero JSON no cifrado.",
"importAegisGuide": "Utilice la opción \"Exportar la bóveda\" en ajustes de Aegis.\n\nSi tu bóveda es cifrada, necesitara entrar contraseña de bóveda para descifrar la bóveda.",
"import2FasGuide": "Use la opción \"Configuración→Copia de seguridad→Exportar\" en 2FAS\n\nSi su copia de seguridad está cifrada, necesitará introducir la contraseña para descifrarla",
"importLastpassGuide": "Utilice la opción \"Transferir cuentas\" en la configuración del autenticador de Lastpass y pulse \"Exportar cuentas al archivo\". Importe el archivo JSON descargado.",
"importRaivoGuide": "Utiliza la opción \"Exportar códigos a un archivo Zip\" en la configuración de Raivo.\n\nExtrae el archivo zip e importa el archivo JSON.",
"importBitwardenGuide": "Usa la opción \"Exportar caja fuerte\" dentro del menú Herramientas de Bitwarden e importe el fichero JSON sin cifrar.",
"importAegisGuide": "Utilice la opción \"Exportar la bóveda\" en ajustes de Aegis.\n\nSi tu bóveda es cifrada, necesitaras introducir la contraseña de la bóveda para descifrarla.",
"import2FasGuide": "Usa la opción \"Configuración→Copia de seguridad→Exportar\" en 2FAS\n\nSi tu copia de seguridad está cifrada, necesitará introducir la contraseña para descifrarla",
"importLastpassGuide": "Utiliza la opción \"Transferir cuentas\" en la configuración del autenticador de Lastpass y pulse \"Exportar cuentas al archivo\". Importe el archivo JSON descargado.",
"exportCodes": "Exportar códigos",
"importLabel": "Importar",
"importInstruction": "Por favor, seleccione un archivo que contenga una lista de sus códigos en el siguiente formato",
"importCodeDelimiterInfo": "Los códigos pueden separarse por una coma o una nueva línea",
"selectFile": "Seleccionar archivo",
"emailVerificationToggle": "Verificación de correo electrónico",
"emailVerificationEnableWarning": "Si estás guardando la autenticación de dos factores en tu correo electrónico con nosotros, activar la verificación de correo electrónico podría resultar en un punto muerto. Si está bloqueado fuera de un servicio, puede que no pueda iniciar sesión en el otro.",
"authToChangeEmailVerificationSetting": "Por favor, autentifíquese para cambiar su correo electrónico",
"authToViewYourRecoveryKey": "Por favor, autentifíquese para ver su clave de recuperación",
"authToChangeYourEmail": "Por favor, autentifíquese para cambiar su correo electrónico",
"authToChangeYourPassword": "Por favor, autentifíquese para cambiar su contraseña",
"authToViewSecrets": "Por favor, autentifíquese para ver sus secretos",
"authToInitiateSignIn": "Por favor, autentifíquese para iniciar la sesión para realizar la copia de seguridad.",
"emailVerificationEnableWarning": "Para evitar quedarte bloqueado fuera de tu cuenta, asegúrate de guardar una copia de su código 2FA de tu correo electrónico fuera de Ente Auth antes de habilitar la verificación de correo electrónico.",
"authToChangeEmailVerificationSetting": "Por favor, autentícate para cambiar tu correo electrónico",
"authenticateGeneric": "Por favor, autentícate",
"authToViewYourRecoveryKey": "Por favor, autentícate para ver tu clave de recuperación",
"authToChangeYourEmail": "Por favor, autentícate para cambiar tu correo electrónico",
"authToChangeYourPassword": "Por favor, autentícate para cambiar tu contraseña",
"authToViewSecrets": "Por favor, autentícate para ver tus secretos",
"authToInitiateSignIn": "Por favor, autentícate para iniciar la sesión para realizar la copia de seguridad.",
"ok": "Ok",
"cancel": "Cancelar",
"yes": "Si",
@@ -114,32 +132,35 @@
"general": "General",
"settings": "Configuración",
"copied": "Copiado",
"pleaseTryAgain": "Por favor, inténtalo nuevamente",
"pleaseTryAgain": "Por favor, inténtalo de nuevo",
"existingUser": "Usuario existente",
"newUser": "Nuevo a Ente",
"newUser": "Nuevo en Ente",
"delete": "Borrar",
"enterYourPasswordHint": "Ingrese su contraseña",
"enterYourPasswordHint": "Introduce tu contraseña",
"forgotPassword": "Olvidé mi contraseña",
"oops": "Ups",
"suggestFeatures": "Sugerir funcionalidades",
"faq": "Preguntas Frecuentes",
"somethingWentWrongMessage": "Algo ha ido mal, por favor, prueba otra vez",
"somethingWentWrongMessage": "Algo ha ido mal, por favor, inténtalo de nuevo",
"leaveFamily": "Dejar plan familiar",
"leaveFamilyMessage": "¿Está seguro de que desea abandonar el plan familiar?",
"leaveFamilyMessage": "¿Estás seguro de que quieres abandonar el plan familiar?",
"inFamilyPlanMessage": "¡Estás en un plan familiar!",
"hintForMobile": "Mantén pulsado un código para editarlo o eliminarlo.",
"hintForDesktop": "Haz clic derecho en un código para editarlo o eliminarlo.",
"scan": "Escanear",
"scanACode": "Escanear un código",
"verify": "Verificar",
"verifyEmail": "Verificar correo electrónico",
"enterCodeHint": "Ingrese el código de seis dígitos de su aplicación de autenticación",
"lostDeviceTitle": "¿Perdió su dispositivo?",
"lostDeviceTitle": "¿Dispositivo perdido?",
"twoFactorAuthTitle": "Autenticación de dos factores",
"passkeyAuthTitle": "Verificación de llave de acceso",
"verifyPasskey": "Verificar llave de acceso",
"passkeyAuthTitle": "Verificación de clave de acceso",
"verifyPasskey": "Verificar clave de acceso",
"loginWithTOTP": "Inicio de sesión con TOTP",
"recoverAccount": "Recuperar cuenta",
"enterRecoveryKeyHint": "Introduzca su clave de recuperación",
"enterRecoveryKeyHint": "Introduce tu clave de recuperación",
"recover": "Recuperar",
"contactSupportViaEmailMessage": "Por favor, envíe un email a {email} desde su dirección de correo electrónico registrada",
"contactSupportViaEmailMessage": "Por favor, envía un email a {email} desde la dirección de correo electrónico que usó durante el registro",
"@contactSupportViaEmailMessage": {
"placeholders": {
"email": {
@@ -148,20 +169,20 @@
}
},
"invalidQRCode": "Código QR no válido",
"noRecoveryKeyTitle": "¿Sin clave de recuperación?",
"noRecoveryKeyTitle": "¿No tienes la clave de recuperación?",
"enterEmailHint": "Introduce tu dirección de correo electrónico",
"invalidEmailTitle": "Dirección de correo electrónico no válida",
"invalidEmailMessage": "Por favor, introduzca una dirección de correo electrónico válida.",
"invalidEmailMessage": "Por favor, introduce una dirección de correo electrónico válida.",
"deleteAccount": "Eliminar cuenta",
"deleteAccountQuery": "Lamentaremos que te vayas. ¿Estás enfrentando algún inconveniente?",
"deleteAccountQuery": "Lamentamos que te vayas. ¿Estás teniendo algún problema?",
"yesSendFeedbackAction": "Sí, enviar comentarios",
"noDeleteAccountAction": "No, eliminar cuenta",
"initiateAccountDeleteTitle": "Por favor, autentifíquese para iniciar la eliminación de la cuenta",
"initiateAccountDeleteTitle": "Por favor, autentícate para iniciar la eliminación de la cuenta",
"sendEmail": "Enviar correo electrónico",
"createNewAccount": "Crear nueva cuenta",
"createNewAccount": "Crear cuenta nueva",
"weakStrength": "Poco segura",
"strongStrength": "Fuerte",
"moderateStrength": "Moderado",
"strongStrength": "Segura",
"moderateStrength": "Moderada",
"confirmPassword": "Confirmar contraseña",
"close": "Cerrar",
"oopsSomethingWentWrong": "Vaya, algo salió mal.",
@@ -170,10 +191,10 @@
"social": "Social",
"security": "Seguridad",
"lockscreen": "Pantalla de bloqueo",
"authToChangeLockscreenSetting": "Por favor autentifíquese para cambiar la configuración de bloqueo de pantalla",
"deviceLockEnablePreSteps": "Para activar el bloqueo de la aplicación, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes del sistema.",
"authToChangeLockscreenSetting": "Por favor autentícate para cambiar la configuración de bloqueo de pantalla",
"deviceLockEnablePreSteps": "Para activar el bloqueo de la aplicación, por favor configura el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de tu sistema.",
"viewActiveSessions": "Ver sesiones activas",
"authToViewYourActiveSessions": "Por favor, autentifíquese para ver sus sesiones activas",
"authToViewYourActiveSessions": "Por favor, autentícate para ver tus sesiones activas",
"searchHint": "Buscar...",
"search": "Buscar",
"sorryUnableToGenCode": "Lo sentimos, no se puede generar un código para {issuerName}",
@@ -182,18 +203,22 @@
"scanAQrCode": "Escanear un código QR",
"enterDetailsManually": "Ingrese los detalles manualmente",
"edit": "Editar",
"share": "Compartir",
"shareCodes": "Compartir código",
"shareCodesDuration": "Selecciona la duración durante la cual deseas compartir el código.",
"restore": "Restaurar",
"copiedToClipboard": "Copiado al portapapeles",
"copiedNextToClipboard": "Copiado el siguiente código al portapapeles",
"error": "Error",
"recoveryKeyCopiedToClipboard": "Llave de recuperación copiada al portapapeles",
"recoveryKeyOnForgotPassword": "Si olvida su contraseña, la única forma de recuperar sus datos es con esta clave.",
"recoveryKeySaveDescription": "Nosotros no almacenamos esta clave, por favor guarde dicha clave de 24 palabras en un lugar seguro.",
"recoveryKeyCopiedToClipboard": "Clave de recuperación copiada al portapapeles",
"recoveryKeyOnForgotPassword": "Si olvidas tu contraseña, la única forma de recuperar tus datos es con esta clave.",
"recoveryKeySaveDescription": "Nosotros no almacenamos esta clave, por favor guarda esta clave de 24 palabras en un lugar seguro.",
"doThisLater": "Hacer esto más tarde",
"saveKey": "Guardar Clave",
"saveKey": "Guardar clave",
"save": "Guardar",
"send": "Enviar",
"saveOrSendDescription": "¿Desea guardar esto en el almacenamiento (carpeta Descargas por defecto) o enviarlo a otras aplicaciones?",
"saveOnlyDescription": "¿Desea guardar esto en el almacenamiento (carpeta Descargas por defecto)?",
"saveOrSendDescription": "¿Desea guardar el archivo en el almacenamiento (carpeta Descargas por defecto) o enviarlo a otras aplicaciones?",
"saveOnlyDescription": "¿Desea guardar el archivo en el almacenamiento (carpeta Descargas por defecto)?",
"back": "Atrás",
"createAccount": "Crear cuenta",
"passwordStrength": "Fortaleza de la contraseña: {passwordStrengthValue}",
@@ -217,11 +242,11 @@
"changePasswordTitle": "Cambiar contraseña",
"resetPasswordTitle": "Restablecer contraseña",
"encryptionKeys": "Claves de cifrado",
"passwordWarning": "No almacenamos esta contraseña, así que si la olvidas, <underline>no podemos descifrar tus datos</underline>",
"passwordWarning": "No almacenamos esta contraseña, así que si la olvidas, <underline>no podremos descifrar tus datos</underline>",
"enterPasswordToEncrypt": "Introduzca una contraseña que podamos usar para cifrar sus datos",
"enterNewPasswordToEncrypt": "Introduzca una nueva contraseña que podamos usar para cifrar sus datos",
"enterNewPasswordToEncrypt": "Introduzca una contraseña nueva que podamos usar para cifrar sus datos",
"passwordChangedSuccessfully": "Contraseña cambiada correctamente",
"generatingEncryptionKeys": "Generando claves de encriptación...",
"generatingEncryptionKeys": "Generando claves de cifrado...",
"continueLabel": "Continuar",
"insecureDevice": "Dispositivo inseguro",
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Lo sentimos, no hemos podido generar claves seguras en este dispositivo.\n\nRegístrate desde un dispositivo diferente.",
@@ -230,31 +255,31 @@
"loginTerms": "Al hacer clic en iniciar sesión, acepto los <u-terms>términos de servicio</u-terms> y <u-policy>la política de privacidad</u-policy>",
"logInLabel": "Iniciar sesión",
"logout": "Cerrar sesión",
"areYouSureYouWantToLogout": "¿Seguro que quiere cerrar la sesión?",
"yesLogout": "Sí, cerrar sesión",
"areYouSureYouWantToLogout": "¿Seguro que quieres cerrar la sesión?",
"yesLogout": "Sí, cerrar la sesión",
"exit": "Salir",
"verifyingRecoveryKey": "Verificando clave de recuperación...",
"recoveryKeyVerified": "Clave de recuperación verificada",
"recoveryKeySuccessBody": "¡Genial! Su clave de recuperación es válida. Gracias por verificar.\n\nPor favor, recuerde mantener su clave de recuperación segura.",
"invalidRecoveryKey": "La clave de recuperación introducida no es válida. Por favor, asegúrese de que contiene 24 palabras y compruebe la ortografía de cada una.\n\nSi ha introducido un código de recuperación antiguo, asegúrese de que tiene 64 caracteres de largo y compruebe cada uno de ellos.",
"invalidRecoveryKey": "La clave de recuperación introducida no es válida. Por favor, asegúrate de que contiene 24 palabras y comprueba la ortografía de cada una.\n\nSi has introducido un código de recuperación antiguo, asegúrate de que tiene 64 caracteres de largo y comprueba cada uno de ellos.",
"recreatePasswordTitle": "Recrear contraseña",
"recreatePasswordBody": "El dispositivo actual no es lo suficientemente potente para verificar su contraseña, pero podemos regenerarla de una manera que funcione con todos los dispositivos.\n\nPor favor inicie sesión usando su clave de recuperación y regenere su contraseña (puede volver a utilizar la misma si lo desea).",
"invalidKey": "Clave inválida",
"recreatePasswordBody": "El dispositivo actual no es lo suficientemente potente para verificar su contraseña, pero podemos regenerarla de manera que funcione con todos los dispositivos.\n\nPor favor inicie sesión usando su clave de recuperación y regenere su contraseña (puede volver a utilizar la misma si lo desea).",
"invalidKey": "Clave no válida",
"tryAgain": "Inténtelo de nuevo",
"viewRecoveryKey": "Ver código de recuperación",
"viewRecoveryKey": "Ver clave de recuperación",
"confirmRecoveryKey": "Confirmar clave de recuperación",
"recoveryKeyVerifyReason": "Su clave de recuperación es la única forma de recuperar sus fotos si olvida su contraseña. Puede encontrar su clave de recuperación en Ajustes > Cuenta.\n\nPor favor, introduzca su clave de recuperación aquí para verificar que la ha guardado correctamente.",
"confirmYourRecoveryKey": "Confirmar su clave de recuperación",
"recoveryKeyVerifyReason": "Tu clave de recuperación es la única forma de recuperar tus fotos si olvidas tu contraseña. Puedes encontrar tu clave de recuperación en Ajustes > Cuenta.\n\nPor favor, introduce tu clave de recuperación aquí para verificar que la has guardado correctamente.",
"confirmYourRecoveryKey": "Confirmar tu clave de recuperación",
"confirm": "Confirmar",
"emailYourLogs": "Envíe sus registros por correo electrónico",
"pleaseSendTheLogsTo": "Por favor, envíe los registros a {toEmail}",
"copyEmailAddress": "Copiar dirección de correo electrónico",
"exportLogs": "Exportar registros",
"enterYourRecoveryKey": "Introduzca su clave de recuperación",
"tempErrorContactSupportIfPersists": "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte.",
"enterYourRecoveryKey": "Introduce tu clave de recuperación",
"tempErrorContactSupportIfPersists": "Parece que algo salió mal. Por favor, vuelve a intentarlo pasado un tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte.",
"networkHostLookUpErr": "No se puede conectar a Ente. Por favor, comprueba tu configuración de red y ponte en contacto con el soporte técnico si el error persiste.",
"networkConnectionRefusedErr": "No se puede conectar a Ente. Por favor, vuelve a intentarlo pasado un tiempo. Si el error persiste, ponte en contacto con el soporte técnico.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Parece que algo salió mal. Por favor, vuelve a intentarlo pasado un tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte.",
"about": "Acerca de",
"weAreOpenSource": "¡Somos de código abierto!",
"privacy": "Privacidad",
@@ -266,14 +291,14 @@
"updateAvailable": "Actualización disponible",
"update": "Actualizar",
"checking": "Comprobando...",
"youAreOnTheLatestVersion": "Está usando la versión más reciente",
"youAreOnTheLatestVersion": "Estás usando la versión más reciente",
"warning": "Atención",
"exportWarningDesc": "El archivo exportado contiene información confidencial. Por favor, guárdelo de forma segura.",
"iUnderStand": "Entiendo",
"exportWarningDesc": "El archivo exportado contiene información confidencial. Por favor, guárdalo de forma segura.",
"iUnderStand": "Lo entiendo",
"@iUnderStand": {
"description": "Text for the button to confirm the user understands the warning"
},
"authToExportCodes": "Por favor, autentifíquese para exportar sus códigos",
"authToExportCodes": "Por favor, autentícate para exportar tus códigos",
"importSuccessTitle": "¡Hurra!",
"importSuccessDesc": "¡Has importado {count} códigos!",
"@importSuccessDesc": {
@@ -288,7 +313,7 @@
"sorry": "Lo sentimos",
"importFailureDesc": "No se pudo analizar el archivo seleccionado.\n¡Por favor escriba a support@ente.io si necesita ayuda!",
"pendingSyncs": "Atención",
"pendingSyncsWarningBody": "Algunos de sus códigos no han sido respaldados.\n\nPor favor, asegúrese de tener una copia de seguridad de estos códigos antes de cerrar la sesión.",
"pendingSyncsWarningBody": "Algunos de tus códigos no tienen copia de seguridad.\n\nPor favor, asegúrate de tener una copia de seguridad de estos códigos antes de cerrar la sesión.",
"checkInboxAndSpamFolder": "Por favor revisa tu bandeja de entrada (y spam) para completar la verificación",
"tapToEnterCode": "Toca para introducir el código",
"resendEmail": "Reenviar correo electrónico",
@@ -304,18 +329,18 @@
}
},
"activeSessions": "Sesiones activas",
"somethingWentWrongPleaseTryAgain": "Algo ha ido mal, por favor, prueba otra vez",
"somethingWentWrongPleaseTryAgain": "Algo ha ido mal, por favor, inténtelo de nuevo",
"thisWillLogYouOutOfThisDevice": "¡Esto cerrará la sesión de este dispositivo!",
"thisWillLogYouOutOfTheFollowingDevice": "Esto cerrará la sesión del siguiente dispositivo:",
"terminateSession": "¿Terminar sesión?",
"terminate": "Terminar",
"thisDevice": "Este dispositivo",
"toResetVerifyEmail": "Para restablecer su contraseña, por favor verifique su correo electrónico primero.",
"toResetVerifyEmail": "Para restablecer tu contraseña, por favor verifica tu correo electrónico primero.",
"thisEmailIsAlreadyInUse": "Este correo electrónico ya está en uso",
"verificationFailedPleaseTryAgain": "Verificación fallida, por favor inténtalo de nuevo",
"yourVerificationCodeHasExpired": "Tu código de verificación ha expirado",
"incorrectCode": "Código incorrecto",
"sorryTheCodeYouveEnteredIsIncorrect": "Lo sentimos, el código que ha introducido es incorrecto",
"sorryTheCodeYouveEnteredIsIncorrect": "Lo sentimos, el código que has introducido es incorrecto",
"emailChangedTo": "Correo electrónico cambiado a {newEmail}",
"authenticationFailedPleaseTryAgain": "Error de autenticación, por favor inténtalo de nuevo",
"authenticationSuccessful": "¡Autenticación exitosa!",
@@ -330,30 +355,31 @@
"passwordToEncryptExport": "Contraseña para cifrar la exportación",
"export": "Exportar",
"useOffline": "Usar sin copias de seguridad",
"signInToBackup": "Inicia sesión para hacer copia de tus códigos",
"signInToBackup": "Inicia sesión para hacer una copia de seguridad tus códigos",
"singIn": "Iniciar sesión",
"sigInBackupReminder": "Por favor, exporte sus códigos para asegurarse de que tiene una copia de seguridad de la que puede restaurar.",
"offlineModeWarning": "Ha elegido proceder sin copia de seguridad. Por favor, tome copias de seguridad manuales para asegurarse de que sus códigos están seguros.",
"sigInBackupReminder": "Por favor, exporta tus códigos para asegurarte de que tienes una copia de seguridad de la que puedas restaurarlos.",
"offlineModeWarning": "Ha elegido proceder sin copia de seguridad. Por favor, realice copias de seguridad manuales para asegurarse de que sus códigos están seguros.",
"showLargeIcons": "Mostrar iconos grandes",
"compactMode": "Modo compacto",
"shouldHideCode": "Ocultar códigos",
"doubleTapToViewHiddenCode": "Puedes tocar dos veces en una entrada para ver el código",
"focusOnSearchBar": "Enfocar búsqueda al iniciar la aplicación",
"confirmUpdatingkey": "¿Estás seguro de que deseas actualizar la clave secreto?",
"confirmUpdatingkey": "¿Estás seguro de que deseas actualizar la clave secreta?",
"minimizeAppOnCopy": "Minimizar aplicación al copiar",
"editCodeAuthMessage": "Autenticar para editar código",
"deleteCodeAuthMessage": "Autenticar para borrar código",
"showQRAuthMessage": "Autenticar para mostrar código QR",
"confirmAccountDeleteTitle": "Confirmar eliminación de la cuenta",
"confirmAccountDeleteMessage": "Esta cuenta está vinculada a otras aplicaciones de Ente, si utilizas alguna. Se programará la eliminación de los datos cargados en todas las aplicaciones de Ente, y tu cuenta se eliminará permanentemente.",
"confirmAccountDeleteMessage": "Esta cuenta está vinculada a otras aplicaciones de Ente, si utilizas alguna. \n\nSe programará la eliminación de los datos cargados en todas las aplicaciones de Ente, y tu cuenta se eliminará permanentemente.",
"androidBiometricHint": "Verificar identidad",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
},
"androidBiometricNotRecognized": "No reconocido. Inténtelo de nuevo.",
"androidBiometricNotRecognized": "No reconocido. Inténtalo de nuevo.",
"@androidBiometricNotRecognized": {
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
},
"androidBiometricSuccess": "Realizado correctamente",
"androidBiometricSuccess": "Autenticación exitosa",
"@androidBiometricSuccess": {
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
},
@@ -361,11 +387,11 @@
"@androidCancelButton": {
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
},
"androidSignInTitle": "Se requiere autenticación",
"androidSignInTitle": "Se necesita autenticación biométrica",
"@androidSignInTitle": {
"description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters."
},
"androidBiometricRequiredTitle": "Biométrica necesaria",
"androidBiometricRequiredTitle": "Se necesita autenticación biométrica",
"@androidBiometricRequiredTitle": {
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
},
@@ -381,11 +407,11 @@
"@goToSettings": {
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
},
"androidGoToSettingsDescription": "La autenticación biométrica no está configurada en su dispositivo. Vaya a 'Ajustes > Seguridad' para añadir autenticación biométrica.",
"androidGoToSettingsDescription": "La autenticación biométrica no está configurada en tu dispositivo. Ve a 'Ajustes > Seguridad' para configurar la autenticación biométrica.",
"@androidGoToSettingsDescription": {
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
},
"iOSLockOut": "La autenticación biométrica está deshabilitada. Por favor bloquee y desbloquee la pantalla para habilitarla.",
"iOSLockOut": "La autenticación biométrica está deshabilitada. Por favor bloquea y desbloquea la pantalla para habilitarla.",
"@iOSLockOut": {
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
},
@@ -399,27 +425,27 @@
},
"noInternetConnection": "No hay conexión a Internet",
"pleaseCheckYourInternetConnectionAndTryAgain": "Compruebe su conexión a Internet e inténtelo de nuevo.",
"signOutFromOtherDevices": "Cerrar sesión desde otros dispositivos",
"signOutOtherBody": "Si cree que alguien puede conocer su contraseña, puede forzar a todos los demás dispositivos que usen su cuenta a cerrar la sesión.",
"signOutOtherDevices": "Cerrar la sesión de otros dispositivos",
"signOutFromOtherDevices": "Cerrar sesión en otros dispositivos",
"signOutOtherBody": "Si crees que alguien puede conocer tu contraseña, puedes forzar a todos los demás dispositivos que usen tu cuenta a cerrar la sesión.",
"signOutOtherDevices": "Cerrar la sesión en otros dispositivos",
"doNotSignOut": "No cerrar la sesión",
"hearUsWhereTitle": "¿Cómo conoció Ente? (opcional)",
"hearUsExplanation": "No rastreamos las aplicaciones instaladas. ¡Nos ayudaría si nos dijera dónde nos encontró!",
"hearUsExplanation": "No rastreamos la instalación de las aplicaciones. ¡Nos ayudaría si nos dijera dónde nos encontró!",
"recoveryKeySaved": "¡Clave de recuperación guardada en la carpeta Descargas!",
"waitingForBrowserRequest": "Esperando la solicitud del navegador...",
"waitingForVerification": "Esperando verificación...",
"passkey": "Llave de acceso",
"passkey": "Clave de acceso",
"passKeyPendingVerification": "La verificación todavía está pendiente",
"loginSessionExpired": "La sesión ha expirado",
"loginSessionExpiredDetails": "Tu sesión ha expirado. Por favor, vuelve a iniciar sesión.",
"developerSettingsWarning": "¿Estás seguro de que quieres modificar los ajustes de desarrollador?",
"developerSettings": "Ajustes de desarrollador",
"serverEndpoint": "Punto final del servidor",
"invalidEndpoint": "Punto final no válido",
"invalidEndpointMessage": "Lo sentimos, el punto final introducido no es válido. Por favor, introduce un punto final válido y vuelve a intentarlo.",
"endpointUpdatedMessage": "Punto final actualizado con éxito",
"serverEndpoint": "Endpoint del servidor",
"invalidEndpoint": "Endpoint no válido",
"invalidEndpointMessage": "Lo sentimos, el endpoint introducido no es válido. Por favor, introduce un endpoint válido y vuelve a intentarlo.",
"endpointUpdatedMessage": "Endpoint actualizado con éxito",
"customEndpoint": "Conectado a {endpoint}",
"pinText": "Fijar",
"pinText": "Anclar",
"unpinText": "Desanclar",
"pinnedCodeMessage": "{code} ha sido anclado",
"unpinnedCodeMessage": "{code} ha sido desanclado",
@@ -427,33 +453,37 @@
"createNewTag": "Crear Nueva Etiqueta",
"tag": "Etiqueta",
"create": "Crear",
"editTag": "Editar Etiqueta",
"editTag": "Editar etiqueta",
"deleteTagTitle": "¿Eliminar etiqueta?",
"deleteTagMessage": "¿Estás seguro de que quieres eliminar esta etiqueta? Esta acción es irreversible.",
"somethingWentWrongParsingCode": "No se han podido analizar los códigos {x}.",
"updateNotAvailable": "Actualización no disponible",
"viewRawCodes": "Ver códigos raw",
"rawCodes": "Códigos raw",
"rawCodeData": "Datos del código raw",
"viewRawCodes": "Ver códigos en bruto",
"rawCodes": "Códigos en bruto",
"rawCodeData": "Datos de código en bruto",
"appLock": "Bloqueo de aplicación",
"noSystemLockFound": "Bloqueo del sistema no encontrado",
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para activar el bloqueo de la aplicación, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes del sistema.",
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para activar el bloqueo de la aplicación, por favor configura el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes del sistema.",
"autoLock": "Bloqueo automático",
"immediately": "De inmediato",
"immediately": "Inmediatamente",
"reEnterPassword": "Reescribe tu contraseña",
"reEnterPin": "Reescribe tu PIN",
"next": "Siguiente",
"tooManyIncorrectAttempts": "Demasiados intentos incorrectos",
"tapToUnlock": "Toca para desbloquear",
"setNewPassword": "Establece una nueva contraseña",
"deviceLock": "Dispositivo bloqueado",
"deviceLock": "Bloqueo del dispositivo",
"hideContent": "Ocultar contenido",
"hideContentDescriptionAndroid": "Oculta el contenido de la aplicación en el seleccionador de aplicaciones y desactiva las capturas de pantalla",
"hideContentDescriptioniOS": "Ocultar el contenido de la aplicación en el seleccionador de aplicaciones",
"hideContentDescriptionAndroid": "Oculta el contenido de la aplicación en el selector de aplicaciones y desactiva las capturas de pantalla",
"hideContentDescriptioniOS": "Ocultar el contenido de la aplicación en el selector de aplicaciones",
"autoLockFeatureDescription": "Tiempo tras el cual la aplicación se bloquea después de ser colocada en segundo plano",
"appLockDescription": "Elija entre la pantalla de bloqueo por defecto de su dispositivo y una pantalla de bloqueo personalizada con un PIN o contraseña.",
"pinLock": "Bloquear pin",
"pinLock": "Bloqueo con Pin",
"enterPin": "Ingresa el PIN",
"setNewPin": "Establecer nuevo PIN",
"importFailureDescNew": "No se pudo analizar el archivo seleccionado."
"importFailureDescNew": "No se pudo analizar el archivo seleccionado.",
"appLockNotEnabled": "Bloqueo de aplicación no activado",
"appLockNotEnabledDescription": "Por favor, activa el bloqueo de aplicación desde Seguridad > Bloqueo de aplicación",
"authToViewPasskey": "Por favor, autentícate para ver tu clave de acceso",
"appLockOfflineModeWarning": "Has elegido proceder sin copia de seguridad. Si olvidas el código de desbloqueo de la aplicación, se bloqueará el acceso a sus datos."
}

View File

@@ -1,4 +1,83 @@
{
"account": "खाता",
"unlock": "खोलें"
"unlock": "खोलें",
"recoveryKey": "पुनःप्राप्ति कुंजी",
"counterAppBarTitle": "काउंटर",
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingGetStarted": "प्रारंभ करें",
"setupFirstAccount": "अपना पहला अकाउंट सेटअप करें",
"importScanQrCode": "QR कोड स्कैन करें",
"qrCode": "QR कोड",
"importEnterSetupKey": "",
"importAccountPageTitle": "अकाउंट विवरण डालें",
"incorrectDetails": "ग़लत विवरण",
"pleaseVerifyDetails": "कृपया विवरण सत्यापित करें और पुनः प्रयास करें",
"codeIssuerHint": "जारीकर्ता",
"codeSecretKeyHint": "सीक्रेट कुंजी",
"secret": "सीक्रेट",
"all": "सभी",
"notes": "नोट्स",
"notesLengthLimit": "नोट्स अधिकतम {count} अक्षर लम्बे हो सकते हैं",
"@notesLengthLimit": {
"description": "Text to indicate the maximum number of characters allowed for notes",
"placeholders": {
"count": {
"description": "The maximum number of characters allowed for notes",
"type": "int",
"example": "100"
}
}
},
"codeAccountHint": "अकाउंट (you@domain.com)",
"codeTagHint": "टैग",
"sessionExpired": "सत्र की अवधि समाप्त",
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
},
"pleaseLoginAgain": "कृपया फिर से लॉगिन करें",
"loggingOut": "लॉग आउट हो रहा है...",
"saveAction": "सेव करें",
"viewLogsAction": "लॉग देखें",
"preparingLogsTitle": "लॉग तैयार किये जा रहे हैं...",
"emailLogsTitle": "लॉग ईमेल करें",
"emailLogsMessage": "कृपया {email} पर लॉग ईमेल करें",
"@emailLogsMessage": {
"placeholders": {
"email": {
"type": "String"
}
}
},
"exportLogsAction": "लॉग एक्सपोर्ट करें",
"reportABug": "बग रिपोर्ट करें",
"reportBug": "बग रिपोर्ट करें",
"emailUsMessage": "कृपया हमें {email} पर ईमेल करें",
"@emailUsMessage": {
"placeholders": {
"email": {
"type": "String"
}
}
},
"contactSupport": "सपोर्ट टीम से संपर्क करें",
"rateUsOnStore": "हमें {storeName} पर रेट करें",
"blog": "ब्लॉग",
"verifyPassword": "पासवर्ड सत्यापित करें",
"pleaseWait": "कृपया प्रतीक्षा करें...",
"incorrectPasswordTitle": "ग़लत पासवर्ड",
"welcomeBack": "आपका पुनः स्वागत है!",
"changeEmail": "ईमेल बदलें",
"changePassword": "पासवर्ड बदलें",
"data": "डेटा",
"passwordEmptyError": "पासवर्ड रिक्त नहीं हो सकता है",
"importLabel": "इंपोर्ट",
"selectFile": "फ़ाइल का चयन करें",
"emailVerificationToggle": "ईमेल सत्यापन",
"ok": "ठीक है",
"cancel": "रद्द करें",
"yes": "हाँ",
"no": "नहीं",
"settings": "सेटिंग"
}

View File

@@ -8,8 +8,8 @@
},
"onBoardingBody": "2단계 인증 코드를 안전하게 백업하세요",
"onBoardingGetStarted": "시작하기",
"setupFirstAccount": "첫번째 계정을 설정하세요",
"importScanQrCode": "QR 코드 스캔",
"setupFirstAccount": "첫 번째 계정을 설정하세요",
"importScanQrCode": "QR 코드 스캔하기",
"qrCode": "QR 코드",
"importEnterSetupKey": "설정 키 입력",
"importAccountPageTitle": "계정 상세 정보 입력",
@@ -19,7 +19,20 @@
"pleaseVerifyDetails": "입력된 정보를 확인하고 다시 시도하세요",
"codeIssuerHint": "발행인",
"codeSecretKeyHint": "비밀 키",
"secret": "비밀",
"all": "모든 항목",
"notes": "메모",
"notesLengthLimit": "메모는 최대 {count}자까지 적을 수 있습니다",
"@notesLengthLimit": {
"description": "Text to indicate the maximum number of characters allowed for notes",
"placeholders": {
"count": {
"description": "The maximum number of characters allowed for notes",
"type": "int",
"example": "100"
}
}
},
"codeAccountHint": "계정 (you@domain.com)",
"codeTagHint": "태그",
"accountKeyType": "키 종류",
@@ -55,7 +68,7 @@
"reportABug": "버그 제보",
"crashAndErrorReporting": "충돌 & 에러 보고",
"reportBug": "버그 제보",
"emailUsMessage": "{email} 로 이메일을 보내주세요.",
"emailUsMessage": "{email}로 이메일을 보내주세요.",
"@emailUsMessage": {
"placeholders": {
"email": {
@@ -64,7 +77,7 @@
}
},
"contactSupport": "지원 문의",
"rateUsOnStore": "{storeName} 에서 평가해주세요",
"rateUsOnStore": "{storeName}에서 평가해주세요",
"blog": "블로그",
"merchandise": "제품",
"verifyPassword": "비밀번호 확인",
@@ -75,7 +88,7 @@
"useRecoveryKey": "복구 키 사용",
"incorrectPasswordTitle": "올바르지 않은 비밀번호",
"welcomeBack": "돌아오신 것을 환영합니다!",
"madeWithLoveAtPrefix": "made with ❤️ at ",
"madeWithLoveAtPrefix": "❤️을 담아 만들었습니다 ",
"supportDevs": "<bold-green>ente</bold-green>를 구독하고 저희를 지원해주세요",
"supportDiscount": "쿠폰 코드 \"AUTH\"를 사용하고 첫 해 10% 할인 혜택을 받으세요",
"changeEmail": "이메일 변경",
@@ -86,22 +99,391 @@
"importTypeEnteEncrypted": "Ente로 암호화된 내보내기",
"passwordForDecryptingExport": "복호화용 비밀번호",
"passwordEmptyError": "비밀번호는 비어있을 수 없습니다",
"importFromApp": "{appName} 로부터 코드 불러오기",
"importFromApp": "{appName}로부터 코드 불러오기",
"importGoogleAuthGuide": "Google 인증기에서 \"계정 이전\" 옵션을 선택해 생성된 QR 코드를 이용해 계정들을 옮길 수 있습니다. 그 다음, 다른 디바이스를 이용하여 QR 코드를 스캔해주세요.\n\n힌트: 웹캠을 이용해 QR 코드를 촬영할 수 있습니다.",
"importSelectJsonFile": "JSON 파일 선택",
"importSelectAppExport": "{appName}의 내보낸 파일 선택하기",
"importEnteEncGuide": "Ente에서 내보낸 암호화된 JSON 파일 선택하기",
"importRaivoGuide": "Raivo의 설정에서 \"Zip 파일로 OTP 내보내기\"를 이용해주세요.\n\nZip 파일의 압축을 풀고 JSON 파일을 가져오세요.",
"importBitwardenGuide": "Bitwarden의 도구에서 \"보관함 내보내기\"를 선택하여 암호화되지 않은 JSON 파일을 불러오세요.",
"importAegisGuide": "Aegis의 설정에서 \"보관함 내보내기\"를 이용하세요.\n\n보관함이 암호화된 경우, 보관함의 복호화를 위해 보관함 비밀번호를 입력해야 할 수도 있습니다.",
"import2FasGuide": "2FAS의 옵션에서 \"설정 -> 백업 -> 내보내기\"를 이용하세요.\n\n백업이 암호화되었다면, 백업의 복호화를 위해 암호를 입력해야 할 수도 있습니다.",
"importLastpassGuide": "Lastpass 인증기의 설정에서 \"계정 이전하기\" 옵션 중 \"파일로 계정들 내보내기\"를 이용하세요. 다운로드 된 JSON 파일을 불러오세요.",
"exportCodes": "코드 내보내기",
"importLabel": "불러오기",
"importInstruction": "다음의 포맷에 맞춰 여러분의 코드가 들어있는 파일을 선택해주세요",
"importCodeDelimiterInfo": "코드는 쉼표 혹은 줄 단위로 구분할 수 있습니다",
"selectFile": "파일 선택",
"emailVerificationToggle": "이메일 검증",
"emailVerificationEnableWarning": "계정이 잠겨 손을 쓸 수 없는 상황에 대비하여, 이메일을 검증하기 전 메일로 전송된 Ente Auth의 2차 인증을 별도로 보관해두세요.",
"authToChangeEmailVerificationSetting": "이메일 검증을 변경하시려면 인증절차를 거쳐주세요",
"authenticateGeneric": "인증절차를 거쳐주세요",
"authToViewYourRecoveryKey": "당신의 복구 키를 확인하려면 인증절차를 거쳐주세요",
"authToChangeYourEmail": "이메일을 변경하려면 인증절차를 거쳐주세요",
"authToChangeYourPassword": "암호를 변경하려면 인증절차를 거쳐주세요",
"authToViewSecrets": "비밀 부분을 확인하려면 인증절차를 거쳐주세요",
"authToInitiateSignIn": "백업을 위해 로그인 상태를 초기화하려면 인증절차를 거쳐주세요",
"ok": "확인",
"cancel": "취소",
"yes": "네",
"no": "아니오",
"email": "이메일",
"support": "지원",
"general": "일반 설정",
"settings": "설정",
"copied": "복사 됨",
"pleaseTryAgain": "다시 시도해주세요.",
"existingUser": "기존 유저",
"pleaseTryAgain": "다시 시도해주세요",
"existingUser": "기존 사용자",
"newUser": "Ente에 새로 가입",
"delete": "삭제",
"enterYourPasswordHint": "패스워드 입력",
"forgotPassword": "패스워드 분실",
"enterYourPasswordHint": "암호 입력",
"forgotPassword": "암호 분실",
"oops": "이런!",
"suggestFeatures": "기능 제안",
"faq": "FAQ"
"faq": "FAQ",
"somethingWentWrongMessage": "뭔가 잘못된 것 같습니다, 다시 시도해주세요",
"leaveFamily": "패밀리에서 떠나기",
"leaveFamilyMessage": "가족 요금제에서 떠나시겠습니까?",
"inFamilyPlanMessage": "가족 요금제에 가입하셨습니다!",
"hintForMobile": "수정이나 삭제를 원하시면 코드를 길게 눌러주세요.",
"hintForDesktop": "수정이나 삭제를 원하시면 코드를 우클릭해주세요.",
"scan": "스캔하기",
"scanACode": "코드 스캔하기",
"verify": "인증",
"verifyEmail": "이메일 인증하기",
"enterCodeHint": "인증기에 적힌 여섯 자리 코드를 입력해주세요",
"lostDeviceTitle": "기기를 잃어버리셨나요?",
"twoFactorAuthTitle": "2단계 인증",
"passkeyAuthTitle": "패스키 검증",
"verifyPasskey": "패스키 확인",
"loginWithTOTP": "TOTP로 로그인 하기",
"recoverAccount": "계정 복구",
"enterRecoveryKeyHint": "복구 키를 입력하세요",
"recover": "복구",
"contactSupportViaEmailMessage": "당신이 등록한 이메일 주소에서 {email}로 메일 한 통을 보내주세요",
"@contactSupportViaEmailMessage": {
"placeholders": {
"email": {
"type": "String"
}
}
},
"invalidQRCode": "맞지 않는 QR 코드",
"noRecoveryKeyTitle": "복구 키가 없으세요?",
"enterEmailHint": "이메일 주소 입력",
"invalidEmailTitle": "잘못 된 이메일 주소",
"invalidEmailMessage": "유효한 이메일 주소를 입력해주세요",
"deleteAccount": "계정 삭제하기",
"deleteAccountQuery": "떠나신다니 아쉽습니다. 뭔가 문제가 있으셨나요?",
"yesSendFeedbackAction": "네, 피드백을 보냅니다",
"noDeleteAccountAction": "아니오, 계정을 지웁니다",
"initiateAccountDeleteTitle": "계정 삭제 절차를 시작하려면 인증절차를 거쳐주세요",
"sendEmail": "이메일 보내기",
"createNewAccount": "새 계정 만들기",
"weakStrength": "약함",
"strongStrength": "강함",
"moderateStrength": "보통",
"confirmPassword": "암호 확인",
"close": "닫기",
"oopsSomethingWentWrong": "이런, 뭔가 꼬였습니다.",
"selectLanguage": "언어 선택",
"language": "언어",
"social": "소셜",
"security": "보안",
"lockscreen": "화면 잠금",
"authToChangeLockscreenSetting": "화면 잠금 설정을 변경하시려면 인증절차를 거쳐주세요",
"deviceLockEnablePreSteps": "기기 잠금을 활성화하시려면, 기기의 암호를 만들거나 시스템 설정에서 화면 잠금을 설정해주세요.",
"viewActiveSessions": "활성화된 세션 확인하기",
"authToViewYourActiveSessions": "활성화된 세션을 확인하시려면 인증절차를 거쳐주세요",
"searchHint": "검색...",
"search": "찾기",
"sorryUnableToGenCode": "죄송합니다, {issuerName}의 코드를 생성할 수 없습니다",
"noResult": "결과 없음",
"addCode": "코드 추가하기",
"scanAQrCode": "QR 코드 스캔하기",
"enterDetailsManually": "속성을 수동으로 입력하기",
"edit": "수정",
"share": "공유",
"shareCodes": "코드 공유하기",
"shareCodesDuration": "코드 공유를 허용할 시간을 선택해주세요.",
"restore": "복구",
"copiedToClipboard": "클립보드에 복사 됨",
"copiedNextToClipboard": "클립보드에 다음번 코드 복사 됨",
"error": "에러",
"recoveryKeyCopiedToClipboard": "클립보드에 복구 키 복사 됨",
"recoveryKeyOnForgotPassword": "암호를 잊어버린 경우, 데이터를 복구하려면 이 키를 이용하는 방법 뿐입니다.",
"recoveryKeySaveDescription": "저희는 이 키를 보관하지 않사오니, 여기에 있는 24 단어로 구성된 키를 안전하게 보관해주세요.",
"doThisLater": "나중에 하기",
"saveKey": "키 저장하기",
"save": "저장",
"send": "보내기",
"saveOrSendDescription": "이것을 당신의 스토리지 (일반적으로 다운로드 폴더) 에 저장하시겠습니까, 아니면 다른 앱으로 전송하시겠습니까?",
"saveOnlyDescription": "이것을 당신의 스토리지 (일반적으로 다운로드 폴더) 에 저장하시겠습니까?",
"back": "뒤로 가기",
"createAccount": "계정 만들기",
"passwordStrength": "암호 보안 강도: {passwordStrengthValue}",
"@passwordStrength": {
"description": "Text to indicate the password strength",
"placeholders": {
"passwordStrengthValue": {
"description": "The strength of the password as a string",
"type": "String",
"example": "Weak or Moderate or Strong"
}
},
"message": "Password Strength: {passwordStrengthText}"
},
"password": "암호",
"signUpTerms": "나는 <u-terms>사용자 약관</u-terms>과 <u-policy>개인정보 취급방침</u-policy>에 동의합니다.",
"privacyPolicyTitle": "개인정보 취급방침",
"termsOfServicesTitle": "약관",
"encryption": "암호화",
"setPasswordTitle": "암호 지정",
"changePasswordTitle": "암호 변경",
"resetPasswordTitle": "암호 초기화",
"encryptionKeys": "암호화 키",
"passwordWarning": "저희는 이 암호를 저장하지 않사오니, 만약 잊어버리시게 되면, <underline>데이터를 복호화해드릴 수 없습니다</underline>",
"enterPasswordToEncrypt": "데이터 암호화를 위한 암호 입력",
"enterNewPasswordToEncrypt": "데이터 암호화를 위한 새로운 암호 입력",
"passwordChangedSuccessfully": "암호가 성공적으로 변경되었습니다",
"generatingEncryptionKeys": "암호화 키 생성 중...",
"continueLabel": "계속",
"insecureDevice": "보안이 허술한 기기",
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "죄송합니다, 이 기기에서 보안 키를 생성할 수 없습니다.\n\n다른 기기에서 계정을 생성해주세요.",
"howItWorks": "작동 원리",
"ackPasswordLostWarning": "나는 암호를 분실한 경우, 데이터가 <underline>종단간 암호화</underline>되어있기에 데이터를 손실할 수 있음을 이해합니다.",
"loginTerms": "로그인을 누름으로써, 나는 <u-terms>사용자 약관</u-terms>과 <u-policy>개인정보 취급방침</u-policy>에 동의합니다.",
"logInLabel": "로그인",
"logout": "로그아웃",
"areYouSureYouWantToLogout": "로그아웃 하시겠습니까?",
"yesLogout": "네, 로그아웃하기",
"exit": "나가기",
"verifyingRecoveryKey": "복구 키 확인 중...",
"recoveryKeyVerified": "복구 키 확인 됨",
"recoveryKeySuccessBody": "좋습니다! 복구 키가 확인되었습니다. 확인 절차를 거쳐주셔서 감사합니다.\n\n잊지 마시고 꼭 복구 키를 안전하게 보관해주세요.",
"invalidRecoveryKey": "입력하신 복구 키가 유효하지 않습니다. 24 단어가 입력됐는지, 그리고 철자가 모두 정확한지 확인해주세요.\n\n구형 복구 코드를 입력하신 경우, 64 자가 맞는지, 그리고 문자가 각각 맞는지 확인해주세요.",
"recreatePasswordTitle": "암호 재생성",
"recreatePasswordBody": "현재 사용 중인 기기는 암호를 확인하기에 적합하지 않으나, 모든 기기에서 작동하는 방식으로 비밀번호를 재생성할 수 있습니다.\n\n복구 키를 사용하여 로그인하고 암호를 재생성해주세요. (원하시면 현재 사용 중인 암호와 같은 암호를 재사용하실 수 있습니다.)",
"invalidKey": "유효하지 않은 키",
"tryAgain": "다시 시도해주세요",
"viewRecoveryKey": "복구 키 보기",
"confirmRecoveryKey": "복구 키 확인",
"recoveryKeyVerifyReason": "암호를 잃어버리셨을 경우, 복구 키만이 당신의 사진들을 복원할 유일한 방법이 됩니다. 설정 > 계정으로 들어가셔서 복구 키를 확인하세요.\n\n여기에 복구 키를 입력하셔서, 확인하셨던 복구 키가 정상인지 체크해보세요.",
"confirmYourRecoveryKey": "복구 키 확인",
"confirm": "확인",
"emailYourLogs": "로그를 이메일로 보내기",
"pleaseSendTheLogsTo": "이 로그를 {toEmail}으로 보내주세요",
"copyEmailAddress": "이메일 주소 복사",
"exportLogs": "로그 내보내기",
"enterYourRecoveryKey": "복구 키를 입력하세요",
"tempErrorContactSupportIfPersists": "뭔가 잘못된 것 같습니다. 잠시 후에 다시 시도해주세요. 에러가 반복되는 경우, 저희 지원 팀에 문의해주세요.",
"networkHostLookUpErr": "Ente에 접속할 수 없습니다, 네트워크 설정을 확인해주시고 에러가 반복되는 경우 저희 지원 팀에 문의해주세요.",
"networkConnectionRefusedErr": "Ente에 접속할 수 없습니다, 잠시 후에 다시 시도해주세요. 에러가 반복되는 경우, 저희 지원 팀에 문의해주세요.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "뭔가 잘못된 것 같습니다. 잠시 후에 다시 시도해주세요. 에러가 반복되는 경우, 저희 지원 팀에 문의해주세요.",
"about": "소개",
"weAreOpenSource": "저희는 오픈 소스로 운영됩니다!",
"privacy": "개인 정보",
"terms": "약관",
"checkForUpdates": "업데이트 확인",
"checkStatus": "상태 확인",
"downloadUpdate": "다운로드",
"criticalUpdateAvailable": "중요 업데이트 있음",
"updateAvailable": "업데이트 가능",
"update": "업데이트",
"checking": "확인 중...",
"youAreOnTheLatestVersion": "최신 버전을 사용 중이십니다",
"warning": "경고",
"exportWarningDesc": "내보낸 파일은 민감한 정보들을 담고 있습니다. 안전하게 보관해주세요.",
"iUnderStand": "알겠습니다",
"@iUnderStand": {
"description": "Text for the button to confirm the user understands the warning"
},
"authToExportCodes": "코드를 내보내려면 인증절차를 거쳐주세요",
"importSuccessTitle": "얏호!",
"importSuccessDesc": "코드 {count} 개를 내보내셨습니다!",
"@importSuccessDesc": {
"placeholders": {
"count": {
"description": "The number of codes imported",
"type": "int",
"example": "1"
}
}
},
"sorry": "죄송합니다",
"importFailureDesc": "선택하신 파일을 분석할 수 없습니다.\n도움이 필요하시다면 support@ente.io로 문의해주세요.",
"pendingSyncs": "경고",
"pendingSyncsWarningBody": "코드 몇 개가 백업되어있지 않습니다.\n\n로그아웃하기 전 해당 코드들을 백업하셨는지 확인해주세요.",
"checkInboxAndSpamFolder": "검증을 위해 메일 보관함 (또는 스팸함) 을 확인해주세요",
"tapToEnterCode": "눌러서 코드 입력하기",
"resendEmail": "이메일 다시 보내기",
"weHaveSendEmailTo": "<green>{email}</green>으로 메일을 보냈습니다",
"@weHaveSendEmailTo": {
"description": "Text to indicate that we have sent a mail to the user",
"placeholders": {
"email": {
"description": "The email address of the user",
"type": "String",
"example": "example@ente.io"
}
}
},
"activeSessions": "활성화된 세션",
"somethingWentWrongPleaseTryAgain": "뭔가 잘못됐습니다, 다시 시도해주세요",
"thisWillLogYouOutOfThisDevice": "이 작업을 하시면 기기에서 로그아웃하게 됩니다!",
"thisWillLogYouOutOfTheFollowingDevice": "이 작업을 하시면 다음 기기에서 로그아웃하게 됩니다:",
"terminateSession": "세션을 종결하시겠습니까?",
"terminate": "종결",
"thisDevice": "이 기기",
"toResetVerifyEmail": "암호를 재설정하시려면, 먼저 이메일을 인증해주세요.",
"thisEmailIsAlreadyInUse": "이 이메일은 이미 사용 중입니다",
"verificationFailedPleaseTryAgain": "검증 실패, 다시 시도해주세요",
"yourVerificationCodeHasExpired": "검증 코드의 유효시간이 경과하였습니다",
"incorrectCode": "잘못된 코드",
"sorryTheCodeYouveEnteredIsIncorrect": "죄송합니다, 입력하신 코드가 맞지 않습니다",
"emailChangedTo": "{newEmail}로 메일이 변경되었습니다",
"authenticationFailedPleaseTryAgain": "인증절차 실패, 다시 시도해주세요",
"authenticationSuccessful": "인증 성공!",
"twofactorAuthenticationSuccessfullyReset": "2FA가 성공적으로 초기화되었습니다",
"incorrectRecoveryKey": "잘못 된 복구 키",
"theRecoveryKeyYouEnteredIsIncorrect": "입력하신 복구 키가 맞지 않습니다",
"enterPassword": "암호 입력",
"selectExportFormat": "내보낼 포맷 선택",
"exportDialogDesc": "내보낸 파일은 선택하신 암호로 암호화됩니다.",
"encrypted": "암호화됨",
"plainText": "평문",
"passwordToEncryptExport": "암호화된 내보내기를 위한 암호",
"export": "내보내기",
"useOffline": "백업 없이 사용",
"signInToBackup": "코드를 백업하시려면 로그인해주세요",
"singIn": "로그인",
"sigInBackupReminder": "복구 가능한 방법을 남겨두기 위해 코드를 내보내세요.",
"offlineModeWarning": "백업 없이 진행하는 것을 선택하셨습니다. 코드의 안전성을 위해 별도의 백업 대책을 마련해주세요.",
"showLargeIcons": "큰 아이콘 보기",
"compactMode": "조밀하게 보기",
"shouldHideCode": "코드 숨기기",
"doubleTapToViewHiddenCode": "코드를 보시려면 해당 란을 더블탭해주세요",
"focusOnSearchBar": "앱 구동시 곧바로 검색하기",
"confirmUpdatingkey": "비밀 키를 업데이트하시겠어요?",
"minimizeAppOnCopy": "복사 후 어플을 최소화하기",
"editCodeAuthMessage": "코드 수정을 위해 인증절차를 거쳐주세요",
"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."
},
"androidBiometricNotRecognized": "식별할 수 없습니다. 다시 시도해주세요.",
"@androidBiometricNotRecognized": {
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
},
"androidBiometricSuccess": "성공",
"@androidBiometricSuccess": {
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
},
"androidCancelButton": "취소",
"@androidCancelButton": {
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
},
"androidSignInTitle": "인증 필요",
"@androidSignInTitle": {
"description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters."
},
"androidBiometricRequiredTitle": "생체인증 필요",
"@androidBiometricRequiredTitle": {
"description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters."
},
"androidDeviceCredentialsRequiredTitle": "장치 자격 증명 필요",
"@androidDeviceCredentialsRequiredTitle": {
"description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters."
},
"androidDeviceCredentialsSetupDescription": "장치 자격 증명 필요",
"@androidDeviceCredentialsSetupDescription": {
"description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side."
},
"goToSettings": "설정으로 가기",
"@goToSettings": {
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
},
"androidGoToSettingsDescription": "기기에 생체인증이 설정되어있지 않습니다. '설정 > 보안'으로 가셔서 생체인증을 설정해주세요.",
"@androidGoToSettingsDescription": {
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
},
"iOSLockOut": "생체인증에 문제가 있습니다. 활성화하시려면 기기를 잠궜다가 다시 풀어주세요.",
"@iOSLockOut": {
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
},
"iOSGoToSettingsDescription": "기기에 생체인증이 설정되어있지 않습니다. 핸드폰에서 Touch ID나 Face ID를 설정해주세요.",
"@iOSGoToSettingsDescription": {
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
},
"iOSOkButton": "확인",
"@iOSOkButton": {
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
},
"noInternetConnection": "인터넷 연결 없음",
"pleaseCheckYourInternetConnectionAndTryAgain": "인터넷 연결을 확인하시고 다시 시도해주세요.",
"signOutFromOtherDevices": "다른 기기들에서 로그아웃하기",
"signOutOtherBody": "다른 사람이 내 암호를 알 수도 있을 거란 의심이 드신다면, 당신의 계정을 사용 중인 다른 모든 기기에서 로그아웃할 수 있습니다.",
"signOutOtherDevices": "다른 기기들을 로그아웃시키기",
"doNotSignOut": "로그아웃 하지 않기",
"hearUsWhereTitle": "Ente에 대해 어떻게 알게 되셨나요? (선택사항)",
"hearUsExplanation": "저희는 어플 설치 과정을 관찰하지 않습니다. 어디에서 저희를 발견하셨는지 알려주신다면 도움이 될 겁니다!",
"recoveryKeySaved": "다운로드 폴더에 복구 키가 저장되었습니다!",
"waitingForBrowserRequest": "브라우저 요청 대기 중...",
"waitingForVerification": "검증 대기 중...",
"passkey": "패스키",
"passKeyPendingVerification": "검증 절차가 마무리되지 않았습니다",
"loginSessionExpired": "세션 만료됨",
"loginSessionExpiredDetails": "세션이 만료되었습니다. 다시 로그인해주세요.",
"developerSettingsWarning": "정말로 개발자 설정을 수정하시겠습니까?",
"developerSettings": "개발자 설정",
"serverEndpoint": "서버 엔드포인트",
"invalidEndpoint": "유효하지 않은 엔드포인트",
"invalidEndpointMessage": "죄송합니다, 입력하신 엔드포인트가 유효하지 않습니다. 유효한 엔드포인트를 입력하시고 다시 시도해주세요.",
"endpointUpdatedMessage": "엔드포인트가 성공적으로 업데이트됨",
"customEndpoint": "{endpoint}에 접속됨",
"pinText": "핀",
"unpinText": "핀 해제",
"pinnedCodeMessage": "{code}가 핀 되었습니다.",
"unpinnedCodeMessage": "{code}의 핀이 해제되었습니다.",
"tags": "태그",
"createNewTag": "새 태그 만들기",
"tag": "태그",
"create": "만들기",
"editTag": "태그 수정하기",
"deleteTagTitle": "태그를 지우시겠습니까?",
"deleteTagMessage": "태그를 지우시겠습니까? 되돌리실 수 없습니다.",
"somethingWentWrongParsingCode": "{x} 코드를 분석할 수 없습니다.",
"updateNotAvailable": "업데이트 없음",
"viewRawCodes": "원시 코드 보기",
"rawCodes": "원시 코드",
"rawCodeData": "원시 코드 데이터",
"appLock": "어플 잠금",
"noSystemLockFound": "시스템 잠금 찾을 수 없음",
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "어플 잠금을 활성화하시려면, 기기의 암호를 만들거나 시스템 설정에서 화면 잠금을 설정해주세요.",
"autoLock": "자동 잠금",
"immediately": "즉시",
"reEnterPassword": "암호 재입력",
"reEnterPin": "핀 재입력",
"next": "다음",
"tooManyIncorrectAttempts": "잘못된 시도 횟수가 너무 많습니다",
"tapToUnlock": "잠금을 해제하려면 누르세요",
"setNewPassword": "새 비밀번호 설정",
"deviceLock": "기기 잠금",
"hideContent": "내용 숨기기",
"hideContentDescriptionAndroid": "어플 전환 화면에서 어플의 내용을 숨기고 스크린샷 촬영을 막습니다",
"hideContentDescriptioniOS": "어플 전환 화면에서 어플의 내용을 숨깁니다",
"autoLockFeatureDescription": "어플이 백그라운드로 넘어가고 잠금 처리되기까지의 시간",
"appLockDescription": "기본 잠금 화면이나, PIN 번호나 암호를 사용한 사용자 설정 잠금 화면 중에 선택하세요.",
"pinLock": "PIN 잠금",
"enterPin": "PIN 번호 입력",
"setNewPin": "새 PIN 번호 설정",
"importFailureDescNew": "선택하신 파일을 분석할 수 없습니다.",
"appLockNotEnabled": "어플 잠금 설정되지 않음",
"appLockNotEnabledDescription": "설정 > 어플 잠금에서 어플 잠금을 활성화해주세요",
"authToViewPasskey": "패스키를 보려면 인증절차를 거쳐주세요",
"appLockOfflineModeWarning": "백업 없이 진행하는 것을 선택하셨습니다. 어플 잠금 방법을 잊어버리신 경우, 데이터에 접근하실 수 없게 됩니다."
}

View File

@@ -6,7 +6,7 @@
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "Saugiai kurkite atsargines 2FA kodų kopijas",
"onBoardingBody": "Saugiai kurkite savo atsargines 2FA kodų kopijas",
"onBoardingGetStarted": "Pradėti",
"setupFirstAccount": "Nustatykite savo pirmąją paskyrą",
"importScanQrCode": "Skenuoti QR kodą",
@@ -154,8 +154,9 @@
"enterCodeHint": "Įveskite 6 skaitmenų kodą\niš autentifikatoriaus programos",
"lostDeviceTitle": "Prarastas įrenginys?",
"twoFactorAuthTitle": "Dvigubas tapatybės nustatymas",
"passkeyAuthTitle": "Slaptarakto patvirtinimas",
"verifyPasskey": "Patvirtinti slaptaraktą",
"passkeyAuthTitle": "Slaptarakčio patvirtinimas",
"verifyPasskey": "Patvirtinti slaptaraktį",
"loginWithTOTP": "Prisijungti su TOTP",
"recoverAccount": "Atkurti paskyrą",
"enterRecoveryKeyHint": "Įveskite atkūrimo raktą",
"recover": "Atkurti",
@@ -299,7 +300,7 @@
},
"authToExportCodes": "Nustatykite tapatybę, kad eksportuotumėte savo kodus",
"importSuccessTitle": "Valio!",
"importSuccessDesc": "Importavote {count} kodų.",
"importSuccessDesc": "Importavote {count} kodus (-ų).",
"@importSuccessDesc": {
"placeholders": {
"count": {
@@ -313,10 +314,10 @@
"importFailureDesc": "Nepavyko išanalizuoti pasirinkto failo.\nJei reikia pagalbos, rašykite adresu support@ente.io.",
"pendingSyncs": "Įspėjimas",
"pendingSyncsWarningBody": "Kai kurių jūsų kodų atsarginės kopijos nebuvo sukurtos.\n\nPrieš atsijungdami įsitikinkite, kad turite atsarginę šių kodų kopiją.",
"checkInboxAndSpamFolder": "Patikrinkite savo gautieją (ir šlamštą), kad užbaigtumėte patvirtinimą",
"checkInboxAndSpamFolder": "Patikrinkite savo gautieją (ir šlamštą), kad užbaigtumėte patvirtinimą.",
"tapToEnterCode": "Palieskite, kad įvestumėte kodą",
"resendEmail": "Iš naujo siųsti el. laišką",
"weHaveSendEmailTo": "Išsiuntėme laišką adresu <green>{email}</green>",
"weHaveSendEmailTo": "Išsiuntėme laišką adresu <green>{email}</green>.",
"@weHaveSendEmailTo": {
"description": "Text to indicate that we have sent a mail to the user",
"placeholders": {
@@ -337,12 +338,12 @@
"toResetVerifyEmail": "Kad iš naujo nustatytumėte slaptažodį, pirmiausia patvirtinkite savo el. paštą.",
"thisEmailIsAlreadyInUse": "Šis el. paštas jau naudojamas.",
"verificationFailedPleaseTryAgain": "Patvirtinimas nepavyko. Bandykite dar kartą.",
"yourVerificationCodeHasExpired": "Jūsų patvirtinimo kodo laikas nebegaliojantis.",
"yourVerificationCodeHasExpired": "Jūsų patvirtinimo kodas nebegaliojantis.",
"incorrectCode": "Neteisingas kodas",
"sorryTheCodeYouveEnteredIsIncorrect": "Atsiprašome, įvestas kodas yra neteisingas.",
"emailChangedTo": "El. paštas pakeistas į {newEmail}",
"authenticationFailedPleaseTryAgain": "Tapatybės nustatymas nepavyko. Bandykite dar kartą.",
"authenticationSuccessful": "Tapatybės nustatymas sėkmingas!",
"authenticationSuccessful": "Tapatybės nustatymas sėkmingas.",
"twofactorAuthenticationSuccessfullyReset": "Dvigubas tapatybės nustatymas sėkmingai iš naujo nustatytas.",
"incorrectRecoveryKey": "Neteisingas atkūrimo raktas",
"theRecoveryKeyYouEnteredIsIncorrect": "Įvestas atkūrimo raktas yra neteisingas.",
@@ -433,7 +434,7 @@
"recoveryKeySaved": "Atkūrimo raktas išsaugotas atsisiuntimų aplanke.",
"waitingForBrowserRequest": "Laukiama naršyklės užklausos...",
"waitingForVerification": "Laukiama patvirtinimo...",
"passkey": "Slaptaraktas",
"passkey": "Slaptaraktis",
"passKeyPendingVerification": "Vis dar laukiama patvirtinimo",
"loginSessionExpired": "Seansas baigėsi",
"loginSessionExpiredDetails": "Jūsų seansas baigėsi. Prisijunkite iš naujo.",
@@ -473,9 +474,9 @@
"setNewPassword": "Nustatykite naują slaptažodį",
"deviceLock": "Įrenginio užraktas",
"hideContent": "Slėpti turinį",
"hideContentDescriptionAndroid": "Paslepia programų turinį programų perjungiklyje ir išjungia ekrano kopijas",
"hideContentDescriptioniOS": "Paslepia programos turinį programos perjungiklyje",
"autoLockFeatureDescription": "Laikas, po kurio programa užrakinama perkėlus ją į foną",
"hideContentDescriptionAndroid": "Paslepia programų turinį programų perjungiklyje ir išjungia ekrano kopijas.",
"hideContentDescriptioniOS": "Paslepia programos turinį programos perjungiklyje.",
"autoLockFeatureDescription": "Laikas, po kurio programa užrakinama perkėlus ją į foną.",
"appLockDescription": "Pasirinkite tarp numatytojo įrenginio užrakinimo ekrano ir pasirinktinio užrakinimo ekrano su PIN kodu arba slaptažodžiu.",
"pinLock": "PIN užraktas",
"enterPin": "Įveskite PIN",
@@ -483,6 +484,6 @@
"importFailureDescNew": "Nepavyko išanalizuoti pasirinkto failo.",
"appLockNotEnabled": "Programos užraktas neįjungtas",
"appLockNotEnabledDescription": "Įjunkite programos užraktą iš Saugumas > Programos užraktas",
"authToViewPasskey": "Nustatykite tapatybę, kad peržiūrėtumėte slaptaraktą",
"authToViewPasskey": "Nustatykite tapatybę, kad peržiūrėtumėte slaptaraktį",
"appLockOfflineModeWarning": "Pasirinkote tęsti be atsarginių kopijų. Jei pamiršite programos užraktą, jums bus užrakinta prieiga prie duomenų."
}

View File

@@ -156,6 +156,7 @@
"twoFactorAuthTitle": "Uwierzytelnianie dwustopniowe",
"passkeyAuthTitle": "Weryfikacja kluczem dostępu",
"verifyPasskey": "Zweryfikuj klucz dostępu",
"loginWithTOTP": "Zaloguj się za pomocą TOTP",
"recoverAccount": "Odzyskaj konto",
"enterRecoveryKeyHint": "Wprowadź swój klucz odzyskiwania",
"recover": "Odzyskaj",

View File

@@ -156,6 +156,7 @@
"twoFactorAuthTitle": "Autenticação de dois fatores",
"passkeyAuthTitle": "Verificação de chave de acesso",
"verifyPasskey": "Verificar chave de acesso",
"loginWithTOTP": "Registrar com TOTP",
"recoverAccount": "Recuperar conta",
"enterRecoveryKeyHint": "Digite a chave de recuperação",
"recover": "Recuperar",
@@ -173,7 +174,7 @@
"invalidEmailTitle": "Endereço de e-mail inválido",
"invalidEmailMessage": "Insira um endereço de e-mail válido.",
"deleteAccount": "Excluir conta",
"deleteAccountQuery": "Estamos tristes com sua decisão. Você encontrou algum problema?",
"deleteAccountQuery": "Estamos tristes por vê-lo sair. Você enfrentou algum problema?",
"yesSendFeedbackAction": "Sim, enviar feedback",
"noDeleteAccountAction": "Não, excluir conta",
"initiateAccountDeleteTitle": "Autentique para iniciar a exclusão de conta",

View File

@@ -19,6 +19,20 @@
"pleaseVerifyDetails": "Prosím, skontrolujte svoje údaje a skúste to znova",
"codeIssuerHint": "Vydavateľ",
"codeSecretKeyHint": "Tajný kľúč",
"secret": "Tajný kľúč",
"all": "Všetko",
"notes": "Poznámky",
"notesLengthLimit": "Maximálna dĺžka poznámky je {count} znakov",
"@notesLengthLimit": {
"description": "Text to indicate the maximum number of characters allowed for notes",
"placeholders": {
"count": {
"description": "The maximum number of characters allowed for notes",
"type": "int",
"example": "100"
}
}
},
"codeAccountHint": "Účet (ty@domena.sk)",
"codeTagHint": "Tag",
"accountKeyType": "Typ kľúča",
@@ -34,6 +48,9 @@
"nextTotpTitle": "ďalej",
"deleteCodeTitle": "Odstrániť položku?",
"deleteCodeMessage": "Naozaj chcete odstrániť položku? Táto akcia je nezvratná.",
"trashCode": "Odstrániť kód?",
"trashCodeMessage": "Ste si istý, že chcete odstrániť kód pre účet {account}?",
"trash": "Odstrániť",
"viewLogsAction": "Zobraziť logy",
"sendLogsDescription": "Toto odošle logy, ktoré nám pomôžu vyriešiť váš problém. Aj keď prijímame preventívne opatrenia, aby sme zabezpečili, že sa citlivé informácie neukladajú do logov, odporúčame vám, aby ste si ich pred zdieľaním pozreli.",
"preparingLogsTitle": "Príprava logov...",
@@ -100,6 +117,7 @@
"emailVerificationToggle": "Overenie pomocou e-mailovej adresy",
"emailVerificationEnableWarning": "Aby ste predišli vymknutiu sa z vášho účtu, nezabudnite pred povolením overenia emailom uložiť kópiu svojho 2FA emailu mimo Ente Auth.",
"authToChangeEmailVerificationSetting": "Pre zmenu overenia pomocou emailu sa musíte overiť",
"authenticateGeneric": "Prosím, overte svoju identitu",
"authToViewYourRecoveryKey": "Pre zobrazenie vášho kľúča na obnovenie sa musíte overiť",
"authToChangeYourEmail": "Pre zmenu vášho emailu sa musíte overiť",
"authToChangeYourPassword": "Pre zmenu vášho hesla sa musíte overiť",
@@ -127,6 +145,8 @@
"leaveFamily": "Opustiť rodinku",
"leaveFamilyMessage": "Ste si istý, že chcete opustiť rodinku?",
"inFamilyPlanMessage": "Ste prihlásený k rodinke!",
"hintForMobile": "Pre úpravu alebo odstránenie kódu podržte.",
"hintForDesktop": "Pre úpravu alebo odstránenie kódu kliknite pravým tlačidlom myši.",
"scan": "Skenovať",
"scanACode": "Skenovať kód",
"verify": "Overiť",
@@ -171,6 +191,7 @@
"security": "Zabezpečenie",
"lockscreen": "Uzamknutie obrazovky",
"authToChangeLockscreenSetting": "Pre zmenu nastavenia uzamknutia obrazovky sa musíte overiť",
"deviceLockEnablePreSteps": "Pre povolenie zámku zariadenia, nastavte prístupový kód zariadenia alebo zámok obrazovky v nastaveniach systému.",
"viewActiveSessions": "Zobraziť aktívne relácie",
"authToViewYourActiveSessions": "Pre zobrazenie vašich aktívnych relácii sa musíte overiť",
"searchHint": "Hľadať...",
@@ -181,6 +202,10 @@
"scanAQrCode": "Naskenovať QR kód",
"enterDetailsManually": "Zadajte údaje manuálne",
"edit": "Upraviť",
"share": "Zdielať",
"shareCodes": "Zdieľať kódy",
"shareCodesDuration": "Zvoľte dobu, počas ktorej chcete zdieľať kódy.",
"restore": "Obnoviť",
"copiedToClipboard": "Skopírované do schránky",
"copiedNextToClipboard": "Skopírovaný následujúci kód do schránky",
"error": "Chyba",
@@ -334,6 +359,7 @@
"sigInBackupReminder": "Exportujte svoje kódy, aby ste sa uistili, že máte zálohu, ktorú môžete neskôr obnoviť.",
"offlineModeWarning": "Rozhodli ste sa pokračovať bez zálohovania. Prosím, vykonávajte pravidelné manuálne zálohy aby ste mali istotu, že kódy nestratíte.",
"showLargeIcons": "Zobraziť veľké ikony",
"compactMode": "Kompaktný mód",
"shouldHideCode": "Skryť kódy",
"doubleTapToViewHiddenCode": "Dvakrát klepnite na položku aby ste zobrazili kód",
"focusOnSearchBar": "Využívať pole vyhľadávania pri spustení aplikácie",
@@ -454,5 +480,9 @@
"pinLock": "Zámok PIN",
"enterPin": "Zadajte PIN",
"setNewPin": "Nastaviť nový PIN",
"importFailureDescNew": "Vybraný súbor nie je možné spracovať."
"importFailureDescNew": "Vybraný súbor nie je možné spracovať.",
"appLockNotEnabled": "Zámok aplikácie nie je povolený",
"appLockNotEnabledDescription": "Prosím, povoľte zámok aplikácie v časti Zabezpečenie > Zámok aplikácie",
"authToViewPasskey": "Pre zobrazenie vášho passkey sa musíte overiť",
"appLockOfflineModeWarning": "Rozhodli ste sa pokračovať bez záloh. Ak zabudnete svoj zámok aplikácie, prístup k údajom bude nemožný."
}

View File

@@ -156,6 +156,7 @@
"twoFactorAuthTitle": "Двофакторна аутентифікація",
"passkeyAuthTitle": "Перевірка секретного ключа",
"verifyPasskey": "Підтвердження секретного ключа",
"loginWithTOTP": "Увійти за допомогою TOTP",
"recoverAccount": "Відновити обліковий запис",
"enterRecoveryKeyHint": "Введіть ваш ключ відновлення",
"recover": "Відновлення",

View File

@@ -139,7 +139,7 @@
"enterYourPasswordHint": "Nhập mật khẩu của bạn",
"forgotPassword": "Quên mật khẩu",
"oops": "Rất tiếc",
"suggestFeatures": "Tính năng đề nghị",
"suggestFeatures": "Gợi ý tính năng",
"faq": "Câu hỏi thường gặp",
"somethingWentWrongMessage": "Đã xảy ra lỗi, xin thử lại",
"leaveFamily": "Rời khỏi gia đình",
@@ -156,6 +156,7 @@
"twoFactorAuthTitle": "Xác thực hai yếu tố",
"passkeyAuthTitle": "Xác minh mã khóa",
"verifyPasskey": "Xác minh mã khóa",
"loginWithTOTP": "Đăng nhập bằng TOTP",
"recoverAccount": "Khôi phục tài khoản",
"enterRecoveryKeyHint": "Nhập khóa khôi phục của bạn",
"recover": "Khôi phục",
@@ -331,8 +332,8 @@
"somethingWentWrongPleaseTryAgain": "Phát hiện có lỗi, xin thử lại",
"thisWillLogYouOutOfThisDevice": "Thao tác này sẽ đăng xuất bạn khỏi thiết bị này!",
"thisWillLogYouOutOfTheFollowingDevice": "Thao tác này sẽ đăng xuất bạn khỏi thiết bị sau:",
"terminateSession": "Chấm dứt phiên?",
"terminate": "Dừng lại",
"terminateSession": "Kết thúc phiên?",
"terminate": "Kết thúc",
"thisDevice": "Thiết bị này",
"toResetVerifyEmail": "Để đặt lại mật khẩu, vui lòng xác minh email của bạn trước.",
"thisEmailIsAlreadyInUse": "Email này đã được sử dụng",

View File

@@ -156,6 +156,7 @@
"twoFactorAuthTitle": "两步验证",
"passkeyAuthTitle": "通行密钥验证",
"verifyPasskey": "验证通行密钥",
"loginWithTOTP": "使用 TOTP 登录",
"recoverAccount": "恢复账户",
"enterRecoveryKeyHint": "输入您的恢复密钥",
"recover": "恢复",
@@ -181,7 +182,7 @@
"createNewAccount": "创建新账号",
"weakStrength": "弱",
"strongStrength": "强",
"moderateStrength": "中",
"moderateStrength": "中",
"confirmPassword": "请确认密码",
"close": "关闭",
"oopsSomethingWentWrong": "哎呀,出了点问题。",
@@ -263,7 +264,7 @@
"invalidRecoveryKey": "您输入的恢复密钥无效。请确保它包含24个单词并检查每个单词的拼写。\n\n如果您输入了旧的恢复码请确保它长度为64个字符并检查其中每个字符。",
"recreatePasswordTitle": "重新创建密码",
"recreatePasswordBody": "当前设备的功能不足以验证您的密码,但我们可以以适用于所有设备的方式重新生成。\n\n请使用您的恢复密钥登录并重新生成您的密码如果您愿意可以再次使用相同的密码。",
"invalidKey": "无效的密钥",
"invalidKey": "密钥无效",
"tryAgain": "请再试一次",
"viewRecoveryKey": "查看恢复密钥",
"confirmRecoveryKey": "确认恢复密钥",
@@ -293,7 +294,7 @@
"youAreOnTheLatestVersion": "当前为最新版本",
"warning": "警告",
"exportWarningDesc": "导出的文件包含敏感信息。请安全存储。",
"iUnderStand": "我明白了",
"iUnderStand": "了",
"@iUnderStand": {
"description": "Text for the button to confirm the user understands the warning"
},
@@ -374,7 +375,7 @@
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
},
"androidBiometricNotRecognized": "未能识别。再试一次。",
"androidBiometricNotRecognized": "未能识别,请重试。",
"@androidBiometricNotRecognized": {
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
},
@@ -418,7 +419,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": "好",
"iOSOkButton": "好",
"@iOSOkButton": {
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
},
@@ -434,7 +435,7 @@
"waitingForBrowserRequest": "正在等待浏览器请求...",
"waitingForVerification": "等待验证...",
"passkey": "通行密钥",
"passKeyPendingVerification": "仍需进行验证",
"passKeyPendingVerification": "仍需验证",
"loginSessionExpired": "会话已过期",
"loginSessionExpiredDetails": "您的会话已过期。请重新登录。",
"developerSettingsWarning": "您确定要修改开发者设置吗?",

View File

@@ -59,21 +59,22 @@ class TagChip extends StatelessWidget {
),
child: Row(
children: [
if (iconData != null) ...[
if (iconData != null)
Icon(
iconData,
size: 16,
size: label.isNotEmpty ? 16 : 20,
color: color,
),
if (iconData != null && label.isNotEmpty)
const SizedBox(width: 8),
],
Text(
label,
style: TextStyle(
color: color,
fontSize: 14,
if (label.isNotEmpty)
Text(
label,
style: TextStyle(
color: color,
fontSize: 14,
),
),
),
],
),
),

View File

@@ -2,6 +2,14 @@ import 'package:ente_auth/core/event_bus.dart';
import 'package:ente_auth/events/icons_changed_event.dart';
import 'package:shared_preferences/shared_preferences.dart';
enum CodeSortKey {
issuerName,
accountName,
mostFrequentlyUsed,
recentlyUsed,
manual,
}
class PreferenceService {
PreferenceService._privateConstructor();
static final PreferenceService instance =
@@ -28,6 +36,15 @@ class PreferenceService {
}
}
CodeSortKey codeSortKey() {
return CodeSortKey
.values[_prefs.getInt("codeSortKey") ?? CodeSortKey.manual.index];
}
Future<void> setCodeSortKey(CodeSortKey key) async {
await _prefs.setInt("codeSortKey", key.index);
}
Future<void> setHasShownCoachMark(bool value) {
return _prefs.setBool(kHasShownCoachMarkKey, value);
}

View File

@@ -59,9 +59,9 @@ class UpdateService {
return _latestVersion;
}
Future<void> showUpdateNotification() async {
Future<bool> showUpdateNotification() async {
if (!isIndependent()) {
return;
return false;
}
final shouldUpdate = await this.shouldUpdate();
final lastNotificationShownTime =
@@ -72,15 +72,19 @@ class UpdateService {
if (shouldUpdate &&
hasBeen3DaysSinceLastNotification &&
_latestVersion!.shouldNotify!) {
unawaited(
NotificationService.instance.showNotification(
"Update available",
"Click to install our best version yet",
),
);
await _prefs.setInt(kUpdateAvailableShownTimeKey, now);
if (Platform.isAndroid) {
unawaited(
NotificationService.instance.showNotification(
"Update available",
"Click to install our best version yet",
),
);
}
return true;
} else {
_logger.info("Debouncing notification");
return false;
}
}

View File

@@ -380,7 +380,8 @@ class UserService {
Widget page;
final String passkeySessionID = response.data["passkeySessionID"];
String twoFASessionID = response.data["twoFactorSessionID"];
if (twoFASessionID.isEmpty) {
if (twoFASessionID.isEmpty &&
response.data["twoFactorSessionIDV2"] != null) {
twoFASessionID = response.data["twoFactorSessionIDV2"];
}
if (passkeySessionID.isNotEmpty) {
@@ -692,7 +693,8 @@ class UserService {
Widget? page;
final String passkeySessionID = response.data["passkeySessionID"];
String twoFASessionID = response.data["twoFactorSessionID"];
if (twoFASessionID.isEmpty) {
if (twoFASessionID.isEmpty &&
response.data["twoFactorSessionIDV2"] != null) {
twoFASessionID = response.data["twoFactorSessionIDV2"];
}
Configuration.instance.setVolatilePassword(userPassword);

View File

@@ -25,22 +25,42 @@ class CodeStore {
}
Future<bool> saveUpadedIndexes(List<Code> codes) async {
int changedCount = 0;
final existingAllCodes = await getAllCodes();
final existingPosition = {};
for (final code in existingAllCodes) {
if (code.hasError || code.isTrashed) {
continue;
}
existingPosition[code.generatedID] = code.display.position;
}
for (final code in codes) {
if (code.hasError || code.isTrashed) {
continue;
}
Code? c = _cacheCodes[code.generatedID];
if (c == null) {
int? oldIndex = existingPosition[code.generatedID];
if (oldIndex == null) {
continue;
}
int oldIndex = c.display.position;
int newIndex = codes.indexOf(code);
if (oldIndex != newIndex) {
Code updatedCode =
c.copyWith(display: c.display.copyWith(position: newIndex));
await addCode(updatedCode);
code.copyWith(display: code.display.copyWith(position: newIndex));
await addCode(
updatedCode,
shouldSync: false,
existingAllCodes: existingAllCodes,
);
changedCount++;
}
}
_logger.info("changedCount index for $changedCount codes");
if (changedCount > 0 &&
_authenticatorService.getAccountMode() == AccountMode.online) {
_authenticatorService.onlineSync().ignore();
}
return true;
}
@@ -115,9 +135,10 @@ class CodeStore {
Code code, {
bool shouldSync = true,
AccountMode? accountMode,
List<Code>? existingAllCodes,
}) async {
final mode = accountMode ?? _authenticatorService.getAccountMode();
final allCodes = await getAllCodes(accountMode: mode);
final allCodes = existingAllCodes ?? (await getAllCodes(accountMode: mode));
bool isExistingCode = false;
bool hasSameCode = false;
for (final existingCode in allCodes) {

View File

@@ -49,8 +49,12 @@ class _LoginPageState extends State<LoginPage> {
),
);
} else {
await UserService.instance
.sendOtt(context, _email!, isCreateAccountScreen: false);
await UserService.instance.sendOtt(
context,
_email!,
isCreateAccountScreen: false,
purpose: 'login',
);
}
FocusScope.of(context).unfocus();
}

View File

@@ -32,11 +32,13 @@ import 'package:move_to_background/move_to_background.dart';
class CodeWidget extends StatefulWidget {
final Code code;
final bool isCompactMode;
final CodeSortKey? sortKey;
const CodeWidget(
this.code, {
super.key,
required this.isCompactMode,
this.sortKey,
});
@override
@@ -55,6 +57,7 @@ class _CodeWidgetState extends State<CodeWidget> {
bool isMaskingEnabled = false;
int _codeTimeStep = -1;
int lastRefreshTime = 0;
bool ignorePin = false;
@override
void initState() {
@@ -97,6 +100,7 @@ class _CodeWidgetState extends State<CodeWidget> {
@override
Widget build(BuildContext context) {
ignorePin = widget.sortKey == null || widget.sortKey == CodeSortKey.manual;
final colorScheme = getEnteColorScheme(context);
if (isMaskingEnabled != PreferenceService.instance.shouldHideCodes()) {
isMaskingEnabled = PreferenceService.instance.shouldHideCodes();
@@ -115,7 +119,7 @@ class _CodeWidgetState extends State<CodeWidget> {
Widget getCardContents(AppLocalizations l10n) {
return Stack(
children: [
if (widget.code.isPinned)
if (!ignorePin && widget.code.isPinned)
Align(
alignment: Alignment.topRight,
child: CustomPaint(
@@ -169,7 +173,7 @@ class _CodeWidgetState extends State<CodeWidget> {
: const SizedBox(height: 32),
],
),
if (widget.code.isPinned) ...[
if (!ignorePin && widget.code.isPinned) ...[
Align(
alignment: Alignment.topRight,
child: Padding(
@@ -222,6 +226,7 @@ class _CodeWidgetState extends State<CodeWidget> {
builder: (_) {
return BottomActionBarWidget(
code: widget.code,
showPin: !ignorePin,
onEdit: () => _onEditPressed(true),
onShare: () => _onSharePressed(true),
onPin: () => _onPinPressed(true),
@@ -270,7 +275,7 @@ class _CodeWidgetState extends State<CodeWidget> {
icon: Icons.notes_outlined,
onSelected: () => _onShowNotesPressed(null),
),
if (!widget.code.isTrashed)
if (!widget.code.isTrashed && !ignorePin)
MenuItem(
label:
widget.code.isPinned ? l10n.unpinText : l10n.pinText,
@@ -454,11 +459,12 @@ class _CodeWidgetState extends State<CodeWidget> {
);
}
void _copyCurrentOTPToClipboard() async {
void _copyCurrentOTPToClipboard() {
_copyToClipboard(
_getCurrentOTP(),
confirmationMessage: context.l10n.copiedToClipboard,
);
_udateCodeMetadata().ignore();
}
void _copyNextToClipboard() {
@@ -466,6 +472,26 @@ class _CodeWidgetState extends State<CodeWidget> {
_getNextTotp(),
confirmationMessage: context.l10n.copiedNextToClipboard,
);
_udateCodeMetadata().ignore();
}
Future<void> _udateCodeMetadata() async {
if (widget.sortKey == null) return;
Future.delayed(const Duration(milliseconds: 100), () {
if (mounted) {
if (widget.sortKey == CodeSortKey.mostFrequentlyUsed ||
widget.sortKey == CodeSortKey.recentlyUsed) {
final display = widget.code.display;
final Code code = widget.code.copyWith(
display: display.copyWith(
tapCount: display.tapCount + 1,
lastUsedAt: DateTime.now().microsecondsSinceEpoch,
),
);
unawaited(CodeStore.instance.addCode(code));
}
}
});
}
void _copyToClipboard(

View File

@@ -19,10 +19,12 @@ class BottomActionBarWidget extends StatelessWidget {
final VoidCallback? onRestore;
final VoidCallback? onDelete;
final VoidCallback? onTrashed;
final bool showPin;
const BottomActionBarWidget({
required this.code,
this.onCancel,
this.showPin = true,
this.backgroundColor,
super.key,
this.onShare,
@@ -65,6 +67,7 @@ class BottomActionBarWidget extends StatelessWidget {
const SizedBox(height: 8),
CodeSelectionActionsWidget(
code: code,
showPin: showPin,
onShare: onShare,
onPin: onPin,
onShowQR: onShowQR,

View File

@@ -16,7 +16,7 @@ class IconButtonWidget extends StatefulWidget {
final Color? defaultColor;
final Color? pressedColor;
final Color? iconColor;
const IconButtonWidget({
const IconButtonWidget({
super.key,
required this.icon,
required this.iconButtonType,

View File

@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
class CodeSelectionActionsWidget extends StatefulWidget {
final Code code;
final bool showPin;
final VoidCallback? onShare;
final VoidCallback? onPin;
final VoidCallback? onShowQR;
@@ -16,6 +17,7 @@ class CodeSelectionActionsWidget extends StatefulWidget {
const CodeSelectionActionsWidget({
super.key,
required this.code,
this.showPin = true,
this.onShare,
this.onPin,
this.onShowQR,
@@ -54,16 +56,18 @@ class _CodeSelectionActionsWidgetState
onTap: widget.onShare,
),
);
items.add(
SelectionActionButton(
labelText: widget.code.isPinned
? context.l10n.unpinText
: context.l10n.pinText,
icon: widget.code.isPinned ? Icons.push_pin : Icons.push_pin_outlined,
onTap: widget.onPin,
),
);
if (widget.showPin) {
items.add(
SelectionActionButton(
labelText: widget.code.isPinned
? context.l10n.unpinText
: context.l10n.pinText,
icon:
widget.code.isPinned ? Icons.push_pin : Icons.push_pin_outlined,
onTap: widget.onPin,
),
);
}
items.add(
SelectionActionButton(

View File

@@ -31,6 +31,7 @@ import 'package:ente_auth/ui/home/speed_dial_label_widget.dart';
import 'package:ente_auth/ui/reorder_codes_page.dart';
import 'package:ente_auth/ui/scanner_page.dart';
import 'package:ente_auth/ui/settings_page.dart';
import 'package:ente_auth/ui/sort_option_menu.dart';
import 'package:ente_auth/ui/tools/app_lock.dart';
import 'package:ente_auth/utils/dialog_util.dart';
import 'package:ente_auth/utils/platform_util.dart';
@@ -80,10 +81,13 @@ class _HomePageState extends State<HomePage> {
bool hasNonTrashedCodes = false;
bool isCompactMode = false;
late CodeSortKey _codeSortKey;
@override
void initState() {
super.initState();
_textController.addListener(_applyFilteringAndRefresh);
_codeSortKey = PreferenceService.instance.codeSortKey();
_loadCodes();
_streamSubscription = Bus.instance.on<CodesUpdatedEvent>().listen((event) {
_loadCodes();
@@ -92,6 +96,7 @@ class _HomePageState extends State<HomePage> {
Bus.instance.on<TriggerLogoutEvent>().listen((event) async {
await autoLogoutAlert(context);
});
_initDeepLinks();
Future.delayed(
const Duration(seconds: 1),
@@ -110,13 +115,15 @@ class _HomePageState extends State<HomePage> {
_allCodes = codes;
hasTrashedCodes = false;
hasNonTrashedCodes = false;
for (final c in _allCodes ?? []) {
if (c.isTrashed) {
hasTrashedCodes = true;
} else {
hasNonTrashedCodes = true;
}
if (hasNonTrashedCodes && hasTrashedCodes) {
if (hasTrashedCodes && hasNonTrashedCodes) {
break;
}
}
@@ -188,8 +195,7 @@ class _HomePageState extends State<HomePage> {
[];
}
_filteredCodes
.sort((a, b) => a.display.position.compareTo(b.display.position));
sortFilteredCodes(_filteredCodes, _codeSortKey);
if (mounted) {
setState(() {});
@@ -208,6 +214,40 @@ class _HomePageState extends State<HomePage> {
super.dispose();
}
void sortFilteredCodes(List<Code> codes, CodeSortKey sortKey) {
switch (sortKey) {
case CodeSortKey.issuerName:
codes.sort((a, b) => a.issuer.compareTo(b.issuer));
break;
case CodeSortKey.accountName:
codes.sort((a, b) => a.account.compareTo(b.account));
break;
case CodeSortKey.mostFrequentlyUsed:
codes.sort((a, b) => b.display.tapCount.compareTo(a.display.tapCount));
break;
case CodeSortKey.recentlyUsed:
codes.sort(
(a, b) => b.display.lastUsedAt.compareTo(a.display.lastUsedAt),
);
break;
case CodeSortKey.manual:
default:
codes.sort((a, b) => a.display.position.compareTo(b.display.position));
break;
}
if (sortKey != CodeSortKey.manual) {
// move pinned codes to the using
int insertIndex = 0;
for (int i = 0; i < codes.length; i++) {
if (codes[i].isPinned) {
final code = codes.removeAt(i);
codes.insert(insertIndex, code);
insertIndex++;
}
}
}
}
Future<void> _redirectToScannerPage() async {
final Code? code = await Navigator.of(context).push(
MaterialPageRoute(
@@ -261,10 +301,15 @@ class _HomePageState extends State<HomePage> {
}
Future<void> navigateToReorderPage(List<Code> allCodes) async {
List<Code> sortCandidate = allCodes
.where((element) => !element.hasError && !element.isTrashed)
.toList();
sortCandidate
.sort((a, b) => a.display.position.compareTo(b.display.position));
await Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return ReorderCodesPage(codes: _filteredCodes);
return ReorderCodesPage(codes: sortCandidate);
},
),
).then((value) {
@@ -327,11 +372,20 @@ class _HomePageState extends State<HomePage> {
),
centerTitle: PlatformUtil.isDesktop() ? false : true,
actions: <Widget>[
IconButton(
icon: const Icon(Icons.edit),
tooltip: l10n.edit,
onPressed: () {
navigateToReorderPage(_allCodes!);
SortCodeMenuWidget(
currentKey: PreferenceService.instance.codeSortKey(),
onSelected: (newOrder) async {
await PreferenceService.instance.setCodeSortKey(newOrder);
if (newOrder == CodeSortKey.manual &&
newOrder == _codeSortKey) {
await navigateToReorderPage(_allCodes!);
}
setState(() {
_codeSortKey = newOrder;
});
if (mounted) {
_applyFilteringAndRefresh();
}
},
),
PlatformUtil.isDesktop()
@@ -362,10 +416,7 @@ class _HomePageState extends State<HomePage> {
_searchText = _textController.text;
// Request focus on the search box
// For Windows and macOS only for now. This if statement can be removed if other platforms has been tested.
if (Platform.isWindows || Platform.isMacOS) {
searchBoxFocusNode.requestFocus();
}
searchBoxFocusNode.requestFocus();
}
_applyFilteringAndRefresh();
},
@@ -421,11 +472,13 @@ class _HomePageState extends State<HomePage> {
onTap: () {
selectedTag = "";
_isTrashOpen = false;
setState(() {});
_applyFilteringAndRefresh();
},
);
}
if (index == itemCount - 1 && hasTrashedCodes) {
return TagChip(
label: l10n.trash,
@@ -441,25 +494,29 @@ class _HomePageState extends State<HomePage> {
iconData: Icons.delete,
);
}
return TagChip(
label: tags[index - 1],
action: TagChipAction.menu,
state: selectedTag == tags[index - 1]
? TagChipState.selected
: TagChipState.unselected,
onTap: () {
_isTrashOpen = false;
if (selectedTag == tags[index - 1]) {
selectedTag = "";
final customTagIndex = index - 1;
if (customTagIndex >= 0 && customTagIndex < tags.length) {
return TagChip(
label: tags[customTagIndex],
action: TagChipAction.menu,
state: selectedTag == tags[customTagIndex]
? TagChipState.selected
: TagChipState.unselected,
onTap: () {
_isTrashOpen = false;
if (selectedTag == tags[customTagIndex]) {
selectedTag = "";
setState(() {});
_applyFilteringAndRefresh();
return;
}
selectedTag = tags[customTagIndex];
setState(() {});
_applyFilteringAndRefresh();
return;
}
selectedTag = tags[index - 1];
setState(() {});
_applyFilteringAndRefresh();
},
);
},
);
}
return const SizedBox.shrink();
},
),
),
@@ -488,6 +545,7 @@ class _HomePageState extends State<HomePage> {
key: ValueKey('${code.hashCode}_$newIndex'),
code,
isCompactMode: isCompactMode,
sortKey: _codeSortKey,
),
);
}),

View File

@@ -1,4 +1,5 @@
import 'dart:ui';
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/models/code.dart';
import 'package:ente_auth/services/preference_service.dart';
import 'package:ente_auth/store/code_store.dart';
@@ -34,7 +35,7 @@ class _ReorderCodesPageState extends State<ReorderCodesPage> {
},
child: Scaffold(
appBar: AppBar(
title: const Text("Edit Codes"),
title: Text(context.l10n.editOrder),
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () async {
@@ -44,66 +45,6 @@ class _ReorderCodesPageState extends State<ReorderCodesPage> {
}
},
),
actions: [
PopupMenuButton(
icon: const Icon(Icons.sort),
onSelected: (int value) {
selectedSortOption = value;
switch (value) {
case 0:
sortByIssuer();
break;
case 1:
sortByAccount();
break;
case 2:
setState(() {});
break;
}
},
itemBuilder: (context) => [
PopupMenuItem(
value: 0,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
selectedSortOption == 0
? const Icon(Icons.check)
: const SizedBox.square(dimension: 24),
const SizedBox(width: 10),
const Text("Issuer"),
],
),
),
PopupMenuItem(
value: 1,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
selectedSortOption == 1
? const Icon(Icons.check)
: const SizedBox.square(dimension: 24),
const SizedBox(width: 10),
const Text("Account"),
],
),
),
PopupMenuItem(
value: 2,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
selectedSortOption == 2
? const Icon(Icons.check)
: const SizedBox.square(dimension: 24),
const SizedBox(width: 10),
const Text("Manual"),
],
),
),
],
),
],
),
body: ReorderableListView(
buildDefaultDragHandles: false,
@@ -158,14 +99,4 @@ class _ReorderCodesPageState extends State<ReorderCodesPage> {
widget.codes.insert(newIndex, code);
});
}
void sortByIssuer() {
widget.codes.sort((a, b) => a.issuer.compareTo(b.issuer));
setState(() {});
}
void sortByAccount() {
widget.codes.sort((a, b) => a.account.compareTo(b.account));
setState(() {});
}
}

View File

@@ -0,0 +1,79 @@
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/services/preference_service.dart';
import 'package:flutter/material.dart';
class SortCodeMenuWidget extends StatelessWidget {
final CodeSortKey currentKey;
final void Function(CodeSortKey) onSelected;
const SortCodeMenuWidget({
super.key,
required this.currentKey,
required this.onSelected,
});
@override
Widget build(BuildContext context) {
Text sortOptionText(CodeSortKey key) {
String text = key.toString();
switch (key) {
case CodeSortKey.issuerName:
text = context.l10n.codeIssuerHint;
break;
case CodeSortKey.accountName:
text = context.l10n.account;
break;
case CodeSortKey.mostFrequentlyUsed:
text = context.l10n.mostFrequentlyUsed;
break;
case CodeSortKey.recentlyUsed:
text = context.l10n.mostRecentlyUsed;
break;
case CodeSortKey.manual:
text = context.l10n.manualSort;
}
return Text(
text,
style: Theme.of(context).textTheme.titleMedium!.copyWith(
fontSize: 14,
color: Theme.of(context).iconTheme.color!.withOpacity(0.7),
),
);
}
return GestureDetector(
onTapDown: (TapDownDetails details) async {
final int? selectedValue = await showMenu<int>(
context: context,
position: RelativeRect.fromLTRB(
details.globalPosition.dx,
details.globalPosition.dy,
details.globalPosition.dx,
details.globalPosition.dy + 300,
),
items: List.generate(CodeSortKey.values.length, (index) {
return PopupMenuItem(
value: index,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
sortOptionText(CodeSortKey.values[index]),
if (CodeSortKey.values[index] == currentKey)
Icon(
CodeSortKey.values[index] == CodeSortKey.manual
? Icons.mode_edit
: Icons.check,
color: Theme.of(context).iconTheme.color,
),
],
),
);
}),
);
if (selectedValue != null) {
onSelected(CodeSortKey.values[selectedValue]);
}
},
child: const Icon(Icons.sort_outlined),
);
}
}

View File

@@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:ente_auth/ente_theme_data.dart';
import 'package:ente_auth/theme/ente_theme.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
@@ -30,8 +31,12 @@ class IconUtils {
}) {
final providerTitle = _getProviderTitle(provider);
final List<String> titlesList = [providerTitle];
titlesList.addAll(_titleSplitCharacters.where((char) => providerTitle.contains(char)).map((char) => providerTitle.split(char)[0]));
for(final title in titlesList){
titlesList.addAll(
_titleSplitCharacters
.where((char) => providerTitle.contains(char))
.map((char) => providerTitle.split(char)[0]),
);
for (final title in titlesList) {
if (_customIcons.containsKey(title)) {
return _getSVGIcon(
"assets/custom-icons/icons/${_customIcons[title]!.slug ?? title}.svg",
@@ -55,7 +60,8 @@ class IconUtils {
return CircleAvatar(
radius: width / 2,
backgroundColor: getEnteColorScheme(context).avatarColors[
providerTitle.hashCode % getEnteColorScheme(context).avatarColors.length],
providerTitle.hashCode %
getEnteColorScheme(context).avatarColors.length],
child: Text(
providerTitle.toUpperCase()[0],
// fixed color
@@ -137,9 +143,8 @@ class IconUtils {
);
if (icon["altNames"] != null) {
for (final name in icon["altNames"]) {
_customIcons[name.toString()
.replaceAll(' ', '')
.toLowerCase()] = CustomIconData(
_customIcons[name.toString().replaceAll(' ', '').toLowerCase()] =
CustomIconData(
icon["slug"],
icon["hex"],
);
@@ -148,6 +153,9 @@ class IconUtils {
}
} catch (e) {
Logger("IconUtils").severe("Error loading icons", e);
if (kDebugMode) {
rethrow;
}
}
}

View File

@@ -64,16 +64,22 @@ class DirectoryUtils {
),
);
Directory oldDataDir;
Directory newDataDir;
Directory? tempDir;
Directory newDataDir = await getApplicationSupportDirectory();
await newDataDir.create(recursive: true);
if (Platform.isLinux) {
oldDataDir = Directory(
p.join(dataHome.path, "ente_auth"),
);
tempDir = Directory(
Directory tempDir = Directory(
p.join(dataHome.path, "enteauth"),
);
if (tempDir.existsSync()) {
oldDataDir = tempDir;
}
if (await oldDataDir.exists()) {
await copyPath(oldDataDir.path, newDataDir.path);
}
} else if (Platform.isWindows) {
oldDataDir = Directory(
p.join(
@@ -81,12 +87,27 @@ class DirectoryUtils {
"ente",
),
);
tempDir = Directory(
Directory tempDir = Directory(
p.join(
(await getApplicationDocumentsDirectory()).path,
"enteauth",
),
);
if (tempDir.existsSync()) {
oldDataDir = tempDir;
databaseFile = File(
p.join(
tempDir.path,
".ente.authenticator.db",
),
);
offlineDatabaseFile = File(
p.join(
tempDir.path,
".ente.offline_authenticator.db",
),
);
}
} else {
oldDataDir = await getApplicationDocumentsDirectory();
databaseFile = File(
@@ -103,12 +124,6 @@ class DirectoryUtils {
);
}
if (tempDir?.existsSync() ?? false) {
oldDataDir = tempDir!;
}
newDataDir = await getApplicationSupportDirectory();
await newDataDir.create(recursive: true);
final prefix = Platform.isMacOS ? "" : ".";
File newDatabaseFile =
File(p.join(newDataDir.path, "${prefix}ente.authenticator.db"));
@@ -124,10 +139,6 @@ class DirectoryUtils {
await offlineDatabaseFile.copy(newOfflineDatabaseFile.path);
}
if (Platform.isLinux && await oldDataDir.exists()) {
await copyPath(oldDataDir.path, newDataDir.path);
}
sharedPrefs.setBool(migratedNamingChanges, true).ignore();
} catch (e, st) {
logger.warning("Migrating Database failed!", e, st);

View File

@@ -4,8 +4,6 @@ PODS:
- connectivity_plus (0.0.1):
- Flutter
- FlutterMacOS
- desktop_webview_window (0.0.1):
- FlutterMacOS
- device_info_plus (0.0.1):
- FlutterMacOS
- file_saver (0.0.1):
@@ -74,7 +72,6 @@ PODS:
DEPENDENCIES:
- app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`)
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin`)
- desktop_webview_window (from `Flutter/ephemeral/.symlinks/plugins/desktop_webview_window/macos`)
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
- file_saver (from `Flutter/ephemeral/.symlinks/plugins/file_saver/macos`)
- flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos`)
@@ -107,8 +104,6 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/app_links/macos
connectivity_plus:
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin
desktop_webview_window:
:path: Flutter/ephemeral/.symlinks/plugins/desktop_webview_window/macos
device_info_plus:
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
file_saver:
@@ -153,7 +148,6 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
app_links: 10e0a0ab602ffaf34d142cd4862f29d34b303b2a
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
desktop_webview_window: 89bb3d691f4c80314a10be312f4cd35db93a9d5a
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
file_saver: 44e6fbf666677faf097302460e214e977fdd977b
flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b

View File

@@ -719,10 +719,10 @@ packages:
dependency: "direct main"
description:
name: flutter_svg
sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
sha256: "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123"
url: "https://pub.dev"
source: hosted
version: "2.0.10+1"
version: "2.0.16"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -1719,10 +1719,10 @@ packages:
dependency: transitive
description:
name: vector_graphics
sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.15"
vector_graphics_codec:
dependency: transitive
description:
@@ -1735,10 +1735,10 @@ packages:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.16"
vector_math:
dependency: transitive
description:

View File

@@ -1,6 +1,6 @@
name: ente_auth
description: ente two-factor authenticator
version: 4.1.1+411
version: 4.1.6+416
publish_to: none
environment:
@@ -56,7 +56,7 @@ dependencies:
flutter_secure_storage: ^9.0.0
flutter_speed_dial: ^7.0.0
flutter_staggered_grid_view: ^0.7.0
flutter_svg: ^2.0.5
flutter_svg: ^2.0.16
fluttertoast: ^8.1.1
google_nav_bar: ^5.0.5 #supported
gradient_borders: ^1.0.0

View File

@@ -20,7 +20,6 @@ var ctrl *pkg.ClICtrl
var rootCmd = &cobra.Command{
Use: "ente",
Short: "CLI tool for exporting your photos from ente.io",
Long: `Start by creating a config file in your home directory:`,
// Uncomment the following line if your bare application
// has an action associated with it:
Run: func(cmd *cobra.Command, args []string) {

View File

@@ -119,16 +119,17 @@ func initConfig(cliConfigDir string) {
// GetCLIConfigDir returns the path to the .ente-cli folder and creates it if it doesn't exist.
func GetCLIConfigDir() (string, error) {
var configDir = os.Getenv("ENTE_CLI_CONFIG_DIR")
if configDir == "" {
// for backward compatibility, check for ENTE_CLI_CONFIG_PATH
configDir = os.Getenv("ENTE_CLI_CONFIG_PATH")
}
if configDir == "" {
// for backward compatibility, check for ENTE_CLI_CONFIG_PATH
configDir = os.Getenv("ENTE_CLI_CONFIG_PATH")
}
if configDir != "" {
// remove trailing slash (for all OS)
configDir = strings.TrimSuffix(configDir, string(filepath.Separator))
return configDir, nil
}
// Get the user's home directory
homeDir, err := os.UserHomeDir()
if err != nil {

View File

@@ -37,7 +37,9 @@ func GetOrCreateClISecret() []byte {
if IsRunningInContainer() {
return GetSecretFromSecretText(fmt.Sprintf("%s.secret.txt", constants.CliDataPath))
} else {
log.Fatal(fmt.Errorf("error getting password from keyring: %w", err))
log.Fatal(fmt.Errorf(`error getting password from keyring: %w
Refer to https://help.ente.io/self-hosting/troubleshooting/keyring
`, err))
}
}
key := make([]byte, keyLength)

View File

@@ -1,10 +1,13 @@
# CHANGELOG
## v1.7.7 (Unreleased)
## v1.7.8 (Unreleased)
- .
## v1.7.7
- Retain JPEG originals even on date modifications.
- Support Portuguese and Vietnamese translations.
- .
## v1.7.6

View File

@@ -1,6 +1,6 @@
{
"name": "ente",
"version": "1.7.7-beta",
"version": "1.7.8-beta",
"private": true,
"description": "Desktop client for Ente Photos",
"repository": "github:ente-io/photos-desktop",
@@ -30,14 +30,14 @@
"clip-bpe-js": "^0.0.6",
"comlink": "^4.4.2",
"compare-versions": "^6.1.1",
"electron-log": "^5.2.2",
"electron-log": "^5.2.3",
"electron-store": "^8.2.0",
"electron-updater": "^6.3.9",
"ffmpeg-static": "^5.2.0",
"lru-cache": "^11.0.2",
"next-electron-server": "^1.0.0",
"node-stream-zip": "^1.15.0",
"onnxruntime-node": "^1.20.0"
"onnxruntime-node": "^1.20.1"
},
"devDependencies": {
"@eslint/js": "^9.15.0",
@@ -48,15 +48,15 @@
"ajv": "^8.17.1",
"concurrently": "^9.1.0",
"cross-env": "^7.0.3",
"electron": "^33.2.0",
"electron": "^33.2.1",
"electron-builder": "^25.1.8",
"eslint": "^9",
"prettier": "^3.3.3",
"prettier": "3.3.3",
"prettier-plugin-organize-imports": "^4.1.0",
"prettier-plugin-packagejson": "^2.5.3",
"prettier-plugin-packagejson": "^2.5.6",
"shx": "^0.3.4",
"typescript": "^5.6.3",
"typescript-eslint": "^8.14.0"
"typescript": "^5.7.2",
"typescript-eslint": "^8.16.0"
},
"packageManager": "yarn@1.22.22",
"productName": "ente"

View File

@@ -384,62 +384,62 @@
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz#7dc0e419c87beadc8f554bf5a42e5009ed3748dc"
integrity sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==
"@typescript-eslint/eslint-plugin@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz#ac56825bcdf3b392fc76a94b1315d4a162f201a6"
integrity sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.14.0"
"@typescript-eslint/type-utils" "8.14.0"
"@typescript-eslint/utils" "8.14.0"
"@typescript-eslint/visitor-keys" "8.14.0"
"@typescript-eslint/scope-manager" "8.16.0"
"@typescript-eslint/type-utils" "8.16.0"
"@typescript-eslint/utils" "8.16.0"
"@typescript-eslint/visitor-keys" "8.16.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/parser@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.14.0.tgz#0a7e9dbc11bc07716ab2d7b1226217e9f6b51fc8"
integrity sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==
"@typescript-eslint/parser@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.16.0.tgz#ee5b2d6241c1ab3e2e53f03fd5a32d8e266d8e06"
integrity sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==
dependencies:
"@typescript-eslint/scope-manager" "8.14.0"
"@typescript-eslint/types" "8.14.0"
"@typescript-eslint/typescript-estree" "8.14.0"
"@typescript-eslint/visitor-keys" "8.14.0"
"@typescript-eslint/scope-manager" "8.16.0"
"@typescript-eslint/types" "8.16.0"
"@typescript-eslint/typescript-estree" "8.16.0"
"@typescript-eslint/visitor-keys" "8.16.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz#01f37c147a735cd78f0ff355e033b9457da1f373"
integrity sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==
"@typescript-eslint/scope-manager@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz#ebc9a3b399a69a6052f3d88174456dd399ef5905"
integrity sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==
dependencies:
"@typescript-eslint/types" "8.14.0"
"@typescript-eslint/visitor-keys" "8.14.0"
"@typescript-eslint/types" "8.16.0"
"@typescript-eslint/visitor-keys" "8.16.0"
"@typescript-eslint/type-utils@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz#455c6af30c336b24a1af28bc4f81b8dd5d74d94d"
integrity sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==
"@typescript-eslint/type-utils@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz#585388735f7ac390f07c885845c3d185d1b64740"
integrity sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==
dependencies:
"@typescript-eslint/typescript-estree" "8.14.0"
"@typescript-eslint/utils" "8.14.0"
"@typescript-eslint/typescript-estree" "8.16.0"
"@typescript-eslint/utils" "8.16.0"
debug "^4.3.4"
ts-api-utils "^1.3.0"
"@typescript-eslint/types@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.14.0.tgz#0d33d8d0b08479c424e7d654855fddf2c71e4021"
integrity sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==
"@typescript-eslint/types@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.16.0.tgz#49c92ae1b57942458ab83d9ec7ccab3005e64737"
integrity sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==
"@typescript-eslint/typescript-estree@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz#a7a3a5a53a6c09313e12fb4531d4ff582ee3c312"
integrity sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==
"@typescript-eslint/typescript-estree@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz#9d741e56e5b13469b5190e763432ce5551a9300c"
integrity sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==
dependencies:
"@typescript-eslint/types" "8.14.0"
"@typescript-eslint/visitor-keys" "8.14.0"
"@typescript-eslint/types" "8.16.0"
"@typescript-eslint/visitor-keys" "8.16.0"
debug "^4.3.4"
fast-glob "^3.3.2"
is-glob "^4.0.3"
@@ -447,23 +447,23 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/utils@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.14.0.tgz#ac2506875e03aba24e602364e43b2dfa45529dbd"
integrity sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==
"@typescript-eslint/utils@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.16.0.tgz#c71264c437157feaa97842809836254a6fc833c3"
integrity sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "8.14.0"
"@typescript-eslint/types" "8.14.0"
"@typescript-eslint/typescript-estree" "8.14.0"
"@typescript-eslint/scope-manager" "8.16.0"
"@typescript-eslint/types" "8.16.0"
"@typescript-eslint/typescript-estree" "8.16.0"
"@typescript-eslint/visitor-keys@8.14.0":
version "8.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz#2418d5a54669af9658986ade4e6cfb7767d815ad"
integrity sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==
"@typescript-eslint/visitor-keys@8.16.0":
version "8.16.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz#d5086afc060b01ff7a4ecab8d49d13d5a7b07705"
integrity sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==
dependencies:
"@typescript-eslint/types" "8.14.0"
eslint-visitor-keys "^3.4.3"
"@typescript-eslint/types" "8.16.0"
eslint-visitor-keys "^4.2.0"
"@xmldom/xmldom@^0.8.8":
version "0.8.10"
@@ -1163,13 +1163,6 @@ dir-compare@^4.2.0:
minimatch "^3.0.5"
p-limit "^3.1.0 "
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
dependencies:
path-type "^4.0.0"
dmg-builder@25.1.8:
version "25.1.8"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.8.tgz#41f3b725edd896156e891016a44129e1bd580430"
@@ -1240,10 +1233,10 @@ electron-builder@^25.1.8:
simple-update-notifier "2.0.0"
yargs "^17.6.2"
electron-log@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.2.tgz#cdb0a6dc48178a7cbacb434a268ab097ad5198dc"
integrity sha512-fgvx6srjIHDowJD8WAAjoAXmiTyOz6JnGQoxOtk1mXw7o4S+HutuPHLCsk24xTXqWZgy4uO63NbedG+oEvldLw==
electron-log@^5.2.3:
version "5.2.3"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.3.tgz#b58447b2158b9aa5faa07c4d15340113069d3f15"
integrity sha512-BabCiEV+p362LzY0EFE8hyzeGknzKDWSbhS0VFfRYQGA4FHWXWSfaKJlvTR9LFepNoORXxc/BWvqBXIPgsVFgA==
electron-publish@25.1.7:
version "25.1.7"
@@ -1280,10 +1273,10 @@ electron-updater@^6.3.9:
semver "^7.6.3"
tiny-typed-emitter "^2.1.0"
electron@^33.2.0:
version "33.2.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-33.2.0.tgz#2a7098653eaf1a53c7311a01d5636783019f2354"
integrity sha512-PVw1ICAQDPsnnsmpNFX/b1i/49h67pbSPxuIENd9K9WpGO1tsRaQt+K2bmXqTuoMJsbzIc75Ce8zqtuwBPqawA==
electron@^33.2.1:
version "33.2.1"
resolved "https://registry.yarnpkg.com/electron/-/electron-33.2.1.tgz#d0d7bba7a7abf4f14881d0a6e03c498b301a2d5f"
integrity sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg==
dependencies:
"@electron/get" "^2.0.0"
"@types/node" "^20.9.0"
@@ -1353,7 +1346,7 @@ eslint-scope@^8.0.2:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
eslint-visitor-keys@^3.3.0:
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==
@@ -1363,6 +1356,11 @@ eslint-visitor-keys@^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-visitor-keys@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
eslint@^9:
version "9.9.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.1.tgz#147ac9305d56696fb84cf5bdecafd6517ddc77ec"
@@ -1462,7 +1460,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-glob@^3.3.0, fast-glob@^3.3.2:
fast-glob@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
@@ -1502,6 +1500,11 @@ fd-slicer@~1.1.0:
dependencies:
pend "~1.2.0"
fdir@^6.4.2:
version "6.4.2"
resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689"
integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==
ffmpeg-static@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz#6ca64a5ed6e69ec4896d175c1f69dd575db7c5ef"
@@ -1758,17 +1761,6 @@ globalthis@^1.0.1:
define-properties "^1.2.1"
gopd "^1.0.1"
globby@^13.1.2:
version "13.2.2"
resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592"
integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==
dependencies:
dir-glob "^3.0.1"
fast-glob "^3.3.0"
ignore "^5.2.4"
merge2 "^1.4.1"
slash "^4.0.0"
gopd@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
@@ -1924,7 +1916,7 @@ ieee754@^1.1.13:
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1:
ignore@^5.2.0, ignore@^5.3.1:
version "5.3.2"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
@@ -2267,7 +2259,7 @@ matcher@^3.0.0:
dependencies:
escape-string-regexp "^4.0.0"
merge2@^1.3.0, merge2@^1.4.1:
merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -2551,17 +2543,17 @@ onetime@^5.1.0, onetime@^5.1.2:
dependencies:
mimic-fn "^2.1.0"
onnxruntime-common@1.20.0:
version "1.20.0"
resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.20.0.tgz#e1774cf76ede788838ff7bd4debc8df6feca91f1"
integrity sha512-9ehS4ul5fBszIcHhfxuDgk45lO+Fqrxmrgwk1Pxb1JRvbQiCB/v9Royv95SRCWHktLMviqNjBsEd/biJhd39cg==
onnxruntime-common@1.20.1:
version "1.20.1"
resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.20.1.tgz#b42e317d4d6728745b9e8089617c8cd938d312dc"
integrity sha512-YiU0s0IzYYC+gWvqD1HzLc46Du1sXpSiwzKb63PACIJr6LfL27VsXSXQvt68EzD3V0D5Bc0vyJTjmMxp0ylQiw==
onnxruntime-node@^1.20.0:
version "1.20.0"
resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.20.0.tgz#16dcbe06e7683eee37ccbd3f39ad2beac36c1a24"
integrity sha512-mjLge++8WHfyCZ4IqZ1FbUbtFAfGht7BLCkOeBL1L9PFV27YHwluXkNt7m0Pgf6TR2P5pqVZsD3zqFbFP6QTMw==
onnxruntime-node@^1.20.1:
version "1.20.1"
resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.20.1.tgz#a5ba0bd160aeccdb4b7d36fbc2f6a97bde1f7843"
integrity sha512-di/I4HDXRw+FLgq+TyHmQEDd3cEp9iFFZm0r4uJ1Wd7b/WE1VXtKWo8yemex347c6GNF/3Pv86ZfPhIWxORr0w==
dependencies:
onnxruntime-common "1.20.0"
onnxruntime-common "1.20.1"
tar "^7.0.1"
optionator@^0.9.3:
@@ -2686,11 +2678,6 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pe-library@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/pe-library/-/pe-library-0.4.1.tgz#e269be0340dcb13aa6949d743da7d658c3e2fbea"
@@ -2706,6 +2693,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
picomatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
pkg-up@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
@@ -2732,15 +2724,15 @@ prettier-plugin-organize-imports@^4.1.0:
resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz#f3d3764046a8e7ba6491431158b9be6ffd83b90f"
integrity sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==
prettier-plugin-packagejson@^2.5.3:
version "2.5.3"
resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.3.tgz#a3f9eb02ece197db6b7696be5df43ddc2397ad81"
integrity sha512-ATMEEXr+ywls1kgrZEWl4SBPEm0uDdyDAjyNzUC0/Z8WZTD3RqbJcQDR+Dau+wYkW9KHK6zqQIsFyfn+9aduWg==
prettier-plugin-packagejson@^2.5.6:
version "2.5.6"
resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.6.tgz#cd3cca60e1aa87ee3ce3b4032c1c999798d9f714"
integrity sha512-TY7KiLtyt6Tlf53BEbXUWkN0+TRdHKgIMmtXtDCyHH6yWnZ50Lwq6Vb6lyjapZrhDTXooC4EtlY5iLe1sCgi5w==
dependencies:
sort-package-json "2.10.1"
sort-package-json "2.12.0"
synckit "0.9.2"
prettier@^3.3.3:
prettier@3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"
integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==
@@ -3017,11 +3009,6 @@ simple-update-notifier@2.0.0:
dependencies:
semver "^7.5.3"
slash@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
slice-ansi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
@@ -3058,19 +3045,19 @@ sort-object-keys@^1.1.3:
resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45"
integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==
sort-package-json@2.10.1:
version "2.10.1"
resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.10.1.tgz#18e7fa0172233cb2d4d926f7c99e6bfcf4d1d25c"
integrity sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w==
sort-package-json@2.12.0:
version "2.12.0"
resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.12.0.tgz#4196a1ba82ba63c4a512add1d00ab39026bf8ab7"
integrity sha512-/HrPQAeeLaa+vbAH/znjuhwUluuiM/zL5XX9kop8UpDgjtyWKt43hGDk2vd/TBdDpzIyzIHVUgmYofzYrAQjew==
dependencies:
detect-indent "^7.0.1"
detect-newline "^4.0.0"
get-stdin "^9.0.0"
git-hooks-list "^3.0.0"
globby "^13.1.2"
is-plain-obj "^4.1.0"
semver "^7.6.0"
sort-object-keys "^1.1.3"
tinyglobby "^0.2.9"
source-map-support@^0.5.19:
version "0.5.21"
@@ -3206,6 +3193,14 @@ tiny-typed-emitter@^2.1.0:
resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5"
integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==
tinyglobby@^0.2.9:
version "0.2.10"
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f"
integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==
dependencies:
fdir "^6.4.2"
picomatch "^4.0.2"
tmp-promise@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
@@ -3269,24 +3264,24 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript-eslint@^8.14.0:
version "8.14.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.14.0.tgz#2435c0628e90303544fdd63ae311e9bf6d149a5d"
integrity sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==
typescript-eslint@^8.16.0:
version "8.16.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.16.0.tgz#d608c972d6b2461ca10ec30fd3fa62a080baba19"
integrity sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==
dependencies:
"@typescript-eslint/eslint-plugin" "8.14.0"
"@typescript-eslint/parser" "8.14.0"
"@typescript-eslint/utils" "8.14.0"
"@typescript-eslint/eslint-plugin" "8.16.0"
"@typescript-eslint/parser" "8.16.0"
"@typescript-eslint/utils" "8.16.0"
typescript@^5.4.3:
version "5.5.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
typescript@^5.6.3:
version "5.6.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b"
integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==
typescript@^5.7.2:
version "5.7.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6"
integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==
undici-types@~6.19.2:
version "6.19.8"

View File

@@ -155,6 +155,9 @@ who have a rooted android phone running android 6 or newer that passes Play
Integrity.
This way of exporting your data will require a rooted phone.
### Exporting codes using Android OTP Extractor
This uses the tool [Android OTP Extractor](https://github.com/puddly/android-otp-extractor) from [puddly](https://github.com/puddly) on GitHub
1. Install python 3 and adb to your computer you can download binaries for
@@ -185,6 +188,18 @@ it from [Google](https://developer.android.com/tools/releases/platform-tools)
python -m android_otp_extractor --prepend-issuer --include authy
```
### Exporting codes using Aegis Authenticator
This uses the tool [Aegis Authenticator](https://getaegis.app/) from [beemdevelopment](
https://github.com/beemdevelopment).
1. Install Authy and login on your rooted phone.
2. Install Aegis Authenticator from the [Google Play Store](https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis).
3. In the app, click the three dots in the top right corner and click "Import & Export".
4. Click "Import from another app" and choose Authy.
5. The app will ask for root permissions, then automatically import your codes from Authy.
6. Then export the codes from Aegis Authenticator to `json` or `txt` using the "Export to file" option in the "Import & Export" menu.
## Importing to Ente Authenticator (Method 1, method 2.1)
1. Copy the TXT file to one of your devices with Ente Authenticator.

View File

@@ -64,15 +64,6 @@ videos that you imported. The modifications (e.g. date changes) you make within
Ente will be written into a separate metadata JSON file during export so as to
not modify the original.
> [!WARNING]
>
> There used to be one exception to this - for JPEG files, the Exif
> DateTimeOriginal was changed during export from web or desktop apps. This was
> done on a customer request, but in hindsight this was an incorrect change.
>
> We have deprecated this behaviour, and the desktop version 1.7.6 is going to
> be the last version with this exception.
As an example: suppose you have `flower.png`. When you export your library, you
will end up with:

View File

@@ -41,3 +41,7 @@ The first user you create on your instance is treated as an admin.
If you want, you can modify this behaviour by providing an explicit list of
admins in the [configuration](/self-hosting/guides/admin#becoming-an-admin).
### Can I disable registration of new accounts on my self hosted instance?
Yes. See `internal.disable-registration` in local.yaml.

View File

@@ -72,6 +72,7 @@ services:
- ./.credentials.env
volumes:
- custom-logs:/var/logs
- museum.yaml:/museum.yaml:ro
networks:
- internal
@@ -199,22 +200,33 @@ ENTE_KEY_ENCRYPTION=
ENTE_KEY_HASH=
ENTE_JWT_SECRET=
ENTE_S3_B2-EU-CEN_KEY=YOUR_S3_KEY
ENTE_S3_B2-EU-CEN_SECRET=YOUR_S3_SECRET
ENTE_S3_B2-EU-CEN_ENDPOINT=YOUR_S3_ENDPOINT
ENTE_S3_B2-EU-CEN_REGION=YOUR_S3_REGION
ENTE_S3_B2-EU-CEN_BUCKET=YOUR_S3_BUCKET
ENTE_S3_ARE_LOCAL_BUCKETS=false
ENTE_INTERNAL_HARDCODED-OTT_LOCAL-DOMAIN-SUFFIX="@example.com"
ENTE_INTERNAL_HARDCODED-OTT_LOCAL-DOMAIN-VALUE=123456
# if you deploy it on a server under a domain, you need to set the correct value of the following variables
# it can be changed later
# The backend server URL (Museum) to be used by the webapp
ENDPOINT=http://localhost:8080
# The URL of the public albums webapp (also need to be updated in museum.yml so the correct links are generated)
ALBUMS_ENDPOINT=http://localhost:8082
# This is used to generate sharable URLs
ENTE_APPS_PUBLIC-ALBUMS=http://localhost:8082
```
Create the `museum.yaml` with additional configuration, this will be mounted
(read-only) into the container:
```yaml
s3:
are_local_buckets: false
# For some self-hosted S3 deployments you (e.g. Minio) you might need to disable bucket subdomains
use_path_style_urls: true
# The key must be named like so
b2-eu-cen:
key: $YOUR_S3_KEY
secret: $YOUR_S3_SECRET
endpoint: $YOUR_S3_ENDPOINT
region: $YOUR_S3_REGION
bucket: $YOUR_S3_BUCKET_NAME
# The same value as the one specified in ALBUMS_ENDPOINT
apps:
public-albums: http://localhost:8082
```
## 3. Run `docker-compose up`

View File

@@ -0,0 +1 @@
എന്റെ - എൻക്രിപ്റ്റ്ട് ചിത്രസംഭരണി

View File

@@ -1 +1 @@
Fotografie,Familie,Privatsphäre,Cloud,Backup,Video,Foto,Verschlüsselung,Speicher,Album,Alternative
Fotos,Fotografie,Familie,Privatsphäre,Cloud,Backup,Videos,Foto,Verschlüsselung,Speicher,Album,Alternative

View File

@@ -0,0 +1 @@
ഫോട്ടോകൾ, ചിത്രങ്ങൾ, പടങ്ങൾ, ഫോട്ടോഗ്രാഫി, കുടുംബം, ഛായാഗ്രഹണം, സ്വകാര്യത, ക്ലൌഡ്, ബാക്കപ്പ്, വീഡിയോകൾ, ഫോട്ടോ, ചിത്രം, പടം, എൻക്രിപ്ഷൻ, സ്റ്റോറേജ്, ആൽബം, ബദൽ

View File

@@ -0,0 +1 @@
എന്റെ ചിത്രസംഭരണി

View File

@@ -0,0 +1 @@
എൻക്രിപ്റ്റ്ട് ചിത്രസംഭരണം

View File

@@ -1,4 +1,4 @@
Ente es una aplicación simple que guarda automáticamente copias de segurida y organiza tus fotos y vídeos.
Ente es una aplicación simple que guarda automáticamente copias de seguridad y organiza tus fotos y vídeos.
Si has estado buscando una alternativa pro-privacidad para guardar tus recuerdos, has llegado al sitio adecuado. Con Ente, se almacenan cifradas de extremo a extremo (e2ee). Esto significa que solo tú puedes verlas.

View File

@@ -0,0 +1 @@
എന്റെ ചിത്രസംഭരണി

View File

@@ -1,59 +0,0 @@
const List<String> connectWords = [
'a', 'an', 'the', // Articles
'about', 'above', 'across', 'after', 'against', 'along', 'amid', 'among',
'around', 'as', 'at', 'before', 'behind', 'below', 'beneath', 'beside',
'between', 'beyond', 'by', 'concerning', 'considering', 'despite', 'down',
'during', 'except', 'for', 'from', 'in', 'inside', 'into', 'like', 'near',
'of', 'off', 'on', 'onto', 'out', 'outside', 'over', 'past', 'regarding',
'round', 'since', 'through', 'to', 'toward', 'under', 'underneath', 'until',
'unto', 'up', 'upon', 'with', 'within', 'without', // Prepositions
'and', 'as', 'because', 'but', 'for', 'if', 'nor', 'or', 'since', 'so',
'that', 'though', 'unless', 'until', 'when', 'whenever', 'where', 'whereas',
'wherever', 'while', 'yet', // Conjunctions
'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her', 'us', 'them',
'my', 'your', 'his', 'its', 'our', 'their', 'mine', 'yours', 'hers', 'ours',
'theirs', 'who', 'whom', 'whose', 'which', 'what', // Pronouns
'am', 'is', 'are', 'was', 'were', 'be', 'being', 'been', 'have', 'has', 'had',
'do', 'does', 'did', 'will', 'would', 'shall', 'should', 'can', 'could',
'may', 'might', 'must', // Auxiliary Verbs
];
extension StringExtensionsNullSafe on String? {
int get sumAsciiValues {
if (this == null) {
return -1;
}
int sum = 0;
for (int i = 0; i < this!.length; i++) {
sum += this!.codeUnitAt(i);
}
return sum;
}
}
extension DescriptionString on String? {
bool get isAllConnectWords {
if (this == null) {
throw AssertionError("String cannot be null");
}
final subDescWords = this!.split(" ");
return subDescWords.every(
(subDescWord) => connectWords.any(
(connectWord) => subDescWord.toLowerCase() == connectWord,
),
);
}
bool get isLastWordConnectWord {
if (this == null) {
throw AssertionError("String cannot be null");
}
final subDescWords = this!.split(" ");
return connectWords
.any((element) => element == subDescWords.last.toLowerCase());
}
}

View File

@@ -688,7 +688,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Geteiltes Album löschen?"),
"deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage(
"Dieses Album wird für alle gelöscht\n\nDu wirst den Zugriff auf geteilte Fotos in diesem Album, die anderen gehören, verlieren"),
"descriptions": MessageLookupByLibrary.simpleMessage("Beschreibungen"),
"deselectAll": MessageLookupByLibrary.simpleMessage("Alle abwählen"),
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Entwickelt um zu bewahren"),

View File

@@ -671,7 +671,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Delete shared album?"),
"deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage(
"The album will be deleted for everyone\n\nYou will lose access to shared photos in this album that are owned by others"),
"descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"),
"deselectAll": MessageLookupByLibrary.simpleMessage("Deselect all"),
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Designed to outlive"),
@@ -1091,7 +1090,9 @@ class MessageLookup extends MessageLookupByLibrary {
"Magic search allows to search photos by their contents, e.g. \'flower\', \'red car\', \'identity documents\'"),
"manage": MessageLookupByLibrary.simpleMessage("Manage"),
"manageDeviceStorage":
MessageLookupByLibrary.simpleMessage("Manage device storage"),
MessageLookupByLibrary.simpleMessage("Manage device Cache"),
"manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage(
"Review and clear local cache storage."),
"manageFamily": MessageLookupByLibrary.simpleMessage("Manage Family"),
"manageLink": MessageLookupByLibrary.simpleMessage("Manage link"),
"manageParticipants": MessageLookupByLibrary.simpleMessage("Manage"),

View File

@@ -635,7 +635,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("¿Borrar álbum compartido?"),
"deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage(
"El álbum se eliminará para todos\n\nPerderás el acceso a las fotos compartidas en este álbum que son propiedad de otros"),
"descriptions": MessageLookupByLibrary.simpleMessage("Descripciones"),
"deselectAll":
MessageLookupByLibrary.simpleMessage("Deseleccionar todo"),
"designedToOutlive":

View File

@@ -707,7 +707,6 @@ class MessageLookup extends MessageLookupByLibrary {
"Supprimer l\'album partagé ?"),
"deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage(
"L\'album sera supprimé pour tout le monde\n\nVous perdrez l\'accès aux photos partagées dans cet album qui sont détenues par d\'autres personnes"),
"descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"),
"deselectAll":
MessageLookupByLibrary.simpleMessage("Tout déselectionner"),
"designedToOutlive":

View File

@@ -540,7 +540,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Hapus album bersama?"),
"deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage(
"Album ini akan di hapus untuk semua\n\nKamu akan kehilangan akses ke foto yang di bagikan dalam album ini yang di miliki oleh pengguna lain"),
"descriptions": MessageLookupByLibrary.simpleMessage("Keterangan"),
"designedToOutlive":
MessageLookupByLibrary.simpleMessage("Dibuat untuk melestarikan"),
"details": MessageLookupByLibrary.simpleMessage("Rincian"),

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