mirror of
https://github.com/immich-app/immich.git
synced 2026-01-29 08:14:47 -08:00
Compare commits
400 Commits
feat/effic
...
feat/remov
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0230ccf3b | ||
|
|
224bb46b4a | ||
|
|
ad0b96a1e5 | ||
|
|
38226fd240 | ||
|
|
f193c5a53f | ||
|
|
debc35a4d5 | ||
|
|
5de76dbaee | ||
|
|
d4b110fc47 | ||
|
|
f7acf1886c | ||
|
|
ba0cfb76ed | ||
|
|
cee6bcc5ef | ||
|
|
b2f3bf7079 | ||
|
|
fe416b121c | ||
|
|
35b62cd016 | ||
|
|
b33e8abcdd | ||
|
|
0be71c82b3 | ||
|
|
a582d3a03e | ||
|
|
6609e70fa8 | ||
|
|
7a0107fc79 | ||
|
|
0bbeb20595 | ||
|
|
afc4085b55 | ||
|
|
02569d52f0 | ||
|
|
aaeac2ab73 | ||
|
|
de57fecb69 | ||
|
|
1e0b4fac04 | ||
|
|
34339ea69f | ||
|
|
6da039780e | ||
|
|
3f2e0780d5 | ||
|
|
52363cf0fb | ||
|
|
86df09a0e4 | ||
|
|
e1e24f3d60 | ||
|
|
33d76fb386 | ||
|
|
642065f506 | ||
|
|
de897f6069 | ||
|
|
68f3ed89c5 | ||
|
|
78516a97b3 | ||
|
|
b8a17c3c26 | ||
|
|
e42886b767 | ||
|
|
d36c26bf97 | ||
|
|
dcbc266b83 | ||
|
|
c37d13691b | ||
|
|
9ae42106cc | ||
|
|
28e9892ed3 | ||
|
|
532ec10d5f | ||
|
|
2411bf8374 | ||
|
|
0b60cc8965 | ||
|
|
2d816e89ad | ||
|
|
eee94207ce | ||
|
|
dfa38ec3ef | ||
|
|
edc0698e2a | ||
|
|
0e987352bb | ||
|
|
98ea3847e5 | ||
|
|
53c67f4d71 | ||
|
|
20733bd7df | ||
|
|
11e72a0f35 | ||
|
|
53a6724039 | ||
|
|
0b20d1df9f | ||
|
|
6bb8903b05 | ||
|
|
26e0cb3eb4 | ||
|
|
a8f683ed15 | ||
|
|
4dfa011eef | ||
|
|
0c0bec6ae2 | ||
|
|
61c3f27fdc | ||
|
|
b2ca208dbb | ||
|
|
2e945281fc | ||
|
|
9ac120c772 | ||
|
|
e6e8ae7c74 | ||
|
|
29fd981587 | ||
|
|
585b74f233 | ||
|
|
f118bb7e08 | ||
|
|
1710230d61 | ||
|
|
2012b07645 | ||
|
|
a88a9a7d5e | ||
|
|
ae539dfdf3 | ||
|
|
69bb8d834f | ||
|
|
9693d07a8b | ||
|
|
453b30069d | ||
|
|
c9daefccc4 | ||
|
|
6ffd8e679e | ||
|
|
7fe2f19258 | ||
|
|
dac545496e | ||
|
|
d5b112be53 | ||
|
|
75322179fd | ||
|
|
3f4b6a8e7c | ||
|
|
7ce1d73c20 | ||
|
|
2bf484c91c | ||
|
|
4e9bdd5e6c | ||
|
|
f05ef81c4f | ||
|
|
c21860fb97 | ||
|
|
449368eee7 | ||
|
|
31e098517d | ||
|
|
b9e2590752 | ||
|
|
41641ec000 | ||
|
|
8821c251c3 | ||
|
|
1d6b98ff86 | ||
|
|
4d00261bc1 | ||
|
|
df7ea4d8ea | ||
|
|
1e7cb1165f | ||
|
|
d9ef041b87 | ||
|
|
87a172ab0c | ||
|
|
9e0553e0c4 | ||
|
|
a7addfece8 | ||
|
|
fda215f97f | ||
|
|
5fad1fd899 | ||
|
|
880f2bc2c5 | ||
|
|
0f79e0c38e | ||
|
|
5fb0afb0d0 | ||
|
|
4f4a50ac11 | ||
|
|
3d883b27aa | ||
|
|
01fddd58c6 | ||
|
|
81eb5ab40d | ||
|
|
8d849d226d | ||
|
|
a9b82a8e32 | ||
|
|
cc9e07401f | ||
|
|
9b5f3552c0 | ||
|
|
a52a3247d7 | ||
|
|
c86c957860 | ||
|
|
eb15a2725a | ||
|
|
b394046d2a | ||
|
|
859b2451bb | ||
|
|
b79a2eb6b9 | ||
|
|
ee96b285f2 | ||
|
|
77340075f0 | ||
|
|
5c06ec5e0b | ||
|
|
dcee34095b | ||
|
|
15f182902f | ||
|
|
b26b452530 | ||
|
|
2dcb32f7d0 | ||
|
|
27d2f3efe2 | ||
|
|
d38468439b | ||
|
|
0166e99d90 | ||
|
|
71e33e35dc | ||
|
|
a122d4b969 | ||
|
|
dad81af6e3 | ||
|
|
ac6b42e1e8 | ||
|
|
4059638151 | ||
|
|
1823a28e59 | ||
|
|
b6bf1852cd | ||
|
|
cdc26f2c7b | ||
|
|
913b3789cc | ||
|
|
994a770921 | ||
|
|
17bbcdf584 | ||
|
|
23aa661324 | ||
|
|
a10a946d1a | ||
|
|
04c9531624 | ||
|
|
d84cc450f1 | ||
|
|
4153848c68 | ||
|
|
f29230c8a6 | ||
|
|
03af60e8eb | ||
|
|
ae827e1406 | ||
|
|
7893ac25fb | ||
|
|
42a03f2556 | ||
|
|
722a464e23 | ||
|
|
39c1ebf698 | ||
|
|
ef6e4f4699 | ||
|
|
0700e61d20 | ||
|
|
7e6cd48783 | ||
|
|
e524c59560 | ||
|
|
b4c72fb609 | ||
|
|
74e14b6495 | ||
|
|
03207a13ec | ||
|
|
529b8c285d | ||
|
|
1213f6df10 | ||
|
|
9e8132c363 | ||
|
|
2d2673c114 | ||
|
|
56e5236a39 | ||
|
|
8529f92ebc | ||
|
|
761ac074c9 | ||
|
|
7e377d3e42 | ||
|
|
f7d9215464 | ||
|
|
9af44fbd69 | ||
|
|
170306af1a | ||
|
|
417d3bbf50 | ||
|
|
e239b8d2fa | ||
|
|
2c7b980eed | ||
|
|
9a5a3c0a1d | ||
|
|
027dab1487 | ||
|
|
e18e4c5962 | ||
|
|
67a8cab286 | ||
|
|
39eee6a634 | ||
|
|
ee98e69097 | ||
|
|
41c1d4d44b | ||
|
|
b21084b851 | ||
|
|
8bf45eb718 | ||
|
|
9d3ca3ad3f | ||
|
|
0090b9db4a | ||
|
|
bee0ae430a | ||
|
|
cc08ebdf80 | ||
|
|
71578b76a7 | ||
|
|
8e5d52abbb | ||
|
|
e52cc259d5 | ||
|
|
00c88b2636 | ||
|
|
e95096d14f | ||
|
|
4c918254b9 | ||
|
|
b97d73d7a7 | ||
|
|
2801b0953d | ||
|
|
7a1c45c364 | ||
|
|
5acd6b70d0 | ||
|
|
edaedca03f | ||
|
|
7b3e1037b6 | ||
|
|
27bc8eba7b | ||
|
|
23fb2e0fae | ||
|
|
59accbf32a | ||
|
|
059a0e8aa8 | ||
|
|
6a55c36762 | ||
|
|
c0bff4b493 | ||
|
|
fd4c2acde8 | ||
|
|
5acf909235 | ||
|
|
fb1458c720 | ||
|
|
255dabc239 | ||
|
|
27751f8fd4 | ||
|
|
72ffa37dd9 | ||
|
|
5a7042364b | ||
|
|
db0ea0f3a8 | ||
|
|
88c0243a20 | ||
|
|
3a29522df6 | ||
|
|
50eae23f3a | ||
|
|
95419750bb | ||
|
|
5fb858a865 | ||
|
|
18084a49ec | ||
|
|
f107cb044a | ||
|
|
f4e7ea47a6 | ||
|
|
8747fc4935 | ||
|
|
287fa79d75 | ||
|
|
bcfb5bee1f | ||
|
|
538263dc38 | ||
|
|
51aec1e93d | ||
|
|
53825cc3d6 | ||
|
|
6e7c2817a3 | ||
|
|
7bd79b551c | ||
|
|
5fe954b3c9 | ||
|
|
7f81a5bd6f | ||
|
|
37a79292c0 | ||
|
|
bf6211776f | ||
|
|
6c178a04dc | ||
|
|
036d314cb6 | ||
|
|
1fc5da398a | ||
|
|
4d84338086 | ||
|
|
0ac49b00ee | ||
|
|
e427778a96 | ||
|
|
b82e29fbb4 | ||
|
|
ff19aea4ac | ||
|
|
28179a3a1d | ||
|
|
af1e18d07e | ||
|
|
270a0ff986 | ||
|
|
9d3f10372d | ||
|
|
2f1385a236 | ||
|
|
183a285584 | ||
|
|
5ce946bb5b | ||
|
|
674faf2e57 | ||
|
|
4f7702c6bf | ||
|
|
28edf5664d | ||
|
|
ec2f94cae8 | ||
|
|
873f7921da | ||
|
|
f06b054087 | ||
|
|
0df910c0cd | ||
|
|
5b8d72e91a | ||
|
|
e7b0a47be2 | ||
|
|
60af3a4003 | ||
|
|
6a4b6699e3 | ||
|
|
7d57fd1320 | ||
|
|
bbc1c8186c | ||
|
|
b76d69c0e5 | ||
|
|
fd2b7a344c | ||
|
|
03dafba522 | ||
|
|
f15376a107 | ||
|
|
32955915dd | ||
|
|
aacb27ea5f | ||
|
|
d6b8c0926f | ||
|
|
225af973c1 | ||
|
|
b3372064e0 | ||
|
|
303307e1ac | ||
|
|
f75c9dfe37 | ||
|
|
f5954f4c9b | ||
|
|
147accd957 | ||
|
|
9487241481 | ||
|
|
460e1d4715 | ||
|
|
b6223af5ca | ||
|
|
8853079c54 | ||
|
|
662d44536e | ||
|
|
80fa5ec198 | ||
|
|
0df88fc22b | ||
|
|
e78144ea31 | ||
|
|
227789225a | ||
|
|
1298a74230 | ||
|
|
a3808c26ce | ||
|
|
e2169f5316 | ||
|
|
f65dabd43a | ||
|
|
a5841a8bf4 | ||
|
|
dc6ac3aaec | ||
|
|
ae104ad7cc | ||
|
|
868d5f56e2 | ||
|
|
88072910da | ||
|
|
25a94bd117 | ||
|
|
76eaee3657 | ||
|
|
d5fec0edab | ||
|
|
a7821a0b79 | ||
|
|
73e67ebfea | ||
|
|
0eaa054218 | ||
|
|
2024d06cb7 | ||
|
|
204299d500 | ||
|
|
70e59c00d5 | ||
|
|
5405810a38 | ||
|
|
e67265cef2 | ||
|
|
19c53609e1 | ||
|
|
0d0bb0e2d9 | ||
|
|
8f1b505ba0 | ||
|
|
d04675fb41 | ||
|
|
acfd40b77a | ||
|
|
840e43430c | ||
|
|
a3e0c6cef5 | ||
|
|
63088b22e0 | ||
|
|
d9d8beb92f | ||
|
|
38a8a67be9 | ||
|
|
7531ffcbfb | ||
|
|
d5f3629c49 | ||
|
|
be5b4cb1d1 | ||
|
|
5fb8d651ec | ||
|
|
c2313f7a99 | ||
|
|
59627e2b4c | ||
|
|
530bf059ad | ||
|
|
b44d2a241d | ||
|
|
1af10ded74 | ||
|
|
3f1e11afcc | ||
|
|
28dce2d0df | ||
|
|
605764f226 | ||
|
|
44e1c83c84 | ||
|
|
0729887c9c | ||
|
|
3bfa8b7575 | ||
|
|
3138048b96 | ||
|
|
f8b41ea8aa | ||
|
|
1d33ed6bed | ||
|
|
2be1a58c5b | ||
|
|
03e7922589 | ||
|
|
801af34d9a | ||
|
|
bedaa729e9 | ||
|
|
13c8a6e61d | ||
|
|
01edf6533b | ||
|
|
30d0bea4df | ||
|
|
571504aa5e | ||
|
|
65fafcab37 | ||
|
|
2fe0d17fe1 | ||
|
|
b6a91746d8 | ||
|
|
89533a858f | ||
|
|
dc5a0f8c33 | ||
|
|
c443ab854c | ||
|
|
379c73818a | ||
|
|
73bb05c5f9 | ||
|
|
b69470c69e | ||
|
|
34255453b1 | ||
|
|
4e03b06ff7 | ||
|
|
9bb211f56f | ||
|
|
6f4f79d8cc | ||
|
|
ed3997d844 | ||
|
|
fb59fa343d | ||
|
|
ab2849781a | ||
|
|
66c657ca8a | ||
|
|
c245208106 | ||
|
|
99d6673503 | ||
|
|
9ff37b6870 | ||
|
|
0e7816130b | ||
|
|
a1beb0a87d | ||
|
|
c4ac2e345f | ||
|
|
f422b341d1 | ||
|
|
90538d2535 | ||
|
|
abc7bfa0ba | ||
|
|
60a809d7b4 | ||
|
|
cda7249a6a | ||
|
|
47566c1a4a | ||
|
|
f08002d48f | ||
|
|
7186914531 | ||
|
|
d38ab93484 | ||
|
|
845b0f2073 | ||
|
|
acb1e513a7 | ||
|
|
4d4e54967d | ||
|
|
e2dcebfe6c | ||
|
|
d4f2b43f64 | ||
|
|
f343b0e58f | ||
|
|
a8b4a5e856 | ||
|
|
e7e030279b | ||
|
|
9ff664ed36 | ||
|
|
e00556a34a | ||
|
|
a313e4338e | ||
|
|
257b0c74af | ||
|
|
3d515f5072 | ||
|
|
ec01db5c8b | ||
|
|
cd6d8fcdfe | ||
|
|
1198311d64 | ||
|
|
1a4eab9655 | ||
|
|
1926c90780 | ||
|
|
4d5975b717 | ||
|
|
8cbd6b29c4 | ||
|
|
8c1b630a2b | ||
|
|
c961d2aaf7 | ||
|
|
41c75dc93e | ||
|
|
f92247c99b | ||
|
|
53f9fc2d1c | ||
|
|
bede19a3ca | ||
|
|
aefa62b234 | ||
|
|
b3fb831994 |
@@ -12,7 +12,6 @@ services:
|
||||
- server_node_modules:/workspaces/immich/server/node_modules
|
||||
- web_node_modules:/workspaces/immich/web/node_modules
|
||||
- ${UPLOAD_LOCATION}/photos:/data
|
||||
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
|
||||
database:
|
||||
|
||||
@@ -49,10 +49,11 @@ fix_permissions() {
|
||||
|
||||
log "Fixing permissions for ${IMMICH_WORKSPACE}"
|
||||
|
||||
run_cmd sudo find "${IMMICH_WORKSPACE}/server/upload" -not -path "${IMMICH_WORKSPACE}/server/upload/postgres/*" -not -path "${IMMICH_WORKSPACE}/server/upload/postgres" -exec chown node {} +
|
||||
|
||||
# Change ownership for directories that exist
|
||||
for dir in "${IMMICH_WORKSPACE}/.vscode" \
|
||||
"${IMMICH_WORKSPACE}/server/upload" \
|
||||
"${IMMICH_WORKSPACE}/.pnpm-store" \
|
||||
"${IMMICH_WORKSPACE}/.github/node_modules" \
|
||||
"${IMMICH_WORKSPACE}/cli/node_modules" \
|
||||
"${IMMICH_WORKSPACE}/e2e/node_modules" \
|
||||
"${IMMICH_WORKSPACE}/open-api/typescript-sdk/node_modules" \
|
||||
|
||||
@@ -8,21 +8,23 @@ services:
|
||||
- IMMICH_SERVER_URL=http://127.0.0.1:2283/
|
||||
volumes: !override
|
||||
- ..:/workspaces/immich
|
||||
- cli_node_modules:/workspaces/immich/cli/node_modules
|
||||
- e2e_node_modules:/workspaces/immich/e2e/node_modules
|
||||
- open_api_node_modules:/workspaces/immich/open-api/typescript-sdk/node_modules
|
||||
- server_node_modules:/workspaces/immich/server/node_modules
|
||||
- web_node_modules:/workspaces/immich/web/node_modules
|
||||
- ${UPLOAD_LOCATION:-upload1-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data
|
||||
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/data/upload
|
||||
- ${UPLOAD_LOCATION:-upload-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
|
||||
- pnpm-store:/usr/src/app/.pnpm-store
|
||||
- server-node_modules:/usr/src/app/server/node_modules
|
||||
- web-node_modules:/usr/src/app/web/node_modules
|
||||
- github-node_modules:/usr/src/app/.github/node_modules
|
||||
- cli-node_modules:/usr/src/app/cli/node_modules
|
||||
- docs-node_modules:/usr/src/app/docs/node_modules
|
||||
- e2e-node_modules:/usr/src/app/e2e/node_modules
|
||||
- sdk-node_modules:/usr/src/app/open-api/typescript-sdk/node_modules
|
||||
- app-node_modules:/usr/src/app/node_modules
|
||||
- sveltekit:/usr/src/app/web/.svelte-kit
|
||||
- coverage:/usr/src/app/web/coverage
|
||||
immich-web:
|
||||
env_file: !reset []
|
||||
|
||||
immich-machine-learning:
|
||||
env_file: !reset []
|
||||
|
||||
database:
|
||||
env_file: !reset []
|
||||
environment: !override
|
||||
@@ -33,17 +35,8 @@ services:
|
||||
POSTGRES_HOST_AUTH_METHOD: md5
|
||||
volumes:
|
||||
- ${UPLOAD_LOCATION:-postgres-devcontainer-volume}${UPLOAD_LOCATION:+/postgres}:/var/lib/postgresql/data
|
||||
|
||||
redis:
|
||||
env_file: !reset []
|
||||
|
||||
volumes:
|
||||
# Node modules for each service to avoid conflicts and ensure consistent dependencies
|
||||
cli_node_modules:
|
||||
e2e_node_modules:
|
||||
open_api_node_modules:
|
||||
server_node_modules:
|
||||
web_node_modules:
|
||||
upload1-devcontainer-volume:
|
||||
upload2-devcontainer-volume:
|
||||
upload-devcontainer-volume:
|
||||
postgres-devcontainer-volume:
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
# shellcheck disable=SC1091
|
||||
source /immich-devcontainer/container-common.sh
|
||||
|
||||
log "Preparing Immich Nest API Server"
|
||||
log ""
|
||||
export CI=1
|
||||
run_cmd pnpm --filter immich install
|
||||
|
||||
log "Starting Nest API Server"
|
||||
log ""
|
||||
cd "${IMMICH_WORKSPACE}/server" || (
|
||||
@@ -11,7 +16,7 @@ cd "${IMMICH_WORKSPACE}/server" || (
|
||||
)
|
||||
|
||||
while true; do
|
||||
run_cmd node ./node_modules/.bin/nest start --debug "0.0.0.0:9230" --watch
|
||||
run_cmd pnpm --filter immich exec nest start --debug "0.0.0.0:9230" --watch
|
||||
log "Nest API Server crashed with exit code $?. Respawning in 3s ..."
|
||||
sleep 3
|
||||
done
|
||||
|
||||
@@ -3,6 +3,13 @@
|
||||
# shellcheck disable=SC1091
|
||||
source /immich-devcontainer/container-common.sh
|
||||
|
||||
export CI=1
|
||||
log "Preparing Immich Web Frontend"
|
||||
log ""
|
||||
run_cmd pnpm --filter @immich/sdk install
|
||||
run_cmd pnpm --filter @immich/sdk build
|
||||
run_cmd pnpm --filter immich-web install
|
||||
|
||||
log "Starting Immich Web Frontend"
|
||||
log ""
|
||||
cd "${IMMICH_WORKSPACE}/web" || (
|
||||
@@ -16,7 +23,7 @@ until curl --output /dev/null --silent --head --fail "http://127.0.0.1:${IMMICH_
|
||||
done
|
||||
|
||||
while true; do
|
||||
run_cmd node ./node_modules/.bin/vite dev --host 0.0.0.0 --port "${DEV_PORT}"
|
||||
run_cmd pnpm --filter immich-web exec vite dev --host 0.0.0.0 --port "${DEV_PORT}"
|
||||
log "Web crashed with exit code $?. Respawning in 3s ..."
|
||||
sleep 3
|
||||
done
|
||||
|
||||
@@ -6,9 +6,6 @@ source /immich-devcontainer/container-common.sh
|
||||
log "Setting up Immich dev container..."
|
||||
fix_permissions
|
||||
|
||||
log "Installing npm dependencies (node_modules)..."
|
||||
install_dependencies
|
||||
|
||||
log "Setup complete, please wait while backend and frontend services automatically start"
|
||||
log
|
||||
log "If necessary, the services may be manually started using"
|
||||
|
||||
2
.github/.nvmrc
vendored
2
.github/.nvmrc
vendored
@@ -1 +1 @@
|
||||
22.18.0
|
||||
22.19.0
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
5
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -64,6 +64,11 @@ body:
|
||||
- label: Web
|
||||
- label: Mobile
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Device make and model
|
||||
placeholder: Samsung S25 Android 16
|
||||
|
||||
- type: textarea
|
||||
validations:
|
||||
required: true
|
||||
|
||||
1
.github/labeler.yml
vendored
1
.github/labeler.yml
vendored
@@ -6,7 +6,6 @@ cli:
|
||||
documentation:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- docs/blob/**
|
||||
- docs/docs/**
|
||||
- docs/src/**
|
||||
- docs/static/**
|
||||
|
||||
28
.github/package-lock.json
generated
vendored
28
.github/package-lock.json
generated
vendored
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": ".github",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"devDependencies": {
|
||||
"prettier": "^3.5.3"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "3.6.2",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
|
||||
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
4
.github/pull_request_template.md
vendored
4
.github/pull_request_template.md
vendored
@@ -34,3 +34,7 @@ The `/api/something` endpoint is now `/api/something-else`
|
||||
- [ ] I have followed naming conventions/patterns in the surrounding code
|
||||
- [ ] All code in `src/services/` uses repositories implementations for database calls, filesystem operations, etc.
|
||||
- [ ] All code in `src/repositories/` is pretty basic/simple and does not have any immich specific logic (that belongs in `src/services/`)
|
||||
|
||||
## Please describe to which degree, if any, an LLM was used in creating this pull request.
|
||||
|
||||
...
|
||||
|
||||
30
.github/workflows/build-mobile.yml
vendored
30
.github/workflows/build-mobile.yml
vendored
@@ -32,24 +32,18 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run: ${{ steps.check.outputs.should_run }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
- name: Check what should run
|
||||
id: check
|
||||
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
|
||||
with:
|
||||
filters: |
|
||||
mobile:
|
||||
- 'mobile/**'
|
||||
workflow:
|
||||
- '.github/workflows/build-mobile.yml'
|
||||
- name: Check if we should force jobs to run
|
||||
id: should_force
|
||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
|
||||
force-filters: |
|
||||
- '.github/workflows/build-mobile.yml'
|
||||
force-events: 'workflow_call,workflow_dispatch'
|
||||
|
||||
build-sign-android:
|
||||
name: Build and sign Android
|
||||
@@ -57,11 +51,11 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
# Skip when PR from a fork
|
||||
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && needs.pre-job.outputs.should_run == 'true' }}
|
||||
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
|
||||
runs-on: mich
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
ref: ${{ inputs.ref || github.sha }}
|
||||
persist-credentials: false
|
||||
@@ -79,7 +73,7 @@ jobs:
|
||||
|
||||
- name: Restore Gradle Cache
|
||||
id: cache-gradle-restore
|
||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4
|
||||
uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
@@ -106,7 +100,7 @@ jobs:
|
||||
run: flutter pub get
|
||||
|
||||
- name: Generate translation file
|
||||
run: make translation
|
||||
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Generate platform APIs
|
||||
@@ -136,7 +130,7 @@ jobs:
|
||||
|
||||
- name: Save Gradle Cache
|
||||
id: cache-gradle-save
|
||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4
|
||||
uses: actions/cache/save@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
|
||||
if: github.ref == 'refs/heads/main'
|
||||
with:
|
||||
path: |
|
||||
|
||||
2
.github/workflows/cache-cleanup.yml
vendored
2
.github/workflows/cache-cleanup.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
actions: write
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
33
.github/workflows/cli.yml
vendored
33
.github/workflows/cli.yml
vendored
@@ -29,25 +29,28 @@ jobs:
|
||||
working-directory: ./cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Setup .npmrc file to publish to npm
|
||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
|
||||
- name: Prepare SDK
|
||||
run: npm ci --prefix ../open-api/typescript-sdk/
|
||||
- name: Build SDK
|
||||
run: npm run build --prefix ../open-api/typescript-sdk/
|
||||
- run: npm ci
|
||||
- run: npm run build
|
||||
- run: npm publish
|
||||
- name: Setup typescript-sdk
|
||||
run: pnpm install && pnpm run build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
|
||||
- run: pnpm install --frozen-lockfile
|
||||
- run: pnpm build
|
||||
- run: pnpm publish
|
||||
if: ${{ github.event_name == 'release' }}
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
@@ -62,7 +65,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -73,7 +76,7 @@ jobs:
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
with:
|
||||
registry: ghcr.io
|
||||
@@ -88,7 +91,7 @@ jobs:
|
||||
|
||||
- name: Generate docker image tags
|
||||
id: metadata
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
|
||||
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
|
||||
with:
|
||||
flavor: |
|
||||
latest=false
|
||||
|
||||
29
.github/workflows/close-duplicates.yml
vendored
29
.github/workflows/close-duplicates.yml
vendored
@@ -8,8 +8,18 @@ name: Close likely duplicates
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
should_run:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
should_run: ${{ steps.should_run.outputs.run }}
|
||||
steps:
|
||||
- id: should_run
|
||||
run: echo "run=${{ github.event_name == 'issues' || github.event.discussion.category.name == 'Feature Request' }}" >> $GITHUB_OUTPUT
|
||||
|
||||
get_body:
|
||||
runs-on: ubuntu-latest
|
||||
needs: should_run
|
||||
if: ${{ needs.should_run.outputs.should_run == 'true' }}
|
||||
env:
|
||||
EVENT: ${{ toJSON(github.event) }}
|
||||
outputs:
|
||||
@@ -22,23 +32,24 @@ jobs:
|
||||
|
||||
get_checkbox_json:
|
||||
runs-on: ubuntu-latest
|
||||
needs: get_body
|
||||
needs: [get_body, should_run]
|
||||
if: ${{ needs.should_run.outputs.should_run == 'true' }}
|
||||
container:
|
||||
image: yshavit/mdq:0.7.2
|
||||
image: ghcr.io/immich-app/mdq:main@sha256:d8ae47cf2e6cf4e2559bd57a60b73674fe44f897cba2c2bddff2987a05be10a4
|
||||
outputs:
|
||||
json: ${{ steps.get_checkbox.outputs.json }}
|
||||
checked: ${{ steps.get_checkbox.outputs.checked }}
|
||||
steps:
|
||||
- id: get_checkbox
|
||||
env:
|
||||
BODY: ${{ needs.get_body.outputs.body }}
|
||||
run: |
|
||||
JSON=$(echo "$BODY" | base64 -d | /mdq --output json '# I have searched | - [?] Yes')
|
||||
echo "json=$JSON" >> $GITHUB_OUTPUT
|
||||
CHECKED=$(echo "$BODY" | base64 -d | /mdq --output json '# I have searched | - [?] Yes' | jq '.items[0].list[0].checked // false')
|
||||
echo "checked=$CHECKED" >> $GITHUB_OUTPUT
|
||||
|
||||
close_and_comment:
|
||||
runs-on: ubuntu-latest
|
||||
needs: get_checkbox_json
|
||||
if: ${{ !fromJSON(needs.get_checkbox_json.outputs.json).items[0].list[0].checked }}
|
||||
needs: [get_checkbox_json, should_run]
|
||||
if: ${{ needs.should_run.outputs.should_run == 'true' && needs.get_checkbox_json.outputs.checked != 'true' }}
|
||||
permissions:
|
||||
issues: write
|
||||
discussions: write
|
||||
@@ -51,7 +62,7 @@ jobs:
|
||||
run: |
|
||||
gh api graphql \
|
||||
-f issueId="$NODE_ID" \
|
||||
-f body="This issue has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one." \
|
||||
-f body="This issue has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \
|
||||
-f query='
|
||||
mutation CommentAndCloseIssue($issueId: ID!, $body: String!) {
|
||||
addComment(input: {
|
||||
@@ -77,7 +88,7 @@ jobs:
|
||||
run: |
|
||||
gh api graphql \
|
||||
-f discussionId="$NODE_ID" \
|
||||
-f body="This discussion has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one." \
|
||||
-f body="This discussion has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \
|
||||
-f query='
|
||||
mutation CommentAndCloseDiscussion($discussionId: ID!, $body: String!) {
|
||||
addDiscussionComment(input: {
|
||||
|
||||
8
.github/workflows/codeql-analysis.yml
vendored
8
.github/workflows/codeql-analysis.yml
vendored
@@ -44,13 +44,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@@ -63,7 +63,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
uses: github/codeql-action/autobuild@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3
|
||||
|
||||
# âšī¸ Command-line programs to run using the OS shell.
|
||||
# đ See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
@@ -76,6 +76,6 @@ jobs:
|
||||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3
|
||||
with:
|
||||
category: '/language:${{matrix.language}}'
|
||||
|
||||
37
.github/workflows/docker.yml
vendored
37
.github/workflows/docker.yml
vendored
@@ -20,15 +20,11 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run: ${{ steps.check.outputs.should_run }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
- name: Check what should run
|
||||
id: check
|
||||
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
|
||||
with:
|
||||
filters: |
|
||||
server:
|
||||
@@ -38,14 +34,11 @@ jobs:
|
||||
- 'i18n/**'
|
||||
machine-learning:
|
||||
- 'machine-learning/**'
|
||||
workflow:
|
||||
- '.github/workflows/docker.yml'
|
||||
- '.github/workflows/multi-runner-build.yml'
|
||||
- '.github/actions/image-build'
|
||||
|
||||
- name: Check if we should force jobs to run
|
||||
id: should_force
|
||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
|
||||
force-filters: |
|
||||
- '.github/workflows/docker.yml'
|
||||
- '.github/workflows/multi-runner-build.yml'
|
||||
- '.github/actions/image-build'
|
||||
force-events: 'workflow_dispatch,release'
|
||||
|
||||
retag_ml:
|
||||
name: Re-Tag ML
|
||||
@@ -53,14 +46,14 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
if: ${{ needs.pre-job.outputs.should_run_ml == 'false' && !github.event.pull_request.head.repo.fork }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == false && !github.event.pull_request.head.repo.fork }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
|
||||
steps:
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
@@ -82,14 +75,14 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'false' && !github.event.pull_request.head.repo.fork }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == false && !github.event.pull_request.head.repo.fork }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
suffix: ['']
|
||||
steps:
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
@@ -108,7 +101,7 @@ jobs:
|
||||
machine-learning:
|
||||
name: Build and Push ML
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == true }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -153,7 +146,7 @@ jobs:
|
||||
server:
|
||||
name: Build and Push Server
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@129aeda75a450666ce96e8bc8126652e717917a7 # multi-runner-build-workflow-0.1.1
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
39
.github/workflows/docs-build.yml
vendored
39
.github/workflows/docs-build.yml
vendored
@@ -18,32 +18,28 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.found_paths.outputs.open-api == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run: ${{ steps.check.outputs.should_run }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
- name: Check what should run
|
||||
id: check
|
||||
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
|
||||
with:
|
||||
filters: |
|
||||
docs:
|
||||
- 'docs/**'
|
||||
workflow:
|
||||
- '.github/workflows/docs-build.yml'
|
||||
open-api:
|
||||
- 'open-api/immich-openapi-specs.json'
|
||||
- name: Check if we should force jobs to run
|
||||
id: should_force
|
||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
|
||||
force-filters: |
|
||||
- '.github/workflows/docs-build.yml'
|
||||
force-events: 'release'
|
||||
force-branches: 'main'
|
||||
|
||||
build:
|
||||
name: Docs Build
|
||||
needs: pre-job
|
||||
permissions:
|
||||
contents: read
|
||||
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).docs == true }}
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
@@ -51,25 +47,28 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './docs/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
- name: Run install
|
||||
run: pnpm install
|
||||
|
||||
- name: Check formatting
|
||||
run: npm run format
|
||||
run: pnpm format
|
||||
|
||||
- name: Run build
|
||||
run: npm run build
|
||||
run: pnpm build
|
||||
|
||||
- name: Upload build output
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
|
||||
10
.github/workflows/docs-deploy.yml
vendored
10
.github/workflows/docs-deploy.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
run: echo 'The triggering workflow did not succeed' && exit 1
|
||||
- name: Get artifact
|
||||
id: get-artifact
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
|
||||
with:
|
||||
script: |
|
||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
@@ -38,7 +38,7 @@ jobs:
|
||||
return { found: true, id: matchArtifact.id };
|
||||
- name: Determine deploy parameters
|
||||
id: parameters
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
|
||||
env:
|
||||
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
with:
|
||||
@@ -108,13 +108,13 @@ jobs:
|
||||
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Load parameters
|
||||
id: parameters
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
|
||||
env:
|
||||
PARAM_JSON: ${{ needs.checks.outputs.parameters }}
|
||||
with:
|
||||
@@ -125,7 +125,7 @@ jobs:
|
||||
core.setOutput("shouldDeploy", parameters.shouldDeploy);
|
||||
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
|
||||
env:
|
||||
ARTIFACT_JSON: ${{ needs.checks.outputs.artifact }}
|
||||
with:
|
||||
|
||||
2
.github/workflows/docs-destroy.yml
vendored
2
.github/workflows/docs-destroy.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
13
.github/workflows/fix-format.yml
vendored
13
.github/workflows/fix-format.yml
vendored
@@ -16,24 +16,27 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
|
||||
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
||||
- name: 'Checkout'
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
persist-credentials: true
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
|
||||
- name: Fix formatting
|
||||
run: make install-all && make format-all
|
||||
@@ -45,7 +48,7 @@ jobs:
|
||||
message: 'chore: fix formatting'
|
||||
|
||||
- name: Remove label
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
|
||||
if: always()
|
||||
with:
|
||||
script: |
|
||||
|
||||
128
.github/workflows/merge-translations.yml
vendored
Normal file
128
.github/workflows/merge-translations.yml
vendored
Normal file
@@ -0,0 +1,128 @@
|
||||
name: Merge translations
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
workflow_call:
|
||||
secrets:
|
||||
PUSH_O_MATIC_APP_ID:
|
||||
required: true
|
||||
PUSH_O_MATIC_APP_KEY:
|
||||
required: true
|
||||
WEBLATE_TOKEN:
|
||||
required: true
|
||||
inputs:
|
||||
skip:
|
||||
description: 'Skip translations'
|
||||
required: false
|
||||
type: boolean
|
||||
|
||||
permissions: {}
|
||||
|
||||
env:
|
||||
WEBLATE_HOST: 'https://hosted.weblate.org'
|
||||
WEBLATE_COMPONENT: 'immich/immich'
|
||||
|
||||
jobs:
|
||||
merge:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Find translation PR
|
||||
id: find_pr
|
||||
if: ${{ inputs.skip != true }}
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
PR=$(gh pr list --repo $GITHUB_REPOSITORY --author weblate --json number,mergeable)
|
||||
echo "$PR"
|
||||
|
||||
PR_NUMBER=$(echo "$PR" | jq '
|
||||
if length == 1 then
|
||||
.[0].number
|
||||
else
|
||||
error("Expected exactly 1 entry, got \(length)")
|
||||
end
|
||||
' 2>&1) || exit 1
|
||||
|
||||
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_OUTPUT
|
||||
echo "Selected PR $PR_NUMBER"
|
||||
|
||||
if ! echo "$PR" | jq -e '.[0].mergeable == "MERGEABLE"'; then
|
||||
echo "PR is not mergeable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Generate a token
|
||||
id: generate_token
|
||||
if: ${{ inputs.skip != true }}
|
||||
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
||||
- name: Lock weblate
|
||||
if: ${{ inputs.skip != true }}
|
||||
env:
|
||||
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
|
||||
run: |
|
||||
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/lock/" -d lock=true
|
||||
|
||||
- name: Commit translations
|
||||
if: ${{ inputs.skip != true }}
|
||||
env:
|
||||
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
|
||||
run: |
|
||||
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/repository/" -d operation=commit
|
||||
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/repository/" -d operation=push
|
||||
|
||||
- name: Merge PR
|
||||
id: merge_pr
|
||||
if: ${{ inputs.skip != true }}
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||
PR_NUMBER: ${{ steps.find_pr.outputs.PR_NUMBER }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
REVIEW_ID=$(gh api -X POST "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews" --field event='APPROVE' --field body='Automatically merging translations PR' \
|
||||
| jq '.id')
|
||||
echo "REVIEW_ID=$REVIEW_ID" >> $GITHUB_OUTPUT
|
||||
gh pr merge "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --auto --squash
|
||||
|
||||
- name: Wait for PR to merge
|
||||
if: ${{ inputs.skip != true }}
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||
PR_NUMBER: ${{ steps.find_pr.outputs.PR_NUMBER }}
|
||||
REVIEW_ID: ${{ steps.merge_pr.outputs.REVIEW_ID }}
|
||||
run: |
|
||||
# So we clean up no matter what
|
||||
set +e
|
||||
|
||||
for i in {1..100}; do
|
||||
if gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json state | jq -e '.state == "MERGED"'; then
|
||||
echo "PR merged"
|
||||
exit 0
|
||||
else
|
||||
echo "PR not merged yet, waiting..."
|
||||
sleep 6
|
||||
fi
|
||||
done
|
||||
echo "PR did not merge in time"
|
||||
gh api -X PUT "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews/$REVIEW_ID/dismissals" --field message='Merge attempt timed out' --field event='DISMISS'
|
||||
gh pr merge "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --disable-auto
|
||||
exit 1
|
||||
|
||||
- name: Unlock weblate
|
||||
if: ${{ inputs.skip != true }}
|
||||
env:
|
||||
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
|
||||
run: |
|
||||
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/lock/" -d lock=false
|
||||
|
||||
- name: Report success
|
||||
run: |
|
||||
echo "Workflow completed successfully (or was skipped)"
|
||||
13
.github/workflows/org-checks.yml
vendored
13
.github/workflows/org-checks.yml
vendored
@@ -1,13 +0,0 @@
|
||||
name: Org Checks
|
||||
|
||||
on:
|
||||
pull_request_review:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
check-approvals:
|
||||
name: Check for Team/Admin Review
|
||||
uses: immich-app/devtools/.github/workflows/required-approval.yml@main
|
||||
permissions:
|
||||
pull-requests: read
|
||||
contents: read
|
||||
12
.github/workflows/org-pr-require-conventional-commit.yml
vendored
Normal file
12
.github/workflows/org-pr-require-conventional-commit.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
name: PR Conventional Commit
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, edited]
|
||||
|
||||
jobs:
|
||||
validate-pr-title:
|
||||
name: Validate PR Title (conventional commit)
|
||||
uses: immich-app/devtools/.github/workflows/shared-pr-require-conventional-commit.yml@main
|
||||
permissions:
|
||||
pull-requests: write
|
||||
15
.github/workflows/org-zizmor.yml
vendored
Normal file
15
.github/workflows/org-zizmor.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
name: Zizmor
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
zizmor:
|
||||
name: Zizmor
|
||||
uses: immich-app/devtools/.github/workflows/shared-zizmor.yml@main
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
@@ -1,19 +0,0 @@
|
||||
name: PR Conventional Commit Validation
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, edited]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
validate-pr-title:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: PR Conventional Commit Validation
|
||||
uses: ytanikin/PRConventionalCommits@b628c5a234cc32513014b7bfdd1e47b532124d98 # 1.3.0
|
||||
with:
|
||||
task_types: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]'
|
||||
add_label: 'false'
|
||||
38
.github/workflows/prepare-release.yml
vendored
38
.github/workflows/prepare-release.yml
vendored
@@ -10,12 +10,17 @@ on:
|
||||
type: choice
|
||||
options:
|
||||
- 'false'
|
||||
- major
|
||||
- minor
|
||||
- patch
|
||||
mobileBump:
|
||||
description: 'Bump mobile build number'
|
||||
required: false
|
||||
type: boolean
|
||||
skipTranslations:
|
||||
description: 'Skip translations'
|
||||
required: false
|
||||
type: boolean
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}-root
|
||||
@@ -24,28 +29,51 @@ concurrency:
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
merge_translations:
|
||||
uses: ./.github/workflows/merge-translations.yml
|
||||
with:
|
||||
skip: ${{ inputs.skipTranslations }}
|
||||
permissions:
|
||||
pull-requests: write
|
||||
secrets:
|
||||
PUSH_O_MATIC_APP_ID: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
PUSH_O_MATIC_APP_KEY: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
|
||||
|
||||
bump_version:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [merge_translations]
|
||||
outputs:
|
||||
ref: ${{ steps.push-tag.outputs.commit_long_sha }}
|
||||
permissions: {} # No job-level permissions are needed because it uses the app-token
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
|
||||
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
persist-credentials: true
|
||||
ref: main
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
|
||||
- name: Bump version
|
||||
env:
|
||||
SERVER_BUMP: ${{ inputs.serverBump }}
|
||||
@@ -83,13 +111,13 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
|
||||
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
persist-credentials: false
|
||||
@@ -100,7 +128,7 @@ jobs:
|
||||
name: release-apk-signed
|
||||
|
||||
- name: Create draft release
|
||||
uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 # v2.3.2
|
||||
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836 # v2.3.3
|
||||
with:
|
||||
draft: true
|
||||
tag_name: ${{ env.IMMICH_VERSION }}
|
||||
|
||||
2
.github/workflows/preview-label.yaml
vendored
2
.github/workflows/preview-label.yaml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
- uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
|
||||
with:
|
||||
script: |
|
||||
github.rest.issues.removeLabel({
|
||||
|
||||
15
.github/workflows/sdk.yml
vendored
15
.github/workflows/sdk.yml
vendored
@@ -16,22 +16,25 @@ jobs:
|
||||
run:
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
|
||||
# Setup .npmrc file to publish to npm
|
||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './open-api/typescript-sdk/.nvmrc'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Install deps
|
||||
run: npm ci
|
||||
run: pnpm install --frozen-lockfile
|
||||
- name: Build
|
||||
run: npm run build
|
||||
run: pnpm build
|
||||
- name: Publish
|
||||
run: npm publish
|
||||
run: pnpm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
57
.github/workflows/static_analysis.yml
vendored
57
.github/workflows/static_analysis.yml
vendored
@@ -17,28 +17,23 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run: ${{ steps.check.outputs.should_run }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
- name: Check what should run
|
||||
id: check
|
||||
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
|
||||
with:
|
||||
filters: |
|
||||
mobile:
|
||||
- 'mobile/**'
|
||||
workflow:
|
||||
- '.github/workflows/static_analysis.yml'
|
||||
- name: Check if we should force jobs to run
|
||||
id: should_force
|
||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
|
||||
force-filters: |
|
||||
- '.github/workflows/static_analysis.yml'
|
||||
force-events: 'workflow_dispatch,release'
|
||||
|
||||
mobile-dart-analyze:
|
||||
name: Run Dart Code Analysis
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -47,7 +42,7 @@ jobs:
|
||||
working-directory: ./mobile
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -68,7 +63,7 @@ jobs:
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Generate translation file
|
||||
run: make translation
|
||||
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
|
||||
|
||||
- name: Run Build Runner
|
||||
run: make build
|
||||
@@ -100,36 +95,10 @@ jobs:
|
||||
- name: Run dart format
|
||||
run: make format
|
||||
|
||||
- name: Run dart custom_lint
|
||||
run: dart run custom_lint
|
||||
# TODO: Re-enable after upgrading custom_lint
|
||||
# - name: Run dart custom_lint
|
||||
# run: dart run custom_lint
|
||||
|
||||
# TODO: Use https://github.com/CQLabs/dcm-action
|
||||
- name: Run DCM
|
||||
run: dcm analyze lib --fatal-style --fatal-warnings
|
||||
|
||||
zizmor:
|
||||
name: zizmor
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
security-events: write
|
||||
contents: read
|
||||
actions: read
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install the latest version of uv
|
||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
||||
|
||||
- name: Run zizmor đ
|
||||
run: uvx zizmor --format=sarif . > results.sarif
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Upload SARIF file
|
||||
uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
category: zizmor
|
||||
|
||||
549
.github/workflows/test.yml
vendored
549
.github/workflows/test.yml
vendored
@@ -4,37 +4,21 @@ on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run_i18n: ${{ steps.found_paths.outputs.i18n == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_web: ${{ steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_cli: ${{ steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_e2e: ${{ steps.found_paths.outputs.e2e == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_mobile: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_e2e_web: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_e2e_server_cli: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.server == 'true' || steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_.github: ${{ steps.found_paths.outputs['.github'] == 'true' || steps.should_force.outputs.should_force == 'true' }} # redundant to have should_force but if someone changes the trigger then this won't have to be changed
|
||||
should_run: ${{ steps.check.outputs.should_run }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
- name: Check what should run
|
||||
id: check
|
||||
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
|
||||
with:
|
||||
filters: |
|
||||
i18n:
|
||||
@@ -54,260 +38,225 @@ jobs:
|
||||
- 'mobile/**'
|
||||
machine-learning:
|
||||
- 'machine-learning/**'
|
||||
workflow:
|
||||
- '.github/workflows/test.yml'
|
||||
.github:
|
||||
- '.github/**'
|
||||
|
||||
- name: Check if we should force jobs to run
|
||||
id: should_force
|
||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
|
||||
force-filters: |
|
||||
- '.github/workflows/test.yml'
|
||||
force-events: 'workflow_dispatch'
|
||||
|
||||
server-unit-tests:
|
||||
name: Test & Lint Server
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./server
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run package manager install
|
||||
run: pnpm install
|
||||
- name: Run linter
|
||||
run: npm run lint
|
||||
run: pnpm lint
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run formatter
|
||||
run: npm run format
|
||||
run: pnpm format
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run tsc
|
||||
run: npm run check
|
||||
run: pnpm check
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run small tests & coverage
|
||||
run: npm test
|
||||
run: pnpm test
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
cli-unit-tests:
|
||||
name: Unit Test CLI
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./cli
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install && pnpm run build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
|
||||
- name: Install deps
|
||||
run: npm ci
|
||||
|
||||
run: pnpm install
|
||||
- name: Run linter
|
||||
run: npm run lint
|
||||
run: pnpm lint
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run formatter
|
||||
run: npm run format
|
||||
run: pnpm format
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run tsc
|
||||
run: npm run check
|
||||
run: pnpm check
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run unit tests & coverage
|
||||
run: npm run test
|
||||
run: pnpm test
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
cli-unit-tests-win:
|
||||
name: Unit Test CLI (Windows)
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }}
|
||||
runs-on: windows-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./cli
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install --frozen-lockfile && pnpm build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
|
||||
- name: Install deps
|
||||
run: npm ci
|
||||
|
||||
run: pnpm install --frozen-lockfile
|
||||
# Skip linter & formatter in Windows test.
|
||||
- name: Run tsc
|
||||
run: npm run check
|
||||
run: pnpm check
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run unit tests & coverage
|
||||
run: npm run test
|
||||
run: pnpm test
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
web-lint:
|
||||
name: Lint Web
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }}
|
||||
runs-on: mich
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./web
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './web/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install --frozen-lockfile && pnpm build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
- name: Run pnpm install
|
||||
run: pnpm rebuild && pnpm install --frozen-lockfile
|
||||
- name: Run linter
|
||||
run: npm run lint:p
|
||||
run: pnpm lint:p
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run formatter
|
||||
run: npm run format
|
||||
run: pnpm format
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run svelte checks
|
||||
run: npm run check:svelte
|
||||
run: pnpm check:svelte
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
web-unit-tests:
|
||||
name: Test Web
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./web
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './web/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install --frozen-lockfile && pnpm build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
run: pnpm install --frozen-lockfile
|
||||
- name: Run tsc
|
||||
run: npm run check:typescript
|
||||
run: pnpm check:typescript
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run unit tests & coverage
|
||||
run: npm run test
|
||||
run: pnpm test
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
i18n-tests:
|
||||
name: Test i18n
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_i18n == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './web/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Install dependencies
|
||||
run: npm --prefix=web ci
|
||||
|
||||
run: pnpm --filter=immich-web install --frozen-lockfile
|
||||
- name: Format
|
||||
run: npm --prefix=web run format:i18n
|
||||
|
||||
run: pnpm --filter=immich-web format:i18n
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||
id: verify-changed-files
|
||||
with:
|
||||
files: |
|
||||
i18n/**
|
||||
|
||||
- name: Verify files have not changed
|
||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
@@ -316,87 +265,77 @@ jobs:
|
||||
echo "ERROR: i18n files not up to date!"
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
exit 1
|
||||
|
||||
e2e-tests-lint:
|
||||
name: End-to-End Lint
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_e2e == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./e2e
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install --frozen-lockfile && pnpm build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
run: pnpm install --frozen-lockfile
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run linter
|
||||
run: npm run lint
|
||||
run: pnpm lint
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run formatter
|
||||
run: npm run format
|
||||
run: pnpm format
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run tsc
|
||||
run: npm run check
|
||||
run: pnpm check
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
server-medium-tests:
|
||||
name: Medium Tests (Server)
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./server
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run pnpm install
|
||||
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
|
||||
- name: Run medium tests
|
||||
run: npm run test:medium
|
||||
run: pnpm test:medium
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
e2e-tests-server-cli:
|
||||
name: End-to-End Tests (Server & CLI)
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_e2e_server_cli == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).server == true || fromJSON(needs.pre-job.outputs.should_run).cli == true }}
|
||||
runs-on: ${{ matrix.runner }}
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -406,47 +345,45 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: 'recursive'
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install --frozen-lockfile && pnpm build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run setup web
|
||||
run: pnpm install --frozen-lockfile && pnpm exec svelte-kit sync
|
||||
working-directory: ./web
|
||||
if: ${{ !cancelled() }}
|
||||
- name: Run setup cli
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install --frozen-lockfile && pnpm build
|
||||
working-directory: ./cli
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
run: pnpm install --frozen-lockfile
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Docker build
|
||||
run: docker compose build
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run e2e tests (api & cli)
|
||||
run: npm run test
|
||||
run: pnpm test
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
e2e-tests-web:
|
||||
name: End-to-End Tests (Web)
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_e2e_web == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).web == true }}
|
||||
runs-on: ${{ matrix.runner }}
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -456,42 +393,36 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: 'recursive'
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
run: pnpm install --frozen-lockfile && pnpm build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
run: pnpm install --frozen-lockfile
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Install Playwright Browsers
|
||||
run: npx playwright install chromium --only-shell
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Docker build
|
||||
run: docker compose build
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run e2e tests (web)
|
||||
run: npx playwright test
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
success-check-e2e:
|
||||
name: End-to-End Tests Success
|
||||
needs: [e2e-tests-server-cli, e2e-tests-web]
|
||||
@@ -502,37 +433,32 @@ jobs:
|
||||
- uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
|
||||
with:
|
||||
needs: ${{ toJSON(needs) }}
|
||||
|
||||
mobile-unit-tests:
|
||||
name: Unit Test Mobile
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Flutter SDK
|
||||
uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version-file: ./mobile/pubspec.yaml
|
||||
|
||||
- name: Generate translation file
|
||||
run: make translation
|
||||
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Run tests
|
||||
working-directory: ./mobile
|
||||
run: flutter test -j 1
|
||||
|
||||
ml-unit-tests:
|
||||
name: Unit Test ML
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -540,10 +466,9 @@ jobs:
|
||||
run:
|
||||
working-directory: ./machine-learning
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
||||
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
||||
@@ -566,56 +491,48 @@ jobs:
|
||||
- name: Run tests and coverage
|
||||
run: |
|
||||
uv run pytest --cov=immich_ml --cov-report term-missing
|
||||
|
||||
github-files-formatting:
|
||||
name: .github Files Formatting
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs['should_run_.github'] == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run)['.github'] == true }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./.github
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './.github/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Run pnpm install
|
||||
run: pnpm install --frozen-lockfile
|
||||
- name: Run formatter
|
||||
run: npm run format
|
||||
run: pnpm format
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
shellcheck:
|
||||
name: ShellCheck
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Run ShellCheck
|
||||
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
|
||||
with:
|
||||
ignore_paths: >-
|
||||
**/open-api/**
|
||||
**/openapi**
|
||||
**/node_modules/**
|
||||
|
||||
**/open-api/** **/openapi** **/node_modules/**
|
||||
generated-api-up-to-date:
|
||||
name: OpenAPI Clients
|
||||
runs-on: ubuntu-latest
|
||||
@@ -623,26 +540,24 @@ jobs:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Install server dependencies
|
||||
run: npm --prefix=server ci
|
||||
|
||||
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich install --frozen-lockfile
|
||||
- name: Build the app
|
||||
run: npm --prefix=server run build
|
||||
|
||||
run: pnpm --filter immich build
|
||||
- name: Run API generation
|
||||
run: make open-api
|
||||
|
||||
run: ./bin/generate-open-api.sh
|
||||
working-directory: open-api
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||
id: verify-changed-files
|
||||
@@ -651,7 +566,6 @@ jobs:
|
||||
mobile/openapi
|
||||
open-api/typescript-sdk
|
||||
open-api/immich-openapi-specs.json
|
||||
|
||||
- name: Verify files have not changed
|
||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
@@ -660,7 +574,6 @@ jobs:
|
||||
echo "ERROR: Generated files not up to date!"
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
exit 1
|
||||
|
||||
sql-schema-up-to-date:
|
||||
name: SQL Schema Checks
|
||||
runs-on: ubuntu-latest
|
||||
@@ -668,51 +581,42 @@ jobs:
|
||||
contents: read
|
||||
services:
|
||||
postgres:
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:ec713143dca1a426eba2e03707c319e2ec3cc9d304ef767f777f8e297dee820c
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:da52bbead5d818adaa8077c8dcdaad0aaf93038c31ad8348b51f9f0ec1310a4d
|
||||
env:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_DB: immich
|
||||
options: >-
|
||||
--health-cmd pg_isready
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
||||
ports:
|
||||
- 5432:5432
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./server
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||
- name: Install server dependencies
|
||||
run: npm ci
|
||||
|
||||
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
|
||||
- name: Build the app
|
||||
run: npm run build
|
||||
|
||||
run: pnpm build
|
||||
- name: Run existing migrations
|
||||
run: npm run migrations:run
|
||||
|
||||
run: pnpm migrations:run
|
||||
- name: Test npm run schema:reset command works
|
||||
run: npm run schema:reset
|
||||
|
||||
run: pnpm schema:reset
|
||||
- name: Generate new migrations
|
||||
continue-on-error: true
|
||||
run: npm run migrations:generate src/TestMigration
|
||||
|
||||
run: pnpm migrations:generate src/TestMigration
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||
id: verify-changed-files
|
||||
@@ -728,19 +632,16 @@ jobs:
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
cat ./src/*-TestMigration.ts
|
||||
exit 1
|
||||
|
||||
- name: Run SQL generation
|
||||
run: npm run sync:sql
|
||||
run: pnpm sync:sql
|
||||
env:
|
||||
DB_URL: postgres://postgres:postgres@localhost:5432/immich
|
||||
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||
id: verify-changed-sql-files
|
||||
with:
|
||||
files: |
|
||||
server/src/queries
|
||||
|
||||
- name: Verify SQL files have not changed
|
||||
if: steps.verify-changed-sql-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
@@ -751,77 +652,77 @@ jobs:
|
||||
git diff
|
||||
exit 1
|
||||
|
||||
# mobile-integration-tests:
|
||||
# name: Run mobile end-to-end integration tests
|
||||
# runs-on: macos-latest
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4
|
||||
# - uses: actions/setup-java@v3
|
||||
# with:
|
||||
# distribution: 'zulu'
|
||||
# java-version: '12.x'
|
||||
# cache: 'gradle'
|
||||
# - name: Cache android SDK
|
||||
# uses: actions/cache@v3
|
||||
# id: android-sdk
|
||||
# with:
|
||||
# key: android-sdk
|
||||
# path: |
|
||||
# /usr/local/lib/android/
|
||||
# ~/.android
|
||||
# - name: Cache Gradle
|
||||
# uses: actions/cache@v3
|
||||
# with:
|
||||
# path: |
|
||||
# ./mobile/build/
|
||||
# ./mobile/android/.gradle/
|
||||
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
|
||||
# - name: Setup Android SDK
|
||||
# if: steps.android-sdk.outputs.cache-hit != 'true'
|
||||
# uses: android-actions/setup-android@v2
|
||||
# - name: AVD cache
|
||||
# uses: actions/cache@v3
|
||||
# id: avd-cache
|
||||
# with:
|
||||
# path: |
|
||||
# ~/.android/avd/*
|
||||
# ~/.android/adb*
|
||||
# key: avd-29
|
||||
# - name: create AVD and generate snapshot for caching
|
||||
# if: steps.avd-cache.outputs.cache-hit != 'true'
|
||||
# uses: reactivecircus/android-emulator-runner@v2.27.0
|
||||
# with:
|
||||
# working-directory: ./mobile
|
||||
# cores: 2
|
||||
# api-level: 29
|
||||
# arch: x86_64
|
||||
# profile: pixel
|
||||
# target: default
|
||||
# force-avd-creation: false
|
||||
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
# disable-animations: false
|
||||
# script: echo "Generated AVD snapshot for caching."
|
||||
# - name: Setup Flutter SDK
|
||||
# uses: subosito/flutter-action@v2
|
||||
# with:
|
||||
# channel: 'stable'
|
||||
# flutter-version: '3.7.3'
|
||||
# cache: true
|
||||
# - name: Run integration tests
|
||||
# uses: Wandalen/wretry.action@master
|
||||
# with:
|
||||
# action: reactivecircus/android-emulator-runner@v2.27.0
|
||||
# with: |
|
||||
# working-directory: ./mobile
|
||||
# cores: 2
|
||||
# api-level: 29
|
||||
# arch: x86_64
|
||||
# profile: pixel
|
||||
# target: default
|
||||
# force-avd-creation: false
|
||||
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
# disable-animations: true
|
||||
# script: |
|
||||
# flutter pub get
|
||||
# flutter test integration_test
|
||||
# attempt_limit: 3
|
||||
# mobile-integration-tests:
|
||||
# name: Run mobile end-to-end integration tests
|
||||
# runs-on: macos-latest
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4
|
||||
# - uses: actions/setup-java@v3
|
||||
# with:
|
||||
# distribution: 'zulu'
|
||||
# java-version: '12.x'
|
||||
# cache: 'gradle'
|
||||
# - name: Cache android SDK
|
||||
# uses: actions/cache@v3
|
||||
# id: android-sdk
|
||||
# with:
|
||||
# key: android-sdk
|
||||
# path: |
|
||||
# /usr/local/lib/android/
|
||||
# ~/.android
|
||||
# - name: Cache Gradle
|
||||
# uses: actions/cache@v3
|
||||
# with:
|
||||
# path: |
|
||||
# ./mobile/build/
|
||||
# ./mobile/android/.gradle/
|
||||
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
|
||||
# - name: Setup Android SDK
|
||||
# if: steps.android-sdk.outputs.cache-hit != 'true'
|
||||
# uses: android-actions/setup-android@v2
|
||||
# - name: AVD cache
|
||||
# uses: actions/cache@v3
|
||||
# id: avd-cache
|
||||
# with:
|
||||
# path: |
|
||||
# ~/.android/avd/*
|
||||
# ~/.android/adb*
|
||||
# key: avd-29
|
||||
# - name: create AVD and generate snapshot for caching
|
||||
# if: steps.avd-cache.outputs.cache-hit != 'true'
|
||||
# uses: reactivecircus/android-emulator-runner@v2.27.0
|
||||
# with:
|
||||
# working-directory: ./mobile
|
||||
# cores: 2
|
||||
# api-level: 29
|
||||
# arch: x86_64
|
||||
# profile: pixel
|
||||
# target: default
|
||||
# force-avd-creation: false
|
||||
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
# disable-animations: false
|
||||
# script: echo "Generated AVD snapshot for caching."
|
||||
# - name: Setup Flutter SDK
|
||||
# uses: subosito/flutter-action@v2
|
||||
# with:
|
||||
# channel: 'stable'
|
||||
# flutter-version: '3.7.3'
|
||||
# cache: true
|
||||
# - name: Run integration tests
|
||||
# uses: Wandalen/wretry.action@master
|
||||
# with:
|
||||
# action: reactivecircus/android-emulator-runner@v2.27.0
|
||||
# with: |
|
||||
# working-directory: ./mobile
|
||||
# cores: 2
|
||||
# api-level: 29
|
||||
# arch: x86_64
|
||||
# profile: pixel
|
||||
# target: default
|
||||
# force-avd-creation: false
|
||||
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
# disable-animations: true
|
||||
# script: |
|
||||
# flutter pub get
|
||||
# flutter test integration_test
|
||||
# attempt_limit: 3
|
||||
|
||||
44
.github/workflows/weblate-lock.yml
vendored
44
.github/workflows/weblate-lock.yml
vendored
@@ -3,48 +3,52 @@ name: Weblate checks
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- ready_for_review
|
||||
- auto_merge_enabled
|
||||
- auto_merge_disabled
|
||||
|
||||
permissions: {}
|
||||
|
||||
env:
|
||||
BOT_NAME: immich-push-o-matic
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}
|
||||
should_run: ${{ steps.check.outputs.should_run }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
- name: Check what should run
|
||||
id: check
|
||||
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
|
||||
with:
|
||||
filters: |
|
||||
i18n:
|
||||
- 'i18n/!(en)**\.json'
|
||||
exclude-branches: 'chore/translations'
|
||||
skip-force-logic: 'true'
|
||||
|
||||
enforce-lock:
|
||||
name: Check Weblate Lock
|
||||
needs: [pre-job]
|
||||
runs-on: ubuntu-latest
|
||||
permissions: {}
|
||||
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }}
|
||||
steps:
|
||||
- name: Check weblate lock
|
||||
- name: Bot review status
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.pull_request.number || github.event.pull_request_review.pull_request.number }}
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
if [[ "false" = $(curl https://hosted.weblate.org/api/components/immich/immich/lock/ | jq .locked) ]]; then
|
||||
exit 1
|
||||
fi
|
||||
- name: Find Pull Request
|
||||
uses: juliangruber/find-pull-request-action@952b3bb1ddb2dcc0aa3479e98bb1c2d1a922f096 # v1.10.0
|
||||
id: find-pr
|
||||
with:
|
||||
branch: chore/translations
|
||||
- name: Fail if existing weblate PR
|
||||
if: ${{ steps.find-pr.outputs.number }}
|
||||
run: exit 1
|
||||
# Then check for APPROVED by the bot, if absent fail
|
||||
gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json reviews | jq -e '.reviews | map(select(.author.login == env.BOT_NAME and .state == "APPROVED")) | length > 0' \
|
||||
|| (echo "The push-o-matic bot has not approved this PR yet" && exit 1)
|
||||
|
||||
success-check-lock:
|
||||
name: Weblate Lock Check Success
|
||||
needs: [enforce-lock]
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -18,6 +18,7 @@ mobile/libisar.dylib
|
||||
mobile/openapi/test
|
||||
mobile/openapi/doc
|
||||
mobile/openapi/.openapi-generator/FILES
|
||||
mobile/ios/build
|
||||
|
||||
open-api/typescript-sdk/build
|
||||
mobile/android/fastlane/report.xml
|
||||
@@ -25,3 +26,5 @@ mobile/ios/fastlane/report.xml
|
||||
|
||||
vite.config.js.timestamp-*
|
||||
.pnpm-store
|
||||
.devcontainer/library
|
||||
.devcontainer/.env*
|
||||
|
||||
18
.pnpmfile.cjs
Normal file
18
.pnpmfile.cjs
Normal file
@@ -0,0 +1,18 @@
|
||||
module.exports = {
|
||||
hooks: {
|
||||
readPackage: (pkg) => {
|
||||
if (!pkg.name) {
|
||||
return pkg;
|
||||
}
|
||||
if (pkg.name === "exiftool-vendored") {
|
||||
if (pkg.optionalDependencies["exiftool-vendored.pl"]) {
|
||||
// make exiftool-vendored.pl a regular dependency
|
||||
pkg.dependencies["exiftool-vendored.pl"] =
|
||||
pkg.optionalDependencies["exiftool-vendored.pl"];
|
||||
delete pkg.optionalDependencies["exiftool-vendored.pl"];
|
||||
}
|
||||
}
|
||||
return pkg;
|
||||
},
|
||||
},
|
||||
};
|
||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -56,7 +56,8 @@
|
||||
"explorer.fileNesting.enabled": true,
|
||||
"explorer.fileNesting.patterns": {
|
||||
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
|
||||
"*.ts": "${capture}.spec.ts,${capture}.mock.ts"
|
||||
"*.ts": "${capture}.spec.ts,${capture}.mock.ts",
|
||||
"package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb, bun.lock, pnpm-workspace.yaml, .pnpmfile.cjs"
|
||||
},
|
||||
"svelte.enable-ts-plugin": true,
|
||||
"typescript.preferences.importModuleSpecifier": "non-relative"
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
/.github/ @bo0tzz
|
||||
/docker/ @bo0tzz
|
||||
/server/ @danieldietzler
|
||||
/web/ @danieldietzler
|
||||
/machine-learning/ @mertalev
|
||||
/e2e/ @danieldietzler
|
||||
/mobile/ @shenlong-tanwen
|
||||
|
||||
98
Makefile
98
Makefile
@@ -8,14 +8,14 @@ dev-update:
|
||||
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
|
||||
|
||||
dev-scale:
|
||||
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans
|
||||
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans
|
||||
|
||||
dev-docs:
|
||||
npm --prefix docs run start
|
||||
|
||||
.PHONY: e2e
|
||||
e2e:
|
||||
@trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --build -V --remove-orphans
|
||||
@trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --remove-orphans
|
||||
|
||||
e2e-update:
|
||||
@trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --build -V --remove-orphans
|
||||
@@ -43,7 +43,7 @@ open-api-typescript:
|
||||
cd ./open-api && bash ./bin/generate-open-api.sh typescript
|
||||
|
||||
sql:
|
||||
npm --prefix server run sync:sql
|
||||
pnpm --filter immich run sync:sql
|
||||
|
||||
attach-server:
|
||||
docker exec -it docker_immich-server_1 sh
|
||||
@@ -51,33 +51,59 @@ attach-server:
|
||||
renovate:
|
||||
LOG_LEVEL=debug npx renovate --platform=local --repository-cache=reset
|
||||
|
||||
# Directories that need to be created for volumes or build output
|
||||
VOLUME_DIRS = \
|
||||
./.pnpm-store \
|
||||
./web/.svelte-kit \
|
||||
./web/node_modules \
|
||||
./web/coverage \
|
||||
./e2e/node_modules \
|
||||
./docs/node_modules \
|
||||
./server/node_modules \
|
||||
./open-api/typescript-sdk/node_modules \
|
||||
./.github/node_modules \
|
||||
./node_modules \
|
||||
./cli/node_modules
|
||||
|
||||
# Include .env file if it exists
|
||||
-include docker/.env
|
||||
|
||||
MODULES = e2e server web cli sdk docs .github
|
||||
|
||||
# directory to package name mapping function
|
||||
# cli = @immich/cli
|
||||
# docs = documentation
|
||||
# e2e = immich-e2e
|
||||
# open-api/typescript-sdk = @immich/sdk
|
||||
# server = immich
|
||||
# web = immich-web
|
||||
map-package = $(subst sdk,@immich/sdk,$(subst cli,@immich/cli,$(subst docs,documentation,$(subst e2e,immich-e2e,$(subst server,immich,$(subst web,immich-web,$1))))))
|
||||
|
||||
audit-%:
|
||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) audit fix
|
||||
pnpm --filter $(call map-package,$*) audit fix
|
||||
install-%:
|
||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) i
|
||||
ci-%:
|
||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) ci
|
||||
pnpm --filter $(call map-package,$*) install $(if $(FROZEN),--frozen-lockfile) $(if $(OFFLINE),--offline)
|
||||
build-cli: build-sdk
|
||||
build-web: build-sdk
|
||||
build-%: install-%
|
||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) run build
|
||||
pnpm --filter $(call map-package,$*) run build
|
||||
format-%:
|
||||
npm --prefix $* run format:fix
|
||||
pnpm --filter $(call map-package,$*) run format:fix
|
||||
lint-%:
|
||||
npm --prefix $* run lint:fix
|
||||
pnpm --filter $(call map-package,$*) run lint:fix
|
||||
lint-web:
|
||||
pnpm --filter $(call map-package,$*) run lint:p
|
||||
check-%:
|
||||
npm --prefix $* run check
|
||||
pnpm --filter $(call map-package,$*) run check
|
||||
check-web:
|
||||
npm --prefix web run check:typescript
|
||||
npm --prefix web run check:svelte
|
||||
pnpm --filter immich-web run check:typescript
|
||||
pnpm --filter immich-web run check:svelte
|
||||
test-%:
|
||||
npm --prefix $* run test
|
||||
pnpm --filter $(call map-package,$*) run test
|
||||
test-e2e:
|
||||
docker compose -f ./e2e/docker-compose.yml build
|
||||
npm --prefix e2e run test
|
||||
npm --prefix e2e run test:web
|
||||
pnpm --filter immich-e2e run test
|
||||
pnpm --filter immich-e2e run test:web
|
||||
test-medium:
|
||||
docker run \
|
||||
--rm \
|
||||
@@ -87,27 +113,39 @@ test-medium:
|
||||
-v ./server/tsconfig.json:/usr/src/app/tsconfig.json \
|
||||
-e NODE_ENV=development \
|
||||
immich-server:latest \
|
||||
-c "npm ci && npm run test:medium -- --run"
|
||||
-c "pnpm test:medium -- --run"
|
||||
test-medium-dev:
|
||||
docker exec -it immich_server /bin/sh -c "npm run test:medium"
|
||||
docker exec -it immich_server /bin/sh -c "pnpm run test:medium"
|
||||
|
||||
build-all: $(foreach M,$(filter-out e2e .github,$(MODULES)),build-$M) ;
|
||||
install-all: $(foreach M,$(MODULES),install-$M) ;
|
||||
ci-all: $(foreach M,$(filter-out .github,$(MODULES)),ci-$M) ;
|
||||
check-all: $(foreach M,$(filter-out sdk cli docs .github,$(MODULES)),check-$M) ;
|
||||
lint-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),lint-$M) ;
|
||||
format-all: $(foreach M,$(filter-out sdk,$(MODULES)),format-$M) ;
|
||||
audit-all: $(foreach M,$(MODULES),audit-$M) ;
|
||||
hygiene-all: lint-all format-all check-all sql audit-all;
|
||||
test-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),test-$M) ;
|
||||
install-all:
|
||||
pnpm -r --filter '!documentation' install
|
||||
|
||||
build-all: $(foreach M,$(filter-out e2e docs .github,$(MODULES)),build-$M) ;
|
||||
|
||||
check-all:
|
||||
pnpm -r --filter '!documentation' run "/^(check|check\:svelte|check\:typescript)$/"
|
||||
lint-all:
|
||||
pnpm -r --filter '!documentation' run lint:fix
|
||||
format-all:
|
||||
pnpm -r --filter '!documentation' run format:fix
|
||||
audit-all:
|
||||
pnpm -r --filter '!documentation' audit fix
|
||||
hygiene-all: audit-all
|
||||
pnpm -r --filter '!documentation' run "/(format:fix|check|check:svelte|check:typescript|sql)/"
|
||||
|
||||
test-all:
|
||||
pnpm -r --filter '!documentation' run "/^test/"
|
||||
|
||||
clean:
|
||||
find . -name "node_modules" -type d -prune -exec rm -rf {} +
|
||||
find . -name "dist" -type d -prune -exec rm -rf '{}' +
|
||||
find . -name "build" -type d -prune -exec rm -rf '{}' +
|
||||
find . -name "svelte-kit" -type d -prune -exec rm -rf '{}' +
|
||||
command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml rm -v -f || true
|
||||
command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml rm -v -f || true
|
||||
find . -name ".svelte-kit" -type d -prune -exec rm -rf '{}' +
|
||||
find . -name "coverage" -type d -prune -exec rm -rf '{}' +
|
||||
find . -name ".pnpm-store" -type d -prune -exec rm -rf '{}' +
|
||||
command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml down -v --remove-orphans || true
|
||||
command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml down -v --remove-orphans || true
|
||||
|
||||
|
||||
setup-server-dev: install-server
|
||||
setup-web-dev: install-sdk build-sdk install-web
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.18.0
|
||||
22.19.0
|
||||
|
||||
@@ -1,19 +1,14 @@
|
||||
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e AS core
|
||||
|
||||
WORKDIR /usr/src/open-api/typescript-sdk
|
||||
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./
|
||||
RUN npm ci
|
||||
COPY open-api/typescript-sdk/ ./
|
||||
RUN npm run build
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
COPY cli/package.json cli/package-lock.json ./
|
||||
RUN npm ci
|
||||
|
||||
COPY cli .
|
||||
RUN npm run build
|
||||
COPY package* pnpm* .pnpmfile.cjs ./
|
||||
COPY ./cli ./cli/
|
||||
COPY ./open-api/typescript-sdk ./open-api/typescript-sdk/
|
||||
RUN corepack enable pnpm && \
|
||||
pnpm install --filter @immich/sdk --filter @immich/cli --frozen-lockfile && \
|
||||
pnpm --filter @immich/sdk build && \
|
||||
pnpm --filter @immich/cli build
|
||||
|
||||
WORKDIR /import
|
||||
|
||||
ENTRYPOINT ["node", "/usr/src/app/dist"]
|
||||
ENTRYPOINT ["node", "/usr/src/app/cli/dist"]
|
||||
|
||||
4600
cli/package-lock.json
generated
4600
cli/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@immich/cli",
|
||||
"version": "2.2.77",
|
||||
"version": "2.2.92",
|
||||
"description": "Command Line Interface (CLI) for Immich",
|
||||
"type": "module",
|
||||
"exports": "./dist/index.js",
|
||||
@@ -13,7 +13,6 @@
|
||||
"cli"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.1.0",
|
||||
"@eslint/js": "^9.8.0",
|
||||
"@immich/sdk": "file:../open-api/typescript-sdk",
|
||||
"@types/byte-size": "^8.1.0",
|
||||
@@ -21,7 +20,7 @@
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/micromatch": "^4.0.9",
|
||||
"@types/mock-fs": "^4.13.1",
|
||||
"@types/node": "^22.17.0",
|
||||
"@types/node": "^22.18.1",
|
||||
"@vitest/coverage-v8": "^3.0.0",
|
||||
"byte-size": "^9.0.0",
|
||||
"cli-progress": "^3.12.0",
|
||||
@@ -69,6 +68,6 @@
|
||||
"micromatch": "^4.0.8"
|
||||
},
|
||||
"volta": {
|
||||
"node": "22.18.0"
|
||||
"node": "22.19.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,37 +2,37 @@
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||
version = "4.52.1"
|
||||
constraints = "4.52.1"
|
||||
version = "4.52.5"
|
||||
constraints = "4.52.5"
|
||||
hashes = [
|
||||
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||
"h1:+rfzF+16ZcWZWnTyW/p1HHTzYbPKX8Zt2nIFtR/+f+E=",
|
||||
"h1:18bXaaOSq8MWKuMxo/4y7EB7/i7G90y5QsKHZRmkoDo=",
|
||||
"h1:4vZVOpKeEQZsF2VrARRZFeL37Ed/gD4rRMtfnvWQres=",
|
||||
"h1:BZOsTF83QPKXTAaYqxPKzdl1KRjk/L2qbPpFjM0w28A=",
|
||||
"h1:CDuC+HXLvc1z6wkCRsSDcc/+QENIHEtssYshiWg3opA=",
|
||||
"h1:DE+YFzLnqSe79pI2R4idRGx5QzLdrA7RXvngTkGfZ30=",
|
||||
"h1:DfaJwH3Ml4yrRbdAY4AcDVy0QTQk5T3A622TXzS/u2E=",
|
||||
"h1:EIDXP0W3kgIv2pecrFmqtK/DnlqkyckzBzhxKaXU+4A=",
|
||||
"h1:EV4kYyaOnwGA0bh/3hU6Ezqnt1PFDxopH7i85e48IzY=",
|
||||
"h1:M0iXabfzamU+MPDi0G9XACpbacFKMakmM+Z9HZ8HrsM=",
|
||||
"h1:YWmCbGF/KbsrUzcYVBLscwLizidbp95TDQa0N2qpmVo=",
|
||||
"h1:cxPcCB5gbrpUO1+IXkQYs1YTY50/0IlApCzGea0cwuQ=",
|
||||
"h1:g6DldikTV2HXUu9uoeNY5FuLufgaYWF4ufgZg7wq62s=",
|
||||
"h1:oi/Hrx9pwoQ+Z52CBC+rrowVH387EIj0qvnxQgDeI+0=",
|
||||
"zh:1a3400cb38863b2585968d1876706bcfc67a148e1318a1d325c6c7704adc999b",
|
||||
"zh:4c5062cb9e9da1676f06ae92b8370186d98976cc4c7030d3cd76df12af54282a",
|
||||
"zh:52110f493b5f0587ef77a1cfd1a67001fd4c617b14c6502d732ab47352bdc2f7",
|
||||
"zh:5aa536f9eaeb43823aaf2aa80e7d39b25ef2b383405ed034aa16a28b446a9238",
|
||||
"zh:5cc39459a1c6be8a918f17054e4fbba573825ed5597dcada588fe99614d98a5b",
|
||||
"zh:629ae6a7ba298815131da826474d199312d21cec53a4d5ded4fa56a692e6f072",
|
||||
"zh:719cc7c75dc1d3eb30c22ff5102a017996d9788b948078c7e1c5b3446aeca661",
|
||||
"zh:8698635a3ca04383c1e93b21d6963346bdae54d27177a48e4b1435b7f731731c",
|
||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||
"zh:8a9993f1dcadf1dd6ca43b23348abe374605d29945a2fafc07fb3457644e6a54",
|
||||
"zh:b1b9a1e6bcc24d5863a664a411d2dc906373ae7a2399d2d65548ce7377057852",
|
||||
"zh:b270184cdeec277218e84b94cb136fead753da717f9b9dc378e51907f3f00bb0",
|
||||
"zh:dff2bc10071210181726ce270f954995fe42c696e61e2e8f874021fed02521e5",
|
||||
"zh:e8e87b40b6a87dc097b0fdc20d3f725cec0d82abc9cc3755c1f89f8f6e8b0036",
|
||||
"zh:ee964a6573d399a5dd22ce328fb38ca1207797a02248f14b2e4913ee390e7803",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ terraform {
|
||||
required_providers {
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "4.52.1"
|
||||
version = "4.52.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,37 +2,37 @@
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||
version = "4.52.1"
|
||||
constraints = "4.52.1"
|
||||
version = "4.52.5"
|
||||
constraints = "4.52.5"
|
||||
hashes = [
|
||||
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||
"h1:+rfzF+16ZcWZWnTyW/p1HHTzYbPKX8Zt2nIFtR/+f+E=",
|
||||
"h1:18bXaaOSq8MWKuMxo/4y7EB7/i7G90y5QsKHZRmkoDo=",
|
||||
"h1:4vZVOpKeEQZsF2VrARRZFeL37Ed/gD4rRMtfnvWQres=",
|
||||
"h1:BZOsTF83QPKXTAaYqxPKzdl1KRjk/L2qbPpFjM0w28A=",
|
||||
"h1:CDuC+HXLvc1z6wkCRsSDcc/+QENIHEtssYshiWg3opA=",
|
||||
"h1:DE+YFzLnqSe79pI2R4idRGx5QzLdrA7RXvngTkGfZ30=",
|
||||
"h1:DfaJwH3Ml4yrRbdAY4AcDVy0QTQk5T3A622TXzS/u2E=",
|
||||
"h1:EIDXP0W3kgIv2pecrFmqtK/DnlqkyckzBzhxKaXU+4A=",
|
||||
"h1:EV4kYyaOnwGA0bh/3hU6Ezqnt1PFDxopH7i85e48IzY=",
|
||||
"h1:M0iXabfzamU+MPDi0G9XACpbacFKMakmM+Z9HZ8HrsM=",
|
||||
"h1:YWmCbGF/KbsrUzcYVBLscwLizidbp95TDQa0N2qpmVo=",
|
||||
"h1:cxPcCB5gbrpUO1+IXkQYs1YTY50/0IlApCzGea0cwuQ=",
|
||||
"h1:g6DldikTV2HXUu9uoeNY5FuLufgaYWF4ufgZg7wq62s=",
|
||||
"h1:oi/Hrx9pwoQ+Z52CBC+rrowVH387EIj0qvnxQgDeI+0=",
|
||||
"zh:1a3400cb38863b2585968d1876706bcfc67a148e1318a1d325c6c7704adc999b",
|
||||
"zh:4c5062cb9e9da1676f06ae92b8370186d98976cc4c7030d3cd76df12af54282a",
|
||||
"zh:52110f493b5f0587ef77a1cfd1a67001fd4c617b14c6502d732ab47352bdc2f7",
|
||||
"zh:5aa536f9eaeb43823aaf2aa80e7d39b25ef2b383405ed034aa16a28b446a9238",
|
||||
"zh:5cc39459a1c6be8a918f17054e4fbba573825ed5597dcada588fe99614d98a5b",
|
||||
"zh:629ae6a7ba298815131da826474d199312d21cec53a4d5ded4fa56a692e6f072",
|
||||
"zh:719cc7c75dc1d3eb30c22ff5102a017996d9788b948078c7e1c5b3446aeca661",
|
||||
"zh:8698635a3ca04383c1e93b21d6963346bdae54d27177a48e4b1435b7f731731c",
|
||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||
"zh:8a9993f1dcadf1dd6ca43b23348abe374605d29945a2fafc07fb3457644e6a54",
|
||||
"zh:b1b9a1e6bcc24d5863a664a411d2dc906373ae7a2399d2d65548ce7377057852",
|
||||
"zh:b270184cdeec277218e84b94cb136fead753da717f9b9dc378e51907f3f00bb0",
|
||||
"zh:dff2bc10071210181726ce270f954995fe42c696e61e2e8f874021fed02521e5",
|
||||
"zh:e8e87b40b6a87dc097b0fdc20d3f725cec0d82abc9cc3755c1f89f8f6e8b0036",
|
||||
"zh:ee964a6573d399a5dd22ce328fb38ca1207797a02248f14b2e4913ee390e7803",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ terraform {
|
||||
required_providers {
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "4.52.1"
|
||||
version = "4.52.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,16 +23,24 @@ services:
|
||||
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
||||
build:
|
||||
context: ../
|
||||
dockerfile: server/Dockerfile
|
||||
dockerfile: server/Dockerfile.dev
|
||||
target: dev
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../server:/usr/src/app/server
|
||||
- ../open-api:/usr/src/app/open-api
|
||||
- ..:/usr/src/app
|
||||
- ${UPLOAD_LOCATION}/photos:/data
|
||||
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||
- /usr/src/app/server/node_modules
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- pnpm-store:/usr/src/app/.pnpm-store
|
||||
- server-node_modules:/usr/src/app/server/node_modules
|
||||
- web-node_modules:/usr/src/app/web/node_modules
|
||||
- github-node_modules:/usr/src/app/.github/node_modules
|
||||
- cli-node_modules:/usr/src/app/cli/node_modules
|
||||
- docs-node_modules:/usr/src/app/docs/node_modules
|
||||
- e2e-node_modules:/usr/src/app/e2e/node_modules
|
||||
- sdk-node_modules:/usr/src/app/open-api/typescript-sdk/node_modules
|
||||
- app-node_modules:/usr/src/app/node_modules
|
||||
- sveltekit:/usr/src/app/web/.svelte-kit
|
||||
- coverage:/usr/src/app/web/coverage
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
@@ -58,19 +66,20 @@ services:
|
||||
- 9231:9231
|
||||
- 2283:2283
|
||||
depends_on:
|
||||
- redis
|
||||
- database
|
||||
redis:
|
||||
condition: service_started
|
||||
database:
|
||||
condition: service_started
|
||||
healthcheck:
|
||||
disable: false
|
||||
|
||||
immich-web:
|
||||
container_name: immich_web
|
||||
image: immich-web-dev:latest
|
||||
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
|
||||
# user: 0:0
|
||||
build:
|
||||
context: ../
|
||||
dockerfile: web/Dockerfile
|
||||
dockerfile: server/Dockerfile.dev
|
||||
target: dev
|
||||
command: ['immich-web']
|
||||
env_file:
|
||||
- .env
|
||||
@@ -78,18 +87,26 @@ services:
|
||||
- 3000:3000
|
||||
- 24678:24678
|
||||
volumes:
|
||||
- ../web:/usr/src/app/web
|
||||
- ../i18n:/usr/src/app/i18n
|
||||
- ../open-api/:/usr/src/app/open-api/
|
||||
# - ../../ui:/usr/ui
|
||||
- /usr/src/app/web/node_modules
|
||||
- ..:/usr/src/app
|
||||
- pnpm-store:/usr/src/app/.pnpm-store
|
||||
- server-node_modules:/usr/src/app/server/node_modules
|
||||
- web-node_modules:/usr/src/app/web/node_modules
|
||||
- github-node_modules:/usr/src/app/.github/node_modules
|
||||
- cli-node_modules:/usr/src/app/cli/node_modules
|
||||
- docs-node_modules:/usr/src/app/docs/node_modules
|
||||
- e2e-node_modules:/usr/src/app/e2e/node_modules
|
||||
- sdk-node_modules:/usr/src/app/open-api/typescript-sdk/node_modules
|
||||
- app-node_modules:/usr/src/app/node_modules
|
||||
- sveltekit:/usr/src/app/web/.svelte-kit
|
||||
- coverage:/usr/src/app/web/coverage
|
||||
ulimits:
|
||||
nofile:
|
||||
soft: 1048576
|
||||
hard: 1048576
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- immich-server
|
||||
immich-server:
|
||||
condition: service_started
|
||||
|
||||
immich-machine-learning:
|
||||
container_name: immich_machine_learning
|
||||
@@ -117,13 +134,13 @@ services:
|
||||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
@@ -161,3 +178,14 @@ volumes:
|
||||
model-cache:
|
||||
prometheus-data:
|
||||
grafana-data:
|
||||
pnpm-store:
|
||||
server-node_modules:
|
||||
web-node_modules:
|
||||
github-node_modules:
|
||||
cli-node_modules:
|
||||
docs-node_modules:
|
||||
e2e-node_modules:
|
||||
sdk-node_modules:
|
||||
app-node_modules:
|
||||
sveltekit:
|
||||
coverage:
|
||||
|
||||
@@ -56,14 +56,14 @@ services:
|
||||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
@@ -95,7 +95,7 @@ services:
|
||||
command: ['./run.sh', '-disable-reporting']
|
||||
ports:
|
||||
- 3000:3000
|
||||
image: grafana/grafana:12.1.0-ubuntu@sha256:397aa30dd1af16cb6c5c9879498e467973a7f87eacf949f6d5a29407a3843809
|
||||
image: grafana/grafana:12.1.1-ubuntu@sha256:d1da838234ff2de93e0065ee1bf0e66d38f948dcc5d718c25fa6237e14b4424a
|
||||
volumes:
|
||||
- grafana-data:/var/lib/grafana
|
||||
|
||||
|
||||
@@ -49,14 +49,14 @@ services:
|
||||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
POSTGRES_USER: ${DB_USERNAME}
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.18.0
|
||||
22.19.0
|
||||
|
||||
@@ -5,13 +5,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
|
||||
### Installation
|
||||
|
||||
```
|
||||
$ npm install
|
||||
$ pnpm install
|
||||
```
|
||||
|
||||
### Local Development
|
||||
|
||||
```
|
||||
$ npm run start
|
||||
$ pnpm run start
|
||||
```
|
||||
|
||||
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
|
||||
@@ -19,7 +19,7 @@ This command starts a local development server and opens up a browser window. Mo
|
||||
### Build
|
||||
|
||||
```
|
||||
$ npm run build
|
||||
$ pnpm run build
|
||||
```
|
||||
|
||||
This command generates static content into the `build` directory and can be served using any static contents hosting service.
|
||||
@@ -29,13 +29,13 @@ This command generates static content into the `build` directory and can be serv
|
||||
Using SSH:
|
||||
|
||||
```
|
||||
$ USE_SSH=true npm run deploy
|
||||
$ USE_SSH=true pnpm run deploy
|
||||
```
|
||||
|
||||
Not using SSH:
|
||||
|
||||
```
|
||||
$ GIT_USER=<Your GitHub username> npm run deploy
|
||||
$ GIT_USER=<Your GitHub username> pnpm run deploy
|
||||
```
|
||||
|
||||
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
---
|
||||
slug: release-1-36
|
||||
title: Release v1.36.0
|
||||
authors: [alextran]
|
||||
tags: [release]
|
||||
date: 2022-11-10
|
||||
---
|
||||
|
||||
Hello everyone, it is my pleasure to deliver the new release of Immich to you. The team has been working hard to bring you the new features and improvements. This release includes some big features that the community has been asking since the beginning of Immich. We hope you will enjoy it.
|
||||
|
||||
Some notable features are:
|
||||
|
||||
- OAuth integration
|
||||
- LivePhoto support on iOS
|
||||
- User config system
|
||||
|
||||
<!--truncate-->
|
||||
|
||||
## LivePhoto iOS Support đ
|
||||
|
||||
LivePhoto on iOS is now supported in Immich.
|
||||
|
||||
The motion part will now be uploaded and can be played on the mobile app and the web.
|
||||
|
||||
:::caution
|
||||
|
||||
- The server and the app has to be on version **1.36.x** for the application to work correctly.
|
||||
- Previous uploaded photos will not be updated automatically, you will have to remove and reupload them if you want to keep the LivePhoto functionality.
|
||||
|
||||
:::
|
||||
|
||||
<img
|
||||
src="https://media.giphy.com/media/fTrGceZd7t1ewi8ESc/giphy.gif"
|
||||
width="100%"
|
||||
style={{
|
||||
borderRadius: '10px',
|
||||
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
|
||||
}}
|
||||
title="LivePhoto playback on the web"
|
||||
/>
|
||||
|
||||
## OAuth Integration đ
|
||||
|
||||
I want to borrow this chance to express my gratitude to [@EnricoBilla](https://github.com/EnricoBilla), who has been the trailblazer for this feature since the beginning days of Immich. His PR has sparked ideas, suggestions, and discussion among the team member on how to integrate this feature successfully into the app. Thank you so much for your work and your time.
|
||||
|
||||
OAuth is now integrated into the system. Please follow the guide [here](https://immich.app/docs/usage/oauth) to set up your OAuth integration
|
||||
|
||||
After setting up the correct environment variables in the `.env` file, as shown below
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
| ------------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
|
||||
| OAUTH_ENABLED | boolean | false | Enable/disable OAuth2 |
|
||||
| OAUTH_ISSUER_URL | URL | (required) | Required. Self-discovery URL for client |
|
||||
| OAUTH_CLIENT_ID | string | (required) | Required. Client ID |
|
||||
| OAUTH_CLIENT_SECRET | string | (required) | Required. Client Secret |
|
||||
| OAUTH_SCOPE | string | openid email profile | Full list of scopes to send with the request (space delimited) |
|
||||
| OAUTH_AUTO_REGISTER | boolean | true | When true, will automatically register a user the first time they sign in |
|
||||
| OAUTH_BUTTON_TEXT | string | Login with OAuth | Text for the OAuth button on the web |
|
||||
|
||||
```bash title="Authentik Example"
|
||||
OAUTH_ENABLED=true
|
||||
OAUTH_ISSUER_URL=http://10.1.15.216:9000/application/o/immich-test/
|
||||
OAUTH_CLIENT_ID=30596v8f78a4b6a97d5985c3076b6b4c4d12ddc33
|
||||
OAUTH_CLIENT_SECRET=50f1eafdec353b95b1c638db390db4ab67ef035a51212dbec2f56175e2eb272b5d572c099176e6fe116ecf47ffdd544bgdb9e2edc588307ee0339d25eeccd88
|
||||
OAUTH_BUTTON_TEXT=Login with Authentik
|
||||
```
|
||||
|
||||
The web will have the option to sign in with OAuth.
|
||||
|
||||
<img
|
||||
src="https://user-images.githubusercontent.com/27055614/202923726-f43fa148-47f5-4182-8f29-b0b87e4586fa.png"
|
||||
width="50%"
|
||||
title="Web Sign in with OAuth"
|
||||
style={{
|
||||
borderRadius: '10px',
|
||||
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
|
||||
}}
|
||||
/>
|
||||
|
||||
The mobile app will check if the server has OAuth enabled before displaying the OAuth
|
||||
sign-in button.
|
||||
|
||||
<img
|
||||
src="https://media.giphy.com/media/3iy3SaNkVYtlkEiw06/giphy.gif"
|
||||
title="Mobile sign in with OAuth"
|
||||
style={{
|
||||
borderRadius: '10px',
|
||||
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
|
||||
}}
|
||||
/>
|
||||
|
||||
## Support
|
||||
|
||||
<img
|
||||
src="https://media.giphy.com/media/LStqgGESXW8XnuCv5y/giphy.gif"
|
||||
width="300"
|
||||
style={{
|
||||
borderRadius: '10px',
|
||||
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
|
||||
}}
|
||||
title="Support the project"
|
||||
/>
|
||||
|
||||
If you find the project helpful and it helps you in some ways, you can support the project [one time](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) or [monthly](https://github.com/sponsors/alextran1502) from GitHub Sponsor
|
||||
|
||||
It is a great way to let me know that you want me to continue developing and working on this project for years to come.
|
||||
|
||||
## Details
|
||||
|
||||
For more details, please check out the [release note](https://github.com/immich-app/immich/releases/tag/v1.36.0_55-dev)
|
||||
@@ -1,103 +0,0 @@
|
||||
---
|
||||
title: Immich Update - June 2023
|
||||
authors: [alextran]
|
||||
tags: [update]
|
||||
---
|
||||
|
||||
Hello everybody, Alex here!
|
||||
|
||||
I am back with another update on Immich. It has been only a month since my last update (May 18th, 2023), but it seems forever. I think the rapid releases of Immich and the amount of work make the perspective of time change in Immichâs world. We have some exciting updates that I think you will like.
|
||||
|
||||
Before going into detail, on behalf of the core team, I would like to thank all of you for loving Immich and contributing to the project. Thank you for helping me make Immich an enjoyable alternative solution to Google Photos so that you have complete control of your data and privacy. I know we are still young and have a lot of work to do, but I am confident we will get there with help from the community. I appreciate all of you from the bottom of my heart!
|
||||
|
||||
<!--truncate-->
|
||||
|
||||
And now, to the exciting part, what is new in Immichâs world?
|
||||
|
||||
- Initial support for existing gallery.
|
||||
- Memory feature.
|
||||
- Support XMP sidecar.
|
||||
- Support more raw formats.
|
||||
- Justified layout for web timeline and blurred thumbnail hash.
|
||||
- Mechanism to host machine learning on a completely different machine.
|
||||
|
||||
## Support for existing gallery
|
||||
|
||||
I know this is the most controversial feature when it comes to Immichâs way of ingesting photos and videos. For many users, having to upload photos and videos to Immich is simply not working. We listen, discuss, and digest this feature internally more than you imagine because it is not a simple feature to tackle while keeping the performance and the user experience at the top level, which is Immichâs primary goal.
|
||||
|
||||
Thankfully, we have many great contributors and developers that want to make this come true. So we came up with an initial implementation of this feature in the form of a supporting read-only gallery.
|
||||
|
||||
To be concise, Immich can now read in the gallery files, register the path into the database, and then generate necessary files and put them through Immichâs machine learning pipeline so you can use all the goodness of Immich without the need to upload them. Since this is the initial implementation, some actions/behavior are not yet supported, and we aim to build toward them in future releases, namely:
|
||||
|
||||
- Assets are not automatically synced and must instead be manually synced with the CLI tool.
|
||||
- Only new files that are added to the gallery will be detected.
|
||||
- Deleted and moved files will not be detected.
|
||||
|
||||
## Memory feature
|
||||
|
||||
This is considered a fun feature that the team and I wanted to build for so long, but we had to put it off because of the refactoring of the code base. The code base is now in a good enough form to circle back and add more exciting features.
|
||||
|
||||
This memory feature is very much similar to GPhotos' implementation of âx years sinceâĻâ. We are aiming to add more categories of memories in the future, such as âSpotlight of the dayâ or âDay of the Week highlightsâ
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://www.youtube.com/embed/j5XZKvViPew"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
This feature is now available on the web and will be ported to the mobile app in the near future.
|
||||
|
||||
## Support XMP Sidecar
|
||||
|
||||
Immich can now import/upload XMP sidecars from the CLI and use the information as the metadata of assets.
|
||||
|
||||
## Support more raw formats.
|
||||
|
||||
With the recent updates on the dependencies of Immich, we are now extending and hardening support for multiple raw formats. So users with DSLR or mirrorless cameras can now upload their original files to Immich and have them displayed in high-quality thumbnails on the web and mobile view.
|
||||
|
||||
## Justified layout for web timeline and blurred thumbnail hash
|
||||
|
||||
This is an aesthetic improvement in user experience when browsing the timeline. Photos and videos are now displayed correctly with perspective orientation, making the browsing experience more pleasurable.
|
||||
|
||||
To further improve the browsing experience, we now added a blur hash to the thumbnail, so the transition is more natural with a dreamy fade in effect, similar to how our brain goes from faded to vivid memory
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://www.youtube.com/embed/b95FLmGHRFc"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
## Hosting machine learning container on a different machine
|
||||
|
||||
With more capabilities Immich is building toward, machine learning will get more powerful and therefore require more resources to run effectively. However, we understand that users might not have the best server resources where they host the Immich instance. Therefore, we changed how machine learning interacts and receives the photos and videos to run through its inference pipeline.
|
||||
|
||||
The machine learning container is now a headless system that can run on any machine. As long as your Immich instance can communicate with the system running the machine learning container, it can send the files and receive the required information to make Immich powerful in terms of searching and intelligence. This helps you to utilize a more powerful machine in your home/infrastructure to perform the CPU-intensive tasks while letting Immich only handle the I/O operations for a pleasant and smooth experience.
|
||||
|
||||
---
|
||||
|
||||
So, those are the highlights for the team and the community after a busy month. There are a lot more changes and improvements. I encourage you to read some release notes, starting from version [v1.57.0](https://github.com/immich-app/immich/releases/tag/v1.57.0) to now.
|
||||
|
||||
Thank you, and I am asking for your support for the project. I hope to be a full-time maintainer of Immich one day to dedicate myself to the project as my life works for the community and my family. You can find the support channels below:
|
||||
|
||||
- Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502)
|
||||
- One-time donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502)
|
||||
- [Liberapay](https://liberapay.com/alex.tran1502/)
|
||||
- [buymeacoffee](https://www.buymeacoffee.com/altran1502)
|
||||
- Bitcoin: 3QVAb9dCHutquVejeNXitPqZX26Yg5kxb7
|
||||
- Give a project a star - the contributors love gazing at the stars and seeing their creations shining in the sky.
|
||||
|
||||
Join our friendly [Discord](https://discord.immich.app) to talk and discuss Immich, tech, or anything
|
||||
|
||||
Cheer!
|
||||
|
||||
Until next time!
|
||||
|
||||
Alex
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 MiB |
@@ -1,151 +0,0 @@
|
||||
---
|
||||
title: Immich Update - July 2023
|
||||
authors: [alextran]
|
||||
tags: [update, v1.64.0-v1.71.0]
|
||||
---
|
||||
|
||||
Hello, Immich fans, another month, another milestone. We hope you are staying cool and safe in this scorching hot summer across the globe.
|
||||
|
||||
Immich recently got some good recognition when getting to the front page of HackerNews, which helped to let more people know about the project's existence. The project will help more and more people find a solution to control the privacy of their most precious moments. And with the gain in popularity and recognition, we have gotten new users and more questions from the community than ever.
|
||||
|
||||
I want to express my gratitude to all the contributors and the community who have been tremendously helpful to new users' questions and provided technical support.
|
||||
|
||||
Below are the highlights of new features we added to the application over the past month, along with countless bug fixes and improvements across the board, from developer experience to resource optimization and UI/UX improvement. I hope you find these topics as exciting as I am.
|
||||
|
||||
## Highlights
|
||||
|
||||
- Memories feature.
|
||||
- Facial recognition improvements.
|
||||
- Improvements on multi selection behavior on the web.
|
||||
- Shortcuts for common actions on the web.
|
||||
- Support viewer for 360-panorama photos.
|
||||
|
||||
<!--truncate-->
|
||||
|
||||
---
|
||||
|
||||
### Memories feature
|
||||
|
||||
We've added the memory feature on the mobile app, so you can reminisce about your past memories.
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://youtube.com/embed/c7OTl-RqNRE"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
### Facial recognition improvements
|
||||
|
||||
Over the past few releases, we have added many UI improvements to the facial recognition feature to help you manage the recognized people better. Some of the highlights:
|
||||
|
||||
#### Choose a new feature photo for a person.
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://youtube.com/embed/PmJp8DmSh1U"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
#### Hide and show faces.
|
||||
|
||||
You can now select irrelevant faces to hide them. The hidden faces wonât be displayed in search results and the people section in the info panel.
|
||||
|
||||
#### Merge faces.
|
||||
|
||||
This is useful when you have multiple faces of the same person in your photos, and you want to merge them into one.
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://youtube.com/embed/-Xskhw-vpc4"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
We also added a nifty mechanism that when naming a face, similar names will prompt you a merge face option for the convenience.
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://youtube.com/embed/XzE6wficbl4"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
### Improvements on multi selection behavior on the web
|
||||
|
||||
We have added a new multi selection behavior on the web to help you select multiple items easier. You can now select a range of photos and videos by holding the `Shift` key.
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://youtube.com/embed/e_SiuHpVnmM"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
### Shortcuts for common actions on the web.
|
||||
|
||||
Some of us only navigate the world and the web with a keyboard (looking at you, Vim and Emacs users). So it would take away the sacred weapon of choice to require many clicks to perform repetitive actions. So we added quick shortcuts for the following action on the web.
|
||||
|
||||
<img
|
||||
src={require('./images/web-shortcuts-panel.png').default}
|
||||
width="100%"
|
||||
style={{ borderRadius: '25px' }}
|
||||
alt="Dot Env Example"
|
||||
/>
|
||||
|
||||
### Support viewer for 360-panorama photos.
|
||||
|
||||
Photos with the EXIF property of `ProjectionType` will now have a special viewer on the web to view all the angles of the panorama.
|
||||
|
||||
The thumbnail of the 360 degrees panoramas will have a special icon on the top right of the thumbnail
|
||||
|
||||
<img
|
||||
src="https://github.com/immich-app/immich/assets/61410067/728ca1b0-375c-4631-8081-a609843e702f"
|
||||
width="50%"
|
||||
style={{ borderRadius: '25px' }}
|
||||
alt="Dot Env Example"
|
||||
/>
|
||||
|
||||
Panorama in the detail view
|
||||
|
||||
<img
|
||||
src="https://github.com/immich-app/immich/assets/61410067/3c89dac4-395d-45fa-9bc5-98a6248fd476"
|
||||
width="50%"
|
||||
style={{ borderRadius: '25px' }}
|
||||
alt="Dot Env Example"
|
||||
/>
|
||||
|
||||
---
|
||||
|
||||
Thank you, and I am asking for your support for the project. I hope to be a full-time maintainer of Immich one day to dedicate myself to the project as my life's work for the community and my family. You can find the support channels below:
|
||||
|
||||
- Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502)
|
||||
- One-time donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502)
|
||||
- [Liberapay](https://liberapay.com/alex.tran1502/)
|
||||
- [buymeacoffee](https://www.buymeacoffee.com/altran1502)
|
||||
- Bitcoin: 3QVAb9dCHutquVejeNXitPqZX26Yg5kxb7
|
||||
- Give a project a star - the contributors love gazing at the stars and seeing their creations shining in the sky.
|
||||
|
||||
Join our friendly [Discord](https://discord.immich.app) to talk and discuss Immich, tech, or anything
|
||||
|
||||
Cheer!
|
||||
|
||||
Until next time!
|
||||
|
||||
Alex
|
||||
@@ -1,71 +0,0 @@
|
||||
---
|
||||
title: Immich Recap 2023
|
||||
authors: [alextran]
|
||||
tags: [update, recap-2023]
|
||||
date: 2023-12-30T00:00
|
||||
---
|
||||
|
||||
Hi everyone,
|
||||
|
||||
Alex from Immich here.
|
||||
|
||||
We are entering the last few weeks of 2023, and it has been quite a year for Immich. The project has grown so much in terms of users, developers, features, maturity, and the community around it. When I started working on Immich, it was simply a challenge for myself and an opportunity to learn new technologies, crafting something fun and useful for my wife during my free time to satisfy my urge to build and create things. I never thought it would become so popular and help so many people. At the end of the day, all we have is memory. I am proud that the team and I have created something to make storing and viewing those precious memories easier without restrictions and without sacrificing our privacy. As the year closes, hereâs a recap of everything the project accomplished in 2023.
|
||||
|
||||
# Milestones
|
||||
|
||||
- Public shared links
|
||||
- Favorites page
|
||||
- Immich turned 1
|
||||
- Material Design 3 on the mobile app
|
||||
- Auto-link LivePhotos server-side
|
||||
- iOS background backup
|
||||
- Explore page
|
||||
- CLIP search
|
||||
- Search by metadata
|
||||
- Responsive web app
|
||||
- Archive page
|
||||
- Asset descriptions
|
||||
- 10,000 stars on GitHub
|
||||
- Manage auth devices
|
||||
- Map view
|
||||
- Facial recognition, clustering, searching, renaming, and person management
|
||||
- Partner sharing and unifying timeline between partners' users
|
||||
- Custom storage label
|
||||
- XMP sidecar reading
|
||||
- RAW file formats
|
||||
- Justified layout on the web
|
||||
- Memories
|
||||
- Multi-select via SHIFT
|
||||
- Android Motion Photos
|
||||
- 360° Photos
|
||||
- Album description
|
||||
- Album performance improvements (time buckets)
|
||||
- Video hardware transcoding
|
||||
- Slideshow mode on the web
|
||||
- Configuration file
|
||||
- External libraries
|
||||
- Trash page
|
||||
- Custom theme
|
||||
- Asset Stacking
|
||||
- 20,000 stars on GitHub
|
||||
- Shared album activity and comments
|
||||
- CLI v2
|
||||
- Down to 5 containers (from 8)
|
||||
|
||||
# Fun Statistics
|
||||
|
||||
- We have gone from the release version `1.41.0` to `1.90.0` at the time of writing. On average, we see a release every 7 days.
|
||||
- According to GitHub's metrics, the `immich-server` container image has been pulled almost _4 million_ times.
|
||||
- According to mobile app store metrics, we have 22,000 installations on Android and 6700 installation units on iOS (opt-in only).
|
||||
- Immich is making around $1200/month on average from donations. (Thank you all so much!)
|
||||
- We were guests on two podcasts:
|
||||
- [Self-hosted](https://selfhosted.show/110)
|
||||
- [The Vergecast](https://www.theverge.com/23938533/self-hosting-local-first-software-vergecast)
|
||||
- There are over 4,500 members on the Discord server.
|
||||
- We have over 22,000 stars on the main GitHub repository, gaining 15,000 stars since January 2023.
|
||||
|
||||
Diving into the next year, the team will continue to build on the foundation we have laid out over the past year, implementing more advanced features for searching, organizing, and sharing between users. Bugs will continue to be squashed and conquered. âShit Alex wrote'' code will continue to be replaced by beautiful, clean code from Jason, Zack, Boet, Daniel, Osorin, Mert, Fynn, Marty, Martin, and Jonathan. The team has my eternal gratitude for creating a welcoming environment for new contributors, helping, teaching, and learning from each other. Iâve realized that hardly a day has gone by where the team hasnât been in communication about Immich related topics over the past year.
|
||||
|
||||
My long-term goal is to help hone Immich into a diamond in the FOSS space, where the UI, UX, development experiences, documentation, and quality are at a high standard while remaining free for everybody to use.
|
||||
|
||||
I hope you enjoy Immich and have a happy and peaceful holiday.
|
||||
@@ -1,75 +0,0 @@
|
||||
---
|
||||
title: The Immich core team goes full-time
|
||||
authors: [alextran]
|
||||
tags: [update, announcement, FUTO]
|
||||
date: 2024-05-01T00:00
|
||||
---
|
||||
|
||||
**Immich is joining [FUTO](https://futo.org/)!**
|
||||
|
||||
Since the beginning of this adventure, my goal has always been to create a better world for my children. Memories are priceless, and privacy should not be a luxury. However, building quality open source has its challenges. Over the past two years, it has taken significant dedication, time, and effort.
|
||||
|
||||
Recently, a company in Austin, Texas, called FUTO contacted the team. FUTO strives to develop quality and sustainable open software. They build software alternatives that focus on giving control to users. From their mission statement:
|
||||
|
||||
âComputers should belong to you, the people. We develop and fund technology to give them back.â
|
||||
|
||||
FUTO loved Immich and wanted to see if weâd consider working with them to take the project to the next level. In short, FUTO offered to:
|
||||
|
||||
- Pay the core team to work on Immich full-time
|
||||
- Let us keep full autonomy about the projectâs direction and leadership
|
||||
- Continue to license Immich under AGPL
|
||||
- Keep Immichâs development direction with no paywalled features
|
||||
- Keep Immich âbuilt for the peopleâ (no ads, data mining/selling, or alternative motives)
|
||||
- Provide us with financial, technical, legal, and administrative support
|
||||
|
||||
After careful deliberation, the team decided that FUTOâs vision closely aligns with our own: to build a better future by providing a polished, performant, and privacy-preserving open-source software solution for photo and video management delivered in a sustainable way.
|
||||
|
||||
Immichâs future has never looked brighter, and we look forward to realizing our vision for Immich as part of FUTO.
|
||||
|
||||
If you have more questions, weâll host a Q&A live stream on May 9th at 3PM UTC (10AM CST). [You can ask questions here](https://www.live-ask.com/event/01HWP2SB99A1K8EXFBDKZ5Z9CF), and the stream will be live [here on our YouTube channel](https://youtube.com/live/cwz2iZwYpgg).
|
||||
|
||||
Cheers,
|
||||
|
||||
The Immich Team
|
||||
|
||||
---
|
||||
|
||||
## FAQs
|
||||
|
||||
### What is FUTO?
|
||||
|
||||
[https://futo.org/what-is-futo/](https://futo.org/what-is-futo/)
|
||||
|
||||
### Will the license change?
|
||||
|
||||
No. Immich will continue to be licensed under AGPL without a CLA.
|
||||
|
||||
### Will Immich continue to be free?
|
||||
|
||||
Yes. The Immich source code will remain freely available under the AGPL license.
|
||||
|
||||
### Is Immich getting VC funding?
|
||||
|
||||
No. Venture capital implies investment in a business, often with the expectation of a future payout (exit plan). Immich is neither a business that can be acquired nor comes with a money-making exit plan.
|
||||
|
||||
### I am currently supporting Immich through GitHub sponsors. What will happen to my donation?
|
||||
|
||||
Effective immediately, all donations to the Immich organization will be canceled. In the future, we will offer an optional, modest payment option instead. Thank you to everyone who donated to help us get this far!
|
||||
|
||||
### How is funding sustainable?
|
||||
|
||||
Immich and FUTO believe a sustainable future requires a model that does not rely on users-as-a-product. To this end, FUTO advocates that users pay for good, open software. In keeping with this model, we will adopt a purchase price. This means we no longer accept donations, but â _without limiting features for those who do not pay_ â we will soon allow you to purchase Immich through a modest payment. We encourage you to pay for the high-quality software you use to foster a healthy software culture where developers build great applications without hidden motives for their users.
|
||||
|
||||
### When does this change take effect?
|
||||
|
||||
This change takes effect immediately.
|
||||
|
||||
### What will change?
|
||||
|
||||
The following things will change as Immich joins FUTO:
|
||||
|
||||
- The brand, logo, and other Immich trademarks will be transferred to FUTO.
|
||||
- We will stop all donations to the project.
|
||||
- The core team can now dedicate our full attention to Immich
|
||||
- Before the end of the year, we plan to have a roadmap for what it will take to get Immich to a stable release.
|
||||
- Bugs will be squashed, and features will be delivered faster.
|
||||
@@ -1,91 +0,0 @@
|
||||
---
|
||||
title: Licensing announcement - Purchase a license to support Immich
|
||||
authors: [alextran]
|
||||
tags: [update, announcement, FUTO]
|
||||
date: 2024-07-18T00:00
|
||||
---
|
||||
|
||||
Hello everybody,
|
||||
|
||||
Firstly, on behalf of the Immich team, I'd like to thank everybody for your continuous support of Immich since the very first day! Your contributions, encouragement, and community engagement have helped bring Immich to its current state. The team and I are forever grateful for that.
|
||||
|
||||
Since our [last announcement of the core team joining FUTO to work on Immich full-time](https://immich.app/blog/2024/immich-core-team-goes-fulltime), one of the goals of our new position is to foster a healthy relationship between the developers and the users. We believe that this enables us to create great software, establish transparent policies and build trust.
|
||||
|
||||
We want to build a great software application that brings value to you and your loved ones' lives. We are not using you as a product, i.e., selling or tracking your data. We are not putting annoying ads into our software. We respect your privacy. We want to be compensated for the hard work we put in to build Immich for you.
|
||||
|
||||
With those notes, we have enabled a way for you to financially support the continued development of Immich, ensuring the software can move forward and will be maintained, by offering a lifetime license of the software. We think if you like and use software, you should pay for it, but _we're never going to force anyone to pay or try to limit Immich for those who don't._
|
||||
|
||||
There are two types of license that you can choose to purchase: **Server License** and **Individual License**.
|
||||
|
||||
### Server License
|
||||
|
||||
This is a lifetime license costing **$99.99**. The license is applied to the whole server. You and all users that use your server are licensed.
|
||||
|
||||
### Individual License
|
||||
|
||||
This is a lifetime license costing **$24.99**. The license is applied to a single user, and can be used on any server they choose to connect to.
|
||||
|
||||
<img
|
||||
width="837"
|
||||
alt="license-social-gh"
|
||||
src="https://github.com/user-attachments/assets/241932ed-ef3b-44ec-a9e2-ee80754e0cca"
|
||||
/>
|
||||
|
||||
You can purchase the license on [our page - https://buy.immich.app](https://buy.immich.app).
|
||||
|
||||
Starting with release `v1.109.0` you can purchase and enter your purchased license key directly in the app.
|
||||
|
||||
<img
|
||||
width="1414"
|
||||
alt="license-page-gh"
|
||||
src="https://github.com/user-attachments/assets/364fc32a-f6ef-4594-9fea-28d5a26ad77c"
|
||||
/>
|
||||
|
||||
## Thank you
|
||||
|
||||
Thank you again for your support, this will help create a strong foundation and stability for the Immich team to continue developing and maintaining the project that you love to use.
|
||||
|
||||
<p align="center">
|
||||
<img
|
||||
src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbjY2eWc5Y2F0ZW56MmR4aWE0dDhzZXlidXRmYWZyajl1bWZidXZpcyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/87CKDqErVfMqY/giphy.gif"
|
||||
width="550"
|
||||
title="SUPPORT THE PROJECT!"
|
||||
/>
|
||||
</p>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
|
||||
Cheers! đ
|
||||
|
||||
Immich team
|
||||
|
||||
# FAQ
|
||||
|
||||
### 1. Where can I purchase a license?
|
||||
|
||||
There are several places where you can purchase the license from
|
||||
|
||||
- [https://buy.immich.app](https://buy.immich.app)
|
||||
- [https://pay.futo.org](https://pay.futo.org/)
|
||||
- or directly from the app.
|
||||
|
||||
### 2. Do I need both _Individual License_ and _Server License_?
|
||||
|
||||
No,
|
||||
|
||||
If you are the admin and the sole user, or your instance has less than a total of 4 users, you can buy the **Individual License** for each user.
|
||||
|
||||
If your instance has more than 4 users, it is more cost-effective to buy the **Server License**, which will license all the users on your instance.
|
||||
|
||||
### 3. What do I do if I don't pay?
|
||||
|
||||
You can continue using Immich without any restriction.
|
||||
|
||||
### 4. Will there be any paywalled features?
|
||||
|
||||
No, there will never be any paywalled features.
|
||||
|
||||
### 5. Where can I get support regarding payment issues?
|
||||
|
||||
You can email us with your `orderId` and your email address `billing@futo.org` or on our Discord server.
|
||||
@@ -1,78 +0,0 @@
|
||||
---
|
||||
title: Immich Update - July 2024
|
||||
authors: [alextran]
|
||||
date: 2024-07-01T00:00
|
||||
tags: [update, v1.106.0]
|
||||
---
|
||||
|
||||
Hello everybody! Alex from Immich here and I am back with another development progress update for the project.
|
||||
|
||||
Summer has returned once again, and the night sky is filled with stars, thank you for **38_000 shining stars** you have sent to our [GitHub repo](https://github.com/immich-app/immich)! Since the last announcement several core contributors have started full time. Everything is going great with development, PRs get merged with _brrrrrrr_ rate, conversation exchange between team members is on a new high, we met and are working with the great engineers at FUTO. The spirit is high and we have a lot of things brewing that we think you will like.
|
||||
|
||||
Let's go over some of the updates we had since the last post.
|
||||
|
||||
### Container consolidation
|
||||
|
||||
Reduced the number of total containers from 5 to 4 by making the microservices thread get spawned directly in the server container. Woohoo, remember when Immich had 7 containers?
|
||||
|
||||
### Email notifications
|
||||
|
||||

|
||||
|
||||
We added email notifications to the app with SMTP settings that you can configure for the following events
|
||||
|
||||
- A new account is created for you.
|
||||
- You are added to a shared album.
|
||||
- New media is added to an album.
|
||||
|
||||
### Versioned docs
|
||||
|
||||
You can now jump back into the past or take a peek at the unreleased version of the documentation by selecting the version on the website.
|
||||
|
||||

|
||||
|
||||
### Similarity deduplication
|
||||
|
||||
With more machine learning and CLIP magic, we now have similarity deduplication built into the application where it will search for closely similar images and let you decide what to do with them; i.e keep or trash.
|
||||
|
||||

|
||||
|
||||
### Permanent URL for asset on the web
|
||||
|
||||
The detail view for an asset now has a permanent URL so you can easily share them with your loved ones.
|
||||
|
||||
### Web app translations
|
||||
|
||||
We now have a public Weblate project which the community can use to translate the webapp to their native languages. We are planning to port the mobile app translation to this platform as well. If you would like to contribute, you can take a look [here](https://hosted.weblate.org/projects/immich/immich/). We're already close to 50% translations -- we really appreciate everyone contributing to that!
|
||||
|
||||

|
||||
|
||||
### Read-only/Editor mode on shared album
|
||||
|
||||
As the owner of the album, you can choose if the shared user can edit the album or to only view the content of the album without any modification.
|
||||
|
||||

|
||||
|
||||
### Better video thumbnails
|
||||
|
||||
Immich now tries to find a descriptive video thumbnail instead of simply using the first frame. No more black images for thumbnails!
|
||||
|
||||
### Public Roadmap
|
||||
|
||||
We now have a [public roadmap](https://immich.app/roadmap), giving you a high-level overview of things the team is working on. The first goal of this roadmap is to bring Immich to a stable release, which is expected sometime later this year. Some of the highlights include
|
||||
|
||||
- Auto stacking - Auto stacking of burst photos
|
||||
- Basic editor - Basic photo editing capabilities
|
||||
- Workflows - Automate tasks with workflows
|
||||
- Fine grained access controls - Granular access controls for users and api keys
|
||||
- Better background backups - Rework background backups to be more reliable
|
||||
- Private/locked photos - Private assets with extra protections
|
||||
|
||||
Beyond the items in the roadmap, we have _many many_ more ideas for Immich. The team and I hope that you are enjoying the application, find it helpful in your life and we have nothing but the intention of building out great software for you all!
|
||||
|
||||
Have an amazing Summer or Winter for those in the southern hemisphere! :D
|
||||
|
||||
Until next time,
|
||||
|
||||
Cheers!
|
||||
Alex
|
||||
@@ -1,5 +0,0 @@
|
||||
alextran:
|
||||
name: Alex Tran
|
||||
title: Maintainer of Immich
|
||||
url: https://github.com/alextran1502
|
||||
image_url: https://github.com/alextran1502.png
|
||||
@@ -1,5 +1,31 @@
|
||||
# FAQ
|
||||
|
||||
## Commercial Guidelines
|
||||
|
||||
### Are you open to commercial partnerships and collaborations?
|
||||
|
||||
We are working to commercialize Immich and we'd love for you to help us by making Immich better. FUTO is dedicated to developing sustainable models for developing open source software for our customers. We want our customers to be delighted by the products our engineers deliver, and we want our engineers to be paid when they succeed.
|
||||
|
||||
If you wish to use Immich in a commercial product not owned by FUTO, we have the following requirements:
|
||||
|
||||
- Plugin Integrations: Integrations for other platforms are typically approved, provided proper notification is given.
|
||||
|
||||
- Reseller Partnerships: Must adhere to the guidelines outlined below regarding trademark usage, and proper representation.
|
||||
|
||||
- Strategic Collaborations: We welcome discussions about mutually beneficial partnerships that enhance the value proposition for both organizations.
|
||||
|
||||
### What are your guidelines for resellers and trademark usage?
|
||||
|
||||
For organizations seeking to resell Immich, we have established the following guidelines to protect our brand integrity and ensure proper representation.
|
||||
|
||||
- We request that resellers do not display our trademarks on their websites or marketing materials. If such usage is discovered, we will contact you to request removal.
|
||||
|
||||
- Do not misrepresent your reseller site or services as being officially affiliated with or endorsed by Immich or our development team.
|
||||
|
||||
- For small resellers who wish to contribute financially to Immich's development, we recommend directing your customers to purchase licenses directy from us rather than attempting to broker revenue-sharing arrangements. We ask that you refrain from misrepresenting reseller activities as directly supporting our development work.
|
||||
|
||||
When in doubt or if you have an edge case scenario, we encourage you to contact us directly via email to discuss the use of our trademark. We can provide clear guidance on what is acceptable and what is not. You can reach out at: questions@immich.app
|
||||
|
||||
## User
|
||||
|
||||
### How can I reset the admin password?
|
||||
|
||||
@@ -10,7 +10,7 @@ Unable to set `app.immich:///oauth-callback` as a valid redirect URI? See [Mobil
|
||||
|
||||
Immich supports 3rd party authentication via [OpenID Connect][oidc] (OIDC), an identity layer built on top of OAuth2. OIDC is supported by most identity providers, including:
|
||||
|
||||
- [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect)
|
||||
- [Authentik](https://integrations.goauthentik.io/media/immich/)
|
||||
- [Authelia](https://www.authelia.com/integration/openid-connect/immich/)
|
||||
- [Okta](https://www.okta.com/openid-connect/)
|
||||
- [Google](https://developers.google.com/identity/openid-connect/openid-connect)
|
||||
@@ -88,7 +88,7 @@ The `.well-known/openid-configuration` part of the url is optional and will be a
|
||||
## Auto Launch
|
||||
|
||||
When Auto Launch is enabled, the login page will automatically redirect the user to the OAuth authorization url, to login with OAuth. To access the login screen again, use the browser's back button, or navigate directly to `/auth/login?autoLaunch=0`.
|
||||
Auto Launch can also be enabled on a per-request basis by navigating to `/auth/login?authLaunch=1`, this can be useful in situations where Immich is called from e.g. Nextcloud using the _External sites_ app and the _oidc_ app so as to enable users to directly interact with a logged-in instance of Immich.
|
||||
Auto Launch can also be enabled on a per-request basis by navigating to `/auth/login?autoLaunch=1`, this can be useful in situations where Immich is called from e.g. Nextcloud using the _External sites_ app and the _oidc_ app so as to enable users to directly interact with a logged-in instance of Immich.
|
||||
|
||||
## Mobile Redirect URI
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ After making any changes in the `server/src/schema`, a database migration need t
|
||||
1. Run the command
|
||||
|
||||
```bash
|
||||
npm run migrations:generate <migration-name>
|
||||
pnpm run migrations:generate <migration-name>
|
||||
```
|
||||
|
||||
2. Check if the migration file makes sense.
|
||||
|
||||
@@ -204,8 +204,8 @@ When the Dev Container starts, it automatically:
|
||||
|
||||
1. **Runs post-create script** (`container-server-post-create.sh`):
|
||||
- Adjusts file permissions for the `node` user
|
||||
- Installs dependencies: `npm install` in all packages
|
||||
- Builds TypeScript SDK: `npm run build` in `open-api/typescript-sdk`
|
||||
- Installs dependencies: `pnpm install` in all packages
|
||||
- Builds TypeScript SDK: `pnpm run build` in `open-api/typescript-sdk`
|
||||
|
||||
2. **Starts development servers** via VS Code tasks:
|
||||
- `Immich API Server (Nest)` - API server with hot-reloading on port 2283
|
||||
@@ -243,7 +243,7 @@ To connect the mobile app to your Dev Container:
|
||||
|
||||
- **Server code** (`/server`): Changes trigger automatic restart
|
||||
- **Web code** (`/web`): Changes trigger hot module replacement
|
||||
- **Database migrations**: Run `npm run sync:sql` in the server directory
|
||||
- **Database migrations**: Run `pnpm run sync:sql` in the server directory
|
||||
- **API changes**: Regenerate TypeScript SDK with `make open-api`
|
||||
|
||||
## Testing
|
||||
@@ -273,19 +273,19 @@ make test-medium-dev # End-to-end tests
|
||||
```bash
|
||||
# Server tests
|
||||
cd /workspaces/immich/server
|
||||
npm test # Run all tests
|
||||
npm run test:watch # Watch mode
|
||||
npm run test:cov # Coverage report
|
||||
pnpm test # Run all tests
|
||||
pnpm run test:watch # Watch mode
|
||||
pnpm run test:cov # Coverage report
|
||||
|
||||
# Web tests
|
||||
cd /workspaces/immich/web
|
||||
npm test # Run all tests
|
||||
npm run test:watch # Watch mode
|
||||
pnpm test # Run all tests
|
||||
pnpm run test:watch # Watch mode
|
||||
|
||||
# E2E tests
|
||||
cd /workspaces/immich/e2e
|
||||
npm run test # Run API tests
|
||||
npm run test:web # Run web UI tests
|
||||
pnpm run test # Run API tests
|
||||
pnpm run test:web # Run web UI tests
|
||||
```
|
||||
|
||||
### Code Quality Commands
|
||||
@@ -476,5 +476,5 @@ Recommended minimums:
|
||||
|
||||
- Read the [architecture overview](/docs/developer/architecture)
|
||||
- Learn about [database migrations](/docs/developer/database-migrations)
|
||||
- Explore [API documentation](/docs/api)
|
||||
- Explore [API documentation](https://api.immich.app/)
|
||||
- Join `#immich` on [Discord](https://discord.immich.app)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# OpenAPI
|
||||
|
||||
Immich uses the [OpenAPI](https://swagger.io/specification/) standard to generate API documentation. To view the published docs see [here](/docs/api).
|
||||
Immich uses the [OpenAPI](https://swagger.io/specification/) standard to generate API documentation. To view the published docs see [here](https://api.immich.app/).
|
||||
|
||||
## Generator
|
||||
|
||||
|
||||
@@ -8,34 +8,34 @@ When contributing code through a pull request, please check the following:
|
||||
|
||||
## Web Checks
|
||||
|
||||
- [ ] `npm run lint` (linting via ESLint)
|
||||
- [ ] `npm run format` (formatting via Prettier)
|
||||
- [ ] `npm run check:svelte` (Type checking via SvelteKit)
|
||||
- [ ] `npm run check:typescript` (check typescript)
|
||||
- [ ] `npm test` (unit tests)
|
||||
- [ ] `pnpm run lint` (linting via ESLint)
|
||||
- [ ] `pnpm run format` (formatting via Prettier)
|
||||
- [ ] `pnpm run check:svelte` (Type checking via SvelteKit)
|
||||
- [ ] `pnpm run check:typescript` (check typescript)
|
||||
- [ ] `pnpm test` (unit tests)
|
||||
|
||||
## Documentation
|
||||
|
||||
- [ ] `npm run format` (formatting via Prettier)
|
||||
- [ ] `pnpm run format` (formatting via Prettier)
|
||||
- [ ] Update the `_redirects` file if you have renamed a page or removed it from the documentation.
|
||||
|
||||
:::tip AIO
|
||||
Run all web checks with `npm run check:all`
|
||||
Run all web checks with `pnpm run check:all`
|
||||
:::
|
||||
|
||||
## Server Checks
|
||||
|
||||
- [ ] `npm run lint` (linting via ESLint)
|
||||
- [ ] `npm run format` (formatting via Prettier)
|
||||
- [ ] `npm run check` (Type checking via `tsc`)
|
||||
- [ ] `npm test` (unit tests)
|
||||
- [ ] `pnpm run lint` (linting via ESLint)
|
||||
- [ ] `pnpm run format` (formatting via Prettier)
|
||||
- [ ] `pnpm run check` (Type checking via `tsc`)
|
||||
- [ ] `pnpm test` (unit tests)
|
||||
|
||||
:::tip AIO
|
||||
Run all server checks with `npm run check:all`
|
||||
Run all server checks with `pnpm run check:all`
|
||||
:::
|
||||
|
||||
:::info Auto Fix
|
||||
You can use `npm run __:fix` to potentially correct some issues automatically for `npm run format` and `lint`.
|
||||
You can use `pnpm run __:fix` to potentially correct some issues automatically for `pnpm run format` and `lint`.
|
||||
:::
|
||||
|
||||
## Mobile Checks
|
||||
|
||||
@@ -54,20 +54,20 @@ You can access the web from `http://your-machine-ip:3000` or `http://localhost:3
|
||||
|
||||
If you only want to do web development connected to an existing, remote backend, follow these steps:
|
||||
|
||||
1. Build the Immich SDK - `cd open-api/typescript-sdk && npm i && npm run build && cd -`
|
||||
1. Build the Immich SDK - `cd open-api/typescript-sdk && pnpm i && pnpm run build && cd -`
|
||||
2. Enter the web directory - `cd web/`
|
||||
3. Install web dependencies - `npm i`
|
||||
3. Install web dependencies - `pnpm i`
|
||||
4. Start the web development server
|
||||
|
||||
```bash
|
||||
IMMICH_SERVER_URL=https://demo.immich.app/ npm run dev
|
||||
IMMICH_SERVER_URL=https://demo.immich.app/ pnpm run dev
|
||||
```
|
||||
|
||||
If you're using PowerShell on Windows you may need to set the env var separately like so:
|
||||
|
||||
```powershell
|
||||
$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
|
||||
npm run dev
|
||||
pnpm run dev
|
||||
```
|
||||
|
||||
#### `@immich/ui`
|
||||
@@ -75,12 +75,12 @@ npm run dev
|
||||
To see local changes to `@immich/ui` in Immich, do the following:
|
||||
|
||||
1. Install `@immich/ui` as a sibling to `immich/`, for example `/home/user/immich` and `/home/user/ui`
|
||||
2. Build the `@immich/ui` project via `npm run build`
|
||||
2. Build the `@immich/ui` project via `pnpm run build`
|
||||
3. Uncomment the corresponding volume in web service of the `docker/docker-compose.dev.yaml` file (`../../ui:/usr/ui`)
|
||||
4. Uncomment the corresponding alias in the `web/vite.config.js` file (`'@immich/ui': path.resolve(\_\_dirname, '../../ui')`)
|
||||
5. Uncomment the import statement in `web/src/app.css` file `@import '/usr/ui/dist/theme/default.css';` and comment out `@import '@immich/ui/theme/default.css';`
|
||||
6. Start up the stack via `make dev`
|
||||
7. After making changes in `@immich/ui`, rebuild it (`npm run build`)
|
||||
7. After making changes in `@immich/ui`, rebuild it (`pnpm run build`)
|
||||
|
||||
### Mobile app
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
### Unit tests
|
||||
|
||||
Unit are run by calling `npm run test` from the `server/` directory.
|
||||
You need to run `npm install` (in `server/`) before _once_.
|
||||
Unit are run by calling `pnpm run test` from the `server/` directory.
|
||||
You need to run `pnpm install` (in `server/`) before _once_.
|
||||
|
||||
### End to end tests
|
||||
|
||||
@@ -17,14 +17,14 @@ make e2e
|
||||
|
||||
Before you can run the tests, you need to run the following commands _once_:
|
||||
|
||||
- `npm install` (in `e2e/`)
|
||||
- `pnpm install` (in `e2e/`)
|
||||
- `make open-api` (in the project root `/`)
|
||||
|
||||
Once the test environment is running, the e2e tests can be run via:
|
||||
|
||||
```bash
|
||||
cd e2e/
|
||||
npm test
|
||||
pnpm test
|
||||
```
|
||||
|
||||
The tests check various things including:
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB |
@@ -33,7 +33,7 @@ Sometimes, an external library will not scan correctly. This can happen if Immic
|
||||
- Are the permissions set correctly?
|
||||
- Make sure you are using forward slashes (`/`) and not backward slashes.
|
||||
|
||||
To validate that Immich can reach your external library, start a shell inside the container. Run `docker exec -it immich_server bash` to a bash shell. If your import path is `/data/import/photos`, check it with `ls /data/import/photos`. Do the same check for the same in any microservices containers.
|
||||
To validate that Immich can reach your external library, start a shell inside the container. Run `docker exec -it immich_server bash` to a bash shell. If your import path is `/mnt/photos`, check it with `ls /mnt/photos`. If you are using a dedicated microservices container, make sure to add the same mount point and check for availability within the microservices container as well.
|
||||
|
||||
### Exclusion Patterns
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ The provided file is just a starting point. There are a ton of ways to configure
|
||||
After bringing down the containers with `docker compose down` and back up with `docker compose up -d`, a Prometheus instance will now collect metrics from the immich server and microservices containers. Note that we didn't need to expose any new ports for these containers - the communication is handled in the internal Docker network.
|
||||
|
||||
:::note
|
||||
To see exactly what metrics are made available, you can additionally add `8081:8081` to the server container's ports and `8082:8082` to the microservices container's ports.
|
||||
To see exactly what metrics are made available, you can additionally add `8081:8081` (API metrics) and `8082:8082` (microservices metrics) to the immich_server container's ports.
|
||||
Visiting the `/metrics` endpoint for these services will show the same raw data that Prometheus collects.
|
||||
To configure these ports see [`IMMICH_API_METRICS_PORT` & `IMMICH_MICROSERVICES_METRICS_PORT`](/docs/install/environment-variables/#general).
|
||||
:::
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Tags
|
||||
|
||||
Immich supports hierarchical tags, with the ability to read existing tags from the `TagList` and `Keywords` EXIF properties. Any changes to tags made through Immich are also written back to a [sidecar](/docs/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags.
|
||||
Immich supports hierarchical tags, with the ability to read existing tags from the XMP `TagsList` field and IPTC `Keywords` field. Any changes to tags made through Immich are also written back to a [sidecar](/docs/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags.
|
||||
|
||||
## Enable tags feature
|
||||
|
||||
|
||||
@@ -1,13 +1,68 @@
|
||||
# XMP Sidecars
|
||||
|
||||
Immich can ingest XMP sidecars on file upload (via the CLI) as well as detect new sidecars that are placed in the filesystem for existing images.
|
||||
Immich supports XMP sidecar files â external `.xmp` files that store metadata for an image or video in XML format. During the metadata extraction job Immich will read & import metadata from `.xmp` files, and during the Sidecar Write job it will _write_ metadata back to `.xmp`.
|
||||
|
||||
<img src={require('./img/xmp-sidecars.webp').default} title='XMP sidecars' />
|
||||
:::tip
|
||||
Tools like Lightroom, Darktable, digiKam and other applications can also be configured to write changes to `.xmp` files, in order to avoid modifying the original file.
|
||||
:::
|
||||
|
||||
XMP sidecars are external XML files that contain metadata related to media files. Many applications read and write these files either exclusively or in addition to the metadata written to image files. They can be a powerful tool for editing and storing metadata of a media file without modifying the media file itself. When Immich receives or detects an XMP sidecar for a media file, it will attempt to extract the metadata from both the sidecar as well as the media file. It will prioritize the metadata for fields in the sidecar but will fall back and use the metadata in the media file if necessary.
|
||||
## Metadata Fields
|
||||
|
||||
When importing files via the CLI bulk uploader or parsing photo metadata for external libraries, Immich will automatically detect XMP sidecar files as files that exist next to the original media file. Immich will look files that have the same name as the photo, but with the `.xmp` file extension. The same name can either include the photo's file extension or without the photo's file extension. For example, for a photo named `PXL_20230401_203352928.MP.jpg`, Immich will look for an XMP file named either `PXL_20230401_203352928.MP.jpg.xmp` or `PXL_20230401_203352928.MP.xmp`. If both `PXL_20230401_203352928.MP.jpg.xmp` and `PXL_20230401_203352928.MP.xmp` are present, Immich will prefer `PXL_20230401_203352928.MP.jpg.xmp`.
|
||||
Immich does not support _all_ metadata fields. Below is a table showing what fields Immich can _read_ and _write_. It's important to note that writes do not replace the entire file contents, but are merged together with any existing fields.
|
||||
|
||||
There are 2 administrator jobs associated with sidecar files: `SYNC` and `DISCOVER`. The sync job will re-scan all media with existing sidecar files and queue them for a metadata refresh. This is a great use case when third-party applications are used to modify the metadata of media. The discover job will attempt to scan the filesystem for new sidecar files for all media that does not currently have a sidecar file associated with it.
|
||||
:::info
|
||||
Immich automatically queues a Sidecar Write job after editing the description, rating, or updating tags.
|
||||
:::
|
||||
|
||||
<img src={require('./img/sidecar-jobs.webp').default} title='Sidecar Administrator Jobs' />
|
||||
| Metadata | Immich writes to XMP | Immich reads from XMP |
|
||||
| --------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Description** | `dc:description`, `tiff:ImageDescription` | `dc:description`, `tiff:ImageDescription` |
|
||||
| **Rating** | `xmp:Rating` | `xmp:Rating` |
|
||||
| **DateTime** | `exif:DateTimeOriginal`, `photoshop:DateCreated` | In prioritized order:<br/>`exif:SubSecDateTimeOriginal`<br/>`exif:DateTimeOriginal`<br/>`xmp:SubSecCreateDate`<br/>`xmp:CreateDate`<br/>`xmp:CreationDate`<br/>`xmp:MediaCreateDate`<br/>`xmp:SubSecMediaCreateDate`<br/>`xmp:DateTimeCreated` |
|
||||
| **Location** | `exif:GPSLatitude`, `exif:GPSLongitude` | `exif:GPSLatitude`, `exif:GPSLongitude` |
|
||||
| **Tags** | `digiKam:TagsList` | In prioritized order: <br/>`digiKam:TagsList`<br/>`lr:HierarchicalSubject`<br/>`IPTC:Keywords` |
|
||||
|
||||
:::note
|
||||
All other fields (e.g. `Creator`, `Source`, IPTC, Lightroom edits) remain in the `.xmp` file and are **not searchable** in Immich.
|
||||
:::
|
||||
|
||||
## File Naming Rules
|
||||
|
||||
A sidecar must share the base name of the media file:
|
||||
|
||||
- â
`IMG_0001.jpg.xmp` â preferred
|
||||
- â
`IMG_0001.xmp` â fallback
|
||||
- â `myphoto_meta.xmp` â not recognized
|
||||
|
||||
If both `.jpg.xmp` and `.xmp` are present, Immich uses the **`.jpg.xmp`** file.
|
||||
|
||||
## CLI Support
|
||||
|
||||
1. **Detect** â Immich looks for a `.xmp` file placed next to each media file during upload.
|
||||
2. **Copy** â Both the media and the sidecar file are copied into Immichâs internal library folder.
|
||||
The sidecar is renamed to match the internal filename template, e.g.:
|
||||
`upload/library/<user>/YYYY/YYYY-MM-DD/IMG_0001.jpg`
|
||||
`upload/library/<user>/YYYY/YYYY-MM-DD/IMG_0001.jpg.xmp`
|
||||
3. **Extract** â Selected metadata (title, description, date, rating, tags) is parsed from the sidecar and saved to the database.
|
||||
4. **Write-back** â If you later update tags, rating, or description in the web UI, Immich will update **both** the database _and_ the copied `.xmp` file to stay in sync.
|
||||
|
||||
## External Library (Mounted Folder) Support
|
||||
|
||||
1. **Detect** â The `DISCOVER` job automatically associates `.xmp` files that sit next to existing media files in your mounted folder. No files are moved or renamed.
|
||||
2. **Extract** â Immich reads and saves the same metadata fields from the sidecar to the database.
|
||||
3. **Write-back** â If Immich has **write access** to the mount, any future metadata edits (e.g., rating or tags) are also written back to the original `.xmp` file on disk.
|
||||
|
||||
:::danger
|
||||
If the mount is **read-only**, Immich cannot update either the sidecar **or** the database â **metadata edits will silently fail** with no warning see issue [#10538](https://github.com/immich-app/immich/issues/10538) for more details.
|
||||
:::
|
||||
|
||||
## Admin Jobs
|
||||
|
||||
Immich provides two admin jobs for managing sidecars:
|
||||
|
||||
| Job | What it does |
|
||||
| ---------- | ------------------------------------------------------------------------------------------------- |
|
||||
| `DISCOVER` | Finds new `.xmp` files next to media that donât already have one linked |
|
||||
| `SYNC` | Re-reads existing `.xmp` files and refreshes metadata in the database (e.g. after external edits) |
|
||||
|
||||

|
||||
|
||||
@@ -147,7 +147,10 @@ SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';
|
||||
### File properties
|
||||
|
||||
```sql title="Without thumbnails"
|
||||
SELECT * FROM "asset" WHERE "asset"."previewPath" IS NULL OR "asset"."thumbnailPath" IS NULL;
|
||||
SELECT * FROM "asset"
|
||||
WHERE (NOT EXISTS (SELECT 1 FROM "asset_file" WHERE "asset"."id" = "asset_file"."assetId" AND "asset_file"."type" = 'thumbnail')
|
||||
OR NOT EXISTS (SELECT 1 FROM "asset_file" WHERE "asset"."id" = "asset_file"."assetId" AND "asset_file"."type" = 'preview'))
|
||||
AND "asset"."visibility" = 'timeline';
|
||||
```
|
||||
|
||||
```sql title="Failed file movements"
|
||||
|
||||
@@ -169,8 +169,6 @@ Redis (Sentinel) URL example JSON before encoding:
|
||||
| `MACHINE_LEARNING_ANN_TUNING_LEVEL` | ARM-NN GPU tuning level (1: rapid, 2: normal, 3: exhaustive) | `2` | machine learning |
|
||||
| `MACHINE_LEARNING_DEVICE_IDS`<sup>\*4</sup> | Device IDs to use in multi-GPU environments | `0` | machine learning |
|
||||
| `MACHINE_LEARNING_MAX_BATCH_SIZE__FACIAL_RECOGNITION` | Set the maximum number of faces that will be processed at once by the facial recognition model | None (`1` if using OpenVINO) | machine learning |
|
||||
| `MACHINE_LEARNING_PING_TIMEOUT` | How long (ms) to wait for a PING response when checking if an ML server is available | `2000` | server |
|
||||
| `MACHINE_LEARNING_AVAILABILITY_BACKOFF_TIME` | How long to ignore ML servers that are offline before trying again | `30000` | server |
|
||||
| `MACHINE_LEARNING_RKNN` | Enable RKNN hardware acceleration if supported | `True` | machine learning |
|
||||
| `MACHINE_LEARNING_RKNN_THREADS` | How many threads of RKNN runtime should be spinned up while inferencing. | `1` | machine learning |
|
||||
|
||||
|
||||
@@ -42,8 +42,8 @@ const config = {
|
||||
],
|
||||
presets: [
|
||||
[
|
||||
'docusaurus-preset-openapi',
|
||||
/** @type {import('docusaurus-preset-openapi').Options} */
|
||||
'classic',
|
||||
/** @type {import('@docusaurus/preset-classic').Options} */
|
||||
({
|
||||
docs: {
|
||||
showLastUpdateAuthor: true,
|
||||
@@ -54,14 +54,6 @@ const config = {
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl: 'https://github.com/immich-app/immich/tree/main/docs/',
|
||||
},
|
||||
api: {
|
||||
path: '../open-api/immich-openapi-specs.json',
|
||||
routeBasePath: '/docs/api',
|
||||
},
|
||||
// blog: {
|
||||
// showReadingTime: true,
|
||||
// editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
|
||||
// },
|
||||
theme: {
|
||||
customCss: require.resolve('./src/css/custom.css'),
|
||||
},
|
||||
@@ -100,12 +92,12 @@ const config = {
|
||||
label: 'Docs',
|
||||
},
|
||||
{
|
||||
to: '/roadmap',
|
||||
href: 'https://immich.app/roadmap',
|
||||
position: 'right',
|
||||
label: 'Roadmap',
|
||||
},
|
||||
{
|
||||
to: '/docs/api',
|
||||
href: 'https://api.immich.app/',
|
||||
position: 'right',
|
||||
label: 'API',
|
||||
},
|
||||
@@ -161,15 +153,15 @@ const config = {
|
||||
items: [
|
||||
{
|
||||
label: 'Roadmap',
|
||||
to: '/roadmap',
|
||||
href: 'https://immich.app/roadmap',
|
||||
},
|
||||
{
|
||||
label: 'API',
|
||||
to: '/docs/api',
|
||||
href: 'https://api.immich.app/',
|
||||
},
|
||||
{
|
||||
label: 'Cursed Knowledge',
|
||||
to: '/cursed-knowledge',
|
||||
href: 'https://immich.app/cursed-knowledge',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
20545
docs/package-lock.json
generated
20545
docs/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -24,10 +24,7 @@
|
||||
"@mdi/react": "^1.6.1",
|
||||
"@mdx-js/react": "^3.0.0",
|
||||
"autoprefixer": "^10.4.17",
|
||||
"classnames": "^2.3.2",
|
||||
"clsx": "^2.0.0",
|
||||
"docusaurus-lunr-search": "^3.3.2",
|
||||
"docusaurus-preset-openapi": "^0.7.5",
|
||||
"lunr": "^2.3.9",
|
||||
"postcss": "^8.4.25",
|
||||
"prism-react-renderer": "^2.3.1",
|
||||
@@ -60,6 +57,6 @@
|
||||
"node": ">=20"
|
||||
},
|
||||
"volta": {
|
||||
"node": "22.18.0"
|
||||
"node": "22.19.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,12 @@ const guides: CommunityGuidesProps[] = [
|
||||
description: `synchronize folders in imported library with albums having the folders name.`,
|
||||
url: 'https://github.com/immich-app/immich/discussions/3382',
|
||||
},
|
||||
{
|
||||
title: 'Immich Podman Quadlets Handbook',
|
||||
description:
|
||||
'A rewrite of the original Immich Docker Compose file using Podman Quadlets, with a set of extra guides in the repositoryâs wiki.',
|
||||
url: 'https://github.com/linux-universe/immich-podman-quadlets/blob/main/README.md',
|
||||
},
|
||||
{
|
||||
title: 'Podman/Quadlets Install',
|
||||
description: 'Documentation for simple podman setup using quadlets.',
|
||||
|
||||
@@ -105,6 +105,21 @@ const projects: CommunityProjectProps[] = [
|
||||
description: 'Speed up your machine learning by load balancing your requests to multiple computers',
|
||||
url: 'https://github.com/apetersson/immich_ml_balancer',
|
||||
},
|
||||
{
|
||||
title: 'Immich Drop Uploader',
|
||||
description: 'A tiny, zero-login web app for collecting photos/videos from anyone into your Immich server.',
|
||||
url: 'https://github.com/Nasogaa/immich-drop',
|
||||
},
|
||||
{
|
||||
title: 'Immich Birthday Sync',
|
||||
description: 'Bulk-upload and -download birthdays, with CardDAV sync support',
|
||||
url: 'https://github.com/sid3windr/immich-birthday',
|
||||
},
|
||||
{
|
||||
title: 'Immich Stack',
|
||||
description: 'Auto-stack photos with identical filenames and differing extensions (i.e. JPG+RAW)',
|
||||
url: 'https://github.com/sid3windr/immich-stack',
|
||||
},
|
||||
];
|
||||
|
||||
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {
|
||||
|
||||
@@ -1,273 +0,0 @@
|
||||
import {
|
||||
mdiBug,
|
||||
mdiCalendarToday,
|
||||
mdiCrosshairsOff,
|
||||
mdiCrop,
|
||||
mdiDatabase,
|
||||
mdiLeadPencil,
|
||||
mdiLockOff,
|
||||
mdiLockOutline,
|
||||
mdiMicrosoftWindows,
|
||||
mdiSecurity,
|
||||
mdiSpeedometerSlow,
|
||||
mdiTrashCan,
|
||||
mdiWeb,
|
||||
mdiWrap,
|
||||
mdiCloudKeyOutline,
|
||||
mdiRegex,
|
||||
mdiCodeJson,
|
||||
mdiClockOutline,
|
||||
mdiAccountOutline,
|
||||
mdiRestart,
|
||||
} from '@mdi/js';
|
||||
import Layout from '@theme/Layout';
|
||||
import React from 'react';
|
||||
import { Timeline, Item as TimelineItem } from '../components/timeline';
|
||||
|
||||
const withLanguage = (date: Date) => (language: string) => date.toLocaleDateString(language);
|
||||
|
||||
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
|
||||
|
||||
const items: Item[] = [
|
||||
{
|
||||
icon: mdiClockOutline,
|
||||
iconColor: 'gray',
|
||||
title: 'setTimeout is cursed',
|
||||
description:
|
||||
'The setTimeout method in JavaScript is cursed when used with small values because the implementation may or may not actually wait the specified time.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/20655',
|
||||
text: '#20655',
|
||||
},
|
||||
date: new Date(2025, 7, 4),
|
||||
},
|
||||
{
|
||||
icon: mdiAccountOutline,
|
||||
iconColor: '#DAB1DA',
|
||||
title: 'PostgreSQL USER is cursed',
|
||||
description:
|
||||
'The USER keyword in PostgreSQL is cursed because you can select from it like a table, which leads to confusion if you have a table name user as well.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/19891',
|
||||
text: '#19891',
|
||||
},
|
||||
date: new Date(2025, 7, 4),
|
||||
},
|
||||
{
|
||||
icon: mdiRestart,
|
||||
iconColor: '#8395e3',
|
||||
title: 'PostgreSQL RESET is cursed',
|
||||
description:
|
||||
'PostgreSQL RESET is cursed because it is impossible to RESET a PostgreSQL extension parameter if the extension has been uninstalled.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/19363',
|
||||
text: '#19363',
|
||||
},
|
||||
date: new Date(2025, 5, 20),
|
||||
},
|
||||
{
|
||||
icon: mdiRegex,
|
||||
iconColor: 'purple',
|
||||
title: 'Zitadel Actions are cursed',
|
||||
description:
|
||||
"Zitadel is cursed because its custom scripting feature is executed with a JS engine that doesn't support regex named capture groups.",
|
||||
link: {
|
||||
url: 'https://github.com/dop251/goja',
|
||||
text: 'Go JS engine',
|
||||
},
|
||||
date: new Date(2025, 5, 4),
|
||||
},
|
||||
{
|
||||
icon: mdiCloudKeyOutline,
|
||||
iconColor: '#0078d4',
|
||||
title: 'Entra is cursed',
|
||||
description:
|
||||
"Microsoft Entra supports PKCE, but doesn't include it in its OpenID discovery document. This leads to clients thinking PKCE isn't available.",
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/18725',
|
||||
text: '#18725',
|
||||
},
|
||||
date: new Date(2025, 4, 30),
|
||||
},
|
||||
{
|
||||
icon: mdiCrop,
|
||||
iconColor: 'tomato',
|
||||
title: 'Image dimensions in EXIF metadata are cursed',
|
||||
description:
|
||||
'The dimensions in EXIF metadata can be different from the actual dimensions of the image, causing issues with cropping and resizing.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/17974',
|
||||
text: '#17974',
|
||||
},
|
||||
date: new Date(2025, 4, 5),
|
||||
},
|
||||
{
|
||||
icon: mdiCodeJson,
|
||||
iconColor: 'yellow',
|
||||
title: 'YAML whitespace is cursed',
|
||||
description: 'YAML whitespaces are often handled in unintuitive ways.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/17309',
|
||||
text: '#17309',
|
||||
},
|
||||
date: new Date(2025, 3, 1),
|
||||
},
|
||||
{
|
||||
icon: mdiMicrosoftWindows,
|
||||
iconColor: '#357EC7',
|
||||
title: 'Hidden files in Windows are cursed',
|
||||
description:
|
||||
'Hidden files in Windows cannot be opened with the "w" flag. That, combined with SMB option "hide dot files" leads to a lot of confusion.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/12812',
|
||||
text: '#12812',
|
||||
},
|
||||
date: new Date(2024, 8, 20),
|
||||
},
|
||||
{
|
||||
icon: mdiWrap,
|
||||
iconColor: 'gray',
|
||||
title: 'Carriage returns in bash scripts are cursed',
|
||||
description: 'Git can be configured to automatically convert LF to CRLF on checkout and CRLF breaks bash scripts.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/11613',
|
||||
text: '#11613',
|
||||
},
|
||||
date: new Date(2024, 7, 7),
|
||||
},
|
||||
{
|
||||
icon: mdiLockOff,
|
||||
iconColor: 'red',
|
||||
title: 'Fetch inside Cloudflare Workers is cursed',
|
||||
description:
|
||||
'Fetch requests in Cloudflare Workers use http by default, even if you explicitly specify https, which can often cause redirect loops.',
|
||||
link: {
|
||||
url: 'https://community.cloudflare.com/t/does-cloudflare-worker-allow-secure-https-connection-to-fetch-even-on-flexible-ssl/68051/5',
|
||||
text: 'Cloudflare',
|
||||
},
|
||||
date: new Date(2024, 7, 7),
|
||||
},
|
||||
{
|
||||
icon: mdiCrosshairsOff,
|
||||
iconColor: 'gray',
|
||||
title: 'GPS sharing on mobile is cursed',
|
||||
description:
|
||||
'Some phones will silently strip GPS data from images when apps without location permission try to access them.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/discussions/11268',
|
||||
text: '#11268',
|
||||
},
|
||||
date: new Date(2024, 6, 21),
|
||||
},
|
||||
{
|
||||
icon: mdiLeadPencil,
|
||||
iconColor: 'gold',
|
||||
title: 'PostgreSQL NOTIFY is cursed',
|
||||
description:
|
||||
'PostgreSQL does everything in a transaction, including NOTIFY. This means using the socket.io postgres-adapter writes to WAL every 5 seconds.',
|
||||
link: { url: 'https://github.com/immich-app/immich/pull/10801', text: '#10801' },
|
||||
date: new Date(2024, 6, 3),
|
||||
},
|
||||
{
|
||||
icon: mdiWeb,
|
||||
iconColor: 'lightskyblue',
|
||||
title: 'npm scripts are cursed',
|
||||
description:
|
||||
'npm scripts make a http call to the npm registry each time they run, which means they are a terrible way to execute a health check.',
|
||||
link: { url: 'https://github.com/immich-app/immich/issues/10796', text: '#10796' },
|
||||
date: new Date(2024, 6, 3),
|
||||
},
|
||||
{
|
||||
icon: mdiSpeedometerSlow,
|
||||
iconColor: 'brown',
|
||||
title: '50 extra packages are cursed',
|
||||
description:
|
||||
'There is a user in the JavaScript community who goes around adding "backwards compatibility" to projects. They do this by adding 50 extra package dependencies to your project, which are maintained by them.',
|
||||
link: { url: 'https://github.com/immich-app/immich/pull/10690', text: '#10690' },
|
||||
date: new Date(2024, 5, 28),
|
||||
},
|
||||
{
|
||||
icon: mdiLockOutline,
|
||||
iconColor: 'gold',
|
||||
title: 'Long passwords are cursed',
|
||||
description:
|
||||
'The bcrypt implementation only uses the first 72 bytes of a string. Any characters after that are ignored.',
|
||||
// link: GHSA-4p64-9f7h-3432
|
||||
date: new Date(2024, 5, 25),
|
||||
},
|
||||
{
|
||||
icon: mdiCalendarToday,
|
||||
iconColor: 'greenyellow',
|
||||
title: 'JavaScript Date objects are cursed',
|
||||
description: 'JavaScript date objects are 1 indexed for years and days, but 0 indexed for months.',
|
||||
link: { url: 'https://github.com/immich-app/immich/pull/6787', text: '#6787' },
|
||||
date: new Date(2024, 0, 31),
|
||||
},
|
||||
{
|
||||
icon: mdiBug,
|
||||
iconColor: 'green',
|
||||
title: 'ESM imports are cursed',
|
||||
description:
|
||||
'Prior to Node.js v20.8 using --experimental-vm-modules in a CommonJS project that imported an ES module that imported a CommonJS modules would create a segfault and crash Node.js',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/6719',
|
||||
text: '#6179',
|
||||
},
|
||||
date: new Date(2024, 0, 9),
|
||||
},
|
||||
{
|
||||
icon: mdiDatabase,
|
||||
iconColor: 'gray',
|
||||
title: 'PostgreSQL parameters are cursed',
|
||||
description: `PostgresSQL has a limit of ${Number(65535).toLocaleString()} parameters, so bulk inserts can fail with large datasets.`,
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/6034',
|
||||
text: '#6034',
|
||||
},
|
||||
date: new Date(2023, 11, 28),
|
||||
},
|
||||
{
|
||||
icon: mdiSecurity,
|
||||
iconColor: 'gold',
|
||||
title: 'Secure contexts are cursed',
|
||||
description: `Some web features like the clipboard API only work in "secure contexts" (ie. https or localhost)`,
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/issues/2981',
|
||||
text: '#2981',
|
||||
},
|
||||
date: new Date(2023, 5, 26),
|
||||
},
|
||||
{
|
||||
icon: mdiTrashCan,
|
||||
iconColor: 'gray',
|
||||
title: 'TypeORM deletes are cursed',
|
||||
description: `The remove implementation in TypeORM mutates the input, deleting the id property from the original object.`,
|
||||
link: {
|
||||
url: 'https://github.com/typeorm/typeorm/issues/7024#issuecomment-948519328',
|
||||
text: 'typeorm#6034',
|
||||
},
|
||||
date: new Date(2023, 1, 23),
|
||||
},
|
||||
];
|
||||
|
||||
export default function CursedKnowledgePage(): JSX.Element {
|
||||
return (
|
||||
<Layout title="Cursed Knowledge" description="Things we wish we didn't know">
|
||||
<section className="my-8">
|
||||
<h1 className="md:text-6xl text-center mb-10 text-immich-primary dark:text-immich-dark-primary px-2">
|
||||
Cursed Knowledge
|
||||
</h1>
|
||||
<p className="text-center text-xl px-2">
|
||||
Cursed knowledge we have learned as a result of building Immich that we wish we never knew.
|
||||
</p>
|
||||
<div className="flex justify-around mt-8 w-full max-w-full">
|
||||
<Timeline
|
||||
items={items
|
||||
.sort((a, b) => b.date.getTime() - a.date.getTime())
|
||||
.map((item) => ({ ...item, getDateLabel: withLanguage(item.date) }))}
|
||||
/>
|
||||
</div>
|
||||
</section>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
@@ -2,7 +2,17 @@
|
||||
|
||||
## TypeORM Upgrade
|
||||
|
||||
In order to update to Immich to `v1.137.0` (or above), the application must be started at least once on a version in the range between `1.132.0` and `1.136.0`. Doing so will complete database schema upgrades that are required for `v1.137.0` (and above). After Immich has successfully updated to a version in this range, you can now attempt to update to v1.137.0 (or above). We recommend users upgrade to `1.132.0` since it does not have any other breaking changes.
|
||||
If you encountered "Migrations failed: Error: Invalid upgrade path" then perform an intermediate upgrade to `v1.132.3` first.
|
||||
|
||||
:::tip
|
||||
We recommend users upgrade to `v1.132.3` since it does not have any breaking changes or bugs on this upgrade path.
|
||||
:::
|
||||
|
||||
In order to update to Immich `v1.137.0` or above, the application must be started at least once on a version in the range between `1.132.0` and `1.136.0`. Doing so will complete database schema upgrades that are required for `v1.137.0` (and above). After Immich has successfully updated to a version in this range, you can now attempt to update to `v1.137.0` (or above).
|
||||
|
||||
:::caution
|
||||
Avoid `v1.136.0` if upgrading from `v1.131.0` (or earlier) due to a bug blocking this upgrade in some installations.
|
||||
:::
|
||||
|
||||
## Inconsistent Media Location
|
||||
|
||||
|
||||
@@ -1,123 +1,5 @@
|
||||
import React from 'react';
|
||||
import Link from '@docusaurus/Link';
|
||||
import Layout from '@theme/Layout';
|
||||
import { discordPath, discordViewBox } from '@site/src/components/svg-paths';
|
||||
import ThemedImage from '@theme/ThemedImage';
|
||||
import Icon from '@mdi/react';
|
||||
|
||||
function HomepageHeader() {
|
||||
return (
|
||||
<header>
|
||||
<div className="top-[calc(12%)] md:top-[calc(30%)] h-screen w-full absolute -z-10">
|
||||
<img src={'img/immich-logo.svg'} className="h-[110%] w-[110%] mb-2 antialiased -z-10" alt="Immich logo" />
|
||||
<div className="w-full h-[120vh] absolute left-0 top-0 backdrop-blur-3xl bg-immich-bg/40 dark:bg-transparent"></div>
|
||||
</div>
|
||||
<section className="text-center pt-12 sm:pt-24 bg-immich-bg/50 dark:bg-immich-dark-bg/80">
|
||||
<a href="https://futo.org" target="_blank" rel="noopener noreferrer">
|
||||
<ThemedImage
|
||||
sources={{ dark: 'img/logomark-dark-with-futo.svg', light: 'img/logomark-light-with-futo.svg' }}
|
||||
className="h-[125px] w-[125px] mb-2 antialiased rounded-none"
|
||||
alt="Immich logo"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<div className="mt-8">
|
||||
<p className="text-3xl md:text-5xl sm:leading-tight mb-1 font-extrabold text-black/90 dark:text-white px-4">
|
||||
Self-hosted{' '}
|
||||
<span className="text-immich-primary dark:text-immich-dark-primary">
|
||||
photo and <span className="block"></span>
|
||||
video management{' '}
|
||||
</span>
|
||||
solution<span className="block"></span>
|
||||
</p>
|
||||
|
||||
<p className="max-w-1/4 m-auto mt-4 px-4 text-lg text-gray-700 dark:text-gray-100">
|
||||
Easily back up, organize, and manage your photos on your own server. Immich helps you
|
||||
<span className="sm:block"></span> browse, search and organize your photos and videos with ease, without
|
||||
sacrificing your privacy.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-9 gap-4 ">
|
||||
<Link
|
||||
className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary dark:bg-immich-dark-primary rounded-xl no-underline hover:no-underline text-white hover:text-gray-50 dark:text-immich-dark-bg font-bold"
|
||||
to="docs/overview/quick-start"
|
||||
>
|
||||
Get Started
|
||||
</Link>
|
||||
|
||||
<Link
|
||||
className="flex place-items-center place-content-center py-3 px-8 border bg-white/90 dark:bg-gray-300 rounded-xl hover:no-underline text-immich-primary dark:text-immich-dark-bg font-bold"
|
||||
to="https://demo.immich.app/"
|
||||
>
|
||||
Open Demo
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="my-8 flex gap-1 font-medium place-items-center place-content-center text-immich-primary dark:text-immich-dark-primary">
|
||||
<Icon
|
||||
path={discordPath}
|
||||
viewBox={discordViewBox} /* viewBox may show an error in your IDE but it is normal. */
|
||||
size={1}
|
||||
/>
|
||||
<Link to="https://discord.immich.app/">Join our Discord</Link>
|
||||
</div>
|
||||
<ThemedImage
|
||||
sources={{ dark: '/img/screenshot-dark.webp', light: '/img/screenshot-light.webp' }}
|
||||
alt="screenshots"
|
||||
className="w-[95%] lg:w-[85%] xl:w-[70%] 2xl:w-[60%] "
|
||||
/>
|
||||
<div className="mx-[25%] m-auto my-14 md:my-28">
|
||||
<hr className="border bg-gray-500 dark:bg-gray-400" />
|
||||
</div>
|
||||
<ThemedImage
|
||||
sources={{ dark: 'img/logomark-dark.svg', light: 'img/logomark-light.svg' }}
|
||||
className="h-[115px] w-[115px] mb-2 antialiased rounded-none"
|
||||
alt="Immich logo"
|
||||
/>
|
||||
<div>
|
||||
<p className="font-bold text-2xl md:text-5xl ">Download the mobile app</p>
|
||||
<p className="text-lg">
|
||||
Download the Immich app and start backing up your photos and videos securely to your own server
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-4 gap-1">
|
||||
<div className="h-24">
|
||||
<a href="https://play.google.com/store/apps/details?id=app.alextran.immich">
|
||||
<img className="h-24" alt="Get it on Google Play" src="/img/google-play-badge.png" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="h-24">
|
||||
<a href="https://apps.apple.com/sg/app/immich/id1613945652">
|
||||
<img className="h-24 sm:p-3.5 p-3" alt="Download on the App Store" src="/img/ios-app-store-badge.svg" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="h-24">
|
||||
<a href="https://github.com/immich-app/immich/releases/latest">
|
||||
<img className="h-24 sm:p-3.5 p-3" alt="Download APK" src="/img/download-apk-github.svg" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<ThemedImage
|
||||
sources={{ dark: '/img/app-qr-code-dark.svg', light: '/img/app-qr-code-light.svg' }}
|
||||
alt="app qr code"
|
||||
width={'150px'}
|
||||
className="shadow-lg p-3 my-8 dark:bg-immich-dark-bg "
|
||||
/>
|
||||
</section>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
import { Redirect } from '@docusaurus/router';
|
||||
|
||||
export default function Home(): JSX.Element {
|
||||
return (
|
||||
<Layout title="Home" description="Self-hosted photo and video management solution" noFooter={true}>
|
||||
<HomepageHeader />
|
||||
<div className="flex flex-col place-items-center text-center place-content-center dark:bg-immich-dark-bg py-8">
|
||||
<p>This project is available under GNU AGPL v3 license.</p>
|
||||
<p className="text-sm">Privacy should not be a luxury</p>
|
||||
</div>
|
||||
</Layout>
|
||||
);
|
||||
return <Redirect to="/docs/overview/welcome" />;
|
||||
}
|
||||
|
||||
@@ -1,944 +0,0 @@
|
||||
import {
|
||||
mdiAccountGroup,
|
||||
mdiAccountGroupOutline,
|
||||
mdiAndroid,
|
||||
mdiAppleIos,
|
||||
mdiArchiveOutline,
|
||||
mdiBash,
|
||||
mdiBookSearchOutline,
|
||||
mdiBookmark,
|
||||
mdiCakeVariant,
|
||||
mdiCameraBurst,
|
||||
mdiChartBoxMultipleOutline,
|
||||
mdiCheckAll,
|
||||
mdiCheckboxMarked,
|
||||
mdiCloudUploadOutline,
|
||||
mdiCollage,
|
||||
mdiContentDuplicate,
|
||||
mdiCrop,
|
||||
mdiDevices,
|
||||
mdiEmailOutline,
|
||||
mdiExpansionCard,
|
||||
mdiEyeOutline,
|
||||
mdiEyeRefreshOutline,
|
||||
mdiFaceMan,
|
||||
mdiFaceManOutline,
|
||||
mdiFile,
|
||||
mdiFileSearch,
|
||||
mdiFlash,
|
||||
mdiFolder,
|
||||
mdiFolderMultiple,
|
||||
mdiForum,
|
||||
mdiHandshakeOutline,
|
||||
mdiHeart,
|
||||
mdiHistory,
|
||||
mdiImage,
|
||||
mdiImageAlbum,
|
||||
mdiImageEdit,
|
||||
mdiImageMultipleOutline,
|
||||
mdiImageSearch,
|
||||
mdiKeyboardSettingsOutline,
|
||||
mdiLicense,
|
||||
mdiLockOutline,
|
||||
mdiMagnify,
|
||||
mdiMagnifyScan,
|
||||
mdiMap,
|
||||
mdiMaterialDesign,
|
||||
mdiMatrix,
|
||||
mdiMerge,
|
||||
mdiMonitor,
|
||||
mdiMotionPlayOutline,
|
||||
mdiPalette,
|
||||
mdiPanVertical,
|
||||
mdiPartyPopper,
|
||||
mdiPencil,
|
||||
mdiRaw,
|
||||
mdiRocketLaunch,
|
||||
mdiRotate360,
|
||||
mdiScaleBalance,
|
||||
mdiSecurity,
|
||||
mdiServer,
|
||||
mdiShare,
|
||||
mdiShareAll,
|
||||
mdiShareCircle,
|
||||
mdiStar,
|
||||
mdiStarOutline,
|
||||
mdiTableKey,
|
||||
mdiTag,
|
||||
mdiTagMultiple,
|
||||
mdiText,
|
||||
mdiThemeLightDark,
|
||||
mdiTrashCanOutline,
|
||||
mdiVectorCombine,
|
||||
mdiFolderSync,
|
||||
mdiFaceRecognition,
|
||||
mdiVideo,
|
||||
mdiWeb,
|
||||
mdiDatabaseOutline,
|
||||
mdiLinkEdit,
|
||||
mdiTagFaces,
|
||||
mdiMovieOpenPlayOutline,
|
||||
mdiCast,
|
||||
} from '@mdi/js';
|
||||
import Layout from '@theme/Layout';
|
||||
import React from 'react';
|
||||
import { Item, Timeline } from '../components/timeline';
|
||||
|
||||
const releases = {
|
||||
'v1.135.0': new Date(2025, 5, 18),
|
||||
'v1.133.0': new Date(2025, 4, 21),
|
||||
'v1.130.0': new Date(2025, 2, 25),
|
||||
'v1.127.0': new Date(2025, 1, 26),
|
||||
'v1.122.0': new Date(2024, 11, 5),
|
||||
'v1.120.0': new Date(2024, 10, 6),
|
||||
'v1.114.0': new Date(2024, 8, 6),
|
||||
'v1.113.0': new Date(2024, 7, 30),
|
||||
'v1.112.0': new Date(2024, 7, 14),
|
||||
'v1.111.0': new Date(2024, 6, 26),
|
||||
'v1.110.0': new Date(2024, 5, 11),
|
||||
'v1.109.0': new Date(2024, 6, 18),
|
||||
'v1.106.1': new Date(2024, 5, 11),
|
||||
'v1.104.0': new Date(2024, 4, 13),
|
||||
'v1.103.0': new Date(2024, 3, 29),
|
||||
'v1.102.0': new Date(2024, 3, 15),
|
||||
'v1.99.0': new Date(2024, 2, 20),
|
||||
'v1.98.0': new Date(2024, 2, 7),
|
||||
'v1.95.0': new Date(2024, 1, 20),
|
||||
'v1.94.0': new Date(2024, 0, 31),
|
||||
'v1.93.0': new Date(2024, 0, 19),
|
||||
'v1.91.0': new Date(2023, 11, 15),
|
||||
'v1.90.0': new Date(2023, 11, 7),
|
||||
'v1.88.0': new Date(2023, 10, 20),
|
||||
'v1.84.0': new Date(2023, 10, 1),
|
||||
'v1.83.0': new Date(2023, 9, 28),
|
||||
'v1.82.0': new Date(2023, 9, 17),
|
||||
'v1.79.0': new Date(2023, 8, 21),
|
||||
'v1.76.0': new Date(2023, 7, 29),
|
||||
'v1.75.0': new Date(2023, 7, 26),
|
||||
'v1.72.0': new Date(2023, 7, 6),
|
||||
'v1.71.0': new Date(2023, 6, 29),
|
||||
'v1.69.0': new Date(2023, 6, 23),
|
||||
'v1.68.0': new Date(2023, 6, 20),
|
||||
'v1.67.0': new Date(2023, 6, 14),
|
||||
'v1.66.0': new Date(2023, 6, 4),
|
||||
'v1.65.0': new Date(2023, 5, 30),
|
||||
'v1.63.0': new Date(2023, 5, 24),
|
||||
'v1.61.0': new Date(2023, 5, 16),
|
||||
'v1.58.0': new Date(2023, 4, 28),
|
||||
'v1.57.0': new Date(2023, 4, 23),
|
||||
'v1.56.0': new Date(2023, 4, 18),
|
||||
'v1.55.0': new Date(2023, 4, 9),
|
||||
'v1.54.0': new Date(2023, 3, 18),
|
||||
'v1.52.0': new Date(2023, 2, 29),
|
||||
'v1.51.0': new Date(2023, 2, 20),
|
||||
'v1.48.0': new Date(2023, 1, 21),
|
||||
'v1.47.0': new Date(2023, 1, 13),
|
||||
'v1.46.0': new Date(2023, 1, 9),
|
||||
'v1.43.0': new Date(2023, 1, 3),
|
||||
'v1.41.0': new Date(2023, 0, 10),
|
||||
'v1.39.0': new Date(2022, 11, 19),
|
||||
'v1.36.0': new Date(2022, 10, 20),
|
||||
'v1.33.1': new Date(2022, 9, 26),
|
||||
'v1.32.0': new Date(2022, 9, 14),
|
||||
'v1.27.0': new Date(2022, 8, 6),
|
||||
'v1.24.0': new Date(2022, 7, 19),
|
||||
'v1.10.0': new Date(2022, 4, 29),
|
||||
'v1.7.0': new Date(2022, 3, 24),
|
||||
'v1.3.0': new Date(2022, 2, 22),
|
||||
'v1.2.0': new Date(2022, 1, 8),
|
||||
} as const;
|
||||
|
||||
const weirdTags = {
|
||||
'v1.41.0': 'v1.41.1_64-dev',
|
||||
'v1.39.0': 'v1.39.0_61-dev',
|
||||
'v1.36.0': 'v1.36.0_55-dev',
|
||||
'v1.33.1': 'v1.33.0_52-dev',
|
||||
'v1.32.0': 'v1.32.0_50-dev',
|
||||
'v1.27.0': 'v1.27.0_37-dev',
|
||||
'v1.24.0': 'v1.24.0_34-dev',
|
||||
'v1.10.0': 'v1.10.0_15-dev',
|
||||
'v1.7.0': 'v1.7.0_11-dev ',
|
||||
'v1.3.0': 'v1.3.0-dev ',
|
||||
'v1.2.0': 'v0.2-dev ',
|
||||
};
|
||||
|
||||
const title = 'Roadmap';
|
||||
const description = 'A list of future plans and goals, as well as past achievements and milestones.';
|
||||
|
||||
const withLanguage = (date: Date) => (language: string) => date.toLocaleDateString(language);
|
||||
|
||||
type Base = { icon: string; iconColor?: React.CSSProperties['color']; title: string; description: string };
|
||||
const withRelease = ({
|
||||
icon,
|
||||
iconColor,
|
||||
title,
|
||||
description,
|
||||
release: version,
|
||||
}: Base & { release: keyof typeof releases }) => {
|
||||
return {
|
||||
icon,
|
||||
iconColor: iconColor ?? 'gray',
|
||||
title,
|
||||
description,
|
||||
link: {
|
||||
url: `https://github.com/immich-app/immich/releases/tag/${weirdTags[version] ?? version}`,
|
||||
text: version,
|
||||
},
|
||||
getDateLabel: withLanguage(releases[version]),
|
||||
};
|
||||
};
|
||||
|
||||
const roadmap: Item[] = [
|
||||
{
|
||||
done: false,
|
||||
icon: mdiFlash,
|
||||
iconColor: 'gold',
|
||||
title: 'Workflows',
|
||||
description: 'Automate tasks with workflows',
|
||||
getDateLabel: () => 'Planned for 2025',
|
||||
},
|
||||
{
|
||||
done: false,
|
||||
icon: mdiImageEdit,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'Basic editor',
|
||||
description: 'Basic photo editing capabilities',
|
||||
getDateLabel: () => 'Planned for 2025',
|
||||
},
|
||||
{
|
||||
done: false,
|
||||
icon: mdiRocketLaunch,
|
||||
iconColor: 'indianred',
|
||||
title: 'Stable release',
|
||||
description: 'Immich goes stable',
|
||||
getDateLabel: () => 'Planned for 2025',
|
||||
},
|
||||
{
|
||||
done: false,
|
||||
icon: mdiCloudUploadOutline,
|
||||
iconColor: 'cornflowerblue',
|
||||
title: 'Better background backups',
|
||||
description: 'Rework background backups to be more reliable',
|
||||
getDateLabel: () => 'Planned for 2025',
|
||||
},
|
||||
{
|
||||
done: false,
|
||||
icon: mdiCameraBurst,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'Auto stacking',
|
||||
description: 'Auto stack burst photos',
|
||||
getDateLabel: () => 'Planned for 2025',
|
||||
},
|
||||
];
|
||||
|
||||
const milestones: Item[] = [
|
||||
{
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '70,000 Stars',
|
||||
description: 'Reached 70K Stars on GitHub!',
|
||||
getDateLabel: withLanguage(new Date(2025, 6, 9)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiTableKey,
|
||||
iconColor: 'gray',
|
||||
title: 'Fine grained access controls',
|
||||
description: 'Granular access controls for api keys',
|
||||
release: 'v1.135.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCast,
|
||||
iconColor: 'aqua',
|
||||
title: 'Google Cast (web and mobile)',
|
||||
description: 'Cast assets to Google Cast/Chromecast compatible devices',
|
||||
release: 'v1.135.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiLockOutline,
|
||||
iconColor: 'sandybrown',
|
||||
title: 'Private/locked photos',
|
||||
description: 'Private assets with extra protections',
|
||||
release: 'v1.133.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFolderMultiple,
|
||||
iconColor: 'brown',
|
||||
title: 'Folders view in the mobile app',
|
||||
description: 'Browse your photos and videos in their folder structure inside the mobile app',
|
||||
release: 'v1.130.0',
|
||||
}),
|
||||
{
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '60,000 Stars',
|
||||
description: 'Reached 60K Stars on GitHub!',
|
||||
getDateLabel: withLanguage(new Date(2025, 2, 4)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiTagFaces,
|
||||
iconColor: 'teal',
|
||||
title: 'Manual face tagging',
|
||||
description:
|
||||
'Manually tag or remove faces in photos and videos, even when automatic detection misses or misidentifies them.',
|
||||
release: 'v1.127.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiLinkEdit,
|
||||
iconColor: 'crimson',
|
||||
title: 'Automatic URL switching',
|
||||
description: 'The mobile app now supports automatic switching between different server URLs',
|
||||
release: 'v1.122.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMovieOpenPlayOutline,
|
||||
iconColor: 'darksalmon',
|
||||
title: 'Native video player',
|
||||
description: 'HDR videos are now fully supported using the Immich native video player',
|
||||
release: 'v1.122.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiDatabaseOutline,
|
||||
iconColor: 'brown',
|
||||
title: 'Automatic database dumps',
|
||||
description: 'Database dumps are now integrated into the Immich server',
|
||||
release: 'v1.120.0',
|
||||
}),
|
||||
{
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '50,000 Stars',
|
||||
description: 'Reached 50K Stars on GitHub!',
|
||||
getDateLabel: withLanguage(new Date(2024, 10, 1)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiFaceRecognition,
|
||||
title: 'Metadata Face Import',
|
||||
description: 'Read face metadata in Digikam format during import',
|
||||
release: 'v1.114.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiTagMultiple,
|
||||
iconColor: 'orange',
|
||||
title: 'Tags',
|
||||
description: 'Tag your photos and videos',
|
||||
release: 'v1.113.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFolderSync,
|
||||
iconColor: 'green',
|
||||
title: 'Album sync (mobile)',
|
||||
description: 'Sync or mirror an album from your phone to the Immich server',
|
||||
release: 'v1.113.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFolderMultiple,
|
||||
iconColor: 'brown',
|
||||
title: 'Folders view',
|
||||
description: 'Browse your photos and videos in their folder structure',
|
||||
release: 'v1.113.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiPalette,
|
||||
title: 'Theming (mobile)',
|
||||
description: 'Pick a primary color for the mobile app',
|
||||
release: 'v1.112.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiStarOutline,
|
||||
iconColor: 'gold',
|
||||
title: 'Star rating',
|
||||
description: 'Rate your photos and videos',
|
||||
release: 'v1.112.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCrop,
|
||||
iconColor: 'royalblue',
|
||||
title: 'Editor (mobile)',
|
||||
description: 'Crop and rotate on mobile',
|
||||
release: 'v1.111.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMap,
|
||||
iconColor: 'green',
|
||||
title: 'Deploy tiles.immich.cloud',
|
||||
description: 'Dedicated tile server for Immich',
|
||||
release: 'v1.111.0',
|
||||
}),
|
||||
{
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '40,000 Stars',
|
||||
description: 'Reached 40K Stars on GitHub!',
|
||||
getDateLabel: withLanguage(new Date(2024, 6, 21)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiShare,
|
||||
title: 'Deploy my.immich.app',
|
||||
description: 'Url router for immich links',
|
||||
release: 'v1.109.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiLicense,
|
||||
iconColor: 'gold',
|
||||
title: 'Supporter Badge',
|
||||
description: 'The option to buy Immich to support its development!',
|
||||
release: 'v1.109.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiHistory,
|
||||
title: 'Versioned documentation',
|
||||
description: 'View documentation as it was at the time of past releases',
|
||||
release: 'v1.106.1',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiWeb,
|
||||
iconColor: 'royalblue',
|
||||
title: 'Web translations',
|
||||
description: 'Translate the web application to multiple languages',
|
||||
release: 'v1.106.1',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiContentDuplicate,
|
||||
title: 'Similar image detection',
|
||||
description: "Detect duplicate assets that aren't exactly identical",
|
||||
release: 'v1.106.1',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiVectorCombine,
|
||||
title: 'Container consolidation',
|
||||
description:
|
||||
'The microservices container can be run as a worker within the server image, allowing us to remove it from the default stack.',
|
||||
release: 'v1.106.1',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiPencil,
|
||||
iconColor: 'saddlebrown',
|
||||
title: 'Read-write external libraries',
|
||||
description: 'Edit, update, and delete files in external libraries',
|
||||
release: 'v1.104.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiEmailOutline,
|
||||
iconColor: 'crimson',
|
||||
title: 'Email notifications',
|
||||
description: 'Send emails for important events',
|
||||
release: 'v1.104.0',
|
||||
}),
|
||||
{
|
||||
icon: mdiHandshakeOutline,
|
||||
iconColor: 'magenta',
|
||||
title: 'Immich joins FUTO!',
|
||||
description: 'Joined Futo and Immich core team goes full-time',
|
||||
getDateLabel: withLanguage(new Date(2024, 4, 1)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiEyeOutline,
|
||||
iconColor: 'darkslategray',
|
||||
title: 'Read-only albums',
|
||||
description: 'Share albums with other users as read-only',
|
||||
release: 'v1.103.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiBookmark,
|
||||
iconColor: 'orangered',
|
||||
title: 'Permanent URLs (Web)',
|
||||
description: 'Assets on the web now have permanent URLs',
|
||||
release: 'v1.103.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '30,000 Stars',
|
||||
description: 'Reached 30K Stars on GitHub!',
|
||||
release: 'v1.102.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiChartBoxMultipleOutline,
|
||||
iconColor: 'mediumvioletred',
|
||||
title: 'OpenTelemetry metrics',
|
||||
description: 'OpenTelemetry metrics for local evaluation and advanced debugging',
|
||||
release: 'v1.99.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: 'immich',
|
||||
title: 'New logo',
|
||||
description: 'Immich got its new logo',
|
||||
release: 'v1.98.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMagnifyScan,
|
||||
title: 'Search enhancement with advanced filters',
|
||||
description: 'Advanced search with filters by date, location and more',
|
||||
release: 'v1.95.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiScaleBalance,
|
||||
iconColor: 'gold',
|
||||
title: 'AGPL License',
|
||||
description: 'Immich switches to AGPLv3 license',
|
||||
release: 'v1.95.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiEyeRefreshOutline,
|
||||
title: 'Library watching',
|
||||
description: 'Automatically import files in external libraries when the operating system detects changes.',
|
||||
release: 'v1.94.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiExpansionCard,
|
||||
iconColor: 'green',
|
||||
title: 'GPU acceleration for machine-learning',
|
||||
description: 'Hardware acceleration support for Nvidia and Intel devices through CUDA and OpenVINO.',
|
||||
release: 'v1.94.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiAccountGroupOutline,
|
||||
iconColor: 'gray',
|
||||
title: '250 unique contributors',
|
||||
description: '250 amazing people contributed to Immich',
|
||||
release: 'v1.93.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMatrix,
|
||||
title: 'Search improvement with pgvecto.rs',
|
||||
description: 'Moved the search from typesense to pgvecto.rs',
|
||||
release: 'v1.91.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiPencil,
|
||||
iconColor: 'saddlebrown',
|
||||
title: 'Edit metadata',
|
||||
description: "Edit a photo or video's date, time, hours, timezone, and GPS information",
|
||||
release: 'v1.90.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiVectorCombine,
|
||||
title: 'Container consolidation',
|
||||
description:
|
||||
'The serving of the web app is merged into the server image, allowing us to remove two containers from the stack.',
|
||||
release: 'v1.88.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiBash,
|
||||
iconColor: 'gray',
|
||||
title: 'CLI v2',
|
||||
description: 'Version 2 of the Immich CLI is released, replacing the legacy v1 CLI.',
|
||||
release: 'v1.88.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiForum,
|
||||
iconColor: 'dodgerblue',
|
||||
title: 'Activity',
|
||||
description: 'Comment a photo or a video in a shared album',
|
||||
release: 'v1.84.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '20,000 Stars',
|
||||
description: 'Reached 20K Stars on GitHub!',
|
||||
release: 'v1.83.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCameraBurst,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'Stack assets',
|
||||
description: 'Manual asset stacking for grouping and hiding related assets in the main timeline.',
|
||||
release: 'v1.83.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiPalette,
|
||||
iconColor: 'magenta',
|
||||
title: 'Custom theme',
|
||||
description: 'Apply your custom CSS for modifying fonts, colors, and styles in the web application.',
|
||||
release: 'v1.83.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiTrashCanOutline,
|
||||
iconColor: 'brown',
|
||||
title: 'Trash feature',
|
||||
description: 'Trash, restore from trash, and automatically empty the recycle bin after 30 days.',
|
||||
release: 'v1.82.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiBookSearchOutline,
|
||||
title: 'External libraries',
|
||||
description: 'Automatically import media into Immich based on imports paths and ignore patterns.',
|
||||
release: 'v1.79.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMap,
|
||||
iconColor: 'darksalmon',
|
||||
title: 'Map view (mobile)',
|
||||
description: 'Heat map implementation in the mobile app.',
|
||||
release: 'v1.76.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFile,
|
||||
iconColor: 'lightblue',
|
||||
title: 'Configuration file',
|
||||
description: 'Auto-configure an Immich installation via a configuration file.',
|
||||
release: 'v1.75.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMonitor,
|
||||
iconColor: 'darkcyan',
|
||||
title: 'Slideshow mode (web)',
|
||||
description: 'Start a full-screen slideshow from an Album on the web.',
|
||||
release: 'v1.75.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiServer,
|
||||
iconColor: 'lightskyblue',
|
||||
title: 'Hardware transcoding',
|
||||
description: 'Support hardware acceleration (QuickSync, VAAPI, and Nvidia) for video transcoding.',
|
||||
release: 'v1.72.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiImageAlbum,
|
||||
iconColor: 'olivedrab',
|
||||
title: 'View albums via time buckets',
|
||||
description: 'Upgrade albums to use time buckets, an optimized virtual viewport.',
|
||||
release: 'v1.72.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiImageAlbum,
|
||||
iconColor: 'olivedrab',
|
||||
title: 'Album description',
|
||||
description: 'Save an album description.',
|
||||
release: 'v1.72.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiRotate360,
|
||||
title: '360° Photos (web)',
|
||||
description: 'View 360° Photos on the web.',
|
||||
release: 'v1.71.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMotionPlayOutline,
|
||||
title: 'Android motion photos',
|
||||
description: 'Add support for Android Motion Photos.',
|
||||
release: 'v1.69.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFaceManOutline,
|
||||
iconColor: 'mistyrose',
|
||||
title: 'Show/hide faces',
|
||||
description: 'Add the options to show or hide faces.',
|
||||
release: 'v1.68.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMerge,
|
||||
iconColor: 'forestgreen',
|
||||
title: 'Merge faces',
|
||||
description: 'Add the ability to merge multiple faces together.',
|
||||
release: 'v1.67.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiImage,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'Feature photo',
|
||||
description: 'Add the option to change the feature photo for a person.',
|
||||
release: 'v1.66.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiKeyboardSettingsOutline,
|
||||
iconColor: 'darkslategray',
|
||||
title: 'Multi-select via SHIFT',
|
||||
description: 'Add the option to multi-select while holding SHIFT.',
|
||||
release: 'v1.66.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiImageMultipleOutline,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'Memories (mobile)',
|
||||
description: 'View "On this day..." memories in the mobile app.',
|
||||
release: 'v1.65.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFaceMan,
|
||||
iconColor: 'mistyrose',
|
||||
title: 'Facial recognition (mobile)',
|
||||
description: 'View detected faces in the mobile app.',
|
||||
release: 'v1.63.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiImageMultipleOutline,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'Memories (web)',
|
||||
description: 'View pictures taken in past years on this day on the web.',
|
||||
release: 'v1.61.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCollage,
|
||||
iconColor: 'deeppink',
|
||||
title: 'Justified layout (web)',
|
||||
description: 'Implement justified layout (collage) on the web.',
|
||||
release: 'v1.61.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiRaw,
|
||||
title: 'RAW file formats',
|
||||
description: 'Support for RAW file formats.',
|
||||
release: 'v1.61.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiShareAll,
|
||||
iconColor: 'darkturquoise',
|
||||
title: 'Partner sharing (mobile)',
|
||||
description: 'View shared partner photos in the mobile app.',
|
||||
release: 'v1.58.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFile,
|
||||
iconColor: 'lightblue',
|
||||
title: 'XMP sidecar',
|
||||
description: 'Attach XMP sidecar files to assets.',
|
||||
release: 'v1.58.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFolder,
|
||||
iconColor: 'brown',
|
||||
title: 'Custom storage label',
|
||||
description: 'Replace the user UUID in the storage template with a custom label.',
|
||||
release: 'v1.57.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiShareCircle,
|
||||
title: 'Partner sharing',
|
||||
description: 'Share your entire collection with another user.',
|
||||
release: 'v1.56.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFaceMan,
|
||||
iconColor: 'mistyrose',
|
||||
title: 'Facial recognition',
|
||||
description: 'Detect faces in pictures and cluster them together as people, which can be named.',
|
||||
release: 'v1.56.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMap,
|
||||
iconColor: 'darksalmon',
|
||||
title: 'Map view (web)',
|
||||
description: 'View a global map, with clusters of photos based on corresponding GPS data.',
|
||||
release: 'v1.55.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiDevices,
|
||||
iconColor: 'slategray',
|
||||
title: 'Manage auth devices',
|
||||
description: 'Manage logged-in devices and revoke access from User Settings.',
|
||||
release: 'v1.55.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '10,000 Stars',
|
||||
description: 'Reached 10K stars on GitHub!',
|
||||
release: 'v1.54.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiText,
|
||||
title: 'Asset descriptions',
|
||||
description: 'Save an asset description',
|
||||
release: 'v1.54.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiArchiveOutline,
|
||||
title: 'Archiving',
|
||||
description: 'Remove assets from the main timeline by archiving them.',
|
||||
release: 'v1.54.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiDevices,
|
||||
iconColor: 'slategray',
|
||||
title: 'Responsive web app',
|
||||
description: 'Optimize the web app for small screen.',
|
||||
release: 'v1.54.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFileSearch,
|
||||
iconColor: 'brown',
|
||||
title: 'Search by metadata',
|
||||
description: 'Search images by filename, description, tagged people, make, model, and other metadata.',
|
||||
release: 'v1.52.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiImageSearch,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'CLIP search',
|
||||
description: 'Search images with free-form text like "Sunset at the beach".',
|
||||
release: 'v1.51.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMagnify,
|
||||
iconColor: 'lightblue',
|
||||
title: 'Explore page',
|
||||
description: 'View tagged places, object, and people.',
|
||||
release: 'v1.51.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiAppleIos,
|
||||
title: 'iOS background uploads',
|
||||
description: 'Automatically backup pictures in the background on iOS.',
|
||||
release: 'v1.48.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMotionPlayOutline,
|
||||
title: 'Auto-Link live photos',
|
||||
description: 'Automatically link live photos, even when uploaded as separate files.',
|
||||
release: 'v1.48.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMaterialDesign,
|
||||
iconColor: 'blue',
|
||||
title: 'Material design 3 (mobile)',
|
||||
description: 'Upgrade the mobile app to Material Design 3.',
|
||||
release: 'v1.47.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiHeart,
|
||||
iconColor: 'red',
|
||||
title: 'Favorites (mobile)',
|
||||
description: 'Show favorites on the mobile app.',
|
||||
release: 'v1.46.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCakeVariant,
|
||||
iconColor: 'deeppink',
|
||||
title: 'Immich turns 1',
|
||||
description: 'Immich is officially one year old.',
|
||||
release: 'v1.43.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiHeart,
|
||||
iconColor: 'red',
|
||||
title: 'Favorites page (web)',
|
||||
description: 'Favorite and view favorites on the web.',
|
||||
release: 'v1.43.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiShareCircle,
|
||||
title: 'Public share links',
|
||||
description: 'Share photos and albums publicly via a shared link.',
|
||||
release: 'v1.41.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiFolder,
|
||||
iconColor: 'lightblue',
|
||||
title: 'User-defined storage structure',
|
||||
description: 'Support custom storage structures.',
|
||||
release: 'v1.39.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiMotionPlayOutline,
|
||||
title: 'iOS live photos',
|
||||
description: 'Backup and display iOS Live Photos.',
|
||||
release: 'v1.36.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiSecurity,
|
||||
iconColor: 'green',
|
||||
title: 'OAuth integration',
|
||||
description: 'Support OAuth2 and OIDC capable identity providers.',
|
||||
release: 'v1.36.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiWeb,
|
||||
iconColor: 'royalblue',
|
||||
title: 'Documentation site',
|
||||
description: 'Release an official documentation website.',
|
||||
release: 'v1.33.1',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiThemeLightDark,
|
||||
iconColor: 'slategray',
|
||||
title: 'Dark mode (web)',
|
||||
description: 'Dark mode on the web.',
|
||||
release: 'v1.32.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiPanVertical,
|
||||
title: 'Virtual scrollbar (web)',
|
||||
description: 'View the main timeline with a virtual scrollbar, allowing to jump to any point in time, instantly.',
|
||||
release: 'v1.27.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCheckAll,
|
||||
iconColor: 'green',
|
||||
title: 'Checksum duplication check',
|
||||
description: 'Enforce per user sha1 checksum uniqueness.',
|
||||
release: 'v1.27.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiAndroid,
|
||||
iconColor: 'greenyellow',
|
||||
title: 'Android background backup',
|
||||
description: 'Automatic backup in the background on Android.',
|
||||
release: 'v1.24.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiAccountGroup,
|
||||
iconColor: 'gray',
|
||||
title: 'Admin portal',
|
||||
description: 'Manage users and admin settings from the web.',
|
||||
release: 'v1.10.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiShareCircle,
|
||||
title: 'Album sharing',
|
||||
description: 'Share albums with other users.',
|
||||
release: 'v1.7.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiTag,
|
||||
iconColor: 'coral',
|
||||
title: 'Image tagging',
|
||||
description: 'Tag images with custom values.',
|
||||
release: 'v1.7.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiImage,
|
||||
iconColor: 'rebeccapurple',
|
||||
title: 'View exif',
|
||||
description: 'View metadata about assets.',
|
||||
release: 'v1.3.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCheckboxMarked,
|
||||
iconColor: 'green',
|
||||
title: 'Multi select',
|
||||
description: 'Select and execute actions on multiple assets at the same time.',
|
||||
release: 'v1.2.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiVideo,
|
||||
iconColor: 'slategray',
|
||||
title: 'Video player',
|
||||
description: 'Play videos in the web and on mobile.',
|
||||
release: 'v1.2.0',
|
||||
}),
|
||||
{
|
||||
icon: mdiPartyPopper,
|
||||
iconColor: 'deeppink',
|
||||
title: 'First commit',
|
||||
description: 'First commit on GitHub, Immich is born.',
|
||||
getDateLabel: withLanguage(new Date(2022, 1, 3)),
|
||||
},
|
||||
];
|
||||
|
||||
export default function MilestonePage(): JSX.Element {
|
||||
return (
|
||||
<Layout title={title} description={description}>
|
||||
<section className="my-8">
|
||||
<h1 className="md:text-6xl text-center mb-10 text-immich-primary dark:text-immich-dark-primary px-2">
|
||||
{title}
|
||||
</h1>
|
||||
<p className="text-center text-xl px-2">{description}</p>
|
||||
<div className="flex justify-around mt-8 w-full max-w-full">
|
||||
<Timeline items={[...roadmap, ...milestones]} />
|
||||
</div>
|
||||
</section>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
5
docs/static/.well-known/security.txt
vendored
5
docs/static/.well-known/security.txt
vendored
@@ -1,5 +0,0 @@
|
||||
Policy: https://github.com/immich-app/immich/blob/main/SECURITY.md
|
||||
Contact: mailto:security@immich.app
|
||||
Preferred-Languages: en
|
||||
Expires: 2026-05-01T23:59:00.000Z
|
||||
Canonical: https://immich.app/.well-known/security.txt
|
||||
52
docs/static/archived-versions.json
vendored
52
docs/static/archived-versions.json
vendored
@@ -1,4 +1,56 @@
|
||||
[
|
||||
{
|
||||
"label": "v1.143.1",
|
||||
"url": "https://v1.143.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.143.0",
|
||||
"url": "https://v1.143.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.142.1",
|
||||
"url": "https://v1.142.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.142.0",
|
||||
"url": "https://v1.142.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.141.1",
|
||||
"url": "https://v1.141.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.141.0",
|
||||
"url": "https://v1.141.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.140.1",
|
||||
"url": "https://v1.140.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.140.0",
|
||||
"url": "https://v1.140.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.139.4",
|
||||
"url": "https://v1.139.4.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.139.3",
|
||||
"url": "https://v1.139.3.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.139.2",
|
||||
"url": "https://v1.139.2.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.138.1",
|
||||
"url": "https://v1.138.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.138.0",
|
||||
"url": "https://v1.138.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.137.3",
|
||||
"url": "https://v1.137.3.archive.immich.app"
|
||||
|
||||
1
e2e/.gitignore
vendored
1
e2e/.gitignore
vendored
@@ -3,3 +3,4 @@ node_modules/
|
||||
/playwright-report/
|
||||
/blob-report/
|
||||
/playwright/.cache/
|
||||
/dist
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.18.0
|
||||
22.19.0
|
||||
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
image: redis:6.2-alpine@sha256:7fe72c486b910f6b1a9769c937dad5d63648ddee82e056f47417542dd40825bb
|
||||
|
||||
database:
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:0e763a2383d56f90364fcd72767ac41400cd30d2627f407f7e7960c9f1923c21
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:11ced39d65a92a54d12890ced6a26cc2003f92697d6f0d4d944b98459dba7138
|
||||
command: -c fsync=off -c shared_preload_libraries=vchord.so -c config_file=/var/lib/postgresql/data/postgresql.conf
|
||||
environment:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
|
||||
7419
e2e/package-lock.json
generated
7419
e2e/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "immich-e2e",
|
||||
"version": "1.137.3",
|
||||
"version": "1.143.1",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
@@ -19,19 +19,17 @@
|
||||
"author": "",
|
||||
"license": "GNU Affero General Public License version 3",
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.1.0",
|
||||
"@eslint/js": "^9.8.0",
|
||||
"@immich/cli": "file:../cli",
|
||||
"@immich/sdk": "file:../open-api/typescript-sdk",
|
||||
"@playwright/test": "^1.44.1",
|
||||
"@socket.io/component-emitter": "^3.1.2",
|
||||
"@types/luxon": "^3.4.2",
|
||||
"@types/node": "^22.17.0",
|
||||
"@types/node": "^22.18.1",
|
||||
"@types/oidc-provider": "^9.0.0",
|
||||
"@types/pg": "^8.15.1",
|
||||
"@types/pngjs": "^6.0.4",
|
||||
"@types/supertest": "^6.0.2",
|
||||
"@vitest/coverage-v8": "^3.0.0",
|
||||
"eslint": "^9.14.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
@@ -45,7 +43,7 @@
|
||||
"pngjs": "^7.0.0",
|
||||
"prettier": "^3.2.5",
|
||||
"prettier-plugin-organize-imports": "^4.0.0",
|
||||
"sharp": "^0.34.0",
|
||||
"sharp": "^0.34.3",
|
||||
"socket.io-client": "^4.7.4",
|
||||
"supertest": "^7.0.0",
|
||||
"typescript": "^5.3.3",
|
||||
@@ -54,6 +52,6 @@
|
||||
"vitest": "^3.0.0"
|
||||
},
|
||||
"volta": {
|
||||
"node": "22.18.0"
|
||||
"node": "22.19.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1466,10 +1466,10 @@ describe('/asset', () => {
|
||||
expectedDate: '2023-04-04T04:00:00.000Z',
|
||||
},
|
||||
{
|
||||
name: 'CreateDate when DateTimeOriginal missing',
|
||||
name: 'CreationDate when DateTimeOriginal missing',
|
||||
exifData: {
|
||||
CreateDate: '2023:05:05 05:00:00', // TESTABLE
|
||||
CreationDate: '2023:07:07 07:00:00', // TESTABLE
|
||||
CreationDate: '2023:05:05 05:00:00', // TESTABLE
|
||||
CreateDate: '2023:07:07 07:00:00', // TESTABLE
|
||||
GPSDateTime: '2023:10:10 10:00:00', // TESTABLE
|
||||
},
|
||||
expectedDate: '2023-05-05T05:00:00.000Z',
|
||||
|
||||
@@ -23,8 +23,8 @@ describe('/partners', () => {
|
||||
]);
|
||||
|
||||
await Promise.all([
|
||||
createPartner({ id: user2.userId }, { headers: asBearerAuth(user1.accessToken) }),
|
||||
createPartner({ id: user1.userId }, { headers: asBearerAuth(user2.accessToken) }),
|
||||
createPartner({ partnerCreateDto: { sharedWithId: user2.userId } }, { headers: asBearerAuth(user1.accessToken) }),
|
||||
createPartner({ partnerCreateDto: { sharedWithId: user1.userId } }, { headers: asBearerAuth(user2.accessToken) }),
|
||||
]);
|
||||
});
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ export const tempDir = tmpdir();
|
||||
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
|
||||
export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
|
||||
export const immichCli = (args: string[]) =>
|
||||
executeCommand('node', ['node_modules/.bin/immich', '-d', `/${tempDir}/immich/`, ...args]).promise;
|
||||
executeCommand('pnpm', ['exec', 'immich', '-d', `/${tempDir}/immich/`, ...args], { cwd: '../cli' }).promise;
|
||||
export const immichAdmin = (args: string[]) =>
|
||||
executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]);
|
||||
export const specialCharStrings = ["'", '"', ',', '{', '}', '*'];
|
||||
@@ -462,7 +462,8 @@ export const utils = {
|
||||
updateLibrary: (accessToken: string, id: string, dto: UpdateLibraryDto) =>
|
||||
updateLibrary({ id, updateLibraryDto: dto }, { headers: asBearerAuth(accessToken) }),
|
||||
|
||||
createPartner: (accessToken: string, id: string) => createPartner({ id }, { headers: asBearerAuth(accessToken) }),
|
||||
createPartner: (accessToken: string, id: string) =>
|
||||
createPartner({ partnerCreateDto: { sharedWithId: id } }, { headers: asBearerAuth(accessToken) }),
|
||||
|
||||
updateMyPreferences: (accessToken: string, userPreferencesUpdateDto: UserPreferencesUpdateDto) =>
|
||||
updateMyPreferences({ userPreferencesUpdateDto }, { headers: asBearerAuth(accessToken) }),
|
||||
|
||||
38
i18n/af.json
38
i18n/af.json
@@ -14,6 +14,7 @@
|
||||
"add_a_location": "Voeg 'n ligging by",
|
||||
"add_a_name": "Voeg 'n naam by",
|
||||
"add_a_title": "Voeg 'n titel by",
|
||||
"add_birthday": "Voeg 'n verjaarsdag by",
|
||||
"add_endpoint": "Voeg Koppelvlakpunt by",
|
||||
"add_exclusion_pattern": "Voeg uitsgluitingspatrone by",
|
||||
"add_import_path": "Voeg invoerpad by",
|
||||
@@ -27,6 +28,8 @@
|
||||
"add_to_album": "Voeg na album",
|
||||
"add_to_album_bottom_sheet_added": "By {album} bygevoeg",
|
||||
"add_to_album_bottom_sheet_already_exists": "Reeds in {album}",
|
||||
"add_to_albums": "Voeg by albums",
|
||||
"add_to_albums_count": "Voeg by ({count}) albums",
|
||||
"add_to_shared_album": "Voeg toe aan gedeelde album",
|
||||
"add_url": "Voeg URL by",
|
||||
"added_to_archive": "By argief toegevoegd",
|
||||
@@ -44,6 +47,11 @@
|
||||
"backup_database": "Skep DatastortlÃĒer",
|
||||
"backup_database_enable_description": "Aktiveer databasisrugsteun",
|
||||
"backup_keep_last_amount": "Aantal vorige rugsteune om te hou",
|
||||
"backup_onboarding_3_description": "totale kopieÃĢ van jou data, insluitende die oorspronklikke lÃĒers. Dit sluit in 1 kopie op 'n ander perseel en 2 kopieÃĢ om die huidige rekenaar.",
|
||||
"backup_onboarding_description": "'N <backblaze-link>3-2-1 rugsteun strategie</backblaze-link> word sterk aanbeveel om jou data veilig te hou. Hou kopieÃĢ van jou fotos/videos so wel as die Immich databasis vir 'n volledige rugsteun oplossing.",
|
||||
"backup_onboarding_footer": "Vir meer inligting oor hoe om 'n rugsteun kopie van Immich te maak, gaan lees asseblief hierdie <link>dokument</link>.",
|
||||
"backup_onboarding_parts_title": "'N 3-2-1 rugsteun sluit in:",
|
||||
"backup_onboarding_title": "Rugsteun kopieÃĢ",
|
||||
"backup_settings": "Rugsteun instellings",
|
||||
"backup_settings_description": "Bestuur databasis rugsteun instellings.",
|
||||
"cleared_jobs": "Poste gevee vir: {job}",
|
||||
@@ -62,8 +70,8 @@
|
||||
"duplicate_detection_job_description": "Begin masjienleer op bates om soortgelyke beelde op te spoor. Maak staat op Smart Search",
|
||||
"exclusion_pattern_description": "Met uitsluitingspatrone kan jy lÃĒers en vouers ignoreer wanneer jy jou biblioteek skandeer. Dit is nuttig as jy vouers het wat lÃĒers bevat wat jy nie wil invoer nie, soos RAW-lÃĒers.",
|
||||
"external_library_management": "Eksterne Biblioteekbestuur",
|
||||
"face_detection": "Gesig deteksie",
|
||||
"face_detection_description": "Detecteer die gesigte in media deur middel van masjienleer. Vir videos word slegs die duimnaelskets oorweeg. âHerlaaiâ (ver)werk al die media weer. âStel terugâ verwyder boonop alle huidige gesigdata. âOnverwerkâ plaas bates in die tou wat nog nie verwerk is nie. Gedekte gesigte sal nÃĄ voltooiing van Gesigdetectie vir Gesigherkenning in die tou geplaas word, om hulle in bestaande of nuwe persone te groepeer.",
|
||||
"face_detection": "Gesig herkenning",
|
||||
"face_detection_description": "Identifiseer die gesigte in media deur middel van masjienleer. Vir videos word slegs die duimnaelskets oorweeg. âHerlaaiâ (ver)werk al die media weer. âStel terugâ verwyder alle huidige gesigdata. âOnverwerkâ plaas bates in die tou wat nog nie verwerk is nie. Geidentifiseerde gesigte sal nÃĄ voltooiing van Gesigidentifikasie vir Gesigherkenning in die tou geplaas word, om hulle in bestaande of nuwe persone te groepeer.",
|
||||
"facial_recognition_job_description": "Groepeer gesigte in mense in. Die stap is vinniger nadat Gesig Deteksie klaar is. \"Herstel\" (her-)groepeer alle gesigte. \"Vermiste\" plaas gesigte in ry wat nie 'n persoon gekoppel het nie.",
|
||||
"failed_job_command": "Opdrag {command} het misluk vir werk: {job}",
|
||||
"force_delete_user_warning": "WAARSKUWING: Dit sal onmiddellik die gebruiker en alle bates verwyder. Dit kan nie ontdoen word nie en die lÃĒers kan nie herstel word nie.",
|
||||
@@ -93,15 +101,33 @@
|
||||
"job_status": "Werkstatus",
|
||||
"library_created": "Biblioteek geskep: {library}",
|
||||
"library_deleted": "Biblioteek verwyder",
|
||||
"library_import_path_description": "Spesifiseer 'n leer om in te neem. Hierdie leer, en al die sub leers, gaan geskandeer for vir prente en videos.",
|
||||
"library_scanning": "Periodieke Skandering",
|
||||
"library_scanning_description": "Stel periodieke skandering van biblioteek in",
|
||||
"library_import_path_description": "Spesifiseer 'n leer om in te neem. Hierdie leer, en al die sub leers, gaan deursoek word vir prente en videos.",
|
||||
"library_scanning": "Periodieke Soek",
|
||||
"library_scanning_description": "Stel periodieke deursoek van biblioteek in",
|
||||
"library_scanning_enable_description": "Aktiveer periodieke biblioteekskandering",
|
||||
"library_settings": "Eksterne Biblioteek",
|
||||
"library_settings_description": "Eksterne biblioteek verstellings",
|
||||
"library_tasks_description": "Deursoek eksterne biblioteke vir nuwe of veranderde bates",
|
||||
"library_watching_enable_description": "Hou eksterne biblioteke dop vir leer veranderinge",
|
||||
"library_watching_settings": "Biblioteek dop hou (EKSPERIMENTEEL)",
|
||||
"library_watching_settings_description": "Hou automaties dop vir veranderinge",
|
||||
"logging_enable_description": "Aktifeer \"logging\"",
|
||||
"logging_level_description": "Wanneer aktief, watter vlak van \"logs\" om te skep.",
|
||||
"logging_settings": "\"Logs\"",
|
||||
"machine_learning_clip_model": "CLIP model",
|
||||
"machine_learning_duplicate_detection": "Duplikaat herkenning",
|
||||
"machine_learning_duplicate_detection_enabled": "Aktifeer duplikaat herkenning",
|
||||
"machine_learning_enabled": "Aktifeer masjienleer",
|
||||
"machine_learning_facial_recognition": "Gesigsherkenning",
|
||||
"machine_learning_facial_recognition_description": "Herken, identifiseer en groepeer gesigte in fotos",
|
||||
"machine_learning_facial_recognition_model": "Gesigsherkennings model",
|
||||
"machine_learning_facial_recognition_setting": "Aktifeer gesigsherkenning",
|
||||
"machine_learning_max_detection_distance": "Maksimum herkennings afstand",
|
||||
"map_settings": "Kaart",
|
||||
"migration_job": "Migrasie",
|
||||
"oauth_settings": "OAuth",
|
||||
"transcoding_acceleration_vaapi": "VAAPI"
|
||||
"transcoding_acceleration_vaapi": "VAAPI",
|
||||
"transcoding_preferred_hardware_device": "Verkiesde hardeware"
|
||||
},
|
||||
"administration": "Administrasie",
|
||||
"advanced": "Gevorderde",
|
||||
|
||||
113
i18n/ar.json
113
i18n/ar.json
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"about": "ØšŲ",
|
||||
"about": "ØŲŲŲŲ",
|
||||
"account": "ØØŗØ§Ø¨",
|
||||
"account_settings": "ØĨؚداداØĒ Ø§ŲØØŗØ§Ø¨",
|
||||
"acknowledge": "ØŖŲØ¯ØąŲ ذŲŲ",
|
||||
@@ -14,6 +14,7 @@
|
||||
"add_a_location": "ØĨØļØ§ŲØŠ Ų
ŲŲØš",
|
||||
"add_a_name": "ØĨØļØ§ŲØŠ ØĨØŗŲ
",
|
||||
"add_a_title": "ØĨØļØ§ŲØŠ ØšŲŲØ§Ų",
|
||||
"add_birthday": "ØŖØļŲ ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯",
|
||||
"add_endpoint": "اØļŲ ŲŲØˇØŠ ŲŲØ§ŲØŠ",
|
||||
"add_exclusion_pattern": "ØĨØļØ§ŲØŠ ŲŲ
Øˇ ØĨØŗØĒØĢŲØ§ØĄ",
|
||||
"add_import_path": "ØĨØļØ§ŲØŠ Ų
ØŗØ§Øą Ø§ŲØĨØŗØĒŲØąØ§Ø¯",
|
||||
@@ -25,8 +26,11 @@
|
||||
"add_tag": "اØļŲ ØšŲØ§Ų
ØŠ",
|
||||
"add_to": "ØĨØļØ§ŲØŠ ØĨŲŲâĻ",
|
||||
"add_to_album": "ØĨØļØ§ŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
",
|
||||
"add_to_album_bottom_sheet_added": "ØĒŲ
ØĒ Ø§ŲØ§ØļØ§ŲØŠ{album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Ų
ŲØŦŲØ¯ØŠ Ų
ØŗØ¨ŲØ§ {album}",
|
||||
"add_to_album_bottom_sheet_added": "ØĒŲ
ØĒ Ø§ŲØ§ØļØ§ŲØŠ Ø§ŲŲ {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Ų
ŲØŦŲØ¯ Ų
ØŗØ¨ŲØ§ ŲŲ {album}",
|
||||
"add_to_album_toggle": "ØĒبدŲŲ Ø§ŲØĒØØ¯ŲØ¯ ŲŲ{album}",
|
||||
"add_to_albums": "ØĨØļØ§ŲØŠ Ø§ŲŲ Ø§ŲØ¨ŲŲ
اØĒ",
|
||||
"add_to_albums_count": "ØĨØļاŲŲ ØĨŲŲ Ø§ŲØ¨ŲŲ
اØĒ ({count})",
|
||||
"add_to_shared_album": "ØĨØļØ§ŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
Ų
Ø´Ø§ØąŲ",
|
||||
"add_url": "ØĨØļØ§ŲØŠ ØąØ§Ø¨Øˇ",
|
||||
"added_to_archive": "ØŖŲØļŲŲØĒ ŲŲØŖØąØ´ŲŲ",
|
||||
@@ -34,16 +38,23 @@
|
||||
"added_to_favorites_count": "ØĒŲ
ØĨØļØ§ŲØŠ {count, number} ØĨŲŲ Ø§ŲŲ
ŲØļŲØ§ØĒ",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "ØĨØļØ§ŲØŠ ØŖŲŲ
Ø§Øˇ Ø§ŲØ§ØŗØĒبؚاد. ŲØ¯ØšŲ
Ø§ŲØĒŲ
ŲŲŲ Ø¨Ø§ØŗØĒ؎داŲ
*Ø **Ø ŲØ. ŲØĒØŦاŲŲ ØŦŲ
ب𠨧ŲŲ
ŲŲØ§ØĒ ŲŲ ØŖŲ Ø¯ŲŲŲ ŲØŗŲ
Ų \"Raw\"Ø Ø§ØŗØĒ؎دŲ
\"**/Raw/**\". ŲØĒØŦاŲŲ ØŦŲ
ب𠨧ŲŲ
ŲŲØ§ØĒ Ø§ŲØĒŲ ØĒŲØĒŲŲ Ø¨Ų \".tif\"Ø Ø§ØŗØĒ؎دŲ
\"**/*.tif\". ŲØĒØŦاŲŲ Ų
ØŗØ§Øą Ų
ØˇŲŲØ Ø§ØŗØĒ؎دŲ
\"/path/to/ignore/**\".",
|
||||
"admin_user": "Ų
ØŗØĒ؎دŲ
Ų
Ø¯ŲØą",
|
||||
"admin_user": "Ų
ØŗØĒ؎دŲ
Ų
ØŗØ¤ŲŲ",
|
||||
"asset_offline_description": "ŲŲ
ب𨝠ب°Ø§ Ø§ŲØŖØĩŲ Ø§ŲØŽØ§Øĩ باŲŲ
ŲØĒØ¨ØŠ Ø§ŲØŽØ§ØąØŦŲØŠ Ų
ŲØŦŲØ¯Ųا ØšŲŲ Ø§ŲŲØąØĩ ŲØĒŲ
ŲŲŲŲ ØĨŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ. ØĨذا ØĒŲ
ŲŲŲ Ø§ŲŲ
ŲŲ Ø¯Ø§ØŽŲ Ø§ŲŲ
ŲØĒØ¨ØŠØ ŲØĒØŲŲ Ų
Ų Ø§ŲØŦدŲŲ Ø§ŲØ˛Ų
ŲŲ Ø§ŲØŽØ§Øĩ Ø¨Ų ŲŲ
ØšØąŲØŠ Ø§ŲØŖØĩŲ Ø§ŲØŦØ¯ŲØ¯ اŲŲ
ŲØ§Ø¨Ų. ŲØ§ØŗØĒؚاد؊ ŲØ°Ø§ Ø§ŲØŖØĩŲØ ŲØąØŦŲ Ø§ŲØĒØŖŲد Ų
Ų ØĨŲ
ŲØ§ŲŲØŠ Ø§ŲŲØĩŲŲ ØĨŲŲ Ų
ØŗØ§Øą اŲŲ
ŲŲ ØŖØ¯ŲØ§Ų Ø¨ŲØ§ØŗØˇØŠ Immich ŲŲ
Ų ØĢŲ
ŲŲ
بŲ
ØŗØ Ø§ŲŲ
ŲØĒØ¨ØŠ.",
|
||||
"authentication_settings": "ØĨؚداداØĒ اŲŲ
ØĩØ§Ø¯ŲØŠ",
|
||||
"authentication_settings_description": "ØĨØ¯Ø§ØąØŠ ŲŲŲ
ØŠ اŲŲ
ØąŲØą ŲOAuth ŲØĨؚداداØĒ اŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØŖŲØŽØąŲ",
|
||||
"authentication_settings_disable_all": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĒØšØˇŲŲ ØŦŲ
ŲØš ŲØŗØ§ØĻŲ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲØ ØŗŲØĒŲ
ØĒØšØˇŲŲ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ Ø¨Ø§ŲŲØ§Ų
Ų.",
|
||||
"authentication_settings_reenable": "ŲØĨؚاد؊ Ø§ŲØĒŲØšŲŲØ Ø§ØŗØĒ؎دŲ
<link>ØŖŲ
Øą Ø§ŲØŽØ§Ø¯Ų
</link>.",
|
||||
"background_task_job": "اŲŲ
ŲØ§Ų
Ø§ŲØŽŲŲŲØŠ",
|
||||
"background_task_job": "اŲŲ
ŲØ§Ų
ŲŲ Ø§ŲØŽŲŲŲØŠ",
|
||||
"backup_database": "Ø§ŲØ´Ø§ØĄ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||
"backup_database_enable_description": "ØĒŲ
ŲŲŲ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||
"backup_keep_last_amount": "Ų
ŲØ¯Ø§Øą Ø§ŲØĒŲØąŲØēاØĒ Ø§ŲØŗØ§Ø¨ŲØŠ ŲŲØ§ØØĒŲØ§Ø¸ Ø¨ŲØ§",
|
||||
"backup_onboarding_1_description": "ŲØŗØŽØŠ ØŽØ§ØąØŦ اŲŲ
ŲŲØš ŲŲ Ų
ŲŲØš ØĸØŽØą.",
|
||||
"backup_onboarding_2_description": "ŲØŗØŽ Ų
ØŲŲØŠ ØšŲŲ ØŖØŦŲØ˛ØŠ Ų
ØŽØĒŲŲØŠ. ŲØ´Ų
Ų Ø°ŲŲ Ø§ŲŲ
ŲŲØ§ØĒ Ø§ŲØąØĻŲØŗŲØŠ ŲŲØŗØŽØŠ Ø§ØØĒŲØ§ØˇŲØŠ Ų
ØŲŲØŠ Ų
ŲŲØ§.",
|
||||
"backup_onboarding_3_description": "ØĨØŦŲ
اŲŲ ŲØŗØŽ Ø¨ŲØ§ŲاØĒŲØ بŲ
ا ŲŲ Ø°ŲŲ Ø§ŲŲ
ŲŲØ§ØĒ Ø§ŲØŖØĩŲŲØŠ. ŲØ´Ų
Ų Ø°ŲŲ ŲØŗØŽØŠŲ ŲØ§ØØ¯ØŠŲ ØŽØ§ØąØŦ اŲŲ
ŲŲØš ŲŲØŗØŽØĒŲŲ Ų
ØŲŲØĒŲŲ.",
|
||||
"backup_onboarding_description": "ŲŲŲØĩØ Ø¨Ø§ØĒباؚ <backblaze-link>Ø§ØŗØĒØąØ§ØĒŲØŦŲØŠ Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ 3-2-1</backblaze-link> ŲØŲ
Ø§ŲØŠ Ø¨ŲØ§ŲاØĒŲ. Ø§ØØĒŲØ¸ Ø¨ŲØŗØŽ Ø§ØØĒŲØ§ØˇŲØŠ Ų
Ų ØĩŲØąŲ/ŲŲØ¯ŲŲŲØ§ØĒŲ Ø§ŲŲ
ØŲ
ŲŲØŠØ Ø¨Ø§ŲØĨØļØ§ŲØŠ ØĨŲŲ ŲØ§ØšØ¯ØŠ Ø¨ŲØ§ŲاØĒ ImmichØ ŲØļŲ
Ø§Ų ØŲ ŲØŗØŽ Ø§ØØĒŲØ§ØˇŲ شاŲ
Ų.",
|
||||
"backup_onboarding_footer": "ŲŲ
Ø˛ŲØ¯ Ų
Ų Ø§ŲŲ
ØšŲŲŲ
اØĒ ØŲŲ Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ ŲŲ ImmichØ ŲØąØŦŲ Ø§ŲØąØŦŲØš ØĨŲŲ <link> Ø§ŲØĒØšŲŲŲ
اØĒ </link>.",
|
||||
"backup_onboarding_parts_title": "ŲØĒØļŲ
Ų Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ 3-2-1 Ų
ا ŲŲŲ:",
|
||||
"backup_onboarding_title": "اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲØŠ",
|
||||
"backup_settings": "ØĨؚداداØĒ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||
"backup_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ.",
|
||||
"cleared_jobs": "ØĒŲ
ØĨØŽŲØ§ØĄ Ų
ŲØ§Ų
: {job}",
|
||||
@@ -112,6 +123,7 @@
|
||||
"logging_enable_description": "ØĒŲØšŲŲ ØĒØŗØŦŲŲ Ø§ŲØŖØØ¯Ø§ØĢ",
|
||||
"logging_level_description": "ØšŲØ¯ Ø§ŲØĒŲØšŲŲØ ØŖŲ Ų
ØŗØĒŲŲ ØĒØŗØŦŲŲ ØŗŲØŗØĒ؎دŲ
.",
|
||||
"logging_settings": "ØĒØŗØŦŲŲ Ø§ŲØ§ØØ¯Ø§ØĢ",
|
||||
"machine_learning_availability_checks": "ØĒØŲŲ Ų
Ų Ø§ŲØĒŲŲØą",
|
||||
"machine_learning_clip_model": "ŲŲ
ŲØ°ØŦ CLIP",
|
||||
"machine_learning_clip_model_description": "Ø§ØŗŲ
ŲŲ
ŲØ°ØŦ CLIP Ų
Ø¯ØąØŦŲ <link>ŲŲØ§</link>. ŲØąØŦŲ Ų
ŲØ§ØØ¸ØŠ ØŖŲŲ ŲØŦب ØĨؚاد؊ ØĒØ´ØēŲŲ ŲØ¸ŲŲØŠ \"Ø§ŲØ¨ØØĢ Ø§ŲØ°ŲŲ\" ŲØŦŲ
ب𠨧بĩŲØą Ø¨ØšØ¯ ØĒØēŲŲØą Ø§ŲŲŲ
ŲØ°ØŦ.",
|
||||
"machine_learning_duplicate_detection": "ŲØ´Ų Ø§ŲØĒŲØąØ§Øą",
|
||||
@@ -210,6 +222,8 @@
|
||||
"oauth_mobile_redirect_uri": "ØšŲŲØ§Ų URI ŲØĨؚاد؊ Ø§ŲØĒŲØŦŲŲ ØšŲŲ Ø§ŲŲØ§ØĒŲ",
|
||||
"oauth_mobile_redirect_uri_override": "ØĒØŦØ§ŲØ˛ ØšŲŲØ§Ų URI ŲØĨؚاد؊ Ø§ŲØĒŲØŦŲŲ ØšŲŲ Ø§ŲŲØ§ØĒŲ",
|
||||
"oauth_mobile_redirect_uri_override_description": "ŲŲ
بØĒŲØšŲŲŲ ØšŲØ¯Ų
ا ŲØ§ ŲØŗŲ
Ø Ų
ŲŲØą OAuth بŲ
ØšØąŲ URI ŲŲØŦŲØ§ŲØ Ų
ØĢŲ ''{callback}''",
|
||||
"oauth_role_claim": "اŲŲ
ØˇØ§ŲØ¨ØŠ Ø¨Ø§ŲØ¯ŲØą(ØĩŲØ§ØŲاØĒ)",
|
||||
"oauth_role_claim_description": "Ų
ŲØ ŲØĩŲŲ Ø§ŲŲ
ØŗØ¤ŲŲ ØĒŲŲØ§ØĻŲŲØ§ Ø¨ŲØ§ØĄŲ ØšŲŲ ŲØŦŲØ¯ ŲØ°Ø§ Ø§ŲØˇŲب. ŲØ¯ ŲŲŲŲ Ø§ŲØˇŲب ØĨŲ
ا 'Ų
ØŗØĒ؎دŲ
' ØŖŲ 'Ų
ØŗØ¤ŲŲ'.",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ OAuth",
|
||||
"oauth_settings_more_details": "ŲŲ
Ø˛ŲØ¯ Ų
Ų Ø§ŲØĒŲØ§ØĩŲŲ ØŲŲ ŲØ°Ų اŲŲ
ŲØ˛ØŠØ ŲØąØŦŲ Ø§ŲØąØŦŲØš ØĨŲŲ <link>اŲŲØĢØ§ØĻŲ</link>.",
|
||||
@@ -345,6 +359,9 @@
|
||||
"trash_number_of_days_description": "ؚدد ØŖŲØ§Ų
Ø§ŲØ§ØØĒŲØ§Ø¸ باŲŲ
ØØĒŲŲØ§ØĒ ŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ ŲØ¨Ų ØØ°ŲŲØ§ ŲŲØ§ØĻŲŲØ§",
|
||||
"trash_settings": "ØĨؚداداØĒ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||
"trash_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||
"unlink_all_oauth_accounts": "Ø§Ø˛Ø§ŲØŠ ØąØ¨Øˇ ØŦŲ
ŲØš ØØŗØ§Ø¨Ø§ØĒ OAuth",
|
||||
"unlink_all_oauth_accounts_description": "ØĒذŲŲØą Ø§Ų ØĒØ˛ŲŲ ØąØ¨Øˇ ØŦŲ
ŲØš ØØŗØ§Ø¨Ø§ØĒ OAuth ŲØ¨Ų Ø§Ų ØĒŲŲŲ Ø§ŲŲ Ų
Ø˛ŲØ¯ ØŦØ¯ŲØ¯.",
|
||||
"unlink_all_oauth_accounts_prompt": "ŲŲ Ø§ŲØĒ Ų
ØĒØŖŲØ¯ Ų
Ų Ø§Ø˛Ø§ŲØŠ ØąØ¨Øˇ ØŦŲ
ŲØš ØØŗØ§Ø¨Ø§ØĒ OAuthØ ŲØ°Ø§ ØŗŲŲŲŲ
باؚاد؊ ØļØ¨Øˇ اŲID Ø§ŲØŽØ§Øĩ باŲOAuth ŲŲŲ Ų
ØŗØĒ؎دŲ
ŲŲØ§ ŲŲ
ŲŲ Ø§ŲØĒØąØ§ØŦØš ØšŲ Ø§ŲØšŲ
ŲŲØŠ.",
|
||||
"user_cleanup_job": "ØĒŲØ¸ŲŲ Ø§ŲŲ
ØŗØĒ؎دŲ
",
|
||||
"user_delete_delay": "ØŗŲØĒŲ
ØŦدŲŲØŠ ØØŗØ§Ø¨ <b>{user}</b> ŲŲ
ØØĒŲŲØ§ØĒŲ ŲŲØØ°Ų Ø§ŲŲŲØ§ØĻŲ ŲŲ ØēØļŲŲ {delay, plural, one {# ŲŲŲ
} other {# ØŖŲØ§Ų
}}.",
|
||||
"user_delete_delay_settings": "ŲØĒØąØŠ Ø§ŲØĒØŖØŽŲØą ŲØ¨Ų Ø§ŲØØ°Ų",
|
||||
@@ -374,10 +391,11 @@
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Ø§ØŗØĒ؎دŲ
ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲØĒØĩŲŲØŠ Ø§ŲŲØŗØ§ØĻØˇ اØĢŲØ§ØĄ اŲŲ
Ø˛Ø§Ų
ŲŲ Ø¨ŲØ§ØĄ ØšŲŲ Ų
ؚاŲŲØą Ø¨Ø¯ŲŲØŠ. ØŦØąØ¨ ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲŲØˇ ŲØ§Ų ŲØ¯ŲŲ Ų
شاŲŲ Ų
Øš Ø§ŲØĒØˇØ¨ŲŲ Ø¨Ø§ŲŲØ´Ų ØšŲ ØŦŲ
ب𠨧ب§ŲبŲŲ
اØĒ.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "[ØĒØŦØąŲØ¨Ų] Ø§ØŗØĒ؎دŲ
ØŦŲØ§Ø˛ ØĒØĩŲŲØŠ Ų
Ø˛Ø§Ų
ŲŲ Ø§ŲØ¨ŲŲ
اØĒ بدŲŲ",
|
||||
"advanced_settings_log_level_title": "Ų
ØŗØĒŲŲ Ø§ŲØŗØŦŲ: {level}",
|
||||
"advanced_settings_prefer_remote_subtitle": "ØĒŲŲŲ Ø¨ØšØļ Ø§ŲØŖØŦŲØ˛ØŠ Ø¨ØˇŲØĻØŠ Ųب稧بРŲŲ ØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąØŠ Ų
Ų Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ŲØŦŲØ¯ØŠ ØšŲŲ Ø§ŲØŦŲØ§Ø˛. ŲŲ
بØĒŲØ´ŲØˇ ŲØ°Ø§ Ø§ŲØĨؚداد ŲØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲØ¨ØšŲØ¯ØŠ Ø¨Ø¯ŲØ§Ų Ų
Ų Ø°ŲŲ.",
|
||||
"advanced_settings_prefer_remote_subtitle": "ØĒŲŲŲ Ø¨ØšØļ Ø§ŲØŖØŦŲØ˛ØŠ Ø¨ØˇŲØĻØŠ Ųب稧بРŲŲ ØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąØŠ Ų
Ų Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ØŲŲØŠ. ŲŲ
بØĒŲØšŲŲ ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲØ¨ØšŲØ¯ØŠ Ø¨Ø¯ŲØ§Ų Ų
Ų Ø°ŲŲ.",
|
||||
"advanced_settings_prefer_remote_title": "ØĒŲØļŲ Ø§ŲØĩŲØą Ø§ŲØ¨ØšŲØ¯ØŠ",
|
||||
"advanced_settings_proxy_headers_subtitle": "ØšØąŲ ØšŲØ§ŲŲŲ Ø§ŲŲŲŲŲ Ø§ŲØĒŲ ŲØŗØĒ؎دŲ
ŲØ§ Immich ŲØ§ØąØŗØ§Ų ŲŲ ØˇŲØ¨ شبŲŲ",
|
||||
"advanced_settings_proxy_headers_title": "ØšŲØ§ŲŲŲ Ø§ŲŲŲŲŲ",
|
||||
"advanced_settings_readonly_mode_title": "ŲØļØš اŲŲØąØ§ØĄØŠ ŲŲØˇ",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "ØĒØŽØˇŲ Ø§ŲØĒØŲŲ Ų
Ų Ø´ŲØ§Ø¯ØŠ SSL ŲØŽØ§Ø¯Ų
اŲŲŲØˇØŠ اŲŲŲØ§ØĻŲ. Ų
ŲŲŲØ¨ ŲŲØ´ŲاداØĒ اŲŲ
ŲŲØšØŠ Ø°Ø§ØĒŲØ§.",
|
||||
"advanced_settings_self_signed_ssl_title": "Ø§ŲØŗŲ
Ø§Ø Ø¨Ø´ŲØ§Ø¯Ø§ØĒ SSL اŲŲ
ŲŲØšØŠ Ø°Ø§ØĒŲŲØ§",
|
||||
"advanced_settings_sync_remote_deletions_subtitle": "ØØ°Ų Ø§Ų Ø§ØŗØĒؚاد؊ ØĒŲŲØ§ØĻŲ ŲŲØ§ØĩŲŲ ØšŲŲ ŲØ°Ø§ Ø§ŲØŦŲØ§Ø˛ ØšŲØ¯ ØĒŲŲŲØ° Ø§ŲØšŲ
ŲŲØŠ ØšŲŲ Ø§ŲŲŲØ¨",
|
||||
@@ -507,7 +525,7 @@
|
||||
"back_close_deselect": "Ø§ŲØąØŦŲØš ØŖŲ Ø§ŲØĨØēŲØ§Ų ØŖŲ ØĨŲØēØ§ØĄ Ø§ŲØĒØØ¯ŲØ¯",
|
||||
"background_location_permission": "Ø§Ø°Ų Ø§ŲŲØĩŲŲ ŲŲŲ
ŲŲØš ŲŲ Ø§ŲØŽŲŲŲØŠ",
|
||||
"background_location_permission_content": "ŲŲØĒŲ
ŲŲ Ų
Ų ØĒبدŲŲ Ø§ŲØ´Ø¨ŲŲ Ø¨Ø§ŲØŽŲŲŲØŠØ Immich ŲØØĒاØŦ*داØĻŲ
ا* ŲŲØØĩŲŲ ØšŲŲ Ų
Ųب𠨝ŲŲŲ ŲŲØĒŲ
ŲŲ Ø§ŲØĒØˇØ¨ŲŲ Ų
Ų ŲØąØ§ØĻØŠ Ø§ØŗŲ
Ø´Ø¨ŲØŠ Ø§ŲWi-Fi",
|
||||
"backup": "دؚŲ
",
|
||||
"backup": "ŲØŗØŽ Ø§ØØĒŲØ§ØˇŲ",
|
||||
"backup_album_selection_page_albums_device": "Ø§ŲØ§ŲبŲŲ
اØĒ ØšŲŲ Ø§ŲØŦŲØ§Ø˛ ({count})",
|
||||
"backup_album_selection_page_albums_tap": "اŲŲØą ŲŲØĒØļŲ
ŲŲØ ŲØ§ŲŲØą ŲŲØąŲا Ų
Ø˛Ø¯ŲØŦŲØ§ ŲŲØ§ØŗØĒØĢŲØ§ØĄ",
|
||||
"backup_album_selection_page_assets_scatter": "ŲŲ
ŲŲ ØŖŲ ØĒŲØĒØ´Øą Ø§ŲØŖØĩŲŲ ØšØ¨Øą ØŖŲØ¨ŲŲ
اØĒ Ų
ØĒؚدد؊. ŲØ¨Ø§ŲØĒاŲŲØ ŲŲ
ŲŲ ØĒØļŲ
ŲŲ Ø§ŲØŖŲبŲŲ
اØĒ ØŖŲ Ø§ØŗØĒØ¨ØšØ§Ø¯ŲØ§ ØŖØĢŲØ§ØĄ ØšŲ
ŲŲØŠ Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ.",
|
||||
@@ -568,11 +586,11 @@
|
||||
"backup_manual_in_progress": "ŲŲØ¯ Ø§ŲØĒØŲ
ŲŲ ØØ§ŲŲ Ų
ØąŲ Ø§ØŽØąŲ",
|
||||
"backup_manual_success": "ŲØŦاØ",
|
||||
"backup_manual_title": "ØØ§ŲØŠ Ø§ŲØĒØŲ
ŲŲ",
|
||||
"backup_options": "ØŽŲØ§ØąØ§ØĒ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
||||
"backup_options_page_title": "ØŽŲØ§ØąØ§ØĒ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
||||
"backup_setting_subtitle": "Ø§Ø¯Ø§ØąØŠ اؚداداØĒ Ø§ŲØĒØŲ
ŲŲ ŲŲ Ø§ŲØŽŲŲŲØŠ ŲØ§ŲŲ
ŲØ¯Ų
ØŠ",
|
||||
"backup_settings_subtitle": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ Ø§ŲØĒØŲ
ŲŲ",
|
||||
"backward": "اŲŲ Ø§ŲŲØąØ§ØĄ",
|
||||
"beta_sync": "ØØ§ŲØŠ اŲŲ
Ø˛Ø§Ų
ŲØŠ Ø§ŲØĒØŦØąŲØ¨ŲØŠ",
|
||||
"beta_sync_subtitle": "Ø§Ø¯Ø§ØąØŠ ŲØ¸Ø§Ų
اŲŲ
Ø˛Ø§Ų
ŲØŠ Ø§ŲØŦØ¯ŲØ¯",
|
||||
"biometric_auth_enabled": "اŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨Ø§ŲŲŲ
ØĒØąŲØŠ Ų
ŲØšŲŲ",
|
||||
"biometric_locked_out": "ŲŲØ¯ ŲŲŲØĒ ØšŲŲ Ø§ŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨ŲŲŲ
ØĒØąŲØŠ",
|
||||
"biometric_no_options": "ŲØ§ ØĒŲØŦد ØŽŲØ§ØąØ§ØĒ باŲŲŲ
ØĒØąŲØŠ Ų
ØĒŲŲØąØŠ",
|
||||
@@ -639,6 +657,7 @@
|
||||
"clear": "ØĨØŽŲØ§ØĄ",
|
||||
"clear_all": "ØĨØŽŲØ§ØĄ اŲŲŲ",
|
||||
"clear_all_recent_searches": "Ų
ØŗØ ØŦŲ
ŲØš ØšŲ
ŲŲØ§ØĒ Ø§ŲØ¨ØØĢ Ø§ŲØŖØŽŲØąØŠ",
|
||||
"clear_file_cache": "Ų
ØŗØ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ ŲŲŲ
ŲŲØ§ØĒ",
|
||||
"clear_message": "ØĨØŽŲØ§ØĄ Ø§ŲØąØŗØ§ŲØŠ",
|
||||
"clear_value": "ØĨØŽŲØ§ØĄ اŲŲŲŲ
ØŠ",
|
||||
"client_cert_dialog_msg_confirm": "ØØŗŲا",
|
||||
@@ -709,6 +728,7 @@
|
||||
"create_new_user": "ØĨŲØ´Ø§ØĄ Ų
ØŗØĒ؎دŲ
ØŦØ¯ŲØ¯",
|
||||
"create_shared_album_page_share_add_assets": "ØĨØļØ§ŲØŠ Ø§ŲØŖØĩŲŲ",
|
||||
"create_shared_album_page_share_select_photos": "ØØ¯Ø¯ Ø§ŲØĩŲØą",
|
||||
"create_shared_link": "Ø§ŲØ´Ø§ØĄ ØąØ§Ø¨Øˇ Ų
Ø´ØĒØąŲ",
|
||||
"create_tag": "ØĨŲØ´Ø§ØĄ ØšŲØ§Ų
ØŠ",
|
||||
"create_tag_description": "ØŖŲØ´ØĻ ØšŲØ§Ų
ØŠ ØŦØ¯ŲØ¯ØŠ. باŲŲØŗØ¨ØŠ ŲŲØšŲاŲ
اØĒ اŲŲ
ØĒØ¯Ø§ØŽŲØŠØ ŲØąØŦŲ ØĨØ¯ØŽØ§Ų Ø§ŲŲ
ØŗØ§Øą اŲŲØ§Ų
Ų ŲŲØšŲاŲ
ØŠ بŲ
ا ŲŲ Ø°ŲŲ Ø§ŲØŽØˇŲØˇ اŲŲ
اØĻŲØŠ ŲŲØŖŲ
اŲ
.",
|
||||
"create_user": "ØĨŲØ´Ø§ØĄ Ų
ØŗØĒ؎دŲ
",
|
||||
@@ -721,6 +741,7 @@
|
||||
"current_server_address": "ØšŲŲØ§Ų Ø§ŲØŽØ§Ø¯Ų
Ø§ŲØØ§ŲŲ",
|
||||
"custom_locale": "ŲØēØŠ Ų
ØŽØĩØĩØŠ",
|
||||
"custom_locale_description": "ØĒŲØŗŲŲ Ø§ŲØĒŲØ§ØąŲØŽ ŲØ§ŲØŖØąŲØ§Ų
Ø¨ŲØ§ØĄŲ ØšŲŲ Ø§ŲŲØēØŠ ŲØ§ŲŲ
ŲØˇŲØŠ",
|
||||
"custom_url": "ØąØ§Ø¨Øˇ Ų
ØŽØĩØĩ",
|
||||
"daily_title_text_date": "E Ø MMM DD",
|
||||
"daily_title_text_date_year": "E Ø MMM DD Ø yyyy",
|
||||
"dark": "Ų
ØšØĒŲ
",
|
||||
@@ -732,6 +753,7 @@
|
||||
"date_of_birth_saved": "ØĒŲ
ØŲظ ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯ Ø¨ŲØŦاØ",
|
||||
"date_range": "ŲØˇØ§Ų اŲŲ
ŲØšØ¯",
|
||||
"day": "ŲŲŲ
",
|
||||
"days": "Ø§ŲØ§Ų
",
|
||||
"deduplicate_all": "ØĨŲØēØ§ØĄ ØĒŲØąØ§Øą اŲŲŲ",
|
||||
"deduplication_criteria_1": "ØØŦŲ
Ø§ŲØĩŲØąØŠ Ø¨ŲØØ¯Ø§ØĒ Ø§ŲØ¨Ø§ŲØĒ",
|
||||
"deduplication_criteria_2": "ؚدد Ø¨ŲØ§ŲاØĒ EXIF",
|
||||
@@ -816,8 +838,12 @@
|
||||
"edit": "ØĒؚدŲŲ",
|
||||
"edit_album": "ØĒؚدŲŲ Ø§ŲØŖŲبŲŲ
",
|
||||
"edit_avatar": "ØĒؚدŲŲ Ø§ŲØĩŲØąØŠ Ø§ŲØ´ØŽØĩŲØŠ",
|
||||
"edit_birthday": "ØĒؚدŲŲ ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯",
|
||||
"edit_date": "ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ",
|
||||
"edit_date_and_time": "ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ ŲØ§ŲŲŲØĒ",
|
||||
"edit_date_and_time_action_prompt": "ØĒŲ
ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ ŲØ§ŲŲŲØĒ Ų{count} Ų
ŲŲ(اØĒ)",
|
||||
"edit_date_and_time_by_offset": "ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ ØØŗØ¨ ŲŲŲ
ØŠ Ø§Ø˛Ø§ØØŠ Ų
ØšŲŲØŠ",
|
||||
"edit_date_and_time_by_offset_interval": "ŲØˇØ§Ų Ø§ŲØĒØ§ØąŲØŽ Ø§ŲØŦØ¯ŲØ¯: {from} - {to}",
|
||||
"edit_description": "ØĒؚدŲŲ Ø§ŲŲØĩŲ",
|
||||
"edit_description_prompt": "Ø§ŲØąØŦØ§ØĄ ا؎ØĒŲØ§Øą ŲØĩŲ ØŦØ¯ŲØ¯:",
|
||||
"edit_exclusion_pattern": "ØĒؚدŲŲ ŲŲ
Øˇ Ø§ŲØ§ØŗØĒبؚاد",
|
||||
@@ -890,6 +916,7 @@
|
||||
"failed_to_load_notifications": "ŲØ´Ų ØĒØŲ
ŲŲ Ø§ŲØĨØ´ØšØ§ØąØ§ØĒ",
|
||||
"failed_to_load_people": "ŲØ´Ų ØĒØŲ
ŲŲ Ø§ŲØŖØ´ØŽØ§Øĩ",
|
||||
"failed_to_remove_product_key": "ØĒØšØ°Øą ØĨØ˛Ø§ŲØŠ Ų
ŲØĒØ§Ø اŲŲ
ŲØĒØŦ",
|
||||
"failed_to_reset_pin_code": "ŲØ´Ų اؚاد؊ ØĒØšŲŲŲ ØąŲ
Ø˛ اŲPIN",
|
||||
"failed_to_stack_assets": "ŲØ´Ų ŲŲ ØĒŲØ¯ŲØŗ اŲŲ
ØØĒŲŲØ§ØĒ",
|
||||
"failed_to_unstack_assets": "ŲØ´Ų ŲŲ ŲØĩŲ Ø§ŲŲ
ØØĒŲŲØ§ØĒ",
|
||||
"failed_to_update_notification_status": "ŲØ´Ų ŲŲ ØĒØØ¯ŲØĢ ØØ§ŲØŠ Ø§ŲØĨØ´ØšØ§Øą",
|
||||
@@ -898,6 +925,7 @@
|
||||
"paths_validation_failed": "ŲØ´Ų ŲŲ Ø§ŲØĒØŲŲ Ų
Ų {paths, plural, one {# Ų
ØŗØ§Øą} other {# Ų
ØŗØ§ØąØ§ØĒ}}",
|
||||
"profile_picture_transparent_pixels": "ŲØ§ ŲŲ
ŲŲ ØŖŲ ØĒØØĒŲŲ ØĩŲØą Ø§ŲŲ
ŲŲ Ø§ŲØ´ØŽØĩŲ ØšŲŲ ØŖØŦØ˛Ø§ØĄ/Ø¨ŲØŗŲاØĒ Ø´ŲØ§ŲØŠ. ŲØąØŦŲ Ø§ŲØĒŲØ¨ŲØą Ų/ØŖŲ ØĒØØąŲŲ Ø§ŲØĩŲØąØŠ.",
|
||||
"quota_higher_than_disk_size": "ŲŲØ¯ ŲŲ
ØĒ بØĒØšŲŲŲ ØØĩØŠ ŲØŗØ¨ŲØŠ ØŖØšŲŲ Ų
Ų ØØŦŲ
اŲŲØąØĩ",
|
||||
"something_went_wrong": "ØØ¯ØĢ ØŽØˇØŖ Ų
ا",
|
||||
"unable_to_add_album_users": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ų
ØŗØĒ؎دŲ
ŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
",
|
||||
"unable_to_add_assets_to_shared_link": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ ØĨŲŲ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||
"unable_to_add_comment": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§ŲØĒØšŲŲŲ",
|
||||
@@ -983,13 +1011,11 @@
|
||||
},
|
||||
"exif": "Exif (ØĩŲØēØŠ Ų
ŲŲ ØĩŲØąŲ ŲØ§Ø¨Ų ŲŲØĒØ¨Ø§Ø¯Ų)",
|
||||
"exif_bottom_sheet_description": "اØļŲ ŲØĩŲØ§...",
|
||||
"exif_bottom_sheet_description_error": "ØŽØˇØŖ ŲŲ ØĒØØ¯ŲØĢ اŲŲØĩŲ",
|
||||
"exif_bottom_sheet_details": "ØĒŲØ§ØĩŲŲ",
|
||||
"exif_bottom_sheet_location": "Ų
ŲŲØš",
|
||||
"exif_bottom_sheet_people": "اŲŲØ§Øŗ",
|
||||
"exif_bottom_sheet_person_add_person": "اØļŲ Ø§ØŗŲ
ا",
|
||||
"exif_bottom_sheet_person_age_months": "Ø§ŲØšŲ
Øą {months} Ø§Ø´ŲØą",
|
||||
"exif_bottom_sheet_person_age_year_months": "Ø§ŲØšŲ
Øą ŲĄ ØŗŲØŠØ{months} Ø§Ø´ŲØą",
|
||||
"exif_bottom_sheet_person_age_years": "Ø§ŲØšŲ
Øą {years}",
|
||||
"exit_slideshow": "ØŽØąŲØŦ Ų
Ų Ø§ŲØšØąØļ Ø§ŲØĒŲØ¯ŲŲ
Ų",
|
||||
"expand_all": "ØĒŲØŗŲØš اŲŲŲ",
|
||||
"experimental_settings_new_asset_list_subtitle": "ØŖØšŲ
Ø§Ų ØŦØ§ØąŲØŠ",
|
||||
@@ -1031,11 +1057,13 @@
|
||||
"filter_people": "ØĒØĩŲŲØŠ Ø§ŲØ§Ø´ØŽØ§Øĩ",
|
||||
"filter_places": "ØĒØĩŲŲØŠ Ø§ŲØ§Ų
اŲŲ",
|
||||
"find_them_fast": "ŲŲ
ŲŲŲ Ø§ŲØšØĢŲØą ØšŲŲŲØ§ Ø¨ØŗØąØšØŠ Ø¨Ø§ŲØ§ØŗŲ
Ų
Ų ØŽŲØ§Ų Ø§ŲØ¨ØØĢ",
|
||||
"first": "Ø§ŲØ§ŲŲ",
|
||||
"fix_incorrect_match": "ØĨØĩŲØ§Ø اŲŲ
ØˇØ§Ø¨ŲØŠ ØēŲØą Ø§ŲØĩØŲØØŠ",
|
||||
"folder": "Ų
ØŦŲØ¯",
|
||||
"folder_not_found": "ŲŲ
ŲØĒŲ
Ø§ŲØšØĢŲØą ØšŲŲ Ø§ŲŲ
ØŦŲØ¯",
|
||||
"folders": "اŲŲ
ØŦŲØ¯Ø§ØĒ",
|
||||
"folders_feature_description": "ØĒØĩŲØ ØšØąØļ اŲŲ
ØŦŲØ¯ ŲŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ŲØŦŲØ¯ØŠ ØšŲŲ ŲØ¸Ø§Ų
اŲŲ
ŲŲØ§ØĒ",
|
||||
"forgot_pin_code_question": "ŲŲ ŲØŗŲØĒ ØąŲ
Ø˛ اŲPIN Ø§ŲØŽØ§Øĩ Ø¨ŲØ",
|
||||
"forward": "ØĨŲŲ Ø§ŲØŖŲ
اŲ
",
|
||||
"gcast_enabled": "ŲŲŲŲ ŲØ§ØŗØĒ",
|
||||
"gcast_enabled_description": "ØĒŲŲŲ
ŲØ°Ų اŲŲ
ŲØ˛ØŠ بØĒØŲ
ŲŲ Ø§ŲŲ
ŲØ§ØąØ¯ Ø§ŲØŽØ§ØąØŦŲØŠ Ų
Ų Google ØØĒŲ ØĒØšŲ
Ų.",
|
||||
@@ -1056,6 +1084,9 @@
|
||||
"haptic_feedback_switch": "ØĒŲ
ŲŲŲ ØąØ¯ŲØ¯ اŲŲØšŲ اŲŲŲ
ØŗŲØŠ",
|
||||
"haptic_feedback_title": "ØąØ¯ŲØ¯ ŲØšŲ ŲŲ
ØŗŲØŠ",
|
||||
"has_quota": "Ų
ØØ¯Ø¯ Ø¨ØØĩØŠ",
|
||||
"hash_asset": "ØšŲ
Ų Hash ŲŲØŖØĩŲ (ŲŲŲ
ŲŲ)",
|
||||
"hashed_assets": "ØŖØĩŲŲ (Ų
ŲŲØ§ØĒ) ØĒŲ
ØšŲ
Ų Hash ŲŲØ§",
|
||||
"hashing": "ŲØĒŲ
ØšŲ
Ų Hash",
|
||||
"header_settings_add_header_tip": "اØļØ§Ų ØąØ§Øŗ",
|
||||
"header_settings_field_validator_msg": "اŲŲŲŲ
ØŠ ŲØ§ ŲŲ
ŲŲ Ø§Ų ØĒŲŲŲ ŲØ§ØąØēØŠ",
|
||||
"header_settings_header_name_input": "Ø§ØŗŲ
Ø§ŲØąØŖØŗ",
|
||||
@@ -1069,9 +1100,9 @@
|
||||
"hide_password": "Ø§ØŽŲØ§ØĄ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||
"hide_person": "Ø§ØŽŲØ§ØĄ Ø§ŲØ´ØŽØĩ",
|
||||
"hide_unnamed_people": "ØĨØŽŲØ§ØĄ Ø§ŲØŖØ´ØŽØ§Øĩ بدŲŲ ØĨØŗŲ
",
|
||||
"home_page_add_to_album_conflicts": "ØĒŲ
ØĒ ØĨØļØ§ŲØŠ {ØĒŲ
ØĒ ØĨØļØ§ŲØŠ} Ø§ŲØŖØĩŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
{Ø§ŲØŖŲبŲŲ
}.{ŲØ´Ų} Ø§ŲØŖØĩŲŲ Ų
ŲØŦŲØ¯ØŠ باŲŲØšŲ ŲŲ Ø§ŲØŖŲبŲŲ
.",
|
||||
"home_page_add_to_album_conflicts": "ØĒŲ
ØĒ ØĨØļØ§ŲØŠ {added} ØŖØĩŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
{album}. {failed} ØŖØĩŲŲ Ų
ŲØŦŲØ¯ØŠ باŲŲØšŲ ŲŲ Ø§ŲØŖŲبŲŲ
.",
|
||||
"home_page_add_to_album_err_local": "ŲØ§ ŲŲ
ŲŲ ØĨØļØ§ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ØŲŲØŠ ØĨŲŲ Ø§ŲØŖŲبŲŲ
اØĒ ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||
"home_page_add_to_album_success": "ØĒŲ
ØĒ ØĨØļØ§ŲØŠ {ØĒŲ
ØĒ ØĨØļØ§ŲØŠ} Ø§ŲØŖØĩŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
{Ø§ŲØŖŲبŲŲ
}.",
|
||||
"home_page_add_to_album_success": "ØĒŲ
ØĒ ØĨØļØ§ŲØŠ {added} ØŖØĩŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
{album}.",
|
||||
"home_page_album_err_partner": "ŲØ§ ŲŲ
ŲŲ ØĨØļØ§ŲØŠ ØŖØĩŲŲ Ø´ØąŲŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||
"home_page_archive_err_local": "ŲØ§ ŲŲ
ŲŲ ØŖØąØ´ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ØŲŲØŠ ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||
"home_page_archive_err_partner": "ŲØ§ ŲŲ
ŲŲ ØŖØąØ´ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲØ´ØąŲŲØŠ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||
@@ -1087,7 +1118,9 @@
|
||||
"home_page_upload_err_limit": "ŲØ§ ŲŲ
ŲŲ ØĨŲØ§ ØĒØŲ
ŲŲ 30 ØŖØØ¯ Ø§ŲØŖØĩŲŲ ŲŲ ŲŲØĒ ŲØ§ØØ¯ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||
"host": "اŲŲ
ØļŲŲ",
|
||||
"hour": "ØŗØ§ØšØŠ",
|
||||
"hours": "ØŗØ§ØšØ§ØĒ",
|
||||
"id": "اŲŲ
ØšØąŲ",
|
||||
"idle": "؎اŲ
Ų",
|
||||
"ignore_icloud_photos": "ØĒØŦاŲŲ ØĩŲØą iCloud",
|
||||
"ignore_icloud_photos_description": "Ø§ŲØĩŲØą Ø§ŲŲ
ØŽØ˛ŲØŠ ŲŲ Cloud ŲŲ ŲØĒŲ
ØĒØŲ
ŲŲŲØ§ ØĨŲŲ ØŽØ§Ø¯Ų
Immich",
|
||||
"image": "ØĩŲØąØŠ",
|
||||
@@ -1145,10 +1178,13 @@
|
||||
"language_no_results_title": "ŲŲ
ŲØĒŲ
Ø§ŲØšØĢŲØą ØšŲŲ ŲØēØ§ØĒ",
|
||||
"language_search_hint": "Ø§ŲØ¨ØØĢ ØšŲ ŲØēØ§ØĒ...",
|
||||
"language_setting_description": "ا؎ØĒØą ŲØēØĒŲ Ø§ŲŲ
ŲØļŲØŠ",
|
||||
"large_files": "Ų
ŲŲØ§ØĒ ŲØ¨ŲØąØŠ",
|
||||
"last": "Ø§ŲØ§ØŽŲØą",
|
||||
"last_seen": "Ø§ØŽØą ظŲŲØą",
|
||||
"latest_version": "Ø§ØØ¯ØĢ اØĩØ¯Ø§Øą",
|
||||
"latitude": "ØŽØˇ Ø§ŲØšØąØļ",
|
||||
"leave": "Ų
ØēØ§Ø¯ØąØŠ",
|
||||
"leave_album": "اØĒØąŲ Ø§ŲØ§ŲبŲŲ
",
|
||||
"lens_model": "ŲŲ
ŲØ°ØŦ Ø§ŲØšØ¯ØŗØ§ØĒ",
|
||||
"let_others_respond": "دؚ Ø§ŲØĸØŽØąŲŲ ŲØŗØĒØŦŲØ¨ŲŲ",
|
||||
"level": "اŲŲ
ØŗØĒŲŲ",
|
||||
@@ -1160,7 +1196,9 @@
|
||||
"library_page_sort_created": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØ´Ø§ØĄ",
|
||||
"library_page_sort_last_modified": "ØĸØŽØą ØĒؚدŲŲ",
|
||||
"library_page_sort_title": "ØšŲŲØ§Ų Ø§ŲØŖŲبŲŲ
",
|
||||
"licenses": "ØąŲØŽŲØĩ",
|
||||
"light": "اŲŲ
ØļŲØĻ",
|
||||
"like": "اؚØŦاب",
|
||||
"like_deleted": "ØĒŲ
ØØ°Ų Ø§ŲØĨØšØŦاب",
|
||||
"link_motion_video": "ØąØ§Ø¨Øˇ ŲŲØ¯ŲŲ Ø§ŲØØąŲØŠ",
|
||||
"link_to_oauth": "Ø§ŲØąØ¨Øˇ Ų
Øš OAuth",
|
||||
@@ -1168,7 +1206,9 @@
|
||||
"list": "ŲØ§ØĻŲ
ØŠ",
|
||||
"loading": "ØĒØŲ
ŲŲ",
|
||||
"loading_search_results_failed": "ŲØ´Ų ØĒØŲ
ŲŲ ŲØĒØ§ØĻØŦ Ø§ŲØ¨ØØĢ",
|
||||
"local": "Ų
ØŲŲŲ",
|
||||
"local_asset_cast_failed": "ØēŲØą ŲØ§Ø¯Øą ØšŲŲ Ø¨ØĢ ØŖØĩŲ ŲŲ
ŲØĒŲ
ØĒØŲ
ŲŲŲ ØĨŲŲ Ø§ŲØŽØ§Ø¯Ų
",
|
||||
"local_assets": "ØŖŲØĩŲŲ (Ų
ŲŲØ§ØĒ) Ų
ØŲŲØŠ",
|
||||
"local_network": "Ø´Ø¨ŲØŠ Ų
ØŲŲØŠ",
|
||||
"local_network_sheet_info": "ØŗŲØĒØĩŲ Ø§ŲØĒØˇØ¨ŲŲ Ø¨Ø§ŲØŽØ§Ø¯Ų
Ų
Ų ØŽŲØ§Ų ØšŲŲØ§Ų URL ŲØ°Ø§ ØšŲØ¯ Ø§ØŗØĒ؎داŲ
Ø´Ø¨ŲØŠ Wi-Fi اŲŲ
ØØ¯Ø¯ØŠ",
|
||||
"location_permission": "Ø§Ø°Ų Ø§ŲŲ
ŲŲØš",
|
||||
@@ -1225,7 +1265,7 @@
|
||||
"manage_your_devices": "ØĨØ¯Ø§ØąØŠ Ø§ŲØŖØŦŲØ˛ØŠ Ø§ŲØĒŲ ØĒŲ
ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ ØĨŲŲŲØ§",
|
||||
"manage_your_oauth_connection": "ØĨØ¯Ø§ØąØŠ اØĒØĩØ§Ų OAuth Ø§ŲØŽØ§Øĩ بŲ",
|
||||
"map": "Ø§ŲØŽØąŲØˇØŠ",
|
||||
"map_assets_in_bounds": "{count} ØĩŲØą",
|
||||
"map_assets_in_bounds": "{count, plural, =0 {ŲØ§ŲŲØŦد ØĩŲØą ŲŲ ŲØ°Ų اŲŲ
ŲØˇŲØŠ} one {# ØĩŲØąØŠ} other {# ØĩŲØą}}",
|
||||
"map_cannot_get_user_location": "ŲØ§ ŲŲ
ŲŲ Ø§ŲØØĩŲŲ ØšŲŲ Ų
Ųب𠨧ŲŲ
ØŗØĒ؎دŲ
",
|
||||
"map_location_dialog_yes": "ŲØšŲ
",
|
||||
"map_location_picker_page_use_location": "Ø§ØŗØĒ؎دŲ
ŲØ°Ø§ اŲŲ
ŲŲØš",
|
||||
@@ -1233,7 +1273,6 @@
|
||||
"map_location_service_disabled_title": "؎دŲ
ØŠ اŲŲ
ŲŲØš Ų
ØšØˇŲ",
|
||||
"map_marker_for_images": "ØšŲØ§Ų
ØŠ Ø§ŲØŽØąŲØˇØŠ ŲŲØĩŲØą Ø§ŲŲ
ŲØĒŲØˇØŠ ŲŲ {city}Ø {country}",
|
||||
"map_marker_with_image": "ØšŲØ§Ų
ØŠ Ø§ŲØŽØąŲØˇØŠ Ų
Øš Ø§ŲØĩŲØąØŠ",
|
||||
"map_no_assets_in_bounds": "ŲØ§ ØĒŲØŦد ØĩŲØą ŲŲ ŲØ°Ø§ اŲŲ
ØŦاŲ",
|
||||
"map_no_location_permission_content": "ŲŲØ§Ų ØØ§ØŦØŠ ØĨŲŲ ØĨØ°Ų Ø§ŲŲ
ŲŲØš ŲØšØąØļ Ø§ŲØŖØĩŲŲ Ų
Ų Ų
ŲŲØšŲ Ø§ŲØØ§ŲŲ.ŲŲ ØĒØąŲØ¯ Ø§ŲØŗŲ
Ø§Ø Ø¨Ų Ø§ŲØĸŲØ",
|
||||
"map_no_location_permission_title": "ØĒŲ
ØąŲØļ ØĨØ°Ų Ø§ŲŲ
ŲŲØš",
|
||||
"map_settings": "ØĨؚداداØĒ Ø§ŲØŽØąŲØˇØŠ",
|
||||
@@ -1270,6 +1309,7 @@
|
||||
"merged_people_count": "دŲ
ØŦ {count, plural, one {Ø´ØŽØĩ ŲØ§ØØ¯} other {# ØŖØ´ØŽØ§Øĩ}}",
|
||||
"minimize": "ØĒØĩØēŲØą",
|
||||
"minute": "دŲŲŲØŠ",
|
||||
"minutes": "Ø¯ŲØ§ØĻŲ",
|
||||
"missing": "اŲŲ
ŲŲŲØ¯ØŠ",
|
||||
"model": "ŲŲ
ŲØ°ØŦ",
|
||||
"month": "Ø´ŲØą",
|
||||
@@ -1289,6 +1329,9 @@
|
||||
"my_albums": "ØŖŲØ¨ŲŲ
اØĒŲ",
|
||||
"name": "Ø§ŲØ§ØŗŲ
",
|
||||
"name_or_nickname": "Ø§ŲØ§ØŗŲ
ØŖŲ Ø§ŲŲŲØ¨",
|
||||
"network_requirement_photos_upload": "Ø§ØŗØĒ؎داŲ
Ø¨ŲØ§ŲاØĒ اŲŲØ§ØĒŲ Ø§ŲŲ
ØŲ
ŲŲ ŲØšŲ
Ų ŲØŗØŽØŠ Ø§ØØĒŲØ§ØˇŲØŠ ŲŲØĩŲØą",
|
||||
"network_requirement_videos_upload": "Ø§ØŗØĒ؎داŲ
Ø¨ŲØ§ŲاØĒ اŲŲØ§ØĒŲ Ø§ŲŲ
ØŲ
ŲŲ ŲØšŲ
Ų ŲØŗØŽØŠ Ø§ØØĒŲØ§ØˇŲØŠ ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ",
|
||||
"network_requirements_updated": "ØĒŲ
ØĒØēŲŲØą Ų
ØĒØˇŲØ¨Ø§ØĒ Ø§ŲØ´Ø¨ŲØŠØ ŲØĒŲ
ØĨؚاد؊ ØĒØšŲŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØĒØ¸Ø§Øą اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
||||
"networking_settings": "Ø§ŲØ´Ø¨ŲاØĒ",
|
||||
"networking_subtitle": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ŲŲØˇØŠ Ø§ŲØŽØ§Ø¯Ų
اŲŲŲØ§ØĻŲØŠ",
|
||||
"never": "ØŖØ¨Ø¯Ø§Ų",
|
||||
@@ -1324,6 +1367,7 @@
|
||||
"no_results": "ŲØ§ ŲŲØŦد ŲØĒØ§ØĻØŦ",
|
||||
"no_results_description": "ØŦØąØ¨ ŲŲŲ
ØŠ ØąØĻŲØŗŲØŠ Ų
ØąØ§Ø¯ŲØŠ ØŖŲ ØŖŲØĢØą ØšŲ
ŲŲ
ŲØŠ",
|
||||
"no_shared_albums_message": "ŲŲ
بØĨŲØ´Ø§ØĄ ØŖŲØ¨ŲŲ
ŲŲ
Ø´Ø§ØąŲØŠ Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ų
Øš Ø§ŲØŖØ´ØŽØ§Øĩ ŲŲ Ø´Ø¨ŲØĒŲ",
|
||||
"no_uploads_in_progress": "ŲØ§ ŲŲØŦد Ø§Ų Ų
ŲŲØ§ØĒ ŲŲØ¯ Ø§ŲØąŲØš",
|
||||
"not_in_any_album": "ŲŲØŗØĒ ŲŲ ØŖŲ ØŖŲØ¨ŲŲ
",
|
||||
"not_selected": "ŲŲ
ŲØŽØĒØ§Øą",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "Ų
ŲØ§ØØ¸ØŠ: ŲØĒØˇØ¨ŲŲ ØŗŲ
ØŠ Ø§ŲØĒØŽØ˛ŲŲ ØšŲŲ Ø§ŲŲ
ØØĒŲŲØ§ØĒ Ø§ŲØĒŲ ØĒŲ
ØąŲØšŲا Ų
ØŗØ¨ŲŲØ§Ø ŲŲ
بØĒØ´ØēŲŲ",
|
||||
@@ -1339,6 +1383,7 @@
|
||||
"oauth": "OAuth",
|
||||
"official_immich_resources": "اŲŲ
ŲØ§ØąØ¯ Ø§ŲØąØŗŲ
ŲØŠ ŲØ´ØąŲØŠ Immich",
|
||||
"offline": "ØēŲØą Ų
ØĒØĩŲ",
|
||||
"offset": "Ø§Ø˛Ø§ØØŠ",
|
||||
"ok": "ŲØšŲ
",
|
||||
"oldest_first": "Ø§ŲØŖŲدŲ
ØŖŲŲØ§",
|
||||
"on_this_device": "ØšŲŲ ŲØ°Ø§ Ø§ŲØŦŲØ§Ø˛",
|
||||
@@ -1361,6 +1406,7 @@
|
||||
"original": "ØŖØĩŲŲ",
|
||||
"other": "ØŖØŽØąŲ",
|
||||
"other_devices": "ØŖØŦŲØ˛ØŠ ØŖØŽØąŲ",
|
||||
"other_entities": "ŲŲØ§ŲاØĒ ØŖØŽØąŲ",
|
||||
"other_variables": "Ų
ØĒØēبਧØĒ ØŖØŽØąŲ",
|
||||
"owned": "Ų
Ų
ŲŲŲØŠ",
|
||||
"owner": "اŲŲ
اŲŲ",
|
||||
@@ -1415,7 +1461,10 @@
|
||||
"permission_onboarding_permission_limited": "ØĨØ°Ų Ų
ØØ¯Ųد. ŲŲØŗŲ
Ø§Ø Ø¨Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ ŲŲØĒØˇØ¨ŲŲ ŲØĨØ¯Ø§ØąØŠ Ų
ØŦŲ
ŲØšØŠ Ø§ŲŲ
ØšØąØļ باŲŲØ§Ų
ŲØ اŲ
ŲØ ØŖØ°ŲŲØ§ØĒ Ø§ŲØĩŲØą ŲØ§ŲŲŲØ¯ŲŲ ŲŲ Ø§ŲØĨؚداداØĒ.",
|
||||
"permission_onboarding_request": "ŲØĒØˇŲب Ø§ŲØĒØˇØ¨ŲŲ ØĨذŲŲØ§ ŲØšØąØļ Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲØŽØ§ØĩØŠ بŲ.",
|
||||
"person": "Ø´ØŽØĩ",
|
||||
"person_birthdate": "ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯ {Ø§ŲØĒØ§ØąŲØŽ}",
|
||||
"person_age_months": "{months, plural, one {# Ø´ŲØą} other {# Ø§Ø´ŲØą}} Ų
Ų Ø§ŲØšŲ
Øą",
|
||||
"person_age_year_months": "1 ؚاŲ
, {months, plural, one {# Ø´ŲØą} other {# Ø§Ø´ŲØą}} Ų
Ų Ø§ŲØšŲ
Øą",
|
||||
"person_age_years": "{years, plural, other {# Ø§ØšŲØ§Ų
}} Ų
Ų Ø§ŲØšŲ
Øą",
|
||||
"person_birthdate": "ŲŲØ¯ ŲŲ {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (Ų
ØŽŲŲ)} other {}}",
|
||||
"photo_shared_all_users": "ŲØ¨Ø¯Ų ØŖŲŲ Ø´Ø§ØąŲØĒ ØĩŲØąŲ Ų
Øš ØŦŲ
ب𠨧ŲŲ
ØŗØĒ؎دŲ
ŲŲ ØŖŲ ŲŲØŗ ŲØ¯ŲŲ ØŖŲ Ų
ØŗØĒ؎دŲ
ŲŲŲ
Ø´Ø§ØąŲØŠ Ų
ØšŲ.",
|
||||
"photos": "Ø§ŲØĩŲØą",
|
||||
@@ -1492,6 +1541,7 @@
|
||||
"purchase_server_description_2": "ØØ§ŲØŠ Ø§ŲØ¯Ø§ØšŲ
",
|
||||
"purchase_server_title": "Ø§ŲØŽØ§Ø¯Ų
",
|
||||
"purchase_settings_server_activated": "ŲØĒŲ
ØĨØ¯Ø§ØąØŠ Ų
ŲØĒØ§Ø Ų
ŲØĒØŦ Ø§ŲØŽØ§Ø¯Ų
Ų
Ų ŲØ¨Ų Ų
Ø¯ŲØą Ø§ŲŲØ¸Ø§Ų
",
|
||||
"queue_status": "ŲØĒŲ
Ø§ŲØ§ØļØ§ŲØŠ Ø§ŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØĒØ¸Ø§Øą اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ {count}/{total}",
|
||||
"rating": "ØĒŲŲŲŲ
ŲØŦŲ
Ų",
|
||||
"rating_clear": "Ų
ØŗØ Ø§ŲØĒŲŲŲŲ
",
|
||||
"rating_count": "{count, plural, one {# ŲØŦŲ
ØŠ} other {# ŲØŦŲŲ
}}",
|
||||
@@ -1520,6 +1570,8 @@
|
||||
"refreshing_faces": "ØŦØ§ØąŲ ØĒØØ¯ŲØĢ اŲŲØŦŲŲ",
|
||||
"refreshing_metadata": "ØŦØ§ØąŲ ØĒØØ¯ŲØĢ Ø§ŲØ¨ŲØ§ŲØ§ØĒ اŲŲØĩŲŲØŠ",
|
||||
"regenerating_thumbnails": "ØŦØ§ØąŲ ØĒØŦØ¯ŲØ¯ Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąØŠ",
|
||||
"remote": "Ø¨ØšŲØ¯",
|
||||
"remote_assets": "Ø§ŲØŖŲØĩŲŲ Ø§ŲØ¨ØšŲد؊",
|
||||
"remove": "ØĨØ˛Ø§ŲØŠ",
|
||||
"remove_assets_album_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {count, plural, one {# اŲŲ
ØØĒŲŲ} other {# اŲŲ
ØØĒŲŲØ§ØĒ}} Ų
Ų Ø§ŲØŖŲبŲŲ
Ø",
|
||||
"remove_assets_shared_link_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {count, plural, one {# اŲŲ
ØØĒŲŲ} other {# اŲŲ
ØØĒŲŲØ§ØĒ}} Ų
Ų ØąØ§Ø¨Øˇ اŲŲ
Ø´Ø§ØąŲØŠ ŲØ°Ø§Ø",
|
||||
@@ -1527,6 +1579,7 @@
|
||||
"remove_custom_date_range": "ØĨØ˛Ø§ŲØŠ Ø§ŲŲØˇØ§Ų Ø§ŲØ˛Ų
ŲŲ Ø§ŲŲ
ØŽØĩØĩ",
|
||||
"remove_deleted_assets": "ØĨØ˛Ø§ŲØŠ Ø§ŲŲ
ŲŲØ§ØĒ Ø§ŲØēŲØą Ų
ØĒØĩŲØŠ",
|
||||
"remove_from_album": "ØĨØ˛Ø§ŲØŠ Ų
Ų Ø§ŲØŖŲبŲŲ
",
|
||||
"remove_from_album_action_prompt": "ØĒŲ
Ø§Ø˛Ø§ŲØŠ {count} Ų
Ų Ø§ŲØ§ŲبŲŲ
",
|
||||
"remove_from_favorites": "ØĨØ˛Ø§ŲØŠ Ų
Ų Ø§ŲŲ
ŲØļŲØŠ",
|
||||
"remove_from_lock_folder_action_prompt": "{count} ØŖŲŲŲ Ų
Ų Ø§ŲŲ
ØŦŲØ¯ اŲŲ
ŲŲŲ",
|
||||
"remove_from_locked_folder": "Ø§Ø˛Ø§ŲØŠ Ų
Ų Ø§ŲŲ
ØŦŲØ¯ اŲŲ
ŲŲŲ",
|
||||
@@ -1556,19 +1609,28 @@
|
||||
"reset_password": "ØĨؚاد؊ ØĒØšŲŲŲ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||
"reset_people_visibility": "ØĨؚاد؊ ØļØ¨Øˇ ظŲŲØą Ø§ŲØŖØ´ØŽØ§Øĩ",
|
||||
"reset_pin_code": "اؚاد؊ ØĒØšŲŲŲ ØąŲ
Ø˛ PIN",
|
||||
"reset_pin_code_description": "اذا ŲØŗŲØĒ ØąŲ
Ø˛ اŲPIN Ø§ŲØŽØ§Øĩ Ø¨ŲØ باŲ
ŲØ§ŲŲ Ø§ŲØĒŲØ§ØĩŲ Ų
Øš Ų
Ø¯ŲØą Ø§Ų؎ادŲ
ŲØ¯ŲŲ ŲØ§ØšØ§Ø¯ØŠ ØĒØšŲŲŲŲ",
|
||||
"reset_pin_code_success": "ØĒŲ
اؚاد؊ ØĒØšŲŲŲ ØąŲ
Ø˛ اŲPIN Ø¨ŲØŦاØ",
|
||||
"reset_pin_code_with_password": "ŲŲ
ŲŲŲ Ø¯Ø§ØĻŲ
ا اؚاد؊ ØĒØšŲŲŲ ØąŲ
Ø˛ اŲPIN Ø§ŲØŽØ§Øĩ Ø¨Ų ØšŲ ØˇØąŲŲ ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§Ų؎اØĩØŠ بŲ",
|
||||
"reset_sqlite": "ØĨؚاد؊ ØĒØšŲŲŲ ŲØ§ØšØ¯ØŠ Ø¨ŲØ§ŲاØĒ SQLite",
|
||||
"reset_sqlite_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ Ų
Ų ØąØēبØĒŲ ŲŲ ØĨؚاد؊ ØļØ¨Øˇ ŲØ§ØšØ¯ØŠ Ø¨ŲØ§ŲاØĒ SQLiteØ ØŗØĒØØĒØ§ØŦ ØĨŲŲ ØĒØŗØŦŲŲ Ø§ŲØŽØąŲØŦ ØĢŲ
ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ Ų
ØąØŠ ØŖØŽØąŲ ŲØĨؚاد؊ Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||
"reset_sqlite_success": "ØĒŲ
ØĨؚاد؊ ØĒØšŲŲŲ ŲØ§ØšØ¯ØŠ Ø¨ŲØ§ŲاØĒ SQLite Ø¨ŲØŦاØ",
|
||||
"reset_to_default": "ØĨؚاد؊ Ø§ŲØĒØšŲŲŲ ØĨŲŲ Ø§ŲØ§ŲØĒØąØ§ØļŲ",
|
||||
"resolve_duplicates": "Ų
ØšØ§ŲØŦØŠ اŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
||||
"resolved_all_duplicates": "ØĒŲ
ØŲ ØŦŲ
ب𠨧بĒŲØąØ§ØąØ§ØĒ",
|
||||
"restore": "Ø§ŲØ§ØŗØĒØšØ§Ø¯Ų Ų
Ų ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||
"restore_all": "Ø§ØŗØĒؚاد؊ اŲŲŲ",
|
||||
"restore_trash_action_prompt": "ØĒŲ
Ø§ØŗØĒؚاد؊ {count} Ų
Ų Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||
"restore_user": "Ø§ØŗØĒؚاد؊ اŲŲ
ØŗØĒ؎دŲ
",
|
||||
"restored_asset": "اŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ØŗØĒؚاد؊",
|
||||
"resume": "Ø§ØŗØĒØĻŲØ§Ų",
|
||||
"retry_upload": "ØŖØšØ¯ Ų
ØØ§ŲŲØŠ Ø§ŲØąŲØš",
|
||||
"review_duplicates": "Ų
ØąØ§ØŦؚ؊ Ø§ŲØĒŲØąØ§ØąØ§ØĒ",
|
||||
"review_large_files": "Ų
ØąØ§ØŦؚ؊ اŲŲ
ŲŲØ§ØĒ اŲŲØ¨ŲØąØŠ",
|
||||
"role": "Ø§ŲØ¯ŲØą",
|
||||
"role_editor": "اŲŲ
ØØąØą",
|
||||
"role_viewer": "Ø§ŲØšØ§ØąØļ",
|
||||
"running": "ŲŲØ¯ Ø§ŲØĒØ´ØēŲŲ",
|
||||
"save": "ØŲظ",
|
||||
"save_to_gallery": "ØŲظ اŲŲ Ø§ŲŲ
ØšØąØļ",
|
||||
"saved_api_key": "ØĒŲ
ØŲظ Ų
ŲØĒØ§Ø اŲŲ API",
|
||||
@@ -1700,6 +1762,7 @@
|
||||
"settings_saved": "ØĒŲ
ØŲظ Ø§ŲØĨؚداداØĒ",
|
||||
"setup_pin_code": "ØĒØØ¯Ųد ØąŲ
Ø˛ PIN",
|
||||
"share": "Ų
Ø´Ø§ØąŲØŠ",
|
||||
"share_action_prompt": "ØĒŲ
Ų
Ø´Ø§ØąŲØŠ {count} ØŖØĩŲ (Ų
ŲŲ)",
|
||||
"share_add_photos": "ØĨØļØ§ŲØŠ Ø§ŲØĩŲØą",
|
||||
"share_assets_selected": "ا؎ØĒŲØ§Øą {count}",
|
||||
"share_dialog_preparing": "ØĒØØļŲØą...",
|
||||
@@ -1721,6 +1784,7 @@
|
||||
"shared_link_clipboard_copied_massage": "ŲØŗØŽ ØĨŲŲ Ø§ŲØØ§ŲØ¸ØŠ",
|
||||
"shared_link_clipboard_text": "ØąØ§Ø¨Øˇ: {link}\nŲŲŲ
ØŠ اŲŲ
ØąŲØą: {password}",
|
||||
"shared_link_create_error": "ØŽØˇØŖ ØŖØĢŲØ§ØĄ ØĨŲØ´Ø§ØĄ ØąØ§Ø¨Øˇ Ų
Ø´ØĒØąŲ",
|
||||
"shared_link_custom_url_description": "اŲŲØĩŲŲ ØĨŲŲ ŲØ°Ø§ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ Ø¨Ø§ØŗØĒ؎داŲ
ØšŲŲØ§Ų URL Ų
ØŽØĩØĩ",
|
||||
"shared_link_edit_description_hint": "ØŖØ¯ØŽŲ ŲØĩŲ Ø§ŲŲ
Ø´Ø§ØąŲØŠ",
|
||||
"shared_link_edit_expire_after_option_day": "ŲŲŲ
1",
|
||||
"shared_link_edit_expire_after_option_days": "{count} Ø§ŲØ§Ų
",
|
||||
@@ -1746,6 +1810,7 @@
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "ØĨØ¯Ø§ØąØŠ Ø§ŲØąŲØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲØŠ",
|
||||
"shared_link_options": "ØŽŲØ§ØąØ§ØĒ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||
"shared_link_password_description": "ØˇŲØ¨ ŲŲŲ
ØŠ Ų
ØąŲØą ŲŲŲØĩŲŲ ØĨŲŲ ŲØ°Ø§ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||
"shared_links": "ØąŲØ§Ø¨Øˇ Ų
Ø´ØĒØąŲØŠ",
|
||||
"shared_links_description": "ŲØĩŲ Ø§ŲØąŲØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲØŠ",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ŲØ´Ø§ØąŲŲØŠ.}}",
|
||||
@@ -1795,12 +1860,14 @@
|
||||
"sort_created": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØ´Ø§ØĄ",
|
||||
"sort_items": "ؚدد Ø§ŲØšŲاØĩØą",
|
||||
"sort_modified": "ØĒŲ
ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ",
|
||||
"sort_newest": "Ø§ØØ¯ØĢ ØĩŲØąØŠ",
|
||||
"sort_oldest": "ØŖŲØ¯Ų
ØĩŲØąØŠ",
|
||||
"sort_people_by_similarity": "ØąØĒب Ø§ŲØŖØ´ØŽØ§Øĩ ØØŗØ¨ Ø§ŲØĒØ´Ø§Ø¨Ų",
|
||||
"sort_recent": "ØŖØØ¯ØĢ ØĩŲØąØŠ",
|
||||
"sort_title": "Ø§ŲØšŲŲØ§Ų",
|
||||
"source": "اŲŲ
ØĩØ¯Øą",
|
||||
"stack": "ØĒØŦŲ
ŲØš",
|
||||
"stack_action_prompt": "{count} Ų
ŲØ¯ØŗØŠ",
|
||||
"stack_duplicates": "ØĒØŦŲ
ب𠨧ŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
||||
"stack_select_one_photo": "ØØ¯Ø¯ ØĩŲØąØŠ ØąØĻŲØŗŲØŠ ŲØ§ØØ¯ØŠ ŲŲŲ
ØŦŲ
ŲØšØŠ",
|
||||
"stack_selected_photos": "ŲØ¯Øŗ Ø§ŲØĩŲØą Ø§ŲŲ
ØØ¯Ø¯ØŠ",
|
||||
@@ -1820,6 +1887,7 @@
|
||||
"storage_quota": "ØØĩØŠ Ø§ŲØŽØ˛Ų",
|
||||
"storage_usage": "{used} Ų
Ų {available} Ų
ŲØŗØĒØŽŲØ¯Ų
",
|
||||
"submit": "ØĨØąØŗØ§Ų",
|
||||
"success": "ØĒŲ
Ø¨ŲØŦاØ",
|
||||
"suggestions": "Ø§ŲØĒØąØ§ØØ§ØĒ",
|
||||
"sunrise_on_the_beach": "Ø´ØąŲŲ Ø§ŲØ´Ų
Øŗ ØšŲŲ Ø§ŲØ´Ø§ØˇØĻ",
|
||||
"support": "Ø§ŲØ¯ØšŲ
",
|
||||
@@ -1829,6 +1897,8 @@
|
||||
"sync": "Ų
Ø˛Ø§Ų
ŲØŠ",
|
||||
"sync_albums": "Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲØ§ŲبŲŲ
اØĒ",
|
||||
"sync_albums_manual_subtitle": "Ų
Ø˛Ø§Ų
ŲØŠ ØŦŲ
ب𠨧ŲŲØ¯ŲŲŲØ§ØĒ ŲØ§ŲØĩŲØą Ø§ŲŲ
ØąŲŲØšØŠ Ø§ŲŲ Ø§ŲØ¨ŲŲ
اØĒ Ø§ŲØŽØ˛Ų Ø§ŲØ§ØØĒŲØ§ØˇŲ اŲŲ
ØŽØĒØ§ØąØŠ",
|
||||
"sync_local": "Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲŲ
ŲŲØ§ØĒ اŲŲ
ØŲŲØŠ",
|
||||
"sync_remote": "Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲŲ
ŲŲØ§ØĒ Ø§ŲØ¨ØšŲد؊",
|
||||
"sync_upload_album_setting_subtitle": "Ø§ŲØ´ØĻ Ų Ø§ØąŲØš ØĩŲØąŲ Ų ŲØ¯ŲŲŲØ§ØĒŲ Ø§ŲØ§ŲبŲŲ
اØĒ اŲŲ
ØŽØĒØ§ØąØŠ ŲŲ Immich",
|
||||
"tag": "Ø§ŲØšŲاŲ
ØŠ",
|
||||
"tag_assets": "ØŖØĩŲŲ Ø§ŲØšŲاŲ
ØŠ",
|
||||
@@ -1839,6 +1909,7 @@
|
||||
"tag_updated": "ØĒŲ
ØĒØØ¯ŲØĢ Ø§ŲØšŲاŲ
ØŠ: {tag}",
|
||||
"tagged_assets": "ØĒŲ
ŲØļØš ØšŲØ§Ų
ØŠ {count, plural, one {# asset} other {# assets}}",
|
||||
"tags": "Ø§ŲØšŲاŲ
اØĒ",
|
||||
"tap_to_run_job": "اŲŲØą ŲØĒØ´ØēŲŲ Ø§ŲŲ
ŲŲ
ØŠ",
|
||||
"template": "اŲŲŲ
ŲØ°ØŦ",
|
||||
"theme": "Ų
Ø¸ŲØą",
|
||||
"theme_selection": "ا؎ØĒŲØ§Øą Ø§ŲØŗŲ
ØŠ",
|
||||
@@ -1911,15 +1982,20 @@
|
||||
"unselect_all_duplicates": "ØĨŲØēØ§ØĄ ØĒØØ¯Ųد ŲØ§ŲØŠ اŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
||||
"unselect_all_in": "ØĨŲØēØ§ØĄ ØĒØØ¯Ųد اŲŲŲ ŲŲ {group}",
|
||||
"unstack": "ŲŲ Ø§ŲŲŲŲ
Ų",
|
||||
"unstack_action_prompt": "ØĒŲ
Ø§Ø˛Ø§ŲØŠ ØĒŲØ¯ŲØŗ {count}",
|
||||
"unstacked_assets_count": "ØĒŲ
ØĨØŽØąØ§ØŦ {count, plural, one {# Ø§ŲØŖØĩŲ} other {# Ø§ŲØŖØĩŲŲ}} Ų
Ų Ø§ŲØĒŲØ¯ŲØŗ",
|
||||
"untagged": "ØēŲØą Ų
ŲØšŲŲŲŲŲ
",
|
||||
"up_next": "Ø§ŲØĒØ§ŲŲ",
|
||||
"updated_at": "ØĒŲ
Ø§ŲØĒØØ¯ŲØĢ",
|
||||
"updated_password": "ØĒŲ
ØĒØØ¯ŲØĢ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||
"upload": "ØąŲØš",
|
||||
"upload_action_prompt": "{count} Ų
ŲŲ ŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØ§ŲØĒØ¸Ø§Øą ŲŲØąŲØš",
|
||||
"upload_concurrency": "Ø§ŲØąŲØš اŲŲ
ØĒØ˛Ø§Ų
Ų",
|
||||
"upload_details": "ØĒŲØ§ØĩŲŲ Ø§ŲØąŲØš",
|
||||
"upload_dialog_info": "ŲŲ ØĒØąŲØ¯ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ ŲŲØŖØĩŲŲ (Ø§ŲØŖØĩŲŲ) اŲŲ
ØØ¯Ø¯ØŠ ØĨŲŲ Ø§ŲØŽØ§Ø¯Ų
Ø",
|
||||
"upload_dialog_title": "ØĒØŲ
ŲŲ Ø§ŲØŖØĩŲŲ",
|
||||
"upload_errors": "ØĨŲØĒŲ
Ų Ø§ŲØąŲØš Ų
Øš {count, plural, one {# ØŽØˇØŖ} other {# ØŖØŽØˇØ§ØĄ}}, ŲŲ
بØĒØØ¯ŲØĢ Ø§ŲØĩŲØØŠ ŲØąØ¤ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ Ø§ŲØŦØ¯ŲØ¯ØŠ Ø§ŲØĒŲ ØĒŲ
ØąŲØšŲا.",
|
||||
"upload_finished": "ØĒŲ
Ø§ŲØ§ŲØĒŲØ§ØĄ Ų
Ų Ø§ŲØąŲØš",
|
||||
"upload_progress": "Ų
ØĒبŲŲØŠ {remaining, number} - Ų
ØšØ§ŲØŦØŠ {processed, number}/{total, number}",
|
||||
"upload_skipped_duplicates": "ØĒŲ
ØĒØŽØˇŲ {count, plural, one {# Ų
ØØĒŲŲ Ų
ŲØąØą} other {# Ų
ØØĒŲŲØ§ØĒ Ų
ŲØąØąØŠ }}",
|
||||
"upload_status_duplicates": "Ø§ŲØĒŲØąØ§ØąØ§ØĒ",
|
||||
@@ -1928,6 +2004,7 @@
|
||||
"upload_success": "ØĒŲ
Ø§ŲØąŲØš Ø¨ŲØŦØ§ØØ ŲŲ
بØĒØØ¯ŲØĢ Ø§ŲØĩŲØØŠ ŲØąØ¤ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ØąŲŲØšØŠ Ø§ŲØŦØ¯ŲØ¯ØŠ.",
|
||||
"upload_to_immich": "Ø§ŲØąŲØš اŲŲImmich â â ({count})",
|
||||
"uploading": "ØŦØ§ØąŲ Ø§ŲØąŲØš",
|
||||
"uploading_media": "ØąŲØš Ø§ŲŲØŗØ§ØĻØˇ",
|
||||
"url": "ØšŲŲØ§Ų URL",
|
||||
"usage": "Ø§ŲØ§ØŗØĒ؎داŲ
",
|
||||
"use_biometric": "Ø§ØŗØĒ؎دŲ
Ø§ŲØ¨Ø§ŲŲŲ
ØĒØąŲ",
|
||||
@@ -1948,6 +2025,7 @@
|
||||
"user_usage_stats_description": "ØšØąØļ ØĨØØĩاØĻŲØ§ØĒ Ø§ØŗØĒ؎داŲ
Ø§ŲØØŗØ§Ø¨",
|
||||
"username": "Ø§ØŗŲ
اŲŲ
ØŗØĒ؎دŲ
",
|
||||
"users": "اŲŲ
ØŗØĒ؎دŲ
ŲŲ",
|
||||
"users_added_to_album_count": "ØĒŲ
اØļØ§ŲØŠ{count, plural, one {# Ų
ØŗØĒ؎دŲ
} other {# Ų
ØŗØĒ؎دŲ
ŲŲ}} اŲŲ Ø§ŲØ§ŲبŲŲ
",
|
||||
"utilities": "ØŖØ¯ŲØ§ØĒ",
|
||||
"validate": "ØĒØŲŲŲ",
|
||||
"validate_endpoint_error": "Ø§ŲØąØŦØ§ØĄ Ø§Ø¯ØŽØ§Ų ØšŲŲØ§Ų URL ØĩØ§ŲØ",
|
||||
@@ -1966,6 +2044,7 @@
|
||||
"view_album": "ØšØąØļ Ø§ŲØŖŲبŲŲ
",
|
||||
"view_all": "ØšØąØļ اŲŲŲ",
|
||||
"view_all_users": "ØšØąØļ ŲØ§ŲØŠ اŲŲ
ØŗØĒ؎دŲ
ŲŲ",
|
||||
"view_details": "ØąØ¤ŲØŠ Ø§ŲØĒŲØ§ØĩŲŲ",
|
||||
"view_in_timeline": "ØšØąØļ ŲŲ Ø§ŲØŦدŲŲ Ø§ŲØ˛Ų
ŲŲ",
|
||||
"view_link": "ØšØąØļ Ø§ŲØąØ§Ø¨Øˇ",
|
||||
"view_links": "ØšØąØļ Ø§ŲØąŲØ§Ø¨Øˇ",
|
||||
|
||||
29
i18n/az.json
29
i18n/az.json
@@ -1,37 +1,53 @@
|
||||
{
|
||||
"about": "Haqqinda",
|
||||
"about": "HaqqÄąnda",
|
||||
"account": "Hesab",
|
||||
"account_settings": "Hesab parametrlÉri",
|
||||
"acknowledge": "TÉsdiq et",
|
||||
"action": "ÆmÉliyyat",
|
||||
"action_common_update": "YenilÉ",
|
||||
"actions": "ÆmÉliyyatlar",
|
||||
"active": "Aktiv",
|
||||
"activity": "FÉaliyyÉt",
|
||||
"activity_changed": "FÉaliyyÉt {enabled, select, true {aktivdir} other {aktiv deyil}}",
|
||||
"add": "ÆlavÉ et",
|
||||
"add_a_description": "TÉsviri ÉlavÉ et",
|
||||
"add_a_location": "MÉkan ÉlavÉ et",
|
||||
"add_a_name": "Ad ÉlavÉ et",
|
||||
"add_a_title": "BaÅlÄąq ÉlavÉ et",
|
||||
"add_birthday": "DoÄum gÃŧnÃŧ ÉlavÉ et",
|
||||
"add_endpoint": "Son nÃļqtÉ ÉlavÉ et",
|
||||
"add_exclusion_pattern": "İstisna nÃŧmunÉsi ÉlavÉ et",
|
||||
"add_import_path": "Import yolunu ÉlavÉ et",
|
||||
"add_location": "MÉkanÄą ÉlavÉ et",
|
||||
"add_location": "MÉkan ÉlavÉ et",
|
||||
"add_more_users": "Daha çox istifadÉçi ÉlavÉ et",
|
||||
"add_partner": "Partnyor ÉlavÉ et",
|
||||
"add_path": "Yol ÉlavÉ et",
|
||||
"add_photos": "ÅÉkillÉri ÉlavÉ et",
|
||||
"add_to": "... ÉlavÉ et",
|
||||
"add_photos": "ÅÉkillÉr ÉlavÉ et",
|
||||
"add_tag": "Etiket ÉlavÉ et",
|
||||
"add_to": "Bura ÉlavÉ etâĻ",
|
||||
"add_to_album": "Albom ÉlavÉ et",
|
||||
"add_to_album_bottom_sheet_added": "{album} albomuna ÉlavÉ edildi",
|
||||
"add_to_album_bottom_sheet_already_exists": "ArtÄąq {album} albomunda var",
|
||||
"add_to_album_toggle": "{album} ÃŧçÃŧn seçimi dÉyiÅin",
|
||||
"add_to_albums": "Albomlara ÉlavÉ et",
|
||||
"add_to_albums_count": "Albomlara ÉlavÉ et ({count})",
|
||||
"add_to_shared_album": "PaylaÅÄąlan alboma ÉlavÉ et",
|
||||
"add_url": "URL ÉlavÉ et",
|
||||
"added_to_archive": "ArxivÉ ÉlavÉ edildi",
|
||||
"added_to_favorites": "SevimlilÉlÉrÉ ÉlavÉ edildi",
|
||||
"added_to_favorites_count": "{count, number} ÅÉkil sevimlilÉlÉrÉ ÉlavÉ edildi",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "İstisna ÅablonlarÄąnÄą ÉlavÉ edin. *, ** vÉ ? ilÉ Globbing dÉstÉklÉnir. MÉs.: \"Raw\" adlanan hÉr hansÄąsa bir qovluqda bÃŧtÃŧn fayllarÄą saymamaq ÃŧçÃŧn \"**/Raw/**\"-dan istifadÉ edin. \".tif\" ilÉ bitÉn bÃŧtÃŧn fayllarÄą saymamaq ÃŧçÃŧn \"**/*.tif\"-dÉn istifadÉ edin. FaylÄą mÃŧtlÉq yoldan istifadÉ etmÉklÉ saymamaq istÉyirsinizsÉ \"/path/to/ignore/**\"-dan istifadÉ edin.",
|
||||
"admin_user": "Admin İstifadÉçi",
|
||||
"asset_offline_description": "Bu xarici kitabxana varlÄąÄÄą diskdÉ artÄąq tapÄąlmadÄą vÉ zibil qutusuna kÃļçÃŧrÃŧldÃŧ. ÆgÉr fayl kitabxana içÉrisindÉ kÃļçÃŧrÃŧlÃŧbsÉ, zaman ÅkalanÄązÄą yeni uyÄun gÉlÉn varlÄąq ÃŧçÃŧn yoxlayÄąn. VarlÄąÄÄą yenidÉn qaytarmaq ÃŧçÃŧn aÅaÄÄąda verilmiÅ fayl yolunun Immich tÉrÉfindÉn Élçatan olduÄundan Émin olduqdan sonra kitabxananÄą skan edin.",
|
||||
"authentication_settings": "SÉlahiyyÉtlÉndirmÉ parametrlÉri",
|
||||
"authentication_settings_description": "ÅifrÉ, OAuth vÉ digÉr sÉlahiyyÉtlÉndirmÉ parametrlÉri",
|
||||
"authentication_settings_disable_all": "BÃŧtÃŧn giriÅ etmÉ metodlarÄąnÄą sÃļndÃŧrmÉk istÉdiyinizdÉn Éminsinizmi? GiriÅ etmÉ funksiyasÄą tamamilÉ sÃļndÃŧrÃŧlÉcÉkdir.",
|
||||
"authentication_settings_reenable": "YenidÉn aktiv etmÉk ÃŧçÃŧn <link> Server Æmri</link> -ni istifadÉ edin.",
|
||||
"background_task_job": "Arxa plan tapÅÄąrÄąqlarÄą",
|
||||
"backup_database_enable_description": "VerilÉnlÉr bazasÄąnÄąn ehtiyat nÃŧsxÉlÉrini aktiv et",
|
||||
"backup_database": "VerilÉnlÉr bazasÄąnÄąn dump-ÄąnÄą yaradÄąn",
|
||||
"backup_database_enable_description": "VerilÉnlÉr bazasÄąnÄąn artÄąq nÃŧsxÉlÉrini aktiv et",
|
||||
"backup_keep_last_amount": "TutulmasÄą gÉrÉkÉn nÃŧsxÉlÉrin sayÄą",
|
||||
"backup_settings": "Ehtiyat NÃŧsxÉ ParametrlÉri",
|
||||
"backup_settings_description": "VerilÉnlÉr bazasÄąnÄąn ehtiyat nÃŧsxÉ parametrlÉrini idarÉ et",
|
||||
"config_set_by_file": "Konfiqurasiya hal-hazÄąrda konfiqurasiya faylÄą ilÉ tÉyin olunub",
|
||||
@@ -84,5 +100,6 @@
|
||||
"machine_learning_facial_recognition": "Ãz TanÄąma",
|
||||
"machine_learning_facial_recognition_description": "ÅÉkillÉrdÉki ÃŧzlÉri aÅkarla, tanÄą vÉ qruplaÅdÄąr",
|
||||
"machine_learning_facial_recognition_model": "Ãz tanÄąma modeli"
|
||||
}
|
||||
},
|
||||
"timeline": "Zaman ÅkalasÄą"
|
||||
}
|
||||
|
||||
53
i18n/be.json
53
i18n/be.json
@@ -14,6 +14,7 @@
|
||||
"add_a_location": "ĐадаŅŅ ĐŧĐĩŅŅа",
|
||||
"add_a_name": "ĐадаŅŅ ŅĐŧŅ",
|
||||
"add_a_title": "ĐадаŅŅ ĐˇĐ°ĐŗĐ°ĐģОваĐē",
|
||||
"add_birthday": "ĐадаŅŅ Đ´ĐˇĐĩĐŊŅ ĐŊаŅадĐļŅĐŊĐŊŅ",
|
||||
"add_endpoint": "ĐадаŅŅ ĐēŅĐžĐŋĐēŅ Đ´ĐžŅŅŅĐŋŅ",
|
||||
"add_exclusion_pattern": "ĐадаŅŅ ŅайĐģĐžĐŊ вŅĐēĐģŅŅŅĐŊĐŊŅ",
|
||||
"add_import_path": "ĐадаŅŅ ŅĐģŅŅ
ŅĐŧĐŋаŅŅŅ",
|
||||
@@ -27,6 +28,8 @@
|
||||
"add_to_album": "ĐадаŅŅ Ņ Đ°ĐģŅйОĐŧ",
|
||||
"add_to_album_bottom_sheet_added": "ĐададСĐĩĐŊа да {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "ĐŖĐļĐž СĐŊаŅ
ОдСŅŅŅа Ņ {album}",
|
||||
"add_to_albums": "ĐадаŅŅ Ņ Đ°ĐģŅйОĐŧŅ",
|
||||
"add_to_albums_count": "ĐадаŅŅ Ņ Đ°ĐģŅйОĐŧŅ ({count})",
|
||||
"add_to_shared_album": "ĐадаŅŅ Ņ Đ°ĐŗŅĐģŅĐŊŅ Đ°ĐģŅйОĐŧ",
|
||||
"add_url": "ĐадаŅŅ URL",
|
||||
"added_to_archive": "ĐададСĐĩĐŊа Ņ Đ°ŅŅ
ŅŅ",
|
||||
@@ -44,6 +47,10 @@
|
||||
"backup_database": "ĐĄŅваŅŅŅŅ ŅŅСĐĩŅвОвŅŅ ĐēĐžĐŋŅŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
",
|
||||
"backup_database_enable_description": "ĐŖĐēĐģŅŅŅŅŅ ŅŅСĐĩŅваваĐŊĐŊĐĩ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
",
|
||||
"backup_keep_last_amount": "ĐĐžĐģŅĐēаŅŅŅ ĐŋаĐŋŅŅŅĐ´ĐŊŅŅ
ŅŅСĐĩŅвОвŅŅ
ĐēĐžĐŋŅĐš Đ´ĐģŅ ĐˇĐ°Ņ
аваĐŊĐŊŅ",
|
||||
"backup_onboarding_1_description": "СĐŊŅŅĐŊŅŅ ĐēĐžĐŋŅŅ Ņ Đ˛ĐžĐąĐģаĐēŅ Đ°ĐąĐž Ņ ŅĐŊŅŅĐŧ ŅŅСŅŅĐŊŅĐŧ ĐŧĐĩŅŅŅ.",
|
||||
"backup_onboarding_2_description": "ĐģаĐēаĐģŅĐŊŅŅ ĐēĐžĐŋŅŅ ĐŊа ŅĐŊŅŅŅ
ĐŋŅŅĐģадаŅ
. ĐŅŅа ŅĐēĐģŅŅаĐĩ Ņ ŅŅĐąĐĩ аŅĐŊĐžŅĐŊŅŅ ŅаКĐģŅ Ņ ĐģаĐēаĐģŅĐŊŅŅ ŅŅСĐĩŅвОвŅŅ ĐēĐžĐŋŅŅ ĐŗŅŅŅŅ
ŅаКĐģаŅ.",
|
||||
"backup_onboarding_parts_title": "Đ ŅСĐĩŅĐ˛ĐžĐ˛Đ°Ņ ĐēĐžĐŋŅŅ ÂĢ3-2-1Âģ ŅĐēĐģŅŅаĐĩ Ņ ŅŅĐąĐĩ:",
|
||||
"backup_onboarding_title": "Đ ŅСĐĩŅвОвŅŅ ĐēĐžĐŋŅŅ",
|
||||
"backup_settings": "ĐаĐģĐ°Đ´Ņ ŅŅСĐĩŅĐ˛ĐžĐ˛Đ°ĐŗĐ° ĐēаĐŋŅŅваĐŊĐŊŅ",
|
||||
"backup_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ŅŅСĐĩŅваваĐŊĐŊŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
.",
|
||||
"cleared_jobs": "ĐŅŅŅŅаĐŊŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ Đ´ĐģŅ: {job}",
|
||||
@@ -56,14 +63,14 @@
|
||||
"confirm_user_pin_code_reset": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ Ņ ŅŅĐŧ, ŅŅĐž ĐļадаĐĩŅĐĩ ŅĐēŅĐŊŅŅŅ PIN-ĐēОд {user}?",
|
||||
"create_job": "ĐĄŅваŅŅŅŅ ĐˇĐ°Đ´Đ°ĐŊĐŊĐĩ",
|
||||
"cron_expression": "ĐŅŅаС Cron",
|
||||
"cron_expression_description": "ĐŖŅŅаĐģŅĐšŅĐĩ ŅĐŊŅŅŅваĐģ ŅĐēаĐŊаваĐŊĐŊŅ, вŅĐēаŅŅŅŅĐžŅваŅŅŅ ŅаŅĐŧĐ°Ņ cron. ĐĐģŅ Đ°ŅŅŅĐŧаĐŊĐŊŅ Đ´Đ°Đ´Đ°ŅĐēОваК ŅĐŊŅаŅĐŧаŅŅŅ, ĐēаĐģŅ ĐģаŅĐēа, СвŅŅĐŊŅŅĐĩŅŅ, ĐŊаĐŋŅŅĐēĐģад, да <link>Crontab Guru</link>",
|
||||
"cron_expression_description": "ĐадаКŅĐĩ ŅĐŊŅŅŅваĐģ ŅĐēаĐŊаваĐŊĐŊŅ, вŅĐēаŅŅŅŅĐžŅваŅŅŅ ŅаŅĐŧĐ°Ņ cron. ĐĐģŅ Đ°ŅŅŅĐŧаĐŊĐŊŅ Đ´Đ°Đ´Đ°ŅĐēОваК ŅĐŊŅаŅĐŧаŅŅŅ, СвŅŅĐŊŅŅĐĩŅŅ, ĐŊаĐŋŅŅĐēĐģад, да <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "ĐŅадŅŅŅаĐŊĐžŅĐēŅ Đ˛ŅŅĐ°ĐˇĐ°Ņ Cron",
|
||||
"disable_login": "ĐĐ´ĐēĐģŅŅŅŅŅ ŅваŅ
Од",
|
||||
"duplicate_detection_job_description": "ĐаĐŋŅŅŅŅŅŅ ĐŧаŅŅĐŊĐŊаĐĩ ĐŊавŅŅаĐŊĐŊĐĩ ĐŊа аĐēŅŅваŅ
Đ´ĐģŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ĐŋадОйĐŊŅŅ
вŅŅŅ. ĐаĐģĐĩĐļŅŅŅ Đ°Đ´ Smart Search",
|
||||
"exclusion_pattern_description": "ШайĐģĐžĐŊŅ Đ˛ŅĐēĐģŅŅŅĐŊĐŊŅ Đ´Đ°ĐˇĐ˛Đ°ĐģŅŅŅŅ ŅĐŗĐŊаŅаваŅŅ ŅаКĐģŅ Ņ ĐŋаĐŋĐēŅ ĐŋŅŅ ŅĐēаĐŊаваĐŊĐŊŅ Đ˛Đ°ŅаК ĐąŅĐąĐģŅŅŅŅĐēŅ. ĐŅŅа ĐēаŅŅŅĐŊа, ĐēаĐģŅ Ņ Đ˛Đ°Ņ ŅŅŅŅ ĐŋаĐŋĐēŅ, ŅĐēŅŅ ĐˇĐŧŅŅŅаŅŅŅ ŅаКĐģŅ, ŅĐēŅŅ Đ˛Ņ ĐŊĐĩ Ņ
ĐžŅаŅĐĩ ŅĐŧĐŋаŅŅаваŅŅ, ĐŊаĐŋŅŅĐēĐģад, ŅаКĐģŅ RAW.",
|
||||
"external_library_management": "ĐŅŅаваĐŊĐŊĐĩ СĐŊĐĩŅĐŊŅĐš ĐąŅĐąĐģŅŅŅŅĐēаК",
|
||||
"face_detection": "ĐŅŅŅĐģĐĩĐŊĐŊĐĩ ŅваŅаŅ",
|
||||
"face_detection_description": "ĐŅŅŅĐģŅŅŅ ŅваŅŅ ĐŊа ŅĐžŅаСдŅĐŧĐēаŅ
Ņ Đ˛ŅĐ´Ņа С даĐŋаĐŧĐžĐŗĐ°Đš ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ. ĐĐģŅ Đ˛ŅĐ´Ņа ŅĐģŅŅваĐĩŅŅа ŅĐžĐģŅĐēŅ ĐŧŅĐŊŅŅŅŅŅа. \"ĐĐąĐŊавŅŅŅ\" (ĐŋĐĩŅа)аĐŋŅаŅĐžŅваĐĩ ŅŅĐĩ ĐŧĐĩĐ´ŅŅ. \"ĐĄĐēŅĐŊŅŅŅ\" дадаŅĐēОва аŅŅŅŅаĐĩ ŅŅĐĩ ĐąŅĐŗŅŅŅŅ Đ´Đ°Đ´ĐˇĐĩĐŊŅŅ ĐŋŅа ŅваŅŅ. \"ĐĐ´ŅŅŅĐŊŅŅаĐĩ\" ŅŅавŅŅŅ Ņ ŅаŅĐŗŅ ĐŧĐĩĐ´ŅŅ, ŅĐēŅŅ ŅŅŅŅ ĐŊĐĩ ĐąŅĐģŅ Đ°ĐŋŅаŅаваĐŊŅŅ. ĐŅŅŅĐģĐĩĐŊŅŅ ŅваŅŅ ĐąŅĐ´ŅŅŅ ĐŋаŅŅаŅĐģĐĩĐŊŅ Ņ ŅаŅĐŗŅ Đ´ĐģŅ ŅаŅĐŋаСĐŊаваĐŊĐŊŅ Đ°ŅОй ĐŋаŅĐģŅ ĐˇĐ°Đ˛ŅŅŅŅĐŊĐŊŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ŅваŅаŅ, С ĐŗŅŅĐŋаваĐŊĐŊĐĩĐŧ ŅŅ
Đŋа ŅŅĐŊŅŅŅŅŅ
айО ĐŊОвŅŅ
ĐģŅдСŅŅ
.",
|
||||
"face_detection_description": "ĐŅŅŅĐģŅŅŅ ŅваŅŅ ĐŊа ŅĐžŅаСдŅĐŧĐēаŅ
Ņ Đ˛ŅĐ´Ņа С даĐŋаĐŧĐžĐŗĐ°Đš ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ. ĐĐģŅ Đ˛ŅĐ´Ņа ŅĐģŅŅваĐĩŅŅа ŅĐžĐģŅĐēŅ ĐŧŅĐŊŅŅŅŅŅа. \"ĐĐąĐŊавŅŅŅ\" (ĐŋĐĩŅа)аĐŋŅаŅĐžŅваĐĩ ŅŅĐĩ ĐŧĐĩĐ´ŅŅ. \"ĐĄĐēŅĐŊŅŅŅ\" дадаŅĐēОва аŅŅŅŅаĐĩ ŅŅĐĩ ĐąŅĐŗŅŅŅŅ Đ´Đ°ĐŊŅŅ ĐŋŅа ŅваŅŅ. \"ĐĐ´ŅŅŅĐŊŅŅаĐĩ\" ŅŅавŅŅŅ Ņ ŅаŅĐŗŅ ĐŧĐĩĐ´ŅŅ, ŅĐēŅŅ ŅŅŅŅ ĐŊĐĩ ĐąŅĐģŅ Đ°ĐŋŅаŅаваĐŊŅŅ. ĐŅŅŅĐģĐĩĐŊŅŅ ŅваŅŅ ĐąŅĐ´ŅŅŅ ĐŋаŅŅаŅĐģĐĩĐŊŅ Ņ ŅаŅĐŗŅ Đ´ĐģŅ ŅаŅĐŋаСĐŊаваĐŊĐŊŅ Đ°ŅОй ĐŋаŅĐģŅ ĐˇĐ°Đ˛ŅŅŅŅĐŊĐŊŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ŅваŅаŅ, С ĐŗŅŅĐŋаваĐŊĐŊĐĩĐŧ ŅŅ
Đŋа ŅŅĐŊŅŅŅŅŅ
айО ĐŊОвŅŅ
ĐģŅдСŅŅ
.",
|
||||
"facial_recognition_job_description": "ĐŅŅĐŋаваŅŅ Đ˛ŅŅŅĐģĐĩĐŊŅŅ ŅваŅŅ Đŋа аŅОйаŅ
. ĐŅŅŅ ŅŅаĐŋ вŅĐēĐžĐŊваĐĩŅŅа ĐŋаŅĐģŅ ĐˇĐ°Đ˛ŅŅŅŅĐŊĐŊŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ŅваŅаŅ. \"ĐĄĐēŅĐŊŅŅŅ\" (ĐŋаŅŅĐžŅĐŊа) ĐŋĐĩŅĐ°ĐŗŅŅĐŋĐžŅваĐĩ ŅŅĐĩ ŅваŅŅ. \"ĐĐ´ŅŅŅĐŊŅŅаĐĩ\" ŅŅавŅŅŅ Ņ ŅаŅĐŗŅ ŅваŅŅ, ŅĐēŅŅ ŅŅŅŅ ĐŊĐĩ ĐŋŅŅĐŋŅŅаĐŊŅŅ Đ´Đ° ŅĐēОК-ĐŊĐĩĐąŅĐ´ĐˇŅ Đ°ŅОйŅ.",
|
||||
"failed_job_command": "ĐаĐŧаĐŊда {command} ĐŊĐĩ вŅĐēаĐŊаĐģаŅŅ Đ´ĐģŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ: {job}",
|
||||
"force_delete_user_warning": "ĐĐĐĐ¯Đ ĐĐĐĐĐĐĐ: ĐŅŅа дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩадĐēĐģадĐŊа вŅдаĐģŅŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа Ņ ŅŅĐĩ ай'ĐĩĐēŅŅ. ĐŅŅа дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩ ĐŧĐžĐļа ĐąŅŅŅ Đ°Đ´ŅОйĐģĐĩĐŊа Ņ ŅаКĐģŅ ĐŊĐĩĐŧĐ°ĐŗŅŅĐŧа ĐąŅдСĐĩ адĐŊавŅŅŅ.",
|
||||
@@ -75,17 +82,39 @@
|
||||
"image_fullsize_quality_description": "Đ¯ĐēаŅŅŅ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ Đ°Đ´ 1 да 100. ĐĐžĐģŅŅ Đ˛ŅŅĐžĐēаĐĩ СĐŊаŅŅĐŊĐŊĐĩ ĐģĐĩĐŋŅаĐĩ, аĐģĐĩ ĐŋŅŅвОдСŅŅŅ Đ´Đ° ĐŋавĐĩĐģŅŅŅĐŊĐŊŅ ĐŋаĐŧĐĩŅŅ ŅаКĐģа.",
|
||||
"image_fullsize_title": "ĐаĐģĐ°Đ´Ņ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ",
|
||||
"image_prefer_embedded_preview": "ĐддаваŅŅ ĐŋĐĩŅĐ°Đ˛Đ°ĐŗŅ ŅĐąŅдаваĐŊаК ĐŋŅаŅвĐĩ",
|
||||
"image_prefer_embedded_preview_setting_description": "ĐŅĐēаŅŅŅŅĐžŅваŅŅ ŅĐąŅдаваĐŊŅŅ ĐŋŅаŅĐ˛Ņ Ņ RAW-ŅĐžŅаСдŅĐŧĐēаŅ
Ņ ŅĐēаŅŅŅ ŅваŅ
ОдĐŊŅŅ
дадСĐĩĐŊŅŅ
Đ´ĐģŅ Đ°ĐŋŅаŅĐžŅĐēŅ ĐŧаĐģŅĐŊĐēаŅ, ĐēаĐģŅ ĐŧĐ°ĐŗŅŅĐŧа. ĐŅŅа даСваĐģŅĐĩ аŅŅŅĐŧаŅŅ ĐąĐžĐģŅŅ Đ´Đ°ĐēĐģадĐŊŅŅ ĐēĐžĐģĐĩŅŅ Đ´ĐģŅ ĐŊĐĩĐēаŅĐžŅŅŅ
вŅдаŅŅŅаŅ, аĐģĐĩ Đļ ŅĐēаŅŅŅ ĐŋŅаŅŅ ĐˇĐ°ĐģĐĩĐļŅŅŅ Đ°Đ´ ĐēаĐŧĐĩŅŅ, Ņ ĐŊа вŅдаŅŅŅĐĩ ĐŧĐžĐļа ĐąŅŅŅ ĐąĐžĐģŅŅ Đ°ŅŅŅŅаĐēŅĐ°Ņ ŅŅŅŅĐēŅ.",
|
||||
"image_prefer_embedded_preview_setting_description": "ĐŅĐēаŅŅŅŅĐžŅваŅŅ ŅĐąŅдаваĐŊŅŅ ĐŋŅаŅĐ˛Ņ Ņ RAW-ŅĐžŅаСдŅĐŧĐēаŅ
Ņ ŅĐēаŅŅŅ ŅваŅ
ОдĐŊŅŅ
даĐŊŅŅ
Đ´ĐģŅ Đ°ĐŋŅаŅĐžŅĐēŅ ĐŧаĐģŅĐŊĐēаŅ, ĐēаĐģŅ ĐŧĐ°ĐŗŅŅĐŧа. ĐŅŅа даСваĐģŅĐĩ аŅŅŅĐŧаŅŅ ĐąĐžĐģŅŅ Đ´Đ°ĐēĐģадĐŊŅŅ ĐēĐžĐģĐĩŅŅ Đ´ĐģŅ ĐŊĐĩĐēаŅĐžŅŅŅ
вŅдаŅŅŅаŅ, аĐģĐĩ Đļ ŅĐēаŅŅŅ ĐŋŅаŅŅ ĐˇĐ°ĐģĐĩĐļŅŅŅ Đ°Đ´ ĐēаĐŧĐĩŅŅ, Ņ ĐŊа вŅдаŅŅŅĐĩ ĐŧĐžĐļа ĐąŅŅŅ ĐąĐžĐģŅŅ Đ°ŅŅŅŅаĐēŅĐ°Ņ ŅŅŅŅĐēŅ.",
|
||||
"image_prefer_wide_gamut": "ĐддаŅŅ ĐŋĐĩŅĐ°Đ˛Đ°ĐŗŅ ŅŅŅĐžĐēаК ĐŗĐ°ĐŧĐĩ",
|
||||
"image_preview_description": "ĐŅдаŅŅŅ ŅŅŅŅĐ´ĐŊŅĐŗĐ° ĐŋаĐŧĐĩŅŅ Đˇ вŅдаĐģĐĩĐŊŅĐŧŅ ĐŧĐĩŅададСĐĩĐŊŅĐŧŅ, вŅĐēаŅŅŅŅĐžŅваĐĩŅŅа ĐŋŅŅ ĐŋŅĐ°ĐŗĐģŅдСĐĩ аŅОйĐŊĐ°ĐŗĐ° ŅŅŅŅŅŅŅ Ņ Đ´ĐģŅ ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ",
|
||||
"image_preview_description": "ĐŅдаŅŅŅ ŅŅŅŅĐ´ĐŊŅĐŗĐ° ĐŋаĐŧĐĩŅŅ Đˇ вŅдаĐģĐĩĐŊŅĐŧŅ ĐŧĐĩŅадаĐŊŅĐŧŅ, вŅĐēаŅŅŅŅĐžŅваĐĩŅŅа ĐŋŅŅ ĐŋŅĐ°ĐŗĐģŅдСĐĩ аŅОйĐŊĐ°ĐŗĐ° ŅŅŅŅŅŅŅ Ņ Đ´ĐģŅ ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ",
|
||||
"image_preview_quality_description": "Đ¯ĐēаŅŅŅ ĐŋŅаŅĐ˛Ņ Đ°Đ´ 1 да 100. ЧŅĐŧ вŅŅŅĐš, ŅŅĐŧ ĐģĐĩĐŋŅ, аĐģĐĩ ĐŋŅŅ ĐŗŅŅŅĐŧ ŅŅваŅаŅŅŅа ŅаКĐģŅ ĐąĐžĐģŅŅĐ°ĐŗĐ° ĐŋаĐŧĐĩŅŅ Ņ ĐŧĐžĐļа СĐŊŅСŅŅŅа Ņ
ŅŅĐēаŅŅŅ Đ˛ĐžĐ´ĐŗŅĐēŅ ĐŋŅŅĐēĐģадаĐŊĐŊŅ. ĐŅŅаĐŊĐžŅĐēа ĐŊŅСĐēĐ°ĐŗĐ° СĐŊаŅŅĐŊĐŊŅ ĐŧĐžĐļа ĐŋаŅĐŋĐģŅваŅŅ ĐŊа ŅĐēаŅŅŅ ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ.",
|
||||
"image_preview_title": "ĐаĐģĐ°Đ´Ņ ĐŋаĐŋŅŅŅĐ´ĐŊŅĐŗĐ° ĐŋŅĐ°ĐŗĐģŅĐ´Ņ",
|
||||
"image_quality": "Đ¯ĐēаŅŅŅ",
|
||||
"image_resolution": "РаСдСŅĐģŅĐģŅĐŊаŅŅŅ",
|
||||
"image_settings": "ĐаĐģĐ°Đ´Ņ Đ˛ŅдаŅŅŅа",
|
||||
"image_settings_description": "ĐŅŅŅĐšŅĐĩ ŅĐēаŅŅŅ Ņ ŅаСдСŅĐģŅĐģŅĐŊаŅŅŅ ŅĐŗĐĩĐŊĐĩŅŅŅаваĐŊŅŅ
вŅдаŅŅŅаŅ",
|
||||
"image_thumbnail_title": "ĐаĐģĐ°Đ´Ņ ĐŧŅĐŊŅŅŅŅŅ",
|
||||
"job_concurrency": "{job} ĐēаĐŊĐēŅŅŅĐŊŅĐŊаŅŅŅ",
|
||||
"job_created": "ĐадаĐŊĐŊĐĩ ŅŅвОŅаĐŊа",
|
||||
"job_not_concurrency_safe": "ĐŅŅа СадаĐŊĐŊĐĩ ĐŊĐĩĐąŅŅĐŋĐĩŅĐŊаĐĩ Đ´ĐģŅ ĐēаĐŊĐēŅŅŅĐŊŅĐŊĐ°ĐŗĐ°(адĐŊаŅаŅĐžĐ˛Đ°ĐŗĐ°, ĐŋаŅаĐģĐĩĐģŅĐŊĐ°ĐŗĐ°) вŅĐēаĐŊаĐŊĐŊŅ.",
|
||||
"job_settings": "ĐаĐģĐ°Đ´Ņ ĐˇĐ°Đ´Đ°ĐŊĐŊŅŅ",
|
||||
"job_settings_description": "ĐŅŅаваŅŅ ĐŊаĐģадаĐŧŅ Đ°Đ´ĐŊаŅаŅĐžĐ˛Đ°ĐŗĐ° (ĐŋаŅаĐģĐĩĐģŅĐŊĐ°ĐŗĐ°) вŅĐēаĐŊаĐŊĐŊŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ",
|
||||
"job_status": "ĐĄŅаĐŊОвŅŅŅа СадаĐŊĐŊŅ",
|
||||
"library_created": "ĐĄŅвОŅаĐŊа ĐąŅĐąĐģŅŅŅŅĐēа: {library}",
|
||||
"library_deleted": "ĐŅĐąĐģŅŅŅŅĐēа вŅдаĐģĐĩĐŊа",
|
||||
"library_scanning": "ĐĄĐēаĐŊаваĐŊĐŊĐĩ Đŋа ŅаŅĐēĐģадСĐĩ",
|
||||
"library_scanning_description": "ĐаĐģадСŅŅĐĩ ĐŋаŅаĐŧĐĩŅŅŅ ŅĐēаĐŊаваĐŊĐŊŅ Đ˛Đ°ŅаК ĐąŅĐąĐģŅŅŅŅĐēŅ",
|
||||
"library_scanning_enable_description": "ĐŖĐēĐģŅŅŅŅŅ ŅĐēаĐŊаваĐŊĐŊĐĩ ĐąŅĐąĐģŅŅŅŅĐēŅ Đŋа ŅаŅĐēĐģадСĐĩ",
|
||||
"library_settings": "ĐĐŊĐĩŅĐŊŅŅ ĐąŅĐąĐģŅŅŅŅĐēа",
|
||||
"library_settings_description": "ĐаĐģадСŅŅĐĩ ĐŋаŅаĐŧĐĩŅŅŅ ĐˇĐŊĐĩŅĐŊŅĐš ĐąŅĐąĐģŅŅŅŅĐēŅ",
|
||||
"library_tasks_description": "ĐĄĐēаĐŊаваŅŅ ĐˇĐŊĐĩŅĐŊŅŅ ĐąŅĐąĐģŅŅŅŅĐēŅ ĐŊа ĐŊаŅŅĐŊаŅŅŅ ĐŊОвŅŅ
Ņ/айО СĐŧĐĩĐŊĐĩĐŊŅŅ
ŅŅŅŅŅŅаŅ",
|
||||
"library_watching_enable_description": "ĐаСŅŅаŅŅ ĐˇĐ° СĐŧĐĩĐŊаĐŧŅ ŅаКĐģĐ°Ņ Ņ ĐˇĐŊĐĩŅĐŊŅŅ
ĐąŅĐąĐģŅŅŅŅĐēаŅ
",
|
||||
"library_watching_settings": "ХаŅŅŅŅ ĐˇĐ° ĐąŅĐąĐģŅŅŅŅĐēаК (ŅĐēŅĐŋĐĩŅŅĐŧĐĩĐŊŅаĐģŅĐŊŅ)",
|
||||
"library_watching_settings_description": "ĐŅŅаĐŧаŅŅŅĐŊа ŅаŅŅŅŅ ĐˇĐ° СĐŧĐĩĐŊаĐŧŅ Ņ ŅаКĐģаŅ
",
|
||||
"logging_enable_description": "ĐŖĐēĐģŅŅŅŅŅ Đ˛ŅдСĐĩĐŊĐŊĐĩ ĐļŅŅĐŊаĐģа",
|
||||
"logging_level_description": "ĐаĐģŅ ŅĐēĐģŅŅаĐŊа, ŅĐēŅ ŅСŅОвĐĩĐŊŅ ĐļŅŅĐŊаĐģŅваĐŊĐŊŅ Đ˛ŅĐēаŅŅŅŅĐžŅваŅŅ.",
|
||||
"logging_settings": "ĐŅдСĐĩĐŊĐŊĐĩ ĐļŅŅĐŊаĐģа",
|
||||
"machine_learning_clip_model": "CLIP ĐŧадŅĐģŅ",
|
||||
"machine_learning_clip_model_description": "ĐаСва CLIP ĐŧадŅĐģŅ ĐŋаĐēаСаĐŊа <link>ŅŅŅ</link>. ĐвŅŅĐŊŅŅĐĩ ŅĐ˛Đ°ĐŗŅ, ŅŅĐž ĐŋŅŅ ĐˇĐŧĐĩĐŊĐĩ ĐŧадŅĐģŅ ĐŊĐĩайŅ
ОдĐŊа ĐŋаŅŅĐžŅĐŊа СаĐŋŅŅŅŅŅŅ ĐˇĐ°Đ´Đ°ĐŊĐŊĐĩ \"Smart Search\" Đ´ĐģŅ ŅŅŅŅ
вŅдаŅŅŅаŅ.",
|
||||
"machine_learning_duplicate_detection": "ĐŅŅŅĐģĐĩĐŊĐŊĐĩ ĐŋадОйĐŊŅŅ
",
|
||||
"map_dark_style": "ĐĻŅĐŧĐŊŅ ŅŅŅĐģŅ",
|
||||
"map_enable_description": "ĐŖĐēĐģŅŅŅŅŅ ŅŅĐŊĐēŅŅŅ ĐēаŅŅŅ",
|
||||
"map_gps_settings": "ĐаĐģĐ°Đ´Ņ ĐēаŅŅŅ Ņ GPS",
|
||||
@@ -133,7 +162,7 @@
|
||||
"user_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа",
|
||||
"user_successfully_removed": "ĐаŅŅŅŅаĐģŅĐŊŅĐē {email} ĐąŅŅ ĐŋаŅĐŋŅŅ
Ова вŅдаĐģĐĩĐŊŅ.",
|
||||
"version_check_enabled_description": "ĐŖĐēĐģŅŅŅŅŅ ĐŋŅавĐĩŅĐēŅ Đ˛ĐĩŅŅŅŅ",
|
||||
"version_check_implications": "ФŅĐŊĐēŅŅŅ ĐŋŅавĐĩŅĐēŅ Đ˛ĐĩŅŅŅŅ ĐŋĐĩŅŅŅĐ´ŅŅĐŊа СвŅŅŅаĐĩŅŅа да github.com",
|
||||
"version_check_implications": "ФŅĐŊĐēŅŅŅ ĐŋŅавĐĩŅĐēŅ Đ˛ĐĩŅŅŅŅ ĐŋĐĩŅŅŅĐ´ŅŅĐŊа СвŅŅŅаĐĩŅŅа да github.com",
|
||||
"version_check_settings": "ĐŅавĐĩŅĐēа вĐĩŅŅŅŅ",
|
||||
"version_check_settings_description": "ĐŖĐēĐģŅŅŅŅŅ/адĐēĐģŅŅŅŅŅ Đ°ĐŋавŅŅŅŅĐŊĐŊŅ Đ°Đą ĐŊОваК вĐĩŅŅŅŅ"
|
||||
},
|
||||
@@ -206,7 +235,10 @@
|
||||
"asset_skipped_in_trash": "ĐŖ ŅĐŧĐĩŅĐŊŅŅŅ",
|
||||
"asset_uploaded": "ĐаĐŋаĐŧĐŋаваĐŊа",
|
||||
"asset_uploading": "ĐаĐŋаĐŧĐŋĐžŅваĐŊĐŊĐĩâĻ",
|
||||
"assets_were_part_of_albums_count": "{count, plural, one {ĐĐēŅŅŅ ŅĐļĐž ĐąŅŅ} other {ĐĐēŅŅĐ˛Ņ ŅĐļĐž ĐąŅĐģŅ}} ŅаŅŅĐēаК аĐģŅйОĐŧŅ",
|
||||
"authorized_devices": "ĐŅŅаŅŅСаваĐŊŅŅ ĐŋŅŅĐģадŅ",
|
||||
"automatic_endpoint_switching_subtitle": "ĐадĐēĐģŅŅаŅŅа ĐģаĐēаĐģŅĐŊа Đŋа вŅĐģŅŅаĐŊŅĐŧ Wi-Fi, ĐēаĐģŅ ĐŗŅŅа ĐŧĐ°ĐŗŅŅĐŧа, Ņ Đ˛ŅĐēаŅŅŅŅĐžŅваŅŅ Đ°ĐģŅŅŅŅĐŊаŅŅŅĐŊŅŅ ĐŋадĐēĐģŅŅŅĐŊĐŊŅ Ņ ŅĐŊŅŅŅ
ĐŧĐĩŅŅаŅ
",
|
||||
"automatic_endpoint_switching_title": "ĐŅŅаĐŧаŅŅŅĐŊаĐĩ ĐŋĐĩŅаĐēĐģŅŅŅĐŊĐŊĐĩ URL",
|
||||
"back": "ĐаСад",
|
||||
"backup_album_selection_page_albums_device": "ĐĐģŅйОĐŧŅ ĐŊа ĐŋŅŅĐģадСĐĩ ({count})",
|
||||
"backup_all": "ĐŖŅĐĩ",
|
||||
@@ -369,6 +401,15 @@
|
||||
"purchase_button_buy": "ĐŅĐŋŅŅŅ",
|
||||
"purchase_button_buy_immich": "ĐŅĐŋŅŅŅ Immich",
|
||||
"purchase_button_select": "ĐŅĐąŅаŅŅ",
|
||||
"readonly_mode_disabled": "ĐŅĐēĐģŅŅаĐŊŅ ŅŅĐļŅĐŧ ŅĐžĐģŅĐēŅ Đ´ĐģŅ ŅŅŅаĐŊĐŊŅ",
|
||||
"readonly_mode_enabled": "ĐŖĐēĐģŅŅаĐŊŅ ŅŅĐļŅĐŧ ŅĐžĐģŅĐēŅ Đ´ĐģŅ ŅŅŅаĐŊĐŊŅ",
|
||||
"reassign": "ĐĐĩŅаĐŋŅŅСĐŊаŅŅŅŅ",
|
||||
"reassing_hint": "ĐŅŅĐŋŅŅаŅŅ Đ˛ŅĐąŅаĐŊŅŅ Đ°ĐēŅŅĐ˛Ņ ŅŅĐŊŅŅŅаК аŅОйĐĩ",
|
||||
"recent": "ĐŅдаŅĐŊŅ",
|
||||
"recent-albums": "ĐŅдаŅĐŊŅŅ Đ°ĐģŅйОĐŧŅ",
|
||||
"recent_searches": "ĐŅдаŅĐŊŅŅ ĐŋĐžŅŅĐēŅ",
|
||||
"recently_added": "ĐŅдаŅĐŊа дададСĐĩĐŊа",
|
||||
"refresh_faces": "ĐĐąĐŊавŅŅŅ ŅваŅŅ",
|
||||
"remove": "ĐŅдаĐģŅŅŅ",
|
||||
"remove_from_album": "ĐŅдаĐģŅŅŅ Đˇ аĐģŅйОĐŧа",
|
||||
"remove_from_favorites": "ĐŅдаĐģŅŅŅ Đˇ айŅаĐŊŅŅ
",
|
||||
@@ -457,7 +498,7 @@
|
||||
"view_all_users": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ŅŅĐĩŅ
ĐēаŅŅŅŅаĐģŅĐŊŅĐēаŅ",
|
||||
"view_in_timeline": "ĐĐ°ĐŗĐģŅдСĐĩŅŅ Ņ
ŅĐžĐŊŅĐēŅ",
|
||||
"view_links": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ŅĐŋаŅŅĐģĐēŅ",
|
||||
"view_name": "ĐŅĐ°ĐŗĐģĐĩдСĐĩŅŅ",
|
||||
"view_name": "ĐŅĐ°ĐŗĐģŅĐ´",
|
||||
"view_next_asset": "ĐаĐēаСаŅŅ ĐŊаŅŅŅĐŋĐŊŅ Đ°Đą'ĐĩĐēŅ",
|
||||
"view_previous_asset": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ĐŋаĐŋŅŅŅĐ´ĐŊŅ Đ°Đą'ĐĩĐēŅ",
|
||||
"view_stack": "ĐŅĐ°ĐŗĐģŅĐ´ ŅŅŅĐēа",
|
||||
|
||||
167
i18n/bg.json
167
i18n/bg.json
@@ -13,20 +13,24 @@
|
||||
"add_a_description": "ĐОйави ĐžĐŋиŅаĐŊиĐĩ",
|
||||
"add_a_location": "ĐОйави ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||
"add_a_name": "ĐОйави иĐŧĐĩ",
|
||||
"add_a_title": "ĐОйавĐĩŅĐĩ ĐˇĐ°ĐŗĐģавиĐĩ",
|
||||
"add_a_title": "ĐОйaви ĐˇĐ°ĐŗĐģавиĐĩ",
|
||||
"add_birthday": "ĐОйави даŅа ĐŊа ŅаĐļдаĐŊĐĩ",
|
||||
"add_endpoint": "ĐОйави ĐēŅаКĐŊа ŅĐžŅĐēа",
|
||||
"add_exclusion_pattern": "ĐОйави ĐŧОдĐĩĐģ Са иСĐēĐģŅŅваĐŊĐĩ",
|
||||
"add_import_path": "ĐОйави ĐŋŅŅ ĐˇĐ° иĐŧĐŋĐžŅŅиŅаĐŊĐĩ",
|
||||
"add_location": "ĐОйавĐĩŅĐĩ ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||
"add_more_users": "ĐОйавĐĩŅĐĩ ĐžŅĐĩ ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
||||
"add_partner": "ĐОйавĐĩŅĐĩ ĐŋаŅŅĐŊŅĐžŅ",
|
||||
"add_location": "Đoйави ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||
"add_more_users": "ĐОйави ĐžŅĐĩ ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
||||
"add_partner": "ĐОйави ĐŋаŅŅĐŊŅĐžŅ",
|
||||
"add_path": "ĐОйави ĐŋŅŅ",
|
||||
"add_photos": "ĐОйавĐĩŅĐĩ ŅĐŊиĐŧĐēи",
|
||||
"add_photos": "ĐОйави ŅĐŊиĐŧĐēи",
|
||||
"add_tag": "ĐОйави ĐŧаŅĐēĐĩŅ",
|
||||
"add_to": "ĐОйави ĐēŅĐŧâĻ",
|
||||
"add_to_album": "ĐОйави ĐēŅĐŧ аĐģĐąŅĐŧ",
|
||||
"add_to_album_bottom_sheet_added": "ĐОйавĐĩĐŊĐž в {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "ĐĐĩŅĐĩ Đĩ в {album}",
|
||||
"add_to_album_toggle": "ĐĄĐŧĐĩĐŊĐĩŅĐĩ иСйОŅа Са {album}",
|
||||
"add_to_albums": "ĐОйавŅĐŊĐĩ в аĐģĐąŅĐŧи",
|
||||
"add_to_albums_count": "ĐОйавŅĐŊĐĩ в аĐģĐąŅĐŧи ({count})",
|
||||
"add_to_shared_album": "ĐОйави ĐēŅĐŧ ŅĐŋОдĐĩĐģĐĩĐŊ аĐģĐąŅĐŧ",
|
||||
"add_url": "ĐОйави URL",
|
||||
"added_to_archive": "ĐОйавĐĩĐŊĐž ĐēŅĐŧ аŅŅ
ива",
|
||||
@@ -44,6 +48,13 @@
|
||||
"backup_database": "ĐĄŅСдаК ŅĐĩСĐĩŅвĐŊа йаСа даĐŊĐŊи",
|
||||
"backup_database_enable_description": "РаСŅĐĩŅи ŅĐĩСĐĩŅвĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа йаСаŅа даĐŊĐŊи",
|
||||
"backup_keep_last_amount": "ĐŅОК СаĐŋаСĐĩĐŊи ŅĐĩСĐĩŅвĐŊи ĐēĐžĐŋиŅ",
|
||||
"backup_onboarding_1_description": "ĐēĐžĐŋиĐĩ ĐŊа ОйĐģаĐēа иĐģи Đ´ŅŅĐŗĐž ŅиСиŅĐĩŅĐēĐž ĐŧŅŅŅĐž.",
|
||||
"backup_onboarding_2_description": "ĐģĐžĐēаĐģĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа ŅаСĐģиŅĐŊи ŅŅŅŅОКŅŅва. ĐĸОва вĐēĐģŅŅва ĐžŅĐŊОвĐŊиŅĐĩ ŅаКĐģОвĐĩ и ĐģĐžĐēаĐģĐŊи аŅŅ
иви ĐŊа ŅĐĩСи ŅаКĐģОвĐĩ.",
|
||||
"backup_onboarding_3_description": "ОйŅĐž ĐēĐžĐŋĐ¸Ņ ĐŊа ваŅиŅĐĩ даĐŊĐŊи, вĐēĐģŅŅиŅĐĩĐŊĐž ĐžŅĐ¸ĐŗĐ¸ĐŊаĐģĐŊиŅĐĩ ŅаКĐģОвĐĩ. ĐĸОва вĐēĐģŅŅва 1 ĐēĐžĐŋиĐĩ иСвŅĐŊ ŅиŅŅĐĩĐŧаŅа и 2 ĐģĐžĐēаĐģĐŊи ĐēĐžĐŋиŅ.",
|
||||
"backup_onboarding_description": "Đа ĐŊадĐĩĐļĐ´ĐŊа СаŅиŅа ĐŋŅĐĩĐŋĐžŅŅŅваĐŧĐĩ ŅŅŅаŅĐĩĐŗĐ¸ŅŅа <backblaze-link>3-2-1</backblaze-link>. ĐŅавĐĩŅĐĩ аŅŅ
ивĐŊи ĐēĐžĐŋĐ¸Ņ ĐēаĐēŅĐž ĐŊа ĐēаŅĐĩĐŊиŅĐĩ ŅĐŊиĐŧĐēи/видĐĩа, ŅаĐēа и ĐŊа йаСаŅа даĐŊĐŊи ĐŊа Immich.",
|
||||
"backup_onboarding_footer": "Đа ĐŋОдŅОйĐŊа иĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐžŅĐŊĐžŅĐŊĐž аŅŅ
ивиŅаĐŊĐĩŅĐž в Immich, ĐŧĐžĐģŅ Đ˛Đ¸ĐļŅĐĩ в <link>Đ´ĐžĐēŅĐŧĐĩĐŊŅаŅиŅŅа</link>.",
|
||||
"backup_onboarding_parts_title": "ĐĄŅŅаŅĐĩĐŗĐ¸ŅŅа 3-2-1 вĐēĐģŅŅва:",
|
||||
"backup_onboarding_title": "Đ ĐĩСĐĩŅвĐŊи ĐēĐžĐŋиŅ",
|
||||
"backup_settings": "ĐаŅŅŅОКĐēа ĐŊа ŅĐĩСĐĩŅвĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа йаСаŅа даĐŊĐŊи",
|
||||
"backup_settings_description": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са ŅĐĩСĐĩŅвĐŊĐž ĐēĐžĐŋиĐĩ ĐŊа йаСаŅа даĐŊĐŊи.",
|
||||
"cleared_jobs": "ĐСŅиŅŅĐĩĐŊи СадаŅи ĐžŅ ŅиĐŋ: {job}",
|
||||
@@ -347,6 +358,9 @@
|
||||
"trash_number_of_days_description": "ĐŅОК Đ´ĐŊи, в ĐēОиŅĐž ŅаКĐģОвĐĩŅĐĩ да ŅĐĩ ŅŅŅ
ŅаĐŊŅĐ˛Đ°Ņ ĐŊа йОĐēĐģŅĐēа, ĐŋŅĐĩди да ĐąŅĐ´Đ°Ņ ĐžĐēĐžĐŊŅаŅĐĩĐģĐŊĐž ĐŋŅĐĩĐŧаŅ
ĐŊаŅи",
|
||||
"trash_settings": "ĐаŅŅŅОКĐēи ĐŊа ĐēĐžŅŅĐĩŅĐž",
|
||||
"trash_settings_description": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ ĐŊа ĐēĐžŅŅĐĩŅĐž",
|
||||
"unlink_all_oauth_accounts": "ĐŅĐĩĐēŅаŅи вĐŋиŅваĐŊĐĩŅĐž ĐŊа вŅиŅĐēи OAuth ĐŋŅĐžŅиĐģи",
|
||||
"unlink_all_oauth_accounts_description": "ĐĐĩ СайŅавŅĐšŅĐĩ да ĐŋŅĐĩĐēŅаŅиŅĐĩ вĐŋиŅваĐŊĐĩŅĐž ĐŊа вŅиŅĐēи OAuth ĐŋŅĐžŅиĐģи ĐŋŅĐĩди да ĐŧĐ¸ĐŗŅиŅаŅĐĩ ĐēŅĐŧ ĐŊОв Đ´ĐžŅŅавŅиĐē.",
|
||||
"unlink_all_oauth_accounts_prompt": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐžŅĐŋиŅĐĩŅĐĩ вŅиŅĐēи OAuth ĐŋŅĐžŅиĐģи? ĐĸОва ŅĐĩ ĐŊŅĐģиŅа OAuth ID Са вŅĐĩĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģ и ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅĐ´Đĩ ĐžŅĐŧĐĩĐŊĐĩĐŊĐž.",
|
||||
"user_cleanup_job": "ĐĐžŅиŅŅваĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
||||
"user_delete_delay": "<b>{user}</b> aĐēаŅĐŊŅŅŅ Đ¸ ŅаКĐģОвĐĩŅĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ ŅĐĩ ĐąŅĐ´Đ°Ņ ĐŋĐģаĐŊиŅаĐŊи Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž иСŅŅиваĐŊĐĩ ŅĐģĐĩĐ´ {delay, plural, one {# Đ´ĐĩĐŊ} other {# Đ´ĐŊи}}.",
|
||||
"user_delete_delay_settings": "ĐайавŅĐŊĐĩ ĐŊа иСŅŅиваĐŊĐĩ",
|
||||
@@ -373,8 +387,6 @@
|
||||
"admin_password": "ĐĐ´ĐŧиĐŊиŅŅŅаŅĐžŅŅĐēа ĐŋаŅĐžĐģа",
|
||||
"administration": "ĐĐ´ĐŧиĐŊиŅŅŅаŅиŅ",
|
||||
"advanced": "РаСŅиŅĐĩĐŊĐž",
|
||||
"advanced_settings_beta_timeline_subtitle": "ĐĐŋиŅаКŅĐĩ ĐŊОвиŅĐĩ ŅŅĐŊĐēŅии ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||
"advanced_settings_beta_timeline_title": "ĐĐĩŅа вĐĩŅŅĐ¸Ņ ĐŊа вŅĐĩĐŧĐĩваŅа ĐģиĐŊиŅ",
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "ĐŅи ŅиĐŊŅ
ŅĐžĐŊиСаŅиŅ, иСĐŋĐžĐģСваКŅĐĩ ŅаСи ĐžĐŋŅĐ¸Ņ ĐēаŅĐž ŅиĐģŅŅŅ, ĐžŅĐŊОваĐŊ ĐŊа ĐŋŅĐžĐŧŅĐŊа ĐŊа дадĐĩĐŊ ĐēŅиŅĐĩŅии. ĐĐŋиŅаКŅĐĩ ŅаĐŧĐž в ŅĐģŅŅаК, ŅĐĩ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž иĐŧа ĐŋŅОйĐģĐĩĐŧ Ņ ĐžŅĐēŅиваĐŊĐĩ ĐŊа вŅиŅĐēи аĐģĐąŅĐŧи.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "[ĐĐĐĄĐĐĐ ĐĐĐĐĐĸĐĐĐĐ] ĐСĐŋĐžĐģСваК ŅиĐģŅŅŅа ĐŊа аĐģŅĐĩŅĐŊаŅивĐŊĐžŅĐž ŅŅŅŅОКŅŅвО Са ŅиĐŊŅ
ŅĐžĐŊиСаŅĐ¸Ņ ĐŊа аĐģĐąŅĐŧи",
|
||||
"advanced_settings_log_level_title": "ĐивО ĐŊа СаĐŋĐ¸Ņ Đ˛ Đ´ĐŊĐĩвĐŊиĐēа: {level}",
|
||||
@@ -382,13 +394,15 @@
|
||||
"advanced_settings_prefer_remote_title": "ĐŅĐĩĐ´ĐŋĐžŅиŅаК иСОйŅаĐļĐĩĐŊиŅŅа ĐŊа ŅŅŅвŅŅа",
|
||||
"advanced_settings_proxy_headers_subtitle": "ĐĐĩŅиĐŊиŅаĐŊĐĩ ĐŊа ĐŋŅĐžĐēŅи Ņ
ĐĩĐ´ŅŅи, ĐēОиŅĐž Immich ŅŅŅйва да иСĐŋŅаŅа Ņ Đ˛ŅŅĐēа ĐŧŅĐĩĐļОва СаŅвĐēа",
|
||||
"advanced_settings_proxy_headers_title": "ĐŅĐžĐēŅи Ņ
ĐĩĐ´ŅŅи",
|
||||
"advanced_settings_readonly_mode_subtitle": "ĐĐēŅивиŅа ŅĐĩĐļиĐŧа \"ŅаĐŧĐž Са ŅĐĩŅĐĩĐŊĐĩ\", ĐŋŅи ĐēОКŅĐž ŅĐŊиĐŧĐēиŅĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ ŅĐ°ĐˇĐŗĐģĐĩĐļдаĐŊи, ĐŊĐž ĐŊĐĩŅа ĐēаŅĐž Đ¸ĐˇĐąĐžŅ ĐŊа ĐŊŅĐēĐžĐģĐēĐž иСОйŅаĐļĐĩĐŊиŅ, ŅĐŋОдĐĩĐģŅĐŊĐĩ, иСŅŅиваĐŊĐĩ Ņа СайŅаĐŊĐĩĐŊи. ĐĐēŅивиŅаĐŊĐĩ/Đ´ĐĩаĐēŅивиŅаĐŊĐĩ ĐŊа ŅĐĩĐļиĐŧа ŅаĐŧĐž Са ŅĐĩŅĐĩĐŊĐĩ ŅŅава ĐžŅ ĐēаŅŅиĐŊĐēаŅа-аваŅĐ°Ņ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ ĐžŅ ĐžŅĐŊОвĐŊĐ¸Ņ ĐĩĐēŅаĐŊ",
|
||||
"advanced_settings_readonly_mode_title": "Đ ĐĩĐļиĐŧ ŅаĐŧĐž Са ŅĐĩŅĐĩĐŊĐĩ",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "ĐŅĐžĐŋŅŅĐēа ĐŋŅОвĐĩŅĐēаŅа ĐŊа SSL-ŅĐĩŅŅиŅиĐēаŅа ĐŊа ŅŅŅвŅŅа. ĐСиŅĐēва ŅĐĩ ĐŋŅи ŅаĐŧĐžĐŋОдĐŋиŅаĐŊи ŅĐĩŅŅиŅиĐēаŅи.",
|
||||
"advanced_settings_self_signed_ssl_title": "РаСŅĐĩŅи ŅаĐŧĐžĐŋОдĐŋиŅаĐŊи SSL ŅĐĩŅŅиŅиĐēаŅи",
|
||||
"advanced_settings_sync_remote_deletions_subtitle": "ĐвŅĐžĐŧаŅиŅĐŊĐž иСŅŅии иĐģи вŅСŅŅаĐŊОви ОйĐĩĐēŅ ĐŊа ŅОва ŅŅŅŅОКŅŅвО, ĐēĐžĐŗĐ°ŅĐž Đ´ĐĩĐšŅŅвиĐĩŅĐž Đĩ иСвŅŅŅĐĩĐŊĐž ĐŋŅĐĩС ŅĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅа",
|
||||
"advanced_settings_sync_remote_deletions_title": "ХиĐŊŅ
ŅĐžĐŊиСаŅĐ¸Ņ ĐŊа диŅŅаĐŊŅиОĐŊĐŊи иСŅŅиваĐŊĐ¸Ņ [ĐĐĐĄĐĐĐ ĐĐĐĐĐĸĐĐĐĐ]",
|
||||
"advanced_settings_tile_subtitle": "РаСŅиŅĐĩĐŊи ĐŋĐžŅŅĐĩйиŅĐĩĐģŅĐēи ĐŊаŅŅŅОКĐēи",
|
||||
"advanced_settings_troubleshooting_subtitle": "РаСŅĐĩŅи Đ´ĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊи вŅСĐŧĐžĐļĐŊĐžŅŅи Са ĐžŅŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŋŅОйĐģĐĩĐŧи",
|
||||
"advanced_settings_troubleshooting_title": "ĐŅŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŋŅОйĐģĐĩĐŧи",
|
||||
"advanced_settings_troubleshooting_title": "ĐŅŅŅŅаĐŊŅваĐŊe ĐŊа ĐŋŅОйĐģĐĩĐŧи",
|
||||
"age_months": "ĐŅСŅаŅŅ {months, plural, one {# ĐŧĐĩŅĐĩŅ} other {# ĐŧĐĩŅĐĩŅи}}",
|
||||
"age_year_months": "ĐŅСŅаŅŅ 1 ĐŗĐžĐ´Đ¸ĐŊа, {months, plural, one {# ĐŧĐĩŅĐĩŅ} other {# ĐŧĐĩŅĐĩŅи}}",
|
||||
"age_years": "{years, plural, other {ĐОдиĐŊа #}}",
|
||||
@@ -397,6 +411,7 @@
|
||||
"album_cover_updated": "ĐĐąĐģĐžĐļĐēаŅа ĐŊа аĐģĐąŅĐŧа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
||||
"album_delete_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ аĐģĐąŅĐŧа {album}?",
|
||||
"album_delete_confirmation_description": "ĐĐēĐž ŅОСи аĐģĐąŅĐŧ Đĩ ŅĐŋОдĐĩĐģĐĩĐŊ, Đ´ŅŅĐŗĐ¸ ĐŋĐžŅŅĐĩйиŅĐĩĐģи вĐĩŅĐĩ ĐŊŅĐŧа да иĐŧĐ°Ņ Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŊĐĩĐŗĐž.",
|
||||
"album_deleted": "ĐĐģĐąŅĐŧа Đĩ иСŅŅиŅ",
|
||||
"album_info_card_backup_album_excluded": "ĐĐĐĐЎЧĐĐ",
|
||||
"album_info_card_backup_album_included": "ĐĐĐЎЧĐĐ",
|
||||
"album_info_updated": "ĐĐŊŅĐžŅĐŧаŅиŅŅа Са аĐģĐąŅĐŧа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
||||
@@ -406,7 +421,9 @@
|
||||
"album_options": "ĐаŅŅŅОКĐēи ĐŊа аĐģĐąŅĐŧа",
|
||||
"album_remove_user": "ĐŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģ?",
|
||||
"album_remove_user_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {user}?",
|
||||
"album_search_not_found": "ĐŅĐŧа ĐŊаĐŧĐĩŅĐĩĐŊи аĐģĐąŅĐŧи, ĐžŅĐŗĐžĐ˛Đ°ŅŅŅи ĐŊа ŅŅŅŅĐĩĐŊĐĩŅĐž ви",
|
||||
"album_share_no_users": "ĐĐˇĐŗĐģĐĩĐļда, ŅĐĩ ŅŅĐĩ ŅĐŋОдĐĩĐģиĐģи ŅОСи аĐģĐąŅĐŧ Ņ Đ˛ŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи иĐģи ĐŊŅĐŧаŅĐĩ Đ´ŅŅĐŗ ĐŋĐžŅŅĐĩйиŅĐĩĐģ, Ņ ĐēĐžĐŗĐžŅĐž да ĐŗĐž ŅĐŋОдĐĩĐģиŅĐĩ.",
|
||||
"album_summary": "ĐйОйŅĐĩĐŊиĐĩ ĐŊа аĐģĐąŅĐŧа",
|
||||
"album_updated": "ĐĐģĐąŅĐŧŅŅ Đĩ аĐēŅŅаĐģиСиŅаĐŊ",
|
||||
"album_updated_setting_description": "ĐĐžĐģŅŅаваКŅĐĩ иСвĐĩŅŅиĐĩ ĐŋĐž иĐŧĐĩĐšĐģ, ĐēĐžĐŗĐ°ŅĐž ŅĐŋОдĐĩĐģĐĩĐŊ аĐģĐąŅĐŧ иĐŧа ĐŊОви ŅаКĐģОвĐĩ",
|
||||
"album_user_left": "ĐаĐŋŅŅĐŊа {album}",
|
||||
@@ -425,6 +442,7 @@
|
||||
"albums_default_sort_order": "Đ ĐĩĐ´ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ Са ŅĐžŅŅиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧи",
|
||||
"albums_default_sort_order_description": "ĐŅŅвОĐŊаŅаĐģĐĩĐŊ ŅĐĩĐ´ ĐŊа ŅĐžŅŅиŅаĐŊĐĩ ĐŋŅи ŅŅСдаваĐŊĐĩ ĐŊа ĐŊОв аĐģĐąŅĐŧ.",
|
||||
"albums_feature_description": "ĐĐžĐģĐĩĐēŅии ĐžŅ ĐžĐąĐĩĐēŅи, ĐēОиŅĐž ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ ŅĐŋОдĐĩĐģŅĐŊи Ņ Đ´ŅŅĐŗĐ¸ ĐŋĐžŅĐĩйиŅĐĩĐģи.",
|
||||
"albums_on_device_count": "ĐĐģĐąŅĐŧи ĐŊа ŅŅŅŅОКŅŅвОŅĐž ({count})",
|
||||
"all": "ĐŅиŅĐēи",
|
||||
"all_albums": "ĐŅиŅĐēи аĐģĐąŅĐŧи",
|
||||
"all_people": "ĐŅиŅĐēи Ņ
ĐžŅа",
|
||||
@@ -444,6 +462,7 @@
|
||||
"app_bar_signout_dialog_title": "ĐСĐģĐĩС ĐžŅ ĐŋŅĐžŅиĐģа",
|
||||
"app_settings": "ĐаŅŅŅОКĐēи Đŧа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||
"appears_in": "ĐСĐģиСа в",
|
||||
"apply_count": "ĐŅиĐģĐžĐļи ({count, number})",
|
||||
"archive": "ĐŅŅ
ив",
|
||||
"archive_action_prompt": "{count} Ņа дОйавĐĩĐŊи в ĐŅŅ
ива",
|
||||
"archive_or_unarchive_photo": "ĐŅŅ
ивиŅаĐŊĐĩ иĐģи Đ´ĐĩаŅŅ
ивиŅаĐŊĐĩ ĐŊа ŅĐŊиĐŧĐēа",
|
||||
@@ -476,6 +495,8 @@
|
||||
"asset_restored_successfully": "ĐŖŅĐŋĐĩŅĐŊĐž вŅСŅŅаĐŊОвĐĩĐŊ ОйĐĩĐēŅ",
|
||||
"asset_skipped": "ĐŅĐžĐŋŅŅĐŊаŅĐž",
|
||||
"asset_skipped_in_trash": "Đ ĐēĐžŅŅĐĩŅĐž",
|
||||
"asset_trashed": "ĐĐąĐĩĐēŅŅŅ Đĩ иСŅ
вŅŅĐģĐĩĐŊ",
|
||||
"asset_troubleshoot": "ĐĐžĐŋŅавĐēа ĐŊа ĐŗŅĐĩŅĐēи Ņ ĐžĐąĐĩĐēŅа",
|
||||
"asset_uploaded": "ĐаŅĐĩĐŊĐž",
|
||||
"asset_uploading": "ĐаŅваĐŊĐĩâĻ",
|
||||
"asset_viewer_settings_subtitle": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са Đ¸ĐˇĐŗĐģĐĩĐ´",
|
||||
@@ -483,7 +504,9 @@
|
||||
"assets": "ĐĐģĐĩĐŧĐĩĐŊŅи",
|
||||
"assets_added_count": "ĐОйавĐĩĐŊĐž {count, plural, one {# asset} other {# assets}}",
|
||||
"assets_added_to_album_count": "ĐОйавĐĩĐŊ(и) Ņа {count, plural, one {# аĐēŅив} other {# аĐēŅива}} в аĐģĐąŅĐŧа",
|
||||
"assets_added_to_albums_count": "{assetTotal, plural, one {# ОйĐĩĐēŅ Đĩ дОйавĐĩĐŊ} other {# ОйĐĩĐēŅа Ņа дОйавĐĩĐŊи}} в {albumTotal, plural, one {# аĐģĐąŅĐŧ} other {# аĐģĐąŅĐŧа}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {ĐĐąĐĩĐēŅа ĐŊĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ дОйави} other {ĐĐąĐĩĐēŅиŅĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ дОйавŅŅ}} в аĐģĐąŅĐŧа",
|
||||
"assets_cannot_be_added_to_albums": "{count, plural, one {ОйĐĩĐēŅ ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅĐ´Đĩ дОйавĐĩĐŊ} other {ОйĐĩĐēŅа ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ Đ´ĐžĐąĐ°Đ˛ĐĩĐŊи}} в ĐŊиĐēОК ĐžŅ Đ°ĐģĐąŅĐŧиŅĐĩ",
|
||||
"assets_count": "{count, plural, one {# аĐēŅив} other {# аĐēŅива}}",
|
||||
"assets_deleted_permanently": "{count} ОйĐĩĐēŅа Ņа иСŅŅиŅи СавиĐŊĐ°ĐŗĐ¸",
|
||||
"assets_deleted_permanently_from_server": "{count} ОйĐĩĐēŅа Ņа иСŅиŅи ĐžŅ Immich ŅŅŅвŅŅа СавиĐŊĐ°ĐŗĐ¸",
|
||||
@@ -500,14 +523,17 @@
|
||||
"assets_trashed_count": "ĐŅСŅŅаĐŊОвĐĩĐŊ(и) Ņа {count, plural, one {# ŅаКĐģ} other {# ŅаКĐģа}}",
|
||||
"assets_trashed_from_server": "{count} ОйĐĩĐēŅа Ņа ĐŋŅĐĩĐŧĐĩŅŅĐĩĐŊи в ĐēĐžŅа ĐŊа Immich ŅŅŅвŅŅа",
|
||||
"assets_were_part_of_album_count": "{count, plural, one {ФаКĐģŅŅ Đĩ} other {ФаКĐģОвĐĩŅĐĩ Ņа}} вĐĩŅĐĩ ŅаŅŅ ĐžŅ Đ°ĐģĐąŅĐŧа",
|
||||
"assets_were_part_of_albums_count": "{count, plural, one {ОйĐĩĐēŅ Đ˛ĐĩŅĐĩ Đĩ} other {ОйĐĩĐēŅа вĐĩŅĐĩ Ņа}} ŅаŅŅ ĐžŅ Đ°ĐģĐąŅĐŧиŅĐĩ",
|
||||
"authorized_devices": "ĐŖĐ´ĐžŅŅОвĐĩŅĐĩĐŊи ŅŅŅŅОКŅŅва",
|
||||
"automatic_endpoint_switching_subtitle": "ĐĐžĐŗĐ°ŅĐž Đĩ Đ´ĐžŅŅŅĐŋĐŊа, иСĐŋĐžĐģСваК ĐŋĐžŅĐžŅĐĩĐŊаŅа Wi-Fi ĐŧŅĐĩĐļа, иĐŊаŅĐĩ иСĐŋĐžĐģСваК аĐģŅĐĩŅĐŊаŅивĐŊи вŅŅСĐēи",
|
||||
"automatic_endpoint_switching_title": "ĐвŅĐžĐŧаŅиŅĐŊĐž ĐŋŅĐĩвĐēĐģŅŅваĐŊĐĩ ĐŊа URL",
|
||||
"autoplay_slideshow": "ĐвŅĐžĐŧаŅиŅĐŊа ŅĐŧŅĐŊа ĐŊа ŅĐģаКдОвĐĩŅĐĩ",
|
||||
"back": "ĐаСад",
|
||||
"back_close_deselect": "ĐаСад, СаŅваŅŅĐŊĐĩ иĐģи ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа иСйОŅа",
|
||||
"background_backup_running_error": "ĐĄŅаŅŅиŅаĐŊĐž Đĩ ŅĐžĐŊОвО аŅŅ
ивиŅаĐŊĐĩ, ĐŊĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋŅŅĐŊĐĩ ŅŅŅĐŊĐž аŅŅ
ивиŅаĐŊĐĩ",
|
||||
"background_location_permission": "РаСŅĐĩŅĐĩĐŊиĐĩ Са Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž вŅв ŅĐžĐŊОв ŅĐĩĐļиĐŧ",
|
||||
"background_location_permission_content": "Đа да ĐŧĐžĐļĐĩ да ŅĐĩŅĐĩ иĐŧĐĩĐŊаŅа ĐŊа Wi-Fi ĐŧŅĐĩĐļиŅĐĩ и да ĐŗĐ¸ ĐŋŅĐĩвĐēĐģŅŅва ĐŋŅи ŅайОŅа вŅв ŅĐžĐŊОв ŅĐĩĐļиĐŧ, Immich ŅŅŅйва *виĐŊĐ°ĐŗĐ¸* да иĐŧа Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐžŅĐŊĐžŅĐž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||
"background_options": "ĐĐŋŅии Са ŅĐžĐŊОвиŅĐĩ СадаŅи",
|
||||
"backup": "ĐŅŅ
ивиŅаĐŊĐĩ",
|
||||
"backup_album_selection_page_albums_device": "ĐĐģĐąŅĐŧи ĐŊа ŅŅŅŅОКŅŅвОŅĐž ({count})",
|
||||
"backup_album_selection_page_albums_tap": "ĐаŅиŅĐŊи Са да вĐēĐģŅŅиŅ, двОКĐŊĐž Са да иСĐēĐģŅŅиŅ",
|
||||
@@ -515,6 +541,7 @@
|
||||
"backup_album_selection_page_select_albums": "ĐĐˇĐąĐžŅ ĐŊа аĐģĐąŅĐŧи",
|
||||
"backup_album_selection_page_selection_info": "ĐĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐˇĐ° иСйŅаĐŊĐžŅĐž",
|
||||
"backup_album_selection_page_total_assets": "ĐŖĐŊиĐēаĐģĐŊи ОйĐĩĐēŅи ОйŅĐž",
|
||||
"backup_albums_sync": "ХиĐŊŅ
ŅĐžĐŊиСиŅаĐŊĐĩ ĐŊа аŅŅ
ивиŅĐĩ",
|
||||
"backup_all": "ĐŅиŅĐēĐž",
|
||||
"backup_background_service_backup_failed_message": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž аŅŅ
ивиŅаĐŊĐĩ. ĐОв ĐžĐŋиŅâĻ",
|
||||
"backup_background_service_connection_failed_message": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ŅвŅŅСваĐŊĐĩ ĐēŅĐŧ ŅŅŅвŅŅа. ĐОв ĐžĐŋиŅâĻ",
|
||||
@@ -564,13 +591,15 @@
|
||||
"backup_controller_page_turn_on": "ĐĐēĐģŅŅи аŅŅ
ивиŅаĐŊĐĩ в аĐēŅивĐĩĐŊ ŅĐĩĐļиĐŧ",
|
||||
"backup_controller_page_uploading_file_info": "ĐĐŊŅĐž Са аŅŅ
ивиŅаĐŊĐ¸Ņ ŅаКĐģ",
|
||||
"backup_err_only_album": "ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋŅĐĩĐŧаŅ
ĐŊĐĩ ĐĩдиĐŊŅŅвĐĩĐŊĐ¸Ņ Đ°ĐģĐąŅĐŧ",
|
||||
"backup_info_card_assets": "ОйĐĩĐēŅи",
|
||||
"backup_info_card_assets": "ОйĐĩĐēŅа",
|
||||
"backup_manual_cancelled": "ĐŅĐŧĐĩĐŊĐĩĐŊĐž",
|
||||
"backup_manual_in_progress": "ĐŅŅви аŅŅ
ивиŅаĐŊĐĩ. ĐĐŋиŅаК ŅĐģĐĩĐ´ ĐŧаĐģĐēĐž",
|
||||
"backup_manual_success": "ĐŖŅĐŋĐĩŅĐŊĐž",
|
||||
"backup_manual_title": "ĐĄŅŅŅĐžŅĐŊиĐĩ ĐŊа аŅŅ
ивиŅаĐŊĐĩŅĐž",
|
||||
"backup_options": "ĐĐŋŅии Са аŅŅ
ивиŅаĐŊĐĩ",
|
||||
"backup_options_page_title": "ĐаŅŅŅОКĐēи Са аŅŅ
ивиŅаĐŊĐĩ",
|
||||
"backup_setting_subtitle": "ĐŖĐŋŅавĐģŅваК ĐŊаŅŅŅОКĐēиŅĐĩ Са аŅŅ
ивиŅаĐŊĐĩ в аĐēŅивĐĩĐŊ и ŅĐžĐŊОв ŅĐĩĐļиĐŧ",
|
||||
"backup_settings_subtitle": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са ĐēаŅваĐŊĐĩ",
|
||||
"backward": "ĐаСад",
|
||||
"biometric_auth_enabled": "ĐĐēĐģŅŅĐĩĐŊа йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
||||
"biometric_locked_out": "ĐŅĐŧа Đ´ĐžŅŅŅĐŋ Đ´Đž йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
||||
@@ -589,7 +618,7 @@
|
||||
"cache_settings_clear_cache_button": "ĐСŅиŅŅи ĐēĐĩŅа",
|
||||
"cache_settings_clear_cache_button_title": "ĐСŅиŅŅва ĐēĐĩŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž. ĐĸОва ŅĐĩ ĐŋОвĐģиŅĐĩ ĐŋŅОиСвОдиŅĐĩĐģĐŊĐžŅŅŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž Đ´ĐžĐēаŅĐž ĐēĐĩŅа ĐŊĐĩ ĐąŅĐ´Đĩ ŅŅСдадĐĩĐŊ ĐžŅĐŊОвО.",
|
||||
"cache_settings_duplicated_assets_clear_button": "ĐĐЧĐĐĄĐĸĐ",
|
||||
"cache_settings_duplicated_assets_subtitle": "ĐĄĐŊиĐŧĐēи и видĐĩа, ĐēОиŅĐž Ņа в ЧĐĩŅĐŊĐ¸Ņ ŅĐŋиŅŅĐē ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||
"cache_settings_duplicated_assets_subtitle": "ĐĄĐŊиĐŧĐēи и видĐĩа, ĐēОиŅĐž Ņа в ĐĄĐŋиŅŅĐēа Са Đ¸ĐŗĐŊĐžŅиŅаĐŊĐĩ ĐžŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||
"cache_settings_duplicated_assets_title": "ĐŅĐąĐģиŅаĐŊи ОйĐĩĐēŅи ({count})",
|
||||
"cache_settings_statistics_album": "ĐийĐģиОŅĐĩĐēа Ņ ĐŧиĐŊиаŅŅŅи",
|
||||
"cache_settings_statistics_full": "ĐŅĐģĐŊи иСОйŅаĐļĐĩĐŊиŅ",
|
||||
@@ -606,6 +635,7 @@
|
||||
"cancel": "ĐŅĐēаĐļи",
|
||||
"cancel_search": "ĐŅĐŧĐĩĐŊи ŅŅŅŅĐĩĐŊĐĩŅĐž",
|
||||
"canceled": "ĐŅĐŧĐĩĐŊĐĩĐŊĐž",
|
||||
"canceling": "ĐĐŊŅĐģиŅаĐŊĐĩ",
|
||||
"cannot_merge_people": "ĐĐĩ ĐŧĐžĐļĐĩ да ОйĐĩдиĐŊŅва Ņ
ĐžŅа",
|
||||
"cannot_undo_this_action": "ĐĐĩ ĐŧĐžĐļĐĩŅĐĩ да ĐžŅĐŧĐĩĐŊиŅĐĩ ŅОва Đ´ĐĩĐšŅŅвиĐĩ!",
|
||||
"cannot_update_the_description": "ĐĐŋиŅаĐŊиĐĩŅĐž ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅĐ´Đĩ аĐēŅŅаĐģиСиŅаĐŊĐž",
|
||||
@@ -628,6 +658,8 @@
|
||||
"change_pin_code": "ĐĄĐŧĐĩĐŊи PIN ĐēОда",
|
||||
"change_your_password": "ĐŅĐžĐŧĐĩĐŊĐĩŅĐĩ ĐŋаŅĐžĐģаŅа Ņи",
|
||||
"changed_visibility_successfully": "ĐидиĐŧĐžŅŅŅа Đĩ ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊа ŅŅĐŋĐĩŅĐŊĐž",
|
||||
"charging": "ĐŅи СаŅĐĩĐļдаĐŊĐĩ",
|
||||
"charging_requirement_mobile_backup": "ФОĐŊОвО аŅŅ
ивиŅаĐŊĐĩ ŅаĐŧĐž ĐŋŅи СаŅĐĩĐļдаĐŊĐĩ ĐŊа ŅŅŅŅОКŅŅвОŅĐž",
|
||||
"check_corrupt_asset_backup": "ĐŅОвĐĩŅи Са ĐŋОвŅĐĩĐ´ĐĩĐŊи аŅŅ
ивĐŊи ĐēĐžĐŋиŅ",
|
||||
"check_corrupt_asset_backup_button": "ĐŅОвĐĩŅи",
|
||||
"check_corrupt_asset_backup_description": "ĐСĐŋŅĐģĐŊи ŅаСи ĐŋŅОвĐĩŅĐēа ŅаĐŧĐž ĐŋŅи Wi-Fi и ŅĐģĐĩĐ´ аŅŅ
ивиŅаĐŊĐĩ ĐŊа вŅиŅĐēи ОйĐĩĐēŅи. ĐŅĐžŅĐĩĐ´ŅŅаŅа ĐŧĐžĐļĐĩ да ĐŋŅОдŅĐģĐļи ĐŊŅĐēĐžĐģĐēĐž ĐŧиĐŊŅŅи.",
|
||||
@@ -637,6 +669,7 @@
|
||||
"clear": "ĐСŅиŅŅи",
|
||||
"clear_all": "ĐСŅиŅŅи вŅиŅĐēĐž",
|
||||
"clear_all_recent_searches": "ĐСŅиŅŅĐĩŅĐĩ вŅиŅĐēи ŅĐēĐžŅĐžŅĐŊи ŅŅŅŅĐĩĐŊиŅ",
|
||||
"clear_file_cache": "ĐСŅиŅŅваĐŊĐĩ ĐŊа ĐēĐĩŅа ĐŊа ŅаКĐģОвĐĩŅĐĩ",
|
||||
"clear_message": "ĐСŅиŅŅи ŅŅОйŅĐĩĐŊиĐĩŅĐž",
|
||||
"clear_value": "ĐСŅиŅŅи ŅŅОКĐŊĐžŅŅŅа",
|
||||
"client_cert_dialog_msg_confirm": "ĐĐ",
|
||||
@@ -707,11 +740,13 @@
|
||||
"create_new_user": "ĐĄŅСдаваĐŊĐĩ ĐŊа ĐŊОв ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
||||
"create_shared_album_page_share_add_assets": "ĐĐĐĐĐĐ ĐĐĐĐĐĸĐ",
|
||||
"create_shared_album_page_share_select_photos": "ĐСйĐĩŅи ŅĐŊиĐŧĐēи",
|
||||
"create_shared_link": "ĐĄŅСдаК ĐģиĐŊĐē Са ŅĐŋОдĐĩĐģŅĐŊĐĩ",
|
||||
"create_tag": "ĐĄŅСдаК ŅĐ°Đŗ",
|
||||
"create_tag_description": "ĐĄŅСдаКŅĐĩ ĐŊОв ŅĐ°Đŗ. Đа вĐģĐžĐļĐĩĐŊи ŅĐ°ĐŗĐžĐ˛Đĩ, ĐŧĐžĐģŅ, вŅвĐĩĐ´ĐĩŅĐĩ ĐŋŅĐģĐŊĐ¸Ņ ĐŋŅŅ ĐŊа ŅĐ°ĐŗĐ°, вĐēĐģŅŅиŅĐĩĐģĐŊĐž ĐŊаĐēĐģĐžĐŊĐĩĐŊиŅĐĩ ŅĐĩŅŅи.",
|
||||
"create_user": "ĐĄŅСдаК ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
||||
"created": "ĐĄŅСдадĐĩĐŊĐž",
|
||||
"created_at": "ĐĄŅСдадĐĩĐŊ",
|
||||
"creating_linked_albums": "ĐĄŅСдаваĐŊĐĩ ĐŊа ŅвŅŅСаĐŊи аĐģĐąŅĐŧи...",
|
||||
"crop": "ĐСŅĐĩĐļи",
|
||||
"curated_object_page_title": "ĐĐĩŅа",
|
||||
"current_device": "ĐĸĐĩĐēŅŅĐž ŅŅŅŅОКŅŅвО",
|
||||
@@ -719,6 +754,7 @@
|
||||
"current_server_address": "ĐаŅŅĐžŅŅ Đ°Đ´ŅĐĩŅ ĐŊа ŅŅŅвŅŅа",
|
||||
"custom_locale": "ĐĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ ĐģĐžĐēаĐģ",
|
||||
"custom_locale_description": "ФОŅĐŧаŅиŅаĐŊĐĩ ĐŊа даŅи и ŅиŅĐģа в СавиŅиĐŧĐžŅŅ ĐžŅ ĐĩСиĐēа и ŅĐĩĐŗĐ¸ĐžĐŊа",
|
||||
"custom_url": "ĐĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ URL адŅĐĩŅ",
|
||||
"daily_title_text_date": "E, dd MMM",
|
||||
"daily_title_text_date_year": "E, dd MMM yyyy",
|
||||
"dark": "ĐĸŅĐŧĐĩĐŊ",
|
||||
@@ -730,6 +766,7 @@
|
||||
"date_of_birth_saved": "ĐаŅа ĐŊа ŅаĐļдаĐŊĐĩ Đĩ СаĐŋиŅаĐŊа ŅŅĐŋĐĩŅĐŊĐž",
|
||||
"date_range": "ĐĐĩŅиОд ĐžŅ Đ˛ŅĐĩĐŧĐĩ",
|
||||
"day": "ĐĐĩĐŊ",
|
||||
"days": "ĐĐŊи",
|
||||
"deduplicate_all": "ĐĐĩĐ´ŅĐŋĐģиĐēиŅаĐŊĐĩ ĐŊа вŅиŅĐēи",
|
||||
"deduplication_criteria_1": "РаСĐŧĐĩŅ ĐŊа ŅĐŊиĐŧĐēаŅа в йаКŅОвĐĩ",
|
||||
"deduplication_criteria_2": "ĐŅОК EXIF даĐŊĐŊи",
|
||||
@@ -738,7 +775,8 @@
|
||||
"default_locale": "ĐĐžĐēаĐģиСаŅĐ¸Ņ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ",
|
||||
"default_locale_description": "ФОŅĐŧаŅиŅаĐŊĐĩ ĐŊа даŅи и ŅиŅĐģа в СавиŅиĐŧĐžŅŅ ĐžŅ ĐĩСиĐēОваŅа ĐŊаŅŅŅОКĐēа ĐŊа ĐąŅаŅСŅŅа",
|
||||
"delete": "ĐСŅŅиК",
|
||||
"delete_action_prompt": "{count} Ņа иСŅŅиŅи СавиĐŊĐ°ĐŗĐ¸",
|
||||
"delete_action_confirmation_message": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ ŅОСи ОйĐĩĐēŅ? ĐĄĐģĐĩдва ĐŋŅĐĩĐŧĐĩŅŅваĐŊĐĩ ĐŊа ОйĐĩĐēŅа в ĐēĐžŅа Са ĐžŅĐŋадŅŅи ĐŊа ŅŅŅвŅŅа и ŅĐĩ ĐŋĐžĐģŅŅиŅĐĩ ĐŋŅĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ ОйĐĩĐēŅа да ĐąŅĐ´Đĩ иСŅŅĐ¸Ņ ĐģĐžĐēаĐģĐŊĐž",
|
||||
"delete_action_prompt": "{count} Ņа иСŅŅиŅи",
|
||||
"delete_album": "ĐСŅŅиК аĐģĐąŅĐŧ",
|
||||
"delete_api_key_prompt": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ ŅОСи API ĐēĐģŅŅ?",
|
||||
"delete_dialog_alert": "ĐĸĐĩСи ОйĐĩĐēŅи ŅĐĩ ĐąŅĐ´Đ°Ņ Đ¸ĐˇŅŅиŅи СавиĐŊĐ°ĐŗĐ¸ и ĐžŅ Immich ŅŅŅвŅŅа и ĐžŅ ŅŅŅŅОКŅŅвОŅĐž",
|
||||
@@ -756,6 +794,8 @@
|
||||
"delete_local_dialog_ok_backed_up_only": "ĐСŅŅиК ĐģĐžĐēаĐģĐŊĐž ŅаĐŧĐž аŅŅ
ивиŅаĐŊиŅĐĩ",
|
||||
"delete_local_dialog_ok_force": "ĐŅĐŋŅĐĩĐēи ŅОва иСŅŅиК",
|
||||
"delete_others": "ĐСŅŅиК ĐžŅŅаĐŊаĐģиŅĐĩ",
|
||||
"delete_permanently": "ĐСŅŅиК Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž",
|
||||
"delete_permanently_action_prompt": "{count} иСŅŅиŅи Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž",
|
||||
"delete_shared_link": "ĐСŅŅиваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
|
||||
"delete_shared_link_dialog_title": "ĐСŅŅиК ŅĐŋОдĐĩĐģĐĩĐŊаŅа вŅŅСĐēа",
|
||||
"delete_tag": "ĐСŅŅиК ŅĐ°Đŗ",
|
||||
@@ -766,6 +806,7 @@
|
||||
"description": "ĐĐŋиŅаĐŊиĐĩ",
|
||||
"description_input_hint_text": "ĐОйави ĐžĐŋиŅаĐŊиĐĩ...",
|
||||
"description_input_submit_error": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ĐžĐŋиŅаĐŊиĐĩŅĐž. Đа ĐŋОдŅОйĐŊĐžŅŅи виĐļŅĐĩ в Đ´ĐŊĐĩвĐŊиĐēа",
|
||||
"deselect_all": "ĐŅĐĩĐŧаŅ
ĐŊи иСйОŅа ĐžŅ Đ˛ŅиŅĐēи",
|
||||
"details": "ĐĐĩŅаКĐģи",
|
||||
"direction": "ĐĐžŅĐžĐēа",
|
||||
"disabled": "ĐСĐēĐģŅŅĐĩĐŊĐž",
|
||||
@@ -810,8 +851,12 @@
|
||||
"edit": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ",
|
||||
"edit_album": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧ",
|
||||
"edit_avatar": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа аваŅаŅ",
|
||||
"edit_birthday": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа ŅĐžĐļĐ´ĐĩĐŊ Đ´ĐĩĐŊ",
|
||||
"edit_date": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа даŅа",
|
||||
"edit_date_and_time": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа даŅа и ŅаŅ",
|
||||
"edit_date_and_time_action_prompt": "{count} даŅа и вŅĐĩĐŧĐĩ Ņа ŅĐĩдаĐēŅиŅаĐŊи",
|
||||
"edit_date_and_time_by_offset": "ĐŅĐžĐŧŅĐŊа ĐŊа даŅаŅа ŅŅĐĩС ĐžŅĐŧĐĩŅŅваĐŊĐĩ",
|
||||
"edit_date_and_time_by_offset_interval": "ĐОв ĐŋĐĩŅиОд ĐžŅ Đ˛ŅĐĩĐŧĐĩ: {from} - {to}",
|
||||
"edit_description": "Đ ĐĩдаĐēŅиŅаК ĐžĐŋиŅаĐŊиĐĩ",
|
||||
"edit_description_prompt": "ĐĐžĐģŅ, иСйĐĩŅи ĐŊОвО ĐžĐŋиŅаĐŊиĐĩ:",
|
||||
"edit_exclusion_pattern": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа ŅайĐģĐžĐŊ Са иСĐēĐģŅŅваĐŊĐĩ",
|
||||
@@ -840,6 +885,7 @@
|
||||
"empty_trash": "ĐСĐŋŅаСваĐŊĐĩ ĐŊа ĐēĐžŅ",
|
||||
"empty_trash_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСĐŋŅаСĐŊиŅĐĩ ĐēĐžŅŅĐĩŅĐž? ĐĸОва ŅĐĩ ĐŋŅĐĩĐŧаŅ
ĐŊĐĩ вŅиŅĐēĐž в ĐēĐžŅŅĐĩŅĐž Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž ĐžŅ Immich.\nĐĐĩ ĐŧĐžĐļĐĩŅĐĩ да ĐžŅĐŧĐĩĐŊиŅĐĩ ŅОва Đ´ĐĩĐšŅŅвиĐĩ!",
|
||||
"enable": "ĐĐēĐģŅŅваĐŊĐĩ",
|
||||
"enable_backup": "ĐĐēĐģŅŅи ŅĐĩСĐĩŅвĐŊĐžŅĐž ĐēĐžĐŋиŅаĐŊĐĩ",
|
||||
"enable_biometric_auth_description": "ĐŅвĐĩĐ´ĐĩŅĐĩ ваŅĐ¸Ņ PIN ĐēОд, Са да ŅаСŅĐĩŅиŅĐĩ йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
||||
"enabled": "ĐĐēĐģŅŅĐĩĐŊĐž",
|
||||
"end_date": "ĐŅаКĐŊа даŅа",
|
||||
@@ -850,7 +896,9 @@
|
||||
"error": "ĐŅĐĩŅĐēа",
|
||||
"error_change_sort_album": "ĐĐĩŅŅĐŋĐĩŅĐŊа ĐŋŅĐžĐŧŅĐŊа ĐŊа ŅĐĩда ĐŊа ŅĐžŅŅиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧ",
|
||||
"error_delete_face": "ĐŅĐĩŅĐēа ĐŋŅи иСŅŅиваĐŊĐĩ ĐŊа ĐģиŅĐĩ ĐžŅ Đ°ĐēŅива",
|
||||
"error_getting_places": "ĐŅĐĩŅĐēа ĐŋŅи ŅŅйиŅаĐŊĐĩ ĐŊа ĐŧĐĩŅŅаŅа",
|
||||
"error_loading_image": "ĐŅĐĩŅĐēа ĐŋŅи СаŅĐĩĐļдаĐŊĐĩ ĐŊа иСОйŅаĐļĐĩĐŊиĐĩŅĐž",
|
||||
"error_loading_partners": "ĐŅĐĩŅĐēа ĐŋŅи СаŅĐĩĐļдаĐŊĐĩ ĐŊа ĐŋаŅŅĐŊŅĐžŅи: {error}",
|
||||
"error_saving_image": "ĐŅĐĩŅĐēа: {error}",
|
||||
"error_tag_face_bounding_box": "ĐŅĐĩŅĐēа ĐŋŅи ĐžŅĐąĐĩĐģŅСваĐŊĐĩ ĐŊа ĐģиŅĐĩ - ĐŊĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋĐžĐģŅŅаваĐŊĐĩ ĐŊа ĐēООŅдиĐŊаŅи ĐŊа ŅаĐŧĐēаŅа",
|
||||
"error_title": "ĐŅĐĩŅĐēа - ĐŊĐĩŅĐž ŅĐĩ ОйŅŅĐēа",
|
||||
@@ -874,7 +922,7 @@
|
||||
"error_selecting_all_assets": "ĐŅĐĩŅĐēа ĐŋŅи иСйОŅа ĐŊа вŅиŅĐēи ŅаКĐģОвĐĩ",
|
||||
"exclusion_pattern_already_exists": "ĐĸОСи ĐŧОдĐĩĐģ Са иСĐēĐģŅŅваĐŊĐĩ вĐĩŅĐĩ ŅŅŅĐĩŅŅвŅва.",
|
||||
"failed_to_create_album": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ŅŅСдаваĐŊĐĩ ĐŊа аĐģĐąŅĐŧ",
|
||||
"failed_to_create_shared_link": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ŅŅСдаваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
||||
"failed_to_create_shared_link": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ŅŅСдаваĐŊĐĩ ĐŊа ŅĐŋoĐ´ĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
||||
"failed_to_edit_shared_link": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ŅĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
||||
"failed_to_get_people": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаŅĐĩĐļдаĐŊĐĩ ĐŊа Ņ
ĐžŅа",
|
||||
"failed_to_keep_this_delete_others": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаĐŋаСваĐŊĐĩ ĐŊа ŅОСи ОйĐĩĐēŅ Đ¸ иСŅŅиваĐŊĐĩ ĐŊа ĐžŅŅаĐŊаĐģиŅĐĩ ОйĐĩĐēŅи",
|
||||
@@ -883,6 +931,7 @@
|
||||
"failed_to_load_notifications": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаŅĐĩĐļдаĐŊĐĩ ĐŊа иСвĐĩŅŅиŅ",
|
||||
"failed_to_load_people": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаŅĐĩĐļдаĐŊĐĩ ĐŊа Ņ
ĐžŅа",
|
||||
"failed_to_remove_product_key": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋŅОдŅĐēŅĐžĐ˛Đ¸Ņ ĐēĐģŅŅ",
|
||||
"failed_to_reset_pin_code": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŊŅĐģиŅаĐŊĐĩ ĐŊа ĐĐĐ ĐēОда",
|
||||
"failed_to_stack_assets": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋОдŅĐĩĐļдаĐŊĐĩ ĐŊа ОйĐĩĐēŅи",
|
||||
"failed_to_unstack_assets": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋОдŅĐĩдйаŅа ĐŊа ОйĐĩĐēŅи",
|
||||
"failed_to_update_notification_status": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ŅŅŅŅĐžŅĐŊиĐĩŅĐž ĐŊа иСвĐĩŅŅиŅŅа",
|
||||
@@ -891,6 +940,7 @@
|
||||
"paths_validation_failed": "{paths, plural, one {# ĐŋŅŅ} other {# ĐŋŅŅиŅа}} ĐŊĐĩ ĐŋŅĐĩĐŧиĐŊаŅ
а ваĐģидаŅиŅ",
|
||||
"profile_picture_transparent_pixels": "ĐŅĐžŅиĐģĐŊиŅĐĩ ŅĐŊиĐŧĐēи ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° иĐŧĐ°Ņ ĐŋŅОСŅаŅĐŊи ĐŋиĐēŅĐĩĐģи. ĐĐžĐģŅ, ŅвĐĩĐģиŅĐĩŅĐĩ и/иĐģи ĐŋŅĐĩĐŧĐĩŅŅĐĩŅĐĩ иСОйŅаĐļĐĩĐŊиĐĩŅĐž.",
|
||||
"quota_higher_than_disk_size": "ĐададĐĩĐŊа Đĩ ĐēвОŅа, ĐŋĐž-ĐŗĐžĐģŅĐŧа ĐžŅ ŅаСĐŧĐĩŅа ĐŊа диŅĐēа",
|
||||
"something_went_wrong": "ĐĐĩŅĐž ŅĐĩ ОйŅŅĐēа",
|
||||
"unable_to_add_album_users": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģи в аĐģĐąŅĐŧ",
|
||||
"unable_to_add_assets_to_shared_link": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ОйĐĩĐēŅи в ŅĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
|
||||
"unable_to_add_comment": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ĐēĐžĐŧĐĩĐŊŅаŅ",
|
||||
@@ -976,13 +1026,11 @@
|
||||
},
|
||||
"exif": "Exif",
|
||||
"exif_bottom_sheet_description": "ĐОйави ĐĐŋиŅаĐŊиĐĩ...",
|
||||
"exif_bottom_sheet_description_error": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ĐžĐŋиŅаĐŊиĐĩ",
|
||||
"exif_bottom_sheet_details": "ĐĐĐĐ ĐĐĐĐĐĄĐĸĐ",
|
||||
"exif_bottom_sheet_location": "ĐĐ¯ĐĄĐĸĐ",
|
||||
"exif_bottom_sheet_people": "ĐĨĐĐ Đ",
|
||||
"exif_bottom_sheet_person_add_person": "ĐОйави иĐŧĐĩ",
|
||||
"exif_bottom_sheet_person_age_months": "ĐŅСŅаŅŅ {months} ĐŧĐĩŅĐĩŅа",
|
||||
"exif_bottom_sheet_person_age_year_months": "ĐŅСŅаŅŅ 1 ĐŗĐžĐ´Đ¸ĐŊа и {months} ĐŧĐĩŅĐĩŅа",
|
||||
"exif_bottom_sheet_person_age_years": "ĐŅСŅаŅŅ {years}",
|
||||
"exit_slideshow": "ĐСŅ
Од ĐžŅ ŅĐģаКдŅĐžŅŅĐž",
|
||||
"expand_all": "РаСŅиŅи вŅиŅĐēи",
|
||||
"experimental_settings_new_asset_list_subtitle": "Đ ŅаСвиŅиĐĩ",
|
||||
@@ -996,6 +1044,8 @@
|
||||
"explorer": "ĐŅĐĩĐŗĐģĐĩĐ´",
|
||||
"export": "ĐĐēŅĐŋĐžŅŅ",
|
||||
"export_as_json": "ĐĐēŅĐŋĐžŅŅиŅаĐŊĐĩ ĐēаŅĐž JSON",
|
||||
"export_database": "ĐĐēŅĐŋĐžŅŅ ĐŊа йаСаŅа даĐŊĐŊи",
|
||||
"export_database_description": "ĐĐēŅĐŋĐžŅŅ ĐŊа йаСаŅа даĐŊĐŊи SQLite",
|
||||
"extension": "РаСŅиŅĐĩĐŊиĐĩ",
|
||||
"external": "ĐŅĐŊŅĐŊĐž",
|
||||
"external_libraries": "ĐŅĐŊŅĐŊи йийĐģиОŅĐĩĐēи",
|
||||
@@ -1013,6 +1063,7 @@
|
||||
"favorites_page_no_favorites": "ĐĐĩ Ņа ĐŊаĐŧĐĩŅĐĩĐŊи ĐģŅйиĐŧи ОйĐĩĐēŅи",
|
||||
"feature_photo_updated": "ĐŅĐĩĐ´ŅŅавиŅĐĩĐģĐŊаŅа ŅĐŊиĐŧĐēа Đĩ ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊа",
|
||||
"features": "ФŅĐŊĐēŅии",
|
||||
"features_in_development": "ФŅĐŊĐēŅии в ĐŋŅĐžŅĐĩŅ ĐŊа ŅаСŅайОŅĐēа",
|
||||
"features_setting_description": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ŅŅĐŊĐēŅииŅĐĩ ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||
"file_name": "ĐĐŧĐĩ ĐŊа ŅаКĐģа",
|
||||
"file_name_or_extension": "ĐĐŧĐĩ ĐŊа ŅаКĐģ иĐģи ŅаСŅиŅĐĩĐŊиĐĩ",
|
||||
@@ -1022,21 +1073,26 @@
|
||||
"filter_people": "ФиĐģŅŅиŅаĐŊĐĩ ĐŊа Ņ
ĐžŅа",
|
||||
"filter_places": "ФиĐģŅŅŅ ĐŋĐž ĐŧŅŅŅĐž",
|
||||
"find_them_fast": "ĐаĐŧĐĩŅĐĩŅĐĩ ĐŗĐ¸ ĐąŅŅСО ĐŋĐž иĐŧĐĩ Ņ ŅŅŅŅĐĩĐŊĐĩ",
|
||||
"first": "ĐŅŅви",
|
||||
"fix_incorrect_match": "ĐĐžĐŋŅавŅĐŊĐĩ ĐŊа ĐŊĐĩĐŋŅавиĐģĐŊĐž ŅŅвĐŋадĐĩĐŊиĐĩ",
|
||||
"folder": "ĐаĐŋĐēа",
|
||||
"folder_not_found": "ĐаĐŋĐēаŅа ĐŊĐĩ Đĩ ĐŊаĐŧĐĩŅĐĩĐŊа",
|
||||
"folders": "ĐаĐŋĐēи",
|
||||
"folders_feature_description": "ĐŅĐĩĐŗĐģĐĩĐļдаĐŊĐĩ ĐŊа ĐŋаĐŋĐēаŅа Са ŅĐŊиĐŧĐēиŅĐĩ и видĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ в ŅаКĐģОваŅа ŅиŅŅĐĩĐŧа",
|
||||
"forgot_pin_code_question": "ĐайŅавиĐģи ŅŅĐĩ ŅĐ˛ĐžŅ ĐĐĐ ĐēОд?",
|
||||
"forward": "ĐаĐŋŅĐĩĐ´",
|
||||
"gcast_enabled": "Google Cast",
|
||||
"gcast_enabled_description": "Đа да ŅайОŅи ŅаСи ŅŅĐŊĐēŅĐ¸Ņ ĐˇĐ°ŅĐĩĐļда вŅĐŊŅĐŊи ŅĐĩŅŅŅŅи ĐžŅ Google.",
|
||||
"general": "ĐĐąŅи",
|
||||
"geolocation_instruction_location": "ĐСйĐĩŅĐĩŅĐĩ ОйĐĩĐēŅ Ņ GPS ĐēООŅдиĐŊаŅи Са да иСĐŋĐžĐģСваŅĐĩ ŅŅŅ
иĐģи иСйĐĩŅĐĩŅĐĩ ĐŧŅŅŅĐž диŅĐĩĐēŅĐŊĐž ĐžŅ ĐēаŅŅаŅа",
|
||||
"get_help": "ĐĐžĐŧĐžŅ",
|
||||
"get_wifiname_error": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋĐžĐģŅŅаваĐŊĐĩ иĐŧĐĩŅĐž ĐŊа Wi-Fi ĐŧŅĐĩĐļаŅа. ĐĐžĐģŅ, ŅĐąĐĩĐ´ĐĩŅĐĩ ŅĐĩ, ŅĐĩ Ņа ĐŋŅĐĩĐ´ĐžŅŅавĐĩĐŊи ĐŊŅĐļĐŊиŅĐĩ ŅаСŅĐĩŅĐĩĐŊĐ¸Ņ ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž и иĐŧа вŅŅСĐēа Ņ Wi-Fi",
|
||||
"getting_started": "ĐаĐē да СаĐŋĐžŅĐŊĐĩĐŧ",
|
||||
"go_back": "ĐŅŅŅаĐŊĐĩ ĐŊаСад",
|
||||
"go_to_folder": "ĐŅиди в ĐŋаĐŋĐēаŅа",
|
||||
"go_to_search": "ĐŅĐĩĐŧиĐŊаваĐŊĐĩ ĐēŅĐŧ ŅŅŅŅĐĩĐŊĐĩ",
|
||||
"gps": "GPS ĐēООŅдиĐŊаŅи",
|
||||
"gps_missing": "ĐŅĐŧа GPS ĐēООŅдиĐŊаŅи",
|
||||
"grant_permission": "ĐаК ŅаСŅĐĩŅĐĩĐŊиĐĩ",
|
||||
"group_albums_by": "ĐŅŅĐŋиŅаК аĐģĐąŅĐŧ ĐŋĐž...",
|
||||
"group_country": "ĐŅŅĐŋиŅаК ĐŋĐž Đ´ŅŅĐļава",
|
||||
@@ -1047,6 +1103,9 @@
|
||||
"haptic_feedback_switch": "ĐĐēĐģŅŅи ŅаĐēŅиĐģĐŊа ОйŅаŅĐŊа вŅŅСĐēа",
|
||||
"haptic_feedback_title": "ĐĸаĐēŅиĐģĐŊа ОйŅаŅĐŊа вŅŅСĐēа",
|
||||
"has_quota": "ĐиĐŧиŅ",
|
||||
"hash_asset": "ĐĐąĐĩĐēŅ Ņ Ņ
ĐĩŅ",
|
||||
"hashed_assets": "ĐĨĐĩŅиŅаĐŊи ОйĐĩĐēŅи",
|
||||
"hashing": "ĐĨĐĩŅиŅаĐŊĐĩ",
|
||||
"header_settings_add_header_tip": "ĐОйави ĐˇĐ°ĐŗĐģавиĐĩ",
|
||||
"header_settings_field_validator_msg": "ĐĐĩĐ´ĐžĐŋŅŅŅиĐŧĐž Đĩ да ĐŊŅĐŧа ŅŅОКĐŊĐžŅŅ",
|
||||
"header_settings_header_name_input": "ĐĐŧĐĩ ĐŊа ĐˇĐ°ĐŗĐģавиĐĩŅĐž",
|
||||
@@ -1078,7 +1137,9 @@
|
||||
"home_page_upload_err_limit": "ĐĐžĐļĐĩ да ĐēаŅваŅĐĩ ĐŧаĐēŅиĐŧŅĐŧ 30 ОйĐĩĐēŅа ĐĩĐ´ĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž, ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ",
|
||||
"host": "ĐĨĐžŅŅ",
|
||||
"hour": "ЧаŅ",
|
||||
"hours": "ЧаŅа",
|
||||
"id": "ID",
|
||||
"idle": "ĐĐĩСдĐĩĐšŅŅвиĐĩ",
|
||||
"ignore_icloud_photos": "ĐŅĐžĐŋŅŅĐŊи ŅĐŊиĐŧĐēи ĐžŅ iCloud",
|
||||
"ignore_icloud_photos_description": "ĐĄĐŊиĐŧĐēи, ĐēОиŅĐž Ņа СаĐŋаСĐĩĐŊи в iCloud ĐŊŅĐŧа да ŅĐĩ ĐēаŅĐ˛Đ°Ņ Đ˛ Immich ŅŅŅвŅŅа",
|
||||
"image": "ĐСОйŅаĐļĐĩĐŊиĐĩ",
|
||||
@@ -1136,10 +1197,13 @@
|
||||
"language_no_results_title": "ĐĐĩ Ņа ĐŊаĐŧĐĩŅĐĩĐŊи ĐĩСиŅи",
|
||||
"language_search_hint": "ĐĸŅŅŅĐĩĐŊĐĩ ĐŊа ĐĩСиŅи...",
|
||||
"language_setting_description": "ĐСйĐĩŅĐĩŅĐĩ ĐŋŅĐĩĐ´ĐŋĐžŅиŅаĐŊ ĐĩСиĐē",
|
||||
"large_files": "ĐĐžĐģĐĩĐŧи ŅаКĐģОвĐĩ",
|
||||
"last": "ĐĐžŅĐģĐĩĐ´ĐĩĐŊ",
|
||||
"last_seen": "ĐĐžŅĐģĐĩĐ´ĐŊĐž видŅĐŊĐž",
|
||||
"latest_version": "ĐĐžŅĐģĐĩĐ´ĐŊа вĐĩŅŅиŅ",
|
||||
"latitude": "ШиŅиĐŊа",
|
||||
"leave": "ĐСĐģĐĩС",
|
||||
"leave_album": "ĐаĐŋŅŅĐēаĐŊĐĩ ĐŊа аĐģĐąŅĐŧа",
|
||||
"lens_model": "ĐОдĐĩĐģ ĐģĐĩŅа",
|
||||
"let_others_respond": "ĐОСвОĐģĐĩŅĐĩ ĐŊа Đ´ŅŅĐŗĐ¸ŅĐĩ да ĐžŅĐŗĐžĐ˛ĐžŅŅŅ",
|
||||
"level": "ĐивО",
|
||||
@@ -1153,6 +1217,7 @@
|
||||
"library_page_sort_title": "ĐĐ°ĐŗĐģавиĐĩ ĐŊа аĐģĐąŅĐŧа",
|
||||
"licenses": "ĐиŅĐĩĐŊСи",
|
||||
"light": "ХвĐĩŅĐģĐž",
|
||||
"like": "ĐĨаŅĐĩŅаКŅĐĩ",
|
||||
"like_deleted": "ĐаŅĐž иСŅŅиŅ",
|
||||
"link_motion_video": "ĐиĐŊĐē ĐēŅĐŧ видĐĩĐž",
|
||||
"link_to_oauth": "ĐиĐŊĐē ĐēŅĐŧ OAuth",
|
||||
@@ -1160,7 +1225,10 @@
|
||||
"list": "ĐиŅŅ",
|
||||
"loading": "ĐаŅĐĩĐļдаĐŊĐĩ",
|
||||
"loading_search_results_failed": "ĐаŅĐĩĐļдаĐŊĐĩŅĐž ĐŊа ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž Đĩ ĐŊĐĩŅŅĐŋĐĩŅĐŊĐž",
|
||||
"local": "ĐĐžĐēаĐģĐŊĐž",
|
||||
"local_asset_cast_failed": "ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋŅĐĩдава ОйĐĩĐēŅ, ĐēОКŅĐž ĐžŅĐĩ ĐŊĐĩ Đĩ ĐēаŅĐĩĐŊ ĐŊа ŅŅŅвŅŅа",
|
||||
"local_assets": "ĐĐžĐēаĐģĐŊи ОйĐĩĐēŅи",
|
||||
"local_media_summary": "ĐйОйŅĐĩĐŊиĐĩ ĐŊа ĐģĐžĐēаĐģĐŊиŅĐĩ ĐŧĐĩдиКĐŊи ŅаКĐģОвĐĩ",
|
||||
"local_network": "ĐĐžĐēаĐģĐŊа ĐŧŅĐĩĐļа",
|
||||
"local_network_sheet_info": "ĐŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž ŅĐĩ ŅĐĩ ŅвŅŅĐļĐĩ ŅŅŅ ŅŅŅвŅŅа ĐŊа ŅОСи URL, ĐēĐžĐŗĐ°ŅĐž ŅŅŅŅОКŅŅвОŅĐž Đĩ ŅвŅŅСаĐŊĐž ĐēŅĐŧ СададĐĩĐŊаŅа Wi-Fi ĐŧŅĐĩĐļа",
|
||||
"location_permission": "РаСŅĐĩŅĐĩĐŊиĐĩ Са ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||
@@ -1172,6 +1240,7 @@
|
||||
"location_picker_longitude_hint": "ĐŅвĐĩĐ´ĐĩŅĐĩ ĐŗĐĩĐžĐŗŅаŅŅĐēа Đ´ŅĐģĐļиĐŊа ŅŅĐē",
|
||||
"lock": "ĐаĐēĐģŅŅи",
|
||||
"locked_folder": "ĐаĐēĐģŅŅĐĩĐŊа ĐŋаĐŋĐēа",
|
||||
"log_detail_title": "ĐОдŅОйĐŊĐžŅŅи ĐžŅ Đ´ĐŊĐĩвĐŊиĐēа",
|
||||
"log_out": "ĐСĐģиСаĐŊĐĩ",
|
||||
"log_out_all_devices": "ĐСĐģиСаĐŊĐĩ Ņ Đ˛ŅиŅĐēи ŅŅŅŅОКŅŅва",
|
||||
"logged_in_as": "ĐĐŋиŅаĐŊ ĐēаŅĐž {user}",
|
||||
@@ -1202,6 +1271,7 @@
|
||||
"login_password_changed_success": "ĐŖŅĐŋĐĩŅĐŊĐž ОйĐŊОвĐĩĐŊа ĐŋаŅĐžĐģа",
|
||||
"logout_all_device_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСĐģĐĩСĐĩŅĐĩ ĐžŅ Đ˛ŅиŅĐēи ŅŅŅŅОКŅŅва?",
|
||||
"logout_this_device_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСĐģĐĩСĐĩŅĐĩ ĐžŅ ŅОва ŅŅŅŅОКŅŅвО?",
|
||||
"logs": "ĐĐŊĐĩвĐŊиĐē",
|
||||
"longitude": "ĐŅĐģĐļиĐŊа",
|
||||
"look": "ĐĐˇĐŗĐģĐĩĐ´",
|
||||
"loop_videos": "ĐОвŅаŅŅĐŊĐĩ ĐŊа видĐĩаŅа",
|
||||
@@ -1209,6 +1279,7 @@
|
||||
"main_branch_warning": "ĐСĐŋĐžĐģСваŅĐĩ вĐĩŅŅĐ¸Ņ ĐˇĐ° ŅаСŅайОŅŅиŅи, ŅиĐģĐŊĐž ĐŋŅĐĩĐŋĐžŅŅŅваĐŧĐĩ да иСĐŋĐžĐģСваŅĐĩ ĐžŅиŅиаĐģĐŊа вĐĩŅŅиŅ!",
|
||||
"main_menu": "ĐĐģавĐŊĐž ĐŧĐĩĐŊŅ",
|
||||
"make": "ĐаŅĐēа",
|
||||
"manage_geolocation": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиŅŅа",
|
||||
"manage_shared_links": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊи вŅŅСĐēи",
|
||||
"manage_sharing_with_partners": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģŅĐŊĐĩŅĐž Ņ ĐŋаŅŅĐŊŅĐžŅи",
|
||||
"manage_the_app_settings": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||
@@ -1217,7 +1288,7 @@
|
||||
"manage_your_devices": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа вĐģĐĩСĐģиŅĐĩ в ŅиŅŅĐĩĐŧаŅа ŅŅŅŅОКŅŅва",
|
||||
"manage_your_oauth_connection": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа OAuth вŅŅСĐēаŅа",
|
||||
"map": "ĐаŅŅа",
|
||||
"map_assets_in_bounds": "{count} ŅĐŊиĐŧĐēи",
|
||||
"map_assets_in_bounds": "{count, plural, =0 {ĐŅĐŧа ŅĐŊиĐŧĐēи} one {# ŅĐŊиĐŧĐēа} other {# ŅĐŊиĐŧĐēи}}",
|
||||
"map_cannot_get_user_location": "ĐĐĩ ĐŧĐžĐļаŅ
да ĐŋĐžĐģŅŅа ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||
"map_location_dialog_yes": "Đа",
|
||||
"map_location_picker_page_use_location": "ĐСĐŋĐžĐģСваК ŅОва ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||
@@ -1225,7 +1296,6 @@
|
||||
"map_location_service_disabled_title": "ĐŖŅĐģŅĐŗĐ°Ņа Са ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Đĩ иСĐēĐģŅŅĐĩĐŊа",
|
||||
"map_marker_for_images": "ĐаŅĐēĐĩŅи ĐŊа ĐēаŅŅаŅа Са ŅĐŊиĐŧĐēи ĐŊаĐŋŅавĐĩĐŊи в {city}, {country}",
|
||||
"map_marker_with_image": "ĐаŅĐēĐĩŅ ĐŊа ĐēаŅŅаŅа Ņ Đ¸ĐˇĐžĐąŅаĐļĐĩĐŊиĐĩ",
|
||||
"map_no_assets_in_bounds": "ĐŅĐŧа ŅĐŊиĐŧĐēи ĐžŅ ŅОСи ŅаКОĐŊ",
|
||||
"map_no_location_permission_content": "Đа да ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐžĐąĐĩĐēŅиŅĐĩ ĐžŅ ŅĐĩĐēŅŅĐžŅĐž ĐŧŅŅŅĐž, ŅŅŅйва ŅаСŅĐĩŅĐĩĐŊиĐĩ Са ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž. ĐŅĐēаŅĐĩ Đģи да ĐŋŅĐĩĐ´ĐžŅŅавиŅĐĩ ŅаСŅĐĩŅĐĩĐŊиĐĩ ŅĐĩĐŗĐ°?",
|
||||
"map_no_location_permission_title": "ĐŅĐēаСаĐŊ Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||
"map_settings": "ĐаŅŅŅОКĐēи ĐŊа ĐēаŅŅаŅа",
|
||||
@@ -1244,6 +1314,7 @@
|
||||
"mark_as_read": "ĐаŅĐēиŅаК ĐēаŅĐž ŅĐĩŅĐĩĐŊĐž",
|
||||
"marked_all_as_read": "ĐŅиŅĐēи ĐŧаŅĐēиŅаĐŊи ĐēаŅĐž ĐŋŅĐžŅĐĩŅĐĩĐŊи",
|
||||
"matches": "ĐĄŅвĐŋадĐĩĐŊиŅ",
|
||||
"matching_assets": "ĐĄŅвĐŋадаŅи ОйĐĩĐēŅи",
|
||||
"media_type": "Đид ĐŧĐĩдиŅ",
|
||||
"memories": "ĐĄĐŋĐžĐŧĐĩĐŊи",
|
||||
"memories_all_caught_up": "ĐĸОва Đĩ вŅиŅĐēĐž Са Đ´ĐŊĐĩŅ",
|
||||
@@ -1262,6 +1333,7 @@
|
||||
"merged_people_count": "ĐĄĐģŅŅ {count, plural, one {# ŅОвĐĩĐē} other {# ŅОвĐĩĐēа}}",
|
||||
"minimize": "ĐиĐŊиĐŧиСиŅаĐŊĐĩ",
|
||||
"minute": "ĐиĐŊŅŅа",
|
||||
"minutes": "ĐиĐŊŅŅи",
|
||||
"missing": "ĐиĐŋŅваŅи",
|
||||
"model": "ĐОдĐĩĐģ",
|
||||
"month": "ĐĐĩŅĐĩŅ",
|
||||
@@ -1281,6 +1353,10 @@
|
||||
"my_albums": "ĐОи аĐģĐąŅĐŧи",
|
||||
"name": "ĐĐŧĐĩ",
|
||||
"name_or_nickname": "ĐĐŧĐĩ иĐģи ĐŋŅŅĐēĐžŅ",
|
||||
"network_requirement_photos_upload": "ĐСĐŋĐžĐģСваК ĐŧОйиĐģĐŊи даĐŊĐŊи Са аŅŅ
ивиŅаĐŊĐĩ ĐŊа ŅĐŊиĐŧĐēи",
|
||||
"network_requirement_videos_upload": "ĐСĐŋĐžĐģСваК ĐŧОйиĐģĐŊи даĐŊĐŊи Са аŅŅ
ивиŅаĐŊĐĩ ĐŊа видĐĩĐž",
|
||||
"network_requirements": "ĐСиŅĐēваĐŊĐ¸Ņ ĐēŅĐŧ ĐŧŅĐĩĐļаŅа",
|
||||
"network_requirements_updated": "ĐŅĐĩĐļОвиŅĐĩ ĐŊаŅŅŅОКĐēи Ņа ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊи, ĐŊŅĐģиŅаĐŊĐĩ ĐŊа ĐžĐŋаŅĐēаŅа Са аŅŅ
ивиŅаĐŊĐĩ",
|
||||
"networking_settings": "ĐŅĐĩĐļа",
|
||||
"networking_subtitle": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са вŅŅСĐēа ŅŅŅ ŅŅŅвŅŅа",
|
||||
"never": "ĐиĐēĐžĐŗĐ°",
|
||||
@@ -1290,6 +1366,7 @@
|
||||
"new_person": "ĐОв ŅОвĐĩĐē",
|
||||
"new_pin_code": "ĐОв PIN ĐēОд",
|
||||
"new_pin_code_subtitle": "ĐĸОва Đĩ ĐŋŅŅви Đ´ĐžŅŅŅĐŋ Đ´Đž СаĐēĐģŅŅĐĩĐŊа ĐŋаĐŋĐēа. ĐĄŅСдаКŅĐĩ PIN ĐēОд Са СаŅиŅĐĩĐŊ Đ´ĐžŅŅŅĐŋ Đ´Đž ŅаСи ŅŅŅаĐŊиŅа",
|
||||
"new_timeline": "ĐОва вŅĐĩĐŧĐĩва ĐģиĐŊиŅ",
|
||||
"new_user_created": "ĐĄŅСдадĐĩĐŊ ĐŊОв ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
||||
"new_version_available": "ĐĐĐĐЧĐĐ ĐĐĐĐ ĐĐĐ ĐĄĐĐ¯",
|
||||
"newest_first": "ĐаК-ĐŊОвиŅĐĩ ĐŋŅŅви",
|
||||
@@ -1303,19 +1380,25 @@
|
||||
"no_assets_message": "ĐĐĐĐĐĐĐĸĐ, ĐĐ ĐĐ ĐĐЧĐĐĸĐ ĐĐĒĐ ĐĐĐĸĐ ĐĄĐ ĐĄĐĐĐĐĐ",
|
||||
"no_assets_to_show": "ĐŅĐŧа ОйĐĩĐēŅи Са ĐŋĐžĐēаСваĐŊĐĩ",
|
||||
"no_cast_devices_found": "ĐŅĐŧа ĐŊаĐŧĐĩŅĐĩĐŊи ŅŅŅŅОКŅŅва Са ĐŋŅĐĩдаваĐŊĐĩ",
|
||||
"no_checksum_local": "ĐиĐŋŅĐ˛Đ°Ņ ĐēĐžĐŊŅŅĐžĐģĐŊи ŅŅĐŧи - ĐŊĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋĐžĐģŅŅĐ°Ņ ĐģĐžĐēаĐģĐŊи ОйĐĩĐēŅи",
|
||||
"no_checksum_remote": "ĐиĐŋŅĐ˛Đ°Ņ ĐēĐžĐŊŅŅĐžĐģĐŊи ŅŅĐŧи - ĐŊĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋĐžĐģŅŅĐ°Ņ ĐžĐąĐĩĐēŅи ĐžŅ ŅŅŅвŅŅа",
|
||||
"no_duplicates_found": "ĐĐĩ ĐąŅŅ
а ĐžŅĐēŅиŅи Đ´ŅĐąĐģиĐēаŅи.",
|
||||
"no_exif_info_available": "ĐŅĐŧа exif иĐŊŅĐžŅĐŧаŅиŅ",
|
||||
"no_explore_results_message": "ĐаŅĐĩŅĐĩ ĐžŅĐĩ ŅĐŊиĐŧĐēи, Са да ŅĐ°ĐˇĐŗĐģĐĩдаŅĐĩ ĐēĐžĐģĐĩĐēŅиŅŅа Ņи.",
|
||||
"no_favorites_message": "ĐОйавĐĩŅĐĩ в ĐģŅйиĐŧи, Са да ĐŊаĐŧиŅаŅĐĩ ĐąŅŅСО ĐŊаК-дОйŅиŅĐĩ Ņи ŅĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ",
|
||||
"no_libraries_message": "ĐĄŅСдаКŅĐĩ вŅĐŊŅĐŊа йийĐģиОŅĐĩĐēа Са да ŅĐ°ĐˇĐŗĐģĐĩĐļдаŅĐĩ ŅĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ",
|
||||
"no_local_assets_found": "ĐĐĩ Đĩ ĐŊаĐŧĐĩŅĐĩĐŊ ĐģĐžĐēаĐģĐĩĐŊ ОйĐĩĐēŅ Ņ ŅаĐēава ĐēĐžĐŊŅŅĐžĐģĐŊа ŅŅĐŧа",
|
||||
"no_locked_photos_message": "ĐĄĐŊиĐŧĐēиŅĐĩ и видĐĩаŅа в СаĐēĐģŅŅĐĩĐŊаŅа ĐŋаĐŋĐēа Ņа ŅĐēŅиŅи и ĐŊĐĩ ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐŋŅи ŅĐ°ĐˇĐŗĐģĐĩĐļдаĐŊĐĩ ĐŊа йийĐģиОŅĐĩĐēаŅа.",
|
||||
"no_name": "ĐĐĩС иĐŧĐĩ",
|
||||
"no_notifications": "ĐŅĐŧа иСвĐĩŅŅиŅ",
|
||||
"no_people_found": "ĐĐĩ Ņа ĐŊаĐŧĐĩŅĐĩĐŊи ŅŅĐžŅвĐĩŅŅŅваŅи Ņ
ĐžŅа",
|
||||
"no_places": "ĐŅĐŧа ĐŧĐĩŅŅа",
|
||||
"no_remote_assets_found": "ĐĐĩ Đĩ ĐŊаĐŧĐĩŅĐĩĐŊ ОйĐĩĐēŅ ĐŊа ŅŅŅвŅŅа Ņ ŅаĐēава ĐēĐžĐŊŅŅĐžĐģĐŊа ŅŅĐŧа",
|
||||
"no_results": "ĐŅĐŧа ŅĐĩСŅĐģŅаŅи",
|
||||
"no_results_description": "ĐĐŋиŅаКŅĐĩ ŅŅŅ ŅиĐŊĐžĐŊиĐŧ иĐģи ĐŋĐž-ОйŅа ĐēĐģŅŅОва Đ´ŅĐŧа",
|
||||
"no_shared_albums_message": "ĐĄŅСдаКŅĐĩ аĐģĐąŅĐŧ, Са да ŅĐŋОдĐĩĐģŅŅĐĩ ŅĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ Ņ Ņ
ĐžŅаŅа в ĐŧŅĐĩĐļаŅа Ņи",
|
||||
"no_uploads_in_progress": "ĐŅĐŧа ĐēаŅваĐŊĐĩ в ĐŧĐžĐŧĐĩĐŊŅа",
|
||||
"not_available": "ĐĐĩĐŊаĐģиŅĐŊĐž",
|
||||
"not_in_any_album": "ĐĐĩ Đĩ в ĐŊиĐēОК аĐģĐąŅĐŧ",
|
||||
"not_selected": "ĐĐĩ Đĩ иСйŅаĐŊĐž",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "ĐайĐĩĐģĐĩĐļĐēа: Đа да ĐŋŅиĐģĐžĐļиŅĐĩ ĐĩŅиĐēĐĩŅа Са ŅŅŅ
ŅаĐŊĐĩĐŊиĐĩ ĐēŅĐŧ ĐŋŅĐĩдваŅиŅĐĩĐģĐŊĐž ĐēаŅĐĩĐŊи аĐēŅиви, ŅŅаŅŅиŅаКŅĐĩ",
|
||||
@@ -1331,6 +1414,7 @@
|
||||
"oauth": "OAuth",
|
||||
"official_immich_resources": "ĐŅиŅиаĐģĐŊа иĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐˇĐ° Immich",
|
||||
"offline": "ĐŅĐģаКĐŊ",
|
||||
"offset": "ĐŅĐŧĐĩŅŅваĐŊĐĩ",
|
||||
"ok": "ĐОйŅĐĩ",
|
||||
"oldest_first": "ĐаК-ŅŅаŅиŅĐĩ ĐŋŅŅви",
|
||||
"on_this_device": "Đа ŅОва ŅŅŅŅОКŅŅвО",
|
||||
@@ -1349,10 +1433,13 @@
|
||||
"open_the_search_filters": "ĐŅваŅи ŅиĐģŅŅиŅĐĩ Са ŅŅŅŅĐĩĐŊĐĩ",
|
||||
"options": "ĐаŅŅŅОКĐēи",
|
||||
"or": "иĐģи",
|
||||
"organize_into_albums": "Organitzar per à lbums",
|
||||
"organize_into_albums_description": "Posar les fotos existents dins dels à lbums fent servir la configuraciÃŗ de sincronitzaciÃŗ",
|
||||
"organize_your_library": "ĐŅĐŗĐ°ĐŊиСиŅаĐŊĐĩ ĐŊа ваŅаŅа йийĐģиОŅĐĩĐēа",
|
||||
"original": "ĐžŅĐ¸ĐŗĐ¸ĐŊаĐģ",
|
||||
"other": "ĐŅŅĐŗĐ¸",
|
||||
"other_devices": "ĐŅŅĐŗĐ¸ ŅŅŅŅОКŅŅва",
|
||||
"other_entities": "ĐŅŅĐŗĐ¸ ОйĐĩĐēŅи",
|
||||
"other_variables": "ĐŅŅĐŗĐ¸ ĐŋŅĐžĐŧĐĩĐŊĐģиви",
|
||||
"owned": "ĐОиŅĐĩ",
|
||||
"owner": "ХОйŅŅвĐĩĐŊиĐē",
|
||||
@@ -1407,6 +1494,9 @@
|
||||
"permission_onboarding_permission_limited": "ĐĐŗŅаĐŊиŅĐĩĐŊ Đ´ĐžŅŅŅĐŋ. Đа да ĐŧĐžĐļĐĩ Immich да аŅŅ
ивиŅа и ŅĐŋŅавĐģŅва ĐŗĐ°ĐģĐĩŅиŅŅа, ĐŋŅĐĩĐ´ĐžŅŅавĐĩŅĐĩ Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐŊиĐŧĐēи и видĐĩĐž в ĐŊаŅŅŅОКĐēиŅĐĩ.",
|
||||
"permission_onboarding_request": "Immich ŅĐĩ ĐŊŅĐļдаĐĩ ĐžŅ ŅаСŅĐĩŅĐĩĐŊиĐĩ Са ĐŋŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅĐŊиĐŧĐēи и видĐĩĐž.",
|
||||
"person": "ЧОвĐĩĐē",
|
||||
"person_age_months": "{months, plural, one {# ĐŧĐĩŅĐĩŅ} other {# ĐŧĐĩŅĐĩŅа}}",
|
||||
"person_age_year_months": "1 ĐŗĐžĐ´Đ¸ĐŊа и {months, plural, one {# ĐŧĐĩŅĐĩŅ} other {# ĐŧĐĩŅĐĩŅа}}",
|
||||
"person_age_years": "{years, plural, other {# ĐŗĐžĐ´Đ¸ĐŊи}}",
|
||||
"person_birthdate": "ĐаŅа ĐŊа ŅаĐļдаĐŊĐĩ {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (ŅĐēŅиŅ)} other {}}",
|
||||
"photo_shared_all_users": "ĐĐˇĐŗĐģĐĩĐļда, ŅĐĩ ŅŅĐĩ ŅĐŋОдĐĩĐģиĐģи ŅĐŊиĐŧĐēиŅĐĩ Ņи Ņ Đ˛ŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи иĐģи ĐŊŅĐŧаŅĐĩ ĐŋĐžŅŅĐĩйиŅĐĩĐģи, Ņ ĐēОиŅĐž да ŅĐŋОдĐĩĐģŅŅĐĩ.",
|
||||
@@ -1446,6 +1536,7 @@
|
||||
"profile_drawer_client_out_of_date_minor": "ĐОйиĐģĐŊĐžŅĐž ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ Đĩ ĐžŅŅаŅŅĐģĐž. ĐĐžĐģŅ, аĐēŅŅаĐģиСиŅаК Đ´Đž ĐŊаК-ĐŊОваŅа вĐĩŅŅиŅ.",
|
||||
"profile_drawer_client_server_up_to_date": "ĐĐģиĐĩĐŊŅа и ŅŅŅвŅŅа Ņа ОйĐŊОвĐĩĐŊи",
|
||||
"profile_drawer_github": "GitHub",
|
||||
"profile_drawer_readonly_mode": "Đ ĐĩĐļиĐŧа ŅаĐŧĐž Са ŅĐĩŅĐĩĐŊĐĩ Đĩ аĐēŅивиŅаĐŊ. ĐĄ Đ´ŅĐģĐŗĐž ĐŊаŅиŅĐēаĐŊĐĩ вŅŅŅ
Ņ ĐēаŅŅиĐēаŅа-аваŅĐ°Ņ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ ŅĐĩ Đ´ĐĩаĐēŅивиŅаŅĐĩ ŅаĐŧĐž Са ŅĐĩŅĐĩĐŊĐĩ.",
|
||||
"profile_drawer_server_out_of_date_major": "ĐĐĩŅŅиŅŅа ĐŊа ŅŅŅвŅŅа Đĩ ĐžŅŅаŅŅĐģа. ĐĐžĐģŅ, аĐēŅŅаĐģиСиŅаК ĐŋĐžĐŊĐĩ Đ´Đž ĐŋĐžŅĐģĐĩĐ´ĐŊаŅа ĐŗĐģавĐŊа вĐĩŅŅиŅ.",
|
||||
"profile_drawer_server_out_of_date_minor": "ĐĐĩŅŅиŅŅа ĐŊа ŅŅŅвŅŅа Đĩ ĐžŅŅаŅŅĐģа. ĐĐžĐģŅ, аĐēŅŅаĐģиСиŅаК Đ´Đž ĐŋĐžŅĐģĐĩĐ´ĐŊаŅа вĐĩŅŅиŅ.",
|
||||
"profile_image_of_user": "ĐŅĐžŅиĐģĐŊа ŅĐŊиĐŧĐēа ĐŊа {user}",
|
||||
@@ -1484,12 +1575,16 @@
|
||||
"purchase_server_description_2": "ĐĄŅаŅŅŅ ĐŊа ĐŋОддŅŅĐļĐŊиĐē",
|
||||
"purchase_server_title": "ĐĄŅŅвŅŅ",
|
||||
"purchase_settings_server_activated": "ĐŅОдŅĐēŅОвиŅŅ ĐēĐģŅŅ ĐŊа ŅŅŅвŅŅа ŅĐĩ ŅĐŋŅавĐģŅва ĐžŅ Đ°Đ´ĐŧиĐŊиŅŅŅаŅĐžŅа",
|
||||
"query_asset_id": "Buscar item per ID",
|
||||
"queue_status": "Đ ĐžĐŋаŅĐēа {count} ĐžŅ {total}",
|
||||
"rating": "ĐŅĐĩĐŊĐēа ŅŅŅ ĐˇĐ˛ĐĩСди",
|
||||
"rating_clear": "ĐСŅиŅŅи ĐžŅĐĩĐŊĐēаŅа",
|
||||
"rating_count": "{count, plural, one {# СвĐĩСда} other {# СвĐĩСди}}",
|
||||
"rating_description": "ĐĐžĐēаĐļи EXIF ĐžŅĐĩĐŊĐēаŅа в ĐŋаĐŊĐĩĐģа Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ",
|
||||
"reaction_options": "ĐĐˇĐąĐžŅ ĐŊа ŅĐĩаĐēŅиŅ",
|
||||
"read_changelog": "ĐŅĐžŅĐĩŅи ĐŋŅĐžĐŧĐĩĐŊиŅĐĩ",
|
||||
"readonly_mode_disabled": "Đ ĐĩĐļиĐŧа ŅаĐŧĐž Са ŅĐĩŅĐĩĐŊĐĩ Đĩ Đ´ĐĩаĐēŅивиŅаĐŊ",
|
||||
"readonly_mode_enabled": "Đ ĐĩĐļиĐŧа ŅаĐŧĐž Са ŅĐĩŅĐĩĐŊĐĩ Đĩ аĐēŅивиŅаĐŊ",
|
||||
"reassign": "ĐŅĐĩĐŊаСĐŊаŅаваĐŊĐĩ",
|
||||
"reassigned_assets_to_existing_person": "ĐŅĐĩĐŊаСĐŊаŅĐĩĐŊи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐŊа {name, select, null {ŅŅŅĐĩŅŅвŅĐ˛Đ°Ņ ŅОвĐĩĐē} other {{name}}}",
|
||||
"reassigned_assets_to_new_person": "ĐŅĐĩĐŊаСĐŊаŅĐĩĐŊи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐŊа ĐŊОв ŅОвĐĩĐē",
|
||||
@@ -1512,6 +1607,9 @@
|
||||
"refreshing_faces": "ĐĐŋŅĐĩŅĐŊŅваĐŊĐĩ ĐŊа ĐģиŅаŅа",
|
||||
"refreshing_metadata": "ĐĐŋŅĐĩŅĐŊŅваĐŊĐĩ ĐŊа ĐŧĐĩŅадаĐŊĐŊиŅĐĩ",
|
||||
"regenerating_thumbnails": "ĐŅĐĩŅŅСдаваĐŊĐĩ ĐŊа ĐŧиĐŊиаŅŅŅиŅĐĩ",
|
||||
"remote": "Đа ŅŅŅвŅŅа",
|
||||
"remote_assets": "ĐĐąĐĩĐēŅи ĐŊа ŅŅŅвŅŅа",
|
||||
"remote_media_summary": "ĐйОйŅĐĩĐŊиĐĩ ĐŊа ĐŧĐĩдиКĐŊиŅĐĩ ŅаКĐģОвĐĩ ĐŊа ŅŅŅвŅŅа",
|
||||
"remove": "ĐŅĐĩĐŧаŅ
ĐŊи",
|
||||
"remove_assets_album_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐžŅ Đ°ĐģĐąŅĐŧа?",
|
||||
"remove_assets_shared_link_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐžŅ ŅОСи ŅĐŋĐžĐĩĐ´ĐĩĐģĐĩĐŊ ĐģиĐŊĐē?",
|
||||
@@ -1549,19 +1647,29 @@
|
||||
"reset_password": "ĐŅĐģиŅаĐŊĐĩ ĐŊа ĐŋаŅĐžĐģаŅа",
|
||||
"reset_people_visibility": "ĐŅĐģиŅаĐŊĐĩ ĐŊа видиĐŧĐžŅŅŅа ĐŊа Ņ
ĐžŅаŅа",
|
||||
"reset_pin_code": "ĐŅĐģиŅаК PIN ĐēОда",
|
||||
"reset_pin_code_description": "ĐĐēĐž ŅŅĐĩ Ņи СайŅавиĐģи ĐĐĐ ĐēОда, ĐŧĐžĐļĐĩ да ŅĐĩ ОйŅŅĐŊĐĩŅĐĩ ĐēŅĐŧ адĐŧиĐŊиŅŅŅаŅĐžŅа ĐŊа ŅŅŅвŅŅа Са да ĐŗĐž ĐŊŅĐģиŅа",
|
||||
"reset_pin_code_success": "ĐŖŅĐŋĐĩŅĐŊĐž ĐŊŅĐģиŅаĐŊ ĐĐĐ ĐēОд",
|
||||
"reset_pin_code_with_password": "ĐĄ ваŅаŅа ĐŋаŅĐžĐģа ĐŧĐžĐļĐĩŅĐĩ виĐŊĐ°ĐŗĐ¸ да ĐŊŅĐģиŅаŅĐĩ ŅĐ˛ĐžŅ ĐĐĐ ĐēОд",
|
||||
"reset_sqlite": "ĐŅĐģиŅаĐŊĐĩ ĐŊа йаСаŅа даĐŊĐŊи SQLite",
|
||||
"reset_sqlite_confirmation": "ĐаиŅŅиĐŊа Đģи иŅĐēаŅĐĩ да ĐŊŅĐģиŅаŅĐĩ йаСаŅа даĐŊĐŊи SQLite? ĐŠĐĩ ŅŅŅйва да иСĐģĐĩСĐĩŅĐĩ ĐžŅ ŅиŅŅĐĩĐŧаŅа и да ŅĐĩ вĐŋиŅĐĩŅĐĩ ĐžŅĐŊОвО Са ĐŊОва ŅиĐŊŅ
ŅĐžĐŊиСаŅĐ¸Ņ ĐŊа даĐŊĐŊиŅĐĩ",
|
||||
"reset_sqlite_success": "ĐŖŅĐŋĐĩŅĐŊĐž ĐŊŅĐģиŅаĐŊĐĩ ĐŊа йаСаŅа даĐŊĐŊи SQLite",
|
||||
"reset_to_default": "ĐŅŅŅаĐŊĐĩ ĐŊа ŅайŅиŅĐŊи ĐŊаŅŅŅОКĐēи",
|
||||
"resolve_duplicates": "Đ ĐĩŅи Đ´ŅĐąĐģиĐēаŅиŅĐĩ",
|
||||
"resolved_all_duplicates": "ĐŅиŅĐēи Đ´ŅĐąĐģиĐēаŅи Ņа ŅĐĩŅĐĩĐŊи",
|
||||
"restore": "ĐŅСŅŅаĐŊОвŅваĐŊĐĩ",
|
||||
"restore_all": "ĐŅСŅŅаĐŊОви вŅиŅĐēи",
|
||||
"restore_trash_action_prompt": "{count} вŅСŅŅаĐŊОвĐĩĐŊи ĐžŅ ĐēĐžŅа",
|
||||
"restore_user": "ĐŅСŅŅаĐŊОви ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
||||
"restored_asset": "ĐŅСŅŅаĐŊОвĐĩĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ",
|
||||
"resume": "ĐŅОдŅĐģĐļаваĐŊĐĩ",
|
||||
"resume_paused_jobs": "ĐŅОдŅĐģĐļи иСĐŋŅĐģĐŊĐĩĐŊиĐĩŅĐž ĐŊа {count, plural, one {# СадаŅа} other {# СадаŅи}}",
|
||||
"retry_upload": "ĐĐŋиŅаК ĐēаŅваĐŊĐĩŅĐž ĐžŅĐŊОвО",
|
||||
"review_duplicates": "Đ Đ°ĐˇĐŗĐģĐĩдаК Đ´ŅĐąĐģиĐēаŅиŅĐĩ",
|
||||
"review_large_files": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ĐŗĐžĐģĐĩĐŧи ŅаКĐģОвĐĩ",
|
||||
"role": "Đ ĐžĐģŅ",
|
||||
"role_editor": "Đ ĐĩдаĐēŅĐžŅ",
|
||||
"role_viewer": "ĐŅиŅĐĩĐģ",
|
||||
"running": "ĐСĐŋŅĐģĐŊŅваĐŊĐĩ",
|
||||
"save": "ĐаĐŋаСи",
|
||||
"save_to_gallery": "ĐаĐŋаСи в ĐŗĐ°ĐģĐĩŅиŅŅа",
|
||||
"saved_api_key": "ĐаĐŋаСĐĩĐŊ API Key",
|
||||
@@ -1648,6 +1756,7 @@
|
||||
"select_user_for_sharing_page_err_album": "ĐĄŅСдаваĐŊĐĩŅĐž ĐŊа аĐģĐąŅĐŧ ĐŊĐĩ ĐąĐĩ ŅŅĐŋĐĩŅĐŊĐž",
|
||||
"selected": "ĐСйŅаĐŊĐž",
|
||||
"selected_count": "{count, plural, other {# иСйŅаĐŊи}}",
|
||||
"selected_gps_coordinates": "ĐСйŅаĐŊи GPS ĐēООŅдиĐŊаŅи",
|
||||
"send_message": "ĐСĐŋŅаŅĐĩŅĐĩ ŅŅОйŅĐĩĐŊиĐĩ",
|
||||
"send_welcome_email": "ĐСĐŋŅаŅĐĩŅĐĩ иĐŧĐĩĐšĐģ Са дОйŅĐĩ Đ´ĐžŅĐģи",
|
||||
"server_endpoint": "ĐĐ´ŅĐĩŅ ĐŊа ŅŅŅвŅŅа",
|
||||
@@ -1715,6 +1824,7 @@
|
||||
"shared_link_clipboard_copied_massage": "ĐĐžĐŋиŅаĐŊĐž в ĐēĐģиĐŋйОŅда",
|
||||
"shared_link_clipboard_text": "ĐŅŅСĐēа: {link}\nĐаŅĐžĐģа: {password}",
|
||||
"shared_link_create_error": "ĐŅĐĩŅĐēа ĐŋŅи ŅŅСдаваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
||||
"shared_link_custom_url_description": "ĐĐžŅŅŅĐŋĐĩŅĐĩ ŅĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ ĐģиĐŊĐē Ņ ĐŋĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ URL адŅĐĩŅ",
|
||||
"shared_link_edit_description_hint": "ĐŅвĐĩди ĐžĐŋиŅаĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊĐžŅĐž",
|
||||
"shared_link_edit_expire_after_option_day": "1 Đ´ĐĩĐŊ",
|
||||
"shared_link_edit_expire_after_option_days": "{count} Đ´ĐŊи",
|
||||
@@ -1740,6 +1850,7 @@
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊиŅĐĩ вŅŅСĐēи",
|
||||
"shared_link_options": "ĐĐŋŅии Са ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
||||
"shared_link_password_description": "ĐСиŅĐēваĐŊĐĩ ĐŊа ĐŋаŅĐžĐģа Са Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ ĐģиĐŊĐē",
|
||||
"shared_links": "ĐĄĐŋОдĐĩĐģĐĩĐŊи вŅŅСĐēи",
|
||||
"shared_links_description": "ĐĄĐŋОдĐĩĐģи ŅĐŊиĐŧĐēи и видĐĩа Ņ ĐģиĐŊĐē",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# ŅĐŋОдĐĩĐģĐĩĐŊи ŅĐŊиĐŧĐēи и видĐĩа.}}",
|
||||
@@ -1774,6 +1885,7 @@
|
||||
"show_slideshow_transition": "ĐĐžĐēаĐļи ĐŋŅĐĩŅ
Ода ĐŊа ŅĐģаКдŅĐžŅŅĐž",
|
||||
"show_supporter_badge": "ĐĐŊаŅĐēа ĐŋОддŅŅĐļĐŊиĐē",
|
||||
"show_supporter_badge_description": "ĐĐžĐēаĐļи СĐŊаŅĐēа ĐŋОддŅŅĐļĐŊиĐē",
|
||||
"show_text_search_menu": "ĐĐžĐēаĐļи ĐŧĐĩĐŊŅŅĐž Са ŅŅŅŅĐĩĐŊĐĩ ĐŊа ŅĐĩĐēŅŅ",
|
||||
"shuffle": "РаСйŅŅĐēваĐŊĐĩ",
|
||||
"sidebar": "ĐĄŅŅаĐŊиŅĐŊа ĐģĐĩĐŊŅа",
|
||||
"sidebar_display_description": "ĐĐžĐēаСваĐŊĐĩ ĐŊа вŅŅСĐēа ĐēŅĐŧ Đ¸ĐˇĐŗĐģĐĩда в ŅŅŅаĐŊиŅĐŊаŅа ĐģĐĩĐŊŅа",
|
||||
@@ -1789,6 +1901,7 @@
|
||||
"sort_created": "ĐаŅа ĐŊа ŅŅСдаваĐŊĐĩ",
|
||||
"sort_items": "ĐŅОК ĐĩĐģĐĩĐŧĐĩĐŊŅи",
|
||||
"sort_modified": "ĐаŅа ĐŊа ĐŋŅĐžĐŧŅĐŊа",
|
||||
"sort_newest": "ĐаК-ĐŊОви ŅĐŊиĐŧĐēи",
|
||||
"sort_oldest": "ĐаК-ŅŅаŅаŅа ŅĐŊиĐŧĐēа",
|
||||
"sort_people_by_similarity": "ĐĄĐžŅŅиŅаĐŊĐĩ ĐŊа Ņ
ĐžŅа ĐŋĐž ĐŋŅиĐģиĐēа",
|
||||
"sort_recent": "ĐаК-ĐŊОваŅа ŅĐŊиĐŧĐēа",
|
||||
@@ -1815,6 +1928,7 @@
|
||||
"storage_quota": "ĐвОŅа ĐŊа Ņ
ŅаĐŊиĐģиŅĐĩŅĐž",
|
||||
"storage_usage": "ĐСĐŋĐžĐģСваĐŊи {used} ĐžŅ {available}",
|
||||
"submit": "ĐСĐŋŅаŅаĐŊĐĩ",
|
||||
"success": "ĐŖŅĐŋĐĩŅĐŊĐž",
|
||||
"suggestions": "ĐŅĐĩĐ´ĐģĐžĐļĐĩĐŊиŅ",
|
||||
"sunrise_on_the_beach": "ĐĐˇĐŗŅĐĩв ĐŊа ĐŋĐģаĐļа",
|
||||
"support": "ĐОддŅŅĐļĐēа",
|
||||
@@ -1824,6 +1938,10 @@
|
||||
"sync": "ХиĐŊŅ
ŅĐžĐŊиСиŅаĐŊĐĩ",
|
||||
"sync_albums": "ХиĐŊŅ
ŅĐžĐŊиСиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧи",
|
||||
"sync_albums_manual_subtitle": "ХиĐŊŅ
ŅĐžĐŊиСиŅаК вŅиŅĐēи СаŅĐĩĐ´ĐĩĐŊи видĐĩа и ŅĐŊиĐŧĐēи в иСйŅаĐŊиŅĐĩ аŅŅ
ивĐŊи аĐģĐąŅĐŧи",
|
||||
"sync_local": "ĐĐžĐēаĐģĐŊа ŅиĐŊŅ
ŅĐžĐŊиСаŅиŅ",
|
||||
"sync_remote": "ХиĐŊŅ
ŅĐžĐŊиСаŅĐ¸Ņ ŅŅŅ ŅŅŅвŅŅа",
|
||||
"sync_status": "ĐĄŅŅŅĐžŅĐŊиĐĩ ĐŊа ŅиĐŊŅ
ŅĐžĐŊиСаŅиŅŅа",
|
||||
"sync_status_subtitle": "ĐŅĐĩĐŗĐģĐĩĐ´ и ŅĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ŅиŅŅĐĩĐŧаŅа Са ŅиĐŊŅ
ŅĐžĐŊиСаŅиŅ",
|
||||
"sync_upload_album_setting_subtitle": "ĐĄŅСдаваКŅĐĩ и СаŅĐĩĐļдаКŅĐĩ ŅĐŊиĐŧĐēи и видĐĩа в иСйŅаĐŊи аĐģĐąŅĐŧи в Immich",
|
||||
"tag": "ĐĸĐ°Đŗ",
|
||||
"tag_assets": "ĐĸĐ°ĐŗĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅи",
|
||||
@@ -1834,6 +1952,7 @@
|
||||
"tag_updated": "ĐĐēŅŅаĐģиСиŅаĐŊ ĐĩŅиĐēĐĩŅ: {tag}",
|
||||
"tagged_assets": "ĐĸĐ°ĐŗĐŊаŅи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅи}}",
|
||||
"tags": "ĐŅиĐēĐĩŅ",
|
||||
"tap_to_run_job": "ĐĐžĐēĐžŅĐŊĐĩŅĐĩ, Са да ŅŅаŅŅиŅаŅĐĩ СадаŅаŅа",
|
||||
"template": "ШайĐģĐžĐŊ",
|
||||
"theme": "ĐĸĐĩĐŧа",
|
||||
"theme_selection": "ĐĐˇĐąĐžŅ ĐŊа ŅĐĩĐŧа",
|
||||
@@ -1860,7 +1979,9 @@
|
||||
"to_change_password": "ĐŅĐžĐŧŅĐŊа ĐŊа ĐŋаŅĐžĐģаŅа",
|
||||
"to_favorite": "ĐŅйиĐŧ",
|
||||
"to_login": "ĐĐŋиŅваĐŊĐĩ",
|
||||
"to_multi_select": "Са Đ¸ĐˇĐąĐžŅ ĐŊа ĐŊŅĐēĐžĐģĐēĐž",
|
||||
"to_parent": "ĐŅиди ĐēŅĐŧ ŅОдиŅĐĩĐģŅĐēĐ¸Ņ ĐĩĐģĐĩĐŧĐĩĐŊŅ",
|
||||
"to_select": "Са иСйОŅ",
|
||||
"to_trash": "ĐĐžŅŅĐĩ",
|
||||
"toggle_settings": "ĐŅĐĩвĐēĐģŅŅваĐŊĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ",
|
||||
"total": "ĐĐąŅĐž",
|
||||
@@ -1880,6 +2001,7 @@
|
||||
"trash_page_select_assets_btn": "ĐСйĐĩŅи ОйĐĩĐēŅи",
|
||||
"trash_page_title": "Đ ĐēĐžŅа ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "ĐСŅ
вŅŅĐģĐĩĐŊиŅĐĩ в ĐēĐžŅŅĐĩŅĐž ĐĩĐģĐĩĐŧĐĩĐŊŅи ŅĐĩ ĐąŅĐ´Đ°Ņ Đ¸ĐˇŅŅиŅи Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž ŅĐģĐĩĐ´ {days, plural, one {# Đ´ĐĩĐŊ} other {# Đ´ĐŊи}}.",
|
||||
"troubleshoot": "ĐŅŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŋŅОйĐģĐĩĐŧи",
|
||||
"type": "ĐĸиĐŋ",
|
||||
"unable_to_change_pin_code": "ĐĐĩвŅСĐŧĐžĐļĐŊа ĐŋŅĐžĐŧŅĐŊа ĐŊа PIN ĐēОда",
|
||||
"unable_to_setup_pin_code": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СадаваĐŊĐĩ ĐŊа PIN ĐēОда",
|
||||
@@ -1910,13 +2032,17 @@
|
||||
"unstacked_assets_count": "РаСĐēаŅĐĩĐŊи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅи}}",
|
||||
"untagged": "ĐĐĩĐŧаŅĐēиŅаĐŊи",
|
||||
"up_next": "ĐĄĐģĐĩдваŅ",
|
||||
"update_location_action_prompt": "ĐĐąĐŊОви ĐēООŅдиĐŊаŅиŅĐĩ ĐŊа {count} иСйŅаĐŊи ОйĐĩĐēŅа Ņ:",
|
||||
"updated_at": "ĐĐąĐŊОвĐĩĐŊĐž",
|
||||
"updated_password": "ĐаŅĐžĐģаŅа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
||||
"upload": "ĐаŅваĐŊĐĩ",
|
||||
"upload_action_prompt": "{count} ĐŊа ĐžĐŋаŅĐēа Са ĐēаŅваĐŊĐĩ",
|
||||
"upload_concurrency": "ĐŖŅĐŋĐžŅĐĩĐ´ĐŊи ĐēаŅваĐŊиŅ",
|
||||
"upload_details": "ĐĐĩŅаКĐģи Са ĐēаŅваĐŊĐĩŅĐž",
|
||||
"upload_dialog_info": "ĐŅĐēаŅĐĩ Đģи да аŅŅ
ивиŅаŅĐĩ ĐŊа ŅŅŅвŅŅа иСйŅаĐŊиŅĐĩ ОйĐĩĐēŅи?",
|
||||
"upload_dialog_title": "ĐаŅи ОйĐĩĐēŅ",
|
||||
"upload_errors": "ĐаŅваĐŊĐĩŅĐž Đĩ СавŅŅĐĩĐŊĐž Ņ {count, plural, one {# ĐŗŅĐĩŅĐēа} other {# ĐŗŅĐĩŅĐēи}}, ОйĐŊОвĐĩŅĐĩ ŅŅŅаĐŊиŅаŅа Са да видиŅĐĩ ĐŊОвиŅĐĩ ĐĩĐģĐĩĐŧĐĩĐŊŅи.",
|
||||
"upload_finished": "ĐаŅваĐŊĐĩŅĐž СавŅŅŅи",
|
||||
"upload_progress": "ĐŅŅĐ°Đ˛Đ°Ņ {remaining, number} - ĐĐąŅайОŅĐĩĐŊи {processed, number}/{total, number}",
|
||||
"upload_skipped_duplicates": "ĐŅĐĩŅĐēĐžŅĐĩĐŊи {count, plural, one {# Đ´ŅĐąĐģиŅаĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# Đ´ŅĐąĐģиŅаĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅи}}",
|
||||
"upload_status_duplicates": "ĐŅĐąĐģиĐēаŅи",
|
||||
@@ -1925,6 +2051,7 @@
|
||||
"upload_success": "ĐаŅваĐŊĐĩŅĐž Đĩ ŅŅĐŋĐĩŅĐŊĐž, ĐžĐŋŅĐĩŅĐŊĐĩŅĐĩ ŅŅŅаĐŊиŅаŅа, Са да видиŅĐĩ ĐŊОвиŅĐĩ ŅаКĐģОвĐĩ.",
|
||||
"upload_to_immich": "ĐаСваĐŊĐĩ в Immich ({count})",
|
||||
"uploading": "ĐаŅваĐŧĐĩ",
|
||||
"uploading_media": "ĐаŅваĐŊĐĩ ĐŊа ĐŧĐĩдиКĐŊи ŅаКĐģОвĐĩ",
|
||||
"url": "URL",
|
||||
"usage": "ĐĐžŅŅĐĩĐąĐģĐĩĐŊиĐĩ",
|
||||
"use_biometric": "ĐСĐŋĐžĐģСваК йиОĐŧĐĩŅŅиŅ",
|
||||
@@ -1945,6 +2072,7 @@
|
||||
"user_usage_stats_description": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅŅаŅиŅŅиĐēаŅа Са иСĐŋĐžĐģСваĐŊĐĩŅĐž ĐŊа аĐēаŅĐŊŅа",
|
||||
"username": "ĐĐžŅŅĐĩйиŅĐĩĐģŅĐēĐž иĐŧĐĩ",
|
||||
"users": "ĐĐžŅŅĐĩйиŅĐĩĐģи",
|
||||
"users_added_to_album_count": "{count, plural, one {ĐОйавĐĩĐŊ Đĩ # ĐŋĐžŅŅĐĩйиŅĐĩĐģ} other {ĐОйавĐĩĐŊи Ņа # ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ}} ĐŊа аĐģĐąŅĐŧа",
|
||||
"utilities": "ĐĐŊŅŅŅŅĐŧĐĩĐŊŅи",
|
||||
"validate": "ĐаĐģидиŅаĐŊĐĩ",
|
||||
"validate_endpoint_error": "ĐĐžĐģŅ, вŅвĐĩди ĐŋŅавиĐģĐĩĐŊ URL",
|
||||
@@ -1963,6 +2091,7 @@
|
||||
"view_album": "Đ Đ°ĐˇĐŗĐģĐĩдаК аĐģĐąŅĐŧа",
|
||||
"view_all": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅиŅĐēи",
|
||||
"view_all_users": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
||||
"view_details": "ĐОдŅОйĐŊĐžŅŅи Са Đ¸ĐˇĐŗĐģĐĩда",
|
||||
"view_in_timeline": "ĐĐžĐēаĐļи вŅв вŅĐĩĐŧĐĩва ĐģиĐŊиŅ",
|
||||
"view_link": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅŅСĐēаŅа",
|
||||
"view_links": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅŅСĐēиŅĐĩ",
|
||||
@@ -1970,6 +2099,7 @@
|
||||
"view_next_asset": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅĐģĐĩдваŅĐ¸Ņ ŅаКĐģ",
|
||||
"view_previous_asset": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ĐŋŅĐĩдиŅĐŊĐ¸Ņ ŅаКĐģ",
|
||||
"view_qr_code": "ĐиĐļ QR ĐēОда",
|
||||
"view_similar_photos": "ĐиĐļ ĐŋОдОйĐŊи ŅĐŊиĐŧĐēи",
|
||||
"view_stack": "ĐĐžĐēаĐļи в ŅŅĐĩĐē",
|
||||
"view_user": "ĐиĐļ ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ",
|
||||
"viewer_remove_from_stack": "ĐŅĐĩĐŧаŅ
ваĐŊĐĩ ĐžŅ ĐžĐŋаŅĐēаŅа",
|
||||
@@ -1988,5 +2118,6 @@
|
||||
"yes": "Đа",
|
||||
"you_dont_have_any_shared_links": "ĐŅĐŧаŅĐĩ ŅĐŋОдĐĩĐģĐĩĐŊи вŅŅСĐēи",
|
||||
"your_wifi_name": "ĐаŅаŅа Wi-Fi ĐŧŅĐĩĐļа",
|
||||
"zoom_image": "ĐŖĐ˛ĐĩĐģиŅаваĐŊĐĩ ĐŊа иСОйŅаĐļĐĩĐŊиĐĩŅĐž"
|
||||
"zoom_image": "ĐŖĐ˛ĐĩĐģиŅаваĐŊĐĩ ĐŊа иСОйŅаĐļĐĩĐŊиĐĩŅĐž",
|
||||
"zoom_to_bounds": "ĐŅийĐģиĐļи Đ´Đž ŅŅйиŅаĐŊĐĩ в ĐŗŅаĐŊиŅиŅĐĩ"
|
||||
}
|
||||
|
||||
@@ -14,5 +14,10 @@
|
||||
"add_exclusion_pattern": "Putem wan paten wae hemi karem aot",
|
||||
"add_import_path": "Putem wan pat blo import",
|
||||
"add_location": "Putem wan place blo hem",
|
||||
"add_more_users": "Putem mor man"
|
||||
"add_more_users": "Putem mor man",
|
||||
"readonly_mode_enabled": "Mod blo yu no save janjem i on",
|
||||
"reassigned_assets_to_new_person": "Janjem{count, plural, one {# asset} other {# assets}} blo nu man",
|
||||
"reassing_hint": "janjem ol sumtin yu bin joos i go blo wan man",
|
||||
"recent-albums": "album i no old tu mas",
|
||||
"recent_searches": "lukabout wea i no old tu mas"
|
||||
}
|
||||
|
||||
42
i18n/bn.json
42
i18n/bn.json
@@ -14,6 +14,7 @@
|
||||
"add_a_location": "āĻāĻāĻāĻŋ āĻ
āĻŦāϏā§āĻĨāĻžāύ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_a_name": "āĻāĻāĻāĻŋ āύāĻžāĻŽ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_a_title": "āĻāĻāĻāĻŋ āĻļāĻŋāϰā§āύāĻžāĻŽ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_birthday": "āĻāĻāĻāĻŋ āĻāύā§āĻŽāĻĻāĻŋāύ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_endpoint": "āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_exclusion_pattern": "āĻŦāĻšāĻŋāϰā§āĻā§āϤāĻāϰāĻŖ āύāĻŽā§āύāĻž",
|
||||
"add_import_path": "āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻžāϰ āĻĒāĻžāĻĨ āϝā§āĻā§āϤ āĻāϰā§āύ",
|
||||
@@ -27,6 +28,9 @@
|
||||
"add_to_album": "āĻāϞāĻŦāĻžāĻŽ āĻ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_to_album_bottom_sheet_added": "{album} āĻ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
||||
"add_to_album_bottom_sheet_already_exists": "{album} āĻ āĻāĻā§ āĻĨā§āĻā§āĻ āĻāĻā§",
|
||||
"add_to_album_toggle": "{album} - āĻāϰ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύ",
|
||||
"add_to_albums": "āĻ
ā§āϝāĻžāϞāĻŦāĻžāĻŽā§ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_to_albums_count": "āĻ
ā§āϝāĻžāϞāĻŦāĻžāĻŽā§ āϝā§āĻ āĻāϰā§āύ ({count})",
|
||||
"add_to_shared_album": "āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āĻ
ā§āϝāĻžāϞāĻŦāĻžāĻŽā§ āϝā§āĻ āĻāϰā§āύ",
|
||||
"add_url": "āϞāĻŋāĻā§āĻ āϝā§āĻ āĻāϰā§āύ",
|
||||
"added_to_archive": "āĻāϰā§āĻāĻžāĻāĻ āĻ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
||||
@@ -44,6 +48,13 @@
|
||||
"backup_database": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϤā§āϰāĻŋ āĻāϰā§āύ",
|
||||
"backup_database_enable_description": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏāĻā§āϰāĻŋāϝāĻŧ āĻāϰā§āύ",
|
||||
"backup_keep_last_amount": "āĻāĻā§āϰ āĻĄāĻžāĻŽā§āĻĒā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āϰāĻžāĻāĻž āĻšāĻŦā§",
|
||||
"backup_onboarding_1_description": "āĻ
āĻĢāϏāĻžāĻāĻ āĻāĻĒāĻŋ āĻā§āϞāĻžāĻāĻĄā§ āĻ
āĻĨāĻŦāĻž āĻ
āύā§āϝ āĻā§āύāĻ āĻā§āϤ āϏā§āĻĨāĻžāύā§āĨ¤",
|
||||
"backup_onboarding_2_description": "āĻŦāĻŋāĻāĻŋāύā§āύ āĻĄāĻŋāĻāĻžāĻāϏ⧠āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻāĻĒāĻŋāĨ¤ āĻāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ āĻĒā§āϰāϧāĻžāύ āĻĢāĻžāĻāϞ āĻāĻŦāĻ āϏā§āĻĨāĻžāύā§āϝāĻŧāĻāĻžāĻŦā§ āϏā§āĻ āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϰ āĻŦā§āϝāĻžāĻāĻāĻĒāĨ¤",
|
||||
"backup_onboarding_3_description": "āĻŽā§āϞ āĻĢāĻžāĻāϞ āϏāĻš āĻāĻĒāύāĻžāϰ āĻĄā§āĻāĻžāϰ āĻŽā§āĻ āĻāĻĒāĻŋāĨ¤ āĻāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ ā§§āĻāĻŋ āĻ
āĻĢāϏāĻžāĻāĻ āĻāĻĒāĻŋ āĻāĻŦāĻ ā§¨āĻāĻŋ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻāĻĒāĻŋāĨ¤",
|
||||
"backup_onboarding_description": "āĻāĻĒāύāĻžāϰ āĻĄā§āĻāĻž āϏā§āϰāĻā§āώāĻŋāϤ āϰāĻžāĻāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ <backblaze-link>3-2-1 āĻŦā§āϝāĻžāĻāĻāĻĒ āĻā§āĻļāϞ</backblaze-link> āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻāĻŋ āĻŦāĻŋāϏā§āϤā§āϤ āĻŦā§āϝāĻžāĻāĻāĻĒ āϏāĻŽāĻžāϧāĻžāύā§āϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āĻāĻĒāϞā§āĻĄ āĻāϰāĻž āĻĢāĻā§/āĻāĻŋāĻĄāĻŋāĻāĻā§āϞāĻŋāϰ āĻāĻĒāĻŋ āĻāĻŦāĻ Immich āĻĄāĻžāĻāĻžāĻŦā§āϏ āϰāĻžāĻāĻž āĻāĻāĻŋāϤāĨ¤",
|
||||
"backup_onboarding_footer": "Immich āĻāϰ āĻŦā§āϝāĻžāĻāĻāĻĒ āύā§āĻā§āĻžāϰ āĻŦāĻŋāώā§ā§ āĻāϰāĻ āϤāĻĨā§āϝā§āϰ āĻāύā§āϝ, āĻ
āύā§āĻā§āϰāĻš āĻāϰ⧠<link>āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ</link> āĻĻā§āĻā§āύāĨ¤",
|
||||
"backup_onboarding_parts_title": "ā§Š-⧍-ā§§ āĻŦā§āϝāĻžāĻāĻāĻĒā§āϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§:",
|
||||
"backup_onboarding_title": "āĻŦā§āϝāĻžāĻāĻāĻĒ",
|
||||
"backup_settings": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏā§āĻāĻŋāĻāϏ",
|
||||
"backup_settings_description": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏā§āĻāĻŋāĻāϏ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύāĨ¤",
|
||||
"cleared_jobs": "{job} āĻāϰ āĻāύā§āϝ jobs āĻāĻžāϞāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
||||
@@ -64,7 +75,7 @@
|
||||
"external_library_management": "āĻŦāĻšāĻŋāϰāĻžāĻāϤ āĻā§āϰāύā§āĻĨāĻžāĻāĻžāϰ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž",
|
||||
"face_detection": "āĻŽā§āĻ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ",
|
||||
"face_detection_description": "āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ
ā§āϝāĻžāϏā§āĻā§ āĻĨāĻžāĻāĻž āĻŽā§āĻ/āĻā§āĻšāĻžāϰāĻž āĻā§āϞāĻŋ āϏāύāĻžāĻā§āϤ āĻāϰā§āύāĨ¤ āĻāĻŋāĻĄāĻŋāĻ āĻā§āϞāĻŋāϰ āĻāύā§āϝ, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧāĨ¤ \"āϰāĻŋāĻĢā§āϰā§āĻļ\" (āĻĒā§āύāϰāĻžāϝāĻŧ) āϏāĻŽāϏā§āϤ āĻ
ā§āϝāĻžāϏā§āĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰā§āĨ¤ \"āϰāĻŋāϏā§āĻ\" āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤāĻāĻžāĻŦā§ āϏāĻŽāϏā§āϤ āĻŦāϰā§āϤāĻŽāĻžāύ āĻŽā§āĻā§āϰ āĻĄā§āĻāĻž āϏāĻžāĻĢ āĻāϰā§āĨ¤ \"āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ\" āĻ
ā§āϝāĻžāϏā§āĻāĻā§āϞāĻŋāĻā§ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰ⧠āϝāĻž āĻāĻāύāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤ āϏāύāĻžāĻā§āϤ āĻāϰāĻž āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āĻĢā§āϏāĻŋāϝāĻŧāĻžāϞ āϰāĻŋāĻāĻāύāĻŋāĻļāύā§āϰ āĻāύā§āϝ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰāĻž āĻšāĻŦā§, āĻĢā§āϏāĻŋāϝāĻŧāĻžāϞ āĻĄāĻŋāĻā§āĻāĻļāύ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰā§, āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦāĻž āύāϤā§āύ āĻŦā§āϝāĻā§āϤāĻŋāĻĻā§āϰ āĻŽāϧā§āϝ⧠āĻā§āώā§āĻ ā§āĻŦāĻĻā§āϧ āĻāϰā§āĨ¤",
|
||||
"facial_recognition_job_description": "āĻļāύāĻžāĻā§āϤ āĻāϰāĻž āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āĻŽāĻžāύā§āώā§āϰ āĻŽāϧā§āϝ⧠āĻā§āώā§āĻ ā§āĻā§āĻā§āϤ āĻāϰā§āύāĨ¤ āĻŽā§āĻ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰ⧠āĻāĻ āϧāĻžāĻĒāĻāĻŋ āĻāϞā§āĨ¤ \"āϰāĻŋāϏā§āĻ\" (āĻĒā§āύāϰāĻžāϝāĻŧ) āϏāĻŽāϏā§āϤ āĻŽā§āĻāĻā§ āĻā§āϞāĻžāϏā§āĻāĻžāϰ āĻāϰā§āĨ¤ \"āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ\" āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āϏāĻžāϰāĻŋāϤ⧠āϰāĻžāĻā§ āϝā§āĻāĻžāύ⧠āĻā§āύāĻ āĻŦā§āϝāĻā§āϤāĻŋāĻā§ āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤",
|
||||
"facial_recognition_job_description": "āĻļāύāĻžāĻā§āϤ āĻāϰāĻž āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āĻŽāĻžāύā§āώā§āϰ āĻŽāϧā§āϝ⧠āĻā§āώā§āĻ ā§āĻā§āĻā§āϤ/āĻā§āϰā§āĻĒ āĻāϰā§āύāĨ¤ āĻŽā§āĻ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰ⧠āĻāĻ āϧāĻžāĻĒāĻāĻŋ āĻāϞā§āĨ¤ \"āϰāĻŋāϏā§āĻ\" (āĻĒā§āύāϰāĻžāϝāĻŧ) āϏāĻŽāϏā§āϤ āĻŽā§āĻāĻā§ āĻā§āϞāĻžāϏā§āĻāĻžāϰ āĻāϰā§āĨ¤ \"āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ/āĻŽāĻŋāϏāĻŋāĻ\" āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āϏāĻžāϰāĻŋāϤ⧠āϰāĻžāĻā§ āϝā§āĻā§āϞ⧠āĻā§āύāĻ āĻŦā§āϝāĻā§āϤāĻŋāĻā§ āĻāϏāĻžāĻāύ/āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤",
|
||||
"failed_job_command": "āĻāĻŽāĻžāύā§āĻĄ {command} āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻŦā§āϝāϰā§āĻĨ āĻšāϝāĻŧā§āĻā§: {job}",
|
||||
"force_delete_user_warning": "āϏāϤāϰā§āĻāϤāĻž: āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻŦāĻ āϏāĻŽāϏā§āϤ āϏāĻŽā§āĻĒāĻĻ āĻ
āĻŦāĻŋāϞāĻŽā§āĻŦā§ āϏāϰāĻŋāϝāĻŧā§ āĻĢā§āϞāĻŦā§āĨ¤ āĻāĻāĻŋ āĻĒā§āϰā§āĻŦāĻžāĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻĢā§āϰāĻžāύ⧠āϝāĻžāĻŦā§ āύāĻž āĻāĻŦāĻ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤",
|
||||
"image_format": "āĻĢāϰāĻŽā§āϝāĻžāĻ",
|
||||
@@ -75,9 +86,9 @@
|
||||
"image_fullsize_quality_description": "āĻĒā§āϰā§āĻŖ-āĻāĻāĻžāϰā§āϰ āĻāĻŦāĻŋāϰ āĻŽāĻžāύ ā§§-ā§§ā§Ļā§ĻāĨ¤ āĻāĻā§āĻāϤāϰ āĻšāϞ⧠āĻāĻžāϞā§, āĻāĻŋāύā§āϤ⧠āĻāϰāĻ āĻŦāĻĄāĻŧ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤",
|
||||
"image_fullsize_title": "āĻĒā§āϰā§āĻŖ-āĻāĻāĻžāϰā§āϰ āĻāĻŋāϤā§āϰ āϏā§āĻāĻŋāĻāϏ",
|
||||
"image_prefer_embedded_preview": "āĻāĻŽā§āĻŦā§āĻĄ āĻāϰāĻž āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻĒāĻāύā§āĻĻ āĻāϰā§āύ",
|
||||
"image_prefer_embedded_preview_setting_description": "āĻāĻŦāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻāύā§āϝ āĻāĻŦāĻ āϝāĻāύāĻ āĻāĻĒāϞāĻŦā§āϧ āĻĨāĻžāĻāĻŦā§ āϤāĻāύ RAW āĻĢāĻā§āϤ⧠āĻāĻŽāĻŦā§āĻĄā§āĻĄ āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻāĻŋāĻā§ āĻāĻŦāĻŋāϰ āĻāύā§āϝ āĻāϰāĻ āϏāĻ āĻŋāĻ āϰāĻ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§, āϤāĻŦā§ āĻĒā§āϰāĻŋāĻāĻŋāĻāϝāĻŧā§āϰ āĻŽāĻžāύ āĻā§āϝāĻžāĻŽā§āϰāĻž-āύāĻŋāϰā§āĻāϰ āĻāĻŦāĻ āĻāĻŦāĻŋāϤ⧠āĻāϰāĻ āĻāĻŽā§āĻĒā§āϰā§āĻļāύ āĻāϰā§āĻāĻŋāĻĢā§āϝāĻžāĻā§āĻ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤",
|
||||
"image_prefer_embedded_preview_setting_description": "āϝāĻĻāĻŋ āĻĒāĻžāĻā§āĻž āϝāĻžā§, RAW āĻāĻŦāĻŋāϰ āĻā§āϤāϰ⧠āĻĨāĻžāĻāĻž āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāϤ⧠āĻāĻŋāĻā§ āĻāĻŦāĻŋāϰ āϰāĻ āĻāϰāĻ āϏāĻ āĻŋāĻ āĻĻā§āĻāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āϤāĻŦā§ āĻŽāĻžāύ āĻā§āϝāĻžāĻŽā§āϰāĻžāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻāĻŦāĻ āĻāĻŦāĻŋāϤ⧠āĻŦāĻžā§āϤāĻŋ āĻāĻŽāĻĒā§āϰā§āĻļāύ āĻāϰā§āĻāĻŋāĻĢā§āϝāĻžāĻā§āĻ āĻĻā§āĻāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤",
|
||||
"image_prefer_wide_gamut": "āĻĒā§āϰāĻļāϏā§āϤ āĻĒāϰāĻŋāϏāϰ āĻĒāĻāύā§āĻĻ āĻāϰā§āύ",
|
||||
"image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞā§āϰ āĻāύā§āϝ āĻĄāĻŋāϏāĻĒā§āϞ⧠P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻĒā§āϰāĻļāϏā§āϤ āϰāĻā§āϰ āϏā§āĻĨāĻžāύ āϏāĻš āĻāĻŦāĻŋāϰ āĻĒā§āϰāĻžāĻŖāĻŦāύā§āϤāϤāĻž āĻāϰāĻ āĻāĻžāϞāĻāĻžāĻŦā§ āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§, āϤāĻŦā§ āĻĒā§āϰāĻžāύ⧠āĻŦā§āϰāĻžāĻāĻāĻžāϰ āϏāĻāϏā§āĻāϰāĻŖ āϏāĻš āĻĒā§āϰāĻžāύ⧠āĻĄāĻŋāĻāĻžāĻāϏāĻā§āϞāĻŋāϤ⧠āĻāĻŦāĻŋāĻā§āϞāĻŋ āĻāĻŋāύā§āύāĻāĻžāĻŦā§ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϰāĻā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāĻĄāĻŧāĻžāϤ⧠sRGB āĻāĻŦāĻŋāĻā§āϞāĻŋāĻā§ sRGB āĻšāĻŋāϏāĻžāĻŦā§ āϰāĻžāĻāĻž āĻšāϝāĻŧāĨ¤",
|
||||
"image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞā§āϰ āĻāύā§āϝ Display P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻā§āĻžāĻāĻĄ āĻāĻžāϞāĻžāϰāϏā§āĻĒā§āϏ āĻāĻŦāĻŋāϰ āĻāĻā§āĻā§āĻŦāϞāϤāĻž āĻ āĻĒā§āϰāĻžāĻŖāĻŦāύā§āϤ āϰāĻ āĻāĻžāϞā§āĻāĻžāĻŦā§ āϧāϰ⧠āϰāĻžāĻā§, āϤāĻŦā§ āĻĒā§āϰāύ⧠āĻĄāĻŋāĻāĻžāĻāϏ āĻŦāĻž āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻāĻŦāĻŋāĻā§āϞ⧠āĻāĻŋāύā§āύāĻāĻžāĻŦā§ āĻĻā§āĻāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ sRGB āĻāĻŦāĻŋāĻā§āϞ⧠āϰāĻā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻā§āĻžāϤ⧠sRGB āĻšāĻŋāϏā§āĻŦā§āĻ āϰāĻžāĻāĻž āĻšāĻŦā§āĨ¤",
|
||||
"image_preview_description": "āϏā§āĻā§āϰāĻŋāĻĒāĻĄ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏāĻš āĻŽāĻžāĻāĻžāϰāĻŋ āĻāĻāĻžāϰā§āϰ āĻāĻŦāĻŋ, āĻāĻāĻāĻŋ āĻāĻāĻ āϏāĻŽā§āĻĒāĻĻ āĻĻā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŦāĻ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ",
|
||||
"image_preview_quality_description": "ā§§-ā§§ā§Ļā§Ļ āĻāϰ āĻŽāϧā§āϝ⧠āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻā§āϝāĻŧāĻžāϞāĻŋāĻāĻŋāĨ¤ āĻŦā§āĻļāĻŋ āĻšāϞ⧠āĻāĻžāϞā§, āĻāĻŋāύā§āϤ⧠āĻŦāĻĄāĻŧ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻšāϝāĻŧ āĻāĻŦāĻ āĻ
ā§āϝāĻžāĻĒā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāĻļā§āϞāϤāĻž āĻāĻŽāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽ āĻŽāĻžāύ āϏā§āĻ āĻāϰāϞ⧠āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻā§āϝāĻŧāĻžāϞāĻŋāĻāĻŋāϰ āĻāĻĒāϰ āĻĒā§āϰāĻāĻžāĻŦ āĻĒāĻĄāĻŧāϤ⧠āĻĒāĻžāϰā§āĨ¤",
|
||||
"image_preview_title": "āĻĒā§āϰāĻŋāĻāĻŋāĻ āϏā§āĻāĻŋāĻāϏ",
|
||||
@@ -91,9 +102,30 @@
|
||||
"image_thumbnail_title": "āĻĨāĻžāĻŽā§āĻŦāύā§āϞ āϏā§āĻāĻŋāĻāϏ",
|
||||
"job_concurrency": "{job} āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ",
|
||||
"job_created": "Job āϤā§āϰāĻŋ āĻšāϝāĻŧā§āĻā§",
|
||||
"job_not_concurrency_safe": "āĻāĻ āĻāĻžāĻāĻāĻŋ āϏāĻŽāĻāĻžāϞā§āύ-āύāĻŋāϰāĻžāĻĒāĻĻ āύāϝāĻŧāĨ¤",
|
||||
"job_not_concurrency_safe": "āĻāĻ āĻāĻžāĻāĻāĻŋ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāĻāĻžāĻŦā§ āĻāĻžāϞāĻžāύ⧠āύāĻŋāϰāĻžāĻĒāĻĻ āύā§",
|
||||
"job_settings": "āĻāĻžāĻā§āϰ āϏā§āĻāĻŋāĻāϏ",
|
||||
"job_settings_description": "āĻāĻžāĻā§āϰ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāϤāĻž āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ",
|
||||
"job_status": "āĻāĻžāĻāϰāĻŋāϰ āĻ
āĻŦāϏā§āĻĨāĻž"
|
||||
"job_status": "āĻāĻžāĻāϰāĻŋāϰ āĻ
āĻŦāϏā§āĻĨāĻž",
|
||||
"jobs_delayed": "{jobCount, plural, other {# āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ}}",
|
||||
"jobs_failed": "{jobCount, plural, other {# āĻŦā§āϝāϰā§āĻĨ}}",
|
||||
"library_created": "āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĻ {library}",
|
||||
"library_deleted": "āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻšāϝāĻŧā§āĻā§",
|
||||
"library_import_path_description": "āĻāĻŽā§āĻĒā§āϰā§āĻ/āϝā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĢā§āϞā§āĻĄāĻžāϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰā§āύāĨ¤ āϏāĻžāĻŦāĻĢā§āϞā§āĻĄāĻžāϰ āϏāĻš āĻāĻ āĻĢā§āϞā§āĻĄāĻžāϰāĻāĻŋ āĻāĻŦāĻŋ āĻāĻŦāĻ āĻāĻŋāĻĄāĻŋāĻāϰ āĻāύā§āϝ āϏā§āĻā§āϝāĻžāύ āĻāϰāĻž āĻšāĻŦā§āĨ¤",
|
||||
"library_scanning": "āĻĒāϰā§āϝāĻžāϝāĻŧāĻā§āϰāĻŽāĻŋāĻ āϏā§āĻā§āϝāĻžāύāĻŋāĻ",
|
||||
"library_scanning_description": "āĻĒāϰā§āϝāĻžāϝāĻŧāĻā§āϰāĻŽāĻŋāĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϏā§āĻā§āϝāĻžāύāĻŋāĻ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ",
|
||||
"library_scanning_enable_description": "āĻĒāϰā§āϝāĻžāϝāĻŧāĻā§āϰāĻŽāĻŋāĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϏā§āĻā§āϝāĻžāύāĻŋāĻ āϏāĻā§āώāĻŽ āĻāϰā§āύ",
|
||||
"library_settings": "āĻŦāĻšāĻŋāϰāĻžāĻāϤ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ",
|
||||
"library_settings_description": "āĻŦāĻšāĻŋāϰāĻžāĻāϤ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϏā§āĻāĻŋāĻāϏ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ",
|
||||
"library_tasks_description": "āύāϤā§āύ āĻāĻŦāĻ/āĻ
āĻĨāĻŦāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āϏāĻŽā§āĻĒāĻĻā§āϰ āĻāύā§āϝ āĻŦāĻšāĻŋāϰāĻžāĻāϤ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϏā§āĻā§āϝāĻžāύ āĻāϰā§āύ",
|
||||
"library_watching_enable_description": "āĻĢāĻžāĻāϞ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϰ āĻāύā§āϝ āĻŦāĻšāĻŋāϰāĻžāĻāϤ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋāĻā§āϞāĻŋ āĻĻā§āĻā§āύ",
|
||||
"library_watching_settings": "āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻĻā§āĻāĻž (āĻĒāϰā§āĻā§āώāĻžāĻŽā§āϞāĻ)",
|
||||
"library_watching_settings_description": "āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āύāĻāϰ āϰāĻžāĻā§āύ",
|
||||
"logging_enable_description": "āϞāĻāĻŋāĻ āĻāύāĻžāĻŦāϞ/āϏāĻā§āώāĻŽ āĻāϰā§āύ",
|
||||
"logging_level_description": "āϏāĻā§āϰāĻŋāϝāĻŧ āĻĨāĻžāĻāĻžāĻāĻžāϞā§āύ, āĻā§āύ āϞāĻ āϏā§āϤāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤",
|
||||
"logging_settings": "āϞāĻāĻŋāĻ",
|
||||
"machine_learning_clip_model": "CLIP āĻŽāĻĄā§āϞ",
|
||||
"machine_learning_clip_model_description": "<link>āĻāĻāĻžāύā§</link> āϤāĻžāϞāĻŋāĻāĻžāĻā§āĻā§āϤ āĻāĻāĻāĻŋ CLIP āĻŽāĻĄā§āϞā§āϰ āύāĻžāĻŽāĨ¤ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ, āĻŽāĻĄā§āϞ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϰ āĻĒāϰ āϏāĻŦ āĻāĻŦāĻŋāϰ āĻāύā§āϝ āĻ
āĻŦāĻļā§āϝāĻ âSmart Searchâ āĻāĻžāĻāĻāĻŋ āĻāĻŦāĻžāϰ āĻāĻžāϞāĻžāϤ⧠āĻšāĻŦā§āĨ¤",
|
||||
"machine_learning_duplicate_detection": "āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ",
|
||||
"machine_learning_duplicate_detection_enabled": "āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āĻļāύāĻžāĻā§āϤāĻāϰāĻŖ āĻāĻžāϞ⧠āĻāϰā§āύ"
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user