Compare commits
352 Commits
fdroid-v0.
...
photosd-v1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
511fb8de6a | ||
|
|
fd36ede27b | ||
|
|
a904263ed5 | ||
|
|
02aae58e71 | ||
|
|
7495b6c2c4 | ||
|
|
aa1e2188fb | ||
|
|
8c3c401efb | ||
|
|
5cd37a02c7 | ||
|
|
2bb1670428 | ||
|
|
485e8444fe | ||
|
|
5395ca5caf | ||
|
|
c416819f0a | ||
|
|
0a1e062caf | ||
|
|
85230b5123 | ||
|
|
a33cff7406 | ||
|
|
006cddccd9 | ||
|
|
67867cc127 | ||
|
|
f0bb00f977 | ||
|
|
54290886ea | ||
|
|
816b26475a | ||
|
|
46d7d4e587 | ||
|
|
263f94418d | ||
|
|
f990863bb2 | ||
|
|
d91cd53375 | ||
|
|
6a9fdd6c77 | ||
|
|
f1185fcade | ||
|
|
0cef11266a | ||
|
|
653fc1880f | ||
|
|
cbf84922bb | ||
|
|
0cad88f1ab | ||
|
|
1b7f8ff648 | ||
|
|
7097cb335d | ||
|
|
877c660ba9 | ||
|
|
04f6461cb5 | ||
|
|
6566973f3e | ||
|
|
8e014ae7c6 | ||
|
|
929c706fc0 | ||
|
|
debf52ee88 | ||
|
|
d993430c01 | ||
|
|
f337b835d0 | ||
|
|
f8c44feab8 | ||
|
|
0329c40265 | ||
|
|
e58c48aa70 | ||
|
|
96ee1e3ed2 | ||
|
|
60b66b5e7f | ||
|
|
13f1309857 | ||
|
|
4ee96637de | ||
|
|
dae8fbc9b5 | ||
|
|
4abd131b8a | ||
|
|
ed3b27475e | ||
|
|
9dadb92d8d | ||
|
|
7d0ae17ddd | ||
|
|
fe8600d569 | ||
|
|
1433903fac | ||
|
|
ab636232ff | ||
|
|
76f3a523c1 | ||
|
|
b53197d948 | ||
|
|
38f58ae5f9 | ||
|
|
875fd10b50 | ||
|
|
041aaea0b9 | ||
|
|
e2c0501e3d | ||
|
|
d841ae5a60 | ||
|
|
5e65001e37 | ||
|
|
e70656b5a3 | ||
|
|
b30705fa31 | ||
|
|
26c6078693 | ||
|
|
9a68c48456 | ||
|
|
2828fdf2c6 | ||
|
|
b598729f28 | ||
|
|
86d3067713 | ||
|
|
38e5b4da82 | ||
|
|
e1288bfd61 | ||
|
|
cde45111f6 | ||
|
|
947bd57b99 | ||
|
|
e800d048f2 | ||
|
|
a788313974 | ||
|
|
3d2492a045 | ||
|
|
9fe76eb527 | ||
|
|
6fabb39788 | ||
|
|
c403f4f3a1 | ||
|
|
5f6ae20f96 | ||
|
|
b879cbed32 | ||
|
|
602aa74bd9 | ||
|
|
9db616e965 | ||
|
|
163c8161fc | ||
|
|
2619059f58 | ||
|
|
9e7033ce54 | ||
|
|
bc653494aa | ||
|
|
bb84a609a0 | ||
|
|
53b1b162b2 | ||
|
|
70e56d748a | ||
|
|
9428a13f7a | ||
|
|
81ded2b247 | ||
|
|
1d2eed2b46 | ||
|
|
a55a70266b | ||
|
|
fd4d8ea2e8 | ||
|
|
4e4e865497 | ||
|
|
3cef7ff545 | ||
|
|
6e07067d94 | ||
|
|
509596ff76 | ||
|
|
aa4bb92a8f | ||
|
|
0dd3f7ef46 | ||
|
|
a54237e8e2 | ||
|
|
104d98b765 | ||
|
|
75448d5e5a | ||
|
|
371dcf8ab9 | ||
|
|
da316fdcfd | ||
|
|
ba083fff70 | ||
|
|
30d5fedb11 | ||
|
|
187a149716 | ||
|
|
28e691122f | ||
|
|
5fef369e91 | ||
|
|
dcac233296 | ||
|
|
b90a719972 | ||
|
|
d42d8965e6 | ||
|
|
ab86c5129e | ||
|
|
5b0c32084a | ||
|
|
c0ad778c90 | ||
|
|
a6359f0756 | ||
|
|
7500fdd380 | ||
|
|
0fc0a00f47 | ||
|
|
05bcfdc16e | ||
|
|
dca50a4e45 | ||
|
|
e16fa2dc31 | ||
|
|
dc120a06ca | ||
|
|
05cf33ffb2 | ||
|
|
0a7a8e49fe | ||
|
|
a1742f71e0 | ||
|
|
b1e727f269 | ||
|
|
dbde6abc8c | ||
|
|
a13256cf39 | ||
|
|
1197e11f58 | ||
|
|
743fc4aa41 | ||
|
|
71644e255d | ||
|
|
7f32b99284 | ||
|
|
746aa4cb96 | ||
|
|
d40dc06171 | ||
|
|
7354f69dc3 | ||
|
|
815dd6b4b6 | ||
|
|
33c843e5d8 | ||
|
|
2473c4109e | ||
|
|
171a8670a4 | ||
|
|
027e3425bb | ||
|
|
138dcf3d2a | ||
|
|
8231964023 | ||
|
|
e9a8a97982 | ||
|
|
7dece286ec | ||
|
|
dc32172d8c | ||
|
|
22c5485b3b | ||
|
|
73894ade73 | ||
|
|
7a7c8c02de | ||
|
|
72dc526724 | ||
|
|
7a48b32bd5 | ||
|
|
db58520afe | ||
|
|
1ec9dfea7f | ||
|
|
e36f081d96 | ||
|
|
cfcd41fc7e | ||
|
|
60cac291ff | ||
|
|
c3cfb7ae2f | ||
|
|
067ba8ea85 | ||
|
|
14a4398a14 | ||
|
|
ff759c31b2 | ||
|
|
854198f215 | ||
|
|
6fcfa3d984 | ||
|
|
1e1ef7f94b | ||
|
|
b47f627508 | ||
|
|
0da8f45084 | ||
|
|
c147ec1067 | ||
|
|
e4149fa55e | ||
|
|
ccb0e5278d | ||
|
|
cb83f3592b | ||
|
|
342af990f6 | ||
|
|
737e46a90e | ||
|
|
b7e67d4e2a | ||
|
|
4dc9ed6438 | ||
|
|
e1f2a7dcf7 | ||
|
|
70ad285e09 | ||
|
|
d2459016f1 | ||
|
|
c6ec5cf645 | ||
|
|
1881dde11f | ||
|
|
b06bd19bc9 | ||
|
|
b93a591401 | ||
|
|
7ff9dd5a57 | ||
|
|
96397c24b4 | ||
|
|
a9bc6502cb | ||
|
|
4f4eb773fc | ||
|
|
48e00a0ecc | ||
|
|
f8593255ac | ||
|
|
598d5aab10 | ||
|
|
26cb81a720 | ||
|
|
20c742d43d | ||
|
|
1b1f54feb0 | ||
|
|
6da1f892ce | ||
|
|
e243a914e9 | ||
|
|
df3ba86977 | ||
|
|
91646a809b | ||
|
|
2db170a3ae | ||
|
|
d9ca47914d | ||
|
|
657f27822c | ||
|
|
ed3d8b984e | ||
|
|
ed1970b6d8 | ||
|
|
d374960c35 | ||
|
|
3feac9f0b4 | ||
|
|
dc6fde9f77 | ||
|
|
be3a709335 | ||
|
|
883bdcd845 | ||
|
|
d5a1187e13 | ||
|
|
d413ed2de0 | ||
|
|
ac0ae00015 | ||
|
|
325871f7c5 | ||
|
|
5662661326 | ||
|
|
864b5514be | ||
|
|
2044d3eb6b | ||
|
|
577b262418 | ||
|
|
d6c7ab0735 | ||
|
|
15884597b4 | ||
|
|
4fd32155dc | ||
|
|
c9acda1b6d | ||
|
|
29b5830e19 | ||
|
|
3d95212023 | ||
|
|
2179b193d2 | ||
|
|
89a5a9f42f | ||
|
|
cd69e00451 | ||
|
|
fc66c3e689 | ||
|
|
67ea0cfe73 | ||
|
|
406ac81684 | ||
|
|
c1f16a5b6a | ||
|
|
236d24c79b | ||
|
|
b55cf7c0d8 | ||
|
|
87d6105159 | ||
|
|
194f07d48e | ||
|
|
0c48f53ab1 | ||
|
|
6aba9064a7 | ||
|
|
a2f87c8bd5 | ||
|
|
67361113af | ||
|
|
3d2a66023d | ||
|
|
d99e405f10 | ||
|
|
d5a8f234f8 | ||
|
|
018bd8a767 | ||
|
|
e1e92d944a | ||
|
|
5dd1720b88 | ||
|
|
e84903d2dd | ||
|
|
ca1a292fb2 | ||
|
|
62ba1f0f75 | ||
|
|
5ca3ca5289 | ||
|
|
ac5d37a9e3 | ||
|
|
23732dd087 | ||
|
|
5aae59cdda | ||
|
|
3563c20997 | ||
|
|
14ac034c0b | ||
|
|
cd5e40a1f5 | ||
|
|
72cc188efe | ||
|
|
2d50da84c8 | ||
|
|
dd6f88a1cd | ||
|
|
ac5d9d99f1 | ||
|
|
5ff595b268 | ||
|
|
3cebd975a8 | ||
|
|
dac0dfb8f9 | ||
|
|
77cf819ab4 | ||
|
|
760b1f3f85 | ||
|
|
db8e203c36 | ||
|
|
1e9a014ce7 | ||
|
|
e1ce353069 | ||
|
|
2d97aa2e59 | ||
|
|
584ce6d416 | ||
|
|
61c1847d75 | ||
|
|
b922d135c5 | ||
|
|
aedf659144 | ||
|
|
ca3ec5e94c | ||
|
|
e605d4c0df | ||
|
|
74377a93d8 | ||
|
|
d9d286d94e | ||
|
|
8e87ebd50b | ||
|
|
87750805ae | ||
|
|
9908cf5a29 | ||
|
|
0657b16002 | ||
|
|
703ba3ef6e | ||
|
|
3a64b675bb | ||
|
|
cfe9178301 | ||
|
|
b3d94e9bcf | ||
|
|
8aac4bf55f | ||
|
|
ca9c244182 | ||
|
|
c4f81f55d1 | ||
|
|
8397ed52ce | ||
|
|
92859aa748 | ||
|
|
1fcc425779 | ||
|
|
52bfe0310a | ||
|
|
1a9a36cb4c | ||
|
|
3f12ff2830 | ||
|
|
15ba2dd297 | ||
|
|
b9dd371676 | ||
|
|
0f47842b5f | ||
|
|
49895a7d7f | ||
|
|
520d893fd2 | ||
|
|
e25d439b9b | ||
|
|
7103477598 | ||
|
|
b0379e8945 | ||
|
|
4649561886 | ||
|
|
1cfb83ab02 | ||
|
|
b7eb130a63 | ||
|
|
c2a5f85a02 | ||
|
|
b9f8f55a30 | ||
|
|
5e05e50049 | ||
|
|
cba69a84d3 | ||
|
|
8044bd75df | ||
|
|
9b82ba22a3 | ||
|
|
ac3061a232 | ||
|
|
4278e9c474 | ||
|
|
3be95042a3 | ||
|
|
b1f3b440f7 | ||
|
|
55b4ce8326 | ||
|
|
6c5dd38dbf | ||
|
|
3f9f554b4c | ||
|
|
2450dcf4c2 | ||
|
|
7718da93a5 | ||
|
|
ef01223d9d | ||
|
|
d299f94518 | ||
|
|
375260d701 | ||
|
|
dc49a59111 | ||
|
|
13dea41c97 | ||
|
|
3e4f8e7041 | ||
|
|
f3860a077e | ||
|
|
cee429abdb | ||
|
|
80b86189d0 | ||
|
|
4ecc64e478 | ||
|
|
46e1552f1e | ||
|
|
34183aab64 | ||
|
|
e32facf3e6 | ||
|
|
571d721925 | ||
|
|
f1e91ab11a | ||
|
|
a5b289d290 | ||
|
|
0925f7f0a2 | ||
|
|
bf7f1d43c0 | ||
|
|
e0eda79a91 | ||
|
|
9334540e1e | ||
|
|
f67516f696 | ||
|
|
5663378bf2 | ||
|
|
45c4d1c623 | ||
|
|
7129b2822b | ||
|
|
65497862ea | ||
|
|
e2c3b625db | ||
|
|
acfbcf1cf4 | ||
|
|
c1327fd8aa | ||
|
|
706bb12273 | ||
|
|
323f027a9d | ||
|
|
248d8e09a9 | ||
|
|
716b1be234 | ||
|
|
8f5f1a22ee | ||
|
|
f9b740b683 | ||
|
|
2f0cef6ab9 | ||
|
|
8813b0cf1c | ||
|
|
fd4026f27a |
7
.github/workflows/auth-lint.yml
vendored
@@ -1,15 +1,14 @@
|
||||
name: "Lint (auth)"
|
||||
|
||||
on:
|
||||
# Run on every push to a branch other than main that changes auth/
|
||||
push:
|
||||
branches-ignore: [main]
|
||||
# Run on every pull request (open or push to it) that changes auth/
|
||||
pull_request:
|
||||
paths:
|
||||
- "auth/**"
|
||||
- ".github/workflows/auth-lint.yml"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.24.0"
|
||||
FLUTTER_VERSION: "3.24.1"
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
|
||||
2
.github/workflows/auth-release.yml
vendored
@@ -29,7 +29,7 @@ on:
|
||||
- "auth-v*"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.24.0"
|
||||
FLUTTER_VERSION: "3.24.1"
|
||||
|
||||
jobs:
|
||||
build-ubuntu:
|
||||
|
||||
5
.github/workflows/desktop-lint.yml
vendored
@@ -1,9 +1,8 @@
|
||||
name: "Lint (desktop)"
|
||||
|
||||
on:
|
||||
# Run on every push to a branch other than main that changes desktop/
|
||||
push:
|
||||
branches-ignore: [main]
|
||||
# Run on every pull request (open or push to it) that changes desktop/
|
||||
pull_request:
|
||||
paths:
|
||||
- "desktop/**"
|
||||
- ".github/workflows/desktop-lint.yml"
|
||||
|
||||
5
.github/workflows/docs-verify-build.yml
vendored
@@ -4,9 +4,8 @@ name: "Verify build (docs)"
|
||||
# succeeding before we merge the PR into main.
|
||||
|
||||
on:
|
||||
# Run on every push to a branch other than main that changes docs/
|
||||
push:
|
||||
branches-ignore: [main]
|
||||
# Run on every pull request (open or push to it) that changes docs/
|
||||
pull_request:
|
||||
paths:
|
||||
- "docs/**"
|
||||
- ".github/workflows/docs-verify-build.yml"
|
||||
|
||||
5
.github/workflows/infra-lint-staff.yml
vendored
@@ -1,9 +1,8 @@
|
||||
name: "Lint (staff)"
|
||||
|
||||
on:
|
||||
# Run on every push to a branch other than main that changes infra/staff/
|
||||
push:
|
||||
branches-ignore: [main]
|
||||
# Run on every pull request (open or push to it) that changes infra/staff/
|
||||
pull_request:
|
||||
paths:
|
||||
- "infra/staff/**"
|
||||
- ".github/workflows/infra-deploy-staff.yml"
|
||||
|
||||
1
.github/workflows/mobile-crowdin-sync.yml
vendored
@@ -26,7 +26,6 @@ jobs:
|
||||
download_translations: true
|
||||
localization_branch_name: translations/mobile
|
||||
create_pull_request: true
|
||||
skip_untranslated_strings: true
|
||||
pull_request_title: "[mobile] New translations"
|
||||
pull_request_body: "New translations from [Crowdin](https://crowdin.com/project/ente-photos-app)"
|
||||
pull_request_base_branch_name: "main"
|
||||
|
||||
@@ -4,7 +4,7 @@ on:
|
||||
workflow_dispatch: # Allow manually running the action
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.22.2"
|
||||
FLUTTER_VERSION: "3.24.1"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
7
.github/workflows/mobile-lint.yml
vendored
@@ -1,16 +1,15 @@
|
||||
name: "Lint (mobile)"
|
||||
|
||||
on:
|
||||
# Run on every push to a branch other than main that changes mobile/
|
||||
push:
|
||||
branches-ignore: [main, f-droid]
|
||||
# Run on every pull request (open or push to it) that changes mobile/
|
||||
pull_request:
|
||||
paths:
|
||||
- "mobile/**"
|
||||
- ".github/workflows/mobile-lint.yml"
|
||||
|
||||
env:
|
||||
|
||||
FLUTTER_VERSION: "3.22.2"
|
||||
FLUTTER_VERSION: "3.24.1"
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
|
||||
2
.github/workflows/mobile-release.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- "photos-v*"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.22.2"
|
||||
FLUTTER_VERSION: "3.24.1"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
5
.github/workflows/server-lint.yml
vendored
@@ -1,9 +1,8 @@
|
||||
name: "Lint (server)"
|
||||
|
||||
on:
|
||||
# Run on every push to a branch other than main that changes server/
|
||||
push:
|
||||
branches-ignore: [main]
|
||||
# Run on every pull request (open or push to it) that changes server/
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/**"
|
||||
- ".github/workflows/server-lint.yml"
|
||||
|
||||
5
.github/workflows/web-lint.yml
vendored
@@ -1,9 +1,8 @@
|
||||
name: "Lint (web)"
|
||||
|
||||
on:
|
||||
# Run on every push to a branch other than main that changes web/
|
||||
push:
|
||||
branches-ignore: [main]
|
||||
# Run on every pull request (open or push to it) that changes web/
|
||||
pull_request:
|
||||
paths:
|
||||
- "web/**"
|
||||
- ".github/workflows/web-lint.yml"
|
||||
|
||||
@@ -57,7 +57,7 @@ android {
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 33
|
||||
targetSdkVersion 34
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@@ -1 +1 @@
|
||||
Auth is a FOSS authenticator app that provides end-to-end encrypted backups for your 2FA secrets.
|
||||
Auth is a FOSS authenticator app that provides end-to-end encrypted backups for your 2FA secrets.
|
||||
@@ -17,6 +17,9 @@
|
||||
"title": "airtm",
|
||||
"hex": "000000"
|
||||
},
|
||||
{
|
||||
"title": "Amazon"
|
||||
},
|
||||
{
|
||||
"title": "Anycoin Direct",
|
||||
"slug": "anycoindirect"
|
||||
@@ -24,6 +27,27 @@
|
||||
{
|
||||
"title": "AscendEX"
|
||||
},
|
||||
{
|
||||
"title": "Battle.net",
|
||||
"slug": "battlenet",
|
||||
"altNames": [
|
||||
"Battle net",
|
||||
"Blizzard"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Bethesda",
|
||||
"altNames": [
|
||||
"Bethesda Softworks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "BinanceUS",
|
||||
"slug": "binance_us",
|
||||
"altNames": [
|
||||
"Binance US"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Bitfinex"
|
||||
},
|
||||
@@ -31,12 +55,12 @@
|
||||
"title": "bitget"
|
||||
},
|
||||
{
|
||||
"titile":"bitget wallet",
|
||||
"slug":"bitget_wallet"
|
||||
"title": "bitget wallet",
|
||||
"slug": "bitget_wallet"
|
||||
},
|
||||
{
|
||||
"title": "Bitmart",
|
||||
"hex":"000000"
|
||||
"hex": "000000"
|
||||
},
|
||||
{
|
||||
"title": "BitMEX"
|
||||
@@ -51,8 +75,7 @@
|
||||
"title": "Bitstamp"
|
||||
},
|
||||
{
|
||||
"title": "Bitvavo",
|
||||
"hex": "0051FF"
|
||||
"title": "Bitvavo"
|
||||
},
|
||||
{
|
||||
"title": "Bitwarden"
|
||||
@@ -70,27 +93,24 @@
|
||||
"blockchain.com",
|
||||
"blockchain.com Wallet",
|
||||
"blockchain.com Exchange"
|
||||
],
|
||||
"slug": "blockchain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "BorgBase",
|
||||
"altNames": [
|
||||
"borg"
|
||||
],
|
||||
"slug": "BorgBase"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Booking",
|
||||
"slug": "booking",
|
||||
"altNames":[
|
||||
"altNames": [
|
||||
"Booking.com"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Brave Creators",
|
||||
"slug": "brave_creators",
|
||||
"altNames":[
|
||||
"altNames": [
|
||||
"Brave",
|
||||
"Brave Rewards",
|
||||
"Brave Browser"
|
||||
@@ -110,15 +130,11 @@
|
||||
"slug": "cih",
|
||||
"hex": "D14633"
|
||||
},
|
||||
{
|
||||
"title": "Cloudflare"
|
||||
},
|
||||
{
|
||||
"title": "CloudAMQP"
|
||||
},
|
||||
{
|
||||
"title": "ConfigCat",
|
||||
"slug": "configcat"
|
||||
"title": "Cloudflare"
|
||||
},
|
||||
{
|
||||
"title": "CoinDCX"
|
||||
@@ -128,8 +144,7 @@
|
||||
},
|
||||
{
|
||||
"title": "Control D",
|
||||
"slug": "controld",
|
||||
"hex": "5FD800"
|
||||
"slug": "controld"
|
||||
},
|
||||
{
|
||||
"title": "Crowdpear"
|
||||
@@ -139,7 +154,6 @@
|
||||
"slug": "crypto",
|
||||
"altNames": [
|
||||
"crypto",
|
||||
"Crypto.com",
|
||||
"Crypto com"
|
||||
]
|
||||
},
|
||||
@@ -147,8 +161,7 @@
|
||||
"title": "DCS",
|
||||
"altNames": [
|
||||
"Digital Combat Simulator"
|
||||
],
|
||||
"slug": "dcs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "DEGIRO"
|
||||
@@ -173,16 +186,22 @@
|
||||
"slug": "dusnet"
|
||||
},
|
||||
{
|
||||
"title":"ecitizen kenya",
|
||||
"slug":"ecitizen_kenya"
|
||||
"title": "ecitizen kenya",
|
||||
"slug": "ecitizen_kenya"
|
||||
},
|
||||
{
|
||||
"title": "ecloud",
|
||||
"altNames": [
|
||||
"Murena"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "ente",
|
||||
"hex": "1DB954"
|
||||
},
|
||||
{
|
||||
"title": "enom"
|
||||
},
|
||||
"title": "enom"
|
||||
},
|
||||
{
|
||||
"title": "Epic Games",
|
||||
"slug": "epic_games",
|
||||
@@ -218,10 +237,10 @@
|
||||
},
|
||||
{
|
||||
"title": "Gosuslugi",
|
||||
"slug": "Gosuslugi",
|
||||
"altNames": [
|
||||
"Госуслуги"
|
||||
],
|
||||
"slug": "Gosuslugi"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Habbo"
|
||||
@@ -240,16 +259,13 @@
|
||||
"title": "HuggingFace",
|
||||
"altNames": [
|
||||
"Hugging Face"
|
||||
],
|
||||
"slug": "huggingface"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "IceDrive",
|
||||
"slug": "Icedrive"
|
||||
"title": "IceDrive"
|
||||
},
|
||||
{
|
||||
"titile": "Infomaniak",
|
||||
"slug": "infomaniak"
|
||||
"title": "Infomaniak"
|
||||
},
|
||||
{
|
||||
"title": "ING"
|
||||
@@ -270,8 +286,7 @@
|
||||
"hex": "000000"
|
||||
},
|
||||
{
|
||||
"title": "IVPN",
|
||||
"slug": "IVPN"
|
||||
"title": "IVPN"
|
||||
},
|
||||
{
|
||||
"title": "Jagex",
|
||||
@@ -281,8 +296,7 @@
|
||||
"title": "Kagi"
|
||||
},
|
||||
{
|
||||
"title": "Kick",
|
||||
"hex": "53FC19"
|
||||
"title": "Kick"
|
||||
},
|
||||
{
|
||||
"title": "Kite"
|
||||
@@ -295,15 +309,13 @@
|
||||
"color": "00CC00"
|
||||
},
|
||||
{
|
||||
"title": "Kraken",
|
||||
"hex": "5848D5"
|
||||
"title": "Kraken"
|
||||
},
|
||||
{
|
||||
"title": "Kronos"
|
||||
},
|
||||
{
|
||||
"title": "KuCoin",
|
||||
"hex": "01BC8D"
|
||||
"title": "KuCoin"
|
||||
},
|
||||
{
|
||||
"title": "La Poste",
|
||||
@@ -333,7 +345,6 @@
|
||||
"mathstodon",
|
||||
"fosstodon"
|
||||
],
|
||||
"slug": "mastodon",
|
||||
"hex": "6364FF"
|
||||
},
|
||||
{
|
||||
@@ -364,13 +375,6 @@
|
||||
{
|
||||
"title": "Mozilla"
|
||||
},
|
||||
{
|
||||
"title": "Murena",
|
||||
"altNames": [
|
||||
"eCloud"
|
||||
],
|
||||
"slug": "ecloud"
|
||||
},
|
||||
{
|
||||
"title": "MyFRITZ!Net",
|
||||
"slug": "myfritz",
|
||||
@@ -406,6 +410,12 @@
|
||||
{
|
||||
"title": "NextDNS"
|
||||
},
|
||||
{
|
||||
"title": "Newton",
|
||||
"altNames": [
|
||||
"Newton Crypto"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "ngrok",
|
||||
"hex": "858585"
|
||||
@@ -420,8 +430,7 @@
|
||||
"title": "Notion"
|
||||
},
|
||||
{
|
||||
"title": "NuCommunity",
|
||||
"slug": "nucommunity"
|
||||
"title": "NuCommunity"
|
||||
},
|
||||
{
|
||||
"title": "NVIDIA"
|
||||
@@ -430,16 +439,17 @@
|
||||
"title": "Odido"
|
||||
},
|
||||
{
|
||||
"titile": "OpenObserve",
|
||||
"title": "OpenObserve",
|
||||
"slug": "open_observe",
|
||||
"altNames":[
|
||||
"altNames": [
|
||||
"openobserve.ai",
|
||||
"openobserve ai"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "okx",
|
||||
"hex": "000000" },
|
||||
"hex": "000000"
|
||||
},
|
||||
{
|
||||
"title": "Parsec"
|
||||
},
|
||||
@@ -447,16 +457,13 @@
|
||||
"title": "PayPal"
|
||||
},
|
||||
{
|
||||
"title": "pCloud",
|
||||
"slug": "pCloud"
|
||||
"title": "pCloud"
|
||||
},
|
||||
{
|
||||
"title": "Peerberry",
|
||||
"hex": "03E5A5"
|
||||
"title": "Peerberry"
|
||||
},
|
||||
{
|
||||
"title": "Pingvin Share",
|
||||
"hex": "485099"
|
||||
"title": "Pingvin Share"
|
||||
},
|
||||
{
|
||||
"title": "Plutus",
|
||||
@@ -466,12 +473,10 @@
|
||||
"title": "Poloniex"
|
||||
},
|
||||
{
|
||||
"title": "Porkbun",
|
||||
"hex": "F27777"
|
||||
"title": "Porkbun"
|
||||
},
|
||||
{
|
||||
"title": "PostNL",
|
||||
"color": "EF8300"
|
||||
"title": "PostNL"
|
||||
},
|
||||
{
|
||||
"title": "Privacy Guides",
|
||||
@@ -495,7 +500,6 @@
|
||||
"title": "Registro br",
|
||||
"slug": "registro_br",
|
||||
"altNames": [
|
||||
"Registro br",
|
||||
"registrobr",
|
||||
"Registro.br"
|
||||
]
|
||||
@@ -507,13 +511,15 @@
|
||||
"title": "Revolt",
|
||||
"hex": "858585"
|
||||
},
|
||||
{
|
||||
"title": "RippleMatch"
|
||||
},
|
||||
{
|
||||
"title": "Rockstar Games",
|
||||
"slug": "rockstar_games"
|
||||
},
|
||||
{
|
||||
"title": "RuneMate",
|
||||
"hex": "2ECC71"
|
||||
"title": "RuneMate"
|
||||
},
|
||||
{
|
||||
"title": "Rust Language Forum",
|
||||
@@ -529,6 +535,9 @@
|
||||
{
|
||||
"title": "service-bw"
|
||||
},
|
||||
{
|
||||
"title": "Shakepay"
|
||||
},
|
||||
{
|
||||
"title": "SimpleLogin"
|
||||
},
|
||||
@@ -551,16 +560,14 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "SMTP2GO",
|
||||
"slug": "smtp2go"
|
||||
"title": "SMTP2GO"
|
||||
},
|
||||
{
|
||||
"title": "Snapchat"
|
||||
},
|
||||
{
|
||||
"title": "Standard Notes",
|
||||
"slug": "standardnotes",
|
||||
"hex": "2173E6"
|
||||
"slug": "standardnotes"
|
||||
},
|
||||
{
|
||||
"title": "Surfshark"
|
||||
@@ -570,9 +577,7 @@
|
||||
"slug": "synology_dsm"
|
||||
},
|
||||
{
|
||||
"title": "TCPShield",
|
||||
"slug": "tcpshield",
|
||||
"hex": "FFFFFF"
|
||||
"title": "TCPShield"
|
||||
},
|
||||
{
|
||||
"title": "Techlore",
|
||||
@@ -596,9 +601,7 @@
|
||||
"title": "TorGuard"
|
||||
},
|
||||
{
|
||||
"title": "Trading 212",
|
||||
"slug": "trading212",
|
||||
"hex": "4BA4DE"
|
||||
"title": "Trading 212"
|
||||
},
|
||||
{
|
||||
"title": "TradingView"
|
||||
@@ -635,13 +638,16 @@
|
||||
"hex": "858585"
|
||||
},
|
||||
{
|
||||
"title": "Uphold",
|
||||
"slug": "uphold",
|
||||
"hex": "6FE68A"
|
||||
"title": "Uphold"
|
||||
},
|
||||
{
|
||||
"titile": "Vikunja",
|
||||
"slug": "vikunja"
|
||||
"title": "Upstox"
|
||||
},
|
||||
{
|
||||
"title": "Vikunja"
|
||||
},
|
||||
{
|
||||
"title": "Wealthfront"
|
||||
},
|
||||
{
|
||||
"title": "Wealthsimple"
|
||||
@@ -656,74 +662,30 @@
|
||||
{
|
||||
"title": "Wise"
|
||||
},
|
||||
{
|
||||
"title": "WYZE",
|
||||
"slug": "wyze"
|
||||
},
|
||||
{
|
||||
"title": "WorkOS",
|
||||
"slug": "workos",
|
||||
"altNames": [
|
||||
"Work OS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "X",
|
||||
"altNames": [
|
||||
"twitter"
|
||||
],
|
||||
"slug": "x"
|
||||
"title": "WYZE"
|
||||
},
|
||||
{
|
||||
"title": "yahoo"
|
||||
},
|
||||
{
|
||||
"title": "Yandex",
|
||||
"altNames": [
|
||||
"Ya",
|
||||
"Яндекс"
|
||||
],
|
||||
"slug": "Yandex"
|
||||
},
|
||||
{
|
||||
"title": "yahoo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "YNAB",
|
||||
"altNames": [
|
||||
"You Need A Budget"
|
||||
],
|
||||
"slug": "ynab",
|
||||
"hex": "3B5EDA"
|
||||
},
|
||||
{
|
||||
"title": "Shakepay",
|
||||
"slug": "shakepay"
|
||||
},
|
||||
{
|
||||
"title": "Newton",
|
||||
"altNames": ["Newton Crypto"],
|
||||
"slug": "newton"
|
||||
},
|
||||
{
|
||||
"title": "T-Mobile ID",
|
||||
"altNames": [
|
||||
"T-Mobile"
|
||||
],
|
||||
"slug": "t-mobile"
|
||||
},
|
||||
{
|
||||
"title": "Wealthfront",
|
||||
"slug": "wealthfront"
|
||||
},
|
||||
{
|
||||
"title": "BinanceUS",
|
||||
"altNames": [
|
||||
"Binance US"
|
||||
],
|
||||
"slug": "binance_us"
|
||||
},
|
||||
{
|
||||
"title": "Bethesda Softworks",
|
||||
"altNames": ["Bethesda"],
|
||||
"slug": "bethesda"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
6
auth/assets/custom-icons/icons/amazon.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M442.375 441.562C390.672 479.687 315.75 500 251.25 500C160.625 500 79.344 466.562 17.7346 410.89C13.0471 406.515 17.2346 400.547 23.0471 403.953C89.5315 442.656 171.875 465.937 256.656 465.937C317.884 465.655 378.451 453.272 434.875 429.5C443.625 425.781 450.969 435.218 442.375 441.562ZM463.875 416.968C457.313 408.531 420.188 412.984 403.563 414.937C398.485 415.562 397.719 411.14 402.281 407.968C431.969 387.187 480.313 393.172 485.969 400.156C491.625 407.14 484.5 455.781 456.75 478.968C452.485 482.531 448.422 480.64 450.5 475.906C456.75 460.343 470.719 425.437 464.094 416.968" fill="#FF9900"/>
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M287.969 216.625C287.969 243.063 288.641 265.109 275.281 288.578C264.344 307.641 247.156 319.406 228.328 319.406C202.281 319.406 187.016 299.563 187.016 270.266C187.016 212.453 238.828 201.938 287.984 201.938L287.969 216.625ZM356.422 382C351.938 386.016 345.453 386.297 340.391 383.625C317.891 364.922 313.766 356.234 301.453 338.391C264.234 376.359 237.797 387.719 189.609 387.719C132.453 387.719 88.0781 352.5 88.0781 281.984C88.0781 226.922 117.844 189.422 160.422 171.094C197.25 154.875 248.703 152.031 288 147.656V139.062C288 122.938 289.25 103.844 279.719 89.9219C271.516 77.4219 255.656 72.2656 241.641 72.2656C215.781 72.2656 192.781 85.5469 187.156 113.016C186.016 119.266 181.531 125.141 175.328 125.422L109.375 118.047C103.844 116.797 97.6563 112.328 99.2656 103.984C114.5 24.0625 186.641 0 251.156 0C284.172 0 327.313 8.78125 353.344 33.7812C386.359 64.6094 383.219 105.734 383.219 150.5V256.25C383.219 288.031 396.391 301.953 408.797 319.141C413.094 325.391 414.047 332.578 408.516 337.172C391.003 351.98 373.669 366.997 356.516 382.219L356.422 382.031" fill="white"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
10
auth/assets/custom-icons/icons/battlenet.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_181_130)">
|
||||
<path d="M394.583 172.833C331.25 143.583 240.292 125 154.708 131.917C159 103.583 169.583 83.8334 186.958 79.6667C210.875 73.9376 236.958 89.6667 261.833 118.292C278.125 120.417 297.458 124.125 310.896 127.229C265.562 41.9375 204.75 -5.87495 158.479 11.7709C123.312 25.1876 105.292 73.6459 107.479 138.729C61.6457 148.479 25.9166 165.813 3.04156 190.708C1.8749 192.063 -0.729272 195.438 0.187395 197.063C0.895728 198.271 3.22906 196.896 4.22906 196.229C30.7707 177.688 64.7291 167.625 108.958 161.313C115.271 230.75 144.646 318.813 193.437 389.479C166.771 399.938 144.354 400.646 132.062 387.667C115.146 369.833 115.729 339.375 128.104 303.5C121.802 288.106 116.192 272.437 111.292 256.542C60.0624 338.5 49.0832 415.083 87.4791 446.333C116.687 470.083 167.625 461.438 222.937 427.042C254.292 461.875 287.167 484.125 320.167 491.5C321.917 491.813 326.146 492.396 327.083 490.792C327.792 489.542 325.417 488.208 324.354 487.688C295.021 474 269.354 449.604 241.771 414.458C298.75 374.271 360.333 304.813 397.125 227.208C419.542 245.125 431.292 264.146 426.25 281.271C419.25 304.833 392.604 319.604 355.354 326.792C345.157 339.931 334.397 352.624 323.104 364.833C419.646 368.167 491.437 339.417 499.312 290.563C505.271 253.354 472.333 213.563 414.875 182.854C429.375 138.292 432.208 98.6876 422.083 66.4376C421.479 64.7709 419.875 60.8126 418 60.8126C416.583 60.8126 416.604 63.5209 416.687 64.7084C419.5 96.9376 411.208 131.375 394.562 172.833H394.583ZM216.812 378.438C175.979 312.917 152.437 235.75 152.604 157.729C229.729 155.146 308.312 173.313 375.812 212.458C339.5 280.563 284.458 339.542 216.792 378.417L216.812 378.438Z" fill="#148EFF"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_181_130">
|
||||
<rect width="500" height="500" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -1,3 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 430.964 500">
|
||||
<path d="m156.633 323.503-6.557 16.51h12.996l-6.439-16.51Zm38.498-171.881v-48.197c0-7.683-3.53-11.231-10.894-11.231h-11.986v70.676h11.986c7.364 0 10.894-3.564 10.894-11.23v-.018ZM391.791 0H39.138C10.524 0 0 10.541 0 39.138V384.21l.42 9.027c.64 6.255.791 12.307 6.591 19.165 2.11 1.765 4.28 3.458 6.505 5.078l8.961 4.169 173.646 72.743c9.027 4.119 12.777 5.75 19.333 5.598h.05c6.557.135 10.306-1.479 19.335-5.598l173.645-72.743 8.961-4.169 6.505-5.077c5.8-6.893 5.934-12.945 6.591-19.165.293-3.001.433-6.014.42-9.029V39.155c0-28.614-10.558-39.138-39.138-39.138h-.033V0h-.001ZM237.447 66.441h29.168v191.715h-29.168V66.44v.001Zm1.966 238.403h16.98v57.999h-16.004v-33.32l-14.829 22.695h-.337l-14.743-22.527v33.151h-15.752v-57.999h16.979l13.837 22.477 13.835-22.477h.034v.001ZM143.083 66.44h45.778c23.704 0 35.438 11.768 35.438 35.607v50.938c0 23.822-11.717 35.607-35.438 35.607h-16.61v69.582h-29.168V66.439v.001Zm-79.501 0h64.875v26.561H92.75v54.216h34.346v26.562H92.75v57.798h36.262v26.562h-65.43V66.44Zm55.763 288.635c-6.136 5.044-14.676 8.944-25.183 8.944-18.073 0-31.572-12.439-31.572-30.008v-.168c0-16.896 13.247-30.177 31.235-30.177 10.205 0 17.401 3.143 23.536 8.457l-9.447 11.347c-4.153-3.48-8.289-5.464-14.005-5.464-8.372 0-14.828 7.027-14.828 15.921v.168c-.466 8.938 6.806 16.366 15.752 16.088 3.901 0 6.893-.84 9.281-2.403v-7.028H92.683v-11.769h26.68v26.11l-.018-.018Zm29.672-50.635h15.5l24.679 58.419h-17.231l-4.236-10.373h-22.393l-4.154 10.373h-16.894l24.678-58.419h.052-.001Zm65.128 155.186-81.736-28.108h166.955l-85.218 28.109-.001-.001Zm99.978-96.75h-47.072v-57.999h46.652v13.667h-30.732v8.793h27.857v12.693h-27.857v9.195h31.169v13.668-.034l-.017.017Zm-32.06-138.677V100.398c0-23.822 11.717-35.607 35.438-35.607h14.172c23.704 0 35.169 11.517 35.169 35.338V139.3H338.23v-37.523c0-7.682-3.564-11.23-10.894-11.23h-4.91c-7.615 0-11.178 3.564-11.178 11.23V222.82c0 7.682 3.563 11.23 11.178 11.23h5.465c7.363 0 10.893-3.565 10.893-11.23v-43.256h28.614v44.634c0 23.822-11.718 35.624-35.439 35.624h-14.458c-23.704 0-35.438-11.768-35.438-35.623Zm86.831 120.772c0 11.853-9.364 18.88-23.452 18.88-10.289 0-20.056-3.228-27.185-9.616l8.944-10.709a29.76 29.76 0 0 0 18.795 6.944c4.321 0 6.641-1.48 6.641-3.985v-.168c0-2.404-1.9-3.732-9.784-5.548-12.357-2.824-21.889-6.304-21.889-18.241v-.168c0-10.793 8.541-18.576 22.477-18.576 9.868 0 17.568 2.656 23.872 7.699l-8.036 11.349c-5.295-3.733-11.095-5.717-16.256-5.717-3.901 0-5.8 1.648-5.8 3.733v.167c0 2.656 1.983 3.817 10.036 5.633 13.331 2.908 21.637 7.195 21.637 18.071v.252Z"/>
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path d="M191.633 323.503L185.076 340.013H198.072L191.633 323.503ZM230.131 151.622V103.425C230.131 95.742 226.601 92.194 219.237 92.194H207.251V162.87H219.237C226.601 162.87 230.131 159.306 230.131 151.64V151.622ZM426.791 0H74.138C45.524 0 35 10.541 35 39.138V384.21L35.42 393.237C36.06 399.492 36.211 405.544 42.011 412.402C44.121 414.167 46.291 415.86 48.516 417.48L57.477 421.649L231.123 494.392C240.15 498.511 243.9 500.142 250.456 499.99H250.506C257.063 500.125 260.812 498.511 269.841 494.392L443.486 421.649L452.447 417.48L458.952 412.403C464.752 405.51 464.886 399.458 465.543 393.238C465.836 390.237 465.976 387.224 465.963 384.209V39.155C465.963 10.541 455.405 0.017 426.825 0.017H426.792V0H426.791ZM272.447 66.441H301.615V258.156H272.447V66.441ZM274.413 304.844H291.393V362.843H275.389V329.523L260.56 352.218H260.223L245.48 329.691V362.842H229.728V304.843H246.707L260.544 327.32L274.379 304.843H274.413V304.844ZM178.083 66.44H223.861C247.565 66.44 259.299 78.208 259.299 102.047V152.985C259.299 176.807 247.582 188.592 223.861 188.592H207.251V258.174H178.083V66.44ZM98.582 66.44H163.457V93.001H127.75V147.217H162.096V173.779H127.75V231.577H164.012V258.139H98.582V66.44ZM154.345 355.075C148.209 360.119 139.669 364.019 129.162 364.019C111.089 364.019 97.59 351.58 97.59 334.011V333.843C97.59 316.947 110.837 303.666 128.825 303.666C139.03 303.666 146.226 306.809 152.361 312.123L142.914 323.47C138.761 319.99 134.625 318.006 128.909 318.006C120.537 318.006 114.081 325.033 114.081 333.927V334.095C113.615 343.033 120.887 350.461 129.833 350.183C133.734 350.183 136.726 349.343 139.114 347.78V340.752H127.683V328.983H154.363V355.093L154.345 355.075ZM184.017 304.44H199.517L224.196 362.859H206.965L202.729 352.486H180.336L176.182 362.859H159.288L183.966 304.44H184.018H184.017ZM249.145 459.626L167.409 431.518H334.364L249.146 459.627L249.145 459.626ZM349.123 362.876H302.051V304.877H348.703V318.544H317.971V327.337H345.828V340.03H317.971V349.225H349.14V362.893V362.859L349.123 362.876ZM317.063 224.199V100.398C317.063 76.576 328.78 64.791 352.501 64.791H366.673C390.377 64.791 401.842 76.308 401.842 100.129V139.3H373.23V101.777C373.23 94.095 369.666 90.547 362.336 90.547H357.426C349.811 90.547 346.248 94.111 346.248 101.777V222.82C346.248 230.502 349.811 234.05 357.426 234.05H362.891C370.254 234.05 373.784 230.485 373.784 222.82V179.564H402.398V224.198C402.398 248.02 390.68 259.822 366.959 259.822H352.501C328.797 259.822 317.063 248.054 317.063 224.199ZM403.894 344.971C403.894 356.824 394.53 363.851 380.442 363.851C370.153 363.851 360.386 360.623 353.257 354.235L362.201 343.526C367.475 347.944 374.117 350.397 380.996 350.47C385.317 350.47 387.637 348.99 387.637 346.485V346.317C387.637 343.913 385.737 342.585 377.853 340.769C365.496 337.945 355.964 334.465 355.964 322.528V322.36C355.964 311.567 364.505 303.784 378.441 303.784C388.309 303.784 396.009 306.44 402.313 311.483L394.277 322.832C388.982 319.099 383.182 317.115 378.021 317.115C374.12 317.115 372.221 318.763 372.221 320.848V321.015C372.221 323.671 374.204 324.832 382.257 326.648C395.588 329.556 403.894 333.843 403.894 344.719V344.971Z" fill="white"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 3.2 KiB |
@@ -1,18 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
|
||||
<defs>
|
||||
<linearGradient id="a" x1=".425" x2="0" y1=".821" y2="0">
|
||||
<stop stop-color="#F4AAFF" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#F000FB" stop-opacity=".4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" x1=".365" x2="0" y1=".566" y2="-.048">
|
||||
<stop stop-color="#F7D2FE" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#F7D2FE"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g stroke="null">
|
||||
<rect width="500" height="500" fill="#7132F5" rx="64"/>
|
||||
<rect width="500" height="500" fill="url(#a)" fill-opacity=".64" rx="64"/>
|
||||
<rect width="500" height="500" fill="url(#b)" fill-opacity=".4" rx="64"/>
|
||||
<path fill="#fff" fill-rule="evenodd" d="M110.63 269.996v60.347c0 11.113 8.888 20.106 19.818 20.106 10.94 0 19.87-8.993 19.87-20.106v-60.347c0-11.129 8.842-20.137 19.828-20.137 10.948 0 19.829 9.008 19.829 20.137v60.347c0 11.113 8.887 20.106 19.827 20.106 10.98 0 19.864-8.993 19.864-20.106v-60.347c0-11.129 8.88-20.137 19.823-20.137 10.991 0 19.878 9.008 19.878 20.137v60.347c0 11.113 8.885 20.106 19.813 20.106 10.941 0 19.829-8.993 19.829-20.106v-60.347c0-11.129 8.883-20.137 19.87-20.137 10.945 0 19.828 9.008 19.828 20.137v60.347c0 11.113 8.888 20.106 19.86 20.106 10.944 0 19.828-8.993 19.828-20.106v-60.347c0-77.78-62.194-140.848-138.906-140.848-76.706 0-138.858 63.067-138.858 140.848z" clip-rule="evenodd"/>
|
||||
</g>
|
||||
</svg>
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M233.918 53.5499C277.36 50.6259 321.637 59.3977 360.485 79.0302C418.129 107.435 464.077 158.395 485.38 218.546C494.987 245.279 500 273.266 500 301.67V406.516C500 410.693 500 415.287 499.165 419.465C496.658 429.907 489.14 439.515 479.114 444.11C472.013 447.451 464.077 447.869 456.976 446.616C441.103 443.692 428.571 428.654 428.571 412.364C428.571 379.782 428.571 347.201 428.571 314.619C428.989 305.43 428.989 295.405 423.977 287.468C416.04 272.43 395.99 265.329 380.535 271.595C367.168 276.19 357.561 289.974 357.143 304.176C357.143 337.176 357.143 370.175 357.143 403.174C357.143 409.44 357.561 415.705 355.472 421.553C352.13 433.249 342.523 442.439 330.827 445.78C315.372 449.958 297.828 443.274 290.309 429.072C284.879 420.718 285.297 410.275 285.714 400.668C285.714 367.668 285.714 335.087 285.714 302.088C285.297 285.379 271.512 270.342 255.221 268.253C244.361 266.582 233.083 270.342 225.146 277.861C218.045 284.544 214.286 294.151 214.286 303.759V399.414C214.286 407.351 215.121 415.705 212.197 423.224C207.602 437.009 193.818 447.033 179.198 446.616C164.16 447.451 149.541 437.009 144.946 423.224C142.439 416.123 142.857 409.022 142.857 401.503C142.857 368.504 142.857 335.505 142.857 302.506C142.857 286.215 129.908 271.177 114.035 268.253C99.4152 265.329 83.5422 272.43 76.0234 285.797C73.0994 291.227 71.4286 297.493 71.4286 303.759V411.11C71.4286 421.553 66.8337 431.996 58.8972 438.679C46.7836 449.122 27.1512 449.957 14.6199 440.35C5.43024 434.084 0 423.224 0 411.946V303.341C0 262.405 10.4428 221.47 30.0752 185.129C45.9482 155.471 68.0869 129.155 94.4027 108.27C133.25 75.6885 182.957 56.4739 233.918 53.5499Z" fill="#5741D9"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2500 2500" xmlns:v="https://vecta.io/nano"><path d="M830.3 1250.3l740.5 740.6 467.4-467.4c83.6-75.2 211.4-71.9 290.9 7.6s82.9 207.4 7.6 290.9l-616.8 616.9c-82.9 81.5-215.7 81.5-298.6 0l-889.8-890.1v529c0 116.8-94.6 211.4-211.4 211.4s-211.4-94.6-211.4-211.4V422c0-116.7 94.6-211.4 211.4-211.4S531.5 305.3 531.5 422v529l889.7-889.9c82.8-81.5 215.8-81.5 298.6 0L2337 677.9c75.2 83.6 71.9 211.4-7.6 290.9s-207.4 82.9-290.9 7.6L1571.1 509l-740.8 741.3h0zm740.8-211.7h0c-85.6 0-162.8 51.5-195.6 130.6s-14.7 170.1 45.8 230.7 151.6 78.7 230.7 46c79.1-32.8 130.7-109.9 130.7-195.6a211.87 211.87 0 0 0-61.9-149.7c-39.6-39.7-93.5-62-149.6-62h-.1 0z" fill-rule="evenodd" fill="#23af91"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2500 2500" xmlns:v="https://vecta.io/nano"><path d="M830.3 1250.3l740.5 740.6 467.4-467.4c83.6-75.2 211.4-71.9 290.9 7.6s82.9 207.4 7.6 290.9l-616.8 616.9c-82.9 81.5-215.7 81.5-298.6 0l-889.8-890.1v529c0 116.8-94.6 211.4-211.4 211.4s-211.4-94.6-211.4-211.4V422c0-116.7 94.6-211.4 211.4-211.4S531.5 305.3 531.5 422v529l889.7-889.9c82.8-81.5 215.8-81.5 298.6 0L2337 677.9c75.2 83.6 71.9 211.4-7.6 290.9s-207.4 82.9-290.9 7.6L1571.1 509l-740.8 741.3h0zm740.8-211.7h0c-85.6 0-162.8 51.5-195.6 130.6s-14.7 170.1 45.8 230.7 151.6 78.7 230.7 46c79.1-32.8 130.7-109.9 130.7-195.6a211.87 211.87 0 0 0-61.9-149.7c-39.6-39.7-93.5-62-149.6-62h-.1 0z" fill-rule="evenodd" fill="#01BC8D"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 735 B After Width: | Height: | Size: 735 B |
@@ -1,30 +1,34 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
|
||||
<defs>
|
||||
<linearGradient id="a" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(45.043 -14.606 34.73) scale(128.4643)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#2e79ef"/>
|
||||
<stop offset="1" stop-color="#389d93"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(-90 191.946 -57.554) scale(132.907)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fbb94b"/>
|
||||
<stop offset="1" stop-color="#fc7e27"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(-62.181 250.835 -202.634) scale(119.902)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fdaf60"/>
|
||||
<stop offset="1" stop-color="#ab82d5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="d" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(45.043 168.839 476.151) scale(130.8827)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fc9aa2"/>
|
||||
<stop offset="1" stop-color="#7269fe"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="e" x1="0" x2="1" y1="0" y2="0" gradientTransform="translate(141.309 66.467) scale(66.239)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#87b391"/>
|
||||
<stop offset="1" stop-color="#dfb962"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path stroke="#000" d="M0 0h500v500H0z"/>
|
||||
<path fill="url(#a)" d="M66.25.299c36.803.028 66.576 29.747 66.549 66.247-.027 36.606-29.845 66.183-66.549 66.155-36.796.071-66.577-29.648-66.549-66.254C-.272 29.947 29.553.272 66.25.299Z" transform="matrix(-.00052 .70126 .70126 .00052 74.86 203.507)"/>
|
||||
<path fill="url(#b)" d="M216.401 0h66.197v133.099h-66.197z" transform="matrix(.70126 0 0 -.70126 75.035 296.669)"/>
|
||||
<path fill="url(#c)" d="M291.5 66.599c0-36.704 29.598-66.5 66.197-66.5v133c-36.5 0-66.197-29.802-66.197-66.5Z" transform="matrix(.70126 0 0 -.70126 75.035 296.738)"/>
|
||||
<path fill="url(#d)" d="M432.75.398c36.803-.071 66.577 29.648 66.549 66.254-.027 36.598-29.845 66.174-66.549 66.147-36.796-.027-66.576-29.747-66.549-66.246C366.228 29.947 396.053.371 432.75.398Z" transform="matrix(-.00052 .70126 .70126 .00052 332.064 -53.506)"/>
|
||||
<path fill="url(#e)" d="M141.303 0h.222c36.325.12 65.856 29.755 65.975 66.277v.446C207.381 103.319 177.827 133 141.303 133V0Z" transform="matrix(.70126 0 0 -.70126 75.035 296.599)"/>
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_191_1018)">
|
||||
<path d="M0.0492147 249.67C0.0499258 286.539 29.8004 316.388 66.3661 316.388C103.038 316.388 132.691 286.538 132.69 249.768C132.788 212.906 103.038 183.049 66.3658 183.05C29.8001 183.05 0.0494268 212.907 0.0492147 249.67Z" fill="url(#paint0_linear_191_1018)"/>
|
||||
<path d="M216.841 316.39H283.157V183.051H216.841V316.39Z" fill="url(#paint1_linear_191_1018)"/>
|
||||
<path d="M292.074 249.769C292.074 286.539 321.726 316.389 358.39 316.389V183.149C321.825 183.149 292.074 213.005 292.074 249.769Z" fill="url(#paint2_linear_191_1018)"/>
|
||||
<path d="M367.311 249.669C367.213 286.538 396.963 316.388 433.635 316.387C470.299 316.387 499.95 286.537 499.951 249.767C499.951 212.905 470.199 183.049 433.635 183.049C396.963 183.049 367.311 212.906 367.311 249.669Z" fill="url(#paint3_linear_191_1018)"/>
|
||||
<path d="M141.606 316.29H141.829C178.219 316.17 207.804 286.481 207.923 249.894V249.447C207.804 212.785 178.196 183.05 141.606 183.05V316.29Z" fill="url(#paint4_linear_191_1018)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_191_1018" x1="20.3472" y1="203.643" x2="111.35" y2="294.643" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#2E79EF"/>
|
||||
<stop offset="1" stop-color="#389D93"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_191_1018" x1="249.999" y1="181.755" x2="249.999" y2="314.902" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FBB94B"/>
|
||||
<stop offset="1" stop-color="#FC7E27"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_191_1018" x1="313.603" y1="202.507" x2="369.66" y2="308.742" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FDAF60"/>
|
||||
<stop offset="1" stop-color="#AB82D5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_191_1018" x1="387.221" y1="203.334" x2="479.936" y2="296.048" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FC9AA2"/>
|
||||
<stop offset="1" stop-color="#7269FE"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_191_1018" x1="141.612" y1="249.703" x2="207.971" y2="249.703" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#87B391"/>
|
||||
<stop offset="1" stop-color="#DFB962"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_191_1018">
|
||||
<rect width="500" height="500" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.2 KiB |
@@ -1,4 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 484.002 500">
|
||||
<path d="M250 0c4.7 0 9.37.13 14.002.386V116.96a133.128 133.128 0 0 0-16.003-.958c-72.17 0-130.815 57.92-131.983 129.815l-.015 2.183v213.09C46.268 416.73.001 338.768.001 250 0 111.926 111.93 0 250 0Zm-2 159.997c4.918 0 9.743.406 14.44 1.183l1.562.27V248l.005 1.474c.313 28.493 9.651 54.814 25.294 76.251-12.314 6.556-26.373 10.276-41.302 10.276-48.597 0-87.997-39.4-87.997-88.002s39.4-88.002 87.997-88.002Z"/>
|
||||
<path fill="#00E6A5" d="M159.997 346.387c23.355 20.901 54.193 33.61 88.002 33.61 27.425 0 52.896-8.363 74.001-22.678 21.104 14.315 46.575 22.678 74 22.678 31.386 0 60.212-10.953 82.87-29.244C440.121 438.641 352.223 500 250 500c-31.724 0-62.073-5.909-90.003-16.69V346.386ZM396 159.997c48.603 0 88.002 39.4 88.002 88.002S444.603 336.001 396 336.001c-14.924 0-28.983-3.72-41.297-10.276 15.91-21.802 25.3-48.67 25.3-77.726 0-29.056-9.39-55.924-25.305-77.726 12.32-6.556 26.378-10.276 41.302-10.276Zm-74 40.358c8.858 13.731 14.001 30.088 14.001 47.644 0 17.556-5.143 33.913-14 47.644-8.86-13.73-14.003-30.088-14.003-47.644 0-17.07 4.862-33.006 13.272-46.497l.73-1.147ZM308.003 6.765c74.407 17.673 135.933 68.61 168.007 136.233C453.806 126.058 426.08 116 396.001 116c-27.425 0-52.896 8.363-74 22.678a131.582 131.582 0 0 0-12.189-7.343l-1.808-.943V6.764Z"/>
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_191_1037)">
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path d="M257.999 0C262.699 0 267.369 0.13 272.001 0.386V116.96C266.691 116.319 261.347 116 255.998 116.002C183.828 116.002 125.183 173.922 124.015 245.817L124 248V461.09C54.267 416.73 8 338.768 8 250C7.999 111.926 119.929 0 257.999 0ZM255.999 159.997C260.917 159.997 265.742 160.403 270.439 161.18L272.001 161.45V248L272.006 249.474C272.319 277.967 281.657 304.288 297.3 325.725C284.986 332.281 270.927 336.001 255.998 336.001C207.401 336.001 168.001 296.601 168.001 247.999C168.001 199.397 207.401 159.997 255.998 159.997H255.999Z" fill="white"/>
|
||||
</g>
|
||||
<path d="M167.996 346.387C191.351 367.288 222.189 379.997 255.998 379.997C283.423 379.997 308.894 371.634 329.999 357.319C351.103 371.634 376.574 379.997 403.999 379.997C435.385 379.997 464.211 369.044 486.869 350.753C448.12 438.641 360.222 500 257.999 500C226.275 500 195.926 494.091 167.996 483.31V346.386V346.387ZM403.999 159.997C452.602 159.997 492.001 199.397 492.001 247.999C492.001 296.601 452.602 336.001 403.999 336.001C389.075 336.001 375.016 332.281 362.702 325.725C378.612 303.923 388.002 277.055 388.002 247.999C388.002 218.943 378.612 192.075 362.697 170.273C375.017 163.717 389.075 159.997 403.999 159.997ZM329.999 200.355C338.857 214.086 344 230.443 344 247.999C344 265.555 338.857 281.912 330 295.643C321.14 281.913 315.997 265.555 315.997 247.999C315.997 230.929 320.859 214.993 329.269 201.502L329.999 200.355ZM316.002 6.76516C390.409 24.4382 451.935 75.3752 484.009 142.998C461.805 126.058 434.079 116 404 116C376.575 116 351.104 124.363 330 138.678C326.073 136.012 322.004 133.561 317.811 131.335L316.003 130.392V6.76416L316.002 6.76516Z" fill="#00E6A5"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_191_1037">
|
||||
<rect width="500" height="500" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
@@ -1,4 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 433.451">
|
||||
<path d="M134.664 0c-10.257 0-19.193 1.837-27.87 5.518-8.421 3.682-15.784 8.678-22.36 15.255L250.4 202.779 416.102 20.773c-6.576-6.577-13.946-11.573-22.888-15.255C385.058 1.838 375.6 0 365.864 0c-10.257 0-19.986 2.108-28.664 6.054-8.942 3.94-16.312 9.729-23.146 16.563L250.4 93.105l-64.434-70.488c-6.576-6.834-13.945-12.624-23.152-16.563C154.664 2.108 144.922 0 134.664 0ZM250.4 230.4 84.434 412.678c6.576 6.312 13.939 11.566 22.36 15.254 8.677 3.681 17.627 5.519 27.355 5.519 10.787 0 19.987-2.366 28.665-6.055 9.207-4.203 17.091-9.729 23.667-16.562l63.92-70.488 63.911 70.488c6.576 6.833 13.946 12.359 22.888 16.562 8.678 3.689 18.142 6.055 28.665 6.055 9.735 0 19.193-1.838 27.349-5.519 8.942-3.688 16.312-8.942 22.888-15.254L250.4 230.4Z"/>
|
||||
<path fill="#e57000" d="M54.705 54.712c-10.522.264-20.78 2.359-29.98 6.305C15.255 64.963 7.098 70.488 0 77.329l126.787 139.396L0 355.865c7.098 7.104 15.254 12.616 24.725 16.826 9.2 4.21 19.458 6.055 29.98 6.577 11.308-.522 21.844-2.36 31.573-7.092 9.736-4.474 18.142-10.529 25.24-18.163l124.936-137.288L111.52 79.695c-7.627-7.37-15.777-13.417-25.512-18.15-9.729-4.467-19.994-6.569-31.302-6.833Zm390.333 0c-11.309.264-21.309 2.366-31.045 6.834-9.728 4.732-18.149 10.78-25.512 18.149l-124.406 137.03L388.48 354.013c7.363 7.634 15.784 13.689 25.512 18.163 9.736 4.732 19.736 6.57 31.045 7.092 11.308-.522 21.037-2.367 30.244-6.577 9.993-4.21 17.62-9.722 24.718-16.827L373.492 216.725 500 77.33c-7.098-6.841-14.725-12.366-24.718-16.312-9.207-3.946-18.936-6.04-30.244-6.305Z"/>
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path d="M134.664 33C124.407 33 115.471 34.837 106.794 38.518C98.3731 42.2 91.0101 47.196 84.4341 53.773L250.4 235.779L416.102 53.773C409.526 47.196 402.156 42.2 393.214 38.518C385.058 34.838 375.6 33 365.864 33C355.607 33 345.878 35.108 337.2 39.054C328.258 42.994 320.888 48.783 314.054 55.617L250.4 126.105L185.966 55.617C179.39 48.783 172.021 42.993 162.814 39.054C154.664 35.108 144.922 33 134.664 33ZM250.4 263.4L84.4341 445.678C91.0101 451.99 98.3731 457.244 106.794 460.932C115.471 464.613 124.421 466.451 134.149 466.451C144.936 466.451 154.136 464.085 162.814 460.396C172.021 456.193 179.905 450.667 186.481 443.834L250.401 373.346L314.312 443.834C320.888 450.667 328.258 456.193 337.2 460.396C345.878 464.085 355.342 466.451 365.865 466.451C375.6 466.451 385.058 464.613 393.214 460.932C402.156 457.244 409.526 451.99 416.102 445.678L250.4 263.4Z" fill="white"/>
|
||||
</g>
|
||||
<path d="M54.705 87.7119C44.183 87.9759 33.925 90.0709 24.725 94.0169C15.255 97.9629 7.098 103.488 0 110.329L126.787 249.725L0 388.865C7.098 395.969 15.254 401.481 24.725 405.691C33.925 409.901 44.183 411.746 54.705 412.268C66.013 411.746 76.549 409.908 86.278 405.176C96.014 400.702 104.42 394.647 111.518 387.013L236.454 249.725L111.52 112.695C103.893 105.325 95.743 99.2779 86.008 94.5449C76.279 90.0779 66.013 87.9759 54.705 87.7119ZM445.038 87.7119C433.729 87.9759 423.729 90.0779 413.993 94.5459C404.265 99.2779 395.844 105.326 388.481 112.695L264.075 249.725L388.48 387.013C395.843 394.647 404.264 400.702 413.992 405.176C423.728 409.908 433.728 411.746 445.037 412.268C456.345 411.746 466.074 409.901 475.281 405.691C485.274 401.481 492.901 395.969 499.999 388.864L373.492 249.725L500 110.33C492.902 103.489 485.275 97.9639 475.282 94.0179C466.075 90.0719 456.346 87.9769 445.038 87.7119Z" fill="#E57000"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.9 KiB |
6
auth/assets/custom-icons/icons/ripplematch.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-0.017335016280412674 1.0994987487792969 34.31733703613281 19.514122009277344">
|
||||
<g id="Homepage_ver1" fill="#000000">
|
||||
<path d="M30.7,1.3a0.5,0.5,0,0,0-.5.3L24.6,13.4,18.9,1.6a0.5,0.5,0,0,0-.5-0.3H15.3a0.3,0.3,0,0,0-.3.4l9.2,18.3a0.4,0.4,0,0,0,.6,0l0.6-1.2L31.1,7.8V20.2a0.4,0.4,0,0,0,.4.4h2.4a0.4,0.4,0,0,0,.4-0.4V1.7a0.4,0.4,0,0,0-.4-0.4H30.7Z" style="fill-rule:evenodd"></path>
|
||||
<path d="M14.3,7.5A6.4,6.4,0,0,0,8,1.1H0.3a0.3,0.3,0,0,0-.3.4L1.1,3.6a0.6,0.6,0,0,0,.5.3H8a3.5,3.5,0,0,1,3.5,3.5A3.5,3.5,0,0,1,8,11.1H5.2a0.2,0.2,0,0,0-.2.3l4.4,8.8a0.7,0.7,0,0,0,.6.4h2.6a0.3,0.3,0,0,0,.3-0.5L9.7,13.7A6.5,6.5,0,0,0,14.3,7.5Z" style="fill-rule:evenodd"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 730 B |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 18 KiB |
12
auth/assets/custom-icons/icons/upstox.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_176_150)">
|
||||
<path d="M397.756 276.664C389.302 276.867 380.894 275.355 373.04 272.219C365.186 269.083 358.049 264.389 352.059 258.419C346.069 252.449 341.351 245.328 338.188 237.484C335.026 229.641 333.486 221.238 333.661 212.783C333.661 177.106 360.315 146.907 397.71 146.83C435.06 146.83 460.011 177.06 460.011 212.768C460.011 248.475 435.152 276.664 397.787 276.664H397.756ZM402.559 111C369.568 111 347.747 123.076 333.369 141.414V115.036H293.349V389.173H333.369V281.989C347.747 300.127 369.568 312.433 402.559 312.433C457.725 312.433 500 272.137 500 212.614C500 153.076 457.725 111 402.559 111Z" fill="#5A2989"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M87.5582 218.706C104.475 206.796 118.215 190.921 127.578 172.472V224C127.578 256.071 145.148 274.608 174.871 274.608C204.594 274.608 229.468 256.102 229.468 224V115.128H269.565V308.612H229.315V284.168C222.839 294.065 204.471 312.556 168.702 312.556C115.747 312.556 87.6809 279.488 87.6809 232.517L87.6042 218.676L87.5582 218.706Z" fill="#5A2989"/>
|
||||
<path d="M0.0459128 202.026V240.849C33.7489 240.844 66.0975 227.583 90.1054 203.929C101.927 192.322 111.318 178.477 117.73 163.201C124.143 147.926 127.449 131.526 127.455 114.959H88.2027C88.1725 126.409 85.8733 137.74 81.4379 148.297C77.0025 158.853 70.5189 168.426 62.3618 176.462C45.7426 192.849 23.3393 202.033 -0.00012207 202.026H0.0459128Z" fill="#5A2989"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_176_150">
|
||||
<rect width="500" height="500" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +1,15 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
|
||||
<path fill="none" d="m253.612 18.751 155.225 68.671 72.412 162.926-66.105 160.531-164.763 70.372-158.672-64.375-72.959-163.45L88.562 86.485l165.05-67.734Z"/>
|
||||
<path d="m261.198 1.604 155.225 68.672a18.746 18.746 0 0 1 9.548 9.532l72.413 162.924a18.752 18.752 0 0 1 .203 14.755l-66.106 160.532a18.755 18.755 0 0 1-9.973 10.103l-164.762 70.372a18.751 18.751 0 0 1-14.414.131L84.66 434.251a18.749 18.749 0 0 1-10.073-9.732L1.628 261.068a18.751 18.751 0 0 1-.177-14.877l69.814-166.94a18.744 18.744 0 0 1 10.18-10.112L246.493 1.405a18.741 18.741 0 0 1 14.705.199Zm-7.862 37.527-150.471 61.752-63.69 152.301 66.579 149.156 144.442 58.602 150.53-64.293 60.13-146.019-66.217-148.985-141.303-62.512v-.002Z"/>
|
||||
<path fill="none" d="M350.853 168.751v161.156h-24.737L250.3 257.213l-76.228 72.694h-23.957V168.751"/>
|
||||
<path d="m168.865 308.963 68.495-65.319c7.258-6.921 18.677-6.906 25.916.035l68.828 65.992v-140.92c0-10.349 8.4-18.75 18.75-18.75 10.347 0 18.75 8.401 18.75 18.75v161.156c0 10.355-8.396 18.75-18.75 18.75h-24.739a18.757 18.757 0 0 1-12.977-5.216l-62.874-60.285-63.252 60.32a18.75 18.75 0 0 1-12.94 5.181h-23.957c-10.355 0-18.75-8.395-18.75-18.75V168.751c0-10.349 8.402-18.75 18.75-18.75 10.349 0 18.75 8.401 18.75 18.75v140.212Z"/>
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_191_1078)">
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path d="M261.198 1.60387L416.423 70.2759C420.678 72.1581 424.082 75.5557 425.971 79.8079L498.384 242.732C499.414 245.05 499.963 247.552 499.998 250.089C500.033 252.625 499.553 255.142 498.587 257.487L432.481 418.019C430.609 422.563 427.028 426.191 422.508 428.122L257.746 498.494C255.471 499.465 253.026 499.977 250.552 500C248.078 500.022 245.624 499.555 243.332 498.625L84.66 434.251C80.1712 432.43 76.5614 428.942 74.587 424.519L1.628 261.068C0.585027 258.731 0.0312788 256.206 0.000838817 253.648C-0.0296012 251.089 0.463911 248.551 1.451 246.191L71.265 79.2509C72.2146 76.9794 73.6024 74.9172 75.3491 73.1822C77.0958 71.4472 79.1672 70.0732 81.445 69.1389L246.493 1.40487C248.831 0.444804 251.339 -0.0324825 253.866 0.00171599C256.393 0.0359145 258.887 0.580891 261.198 1.60387ZM253.336 39.1309L102.865 100.883L39.175 253.184L105.754 402.34L250.196 460.942L400.726 396.649L460.856 250.63L394.639 101.645L253.336 39.1329V39.1309Z" fill="white"/>
|
||||
</g>
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path d="M168.865 308.963L237.36 243.644C244.618 236.723 256.037 236.738 263.276 243.679L332.104 309.671V168.751C332.104 158.402 340.504 150.001 350.854 150.001C361.201 150.001 369.604 158.402 369.604 168.751V329.907C369.604 340.262 361.208 348.657 350.854 348.657H326.115C321.279 348.656 316.629 346.788 313.138 343.441L250.264 283.156L187.012 343.476C183.525 346.802 178.891 348.657 174.072 348.657H150.115C139.76 348.657 131.365 340.262 131.365 329.907V168.751C131.365 158.402 139.767 150.001 150.115 150.001C160.464 150.001 168.865 158.402 168.865 168.751V308.963Z" fill="white"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_191_1078">
|
||||
<rect width="500" height="500" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.8 KiB |
@@ -1,5 +0,0 @@
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g style="mix-blend-mode:difference">
|
||||
<path d="M296.617 211.716L479.03 0H435.804L277.414 183.83L150.909 0H5L196.301 277.983L5 500H48.2286L215.492 305.869L349.091 500H495L296.606 211.716H296.617ZM237.409 280.432L218.026 252.752L63.8045 32.492H130.201L254.66 210.249L274.043 237.929L435.824 468.986H369.428L237.409 280.443V280.432Z" fill="white"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 458 B |
@@ -67,7 +67,7 @@
|
||||
"pleaseWait": "Моля изчакайте...",
|
||||
"generatingEncryptionKeysTitle": "Генерират се ключове за шифроване...",
|
||||
"recreatePassword": "Създайте отново парола",
|
||||
"recreatePasswordMessage": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, така че трябва да го генерираме отново веднъж по начин, който работи с всички устройства. \n\nВлезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).",
|
||||
"recreatePasswordMessage": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, така че трябва да го генерираме отново веднъж по начин, който работи с всички устройства. \n\nМоля, влезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).",
|
||||
"useRecoveryKey": "Използвайте ключ за възстановяване",
|
||||
"incorrectPasswordTitle": "Грешна парола",
|
||||
"welcomeBack": "Добре дошли отново!",
|
||||
@@ -130,7 +130,61 @@
|
||||
"faq_q_3": "Как мога да изтрия кодове?",
|
||||
"faq_a_3": "Можете да изтриете код, като плъзнете наляво върху него.",
|
||||
"faq_q_4": "Как мога да подкрепя този проект?",
|
||||
"faq_a_4": "Можете да подкрепите развитието на този проект, като се абонирате за нашето приложение за снимки @ ente.io.",
|
||||
"faq_q_5": "Как мога да активирам заключване чрез FaceID в Auth",
|
||||
"faq_a_5": "Можете да активирате заключване чрез FaceID в Настройки → Сигурност → Заключен екран.",
|
||||
"somethingWentWrongMessage": "Нещо се обърка, моля опитайте отново",
|
||||
"leaveFamily": "Напуснете семейството",
|
||||
"leaveFamilyMessage": "Сигурни ли сте, че искате да напуснете семейния план?",
|
||||
"inFamilyPlanMessage": "Вие сте на семеен план!",
|
||||
"swipeHint": "Плъзнете наляво, за да редактирате или премахнете кодове",
|
||||
"scan": "Сканиране",
|
||||
"scanACode": "Скениране на код",
|
||||
"verify": "Потвърждаване",
|
||||
"verifyEmail": "Потвърдете имейла",
|
||||
"enterCodeHint": "Въведете 6-цифрения код от\nВашето приложение за удостоверяване",
|
||||
"lostDeviceTitle": "Загубено устройство?",
|
||||
"twoFactorAuthTitle": "Двуфакторно удостоверяване",
|
||||
"passkeyAuthTitle": "Удостоверяване с ключ за парола",
|
||||
"verifyPasskey": "Потвърдете ключ за парола",
|
||||
"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}",
|
||||
@@ -183,46 +237,118 @@
|
||||
"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": "Моля, изпратете историята на действията на \n{toEmail}",
|
||||
"copyEmailAddress": "Копиране на имейл адрес",
|
||||
"exportLogs": "Експорт на файловете с историята",
|
||||
"enterYourRecoveryKey": "Въведете Вашия ключ за възстановяване",
|
||||
"tempErrorContactSupportIfPersists": "Изглежда нещо се обърка. Моля, опитайте отново след известно време. Ако грешката продължава, моля, свържете се с нашия екип за поддръжка.",
|
||||
"networkHostLookUpErr": "Не може да се свърже с Ente, моля, проверете мрежовите си настройки и се свържете с поддръжката, ако проблемът продължава.",
|
||||
"networkConnectionRefusedErr": "Не може да се свърже с Ente, моля, опитайте отново след известно време. Ако проблемът продължава, моля, свържете се с поддръжката.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Изглежда нещо се обърка. Моля, опитайте отново след известно време. Ако грешката продължава, моля, свържете се с нашия екип за поддръжка.",
|
||||
"about": "Относно",
|
||||
"weAreOpenSource": "Ние сме с отворен код!",
|
||||
"privacy": "Поверителност",
|
||||
"terms": "Условия",
|
||||
"checkForUpdates": "Провери за актуализации",
|
||||
"checkStatus": "Проверка на състоянието",
|
||||
"downloadUpdate": "Изтегляне",
|
||||
"criticalUpdateAvailable": "Налична е критична актуализация",
|
||||
"updateAvailable": "Налична актуализация",
|
||||
"update": "Актуализиране",
|
||||
"checking": "Извършва се проверка...",
|
||||
"youAreOnTheLatestVersion": "Вие сте с най-новата версия",
|
||||
"warning": "Предупреждение",
|
||||
"exportWarningDesc": "Експортираният файл съдържа поверителна информация. Моля, съхранявайте го безопасно.",
|
||||
"iUnderStand": "Разбрах",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"authToExportCodes": "Моля, удостоверете се, за да експортирате Вашите кодове",
|
||||
"importSuccessTitle": "Ура!",
|
||||
"importSuccessDesc": "Импортирахте {count} кода!",
|
||||
"@importSuccessDesc": {
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The number of codes imported",
|
||||
"type": "int",
|
||||
"example": "1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sorry": "Съжаляваме",
|
||||
"importFailureDesc": "Неуспешен анализ на избрания файл.\nМоля, пишете на support@ente.io, ако имате нужда от помощ!",
|
||||
"pendingSyncs": "Предупреждение",
|
||||
"pendingSyncsWarningBody": "Някои от вашите кодове не са архивирани.\n\nМоля, уверете се, че имате резервно копие на тези кодове, преди да излезете.",
|
||||
"checkInboxAndSpamFolder": "Моля, проверете входящата си поща (и спама), за да завършите проверката",
|
||||
"tapToEnterCode": "Докоснете, за да въведете код",
|
||||
"resendEmail": "Повторно изпращане на имейл",
|
||||
"weHaveSendEmailTo": "Изпратихме имейл до <green>{email}</green>",
|
||||
"@weHaveSendEmailTo": {
|
||||
"description": "Text to indicate that we have sent a mail to the user",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"description": "The email address of the user",
|
||||
"type": "String",
|
||||
"example": "example@ente.io"
|
||||
}
|
||||
}
|
||||
},
|
||||
"activeSessions": "Активни сесии",
|
||||
"somethingWentWrongPleaseTryAgain": "Нещо се обърка, моля опитайте отново",
|
||||
"thisWillLogYouOutOfThisDevice": "Това ще Ви изкара от профила на това устройство!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "Това ще Ви изкара от профила на следното устройство:",
|
||||
"terminateSession": "Прекратяване на сесията?",
|
||||
"terminate": "Прекратяване",
|
||||
"thisDevice": "Това устройство",
|
||||
"toResetVerifyEmail": "За да нулирате паролата си, моля, първо потвърдете своя имейл.",
|
||||
"thisEmailIsAlreadyInUse": "Този имейл вече се използва",
|
||||
"verificationFailedPleaseTryAgain": "Неуспешно проверка, моля опитайте отново",
|
||||
"yourVerificationCodeHasExpired": "Вашият код за потвърждение е изтекъл",
|
||||
"incorrectCode": "Неправилен код",
|
||||
"sorryTheCodeYouveEnteredIsIncorrect": "За съжаление кодът, който сте въвели, е неправилен",
|
||||
"emailChangedTo": "Имейлът е променен на {newEmail}",
|
||||
"authenticationFailedPleaseTryAgain": "Неуспешно удостоверяване, моля опитайте отново",
|
||||
"authenticationSuccessful": "Успешно удостоверяване!",
|
||||
"twofactorAuthenticationSuccessfullyReset": "Двуфакторното удостоверяване бе успешно нулирано",
|
||||
"incorrectRecoveryKey": "Неправилен ключ за възстановяване",
|
||||
"theRecoveryKeyYouEnteredIsIncorrect": "Въведеният от Вас ключ за възстановяване е неправилен",
|
||||
"enterPassword": "Въведете парола",
|
||||
"selectExportFormat": "Изберете формат за експортиране",
|
||||
"exportDialogDesc": "Шифрованите експорти ще бъдат защитени с парола по Ваш избор.",
|
||||
"encrypted": "Шифровано",
|
||||
"plainText": "Обикновен текст",
|
||||
"passwordToEncryptExport": "Парола за шифроване на експортирането",
|
||||
"export": "Експортиране",
|
||||
"useOffline": "Използвайте без резервни копия",
|
||||
"signInToBackup": "Влезте, за да архивирате Вашите кодове",
|
||||
"singIn": "Вход",
|
||||
"sigInBackupReminder": "Моля, експортирайте Вашите кодове, за да сте сигурни, че имате резервно копие, от което можете да ги възстановите.",
|
||||
"offlineModeWarning": "Избрахте да продължите без резервни копия. Моля, направете ръчни резервни копия, за да сте сигурни, че Вашите кодове са в безопасност.",
|
||||
"showLargeIcons": "Показване на големи икони",
|
||||
"shouldHideCode": "Скриване на кодове",
|
||||
"doubleTapToViewHiddenCode": "Можете да докоснете два пъти върху запис, за да видите кода",
|
||||
"focusOnSearchBar": "Фокусиране на търсенето при стартиране на приложението",
|
||||
"confirmUpdatingkey": "Сигурни ли сте, че искате да актуализирате секретния ключ?",
|
||||
"minimizeAppOnCopy": "Минимизиране на приложението при копиране",
|
||||
"editCodeAuthMessage": "Удостоверете се, за да редактирате кода",
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
"incorrectPasswordTitle": "Falsches Passwort",
|
||||
"welcomeBack": "Willkommen zurück!",
|
||||
"madeWithLoveAtPrefix": "gemacht mit ❤️ bei ",
|
||||
"supportDevs": "Bei <bold-green>ente</bold-green> registrieren um das Projekt zu unterstützen.",
|
||||
"supportDevs": "Bei <bold-green>ente</bold-green> registrieren, um das Projekt zu unterstützen",
|
||||
"supportDiscount": "Benutze den Rabattcode \"AUTH\" für 10% Rabatt im ersten Jahr",
|
||||
"changeEmail": "E-Mail ändern",
|
||||
"changePassword": "Passwort ändern",
|
||||
@@ -182,6 +182,7 @@
|
||||
"security": "Sicherheit",
|
||||
"lockscreen": "Sperrbildschirm",
|
||||
"authToChangeLockscreenSetting": "Bitte authentifizieren um die Einstellungen des Sperrbildschirms zu ändern",
|
||||
"deviceLockEnablePreSteps": "Um die Gerätesperre zu aktivieren, richte bitte einen Gerätepasscode oder eine Bildschirmsperre in den Systemeinstellungen ein.",
|
||||
"viewActiveSessions": "Aktive Sitzungen anzeigen",
|
||||
"authToViewYourActiveSessions": "Bitte authentifizieren um, die aktiven Sitzungen zu sehen",
|
||||
"searchHint": "Suchen...",
|
||||
@@ -441,5 +442,29 @@
|
||||
"deleteTagTitle": "Tag löschen?",
|
||||
"deleteTagMessage": "Sind Sie sicher, dass Sie diesen Code löschen wollen? Diese Aktion ist unumkehrbar.",
|
||||
"somethingWentWrongParsingCode": "Wir konnten {x} Codes nicht parsen.",
|
||||
"updateNotAvailable": "Update ist nicht verfügbar"
|
||||
"updateNotAvailable": "Update ist nicht verfügbar",
|
||||
"viewRawCodes": "Rohcodes anzeigen",
|
||||
"rawCodes": "Rohcodes",
|
||||
"rawCodeData": "Rohcode Daten",
|
||||
"appLock": "App-Sperre",
|
||||
"noSystemLockFound": "Keine Systemsperre gefunden",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfiguriere bitte den Gerätepasscode oder die Bildschirmsperre in den Systemeinstellungen.",
|
||||
"autoLock": "Automatisches Sperren",
|
||||
"immediately": "Sofort",
|
||||
"reEnterPassword": "Passwort erneut eingeben",
|
||||
"reEnterPin": "PIN erneut eingeben",
|
||||
"next": "Weiter",
|
||||
"tooManyIncorrectAttempts": "Zu viele fehlerhafte Versuche",
|
||||
"tapToUnlock": "Zum Entsperren antippen",
|
||||
"setNewPassword": "Neues Passwort festlegen",
|
||||
"deviceLock": "Gerätesperre",
|
||||
"hideContent": "Inhalte verstecken",
|
||||
"hideContentDescriptionAndroid": "Versteckt Inhalte der App beim Wechseln zwischen Apps und deaktiviert Screenshots",
|
||||
"hideContentDescriptioniOS": "Versteckt Inhalte der App beim Wechseln zwischen Apps",
|
||||
"autoLockFeatureDescription": "Zeit, nach der die App gesperrt wird, nachdem sie in den Hintergrund verschoben wurde",
|
||||
"appLockDescription": "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort.",
|
||||
"pinLock": "PIN-Sperre",
|
||||
"enterPin": "PIN eingeben",
|
||||
"setNewPin": "Neue PIN festlegen",
|
||||
"importFailureDescNew": "Die ausgewählte Datei konnte nicht verarbeitet werden."
|
||||
}
|
||||
@@ -182,6 +182,7 @@
|
||||
"security": "Ασφάλεια",
|
||||
"lockscreen": "Οθόνη κλειδώματος",
|
||||
"authToChangeLockscreenSetting": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τις ρυθμίσεις οθόνης κλειδώματος",
|
||||
"deviceLockEnablePreSteps": "Για να ενεργοποιήσετε το κλείδωμα της συσκευής, παρακαλώ ρυθμίστε τον κωδικό πρόσβασης της συσκευής ή το κλείδωμα οθόνης στις ρυθμίσεις του συστήματός σας.",
|
||||
"viewActiveSessions": "Προβολή ενεργών συνεδριών",
|
||||
"authToViewYourActiveSessions": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τις ενεργές συνεδρίες σας",
|
||||
"searchHint": "Αναζήτηση...",
|
||||
@@ -458,6 +459,10 @@
|
||||
"setNewPassword": "Ορίστε νέο κωδικό πρόσβασης",
|
||||
"deviceLock": "Κλείδωμα συσκευής",
|
||||
"hideContent": "Απόκρυψη περιεχομένου",
|
||||
"hideContentDescriptionAndroid": "Απόκρυψη περιεχομένου εφαρμογής στην εναλλαγή εφαρμογών και απενεργοποίηση στιγμιότυπων οθόνης",
|
||||
"hideContentDescriptioniOS": "Απόκρυψη περιεχομένου εφαρμογών στην εναλλαγή εφαρμογών",
|
||||
"autoLockFeatureDescription": "Χρόνος μετά τον οποίο η εφαρμογή κλειδώνει μετά την τοποθέτηση στο παρασκήνιο",
|
||||
"appLockDescription": "Επιλέξτε ανάμεσα στην προεπιλεγμένη οθόνη κλειδώματος της συσκευής σας και σε μια προσαρμοσμένη οθόνη κλειδώματος με ένα PIN ή έναν κωδικό πρόσβασης.",
|
||||
"pinLock": "Κλείδωμα καρφιτσωμάτων",
|
||||
"enterPin": "Εισαγωγή PIN",
|
||||
"setNewPin": "Ορίστε νέο PIN",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"pleaseVerifyDetails": "Veuillez vérifier vos informations et réessayez",
|
||||
"codeIssuerHint": "Émetteur",
|
||||
"codeSecretKeyHint": "Clé secrète",
|
||||
"codeAccountHint": "Compte (vous@exemple.com)",
|
||||
"codeAccountHint": "Compte (nom@exemple.com)",
|
||||
"codeTagHint": "Tag",
|
||||
"accountKeyType": "Type de clé",
|
||||
"sessionExpired": "Session expirée",
|
||||
@@ -118,7 +118,7 @@
|
||||
"existingUser": "Utilisateur existant",
|
||||
"newUser": "Nouveau dans Ente",
|
||||
"delete": "Supprimer",
|
||||
"enterYourPasswordHint": "Saisir votre mot de passe",
|
||||
"enterYourPasswordHint": "Entrez votre mot de passe",
|
||||
"forgotPassword": "Mot de passe oublié",
|
||||
"oops": "Oups",
|
||||
"suggestFeatures": "Suggérer des fonctionnalités",
|
||||
@@ -135,14 +135,14 @@
|
||||
"faq_a_5": "Vous pouvez activer le verrouillage FaceID dans Paramètres → Sécurité → Écran de verrouillage.",
|
||||
"somethingWentWrongMessage": "Quelque chose s'est mal passé, veuillez recommencer",
|
||||
"leaveFamily": "Quitter le plan familial",
|
||||
"leaveFamilyMessage": "Êtes-vous certains de vouloir quitter le plan familial?",
|
||||
"leaveFamilyMessage": "Êtes-vous sûr de vouloir quitter le plan familial ?",
|
||||
"inFamilyPlanMessage": "Vous êtes sur un plan familial !",
|
||||
"swipeHint": "Glisser vers la gauche pour modifier ou supprimer des codes",
|
||||
"scan": "Analyser",
|
||||
"scanACode": "Scanner un code",
|
||||
"verify": "Vérifier",
|
||||
"verifyEmail": "Vérifier l'e-mail",
|
||||
"enterCodeHint": "Saisir le code à 6 caractères de votre appli d'authentification",
|
||||
"enterCodeHint": "Entrez le code à 6 chiffres de votre application d'authentification",
|
||||
"lostDeviceTitle": "Appareil perdu ?",
|
||||
"twoFactorAuthTitle": "Authentification à deux facteurs",
|
||||
"passkeyAuthTitle": "Vérification du code d'accès",
|
||||
@@ -446,7 +446,9 @@
|
||||
"viewRawCodes": "Afficher les codes bruts",
|
||||
"rawCodes": "Codes bruts",
|
||||
"rawCodeData": "Données de code brut",
|
||||
"appLock": "Verrouillage d'application",
|
||||
"noSystemLockFound": "Aucun verrou système trouvé",
|
||||
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer un code d'accès ou le verrouillage de l'écran dans les paramètres de votre appareil.",
|
||||
"autoLock": "Verrouillage automatique",
|
||||
"immediately": "Immédiatement",
|
||||
"reEnterPassword": "Ressaisir le mot de passe",
|
||||
@@ -457,6 +459,9 @@
|
||||
"setNewPassword": "Définir un nouveau mot de passe",
|
||||
"deviceLock": "Verrouillage de l'appareil",
|
||||
"hideContent": "Masquer le contenu",
|
||||
"autoLockFeatureDescription": "Délai après lequel l'application se verrouille une fois qu'elle a été mise en arrière-plan",
|
||||
"appLockDescription": "Choisissez entre l'écran de verrouillage par défaut de votre appareil et un écran de verrouillage par code PIN ou mot de passe personnalisé.",
|
||||
"pinLock": "Verrouillage par code PIN",
|
||||
"enterPin": "Saisir le code PIN",
|
||||
"setNewPin": "Définir un nouveau code PIN",
|
||||
"importFailureDescNew": "Impossible de lire le fichier sélectionné."
|
||||
|
||||
@@ -20,10 +20,11 @@
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Vänligen logga in igen",
|
||||
"pleaseLoginAgain": "Logga in igen",
|
||||
"loggingOut": "Loggar ut...",
|
||||
"saveAction": "Spara",
|
||||
"nextTotpTitle": "nästa",
|
||||
"deleteCodeTitle": "Radera kod?",
|
||||
"deleteCodeMessage": "Vill du ta bort den här koden? Det går inte att ångra den här åtgärden.",
|
||||
"viewLogsAction": "Visa loggar",
|
||||
"emailLogsTitle": "E-posta loggar",
|
||||
@@ -63,6 +64,7 @@
|
||||
"importCodes": "Importera koder",
|
||||
"exportCodes": "Exportera koder",
|
||||
"importLabel": "Importera",
|
||||
"ok": "OK",
|
||||
"cancel": "Avbryt",
|
||||
"yes": "Ja",
|
||||
"no": "Nej",
|
||||
@@ -109,8 +111,21 @@
|
||||
"recoveryKeyOnForgotPassword": "Om du glömmer ditt lösenord är det enda sättet du kan återställa dina data med denna nyckel.",
|
||||
"saveKey": "Spara nyckel",
|
||||
"save": "Spara",
|
||||
"send": "Skicka",
|
||||
"back": "Tillbaka",
|
||||
"createAccount": "Skapa konto",
|
||||
"passwordStrength": "Lösenordsstyrka: {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": "Lösenord",
|
||||
"privacyPolicyTitle": "Integritetspolicy",
|
||||
"termsOfServicesTitle": "Villkor",
|
||||
@@ -151,6 +166,7 @@
|
||||
"incorrectRecoveryKey": "Felaktig återställningsnyckel",
|
||||
"enterPassword": "Ange lösenord",
|
||||
"export": "Exportera",
|
||||
"signInToBackup": "Logga in för att säkerhetskopiera dina koder",
|
||||
"singIn": "Logga in",
|
||||
"shouldHideCode": "Dölj koder",
|
||||
"androidCancelButton": "Avbryt",
|
||||
@@ -163,7 +179,11 @@
|
||||
},
|
||||
"noInternetConnection": "Ingen internetanslutning",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Kontrollera din internetanslutning och försök igen.",
|
||||
"signOutOtherDevices": "Logga ut andra enheter",
|
||||
"loginSessionExpiredDetails": "Din session har upphört. Logga in igen.",
|
||||
"create": "Skapa",
|
||||
"editTag": "Redigera tagg",
|
||||
"deleteTagTitle": "Radera tagg?",
|
||||
"immediately": "Omedelbart",
|
||||
"reEnterPassword": "Ange lösenord igen",
|
||||
"reEnterPin": "Ange PIN-kod igen",
|
||||
|
||||
1
auth/lib/l10n/arb/app_ta.arb
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -21,12 +21,13 @@
|
||||
"codeSecretKeyHint": "Khóa bí mật",
|
||||
"codeAccountHint": "Tài khoản (bạn@miền.com)",
|
||||
"codeTagHint": "Thẻ",
|
||||
"accountKeyType": "Loại khóa",
|
||||
"sessionExpired": "Phiên làm việc đã hết hạn",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Vui lòng đăng nhập lại",
|
||||
"loggingOut": "Đang thoát...",
|
||||
"loggingOut": "Đang đăng xuất...",
|
||||
"timeBasedKeyType": "Dựa trên thời gian (TOTP)",
|
||||
"counterBasedKeyType": "Dựa trên bộ đếm (HOTP)",
|
||||
"saveAction": "Lưu",
|
||||
@@ -74,7 +75,7 @@
|
||||
"supportDevs": "Đăng ký <bold-green>ente</bold-green> để hỗ trợ dự án này.",
|
||||
"supportDiscount": "Sử dụng mã giảm giá \"AUTH\" để được giảm 10% trong năm đầu tiên",
|
||||
"changeEmail": "Thay đổi email",
|
||||
"changePassword": "Thay đổi mật khẩu",
|
||||
"changePassword": "Đổi mật khẩu",
|
||||
"data": "Dữ liệu",
|
||||
"importCodes": "Nhập mã",
|
||||
"importTypePlainText": "Văn bản thuần",
|
||||
@@ -131,7 +132,7 @@
|
||||
"faq_a_4": "Bạn có thể hỗ trợ sự phát triển của dự án này bằng cách đăng ký ứng dụng Ảnh @ ente.io của chúng tôi.",
|
||||
"faq_q_5": "Làm sao để tôi bật FaceID trong ente",
|
||||
"faq_a_5": "Bạn có thể bật khóa FaceID trong Cài đặt → Bảo mật → Màn hình khóa.",
|
||||
"somethingWentWrongMessage": "Phát hiện có lỗi, xin thử lại",
|
||||
"somethingWentWrongMessage": "Đã xảy ra lỗi, xin thử lại",
|
||||
"leaveFamily": "Rời khỏi gia đình",
|
||||
"leaveFamilyMessage": "Bạn có chắc chắn muốn thoát khỏi gói dành cho gia đình không?",
|
||||
"inFamilyPlanMessage": "Bạn đang sử dụng gói dành cho gia đình!",
|
||||
@@ -141,7 +142,7 @@
|
||||
"verify": "Xác minh",
|
||||
"verifyEmail": "Xác nhận địa chỉ Email",
|
||||
"enterCodeHint": "Nhập mã gồm 6 chữ số từ ứng dụng xác thực của bạn",
|
||||
"lostDeviceTitle": "Bạn đã mất thiết bị?",
|
||||
"lostDeviceTitle": "Mất thiết bị?",
|
||||
"twoFactorAuthTitle": "Xác thực hai yếu tố",
|
||||
"recoverAccount": "Khôi phục tài khoản",
|
||||
"enterRecoveryKeyHint": "Nhập khóa khôi phục của bạn",
|
||||
@@ -154,6 +155,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidQRCode": "Mã QR không hợp lệ",
|
||||
"noRecoveryKeyTitle": "Không có khóa khôi phục?",
|
||||
"enterEmailHint": "Nhập địa chỉ email của bạn",
|
||||
"invalidEmailTitle": "Địa chỉ email không hợp lệ",
|
||||
@@ -177,6 +179,7 @@
|
||||
"security": "Bảo mật",
|
||||
"lockscreen": "Màn hình khoá",
|
||||
"authToChangeLockscreenSetting": "Vui lòng xác thực để thay đổi cài đặt màn hình khóa",
|
||||
"deviceLockEnablePreSteps": "Để bật khoá thiết bị, vui lòng thiết lập mật khẩu thiết bị hoặc khóa màn hình trong cài đặt hệ thống của bạn.",
|
||||
"viewActiveSessions": "Xem danh sách phiên làm việc hiện tại",
|
||||
"authToViewYourActiveSessions": "Vui lòng xác thực để xem danh sách phiên làm việc của bạn",
|
||||
"searchHint": "Tìm kiếm...",
|
||||
@@ -195,6 +198,8 @@
|
||||
"recoveryKeySaveDescription": "Chúng tôi không lưu trữ khóa này, vui lòng lưu khóa 24 từ này ở nơi an toàn.",
|
||||
"doThisLater": "Để sau",
|
||||
"saveKey": "Lưu khóa",
|
||||
"save": "Lưu",
|
||||
"send": "Gửi",
|
||||
"back": "Quay lại",
|
||||
"createAccount": "Tạo tài khoản",
|
||||
"passwordStrength": "Độ mạnh mật khẩu: {passwordStrengthValue}",
|
||||
@@ -253,6 +258,8 @@
|
||||
"exportLogs": "Xuất nhật ký",
|
||||
"enterYourRecoveryKey": "Nhập khóa khôi phục của bạn",
|
||||
"tempErrorContactSupportIfPersists": "Có vẻ như đã xảy ra sự cố. Vui lòng thử lại sau một thời gian. Nếu lỗi vẫn tiếp diễn, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi.",
|
||||
"networkHostLookUpErr": "Không thể kết nối đến Ente, vui lòng kiểm tra lại kết nối mạng. Nếu vẫn còn lỗi, xin vui lòng liên hệ hỗ trợ.",
|
||||
"networkConnectionRefusedErr": "Không thể kết nối đến Ente, vui lòng thử lại sau. Nếu vẫn còn lỗi, xin vui lòng liên hệ hỗ trợ.",
|
||||
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Có vẻ như đã xảy ra sự cố. Vui lòng thử lại sau một thời gian. Nếu lỗi vẫn tiếp diễn, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi.",
|
||||
"about": "Về chúng tôi",
|
||||
"weAreOpenSource": "Chúng tôi có mã nguồn mở!",
|
||||
@@ -342,6 +349,7 @@
|
||||
"deleteCodeAuthMessage": "Xác minh để xóa mã",
|
||||
"showQRAuthMessage": "Xác minh để hiển thị mã QR",
|
||||
"confirmAccountDeleteTitle": "Xác nhận xóa tài khoản",
|
||||
"confirmAccountDeleteMessage": "Tài khoản này được liên kết với các ứng dụng Ente trên các nền tảng khác, nếu bạn có sử dụng.\n\nDữ liệu đã tải lên của bạn, trên mọi nền tảng, sẽ bị lên lịch xóa và tài khoản của bạn sẽ bị xóa vĩnh viễn.",
|
||||
"androidBiometricHint": "Xác định danh tính",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
@@ -402,11 +410,37 @@
|
||||
"doNotSignOut": "Không được đăng xuất",
|
||||
"hearUsWhereTitle": "Bạn biết đến Ente bằng cách nào? (không bắt buộc)",
|
||||
"hearUsExplanation": "Chúng tôi không theo dõi lượt cài đặt ứng dụng. Sẽ rất hữu ích nếu bạn cho chúng tôi biết nơi bạn tìm thấy chúng tôi!",
|
||||
"recoveryKeySaved": "Đã lưu khoá dự phòng vào thư mục Tải về!",
|
||||
"waitingForVerification": "Đang chờ xác thực",
|
||||
"loginSessionExpired": "Phiên làm việc hết hạn",
|
||||
"loginSessionExpiredDetails": "Phiên làm việc hết hạn. Vui lòng đăng nhập lại.",
|
||||
"developerSettings": "Cài đặt cho nhà phát triển",
|
||||
"customEndpoint": "Đã kết nối đến",
|
||||
"pinText": "Ghim",
|
||||
"unpinText": "Bỏ ghim",
|
||||
"tags": "Thẻ",
|
||||
"createNewTag": "Tạo thẻ mới",
|
||||
"tag": "Thẻ",
|
||||
"create": "Tạo",
|
||||
"editTag": "Sửa thẻ",
|
||||
"deleteTagTitle": "Xóa thẻ?",
|
||||
"deleteTagMessage": "Bạn có chắc chắn muốn xóa thẻ này không? Hành động này không thể đảo ngược.",
|
||||
"updateNotAvailable": "Cập nhật không khả dụng",
|
||||
"viewRawCodes": "Xem mã nguồn",
|
||||
"rawCodes": "Mã nguồn",
|
||||
"appLock": "Khóa ứng dụng",
|
||||
"autoLock": "Tự động khóa",
|
||||
"immediately": "Tức thì",
|
||||
"reEnterPassword": "Nhập lại mật khẩu",
|
||||
"reEnterPin": "Nhập lại mã PIN",
|
||||
"next": "Tiếp",
|
||||
"tooManyIncorrectAttempts": "Quá nhiều lần thử không chính xác",
|
||||
"tapToUnlock": "Nhấn để mở khóa",
|
||||
"setNewPassword": "Đặt lại mật khẩu",
|
||||
"deviceLock": "Khóa thiết bị",
|
||||
"hideContent": "Ẩn nội dung",
|
||||
"hideContentDescriptionAndroid": "Ẩn nội dung khi chuyển ứng dụng và chặn chụp màn hình",
|
||||
"hideContentDescriptioniOS": "Ẩn nội dung khi chuyển ứng dụng",
|
||||
"pinLock": "Mã PIN",
|
||||
"enterPin": "Nhập mã PIN",
|
||||
"setNewPin": "Đổi mã PIN"
|
||||
|
||||
@@ -27,15 +27,15 @@
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "请重新登录",
|
||||
"loggingOut": "正在退出登录...",
|
||||
"timeBasedKeyType": "基于时间的 (TOTP)",
|
||||
"counterBasedKeyType": "基于计数器的(HOTP)",
|
||||
"loggingOut": "正在登出...",
|
||||
"timeBasedKeyType": "基于时间 (TOTP)",
|
||||
"counterBasedKeyType": "基于计数器 (HOTP)",
|
||||
"saveAction": "保存",
|
||||
"nextTotpTitle": "下一个",
|
||||
"deleteCodeTitle": "要删除代码吗?",
|
||||
"deleteCodeMessage": "您确定要删除此代码吗?此操作是不可逆的。",
|
||||
"deleteCodeMessage": "您确定要删除此代码吗?此操作不可逆。",
|
||||
"viewLogsAction": "查看日志",
|
||||
"sendLogsDescription": "这将跨日志发送以帮助我们调试您的问题。 虽然我们采取预防措施以确保不记录敏感信息,但我们鼓励您在共享这些日志之前先查看它们。",
|
||||
"sendLogsDescription": "这将发送日志以帮助我们调试您的问题。虽然我们采取预防措施确保不记录敏感信息,但我们建议您在共享这些日志之前先查看它们。",
|
||||
"preparingLogsTitle": "正在准备日志...",
|
||||
"emailLogsTitle": "电子邮件日志",
|
||||
"emailLogsMessage": "请将日志发送至 {email}",
|
||||
@@ -67,13 +67,13 @@
|
||||
"pleaseWait": "请稍候...",
|
||||
"generatingEncryptionKeysTitle": "正在生成加密密钥...",
|
||||
"recreatePassword": "重新创建密码",
|
||||
"recreatePasswordMessage": "当前设备的强度不足以验证您的密码, 所以我们需要以一种能够与所有设备一起运行的方式重新生成它。 \n\n请使用您的恢复密钥登录并重新生成您的密码 (如果您愿意,您可以再次使用相同密钥)。",
|
||||
"recreatePasswordMessage": "当前设备的功能不足以验证您的密码,因此我们需要以一种适用于所有设备的方式重新生成一次密码。\n\n请使用您的恢复密钥登录并重新生成您的密码(如果您愿意,可以再次使用相同的密码)。",
|
||||
"useRecoveryKey": "使用恢复密钥",
|
||||
"incorrectPasswordTitle": "密码错误",
|
||||
"welcomeBack": "欢迎回来!",
|
||||
"madeWithLoveAtPrefix": "用❤️制成 ",
|
||||
"supportDevs": "订阅 <bold-green>ente</bold-green> 以支持此项目。",
|
||||
"supportDiscount": "使用优惠券号码“AUTH”获得第一年优惠10%的折扣",
|
||||
"supportDiscount": "使用优惠码“AUTH”可享受首年 10% 折扣",
|
||||
"changeEmail": "修改邮箱",
|
||||
"changePassword": "修改密码",
|
||||
"data": "数据",
|
||||
@@ -83,29 +83,29 @@
|
||||
"passwordForDecryptingExport": "用来解密导出的密码",
|
||||
"passwordEmptyError": "密码不能为空",
|
||||
"importFromApp": "从 {appName} 导入代码",
|
||||
"importGoogleAuthGuide": "使用“转移帐户”选项将您的帐户从 Google 身份验证器导出到二维码。然后使用另一台设备扫描二维码。\n\n提示:您可以使用笔记本电脑的网络摄像头拍摄二维码的照片。",
|
||||
"importGoogleAuthGuide": "使用“转移账户”选项将您的账户从 Google Authenticator 导出到二维码。然后使用另一台设备扫描二维码。\n\n提示:您可以使用笔记本电脑的摄像头拍摄二维码的照片。",
|
||||
"importSelectJsonFile": "选择 JSON 文件",
|
||||
"importSelectAppExport": "选择 {appName} 的导出文件",
|
||||
"importEnteEncGuide": "选择从 Ente 导出的 JSON 加密文件",
|
||||
"importRaivoGuide": "使用 Raivo 设置中的“将 OTP 导出到 Zip 存档”选项。\n\n解压 zip 文件并导入 JSON 文件。",
|
||||
"importBitwardenGuide": "使用 Bitwarden 工具中的“导出保管库”选项并导入未加密的 JSON 文件。",
|
||||
"importAegisGuide": "在Aegis的设置中使用\"导出密码库\"选项。\n\n如果您的密码库已加密,您需要输入密码才能解密密码库。",
|
||||
"import2FasGuide": "使用 2FAS 中的“设置 -> 备份 - 导出”选项。\n\n如果您的备份已被加密,则需要输入密码才能解密备份",
|
||||
"importBitwardenGuide": "使用 Bitwarden 工具中的“导出密码库”选项并导入未加密的 JSON 文件。",
|
||||
"importAegisGuide": "使用 Aegis 设置中的“导出密码库”选项。\n\n如果您的密码库已加密,则需要输入密码库密码才能解密密码库。",
|
||||
"import2FasGuide": "使用 2FAS 中的“设置 -> 备份 -> 导出”选项。\n\n如果您的备份已加密,则需要输入密码来解密备份",
|
||||
"importLastpassGuide": "使用 Lastpass Authenticator 设置中的“转移账户”选项,然后按“将账户导出到文件”。导入下载的 JSON。",
|
||||
"exportCodes": "导出代码",
|
||||
"importLabel": "导入",
|
||||
"importInstruction": "请以以下格式选择包含代码列表的文件",
|
||||
"importInstruction": "请选择一个包含以下格式的代码列表的文件",
|
||||
"importCodeDelimiterInfo": "代码可以用逗号或新行分隔。",
|
||||
"selectFile": "选择文件",
|
||||
"emailVerificationToggle": "电子邮件验证",
|
||||
"emailVerificationEnableWarning": "如果您将 2FA 存储到我们的电子邮件中,则打开电子邮件验证可能会导致僵局。如果您被一项服务锁定,您可能无法登录另一项服务。",
|
||||
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件双重验证的副本。",
|
||||
"authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证",
|
||||
"authToViewYourRecoveryKey": "请验证以查看您的恢复密钥",
|
||||
"authToChangeYourEmail": "请验证以更改您的电子邮件",
|
||||
"authToChangeYourPassword": "请验证以更改密码",
|
||||
"authToViewSecrets": "请进行身份验证以查看您的秘密",
|
||||
"authToViewSecrets": "请进行身份验证以查看您的密钥",
|
||||
"authToInitiateSignIn": "请进行身份验证以启动登录进行备份。",
|
||||
"ok": "好的",
|
||||
"ok": "确定",
|
||||
"cancel": "取消",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
@@ -125,8 +125,8 @@
|
||||
"faq": "常见问题",
|
||||
"faq_q_1": "Auth 的安全性如何?",
|
||||
"faq_a_1": "您通过 Auth 备份的所有代码均以端到端加密方式存储。这意味着只有您可以访问您的代码。我们的应用程序是开源的并且我们的加密技术已经过外部审计。",
|
||||
"faq_q_2": "我可以在桌面上访问我的代码吗?",
|
||||
"faq_a_2": "您可以在 web @auth.ente.io 上访问您的代码。",
|
||||
"faq_q_2": "我可以在桌面设备上访问我的代码吗?",
|
||||
"faq_a_2": "您可以在网页 auth.ente.io 上访问您的代码。",
|
||||
"faq_q_3": "我如何删除代码?",
|
||||
"faq_a_3": "您可以通过向左滑动该项目来删除该代码。",
|
||||
"faq_q_4": "我该如何支持该项目?",
|
||||
@@ -240,9 +240,9 @@
|
||||
"ackPasswordLostWarning": "我明白,如果我丢失密码,我可能会丢失我的数据,因为我的数据是 <underline>端到端加密的</underline>。",
|
||||
"loginTerms": "点击登录后,我同意 <u-terms>服务条款</u-terms> 和 <u-policy>隐私政策</u-policy>",
|
||||
"logInLabel": "登录",
|
||||
"logout": "退出登录",
|
||||
"areYouSureYouWantToLogout": "您确定要退出登录吗?",
|
||||
"yesLogout": "是的,退出登陆",
|
||||
"logout": "登出",
|
||||
"areYouSureYouWantToLogout": "您确定要登出吗?",
|
||||
"yesLogout": "是的,登出",
|
||||
"exit": "退出",
|
||||
"verifyingRecoveryKey": "正在验证恢复密钥...",
|
||||
"recoveryKeyVerified": "恢复密钥已验证",
|
||||
@@ -299,7 +299,7 @@
|
||||
"sorry": "抱歉",
|
||||
"importFailureDesc": "无法解析选定的文件。\n如果您需要帮助,请写入support@ente.io!",
|
||||
"pendingSyncs": "警告",
|
||||
"pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在退出登录之前备份这些代码。",
|
||||
"pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在登出之前备份这些代码。",
|
||||
"checkInboxAndSpamFolder": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证",
|
||||
"tapToEnterCode": "点击以输入代码",
|
||||
"resendEmail": "重新发送电子邮件",
|
||||
@@ -316,8 +316,8 @@
|
||||
},
|
||||
"activeSessions": "已登录的设备",
|
||||
"somethingWentWrongPleaseTryAgain": "出了点问题,请重试",
|
||||
"thisWillLogYouOutOfThisDevice": "这将使您在此设备上退出登录!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "这将使您在以下设备中退出登录:",
|
||||
"thisWillLogYouOutOfThisDevice": "这将使您登出该设备!",
|
||||
"thisWillLogYouOutOfTheFollowingDevice": "这将使您登出以下设备:",
|
||||
"terminateSession": "是否终止会话?",
|
||||
"terminate": "终止",
|
||||
"thisDevice": "此设备",
|
||||
@@ -396,7 +396,7 @@
|
||||
"@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": "生物识别身份验证已禁用。请锁定并解锁屏幕以启用该功能。",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
@@ -410,11 +410,11 @@
|
||||
},
|
||||
"noInternetConnection": "无互联网连接",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "请检查您的互联网连接,然后重试。",
|
||||
"signOutFromOtherDevices": "从其他设备退出登录",
|
||||
"signOutOtherBody": "如果你认为有人可能知道你的密码,你可以强制所有使用你账户的其他设备退出登录。",
|
||||
"signOutFromOtherDevices": "从其他设备登出",
|
||||
"signOutOtherBody": "如果您认为有人可能知道您的密码,您可以强制所有其他使用您账户的设备登出。",
|
||||
"signOutOtherDevices": "登出其他设备",
|
||||
"doNotSignOut": "不要退登",
|
||||
"hearUsWhereTitle": "您是如何知道Ente的? (可选的)",
|
||||
"doNotSignOut": "不要登出",
|
||||
"hearUsWhereTitle": "您是怎么知道 Ente 的?(可选)",
|
||||
"hearUsExplanation": "我们不跟踪应用程序安装情况。如果您告诉我们您是在哪里找到我们的,将会有所帮助!",
|
||||
"recoveryKeySaved": "恢复密钥已保存在下载文件夹中!",
|
||||
"waitingForBrowserRequest": "正在等待浏览器请求...",
|
||||
|
||||
@@ -1,48 +1,56 @@
|
||||
import 'package:ente_auth/theme/ente_theme.dart';
|
||||
import 'package:ente_auth/ui/linear_progress_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
|
||||
class CodeTimerProgressCache {
|
||||
static final Map<int, CodeTimerProgress> _cache = {};
|
||||
|
||||
static CodeTimerProgress getCachedWidget(int period) {
|
||||
if (!_cache.containsKey(period)) {
|
||||
_cache[period] = CodeTimerProgress(period: period);
|
||||
}
|
||||
return _cache[period]!;
|
||||
}
|
||||
}
|
||||
|
||||
class CodeTimerProgress extends StatefulWidget {
|
||||
final int period;
|
||||
|
||||
CodeTimerProgress({
|
||||
const CodeTimerProgress({
|
||||
super.key,
|
||||
required this.period,
|
||||
});
|
||||
|
||||
@override
|
||||
State createState() => _CodeTimerProgressState();
|
||||
State<CodeTimerProgress> createState() => _CodeTimerProgressState();
|
||||
}
|
||||
|
||||
class _CodeTimerProgressState extends State<CodeTimerProgress>
|
||||
with SingleTickerProviderStateMixin {
|
||||
late final Ticker _ticker;
|
||||
double _progress = 0.0;
|
||||
late final ValueNotifier<double> _progress;
|
||||
late final int _microSecondsInPeriod;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_microSecondsInPeriod = widget.period * 1000000;
|
||||
_ticker = createTicker((elapsed) {
|
||||
_updateTimeRemaining();
|
||||
});
|
||||
_progress = ValueNotifier<double>(0.0);
|
||||
_ticker = createTicker(_updateTimeRemaining);
|
||||
_ticker.start();
|
||||
_updateTimeRemaining();
|
||||
_updateTimeRemaining(Duration.zero);
|
||||
}
|
||||
|
||||
void _updateTimeRemaining() {
|
||||
int timeRemaining = (_microSecondsInPeriod) -
|
||||
void _updateTimeRemaining(Duration elapsed) {
|
||||
int timeRemaining = _microSecondsInPeriod -
|
||||
(DateTime.now().microsecondsSinceEpoch % _microSecondsInPeriod);
|
||||
setState(() {
|
||||
_progress = (timeRemaining / _microSecondsInPeriod);
|
||||
});
|
||||
_progress.value = timeRemaining / _microSecondsInPeriod;
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_ticker.dispose();
|
||||
_progress.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -50,12 +58,46 @@ class _CodeTimerProgressState extends State<CodeTimerProgress>
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
height: 3,
|
||||
child: LinearProgressWidget(
|
||||
color: _progress > 0.4
|
||||
? getEnteColorScheme(context).primary700
|
||||
: Colors.orange,
|
||||
fractionOfStorage: _progress,
|
||||
child: ValueListenableBuilder<double>(
|
||||
valueListenable: _progress,
|
||||
builder: (context, progress, _) {
|
||||
return CustomPaint(
|
||||
painter: _ProgressPainter(
|
||||
progress: progress,
|
||||
color: progress > 0.4
|
||||
? getEnteColorScheme(context).primary700
|
||||
: Colors.orange,
|
||||
),
|
||||
size: Size.infinite,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _ProgressPainter extends CustomPainter {
|
||||
final double progress;
|
||||
final Color color;
|
||||
|
||||
_ProgressPainter({required this.progress, required this.color});
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final paint = Paint()
|
||||
..color = color
|
||||
..style = PaintingStyle.fill;
|
||||
|
||||
final rect = RRect.fromRectAndRadius(
|
||||
Rect.fromLTWH(0, 0, size.width * progress, size.height),
|
||||
const Radius.circular(2),
|
||||
);
|
||||
|
||||
canvas.drawRRect(rect, paint);
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldRepaint(_ProgressPainter oldDelegate) {
|
||||
return oldDelegate.progress != progress || oldDelegate.color != color;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ class _CodeWidgetState extends State<CodeWidget> {
|
||||
late bool _shouldShowLargeIcon;
|
||||
late bool _hideCode;
|
||||
bool isMaskingEnabled = false;
|
||||
int _codeTimeStep = -1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -57,11 +58,22 @@ class _CodeWidgetState extends State<CodeWidget> {
|
||||
_hideCode = isMaskingEnabled;
|
||||
_everySecondTimer =
|
||||
Timer.periodic(const Duration(milliseconds: 500), (Timer t) {
|
||||
String newCode = _getCurrentOTP();
|
||||
if (newCode != _currentCode.value) {
|
||||
_currentCode.value = newCode;
|
||||
if (widget.code.type.isTOTPCompatible) {
|
||||
_nextCode.value = _getNextTotp();
|
||||
int newStep = 0;
|
||||
if (widget.code.type != Type.hotp) {
|
||||
newStep = (((DateTime.now().millisecondsSinceEpoch ~/ 1000).round()) ~/
|
||||
widget.code.period)
|
||||
.floor();
|
||||
} else {
|
||||
newStep = widget.code.counter;
|
||||
}
|
||||
if (_codeTimeStep != newStep) {
|
||||
_codeTimeStep = newStep;
|
||||
String newCode = _getCurrentOTP();
|
||||
if (newCode != _currentCode.value) {
|
||||
_currentCode.value = newCode;
|
||||
if (widget.code.type.isTOTPCompatible) {
|
||||
_nextCode.value = _getNextTotp();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -111,8 +123,8 @@ class _CodeWidgetState extends State<CodeWidget> {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
if (widget.code.type.isTOTPCompatible)
|
||||
CodeTimerProgress(
|
||||
period: widget.code.period,
|
||||
CodeTimerProgressCache.getCachedWidget(
|
||||
widget.code.period,
|
||||
),
|
||||
const SizedBox(height: 28),
|
||||
Row(
|
||||
|
||||
@@ -55,6 +55,9 @@ class _HomePageState extends State<HomePage> {
|
||||
final Logger _logger = Logger("HomePage");
|
||||
final scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
// Used to request focus on the search box when clicked the search icon
|
||||
late FocusNode searchBoxFocusNode;
|
||||
|
||||
final TextEditingController _textController = TextEditingController();
|
||||
final bool _autoFocusSearch =
|
||||
PreferenceService.instance.shouldAutoFocusOnSearchBar();
|
||||
@@ -89,6 +92,8 @@ class _HomePageState extends State<HomePage> {
|
||||
setState(() {});
|
||||
});
|
||||
_showSearchBox = _autoFocusSearch;
|
||||
|
||||
searchBoxFocusNode = FocusNode();
|
||||
}
|
||||
|
||||
void _loadCodes() {
|
||||
@@ -158,6 +163,9 @@ class _HomePageState extends State<HomePage> {
|
||||
_triggerLogoutEvent?.cancel();
|
||||
_iconsChangedEvent?.cancel();
|
||||
_textController.removeListener(_applyFilteringAndRefresh);
|
||||
|
||||
searchBoxFocusNode.dispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -241,6 +249,7 @@ class _HomePageState extends State<HomePage> {
|
||||
border: InputBorder.none,
|
||||
focusedBorder: InputBorder.none,
|
||||
),
|
||||
focusNode: searchBoxFocusNode,
|
||||
),
|
||||
centerTitle: true,
|
||||
actions: <Widget>[
|
||||
@@ -258,6 +267,12 @@ class _HomePageState extends State<HomePage> {
|
||||
_searchText = "";
|
||||
} else {
|
||||
_searchText = _textController.text;
|
||||
|
||||
// Request focus on the search box
|
||||
// For Windows only for now. "Platform.isWindows" can be removed if other platforms has been tested.
|
||||
if (Platform.isWindows) {
|
||||
searchBoxFocusNode.requestFocus();
|
||||
}
|
||||
}
|
||||
_applyFilteringAndRefresh();
|
||||
},
|
||||
|
||||
@@ -129,8 +129,10 @@ Future<int?> _processAegisExportFile(
|
||||
}
|
||||
final Map<String, String> groupIDToName = {};
|
||||
try {
|
||||
for (var item in aegisDB?['groups']) {
|
||||
groupIDToName[item['uuid']] = item['name'];
|
||||
if (aegisDB?['groups'] != null) {
|
||||
for (var item in aegisDB?['groups']) {
|
||||
groupIDToName[item['uuid']] = item['name'];
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
Logger("AegisImport").warning("Failed to parse groups", e);
|
||||
@@ -149,9 +151,11 @@ Future<int?> _processAegisExportFile(
|
||||
var digits = item['info']['digits'];
|
||||
|
||||
var counter = item['info']['counter'];
|
||||
for (var group in item['groups']) {
|
||||
if (groupIDToName.containsKey(group)) {
|
||||
tags.add(groupIDToName[group]!);
|
||||
if (item['groups'] != null) {
|
||||
for (var group in item['groups']) {
|
||||
if (groupIDToName.containsKey(group)) {
|
||||
tags.add(groupIDToName[group]!);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Build the OTP URL
|
||||
|
||||
@@ -67,13 +67,13 @@ class _AppLockState extends State<AppLock> with WidgetsBindingObserver {
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
|
||||
this._didUnlockForAppLaunch = !this.widget.enabled;
|
||||
this._isLocked = false;
|
||||
this._enabled = this.widget.enabled;
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
@@ -40,10 +39,6 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
invalidAttemptCount = _lockscreenSetting.getInvalidAttemptCount();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
||||
if (isNonMobileIOSDevice()) {
|
||||
_logger.info('ignore init for non mobile iOS device');
|
||||
return;
|
||||
}
|
||||
_showLockScreen(source: "postFrameInit");
|
||||
});
|
||||
_platformBrightness =
|
||||
@@ -190,14 +185,6 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
|
||||
);
|
||||
}
|
||||
|
||||
bool isNonMobileIOSDevice() {
|
||||
if (Platform.isAndroid) {
|
||||
return false;
|
||||
}
|
||||
var shortestSide = MediaQuery.of(context).size.shortestSide;
|
||||
return shortestSide > 600 ? true : false;
|
||||
}
|
||||
|
||||
void _onLogoutTapped(BuildContext context) {
|
||||
showChoiceActionSheet(
|
||||
context,
|
||||
|
||||
@@ -24,7 +24,7 @@ class LockScreenSettings {
|
||||
static const keyHasMigratedLockScreenChanges =
|
||||
"ls_has_migrated_lock_screen_changes";
|
||||
final List<Duration> autoLockDurations = const [
|
||||
Duration(seconds: 0),
|
||||
Duration(milliseconds: 650),
|
||||
Duration(seconds: 5),
|
||||
Duration(seconds: 15),
|
||||
Duration(minutes: 1),
|
||||
|
||||
@@ -89,22 +89,14 @@ If you fancy Docker, you can also run the CLI within a container.
|
||||
Modify the `docker-compose.yml` and add volume. ``cli-data`` volume is
|
||||
mandatory, you can add more volumes for your export directory.
|
||||
|
||||
Build the docker image
|
||||
|
||||
Build and run the container in detached mode
|
||||
```shell
|
||||
docker build -t ente:latest .
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
Note that [BuildKit](https://docs.docker.com/go/buildkit/) is needed to build
|
||||
this image. If you face this issue, a quick fix is to add `DOCKER_BUILDKIT=1` in
|
||||
front of the build command.
|
||||
|
||||
Start the container in detached mode
|
||||
|
||||
```shell
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
`exec` into the container
|
||||
```shell
|
||||
docker-compose exec ente-cli /bin/sh -c "./ente-cli version"
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
version: '3'
|
||||
services:
|
||||
ente-cli:
|
||||
image: ente-cli:latest
|
||||
build:
|
||||
context: .
|
||||
tags:
|
||||
- ente-cli:latest
|
||||
command: /bin/sh
|
||||
volumes:
|
||||
# This is mandatory to mount the local directory to the container at /cli-data
|
||||
|
||||
26
desktop/.github/workflows/desktop-release.yml
vendored
@@ -60,6 +60,30 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: yarn install
|
||||
|
||||
- name: Create universal ffmpeg binaries for macOS
|
||||
if: startsWith(matrix.os, 'macos')
|
||||
# Currently, the ffmpeg-static binaries are not universal (Not
|
||||
# their fault, we thank them for their useful package, the issue
|
||||
# is that there don't seem to be well known upstream sources that
|
||||
# provide a universal binary).
|
||||
#
|
||||
# As a workaround, we invoke ffmpeg-static twice to download both
|
||||
# the Intel and ARM binaries, and combine them into a single
|
||||
# universal binary using lipo.
|
||||
#
|
||||
# Note that the yarn install will run again, as part of the
|
||||
# "build:ci" step, so we're relying on ffmpeg-static install.js's
|
||||
# behaviour of not overwriting the existing file named `ffmpeg`.
|
||||
run: |
|
||||
rm -f node_modules/ffmpeg-static/ffmpeg
|
||||
npm_config_arch=arm64 yarn add --check-files ffmpeg-static
|
||||
mv node_modules/ffmpeg-static/ffmpeg ffmpeg-arm64
|
||||
npm_config_arch=x64 yarn add --check-files ffmpeg-static
|
||||
mv node_modules/ffmpeg-static/ffmpeg ffmpeg-x64
|
||||
lipo -create ffmpeg-arm64 ffmpeg-x64 -output node_modules/ffmpeg-static/ffmpeg
|
||||
rm ffmpeg-arm64 ffmpeg-x64
|
||||
file node_modules/ffmpeg-static/ffmpeg # print what we ended up with
|
||||
|
||||
- name: Install libarchive-tools for pacman build
|
||||
if: startsWith(matrix.os, 'ubuntu')
|
||||
# See:
|
||||
@@ -67,7 +91,7 @@ jobs:
|
||||
run: sudo apt-get install libarchive-tools
|
||||
|
||||
- name: Build
|
||||
uses: ente-io/action-electron-builder@v1.0.0
|
||||
uses: ente-io/action-electron-builder@eff78a1d33bdab4c54ede0e5cdc71e0c2cf803e2
|
||||
with:
|
||||
package_root: desktop
|
||||
build_script_name: build:ci
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
# CHANGELOG
|
||||
|
||||
## v1.7.4 (Unreleased)
|
||||
## v1.7.5 (Unreleased)
|
||||
|
||||
- .
|
||||
|
||||
## v1.7.4
|
||||
|
||||
- Improved date search, including support for day of week and hour of day.
|
||||
- .
|
||||
- Fix video thumbnail generation and upload on Intel macOS.
|
||||
- Club a photo and video into a live photo only if both are within 2 minutes.
|
||||
- Fix an issue causing ZIP uploads to sometimes fail.
|
||||
|
||||
## v1.7.3
|
||||
|
||||
|
||||
@@ -95,6 +95,10 @@ Some extra ones specific to the code here are:
|
||||
for allowing us to set environment variables in a way that also works on
|
||||
Windows.
|
||||
|
||||
- We don't need `ajv`, but it is a transitive dependency which breaks the
|
||||
build if we let its version be resolved via the yarn resolution mechanism.
|
||||
Taking a direct dependency on it is the easiest workaround for now.
|
||||
|
||||
## Functionality
|
||||
|
||||
### Format conversion
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ente",
|
||||
"version": "1.7.4-beta",
|
||||
"version": "1.7.4",
|
||||
"private": true,
|
||||
"description": "Desktop client for Ente Photos",
|
||||
"repository": "github:ente-io/photos-desktop",
|
||||
@@ -45,6 +45,7 @@
|
||||
"@types/auto-launch": "^5.0.5",
|
||||
"@types/eslint__js": "^8.42.3",
|
||||
"@types/ffmpeg-static": "^3.0.3",
|
||||
"ajv": "^8.17.1",
|
||||
"concurrently": "^8.2.2",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^30.4.0",
|
||||
|
||||
@@ -65,9 +65,9 @@ export const markClosableZip = (zipPath: string) => {
|
||||
*/
|
||||
export const clearOpenZipCache = () => {
|
||||
if (_refCount.size > 0) {
|
||||
const keys = JSON.stringify([..._refCount.keys()]);
|
||||
const kvs = JSON.stringify([..._refCount.entries()]);
|
||||
throw new Error(
|
||||
`Attempting to clear zip file cache when some items are still in use: ${keys}`,
|
||||
`Attempting to clear zip file cache when some items are still in use: ${kvs}`,
|
||||
);
|
||||
}
|
||||
_cache.clear();
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
import { net, protocol } from "electron/main";
|
||||
import { randomUUID } from "node:crypto";
|
||||
import fs from "node:fs/promises";
|
||||
import { Readable } from "node:stream";
|
||||
import { ReadableStream } from "node:stream/web";
|
||||
import { Writable } from "node:stream";
|
||||
import { pathToFileURL } from "node:url";
|
||||
import log from "./log";
|
||||
import { ffmpegConvertToMP4 } from "./services/ffmpeg";
|
||||
@@ -120,20 +119,27 @@ const handleReadZip = async (zipPath: string, entryName: string) => {
|
||||
return new Response("", { status: 404 });
|
||||
}
|
||||
|
||||
// This returns an "old style" NodeJS.ReadableStream.
|
||||
// zip.stream returns an "old style" NodeJS.ReadableStream. We then write it
|
||||
// to the writable end of the web stream pipe, the readable end of which is
|
||||
// relayed back to the renderer as the response.
|
||||
const { writable, readable } = new TransformStream();
|
||||
const stream = await zip.stream(entry);
|
||||
// Convert it into a new style NodeJS.Readable.
|
||||
const nodeReadable = new Readable({ emitClose: true }).wrap(stream);
|
||||
// Then convert it into a Web stream.
|
||||
const webReadableStreamAny = Readable.toWeb(nodeReadable);
|
||||
// However, we get a ReadableStream<any> now. This doesn't go into the
|
||||
// `BodyInit` expected by the Response constructor, which wants a
|
||||
// ReadableStream<Uint8Array>. Force a cast.
|
||||
const webReadableStream =
|
||||
webReadableStreamAny as ReadableStream<Uint8Array>;
|
||||
|
||||
// Let go of the zip handle when the underlying stream closes.
|
||||
nodeReadable.on("close", () => markClosableZip(zipPath));
|
||||
const nodeWritable = Writable.fromWeb(writable);
|
||||
stream.pipe(nodeWritable);
|
||||
|
||||
nodeWritable.on("error", (e: unknown) => {
|
||||
// If the renderer process closes the network connection (say when it
|
||||
// only needs the content-length and doesn't care about the body), we
|
||||
// get an AbortError. Handle them here otherwise they litter the logs
|
||||
// with unhandled exceptions.
|
||||
if (e instanceof Error && e.name == "AbortError") return;
|
||||
log.error("Error event for the writable end of zip stream", e);
|
||||
});
|
||||
|
||||
nodeWritable.on("close", () => {
|
||||
markClosableZip(zipPath);
|
||||
});
|
||||
|
||||
// While it is documented that entry.time is the modification time,
|
||||
// the units are not mentioned. By seeing the source code, we can
|
||||
@@ -142,8 +148,7 @@ const handleReadZip = async (zipPath: string, entryName: string) => {
|
||||
// https://github.com/antelle/node-stream-zip/blob/master/node_stream_zip.js
|
||||
const modifiedMs = entry.time;
|
||||
|
||||
// @ts-expect-error [Note: Node and web stream type mismatch]
|
||||
return new Response(webReadableStream, {
|
||||
return new Response(readable, {
|
||||
headers: {
|
||||
// We don't know the exact type, but it doesn't really matter, just
|
||||
// set it to a generic binary content-type so that the browser
|
||||
|
||||
@@ -531,7 +531,7 @@ ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4:
|
||||
json-schema-traverse "^0.4.1"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
ajv@^8.0.0, ajv@^8.6.3:
|
||||
ajv@^8.0.0, ajv@^8.17.1, ajv@^8.6.3:
|
||||
version "8.17.1"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
|
||||
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
|
||||
|
||||
@@ -205,6 +205,15 @@ export const sidebar = [
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Troubleshooting",
|
||||
items: [
|
||||
{
|
||||
text: "Windows login",
|
||||
link: "/auth/troubleshooting/windows-login",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -259,6 +268,10 @@ export const sidebar = [
|
||||
text: "Shared albums",
|
||||
link: "/self-hosting/faq/sharing",
|
||||
},
|
||||
{
|
||||
text: "Backups",
|
||||
link: "/self-hosting/faq/backup",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
43
docs/docs/auth/troubleshooting/windows-login.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: Unable to login on Windows Desktop
|
||||
description:
|
||||
Troubleshooting when you are not able to login or register on Ente Auth app on Windows
|
||||
---
|
||||
|
||||
|
||||
|
||||
# Windows Login Error
|
||||
|
||||
|
||||
### HandshakeException: Handshake error in client
|
||||
|
||||
This error usually happens when the Trusted Root certificates on your Windows machine are outdated.
|
||||
|
||||
To update the Trusted Root Certificates on Windows, you can use the `certutil` command. Here are the steps to do so:
|
||||
|
||||
1. **Open Command Prompt as Administrator**:
|
||||
- Press `Windows + X` and select `Command Prompt (Admin)` or `Windows PowerShell (Admin)`.
|
||||
|
||||
2. **Run the following command to update the root certificates**:
|
||||
```bash
|
||||
certutil -generateSSTFromWU roots.sst
|
||||
```
|
||||
This command will generate a file named `roots.sst` that contains the latest root certificates from Windows Update.
|
||||
|
||||
3. **Install the new root certificates**:
|
||||
```bash
|
||||
certutil -addstore -f ROOT roots.sst
|
||||
```
|
||||
This command will add the certificates from the `roots.sst` file to the Trusted Root Certification Authorities store.
|
||||
|
||||
4. **Clean up**:
|
||||
After the installation, you can delete the `roots.sst` file if you no longer need it:
|
||||
```bash
|
||||
del roots.sst
|
||||
```
|
||||
|
||||
Make sure to restart your application after updating the certificates to ensure the changes take effect.
|
||||
|
||||
If the above steps don't resolve the issue, please follow [this guide](https://woshub.com/updating-trusted-root-certificates-in-windows-10/#h2_3) to update your trusted root certicates, and try again.
|
||||
|
||||
|
||||
@@ -57,11 +57,15 @@ in the unlikely event of a server breach, your data remains protected.
|
||||
|
||||
### What happens if I forget my password?
|
||||
|
||||
You can reset your password using your recovery key. This key is a randomly
|
||||
generated string provided to you during account creation. Store it securely, as
|
||||
it's your lifeline if you forget your password. If you lose both your password
|
||||
and recovery key, we cannot recover your account or data due to our
|
||||
zero-knowledge architecture.
|
||||
You can reset your password using your recovery key that was provided to you
|
||||
during account creation. Please store this key securely, as it's your lifeline
|
||||
if you forget your password.
|
||||
|
||||
If you lose both your password and recovery key, we cannot recover your account
|
||||
or data due to our end-to-end encrypted architecture.
|
||||
|
||||
If you wish to delete your account in such scenarios, please reach out to
|
||||
support@ente.io and we will help you out.
|
||||
|
||||
### Can I change my password?
|
||||
|
||||
|
||||
@@ -137,6 +137,29 @@ upgrade to the 200 GB yearly plan, then
|
||||
|
||||
The same applies to monthly plans.
|
||||
|
||||
## What happens when I downgrade my plan?
|
||||
|
||||
Your new plan will go into effect immediately. Any extra amount you have paid
|
||||
will be credited to your account. This credit will be discounted from your
|
||||
future invoices.
|
||||
|
||||
For example, if you are half way through the year on the 200 GB yearly plan, and
|
||||
downgrade to the 50 GB yearly plan, then
|
||||
|
||||
- The new 50 GB yearly plan will go into effect immediately.
|
||||
|
||||
- We will calculate a credit by subtracting half the price of the 50 GB plan
|
||||
from half the price of the 200 GB plan. This will be credited to your
|
||||
account.
|
||||
|
||||
- This credited amount will be discounted from your next invoice, which will
|
||||
be due in half a year.
|
||||
|
||||
The same applies to monthly plans.
|
||||
|
||||
If you prefer to have this credit refunded to your original payment method,
|
||||
please contact support@ente.io, and we'll assist you.
|
||||
|
||||
## Is there an x GB plan?
|
||||
|
||||
We have experimented quite a bit and have found it hard to design a single
|
||||
|
||||
@@ -57,6 +57,26 @@ If you wish to collect photos from folks who are not Ente, you can do so with
|
||||
our Links. Simply tick the box that says "Allow uploads", and anyone who has
|
||||
access to the link will be able to add photos to your album.
|
||||
|
||||
## Organization
|
||||
|
||||
You can favorite items that have been shared with you, and organize them into
|
||||
your own albums.
|
||||
|
||||
When you perform these operations, Ente will create a hard copy of these items,
|
||||
that you fully own. This means, these copied items will count against your
|
||||
storage space.
|
||||
|
||||
We understand there are use cases where this approach will consume extra space
|
||||
(for eg. if you are organizing photos of a family member). We chose hard copies
|
||||
as a first version to avoid complexities regarding the ownership of shared
|
||||
items, in case the original owner were to delete it from their own library.
|
||||
|
||||
We plan to tackle these complexities in the future, by copying a reference to
|
||||
the item that was shared, instead of the actual file, so that your storage will
|
||||
only get consumed if the original owner deletes it from their library. If this
|
||||
sounds useful to you, please participate in [this
|
||||
discussion](https://github.com/ente-io/ente/discussions/790).
|
||||
|
||||
## Technical details
|
||||
|
||||
More details, including technical aspect about how the sharing features were
|
||||
|
||||
@@ -39,10 +39,21 @@ it with Ente.
|
||||
8. Wait for Google to send you your data.
|
||||
|
||||
9. Open [our desktop app](https://ente.io/download/desktop), click on "Upload",
|
||||
select "Google takeout" and pick the ZIP file you just downloaded.
|
||||
select "Google takeout" and pick the ZIP file you just downloaded. If you
|
||||
were provided with multiple ZIP files, please extract **all** the ZIP files
|
||||
into one folder and select that folder instead.
|
||||
|
||||
> If you were provided with multiple ZIP files, please extract **all** the files
|
||||
> into one folder and select that folder instead.
|
||||
> While the app supports uploading multiple ZIPs too, we recommend unzipping
|
||||
> them all into a single folder and uploading that folder instead so that your
|
||||
> photo dates are imported properly
|
||||
> ([details](/photos/faq/photo-dates#importing-from-google-takeout)).
|
||||
>
|
||||
> <br />
|
||||
>
|
||||
> Note that you can still preserve your albums even when uploading a single
|
||||
> folder - select the create new album option and the app will ask you if you
|
||||
> want to put each leaf folder into a separate album
|
||||
> ([details](/photos/features/albums#uploading-a-nested-folder)).
|
||||
|
||||
{width=400px}
|
||||
|
||||
|
||||
@@ -22,6 +22,11 @@ canvas.
|
||||
|
||||
## Desktop
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> This issue has been fixed in the latest beta releases, and the fix will be
|
||||
> also out in the next release, 1.7.4.
|
||||
|
||||
The only known case where thumbnails might be missing on desktop is when
|
||||
uploading **videos** during a Google Takeout or watched folder sync on **Intel
|
||||
macOS** machines. This is because the bundled ffmpeg that we use does not work
|
||||
|
||||
65
docs/docs/self-hosting/faq/backup.md
Normal file
@@ -0,0 +1,65 @@
|
||||
---
|
||||
title: Backups
|
||||
description: General introduction to backing up your self hosted Ente instance
|
||||
---
|
||||
|
||||
# Backing up your Ente instance
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> This is not meant to be a comprehensive and bullet proof guide. There are many
|
||||
> moving parts, and small mistakes might make your backups unusable.
|
||||
>
|
||||
> Please treat this only as a general introduction. And remember to test your
|
||||
> restores.
|
||||
|
||||
At the minimum, a functional Ente backend needs three things:
|
||||
|
||||
1. Museum (the API server)
|
||||
2. Postgres (the database)
|
||||
3. Object storage (any S3-compatible object storage)
|
||||
|
||||
When thinking about backups, this translates into backing up the relevant state
|
||||
from each of these:
|
||||
|
||||
1. For museum, you'd want to backup your `museum.yaml`, `credentials.yaml` or
|
||||
any other custom configuration that you created. In particular, you should
|
||||
backup the
|
||||
[secrets that are specific to your instance](https://github.com/ente-io/ente/blob/74377a93d8e20e969d9a2531f32f577b5f0ef090/server/configurations/local.yaml#L188)
|
||||
(`key.encryption`, `key.hash` and `jwt.secret`).
|
||||
|
||||
2. For postgres, the entire data volume needs to be backed up.
|
||||
|
||||
3. For object storage, the entire data volume needs to be backed up.
|
||||
|
||||
A common oversight is taking a lot of care for backing up the object storage,
|
||||
even going as far as enabling replication and backing up the the multiple object
|
||||
storage volumes, but not applying the same care to the database backup.
|
||||
|
||||
While the actual encrypted photos are indeed stored in the object storage,
|
||||
**this encrypted data will not be usable without the database** since the
|
||||
database contains information like a file specific encryption key.
|
||||
|
||||
Viewed differently, to decrypt your data you need three pieces of information:
|
||||
|
||||
1. The encrypted file data itself (which comes from the object storage backup).
|
||||
|
||||
2. The ([encrypted](https://ente.io/architecture/)) file and collection specific
|
||||
encryption keys (which come from the database backup).
|
||||
|
||||
3. The master key (which comes from your password).
|
||||
|
||||
---
|
||||
|
||||
If you're starting out with self hosting, our recommendation is to start by
|
||||
keeping a plaintext backup of your photos.
|
||||
[You can use the CLI or the desktop app to automate this](/photos/faq/export).
|
||||
|
||||
Once you get more comfortable with the various parts, you can try backing up
|
||||
your instance. As a reference,
|
||||
[this document outlines how Ente itself treats backups](https://ente.io/reliability).
|
||||
|
||||
If you stop doing plaintext backups and instead rely on your instance backup,
|
||||
ensure that you do the full restore process also to verify you can get back your
|
||||
data. As the industry saying goes, a backup without a restore is no backup at
|
||||
all.
|
||||
@@ -78,3 +78,7 @@ internal:
|
||||
You can use
|
||||
[account list](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_account_list.md)
|
||||
command to find the user id of any account.
|
||||
|
||||
## Backups
|
||||
|
||||
See this [FAQ](/self-hosting/faq/backup).
|
||||
|
||||
1
mobile/.gitignore
vendored
@@ -40,4 +40,3 @@ android/.settings/
|
||||
.env
|
||||
|
||||
fastlane/report.xml
|
||||
TensorFlowLiteC.framework
|
||||
|
||||
@@ -46,7 +46,7 @@ You can alternatively install the build from PlayStore or F-Droid.
|
||||
|
||||
## 🧑💻 Building from source
|
||||
|
||||
1. [Install Flutter v3.22.2](https://flutter.dev/docs/get-started/install).
|
||||
1. [Install Flutter v3.24.1](https://flutter.dev/docs/get-started/install).
|
||||
|
||||
2. Pull in all submodules with `git submodule update --init --recursive`
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<resources>
|
||||
<string name="app_name">ente debug</string>
|
||||
<string name="app_name">Ente Debug</string>
|
||||
<string name="backup">backup debug</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<resources>
|
||||
<string name="app_name">ente dev</string>
|
||||
<string name="app_name">Ente Dev</string>
|
||||
<string name="backup">backup dev</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<resources>
|
||||
<string name="app_name">ente face</string>
|
||||
<string name="app_name">Ente Face</string>
|
||||
<string name="backup">backup face</string>
|
||||
</resources>
|
||||
|
||||
@@ -1 +1 @@
|
||||
Ente Photos is an open source photos app, that provides end-to-end encrypted backups for your photos and videos.
|
||||
Ente Photos is an open source photos app, that provides end-to-end encrypted backups for your photos and videos.
|
||||
@@ -6,15 +6,20 @@ files:
|
||||
translation: /lib/l10n/intl_%two_letters_code%.arb
|
||||
dest: /%original_file_name%
|
||||
type: arb
|
||||
skip_untranslated_strings: true
|
||||
skip_untranslated_files: false
|
||||
- source: /fastlane/metadata/playstore/en-US/*.txt
|
||||
translation: /fastlane/metadata/playstore/%two_letters_code%/%original_file_name%
|
||||
dest: /playstore/%original_file_name%
|
||||
type: txt
|
||||
skip_untranslated_files: true
|
||||
- source: /fastlane/metadata/android/en-US/*.txt
|
||||
translation: /fastlane/metadata/android/%two_letters_code%/%original_file_name%
|
||||
dest: /fdroid/%original_file_name%
|
||||
type: txt
|
||||
skip_untranslated_files: true
|
||||
- source: /fastlane/metadata/ios/en-US/*.txt
|
||||
translation: /fastlane/metadata/ios/%two_letters_code%/%original_file_name%
|
||||
dest: /appstore/%original_file_name%
|
||||
type: txt
|
||||
skip_untranslated_files: true
|
||||
|
||||
@@ -12,23 +12,4 @@ cd ios && pod install && cd ..
|
||||
```sh
|
||||
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
|
||||
sudo xcodebuild -runFirstLaunch
|
||||
```
|
||||
|
||||
#### Error (Xcode): Framework not found TensorFlowLiteC
|
||||
|
||||
Copy tflite package from pub.dev to pub.dartlang.org
|
||||
|
||||
```sh
|
||||
cp -r ~/.pub-cache/hosted/pub.dev/tflite_flutter-0.9.1 ~/.pub-cache/hosted/pub.dartlang.org/tflite_flutter-0.9.1
|
||||
```
|
||||
|
||||
Run setup.sh
|
||||
```bash
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
Install the pod again
|
||||
|
||||
```bash
|
||||
cd ios && pod install && cd ..
|
||||
```
|
||||
```
|
||||
1
mobile/fastlane/metadata/ios/da/keywords.txt
Normal file
@@ -0,0 +1 @@
|
||||
fotos,fotografi,familie, privatliv, sky,backup,videoer,foto,kryptering,lager,album,alternativ
|
||||
1
mobile/fastlane/metadata/ios/da/name.txt
Normal file
@@ -0,0 +1 @@
|
||||
Ente Photos
|
||||
@@ -472,7 +472,7 @@ SPEC CHECKSUMS:
|
||||
image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43
|
||||
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
||||
in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892
|
||||
integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4
|
||||
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
|
||||
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
|
||||
local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98
|
||||
local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import Flutter
|
||||
import UIKit
|
||||
import AVFoundation
|
||||
|
||||
@UIApplicationMain
|
||||
@main
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
@@ -12,11 +13,36 @@ import UIKit
|
||||
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
|
||||
}
|
||||
|
||||
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
|
||||
let audioSessionChannel = FlutterMethodChannel(name: "io.ente.frame/audio_session",
|
||||
binaryMessenger: controller.binaryMessenger)
|
||||
|
||||
audioSessionChannel.setMethodCallHandler({
|
||||
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
|
||||
if call.method == "setAudioSessionCategory" {
|
||||
self.setAudioSessionCategory(result: result)
|
||||
} else {
|
||||
result(FlutterMethodNotImplemented)
|
||||
}
|
||||
})
|
||||
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
|
||||
private func setAudioSessionCategory(result: @escaping FlutterResult) {
|
||||
do {
|
||||
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .defaultToSpeaker])
|
||||
try AVAudioSession.sharedInstance().setActive(true)
|
||||
result(nil)
|
||||
} catch {
|
||||
result(FlutterError(code: "AUDIO_SESSION_ERROR",
|
||||
message: "Failed to set audio session category",
|
||||
details: error.localizedDescription))
|
||||
}
|
||||
}
|
||||
|
||||
override func applicationDidBecomeActive(_ application: UIApplication) {
|
||||
signal(SIGPIPE, SIG_IGN)
|
||||
}
|
||||
|
||||
16
mobile/lib/audio_session_handler.dart
Normal file
@@ -0,0 +1,16 @@
|
||||
import "package:flutter/services.dart";
|
||||
import "package:logging/logging.dart";
|
||||
|
||||
class AudioSessionHandler {
|
||||
static final _logger = Logger("AudioSessionHandler");
|
||||
static const MethodChannel _channel =
|
||||
MethodChannel('io.ente.frame/audio_session');
|
||||
|
||||
static Future<void> setAudioSessionCategory() async {
|
||||
try {
|
||||
await _channel.invokeMethod('setAudioSessionCategory');
|
||||
} on PlatformException catch (e) {
|
||||
_logger.warning("Failed to set audio session category: '${e.message}'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
59
mobile/lib/core/error-reporting/isolate_logging.dart
Normal file
@@ -0,0 +1,59 @@
|
||||
import "dart:collection" show Queue;
|
||||
import "dart:convert" show jsonEncode, jsonDecode;
|
||||
|
||||
import "package:logging/logging.dart";
|
||||
import "package:photos/core/error-reporting/super_logging.dart";
|
||||
|
||||
class IsolateLogString {
|
||||
final String logString;
|
||||
final Object? error;
|
||||
|
||||
IsolateLogString(this.logString, this.error);
|
||||
|
||||
String toJsonString() => jsonEncode({
|
||||
'logString': logString,
|
||||
'error': error,
|
||||
});
|
||||
|
||||
static IsolateLogString fromJsonString(String jsonString) {
|
||||
final json = jsonDecode(jsonString);
|
||||
return IsolateLogString(
|
||||
json['logString'] as String,
|
||||
json['error'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class IsolateLogger {
|
||||
final Queue<IsolateLogString> fileQueueEntries = Queue();
|
||||
|
||||
Future onLogRecordInIsolate(LogRecord rec) async {
|
||||
final str = rec.toPrettyString(null, true);
|
||||
|
||||
// write to stdout
|
||||
SuperLogging.printLog(str);
|
||||
|
||||
// push to log queue
|
||||
fileQueueEntries.add(IsolateLogString(str, rec.error != null));
|
||||
}
|
||||
|
||||
/// WARNING: only call this from the isolate
|
||||
Queue<String> getLogStringsAndClear() {
|
||||
if (fileQueueEntries.isEmpty) return Queue<String>();
|
||||
final result = Queue<String>();
|
||||
while (fileQueueEntries.isNotEmpty) {
|
||||
final entry = fileQueueEntries.removeFirst();
|
||||
result.add(entry.toJsonString());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// WARNING: only call this from the main thread
|
||||
static void handLogStringsToMainLogger(List<String> logs) {
|
||||
while (logs.isNotEmpty) {
|
||||
final logString = logs.removeAt(0);
|
||||
final log = IsolateLogString.fromJsonString(logString);
|
||||
SuperLogging.saveLogString(log.logString, log.error);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -38,8 +38,9 @@ extension SuperString on String {
|
||||
}
|
||||
|
||||
extension SuperLogRecord on LogRecord {
|
||||
String toPrettyString([String? extraLines]) {
|
||||
final header = "[$loggerName] [$level] [$time]";
|
||||
String toPrettyString([String? extraLines, bool inIsolate = false]) {
|
||||
final header =
|
||||
"[$loggerName${inIsolate ? " (in isolate)" : ""}] [$level] [$time]";
|
||||
|
||||
var msg = "$header $message";
|
||||
|
||||
@@ -270,6 +271,10 @@ class SuperLogging {
|
||||
// write to stdout
|
||||
printLog(str);
|
||||
|
||||
saveLogString(str, rec.error);
|
||||
}
|
||||
|
||||
static void saveLogString(String str, Object? error) {
|
||||
// push to log queue
|
||||
if (fileIsEnabled) {
|
||||
fileQueueEntries.add(str + '\n');
|
||||
@@ -279,8 +284,8 @@ class SuperLogging {
|
||||
}
|
||||
|
||||
// add error to sentry queue
|
||||
if (sentryIsEnabled && rec.error != null) {
|
||||
_sendErrorToSentry(rec.error!, null).ignore();
|
||||
if (sentryIsEnabled && error != null) {
|
||||
_sendErrorToSentry(error, null).ignore();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,16 +7,23 @@ import "package:photos/db/ml/db_fields.dart";
|
||||
import "package:photos/events/embedding_updated_event.dart";
|
||||
import "package:photos/models/ml/clip.dart";
|
||||
import "package:photos/models/ml/ml_versions.dart";
|
||||
import "package:photos/models/ml/vector.dart";
|
||||
|
||||
extension ClipDB on MLDataDB {
|
||||
static const databaseName = "ente.embeddings.db";
|
||||
|
||||
Future<List<ClipEmbedding>> getAll() async {
|
||||
Future<List<ClipEmbedding>> getAllClipEmbeddings() async {
|
||||
final db = await MLDataDB.instance.asyncDB;
|
||||
final results = await db.getAll('SELECT * FROM $clipTable');
|
||||
return _convertToEmbeddings(results);
|
||||
}
|
||||
|
||||
Future<List<EmbeddingVector>> getAllClipVectors() async {
|
||||
final db = await MLDataDB.instance.asyncDB;
|
||||
final results = await db.getAll('SELECT * FROM $clipTable');
|
||||
return _convertToVectors(results);
|
||||
}
|
||||
|
||||
// Get indexed FileIDs
|
||||
Future<Map<int, int>> clipIndexedFileWithVersion() async {
|
||||
final db = await MLDataDB.instance.asyncDB;
|
||||
@@ -59,7 +66,7 @@ extension ClipDB on MLDataDB {
|
||||
Bus.instance.fire(EmbeddingUpdatedEvent());
|
||||
}
|
||||
|
||||
Future<void> deleteEmbeddings(List<int> fileIDs) async {
|
||||
Future<void> deleteClipEmbeddings(List<int> fileIDs) async {
|
||||
final db = await MLDataDB.instance.asyncDB;
|
||||
await db.execute(
|
||||
'DELETE FROM $clipTable WHERE $fileIDColumn IN (${fileIDs.join(", ")})',
|
||||
@@ -83,6 +90,16 @@ extension ClipDB on MLDataDB {
|
||||
return embeddings;
|
||||
}
|
||||
|
||||
List<EmbeddingVector> _convertToVectors(List<Map<String, dynamic>> results) {
|
||||
final List<EmbeddingVector> embeddings = [];
|
||||
for (final result in results) {
|
||||
final embedding = _getVectorFromRow(result);
|
||||
if (embedding.isEmpty) continue;
|
||||
embeddings.add(embedding);
|
||||
}
|
||||
return embeddings;
|
||||
}
|
||||
|
||||
ClipEmbedding _getEmbeddingFromRow(Map<String, dynamic> row) {
|
||||
final fileID = row[fileIDColumn] as int;
|
||||
final bytes = row[embeddingColumn] as Uint8List;
|
||||
@@ -91,6 +108,13 @@ extension ClipDB on MLDataDB {
|
||||
return ClipEmbedding(fileID: fileID, embedding: list, version: version);
|
||||
}
|
||||
|
||||
EmbeddingVector _getVectorFromRow(Map<String, dynamic> row) {
|
||||
final fileID = row[fileIDColumn] as int;
|
||||
final bytes = row[embeddingColumn] as Uint8List;
|
||||
final list = Float32List.view(bytes.buffer);
|
||||
return EmbeddingVector(fileID: fileID, embedding: list);
|
||||
}
|
||||
|
||||
List<Object?> _getRowFromEmbedding(ClipEmbedding embedding) {
|
||||
return [
|
||||
embedding.fileID,
|
||||
|
||||