Compare commits
256 Commits
fix/disabl
...
v1.139.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
0d60199514 | ||
|
|
54960157c0 | ||
|
|
244d097d01 | ||
|
|
adb55f3726 | ||
|
|
5d2777a5c6 | ||
|
|
24db881c14 | ||
|
|
f09bed9ad2 | ||
|
|
e29cc66361 | ||
|
|
669b765662 | ||
|
|
e7060dc292 | ||
|
|
03a8b6cb38 | ||
|
|
f317cbe221 | ||
|
|
d6d31c6695 | ||
|
|
4b9019e762 | ||
|
|
13563fc507 | ||
|
|
2ce4f8dd3b | ||
|
|
538d5c81ea | ||
|
|
9ecaa3fa9d | ||
|
|
b1aacfdbd9 | ||
|
|
cfbc24579d | ||
|
|
1d4d8e7a9a | ||
|
|
7b83b7b2d5 | ||
|
|
a896c5a4dd | ||
|
|
c74989d304 | ||
|
|
1283491cc2 | ||
|
|
89522daaac | ||
|
|
011a667314 | ||
|
|
df2525ee08 | ||
|
|
01a9f735c8 | ||
|
|
af10c3bc2f | ||
|
|
395f2e155d | ||
|
|
10cbed55c4 | ||
|
|
325d5f7ba9 | ||
|
|
746252fe39 | ||
|
|
f36efd128b | ||
|
|
f1c494ef97 | ||
|
|
9c8c52874a | ||
|
|
68b617130a | ||
|
|
89292fecb4 | ||
|
|
1193a23282 | ||
|
|
bbfff64927 | ||
|
|
c5c9a522c1 | ||
|
|
3cd7f5ab90 | ||
|
|
f2067221c5 | ||
|
|
89598cf0be | ||
|
|
0121043d7d | ||
|
|
1ca46fbd98 | ||
|
|
6ddef3a7e4 | ||
|
|
0d9ebdc46a | ||
|
|
fa26d0de33 | ||
|
|
a5760129f0 | ||
|
|
d430b869ac | ||
|
|
4179c8a17d | ||
|
|
0a9cbf01d2 | ||
|
|
9567a2a560 | ||
|
|
58dd6f094c | ||
|
|
02381343ff | ||
|
|
09a5963eee | ||
|
|
a573a23c83 | ||
|
|
7118dca559 | ||
|
|
13d43e193e | ||
|
|
7a7843467c | ||
|
|
9e6fee4064 | ||
|
|
9680f1290d | ||
|
|
ce2ea98926 | ||
|
|
5c76cc34e1 | ||
|
|
eb2f4c866e | ||
|
|
2a370087e8 | ||
|
|
272c8a5812 | ||
|
|
08fe549ed8 | ||
|
|
ae15efdf2a | ||
|
|
8e003f95db | ||
|
|
3e92e837f1 | ||
|
|
081307ced2 | ||
|
|
a91bb399f0 | ||
|
|
42b78c59b5 | ||
|
|
750d21aeba | ||
|
|
990d9ba9a8 | ||
|
|
4d0c9172e5 | ||
|
|
094e3a2757 | ||
|
|
278668b8c5 | ||
|
|
10141504a2 | ||
|
|
67736c8fce | ||
|
|
b56a272f64 | ||
|
|
5901c2e963 | ||
|
|
be85832b20 | ||
|
|
c8f9a72d3e | ||
|
|
3d633a81c4 | ||
|
|
4efbf36d82 | ||
|
|
e2c3c39597 | ||
|
|
007ba1d9ef | ||
|
|
4d5cd1a6b5 | ||
|
|
8108f50c4e | ||
|
|
1b8354ed36 | ||
|
|
9242afb4b0 | ||
|
|
c5f14adff0 | ||
|
|
1378f22368 | ||
|
|
4bd465e752 | ||
|
|
a07531be3b | ||
|
|
3cdc6844a1 | ||
|
|
c3263e50fc | ||
|
|
7391ea6ff9 | ||
|
|
f972b8d514 | ||
|
|
6b50d958f4 | ||
|
|
27c456eb75 | ||
|
|
e7d051db3c | ||
|
|
86d31d7d29 | ||
|
|
f416342eff | ||
|
|
d73335ecbc | ||
|
|
641a3baadd | ||
|
|
f85d8add01 | ||
|
|
c278b7ad17 | ||
|
|
10e9c278ee | ||
|
|
47a025f39f | ||
|
|
749f999f2a | ||
|
|
d5a01c0310 | ||
|
|
097e132fba | ||
|
|
da5deffd03 | ||
|
|
9f20522df5 | ||
|
|
baadf9db20 | ||
|
|
4ea4ee40af | ||
|
|
d8a6552811 | ||
|
|
444133a72b | ||
|
|
29f16c6a47 | ||
|
|
268b411a6f | ||
|
|
07ed060c32 | ||
|
|
2f5d543ad9 | ||
|
|
9b65cd4d7b | ||
|
|
290e325c5c | ||
|
|
58521c9efb | ||
|
|
4cae15f28d | ||
|
|
e6ec019852 | ||
|
|
3b5e00131b | ||
|
|
a0fa7318ed | ||
|
|
2a005629a0 | ||
|
|
59a50b8697 | ||
|
|
90eac40e02 | ||
|
|
ad6f7f8089 | ||
|
|
056b262cba | ||
|
|
cfae134ecf | ||
|
|
fbbb6af27a | ||
|
|
1804a8fe58 | ||
|
|
ae1d60e259 | ||
|
|
7d759edfcc | ||
|
|
34974b036c | ||
|
|
e52b9d15b5 | ||
|
|
9b3718120b | ||
|
|
16b14b390f | ||
|
|
7e7b8da128 | ||
|
|
66ea75072d | ||
|
|
d34670bae6 | ||
|
|
1e1c2ea627 | ||
|
|
c7fcb23a23 | ||
|
|
708e42d8a3 | ||
|
|
d15f67da5d | ||
|
|
6becf409da | ||
|
|
ee4ae40d61 | ||
|
|
ebd644eedd | ||
|
|
7c36cbaf0f | ||
|
|
3a5d82f790 | ||
|
|
b14c768208 | ||
|
|
07cb2fb04e | ||
|
|
9bbad45990 | ||
|
|
e85655d34c | ||
|
|
d0576697c3 | ||
|
|
f9847bee51 | ||
|
|
f2141de5bb | ||
|
|
cb344cb014 | ||
|
|
c6b25ef111 | ||
|
|
0fdeac0417 | ||
|
|
153bb70f6e | ||
|
|
da80b69062 | ||
|
|
f9292c9c96 | ||
|
|
2e0ee6ec05 | ||
|
|
7f2e4f85f8 | ||
|
|
c63f805cb4 | ||
|
|
03a13828e1 | ||
|
|
e5ee1c8db6 | ||
|
|
25e2d37490 | ||
|
|
ed5759fe07 | ||
|
|
edefed56ae | ||
|
|
13281f8531 | ||
|
|
b48406bd20 | ||
|
|
06c78dfa91 | ||
|
|
de67d22bc0 | ||
|
|
b4780e89af |
@@ -11,8 +11,8 @@ services:
|
|||||||
- open_api_node_modules:/workspaces/immich/open-api/typescript-sdk/node_modules
|
- open_api_node_modules:/workspaces/immich/open-api/typescript-sdk/node_modules
|
||||||
- server_node_modules:/workspaces/immich/server/node_modules
|
- server_node_modules:/workspaces/immich/server/node_modules
|
||||||
- web_node_modules:/workspaces/immich/web/node_modules
|
- web_node_modules:/workspaces/immich/web/node_modules
|
||||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos:/data
|
||||||
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
|
||||||
database:
|
database:
|
||||||
|
|||||||
@@ -49,10 +49,11 @@ fix_permissions() {
|
|||||||
|
|
||||||
log "Fixing permissions for ${IMMICH_WORKSPACE}"
|
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
|
# Change ownership for directories that exist
|
||||||
for dir in "${IMMICH_WORKSPACE}/.vscode" \
|
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}/cli/node_modules" \
|
||||||
"${IMMICH_WORKSPACE}/e2e/node_modules" \
|
"${IMMICH_WORKSPACE}/e2e/node_modules" \
|
||||||
"${IMMICH_WORKSPACE}/open-api/typescript-sdk/node_modules" \
|
"${IMMICH_WORKSPACE}/open-api/typescript-sdk/node_modules" \
|
||||||
|
|||||||
@@ -8,21 +8,13 @@ services:
|
|||||||
- IMMICH_SERVER_URL=http://127.0.0.1:2283/
|
- IMMICH_SERVER_URL=http://127.0.0.1:2283/
|
||||||
volumes: !override
|
volumes: !override
|
||||||
- ..:/workspaces/immich
|
- ..:/workspaces/immich
|
||||||
- cli_node_modules:/workspaces/immich/cli/node_modules
|
- ${UPLOAD_LOCATION:-upload1-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data
|
||||||
- e2e_node_modules:/workspaces/immich/e2e/node_modules
|
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/data/upload
|
||||||
- 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}:/usr/src/app/upload
|
|
||||||
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/usr/src/app/upload/upload
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
|
||||||
immich-web:
|
immich-web:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
|
|
||||||
immich-machine-learning:
|
immich-machine-learning:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
|
|
||||||
database:
|
database:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
environment: !override
|
environment: !override
|
||||||
@@ -33,17 +25,10 @@ services:
|
|||||||
POSTGRES_HOST_AUTH_METHOD: md5
|
POSTGRES_HOST_AUTH_METHOD: md5
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION:-postgres-devcontainer-volume}${UPLOAD_LOCATION:+/postgres}:/var/lib/postgresql/data
|
- ${UPLOAD_LOCATION:-postgres-devcontainer-volume}${UPLOAD_LOCATION:+/postgres}:/var/lib/postgresql/data
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
# Node modules for each service to avoid conflicts and ensure consistent dependencies
|
# 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:
|
upload1-devcontainer-volume:
|
||||||
upload2-devcontainer-volume:
|
upload2-devcontainer-volume:
|
||||||
postgres-devcontainer-volume:
|
postgres-devcontainer-volume:
|
||||||
|
|||||||
@@ -3,15 +3,20 @@
|
|||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
source /immich-devcontainer/container-common.sh
|
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 "Starting Nest API Server"
|
||||||
log ""
|
log ""
|
||||||
cd "${IMMICH_WORKSPACE}/server" || (
|
cd "${IMMICH_WORKSPACE}/server" || (
|
||||||
log "Immich workspace not found"
|
log "Immich workspace not found"jj
|
||||||
exit 1
|
exit 1
|
||||||
)
|
)
|
||||||
|
|
||||||
while true; do
|
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 ..."
|
log "Nest API Server crashed with exit code $?. Respawning in 3s ..."
|
||||||
sleep 3
|
sleep 3
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -3,6 +3,13 @@
|
|||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
source /immich-devcontainer/container-common.sh
|
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 "Starting Immich Web Frontend"
|
||||||
log ""
|
log ""
|
||||||
cd "${IMMICH_WORKSPACE}/web" || (
|
cd "${IMMICH_WORKSPACE}/web" || (
|
||||||
@@ -16,7 +23,7 @@ until curl --output /dev/null --silent --head --fail "http://127.0.0.1:${IMMICH_
|
|||||||
done
|
done
|
||||||
|
|
||||||
while true; do
|
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 ..."
|
log "Web crashed with exit code $?. Respawning in 3s ..."
|
||||||
sleep 3
|
sleep 3
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ source /immich-devcontainer/container-common.sh
|
|||||||
log "Setting up Immich dev container..."
|
log "Setting up Immich dev container..."
|
||||||
fix_permissions
|
fix_permissions
|
||||||
|
|
||||||
log "Installing npm dependencies (node_modules)..."
|
|
||||||
install_dependencies
|
|
||||||
|
|
||||||
log "Setup complete, please wait while backend and frontend services automatically start"
|
log "Setup complete, please wait while backend and frontend services automatically start"
|
||||||
log
|
log
|
||||||
log "If necessary, the services may be manually started using"
|
log "If necessary, the services may be manually started using"
|
||||||
|
|||||||
2
.github/.nvmrc
vendored
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
5
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -64,6 +64,11 @@ body:
|
|||||||
- label: Web
|
- label: Web
|
||||||
- label: Mobile
|
- label: Mobile
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Device make and model
|
||||||
|
placeholder: Samsung S25 Android 16
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
10
.github/workflows/build-mobile.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
|||||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ jobs:
|
|||||||
runs-on: mich
|
runs-on: mich
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.ref || github.sha }}
|
ref: ${{ inputs.ref || github.sha }}
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
@@ -79,7 +79,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Restore Gradle Cache
|
- name: Restore Gradle Cache
|
||||||
id: cache-gradle-restore
|
id: cache-gradle-restore
|
||||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4
|
uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.gradle/caches
|
~/.gradle/caches
|
||||||
@@ -106,7 +106,7 @@ jobs:
|
|||||||
run: flutter pub get
|
run: flutter pub get
|
||||||
|
|
||||||
- name: Generate translation file
|
- name: Generate translation file
|
||||||
run: make translation
|
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
|
||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
|
|
||||||
- name: Generate platform APIs
|
- name: Generate platform APIs
|
||||||
@@ -136,7 +136,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Save Gradle Cache
|
- name: Save Gradle Cache
|
||||||
id: cache-gradle-save
|
id: cache-gradle-save
|
||||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4
|
uses: actions/cache/save@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
|
||||||
if: github.ref == 'refs/heads/main'
|
if: github.ref == 'refs/heads/main'
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
|
|||||||
2
.github/workflows/cache-cleanup.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
actions: write
|
actions: write
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
33
.github/workflows/cli.yml
vendored
@@ -29,25 +29,28 @@ jobs:
|
|||||||
working-directory: ./cli
|
working-directory: ./cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
# Setup .npmrc file to publish to npm
|
- name: Setup pnpm
|
||||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
|
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './cli/.nvmrc'
|
node-version-file: './cli/.nvmrc'
|
||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Prepare SDK
|
- name: Setup typescript-sdk
|
||||||
run: npm ci --prefix ../open-api/typescript-sdk/
|
run: pnpm install && pnpm run build
|
||||||
- name: Build SDK
|
working-directory: ./open-api/typescript-sdk
|
||||||
run: npm run build --prefix ../open-api/typescript-sdk/
|
|
||||||
- run: npm ci
|
- run: pnpm install --frozen-lockfile
|
||||||
- run: npm run build
|
- run: pnpm build
|
||||||
- run: npm publish
|
- run: pnpm publish
|
||||||
if: ${{ github.event_name == 'release' }}
|
if: ${{ github.event_name == 'release' }}
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
@@ -62,7 +65,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -73,7 +76,7 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- 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 }}
|
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
@@ -88,7 +91,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Generate docker image tags
|
- name: Generate docker image tags
|
||||||
id: metadata
|
id: metadata
|
||||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
|
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
|
||||||
with:
|
with:
|
||||||
flavor: |
|
flavor: |
|
||||||
latest=false
|
latest=false
|
||||||
|
|||||||
96
.github/workflows/close-duplicates.yml
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
discussion:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
name: Close likely duplicates
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
get_body:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
EVENT: ${{ toJSON(github.event) }}
|
||||||
|
outputs:
|
||||||
|
body: ${{ steps.get_body.outputs.body }}
|
||||||
|
steps:
|
||||||
|
- id: get_body
|
||||||
|
run: |
|
||||||
|
BODY=$(echo """$EVENT""" | jq -r '.issue // .discussion | .body' | base64 -w 0)
|
||||||
|
echo "body=$BODY" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
get_checkbox_json:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: get_body
|
||||||
|
container:
|
||||||
|
image: yshavit/mdq:0.8.0@sha256:c69224d34224a0043d9a3ee46679ba4a2a25afaac445f293d92afe13cd47fcea
|
||||||
|
outputs:
|
||||||
|
json: ${{ steps.get_checkbox.outputs.json }}
|
||||||
|
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
|
||||||
|
|
||||||
|
close_and_comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: get_checkbox_json
|
||||||
|
if: ${{ !fromJSON(needs.get_checkbox_json.outputs.json).items[0].list[0].checked }}
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
discussions: write
|
||||||
|
steps:
|
||||||
|
- name: Close issue
|
||||||
|
if: ${{ github.event_name == 'issues' }}
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
NODE_ID: ${{ github.event.issue.node_id }}
|
||||||
|
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. 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: {
|
||||||
|
subjectId: $issueId,
|
||||||
|
body: $body
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
|
||||||
|
closeIssue(input: {
|
||||||
|
issueId: $issueId,
|
||||||
|
stateReason: DUPLICATE
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
|
||||||
|
- name: Close discussion
|
||||||
|
if: ${{ github.event_name == 'discussion' && github.event.discussion.category.name == 'Feature Request' }}
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
NODE_ID: ${{ github.event.discussion.node_id }}
|
||||||
|
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. 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: {
|
||||||
|
discussionId: $discussionId,
|
||||||
|
body: $body
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
|
||||||
|
closeDiscussion(input: {
|
||||||
|
discussionId: $discussionId,
|
||||||
|
reason: DUPLICATE
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
}'
|
||||||
8
.github/workflows/codeql-analysis.yml
vendored
@@ -44,13 +44,13 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/init@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# 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).
|
# 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)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/autobuild@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9
|
||||||
|
|
||||||
# âšī¸ Command-line programs to run using the OS shell.
|
# âšī¸ 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
|
# đ 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
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/analyze@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9
|
||||||
with:
|
with:
|
||||||
category: '/language:${{matrix.language}}'
|
category: '/language:${{matrix.language}}'
|
||||||
|
|||||||
6
.github/workflows/docker.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
|||||||
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == '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' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- id: found_paths
|
- id: found_paths
|
||||||
@@ -60,7 +60,7 @@ jobs:
|
|||||||
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
|
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
|
||||||
steps:
|
steps:
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
@@ -89,7 +89,7 @@ jobs:
|
|||||||
suffix: ['']
|
suffix: ['']
|
||||||
steps:
|
steps:
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
|
|||||||
23
.github/workflows/docs-build.yml
vendored
@@ -18,10 +18,10 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
outputs:
|
outputs:
|
||||||
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.found_paths.outputs.open-api == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- id: found_paths
|
- id: found_paths
|
||||||
@@ -32,6 +32,8 @@ jobs:
|
|||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
workflow:
|
workflow:
|
||||||
- '.github/workflows/docs-build.yml'
|
- '.github/workflows/docs-build.yml'
|
||||||
|
open-api:
|
||||||
|
- 'open-api/immich-openapi-specs.json'
|
||||||
- name: Check if we should force jobs to run
|
- name: Check if we should force jobs to run
|
||||||
id: should_force
|
id: should_force
|
||||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
|
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
|
||||||
@@ -49,25 +51,28 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './docs/.nvmrc'
|
node-version-file: './docs/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run npm install
|
- name: Run install
|
||||||
run: npm ci
|
run: pnpm install
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
|
|
||||||
- name: Run build
|
- name: Run build
|
||||||
run: npm run build
|
run: pnpm build
|
||||||
|
|
||||||
- name: Upload build output
|
- name: Upload build output
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
|
|||||||
2
.github/workflows/docs-deploy.yml
vendored
@@ -108,7 +108,7 @@ jobs:
|
|||||||
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
|
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/docs-destroy.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
8
.github/workflows/fix-format.yml
vendored
@@ -16,13 +16,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate-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:
|
with:
|
||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|
||||||
- name: 'Checkout'
|
- name: 'Checkout'
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.ref }}
|
ref: ${{ github.event.pull_request.head.ref }}
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
@@ -32,8 +32,8 @@ jobs:
|
|||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Fix formatting
|
- name: Fix formatting
|
||||||
run: make install-all && make format-all
|
run: make install-all && make format-all
|
||||||
|
|||||||
18
.github/workflows/prepare-release.yml
vendored
@@ -32,13 +32,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate-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:
|
with:
|
||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
persist-credentials: true
|
persist-credentials: true
|
||||||
@@ -46,6 +46,16 @@ jobs:
|
|||||||
- name: Install uv
|
- name: Install uv
|
||||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
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
|
- name: Bump version
|
||||||
env:
|
env:
|
||||||
SERVER_BUMP: ${{ inputs.serverBump }}
|
SERVER_BUMP: ${{ inputs.serverBump }}
|
||||||
@@ -83,13 +93,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate-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:
|
with:
|
||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|||||||
14
.github/workflows/preview-label.yaml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
|
|
||||||
remove-label:
|
remove-label:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ github.event.action == 'closed' && contains(github.event.pull_request.labels.*.name, 'preview') }}
|
if: ${{ (github.event.action == 'closed' || github.event.pull_request.head.repo.fork) && contains(github.event.pull_request.labels.*.name, 'preview') }}
|
||||||
permissions:
|
permissions:
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
@@ -33,3 +33,15 @@ jobs:
|
|||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
name: 'preview'
|
name: 'preview'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
- uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2
|
||||||
|
if: ${{ github.event.pull_request.head.repo.fork }}
|
||||||
|
with:
|
||||||
|
message-id: 'preview-status'
|
||||||
|
message: 'PRs from forks cannot have preview environments.'
|
||||||
|
|
||||||
|
- uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2
|
||||||
|
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||||
|
with:
|
||||||
|
message-id: 'preview-status'
|
||||||
|
message: 'Preview environment has been removed.'
|
||||||
|
|||||||
15
.github/workflows/sdk.yml
vendored
@@ -16,22 +16,25 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
|
|
||||||
# Setup .npmrc file to publish to npm
|
# Setup .npmrc file to publish to npm
|
||||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './open-api/typescript-sdk/.nvmrc'
|
node-version-file: './open-api/typescript-sdk/.nvmrc'
|
||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
- name: Build
|
- name: Build
|
||||||
run: npm run build
|
run: pnpm build
|
||||||
- name: Publish
|
- name: Publish
|
||||||
run: npm publish
|
run: pnpm publish
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|||||||
15
.github/workflows/static_analysis.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- id: found_paths
|
- id: found_paths
|
||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ jobs:
|
|||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
|
|
||||||
- name: Generate translation file
|
- 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
|
- name: Run Build Runner
|
||||||
run: make build
|
run: make build
|
||||||
@@ -90,7 +90,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
||||||
run: |
|
run: |
|
||||||
echo "ERROR: Generated files not up to date! Run make_build inside the mobile directory"
|
echo "ERROR: Generated files not up to date! Run 'make build' and 'make pigeon' inside the mobile directory"
|
||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
@@ -98,8 +98,7 @@ jobs:
|
|||||||
run: dart analyze --fatal-infos
|
run: dart analyze --fatal-infos
|
||||||
|
|
||||||
- name: Run dart format
|
- name: Run dart format
|
||||||
# Ignore generated files manually until https://github.com/dart-lang/dart_style/issues/864 is resolved
|
run: make format
|
||||||
run: dart format --set-exit-if-changed $(find lib -name '*.dart' -not \( -name 'generated_plugin_registrant.dart' -o -name '*.g.dart' -o -name '*.drift.dart' \))
|
|
||||||
|
|
||||||
- name: Run dart custom_lint
|
- name: Run dart custom_lint
|
||||||
run: dart run custom_lint
|
run: dart run custom_lint
|
||||||
@@ -117,7 +116,7 @@ jobs:
|
|||||||
actions: read
|
actions: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -130,7 +129,7 @@ jobs:
|
|||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Upload SARIF file
|
- name: Upload SARIF file
|
||||||
uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/upload-sarif@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
category: zizmor
|
category: zizmor
|
||||||
|
|||||||
347
.github/workflows/test.yml
vendored
@@ -4,13 +4,10 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
permissions: {}
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pre-job:
|
pre-job:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -29,10 +26,9 @@ jobs:
|
|||||||
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_.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
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- id: found_paths
|
- id: found_paths
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||||
with:
|
with:
|
||||||
@@ -58,11 +54,9 @@ jobs:
|
|||||||
- '.github/workflows/test.yml'
|
- '.github/workflows/test.yml'
|
||||||
.github:
|
.github:
|
||||||
- '.github/**'
|
- '.github/**'
|
||||||
|
|
||||||
- name: Check if we should force jobs to run
|
- name: Check if we should force jobs to run
|
||||||
id: should_force
|
id: should_force
|
||||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
|
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
server-unit-tests:
|
server-unit-tests:
|
||||||
name: Test & Lint Server
|
name: Test & Lint Server
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -73,39 +67,33 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./server
|
working-directory: ./server
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
- name: Run package manager install
|
||||||
- name: Run npm install
|
run: pnpm install
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint
|
run: pnpm lint
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run small tests & coverage
|
- name: Run small tests & coverage
|
||||||
run: npm test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
cli-unit-tests:
|
cli-unit-tests:
|
||||||
name: Unit Test CLI
|
name: Unit Test CLI
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -116,43 +104,36 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./cli
|
working-directory: ./cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './cli/.nvmrc'
|
node-version-file: './cli/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Setup typescript-sdk
|
- name: Setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install && pnpm run build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: npm ci
|
run: pnpm install
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint
|
run: pnpm lint
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run unit tests & coverage
|
- name: Run unit tests & coverage
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
cli-unit-tests-win:
|
cli-unit-tests-win:
|
||||||
name: Unit Test CLI (Windows)
|
name: Unit Test CLI (Windows)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -163,36 +144,31 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./cli
|
working-directory: ./cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './cli/.nvmrc'
|
node-version-file: './cli/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Setup typescript-sdk
|
- name: Setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
# Skip linter & formatter in Windows test.
|
# Skip linter & formatter in Windows test.
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run unit tests & coverage
|
- name: Run unit tests & coverage
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
web-lint:
|
web-lint:
|
||||||
name: Lint Web
|
name: Lint Web
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -203,39 +179,33 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./web
|
working-directory: ./web
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './web/.nvmrc'
|
node-version-file: './web/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
- name: Run pnpm install
|
||||||
- name: Run npm install
|
run: pnpm rebuild && pnpm install --frozen-lockfile
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint:p
|
run: pnpm lint:p
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run svelte checks
|
- name: Run svelte checks
|
||||||
run: npm run check:svelte
|
run: pnpm check:svelte
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
web-unit-tests:
|
web-unit-tests:
|
||||||
name: Test Web
|
name: Test Web
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -246,35 +216,30 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./web
|
working-directory: ./web
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './web/.nvmrc'
|
node-version-file: './web/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
|
||||||
- name: Run npm install
|
- name: Run npm install
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check:typescript
|
run: pnpm check:typescript
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run unit tests & coverage
|
- name: Run unit tests & coverage
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
i18n-tests:
|
i18n-tests:
|
||||||
name: Test i18n
|
name: Test i18n
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -284,30 +249,27 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './web/.nvmrc'
|
node-version-file: './web/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm --prefix=web ci
|
run: pnpm --filter=immich-web install --frozen-lockfile
|
||||||
|
|
||||||
- name: Format
|
- name: Format
|
||||||
run: npm --prefix=web run format:i18n
|
run: pnpm --filter=immich-web format:i18n
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
i18n/**
|
i18n/**
|
||||||
|
|
||||||
- name: Verify files have not changed
|
- name: Verify files have not changed
|
||||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||||
env:
|
env:
|
||||||
@@ -316,7 +278,6 @@ jobs:
|
|||||||
echo "ERROR: i18n files not up to date!"
|
echo "ERROR: i18n files not up to date!"
|
||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
e2e-tests-lint:
|
e2e-tests-lint:
|
||||||
name: End-to-End Lint
|
name: End-to-End Lint
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -327,41 +288,35 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./e2e
|
working-directory: ./e2e
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './e2e/.nvmrc'
|
node-version-file: './e2e/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint
|
run: pnpm lint
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
server-medium-tests:
|
server-medium-tests:
|
||||||
name: Medium Tests (Server)
|
name: Medium Tests (Server)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -372,27 +327,24 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./server
|
working-directory: ./server
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
- name: Run pnpm install
|
||||||
- name: Run npm install
|
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run medium tests
|
- name: Run medium tests
|
||||||
run: npm run test:medium
|
run: pnpm test:medium
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
e2e-tests-server-cli:
|
e2e-tests-server-cli:
|
||||||
name: End-to-End Tests (Server & CLI)
|
name: End-to-End Tests (Server & CLI)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -406,43 +358,41 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './e2e/.nvmrc'
|
node-version-file: './e2e/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
if: ${{ !cancelled() }}
|
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
|
- name: Run setup cli
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./cli
|
working-directory: ./cli
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Docker build
|
- name: Docker build
|
||||||
run: docker compose build
|
run: docker compose build
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run e2e tests (api & cli)
|
- name: Run e2e tests (api & cli)
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
e2e-tests-web:
|
e2e-tests-web:
|
||||||
name: End-to-End Tests (Web)
|
name: End-to-End Tests (Web)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -456,42 +406,36 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './e2e/.nvmrc'
|
node-version-file: './e2e/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
run: npx playwright install chromium --only-shell
|
run: npx playwright install chromium --only-shell
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Docker build
|
- name: Docker build
|
||||||
run: docker compose build
|
run: docker compose build
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run e2e tests (web)
|
- name: Run e2e tests (web)
|
||||||
run: npx playwright test
|
run: npx playwright test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
success-check-e2e:
|
success-check-e2e:
|
||||||
name: End-to-End Tests Success
|
name: End-to-End Tests Success
|
||||||
needs: [e2e-tests-server-cli, e2e-tests-web]
|
needs: [e2e-tests-server-cli, e2e-tests-web]
|
||||||
@@ -502,7 +446,6 @@ jobs:
|
|||||||
- uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
|
- uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
|
||||||
with:
|
with:
|
||||||
needs: ${{ toJSON(needs) }}
|
needs: ${{ toJSON(needs) }}
|
||||||
|
|
||||||
mobile-unit-tests:
|
mobile-unit-tests:
|
||||||
name: Unit Test Mobile
|
name: Unit Test Mobile
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -511,24 +454,20 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Setup Flutter SDK
|
- name: Setup Flutter SDK
|
||||||
uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
|
uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
|
||||||
with:
|
with:
|
||||||
channel: 'stable'
|
channel: 'stable'
|
||||||
flutter-version-file: ./mobile/pubspec.yaml
|
flutter-version-file: ./mobile/pubspec.yaml
|
||||||
|
|
||||||
- name: Generate translation file
|
- name: Generate translation file
|
||||||
run: make translation
|
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
|
||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
run: flutter test -j 1
|
run: flutter test -j 1
|
||||||
|
|
||||||
ml-unit-tests:
|
ml-unit-tests:
|
||||||
name: Unit Test ML
|
name: Unit Test ML
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -540,10 +479,9 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
working-directory: ./machine-learning
|
working-directory: ./machine-learning
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Install uv
|
- name: Install uv
|
||||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
||||||
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
||||||
@@ -566,7 +504,6 @@ jobs:
|
|||||||
- name: Run tests and coverage
|
- name: Run tests and coverage
|
||||||
run: |
|
run: |
|
||||||
uv run pytest --cov=immich_ml --cov-report term-missing
|
uv run pytest --cov=immich_ml --cov-report term-missing
|
||||||
|
|
||||||
github-files-formatting:
|
github-files-formatting:
|
||||||
name: .github Files Formatting
|
name: .github Files Formatting
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -577,45 +514,38 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./.github
|
working-directory: ./.github
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './.github/.nvmrc'
|
node-version-file: './.github/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
- name: Run pnpm install
|
||||||
- name: Run npm install
|
run: pnpm install --frozen-lockfile
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
shellcheck:
|
shellcheck:
|
||||||
name: ShellCheck
|
name: ShellCheck
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Run ShellCheck
|
- name: Run ShellCheck
|
||||||
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
|
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
|
||||||
with:
|
with:
|
||||||
ignore_paths: >-
|
ignore_paths: >-
|
||||||
**/open-api/**
|
**/open-api/** **/openapi** **/node_modules/**
|
||||||
**/openapi**
|
|
||||||
**/node_modules/**
|
|
||||||
|
|
||||||
generated-api-up-to-date:
|
generated-api-up-to-date:
|
||||||
name: OpenAPI Clients
|
name: OpenAPI Clients
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -623,26 +553,23 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Install server dependencies
|
- 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
|
- name: Build the app
|
||||||
run: npm --prefix=server run build
|
run: pnpm --filter immich build
|
||||||
|
|
||||||
- name: Run API generation
|
- name: Run API generation
|
||||||
run: make open-api
|
run: make open-api
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
@@ -651,7 +578,6 @@ jobs:
|
|||||||
mobile/openapi
|
mobile/openapi
|
||||||
open-api/typescript-sdk
|
open-api/typescript-sdk
|
||||||
open-api/immich-openapi-specs.json
|
open-api/immich-openapi-specs.json
|
||||||
|
|
||||||
- name: Verify files have not changed
|
- name: Verify files have not changed
|
||||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||||
env:
|
env:
|
||||||
@@ -660,7 +586,6 @@ jobs:
|
|||||||
echo "ERROR: Generated files not up to date!"
|
echo "ERROR: Generated files not up to date!"
|
||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
sql-schema-up-to-date:
|
sql-schema-up-to-date:
|
||||||
name: SQL Schema Checks
|
name: SQL Schema Checks
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -668,51 +593,42 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:1f5583fe3397210a0fbc7f11b0cec18bacc4a99e3e8ea0548e9bd6bcf26ec37a
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:ec713143dca1a426eba2e03707c319e2ec3cc9d304ef767f777f8e297dee820c
|
||||||
env:
|
env:
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: postgres
|
||||||
POSTGRES_DB: immich
|
POSTGRES_DB: immich
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd pg_isready
|
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
||||||
--health-interval 10s
|
|
||||||
--health-timeout 5s
|
|
||||||
--health-retries 5
|
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./server
|
working-directory: ./server
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Install server dependencies
|
- name: Install server dependencies
|
||||||
run: npm ci
|
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Build the app
|
- name: Build the app
|
||||||
run: npm run build
|
run: pnpm build
|
||||||
|
|
||||||
- name: Run existing migrations
|
- name: Run existing migrations
|
||||||
run: npm run migrations:run
|
run: pnpm migrations:run
|
||||||
|
|
||||||
- name: Test npm run schema:reset command works
|
- name: Test npm run schema:reset command works
|
||||||
run: npm run schema:reset
|
run: pnpm schema:reset
|
||||||
|
|
||||||
- name: Generate new migrations
|
- name: Generate new migrations
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: npm run migrations:generate src/TestMigration
|
run: pnpm migrations:generate src/TestMigration
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
@@ -728,19 +644,16 @@ jobs:
|
|||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
cat ./src/*-TestMigration.ts
|
cat ./src/*-TestMigration.ts
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Run SQL generation
|
- name: Run SQL generation
|
||||||
run: npm run sync:sql
|
run: pnpm sync:sql
|
||||||
env:
|
env:
|
||||||
DB_URL: postgres://postgres:postgres@localhost:5432/immich
|
DB_URL: postgres://postgres:postgres@localhost:5432/immich
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-sql-files
|
id: verify-changed-sql-files
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
server/src/queries
|
server/src/queries
|
||||||
|
|
||||||
- name: Verify SQL files have not changed
|
- name: Verify SQL files have not changed
|
||||||
if: steps.verify-changed-sql-files.outputs.files_changed == 'true'
|
if: steps.verify-changed-sql-files.outputs.files_changed == 'true'
|
||||||
env:
|
env:
|
||||||
|
|||||||
4
.github/workflows/weblate-lock.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}
|
should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- id: found_paths
|
- id: found_paths
|
||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
- name: Find Pull Request
|
- name: Find Pull Request
|
||||||
uses: juliangruber/find-pull-request-action@48b6133aa6c826f267ebd33aa2d29470f9d9e7d0 # v1.9.0
|
uses: juliangruber/find-pull-request-action@952b3bb1ddb2dcc0aa3479e98bb1c2d1a922f096 # v1.10.0
|
||||||
id: find-pr
|
id: find-pr
|
||||||
with:
|
with:
|
||||||
branch: chore/translations
|
branch: chore/translations
|
||||||
|
|||||||
39
.pnpmfile.cjs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
module.exports = {
|
||||||
|
hooks: {
|
||||||
|
readPackage: (pkg) => {
|
||||||
|
if (!pkg.name) {
|
||||||
|
return pkg;
|
||||||
|
}
|
||||||
|
switch (pkg.name) {
|
||||||
|
case "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"];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "sharp":
|
||||||
|
const optionalDeps = Object.keys(pkg.optionalDependencies).filter(
|
||||||
|
(dep) => dep.startsWith("@img")
|
||||||
|
);
|
||||||
|
for (const dep of optionalDeps) {
|
||||||
|
// remove all optionalDependencies from sharp (they will be compiled from source), except:
|
||||||
|
// include the precompiled musl version of sharp, for web
|
||||||
|
// include precompiled linux-x64 version of sharp, for server (stage: web-prod)
|
||||||
|
// include precompiled linux-arm64 version of sharp, for server (stage: web-prod)
|
||||||
|
if (
|
||||||
|
dep.includes("musl") ||
|
||||||
|
dep.includes("linux-x64") ||
|
||||||
|
dep.includes("linux-arm64")
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
delete pkg.optionalDependencies[dep];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return pkg;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
4
.vscode/launch.json
vendored
@@ -7,7 +7,7 @@
|
|||||||
"restart": true,
|
"restart": true,
|
||||||
"port": 9231,
|
"port": 9231,
|
||||||
"name": "Immich API Server",
|
"name": "Immich API Server",
|
||||||
"remoteRoot": "/usr/src/app",
|
"remoteRoot": "/usr/src/app/server",
|
||||||
"localRoot": "${workspaceFolder}/server"
|
"localRoot": "${workspaceFolder}/server"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
"restart": true,
|
"restart": true,
|
||||||
"port": 9230,
|
"port": 9230,
|
||||||
"name": "Immich Workers",
|
"name": "Immich Workers",
|
||||||
"remoteRoot": "/usr/src/app",
|
"remoteRoot": "/usr/src/app/server",
|
||||||
"localRoot": "${workspaceFolder}/server"
|
"localRoot": "${workspaceFolder}/server"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
@@ -56,7 +56,8 @@
|
|||||||
"explorer.fileNesting.enabled": true,
|
"explorer.fileNesting.enabled": true,
|
||||||
"explorer.fileNesting.patterns": {
|
"explorer.fileNesting.patterns": {
|
||||||
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
|
"*.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,
|
"svelte.enable-ts-plugin": true,
|
||||||
"typescript.preferences.importModuleSpecifier": "non-relative"
|
"typescript.preferences.importModuleSpecifier": "non-relative"
|
||||||
|
|||||||
75
Makefile
@@ -10,6 +10,9 @@ dev-update:
|
|||||||
dev-scale:
|
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
|
.PHONY: e2e
|
||||||
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 --build -V --remove-orphans
|
||||||
@@ -40,7 +43,7 @@ open-api-typescript:
|
|||||||
cd ./open-api && bash ./bin/generate-open-api.sh typescript
|
cd ./open-api && bash ./bin/generate-open-api.sh typescript
|
||||||
|
|
||||||
sql:
|
sql:
|
||||||
npm --prefix server run sync:sql
|
pnpm --filter immich run sync:sql
|
||||||
|
|
||||||
attach-server:
|
attach-server:
|
||||||
docker exec -it docker_immich-server_1 sh
|
docker exec -it docker_immich-server_1 sh
|
||||||
@@ -50,31 +53,40 @@ renovate:
|
|||||||
|
|
||||||
MODULES = e2e server web cli sdk docs .github
|
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-%:
|
audit-%:
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) audit fix
|
pnpm --filter $(call map-package,$*) audit fix
|
||||||
install-%:
|
install-%:
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) i
|
pnpm --filter $(call map-package,$*) install $(if $(FROZEN),--frozen-lockfile) $(if $(OFFLINE),--offline)
|
||||||
ci-%:
|
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) ci
|
|
||||||
build-cli: build-sdk
|
build-cli: build-sdk
|
||||||
build-web: build-sdk
|
build-web: build-sdk
|
||||||
build-%: install-%
|
build-%: install-%
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) run build
|
pnpm --filter $(call map-package,$*) run build
|
||||||
format-%:
|
format-%:
|
||||||
npm --prefix $* run format:fix
|
pnpm --filter $(call map-package,$*) run format:fix
|
||||||
lint-%:
|
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-%:
|
check-%:
|
||||||
npm --prefix $* run check
|
pnpm --filter $(call map-package,$*) run check
|
||||||
check-web:
|
check-web:
|
||||||
npm --prefix web run check:typescript
|
pnpm --filter immich-web run check:typescript
|
||||||
npm --prefix web run check:svelte
|
pnpm --filter immich-web run check:svelte
|
||||||
test-%:
|
test-%:
|
||||||
npm --prefix $* run test
|
pnpm --filter $(call map-package,$*) run test
|
||||||
test-e2e:
|
test-e2e:
|
||||||
docker compose -f ./e2e/docker-compose.yml build
|
docker compose -f ./e2e/docker-compose.yml build
|
||||||
npm --prefix e2e run test
|
pnpm --filter immich-e2e run test
|
||||||
npm --prefix e2e run test:web
|
pnpm --filter immich-e2e run test:web
|
||||||
test-medium:
|
test-medium:
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
@@ -84,25 +96,36 @@ test-medium:
|
|||||||
-v ./server/tsconfig.json:/usr/src/app/tsconfig.json \
|
-v ./server/tsconfig.json:/usr/src/app/tsconfig.json \
|
||||||
-e NODE_ENV=development \
|
-e NODE_ENV=development \
|
||||||
immich-server:latest \
|
immich-server:latest \
|
||||||
-c "npm ci && npm run test:medium -- --run"
|
-c "pnpm test:medium -- --run"
|
||||||
test-medium-dev:
|
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:
|
||||||
install-all: $(foreach M,$(MODULES),install-$M) ;
|
pnpm -r --filter '!documentation' install
|
||||||
ci-all: $(foreach M,$(filter-out .github,$(MODULES)),ci-$M) ;
|
|
||||||
check-all: $(foreach M,$(filter-out sdk cli docs .github,$(MODULES)),check-$M) ;
|
build-all: $(foreach M,$(filter-out e2e docs .github,$(MODULES)),build-$M) ;
|
||||||
lint-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),lint-$M) ;
|
|
||||||
format-all: $(foreach M,$(filter-out sdk,$(MODULES)),format-$M) ;
|
check-all:
|
||||||
audit-all: $(foreach M,$(MODULES),audit-$M) ;
|
pnpm -r --filter '!documentation' run "/^(check|check\:svelte|check\:typescript)$/"
|
||||||
hygiene-all: lint-all format-all check-all sql audit-all;
|
lint-all:
|
||||||
test-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),test-$M) ;
|
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:
|
clean:
|
||||||
find . -name "node_modules" -type d -prune -exec rm -rf {} +
|
find . -name "node_modules" -type d -prune -exec rm -rf {} +
|
||||||
find . -name "dist" -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 "build" -type d -prune -exec rm -rf '{}' +
|
||||||
find . -name "svelte-kit" -type d -prune -exec rm -rf '{}' +
|
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 rm -v -f || true
|
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
|
command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml rm -v -f || true
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
@@ -1,19 +1,14 @@
|
|||||||
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e AS core
|
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
|
WORKDIR /usr/src/app
|
||||||
|
COPY package* pnpm* .pnpmfile.cjs ./
|
||||||
COPY cli/package.json cli/package-lock.json ./
|
COPY ./cli ./cli/
|
||||||
RUN npm ci
|
COPY ./open-api/typescript-sdk ./open-api/typescript-sdk/
|
||||||
|
RUN corepack enable pnpm && \
|
||||||
COPY cli .
|
pnpm install --filter @immich/sdk --filter @immich/cli --frozen-lockfile && \
|
||||||
RUN npm run build
|
pnpm --filter @immich/sdk build && \
|
||||||
|
pnpm --filter @immich/cli build
|
||||||
|
|
||||||
WORKDIR /import
|
WORKDIR /import
|
||||||
|
|
||||||
ENTRYPOINT ["node", "/usr/src/app/dist"]
|
ENTRYPOINT ["node", "/usr/src/app/cli/dist"]
|
||||||
|
|||||||
4632
cli/package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@immich/cli",
|
"name": "@immich/cli",
|
||||||
"version": "2.2.73",
|
"version": "2.2.83",
|
||||||
"description": "Command Line Interface (CLI) for Immich",
|
"description": "Command Line Interface (CLI) for Immich",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"exports": "./dist/index.js",
|
"exports": "./dist/index.js",
|
||||||
@@ -21,15 +21,15 @@
|
|||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/micromatch": "^4.0.9",
|
"@types/micromatch": "^4.0.9",
|
||||||
"@types/mock-fs": "^4.13.1",
|
"@types/mock-fs": "^4.13.1",
|
||||||
"@types/node": "^22.16.4",
|
"@types/node": "^22.17.1",
|
||||||
"@vitest/coverage-v8": "^3.0.0",
|
"@vitest/coverage-v8": "^3.0.0",
|
||||||
"byte-size": "^9.0.0",
|
"byte-size": "^9.0.0",
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
"commander": "^12.0.0",
|
"commander": "^12.0.0",
|
||||||
"eslint": "^9.14.0",
|
"eslint": "^9.14.0",
|
||||||
"eslint-config-prettier": "^10.0.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-unicorn": "^59.0.0",
|
"eslint-plugin-unicorn": "^60.0.0",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.0.0",
|
||||||
"mock-fs": "^5.2.0",
|
"mock-fs": "^5.2.0",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
@@ -69,6 +69,6 @@
|
|||||||
"micromatch": "^4.0.8"
|
"micromatch": "^4.0.8"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.17.1"
|
"node": "22.18.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,37 +2,37 @@
|
|||||||
# Manual edits may be lost in future updates.
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
constraints = "4.52.0"
|
constraints = "4.52.1"
|
||||||
hashes = [
|
hashes = [
|
||||||
"h1:2BEJyXJtYC4B4nda/WCYUmuJYDaYk88F8t1pwPzr0iQ=",
|
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||||
"h1:4IASk5SESeWKQ7JU0+M7KApuF5mZyklvwMXPBabim3c=",
|
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||||
"h1:5ImZxxALSnWfH/4EXw/wFirSmk5Tr0ACmcysy51AafE=",
|
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||||
"h1:6TJ3dxLSin4ZKBJLsZDn95H2ZYnGm8S7GGHvvXuuMQU=",
|
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||||
"h1:IzTUjg9kQ4N3qizP9CjYLeHwjsuGgtxwXvfUQWyOLcA=",
|
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||||
"h1:NTaOQfYINA0YTG/V1/9+SYtgX1it63+cBugj4WK4FWc=",
|
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||||
"h1:PXH48LuJn329sCfMXprdMDk51EZaWFyajVvS03qhQLs=",
|
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||||
"h1:Pi5M+GeoMSN2eJ6QnIeXjBf19O+rby/74CfB2ocpv20=",
|
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||||
"h1:ShXZ2ZjBvm3thfoPPzPT8+OhyismnydQVkUAfI8X12w=",
|
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||||
"h1:WQ9hu0Wge2msBbODfottCSKgu8oKUrw4Opz+fDPVVHk=",
|
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||||
"h1:Z5yXML2DE0uH9UU+M0ut9JMQAORcwVZz1CxBHzeBmao=",
|
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||||
"h1:jqI2qKknpleS3JDSplyGYHMu0u9K/tor1ZOjFwDgEMk=",
|
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||||
"h1:kgfutDh14Q5nw4eg6qGFamFxIiY8Ae0FPKRBLDOzpcI=",
|
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||||
"h1:zCAO7GZmfYhWb+i6TfqlqhMeDyPZWGio2IzEzAh3YTs=",
|
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||||
"zh:19be1a91c982b902c42aba47766860dfa5dc151eed1e95fd39ca642229381ef0",
|
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||||
"zh:1de451c4d1ecf7efbe67b6dace3426ba810711afdd644b0f1b870364c8ae91f8",
|
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||||
"zh:352b4a2120173298622e669258744554339d959ac3a95607b117a48ee4a83238",
|
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||||
"zh:3c6f1346d9154afbd2d558fabb4b0150fc8d559aa961254144fe1bc17fe6032f",
|
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||||
"zh:4c4c92d53fb535b1e0eff26f222bbd627b97d3b4c891ec9c321268676d06152f",
|
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||||
"zh:53276f68006c9ceb7cdb10a6ccf91a5c1eadd1407a28edb5741e84e88d7e29e8",
|
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||||
"zh:7925a97773948171a63d4f65bb81ee92fd6d07a447e36012977313293a5435c9",
|
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||||
"zh:7dfb0a4496cfe032437386d0a2cd9229a1956e9c30bd920923c141b0f0440060",
|
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||||
|
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||||
"zh:8d4aa79f0a414bb4163d771063c70cd991c8fac6c766e685bac2ee12903c5bd6",
|
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||||
"zh:a67540c13565616a7e7e51ee9366e88b0dc60046e1d75c72680e150bd02725bb",
|
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||||
"zh:a936383a4767f5393f38f622e92bf2d0c03fe04b69c284951f27345766c7b31b",
|
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||||
"zh:d4887d73c466ff036eecf50ad6404ba38fd82ea4855296b1846d244b0f13c380",
|
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||||
"zh:e9093c8bd5b6cd99c81666e315197791781b8f93afa14fc2e0f732d1bb2a44b7",
|
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||||
"zh:efd3b3f1ec59a37f635aa1d4efcf178734c2fcf8ddb0d56ea690bec342da8672",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
cloudflare = {
|
cloudflare = {
|
||||||
source = "cloudflare/cloudflare"
|
source = "cloudflare/cloudflare"
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,37 +2,37 @@
|
|||||||
# Manual edits may be lost in future updates.
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
constraints = "4.52.0"
|
constraints = "4.52.1"
|
||||||
hashes = [
|
hashes = [
|
||||||
"h1:2BEJyXJtYC4B4nda/WCYUmuJYDaYk88F8t1pwPzr0iQ=",
|
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||||
"h1:4IASk5SESeWKQ7JU0+M7KApuF5mZyklvwMXPBabim3c=",
|
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||||
"h1:5ImZxxALSnWfH/4EXw/wFirSmk5Tr0ACmcysy51AafE=",
|
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||||
"h1:6TJ3dxLSin4ZKBJLsZDn95H2ZYnGm8S7GGHvvXuuMQU=",
|
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||||
"h1:IzTUjg9kQ4N3qizP9CjYLeHwjsuGgtxwXvfUQWyOLcA=",
|
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||||
"h1:NTaOQfYINA0YTG/V1/9+SYtgX1it63+cBugj4WK4FWc=",
|
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||||
"h1:PXH48LuJn329sCfMXprdMDk51EZaWFyajVvS03qhQLs=",
|
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||||
"h1:Pi5M+GeoMSN2eJ6QnIeXjBf19O+rby/74CfB2ocpv20=",
|
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||||
"h1:ShXZ2ZjBvm3thfoPPzPT8+OhyismnydQVkUAfI8X12w=",
|
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||||
"h1:WQ9hu0Wge2msBbODfottCSKgu8oKUrw4Opz+fDPVVHk=",
|
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||||
"h1:Z5yXML2DE0uH9UU+M0ut9JMQAORcwVZz1CxBHzeBmao=",
|
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||||
"h1:jqI2qKknpleS3JDSplyGYHMu0u9K/tor1ZOjFwDgEMk=",
|
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||||
"h1:kgfutDh14Q5nw4eg6qGFamFxIiY8Ae0FPKRBLDOzpcI=",
|
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||||
"h1:zCAO7GZmfYhWb+i6TfqlqhMeDyPZWGio2IzEzAh3YTs=",
|
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||||
"zh:19be1a91c982b902c42aba47766860dfa5dc151eed1e95fd39ca642229381ef0",
|
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||||
"zh:1de451c4d1ecf7efbe67b6dace3426ba810711afdd644b0f1b870364c8ae91f8",
|
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||||
"zh:352b4a2120173298622e669258744554339d959ac3a95607b117a48ee4a83238",
|
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||||
"zh:3c6f1346d9154afbd2d558fabb4b0150fc8d559aa961254144fe1bc17fe6032f",
|
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||||
"zh:4c4c92d53fb535b1e0eff26f222bbd627b97d3b4c891ec9c321268676d06152f",
|
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||||
"zh:53276f68006c9ceb7cdb10a6ccf91a5c1eadd1407a28edb5741e84e88d7e29e8",
|
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||||
"zh:7925a97773948171a63d4f65bb81ee92fd6d07a447e36012977313293a5435c9",
|
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||||
"zh:7dfb0a4496cfe032437386d0a2cd9229a1956e9c30bd920923c141b0f0440060",
|
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||||
|
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||||
"zh:8d4aa79f0a414bb4163d771063c70cd991c8fac6c766e685bac2ee12903c5bd6",
|
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||||
"zh:a67540c13565616a7e7e51ee9366e88b0dc60046e1d75c72680e150bd02725bb",
|
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||||
"zh:a936383a4767f5393f38f622e92bf2d0c03fe04b69c284951f27345766c7b31b",
|
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||||
"zh:d4887d73c466ff036eecf50ad6404ba38fd82ea4855296b1846d244b0f13c380",
|
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||||
"zh:e9093c8bd5b6cd99c81666e315197791781b8f93afa14fc2e0f732d1bb2a44b7",
|
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||||
"zh:efd3b3f1ec59a37f635aa1d4efcf178734c2fcf8ddb0d56ea690bec342da8672",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
cloudflare = {
|
cloudflare = {
|
||||||
source = "cloudflare/cloudflare"
|
source = "cloudflare/cloudflare"
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,17 +21,16 @@ services:
|
|||||||
# extends:
|
# extends:
|
||||||
# file: hwaccel.transcoding.yml
|
# file: hwaccel.transcoding.yml
|
||||||
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
||||||
|
user: '${UID:-1000}:${GID:-1000}'
|
||||||
build:
|
build:
|
||||||
context: ../
|
context: ../
|
||||||
dockerfile: server/Dockerfile
|
dockerfile: server/Dockerfile
|
||||||
target: dev
|
target: dev
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- ../server:/usr/src/app/server
|
- ..:/usr/src/app
|
||||||
- ../open-api:/usr/src/app/open-api
|
- ${UPLOAD_LOCATION}/photos:/data
|
||||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||||
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/upload/upload
|
|
||||||
- /usr/src/app/server/node_modules
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -58,8 +57,12 @@ services:
|
|||||||
- 9231:9231
|
- 9231:9231
|
||||||
- 2283:2283
|
- 2283:2283
|
||||||
depends_on:
|
depends_on:
|
||||||
- redis
|
redis:
|
||||||
- database
|
condition: service_started
|
||||||
|
database:
|
||||||
|
condition: service_started
|
||||||
|
init:
|
||||||
|
condition: service_completed_successfully
|
||||||
healthcheck:
|
healthcheck:
|
||||||
disable: false
|
disable: false
|
||||||
|
|
||||||
@@ -68,9 +71,11 @@ services:
|
|||||||
image: immich-web-dev:latest
|
image: immich-web-dev:latest
|
||||||
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
|
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
|
||||||
# user: 0:0
|
# user: 0:0
|
||||||
|
user: '${UID:-1000}:${GID:-1000}'
|
||||||
build:
|
build:
|
||||||
context: ../
|
context: ../
|
||||||
dockerfile: web/Dockerfile
|
dockerfile: server/Dockerfile
|
||||||
|
target: dev
|
||||||
command: ['immich-web']
|
command: ['immich-web']
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -78,18 +83,17 @@ services:
|
|||||||
- 3000:3000
|
- 3000:3000
|
||||||
- 24678:24678
|
- 24678:24678
|
||||||
volumes:
|
volumes:
|
||||||
- ../web:/usr/src/app/web
|
- ..:/usr/src/app
|
||||||
- ../i18n:/usr/src/app/i18n
|
|
||||||
- ../open-api/:/usr/src/app/open-api/
|
|
||||||
# - ../../ui:/usr/ui
|
|
||||||
- /usr/src/app/web/node_modules
|
|
||||||
ulimits:
|
ulimits:
|
||||||
nofile:
|
nofile:
|
||||||
soft: 1048576
|
soft: 1048576
|
||||||
hard: 1048576
|
hard: 1048576
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
- immich-server
|
immich-server:
|
||||||
|
condition: service_started
|
||||||
|
init:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
|
||||||
immich-machine-learning:
|
immich-machine-learning:
|
||||||
container_name: immich_machine_learning
|
container_name: immich_machine_learning
|
||||||
@@ -117,13 +121,13 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
image: docker.io/valkey/valkey:8-bookworm@sha256:a137a2b60aca1a75130022d6bb96af423fefae4eb55faf395732db3544803280
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
|
|
||||||
database:
|
database:
|
||||||
container_name: immich_postgres
|
container_name: immich_postgres
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
@@ -157,6 +161,14 @@ services:
|
|||||||
# volumes:
|
# volumes:
|
||||||
# - grafana-data:/var/lib/grafana
|
# - grafana-data:/var/lib/grafana
|
||||||
|
|
||||||
|
init:
|
||||||
|
container_name: init
|
||||||
|
image: busybox
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
user: 0:0
|
||||||
|
command: sh -c 'for path in /usr/src/app/.pnpm-store /usr/src/app/server/node_modules /usr/src/app/.github/node_modules /usr/src/app/cli/node_modules /usr/src/app/docs/node_modules /usr/src/app/e2e/node_modules /usr/src/app/open-api/typescript-sdk/node_modules /usr/src/app/web/.svelte-kit /usr/src/app/web/coverage /usr/src/app/node_modules /usr/src/app/web/node_modules; do [ -e "$$path" ] && chown -R ${UID:-1000}:${GID:-1000} "$$path" || true; done'
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
model-cache:
|
model-cache:
|
||||||
prometheus-data:
|
prometheus-data:
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ services:
|
|||||||
context: ../
|
context: ../
|
||||||
dockerfile: server/Dockerfile
|
dockerfile: server/Dockerfile
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos:/data
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -56,14 +56,14 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
image: docker.io/valkey/valkey:8-bookworm@sha256:a137a2b60aca1a75130022d6bb96af423fefae4eb55faf395732db3544803280
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
database:
|
database:
|
||||||
container_name: immich_postgres
|
container_name: immich_postgres
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
@@ -95,7 +95,7 @@ services:
|
|||||||
command: ['./run.sh', '-disable-reporting']
|
command: ['./run.sh', '-disable-reporting']
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
image: grafana/grafana:12.0.2-ubuntu@sha256:0512d81cdeaaff0e370a9aa66027b465d1f1f04379c3a9c801a905fabbdbc7a5
|
image: grafana/grafana:12.1.1-ubuntu@sha256:d1da838234ff2de93e0065ee1bf0e66d38f948dcc5d718c25fa6237e14b4424a
|
||||||
volumes:
|
volumes:
|
||||||
- grafana-data:/var/lib/grafana
|
- grafana-data:/var/lib/grafana
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ services:
|
|||||||
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
||||||
volumes:
|
volumes:
|
||||||
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -49,14 +49,14 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
image: docker.io/valkey/valkey:8-bookworm@sha256:a137a2b60aca1a75130022d6bb96af423fefae4eb55faf395732db3544803280
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
database:
|
database:
|
||||||
container_name: immich_postgres
|
container_name: immich_postgres
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
POSTGRES_USER: ${DB_USERNAME}
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
|||||||
2
docs/.gitignore
vendored
@@ -19,3 +19,5 @@ npm-debug.log*
|
|||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
yarn.lock
|
yarn.lock
|
||||||
|
|
||||||
|
/static/openapi.json
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
@@ -5,13 +5,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
|
|||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
```
|
```
|
||||||
$ npm install
|
$ pnpm install
|
||||||
```
|
```
|
||||||
|
|
||||||
### Local Development
|
### 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.
|
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
|
### 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.
|
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:
|
Using SSH:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ USE_SSH=true npm run deploy
|
$ USE_SSH=true pnpm run deploy
|
||||||
```
|
```
|
||||||
|
|
||||||
Not using SSH:
|
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.
|
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.
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ services:
|
|||||||
...
|
...
|
||||||
volumes:
|
volumes:
|
||||||
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
+ - originals:/usr/src/app/originals
|
+ - originals:/usr/src/app/originals
|
||||||
...
|
...
|
||||||
|
|||||||
@@ -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:
|
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/)
|
- [Authelia](https://www.authelia.com/integration/openid-connect/immich/)
|
||||||
- [Okta](https://www.okta.com/openid-connect/)
|
- [Okta](https://www.okta.com/openid-connect/)
|
||||||
- [Google](https://developers.google.com/identity/openid-connect/openid-connect)
|
- [Google](https://developers.google.com/identity/openid-connect/openid-connect)
|
||||||
@@ -64,7 +64,7 @@ Once you have a new OAuth client application configured, Immich can be configure
|
|||||||
| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**š** |
|
| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**š** |
|
||||||
| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**š** |
|
| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**š** |
|
||||||
| Storage Quota Claim | string | immich_quota | Claim mapping for the user's storage**š** |
|
| Storage Quota Claim | string | immich_quota | Claim mapping for the user's storage**š** |
|
||||||
| Default Storage Quota (GiB) | number | 0 | Default quota for user without storage quota claim (Enter 0 for unlimited quota) |
|
| Default Storage Quota (GiB) | number | 0 | Default quota for user without storage quota claim (empty for unlimited quota) |
|
||||||
| Button Text | string | Login with OAuth | Text for the OAuth button on the web |
|
| Button Text | string | Login with OAuth | Text for the OAuth button on the web |
|
||||||
| Auto Register | boolean | true | When true, will automatically register a user the first time they sign in |
|
| Auto Register | boolean | true | When true, will automatically register a user the first time they sign in |
|
||||||
| [Auto Launch](#auto-launch) | boolean | false | When true, will skip the login page and automatically start the OAuth login process |
|
| [Auto Launch](#auto-launch) | boolean | false | When true, will skip the login page and automatically start the OAuth login process |
|
||||||
@@ -106,6 +106,89 @@ Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to
|
|||||||
|
|
||||||
## Example Configuration
|
## Example Configuration
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Authelia Example</summary>
|
||||||
|
|
||||||
|
### Authelia Example
|
||||||
|
|
||||||
|
Here's an example of OAuth configured for Authelia:
|
||||||
|
|
||||||
|
This assumes there exist an attribute `immichquota` in the user schema, which is used to set the user's storage quota in Immich.
|
||||||
|
The configuration concerning the quota is optional.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
authentication_backend:
|
||||||
|
ldap:
|
||||||
|
# The LDAP server configuration goes here.
|
||||||
|
# See: https://www.authelia.com/c/ldap
|
||||||
|
attributes:
|
||||||
|
extra:
|
||||||
|
immichquota: # The attribute name from LDAP
|
||||||
|
name: 'immich_quota'
|
||||||
|
multi_valued: false
|
||||||
|
value_type: 'integer'
|
||||||
|
identity_providers:
|
||||||
|
oidc:
|
||||||
|
## The other portions of the mandatory OpenID Connect 1.0 configuration go here.
|
||||||
|
## See: https://www.authelia.com/c/oidc
|
||||||
|
claims_policies:
|
||||||
|
immich_policy:
|
||||||
|
custom_claims:
|
||||||
|
immich_quota:
|
||||||
|
attribute: 'immich_quota'
|
||||||
|
scopes:
|
||||||
|
immich_scope:
|
||||||
|
claims:
|
||||||
|
- 'immich_quota'
|
||||||
|
|
||||||
|
clients:
|
||||||
|
- client_id: 'immich'
|
||||||
|
client_name: 'Immich'
|
||||||
|
# https://www.authelia.com/integration/openid-connect/frequently-asked-questions/#how-do-i-generate-a-client-identifier-or-client-secret
|
||||||
|
client_secret: $pbkdf2-sha512$310000$c8p78n7pUMln0jzvd4aK4Q$JNRBzwAo0ek5qKn50cFzzvE9RXV88h1wJn5KGiHrD0YKtZaR/nCb2CJPOsKaPK0hjf.9yHxzQGZziziccp6Yng'
|
||||||
|
public: false
|
||||||
|
require_pkce: false
|
||||||
|
redirect_uris:
|
||||||
|
- 'https://example.immich.app/auth/login'
|
||||||
|
- 'https://example.immich.app/user-settings'
|
||||||
|
- 'app.immich:///oauth-callback'
|
||||||
|
scopes:
|
||||||
|
- 'openid'
|
||||||
|
- 'profile'
|
||||||
|
- 'email'
|
||||||
|
- 'immich_scope'
|
||||||
|
claims_policy: 'immich_policy'
|
||||||
|
response_types:
|
||||||
|
- 'code'
|
||||||
|
grant_types:
|
||||||
|
- 'authorization_code'
|
||||||
|
id_token_signed_response_alg: 'RS256'
|
||||||
|
userinfo_signed_response_alg: 'RS256'
|
||||||
|
token_endpoint_auth_method: 'client_secret_post'
|
||||||
|
```
|
||||||
|
|
||||||
|
Configuration of OAuth in Immich System Settings
|
||||||
|
|
||||||
|
| Setting | Value |
|
||||||
|
| ---------------------------------- | ------------------------------------------------------------------- |
|
||||||
|
| Issuer URL | `https://example.immich.app/.well-known/openid-configuration` |
|
||||||
|
| Client ID | immich |
|
||||||
|
| Client Secret | 0v89FXkQOWO\***\*\*\*\*\***\*\*\***\*\*\*\*\***mprbvXD549HH6s1iw... |
|
||||||
|
| Token Endpoint Auth Method | client_secret_post |
|
||||||
|
| Scope | openid email profile immich_scope |
|
||||||
|
| ID Token Signed Response Algorithm | RS256 |
|
||||||
|
| Userinfo Signed Response Algorithm | RS256 |
|
||||||
|
| Storage Label Claim | uid |
|
||||||
|
| Storage Quota Claim | immich_quota |
|
||||||
|
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
|
||||||
|
| Button Text | Sign in with Authelia (optional) |
|
||||||
|
| Auto Register | Enabled (optional) |
|
||||||
|
| Auto Launch | Enabled (optional) |
|
||||||
|
| Mobile Redirect URI Override | Disable |
|
||||||
|
| Mobile Redirect URI | |
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Authentik Example</summary>
|
<summary>Authentik Example</summary>
|
||||||
|
|
||||||
@@ -128,7 +211,7 @@ Configuration of OAuth in Immich System Settings
|
|||||||
| Signing Algorithm | RS256 |
|
| Signing Algorithm | RS256 |
|
||||||
| Storage Label Claim | preferred_username |
|
| Storage Label Claim | preferred_username |
|
||||||
| Storage Quota Claim | immich_quota |
|
| Storage Quota Claim | immich_quota |
|
||||||
| Default Storage Quota (GiB) | 0 (0 for unlimited quota) |
|
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
|
||||||
| Button Text | Sign in with Authentik (optional) |
|
| Button Text | Sign in with Authentik (optional) |
|
||||||
| Auto Register | Enabled (optional) |
|
| Auto Register | Enabled (optional) |
|
||||||
| Auto Launch | Enabled (optional) |
|
| Auto Launch | Enabled (optional) |
|
||||||
@@ -159,7 +242,7 @@ Configuration of OAuth in Immich System Settings
|
|||||||
| Signing Algorithm | RS256 |
|
| Signing Algorithm | RS256 |
|
||||||
| Storage Label Claim | preferred_username |
|
| Storage Label Claim | preferred_username |
|
||||||
| Storage Quota Claim | immich_quota |
|
| Storage Quota Claim | immich_quota |
|
||||||
| Default Storage Quota (GiB) | 0 (0 for unlimited quota) |
|
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
|
||||||
| Button Text | Sign in with Google (optional) |
|
| Button Text | Sign in with Google (optional) |
|
||||||
| Auto Register | Enabled (optional) |
|
| Auto Register | Enabled (optional) |
|
||||||
| Auto Launch | Enabled |
|
| Auto Launch | Enabled |
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
Users can deploy a custom reverse proxy that forwards requests to Immich. This way, the reverse proxy can handle TLS termination, load balancing, or other advanced features. All reverse proxies between Immich and the user must forward all headers and set the `Host`, `X-Real-IP`, `X-Forwarded-Proto` and `X-Forwarded-For` headers to their appropriate values. Additionally, your reverse proxy should allow for big enough uploads. By following these practices, you ensure that all custom reverse proxies are fully compatible with Immich.
|
Users can deploy a custom reverse proxy that forwards requests to Immich. This way, the reverse proxy can handle TLS termination, load balancing, or other advanced features. All reverse proxies between Immich and the user must forward all headers and set the `Host`, `X-Real-IP`, `X-Forwarded-Proto` and `X-Forwarded-For` headers to their appropriate values. Additionally, your reverse proxy should allow for big enough uploads. By following these practices, you ensure that all custom reverse proxies are fully compatible with Immich.
|
||||||
|
|
||||||
:::note
|
|
||||||
The Repair page can take a long time to load. To avoid server timeouts or errors, we recommend specifying a timeout of at least 10 minutes on your proxy server.
|
|
||||||
:::
|
|
||||||
|
|
||||||
:::caution
|
:::caution
|
||||||
Immich does not support being served on a sub-path such as `location /immich {`. It has to be served on the root path of a (sub)domain.
|
Immich does not support being served on a sub-path such as `location /immich {`. It has to be served on the root path of a (sub)domain.
|
||||||
:::
|
:::
|
||||||
|
|||||||
@@ -94,19 +94,16 @@ Change media location
|
|||||||
|
|
||||||
```
|
```
|
||||||
immich-admin change-media-location
|
immich-admin change-media-location
|
||||||
? Enter the previous value of IMMICH_MEDIA_LOCATION: /usr/src/app/upload
|
? Enter the previous value of IMMICH_MEDIA_LOCATION: /data
|
||||||
? Enter the new value of IMMICH_MEDIA_LOCATION: /data
|
? Enter the new value of IMMICH_MEDIA_LOCATION: /my-data
|
||||||
|
...
|
||||||
|
Previous value: /data
|
||||||
|
Current value: /my-data
|
||||||
|
|
||||||
Previous value: /usr/src/app/upload
|
Changing database paths from "/data/*" to "/my-data/*"
|
||||||
Current value: /data
|
|
||||||
|
|
||||||
Changing database paths from "/usr/src/app/upload/*" to "/data/*"
|
|
||||||
|
|
||||||
? Do you want to proceed? [Y/n] y
|
? Do you want to proceed? [Y/n] y
|
||||||
|
|
||||||
Database file paths updated successfully! đ
|
Database file paths updated successfully! đ
|
||||||
|
...
|
||||||
You may now set IMMICH_MEDIA_LOCATION=/data and restart!
|
|
||||||
|
|
||||||
(please remember to update applicable volume mounts e.g. ${UPLOAD_LOCATION}:/data)
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ After making any changes in the `server/src/schema`, a database migration need t
|
|||||||
1. Run the command
|
1. Run the command
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run migrations:generate <migration-name>
|
pnpm run migrations:generate <migration-name>
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Check if the migration file makes sense.
|
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`):
|
1. **Runs post-create script** (`container-server-post-create.sh`):
|
||||||
- Adjusts file permissions for the `node` user
|
- Adjusts file permissions for the `node` user
|
||||||
- Installs dependencies: `npm install` in all packages
|
- Installs dependencies: `pnpm install` in all packages
|
||||||
- Builds TypeScript SDK: `npm run build` in `open-api/typescript-sdk`
|
- Builds TypeScript SDK: `pnpm run build` in `open-api/typescript-sdk`
|
||||||
|
|
||||||
2. **Starts development servers** via VS Code tasks:
|
2. **Starts development servers** via VS Code tasks:
|
||||||
- `Immich API Server (Nest)` - API server with hot-reloading on port 2283
|
- `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
|
- **Server code** (`/server`): Changes trigger automatic restart
|
||||||
- **Web code** (`/web`): Changes trigger hot module replacement
|
- **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`
|
- **API changes**: Regenerate TypeScript SDK with `make open-api`
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
@@ -273,19 +273,19 @@ make test-medium-dev # End-to-end tests
|
|||||||
```bash
|
```bash
|
||||||
# Server tests
|
# Server tests
|
||||||
cd /workspaces/immich/server
|
cd /workspaces/immich/server
|
||||||
npm test # Run all tests
|
pnpm test # Run all tests
|
||||||
npm run test:watch # Watch mode
|
pnpm run test:watch # Watch mode
|
||||||
npm run test:cov # Coverage report
|
pnpm run test:cov # Coverage report
|
||||||
|
|
||||||
# Web tests
|
# Web tests
|
||||||
cd /workspaces/immich/web
|
cd /workspaces/immich/web
|
||||||
npm test # Run all tests
|
pnpm test # Run all tests
|
||||||
npm run test:watch # Watch mode
|
pnpm run test:watch # Watch mode
|
||||||
|
|
||||||
# E2E tests
|
# E2E tests
|
||||||
cd /workspaces/immich/e2e
|
cd /workspaces/immich/e2e
|
||||||
npm run test # Run API tests
|
pnpm run test # Run API tests
|
||||||
npm run test:web # Run web UI tests
|
pnpm run test:web # Run web UI tests
|
||||||
```
|
```
|
||||||
|
|
||||||
### Code Quality Commands
|
### Code Quality Commands
|
||||||
|
|||||||
@@ -8,34 +8,47 @@ When contributing code through a pull request, please check the following:
|
|||||||
|
|
||||||
## Web Checks
|
## Web Checks
|
||||||
|
|
||||||
- [ ] `npm run lint` (linting via ESLint)
|
- [ ] `pnpm run lint` (linting via ESLint)
|
||||||
- [ ] `npm run format` (formatting via Prettier)
|
- [ ] `pnpm run format` (formatting via Prettier)
|
||||||
- [ ] `npm run check:svelte` (Type checking via SvelteKit)
|
- [ ] `pnpm run check:svelte` (Type checking via SvelteKit)
|
||||||
- [ ] `npm run check:typescript` (check typescript)
|
- [ ] `pnpm run check:typescript` (check typescript)
|
||||||
- [ ] `npm test` (unit tests)
|
- [ ] `pnpm test` (unit tests)
|
||||||
|
|
||||||
## Documentation
|
## 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.
|
- [ ] Update the `_redirects` file if you have renamed a page or removed it from the documentation.
|
||||||
|
|
||||||
:::tip AIO
|
:::tip AIO
|
||||||
Run all web checks with `npm run check:all`
|
Run all web checks with `pnpm run check:all`
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Server Checks
|
## Server Checks
|
||||||
|
|
||||||
- [ ] `npm run lint` (linting via ESLint)
|
- [ ] `pnpm run lint` (linting via ESLint)
|
||||||
- [ ] `npm run format` (formatting via Prettier)
|
- [ ] `pnpm run format` (formatting via Prettier)
|
||||||
- [ ] `npm run check` (Type checking via `tsc`)
|
- [ ] `pnpm run check` (Type checking via `tsc`)
|
||||||
- [ ] `npm test` (unit tests)
|
- [ ] `pnpm test` (unit tests)
|
||||||
|
|
||||||
:::tip AIO
|
:::tip AIO
|
||||||
Run all server checks with `npm run check:all`
|
Run all server checks with `pnpm run check:all`
|
||||||
:::
|
:::
|
||||||
|
|
||||||
:::info Auto Fix
|
:::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
|
||||||
|
|
||||||
|
The following commands must be executed from within the mobile app directory of the codebase.
|
||||||
|
|
||||||
|
- [ ] `make build` (auto-generate files using build_runner)
|
||||||
|
- [ ] `make analyze` (static analysis via Dart Analyzer and DCM)
|
||||||
|
- [ ] `make format` (formatting via Dart Formatter)
|
||||||
|
- [ ] `make test` (unit tests)
|
||||||
|
|
||||||
|
:::info Auto Fix
|
||||||
|
You can use `dart fix --apply` and `dcm fix lib` to potentially correct some issues automatically for `make analyze`.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## OpenAPI
|
## OpenAPI
|
||||||
|
|||||||
@@ -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:
|
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/`
|
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
|
4. Start the web development server
|
||||||
|
|
||||||
```bash
|
```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:
|
If you're using PowerShell on Windows you may need to set the env var separately like so:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
|
$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
|
||||||
npm run dev
|
pnpm run dev
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `@immich/ui`
|
#### `@immich/ui`
|
||||||
@@ -75,12 +75,12 @@ npm run dev
|
|||||||
To see local changes to `@immich/ui` in Immich, do the following:
|
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`
|
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`)
|
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')`)
|
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';`
|
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`
|
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
|
### Mobile app
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
### Unit tests
|
### Unit tests
|
||||||
|
|
||||||
Unit are run by calling `npm run test` from the `server/` directory.
|
Unit are run by calling `pnpm run test` from the `server/` directory.
|
||||||
You need to run `npm install` (in `server/`) before _once_.
|
You need to run `pnpm install` (in `server/`) before _once_.
|
||||||
|
|
||||||
### End to end tests
|
### End to end tests
|
||||||
|
|
||||||
@@ -17,14 +17,14 @@ make e2e
|
|||||||
|
|
||||||
Before you can run the tests, you need to run the following commands _once_:
|
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 `/`)
|
- `make open-api` (in the project root `/`)
|
||||||
|
|
||||||
Once the test environment is running, the e2e tests can be run via:
|
Once the test environment is running, the e2e tests can be run via:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd e2e/
|
cd e2e/
|
||||||
npm test
|
pnpm test
|
||||||
```
|
```
|
||||||
|
|
||||||
The tests check various things including:
|
The tests check various things including:
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Internally, Immich uses the [glob](https://www.npmjs.com/package/glob) package t
|
|||||||
|
|
||||||
This feature is considered experimental and for advanced users only. If enabled, it will allow automatic watching of the filesystem which means new assets are automatically imported to Immich without needing to rescan.
|
This feature is considered experimental and for advanced users only. If enabled, it will allow automatic watching of the filesystem which means new assets are automatically imported to Immich without needing to rescan.
|
||||||
|
|
||||||
If your photos are on a network drive, automatic file watching likely won't work. In that case, you will have to rely on a periodic library refresh to pull in your changes.
|
If your photos are on a network drive, automatic file watching likely won't work. In that case, you will have to rely on a [periodic library refresh](#set-custom-scan-interval) to pull in your changes.
|
||||||
|
|
||||||
#### Troubleshooting
|
#### Troubleshooting
|
||||||
|
|
||||||
@@ -72,7 +72,9 @@ In rare cases, the library watcher can hang, preventing Immich from starting up.
|
|||||||
|
|
||||||
### Nightly job
|
### Nightly job
|
||||||
|
|
||||||
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library management page.
|
There is an automatic scan job that is scheduled to run once a day. Its schedule is configurable, see [Set Custom Scan Interval](#set-custom-scan-interval).
|
||||||
|
|
||||||
|
This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library management page.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@@ -91,7 +93,7 @@ The `immich-server` container will need access to the gallery. Modify your docke
|
|||||||
```diff title="docker-compose.yml"
|
```diff title="docker-compose.yml"
|
||||||
immich-server:
|
immich-server:
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
|
+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
|
||||||
+ - /home/user/old-pics:/mnt/media/old-pics:ro
|
+ - /home/user/old-pics:/mnt/media/old-pics:ro
|
||||||
+ - /mnt/media/videos:/mnt/media/videos:ro
|
+ - /mnt/media/videos:/mnt/media/videos:ro
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ After defining the locations of these files, we will edit the `docker-compose.ym
|
|||||||
services:
|
services:
|
||||||
immich-server:
|
immich-server:
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
+ - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
|
+ - ${THUMB_LOCATION}:/data/thumbs
|
||||||
+ - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
|
+ - ${ENCODED_VIDEO_LOCATION}:/data/encoded-video
|
||||||
+ - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
|
+ - ${PROFILE_LOCATION}:/data/profile
|
||||||
+ - ${BACKUP_LOCATION}:/usr/src/app/upload/backups
|
+ - ${BACKUP_LOCATION}:/data/backups
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ docker compose up -d
|
|||||||
|
|
||||||
:::note
|
:::note
|
||||||
Because of the underlying properties of docker bind mounts, it is not recommended to mount the `upload/` and `library/` folders as separate bind mounts if they are on the same device.
|
Because of the underlying properties of docker bind mounts, it is not recommended to mount the `upload/` and `library/` folders as separate bind mounts if they are on the same device.
|
||||||
For this reason, we mount the HDD or the network storage (NAS) to `/usr/src/app/upload` and then mount the folders we want to access under that folder.
|
For this reason, we mount the HDD or the network storage (NAS) to `/data` and then mount the folders we want to access under that folder.
|
||||||
|
|
||||||
The `thumbs/` folder contains both the small thumbnails displayed in the timeline and the larger previews shown when clicking into an image. These cannot be separated.
|
The `thumbs/` folder contains both the small thumbnails displayed in the timeline and the larger previews shown when clicking into an image. These cannot be separated.
|
||||||
|
|
||||||
|
|||||||
@@ -12,118 +12,148 @@ Run `docker exec -it immich_postgres psql --dbname=<DB_DATABASE_NAME> --username
|
|||||||
|
|
||||||
## Assets
|
## Assets
|
||||||
|
|
||||||
|
### Name
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
The `"originalFileName"` column is the name of the file at time of upload, including the extension.
|
The `"originalFileName"` column is the name of the file at time of upload, including the extension.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
```sql title="Find by original filename"
|
```sql title="Find by original filename"
|
||||||
SELECT * FROM "assets" WHERE "originalFileName" = 'PXL_20230903_232542848.jpg';
|
SELECT * FROM "asset" WHERE "originalFileName" = 'PXL_20230903_232542848.jpg';
|
||||||
SELECT * FROM "assets" WHERE "originalFileName" LIKE 'PXL_%'; -- all files starting with PXL_
|
SELECT * FROM "asset" WHERE "originalFileName" LIKE 'PXL_%'; -- all files starting with PXL_
|
||||||
SELECT * FROM "assets" WHERE "originalFileName" LIKE '%_2023_%'; -- all files with _2023_ in the middle
|
SELECT * FROM "asset" WHERE "originalFileName" LIKE '%_2023_%'; -- all files with _2023_ in the middle
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Find by path"
|
```sql title="Find by path"
|
||||||
SELECT * FROM "assets" WHERE "originalPath" = 'upload/library/admin/2023/2023-09-03/PXL_2023.jpg';
|
SELECT * FROM "asset" WHERE "originalPath" = 'upload/library/admin/2023/2023-09-03/PXL_2023.jpg';
|
||||||
SELECT * FROM "assets" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
|
SELECT * FROM "asset" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### ID
|
||||||
|
|
||||||
```sql title="Find by ID"
|
```sql title="Find by ID"
|
||||||
SELECT * FROM "assets" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
|
SELECT * FROM "asset" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Find by partial ID"
|
```sql title="Find by partial ID"
|
||||||
SELECT * FROM "assets" WHERE "id"::text LIKE '%ab431d3a%';
|
SELECT * FROM "asset" WHERE "id"::text LIKE '%ab431d3a%';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Checksum
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
You can calculate the checksum for a particular file by using the command `sha1sum <filename>`.
|
You can calculate the checksum for a particular file by using the command `sha1sum <filename>`.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
```sql title="Find by checksum (SHA-1)"
|
```sql title="Find by checksum (SHA-1)"
|
||||||
SELECT encode("checksum", 'hex') FROM "assets";
|
SELECT encode("checksum", 'hex') FROM "asset";
|
||||||
SELECT * FROM "assets" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
|
SELECT * FROM "asset" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
|
||||||
SELECT * FROM "assets" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation
|
SELECT * FROM "asset" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Find duplicate assets with identical checksum (SHA-1) (excluding trashed files)"
|
```sql title="Find duplicate assets with identical checksum (SHA-1) (excluding trashed files)"
|
||||||
SELECT T1."checksum", array_agg(T2."id") ids FROM "assets" T1
|
SELECT T1."checksum", array_agg(T2."id") ids FROM "asset" T1
|
||||||
INNER JOIN "assets" T2 ON T1."checksum" = T2."checksum" AND T1."id" != T2."id" AND T2."deletedAt" IS NULL
|
INNER JOIN "asset" T2 ON T1."checksum" = T2."checksum" AND T1."id" != T2."id" AND T2."deletedAt" IS NULL
|
||||||
WHERE T1."deletedAt" IS NULL GROUP BY T1."checksum";
|
WHERE T1."deletedAt" IS NULL GROUP BY T1."checksum";
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Metadata
|
||||||
|
|
||||||
```sql title="Live photos"
|
```sql title="Live photos"
|
||||||
SELECT * FROM "assets" WHERE "livePhotoVideoId" IS NOT NULL;
|
SELECT * FROM "asset" WHERE "livePhotoVideoId" IS NOT NULL;
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="By description"
|
```sql title="By description"
|
||||||
SELECT "assets".*, "exif"."description" FROM "exif"
|
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
|
||||||
JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE TRIM("exif"."description") <> ''; -- all files with a description
|
WHERE TRIM("asset_exif"."description") <> ''; -- all files with a description
|
||||||
SELECT "assets".*, "exif"."description" FROM "exif"
|
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
|
||||||
JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE "exif"."description" ILIKE '%string to match%'; -- search by string
|
WHERE "asset_exif"."description" ILIKE '%string to match%'; -- search by string
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Without metadata"
|
```sql title="Without metadata"
|
||||||
SELECT "assets".* FROM "exif"
|
SELECT "asset".* FROM "asset_exif"
|
||||||
LEFT JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
LEFT JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE "exif"."assetId" IS NULL;
|
WHERE "asset_exif"."assetId" IS NULL;
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="size < 100,000 bytes, smallest to largest"
|
```sql title="size < 100,000 bytes, smallest to largest"
|
||||||
SELECT * FROM "assets"
|
SELECT * FROM "asset"
|
||||||
JOIN "exif" ON "assets"."id" = "exif"."assetId"
|
JOIN "asset_exif" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE "exif"."fileSizeInByte" < 100000
|
WHERE "asset_exif"."fileSizeInByte" < 100000
|
||||||
ORDER BY "exif"."fileSizeInByte" ASC;
|
ORDER BY "asset_exif"."fileSizeInByte" ASC;
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Without thumbnails"
|
### Type
|
||||||
SELECT * FROM "assets" WHERE "assets"."previewPath" IS NULL OR "assets"."thumbnailPath" IS NULL;
|
|
||||||
```
|
|
||||||
|
|
||||||
```sql title="By type"
|
```sql title="By type"
|
||||||
SELECT * FROM "assets" WHERE "assets"."type" = 'VIDEO';
|
SELECT * FROM "asset" WHERE "asset"."type" = 'VIDEO';
|
||||||
SELECT * FROM "assets" WHERE "assets"."type" = 'IMAGE';
|
SELECT * FROM "asset" WHERE "asset"."type" = 'IMAGE';
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Count by type"
|
```sql title="Count by type"
|
||||||
SELECT "assets"."type", COUNT(*) FROM "assets" GROUP BY "assets"."type";
|
SELECT "asset"."type", COUNT(*) FROM "asset" GROUP BY "asset"."type";
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Count by type (per user)"
|
```sql title="Count by type (per user)"
|
||||||
SELECT "users"."email", "assets"."type", COUNT(*) FROM "assets"
|
SELECT "user"."email", "asset"."type", COUNT(*) FROM "asset"
|
||||||
JOIN "users" ON "assets"."ownerId" = "users"."id"
|
JOIN "user" ON "asset"."ownerId" = "user"."id"
|
||||||
GROUP BY "assets"."type", "users"."email" ORDER BY "users"."email";
|
GROUP BY "asset"."type", "user"."email" ORDER BY "user"."email";
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Failed file movements"
|
## Tags
|
||||||
SELECT * FROM "move_history";
|
|
||||||
|
```sql title="Count by tag"
|
||||||
|
SELECT "t"."value" AS "tag_name", COUNT(*) AS "number_assets" FROM "tag" "t"
|
||||||
|
JOIN "tag_asset" "ta" ON "t"."id" = "ta"."tagsId" JOIN "asset" "a" ON "ta"."assetsId" = "a"."id"
|
||||||
|
WHERE "a"."visibility" != 'hidden'
|
||||||
|
GROUP BY "t"."value" ORDER BY "number_assets" DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql title="Count by tag (per user)"
|
||||||
|
SELECT "t"."value" AS "tag_name", "u"."email" as "user_email", COUNT(*) AS "number_assets" FROM "tag" "t"
|
||||||
|
JOIN "tag_asset" "ta" ON "t"."id" = "ta"."tagsId" JOIN "asset" "a" ON "ta"."assetsId" = "a"."id" JOIN "user" "u" ON "a"."ownerId" = "u"."id"
|
||||||
|
WHERE "a"."visibility" != 'hidden'
|
||||||
|
GROUP BY "t"."value", "u"."email" ORDER BY "number_assets" DESC;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Users
|
## Users
|
||||||
|
|
||||||
```sql title="List all users"
|
```sql title="List all users"
|
||||||
SELECT * FROM "users";
|
SELECT * FROM "user";
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Get owner info from asset ID"
|
```sql title="Get owner info from asset ID"
|
||||||
SELECT "users".* FROM "users" JOIN "assets" ON "users"."id" = "assets"."ownerId" WHERE "assets"."id" = 'fa310b01-2f26-4b7a-9042-d578226e021f';
|
SELECT "user".* FROM "user" JOIN "asset" ON "user"."id" = "asset"."ownerId" WHERE "asset"."id" = 'fa310b01-2f26-4b7a-9042-d578226e021f';
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Config
|
|
||||||
|
|
||||||
```sql title="Custom settings"
|
|
||||||
SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';
|
|
||||||
```
|
|
||||||
|
|
||||||
(Only used when not using the [config file](/docs/install/config-file))
|
|
||||||
|
|
||||||
## Persons
|
## Persons
|
||||||
|
|
||||||
```sql title="Delete person and unset it for the faces it was associated with"
|
```sql title="Delete person and unset it for the faces it was associated with"
|
||||||
DELETE FROM "person" WHERE "name" = 'PersonNameHere';
|
DELETE FROM "person" WHERE "name" = 'PersonNameHere';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## System
|
||||||
|
|
||||||
|
### Config
|
||||||
|
|
||||||
|
```sql title="Custom settings"
|
||||||
|
SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';
|
||||||
|
```
|
||||||
|
|
||||||
|
(Only used when not using the [config file](/docs/install/config-file))
|
||||||
|
|
||||||
|
### File properties
|
||||||
|
|
||||||
|
```sql title="Without thumbnails"
|
||||||
|
SELECT * FROM "asset" WHERE "asset"."previewPath" IS NULL OR "asset"."thumbnailPath" IS NULL;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql title="Failed file movements"
|
||||||
|
SELECT * FROM "move_history";
|
||||||
|
```
|
||||||
|
|
||||||
## Postgres internal
|
## Postgres internal
|
||||||
|
|
||||||
```sql title="Change DB_PASSWORD"
|
```sql title="Change DB_PASSWORD"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ If you want Immich to be able to delete the images in the external library or ad
|
|||||||
```diff
|
```diff
|
||||||
immich-server:
|
immich-server:
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
+ - /home/user/photos1:/home/user/photos1:ro
|
+ - /home/user/photos1:/home/user/photos1:ro
|
||||||
+ - /mnt/photos2:/mnt/photos2:ro # you can delete this line if you only have one mount point, or you can add more lines if you have more than two
|
+ - /mnt/photos2:/mnt/photos2:ro # you can delete this line if you only have one mount point, or you can add more lines if you have more than two
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
|
|||||||
| `TZ` | Timezone | <sup>\*1</sup> | server | microservices |
|
| `TZ` | Timezone | <sup>\*1</sup> | server | microservices |
|
||||||
| `IMMICH_ENV` | Environment (production, development) | `production` | server, machine learning | api, microservices |
|
| `IMMICH_ENV` | Environment (production, development) | `production` | server, machine learning | api, microservices |
|
||||||
| `IMMICH_LOG_LEVEL` | Log level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
|
| `IMMICH_LOG_LEVEL` | Log level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
|
||||||
| `IMMICH_MEDIA_LOCATION` | Media location inside the container â ī¸**You probably shouldn't set this**<sup>\*2</sup>â ī¸ | `/usr/src/app/upload` | server | api, microservices |
|
| `IMMICH_MEDIA_LOCATION` | Media location inside the container â ī¸**You probably shouldn't set this**<sup>\*2</sup>â ī¸ | `/data` | server | api, microservices |
|
||||||
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
|
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
|
||||||
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
|
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
|
||||||
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
|
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
|
||||||
@@ -199,12 +199,11 @@ Additional machine learning parameters can be tuned from the admin UI.
|
|||||||
| `IMMICH_TELEMETRY_INCLUDE` | Collect these telemetries. List of `host`, `api`, `io`, `repo`, `job`. Note: You can also specify `all` to enable all | | server | api, microservices |
|
| `IMMICH_TELEMETRY_INCLUDE` | Collect these telemetries. List of `host`, `api`, `io`, `repo`, `job`. Note: You can also specify `all` to enable all | | server | api, microservices |
|
||||||
| `IMMICH_TELEMETRY_EXCLUDE` | Do not collect these telemetries. List of `host`, `api`, `io`, `repo`, `job` | | server | api, microservices |
|
| `IMMICH_TELEMETRY_EXCLUDE` | Do not collect these telemetries. List of `host`, `api`, `io`, `repo`, `job` | | server | api, microservices |
|
||||||
|
|
||||||
## Docker Secrets
|
## Secrets
|
||||||
|
|
||||||
The following variables support the use of [Docker secrets][docker-secrets] for additional security.
|
The following variables support reading from files, either via [Systemd Credentials][systemd-creds] or [Docker secrets][docker-secrets] for additional security.
|
||||||
|
|
||||||
To use any of these, replace the regular environment variable with the equivalent `_FILE` environment variable. The value of
|
To use any of these, either set `CREDENTIALS_DIRECTORY` to a directory that contains files whose name is the âregular variableâ name, and whose content is the secret. If using Docker Secrets, setting `CREDENTIALS_DIRECTORY=/run/secrets` will cause all secrets present to be used. Alternatively, replace the regular variable with the equivalent `_FILE` environment variable as below. The value of the `_FILE` variable should be set to the path of a file containing the variable value.
|
||||||
the `_FILE` variable should be set to the path of a file containing the variable value.
|
|
||||||
|
|
||||||
| Regular Variable | Equivalent Docker Secrets '\_FILE' Variable |
|
| Regular Variable | Equivalent Docker Secrets '\_FILE' Variable |
|
||||||
| :----------------- | :------------------------------------------ |
|
| :----------------- | :------------------------------------------ |
|
||||||
@@ -226,3 +225,4 @@ to use a Docker secret for the password in the Redis container.
|
|||||||
[docker-secrets-docs]: https://github.com/docker-library/docs/tree/master/postgres#docker-secrets
|
[docker-secrets-docs]: https://github.com/docker-library/docs/tree/master/postgres#docker-secrets
|
||||||
[docker-secrets]: https://docs.docker.com/engine/swarm/secrets/
|
[docker-secrets]: https://docs.docker.com/engine/swarm/secrets/
|
||||||
[ioredis]: https://ioredis.readthedocs.io/en/latest/README/#connect-to-redis
|
[ioredis]: https://ioredis.readthedocs.io/en/latest/README/#connect-to-redis
|
||||||
|
[systemd-creds]: https://systemd.io/CREDENTIALS/
|
||||||
|
|||||||
BIN
docs/docs/install/img/truenas/truenas00.webp
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
BIN
docs/docs/install/img/truenas/truenas04.webp
Normal file
|
After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
docs/docs/install/img/truenas/truenas06.webp
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
docs/docs/install/img/truenas/truenas07.webp
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
docs/docs/install/img/truenas/truenas08.webp
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
docs/docs/install/img/truenas/truenas09.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/docs/install/img/truenas/truenas10.webp
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
@@ -2,6 +2,9 @@
|
|||||||
sidebar_position: 80
|
sidebar_position: 80
|
||||||
---
|
---
|
||||||
|
|
||||||
|
import Tabs from '@theme/Tabs';
|
||||||
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
# TrueNAS [Community]
|
# TrueNAS [Community]
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
@@ -9,211 +12,324 @@ This is a community contribution and not officially supported by the Immich team
|
|||||||
|
|
||||||
Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/).
|
Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/).
|
||||||
|
|
||||||
**Please report app issues to the corresponding [Github Repository](https://github.com/truenas/apps/tree/master/trains/community/immich).**
|
**Please report app issues to the corresponding [GitHub Repository](https://github.com/truenas/apps/tree/master/trains/community/immich).**
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
This guide covers the installation of Immich on TrueNAS Community Edition 24.10.2.2 (Electric Eel) and later.
|
||||||
|
|
||||||
|
We recommend keeping TrueNAS Community Edition and Immich relatively up to date with the latest versions to avoid any issues.
|
||||||
|
|
||||||
|
If you are using an older version of TrueNAS, we ask that you upgrade to the latest version before installing Immich. Check the [TrueNAS Community Edition Release Notes](https://www.truenas.com/docs/softwarereleases/) for more information on breaking changes, new features, and how to upgrade your system.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
Immich can easily be installed on TrueNAS Community Edition via the **Community** train application.
|
Immich can easily be installed on TrueNAS Community Edition via the **Community** train application.
|
||||||
Consider reviewing the TrueNAS [Apps resources](https://apps.truenas.com/getting-started/) if you have not previously configured applications on your system.
|
Consider reviewing the TrueNAS [Apps resources](https://apps.truenas.com/getting-started/) if you have not previously configured applications on your system.
|
||||||
|
|
||||||
TrueNAS Community Edition makes installing and updating Immich easy, but you must use the Immich web portal and mobile app to configure accounts and access libraries.
|
|
||||||
|
|
||||||
## First Steps
|
## First Steps
|
||||||
|
|
||||||
The Immich app in TrueNAS Community Edition installs, completes the initial configuration, then starts the Immich web portal.
|
|
||||||
When updates become available, TrueNAS alerts and provides easy updates.
|
|
||||||
|
|
||||||
Before installing the Immich app in TrueNAS, review the [Environment Variables](#environment-variables) documentation to see if you want to configure any during installation.
|
|
||||||
You may also configure environment variables at any time after deploying the application.
|
|
||||||
|
|
||||||
### Setting up Storage Datasets
|
### Setting up Storage Datasets
|
||||||
|
|
||||||
Before beginning app installation, [create the datasets](https://www.truenas.com/docs/scale/scaletutorials/storage/datasets/datasetsscale/) to use in the **Storage Configuration** section during installation.
|
Before beginning app installation, [create the datasets](https://www.truenas.com/docs/scale/scaletutorials/storage/datasets/datasetsscale/) to use in the **Storage Configuration** section during installation.
|
||||||
Immich requires seven datasets: `library`, `upload`, `thumbs`, `profile`, `video`, `backups`, and `pgData`.
|
|
||||||
You can organize these as one parent with seven child datasets, for example `/mnt/tank/immich/library`, `/mnt/tank/immich/upload`, and so on.
|
In TrueNAS, Immich requires 2 datasets for the application to function correctly: `data` and `pgData`. You can set the datasets to any names to match your naming conventions or preferences.
|
||||||
|
You can organize these as one parent with two child datasets, for example `/mnt/tank/immich/data` and `/mnt/tank/immich/pgData`.
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas12.webp').default}
|
src={require('./img/truenas/truenas00.webp').default}
|
||||||
width="30%"
|
width="40%"
|
||||||
alt="Immich App Widget"
|
alt="Immich App Widget"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
:::info Permissions
|
:::info Datasets Permissions
|
||||||
The **pgData** dataset must be owned by the user `netdata` (UID 999) for postgres to start. The other datasets must be owned by the user `root` (UID 0) or a group that includes the user `root` (UID 0) for immich to have the necessary permissions.
|
|
||||||
|
|
||||||
If the **library** dataset uses ACL it must have [ACL mode](https://www.truenas.com/docs/core/coretutorials/storage/pools/permissions/#access-control-lists) set to `Passthrough` if you plan on using a [storage template](/docs/administration/storage-template.mdx) and the dataset is configured for network sharing (its ACL type is set to `SMB/NFSv4`). When the template is applied and files need to be moved from **upload** to **library**, Immich performs `chmod` internally and needs to be allowed to execute the command. [More info.](https://github.com/immich-app/immich/pull/13017)
|
The **pgData** dataset must be owned by the user `netdata` (UID 999) for Postgres to start.
|
||||||
|
|
||||||
|
The `data` dataset must have given the **_modify_** permission to the user who will run Immich.
|
||||||
|
|
||||||
|
Since TrueNAS Community Edition 24.10.2.2 and later, Immich can be run as any user and group, the default user being `apps` (UID 568) and the default group being `apps` (GID 568). This user, either `apps` or another user you choose, must have **_modify_** permissions on the **data** dataset.
|
||||||
|
|
||||||
|
For an easy setup:
|
||||||
|
|
||||||
|
- Create the parent dataset `immich` keeping the default **Generic** preset.
|
||||||
|
- Select `Dataset Preset` **Apps** instead of **Generic** when creating the `data` dataset. This will automatically give the correct permissions to the dataset. If you want to use another user for Immich, you can keep the **Generic** preset, but you will need to give the **_modify_** permission to that other user.
|
||||||
|
- For the `pgData` dataset, you can keep the default preset **Generic** as permissions can be set during the installation of the Immich app (See [Storage Configuration](#storage-configuration) section).
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
To improve performance, Immich recommends using SSDs for the database. If you have a pool made of SSDs, you can create the `pgData` dataset on that pool.
|
||||||
|
|
||||||
|
Thumbnails can also be stored on the SSDs for faster access. This is an advanced option and not required for Immich to run. More information on how you can use multiple datasets to manage Immich storage in a finer-grained manner can be found in the [Advanced: Multiple Datasets for Immich Storage](#advanced-multiple-datasets-for-immich-storage) section below.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
If you just created the datasets using the **Apps** preset, you can skip this warning section.
|
||||||
|
|
||||||
|
If the **data** dataset uses ACL it must have [ACL mode](https://www.truenas.com/docs/scale/scaletutorials/datasets/permissionsscale/) set to `Passthrough` if you plan on using a [storage template](/docs/administration/storage-template.mdx) and the dataset is configured for network sharing (its ACL type is set to `SMB/NFSv4`). When the template is applied and files need to be moved from **upload** to **library** (internal folder created by Immich within the **data** dataset), Immich performs `chmod` internally and must be allowed to execute the command. [More info.](https://github.com/immich-app/immich/pull/13017)
|
||||||
|
|
||||||
|
To change or verify the ACL mode, go to the **Datasets** screen, select the **library** dataset, click on the **Edit** button next to **Dataset Details**, then click on the **Advanced Options** tab, scroll down to the **ACL Mode** section, and select `Passthrough` from the dropdown menu. Click **Save** to apply the changes. If the option is greyed out, set the **ACL Type** to `SMB/NFSv4` first, then you can change the **ACL Mode** to `Passthrough`.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Installing the Immich Application
|
## Installing the Immich Application
|
||||||
|
|
||||||
To install the **Immich** application, go to **Apps**, click **Discover Apps**, either begin typing Immich into the search field or scroll down to locate the **Immich** application widget.
|
To install the **Immich** application, go to **Apps**, click **Discover Apps**, and either begin typing Immich into the search field or scroll down to locate the **Immich** application widget.
|
||||||
|
|
||||||
|
<div style={{ marginBottom: '2rem', border: '1px solid #ccc', padding: '1rem', borderRadius: '8px' }}>
|
||||||
|
|
||||||
|
Click on the widget to open the **Immich** application details screen.
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas01.webp').default}
|
src={require('./img/truenas/truenas01.webp').default}
|
||||||
width="50%"
|
width="50%"
|
||||||
alt="Immich App Widget"
|
alt="Immich App Widget"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Click on the widget to open the **Immich** application details screen.
|
</div>
|
||||||
|
|
||||||
<br/><br/>
|
<div style={{ marginBottom: '2rem', border: '1px solid #ccc', padding: '1rem', borderRadius: '8px' }}>
|
||||||
|
|
||||||
|
Click **Install** to open the Immich application configuration screen.
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas02.webp').default}
|
src={require('./img/truenas/truenas02.webp').default}
|
||||||
width="100%"
|
width="100%"
|
||||||
alt="Immich App Details Screen"
|
alt="Immich App Details Screen"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Click **Install** to open the Immich application configuration screen.
|
</div>
|
||||||
|
|
||||||
<br/><br/>
|
|
||||||
|
|
||||||
Application configuration settings are presented in several sections, each explained below.
|
Application configuration settings are presented in several sections, each explained below.
|
||||||
To find specific fields click in the **Search Input Fields** search field, scroll down to a particular section or click on the section heading on the navigation area in the upper-right corner.
|
To find specific fields, click in the **Search Input Fields** search field, scroll down to a particular section, or click on the section heading on the navigation area in the upper-right corner.
|
||||||
|
|
||||||
### Application Name and Version
|
### Application Name and Version
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas03.webp').default}
|
src={require('./img/truenas/truenas03.webp').default}
|
||||||
width="100%"
|
width="100%"
|
||||||
alt="Install Immich Screen"
|
alt="Install Immich Screen"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl mb-4"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default value or enter a name in **Application Name** field.
|
Keep the default value or enter a name in the **Application Name** field.
|
||||||
In most cases use the default name, but if adding a second deployment of the application you must change this name.
|
Change it if youâre deploying a second instance.
|
||||||
|
|
||||||
Accept the default version number in **Version**.
|
Immich version within TrueNAS catalog (Different from Immich release version).
|
||||||
When a new version becomes available, the application has an update badge.
|
|
||||||
The **Installed Applications** screen shows the option to update applications.
|
|
||||||
|
|
||||||
### Immich Configuration
|
### Immich Configuration
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas05.webp').default}
|
src={require('./img/truenas/truenas04.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Configuration Settings"
|
alt="Configuration Settings"
|
||||||
|
className="border rounded-xl mb-4"
|
||||||
|
/>
|
||||||
|
|
||||||
|
The **Timezone** is set to the system default, which usually matches your local timezone. You can change it to another timezone if you prefer.
|
||||||
|
|
||||||
|
**Enable Machine Learning** is enabled by default. It allows Immich to use machine learning features such as face recognition, image search, and smart duplicate detection. Untick this option if you do not want to use these features.
|
||||||
|
|
||||||
|
Select the **Machine Learning Image Type** based on the hardware you have. More details here: [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md)
|
||||||
|
|
||||||
|
**Database Password** should be set to a custom value using only the characters `A-Za-z0-9`. This password is used to secure the Postgres database.
|
||||||
|
|
||||||
|
**Redis Password** should be set to a custom value using only the characters `A-Za-z0-9`. Preferably, use a different password from the database password.
|
||||||
|
|
||||||
|
Keep the **Log Level** to the default `Log` value.
|
||||||
|
|
||||||
|
Leave **Hugging Face Endpoint** blank. (This is used to download ML models from a different source.)
|
||||||
|
|
||||||
|
Set **Database Storage Type** to the type of storage (**HDD** or **SSD**) that the pool where the **pgData** dataset is located uses.
|
||||||
|
|
||||||
|
**Additional Environment Variables** can be left blank.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Advanced users: Adding Environment Variables</summary>
|
||||||
|
|
||||||
|
Environment variables can be set by clicking the **Add** button and filling in the **Name** and **Value** fields.
|
||||||
|
|
||||||
|
<img
|
||||||
|
src={require('./img/truenas/truenas05.webp').default}
|
||||||
|
width="40%"
|
||||||
|
alt="Environment Variables"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default value in **Timezone** or change to match your local timezone.
|
These are used to add custom configuration options or to enable specific features.
|
||||||
**Timezone** is only used by the Immich `exiftool` microservice if it cannot be determined from the image metadata.
|
More information on available environment variables can be found in the **[environment variables documentation](/docs/install/environment-variables/)**.
|
||||||
|
|
||||||
Untick **Enable Machine Learning** if you will not use face recognition, image search, and smart duplicate detection.
|
:::info
|
||||||
|
Some environment variables are not available for the TrueNAS Community Edition app as they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings).
|
||||||
|
|
||||||
Accept the default option or select the **Machine Learning Image Type** for your hardware based on the [Hardware-Accelerated Machine Learning Supported Backends](/docs/features/ml-hardware-acceleration.md#supported-backends).
|
Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`, `IMMICH_LOG_LEVEL`, `DB_PASSWORD`, `REDIS_PASSWORD`.
|
||||||
|
:::
|
||||||
|
|
||||||
Immich's default is `postgres` but you should consider setting the **Database Password** to a custom value using only the characters `A-Za-z0-9`.
|
</details>
|
||||||
|
|
||||||
The **Redis Password** should be set to a custom value using only the characters `A-Za-z0-9`.
|
### User and Group Configuration
|
||||||
|
|
||||||
Accept the **Log Level** default of **Log**.
|
Application in TrueNAS runs as a specific user and group. Immich uses the default user `apps` (UID 568) and the default group `apps` (GID 568).
|
||||||
|
|
||||||
Leave **Hugging Face Endpoint** blank. (This is for downloading ML models from a different source.)
|
<img
|
||||||
|
src={require('./img/truenas/truenas06.webp').default}
|
||||||
|
width="40%"
|
||||||
|
alt="User and Group Configuration"
|
||||||
|
className="border rounded-xl"
|
||||||
|
/>
|
||||||
|
|
||||||
Leave **Additional Environment Variables** blank or see [Environment Variables](#environment-variables) to set before installing.
|
- **User ID**: Keep the default value `apps` (UID 568) or define a different one if needed.
|
||||||
|
|
||||||
|
- **Group ID**: Keep the default value `apps` (GID 568) or define a different one if needed.
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
If you change the user or group, make sure that the datasets you created for Immich data storage have the correct permissions set for that user and group as specified in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above.
|
||||||
|
:::
|
||||||
|
|
||||||
### Network Configuration
|
### Network Configuration
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas06.webp').default}
|
src={require('./img/truenas/truenas07.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Networking Settings"
|
alt="Networking Settings"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default port `30041` in **WebUI Port** or enter a custom port number.
|
- **Port Bind Mode**: This lets you expose the port to the host system, allowing you to access Immich from outside the TrueNAS system. Keep the default **_Publish port on the host for external access_** value unless you have a specific reason to change it.
|
||||||
:::info Allowed Port Numbers
|
|
||||||
Only numbers within the range 9000-65535 may be used on TrueNAS versions below TrueNAS Community Edition 24.10 Electric Eel.
|
|
||||||
|
|
||||||
Regardless of version, to avoid port conflicts, don't use [ports on this list](https://www.truenas.com/docs/solutions/optimizations/security/#truenas-default-ports).
|
- **Port Number**: Keep the default port `30041` or enter a custom port number.
|
||||||
:::
|
|
||||||
|
- **Host IPs**: Leave the default blank value.
|
||||||
|
|
||||||
### Storage Configuration
|
### Storage Configuration
|
||||||
|
|
||||||
Immich requires seven storage datasets.
|
:::danger Default Settings (Not recommended)
|
||||||
|
The default setting for datasets is **ixVolume (dataset created automatically by the system)**. This is not recommended as this results in your data being harder to access manually and can result in data loss if you delete the immich app. It is also harder to manage snapshots and replication tasks. It is recommended to use the **Host Path (Path that already exists on the system)** option instead.
|
||||||
<img
|
|
||||||
src={require('./img/truenas07.webp').default}
|
|
||||||
width="20%"
|
|
||||||
alt="Configure Storage ixVolumes"
|
|
||||||
className="border rounded-xl"
|
|
||||||
/>
|
|
||||||
|
|
||||||
:::note Default Setting (Not recommended)
|
|
||||||
The default setting for datasets is **ixVolume (dataset created automatically by the system)** but this results in your data being harder to access manually and can result in data loss if you delete the immich app. (Not recommended)
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
For each Storage option select **Host Path (Path that already exists on the system)** and then select the matching dataset [created before installing the app](#setting-up-storage-datasets): **Immich Library Storage**: `library`, **Immich Uploads Storage**: `upload`, **Immich Thumbs Storage**: `thumbs`, **Immich Profile Storage**: `profile`, **Immich Video Storage**: `video`, **Immich Backups Storage**: `backups`, **Postgres Data Storage**: `pgData`.
|
The storage configuration section allows you to set up the storage locations for Immich data. You can select the datasets created in the previous step.
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas08.webp').default}
|
src={require('./img/truenas/truenas08.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Configure Storage Host Paths"
|
alt="Configure Storage Volumes"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
The image above has example values.
|
|
||||||
|
|
||||||
<br/>
|
For the Data Storage, select **Host Path (Path that already exists on the system)** and then select the dataset you created for Immich data storage, for example, `data`.
|
||||||
|
|
||||||
### Additional Storage [(External Libraries)](/docs/features/libraries)
|
The Machine Learning cache can be left with default _Temporary_
|
||||||
|
|
||||||
|
For the Postgres Data Storage, select **Host Path (Path that already exists on the system)** and then select the dataset you created for Postgres data storage, for example, `pgData`.
|
||||||
|
|
||||||
|
:::info
|
||||||
|
**Postgres Data Storage**
|
||||||
|
Once **Host Path** is selected, a checkbox appears with **_Automatic Permissions_**. If you have not set the ownership of the **pgData** dataset to `netdata` (UID 999), tick this box as it will set the user ownership to `netdata` (UID 999) and the group ownership to `docker` (GID 999) automatically. If you have set the ownership of the **pgData** dataset to `netdata` (UID 999), you can leave this box unticked.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Additional Storage (Advanced Users)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>External Libraries</summary>
|
||||||
|
|
||||||
:::danger Advanced Users Only
|
:::danger Advanced Users Only
|
||||||
This feature should only be used by advanced users. If this is your first time installing Immich, then DO NOT mount an external library until you have a working setup. Also, your mount path MUST be something unique and should NOT be your library or upload location or a Linux directory like `/lib`. The picture below shows a valid example.
|
This feature should only be used by advanced users. If this is your first time installing Immich, then DO NOT mount an external library until you have a working setup.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas10.webp').default}
|
src={require('./img/truenas/truenas09.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Configure Storage Host Paths"
|
alt="Add External Libraries with Additional Storage"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
You may configure [External Libraries](/docs/features/libraries) by mounting them using **Additional Storage**.
|
You may configure [external libraries](/docs/features/libraries) by mounting them using **Additional Storage**.
|
||||||
The **Mount Path** is the location you will need to copy and paste into the External Library settings within Immich.
|
|
||||||
The **Host Path** is the location on the TrueNAS Community Edition server where your external library is located.
|
|
||||||
|
|
||||||
<!-- A section for Labels would go here but I don't know what they do. -->
|
The dataset that contains your external library files must at least give **read** access to the user running Immich (Default: `apps` (UID 568), `apps` (GID 568)).
|
||||||
|
If you want to be able to delete files or edit metadata in the external library using Immich, you will need to give the **modify** permission to the user running Immich.
|
||||||
|
|
||||||
|
- **Mount Path** is the location you will need to copy and paste into the external library settings within Immich.
|
||||||
|
- **Host Path** is the location on the TrueNAS Community Edition server where your external library is located.
|
||||||
|
- **Read Only** is a checkbox that you can tick if you want to prevent Immich from modifying the files in the external library. This is useful if you want to use Immich to view and search your external library without modifying it.
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Each mount path MUST be something unique and should NOT be your library or upload location or a Linux directory like `/lib`.
|
||||||
|
|
||||||
|
A general recommendation is to mount any external libraries to a path beginning with `/mnt` or `/media` followed by a unique name, such as `/mnt/external-libraries` or `/media/my-external-libraries`. If you plan to mount multiple external libraries, you can use paths like `/mnt/external-libraries/library1`, `/mnt/external-libraries/library2`, etc.
|
||||||
|
:::
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Multiple Datasets for Immich Storage</summary>
|
||||||
|
|
||||||
|
:::danger Advanced Users Only
|
||||||
|
This feature should only be used by advanced users.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Immich can use multiple datasets for its storage, allowing you to manage your data more granularly, similar to the old storage configuration. This is useful if you want to separate your data into different datasets for performance or organizational reasons. There is a general guide for this [here](/docs/guides/custom-locations), but read on for the TrueNAS guide.
|
||||||
|
|
||||||
|
Each additional dataset has to give the permission **_modify_** to the user who will run Immich (Default: `apps` (UID 568), `apps` (GID 568))
|
||||||
|
As described in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above, you have to create the datasets with the **Apps** preset to ensure the correct permissions are set, or you can set the permissions manually after creating the datasets.
|
||||||
|
|
||||||
|
Immich uses 6 folders for its storage: `library`, `upload`, `thumbs`, `profile`, `encoded-video`, and `backups`. You can create a dataset for each of these folders or only for some of them.
|
||||||
|
|
||||||
|
To mount these datasets:
|
||||||
|
|
||||||
|
1. Add an **Additional Storage** entry for each dataset you want to use.
|
||||||
|
2. Select **Type** as **Host Path (Path that already exists on the system)**.
|
||||||
|
3. Enter the **Mount Path** with `/data/<folder-name>`. The `<folder-name>` is the name of the folder you want to mount, for example, `library`, `upload`, `thumbs`, `profile`, `encoded-video`, or `backups`.
|
||||||
|
:::danger Important
|
||||||
|
You have to write the full path, including `/data/`, as Immich expects the data to be in that location.
|
||||||
|
If you do not include this path, Immich will not be able to find the data and will not write the data to the location you specified.
|
||||||
|
:::
|
||||||
|
4. Select the **Host Path** as the dataset you created for that folder, for example, `/mnt/tank/immich/library`, `/mnt/tank/immich/upload`, etc.
|
||||||
|
|
||||||
|
<img
|
||||||
|
src={require('./img/truenas/truenas10.webp').default}
|
||||||
|
width="40%"
|
||||||
|
alt="Use Multiple Datasets for Immich Storage with Additional Storage"
|
||||||
|
className="border rounded-xl"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<!-- A section for Labels could be added, but I don't think it is needed as they are of no use for Immich. -->
|
||||||
|
|
||||||
### Resources Configuration
|
### Resources Configuration
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas09.webp').default}
|
src={require('./img/truenas/truenas11.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Resource Limits"
|
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default **CPU** limit of `2` threads or specify the number of threads (CPUs with Multi-/Hyper-threading have 2 threads per core).
|
- **CPU**: Depending on your system resources, you can keep the default value of `2` threads or specify a different number. Immich recommends at least `8` threads.
|
||||||
|
|
||||||
Specify the **Memory** limit in MB of RAM. Immich recommends at least 6000 MB (6GB). If you selected **Enable Machine Learning** in **Immich Configuration**, you should probably set this above 8000 MB.
|
- **Memory**: Limit in MB of RAM. Immich recommends at least 6000 MB (6GB). If you selected **Enable Machine Learning** in **Immich Configuration**, you should probably set this above 8000 MB.
|
||||||
|
|
||||||
:::info Older TrueNAS Versions
|
Both **CPU** and **Memory** are limits, not reservations. This means that Immich can use up to the specified amount of CPU threads and RAM, but it will not reserve that amount of resources at all times. The system will allocate resources as needed, and Immich will use less than the specified amount most of the time.
|
||||||
Before TrueNAS Community Edition version 24.10 Electric Eel:
|
|
||||||
|
|
||||||
The **CPU** value was specified in a different format with a default of `4000m` which is 4 threads.
|
- Enable **GPU Configuration** options if you have a GPU or CPU with integrated graphics that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md).
|
||||||
|
|
||||||
The **Memory** value was specified in a different format with a default of `8Gi` which is 8 GiB of RAM. The value was specified in bytes or a number with a measurement suffix. Examples: `129M`, `123Mi`, `1000000000`
|
The process for NVIDIA GPU passthrough requires additional steps.
|
||||||
:::
|
More details here: [GPU Passthrough Docs for TrueNAS Apps](https://apps.truenas.com/managing-apps/installing-apps/#gpu-passthrough)
|
||||||
|
|
||||||
Enable **GPU Configuration** options if you have a GPU that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md). More info: [GPU Passthrough Docs for TrueNAS Apps](https://apps.truenas.com/managing-apps/installing-apps/#gpu-passthrough)
|
|
||||||
|
|
||||||
### Install
|
### Install
|
||||||
|
|
||||||
Finally, click **Install**.
|
Finally, click **Install**.
|
||||||
The system opens the **Installed Applications** screen with the Immich app in the **Deploying** state.
|
The system opens the **Installed Applications** screen with the Immich app in the **Deploying** state.
|
||||||
When the installation completes it changes to **Running**.
|
When the installation completes, it changes to **Running**.
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas04.webp').default}
|
src={require('./img/truenas/truenas12.webp').default}
|
||||||
width="100%"
|
width="100%"
|
||||||
alt="Immich Installed"
|
alt="Immich Installed"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Click **Web Portal** on the **Application Info** widget to open the Immich web interface to set up your account and begin uploading photos.
|
Click **Web Portal** on the **Application Info** widget, or go to the URL `http://<your-truenas-ip>:30041` in your web browser to open the Immich web interface. This will show you the onboarding process to set up your first user account, which will be an administrator account.
|
||||||
|
|
||||||
|
After that, you can start using Immich to upload and manage your photos and videos.
|
||||||
|
|
||||||
:::tip
|
:::tip
|
||||||
For more information on how to use the application once installed, please refer to the [Post Install](/docs/install/post-install.mdx) guide.
|
For more information on how to use the application once installed, please refer to the [Post Install](/docs/install/post-install.mdx) guide.
|
||||||
@@ -228,23 +344,6 @@ For more information on how to use the application once installed, please refer
|
|||||||
- Click **Update** at the very bottom of the page to save changes.
|
- Click **Update** at the very bottom of the page to save changes.
|
||||||
- TrueNAS automatically updates, recreates, and redeploys the Immich container with the updated settings.
|
- TrueNAS automatically updates, recreates, and redeploys the Immich container with the updated settings.
|
||||||
|
|
||||||
## Environment Variables
|
|
||||||
|
|
||||||
You can set [Environment Variables](/docs/install/environment-variables) by clicking **Add** on the **Additional Environment Variables** option and filling in the **Name** and **Value**.
|
|
||||||
|
|
||||||
<img
|
|
||||||
src={require('./img/truenas11.webp').default}
|
|
||||||
width="40%"
|
|
||||||
alt="Environment Variables"
|
|
||||||
className="border rounded-xl"
|
|
||||||
/>
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Some Environment Variables are not available for the TrueNAS Community Edition app. This is mainly because they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings).
|
|
||||||
|
|
||||||
Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`, `IMMICH_LOG_LEVEL`, `DB_PASSWORD`, `REDIS_PASSWORD`.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Updating the App
|
## Updating the App
|
||||||
|
|
||||||
:::danger
|
:::danger
|
||||||
@@ -261,3 +360,116 @@ To update the app to the latest version:
|
|||||||
- You may view the Changelog.
|
- You may view the Changelog.
|
||||||
- Click **Upgrade** to begin the process and open a counter dialog that shows the upgrade progress.
|
- Click **Upgrade** to begin the process and open a counter dialog that shows the upgrade progress.
|
||||||
- When complete, the update badge and buttons disappear and the application Update state on the Installed screen changes from Update Available to Up to date.
|
- When complete, the update badge and buttons disappear and the application Update state on the Installed screen changes from Update Available to Up to date.
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
:::danger
|
||||||
|
Perform a backup of your Immich data before proceeding with the migration steps below. This is crucial to prevent any data loss if something goes wrong during the migration process.
|
||||||
|
|
||||||
|
The migration should also be performed when the Immich app is not running to ensure no data is being written while you are copying the data.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Migration from Old Storage Configuration
|
||||||
|
|
||||||
|
There are two ways to migrate from the old storage configuration to the new one, depending on whether you want to keep the old multiple datasets or if you want to move to a double dataset configuration with a single dataset for Immich data storage and a single dataset for Postgres data storage.
|
||||||
|
|
||||||
|
:::note Old TrueNAS Versions Permissions
|
||||||
|
If you were using an older version of TrueNAS (before 24.10.2.2), the datasets, except the one for **pgData** had only to be owned by the `root` user (UID 0). You might have to add the **modify** permission to the `apps` user (UID 568) or the user you want to run Immich as, to all of them, except **pgData**. The steps to add or change ACL permissions are described in the [TrueNAS documentation](https://www.truenas.com/docs/scale/scaletutorials/datasets/permissionsscale/).
|
||||||
|
:::
|
||||||
|
|
||||||
|
<Tabs groupId="truenas-migration-tabs">
|
||||||
|
<TabItem value="migrate-new-dataset" label="Migrate data to a new dataset (recommended)" default>
|
||||||
|
|
||||||
|
To migrate from the old storage configuration to the new one, you will need to create a new dataset for the Immich data storage and copy the data from the old datasets to the new ones. The steps are as follows:
|
||||||
|
|
||||||
|
1. **Stop the Immich app** from the TrueNAS web interface to ensure no data is being written while you are copying the data.
|
||||||
|
2. **Create a new dataset** for the Immich data storage, for example, `data`. As described in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above, create the dataset with the **Apps** preset to ensure the correct permissions are set.
|
||||||
|
3. **Copy the data** from the old datasets to the new dataset. We advise using the `rsync` command to copy the data, as it will preserve the permissions and ownership of the files. The following commands are examples:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/tank/immich/library/ /mnt/tank/immich/data/library/
|
||||||
|
rsync -av /mnt/tank/immich/upload/ /mnt/tank/immich/data/upload/
|
||||||
|
rsync -av /mnt/tank/immich/thumbs/ /mnt/tank/immich/data/thumbs/
|
||||||
|
rsync -av /mnt/tank/immich/profile/ /mnt/tank/immich/data/profile/
|
||||||
|
rsync -av /mnt/tank/immich/video/ /mnt/tank/immich/data/encoded-video/
|
||||||
|
rsync -av /mnt/tank/immich/backups/ /mnt/tank/immich/data/backups/
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure to replace `/mnt/tank/immich/` with the correct path to your old datasets and `/mnt/tank/immich/data/` with the correct path to your new dataset.
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
If you were using **ixVolume (dataset created automatically by the system)** for Immich data storage, the path to the data should be `/mnt/.ix-apps/app_mounts/immich/`. You have to use this path instead of `/mnt/tank/immich/` in the `rsync` command above, for example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/.ix-apps/app_mounts/immich/library/ /mnt/tank/immich/data/library/
|
||||||
|
```
|
||||||
|
|
||||||
|
If you were also using an ixVolume for Postgres data storage, you also should, first create the pgData dataset, as described in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above, and then you can use the following command to copy the Postgres data:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/.ix-apps/app_mounts/immich/pgData/ /mnt/tank/immich/pgData/
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Make sure that for each folder, the `.immich` file is copied as well, as it contains important metadata for Immich. If for some reason the `.immich` file is not copied, you can copy it manually with the `rsync` command, for example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/tank/immich/library/.immich /mnt/tank/immich/data/library/
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `library` with the name of the folder where you are copying the file.
|
||||||
|
:::
|
||||||
|
|
||||||
|
4. **Update the permissions** as the permissions of the data that have been copied has been preserved, to ensure that the `apps` user (UID 568) has the correct permissions on all the copied data. If you just created the dataset with the **Apps** preset, from the TrueNAS web interface, go to the **Datasets** screen, select the **data** dataset, click on the **Edit** button next to **Permissions**, tick the "Apply permissions recursively" checkbox, and click **Save**. This will apply the correct permissions to all the copied data.
|
||||||
|
5. **Update the Immich app** to use the new dataset:
|
||||||
|
- Go to the **Installed Applications** screen and select Immich from the list of installed applications.
|
||||||
|
- Click **Edit** on the **Application Info** widget.
|
||||||
|
- In the **Storage Configuration** section, untick the **Use Old Storage Configuration (Deprecated)** checkbox.
|
||||||
|
- For the **Data Storage**, select **Host Path (Path that already exists on the system)** and then select the new dataset you created for Immich data storage, for example, `data`.
|
||||||
|
- For the **Postgres Data Storage**, verify that it is still set to the dataset you created for Postgres data storage, for example, `pgData`.
|
||||||
|
- Click **Update** at the bottom of the page to save changes.
|
||||||
|
|
||||||
|
6. **Start the Immich app** from the TrueNAS web interface.
|
||||||
|
|
||||||
|
This will recreate the Immich container with the new storage configuration and start the app.
|
||||||
|
|
||||||
|
If everything went well, you should now be able to access Immich with the new storage configuration. You can verify that the data has been copied correctly by checking the Immich web interface and ensuring that all your photos and videos are still available. You may delete the old datasets, if you no longer need them, using the TrueNAS web interface.
|
||||||
|
|
||||||
|
If you were using **ixVolume (dataset created automatically by the system)** or folders for Immich data storage, you can delete the old datasets using the following commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/library
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/uploads
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/thumbs
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/profile
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/video
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/backups
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem value="migrate-old-dataset" label="Keep the existing datasets">
|
||||||
|
|
||||||
|
To migrate from the old storage configuration to the new one without creating new datasets.
|
||||||
|
1. **Stop the Immich app** from the TrueNAS web interface to ensure no data is being written while you are updating the app.
|
||||||
|
2. **Update the datasets permissions**: Ensure that the datasets used for Immich data storage (`library`, `upload`, `thumbs`, `profile`, `video`, `backups`) have the correct permissions set for the user who will run Immich. The user should have ***modify*** permissions on these datasets. The default user for Immich is `apps` (UID 568) and the default group is `apps` (GID 568). If you are using a different user, make sure to set the permissions accordingly. You can do this from the TrueNAS web interface by going to the **Datasets** screen, selecting each dataset, clicking on the **Edit** button next to **Permissions**, and adding the user with ***modify*** permissions.
|
||||||
|
3. **Update the Immich app** to use the existing datasets:
|
||||||
|
- Go to the **Installed Applications** screen and select Immich from the list of installed applications.
|
||||||
|
- Click **Edit** on the **Application Info** widget.
|
||||||
|
- In the **Storage Configuration** section, untick the **Use Old Storage Configuration (Deprecated)** checkbox.
|
||||||
|
- For the **Data Storage**, you can keep the **ixVolume (dataset created automatically by the system)** as no data will be directly written to it. We recommend selecting **Host Path (Path that already exists on the system)** and then select a **new** dataset you created for Immich data storage, for example, `data`.
|
||||||
|
- For the **Postgres Data Storage**, keep **Host Path (Path that already exists on the system)** and then select the existing dataset you used for Postgres data storage, for example, `pgData`.
|
||||||
|
- Following the instructions in the [Multiple Datasets for Immich Storage](#additional-storage-advanced-users) section, you can add, **for each old dataset**, a new Additional Storage with the following settings:
|
||||||
|
- **Type**: `Host Path (Path that already exists on the system)`
|
||||||
|
- **Mount Path**: `/data/<folder-name>` (e.g. `/data/library`)
|
||||||
|
- **Host Path**: `/mnt/<your-pool-name>/<dataset-name>` (e.g. `/mnt/tank/immich/library`)
|
||||||
|
:::danger Ensure using the correct paths names
|
||||||
|
Make sure to replace `<folder-name>` with the actual name of the folder used by Immich: `library`, `upload`, `thumbs`, `profile`, `encoded-video`, and `backups`. Also, replace `<your-pool-name>` and `<dataset-name>` with the actual names of your pool and dataset.
|
||||||
|
:::
|
||||||
|
- **Read Only**: Keep it unticked as Immich needs to write to these datasets.
|
||||||
|
- Click **Update** at the bottom of the page to save changes.
|
||||||
|
4. **Start the Immich app** from the TrueNAS web interface. This will recreate the Immich container with the new storage configuration and start the app. If everything went well, you should now be able to access Immich with the new storage configuration. You can verify that the data is still available by checking the Immich web interface and ensuring that all your photos and videos are still accessible.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
</Tabs>
|
||||||
|
|||||||
@@ -27,3 +27,102 @@ docker image prune
|
|||||||
[watchtower]: https://containrrr.dev/watchtower/
|
[watchtower]: https://containrrr.dev/watchtower/
|
||||||
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
|
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
|
||||||
[releases]: https://github.com/immich-app/immich/releases
|
[releases]: https://github.com/immich-app/immich/releases
|
||||||
|
|
||||||
|
## Migrating to VectorChord
|
||||||
|
|
||||||
|
:::info
|
||||||
|
If you deploy Immich using Docker Compose, see `ghcr.io/immich-app/postgres` in the `docker-compose.yml` file and have not explicitly set the `DB_VECTOR_EXTENSION` environmental variable, your Immich database is already using VectorChord and this section does not apply to you.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::important
|
||||||
|
If you do not deploy Immich using Docker Compose and see a deprecation warning for pgvecto.rs on server startup, you should refer to the maintainers of the Immich distribution for guidance (if using a turnkey solution) or adapt the instructions for your specific setup.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Immich has migrated off of the deprecated pgvecto.rs database extension to its successor, [VectorChord](https://github.com/tensorchord/VectorChord), which comes with performance improvements in almost every aspect. This section will guide you on how to make this change in a Docker Compose setup.
|
||||||
|
|
||||||
|
Before making any changes, please [back up your database](/docs/administration/backup-and-restore). While every effort has been made to make this migration as smooth as possible, thereâs always a chance that something can go wrong.
|
||||||
|
|
||||||
|
After making a backup, please modify your `docker-compose.yml` file with the following information.
|
||||||
|
|
||||||
|
```diff
|
||||||
|
[...]
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: immich_postgres
|
||||||
|
- image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||||
|
+ image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||||
|
POSTGRES_INITDB_ARGS: '--data-checksums'
|
||||||
|
+ # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
|
||||||
|
+ # DB_STORAGE_TYPE: 'HDD'
|
||||||
|
volumes:
|
||||||
|
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
|
||||||
|
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
|
||||||
|
- healthcheck:
|
||||||
|
- test: >-
|
||||||
|
- pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
|
||||||
|
- Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
|
||||||
|
- --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
|
||||||
|
- echo "checksum failure count is $$Chksum";
|
||||||
|
- [ "$$Chksum" = '0' ] || exit 1
|
||||||
|
- interval: 5m
|
||||||
|
- start_interval: 30s
|
||||||
|
- start_period: 5m
|
||||||
|
- command: >-
|
||||||
|
- postgres
|
||||||
|
- -c shared_preload_libraries=vectors.so
|
||||||
|
- -c 'search_path="$$user", public, vectors'
|
||||||
|
- -c logging_collector=on
|
||||||
|
- -c max_wal_size=2GB
|
||||||
|
- -c shared_buffers=512MB
|
||||||
|
- -c wal_compression=on
|
||||||
|
+ shm_size: 128mb
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
:::important
|
||||||
|
If you deviated from the defaults of pg14 or pgvectors0.2.0, you must adjust the pg major version and pgvecto.rs version. If you are still using the default `docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0` image, you can just follow the changes above. For example, if the previous image is `docker.io/tensorchord/pgvecto-rs:pg16-v0.3.0`, the new image should be `ghcr.io/immich-app/postgres:16-vectorchord0.3.0-pgvectors0.3.0` instead of the image specified in the diff.
|
||||||
|
:::
|
||||||
|
|
||||||
|
After making these changes, you can start Immich as normal. Immich will make some changes to the DB during startup, which can take seconds to minutes to finish, depending on hardware and library size. In particular, itâs normal for the server logs to be seemingly stuck at `Reindexing clip_index` and `Reindexing face_index`for some time if you have over 100k assets in Immich and/or Immich is on a relatively weak server. If you see these logs and there are no errors, just give it time.
|
||||||
|
|
||||||
|
:::danger
|
||||||
|
After switching to VectorChord, you should not downgrade Immich below 1.133.0.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Please donât hesitate to contact us on [GitHub](https://github.com/immich-app/immich/discussions) or [Discord](https://discord.immich.app/) if you encounter migration issues.
|
||||||
|
|
||||||
|
### VectorChord FAQ
|
||||||
|
|
||||||
|
#### I have a separate PostgreSQL instance shared with multiple services. How can I switch to VectorChord?
|
||||||
|
|
||||||
|
Please see the [standalone PostgreSQL documentation](/docs/administration/postgres-standalone#migrating-to-vectorchord) for migration instructions. The migration path will be different depending on whether youâre currently using pgvecto.rs or pgvector, as well as whether Immich has superuser DB permissions.
|
||||||
|
|
||||||
|
#### Why are so many lines removed from the `docker-compose.yml` file? Does this mean the health check is removed?
|
||||||
|
|
||||||
|
These lines are now incorporated into the image itself along with some additional tuning.
|
||||||
|
|
||||||
|
#### What does this change mean for my existing DB backups?
|
||||||
|
|
||||||
|
The new DB image includes pgvector and pgvecto.rs in addition to VectorChord, so you can use this image to restore from existing backups that used either of these extensions. However, backups made after switching to VectorChord require an image containing VectorChord to restore successfully.
|
||||||
|
|
||||||
|
#### Do I still need pgvecto.rs installed after migrating to VectorChord?
|
||||||
|
|
||||||
|
pgvecto.rs only needs to be available during the migration, or if you need to restore from a backup that used pgvecto.rs. For a leaner DB and a smaller image, you can optionally switch to an image variant that doesnât have pgvecto.rs installed after youâve performed the migration and started Immich: `ghcr.io/immich-app/postgres:14-vectorchord0.4.3`, changing the PostgreSQL version as appropriate.
|
||||||
|
|
||||||
|
#### Why does it matter whether my database is on an SSD or an HDD?
|
||||||
|
|
||||||
|
These storage mediums have different performance characteristics. As a result, the optimal settings for an SSD are not the same as those for an HDD. Either configuration is compatible with SSD and HDD, but using the right configuration will make Immich snappier. As a general tip, we recommend users store the database on an SSD whenever possible.
|
||||||
|
|
||||||
|
#### Can I use the new database image as a general PostgreSQL image outside of Immich?
|
||||||
|
|
||||||
|
Itâs a standard PostgreSQL container image that additionally contains the VectorChord, pgvector, and (optionally) pgvecto.rs extensions. If you were using the previous pgvecto.rs image for other purposes, you can similarly do so with this image.
|
||||||
|
|
||||||
|
#### If pgvecto.rs and pgvector still work, why should I switch to VectorChord?
|
||||||
|
|
||||||
|
VectorChord is faster, more stable, uses less RAM, and (with the settings Immich uses) offers higher-quality results than pgvector and pgvecto.rs. This translates to better search and facial recognition experiences. In addition, pgvecto.rs support will be dropped in the future, so changing it sooner will avoid disruption.
|
||||||
|
|||||||
20545
docs/package-lock.json
generated
@@ -7,7 +7,8 @@
|
|||||||
"format": "prettier --check .",
|
"format": "prettier --check .",
|
||||||
"format:fix": "prettier --write .",
|
"format:fix": "prettier --write .",
|
||||||
"start": "docusaurus start --port 3005",
|
"start": "docusaurus start --port 3005",
|
||||||
"build": "docusaurus build",
|
"copy:openapi": "jq -c < ../open-api/immich-openapi-specs.json > ./static/openapi.json || exit 0",
|
||||||
|
"build": "npm run copy:openapi && docusaurus build",
|
||||||
"swizzle": "docusaurus swizzle",
|
"swizzle": "docusaurus swizzle",
|
||||||
"deploy": "docusaurus deploy",
|
"deploy": "docusaurus deploy",
|
||||||
"clear": "docusaurus clear",
|
"clear": "docusaurus clear",
|
||||||
@@ -59,6 +60,6 @@
|
|||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.17.1"
|
"node": "22.18.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,6 +100,11 @@ const projects: CommunityProjectProps[] = [
|
|||||||
description: 'Automatically optimize files uploaded to Immich in order to save storage space',
|
description: 'Automatically optimize files uploaded to Immich in order to save storage space',
|
||||||
url: 'https://github.com/miguelangel-nubla/immich-upload-optimizer',
|
url: 'https://github.com/miguelangel-nubla/immich-upload-optimizer',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Immich Machine Learning Load Balancer',
|
||||||
|
description: 'Speed up your machine learning by load balancing your requests to multiple computers',
|
||||||
|
url: 'https://github.com/apetersson/immich_ml_balancer',
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {
|
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ import {
|
|||||||
mdiCloudKeyOutline,
|
mdiCloudKeyOutline,
|
||||||
mdiRegex,
|
mdiRegex,
|
||||||
mdiCodeJson,
|
mdiCodeJson,
|
||||||
|
mdiClockOutline,
|
||||||
|
mdiAccountOutline,
|
||||||
|
mdiRestart,
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import Layout from '@theme/Layout';
|
import Layout from '@theme/Layout';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
@@ -26,6 +29,42 @@ const withLanguage = (date: Date) => (language: string) => date.toLocaleDateStri
|
|||||||
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
|
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
|
||||||
|
|
||||||
const items: Item[] = [
|
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,
|
icon: mdiRegex,
|
||||||
iconColor: 'purple',
|
iconColor: 'purple',
|
||||||
|
|||||||
@@ -2,4 +2,23 @@
|
|||||||
|
|
||||||
## TypeORM Upgrade
|
## TypeORM Upgrade
|
||||||
|
|
||||||
The upgrade to Immich `v2.x.x` has a required upgrade path to `v1.132.0+`. This means it is required to start up the application at least once on version `1.132.0` (or later). Doing so will complete database schema upgrades that are required for `v2.0.0`. After Immich has successfully booted on this version, shut the system down and try the `v2.x.x` upgrade again.
|
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.
|
||||||
|
|
||||||
|
## Inconsistent Media Location
|
||||||
|
|
||||||
|
:::caution
|
||||||
|
This error is related to the location of media files _inside the container_. Never move files on the host system when you run into this error message.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Immich automatically tries to detect where your Immich data is located. On start up, it compares the detected media location with the file paths in the database and throws an Inconsistent Media Location error when they do not match.
|
||||||
|
|
||||||
|
To fix this issue, verify that the `IMMICH_MEDIA_LOCATION` environment variable and `UPLOAD_LOCATION` volume mount are in sync with the database paths.
|
||||||
|
|
||||||
|
If you would like to migrate from one media location to another, simply successfully start Immich on `v1.136.0` or later, then do the following steps:
|
||||||
|
|
||||||
|
1. Stop Immich
|
||||||
|
2. Update `IMMICH_MEDIA_LOCATION` to the new location
|
||||||
|
3. Update the right-hand side of the `UPLOAD_LOCATION` volume mount to the new location
|
||||||
|
4. Start up Immich
|
||||||
|
|
||||||
|
After version `1.136.0`, Immich can detect when a media location has moved and will automatically update the database paths to keep them in sync.
|
||||||
|
|||||||
32
docs/static/archived-versions.json
vendored
@@ -1,4 +1,36 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.137.2",
|
||||||
|
"url": "https://v1.137.2.archive.immich.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.137.1",
|
||||||
|
"url": "https://v1.137.1.archive.immich.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.137.0",
|
||||||
|
"url": "https://v1.137.0.archive.immich.app"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "v1.136.0",
|
"label": "v1.136.0",
|
||||||
"url": "https://v1.136.0.archive.immich.app"
|
"url": "https://v1.136.0.archive.immich.app"
|
||||||
|
|||||||
1
e2e/.gitignore
vendored
@@ -3,3 +3,4 @@ node_modules/
|
|||||||
/playwright-report/
|
/playwright-report/
|
||||||
/blob-report/
|
/blob-report/
|
||||||
/playwright/.cache/
|
/playwright/.cache/
|
||||||
|
/dist
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
image: redis:6.2-alpine@sha256:7fe72c486b910f6b1a9769c937dad5d63648ddee82e056f47417542dd40825bb
|
image: redis:6.2-alpine@sha256:7fe72c486b910f6b1a9769c937dad5d63648ddee82e056f47417542dd40825bb
|
||||||
|
|
||||||
database:
|
database:
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:3aef84a0a4fabbda17ef115c3019ba0c914ec73e9f6e59203674322d858b8eea
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:0e763a2383d56f90364fcd72767ac41400cd30d2627f407f7e7960c9f1923c21
|
||||||
command: -c fsync=off -c shared_preload_libraries=vchord.so -c config_file=/var/lib/postgresql/data/postgresql.conf
|
command: -c fsync=off -c shared_preload_libraries=vchord.so -c config_file=/var/lib/postgresql/data/postgresql.conf
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
|
|||||||
7450
e2e/package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "immich-e2e",
|
"name": "immich-e2e",
|
||||||
"version": "1.136.0",
|
"version": "1.139.3",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -26,16 +26,16 @@
|
|||||||
"@playwright/test": "^1.44.1",
|
"@playwright/test": "^1.44.1",
|
||||||
"@socket.io/component-emitter": "^3.1.2",
|
"@socket.io/component-emitter": "^3.1.2",
|
||||||
"@types/luxon": "^3.4.2",
|
"@types/luxon": "^3.4.2",
|
||||||
"@types/node": "^22.16.4",
|
"@types/node": "^22.17.1",
|
||||||
"@types/oidc-provider": "^9.0.0",
|
"@types/oidc-provider": "^9.0.0",
|
||||||
"@types/pg": "^8.15.1",
|
"@types/pg": "^8.15.1",
|
||||||
"@types/pngjs": "^6.0.4",
|
"@types/pngjs": "^6.0.4",
|
||||||
"@types/supertest": "^6.0.2",
|
"@types/supertest": "^6.0.2",
|
||||||
"@vitest/coverage-v8": "^3.0.0",
|
"@vitest/coverage-v8": "^3.0.0",
|
||||||
"eslint": "^9.14.0",
|
"eslint": "^9.14.0",
|
||||||
"eslint-config-prettier": "^10.0.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-unicorn": "^59.0.0",
|
"eslint-plugin-unicorn": "^60.0.0",
|
||||||
"exiftool-vendored": "^28.3.1",
|
"exiftool-vendored": "^28.3.1",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.0.0",
|
||||||
"jose": "^5.6.3",
|
"jose": "^5.6.3",
|
||||||
@@ -54,6 +54,6 @@
|
|||||||
"vitest": "^3.0.0"
|
"vitest": "^3.0.0"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.17.1"
|
"node": "22.18.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ describe('/albums', () => {
|
|||||||
.send({ ids: [asset.id] });
|
.send({ ids: [asset.id] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest('Not found or no album.addAsset access'));
|
expect(body).toEqual(errorDto.badRequest('Not found or no albumAsset.create access'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should add duplicate assets only once', async () => {
|
it('should add duplicate assets only once', async () => {
|
||||||
@@ -599,7 +599,7 @@ describe('/albums', () => {
|
|||||||
.send({ ids: [user1Asset1.id] });
|
.send({ ids: [user1Asset1.id] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest('Not found or no album.removeAsset access'));
|
expect(body).toEqual(errorDto.badRequest('Not found or no albumAsset.delete access'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should remove duplicate assets only once', async () => {
|
it('should remove duplicate assets only once', async () => {
|
||||||
@@ -683,7 +683,7 @@ describe('/albums', () => {
|
|||||||
.set('Authorization', `Bearer ${user1.accessToken}`)
|
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||||
.send({ role: AlbumUserRole.Editor });
|
.send({ role: AlbumUserRole.Editor });
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
|
|
||||||
// Get album to verify the role change
|
// Get album to verify the role change
|
||||||
const { body } = await request(app)
|
const { body } = await request(app)
|
||||||
|
|||||||
@@ -555,7 +555,7 @@ describe('/asset', () => {
|
|||||||
expect(body).toMatchObject({ id: user1Assets[0].id, livePhotoVideoId: null });
|
expect(body).toMatchObject({ id: user1Assets[0].id, livePhotoVideoId: null });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should update date time original when sidecar file contains DateTimeOriginal', async () => {
|
it.skip('should update date time original when sidecar file contains DateTimeOriginal', async () => {
|
||||||
const sidecarData = `<?xpacket begin='?' id='W5M0MpCehiHzreSzNTczkc9d'?>
|
const sidecarData = `<?xpacket begin='?' id='W5M0MpCehiHzreSzNTczkc9d'?>
|
||||||
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 12.40'>
|
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 12.40'>
|
||||||
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
|
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
|
||||||
@@ -854,6 +854,30 @@ describe('/asset', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('PUT /assets', () => {
|
||||||
|
it('should update date time original relatively', async () => {
|
||||||
|
const { status, body } = await request(app)
|
||||||
|
.put(`/assets/`)
|
||||||
|
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||||
|
.send({ ids: [user1Assets[0].id], dateTimeRelative: -1441 });
|
||||||
|
|
||||||
|
expect(body).toEqual({});
|
||||||
|
expect(status).toEqual(204);
|
||||||
|
|
||||||
|
const result = await request(app)
|
||||||
|
.get(`/assets/${user1Assets[0].id}`)
|
||||||
|
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||||
|
.send();
|
||||||
|
|
||||||
|
expect(result.body).toMatchObject({
|
||||||
|
id: user1Assets[0].id,
|
||||||
|
exifInfo: expect.objectContaining({
|
||||||
|
dateTimeOriginal: '2023-11-19T01:10:00+00:00',
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('POST /assets', () => {
|
describe('POST /assets', () => {
|
||||||
beforeAll(setupTests, 30_000);
|
beforeAll(setupTests, 30_000);
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ describe('/partners', () => {
|
|||||||
.delete(`/partners/${user3.userId}`)
|
.delete(`/partners/${user3.userId}`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw a bad request if partner not found', async () => {
|
it('should throw a bad request if partner not found', async () => {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
import { createUserDto, uuidDto } from 'src/fixtures';
|
import { createUserDto, uuidDto } from 'src/fixtures';
|
||||||
import { errorDto } from 'src/responses';
|
import { errorDto } from 'src/responses';
|
||||||
import { app, asBearerAuth, shareUrl, utils } from 'src/utils';
|
import { app, asBearerAuth, baseUrl, shareUrl, utils } from 'src/utils';
|
||||||
import request from 'supertest';
|
import request from 'supertest';
|
||||||
import { beforeAll, describe, expect, it } from 'vitest';
|
import { beforeAll, describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
@@ -78,6 +78,7 @@ describe('/shared-links', () => {
|
|||||||
type: SharedLinkType.Album,
|
type: SharedLinkType.Album,
|
||||||
albumId: metadataAlbum.id,
|
albumId: metadataAlbum.id,
|
||||||
showMetadata: true,
|
showMetadata: true,
|
||||||
|
slug: 'metadata-album',
|
||||||
}),
|
}),
|
||||||
utils.createSharedLink(user1.accessToken, {
|
utils.createSharedLink(user1.accessToken, {
|
||||||
type: SharedLinkType.Album,
|
type: SharedLinkType.Album,
|
||||||
@@ -138,6 +139,17 @@ describe('/shared-links', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('GET /s/:slug', () => {
|
||||||
|
it('should work for slug auth', async () => {
|
||||||
|
const resp = await request(baseUrl).get(`/s/${linkWithMetadata.slug}`);
|
||||||
|
expect(resp.status).toBe(200);
|
||||||
|
expect(resp.header['content-type']).toContain('text/html');
|
||||||
|
expect(resp.text).toContain(
|
||||||
|
`<meta name="description" content="${metadataAlbum.assets.length} shared photos & videos" />`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('GET /shared-links', () => {
|
describe('GET /shared-links', () => {
|
||||||
it('should require authentication', async () => {
|
it('should require authentication', async () => {
|
||||||
const { status, body } = await request(app).get('/shared-links');
|
const { status, body } = await request(app).get('/shared-links');
|
||||||
@@ -473,7 +485,7 @@ describe('/shared-links', () => {
|
|||||||
.delete(`/shared-links/${linkWithAlbum.id}`)
|
.delete(`/shared-links/${linkWithAlbum.id}`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ describe('/users', () => {
|
|||||||
const { status } = await request(app)
|
const { status } = await request(app)
|
||||||
.delete(`/users/me/license`)
|
.delete(`/users/me/license`)
|
||||||
.set('Authorization', `Bearer ${nonAdmin.accessToken}`);
|
.set('Authorization', `Bearer ${nonAdmin.accessToken}`);
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ export const tempDir = tmpdir();
|
|||||||
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
|
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
|
||||||
export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
|
export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
|
||||||
export const immichCli = (args: string[]) =>
|
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[]) =>
|
export const immichAdmin = (args: string[]) =>
|
||||||
executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]);
|
executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]);
|
||||||
export const specialCharStrings = ["'", '"', ',', '{', '}', '*'];
|
export const specialCharStrings = ["'", '"', ',', '{', '}', '*'];
|
||||||
@@ -186,18 +186,6 @@ export const utils = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
resetFilesystem: async () => {
|
|
||||||
const mediaInternal = '/usr/src/app/upload';
|
|
||||||
const dirs = [
|
|
||||||
`"${mediaInternal}/thumbs"`,
|
|
||||||
`"${mediaInternal}/upload"`,
|
|
||||||
`"${mediaInternal}/library"`,
|
|
||||||
`"${mediaInternal}/encoded-video"`,
|
|
||||||
].join(' ');
|
|
||||||
|
|
||||||
await execPromise(`docker exec -i "immich-e2e-server" /bin/bash -c "rm -rf ${dirs} && mkdir ${dirs}"`);
|
|
||||||
},
|
|
||||||
|
|
||||||
unzip: async (input: string, output: string) => {
|
unzip: async (input: string, output: string) => {
|
||||||
await execPromise(`unzip -o -d "${output}" "${input}"`);
|
await execPromise(`unzip -o -d "${output}" "${input}"`);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ test.describe('Registration', () => {
|
|||||||
await page.getByRole('button', { name: 'Server Privacy' }).click();
|
await page.getByRole('button', { name: 'Server Privacy' }).click();
|
||||||
await page.getByRole('button', { name: 'User Privacy' }).click();
|
await page.getByRole('button', { name: 'User Privacy' }).click();
|
||||||
await page.getByRole('button', { name: 'Storage Template' }).click();
|
await page.getByRole('button', { name: 'Storage Template' }).click();
|
||||||
|
await page.getByRole('button', { name: 'Backups' }).click();
|
||||||
await page.getByRole('button', { name: 'Done' }).click();
|
await page.getByRole('button', { name: 'Done' }).click();
|
||||||
|
|
||||||
// success
|
// success
|
||||||
|
|||||||
133
i18n/ar.json
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"about": "ØšŲ",
|
"about": "ØŲŲŲŲ",
|
||||||
"account": "ØØŗØ§Ø¨",
|
"account": "ØØŗØ§Ø¨",
|
||||||
"account_settings": "ØĨؚداداØĒ Ø§ŲØØŗØ§Ø¨",
|
"account_settings": "ØĨؚداداØĒ Ø§ŲØØŗØ§Ø¨",
|
||||||
"acknowledge": "ØŖŲØ¯ØąŲ ذŲŲ",
|
"acknowledge": "ØŖŲØ¯ØąŲ ذŲŲ",
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
"add_a_location": "ØĨØļØ§ŲØŠ Ų
ŲŲØš",
|
"add_a_location": "ØĨØļØ§ŲØŠ Ų
ŲŲØš",
|
||||||
"add_a_name": "ØĨØļØ§ŲØŠ ØĨØŗŲ
",
|
"add_a_name": "ØĨØļØ§ŲØŠ ØĨØŗŲ
",
|
||||||
"add_a_title": "ØĨØļØ§ŲØŠ ØšŲŲØ§Ų",
|
"add_a_title": "ØĨØļØ§ŲØŠ ØšŲŲØ§Ų",
|
||||||
|
"add_birthday": "ØŖØļŲ ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯",
|
||||||
"add_endpoint": "اØļŲ ŲŲØˇØŠ ŲŲØ§ŲØŠ",
|
"add_endpoint": "اØļŲ ŲŲØˇØŠ ŲŲØ§ŲØŠ",
|
||||||
"add_exclusion_pattern": "ØĨØļØ§ŲØŠ ŲŲ
Øˇ ØĨØŗØĒØĢŲØ§ØĄ",
|
"add_exclusion_pattern": "ØĨØļØ§ŲØŠ ŲŲ
Øˇ ØĨØŗØĒØĢŲØ§ØĄ",
|
||||||
"add_import_path": "ØĨØļØ§ŲØŠ Ų
ØŗØ§Øą Ø§ŲØĨØŗØĒŲØąØ§Ø¯",
|
"add_import_path": "ØĨØļØ§ŲØŠ Ų
ØŗØ§Øą Ø§ŲØĨØŗØĒŲØąØ§Ø¯",
|
||||||
@@ -25,8 +26,11 @@
|
|||||||
"add_tag": "اØļŲ ØšŲØ§Ų
ØŠ",
|
"add_tag": "اØļŲ ØšŲØ§Ų
ØŠ",
|
||||||
"add_to": "ØĨØļØ§ŲØŠ ØĨŲŲâĻ",
|
"add_to": "ØĨØļØ§ŲØŠ ØĨŲŲâĻ",
|
||||||
"add_to_album": "ØĨØļØ§ŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
",
|
"add_to_album": "ØĨØļØ§ŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
",
|
||||||
"add_to_album_bottom_sheet_added": "ØĒŲ
ØĒ Ø§ŲØ§ØļØ§ŲØŠ{album}",
|
"add_to_album_bottom_sheet_added": "ØĒŲ
ØĒ Ø§ŲØ§ØļØ§ŲØŠ Ø§ŲŲ {album}",
|
||||||
"add_to_album_bottom_sheet_already_exists": "Ų
ŲØŦŲØ¯ØŠ Ų
ØŗØ¨ŲØ§ {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_to_shared_album": "ØĨØļØ§ŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
Ų
Ø´Ø§ØąŲ",
|
||||||
"add_url": "ØĨØļØ§ŲØŠ ØąØ§Ø¨Øˇ",
|
"add_url": "ØĨØļØ§ŲØŠ ØąØ§Ø¨Øˇ",
|
||||||
"added_to_archive": "ØŖŲØļŲŲØĒ ŲŲØŖØąØ´ŲŲ",
|
"added_to_archive": "ØŖŲØļŲŲØĒ ŲŲØŖØąØ´ŲŲ",
|
||||||
@@ -34,16 +38,23 @@
|
|||||||
"added_to_favorites_count": "ØĒŲ
ØĨØļØ§ŲØŠ {count, number} ØĨŲŲ Ø§ŲŲ
ŲØļŲØ§ØĒ",
|
"added_to_favorites_count": "ØĒŲ
ØĨØļØ§ŲØŠ {count, number} ØĨŲŲ Ø§ŲŲ
ŲØļŲØ§ØĒ",
|
||||||
"admin": {
|
"admin": {
|
||||||
"add_exclusion_pattern_description": "ØĨØļØ§ŲØŠ ØŖŲŲ
Ø§Øˇ Ø§ŲØ§ØŗØĒبؚاد. ŲØ¯ØšŲ
Ø§ŲØĒŲ
ŲŲŲ Ø¨Ø§ØŗØĒ؎داŲ
*Ø **Ø ŲØ. ŲØĒØŦاŲŲ ØŦŲ
ب𠨧ŲŲ
ŲŲØ§ØĒ ŲŲ ØŖŲ Ø¯ŲŲŲ ŲØŗŲ
Ų \"Raw\"Ø Ø§ØŗØĒ؎دŲ
\"**/Raw/**\". ŲØĒØŦاŲŲ ØŦŲ
ب𠨧ŲŲ
ŲŲØ§ØĒ Ø§ŲØĒŲ ØĒŲØĒŲŲ Ø¨Ų \".tif\"Ø Ø§ØŗØĒ؎دŲ
\"**/*.tif\". ŲØĒØŦاŲŲ Ų
ØŗØ§Øą Ų
ØˇŲŲØ Ø§ØŗØĒ؎دŲ
\"/path/to/ignore/**\".",
|
"add_exclusion_pattern_description": "ØĨØļØ§ŲØŠ ØŖŲŲ
Ø§Øˇ Ø§ŲØ§ØŗØĒبؚاد. ŲØ¯ØšŲ
Ø§ŲØĒŲ
ŲŲŲ Ø¨Ø§ØŗØĒ؎داŲ
*Ø **Ø ŲØ. ŲØĒØŦاŲŲ ØŦŲ
ب𠨧ŲŲ
ŲŲØ§ØĒ ŲŲ ØŖŲ Ø¯ŲŲŲ ŲØŗŲ
Ų \"Raw\"Ø Ø§ØŗØĒ؎دŲ
\"**/Raw/**\". ŲØĒØŦاŲŲ ØŦŲ
ب𠨧ŲŲ
ŲŲØ§ØĒ Ø§ŲØĒŲ ØĒŲØĒŲŲ Ø¨Ų \".tif\"Ø Ø§ØŗØĒ؎دŲ
\"**/*.tif\". ŲØĒØŦاŲŲ Ų
ØŗØ§Øą Ų
ØˇŲŲØ Ø§ØŗØĒ؎دŲ
\"/path/to/ignore/**\".",
|
||||||
"admin_user": "Ų
ØŗØĒ؎دŲ
Ų
Ø¯ŲØą",
|
"admin_user": "Ų
ØŗØĒ؎دŲ
Ų
ØŗØ¤ŲŲ",
|
||||||
"asset_offline_description": "ŲŲ
ب𨝠ب°Ø§ Ø§ŲØŖØĩŲ Ø§ŲØŽØ§Øĩ باŲŲ
ŲØĒØ¨ØŠ Ø§ŲØŽØ§ØąØŦŲØŠ Ų
ŲØŦŲØ¯Ųا ØšŲŲ Ø§ŲŲØąØĩ ŲØĒŲ
ŲŲŲŲ ØĨŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ. ØĨذا ØĒŲ
ŲŲŲ Ø§ŲŲ
ŲŲ Ø¯Ø§ØŽŲ Ø§ŲŲ
ŲØĒØ¨ØŠØ ŲØĒØŲŲ Ų
Ų Ø§ŲØŦدŲŲ Ø§ŲØ˛Ų
ŲŲ Ø§ŲØŽØ§Øĩ Ø¨Ų ŲŲ
ØšØąŲØŠ Ø§ŲØŖØĩŲ Ø§ŲØŦØ¯ŲØ¯ اŲŲ
ŲØ§Ø¨Ų. ŲØ§ØŗØĒؚاد؊ ŲØ°Ø§ Ø§ŲØŖØĩŲØ ŲØąØŦŲ Ø§ŲØĒØŖŲد Ų
Ų ØĨŲ
ŲØ§ŲŲØŠ Ø§ŲŲØĩŲŲ ØĨŲŲ Ų
ØŗØ§Øą اŲŲ
ŲŲ ØŖØ¯ŲØ§Ų Ø¨ŲØ§ØŗØˇØŠ Immich ŲŲ
Ų ØĢŲ
ŲŲ
بŲ
ØŗØ Ø§ŲŲ
ŲØĒØ¨ØŠ.",
|
"asset_offline_description": "ŲŲ
ب𨝠ب°Ø§ Ø§ŲØŖØĩŲ Ø§ŲØŽØ§Øĩ باŲŲ
ŲØĒØ¨ØŠ Ø§ŲØŽØ§ØąØŦŲØŠ Ų
ŲØŦŲØ¯Ųا ØšŲŲ Ø§ŲŲØąØĩ ŲØĒŲ
ŲŲŲŲ ØĨŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ. ØĨذا ØĒŲ
ŲŲŲ Ø§ŲŲ
ŲŲ Ø¯Ø§ØŽŲ Ø§ŲŲ
ŲØĒØ¨ØŠØ ŲØĒØŲŲ Ų
Ų Ø§ŲØŦدŲŲ Ø§ŲØ˛Ų
ŲŲ Ø§ŲØŽØ§Øĩ Ø¨Ų ŲŲ
ØšØąŲØŠ Ø§ŲØŖØĩŲ Ø§ŲØŦØ¯ŲØ¯ اŲŲ
ŲØ§Ø¨Ų. ŲØ§ØŗØĒؚاد؊ ŲØ°Ø§ Ø§ŲØŖØĩŲØ ŲØąØŦŲ Ø§ŲØĒØŖŲد Ų
Ų ØĨŲ
ŲØ§ŲŲØŠ Ø§ŲŲØĩŲŲ ØĨŲŲ Ų
ØŗØ§Øą اŲŲ
ŲŲ ØŖØ¯ŲØ§Ų Ø¨ŲØ§ØŗØˇØŠ Immich ŲŲ
Ų ØĢŲ
ŲŲ
بŲ
ØŗØ Ø§ŲŲ
ŲØĒØ¨ØŠ.",
|
||||||
"authentication_settings": "ØĨؚداداØĒ اŲŲ
ØĩØ§Ø¯ŲØŠ",
|
"authentication_settings": "ØĨؚداداØĒ اŲŲ
ØĩØ§Ø¯ŲØŠ",
|
||||||
"authentication_settings_description": "ØĨØ¯Ø§ØąØŠ ŲŲŲ
ØŠ اŲŲ
ØąŲØą ŲOAuth ŲØĨؚداداØĒ اŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØŖŲØŽØąŲ",
|
"authentication_settings_description": "ØĨØ¯Ø§ØąØŠ ŲŲŲ
ØŠ اŲŲ
ØąŲØą ŲOAuth ŲØĨؚداداØĒ اŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØŖŲØŽØąŲ",
|
||||||
"authentication_settings_disable_all": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĒØšØˇŲŲ ØŦŲ
ŲØš ŲØŗØ§ØĻŲ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲØ ØŗŲØĒŲ
ØĒØšØˇŲŲ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ Ø¨Ø§ŲŲØ§Ų
Ų.",
|
"authentication_settings_disable_all": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĒØšØˇŲŲ ØŦŲ
ŲØš ŲØŗØ§ØĻŲ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲØ ØŗŲØĒŲ
ØĒØšØˇŲŲ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ Ø¨Ø§ŲŲØ§Ų
Ų.",
|
||||||
"authentication_settings_reenable": "ŲØĨؚاد؊ Ø§ŲØĒŲØšŲŲØ Ø§ØŗØĒ؎دŲ
<link>ØŖŲ
Øą Ø§ŲØŽØ§Ø¯Ų
</link>.",
|
"authentication_settings_reenable": "ŲØĨؚاد؊ Ø§ŲØĒŲØšŲŲØ Ø§ØŗØĒ؎دŲ
<link>ØŖŲ
Øą Ø§ŲØŽØ§Ø¯Ų
</link>.",
|
||||||
"background_task_job": "اŲŲ
ŲØ§Ų
Ø§ŲØŽŲŲŲØŠ",
|
"background_task_job": "اŲŲ
ŲØ§Ų
ŲŲ Ø§ŲØŽŲŲŲØŠ",
|
||||||
"backup_database": "Ø§ŲØ´Ø§ØĄ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
"backup_database": "Ø§ŲØ´Ø§ØĄ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||||
"backup_database_enable_description": "ØĒŲ
ŲŲŲ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
"backup_database_enable_description": "ØĒŲ
ŲŲŲ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||||
"backup_keep_last_amount": "Ų
ŲØ¯Ø§Øą Ø§ŲØĒŲØąŲØēاØĒ Ø§ŲØŗØ§Ø¨ŲØŠ ŲŲØ§ØØĒŲØ§Ø¸ Ø¨ŲØ§",
|
"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": "ØĨؚداداØĒ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||||
"backup_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ.",
|
"backup_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒŲØąŲØē ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ.",
|
||||||
"cleared_jobs": "ØĒŲ
ØĨØŽŲØ§ØĄ Ų
ŲØ§Ų
: {job}",
|
"cleared_jobs": "ØĒŲ
ØĨØŽŲØ§ØĄ Ų
ŲØ§Ų
: {job}",
|
||||||
@@ -210,6 +221,8 @@
|
|||||||
"oauth_mobile_redirect_uri": "ØšŲŲØ§Ų URI ŲØĨؚاد؊ Ø§ŲØĒŲØŦŲŲ ØšŲŲ Ø§ŲŲØ§ØĒŲ",
|
"oauth_mobile_redirect_uri": "ØšŲŲØ§Ų URI ŲØĨؚاد؊ Ø§ŲØĒŲØŦŲŲ ØšŲŲ Ø§ŲŲØ§ØĒŲ",
|
||||||
"oauth_mobile_redirect_uri_override": "ØĒØŦØ§ŲØ˛ ØšŲŲØ§Ų URI ŲØĨؚاد؊ Ø§ŲØĒŲØŦŲŲ ØšŲŲ Ø§ŲŲØ§ØĒŲ",
|
"oauth_mobile_redirect_uri_override": "ØĒØŦØ§ŲØ˛ ØšŲŲØ§Ų URI ŲØĨؚاد؊ Ø§ŲØĒŲØŦŲŲ ØšŲŲ Ø§ŲŲØ§ØĒŲ",
|
||||||
"oauth_mobile_redirect_uri_override_description": "ŲŲ
بØĒŲØšŲŲŲ ØšŲØ¯Ų
ا ŲØ§ ŲØŗŲ
Ø Ų
ŲŲØą OAuth بŲ
ØšØąŲ URI ŲŲØŦŲØ§ŲØ Ų
ØĢŲ ''{callback}''",
|
"oauth_mobile_redirect_uri_override_description": "ŲŲ
بØĒŲØšŲŲŲ ØšŲØ¯Ų
ا ŲØ§ ŲØŗŲ
Ø Ų
ŲŲØą OAuth بŲ
ØšØąŲ URI ŲŲØŦŲØ§ŲØ Ų
ØĢŲ ''{callback}''",
|
||||||
|
"oauth_role_claim": "اŲŲ
ØˇØ§ŲØ¨ØŠ Ø¨Ø§ŲØ¯ŲØą(ØĩŲØ§ØŲاØĒ)",
|
||||||
|
"oauth_role_claim_description": "Ų
ŲØ ŲØĩŲŲ Ø§ŲŲ
ØŗØ¤ŲŲ ØĒŲŲØ§ØĻŲŲØ§ Ø¨ŲØ§ØĄŲ ØšŲŲ ŲØŦŲØ¯ ŲØ°Ø§ Ø§ŲØˇŲب. ŲØ¯ ŲŲŲŲ Ø§ŲØˇŲب ØĨŲ
ا 'Ų
ØŗØĒ؎دŲ
' ØŖŲ 'Ų
ØŗØ¤ŲŲ'.",
|
||||||
"oauth_settings": "OAuth",
|
"oauth_settings": "OAuth",
|
||||||
"oauth_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ OAuth",
|
"oauth_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ OAuth",
|
||||||
"oauth_settings_more_details": "ŲŲ
Ø˛ŲØ¯ Ų
Ų Ø§ŲØĒŲØ§ØĩŲŲ ØŲŲ ŲØ°Ų اŲŲ
ŲØ˛ØŠØ ŲØąØŦŲ Ø§ŲØąØŦŲØš ØĨŲŲ <link>اŲŲØĢØ§ØĻŲ</link>.",
|
"oauth_settings_more_details": "ŲŲ
Ø˛ŲØ¯ Ų
Ų Ø§ŲØĒŲØ§ØĩŲŲ ØŲŲ ŲØ°Ų اŲŲ
ŲØ˛ØŠØ ŲØąØŦŲ Ø§ŲØąØŦŲØš ØĨŲŲ <link>اŲŲØĢØ§ØĻŲ</link>.",
|
||||||
@@ -345,6 +358,9 @@
|
|||||||
"trash_number_of_days_description": "ؚدد ØŖŲØ§Ų
Ø§ŲØ§ØØĒŲØ§Ø¸ باŲŲ
ØØĒŲŲØ§ØĒ ŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ ŲØ¨Ų ØØ°ŲŲØ§ ŲŲØ§ØĻŲŲØ§",
|
"trash_number_of_days_description": "ؚدد ØŖŲØ§Ų
Ø§ŲØ§ØØĒŲØ§Ø¸ باŲŲ
ØØĒŲŲØ§ØĒ ŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ ŲØ¨Ų ØØ°ŲŲØ§ ŲŲØ§ØĻŲŲØ§",
|
||||||
"trash_settings": "ØĨؚداداØĒ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
"trash_settings": "ØĨؚداداØĒ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||||
"trash_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
"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_cleanup_job": "ØĒŲØ¸ŲŲ Ø§ŲŲ
ØŗØĒ؎دŲ
",
|
||||||
"user_delete_delay": "ØŗŲØĒŲ
ØŦدŲŲØŠ ØØŗØ§Ø¨ <b>{user}</b> ŲŲ
ØØĒŲŲØ§ØĒŲ ŲŲØØ°Ų Ø§ŲŲŲØ§ØĻŲ ŲŲ ØēØļŲŲ {delay, plural, one {# ŲŲŲ
} other {# ØŖŲØ§Ų
}}.",
|
"user_delete_delay": "ØŗŲØĒŲ
ØŦدŲŲØŠ ØØŗØ§Ø¨ <b>{user}</b> ŲŲ
ØØĒŲŲØ§ØĒŲ ŲŲØØ°Ų Ø§ŲŲŲØ§ØĻŲ ŲŲ ØēØļŲŲ {delay, plural, one {# ŲŲŲ
} other {# ØŖŲØ§Ų
}}.",
|
||||||
"user_delete_delay_settings": "ŲØĒØąØŠ Ø§ŲØĒØŖØŽŲØą ŲØ¨Ų Ø§ŲØØ°Ų",
|
"user_delete_delay_settings": "ŲØĒØąØŠ Ø§ŲØĒØŖØŽŲØą ŲØ¨Ų Ø§ŲØØ°Ų",
|
||||||
@@ -371,10 +387,12 @@
|
|||||||
"admin_password": "ŲŲŲ
ØŠ ØŗØą اŲŲ
Ø´ØąŲ",
|
"admin_password": "ŲŲŲ
ØŠ ØŗØą اŲŲ
Ø´ØąŲ",
|
||||||
"administration": "Ø§ŲØĨØ¯Ø§ØąØŠ",
|
"administration": "Ø§ŲØĨØ¯Ø§ØąØŠ",
|
||||||
"advanced": "Ų
ØĒŲØ¯Ų
",
|
"advanced": "Ų
ØĒŲØ¯Ų
",
|
||||||
|
"advanced_settings_beta_timeline_subtitle": "ØŦØąØ¨ ØĒØŦØąØ¨ØŠ Ø§ŲØĒØˇØ¨ŲŲ Ø§ŲØŦØ¯ŲØ¯ØŠ",
|
||||||
|
"advanced_settings_beta_timeline_title": "Ø§ŲØŦدŲŲ Ø§ŲØ˛Ų
ŲŲ Ø§ŲØĒØŦØąŲØ¨Ų",
|
||||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Ø§ØŗØĒ؎دŲ
ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲØĒØĩŲŲØŠ Ø§ŲŲØŗØ§ØĻØˇ اØĢŲØ§ØĄ اŲŲ
Ø˛Ø§Ų
ŲŲ Ø¨ŲØ§ØĄ ØšŲŲ Ų
ؚاŲŲØą Ø¨Ø¯ŲŲØŠ. ØŦØąØ¨ ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲŲØˇ ŲØ§Ų ŲØ¯ŲŲ Ų
شاŲŲ Ų
Øš Ø§ŲØĒØˇØ¨ŲŲ Ø¨Ø§ŲŲØ´Ų ØšŲ ØŦŲ
ب𠨧ب§ŲبŲŲ
اØĒ.",
|
"advanced_settings_enable_alternate_media_filter_subtitle": "Ø§ØŗØĒ؎دŲ
ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲØĒØĩŲŲØŠ Ø§ŲŲØŗØ§ØĻØˇ اØĢŲØ§ØĄ اŲŲ
Ø˛Ø§Ų
ŲŲ Ø¨ŲØ§ØĄ ØšŲŲ Ų
ؚاŲŲØą Ø¨Ø¯ŲŲØŠ. ØŦØąØ¨ ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲŲØˇ ŲØ§Ų ŲØ¯ŲŲ Ų
شاŲŲ Ų
Øš Ø§ŲØĒØˇØ¨ŲŲ Ø¨Ø§ŲŲØ´Ų ØšŲ ØŦŲ
ب𠨧ب§ŲبŲŲ
اØĒ.",
|
||||||
"advanced_settings_enable_alternate_media_filter_title": "[ØĒØŦØąŲØ¨Ų] Ø§ØŗØĒ؎دŲ
ØŦŲØ§Ø˛ ØĒØĩŲŲØŠ Ų
Ø˛Ø§Ų
ŲŲ Ø§ŲØ¨ŲŲ
اØĒ بدŲŲ",
|
"advanced_settings_enable_alternate_media_filter_title": "[ØĒØŦØąŲØ¨Ų] Ø§ØŗØĒ؎دŲ
ØŦŲØ§Ø˛ ØĒØĩŲŲØŠ Ų
Ø˛Ø§Ų
ŲŲ Ø§ŲØ¨ŲŲ
اØĒ بدŲŲ",
|
||||||
"advanced_settings_log_level_title": "Ų
ØŗØĒŲŲ Ø§ŲØŗØŦŲ: {level}",
|
"advanced_settings_log_level_title": "Ų
ØŗØĒŲŲ Ø§ŲØŗØŦŲ: {level}",
|
||||||
"advanced_settings_prefer_remote_subtitle": "ØĒŲŲŲ Ø¨ØšØļ Ø§ŲØŖØŦŲØ˛ØŠ Ø¨ØˇŲØĻØŠ Ųب稧بРŲŲ ØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąØŠ Ų
Ų Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ŲØŦŲØ¯ØŠ ØšŲŲ Ø§ŲØŦŲØ§Ø˛. ŲŲ
بØĒŲØ´ŲØˇ ŲØ°Ø§ Ø§ŲØĨؚداد ŲØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲØ¨ØšŲØ¯ØŠ Ø¨Ø¯ŲØ§Ų Ų
Ų Ø°ŲŲ.",
|
"advanced_settings_prefer_remote_subtitle": "ØĒŲŲŲ Ø¨ØšØļ Ø§ŲØŖØŦŲØ˛ØŠ Ø¨ØˇŲØĻØŠ Ųب稧بРŲŲ ØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąØŠ Ų
Ų Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ØŲŲØŠ. ŲŲ
بØĒŲØšŲŲ ŲØ°Ø§ Ø§ŲØŽŲØ§Øą ŲØĒØŲ
ŲŲ Ø§ŲØĩŲØą Ø§ŲØ¨ØšŲØ¯ØŠ Ø¨Ø¯ŲØ§Ų Ų
Ų Ø°ŲŲ.",
|
||||||
"advanced_settings_prefer_remote_title": "ØĒŲØļŲ Ø§ŲØĩŲØą Ø§ŲØ¨ØšŲØ¯ØŠ",
|
"advanced_settings_prefer_remote_title": "ØĒŲØļŲ Ø§ŲØĩŲØą Ø§ŲØ¨ØšŲØ¯ØŠ",
|
||||||
"advanced_settings_proxy_headers_subtitle": "ØšØąŲ ØšŲØ§ŲŲŲ Ø§ŲŲŲŲŲ Ø§ŲØĒŲ ŲØŗØĒ؎دŲ
ŲØ§ Immich ŲØ§ØąØŗØ§Ų ŲŲ ØˇŲØ¨ شبŲŲ",
|
"advanced_settings_proxy_headers_subtitle": "ØšØąŲ ØšŲØ§ŲŲŲ Ø§ŲŲŲŲŲ Ø§ŲØĒŲ ŲØŗØĒ؎دŲ
ŲØ§ Immich ŲØ§ØąØŗØ§Ų ŲŲ ØˇŲØ¨ شبŲŲ",
|
||||||
"advanced_settings_proxy_headers_title": "ØšŲØ§ŲŲŲ Ø§ŲŲŲŲŲ",
|
"advanced_settings_proxy_headers_title": "ØšŲØ§ŲŲŲ Ø§ŲŲŲŲŲ",
|
||||||
@@ -393,6 +411,7 @@
|
|||||||
"album_cover_updated": "ØĒŲ
ØĒØØ¯ŲØĢ ØēŲØ§Ų Ø§ŲØŖŲبŲŲ
",
|
"album_cover_updated": "ØĒŲ
ØĒØØ¯ŲØĢ ØēŲØ§Ų Ø§ŲØŖŲبŲŲ
",
|
||||||
"album_delete_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØØ°Ų Ø§ŲØŖŲبŲŲ
{album}Ø",
|
"album_delete_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØØ°Ų Ø§ŲØŖŲبŲŲ
{album}Ø",
|
||||||
"album_delete_confirmation_description": "ØĨذا ØĒŲ
ØĒ Ų
Ø´Ø§ØąŲØŠ ŲØ°Ø§ Ø§ŲØŖŲبŲŲ
Ø ŲŲŲ ŲØĒŲ
ŲŲ Ø§ŲŲ
ØŗØĒ؎دŲ
ŲŲ Ø§ŲØĸØŽØąŲŲ Ų
Ų Ø§ŲŲØĩŲŲ ØĨŲŲŲ Ø¨ØšØ¯ Ø§ŲØĸŲ.",
|
"album_delete_confirmation_description": "ØĨذا ØĒŲ
ØĒ Ų
Ø´Ø§ØąŲØŠ ŲØ°Ø§ Ø§ŲØŖŲبŲŲ
Ø ŲŲŲ ŲØĒŲ
ŲŲ Ø§ŲŲ
ØŗØĒ؎دŲ
ŲŲ Ø§ŲØĸØŽØąŲŲ Ų
Ų Ø§ŲŲØĩŲŲ ØĨŲŲŲ Ø¨ØšØ¯ Ø§ŲØĸŲ.",
|
||||||
|
"album_deleted": "ØĒŲ
ØØ°Ų Ø§ŲØ§ŲبŲŲ
",
|
||||||
"album_info_card_backup_album_excluded": "Ų
ØŗØĒبؚد",
|
"album_info_card_backup_album_excluded": "Ų
ØŗØĒبؚد",
|
||||||
"album_info_card_backup_album_included": "Ų
ØĒØļŲ
ŲØŠ",
|
"album_info_card_backup_album_included": "Ų
ØĒØļŲ
ŲØŠ",
|
||||||
"album_info_updated": "ØĒŲ
ØĒØØ¯ŲØĢ Ų
ØšŲŲŲ
اØĒ Ø§ŲØŖŲبŲŲ
",
|
"album_info_updated": "ØĒŲ
ØĒØØ¯ŲØĢ Ų
ØšŲŲŲ
اØĒ Ø§ŲØŖŲبŲŲ
",
|
||||||
@@ -402,6 +421,7 @@
|
|||||||
"album_options": "ØĨؚداداØĒ Ø§ŲØŖŲبŲŲ
",
|
"album_options": "ØĨؚداداØĒ Ø§ŲØŖŲبŲŲ
",
|
||||||
"album_remove_user": "ŲŲ ØĒØąØēب ŲŲ ØĨØ˛Ø§ŲØŠ Ø§ŲŲ
ØŗØĒ؎دŲ
Ø",
|
"album_remove_user": "ŲŲ ØĒØąØēب ŲŲ ØĨØ˛Ø§ŲØŠ Ø§ŲŲ
ØŗØĒ؎دŲ
Ø",
|
||||||
"album_remove_user_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {user}Ø",
|
"album_remove_user_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {user}Ø",
|
||||||
|
"album_search_not_found": "ŲŲ
ŲØĒŲ
Ø§ŲØŦاد Ø§ŲØ¨ŲŲ
Ų
ØˇØ§Ø¨Ų ŲØ¨ØØĢŲ",
|
||||||
"album_share_no_users": "ŲØ¨Ø¯Ų ØŖŲŲ ŲŲ
ØĒ بŲ
Ø´Ø§ØąŲØŠ ŲØ°Ø§ Ø§ŲØŖŲبŲŲ
Ų
Øš ØŦŲ
ب𠨧ŲŲ
ØŗØĒ؎دŲ
ŲŲ ØŖŲ ŲŲØŗ ŲØ¯ŲŲ ØŖŲ Ų
ØŗØĒ؎دŲ
ŲŲŲ
Ø´Ø§ØąŲØŠ Ų
ØšŲ.",
|
"album_share_no_users": "ŲØ¨Ø¯Ų ØŖŲŲ ŲŲ
ØĒ بŲ
Ø´Ø§ØąŲØŠ ŲØ°Ø§ Ø§ŲØŖŲبŲŲ
Ų
Øš ØŦŲ
ب𠨧ŲŲ
ØŗØĒ؎دŲ
ŲŲ ØŖŲ ŲŲØŗ ŲØ¯ŲŲ ØŖŲ Ų
ØŗØĒ؎دŲ
ŲŲŲ
Ø´Ø§ØąŲØŠ Ų
ØšŲ.",
|
||||||
"album_updated": "ØĒŲ
ØĒØØ¯ŲØĢ Ø§ŲØŖŲبŲŲ
",
|
"album_updated": "ØĒŲ
ØĒØØ¯ŲØĢ Ø§ŲØŖŲبŲŲ
",
|
||||||
"album_updated_setting_description": "ØĒŲŲŲ ØĨØ´ØšØ§ØąŲØ§ ØšØ¨Øą Ø§ŲØ¨ØąŲد Ø§ŲØĨŲŲØĒØąŲŲŲ ØšŲØ¯Ų
ا ŲØØĒŲŲ Ø§ŲØŖŲبŲŲ
اŲŲ
Ø´ØĒØąŲ ØšŲŲ Ų
ØØĒŲŲØ§ØĒ ØŦØ¯ŲØ¯ØŠ",
|
"album_updated_setting_description": "ØĒŲŲŲ ØĨØ´ØšØ§ØąŲØ§ ØšØ¨Øą Ø§ŲØ¨ØąŲد Ø§ŲØĨŲŲØĒØąŲŲŲ ØšŲØ¯Ų
ا ŲØØĒŲŲ Ø§ŲØŖŲبŲŲ
اŲŲ
Ø´ØĒØąŲ ØšŲŲ Ų
ØØĒŲŲØ§ØĒ ØŦØ¯ŲØ¯ØŠ",
|
||||||
@@ -421,6 +441,7 @@
|
|||||||
"albums_default_sort_order": "ØĒØąØĒŲØ¨ Ø§ŲØŖŲبŲŲ
Ø§ŲØ§ŲØĒØąØ§ØļŲ",
|
"albums_default_sort_order": "ØĒØąØĒŲØ¨ Ø§ŲØŖŲبŲŲ
Ø§ŲØ§ŲØĒØąØ§ØļŲ",
|
||||||
"albums_default_sort_order_description": "ØĒØąØĒŲØ¨ بਞ Ø§ŲØŖØĩŲŲ Ø§ŲØŖŲŲŲ ØšŲØ¯ ØĨŲØ´Ø§ØĄ ØŖŲØ¨ŲŲ
اØĒ ØŦØ¯ŲØ¯ØŠ.",
|
"albums_default_sort_order_description": "ØĒØąØĒŲØ¨ بਞ Ø§ŲØŖØĩŲŲ Ø§ŲØŖŲŲŲ ØšŲØ¯ ØĨŲØ´Ø§ØĄ ØŖŲØ¨ŲŲ
اØĒ ØŦØ¯ŲØ¯ØŠ.",
|
||||||
"albums_feature_description": "Ų
ØŦŲ
ŲØšØŠ Ų
Ų Ø§ŲØŖØĩŲŲ Ø§ŲØĒŲ ŲŲ
ŲŲ Ų
Ø´Ø§ØąŲØĒŲØ§ Ų
Øš Ų
ØŗØĒ؎دŲ
ŲŲ ØĸØŽØąŲŲ.",
|
"albums_feature_description": "Ų
ØŦŲ
ŲØšØŠ Ų
Ų Ø§ŲØŖØĩŲŲ Ø§ŲØĒŲ ŲŲ
ŲŲ Ų
Ø´Ø§ØąŲØĒŲØ§ Ų
Øš Ų
ØŗØĒ؎دŲ
ŲŲ ØĸØŽØąŲŲ.",
|
||||||
|
"albums_on_device_count": "ؚدد Ø§ŲØ§ŲبŲŲ
اØĒ ØšŲŲ Ø§ŲØŦŲØ§Ø˛ ({count})",
|
||||||
"all": "اŲŲŲ",
|
"all": "اŲŲŲ",
|
||||||
"all_albums": "ØŦŲ
ب𠨧بŖŲبŲŲ
اØĒ",
|
"all_albums": "ØŦŲ
ب𠨧بŖŲبŲŲ
اØĒ",
|
||||||
"all_people": "ØŦŲ
ب𠨧بŖØ´ØŽØ§Øĩ",
|
"all_people": "ØŦŲ
ب𠨧بŖØ´ØŽØ§Øĩ",
|
||||||
@@ -435,7 +456,7 @@
|
|||||||
"api_key_description": "ØŗŲØĒŲ
ØšØąØļ ŲØ°Ų اŲŲŲŲ
ØŠ Ų
ØąØŠ ŲØ§ØØ¯ØŠ ŲŲØˇ. ŲØąØŦŲ Ø§ŲØĒØŖŲد Ų
Ų ŲØŗØŽŲا ŲØ¨Ų ØĨØēŲØ§Ų اŲŲØ§Ųذ؊.",
|
"api_key_description": "ØŗŲØĒŲ
ØšØąØļ ŲØ°Ų اŲŲŲŲ
ØŠ Ų
ØąØŠ ŲØ§ØØ¯ØŠ ŲŲØˇ. ŲØąØŦŲ Ø§ŲØĒØŖŲد Ų
Ų ŲØŗØŽŲا ŲØ¨Ų ØĨØēŲØ§Ų اŲŲØ§Ųذ؊.",
|
||||||
"api_key_empty": "ŲØŦب ØŖŲØ§ ŲŲŲŲ Ø§ØŗŲ
Ų
ŲØĒØ§Ø API ŲØ§ØąØēŲØ§",
|
"api_key_empty": "ŲØŦب ØŖŲØ§ ŲŲŲŲ Ø§ØŗŲ
Ų
ŲØĒØ§Ø API ŲØ§ØąØēŲØ§",
|
||||||
"api_keys": "Ų
ŲØ§ØĒŲØ API",
|
"api_keys": "Ų
ŲØ§ØĒŲØ API",
|
||||||
"app_bar_signout_dialog_content": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ Ø§ŲØŽØąŲØŦ",
|
"app_bar_signout_dialog_content": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĒØŗØŦŲŲ Ø§ŲØŽØąŲØŦØ",
|
||||||
"app_bar_signout_dialog_ok": "ŲØšŲ
",
|
"app_bar_signout_dialog_ok": "ŲØšŲ
",
|
||||||
"app_bar_signout_dialog_title": "ØŽØąŲØŦ",
|
"app_bar_signout_dialog_title": "ØŽØąŲØŦ",
|
||||||
"app_settings": "ØĨؚداداØĒ Ø§ŲØĒØˇØ¨ŲŲ",
|
"app_settings": "ØĨؚداداØĒ Ø§ŲØĒØˇØ¨ŲŲ",
|
||||||
@@ -504,6 +525,7 @@
|
|||||||
"back_close_deselect": "Ø§ŲØąØŦŲØš ØŖŲ Ø§ŲØĨØēŲØ§Ų ØŖŲ ØĨŲØēØ§ØĄ Ø§ŲØĒØØ¯ŲØ¯",
|
"back_close_deselect": "Ø§ŲØąØŦŲØš ØŖŲ Ø§ŲØĨØēŲØ§Ų ØŖŲ ØĨŲØēØ§ØĄ Ø§ŲØĒØØ¯ŲØ¯",
|
||||||
"background_location_permission": "Ø§Ø°Ų Ø§ŲŲØĩŲŲ ŲŲŲ
ŲŲØš ŲŲ Ø§ŲØŽŲŲŲØŠ",
|
"background_location_permission": "Ø§Ø°Ų Ø§ŲŲØĩŲŲ ŲŲŲ
ŲŲØš ŲŲ Ø§ŲØŽŲŲŲØŠ",
|
||||||
"background_location_permission_content": "ŲŲØĒŲ
ŲŲ Ų
Ų ØĒبدŲŲ Ø§ŲØ´Ø¨ŲŲ Ø¨Ø§ŲØŽŲŲŲØŠØ Immich ŲØØĒاØŦ*داØĻŲ
ا* ŲŲØØĩŲŲ ØšŲŲ Ų
Ųب𠨝ŲŲŲ ŲŲØĒŲ
ŲŲ Ø§ŲØĒØˇØ¨ŲŲ Ų
Ų ŲØąØ§ØĻØŠ Ø§ØŗŲ
Ø´Ø¨ŲØŠ Ø§ŲWi-Fi",
|
"background_location_permission_content": "ŲŲØĒŲ
ŲŲ Ų
Ų ØĒبدŲŲ Ø§ŲØ´Ø¨ŲŲ Ø¨Ø§ŲØŽŲŲŲØŠØ Immich ŲØØĒاØŦ*داØĻŲ
ا* ŲŲØØĩŲŲ ØšŲŲ Ų
Ųب𠨝ŲŲŲ ŲŲØĒŲ
ŲŲ Ø§ŲØĒØˇØ¨ŲŲ Ų
Ų ŲØąØ§ØĻØŠ Ø§ØŗŲ
Ø´Ø¨ŲØŠ Ø§ŲWi-Fi",
|
||||||
|
"backup": "ŲØŗØŽ Ø§ØØĒŲØ§ØˇŲ",
|
||||||
"backup_album_selection_page_albums_device": "Ø§ŲØ§ŲبŲŲ
اØĒ ØšŲŲ Ø§ŲØŦŲØ§Ø˛ ({count})",
|
"backup_album_selection_page_albums_device": "Ø§ŲØ§ŲبŲŲ
اØĒ ØšŲŲ Ø§ŲØŦŲØ§Ø˛ ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "اŲŲØą ŲŲØĒØļŲ
ŲŲØ ŲØ§ŲŲØą ŲŲØąŲا Ų
Ø˛Ø¯ŲØŦŲØ§ ŲŲØ§ØŗØĒØĢŲØ§ØĄ",
|
"backup_album_selection_page_albums_tap": "اŲŲØą ŲŲØĒØļŲ
ŲŲØ ŲØ§ŲŲØą ŲŲØąŲا Ų
Ø˛Ø¯ŲØŦŲØ§ ŲŲØ§ØŗØĒØĢŲØ§ØĄ",
|
||||||
"backup_album_selection_page_assets_scatter": "ŲŲ
ŲŲ ØŖŲ ØĒŲØĒØ´Øą Ø§ŲØŖØĩŲŲ ØšØ¨Øą ØŖŲØ¨ŲŲ
اØĒ Ų
ØĒؚدد؊. ŲØ¨Ø§ŲØĒاŲŲØ ŲŲ
ŲŲ ØĒØļŲ
ŲŲ Ø§ŲØŖŲبŲŲ
اØĒ ØŖŲ Ø§ØŗØĒØ¨ØšØ§Ø¯ŲØ§ ØŖØĢŲØ§ØĄ ØšŲ
ŲŲØŠ Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ.",
|
"backup_album_selection_page_assets_scatter": "ŲŲ
ŲŲ ØŖŲ ØĒŲØĒØ´Øą Ø§ŲØŖØĩŲŲ ØšØ¨Øą ØŖŲØ¨ŲŲ
اØĒ Ų
ØĒؚدد؊. ŲØ¨Ø§ŲØĒاŲŲØ ŲŲ
ŲŲ ØĒØļŲ
ŲŲ Ø§ŲØŖŲبŲŲ
اØĒ ØŖŲ Ø§ØŗØĒØ¨ØšØ§Ø¯ŲØ§ ØŖØĢŲØ§ØĄ ØšŲ
ŲŲØŠ Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ.",
|
||||||
@@ -564,9 +586,13 @@
|
|||||||
"backup_manual_in_progress": "ŲŲØ¯ Ø§ŲØĒØŲ
ŲŲ ØØ§ŲŲ Ų
ØąŲ Ø§ØŽØąŲ",
|
"backup_manual_in_progress": "ŲŲØ¯ Ø§ŲØĒØŲ
ŲŲ ØØ§ŲŲ Ų
ØąŲ Ø§ØŽØąŲ",
|
||||||
"backup_manual_success": "ŲØŦاØ",
|
"backup_manual_success": "ŲØŦاØ",
|
||||||
"backup_manual_title": "ØØ§ŲØŠ Ø§ŲØĒØŲ
ŲŲ",
|
"backup_manual_title": "ØØ§ŲØŠ Ø§ŲØĒØŲ
ŲŲ",
|
||||||
|
"backup_options": "ØŽŲØ§ØąØ§ØĒ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
||||||
"backup_options_page_title": "ØŽŲØ§ØąØ§ØĒ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
"backup_options_page_title": "ØŽŲØ§ØąØ§ØĒ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
||||||
"backup_setting_subtitle": "Ø§Ø¯Ø§ØąØŠ اؚداداØĒ Ø§ŲØĒØŲ
ŲŲ ŲŲ Ø§ŲØŽŲŲŲØŠ ŲØ§ŲŲ
ŲØ¯Ų
ØŠ",
|
"backup_setting_subtitle": "Ø§Ø¯Ø§ØąØŠ اؚداداØĒ Ø§ŲØĒØŲ
ŲŲ ŲŲ Ø§ŲØŽŲŲŲØŠ ŲØ§ŲŲ
ŲØ¯Ų
ØŠ",
|
||||||
|
"backup_settings_subtitle": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ Ø§ŲØĒØŲ
ŲŲ",
|
||||||
"backward": "اŲŲ Ø§ŲŲØąØ§ØĄ",
|
"backward": "اŲŲ Ø§ŲŲØąØ§ØĄ",
|
||||||
|
"beta_sync": "ØØ§ŲØŠ اŲŲ
Ø˛Ø§Ų
ŲØŠ Ø§ŲØĒØŦØąŲØ¨ŲØŠ",
|
||||||
|
"beta_sync_subtitle": "Ø§Ø¯Ø§ØąØŠ ŲØ¸Ø§Ų
اŲŲ
Ø˛Ø§Ų
ŲØŠ Ø§ŲØŦØ¯ŲØ¯",
|
||||||
"biometric_auth_enabled": "اŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨Ø§ŲŲŲ
ØĒØąŲØŠ Ų
ŲØšŲŲ",
|
"biometric_auth_enabled": "اŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨Ø§ŲŲŲ
ØĒØąŲØŠ Ų
ŲØšŲŲ",
|
||||||
"biometric_locked_out": "ŲŲØ¯ ŲŲŲØĒ ØšŲŲ Ø§ŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨ŲŲŲ
ØĒØąŲØŠ",
|
"biometric_locked_out": "ŲŲØ¯ ŲŲŲØĒ ØšŲŲ Ø§ŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨ŲŲŲ
ØĒØąŲØŠ",
|
||||||
"biometric_no_options": "ŲØ§ ØĒŲØŦد ØŽŲØ§ØąØ§ØĒ باŲŲŲ
ØĒØąŲØŠ Ų
ØĒŲŲØąØŠ",
|
"biometric_no_options": "ŲØ§ ØĒŲØŦد ØŽŲØ§ØąØ§ØĒ باŲŲŲ
ØĒØąŲØŠ Ų
ØĒŲŲØąØŠ",
|
||||||
@@ -584,7 +610,7 @@
|
|||||||
"cache_settings_clear_cache_button": "Ų
ØŗØ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ",
|
"cache_settings_clear_cache_button": "Ų
ØŗØ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ",
|
||||||
"cache_settings_clear_cache_button_title": "ŲŲŲŲ
بŲ
ØŗØ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ ŲŲØĒØˇØ¨ŲŲ.ØŗŲØ¤ØĢØą ŲØ°Ø§ بشŲŲ ŲØ¨ŲØą ØšŲŲ ØŖØ¯Ø§ØĄ Ø§ŲØĒØˇØ¨ŲŲ ØØĒŲ ØĨؚاد؊ Ø¨ŲØ§ØĄ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ.",
|
"cache_settings_clear_cache_button_title": "ŲŲŲŲ
بŲ
ØŗØ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ ŲŲØĒØˇØ¨ŲŲ.ØŗŲØ¤ØĢØą ŲØ°Ø§ بشŲŲ ŲØ¨ŲØą ØšŲŲ ØŖØ¯Ø§ØĄ Ø§ŲØĒØˇØ¨ŲŲ ØØĒŲ ØĨؚاد؊ Ø¨ŲØ§ØĄ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ.",
|
||||||
"cache_settings_duplicated_assets_clear_button": "ŲØ§ØļØ",
|
"cache_settings_duplicated_assets_clear_button": "ŲØ§ØļØ",
|
||||||
"cache_settings_duplicated_assets_subtitle": "Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲØĒŲ ØĒŲ
ØĒØŦاŲŲŲØ§ اŲŲ
Ø¯ØąØŦØŠ ŲŲ Ø§ŲØĒØˇØ¨ŲŲ",
|
"cache_settings_duplicated_assets_subtitle": "Ø§ŲØĩŲØą ŲØ§ŲŲŲØ¯ŲŲŲØ§ØĒ اŲŲØĒŲ ØĒŲ
ØĒØŦاŲŲŲØ§ ŲŲ Ø§ŲØĒØˇØ¨ŲŲ",
|
||||||
"cache_settings_duplicated_assets_title": "Ø§ŲØ§ØĩŲŲ Ø§ŲŲ
ŲØąØąØŠ ({count})",
|
"cache_settings_duplicated_assets_title": "Ø§ŲØ§ØĩŲŲ Ø§ŲŲ
ŲØąØąØŠ ({count})",
|
||||||
"cache_settings_statistics_album": "Ų
ŲØĒØ¨Ų Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąŲ",
|
"cache_settings_statistics_album": "Ų
ŲØĒØ¨Ų Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąŲ",
|
||||||
"cache_settings_statistics_full": "ØĩŲØą ŲØ§Ų
ŲØŠ",
|
"cache_settings_statistics_full": "ØĩŲØą ŲØ§Ų
ŲØŠ",
|
||||||
@@ -601,6 +627,7 @@
|
|||||||
"cancel": "ØĨŲØēØ§ØĄ",
|
"cancel": "ØĨŲØēØ§ØĄ",
|
||||||
"cancel_search": "Ø§ŲØēØ§ØĄ Ø§ŲØ¨ØØĢ",
|
"cancel_search": "Ø§ŲØēØ§ØĄ Ø§ŲØ¨ØØĢ",
|
||||||
"canceled": "ØĒŲ
Ø§ŲØ§ŲØēØ§ØĄ",
|
"canceled": "ØĒŲ
Ø§ŲØ§ŲØēØ§ØĄ",
|
||||||
|
"canceling": "ØŦØ§ØąŲ Ø§ŲØ§ŲØēØ§ØĄ",
|
||||||
"cannot_merge_people": "ŲØ§ ŲŲ
ŲŲ Ø¯Ų
ØŦ Ø§ŲØŖØ´ØŽØ§Øĩ",
|
"cannot_merge_people": "ŲØ§ ŲŲ
ŲŲ Ø¯Ų
ØŦ Ø§ŲØŖØ´ØŽØ§Øĩ",
|
||||||
"cannot_undo_this_action": "ŲØ§ ŲŲ
ŲŲŲ Ø§ŲØĒØąØ§ØŦØš ØšŲ ŲØ°Ø§ Ø§ŲØĨØŦØąØ§ØĄ!",
|
"cannot_undo_this_action": "ŲØ§ ŲŲ
ŲŲŲ Ø§ŲØĒØąØ§ØŦØš ØšŲ ŲØ°Ø§ Ø§ŲØĨØŦØąØ§ØĄ!",
|
||||||
"cannot_update_the_description": "ŲØ§ ŲŲ
ŲŲ ØĒØØ¯ŲØĢ اŲŲØĩŲ",
|
"cannot_update_the_description": "ŲØ§ ŲŲ
ŲŲ ØĒØØ¯ŲØĢ اŲŲØĩŲ",
|
||||||
@@ -616,7 +643,7 @@
|
|||||||
"change_password": "ØĒØēŲŲØą ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
"change_password": "ØĒØēŲŲØą ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||||
"change_password_description": "ŲØ°Ų ØĨŲ
ا ŲŲ Ø§ŲŲ
ØąØŠ Ø§ŲØŖŲŲŲ Ø§ŲØĒŲ ØĒŲŲŲ
ŲŲŲØ§ بØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ ØĨŲŲ Ø§ŲŲØ¸Ø§Ų
ØŖŲ ØŖŲŲ ØĒŲ
ØĒŲØ¯ŲŲ
ØˇŲØ¨ ŲØĒØēŲŲØą ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§Ų؎اØĩØŠ بŲ. Ø§ŲØąØŦØ§ØĄ ØĨØ¯ØŽØ§Ų ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§ŲØŦØ¯ŲØ¯ØŠ ØŖØ¯ŲØ§Ų.",
|
"change_password_description": "ŲØ°Ų ØĨŲ
ا ŲŲ Ø§ŲŲ
ØąØŠ Ø§ŲØŖŲŲŲ Ø§ŲØĒŲ ØĒŲŲŲ
ŲŲŲØ§ بØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ ØĨŲŲ Ø§ŲŲØ¸Ø§Ų
ØŖŲ ØŖŲŲ ØĒŲ
ØĒŲØ¯ŲŲ
ØˇŲØ¨ ŲØĒØēŲŲØą ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§Ų؎اØĩØŠ بŲ. Ø§ŲØąØŦØ§ØĄ ØĨØ¯ØŽØ§Ų ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§ŲØŦØ¯ŲØ¯ØŠ ØŖØ¯ŲØ§Ų.",
|
||||||
"change_password_form_confirm_password": "ØĒØŖŲŲØ¯ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
"change_password_form_confirm_password": "ØĒØŖŲŲØ¯ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||||
"change_password_form_description": "Ų
ØąØØ¨Ųا ØŲØ°Ų ŲŲ Ø§ŲŲ
ØąØŠ Ø§ŲØŖŲŲŲ Ø§ŲØĒŲ ØĒŲŲŲ
ŲŲŲØ§ Ø¨Ø§ŲØĒØŗØŦŲŲ ŲŲ Ø§ŲŲØ¸Ø§Ų
ØŖŲ ØĒŲ
ØĒŲØ¯ŲŲ
ØˇŲØ¨ ŲØĒØēŲŲØą ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§Ų؎اØĩØŠ بŲ.Ø§ŲØąØŦØ§ØĄ ØĨØ¯ØŽØ§Ų ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§ŲØŦØ¯ŲØ¯ØŠ ØŖØ¯ŲØ§Ų",
|
"change_password_form_description": "Ų
ØąØØ¨Ųا {name}Ø\n\nاŲ
ا Ø§Ų ØĒŲŲŲ ŲØ°Ų ŲŲ Ø§ŲŲ
ØąØŠ Ø§ŲØŖŲŲŲ Ø§ŲØĒŲ ØĒŲŲŲ
ŲŲŲØ§ Ø¨Ø§ŲØĒØŗØŦŲŲ ŲŲ Ø§ŲŲØ¸Ø§Ų
ØŖŲ ØĒŲ
ØĒŲØ¯ŲŲ
ØˇŲØ¨ ŲØĒØēŲŲØą ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§Ų؎اØĩØŠ بŲ. Ø§ŲØąØŦØ§ØĄ ØĨØ¯ØŽØ§Ų ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§ŲØŦØ¯ŲØ¯ØŠ ØŖØ¯ŲØ§Ų.",
|
||||||
"change_password_form_new_password": "ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§ŲØŦØ¯ŲØ¯ØŠ",
|
"change_password_form_new_password": "ŲŲŲ
ØŠ اŲŲ
ØąŲØą Ø§ŲØŦØ¯ŲØ¯ØŠ",
|
||||||
"change_password_form_password_mismatch": "ŲŲŲ
ØŠ اŲŲ
ØąŲØą ØēŲØą Ų
ØˇØ§Ø¨ŲØŠ",
|
"change_password_form_password_mismatch": "ŲŲŲ
ØŠ اŲŲ
ØąŲØą ØēŲØą Ų
ØˇØ§Ø¨ŲØŠ",
|
||||||
"change_password_form_reenter_new_password": "ØŖØšØ¯ ØĨØ¯ØŽØ§Ų ŲŲŲ
ØŠ Ų
ØąŲØą ØŦØ¯ŲØ¯ØŠ",
|
"change_password_form_reenter_new_password": "ØŖØšØ¯ ØĨØ¯ØŽØ§Ų ŲŲŲ
ØŠ Ų
ØąŲØą ØŦØ¯ŲØ¯ØŠ",
|
||||||
@@ -632,6 +659,7 @@
|
|||||||
"clear": "ØĨØŽŲØ§ØĄ",
|
"clear": "ØĨØŽŲØ§ØĄ",
|
||||||
"clear_all": "ØĨØŽŲØ§ØĄ اŲŲŲ",
|
"clear_all": "ØĨØŽŲØ§ØĄ اŲŲŲ",
|
||||||
"clear_all_recent_searches": "Ų
ØŗØ ØŦŲ
ŲØš ØšŲ
ŲŲØ§ØĒ Ø§ŲØ¨ØØĢ Ø§ŲØŖØŽŲØąØŠ",
|
"clear_all_recent_searches": "Ų
ØŗØ ØŦŲ
ŲØš ØšŲ
ŲŲØ§ØĒ Ø§ŲØ¨ØØĢ Ø§ŲØŖØŽŲØąØŠ",
|
||||||
|
"clear_file_cache": "Ų
ØŗØ Ø°Ø§ŲØąØŠ Ø§ŲØĒØŽØ˛ŲŲ Ø§ŲŲ
Ø¤ŲØĒ ŲŲŲ
ŲŲØ§ØĒ",
|
||||||
"clear_message": "ØĨØŽŲØ§ØĄ Ø§ŲØąØŗØ§ŲØŠ",
|
"clear_message": "ØĨØŽŲØ§ØĄ Ø§ŲØąØŗØ§ŲØŠ",
|
||||||
"clear_value": "ØĨØŽŲØ§ØĄ اŲŲŲŲ
ØŠ",
|
"clear_value": "ØĨØŽŲØ§ØĄ اŲŲŲŲ
ØŠ",
|
||||||
"client_cert_dialog_msg_confirm": "ØØŗŲا",
|
"client_cert_dialog_msg_confirm": "ØØŗŲا",
|
||||||
@@ -702,6 +730,7 @@
|
|||||||
"create_new_user": "ØĨŲØ´Ø§ØĄ Ų
ØŗØĒ؎دŲ
ØŦØ¯ŲØ¯",
|
"create_new_user": "ØĨŲØ´Ø§ØĄ Ų
ØŗØĒ؎دŲ
ØŦØ¯ŲØ¯",
|
||||||
"create_shared_album_page_share_add_assets": "ØĨØļØ§ŲØŠ Ø§ŲØŖØĩŲŲ",
|
"create_shared_album_page_share_add_assets": "ØĨØļØ§ŲØŠ Ø§ŲØŖØĩŲŲ",
|
||||||
"create_shared_album_page_share_select_photos": "ØØ¯Ø¯ Ø§ŲØĩŲØą",
|
"create_shared_album_page_share_select_photos": "ØØ¯Ø¯ Ø§ŲØĩŲØą",
|
||||||
|
"create_shared_link": "Ø§ŲØ´Ø§ØĄ ØąØ§Ø¨Øˇ Ų
Ø´ØĒØąŲ",
|
||||||
"create_tag": "ØĨŲØ´Ø§ØĄ ØšŲØ§Ų
ØŠ",
|
"create_tag": "ØĨŲØ´Ø§ØĄ ØšŲØ§Ų
ØŠ",
|
||||||
"create_tag_description": "ØŖŲØ´ØĻ ØšŲØ§Ų
ØŠ ØŦØ¯ŲØ¯ØŠ. باŲŲØŗØ¨ØŠ ŲŲØšŲاŲ
اØĒ اŲŲ
ØĒØ¯Ø§ØŽŲØŠØ ŲØąØŦŲ ØĨØ¯ØŽØ§Ų Ø§ŲŲ
ØŗØ§Øą اŲŲØ§Ų
Ų ŲŲØšŲاŲ
ØŠ بŲ
ا ŲŲ Ø°ŲŲ Ø§ŲØŽØˇŲØˇ اŲŲ
اØĻŲØŠ ŲŲØŖŲ
اŲ
.",
|
"create_tag_description": "ØŖŲØ´ØĻ ØšŲØ§Ų
ØŠ ØŦØ¯ŲØ¯ØŠ. باŲŲØŗØ¨ØŠ ŲŲØšŲاŲ
اØĒ اŲŲ
ØĒØ¯Ø§ØŽŲØŠØ ŲØąØŦŲ ØĨØ¯ØŽØ§Ų Ø§ŲŲ
ØŗØ§Øą اŲŲØ§Ų
Ų ŲŲØšŲاŲ
ØŠ بŲ
ا ŲŲ Ø°ŲŲ Ø§ŲØŽØˇŲØˇ اŲŲ
اØĻŲØŠ ŲŲØŖŲ
اŲ
.",
|
||||||
"create_user": "ØĨŲØ´Ø§ØĄ Ų
ØŗØĒ؎دŲ
",
|
"create_user": "ØĨŲØ´Ø§ØĄ Ų
ØŗØĒ؎دŲ
",
|
||||||
@@ -714,6 +743,7 @@
|
|||||||
"current_server_address": "ØšŲŲØ§Ų Ø§ŲØŽØ§Ø¯Ų
Ø§ŲØØ§ŲŲ",
|
"current_server_address": "ØšŲŲØ§Ų Ø§ŲØŽØ§Ø¯Ų
Ø§ŲØØ§ŲŲ",
|
||||||
"custom_locale": "ŲØēØŠ Ų
ØŽØĩØĩØŠ",
|
"custom_locale": "ŲØēØŠ Ų
ØŽØĩØĩØŠ",
|
||||||
"custom_locale_description": "ØĒŲØŗŲŲ Ø§ŲØĒŲØ§ØąŲØŽ ŲØ§ŲØŖØąŲØ§Ų
Ø¨ŲØ§ØĄŲ ØšŲŲ Ø§ŲŲØēØŠ ŲØ§ŲŲ
ŲØˇŲØŠ",
|
"custom_locale_description": "ØĒŲØŗŲŲ Ø§ŲØĒŲØ§ØąŲØŽ ŲØ§ŲØŖØąŲØ§Ų
Ø¨ŲØ§ØĄŲ ØšŲŲ Ø§ŲŲØēØŠ ŲØ§ŲŲ
ŲØˇŲØŠ",
|
||||||
|
"custom_url": "ØąØ§Ø¨Øˇ Ų
ØŽØĩØĩ",
|
||||||
"daily_title_text_date": "E Ø MMM DD",
|
"daily_title_text_date": "E Ø MMM DD",
|
||||||
"daily_title_text_date_year": "E Ø MMM DD Ø yyyy",
|
"daily_title_text_date_year": "E Ø MMM DD Ø yyyy",
|
||||||
"dark": "Ų
ØšØĒŲ
",
|
"dark": "Ų
ØšØĒŲ
",
|
||||||
@@ -725,6 +755,7 @@
|
|||||||
"date_of_birth_saved": "ØĒŲ
ØŲظ ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯ Ø¨ŲØŦاØ",
|
"date_of_birth_saved": "ØĒŲ
ØŲظ ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯ Ø¨ŲØŦاØ",
|
||||||
"date_range": "ŲØˇØ§Ų اŲŲ
ŲØšØ¯",
|
"date_range": "ŲØˇØ§Ų اŲŲ
ŲØšØ¯",
|
||||||
"day": "ŲŲŲ
",
|
"day": "ŲŲŲ
",
|
||||||
|
"days": "Ø§ŲØ§Ų
",
|
||||||
"deduplicate_all": "ØĨŲØēØ§ØĄ ØĒŲØąØ§Øą اŲŲŲ",
|
"deduplicate_all": "ØĨŲØēØ§ØĄ ØĒŲØąØ§Øą اŲŲŲ",
|
||||||
"deduplication_criteria_1": "ØØŦŲ
Ø§ŲØĩŲØąØŠ Ø¨ŲØØ¯Ø§ØĒ Ø§ŲØ¨Ø§ŲØĒ",
|
"deduplication_criteria_1": "ØØŦŲ
Ø§ŲØĩŲØąØŠ Ø¨ŲØØ¯Ø§ØĒ Ø§ŲØ¨Ø§ŲØĒ",
|
||||||
"deduplication_criteria_2": "ؚدد Ø¨ŲØ§ŲاØĒ EXIF",
|
"deduplication_criteria_2": "ؚدد Ø¨ŲØ§ŲاØĒ EXIF",
|
||||||
@@ -733,7 +764,8 @@
|
|||||||
"default_locale": "اŲŲØēØŠ Ø§ŲØ§ŲØĒØąØ§ØļŲØŠ",
|
"default_locale": "اŲŲØēØŠ Ø§ŲØ§ŲØĒØąØ§ØļŲØŠ",
|
||||||
"default_locale_description": "ØĒŲØŗŲŲ Ø§ŲØĒŲØ§ØąŲØŽ ŲØ§ŲØŖØąŲØ§Ų
Ø¨ŲØ§ØĄŲ ØšŲŲ ŲØēØŠ اŲŲ
ØĒØĩŲØ Ø§ŲØŽØ§Øĩ بŲ",
|
"default_locale_description": "ØĒŲØŗŲŲ Ø§ŲØĒŲØ§ØąŲØŽ ŲØ§ŲØŖØąŲØ§Ų
Ø¨ŲØ§ØĄŲ ØšŲŲ ŲØēØŠ اŲŲ
ØĒØĩŲØ Ø§ŲØŽØ§Øĩ بŲ",
|
||||||
"delete": "ØØ°Ų",
|
"delete": "ØØ°Ų",
|
||||||
"delete_action_prompt": "{count} ØØ°Ų بشŲŲ ŲŲØ§ØĻŲ",
|
"delete_action_confirmation_message": "ŲŲ Ø§ŲØĒ Ų
ØĒØŖŲØ¯ Ų
Ų ØØ°Ų ŲØ°Ø§ اŲŲ
ŲŲØ ŲØ°Ø§ ØŗØ¤Ø¯Ų Ø§ŲŲ ŲŲŲ Ø§ŲŲ
ŲŲ Ø§ŲŲ ØŗŲØŠ Ų
ŲŲ
ŲØ§ØĒ Ø§ŲØŽØ§Ø¯Ų
ŲØŗŲØĒŲ
Ø§Ø´ØšØ§ØąŲ Ø§Ų ŲŲØĒ ØĒØąŲØ¯ ØØ°ŲŲ ØšŲŲ Ø§ŲØŦŲØ§Ø˛",
|
||||||
|
"delete_action_prompt": "ØĒŲ
ØØ°Ų {count}",
|
||||||
"delete_album": "ØØ°Ų Ø§ŲØŖŲبŲŲ
",
|
"delete_album": "ØØ°Ų Ø§ŲØŖŲبŲŲ
",
|
||||||
"delete_api_key_prompt": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØØ°Ų Ų
ŲØĒØ§Ø API ŲØ°Ø§Ø",
|
"delete_api_key_prompt": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØØ°Ų Ų
ŲØĒØ§Ø API ŲØ°Ø§Ø",
|
||||||
"delete_dialog_alert": "ŲØ°Ų Ø§ŲØšŲاØĩØą ØŗŲØĒŲ
ØØ°ŲŲØ§ بشŲŲ Ø¯Ø§ØĻŲ
Ų
Ų Immich Ų Ų
Ų ØŦŲØ§Ø˛Ų",
|
"delete_dialog_alert": "ŲØ°Ų Ø§ŲØšŲاØĩØą ØŗŲØĒŲ
ØØ°ŲŲØ§ بشŲŲ Ø¯Ø§ØĻŲ
Ų
Ų Immich Ų Ų
Ų ØŦŲØ§Ø˛Ų",
|
||||||
@@ -747,9 +779,12 @@
|
|||||||
"delete_key": "ØØ°Ų اŲŲ
ŲØĒØ§Ø",
|
"delete_key": "ØØ°Ų اŲŲ
ŲØĒØ§Ø",
|
||||||
"delete_library": "ØØ°Ų اŲŲ
ŲØĒØ¨ØŠ",
|
"delete_library": "ØØ°Ų اŲŲ
ŲØĒØ¨ØŠ",
|
||||||
"delete_link": "ØØ°Ų Ø§ŲØąØ§Ø¨Øˇ",
|
"delete_link": "ØØ°Ų Ø§ŲØąØ§Ø¨Øˇ",
|
||||||
|
"delete_local_action_prompt": "ØĒŲ
ØØ°Ų {count} Ų
Ų Ø§ŲØŦŲØ§Ø˛",
|
||||||
"delete_local_dialog_ok_backed_up_only": "ØØ°Ų اŲŲØŗØŽØŠ Ø§ŲØ§ØØĒŲØ§ØˇŲØŠ ŲŲØˇ",
|
"delete_local_dialog_ok_backed_up_only": "ØØ°Ų اŲŲØŗØŽØŠ Ø§ŲØ§ØØĒŲØ§ØˇŲØŠ ŲŲØˇ",
|
||||||
"delete_local_dialog_ok_force": "Ø§ØØ°Ų ØšŲŲ ØŖŲ ØØ§Ų",
|
"delete_local_dialog_ok_force": "Ø§ØØ°Ų ØšŲŲ ØŖŲ ØØ§Ų",
|
||||||
"delete_others": "ØØ°Ų Ø§ŲØŖØŽØąŲ",
|
"delete_others": "ØØ°Ų Ø§ŲØŖØŽØąŲ",
|
||||||
|
"delete_permanently": "ØØ°Ų بشŲŲ ŲŲØ§ØĻŲ",
|
||||||
|
"delete_permanently_action_prompt": "ØĒŲ
ØØ°Ų {count} بشŲŲ ŲŲØ§ØĻŲ",
|
||||||
"delete_shared_link": "ØØ°Ų Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
"delete_shared_link": "ØØ°Ų Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||||
"delete_shared_link_dialog_title": "ØØ°Ų Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
"delete_shared_link_dialog_title": "ØØ°Ų Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||||
"delete_tag": "ØØ°Ų Ø§ŲØšŲاŲ
ØŠ",
|
"delete_tag": "ØØ°Ų Ø§ŲØšŲاŲ
ØŠ",
|
||||||
@@ -760,6 +795,7 @@
|
|||||||
"description": "ŲØĩŲ",
|
"description": "ŲØĩŲ",
|
||||||
"description_input_hint_text": "اØļŲ ŲØĩŲØ§...",
|
"description_input_hint_text": "اØļŲ ŲØĩŲØ§...",
|
||||||
"description_input_submit_error": "ØŽØˇØŖ ØĒØØ¯ŲØĢ اŲŲØĩŲ Ø ØĒØŲŲ Ų
Ų Ø§ŲØŗØŦŲ ŲŲ
Ø˛ŲØ¯ Ų
Ų Ø§ŲØĒŲØ§ØĩŲŲ",
|
"description_input_submit_error": "ØŽØˇØŖ ØĒØØ¯ŲØĢ اŲŲØĩŲ Ø ØĒØŲŲ Ų
Ų Ø§ŲØŗØŦŲ ŲŲ
Ø˛ŲØ¯ Ų
Ų Ø§ŲØĒŲØ§ØĩŲŲ",
|
||||||
|
"deselect_all": "Ø§ŲØēØ§ØĄ ØĒØØ¯Ųد اŲŲŲ",
|
||||||
"details": "ØĒŲØ§ØĩŲŲ",
|
"details": "ØĒŲØ§ØĩŲŲ",
|
||||||
"direction": "Ø§ŲØĨØĒØŦاŲ",
|
"direction": "Ø§ŲØĨØĒØŦاŲ",
|
||||||
"disabled": "Ų
ØšØˇŲ",
|
"disabled": "Ų
ØšØˇŲ",
|
||||||
@@ -777,6 +813,7 @@
|
|||||||
"documentation": "اŲŲØĢØ§ØĻŲ",
|
"documentation": "اŲŲØĢØ§ØĻŲ",
|
||||||
"done": "ØĒŲ
",
|
"done": "ØĒŲ
",
|
||||||
"download": "ØĒŲØ˛ŲŲ",
|
"download": "ØĒŲØ˛ŲŲ",
|
||||||
|
"download_action_prompt": "ŲØĒŲ
ØĒŲØ˛ŲŲ {count} Ų
ŲŲ",
|
||||||
"download_canceled": "Ø§ŲØēŲ Ø§ŲØĒŲØ˛ŲŲ",
|
"download_canceled": "Ø§ŲØēŲ Ø§ŲØĒŲØ˛ŲŲ",
|
||||||
"download_complete": "Ø§ŲØĒŲ
Ų Ø§ŲØĒŲØ˛ŲŲ",
|
"download_complete": "Ø§ŲØĒŲ
Ų Ø§ŲØĒŲØ˛ŲŲ",
|
||||||
"download_enqueue": "ØĒŲØ˛ŲŲ ŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØ§ŲØĒØ¸Ø§Øą",
|
"download_enqueue": "ØĒŲØ˛ŲŲ ŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØ§ŲØĒØ¸Ø§Øą",
|
||||||
@@ -803,8 +840,12 @@
|
|||||||
"edit": "ØĒؚدŲŲ",
|
"edit": "ØĒؚدŲŲ",
|
||||||
"edit_album": "ØĒؚدŲŲ Ø§ŲØŖŲبŲŲ
",
|
"edit_album": "ØĒؚدŲŲ Ø§ŲØŖŲبŲŲ
",
|
||||||
"edit_avatar": "ØĒؚدŲŲ Ø§ŲØĩŲØąØŠ Ø§ŲØ´ØŽØĩŲØŠ",
|
"edit_avatar": "ØĒؚدŲŲ Ø§ŲØĩŲØąØŠ Ø§ŲØ´ØŽØĩŲØŠ",
|
||||||
|
"edit_birthday": "ØĒؚدŲŲ ØĒØ§ØąŲØŽ Ø§ŲŲ
ŲŲØ§Ø¯",
|
||||||
"edit_date": "ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ",
|
"edit_date": "ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ",
|
||||||
"edit_date_and_time": "ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ ŲØ§ŲŲŲØĒ",
|
"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": "ØĒؚدŲŲ Ø§ŲŲØĩŲ",
|
||||||
"edit_description_prompt": "Ø§ŲØąØŦØ§ØĄ ا؎ØĒŲØ§Øą ŲØĩŲ ØŦØ¯ŲØ¯:",
|
"edit_description_prompt": "Ø§ŲØąØŦØ§ØĄ ا؎ØĒŲØ§Øą ŲØĩŲ ØŦØ¯ŲØ¯:",
|
||||||
"edit_exclusion_pattern": "ØĒؚدŲŲ ŲŲ
Øˇ Ø§ŲØ§ØŗØĒبؚاد",
|
"edit_exclusion_pattern": "ØĒؚدŲŲ ŲŲ
Øˇ Ø§ŲØ§ØŗØĒبؚاد",
|
||||||
@@ -833,6 +874,7 @@
|
|||||||
"empty_trash": "ØŖŲØąØē ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
"empty_trash": "ØŖŲØąØē ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||||
"empty_trash_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨبਧØē ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒØ ØŗŲØ¤Ø¯Ų ŲØ°Ø§ ØĨŲŲ ØĨØ˛Ø§ŲØŠ ØŦŲ
ب𠨧ŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ŲØŦŲØ¯ØŠ ŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ بشŲŲ ŲŲØ§ØĻŲ Ų
Ų Immich.\nŲØ§ ŲŲ
ŲŲŲ Ø§ŲØĒØąØ§ØŦØš ØšŲ ŲØ°Ø§ Ø§ŲØĨØŦØąØ§ØĄ!",
|
"empty_trash_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨبਧØē ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒØ ØŗŲØ¤Ø¯Ų ŲØ°Ø§ ØĨŲŲ ØĨØ˛Ø§ŲØŠ ØŦŲ
ب𠨧ŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ŲØŦŲØ¯ØŠ ŲŲ ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ بشŲŲ ŲŲØ§ØĻŲ Ų
Ų Immich.\nŲØ§ ŲŲ
ŲŲŲ Ø§ŲØĒØąØ§ØŦØš ØšŲ ŲØ°Ø§ Ø§ŲØĨØŦØąØ§ØĄ!",
|
||||||
"enable": "ØĒŲØšŲŲ",
|
"enable": "ØĒŲØšŲŲ",
|
||||||
|
"enable_backup": "ØĒØ´ØēŲŲ Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
||||||
"enable_biometric_auth_description": "ØŖØ¯ØŽŲ ØąŲ
Ø˛ PIN Ø§ŲØŽØ§Øĩ Ø¨Ų ŲØĒŲ
ŲŲŲ Ø§ŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨ŲŲŲ
ØĒØąŲØŠ",
|
"enable_biometric_auth_description": "ØŖØ¯ØŽŲ ØąŲ
Ø˛ PIN Ø§ŲØŽØ§Øĩ Ø¨Ų ŲØĒŲ
ŲŲŲ Ø§ŲŲ
ØĩØ§Ø¯ŲØŠ Ø§ŲØ¨ŲŲŲ
ØĒØąŲØŠ",
|
||||||
"enabled": "Ų
ŲØšŲ",
|
"enabled": "Ų
ŲØšŲ",
|
||||||
"end_date": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØĒŲØ§ØĄ",
|
"end_date": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØĒŲØ§ØĄ",
|
||||||
@@ -876,6 +918,7 @@
|
|||||||
"failed_to_load_notifications": "ŲØ´Ų ØĒØŲ
ŲŲ Ø§ŲØĨØ´ØšØ§ØąØ§ØĒ",
|
"failed_to_load_notifications": "ŲØ´Ų ØĒØŲ
ŲŲ Ø§ŲØĨØ´ØšØ§ØąØ§ØĒ",
|
||||||
"failed_to_load_people": "ŲØ´Ų ØĒØŲ
ŲŲ Ø§ŲØŖØ´ØŽØ§Øĩ",
|
"failed_to_load_people": "ŲØ´Ų ØĒØŲ
ŲŲ Ø§ŲØŖØ´ØŽØ§Øĩ",
|
||||||
"failed_to_remove_product_key": "ØĒØšØ°Øą ØĨØ˛Ø§ŲØŠ Ų
ŲØĒØ§Ø اŲŲ
ŲØĒØŦ",
|
"failed_to_remove_product_key": "ØĒØšØ°Øą ØĨØ˛Ø§ŲØŠ Ų
ŲØĒØ§Ø اŲŲ
ŲØĒØŦ",
|
||||||
|
"failed_to_reset_pin_code": "ŲØ´Ų اؚاد؊ ØĒØšŲŲŲ ØąŲ
Ø˛ اŲPIN",
|
||||||
"failed_to_stack_assets": "ŲØ´Ų ŲŲ ØĒŲØ¯ŲØŗ اŲŲ
ØØĒŲŲØ§ØĒ",
|
"failed_to_stack_assets": "ŲØ´Ų ŲŲ ØĒŲØ¯ŲØŗ اŲŲ
ØØĒŲŲØ§ØĒ",
|
||||||
"failed_to_unstack_assets": "ŲØ´Ų ŲŲ ŲØĩŲ Ø§ŲŲ
ØØĒŲŲØ§ØĒ",
|
"failed_to_unstack_assets": "ŲØ´Ų ŲŲ ŲØĩŲ Ø§ŲŲ
ØØĒŲŲØ§ØĒ",
|
||||||
"failed_to_update_notification_status": "ŲØ´Ų ŲŲ ØĒØØ¯ŲØĢ ØØ§ŲØŠ Ø§ŲØĨØ´ØšØ§Øą",
|
"failed_to_update_notification_status": "ŲØ´Ų ŲŲ ØĒØØ¯ŲØĢ ØØ§ŲØŠ Ø§ŲØĨØ´ØšØ§Øą",
|
||||||
@@ -884,6 +927,7 @@
|
|||||||
"paths_validation_failed": "ŲØ´Ų ŲŲ Ø§ŲØĒØŲŲ Ų
Ų {paths, plural, one {# Ų
ØŗØ§Øą} other {# Ų
ØŗØ§ØąØ§ØĒ}}",
|
"paths_validation_failed": "ŲØ´Ų ŲŲ Ø§ŲØĒØŲŲ Ų
Ų {paths, plural, one {# Ų
ØŗØ§Øą} other {# Ų
ØŗØ§ØąØ§ØĒ}}",
|
||||||
"profile_picture_transparent_pixels": "ŲØ§ ŲŲ
ŲŲ ØŖŲ ØĒØØĒŲŲ ØĩŲØą Ø§ŲŲ
ŲŲ Ø§ŲØ´ØŽØĩŲ ØšŲŲ ØŖØŦØ˛Ø§ØĄ/Ø¨ŲØŗŲاØĒ Ø´ŲØ§ŲØŠ. ŲØąØŦŲ Ø§ŲØĒŲØ¨ŲØą Ų/ØŖŲ ØĒØØąŲŲ Ø§ŲØĩŲØąØŠ.",
|
"profile_picture_transparent_pixels": "ŲØ§ ŲŲ
ŲŲ ØŖŲ ØĒØØĒŲŲ ØĩŲØą Ø§ŲŲ
ŲŲ Ø§ŲØ´ØŽØĩŲ ØšŲŲ ØŖØŦØ˛Ø§ØĄ/Ø¨ŲØŗŲاØĒ Ø´ŲØ§ŲØŠ. ŲØąØŦŲ Ø§ŲØĒŲØ¨ŲØą Ų/ØŖŲ ØĒØØąŲŲ Ø§ŲØĩŲØąØŠ.",
|
||||||
"quota_higher_than_disk_size": "ŲŲØ¯ ŲŲ
ØĒ بØĒØšŲŲŲ ØØĩØŠ ŲØŗØ¨ŲØŠ ØŖØšŲŲ Ų
Ų ØØŦŲ
اŲŲØąØĩ",
|
"quota_higher_than_disk_size": "ŲŲØ¯ ŲŲ
ØĒ بØĒØšŲŲŲ ØØĩØŠ ŲØŗØ¨ŲØŠ ØŖØšŲŲ Ų
Ų ØØŦŲ
اŲŲØąØĩ",
|
||||||
|
"something_went_wrong": "ØØ¯ØĢ ØŽØˇØŖ Ų
ا",
|
||||||
"unable_to_add_album_users": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ų
ØŗØĒ؎دŲ
ŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
",
|
"unable_to_add_album_users": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ų
ØŗØĒ؎دŲ
ŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
",
|
||||||
"unable_to_add_assets_to_shared_link": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ ØĨŲŲ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
"unable_to_add_assets_to_shared_link": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ ØĨŲŲ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||||
"unable_to_add_comment": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§ŲØĒØšŲŲŲ",
|
"unable_to_add_comment": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§ŲØĒØšŲŲŲ",
|
||||||
@@ -969,13 +1013,11 @@
|
|||||||
},
|
},
|
||||||
"exif": "Exif (ØĩŲØēØŠ Ų
ŲŲ ØĩŲØąŲ ŲØ§Ø¨Ų ŲŲØĒØ¨Ø§Ø¯Ų)",
|
"exif": "Exif (ØĩŲØēØŠ Ų
ŲŲ ØĩŲØąŲ ŲØ§Ø¨Ų ŲŲØĒØ¨Ø§Ø¯Ų)",
|
||||||
"exif_bottom_sheet_description": "اØļŲ ŲØĩŲØ§...",
|
"exif_bottom_sheet_description": "اØļŲ ŲØĩŲØ§...",
|
||||||
|
"exif_bottom_sheet_description_error": "ØŽØˇØŖ ŲŲ ØĒØØ¯ŲØĢ اŲŲØĩŲ",
|
||||||
"exif_bottom_sheet_details": "ØĒŲØ§ØĩŲŲ",
|
"exif_bottom_sheet_details": "ØĒŲØ§ØĩŲŲ",
|
||||||
"exif_bottom_sheet_location": "Ų
ŲŲØš",
|
"exif_bottom_sheet_location": "Ų
ŲŲØš",
|
||||||
"exif_bottom_sheet_people": "اŲŲØ§Øŗ",
|
"exif_bottom_sheet_people": "اŲŲØ§Øŗ",
|
||||||
"exif_bottom_sheet_person_add_person": "اØļŲ Ø§ØŗŲ
ا",
|
"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": "ØŽØąŲØŦ Ų
Ų Ø§ŲØšØąØļ Ø§ŲØĒŲØ¯ŲŲ
Ų",
|
"exit_slideshow": "ØŽØąŲØŦ Ų
Ų Ø§ŲØšØąØļ Ø§ŲØĒŲØ¯ŲŲ
Ų",
|
||||||
"expand_all": "ØĒŲØŗŲØš اŲŲŲ",
|
"expand_all": "ØĒŲØŗŲØš اŲŲŲ",
|
||||||
"experimental_settings_new_asset_list_subtitle": "ØŖØšŲ
Ø§Ų ØŦØ§ØąŲØŠ",
|
"experimental_settings_new_asset_list_subtitle": "ØŖØšŲ
Ø§Ų ØŦØ§ØąŲØŠ",
|
||||||
@@ -989,6 +1031,8 @@
|
|||||||
"explorer": "اŲŲ
ØŗØĒŲØ´Ų",
|
"explorer": "اŲŲ
ØŗØĒŲØ´Ų",
|
||||||
"export": "ØĒØĩØ¯ŲØą",
|
"export": "ØĒØĩØ¯ŲØą",
|
||||||
"export_as_json": "ØĒØĩØ¯ŲØą ŲŲ JSON",
|
"export_as_json": "ØĒØĩØ¯ŲØą ŲŲ JSON",
|
||||||
|
"export_database": "ØĒØĩØ¯ŲØą ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ",
|
||||||
|
"export_database_description": "ØĒØĩØ¯ŲØą ŲØ§ØšØ¯ØŠ Ø§ŲØ¨ŲØ§ŲØ§ØĒ Ų
Ų ŲŲØš SQLite",
|
||||||
"extension": "Ø§ŲØĨŲ
ØĒداد",
|
"extension": "Ø§ŲØĨŲ
ØĒداد",
|
||||||
"external": "ØŽØ§ØąØŦŲ",
|
"external": "ØŽØ§ØąØŦŲ",
|
||||||
"external_libraries": "اŲŲ
ŲØĒØ¨Ø§ØĒ Ø§ŲØŽØ§ØąØŦŲØŠ",
|
"external_libraries": "اŲŲ
ŲØĒØ¨Ø§ØĒ Ø§ŲØŽØ§ØąØŦŲØŠ",
|
||||||
@@ -1020,6 +1064,7 @@
|
|||||||
"folder_not_found": "ŲŲ
ŲØĒŲ
Ø§ŲØšØĢŲØą ØšŲŲ Ø§ŲŲ
ØŦŲØ¯",
|
"folder_not_found": "ŲŲ
ŲØĒŲ
Ø§ŲØšØĢŲØą ØšŲŲ Ø§ŲŲ
ØŦŲØ¯",
|
||||||
"folders": "اŲŲ
ØŦŲØ¯Ø§ØĒ",
|
"folders": "اŲŲ
ØŦŲØ¯Ø§ØĒ",
|
||||||
"folders_feature_description": "ØĒØĩŲØ ØšØąØļ اŲŲ
ØŦŲØ¯ ŲŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ŲØŦŲØ¯ØŠ ØšŲŲ ŲØ¸Ø§Ų
اŲŲ
ŲŲØ§ØĒ",
|
"folders_feature_description": "ØĒØĩŲØ ØšØąØļ اŲŲ
ØŦŲØ¯ ŲŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ŲØŦŲØ¯ØŠ ØšŲŲ ŲØ¸Ø§Ų
اŲŲ
ŲŲØ§ØĒ",
|
||||||
|
"forgot_pin_code_question": "ŲŲ ŲØŗŲØĒ ØąŲ
Ø˛ اŲPIN Ø§ŲØŽØ§Øĩ Ø¨ŲØ",
|
||||||
"forward": "ØĨŲŲ Ø§ŲØŖŲ
اŲ
",
|
"forward": "ØĨŲŲ Ø§ŲØŖŲ
اŲ
",
|
||||||
"gcast_enabled": "ŲŲŲŲ ŲØ§ØŗØĒ",
|
"gcast_enabled": "ŲŲŲŲ ŲØ§ØŗØĒ",
|
||||||
"gcast_enabled_description": "ØĒŲŲŲ
ŲØ°Ų اŲŲ
ŲØ˛ØŠ بØĒØŲ
ŲŲ Ø§ŲŲ
ŲØ§ØąØ¯ Ø§ŲØŽØ§ØąØŦŲØŠ Ų
Ų Google ØØĒŲ ØĒØšŲ
Ų.",
|
"gcast_enabled_description": "ØĒŲŲŲ
ŲØ°Ų اŲŲ
ŲØ˛ØŠ بØĒØŲ
ŲŲ Ø§ŲŲ
ŲØ§ØąØ¯ Ø§ŲØŽØ§ØąØŦŲØŠ Ų
Ų Google ØØĒŲ ØĒØšŲ
Ų.",
|
||||||
@@ -1040,6 +1085,9 @@
|
|||||||
"haptic_feedback_switch": "ØĒŲ
ŲŲŲ ØąØ¯ŲØ¯ اŲŲØšŲ اŲŲŲ
ØŗŲØŠ",
|
"haptic_feedback_switch": "ØĒŲ
ŲŲŲ ØąØ¯ŲØ¯ اŲŲØšŲ اŲŲŲ
ØŗŲØŠ",
|
||||||
"haptic_feedback_title": "ØąØ¯ŲØ¯ ŲØšŲ ŲŲ
ØŗŲØŠ",
|
"haptic_feedback_title": "ØąØ¯ŲØ¯ ŲØšŲ ŲŲ
ØŗŲØŠ",
|
||||||
"has_quota": "Ų
ØØ¯Ø¯ Ø¨ØØĩØŠ",
|
"has_quota": "Ų
ØØ¯Ø¯ Ø¨ØØĩØŠ",
|
||||||
|
"hash_asset": "ØšŲ
Ų Hash ŲŲØŖØĩŲ (ŲŲŲ
ŲŲ)",
|
||||||
|
"hashed_assets": "ØŖØĩŲŲ (Ų
ŲŲØ§ØĒ) ØĒŲ
ØšŲ
Ų Hash ŲŲØ§",
|
||||||
|
"hashing": "ŲØĒŲ
ØšŲ
Ų Hash",
|
||||||
"header_settings_add_header_tip": "اØļØ§Ų ØąØ§Øŗ",
|
"header_settings_add_header_tip": "اØļØ§Ų ØąØ§Øŗ",
|
||||||
"header_settings_field_validator_msg": "اŲŲŲŲ
ØŠ ŲØ§ ŲŲ
ŲŲ Ø§Ų ØĒŲŲŲ ŲØ§ØąØēØŠ",
|
"header_settings_field_validator_msg": "اŲŲŲŲ
ØŠ ŲØ§ ŲŲ
ŲŲ Ø§Ų ØĒŲŲŲ ŲØ§ØąØēØŠ",
|
||||||
"header_settings_header_name_input": "Ø§ØŗŲ
Ø§ŲØąØŖØŗ",
|
"header_settings_header_name_input": "Ø§ØŗŲ
Ø§ŲØąØŖØŗ",
|
||||||
@@ -1053,9 +1101,9 @@
|
|||||||
"hide_password": "Ø§ØŽŲØ§ØĄ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
"hide_password": "Ø§ØŽŲØ§ØĄ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||||
"hide_person": "Ø§ØŽŲØ§ØĄ Ø§ŲØ´ØŽØĩ",
|
"hide_person": "Ø§ØŽŲØ§ØĄ Ø§ŲØ´ØŽØĩ",
|
||||||
"hide_unnamed_people": "ØĨØŽŲØ§ØĄ Ø§ŲØŖØ´ØŽØ§Øĩ بدŲŲ ØĨØŗŲ
",
|
"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_err_local": "ŲØ§ ŲŲ
ŲŲ ØĨØļØ§ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ØŲŲØŠ ØĨŲŲ Ø§ŲØŖŲبŲŲ
اØĒ ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||||
"home_page_add_to_album_success": "ØĒŲ
ØĒ ØĨØļØ§ŲØŠ {ØĒŲ
ØĒ ØĨØļØ§ŲØŠ} Ø§ŲØŖØĩŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
{Ø§ŲØŖŲبŲŲ
}.",
|
"home_page_add_to_album_success": "ØĒŲ
ØĒ ØĨØļØ§ŲØŠ {added} ØŖØĩŲŲ ØĨŲŲ Ø§ŲØŖŲبŲŲ
{album}.",
|
||||||
"home_page_album_err_partner": "ŲØ§ ŲŲ
ŲŲ ØĨØļØ§ŲØŠ ØŖØĩŲŲ Ø´ØąŲŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
"home_page_album_err_partner": "ŲØ§ ŲŲ
ŲŲ ØĨØļØ§ŲØŠ ØŖØĩŲŲ Ø´ØąŲŲØŠ ØĨŲŲ ØŖŲØ¨ŲŲ
ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||||
"home_page_archive_err_local": "ŲØ§ ŲŲ
ŲŲ ØŖØąØ´ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ØŲŲØŠ ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
"home_page_archive_err_local": "ŲØ§ ŲŲ
ŲŲ ØŖØąØ´ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲŲ
ØŲŲØŠ ØØĒŲ Ø§ŲØĸŲ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||||
"home_page_archive_err_partner": "ŲØ§ ŲŲ
ŲŲ ØŖØąØ´ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲØ´ØąŲŲØŠ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
"home_page_archive_err_partner": "ŲØ§ ŲŲ
ŲŲ ØŖØąØ´ŲØŠ Ø§ŲØŖØĩŲŲ Ø§ŲØ´ØąŲŲØŠ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||||
@@ -1071,7 +1119,9 @@
|
|||||||
"home_page_upload_err_limit": "ŲØ§ ŲŲ
ŲŲ ØĨŲØ§ ØĒØŲ
ŲŲ 30 ØŖØØ¯ Ø§ŲØŖØĩŲŲ ŲŲ ŲŲØĒ ŲØ§ØØ¯ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
"home_page_upload_err_limit": "ŲØ§ ŲŲ
ŲŲ ØĨŲØ§ ØĒØŲ
ŲŲ 30 ØŖØØ¯ Ø§ŲØŖØĩŲŲ ŲŲ ŲŲØĒ ŲØ§ØØ¯ Ø ØŗŲŲ ŲØĒØŽØˇŲ",
|
||||||
"host": "اŲŲ
ØļŲŲ",
|
"host": "اŲŲ
ØļŲŲ",
|
||||||
"hour": "ØŗØ§ØšØŠ",
|
"hour": "ØŗØ§ØšØŠ",
|
||||||
|
"hours": "ØŗØ§ØšØ§ØĒ",
|
||||||
"id": "اŲŲ
ØšØąŲ",
|
"id": "اŲŲ
ØšØąŲ",
|
||||||
|
"idle": "؎اŲ
Ų",
|
||||||
"ignore_icloud_photos": "ØĒØŦاŲŲ ØĩŲØą iCloud",
|
"ignore_icloud_photos": "ØĒØŦاŲŲ ØĩŲØą iCloud",
|
||||||
"ignore_icloud_photos_description": "Ø§ŲØĩŲØą Ø§ŲŲ
ØŽØ˛ŲØŠ ŲŲ Cloud ŲŲ ŲØĒŲ
ØĒØŲ
ŲŲŲØ§ ØĨŲŲ ØŽØ§Ø¯Ų
Immich",
|
"ignore_icloud_photos_description": "Ø§ŲØĩŲØą Ø§ŲŲ
ØŽØ˛ŲØŠ ŲŲ Cloud ŲŲ ŲØĒŲ
ØĒØŲ
ŲŲŲØ§ ØĨŲŲ ØŽØ§Ø¯Ų
Immich",
|
||||||
"image": "ØĩŲØąØŠ",
|
"image": "ØĩŲØąØŠ",
|
||||||
@@ -1129,10 +1179,12 @@
|
|||||||
"language_no_results_title": "ŲŲ
ŲØĒŲ
Ø§ŲØšØĢŲØą ØšŲŲ ŲØēØ§ØĒ",
|
"language_no_results_title": "ŲŲ
ŲØĒŲ
Ø§ŲØšØĢŲØą ØšŲŲ ŲØēØ§ØĒ",
|
||||||
"language_search_hint": "Ø§ŲØ¨ØØĢ ØšŲ ŲØēØ§ØĒ...",
|
"language_search_hint": "Ø§ŲØ¨ØØĢ ØšŲ ŲØēØ§ØĒ...",
|
||||||
"language_setting_description": "ا؎ØĒØą ŲØēØĒŲ Ø§ŲŲ
ŲØļŲØŠ",
|
"language_setting_description": "ا؎ØĒØą ŲØēØĒŲ Ø§ŲŲ
ŲØļŲØŠ",
|
||||||
|
"large_files": "Ų
ŲŲØ§ØĒ ŲØ¨ŲØąØŠ",
|
||||||
"last_seen": "Ø§ØŽØą ظŲŲØą",
|
"last_seen": "Ø§ØŽØą ظŲŲØą",
|
||||||
"latest_version": "Ø§ØØ¯ØĢ اØĩØ¯Ø§Øą",
|
"latest_version": "Ø§ØØ¯ØĢ اØĩØ¯Ø§Øą",
|
||||||
"latitude": "ØŽØˇ Ø§ŲØšØąØļ",
|
"latitude": "ØŽØˇ Ø§ŲØšØąØļ",
|
||||||
"leave": "Ų
ØēØ§Ø¯ØąØŠ",
|
"leave": "Ų
ØēØ§Ø¯ØąØŠ",
|
||||||
|
"leave_album": "اØĒØąŲ Ø§ŲØ§ŲبŲŲ
",
|
||||||
"lens_model": "ŲŲ
ŲØ°ØŦ Ø§ŲØšØ¯ØŗØ§ØĒ",
|
"lens_model": "ŲŲ
ŲØ°ØŦ Ø§ŲØšØ¯ØŗØ§ØĒ",
|
||||||
"let_others_respond": "دؚ Ø§ŲØĸØŽØąŲŲ ŲØŗØĒØŦŲØ¨ŲŲ",
|
"let_others_respond": "دؚ Ø§ŲØĸØŽØąŲŲ ŲØŗØĒØŦŲØ¨ŲŲ",
|
||||||
"level": "اŲŲ
ØŗØĒŲŲ",
|
"level": "اŲŲ
ØŗØĒŲŲ",
|
||||||
@@ -1144,16 +1196,19 @@
|
|||||||
"library_page_sort_created": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØ´Ø§ØĄ",
|
"library_page_sort_created": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØ´Ø§ØĄ",
|
||||||
"library_page_sort_last_modified": "ØĸØŽØą ØĒؚدŲŲ",
|
"library_page_sort_last_modified": "ØĸØŽØą ØĒؚدŲŲ",
|
||||||
"library_page_sort_title": "ØšŲŲØ§Ų Ø§ŲØŖŲبŲŲ
",
|
"library_page_sort_title": "ØšŲŲØ§Ų Ø§ŲØŖŲبŲŲ
",
|
||||||
|
"licenses": "ØąŲØŽŲØĩ",
|
||||||
"light": "اŲŲ
ØļŲØĻ",
|
"light": "اŲŲ
ØļŲØĻ",
|
||||||
|
"like": "اؚØŦاب",
|
||||||
"like_deleted": "ØĒŲ
ØØ°Ų Ø§ŲØĨØšØŦاب",
|
"like_deleted": "ØĒŲ
ØØ°Ų Ø§ŲØĨØšØŦاب",
|
||||||
"link_motion_video": "ØąØ§Ø¨Øˇ ŲŲØ¯ŲŲ Ø§ŲØØąŲØŠ",
|
"link_motion_video": "ØąØ§Ø¨Øˇ ŲŲØ¯ŲŲ Ø§ŲØØąŲØŠ",
|
||||||
"link_options": "ØŽŲØ§ØąØ§ØĒ Ø§ŲØąØ§Ø¨Øˇ",
|
|
||||||
"link_to_oauth": "Ø§ŲØąØ¨Øˇ Ų
Øš OAuth",
|
"link_to_oauth": "Ø§ŲØąØ¨Øˇ Ų
Øš OAuth",
|
||||||
"linked_oauth_account": "ØØŗØ§Ø¨ Ų
ØąØĒØ¨Øˇ Ø¨Ų OAuth",
|
"linked_oauth_account": "ØØŗØ§Ø¨ Ų
ØąØĒØ¨Øˇ Ø¨Ų OAuth",
|
||||||
"list": "ŲØ§ØĻŲ
ØŠ",
|
"list": "ŲØ§ØĻŲ
ØŠ",
|
||||||
"loading": "ØĒØŲ
ŲŲ",
|
"loading": "ØĒØŲ
ŲŲ",
|
||||||
"loading_search_results_failed": "ŲØ´Ų ØĒØŲ
ŲŲ ŲØĒØ§ØĻØŦ Ø§ŲØ¨ØØĢ",
|
"loading_search_results_failed": "ŲØ´Ų ØĒØŲ
ŲŲ ŲØĒØ§ØĻØŦ Ø§ŲØ¨ØØĢ",
|
||||||
|
"local": "Ų
ØŲŲŲ",
|
||||||
"local_asset_cast_failed": "ØēŲØą ŲØ§Ø¯Øą ØšŲŲ Ø¨ØĢ ØŖØĩŲ ŲŲ
ŲØĒŲ
ØĒØŲ
ŲŲŲ ØĨŲŲ Ø§ŲØŽØ§Ø¯Ų
",
|
"local_asset_cast_failed": "ØēŲØą ŲØ§Ø¯Øą ØšŲŲ Ø¨ØĢ ØŖØĩŲ ŲŲ
ŲØĒŲ
ØĒØŲ
ŲŲŲ ØĨŲŲ Ø§ŲØŽØ§Ø¯Ų
",
|
||||||
|
"local_assets": "ØŖŲØĩŲŲ (Ų
ŲŲØ§ØĒ) Ų
ØŲŲØŠ",
|
||||||
"local_network": "Ø´Ø¨ŲØŠ Ų
ØŲŲØŠ",
|
"local_network": "Ø´Ø¨ŲØŠ Ų
ØŲŲØŠ",
|
||||||
"local_network_sheet_info": "ØŗŲØĒØĩŲ Ø§ŲØĒØˇØ¨ŲŲ Ø¨Ø§ŲØŽØ§Ø¯Ų
Ų
Ų ØŽŲØ§Ų ØšŲŲØ§Ų URL ŲØ°Ø§ ØšŲØ¯ Ø§ØŗØĒ؎داŲ
Ø´Ø¨ŲØŠ Wi-Fi اŲŲ
ØØ¯Ø¯ØŠ",
|
"local_network_sheet_info": "ØŗŲØĒØĩŲ Ø§ŲØĒØˇØ¨ŲŲ Ø¨Ø§ŲØŽØ§Ø¯Ų
Ų
Ų ØŽŲØ§Ų ØšŲŲØ§Ų URL ŲØ°Ø§ ØšŲØ¯ Ø§ØŗØĒ؎داŲ
Ø´Ø¨ŲØŠ Wi-Fi اŲŲ
ØØ¯Ø¯ØŠ",
|
||||||
"location_permission": "Ø§Ø°Ų Ø§ŲŲ
ŲŲØš",
|
"location_permission": "Ø§Ø°Ų Ø§ŲŲ
ŲŲØš",
|
||||||
@@ -1210,8 +1265,7 @@
|
|||||||
"manage_your_devices": "ØĨØ¯Ø§ØąØŠ Ø§ŲØŖØŦŲØ˛ØŠ Ø§ŲØĒŲ ØĒŲ
ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ ØĨŲŲŲØ§",
|
"manage_your_devices": "ØĨØ¯Ø§ØąØŠ Ø§ŲØŖØŦŲØ˛ØŠ Ø§ŲØĒŲ ØĒŲ
ØĒØŗØŦŲŲ Ø§ŲØ¯ØŽŲŲ ØĨŲŲŲØ§",
|
||||||
"manage_your_oauth_connection": "ØĨØ¯Ø§ØąØŠ اØĒØĩØ§Ų OAuth Ø§ŲØŽØ§Øĩ بŲ",
|
"manage_your_oauth_connection": "ØĨØ¯Ø§ØąØŠ اØĒØĩØ§Ų OAuth Ø§ŲØŽØ§Øĩ بŲ",
|
||||||
"map": "Ø§ŲØŽØąŲØˇØŠ",
|
"map": "Ø§ŲØŽØąŲØˇØŠ",
|
||||||
"map_assets_in_bound": "{count} ØĩŲØąŲ",
|
"map_assets_in_bounds": "{count, plural, =0 {ŲØ§ŲŲØŦد ØĩŲØą ŲŲ ŲØ°Ų اŲŲ
ŲØˇŲØŠ} one {# ØĩŲØąØŠ} other {# ØĩŲØą}}",
|
||||||
"map_assets_in_bounds": "{count} ØĩŲØą",
|
|
||||||
"map_cannot_get_user_location": "ŲØ§ ŲŲ
ŲŲ Ø§ŲØØĩŲŲ ØšŲŲ Ų
Ųب𠨧ŲŲ
ØŗØĒ؎دŲ
",
|
"map_cannot_get_user_location": "ŲØ§ ŲŲ
ŲŲ Ø§ŲØØĩŲŲ ØšŲŲ Ų
Ųب𠨧ŲŲ
ØŗØĒ؎دŲ
",
|
||||||
"map_location_dialog_yes": "ŲØšŲ
",
|
"map_location_dialog_yes": "ŲØšŲ
",
|
||||||
"map_location_picker_page_use_location": "Ø§ØŗØĒ؎دŲ
ŲØ°Ø§ اŲŲ
ŲŲØš",
|
"map_location_picker_page_use_location": "Ø§ØŗØĒ؎دŲ
ŲØ°Ø§ اŲŲ
ŲŲØš",
|
||||||
@@ -1219,7 +1273,6 @@
|
|||||||
"map_location_service_disabled_title": "؎دŲ
ØŠ اŲŲ
ŲŲØš Ų
ØšØˇŲ",
|
"map_location_service_disabled_title": "؎دŲ
ØŠ اŲŲ
ŲŲØš Ų
ØšØˇŲ",
|
||||||
"map_marker_for_images": "ØšŲØ§Ų
ØŠ Ø§ŲØŽØąŲØˇØŠ ŲŲØĩŲØą Ø§ŲŲ
ŲØĒŲØˇØŠ ŲŲ {city}Ø {country}",
|
"map_marker_for_images": "ØšŲØ§Ų
ØŠ Ø§ŲØŽØąŲØˇØŠ ŲŲØĩŲØą Ø§ŲŲ
ŲØĒŲØˇØŠ ŲŲ {city}Ø {country}",
|
||||||
"map_marker_with_image": "ØšŲØ§Ų
ØŠ Ø§ŲØŽØąŲØˇØŠ Ų
Øš Ø§ŲØĩŲØąØŠ",
|
"map_marker_with_image": "ØšŲØ§Ų
ØŠ Ø§ŲØŽØąŲØˇØŠ Ų
Øš Ø§ŲØĩŲØąØŠ",
|
||||||
"map_no_assets_in_bounds": "ŲØ§ ØĒŲØŦد ØĩŲØą ŲŲ ŲØ°Ø§ اŲŲ
ØŦاŲ",
|
|
||||||
"map_no_location_permission_content": "ŲŲØ§Ų ØØ§ØŦØŠ ØĨŲŲ ØĨØ°Ų Ø§ŲŲ
ŲŲØš ŲØšØąØļ Ø§ŲØŖØĩŲŲ Ų
Ų Ų
ŲŲØšŲ Ø§ŲØØ§ŲŲ.ŲŲ ØĒØąŲØ¯ Ø§ŲØŗŲ
Ø§Ø Ø¨Ų Ø§ŲØĸŲØ",
|
"map_no_location_permission_content": "ŲŲØ§Ų ØØ§ØŦØŠ ØĨŲŲ ØĨØ°Ų Ø§ŲŲ
ŲŲØš ŲØšØąØļ Ø§ŲØŖØĩŲŲ Ų
Ų Ų
ŲŲØšŲ Ø§ŲØØ§ŲŲ.ŲŲ ØĒØąŲØ¯ Ø§ŲØŗŲ
Ø§Ø Ø¨Ų Ø§ŲØĸŲØ",
|
||||||
"map_no_location_permission_title": "ØĒŲ
ØąŲØļ ØĨØ°Ų Ø§ŲŲ
ŲŲØš",
|
"map_no_location_permission_title": "ØĒŲ
ØąŲØļ ØĨØ°Ų Ø§ŲŲ
ŲŲØš",
|
||||||
"map_settings": "ØĨؚداداØĒ Ø§ŲØŽØąŲØˇØŠ",
|
"map_settings": "ØĨؚداداØĒ Ø§ŲØŽØąŲØˇØŠ",
|
||||||
@@ -1256,6 +1309,7 @@
|
|||||||
"merged_people_count": "دŲ
ØŦ {count, plural, one {Ø´ØŽØĩ ŲØ§ØØ¯} other {# ØŖØ´ØŽØ§Øĩ}}",
|
"merged_people_count": "دŲ
ØŦ {count, plural, one {Ø´ØŽØĩ ŲØ§ØØ¯} other {# ØŖØ´ØŽØ§Øĩ}}",
|
||||||
"minimize": "ØĒØĩØēŲØą",
|
"minimize": "ØĒØĩØēŲØą",
|
||||||
"minute": "دŲŲŲØŠ",
|
"minute": "دŲŲŲØŠ",
|
||||||
|
"minutes": "Ø¯ŲØ§ØĻŲ",
|
||||||
"missing": "اŲŲ
ŲŲŲØ¯ØŠ",
|
"missing": "اŲŲ
ŲŲŲØ¯ØŠ",
|
||||||
"model": "ŲŲ
ŲØ°ØŦ",
|
"model": "ŲŲ
ŲØ°ØŦ",
|
||||||
"month": "Ø´ŲØą",
|
"month": "Ø´ŲØą",
|
||||||
@@ -1275,6 +1329,9 @@
|
|||||||
"my_albums": "ØŖŲØ¨ŲŲ
اØĒŲ",
|
"my_albums": "ØŖŲØ¨ŲŲ
اØĒŲ",
|
||||||
"name": "Ø§ŲØ§ØŗŲ
",
|
"name": "Ø§ŲØ§ØŗŲ
",
|
||||||
"name_or_nickname": "Ø§ŲØ§ØŗŲ
ØŖŲ Ø§ŲŲŲØ¨",
|
"name_or_nickname": "Ø§ŲØ§ØŗŲ
ØŖŲ Ø§ŲŲŲØ¨",
|
||||||
|
"network_requirement_photos_upload": "Ø§ØŗØĒ؎داŲ
Ø¨ŲØ§ŲاØĒ اŲŲØ§ØĒŲ Ø§ŲŲ
ØŲ
ŲŲ ŲØšŲ
Ų ŲØŗØŽØŠ Ø§ØØĒŲØ§ØˇŲØŠ ŲŲØĩŲØą",
|
||||||
|
"network_requirement_videos_upload": "Ø§ØŗØĒ؎داŲ
Ø¨ŲØ§ŲاØĒ اŲŲØ§ØĒŲ Ø§ŲŲ
ØŲ
ŲŲ ŲØšŲ
Ų ŲØŗØŽØŠ Ø§ØØĒŲØ§ØˇŲØŠ ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ",
|
||||||
|
"network_requirements_updated": "ØĒŲ
ØĒØēŲŲØą Ų
ØĒØˇŲØ¨Ø§ØĒ Ø§ŲØ´Ø¨ŲØŠØ ŲØĒŲ
ØĨؚاد؊ ØĒØšŲŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØĒØ¸Ø§Øą اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ",
|
||||||
"networking_settings": "Ø§ŲØ´Ø¨ŲاØĒ",
|
"networking_settings": "Ø§ŲØ´Ø¨ŲاØĒ",
|
||||||
"networking_subtitle": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ŲŲØˇØŠ Ø§ŲØŽØ§Ø¯Ų
اŲŲŲØ§ØĻŲØŠ",
|
"networking_subtitle": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ŲŲØˇØŠ Ø§ŲØŽØ§Ø¯Ų
اŲŲŲØ§ØĻŲØŠ",
|
||||||
"never": "ØŖØ¨Ø¯Ø§Ų",
|
"never": "ØŖØ¨Ø¯Ø§Ų",
|
||||||
@@ -1310,6 +1367,7 @@
|
|||||||
"no_results": "ŲØ§ ŲŲØŦد ŲØĒØ§ØĻØŦ",
|
"no_results": "ŲØ§ ŲŲØŦد ŲØĒØ§ØĻØŦ",
|
||||||
"no_results_description": "ØŦØąØ¨ ŲŲŲ
ØŠ ØąØĻŲØŗŲØŠ Ų
ØąØ§Ø¯ŲØŠ ØŖŲ ØŖŲØĢØą ØšŲ
ŲŲ
ŲØŠ",
|
"no_results_description": "ØŦØąØ¨ ŲŲŲ
ØŠ ØąØĻŲØŗŲØŠ Ų
ØąØ§Ø¯ŲØŠ ØŖŲ ØŖŲØĢØą ØšŲ
ŲŲ
ŲØŠ",
|
||||||
"no_shared_albums_message": "ŲŲ
بØĨŲØ´Ø§ØĄ ØŖŲØ¨ŲŲ
ŲŲ
Ø´Ø§ØąŲØŠ Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ų
Øš Ø§ŲØŖØ´ØŽØ§Øĩ ŲŲ Ø´Ø¨ŲØĒŲ",
|
"no_shared_albums_message": "ŲŲ
بØĨŲØ´Ø§ØĄ ØŖŲØ¨ŲŲ
ŲŲ
Ø´Ø§ØąŲØŠ Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ų
Øš Ø§ŲØŖØ´ØŽØ§Øĩ ŲŲ Ø´Ø¨ŲØĒŲ",
|
||||||
|
"no_uploads_in_progress": "ŲØ§ ŲŲØŦد Ø§Ų Ų
ŲŲØ§ØĒ ŲŲØ¯ Ø§ŲØąŲØš",
|
||||||
"not_in_any_album": "ŲŲØŗØĒ ŲŲ ØŖŲ ØŖŲØ¨ŲŲ
",
|
"not_in_any_album": "ŲŲØŗØĒ ŲŲ ØŖŲ ØŖŲØ¨ŲŲ
",
|
||||||
"not_selected": "ŲŲ
ŲØŽØĒØ§Øą",
|
"not_selected": "ŲŲ
ŲØŽØĒØ§Øą",
|
||||||
"note_apply_storage_label_to_previously_uploaded assets": "Ų
ŲØ§ØØ¸ØŠ: ŲØĒØˇØ¨ŲŲ ØŗŲ
ØŠ Ø§ŲØĒØŽØ˛ŲŲ ØšŲŲ Ø§ŲŲ
ØØĒŲŲØ§ØĒ Ø§ŲØĒŲ ØĒŲ
ØąŲØšŲا Ų
ØŗØ¨ŲŲØ§Ø ŲŲ
بØĒØ´ØēŲŲ",
|
"note_apply_storage_label_to_previously_uploaded assets": "Ų
ŲØ§ØØ¸ØŠ: ŲØĒØˇØ¨ŲŲ ØŗŲ
ØŠ Ø§ŲØĒØŽØ˛ŲŲ ØšŲŲ Ø§ŲŲ
ØØĒŲŲØ§ØĒ Ø§ŲØĒŲ ØĒŲ
ØąŲØšŲا Ų
ØŗØ¨ŲŲØ§Ø ŲŲ
بØĒØ´ØēŲŲ",
|
||||||
@@ -1325,6 +1383,7 @@
|
|||||||
"oauth": "OAuth",
|
"oauth": "OAuth",
|
||||||
"official_immich_resources": "اŲŲ
ŲØ§ØąØ¯ Ø§ŲØąØŗŲ
ŲØŠ ŲØ´ØąŲØŠ Immich",
|
"official_immich_resources": "اŲŲ
ŲØ§ØąØ¯ Ø§ŲØąØŗŲ
ŲØŠ ŲØ´ØąŲØŠ Immich",
|
||||||
"offline": "ØēŲØą Ų
ØĒØĩŲ",
|
"offline": "ØēŲØą Ų
ØĒØĩŲ",
|
||||||
|
"offset": "Ø§Ø˛Ø§ØØŠ",
|
||||||
"ok": "ŲØšŲ
",
|
"ok": "ŲØšŲ
",
|
||||||
"oldest_first": "Ø§ŲØŖŲدŲ
ØŖŲŲØ§",
|
"oldest_first": "Ø§ŲØŖŲدŲ
ØŖŲŲØ§",
|
||||||
"on_this_device": "ØšŲŲ ŲØ°Ø§ Ø§ŲØŦŲØ§Ø˛",
|
"on_this_device": "ØšŲŲ ŲØ°Ø§ Ø§ŲØŦŲØ§Ø˛",
|
||||||
@@ -1347,6 +1406,7 @@
|
|||||||
"original": "ØŖØĩŲŲ",
|
"original": "ØŖØĩŲŲ",
|
||||||
"other": "ØŖØŽØąŲ",
|
"other": "ØŖØŽØąŲ",
|
||||||
"other_devices": "ØŖØŦŲØ˛ØŠ ØŖØŽØąŲ",
|
"other_devices": "ØŖØŦŲØ˛ØŠ ØŖØŽØąŲ",
|
||||||
|
"other_entities": "ŲŲØ§ŲاØĒ ØŖØŽØąŲ",
|
||||||
"other_variables": "Ų
ØĒØēبਧØĒ ØŖØŽØąŲ",
|
"other_variables": "Ų
ØĒØēبਧØĒ ØŖØŽØąŲ",
|
||||||
"owned": "Ų
Ų
ŲŲŲØŠ",
|
"owned": "Ų
Ų
ŲŲŲØŠ",
|
||||||
"owner": "اŲŲ
اŲŲ",
|
"owner": "اŲŲ
اŲŲ",
|
||||||
@@ -1401,7 +1461,10 @@
|
|||||||
"permission_onboarding_permission_limited": "ØĨØ°Ų Ų
ØØ¯Ųد. ŲŲØŗŲ
Ø§Ø Ø¨Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ ŲŲØĒØˇØ¨ŲŲ ŲØĨØ¯Ø§ØąØŠ Ų
ØŦŲ
ŲØšØŠ Ø§ŲŲ
ØšØąØļ باŲŲØ§Ų
ŲØ اŲ
ŲØ ØŖØ°ŲŲØ§ØĒ Ø§ŲØĩŲØą ŲØ§ŲŲŲØ¯ŲŲ ŲŲ Ø§ŲØĨؚداداØĒ.",
|
"permission_onboarding_permission_limited": "ØĨØ°Ų Ų
ØØ¯Ųد. ŲŲØŗŲ
Ø§Ø Ø¨Ø§ŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ ŲŲØĒØˇØ¨ŲŲ ŲØĨØ¯Ø§ØąØŠ Ų
ØŦŲ
ŲØšØŠ Ø§ŲŲ
ØšØąØļ باŲŲØ§Ų
ŲØ اŲ
ŲØ ØŖØ°ŲŲØ§ØĒ Ø§ŲØĩŲØą ŲØ§ŲŲŲØ¯ŲŲ ŲŲ Ø§ŲØĨؚداداØĒ.",
|
||||||
"permission_onboarding_request": "ŲØĒØˇŲب Ø§ŲØĒØˇØ¨ŲŲ ØĨذŲŲØ§ ŲØšØąØļ Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲØŽØ§ØĩØŠ بŲ.",
|
"permission_onboarding_request": "ŲØĒØˇŲب Ø§ŲØĒØˇØ¨ŲŲ ØĨذŲŲØ§ ŲØšØąØļ Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲØŽØ§ØĩØŠ بŲ.",
|
||||||
"person": "Ø´ØŽØĩ",
|
"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 {}}",
|
"person_hidden": "{name}{hidden, select, true { (Ų
ØŽŲŲ)} other {}}",
|
||||||
"photo_shared_all_users": "ŲØ¨Ø¯Ų ØŖŲŲ Ø´Ø§ØąŲØĒ ØĩŲØąŲ Ų
Øš ØŦŲ
ب𠨧ŲŲ
ØŗØĒ؎دŲ
ŲŲ ØŖŲ ŲŲØŗ ŲØ¯ŲŲ ØŖŲ Ų
ØŗØĒ؎دŲ
ŲŲŲ
Ø´Ø§ØąŲØŠ Ų
ØšŲ.",
|
"photo_shared_all_users": "ŲØ¨Ø¯Ų ØŖŲŲ Ø´Ø§ØąŲØĒ ØĩŲØąŲ Ų
Øš ØŦŲ
ب𠨧ŲŲ
ØŗØĒ؎دŲ
ŲŲ ØŖŲ ŲŲØŗ ŲØ¯ŲŲ ØŖŲ Ų
ØŗØĒ؎دŲ
ŲŲŲ
Ø´Ø§ØąŲØŠ Ų
ØšŲ.",
|
||||||
"photos": "Ø§ŲØĩŲØą",
|
"photos": "Ø§ŲØĩŲØą",
|
||||||
@@ -1478,6 +1541,7 @@
|
|||||||
"purchase_server_description_2": "ØØ§ŲØŠ Ø§ŲØ¯Ø§ØšŲ
",
|
"purchase_server_description_2": "ØØ§ŲØŠ Ø§ŲØ¯Ø§ØšŲ
",
|
||||||
"purchase_server_title": "Ø§ŲØŽØ§Ø¯Ų
",
|
"purchase_server_title": "Ø§ŲØŽØ§Ø¯Ų
",
|
||||||
"purchase_settings_server_activated": "ŲØĒŲ
ØĨØ¯Ø§ØąØŠ Ų
ŲØĒØ§Ø Ų
ŲØĒØŦ Ø§ŲØŽØ§Ø¯Ų
Ų
Ų ŲØ¨Ų Ų
Ø¯ŲØą Ø§ŲŲØ¸Ø§Ų
",
|
"purchase_settings_server_activated": "ŲØĒŲ
ØĨØ¯Ø§ØąØŠ Ų
ŲØĒØ§Ø Ų
ŲØĒØŦ Ø§ŲØŽØ§Ø¯Ų
Ų
Ų ŲØ¨Ų Ų
Ø¯ŲØą Ø§ŲŲØ¸Ø§Ų
",
|
||||||
|
"queue_status": "ŲØĒŲ
Ø§ŲØ§ØļØ§ŲØŠ Ø§ŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØĒØ¸Ø§Øą اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ {count}/{total}",
|
||||||
"rating": "ØĒŲŲŲŲ
ŲØŦŲ
Ų",
|
"rating": "ØĒŲŲŲŲ
ŲØŦŲ
Ų",
|
||||||
"rating_clear": "Ų
ØŗØ Ø§ŲØĒŲŲŲŲ
",
|
"rating_clear": "Ų
ØŗØ Ø§ŲØĒŲŲŲŲ
",
|
||||||
"rating_count": "{count, plural, one {# ŲØŦŲ
ØŠ} other {# ŲØŦŲŲ
}}",
|
"rating_count": "{count, plural, one {# ŲØŦŲ
ØŠ} other {# ŲØŦŲŲ
}}",
|
||||||
@@ -1506,6 +1570,8 @@
|
|||||||
"refreshing_faces": "ØŦØ§ØąŲ ØĒØØ¯ŲØĢ اŲŲØŦŲŲ",
|
"refreshing_faces": "ØŦØ§ØąŲ ØĒØØ¯ŲØĢ اŲŲØŦŲŲ",
|
||||||
"refreshing_metadata": "ØŦØ§ØąŲ ØĒØØ¯ŲØĢ Ø§ŲØ¨ŲØ§ŲØ§ØĒ اŲŲØĩŲŲØŠ",
|
"refreshing_metadata": "ØŦØ§ØąŲ ØĒØØ¯ŲØĢ Ø§ŲØ¨ŲØ§ŲØ§ØĒ اŲŲØĩŲŲØŠ",
|
||||||
"regenerating_thumbnails": "ØŦØ§ØąŲ ØĒØŦØ¯ŲØ¯ Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąØŠ",
|
"regenerating_thumbnails": "ØŦØ§ØąŲ ØĒØŦØ¯ŲØ¯ Ø§ŲØĩŲØą Ø§ŲŲ
ØĩØēØąØŠ",
|
||||||
|
"remote": "Ø¨ØšŲØ¯",
|
||||||
|
"remote_assets": "Ø§ŲØŖŲØĩŲŲ Ø§ŲØ¨ØšŲد؊",
|
||||||
"remove": "ØĨØ˛Ø§ŲØŠ",
|
"remove": "ØĨØ˛Ø§ŲØŠ",
|
||||||
"remove_assets_album_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {count, plural, one {# اŲŲ
ØØĒŲŲ} other {# اŲŲ
ØØĒŲŲØ§ØĒ}} Ų
Ų Ø§ŲØŖŲبŲŲ
Ø",
|
"remove_assets_album_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {count, plural, one {# اŲŲ
ØØĒŲŲ} other {# اŲŲ
ØØĒŲŲØ§ØĒ}} Ų
Ų Ø§ŲØŖŲبŲŲ
Ø",
|
||||||
"remove_assets_shared_link_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {count, plural, one {# اŲŲ
ØØĒŲŲ} other {# اŲŲ
ØØĒŲŲØ§ØĒ}} Ų
Ų ØąØ§Ø¨Øˇ اŲŲ
Ø´Ø§ØąŲØŠ ŲØ°Ø§Ø",
|
"remove_assets_shared_link_confirmation": "ŲŲ ØŖŲØĒ Ų
ØĒØŖŲØ¯ ØŖŲŲ ØĒØąŲØ¯ ØĨØ˛Ø§ŲØŠ {count, plural, one {# اŲŲ
ØØĒŲŲ} other {# اŲŲ
ØØĒŲŲØ§ØĒ}} Ų
Ų ØąØ§Ø¨Øˇ اŲŲ
Ø´Ø§ØąŲØŠ ŲØ°Ø§Ø",
|
||||||
@@ -1513,6 +1579,7 @@
|
|||||||
"remove_custom_date_range": "ØĨØ˛Ø§ŲØŠ Ø§ŲŲØˇØ§Ų Ø§ŲØ˛Ų
ŲŲ Ø§ŲŲ
ØŽØĩØĩ",
|
"remove_custom_date_range": "ØĨØ˛Ø§ŲØŠ Ø§ŲŲØˇØ§Ų Ø§ŲØ˛Ų
ŲŲ Ø§ŲŲ
ØŽØĩØĩ",
|
||||||
"remove_deleted_assets": "ØĨØ˛Ø§ŲØŠ Ø§ŲŲ
ŲŲØ§ØĒ Ø§ŲØēŲØą Ų
ØĒØĩŲØŠ",
|
"remove_deleted_assets": "ØĨØ˛Ø§ŲØŠ Ø§ŲŲ
ŲŲØ§ØĒ Ø§ŲØēŲØą Ų
ØĒØĩŲØŠ",
|
||||||
"remove_from_album": "ØĨØ˛Ø§ŲØŠ Ų
Ų Ø§ŲØŖŲبŲŲ
",
|
"remove_from_album": "ØĨØ˛Ø§ŲØŠ Ų
Ų Ø§ŲØŖŲبŲŲ
",
|
||||||
|
"remove_from_album_action_prompt": "ØĒŲ
Ø§Ø˛Ø§ŲØŠ {count} Ų
Ų Ø§ŲØ§ŲبŲŲ
",
|
||||||
"remove_from_favorites": "ØĨØ˛Ø§ŲØŠ Ų
Ų Ø§ŲŲ
ŲØļŲØŠ",
|
"remove_from_favorites": "ØĨØ˛Ø§ŲØŠ Ų
Ų Ø§ŲŲ
ŲØļŲØŠ",
|
||||||
"remove_from_lock_folder_action_prompt": "{count} ØŖŲŲŲ Ų
Ų Ø§ŲŲ
ØŦŲØ¯ اŲŲ
ŲŲŲ",
|
"remove_from_lock_folder_action_prompt": "{count} ØŖŲŲŲ Ų
Ų Ø§ŲŲ
ØŦŲØ¯ اŲŲ
ŲŲŲ",
|
||||||
"remove_from_locked_folder": "Ø§Ø˛Ø§ŲØŠ Ų
Ų Ø§ŲŲ
ØŦŲØ¯ اŲŲ
ŲŲŲ",
|
"remove_from_locked_folder": "Ø§Ø˛Ø§ŲØŠ Ų
Ų Ø§ŲŲ
ØŦŲØ¯ اŲŲ
ŲŲŲ",
|
||||||
@@ -1542,19 +1609,28 @@
|
|||||||
"reset_password": "ØĨؚاد؊ ØĒØšŲŲŲ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
"reset_password": "ØĨؚاد؊ ØĒØšŲŲŲ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||||
"reset_people_visibility": "ØĨؚاد؊ ØļØ¨Øˇ ظŲŲØą Ø§ŲØŖØ´ØŽØ§Øĩ",
|
"reset_people_visibility": "ØĨؚاد؊ ØļØ¨Øˇ ظŲŲØą Ø§ŲØŖØ´ØŽØ§Øĩ",
|
||||||
"reset_pin_code": "اؚاد؊ ØĒØšŲŲŲ ØąŲ
Ø˛ PIN",
|
"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": "ØĨؚاد؊ Ø§ŲØĒØšŲŲŲ ØĨŲŲ Ø§ŲØ§ŲØĒØąØ§ØļŲ",
|
"reset_to_default": "ØĨؚاد؊ Ø§ŲØĒØšŲŲŲ ØĨŲŲ Ø§ŲØ§ŲØĒØąØ§ØļŲ",
|
||||||
"resolve_duplicates": "Ų
ØšØ§ŲØŦØŠ اŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
"resolve_duplicates": "Ų
ØšØ§ŲØŦØŠ اŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
||||||
"resolved_all_duplicates": "ØĒŲ
ØŲ ØŦŲ
ب𠨧بĒŲØąØ§ØąØ§ØĒ",
|
"resolved_all_duplicates": "ØĒŲ
ØŲ ØŦŲ
ب𠨧بĒŲØąØ§ØąØ§ØĒ",
|
||||||
"restore": "Ø§ŲØ§ØŗØĒØšØ§Ø¯Ų Ų
Ų ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
"restore": "Ø§ŲØ§ØŗØĒØšØ§Ø¯Ų Ų
Ų ØŗŲØŠ Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||||
"restore_all": "Ø§ØŗØĒؚاد؊ اŲŲŲ",
|
"restore_all": "Ø§ØŗØĒؚاد؊ اŲŲŲ",
|
||||||
|
"restore_trash_action_prompt": "ØĒŲ
Ø§ØŗØĒؚاد؊ {count} Ų
Ų Ø§ŲŲ
ŲŲ
ŲØ§ØĒ",
|
||||||
"restore_user": "Ø§ØŗØĒؚاد؊ اŲŲ
ØŗØĒ؎دŲ
",
|
"restore_user": "Ø§ØŗØĒؚاد؊ اŲŲ
ØŗØĒ؎دŲ
",
|
||||||
"restored_asset": "اŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ØŗØĒؚاد؊",
|
"restored_asset": "اŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ØŗØĒؚاد؊",
|
||||||
"resume": "Ø§ØŗØĒØĻŲØ§Ų",
|
"resume": "Ø§ØŗØĒØĻŲØ§Ų",
|
||||||
"retry_upload": "ØŖØšØ¯ Ų
ØØ§ŲŲØŠ Ø§ŲØąŲØš",
|
"retry_upload": "ØŖØšØ¯ Ų
ØØ§ŲŲØŠ Ø§ŲØąŲØš",
|
||||||
"review_duplicates": "Ų
ØąØ§ØŦؚ؊ Ø§ŲØĒŲØąØ§ØąØ§ØĒ",
|
"review_duplicates": "Ų
ØąØ§ØŦؚ؊ Ø§ŲØĒŲØąØ§ØąØ§ØĒ",
|
||||||
|
"review_large_files": "Ų
ØąØ§ØŦؚ؊ اŲŲ
ŲŲØ§ØĒ اŲŲØ¨ŲØąØŠ",
|
||||||
"role": "Ø§ŲØ¯ŲØą",
|
"role": "Ø§ŲØ¯ŲØą",
|
||||||
"role_editor": "اŲŲ
ØØąØą",
|
"role_editor": "اŲŲ
ØØąØą",
|
||||||
"role_viewer": "Ø§ŲØšØ§ØąØļ",
|
"role_viewer": "Ø§ŲØšØ§ØąØļ",
|
||||||
|
"running": "ŲŲØ¯ Ø§ŲØĒØ´ØēŲŲ",
|
||||||
"save": "ØŲظ",
|
"save": "ØŲظ",
|
||||||
"save_to_gallery": "ØŲظ اŲŲ Ø§ŲŲ
ØšØąØļ",
|
"save_to_gallery": "ØŲظ اŲŲ Ø§ŲŲ
ØšØąØļ",
|
||||||
"saved_api_key": "ØĒŲ
ØŲظ Ų
ŲØĒØ§Ø اŲŲ API",
|
"saved_api_key": "ØĒŲ
ØŲظ Ų
ŲØĒØ§Ø اŲŲ API",
|
||||||
@@ -1686,6 +1762,7 @@
|
|||||||
"settings_saved": "ØĒŲ
ØŲظ Ø§ŲØĨؚداداØĒ",
|
"settings_saved": "ØĒŲ
ØŲظ Ø§ŲØĨؚداداØĒ",
|
||||||
"setup_pin_code": "ØĒØØ¯Ųد ØąŲ
Ø˛ PIN",
|
"setup_pin_code": "ØĒØØ¯Ųد ØąŲ
Ø˛ PIN",
|
||||||
"share": "Ų
Ø´Ø§ØąŲØŠ",
|
"share": "Ų
Ø´Ø§ØąŲØŠ",
|
||||||
|
"share_action_prompt": "ØĒŲ
Ų
Ø´Ø§ØąŲØŠ {count} ØŖØĩŲ (Ų
ŲŲ)",
|
||||||
"share_add_photos": "ØĨØļØ§ŲØŠ Ø§ŲØĩŲØą",
|
"share_add_photos": "ØĨØļØ§ŲØŠ Ø§ŲØĩŲØą",
|
||||||
"share_assets_selected": "ا؎ØĒŲØ§Øą {count}",
|
"share_assets_selected": "ا؎ØĒŲØ§Øą {count}",
|
||||||
"share_dialog_preparing": "ØĒØØļŲØą...",
|
"share_dialog_preparing": "ØĒØØļŲØą...",
|
||||||
@@ -1707,6 +1784,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "ŲØŗØŽ ØĨŲŲ Ø§ŲØØ§ŲØ¸ØŠ",
|
"shared_link_clipboard_copied_massage": "ŲØŗØŽ ØĨŲŲ Ø§ŲØØ§ŲØ¸ØŠ",
|
||||||
"shared_link_clipboard_text": "ØąØ§Ø¨Øˇ: {link}\nŲŲŲ
ØŠ اŲŲ
ØąŲØą: {password}",
|
"shared_link_clipboard_text": "ØąØ§Ø¨Øˇ: {link}\nŲŲŲ
ØŠ اŲŲ
ØąŲØą: {password}",
|
||||||
"shared_link_create_error": "ØŽØˇØŖ ØŖØĢŲØ§ØĄ ØĨŲØ´Ø§ØĄ ØąØ§Ø¨Øˇ Ų
Ø´ØĒØąŲ",
|
"shared_link_create_error": "ØŽØˇØŖ ØŖØĢŲØ§ØĄ ØĨŲØ´Ø§ØĄ ØąØ§Ø¨Øˇ Ų
Ø´ØĒØąŲ",
|
||||||
|
"shared_link_custom_url_description": "اŲŲØĩŲŲ ØĨŲŲ ŲØ°Ø§ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ Ø¨Ø§ØŗØĒ؎داŲ
ØšŲŲØ§Ų URL Ų
ØŽØĩØĩ",
|
||||||
"shared_link_edit_description_hint": "ØŖØ¯ØŽŲ ŲØĩŲ Ø§ŲŲ
Ø´Ø§ØąŲØŠ",
|
"shared_link_edit_description_hint": "ØŖØ¯ØŽŲ ŲØĩŲ Ø§ŲŲ
Ø´Ø§ØąŲØŠ",
|
||||||
"shared_link_edit_expire_after_option_day": "ŲŲŲ
1",
|
"shared_link_edit_expire_after_option_day": "ŲŲŲ
1",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} Ø§ŲØ§Ų
",
|
"shared_link_edit_expire_after_option_days": "{count} Ø§ŲØ§Ų
",
|
||||||
@@ -1732,6 +1810,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "ØĨØ¯Ø§ØąØŠ Ø§ŲØąŲØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲØŠ",
|
"shared_link_manage_links": "ØĨØ¯Ø§ØąØŠ Ø§ŲØąŲØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲØŠ",
|
||||||
"shared_link_options": "ØŽŲØ§ØąØ§ØĒ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
"shared_link_options": "ØŽŲØ§ØąØ§ØĒ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||||
|
"shared_link_password_description": "ØˇŲØ¨ ŲŲŲ
ØŠ Ų
ØąŲØą ŲŲŲØĩŲŲ ØĨŲŲ ŲØ°Ø§ Ø§ŲØąØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲ",
|
||||||
"shared_links": "ØąŲØ§Ø¨Øˇ Ų
Ø´ØĒØąŲØŠ",
|
"shared_links": "ØąŲØ§Ø¨Øˇ Ų
Ø´ØĒØąŲØŠ",
|
||||||
"shared_links_description": "ŲØĩŲ Ø§ŲØąŲØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲØŠ",
|
"shared_links_description": "ŲØĩŲ Ø§ŲØąŲØ§Ø¨Øˇ اŲŲ
Ø´ØĒØąŲØŠ",
|
||||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ŲØ´Ø§ØąŲŲØŠ.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, other {# Ø§ŲØĩŲØą ŲŲ
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ŲØ´Ø§ØąŲŲØŠ.}}",
|
||||||
@@ -1781,12 +1860,14 @@
|
|||||||
"sort_created": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØ´Ø§ØĄ",
|
"sort_created": "ØĒØ§ØąŲØŽ Ø§ŲØĨŲØ´Ø§ØĄ",
|
||||||
"sort_items": "ؚدد Ø§ŲØšŲاØĩØą",
|
"sort_items": "ؚدد Ø§ŲØšŲاØĩØą",
|
||||||
"sort_modified": "ØĒŲ
ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ",
|
"sort_modified": "ØĒŲ
ØĒؚدŲŲ Ø§ŲØĒØ§ØąŲØŽ",
|
||||||
|
"sort_newest": "Ø§ØØ¯ØĢ ØĩŲØąØŠ",
|
||||||
"sort_oldest": "ØŖŲØ¯Ų
ØĩŲØąØŠ",
|
"sort_oldest": "ØŖŲØ¯Ų
ØĩŲØąØŠ",
|
||||||
"sort_people_by_similarity": "ØąØĒب Ø§ŲØŖØ´ØŽØ§Øĩ ØØŗØ¨ Ø§ŲØĒØ´Ø§Ø¨Ų",
|
"sort_people_by_similarity": "ØąØĒب Ø§ŲØŖØ´ØŽØ§Øĩ ØØŗØ¨ Ø§ŲØĒØ´Ø§Ø¨Ų",
|
||||||
"sort_recent": "ØŖØØ¯ØĢ ØĩŲØąØŠ",
|
"sort_recent": "ØŖØØ¯ØĢ ØĩŲØąØŠ",
|
||||||
"sort_title": "Ø§ŲØšŲŲØ§Ų",
|
"sort_title": "Ø§ŲØšŲŲØ§Ų",
|
||||||
"source": "اŲŲ
ØĩØ¯Øą",
|
"source": "اŲŲ
ØĩØ¯Øą",
|
||||||
"stack": "ØĒØŦŲ
ŲØš",
|
"stack": "ØĒØŦŲ
ŲØš",
|
||||||
|
"stack_action_prompt": "{count} Ų
ŲØ¯ØŗØŠ",
|
||||||
"stack_duplicates": "ØĒØŦŲ
ب𠨧ŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
"stack_duplicates": "ØĒØŦŲ
ب𠨧ŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
||||||
"stack_select_one_photo": "ØØ¯Ø¯ ØĩŲØąØŠ ØąØĻŲØŗŲØŠ ŲØ§ØØ¯ØŠ ŲŲŲ
ØŦŲ
ŲØšØŠ",
|
"stack_select_one_photo": "ØØ¯Ø¯ ØĩŲØąØŠ ØąØĻŲØŗŲØŠ ŲØ§ØØ¯ØŠ ŲŲŲ
ØŦŲ
ŲØšØŠ",
|
||||||
"stack_selected_photos": "ŲØ¯Øŗ Ø§ŲØĩŲØą Ø§ŲŲ
ØØ¯Ø¯ØŠ",
|
"stack_selected_photos": "ŲØ¯Øŗ Ø§ŲØĩŲØą Ø§ŲŲ
ØØ¯Ø¯ØŠ",
|
||||||
@@ -1806,6 +1887,7 @@
|
|||||||
"storage_quota": "ØØĩØŠ Ø§ŲØŽØ˛Ų",
|
"storage_quota": "ØØĩØŠ Ø§ŲØŽØ˛Ų",
|
||||||
"storage_usage": "{used} Ų
Ų {available} Ų
ŲØŗØĒØŽŲØ¯Ų
",
|
"storage_usage": "{used} Ų
Ų {available} Ų
ŲØŗØĒØŽŲØ¯Ų
",
|
||||||
"submit": "ØĨØąØŗØ§Ų",
|
"submit": "ØĨØąØŗØ§Ų",
|
||||||
|
"success": "ØĒŲ
Ø¨ŲØŦاØ",
|
||||||
"suggestions": "Ø§ŲØĒØąØ§ØØ§ØĒ",
|
"suggestions": "Ø§ŲØĒØąØ§ØØ§ØĒ",
|
||||||
"sunrise_on_the_beach": "Ø´ØąŲŲ Ø§ŲØ´Ų
Øŗ ØšŲŲ Ø§ŲØ´Ø§ØˇØĻ",
|
"sunrise_on_the_beach": "Ø´ØąŲŲ Ø§ŲØ´Ų
Øŗ ØšŲŲ Ø§ŲØ´Ø§ØˇØĻ",
|
||||||
"support": "Ø§ŲØ¯ØšŲ
",
|
"support": "Ø§ŲØ¯ØšŲ
",
|
||||||
@@ -1815,6 +1897,8 @@
|
|||||||
"sync": "Ų
Ø˛Ø§Ų
ŲØŠ",
|
"sync": "Ų
Ø˛Ø§Ų
ŲØŠ",
|
||||||
"sync_albums": "Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲØ§ŲبŲŲ
اØĒ",
|
"sync_albums": "Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲØ§ŲبŲŲ
اØĒ",
|
||||||
"sync_albums_manual_subtitle": "Ų
Ø˛Ø§Ų
ŲØŠ ØŦŲ
ب𠨧ŲŲØ¯ŲŲŲØ§ØĒ ŲØ§ŲØĩŲØą Ø§ŲŲ
ØąŲŲØšØŠ Ø§ŲŲ Ø§ŲØ¨ŲŲ
اØĒ Ø§ŲØŽØ˛Ų Ø§ŲØ§ØØĒŲØ§ØˇŲ اŲŲ
ØŽØĒØ§ØąØŠ",
|
"sync_albums_manual_subtitle": "Ų
Ø˛Ø§Ų
ŲØŠ ØŦŲ
ب𠨧ŲŲØ¯ŲŲŲØ§ØĒ ŲØ§ŲØĩŲØą Ø§ŲŲ
ØąŲŲØšØŠ Ø§ŲŲ Ø§ŲØ¨ŲŲ
اØĒ Ø§ŲØŽØ˛Ų Ø§ŲØ§ØØĒŲØ§ØˇŲ اŲŲ
ØŽØĒØ§ØąØŠ",
|
||||||
|
"sync_local": "Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲŲ
ŲŲØ§ØĒ اŲŲ
ØŲŲØŠ",
|
||||||
|
"sync_remote": "Ų
Ø˛Ø§Ų
ŲØŠ Ø§ŲŲ
ŲŲØ§ØĒ Ø§ŲØ¨ØšŲد؊",
|
||||||
"sync_upload_album_setting_subtitle": "Ø§ŲØ´ØĻ Ų Ø§ØąŲØš ØĩŲØąŲ Ų ŲØ¯ŲŲŲØ§ØĒŲ Ø§ŲØ§ŲبŲŲ
اØĒ اŲŲ
ØŽØĒØ§ØąØŠ ŲŲ Immich",
|
"sync_upload_album_setting_subtitle": "Ø§ŲØ´ØĻ Ų Ø§ØąŲØš ØĩŲØąŲ Ų ŲØ¯ŲŲŲØ§ØĒŲ Ø§ŲØ§ŲبŲŲ
اØĒ اŲŲ
ØŽØĒØ§ØąØŠ ŲŲ Immich",
|
||||||
"tag": "Ø§ŲØšŲاŲ
ØŠ",
|
"tag": "Ø§ŲØšŲاŲ
ØŠ",
|
||||||
"tag_assets": "ØŖØĩŲŲ Ø§ŲØšŲاŲ
ØŠ",
|
"tag_assets": "ØŖØĩŲŲ Ø§ŲØšŲاŲ
ØŠ",
|
||||||
@@ -1825,6 +1909,7 @@
|
|||||||
"tag_updated": "ØĒŲ
ØĒØØ¯ŲØĢ Ø§ŲØšŲاŲ
ØŠ: {tag}",
|
"tag_updated": "ØĒŲ
ØĒØØ¯ŲØĢ Ø§ŲØšŲاŲ
ØŠ: {tag}",
|
||||||
"tagged_assets": "ØĒŲ
ŲØļØš ØšŲØ§Ų
ØŠ {count, plural, one {# asset} other {# assets}}",
|
"tagged_assets": "ØĒŲ
ŲØļØš ØšŲØ§Ų
ØŠ {count, plural, one {# asset} other {# assets}}",
|
||||||
"tags": "Ø§ŲØšŲاŲ
اØĒ",
|
"tags": "Ø§ŲØšŲاŲ
اØĒ",
|
||||||
|
"tap_to_run_job": "اŲŲØą ŲØĒØ´ØēŲŲ Ø§ŲŲ
ŲŲ
ØŠ",
|
||||||
"template": "اŲŲŲ
ŲØ°ØŦ",
|
"template": "اŲŲŲ
ŲØ°ØŦ",
|
||||||
"theme": "Ų
Ø¸ŲØą",
|
"theme": "Ų
Ø¸ŲØą",
|
||||||
"theme_selection": "ا؎ØĒŲØ§Øą Ø§ŲØŗŲ
ØŠ",
|
"theme_selection": "ا؎ØĒŲØ§Øą Ø§ŲØŗŲ
ØŠ",
|
||||||
@@ -1897,15 +1982,20 @@
|
|||||||
"unselect_all_duplicates": "ØĨŲØēØ§ØĄ ØĒØØ¯Ųد ŲØ§ŲØŠ اŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
"unselect_all_duplicates": "ØĨŲØēØ§ØĄ ØĒØØ¯Ųد ŲØ§ŲØŠ اŲŲØŗØŽ اŲŲ
ŲØąØąØŠ",
|
||||||
"unselect_all_in": "ØĨŲØēØ§ØĄ ØĒØØ¯Ųد اŲŲŲ ŲŲ {group}",
|
"unselect_all_in": "ØĨŲØēØ§ØĄ ØĒØØ¯Ųد اŲŲŲ ŲŲ {group}",
|
||||||
"unstack": "ŲŲ Ø§ŲŲŲŲ
Ų",
|
"unstack": "ŲŲ Ø§ŲŲŲŲ
Ų",
|
||||||
|
"unstack_action_prompt": "ØĒŲ
Ø§Ø˛Ø§ŲØŠ ØĒŲØ¯ŲØŗ {count}",
|
||||||
"unstacked_assets_count": "ØĒŲ
ØĨØŽØąØ§ØŦ {count, plural, one {# Ø§ŲØŖØĩŲ} other {# Ø§ŲØŖØĩŲŲ}} Ų
Ų Ø§ŲØĒŲØ¯ŲØŗ",
|
"unstacked_assets_count": "ØĒŲ
ØĨØŽØąØ§ØŦ {count, plural, one {# Ø§ŲØŖØĩŲ} other {# Ø§ŲØŖØĩŲŲ}} Ų
Ų Ø§ŲØĒŲØ¯ŲØŗ",
|
||||||
|
"untagged": "ØēŲØą Ų
ŲØšŲŲŲŲŲ
",
|
||||||
"up_next": "Ø§ŲØĒØ§ŲŲ",
|
"up_next": "Ø§ŲØĒØ§ŲŲ",
|
||||||
"updated_at": "ØĒŲ
Ø§ŲØĒØØ¯ŲØĢ",
|
"updated_at": "ØĒŲ
Ø§ŲØĒØØ¯ŲØĢ",
|
||||||
"updated_password": "ØĒŲ
ØĒØØ¯ŲØĢ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
"updated_password": "ØĒŲ
ØĒØØ¯ŲØĢ ŲŲŲ
ØŠ اŲŲ
ØąŲØą",
|
||||||
"upload": "ØąŲØš",
|
"upload": "ØąŲØš",
|
||||||
|
"upload_action_prompt": "{count} Ų
ŲŲ ŲŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØ§ŲØĒØ¸Ø§Øą ŲŲØąŲØš",
|
||||||
"upload_concurrency": "Ø§ŲØąŲØš اŲŲ
ØĒØ˛Ø§Ų
Ų",
|
"upload_concurrency": "Ø§ŲØąŲØš اŲŲ
ØĒØ˛Ø§Ų
Ų",
|
||||||
|
"upload_details": "ØĒŲØ§ØĩŲŲ Ø§ŲØąŲØš",
|
||||||
"upload_dialog_info": "ŲŲ ØĒØąŲØ¯ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ ŲŲØŖØĩŲŲ (Ø§ŲØŖØĩŲŲ) اŲŲ
ØØ¯Ø¯ØŠ ØĨŲŲ Ø§ŲØŽØ§Ø¯Ų
Ø",
|
"upload_dialog_info": "ŲŲ ØĒØąŲØ¯ اŲŲØŗØŽ Ø§ŲØ§ØØĒŲØ§ØˇŲ ŲŲØŖØĩŲŲ (Ø§ŲØŖØĩŲŲ) اŲŲ
ØØ¯Ø¯ØŠ ØĨŲŲ Ø§ŲØŽØ§Ø¯Ų
Ø",
|
||||||
"upload_dialog_title": "ØĒØŲ
ŲŲ Ø§ŲØŖØĩŲŲ",
|
"upload_dialog_title": "ØĒØŲ
ŲŲ Ø§ŲØŖØĩŲŲ",
|
||||||
"upload_errors": "ØĨŲØĒŲ
Ų Ø§ŲØąŲØš Ų
Øš {count, plural, one {# ØŽØˇØŖ} other {# ØŖØŽØˇØ§ØĄ}}, ŲŲ
بØĒØØ¯ŲØĢ Ø§ŲØĩŲØØŠ ŲØąØ¤ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ Ø§ŲØŦØ¯ŲØ¯ØŠ Ø§ŲØĒŲ ØĒŲ
ØąŲØšŲا.",
|
"upload_errors": "ØĨŲØĒŲ
Ų Ø§ŲØąŲØš Ų
Øš {count, plural, one {# ØŽØˇØŖ} other {# ØŖØŽØˇØ§ØĄ}}, ŲŲ
بØĒØØ¯ŲØĢ Ø§ŲØĩŲØØŠ ŲØąØ¤ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ Ø§ŲØŦØ¯ŲØ¯ØŠ Ø§ŲØĒŲ ØĒŲ
ØąŲØšŲا.",
|
||||||
|
"upload_finished": "ØĒŲ
Ø§ŲØ§ŲØĒŲØ§ØĄ Ų
Ų Ø§ŲØąŲØš",
|
||||||
"upload_progress": "Ų
ØĒبŲŲØŠ {remaining, number} - Ų
ØšØ§ŲØŦØŠ {processed, number}/{total, number}",
|
"upload_progress": "Ų
ØĒبŲŲØŠ {remaining, number} - Ų
ØšØ§ŲØŦØŠ {processed, number}/{total, number}",
|
||||||
"upload_skipped_duplicates": "ØĒŲ
ØĒØŽØˇŲ {count, plural, one {# Ų
ØØĒŲŲ Ų
ŲØąØą} other {# Ų
ØØĒŲŲØ§ØĒ Ų
ŲØąØąØŠ }}",
|
"upload_skipped_duplicates": "ØĒŲ
ØĒØŽØˇŲ {count, plural, one {# Ų
ØØĒŲŲ Ų
ŲØąØą} other {# Ų
ØØĒŲŲØ§ØĒ Ų
ŲØąØąØŠ }}",
|
||||||
"upload_status_duplicates": "Ø§ŲØĒŲØąØ§ØąØ§ØĒ",
|
"upload_status_duplicates": "Ø§ŲØĒŲØąØ§ØąØ§ØĒ",
|
||||||
@@ -1914,6 +2004,7 @@
|
|||||||
"upload_success": "ØĒŲ
Ø§ŲØąŲØš Ø¨ŲØŦØ§ØØ ŲŲ
بØĒØØ¯ŲØĢ Ø§ŲØĩŲØØŠ ŲØąØ¤ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ØąŲŲØšØŠ Ø§ŲØŦØ¯ŲØ¯ØŠ.",
|
"upload_success": "ØĒŲ
Ø§ŲØąŲØš Ø¨ŲØŦØ§ØØ ŲŲ
بØĒØØ¯ŲØĢ Ø§ŲØĩŲØØŠ ŲØąØ¤ŲØŠ Ø§ŲŲ
ØØĒŲŲØ§ØĒ اŲŲ
ØąŲŲØšØŠ Ø§ŲØŦØ¯ŲØ¯ØŠ.",
|
||||||
"upload_to_immich": "Ø§ŲØąŲØš اŲŲImmich â â ({count})",
|
"upload_to_immich": "Ø§ŲØąŲØš اŲŲImmich â â ({count})",
|
||||||
"uploading": "ØŦØ§ØąŲ Ø§ŲØąŲØš",
|
"uploading": "ØŦØ§ØąŲ Ø§ŲØąŲØš",
|
||||||
|
"uploading_media": "ØąŲØš Ø§ŲŲØŗØ§ØĻØˇ",
|
||||||
"url": "ØšŲŲØ§Ų URL",
|
"url": "ØšŲŲØ§Ų URL",
|
||||||
"usage": "Ø§ŲØ§ØŗØĒ؎داŲ
",
|
"usage": "Ø§ŲØ§ØŗØĒ؎داŲ
",
|
||||||
"use_biometric": "Ø§ØŗØĒ؎دŲ
Ø§ŲØ¨Ø§ŲŲŲ
ØĒØąŲ",
|
"use_biometric": "Ø§ØŗØĒ؎دŲ
Ø§ŲØ¨Ø§ŲŲŲ
ØĒØąŲ",
|
||||||
@@ -1934,6 +2025,7 @@
|
|||||||
"user_usage_stats_description": "ØšØąØļ ØĨØØĩاØĻŲØ§ØĒ Ø§ØŗØĒ؎داŲ
Ø§ŲØØŗØ§Ø¨",
|
"user_usage_stats_description": "ØšØąØļ ØĨØØĩاØĻŲØ§ØĒ Ø§ØŗØĒ؎داŲ
Ø§ŲØØŗØ§Ø¨",
|
||||||
"username": "Ø§ØŗŲ
اŲŲ
ØŗØĒ؎دŲ
",
|
"username": "Ø§ØŗŲ
اŲŲ
ØŗØĒ؎دŲ
",
|
||||||
"users": "اŲŲ
ØŗØĒ؎دŲ
ŲŲ",
|
"users": "اŲŲ
ØŗØĒ؎دŲ
ŲŲ",
|
||||||
|
"users_added_to_album_count": "ØĒŲ
اØļØ§ŲØŠ{count, plural, one {# Ų
ØŗØĒ؎دŲ
} other {# Ų
ØŗØĒ؎دŲ
ŲŲ}} اŲŲ Ø§ŲØ§ŲبŲŲ
",
|
||||||
"utilities": "ØŖØ¯ŲØ§ØĒ",
|
"utilities": "ØŖØ¯ŲØ§ØĒ",
|
||||||
"validate": "ØĒØŲŲŲ",
|
"validate": "ØĒØŲŲŲ",
|
||||||
"validate_endpoint_error": "Ø§ŲØąØŦØ§ØĄ Ø§Ø¯ØŽØ§Ų ØšŲŲØ§Ų URL ØĩØ§ŲØ",
|
"validate_endpoint_error": "Ø§ŲØąØŦØ§ØĄ Ø§Ø¯ØŽØ§Ų ØšŲŲØ§Ų URL ØĩØ§ŲØ",
|
||||||
@@ -1952,6 +2044,7 @@
|
|||||||
"view_album": "ØšØąØļ Ø§ŲØŖŲبŲŲ
",
|
"view_album": "ØšØąØļ Ø§ŲØŖŲبŲŲ
",
|
||||||
"view_all": "ØšØąØļ اŲŲŲ",
|
"view_all": "ØšØąØļ اŲŲŲ",
|
||||||
"view_all_users": "ØšØąØļ ŲØ§ŲØŠ اŲŲ
ØŗØĒ؎دŲ
ŲŲ",
|
"view_all_users": "ØšØąØļ ŲØ§ŲØŠ اŲŲ
ØŗØĒ؎دŲ
ŲŲ",
|
||||||
|
"view_details": "ØąØ¤ŲØŠ Ø§ŲØĒŲØ§ØĩŲŲ",
|
||||||
"view_in_timeline": "ØšØąØļ ŲŲ Ø§ŲØŦدŲŲ Ø§ŲØ˛Ų
ŲŲ",
|
"view_in_timeline": "ØšØąØļ ŲŲ Ø§ŲØŦدŲŲ Ø§ŲØ˛Ų
ŲŲ",
|
||||||
"view_link": "ØšØąØļ Ø§ŲØąØ§Ø¨Øˇ",
|
"view_link": "ØšØąØļ Ø§ŲØąØ§Ø¨Øˇ",
|
||||||
"view_links": "ØšØąØļ Ø§ŲØąŲØ§Ø¨Øˇ",
|
"view_links": "ØšØąØļ Ø§ŲØąŲØ§Ø¨Øˇ",
|
||||||
|
|||||||
126
i18n/be.json
@@ -6,7 +6,7 @@
|
|||||||
"action": "ĐСĐĩŅĐŊĐŊĐĩ",
|
"action": "ĐСĐĩŅĐŊĐŊĐĩ",
|
||||||
"action_common_update": "ĐĐąĐŊавŅŅŅ",
|
"action_common_update": "ĐĐąĐŊавŅŅŅ",
|
||||||
"actions": "ĐСĐĩŅĐŊĐŊŅ",
|
"actions": "ĐСĐĩŅĐŊĐŊŅ",
|
||||||
"active": "ĐĐēŅŅŅĐŊŅ",
|
"active": "ĐĐēŅŅŅĐŊŅŅ
",
|
||||||
"activity": "ĐĐēŅŅŅĐŊаŅŅŅ",
|
"activity": "ĐĐēŅŅŅĐŊаŅŅŅ",
|
||||||
"activity_changed": "ĐĐēŅŅŅĐŊаŅŅŅ {enabled, select, true {ŅĐēĐģŅŅаĐŊа} other {адĐēĐģŅŅаĐŊа}}",
|
"activity_changed": "ĐĐēŅŅŅĐŊаŅŅŅ {enabled, select, true {ŅĐēĐģŅŅаĐŊа} other {адĐēĐģŅŅаĐŊа}}",
|
||||||
"add": "ĐадаŅŅ",
|
"add": "ĐадаŅŅ",
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
"add_a_location": "ĐадаŅŅ ĐŧĐĩŅŅа",
|
"add_a_location": "ĐадаŅŅ ĐŧĐĩŅŅа",
|
||||||
"add_a_name": "ĐадаŅŅ ŅĐŧŅ",
|
"add_a_name": "ĐадаŅŅ ŅĐŧŅ",
|
||||||
"add_a_title": "ĐадаŅŅ ĐˇĐ°ĐŗĐ°ĐģОваĐē",
|
"add_a_title": "ĐадаŅŅ ĐˇĐ°ĐŗĐ°ĐģОваĐē",
|
||||||
|
"add_birthday": "ĐадаŅŅ Đ´ĐˇĐĩĐŊŅ ĐŊаŅадĐļŅĐŊĐŊŅ",
|
||||||
"add_endpoint": "ĐадаŅŅ ĐēŅĐžĐŋĐēŅ Đ´ĐžŅŅŅĐŋŅ",
|
"add_endpoint": "ĐадаŅŅ ĐēŅĐžĐŋĐēŅ Đ´ĐžŅŅŅĐŋŅ",
|
||||||
"add_exclusion_pattern": "ĐадаŅŅ ŅайĐģĐžĐŊ вŅĐēĐģŅŅŅĐŊĐŊŅ",
|
"add_exclusion_pattern": "ĐадаŅŅ ŅайĐģĐžĐŊ вŅĐēĐģŅŅŅĐŊĐŊŅ",
|
||||||
"add_import_path": "ĐадаŅŅ ŅĐģŅŅ
ŅĐŧĐŋаŅŅŅ",
|
"add_import_path": "ĐадаŅŅ ŅĐģŅŅ
ŅĐŧĐŋаŅŅŅ",
|
||||||
@@ -44,6 +45,10 @@
|
|||||||
"backup_database": "ĐĄŅваŅŅŅŅ ŅŅСĐĩŅвОвŅŅ ĐēĐžĐŋŅŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
",
|
"backup_database": "ĐĄŅваŅŅŅŅ ŅŅСĐĩŅвОвŅŅ ĐēĐžĐŋŅŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
",
|
||||||
"backup_database_enable_description": "ĐŖĐēĐģŅŅŅŅŅ ŅŅСĐĩŅваваĐŊĐŊĐĩ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
",
|
"backup_database_enable_description": "ĐŖĐēĐģŅŅŅŅŅ ŅŅСĐĩŅваваĐŊĐŊĐĩ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
",
|
||||||
"backup_keep_last_amount": "ĐĐžĐģŅĐēаŅŅŅ ĐŋаĐŋŅŅŅĐ´ĐŊŅŅ
ŅŅСĐĩŅвОвŅŅ
ĐēĐžĐŋŅĐš Đ´ĐģŅ ĐˇĐ°Ņ
аваĐŊĐŊŅ",
|
"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": "ĐаĐģĐ°Đ´Ņ ŅŅСĐĩŅĐ˛ĐžĐ˛Đ°ĐŗĐ° ĐēаĐŋŅŅваĐŊĐŊŅ",
|
||||||
"backup_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ŅŅСĐĩŅваваĐŊĐŊŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
.",
|
"backup_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ŅŅСĐĩŅваваĐŊĐŊŅ ĐąĐ°ĐˇŅ Đ´Đ°ĐŊŅŅ
.",
|
||||||
"cleared_jobs": "ĐŅŅŅŅаĐŊŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ Đ´ĐģŅ: {job}",
|
"cleared_jobs": "ĐŅŅŅŅаĐŊŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ Đ´ĐģŅ: {job}",
|
||||||
@@ -56,14 +61,14 @@
|
|||||||
"confirm_user_pin_code_reset": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ Ņ ŅŅĐŧ, ŅŅĐž ĐļадаĐĩŅĐĩ ŅĐēŅĐŊŅŅŅ PIN-ĐēОд {user}?",
|
"confirm_user_pin_code_reset": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ Ņ ŅŅĐŧ, ŅŅĐž ĐļадаĐĩŅĐĩ ŅĐēŅĐŊŅŅŅ PIN-ĐēОд {user}?",
|
||||||
"create_job": "ĐĄŅваŅŅŅŅ ĐˇĐ°Đ´Đ°ĐŊĐŊĐĩ",
|
"create_job": "ĐĄŅваŅŅŅŅ ĐˇĐ°Đ´Đ°ĐŊĐŊĐĩ",
|
||||||
"cron_expression": "ĐŅŅаС Cron",
|
"cron_expression": "ĐŅŅаС Cron",
|
||||||
"cron_expression_description": "ĐŖŅŅаĐģŅĐšŅĐĩ ŅĐŊŅŅŅваĐģ ŅĐēаĐŊаваĐŊĐŊŅ, вŅĐēаŅŅŅŅĐžŅваŅŅŅ ŅаŅĐŧĐ°Ņ cron. ĐĐģŅ Đ°ŅŅŅĐŧаĐŊĐŊŅ Đ´Đ°Đ´Đ°ŅĐēОваК ŅĐŊŅаŅĐŧаŅŅŅ, ĐēаĐģŅ ĐģаŅĐēа, СвŅŅĐŊŅŅĐĩŅŅ, ĐŊаĐŋŅŅĐēĐģад, да <link>Crontab Guru</link>",
|
"cron_expression_description": "ĐадаКŅĐĩ ŅĐŊŅŅŅваĐģ ŅĐēаĐŊаваĐŊĐŊŅ, вŅĐēаŅŅŅŅĐžŅваŅŅŅ ŅаŅĐŧĐ°Ņ cron. ĐĐģŅ Đ°ŅŅŅĐŧаĐŊĐŊŅ Đ´Đ°Đ´Đ°ŅĐēОваК ŅĐŊŅаŅĐŧаŅŅŅ, СвŅŅĐŊŅŅĐĩŅŅ, ĐŊаĐŋŅŅĐēĐģад, да <link>Crontab Guru</link>",
|
||||||
"cron_expression_presets": "ĐŅадŅŅŅаĐŊĐžŅĐēŅ Đ˛ŅŅĐ°ĐˇĐ°Ņ Cron",
|
"cron_expression_presets": "ĐŅадŅŅŅаĐŊĐžŅĐēŅ Đ˛ŅŅĐ°ĐˇĐ°Ņ Cron",
|
||||||
"disable_login": "ĐĐ´ĐēĐģŅŅŅŅŅ ŅваŅ
Од",
|
"disable_login": "ĐĐ´ĐēĐģŅŅŅŅŅ ŅваŅ
Од",
|
||||||
"duplicate_detection_job_description": "ĐаĐŋŅŅŅŅŅŅ ĐŧаŅŅĐŊĐŊаĐĩ ĐŊавŅŅаĐŊĐŊĐĩ ĐŊа аĐēŅŅваŅ
Đ´ĐģŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ĐŋадОйĐŊŅŅ
вŅŅŅ. ĐаĐģĐĩĐļŅŅŅ Đ°Đ´ Smart Search",
|
"duplicate_detection_job_description": "ĐаĐŋŅŅŅŅŅŅ ĐŧаŅŅĐŊĐŊаĐĩ ĐŊавŅŅаĐŊĐŊĐĩ ĐŊа аĐēŅŅваŅ
Đ´ĐģŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ĐŋадОйĐŊŅŅ
вŅŅŅ. ĐаĐģĐĩĐļŅŅŅ Đ°Đ´ Smart Search",
|
||||||
"exclusion_pattern_description": "ШайĐģĐžĐŊŅ Đ˛ŅĐēĐģŅŅŅĐŊĐŊŅ Đ´Đ°ĐˇĐ˛Đ°ĐģŅŅŅŅ ŅĐŗĐŊаŅаваŅŅ ŅаКĐģŅ Ņ ĐŋаĐŋĐēŅ ĐŋŅŅ ŅĐēаĐŊаваĐŊĐŊŅ Đ˛Đ°ŅаК ĐąŅĐąĐģŅŅŅŅĐēŅ. ĐŅŅа ĐēаŅŅŅĐŊа, ĐēаĐģŅ Ņ Đ˛Đ°Ņ ŅŅŅŅ ĐŋаĐŋĐēŅ, ŅĐēŅŅ ĐˇĐŧŅŅŅаŅŅŅ ŅаКĐģŅ, ŅĐēŅŅ Đ˛Ņ ĐŊĐĩ Ņ
ĐžŅаŅĐĩ ŅĐŧĐŋаŅŅаваŅŅ, ĐŊаĐŋŅŅĐēĐģад, ŅаКĐģŅ RAW.",
|
"exclusion_pattern_description": "ШайĐģĐžĐŊŅ Đ˛ŅĐēĐģŅŅŅĐŊĐŊŅ Đ´Đ°ĐˇĐ˛Đ°ĐģŅŅŅŅ ŅĐŗĐŊаŅаваŅŅ ŅаКĐģŅ Ņ ĐŋаĐŋĐēŅ ĐŋŅŅ ŅĐēаĐŊаваĐŊĐŊŅ Đ˛Đ°ŅаК ĐąŅĐąĐģŅŅŅŅĐēŅ. ĐŅŅа ĐēаŅŅŅĐŊа, ĐēаĐģŅ Ņ Đ˛Đ°Ņ ŅŅŅŅ ĐŋаĐŋĐēŅ, ŅĐēŅŅ ĐˇĐŧŅŅŅаŅŅŅ ŅаКĐģŅ, ŅĐēŅŅ Đ˛Ņ ĐŊĐĩ Ņ
ĐžŅаŅĐĩ ŅĐŧĐŋаŅŅаваŅŅ, ĐŊаĐŋŅŅĐēĐģад, ŅаКĐģŅ RAW.",
|
||||||
"external_library_management": "ĐŅŅаваĐŊĐŊĐĩ СĐŊĐĩŅĐŊŅĐš ĐąŅĐąĐģŅŅŅŅĐēаК",
|
"external_library_management": "ĐŅŅаваĐŊĐŊĐĩ СĐŊĐĩŅĐŊŅĐš ĐąŅĐąĐģŅŅŅŅĐēаК",
|
||||||
"face_detection": "ĐŅŅŅĐģĐĩĐŊĐŊĐĩ ŅваŅаŅ",
|
"face_detection": "ĐŅŅŅĐģĐĩĐŊĐŊĐĩ ŅваŅаŅ",
|
||||||
"face_detection_description": "ĐŅŅŅĐģŅŅŅ ŅваŅŅ ĐŊа ŅĐžŅаСдŅĐŧĐēаŅ
Ņ Đ˛ŅĐ´Ņа С даĐŋаĐŧĐžĐŗĐ°Đš ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ. ĐĐģŅ Đ˛ŅĐ´Ņа ŅĐģŅŅваĐĩŅŅа ŅĐžĐģŅĐēŅ ĐŧŅĐŊŅŅŅŅŅа. \"ĐĐąĐŊавŅŅŅ\" (ĐŋĐĩŅа)аĐŋŅаŅĐžŅваĐĩ ŅŅĐĩ ĐŧĐĩĐ´ŅŅ. \"ĐĄĐēŅĐŊŅŅŅ\" дадаŅĐēОва аŅŅŅŅаĐĩ ŅŅĐĩ ĐąŅĐŗŅŅŅŅ Đ´Đ°Đ´ĐˇĐĩĐŊŅŅ ĐŋŅа ŅваŅŅ. \"ĐĐ´ŅŅŅĐŊŅŅаĐĩ\" ŅŅавŅŅŅ Ņ ŅаŅĐŗŅ ĐŧĐĩĐ´ŅŅ, ŅĐēŅŅ ŅŅŅŅ ĐŊĐĩ ĐąŅĐģŅ Đ°ĐŋŅаŅаваĐŊŅŅ. ĐŅŅŅĐģĐĩĐŊŅŅ ŅваŅŅ ĐąŅĐ´ŅŅŅ ĐŋаŅŅаŅĐģĐĩĐŊŅ Ņ ŅаŅĐŗŅ Đ´ĐģŅ ŅаŅĐŋаСĐŊаваĐŊĐŊŅ Đ°ŅОй ĐŋаŅĐģŅ ĐˇĐ°Đ˛ŅŅŅŅĐŊĐŊŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ŅваŅаŅ, С ĐŗŅŅĐŋаваĐŊĐŊĐĩĐŧ ŅŅ
Đŋа ŅŅĐŊŅŅŅŅŅ
айО ĐŊОвŅŅ
ĐģŅдСŅŅ
.",
|
"face_detection_description": "ĐŅŅŅĐģŅŅŅ ŅваŅŅ ĐŊа ŅĐžŅаСдŅĐŧĐēаŅ
Ņ Đ˛ŅĐ´Ņа С даĐŋаĐŧĐžĐŗĐ°Đš ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ. ĐĐģŅ Đ˛ŅĐ´Ņа ŅĐģŅŅваĐĩŅŅа ŅĐžĐģŅĐēŅ ĐŧŅĐŊŅŅŅŅŅа. \"ĐĐąĐŊавŅŅŅ\" (ĐŋĐĩŅа)аĐŋŅаŅĐžŅваĐĩ ŅŅĐĩ ĐŧĐĩĐ´ŅŅ. \"ĐĄĐēŅĐŊŅŅŅ\" дадаŅĐēОва аŅŅŅŅаĐĩ ŅŅĐĩ ĐąŅĐŗŅŅŅŅ Đ´Đ°ĐŊŅŅ ĐŋŅа ŅваŅŅ. \"ĐĐ´ŅŅŅĐŊŅŅаĐĩ\" ŅŅавŅŅŅ Ņ ŅаŅĐŗŅ ĐŧĐĩĐ´ŅŅ, ŅĐēŅŅ ŅŅŅŅ ĐŊĐĩ ĐąŅĐģŅ Đ°ĐŋŅаŅаваĐŊŅŅ. ĐŅŅŅĐģĐĩĐŊŅŅ ŅваŅŅ ĐąŅĐ´ŅŅŅ ĐŋаŅŅаŅĐģĐĩĐŊŅ Ņ ŅаŅĐŗŅ Đ´ĐģŅ ŅаŅĐŋаСĐŊаваĐŊĐŊŅ Đ°ŅОй ĐŋаŅĐģŅ ĐˇĐ°Đ˛ŅŅŅŅĐŊĐŊŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ŅваŅаŅ, С ĐŗŅŅĐŋаваĐŊĐŊĐĩĐŧ ŅŅ
Đŋа ŅŅĐŊŅŅŅŅŅ
айО ĐŊОвŅŅ
ĐģŅдСŅŅ
.",
|
||||||
"facial_recognition_job_description": "ĐŅŅĐŋаваŅŅ Đ˛ŅŅŅĐģĐĩĐŊŅŅ ŅваŅŅ Đŋа аŅОйаŅ
. ĐŅŅŅ ŅŅаĐŋ вŅĐēĐžĐŊваĐĩŅŅа ĐŋаŅĐģŅ ĐˇĐ°Đ˛ŅŅŅŅĐŊĐŊŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ŅваŅаŅ. \"ĐĄĐēŅĐŊŅŅŅ\" (ĐŋаŅŅĐžŅĐŊа) ĐŋĐĩŅĐ°ĐŗŅŅĐŋĐžŅваĐĩ ŅŅĐĩ ŅваŅŅ. \"ĐĐ´ŅŅŅĐŊŅŅаĐĩ\" ŅŅавŅŅŅ Ņ ŅаŅĐŗŅ ŅваŅŅ, ŅĐēŅŅ ŅŅŅŅ ĐŊĐĩ ĐŋŅŅĐŋŅŅаĐŊŅŅ Đ´Đ° ŅĐēОК-ĐŊĐĩĐąŅĐ´ĐˇŅ Đ°ŅОйŅ.",
|
"facial_recognition_job_description": "ĐŅŅĐŋаваŅŅ Đ˛ŅŅŅĐģĐĩĐŊŅŅ ŅваŅŅ Đŋа аŅОйаŅ
. ĐŅŅŅ ŅŅаĐŋ вŅĐēĐžĐŊваĐĩŅŅа ĐŋаŅĐģŅ ĐˇĐ°Đ˛ŅŅŅŅĐŊĐŊŅ Đ˛ŅŅŅĐģĐĩĐŊĐŊŅ ŅваŅаŅ. \"ĐĄĐēŅĐŊŅŅŅ\" (ĐŋаŅŅĐžŅĐŊа) ĐŋĐĩŅĐ°ĐŗŅŅĐŋĐžŅваĐĩ ŅŅĐĩ ŅваŅŅ. \"ĐĐ´ŅŅŅĐŊŅŅаĐĩ\" ŅŅавŅŅŅ Ņ ŅаŅĐŗŅ ŅваŅŅ, ŅĐēŅŅ ŅŅŅŅ ĐŊĐĩ ĐŋŅŅĐŋŅŅаĐŊŅŅ Đ´Đ° ŅĐēОК-ĐŊĐĩĐąŅĐ´ĐˇŅ Đ°ŅОйŅ.",
|
||||||
"failed_job_command": "ĐаĐŧаĐŊда {command} ĐŊĐĩ вŅĐēаĐŊаĐģаŅŅ Đ´ĐģŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ: {job}",
|
"failed_job_command": "ĐаĐŧаĐŊда {command} ĐŊĐĩ вŅĐēаĐŊаĐģаŅŅ Đ´ĐģŅ ĐˇĐ°Đ´Đ°ĐŊĐŊŅ: {job}",
|
||||||
"force_delete_user_warning": "ĐĐĐĐ¯Đ ĐĐĐĐĐĐĐ: ĐŅŅа дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩадĐēĐģадĐŊа вŅдаĐģŅŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа Ņ ŅŅĐĩ ай'ĐĩĐēŅŅ. ĐŅŅа дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩ ĐŧĐžĐļа ĐąŅŅŅ Đ°Đ´ŅОйĐģĐĩĐŊа Ņ ŅаКĐģŅ ĐŊĐĩĐŧĐ°ĐŗŅŅĐŧа ĐąŅдСĐĩ адĐŊавŅŅŅ.",
|
"force_delete_user_warning": "ĐĐĐĐ¯Đ ĐĐĐĐĐĐĐ: ĐŅŅа дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩадĐēĐģадĐŊа вŅдаĐģŅŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа Ņ ŅŅĐĩ ай'ĐĩĐēŅŅ. ĐŅŅа дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩ ĐŧĐžĐļа ĐąŅŅŅ Đ°Đ´ŅОйĐģĐĩĐŊа Ņ ŅаКĐģŅ ĐŊĐĩĐŧĐ°ĐŗŅŅĐŧа ĐąŅдСĐĩ адĐŊавŅŅŅ.",
|
||||||
@@ -74,15 +79,40 @@
|
|||||||
"image_fullsize_enabled_description": "ĐĄŅваŅаŅŅ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ Đ´ĐģŅ ŅаŅĐŧаŅаŅ, ŅŅĐž ĐŊĐĩ ĐŋŅŅдаŅĐŊŅŅ Đ´ĐģŅ Đ˛ŅĐą. ĐаĐģŅ ŅĐēĐģŅŅаĐŊа ĐžĐŋŅŅŅ \"ĐддаваŅŅ ĐŋĐĩŅĐ°Đ˛Đ°ĐŗŅ ŅĐąŅдаваĐŊаК ĐŋŅаŅвĐĩ\", ĐŋŅĐ°ĐŗĐģŅĐ´Ņ Đ˛ŅĐēаŅŅŅŅĐžŅваŅŅŅа ĐŊĐĩĐŋаŅŅŅĐ´ĐŊа ĐąĐĩС ĐēаĐŊвĐĩŅŅаŅŅŅ. ĐĐĩ ŅĐŋĐģŅваĐĩ ĐŊа вŅĐą-ĐŋŅŅдаŅĐŊŅŅ ŅаŅĐŧаŅŅ, ŅаĐēŅŅ ŅĐē JPEG.",
|
"image_fullsize_enabled_description": "ĐĄŅваŅаŅŅ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ Đ´ĐģŅ ŅаŅĐŧаŅаŅ, ŅŅĐž ĐŊĐĩ ĐŋŅŅдаŅĐŊŅŅ Đ´ĐģŅ Đ˛ŅĐą. ĐаĐģŅ ŅĐēĐģŅŅаĐŊа ĐžĐŋŅŅŅ \"ĐддаваŅŅ ĐŋĐĩŅĐ°Đ˛Đ°ĐŗŅ ŅĐąŅдаваĐŊаК ĐŋŅаŅвĐĩ\", ĐŋŅĐ°ĐŗĐģŅĐ´Ņ Đ˛ŅĐēаŅŅŅŅĐžŅваŅŅŅа ĐŊĐĩĐŋаŅŅŅĐ´ĐŊа ĐąĐĩС ĐēаĐŊвĐĩŅŅаŅŅŅ. ĐĐĩ ŅĐŋĐģŅваĐĩ ĐŊа вŅĐą-ĐŋŅŅдаŅĐŊŅŅ ŅаŅĐŧаŅŅ, ŅаĐēŅŅ ŅĐē JPEG.",
|
||||||
"image_fullsize_quality_description": "Đ¯ĐēаŅŅŅ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ Đ°Đ´ 1 да 100. ĐĐžĐģŅŅ Đ˛ŅŅĐžĐēаĐĩ СĐŊаŅŅĐŊĐŊĐĩ ĐģĐĩĐŋŅаĐĩ, аĐģĐĩ ĐŋŅŅвОдСŅŅŅ Đ´Đ° ĐŋавĐĩĐģŅŅŅĐŊĐŊŅ ĐŋаĐŧĐĩŅŅ ŅаКĐģа.",
|
"image_fullsize_quality_description": "Đ¯ĐēаŅŅŅ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ Đ°Đ´ 1 да 100. ĐĐžĐģŅŅ Đ˛ŅŅĐžĐēаĐĩ СĐŊаŅŅĐŊĐŊĐĩ ĐģĐĩĐŋŅаĐĩ, аĐģĐĩ ĐŋŅŅвОдСŅŅŅ Đ´Đ° ĐŋавĐĩĐģŅŅŅĐŊĐŊŅ ĐŋаĐŧĐĩŅŅ ŅаКĐģа.",
|
||||||
"image_fullsize_title": "ĐаĐģĐ°Đ´Ņ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ",
|
"image_fullsize_title": "ĐаĐģĐ°Đ´Ņ Đ˛ŅŅĐ˛Ņ Ņ ĐŋĐžŅĐŊŅĐŧ ĐŋаĐŧĐĩŅŅ",
|
||||||
"image_prefer_embedded_preview_setting_description": "ĐŅĐēаŅŅŅŅĐžŅваŅŅ ŅĐąŅдаваĐŊŅŅ ĐŋŅаŅĐ˛Ņ Ņ RAW-ŅĐžŅаСдŅĐŧĐēаŅ
Ņ ŅĐēаŅŅŅ ŅваŅ
ОдĐŊŅŅ
дадСĐĩĐŊŅŅ
Đ´ĐģŅ Đ°ĐŋŅаŅĐžŅĐēŅ ĐŧаĐģŅĐŊĐēаŅ, ĐēаĐģŅ ĐŧĐ°ĐŗŅŅĐŧа. ĐŅŅа даСваĐģŅĐĩ аŅŅŅĐŧаŅŅ ĐąĐžĐģŅŅ Đ´Đ°ĐēĐģадĐŊŅŅ ĐēĐžĐģĐĩŅŅ Đ´ĐģŅ ĐŊĐĩĐēаŅĐžŅŅŅ
вŅдаŅŅŅаŅ, аĐģĐĩ Đļ ŅĐēаŅŅŅ ĐŋŅаŅŅ ĐˇĐ°ĐģĐĩĐļŅŅŅ Đ°Đ´ ĐēаĐŧĐĩŅŅ, Ņ ĐŊа вŅдаŅŅŅĐĩ ĐŧĐžĐļа ĐąŅŅŅ ĐąĐžĐģŅŅ Đ°ŅŅŅŅаĐēŅĐ°Ņ ŅŅŅŅĐēŅ.",
|
"image_prefer_embedded_preview": "ĐддаваŅŅ ĐŋĐĩŅĐ°Đ˛Đ°ĐŗŅ ŅĐąŅдаваĐŊаК ĐŋŅаŅвĐĩ",
|
||||||
|
"image_prefer_embedded_preview_setting_description": "ĐŅĐēаŅŅŅŅĐžŅваŅŅ ŅĐąŅдаваĐŊŅŅ ĐŋŅаŅĐ˛Ņ Ņ RAW-ŅĐžŅаСдŅĐŧĐēаŅ
Ņ ŅĐēаŅŅŅ ŅваŅ
ОдĐŊŅŅ
даĐŊŅŅ
Đ´ĐģŅ Đ°ĐŋŅаŅĐžŅĐēŅ ĐŧаĐģŅĐŊĐēаŅ, ĐēаĐģŅ ĐŧĐ°ĐŗŅŅĐŧа. ĐŅŅа даСваĐģŅĐĩ аŅŅŅĐŧаŅŅ ĐąĐžĐģŅŅ Đ´Đ°ĐēĐģадĐŊŅŅ ĐēĐžĐģĐĩŅŅ Đ´ĐģŅ ĐŊĐĩĐēаŅĐžŅŅŅ
вŅдаŅŅŅаŅ, аĐģĐĩ Đļ ŅĐēаŅŅŅ ĐŋŅаŅŅ ĐˇĐ°ĐģĐĩĐļŅŅŅ Đ°Đ´ ĐēаĐŧĐĩŅŅ, Ņ ĐŊа вŅдаŅŅŅĐĩ ĐŧĐžĐļа ĐąŅŅŅ ĐąĐžĐģŅŅ Đ°ŅŅŅŅаĐēŅĐ°Ņ ŅŅŅŅĐēŅ.",
|
||||||
"image_prefer_wide_gamut": "ĐддаŅŅ ĐŋĐĩŅĐ°Đ˛Đ°ĐŗŅ ŅŅŅĐžĐēаК ĐŗĐ°ĐŧĐĩ",
|
"image_prefer_wide_gamut": "ĐддаŅŅ ĐŋĐĩŅĐ°Đ˛Đ°ĐŗŅ ŅŅŅĐžĐēаК ĐŗĐ°ĐŧĐĩ",
|
||||||
|
"image_preview_description": "ĐŅдаŅŅŅ ŅŅŅŅĐ´ĐŊŅĐŗĐ° ĐŋаĐŧĐĩŅŅ Đˇ вŅдаĐģĐĩĐŊŅĐŧŅ ĐŧĐĩŅадаĐŊŅĐŧŅ, вŅĐēаŅŅŅŅĐžŅваĐĩŅŅа ĐŋŅŅ ĐŋŅĐ°ĐŗĐģŅдСĐĩ аŅОйĐŊĐ°ĐŗĐ° ŅŅŅŅŅŅŅ Ņ Đ´ĐģŅ ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ",
|
||||||
|
"image_preview_quality_description": "Đ¯ĐēаŅŅŅ ĐŋŅаŅĐ˛Ņ Đ°Đ´ 1 да 100. ЧŅĐŧ вŅŅŅĐš, ŅŅĐŧ ĐģĐĩĐŋŅ, аĐģĐĩ ĐŋŅŅ ĐŗŅŅŅĐŧ ŅŅваŅаŅŅŅа ŅаКĐģŅ ĐąĐžĐģŅŅĐ°ĐŗĐ° ĐŋаĐŧĐĩŅŅ Ņ ĐŧĐžĐļа СĐŊŅСŅŅŅа Ņ
ŅŅĐēаŅŅŅ Đ˛ĐžĐ´ĐŗŅĐēŅ ĐŋŅŅĐēĐģадаĐŊĐŊŅ. ĐŅŅаĐŊĐžŅĐēа ĐŊŅСĐēĐ°ĐŗĐ° СĐŊаŅŅĐŊĐŊŅ ĐŧĐžĐļа ĐŋаŅĐŋĐģŅваŅŅ ĐŊа ŅĐēаŅŅŅ ĐŧаŅŅĐŊĐŊĐ°ĐŗĐ° ĐŊавŅŅаĐŊĐŊŅ.",
|
||||||
"image_preview_title": "ĐаĐģĐ°Đ´Ņ ĐŋаĐŋŅŅŅĐ´ĐŊŅĐŗĐ° ĐŋŅĐ°ĐŗĐģŅĐ´Ņ",
|
"image_preview_title": "ĐаĐģĐ°Đ´Ņ ĐŋаĐŋŅŅŅĐ´ĐŊŅĐŗĐ° ĐŋŅĐ°ĐŗĐģŅĐ´Ņ",
|
||||||
"image_quality": "Đ¯ĐēаŅŅŅ",
|
"image_quality": "Đ¯ĐēаŅŅŅ",
|
||||||
"image_resolution": "РаСдСŅĐģŅĐģŅĐŊаŅŅŅ",
|
"image_resolution": "РаСдСŅĐģŅĐģŅĐŊаŅŅŅ",
|
||||||
"image_settings": "ĐаĐģĐ°Đ´Ņ Đ˛ŅдаŅŅŅа",
|
"image_settings": "ĐаĐģĐ°Đ´Ņ Đ˛ŅдаŅŅŅа",
|
||||||
"image_settings_description": "ĐŅŅŅĐšŅĐĩ ŅĐēаŅŅŅ Ņ ŅаСдСŅĐģŅĐģŅĐŊаŅŅŅ ŅĐŗĐĩĐŊĐĩŅŅŅаваĐŊŅŅ
вŅдаŅŅŅаŅ",
|
"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_created": "ĐĄŅвОŅаĐŊа ĐąŅĐąĐģŅŅŅŅĐēа: {library}",
|
||||||
"library_deleted": "ĐŅĐąĐģŅŅŅŅĐēа вŅдаĐģĐĩĐŊа",
|
"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_dark_style": "ĐĻŅĐŧĐŊŅ ŅŅŅĐģŅ",
|
||||||
"map_enable_description": "ĐŖĐēĐģŅŅŅŅŅ ŅŅĐŊĐēŅŅŅ ĐēаŅŅŅ",
|
"map_enable_description": "ĐŖĐēĐģŅŅŅŅŅ ŅŅĐŊĐēŅŅŅ ĐēаŅŅŅ",
|
||||||
"map_gps_settings": "ĐаĐģĐ°Đ´Ņ ĐēаŅŅŅ Ņ GPS",
|
"map_gps_settings": "ĐаĐģĐ°Đ´Ņ ĐēаŅŅŅ Ņ GPS",
|
||||||
@@ -93,33 +123,119 @@
|
|||||||
"metadata_settings": "ĐаĐģĐ°Đ´Ņ ĐŧĐĩŅадаĐŊŅŅ
",
|
"metadata_settings": "ĐаĐģĐ°Đ´Ņ ĐŧĐĩŅадаĐŊŅŅ
",
|
||||||
"oauth_button_text": "ĐĸŅĐēŅŅ ĐēĐŊĐžĐŋĐēŅ",
|
"oauth_button_text": "ĐĸŅĐēŅŅ ĐēĐŊĐžĐŋĐēŅ",
|
||||||
"oauth_settings": "OAuth",
|
"oauth_settings": "OAuth",
|
||||||
|
"refreshing_all_libraries": "ĐĐąĐŊаŅĐģĐĩĐŊĐŊĐĩ ŅŅŅŅ
ĐąŅĐąĐģŅŅŅŅĐē",
|
||||||
|
"registration": "Đ ŅĐŗŅŅŅŅаŅŅŅ Đ°Đ´ĐŧŅĐŊŅŅŅŅаŅаŅа",
|
||||||
|
"registration_description": "ĐŅ Đˇ'ŅŅĐģŅĐĩŅĐĩŅŅ ĐŋĐĩŅŅŅĐŧ ĐēаŅŅŅŅаĐģŅĐŊŅĐēаĐŧ ŅŅŅŅŅĐŧŅ, ŅаĐŧŅ Đ˛Ņ ĐąŅдСĐĩŅĐĩ ĐŋŅŅСĐŊаŅаĐŊŅ Đ°Đ´ĐŧŅĐŊŅŅŅŅаŅаŅаĐŧ. ĐŅ ĐąŅдСĐĩŅĐĩ адĐēаСваŅŅ ĐˇĐ° адĐŧŅĐŊŅŅŅŅаŅŅĐšĐŊŅŅ ĐˇĐ°Đ´Đ°ŅŅ, а ŅаĐēŅаĐŧа ŅŅваŅаŅŅ ĐŊОвŅŅ
ĐēаŅŅŅŅаĐģŅĐŊŅĐēаŅ.",
|
||||||
|
"require_password_change_on_login": "ĐаŅŅайаваŅŅ ĐˇĐŧŅĐŊŅŅŅ ĐŋаŅĐžĐģŅ ĐŋŅŅ ĐŋĐĩŅŅŅĐŧ ŅваŅ
ОдСĐĩ Ņ ŅŅŅŅŅĐŧŅ",
|
||||||
|
"reset_settings_to_default": "ĐĄĐēŅĐŊŅŅŅ ĐŊаĐģĐ°Đ´Ņ Đ´Đ° ĐŋŅадвŅСĐŊаŅаĐŊŅŅ
",
|
||||||
|
"reset_settings_to_recent_saved": "ĐĄĐēŅĐŊŅŅŅ ĐŊаĐģĐ°Đ´Ņ Đ´Đ° ĐŊŅдаŅĐŊа СаŅ
аваĐŊŅŅ
",
|
||||||
|
"scanning_library": "ĐĄĐēаĐŊŅŅаваĐŊĐŊĐĩ ĐąŅĐąĐģŅŅŅŅĐēŅ",
|
||||||
|
"server_external_domain_settings": "ĐĐŊĐĩŅĐŊŅ Đ´Đ°ĐŧĐĩĐŊ",
|
||||||
|
"server_settings": "ĐаĐģĐ°Đ´Ņ ŅĐĩŅвĐĩŅа",
|
||||||
|
"server_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ŅĐĩŅвĐĩŅа",
|
||||||
|
"server_welcome_message": "ĐŅŅвŅŅаĐģŅĐŊаĐĩ ĐŋавĐĩдаĐŧĐģĐĩĐŊĐŊĐĩ",
|
||||||
|
"server_welcome_message_description": "ĐавĐĩдаĐŧĐģĐĩĐŊĐŊĐĩ, ŅĐēĐžĐĩ адĐģŅŅŅŅĐžŅваĐĩŅŅа ĐŊа ŅŅаŅĐžĐŊŅŅ ŅваŅ
ОдŅ.",
|
||||||
"system_settings": "ĐĄŅŅŅŅĐŧĐŊŅŅ ĐŊаĐģадŅ",
|
"system_settings": "ĐĄŅŅŅŅĐŧĐŊŅŅ ĐŊаĐģадŅ",
|
||||||
|
"tag_cleanup_job": "ĐŅŅŅŅĐēа ŅŅĐŗĐ°Ņ",
|
||||||
|
"template_email_preview": "ĐĐĩŅадĐŋŅĐ°ĐŗĐģŅĐ´",
|
||||||
"theme_settings": "ĐаĐģĐ°Đ´Ņ ŅŅĐŧŅ",
|
"theme_settings": "ĐаĐģĐ°Đ´Ņ ŅŅĐŧŅ",
|
||||||
|
"transcoding_acceleration_nvenc": "NVENC (ĐŋаŅŅайŅĐĩŅŅа вŅĐ´ŅаĐēаŅŅа NVIDIA)",
|
||||||
"transcoding_acceleration_vaapi": "VAAPI",
|
"transcoding_acceleration_vaapi": "VAAPI",
|
||||||
|
"transcoding_accepted_containers": "ĐŅŅĐŊŅŅŅŅ ĐēаĐŊŅŅĐšĐŊĐĩŅŅ",
|
||||||
|
"transcoding_accepted_video_codecs": "ĐŅŅĐŊŅŅŅŅ Đ˛ŅĐ´ŅаĐēОдŅĐēŅ",
|
||||||
|
"transcoding_advanced_options_description": "ĐаŅаĐŧĐĩŅŅŅ, ŅĐēŅŅ ĐąĐžĐģŅŅаŅŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēĐ°Ņ ĐŊĐĩ ŅŅŅйа СĐŧŅĐŊŅŅŅ",
|
||||||
"transcoding_audio_codec": "ĐŅĐ´ŅŅĐēОдŅĐē",
|
"transcoding_audio_codec": "ĐŅĐ´ŅŅĐēОдŅĐē",
|
||||||
|
"transcoding_encoding_options": "ĐаŅаĐŧĐĩŅŅŅ ĐēадСŅŅаваĐŊĐŊŅ",
|
||||||
"transcoding_video_codec": "ĐŅĐ´ŅаĐēОдŅĐē",
|
"transcoding_video_codec": "ĐŅĐ´ŅаĐēОдŅĐē",
|
||||||
|
"trash_enabled_description": "ĐŖĐēĐģŅŅŅŅŅ ŅŅĐŊĐēŅŅŅ ŅĐŧĐĩŅĐŊŅŅŅ",
|
||||||
|
"trash_number_of_days": "ĐĐžĐģŅĐēаŅŅŅ Đ´ĐˇŅĐŊ",
|
||||||
"trash_settings": "ĐаĐģĐ°Đ´Ņ ŅĐŧĐĩŅĐŊŅŅŅ",
|
"trash_settings": "ĐаĐģĐ°Đ´Ņ ŅĐŧĐĩŅĐŊŅŅŅ",
|
||||||
"trash_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ŅĐŧĐĩŅĐŊŅŅŅ",
|
"trash_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ŅĐŧĐĩŅĐŊŅŅŅ",
|
||||||
|
"user_cleanup_job": "ĐŅŅŅŅĐēа ĐēаŅŅŅŅаĐģŅĐŊŅĐēа",
|
||||||
|
"user_management": "ĐŅŅаваĐŊĐŊĐĩ ĐēаŅŅŅŅаĐģŅĐŊŅĐēаĐŧŅ",
|
||||||
|
"user_password_has_been_reset": "ĐаŅĐžĐģŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа ĐąŅŅ ŅĐēŅĐŊŅŅŅ:",
|
||||||
|
"user_password_reset_description": "ĐадаКŅĐĩ ĐēаŅŅŅŅаĐģŅĐŊŅĐēŅ ŅаŅĐžĐ˛Ņ ĐŋаŅĐžĐģŅ Ņ ĐŋавĐĩдаĐŧŅŅĐĩ ŅĐŧŅ, ŅŅĐž ĐŋŅŅ ĐŊаŅŅŅĐŋĐŊŅĐŧ ŅваŅ
ОдСĐĩ Ņ ŅŅŅŅŅĐŧŅ ŅĐŧŅ ŅŅŅйа ĐąŅдСĐĩ СĐŧŅĐŊŅŅŅ ĐŋаŅĐžĐģŅ.",
|
||||||
|
"user_restore_description": "ĐŖĐģŅĐēĐžĐ˛Ņ ĐˇĐ°ĐŋŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа <b>{user}</b> ĐąŅдСĐĩ адĐŊĐžŅĐģĐĩĐŊŅ.",
|
||||||
|
"user_settings": "ĐаĐģĐ°Đ´Ņ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа",
|
||||||
|
"user_settings_description": "ĐŅŅаваĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа",
|
||||||
|
"user_successfully_removed": "ĐаŅŅŅŅаĐģŅĐŊŅĐē {email} ĐąŅŅ ĐŋаŅĐŋŅŅ
Ова вŅдаĐģĐĩĐŊŅ.",
|
||||||
|
"version_check_enabled_description": "ĐŖĐēĐģŅŅŅŅŅ ĐŋŅавĐĩŅĐēŅ Đ˛ĐĩŅŅŅŅ",
|
||||||
|
"version_check_implications": "ФŅĐŊĐēŅŅŅ ĐŋŅавĐĩŅĐēŅ Đ˛ĐĩŅŅŅŅ ĐŋĐĩŅŅŅĐ´ŅŅĐŊа СвŅŅŅаĐĩŅŅа да github.com",
|
||||||
"version_check_settings": "ĐŅавĐĩŅĐēа вĐĩŅŅŅŅ",
|
"version_check_settings": "ĐŅавĐĩŅĐēа вĐĩŅŅŅŅ",
|
||||||
"version_check_settings_description": "ĐŖĐēĐģŅŅŅŅŅ/адĐēĐģŅŅŅŅŅ Đ°ĐŋавŅŅŅŅĐŊĐŊŅ Đ°Đą ĐŊОваК вĐĩŅŅŅŅ"
|
"version_check_settings_description": "ĐŖĐēĐģŅŅŅŅŅ/адĐēĐģŅŅŅŅŅ Đ°ĐŋавŅŅŅŅĐŊĐŊŅ Đ°Đą ĐŊОваК вĐĩŅŅŅŅ"
|
||||||
},
|
},
|
||||||
|
"admin_email": "ĐĐģĐĩĐēŅŅĐžĐŊĐŊĐ°Ņ ĐŋĐžŅŅа адĐŧŅĐŊŅŅŅŅаŅаŅа",
|
||||||
|
"admin_password": "ĐаŅĐžĐģŅ Đ°Đ´ĐŧŅĐŊŅŅŅŅаŅаŅа",
|
||||||
|
"administration": "ĐŅŅаваĐŊĐŊĐĩ ŅĐĩŅвĐĩŅаĐŧ",
|
||||||
|
"advanced": "ĐаŅŅŅаĐŊŅŅ",
|
||||||
|
"advanced_settings_log_level_title": "ĐŖĐˇŅОвĐĩĐŊŅ Đ˛ŅдСĐĩĐŊĐŊŅ ĐļŅŅĐŊаĐģа: {level}",
|
||||||
|
"advanced_settings_proxy_headers_title": "ĐĐ°ĐŗĐ°ĐģĐžŅĐēŅ ĐŋŅĐžĐēŅŅ",
|
||||||
|
"advanced_settings_tile_subtitle": "ĐаŅŅŅаĐŊŅŅ ĐŊаĐģĐ°Đ´Ņ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа",
|
||||||
|
"advanced_settings_troubleshooting_subtitle": "ĐŖĐēĐģŅŅŅŅŅ Đ´Đ°Đ´Đ°ŅĐēОвŅŅ ŅŅĐŊĐēŅŅŅ Đ´ĐģŅ Đ˛ŅĐŋŅаŅĐģĐĩĐŊĐŊŅ ĐŊĐĩĐŋаĐģадаĐē",
|
||||||
"advanced_settings_troubleshooting_title": "ĐŅĐŋŅаŅĐģĐĩĐŊĐŊĐĩ ĐŊĐĩĐŋаĐģадаĐē",
|
"advanced_settings_troubleshooting_title": "ĐŅĐŋŅаŅĐģĐĩĐŊĐŊĐĩ ĐŊĐĩĐŋаĐģадаĐē",
|
||||||
|
"age_months": "ĐŖĐˇŅĐžŅŅ {months, plural, one {# ĐŧĐĩŅŅŅ} few {# ĐŧĐĩŅŅŅŅ} many {# ĐŧĐĩŅŅŅаŅ} other {# ĐŧĐĩŅŅŅаŅ}}",
|
||||||
|
"age_year_months": "ĐŖĐˇŅĐžŅŅ 1 ĐŗĐžĐ´, {months, plural, one {# ĐŧĐĩŅŅŅ} few {# ĐŧĐĩŅŅŅŅ} many {# ĐŧĐĩŅŅŅаŅ} other {# ĐŧĐĩŅŅŅаŅ}}",
|
||||||
|
"age_years": "{years, plural, other {ĐŖĐˇŅĐžŅŅ #}}",
|
||||||
"album_added": "ĐĐģŅйОĐŧ дададСĐĩĐŊŅ",
|
"album_added": "ĐĐģŅйОĐŧ дададСĐĩĐŊŅ",
|
||||||
|
"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": "ĐĐŊŅаŅĐŧаŅŅŅ ĐŋŅа аĐģŅйОĐŧ айĐŊĐžŅĐģĐĩĐŊа",
|
||||||
|
"album_leave": "ĐаĐēŅĐŊŅŅŅ Đ°ĐģŅйОĐŧ?",
|
||||||
|
"album_leave_confirmation": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅаŅĐĩ ĐŋаĐēŅĐŊŅŅŅ {album}?",
|
||||||
"album_name": "ĐаСва аĐģŅйОĐŧа",
|
"album_name": "ĐаСва аĐģŅйОĐŧа",
|
||||||
|
"album_options": "ĐаŅаĐŧĐĩŅŅŅ Đ°ĐģŅйОĐŧа",
|
||||||
"album_remove_user": "ĐŅдаĐģŅŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа?",
|
"album_remove_user": "ĐŅдаĐģŅŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēа?",
|
||||||
|
"album_remove_user_confirmation": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅаŅĐĩ вŅдаĐģŅŅŅ {user}?",
|
||||||
|
"album_search_not_found": "Đа ваŅŅĐŧ СаĐŋŅŅĐĩ ĐŊĐĩ СĐŊОКдСĐĩĐŊа аĐģŅйОĐŧаŅ",
|
||||||
|
"album_share_no_users": "ĐдаĐĩŅŅа, Đ˛Ņ ĐŋадСŅĐģŅĐģŅŅŅ ĐŗŅŅŅĐŧ аĐģŅйОĐŧаĐŧ С ŅŅŅĐŧŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēаĐŧŅ, айО Ņ Đ˛Đ°Ņ ĐŊŅĐŧа ĐŊŅвОдĐŊĐ°ĐŗĐ° ĐēаŅŅŅŅаĐģŅĐŊŅĐēа, С ŅĐēŅĐŧ ĐŧĐžĐļĐŊа ĐŋадСŅĐģŅŅŅа.",
|
||||||
"album_updated": "ĐĐģŅйОĐŧ айĐŊĐžŅĐģĐĩĐŊŅ",
|
"album_updated": "ĐĐģŅйОĐŧ айĐŊĐžŅĐģĐĩĐŊŅ",
|
||||||
|
"album_user_left": "ĐŅ ĐŋаĐēŅĐŊŅĐģŅ {album}",
|
||||||
|
"album_user_removed": "ĐаŅŅŅŅаĐģŅĐŊŅĐē {user} вŅдаĐģĐĩĐŊŅ",
|
||||||
|
"album_viewer_appbar_delete_confirm": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅаŅĐĩ вŅдаĐģŅŅŅ ĐŗŅŅŅ Đ°ĐģŅйОĐŧ Ņа ŅĐ˛Đ°ĐšĐŗĐž ŅĐģŅĐēĐžĐ˛Đ°ĐŗĐ° СаĐŋŅŅŅ?",
|
||||||
|
"album_viewer_appbar_share_err_delete": "ĐĐĩ ŅдаĐģĐžŅŅ Đ˛ŅдаĐģŅŅŅ Đ°ĐģŅйОĐŧ",
|
||||||
|
"album_viewer_appbar_share_err_leave": "ĐĐĩ ŅдаĐģĐžŅŅ ĐŋаĐēŅĐŊŅŅŅ Đ°ĐģŅйОĐŧ",
|
||||||
|
"album_viewer_appbar_share_err_title": "ĐĐĩ ŅдаĐģĐžŅŅ ĐˇĐŧŅĐŊŅŅŅ ĐŊĐ°ĐˇĐ˛Ņ Đ°ĐģŅйОĐŧа",
|
||||||
|
"album_viewer_appbar_share_leave": "ĐаĐēŅĐŊŅŅŅ Đ°ĐģŅйОĐŧ",
|
||||||
|
"album_viewer_appbar_share_to": "ĐĐąĐ°ĐŗŅĐģŅŅŅ Đˇ",
|
||||||
|
"album_viewer_page_share_add_users": "ĐадаŅŅ ĐēаŅŅŅŅаĐģŅĐŊŅĐēаŅ",
|
||||||
|
"album_with_link_access": "ĐаСвОĐģŅŅŅ ŅŅŅĐŧ, Ņ
ŅĐž ĐŧаĐĩ ŅĐŋаŅŅĐģĐēŅ, йаŅŅŅŅ ŅĐžŅа Ņ ĐģŅдСĐĩĐš Ņ ĐŗŅŅŅĐŧ аĐģŅйОĐŧĐĩ.",
|
||||||
"albums": "ĐĐģŅйОĐŧŅ",
|
"albums": "ĐĐģŅйОĐŧŅ",
|
||||||
|
"albums_count": "{count, plural, one {1 аĐģŅйОĐŧ} few {{count, number} аĐģŅйОĐŧŅ} many {{count, number} аĐģŅйОĐŧаŅ} other {{count, number} аĐģŅйОĐŧаŅ}}",
|
||||||
|
"albums_default_sort_order": "ĐŅадвŅСĐŊаŅаĐŊŅ ĐŋаŅадаĐē ŅаŅŅаваĐŊĐŊŅ Đ°ĐģŅйОĐŧаŅ",
|
||||||
|
"albums_on_device_count": "ĐĐģŅйОĐŧŅ ĐŊа ĐŋŅŅĐģадСĐĩ ({count})",
|
||||||
"all": "ĐŖŅĐĩ",
|
"all": "ĐŖŅĐĩ",
|
||||||
"all_albums": "ĐŖŅĐĩ аĐģŅйОĐŧŅ",
|
"all_albums": "ĐŖŅĐĩ аĐģŅйОĐŧŅ",
|
||||||
"all_people": "ĐŖŅĐĩ ĐģŅдСŅ",
|
"all_people": "ĐŖŅĐĩ ĐģŅдСŅ",
|
||||||
"all_videos": "ĐŖŅĐĩ вŅĐ´Ņа",
|
"all_videos": "ĐŖŅĐĩ вŅĐ´Ņа",
|
||||||
|
"allow_dark_mode": "ĐаСвОĐģŅŅŅ ŅŅĐŧĐŊŅ ŅŅĐļŅĐŧ",
|
||||||
|
"allow_edits": "ĐаСвОĐģŅŅŅ ŅŅĐ´Đ°ĐŗĐ°Đ˛Đ°ĐŊĐŊĐĩ",
|
||||||
|
"alt_text_qr_code": "ĐŅдаŅŅŅ QR-ĐēОда",
|
||||||
|
"anti_clockwise": "ĐĄŅĐŋŅаŅŅ ĐŗĐ°Đ´ĐˇŅĐŊĐŊŅĐēаваК ŅŅŅŅĐģĐēŅ",
|
||||||
|
"api_key": "ĐĐģŅŅ API",
|
||||||
|
"api_key_empty": "ĐаСва ĐēĐģŅŅа API ĐŊĐĩ ĐŋавŅĐŊĐŊа ĐąŅŅŅ ĐŋŅŅŅОК",
|
||||||
|
"api_keys": "ĐĐģŅŅŅ API",
|
||||||
|
"app_bar_signout_dialog_content": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅаŅĐĩ вŅĐšŅŅŅ?",
|
||||||
"app_bar_signout_dialog_ok": "ĐĸаĐē",
|
"app_bar_signout_dialog_ok": "ĐĸаĐē",
|
||||||
"app_bar_signout_dialog_title": "ĐŅĐšŅŅŅ",
|
"app_bar_signout_dialog_title": "ĐŅĐšŅŅŅ",
|
||||||
"app_settings": "ĐаĐģĐ°Đ´Ņ ĐŋŅĐ°ĐŗŅаĐŧŅ",
|
"app_settings": "ĐаĐģĐ°Đ´Ņ ĐŋŅĐ°ĐŗŅаĐŧŅ",
|
||||||
"archive": "ĐŅŅ
ŅŅ",
|
"archive": "ĐŅŅ
ŅŅ",
|
||||||
|
"archive_page_title": "ĐŅŅ
ŅŅ ({count})",
|
||||||
"archive_size": "ĐаĐŧĐĩŅ Đ°ŅŅ
Ņва",
|
"archive_size": "ĐаĐŧĐĩŅ Đ°ŅŅ
Ņва",
|
||||||
|
"are_these_the_same_person": "ĐĻŅ ĐŗŅŅа адСŅĐŊ Ņ ŅОК Đļа ŅаĐģавĐĩĐē?",
|
||||||
|
"are_you_sure_to_do_this": "ĐŅ ŅĐŋŅŅĐŊĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅаŅĐĩ ĐŗŅŅа СŅайŅŅŅ?",
|
||||||
|
"asset_added_to_album": "ĐададСĐĩĐŊа Ņ Đ°ĐģŅйОĐŧ",
|
||||||
|
"asset_adding_to_album": "ĐадаваĐŊĐŊĐĩ Ņ Đ°ĐģŅйОĐŧâĻ",
|
||||||
|
"asset_skipped": "ĐŅаĐŋŅŅŅаĐŊа",
|
||||||
|
"asset_skipped_in_trash": "ĐŖ ŅĐŧĐĩŅĐŊŅŅŅ",
|
||||||
|
"asset_uploaded": "ĐаĐŋаĐŧĐŋаваĐŊа",
|
||||||
"asset_uploading": "ĐаĐŋаĐŧĐŋĐžŅваĐŊĐŊĐĩâĻ",
|
"asset_uploading": "ĐаĐŋаĐŧĐŋĐžŅваĐŊĐŊĐĩâĻ",
|
||||||
|
"authorized_devices": "ĐŅŅаŅŅСаваĐŊŅŅ ĐŋŅŅĐģадŅ",
|
||||||
"back": "ĐаСад",
|
"back": "ĐаСад",
|
||||||
|
"backup_album_selection_page_albums_device": "ĐĐģŅйОĐŧŅ ĐŊа ĐŋŅŅĐģадСĐĩ ({count})",
|
||||||
"backup_all": "ĐŖŅĐĩ",
|
"backup_all": "ĐŖŅĐĩ",
|
||||||
"backup_controller_page_background_wifi": "ĐĸĐžĐģŅĐēŅ ĐŋŅаС Wi-Fi",
|
"backup_controller_page_background_wifi": "ĐĸĐžĐģŅĐēŅ ĐŋŅаС Wi-Fi",
|
||||||
"buy": "ĐŅĐŋŅŅŅ Immich",
|
"buy": "ĐŅĐŋŅŅŅ Immich",
|
||||||
@@ -368,7 +484,7 @@
|
|||||||
"view_all_users": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ŅŅĐĩŅ
ĐēаŅŅŅŅаĐģŅĐŊŅĐēаŅ",
|
"view_all_users": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ŅŅĐĩŅ
ĐēаŅŅŅŅаĐģŅĐŊŅĐēаŅ",
|
||||||
"view_in_timeline": "ĐĐ°ĐŗĐģŅдСĐĩŅŅ Ņ
ŅĐžĐŊŅĐēŅ",
|
"view_in_timeline": "ĐĐ°ĐŗĐģŅдСĐĩŅŅ Ņ
ŅĐžĐŊŅĐēŅ",
|
||||||
"view_links": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ŅĐŋаŅŅĐģĐēŅ",
|
"view_links": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ŅĐŋаŅŅĐģĐēŅ",
|
||||||
"view_name": "ĐŅĐ°ĐŗĐģĐĩдСĐĩŅŅ",
|
"view_name": "ĐŅĐ°ĐŗĐģŅĐ´",
|
||||||
"view_next_asset": "ĐаĐēаСаŅŅ ĐŊаŅŅŅĐŋĐŊŅ Đ°Đą'ĐĩĐēŅ",
|
"view_next_asset": "ĐаĐēаСаŅŅ ĐŊаŅŅŅĐŋĐŊŅ Đ°Đą'ĐĩĐēŅ",
|
||||||
"view_previous_asset": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ĐŋаĐŋŅŅŅĐ´ĐŊŅ Đ°Đą'ĐĩĐēŅ",
|
"view_previous_asset": "ĐŅĐ°ĐŗĐģŅдСĐĩŅŅ ĐŋаĐŋŅŅŅĐ´ĐŊŅ Đ°Đą'ĐĩĐēŅ",
|
||||||
"view_stack": "ĐŅĐ°ĐŗĐģŅĐ´ ŅŅŅĐēа",
|
"view_stack": "ĐŅĐ°ĐŗĐģŅĐ´ ŅŅŅĐēа",
|
||||||
|
|||||||
114
i18n/bg.json
@@ -13,20 +13,24 @@
|
|||||||
"add_a_description": "ĐОйави ĐžĐŋиŅаĐŊиĐĩ",
|
"add_a_description": "ĐОйави ĐžĐŋиŅаĐŊиĐĩ",
|
||||||
"add_a_location": "ĐОйави ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
"add_a_location": "ĐОйави ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||||
"add_a_name": "ĐОйави иĐŧĐĩ",
|
"add_a_name": "ĐОйави иĐŧĐĩ",
|
||||||
"add_a_title": "ĐОйавĐĩŅĐĩ ĐˇĐ°ĐŗĐģавиĐĩ",
|
"add_a_title": "ĐОйaви ĐˇĐ°ĐŗĐģавиĐĩ",
|
||||||
|
"add_birthday": "ĐОйави даŅа ĐŊа ŅаĐļдаĐŊĐĩ",
|
||||||
"add_endpoint": "ĐОйави ĐēŅаКĐŊа ŅĐžŅĐēа",
|
"add_endpoint": "ĐОйави ĐēŅаКĐŊа ŅĐžŅĐēа",
|
||||||
"add_exclusion_pattern": "ĐОйави ĐŧОдĐĩĐģ Са иСĐēĐģŅŅваĐŊĐĩ",
|
"add_exclusion_pattern": "ĐОйави ĐŧОдĐĩĐģ Са иСĐēĐģŅŅваĐŊĐĩ",
|
||||||
"add_import_path": "ĐОйави ĐŋŅŅ ĐˇĐ° иĐŧĐŋĐžŅŅиŅаĐŊĐĩ",
|
"add_import_path": "ĐОйави ĐŋŅŅ ĐˇĐ° иĐŧĐŋĐžŅŅиŅаĐŊĐĩ",
|
||||||
"add_location": "ĐОйавĐĩŅĐĩ ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
"add_location": "Đoйави ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||||
"add_more_users": "ĐОйавĐĩŅĐĩ ĐžŅĐĩ ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
"add_more_users": "ĐОйави ĐžŅĐĩ ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
||||||
"add_partner": "ĐОйавĐĩŅĐĩ ĐŋаŅŅĐŊŅĐžŅ",
|
"add_partner": "ĐОйави ĐŋаŅŅĐŊŅĐžŅ",
|
||||||
"add_path": "ĐОйави ĐŋŅŅ",
|
"add_path": "ĐОйави ĐŋŅŅ",
|
||||||
"add_photos": "ĐОйавĐĩŅĐĩ ŅĐŊиĐŧĐēи",
|
"add_photos": "ĐОйави ŅĐŊиĐŧĐēи",
|
||||||
"add_tag": "ĐОйави ĐŧаŅĐēĐĩŅ",
|
"add_tag": "ĐОйави ĐŧаŅĐēĐĩŅ",
|
||||||
"add_to": "ĐОйави ĐēŅĐŧâĻ",
|
"add_to": "ĐОйави ĐēŅĐŧâĻ",
|
||||||
"add_to_album": "ĐОйави ĐēŅĐŧ аĐģĐąŅĐŧ",
|
"add_to_album": "ĐОйави ĐēŅĐŧ аĐģĐąŅĐŧ",
|
||||||
"add_to_album_bottom_sheet_added": "ĐОйавĐĩĐŊĐž в {album}",
|
"add_to_album_bottom_sheet_added": "ĐОйавĐĩĐŊĐž в {album}",
|
||||||
"add_to_album_bottom_sheet_already_exists": "ĐĐĩŅĐĩ Đĩ в {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_to_shared_album": "ĐОйави ĐēŅĐŧ ŅĐŋОдĐĩĐģĐĩĐŊ аĐģĐąŅĐŧ",
|
||||||
"add_url": "ĐОйави URL",
|
"add_url": "ĐОйави URL",
|
||||||
"added_to_archive": "ĐОйавĐĩĐŊĐž ĐēŅĐŧ аŅŅ
ива",
|
"added_to_archive": "ĐОйавĐĩĐŊĐž ĐēŅĐŧ аŅŅ
ива",
|
||||||
@@ -44,6 +48,13 @@
|
|||||||
"backup_database": "ĐĄŅСдаК ŅĐĩСĐĩŅвĐŊа йаСа даĐŊĐŊи",
|
"backup_database": "ĐĄŅСдаК ŅĐĩСĐĩŅвĐŊа йаСа даĐŊĐŊи",
|
||||||
"backup_database_enable_description": "РаСŅĐĩŅи ŅĐĩСĐĩŅвĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа йаСаŅа даĐŊĐŊи",
|
"backup_database_enable_description": "РаСŅĐĩŅи ŅĐĩСĐĩŅвĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа йаСаŅа даĐŊĐŊи",
|
||||||
"backup_keep_last_amount": "ĐŅОК СаĐŋаСĐĩĐŊи ŅĐĩСĐĩŅвĐŊи ĐēĐžĐŋиŅ",
|
"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": "ĐаŅŅŅОКĐēа ĐŊа ŅĐĩСĐĩŅвĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа йаСаŅа даĐŊĐŊи",
|
||||||
"backup_settings_description": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са ŅĐĩСĐĩŅвĐŊĐž ĐēĐžĐŋиĐĩ ĐŊа йаСаŅа даĐŊĐŊи.",
|
"backup_settings_description": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са ŅĐĩСĐĩŅвĐŊĐž ĐēĐžĐŋиĐĩ ĐŊа йаСаŅа даĐŊĐŊи.",
|
||||||
"cleared_jobs": "ĐСŅиŅŅĐĩĐŊи СадаŅи ĐžŅ ŅиĐŋ: {job}",
|
"cleared_jobs": "ĐСŅиŅŅĐĩĐŊи СадаŅи ĐžŅ ŅиĐŋ: {job}",
|
||||||
@@ -347,6 +358,9 @@
|
|||||||
"trash_number_of_days_description": "ĐŅОК Đ´ĐŊи, в ĐēОиŅĐž ŅаКĐģОвĐĩŅĐĩ да ŅĐĩ ŅŅŅ
ŅаĐŊŅĐ˛Đ°Ņ ĐŊа йОĐēĐģŅĐēа, ĐŋŅĐĩди да ĐąŅĐ´Đ°Ņ ĐžĐēĐžĐŊŅаŅĐĩĐģĐŊĐž ĐŋŅĐĩĐŧаŅ
ĐŊаŅи",
|
"trash_number_of_days_description": "ĐŅОК Đ´ĐŊи, в ĐēОиŅĐž ŅаКĐģОвĐĩŅĐĩ да ŅĐĩ ŅŅŅ
ŅаĐŊŅĐ˛Đ°Ņ ĐŊа йОĐēĐģŅĐēа, ĐŋŅĐĩди да ĐąŅĐ´Đ°Ņ ĐžĐēĐžĐŊŅаŅĐĩĐģĐŊĐž ĐŋŅĐĩĐŧаŅ
ĐŊаŅи",
|
||||||
"trash_settings": "ĐаŅŅŅОКĐēи ĐŊа ĐēĐžŅŅĐĩŅĐž",
|
"trash_settings": "ĐаŅŅŅОКĐēи ĐŊа ĐēĐžŅŅĐĩŅĐž",
|
||||||
"trash_settings_description": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ ĐŊа ĐēĐžŅŅĐĩŅĐž",
|
"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_cleanup_job": "ĐĐžŅиŅŅваĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
||||||
"user_delete_delay": "<b>{user}</b> aĐēаŅĐŊŅŅŅ Đ¸ ŅаКĐģОвĐĩŅĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ ŅĐĩ ĐąŅĐ´Đ°Ņ ĐŋĐģаĐŊиŅаĐŊи Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž иСŅŅиваĐŊĐĩ ŅĐģĐĩĐ´ {delay, plural, one {# Đ´ĐĩĐŊ} other {# Đ´ĐŊи}}.",
|
"user_delete_delay": "<b>{user}</b> aĐēаŅĐŊŅŅŅ Đ¸ ŅаКĐģОвĐĩŅĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ ŅĐĩ ĐąŅĐ´Đ°Ņ ĐŋĐģаĐŊиŅаĐŊи Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž иСŅŅиваĐŊĐĩ ŅĐģĐĩĐ´ {delay, plural, one {# Đ´ĐĩĐŊ} other {# Đ´ĐŊи}}.",
|
||||||
"user_delete_delay_settings": "ĐайавŅĐŊĐĩ ĐŊа иСŅŅиваĐŊĐĩ",
|
"user_delete_delay_settings": "ĐайавŅĐŊĐĩ ĐŊа иСŅŅиваĐŊĐĩ",
|
||||||
@@ -397,6 +411,7 @@
|
|||||||
"album_cover_updated": "ĐĐąĐģĐžĐļĐēаŅа ĐŊа аĐģĐąŅĐŧа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
"album_cover_updated": "ĐĐąĐģĐžĐļĐēаŅа ĐŊа аĐģĐąŅĐŧа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
||||||
"album_delete_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ аĐģĐąŅĐŧа {album}?",
|
"album_delete_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ аĐģĐąŅĐŧа {album}?",
|
||||||
"album_delete_confirmation_description": "ĐĐēĐž ŅОСи аĐģĐąŅĐŧ Đĩ ŅĐŋОдĐĩĐģĐĩĐŊ, Đ´ŅŅĐŗĐ¸ ĐŋĐžŅŅĐĩйиŅĐĩĐģи вĐĩŅĐĩ ĐŊŅĐŧа да иĐŧĐ°Ņ Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŊĐĩĐŗĐž.",
|
"album_delete_confirmation_description": "ĐĐēĐž ŅОСи аĐģĐąŅĐŧ Đĩ ŅĐŋОдĐĩĐģĐĩĐŊ, Đ´ŅŅĐŗĐ¸ ĐŋĐžŅŅĐĩйиŅĐĩĐģи вĐĩŅĐĩ ĐŊŅĐŧа да иĐŧĐ°Ņ Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŊĐĩĐŗĐž.",
|
||||||
|
"album_deleted": "ĐĐģĐąŅĐŧа Đĩ иСŅŅиŅ",
|
||||||
"album_info_card_backup_album_excluded": "ĐĐĐĐЎЧĐĐ",
|
"album_info_card_backup_album_excluded": "ĐĐĐĐЎЧĐĐ",
|
||||||
"album_info_card_backup_album_included": "ĐĐĐЎЧĐĐ",
|
"album_info_card_backup_album_included": "ĐĐĐЎЧĐĐ",
|
||||||
"album_info_updated": "ĐĐŊŅĐžŅĐŧаŅиŅŅа Са аĐģĐąŅĐŧа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
"album_info_updated": "ĐĐŊŅĐžŅĐŧаŅиŅŅа Са аĐģĐąŅĐŧа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
||||||
@@ -406,6 +421,7 @@
|
|||||||
"album_options": "ĐаŅŅŅОКĐēи ĐŊа аĐģĐąŅĐŧа",
|
"album_options": "ĐаŅŅŅОКĐēи ĐŊа аĐģĐąŅĐŧа",
|
||||||
"album_remove_user": "ĐŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģ?",
|
"album_remove_user": "ĐŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģ?",
|
||||||
"album_remove_user_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {user}?",
|
"album_remove_user_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {user}?",
|
||||||
|
"album_search_not_found": "ĐŅĐŧа ĐŊаĐŧĐĩŅĐĩĐŊи аĐģĐąŅĐŧи, ĐžŅĐŗĐžĐ˛Đ°ŅŅŅи ĐŊа ŅŅŅŅĐĩĐŊĐĩŅĐž ви",
|
||||||
"album_share_no_users": "ĐĐˇĐŗĐģĐĩĐļда, ŅĐĩ ŅŅĐĩ ŅĐŋОдĐĩĐģиĐģи ŅОСи аĐģĐąŅĐŧ Ņ Đ˛ŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи иĐģи ĐŊŅĐŧаŅĐĩ Đ´ŅŅĐŗ ĐŋĐžŅŅĐĩйиŅĐĩĐģ, Ņ ĐēĐžĐŗĐžŅĐž да ĐŗĐž ŅĐŋОдĐĩĐģиŅĐĩ.",
|
"album_share_no_users": "ĐĐˇĐŗĐģĐĩĐļда, ŅĐĩ ŅŅĐĩ ŅĐŋОдĐĩĐģиĐģи ŅОСи аĐģĐąŅĐŧ Ņ Đ˛ŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи иĐģи ĐŊŅĐŧаŅĐĩ Đ´ŅŅĐŗ ĐŋĐžŅŅĐĩйиŅĐĩĐģ, Ņ ĐēĐžĐŗĐžŅĐž да ĐŗĐž ŅĐŋОдĐĩĐģиŅĐĩ.",
|
||||||
"album_updated": "ĐĐģĐąŅĐŧŅŅ Đĩ аĐēŅŅаĐģиСиŅаĐŊ",
|
"album_updated": "ĐĐģĐąŅĐŧŅŅ Đĩ аĐēŅŅаĐģиСиŅаĐŊ",
|
||||||
"album_updated_setting_description": "ĐĐžĐģŅŅаваКŅĐĩ иСвĐĩŅŅиĐĩ ĐŋĐž иĐŧĐĩĐšĐģ, ĐēĐžĐŗĐ°ŅĐž ŅĐŋОдĐĩĐģĐĩĐŊ аĐģĐąŅĐŧ иĐŧа ĐŊОви ŅаКĐģОвĐĩ",
|
"album_updated_setting_description": "ĐĐžĐģŅŅаваКŅĐĩ иСвĐĩŅŅиĐĩ ĐŋĐž иĐŧĐĩĐšĐģ, ĐēĐžĐŗĐ°ŅĐž ŅĐŋОдĐĩĐģĐĩĐŊ аĐģĐąŅĐŧ иĐŧа ĐŊОви ŅаКĐģОвĐĩ",
|
||||||
@@ -425,6 +441,7 @@
|
|||||||
"albums_default_sort_order": "Đ ĐĩĐ´ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ Са ŅĐžŅŅиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧи",
|
"albums_default_sort_order": "Đ ĐĩĐ´ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ Са ŅĐžŅŅиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧи",
|
||||||
"albums_default_sort_order_description": "ĐŅŅвОĐŊаŅаĐģĐĩĐŊ ŅĐĩĐ´ ĐŊа ŅĐžŅŅиŅаĐŊĐĩ ĐŋŅи ŅŅСдаваĐŊĐĩ ĐŊа ĐŊОв аĐģĐąŅĐŧ.",
|
"albums_default_sort_order_description": "ĐŅŅвОĐŊаŅаĐģĐĩĐŊ ŅĐĩĐ´ ĐŊа ŅĐžŅŅиŅаĐŊĐĩ ĐŋŅи ŅŅСдаваĐŊĐĩ ĐŊа ĐŊОв аĐģĐąŅĐŧ.",
|
||||||
"albums_feature_description": "ĐĐžĐģĐĩĐēŅии ĐžŅ ĐžĐąĐĩĐēŅи, ĐēОиŅĐž ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ ŅĐŋОдĐĩĐģŅĐŊи Ņ Đ´ŅŅĐŗĐ¸ ĐŋĐžŅĐĩйиŅĐĩĐģи.",
|
"albums_feature_description": "ĐĐžĐģĐĩĐēŅии ĐžŅ ĐžĐąĐĩĐēŅи, ĐēОиŅĐž ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ ŅĐŋОдĐĩĐģŅĐŊи Ņ Đ´ŅŅĐŗĐ¸ ĐŋĐžŅĐĩйиŅĐĩĐģи.",
|
||||||
|
"albums_on_device_count": "ĐĐģĐąŅĐŧи ĐŊа ŅŅŅŅОКŅŅвОŅĐž ({count})",
|
||||||
"all": "ĐŅиŅĐēи",
|
"all": "ĐŅиŅĐēи",
|
||||||
"all_albums": "ĐŅиŅĐēи аĐģĐąŅĐŧи",
|
"all_albums": "ĐŅиŅĐēи аĐģĐąŅĐŧи",
|
||||||
"all_people": "ĐŅиŅĐēи Ņ
ĐžŅа",
|
"all_people": "ĐŅиŅĐēи Ņ
ĐžŅа",
|
||||||
@@ -483,7 +500,9 @@
|
|||||||
"assets": "ĐĐģĐĩĐŧĐĩĐŊŅи",
|
"assets": "ĐĐģĐĩĐŧĐĩĐŊŅи",
|
||||||
"assets_added_count": "ĐОйавĐĩĐŊĐž {count, plural, one {# asset} other {# assets}}",
|
"assets_added_count": "ĐОйавĐĩĐŊĐž {count, plural, one {# asset} other {# assets}}",
|
||||||
"assets_added_to_album_count": "ĐОйавĐĩĐŊ(и) Ņа {count, plural, one {# аĐēŅив} other {# аĐēŅива}} в аĐģĐąŅĐŧа",
|
"assets_added_to_album_count": "ĐОйавĐĩĐŊ(и) Ņа {count, plural, one {# аĐēŅив} other {# аĐēŅива}} в аĐģĐąŅĐŧа",
|
||||||
|
"assets_added_to_albums_count": "ĐОйавĐĩĐŊи Ņа {assetTotal} ОйĐĩĐēŅа в {albumTotal} аĐģĐąŅĐŧа",
|
||||||
"assets_cannot_be_added_to_album_count": "{count, 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_count": "{count, plural, one {# аĐēŅив} other {# аĐēŅива}}",
|
||||||
"assets_deleted_permanently": "{count} ОйĐĩĐēŅа Ņа иСŅŅиŅи СавиĐŊĐ°ĐŗĐ¸",
|
"assets_deleted_permanently": "{count} ОйĐĩĐēŅа Ņа иСŅŅиŅи СавиĐŊĐ°ĐŗĐ¸",
|
||||||
"assets_deleted_permanently_from_server": "{count} ОйĐĩĐēŅа Ņа иСŅиŅи ĐžŅ Immich ŅŅŅвŅŅа СавиĐŊĐ°ĐŗĐ¸",
|
"assets_deleted_permanently_from_server": "{count} ОйĐĩĐēŅа Ņа иСŅиŅи ĐžŅ Immich ŅŅŅвŅŅа СавиĐŊĐ°ĐŗĐ¸",
|
||||||
@@ -500,6 +519,7 @@
|
|||||||
"assets_trashed_count": "ĐŅСŅŅаĐŊОвĐĩĐŊ(и) Ņа {count, plural, one {# ŅаКĐģ} other {# ŅаКĐģа}}",
|
"assets_trashed_count": "ĐŅСŅŅаĐŊОвĐĩĐŊ(и) Ņа {count, plural, one {# ŅаКĐģ} other {# ŅаКĐģа}}",
|
||||||
"assets_trashed_from_server": "{count} ОйĐĩĐēŅа Ņа ĐŋŅĐĩĐŧĐĩŅŅĐĩĐŊи в ĐēĐžŅа ĐŊа Immich ŅŅŅвŅŅа",
|
"assets_trashed_from_server": "{count} ОйĐĩĐēŅа Ņа ĐŋŅĐĩĐŧĐĩŅŅĐĩĐŊи в ĐēĐžŅа ĐŊа Immich ŅŅŅвŅŅа",
|
||||||
"assets_were_part_of_album_count": "{count, plural, one {ФаКĐģŅŅ Đĩ} other {ФаКĐģОвĐĩŅĐĩ Ņа}} вĐĩŅĐĩ ŅаŅŅ ĐžŅ Đ°ĐģĐąŅĐŧа",
|
"assets_were_part_of_album_count": "{count, plural, one {ФаКĐģŅŅ Đĩ} other {ФаКĐģОвĐĩŅĐĩ Ņа}} вĐĩŅĐĩ ŅаŅŅ ĐžŅ Đ°ĐģĐąŅĐŧа",
|
||||||
|
"assets_were_part_of_albums_count": "{count, plural, one {ОйĐĩĐēŅ Đ˛ĐĩŅĐĩ Đĩ} other {ОйĐĩĐēŅа вĐĩŅĐĩ Ņа}} ŅаŅŅ ĐžŅ Đ°ĐģĐąŅĐŧиŅĐĩ",
|
||||||
"authorized_devices": "ĐŖĐ´ĐžŅŅОвĐĩŅĐĩĐŊи ŅŅŅŅОКŅŅва",
|
"authorized_devices": "ĐŖĐ´ĐžŅŅОвĐĩŅĐĩĐŊи ŅŅŅŅОКŅŅва",
|
||||||
"automatic_endpoint_switching_subtitle": "ĐĐžĐŗĐ°ŅĐž Đĩ Đ´ĐžŅŅŅĐŋĐŊа, иСĐŋĐžĐģСваК ĐŋĐžŅĐžŅĐĩĐŊаŅа Wi-Fi ĐŧŅĐĩĐļа, иĐŊаŅĐĩ иСĐŋĐžĐģСваК аĐģŅĐĩŅĐŊаŅивĐŊи вŅŅСĐēи",
|
"automatic_endpoint_switching_subtitle": "ĐĐžĐŗĐ°ŅĐž Đĩ Đ´ĐžŅŅŅĐŋĐŊа, иСĐŋĐžĐģСваК ĐŋĐžŅĐžŅĐĩĐŊаŅа Wi-Fi ĐŧŅĐĩĐļа, иĐŊаŅĐĩ иСĐŋĐžĐģСваК аĐģŅĐĩŅĐŊаŅивĐŊи вŅŅСĐēи",
|
||||||
"automatic_endpoint_switching_title": "ĐвŅĐžĐŧаŅиŅĐŊĐž ĐŋŅĐĩвĐēĐģŅŅваĐŊĐĩ ĐŊа URL",
|
"automatic_endpoint_switching_title": "ĐвŅĐžĐŧаŅиŅĐŊĐž ĐŋŅĐĩвĐēĐģŅŅваĐŊĐĩ ĐŊа URL",
|
||||||
@@ -508,6 +528,7 @@
|
|||||||
"back_close_deselect": "ĐаСад, СаŅваŅŅĐŊĐĩ иĐģи ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа иСйОŅа",
|
"back_close_deselect": "ĐаСад, СаŅваŅŅĐŊĐĩ иĐģи ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа иСйОŅа",
|
||||||
"background_location_permission": "РаСŅĐĩŅĐĩĐŊиĐĩ Са Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž вŅв ŅĐžĐŊОв ŅĐĩĐļиĐŧ",
|
"background_location_permission": "РаСŅĐĩŅĐĩĐŊиĐĩ Са Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž вŅв ŅĐžĐŊОв ŅĐĩĐļиĐŧ",
|
||||||
"background_location_permission_content": "Đа да ĐŧĐžĐļĐĩ да ŅĐĩŅĐĩ иĐŧĐĩĐŊаŅа ĐŊа Wi-Fi ĐŧŅĐĩĐļиŅĐĩ и да ĐŗĐ¸ ĐŋŅĐĩвĐēĐģŅŅва ĐŋŅи ŅайОŅа вŅв ŅĐžĐŊОв ŅĐĩĐļиĐŧ, Immich ŅŅŅйва *виĐŊĐ°ĐŗĐ¸* да иĐŧа Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐžŅĐŊĐžŅĐž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
"background_location_permission_content": "Đа да ĐŧĐžĐļĐĩ да ŅĐĩŅĐĩ иĐŧĐĩĐŊаŅа ĐŊа Wi-Fi ĐŧŅĐĩĐļиŅĐĩ и да ĐŗĐ¸ ĐŋŅĐĩвĐēĐģŅŅва ĐŋŅи ŅайОŅа вŅв ŅĐžĐŊОв ŅĐĩĐļиĐŧ, Immich ŅŅŅйва *виĐŊĐ°ĐŗĐ¸* да иĐŧа Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐžŅĐŊĐžŅĐž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||||
|
"backup": "ĐŅŅ
ивиŅаĐŊĐĩ",
|
||||||
"backup_album_selection_page_albums_device": "ĐĐģĐąŅĐŧи ĐŊа ŅŅŅŅОКŅŅвОŅĐž ({count})",
|
"backup_album_selection_page_albums_device": "ĐĐģĐąŅĐŧи ĐŊа ŅŅŅŅОКŅŅвОŅĐž ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "ĐаŅиŅĐŊи Са да вĐēĐģŅŅиŅ, двОКĐŊĐž Са да иСĐēĐģŅŅиŅ",
|
"backup_album_selection_page_albums_tap": "ĐаŅиŅĐŊи Са да вĐēĐģŅŅиŅ, двОКĐŊĐž Са да иСĐēĐģŅŅиŅ",
|
||||||
"backup_album_selection_page_assets_scatter": "ĐĐąĐĩĐēŅиŅĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ ŅаСĐŋŅŅŅĐŊаŅи в ĐŊŅĐēĐžĐģĐēĐž аĐģĐąŅĐŧа. ĐĐž ŅОСи ĐŊаŅиĐŊ аĐģĐąŅĐŧиŅĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ Đ˛ĐēĐģŅŅĐĩĐŊи иĐģи иСĐēĐģŅŅĐĩĐŊи ĐŋĐž вŅĐĩĐŧĐĩ ĐŊа ĐŋŅĐžŅĐĩŅа ĐŊа аŅŅ
ивиŅаĐŊĐĩ.",
|
"backup_album_selection_page_assets_scatter": "ĐĐąĐĩĐēŅиŅĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ ŅаСĐŋŅŅŅĐŊаŅи в ĐŊŅĐēĐžĐģĐēĐž аĐģĐąŅĐŧа. ĐĐž ŅОСи ĐŊаŅиĐŊ аĐģĐąŅĐŧиŅĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° ĐąŅĐ´Đ°Ņ Đ˛ĐēĐģŅŅĐĩĐŊи иĐģи иСĐēĐģŅŅĐĩĐŊи ĐŋĐž вŅĐĩĐŧĐĩ ĐŊа ĐŋŅĐžŅĐĩŅа ĐŊа аŅŅ
ивиŅаĐŊĐĩ.",
|
||||||
@@ -568,9 +589,13 @@
|
|||||||
"backup_manual_in_progress": "ĐŅŅви аŅŅ
ивиŅаĐŊĐĩ. ĐĐŋиŅаК ŅĐģĐĩĐ´ ĐŧаĐģĐēĐž",
|
"backup_manual_in_progress": "ĐŅŅви аŅŅ
ивиŅаĐŊĐĩ. ĐĐŋиŅаК ŅĐģĐĩĐ´ ĐŧаĐģĐēĐž",
|
||||||
"backup_manual_success": "ĐŖŅĐŋĐĩŅĐŊĐž",
|
"backup_manual_success": "ĐŖŅĐŋĐĩŅĐŊĐž",
|
||||||
"backup_manual_title": "ĐĄŅŅŅĐžŅĐŊиĐĩ ĐŊа аŅŅ
ивиŅаĐŊĐĩŅĐž",
|
"backup_manual_title": "ĐĄŅŅŅĐžŅĐŊиĐĩ ĐŊа аŅŅ
ивиŅаĐŊĐĩŅĐž",
|
||||||
|
"backup_options": "ĐĐŋŅии Са аŅŅ
ивиŅаĐŊĐĩ",
|
||||||
"backup_options_page_title": "ĐаŅŅŅОКĐēи Са аŅŅ
ивиŅаĐŊĐĩ",
|
"backup_options_page_title": "ĐаŅŅŅОКĐēи Са аŅŅ
ивиŅаĐŊĐĩ",
|
||||||
"backup_setting_subtitle": "ĐŖĐŋŅавĐģŅваК ĐŊаŅŅŅОКĐēиŅĐĩ Са аŅŅ
ивиŅаĐŊĐĩ в аĐēŅивĐĩĐŊ и ŅĐžĐŊОв ŅĐĩĐļиĐŧ",
|
"backup_setting_subtitle": "ĐŖĐŋŅавĐģŅваК ĐŊаŅŅŅОКĐēиŅĐĩ Са аŅŅ
ивиŅаĐŊĐĩ в аĐēŅивĐĩĐŊ и ŅĐžĐŊОв ŅĐĩĐļиĐŧ",
|
||||||
|
"backup_settings_subtitle": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са ĐēаŅваĐŊĐĩ",
|
||||||
"backward": "ĐаСад",
|
"backward": "ĐаСад",
|
||||||
|
"beta_sync": "ĐĄŅаŅŅŅ ĐŊа ĐąĐĩŅа ŅиĐŊŅ
ŅĐžĐŊиСаŅиŅŅа",
|
||||||
|
"beta_sync_subtitle": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊОваŅа ŅиŅŅĐĩĐŧа Са ŅиĐŊŅ
ŅĐžĐŊиСаŅиŅ",
|
||||||
"biometric_auth_enabled": "ĐĐēĐģŅŅĐĩĐŊа йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
"biometric_auth_enabled": "ĐĐēĐģŅŅĐĩĐŊа йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
||||||
"biometric_locked_out": "ĐŅĐŧа Đ´ĐžŅŅŅĐŋ Đ´Đž йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
"biometric_locked_out": "ĐŅĐŧа Đ´ĐžŅŅŅĐŋ Đ´Đž йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
||||||
"biometric_no_options": "ĐŅĐŧа йиОĐŧĐĩŅŅиŅĐŊа авŅĐĩĐŊŅиĐēаŅиŅ",
|
"biometric_no_options": "ĐŅĐŧа йиОĐŧĐĩŅŅиŅĐŊа авŅĐĩĐŊŅиĐēаŅиŅ",
|
||||||
@@ -588,7 +613,7 @@
|
|||||||
"cache_settings_clear_cache_button": "ĐСŅиŅŅи ĐēĐĩŅа",
|
"cache_settings_clear_cache_button": "ĐСŅиŅŅи ĐēĐĩŅа",
|
||||||
"cache_settings_clear_cache_button_title": "ĐСŅиŅŅва ĐēĐĩŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž. ĐĸОва ŅĐĩ ĐŋОвĐģиŅĐĩ ĐŋŅОиСвОдиŅĐĩĐģĐŊĐžŅŅŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž Đ´ĐžĐēаŅĐž ĐēĐĩŅа ĐŊĐĩ ĐąŅĐ´Đĩ ŅŅСдадĐĩĐŊ ĐžŅĐŊОвО.",
|
"cache_settings_clear_cache_button_title": "ĐСŅиŅŅва ĐēĐĩŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž. ĐĸОва ŅĐĩ ĐŋОвĐģиŅĐĩ ĐŋŅОиСвОдиŅĐĩĐģĐŊĐžŅŅŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž Đ´ĐžĐēаŅĐž ĐēĐĩŅа ĐŊĐĩ ĐąŅĐ´Đĩ ŅŅСдадĐĩĐŊ ĐžŅĐŊОвО.",
|
||||||
"cache_settings_duplicated_assets_clear_button": "ĐĐЧĐĐĄĐĸĐ",
|
"cache_settings_duplicated_assets_clear_button": "ĐĐЧĐĐĄĐĸĐ",
|
||||||
"cache_settings_duplicated_assets_subtitle": "ĐĄĐŊиĐŧĐēи и видĐĩа, ĐēОиŅĐž Ņа в ЧĐĩŅĐŊĐ¸Ņ ŅĐŋиŅŅĐē ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
"cache_settings_duplicated_assets_subtitle": "ĐĄĐŊиĐŧĐēи и видĐĩа, ĐēОиŅĐž Ņа в ĐĄĐŋиŅŅĐēа Са Đ¸ĐŗĐŊĐžŅиŅаĐŊĐĩ ĐžŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||||
"cache_settings_duplicated_assets_title": "ĐŅĐąĐģиŅаĐŊи ОйĐĩĐēŅи ({count})",
|
"cache_settings_duplicated_assets_title": "ĐŅĐąĐģиŅаĐŊи ОйĐĩĐēŅи ({count})",
|
||||||
"cache_settings_statistics_album": "ĐийĐģиОŅĐĩĐēа Ņ ĐŧиĐŊиаŅŅŅи",
|
"cache_settings_statistics_album": "ĐийĐģиОŅĐĩĐēа Ņ ĐŧиĐŊиаŅŅŅи",
|
||||||
"cache_settings_statistics_full": "ĐŅĐģĐŊи иСОйŅаĐļĐĩĐŊиŅ",
|
"cache_settings_statistics_full": "ĐŅĐģĐŊи иСОйŅаĐļĐĩĐŊиŅ",
|
||||||
@@ -605,6 +630,7 @@
|
|||||||
"cancel": "ĐŅĐēаĐļи",
|
"cancel": "ĐŅĐēаĐļи",
|
||||||
"cancel_search": "ĐŅĐŧĐĩĐŊи ŅŅŅŅĐĩĐŊĐĩŅĐž",
|
"cancel_search": "ĐŅĐŧĐĩĐŊи ŅŅŅŅĐĩĐŊĐĩŅĐž",
|
||||||
"canceled": "ĐŅĐŧĐĩĐŊĐĩĐŊĐž",
|
"canceled": "ĐŅĐŧĐĩĐŊĐĩĐŊĐž",
|
||||||
|
"canceling": "ĐĐŊŅĐģиŅаĐŊĐĩ",
|
||||||
"cannot_merge_people": "ĐĐĩ ĐŧĐžĐļĐĩ да ОйĐĩдиĐŊŅва Ņ
ĐžŅа",
|
"cannot_merge_people": "ĐĐĩ ĐŧĐžĐļĐĩ да ОйĐĩдиĐŊŅва Ņ
ĐžŅа",
|
||||||
"cannot_undo_this_action": "ĐĐĩ ĐŧĐžĐļĐĩŅĐĩ да ĐžŅĐŧĐĩĐŊиŅĐĩ ŅОва Đ´ĐĩĐšŅŅвиĐĩ!",
|
"cannot_undo_this_action": "ĐĐĩ ĐŧĐžĐļĐĩŅĐĩ да ĐžŅĐŧĐĩĐŊиŅĐĩ ŅОва Đ´ĐĩĐšŅŅвиĐĩ!",
|
||||||
"cannot_update_the_description": "ĐĐŋиŅаĐŊиĐĩŅĐž ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅĐ´Đĩ аĐēŅŅаĐģиСиŅаĐŊĐž",
|
"cannot_update_the_description": "ĐĐŋиŅаĐŊиĐĩŅĐž ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅĐ´Đĩ аĐēŅŅаĐģиСиŅаĐŊĐž",
|
||||||
@@ -636,6 +662,7 @@
|
|||||||
"clear": "ĐСŅиŅŅи",
|
"clear": "ĐСŅиŅŅи",
|
||||||
"clear_all": "ĐСŅиŅŅи вŅиŅĐēĐž",
|
"clear_all": "ĐСŅиŅŅи вŅиŅĐēĐž",
|
||||||
"clear_all_recent_searches": "ĐСŅиŅŅĐĩŅĐĩ вŅиŅĐēи ŅĐēĐžŅĐžŅĐŊи ŅŅŅŅĐĩĐŊиŅ",
|
"clear_all_recent_searches": "ĐСŅиŅŅĐĩŅĐĩ вŅиŅĐēи ŅĐēĐžŅĐžŅĐŊи ŅŅŅŅĐĩĐŊиŅ",
|
||||||
|
"clear_file_cache": "ĐСŅиŅŅваĐŊĐĩ ĐŊа ĐēĐĩŅа ĐŊа ŅаКĐģОвĐĩŅĐĩ",
|
||||||
"clear_message": "ĐСŅиŅŅи ŅŅОйŅĐĩĐŊиĐĩŅĐž",
|
"clear_message": "ĐСŅиŅŅи ŅŅОйŅĐĩĐŊиĐĩŅĐž",
|
||||||
"clear_value": "ĐСŅиŅŅи ŅŅОКĐŊĐžŅŅŅа",
|
"clear_value": "ĐСŅиŅŅи ŅŅОКĐŊĐžŅŅŅа",
|
||||||
"client_cert_dialog_msg_confirm": "ĐĐ",
|
"client_cert_dialog_msg_confirm": "ĐĐ",
|
||||||
@@ -706,6 +733,7 @@
|
|||||||
"create_new_user": "ĐĄŅСдаваĐŊĐĩ ĐŊа ĐŊОв ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
"create_new_user": "ĐĄŅСдаваĐŊĐĩ ĐŊа ĐŊОв ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
||||||
"create_shared_album_page_share_add_assets": "ĐĐĐĐĐĐ ĐĐĐĐĐĸĐ",
|
"create_shared_album_page_share_add_assets": "ĐĐĐĐĐĐ ĐĐĐĐĐĸĐ",
|
||||||
"create_shared_album_page_share_select_photos": "ĐСйĐĩŅи ŅĐŊиĐŧĐēи",
|
"create_shared_album_page_share_select_photos": "ĐСйĐĩŅи ŅĐŊиĐŧĐēи",
|
||||||
|
"create_shared_link": "ĐĄŅСдаК ĐģиĐŊĐē Са ŅĐŋОдĐĩĐģŅĐŊĐĩ",
|
||||||
"create_tag": "ĐĄŅСдаК ŅĐ°Đŗ",
|
"create_tag": "ĐĄŅСдаК ŅĐ°Đŗ",
|
||||||
"create_tag_description": "ĐĄŅСдаКŅĐĩ ĐŊОв ŅĐ°Đŗ. Đа вĐģĐžĐļĐĩĐŊи ŅĐ°ĐŗĐžĐ˛Đĩ, ĐŧĐžĐģŅ, вŅвĐĩĐ´ĐĩŅĐĩ ĐŋŅĐģĐŊĐ¸Ņ ĐŋŅŅ ĐŊа ŅĐ°ĐŗĐ°, вĐēĐģŅŅиŅĐĩĐģĐŊĐž ĐŊаĐēĐģĐžĐŊĐĩĐŊиŅĐĩ ŅĐĩŅŅи.",
|
"create_tag_description": "ĐĄŅСдаКŅĐĩ ĐŊОв ŅĐ°Đŗ. Đа вĐģĐžĐļĐĩĐŊи ŅĐ°ĐŗĐžĐ˛Đĩ, ĐŧĐžĐģŅ, вŅвĐĩĐ´ĐĩŅĐĩ ĐŋŅĐģĐŊĐ¸Ņ ĐŋŅŅ ĐŊа ŅĐ°ĐŗĐ°, вĐēĐģŅŅиŅĐĩĐģĐŊĐž ĐŊаĐēĐģĐžĐŊĐĩĐŊиŅĐĩ ŅĐĩŅŅи.",
|
||||||
"create_user": "ĐĄŅСдаК ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
"create_user": "ĐĄŅСдаК ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
||||||
@@ -718,6 +746,7 @@
|
|||||||
"current_server_address": "ĐаŅŅĐžŅŅ Đ°Đ´ŅĐĩŅ ĐŊа ŅŅŅвŅŅа",
|
"current_server_address": "ĐаŅŅĐžŅŅ Đ°Đ´ŅĐĩŅ ĐŊа ŅŅŅвŅŅа",
|
||||||
"custom_locale": "ĐĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ ĐģĐžĐēаĐģ",
|
"custom_locale": "ĐĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ ĐģĐžĐēаĐģ",
|
||||||
"custom_locale_description": "ФОŅĐŧаŅиŅаĐŊĐĩ ĐŊа даŅи и ŅиŅĐģа в СавиŅиĐŧĐžŅŅ ĐžŅ ĐĩСиĐēа и ŅĐĩĐŗĐ¸ĐžĐŊа",
|
"custom_locale_description": "ФОŅĐŧаŅиŅаĐŊĐĩ ĐŊа даŅи и ŅиŅĐģа в СавиŅиĐŧĐžŅŅ ĐžŅ ĐĩСиĐēа и ŅĐĩĐŗĐ¸ĐžĐŊа",
|
||||||
|
"custom_url": "ĐĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ URL адŅĐĩŅ",
|
||||||
"daily_title_text_date": "E, dd MMM",
|
"daily_title_text_date": "E, dd MMM",
|
||||||
"daily_title_text_date_year": "E, dd MMM yyyy",
|
"daily_title_text_date_year": "E, dd MMM yyyy",
|
||||||
"dark": "ĐĸŅĐŧĐĩĐŊ",
|
"dark": "ĐĸŅĐŧĐĩĐŊ",
|
||||||
@@ -729,6 +758,7 @@
|
|||||||
"date_of_birth_saved": "ĐаŅа ĐŊа ŅаĐļдаĐŊĐĩ Đĩ СаĐŋиŅаĐŊа ŅŅĐŋĐĩŅĐŊĐž",
|
"date_of_birth_saved": "ĐаŅа ĐŊа ŅаĐļдаĐŊĐĩ Đĩ СаĐŋиŅаĐŊа ŅŅĐŋĐĩŅĐŊĐž",
|
||||||
"date_range": "ĐĐĩŅиОд ĐžŅ Đ˛ŅĐĩĐŧĐĩ",
|
"date_range": "ĐĐĩŅиОд ĐžŅ Đ˛ŅĐĩĐŧĐĩ",
|
||||||
"day": "ĐĐĩĐŊ",
|
"day": "ĐĐĩĐŊ",
|
||||||
|
"days": "ĐĐŊи",
|
||||||
"deduplicate_all": "ĐĐĩĐ´ŅĐŋĐģиĐēиŅаĐŊĐĩ ĐŊа вŅиŅĐēи",
|
"deduplicate_all": "ĐĐĩĐ´ŅĐŋĐģиĐēиŅаĐŊĐĩ ĐŊа вŅиŅĐēи",
|
||||||
"deduplication_criteria_1": "РаСĐŧĐĩŅ ĐŊа ŅĐŊиĐŧĐēаŅа в йаКŅОвĐĩ",
|
"deduplication_criteria_1": "РаСĐŧĐĩŅ ĐŊа ŅĐŊиĐŧĐēаŅа в йаКŅОвĐĩ",
|
||||||
"deduplication_criteria_2": "ĐŅОК EXIF даĐŊĐŊи",
|
"deduplication_criteria_2": "ĐŅОК EXIF даĐŊĐŊи",
|
||||||
@@ -737,7 +767,8 @@
|
|||||||
"default_locale": "ĐĐžĐēаĐģиСаŅĐ¸Ņ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ",
|
"default_locale": "ĐĐžĐēаĐģиСаŅĐ¸Ņ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ",
|
||||||
"default_locale_description": "ФОŅĐŧаŅиŅаĐŊĐĩ ĐŊа даŅи и ŅиŅĐģа в СавиŅиĐŧĐžŅŅ ĐžŅ ĐĩСиĐēОваŅа ĐŊаŅŅŅОКĐēа ĐŊа ĐąŅаŅСŅŅа",
|
"default_locale_description": "ФОŅĐŧаŅиŅаĐŊĐĩ ĐŊа даŅи и ŅиŅĐģа в СавиŅиĐŧĐžŅŅ ĐžŅ ĐĩСиĐēОваŅа ĐŊаŅŅŅОКĐēа ĐŊа ĐąŅаŅСŅŅа",
|
||||||
"delete": "ĐСŅŅиК",
|
"delete": "ĐСŅŅиК",
|
||||||
"delete_action_prompt": "{count} Ņа иСŅŅиŅи СавиĐŊĐ°ĐŗĐ¸",
|
"delete_action_confirmation_message": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ ŅОСи ОйĐĩĐēŅ? ĐĄĐģĐĩдва ĐŋŅĐĩĐŧĐĩŅŅваĐŊĐĩ ĐŊа ОйĐĩĐēŅа в ĐēĐžŅа Са ĐžŅĐŋадŅŅи ĐŊа ŅŅŅвŅŅа и ŅĐĩ ĐŋĐžĐģŅŅиŅĐĩ ĐŋŅĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ ОйĐĩĐēŅа да ĐąŅĐ´Đĩ иСŅŅĐ¸Ņ ĐģĐžĐēаĐģĐŊĐž",
|
||||||
|
"delete_action_prompt": "{count} Ņа иСŅŅиŅи",
|
||||||
"delete_album": "ĐСŅŅиК аĐģĐąŅĐŧ",
|
"delete_album": "ĐСŅŅиК аĐģĐąŅĐŧ",
|
||||||
"delete_api_key_prompt": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ ŅОСи API ĐēĐģŅŅ?",
|
"delete_api_key_prompt": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСŅŅиĐĩŅĐĩ ŅОСи API ĐēĐģŅŅ?",
|
||||||
"delete_dialog_alert": "ĐĸĐĩСи ОйĐĩĐēŅи ŅĐĩ ĐąŅĐ´Đ°Ņ Đ¸ĐˇŅŅиŅи СавиĐŊĐ°ĐŗĐ¸ и ĐžŅ Immich ŅŅŅвŅŅа и ĐžŅ ŅŅŅŅОКŅŅвОŅĐž",
|
"delete_dialog_alert": "ĐĸĐĩСи ОйĐĩĐēŅи ŅĐĩ ĐąŅĐ´Đ°Ņ Đ¸ĐˇŅŅиŅи СавиĐŊĐ°ĐŗĐ¸ и ĐžŅ Immich ŅŅŅвŅŅа и ĐžŅ ŅŅŅŅОКŅŅвОŅĐž",
|
||||||
@@ -755,6 +786,8 @@
|
|||||||
"delete_local_dialog_ok_backed_up_only": "ĐСŅŅиК ĐģĐžĐēаĐģĐŊĐž ŅаĐŧĐž аŅŅ
ивиŅаĐŊиŅĐĩ",
|
"delete_local_dialog_ok_backed_up_only": "ĐСŅŅиК ĐģĐžĐēаĐģĐŊĐž ŅаĐŧĐž аŅŅ
ивиŅаĐŊиŅĐĩ",
|
||||||
"delete_local_dialog_ok_force": "ĐŅĐŋŅĐĩĐēи ŅОва иСŅŅиК",
|
"delete_local_dialog_ok_force": "ĐŅĐŋŅĐĩĐēи ŅОва иСŅŅиК",
|
||||||
"delete_others": "ĐСŅŅиК ĐžŅŅаĐŊаĐģиŅĐĩ",
|
"delete_others": "ĐСŅŅиК ĐžŅŅаĐŊаĐģиŅĐĩ",
|
||||||
|
"delete_permanently": "ĐСŅŅиК Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž",
|
||||||
|
"delete_permanently_action_prompt": "{count} иСŅŅиŅи Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž",
|
||||||
"delete_shared_link": "ĐСŅŅиваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
|
"delete_shared_link": "ĐСŅŅиваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
|
||||||
"delete_shared_link_dialog_title": "ĐСŅŅиК ŅĐŋОдĐĩĐģĐĩĐŊаŅа вŅŅСĐēа",
|
"delete_shared_link_dialog_title": "ĐСŅŅиК ŅĐŋОдĐĩĐģĐĩĐŊаŅа вŅŅСĐēа",
|
||||||
"delete_tag": "ĐСŅŅиК ŅĐ°Đŗ",
|
"delete_tag": "ĐСŅŅиК ŅĐ°Đŗ",
|
||||||
@@ -765,6 +798,7 @@
|
|||||||
"description": "ĐĐŋиŅаĐŊиĐĩ",
|
"description": "ĐĐŋиŅаĐŊиĐĩ",
|
||||||
"description_input_hint_text": "ĐОйави ĐžĐŋиŅаĐŊиĐĩ...",
|
"description_input_hint_text": "ĐОйави ĐžĐŋиŅаĐŊиĐĩ...",
|
||||||
"description_input_submit_error": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ĐžĐŋиŅаĐŊиĐĩŅĐž. Đа ĐŋОдŅОйĐŊĐžŅŅи виĐļŅĐĩ в Đ´ĐŊĐĩвĐŊиĐēа",
|
"description_input_submit_error": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ĐžĐŋиŅаĐŊиĐĩŅĐž. Đа ĐŋОдŅОйĐŊĐžŅŅи виĐļŅĐĩ в Đ´ĐŊĐĩвĐŊиĐēа",
|
||||||
|
"deselect_all": "ĐŅĐĩĐŧаŅ
ĐŊи иСйОŅа ĐžŅ Đ˛ŅиŅĐēи",
|
||||||
"details": "ĐĐĩŅаКĐģи",
|
"details": "ĐĐĩŅаКĐģи",
|
||||||
"direction": "ĐĐžŅĐžĐēа",
|
"direction": "ĐĐžŅĐžĐēа",
|
||||||
"disabled": "ĐСĐēĐģŅŅĐĩĐŊĐž",
|
"disabled": "ĐСĐēĐģŅŅĐĩĐŊĐž",
|
||||||
@@ -809,8 +843,12 @@
|
|||||||
"edit": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ",
|
"edit": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ",
|
||||||
"edit_album": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧ",
|
"edit_album": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧ",
|
||||||
"edit_avatar": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа аваŅаŅ",
|
"edit_avatar": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа аваŅаŅ",
|
||||||
|
"edit_birthday": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа ŅĐžĐļĐ´ĐĩĐŊ Đ´ĐĩĐŊ",
|
||||||
"edit_date": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа даŅа",
|
"edit_date": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа даŅа",
|
||||||
"edit_date_and_time": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа даŅа и ŅаŅ",
|
"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": "Đ ĐĩдаĐēŅиŅаК ĐžĐŋиŅаĐŊиĐĩ",
|
||||||
"edit_description_prompt": "ĐĐžĐģŅ, иСйĐĩŅи ĐŊОвО ĐžĐŋиŅаĐŊиĐĩ:",
|
"edit_description_prompt": "ĐĐžĐģŅ, иСйĐĩŅи ĐŊОвО ĐžĐŋиŅаĐŊиĐĩ:",
|
||||||
"edit_exclusion_pattern": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа ŅайĐģĐžĐŊ Са иСĐēĐģŅŅваĐŊĐĩ",
|
"edit_exclusion_pattern": "Đ ĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа ŅайĐģĐžĐŊ Са иСĐēĐģŅŅваĐŊĐĩ",
|
||||||
@@ -839,6 +877,7 @@
|
|||||||
"empty_trash": "ĐСĐŋŅаСваĐŊĐĩ ĐŊа ĐēĐžŅ",
|
"empty_trash": "ĐСĐŋŅаСваĐŊĐĩ ĐŊа ĐēĐžŅ",
|
||||||
"empty_trash_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСĐŋŅаСĐŊиŅĐĩ ĐēĐžŅŅĐĩŅĐž? ĐĸОва ŅĐĩ ĐŋŅĐĩĐŧаŅ
ĐŊĐĩ вŅиŅĐēĐž в ĐēĐžŅŅĐĩŅĐž Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž ĐžŅ Immich.\nĐĐĩ ĐŧĐžĐļĐĩŅĐĩ да ĐžŅĐŧĐĩĐŊиŅĐĩ ŅОва Đ´ĐĩĐšŅŅвиĐĩ!",
|
"empty_trash_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да иСĐŋŅаСĐŊиŅĐĩ ĐēĐžŅŅĐĩŅĐž? ĐĸОва ŅĐĩ ĐŋŅĐĩĐŧаŅ
ĐŊĐĩ вŅиŅĐēĐž в ĐēĐžŅŅĐĩŅĐž Са ĐŋĐžŅŅĐžŅĐŊĐŊĐž ĐžŅ Immich.\nĐĐĩ ĐŧĐžĐļĐĩŅĐĩ да ĐžŅĐŧĐĩĐŊиŅĐĩ ŅОва Đ´ĐĩĐšŅŅвиĐĩ!",
|
||||||
"enable": "ĐĐēĐģŅŅваĐŊĐĩ",
|
"enable": "ĐĐēĐģŅŅваĐŊĐĩ",
|
||||||
|
"enable_backup": "ĐĐēĐģŅŅи ŅĐĩСĐĩŅвĐŊĐžŅĐž ĐēĐžĐŋиŅаĐŊĐĩ",
|
||||||
"enable_biometric_auth_description": "ĐŅвĐĩĐ´ĐĩŅĐĩ ваŅĐ¸Ņ PIN ĐēОд, Са да ŅаСŅĐĩŅиŅĐĩ йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
"enable_biometric_auth_description": "ĐŅвĐĩĐ´ĐĩŅĐĩ ваŅĐ¸Ņ PIN ĐēОд, Са да ŅаСŅĐĩŅиŅĐĩ йиОĐŧĐĩŅŅиŅĐŊĐž ŅĐ´ĐžŅŅОвĐĩŅŅваĐŊĐĩ",
|
||||||
"enabled": "ĐĐēĐģŅŅĐĩĐŊĐž",
|
"enabled": "ĐĐēĐģŅŅĐĩĐŊĐž",
|
||||||
"end_date": "ĐŅаКĐŊа даŅа",
|
"end_date": "ĐŅаКĐŊа даŅа",
|
||||||
@@ -882,6 +921,7 @@
|
|||||||
"failed_to_load_notifications": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаŅĐĩĐļдаĐŊĐĩ ĐŊа иСвĐĩŅŅиŅ",
|
"failed_to_load_notifications": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаŅĐĩĐļдаĐŊĐĩ ĐŊа иСвĐĩŅŅиŅ",
|
||||||
"failed_to_load_people": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаŅĐĩĐļдаĐŊĐĩ ĐŊа Ņ
ĐžŅа",
|
"failed_to_load_people": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž СаŅĐĩĐļдаĐŊĐĩ ĐŊа Ņ
ĐžŅа",
|
||||||
"failed_to_remove_product_key": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋŅОдŅĐēŅĐžĐ˛Đ¸Ņ ĐēĐģŅŅ",
|
"failed_to_remove_product_key": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋŅОдŅĐēŅĐžĐ˛Đ¸Ņ ĐēĐģŅŅ",
|
||||||
|
"failed_to_reset_pin_code": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŊŅĐģиŅаĐŊĐĩ ĐŊа ĐĐĐ ĐēОда",
|
||||||
"failed_to_stack_assets": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋОдŅĐĩĐļдаĐŊĐĩ ĐŊа ОйĐĩĐēŅи",
|
"failed_to_stack_assets": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋОдŅĐĩĐļдаĐŊĐĩ ĐŊа ОйĐĩĐēŅи",
|
||||||
"failed_to_unstack_assets": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋОдŅĐĩдйаŅа ĐŊа ОйĐĩĐēŅи",
|
"failed_to_unstack_assets": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐŋŅĐĩĐŧаŅ
ваĐŊĐĩ ĐŊа ĐŋОдŅĐĩдйаŅа ĐŊа ОйĐĩĐēŅи",
|
||||||
"failed_to_update_notification_status": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ŅŅŅŅĐžŅĐŊиĐĩŅĐž ĐŊа иСвĐĩŅŅиŅŅа",
|
"failed_to_update_notification_status": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ŅŅŅŅĐžŅĐŊиĐĩŅĐž ĐŊа иСвĐĩŅŅиŅŅа",
|
||||||
@@ -890,6 +930,7 @@
|
|||||||
"paths_validation_failed": "{paths, plural, one {# ĐŋŅŅ} other {# ĐŋŅŅиŅа}} ĐŊĐĩ ĐŋŅĐĩĐŧиĐŊаŅ
а ваĐģидаŅиŅ",
|
"paths_validation_failed": "{paths, plural, one {# ĐŋŅŅ} other {# ĐŋŅŅиŅа}} ĐŊĐĩ ĐŋŅĐĩĐŧиĐŊаŅ
а ваĐģидаŅиŅ",
|
||||||
"profile_picture_transparent_pixels": "ĐŅĐžŅиĐģĐŊиŅĐĩ ŅĐŊиĐŧĐēи ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° иĐŧĐ°Ņ ĐŋŅОСŅаŅĐŊи ĐŋиĐēŅĐĩĐģи. ĐĐžĐģŅ, ŅвĐĩĐģиŅĐĩŅĐĩ и/иĐģи ĐŋŅĐĩĐŧĐĩŅŅĐĩŅĐĩ иСОйŅаĐļĐĩĐŊиĐĩŅĐž.",
|
"profile_picture_transparent_pixels": "ĐŅĐžŅиĐģĐŊиŅĐĩ ŅĐŊиĐŧĐēи ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° иĐŧĐ°Ņ ĐŋŅОСŅаŅĐŊи ĐŋиĐēŅĐĩĐģи. ĐĐžĐģŅ, ŅвĐĩĐģиŅĐĩŅĐĩ и/иĐģи ĐŋŅĐĩĐŧĐĩŅŅĐĩŅĐĩ иСОйŅаĐļĐĩĐŊиĐĩŅĐž.",
|
||||||
"quota_higher_than_disk_size": "ĐададĐĩĐŊа Đĩ ĐēвОŅа, ĐŋĐž-ĐŗĐžĐģŅĐŧа ĐžŅ ŅаСĐŧĐĩŅа ĐŊа диŅĐēа",
|
"quota_higher_than_disk_size": "ĐададĐĩĐŊа Đĩ ĐēвОŅа, ĐŋĐž-ĐŗĐžĐģŅĐŧа ĐžŅ ŅаСĐŧĐĩŅа ĐŊа диŅĐēа",
|
||||||
|
"something_went_wrong": "ĐĐĩŅĐž ŅĐĩ ОйŅŅĐēа",
|
||||||
"unable_to_add_album_users": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģи в аĐģĐąŅĐŧ",
|
"unable_to_add_album_users": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģи в аĐģĐąŅĐŧ",
|
||||||
"unable_to_add_assets_to_shared_link": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ОйĐĩĐēŅи в ŅĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
|
"unable_to_add_assets_to_shared_link": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ОйĐĩĐēŅи в ŅĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
|
||||||
"unable_to_add_comment": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ĐēĐžĐŧĐĩĐŊŅаŅ",
|
"unable_to_add_comment": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž дОйавŅĐŊĐĩ ĐŊа ĐēĐžĐŧĐĩĐŊŅаŅ",
|
||||||
@@ -975,13 +1016,11 @@
|
|||||||
},
|
},
|
||||||
"exif": "Exif",
|
"exif": "Exif",
|
||||||
"exif_bottom_sheet_description": "ĐОйави ĐĐŋиŅаĐŊиĐĩ...",
|
"exif_bottom_sheet_description": "ĐОйави ĐĐŋиŅаĐŊиĐĩ...",
|
||||||
|
"exif_bottom_sheet_description_error": "ĐĐĩŅŅĐŋĐĩŅĐŊĐž ОйĐŊОвŅваĐŊĐĩ ĐŊа ĐžĐŋиŅаĐŊиĐĩ",
|
||||||
"exif_bottom_sheet_details": "ĐĐĐĐ ĐĐĐĐĐĄĐĸĐ",
|
"exif_bottom_sheet_details": "ĐĐĐĐ ĐĐĐĐĐĄĐĸĐ",
|
||||||
"exif_bottom_sheet_location": "ĐĐ¯ĐĄĐĸĐ",
|
"exif_bottom_sheet_location": "ĐĐ¯ĐĄĐĸĐ",
|
||||||
"exif_bottom_sheet_people": "ĐĨĐĐ Đ",
|
"exif_bottom_sheet_people": "ĐĨĐĐ Đ",
|
||||||
"exif_bottom_sheet_person_add_person": "ĐОйави иĐŧĐĩ",
|
"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": "ĐСŅ
Од ĐžŅ ŅĐģаКдŅĐžŅŅĐž",
|
"exit_slideshow": "ĐСŅ
Од ĐžŅ ŅĐģаКдŅĐžŅŅĐž",
|
||||||
"expand_all": "РаСŅиŅи вŅиŅĐēи",
|
"expand_all": "РаСŅиŅи вŅиŅĐēи",
|
||||||
"experimental_settings_new_asset_list_subtitle": "Đ ŅаСвиŅиĐĩ",
|
"experimental_settings_new_asset_list_subtitle": "Đ ŅаСвиŅиĐĩ",
|
||||||
@@ -995,6 +1034,8 @@
|
|||||||
"explorer": "ĐŅĐĩĐŗĐģĐĩĐ´",
|
"explorer": "ĐŅĐĩĐŗĐģĐĩĐ´",
|
||||||
"export": "ĐĐēŅĐŋĐžŅŅ",
|
"export": "ĐĐēŅĐŋĐžŅŅ",
|
||||||
"export_as_json": "ĐĐēŅĐŋĐžŅŅиŅаĐŊĐĩ ĐēаŅĐž JSON",
|
"export_as_json": "ĐĐēŅĐŋĐžŅŅиŅаĐŊĐĩ ĐēаŅĐž JSON",
|
||||||
|
"export_database": "ĐĐēŅĐŋĐžŅŅ ĐŊа йаСаŅа даĐŊĐŊи",
|
||||||
|
"export_database_description": "ĐĐēŅĐŋĐžŅŅ ĐŊа йаСаŅа даĐŊĐŊи SQLite",
|
||||||
"extension": "РаСŅиŅĐĩĐŊиĐĩ",
|
"extension": "РаСŅиŅĐĩĐŊиĐĩ",
|
||||||
"external": "ĐŅĐŊŅĐŊĐž",
|
"external": "ĐŅĐŊŅĐŊĐž",
|
||||||
"external_libraries": "ĐŅĐŊŅĐŊи йийĐģиОŅĐĩĐēи",
|
"external_libraries": "ĐŅĐŊŅĐŊи йийĐģиОŅĐĩĐēи",
|
||||||
@@ -1021,11 +1062,13 @@
|
|||||||
"filter_people": "ФиĐģŅŅиŅаĐŊĐĩ ĐŊа Ņ
ĐžŅа",
|
"filter_people": "ФиĐģŅŅиŅаĐŊĐĩ ĐŊа Ņ
ĐžŅа",
|
||||||
"filter_places": "ФиĐģŅŅŅ ĐŋĐž ĐŧŅŅŅĐž",
|
"filter_places": "ФиĐģŅŅŅ ĐŋĐž ĐŧŅŅŅĐž",
|
||||||
"find_them_fast": "ĐаĐŧĐĩŅĐĩŅĐĩ ĐŗĐ¸ ĐąŅŅСО ĐŋĐž иĐŧĐĩ Ņ ŅŅŅŅĐĩĐŊĐĩ",
|
"find_them_fast": "ĐаĐŧĐĩŅĐĩŅĐĩ ĐŗĐ¸ ĐąŅŅСО ĐŋĐž иĐŧĐĩ Ņ ŅŅŅŅĐĩĐŊĐĩ",
|
||||||
|
"first": "ĐŅŅви",
|
||||||
"fix_incorrect_match": "ĐĐžĐŋŅавŅĐŊĐĩ ĐŊа ĐŊĐĩĐŋŅавиĐģĐŊĐž ŅŅвĐŋадĐĩĐŊиĐĩ",
|
"fix_incorrect_match": "ĐĐžĐŋŅавŅĐŊĐĩ ĐŊа ĐŊĐĩĐŋŅавиĐģĐŊĐž ŅŅвĐŋадĐĩĐŊиĐĩ",
|
||||||
"folder": "ĐаĐŋĐēа",
|
"folder": "ĐаĐŋĐēа",
|
||||||
"folder_not_found": "ĐаĐŋĐēаŅа ĐŊĐĩ Đĩ ĐŊаĐŧĐĩŅĐĩĐŊа",
|
"folder_not_found": "ĐаĐŋĐēаŅа ĐŊĐĩ Đĩ ĐŊаĐŧĐĩŅĐĩĐŊа",
|
||||||
"folders": "ĐаĐŋĐēи",
|
"folders": "ĐаĐŋĐēи",
|
||||||
"folders_feature_description": "ĐŅĐĩĐŗĐģĐĩĐļдаĐŊĐĩ ĐŊа ĐŋаĐŋĐēаŅа Са ŅĐŊиĐŧĐēиŅĐĩ и видĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ в ŅаКĐģОваŅа ŅиŅŅĐĩĐŧа",
|
"folders_feature_description": "ĐŅĐĩĐŗĐģĐĩĐļдаĐŊĐĩ ĐŊа ĐŋаĐŋĐēаŅа Са ŅĐŊиĐŧĐēиŅĐĩ и видĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ в ŅаКĐģОваŅа ŅиŅŅĐĩĐŧа",
|
||||||
|
"forgot_pin_code_question": "ĐайŅавиĐģи ŅŅĐĩ ŅĐ˛ĐžŅ ĐĐĐ ĐēОд?",
|
||||||
"forward": "ĐаĐŋŅĐĩĐ´",
|
"forward": "ĐаĐŋŅĐĩĐ´",
|
||||||
"gcast_enabled": "Google Cast",
|
"gcast_enabled": "Google Cast",
|
||||||
"gcast_enabled_description": "Đа да ŅайОŅи ŅаСи ŅŅĐŊĐēŅĐ¸Ņ ĐˇĐ°ŅĐĩĐļда вŅĐŊŅĐŊи ŅĐĩŅŅŅŅи ĐžŅ Google.",
|
"gcast_enabled_description": "Đа да ŅайОŅи ŅаСи ŅŅĐŊĐēŅĐ¸Ņ ĐˇĐ°ŅĐĩĐļда вŅĐŊŅĐŊи ŅĐĩŅŅŅŅи ĐžŅ Google.",
|
||||||
@@ -1046,6 +1089,9 @@
|
|||||||
"haptic_feedback_switch": "ĐĐēĐģŅŅи ŅаĐēŅиĐģĐŊа ОйŅаŅĐŊа вŅŅСĐēа",
|
"haptic_feedback_switch": "ĐĐēĐģŅŅи ŅаĐēŅиĐģĐŊа ОйŅаŅĐŊа вŅŅСĐēа",
|
||||||
"haptic_feedback_title": "ĐĸаĐēŅиĐģĐŊа ОйŅаŅĐŊа вŅŅСĐēа",
|
"haptic_feedback_title": "ĐĸаĐēŅиĐģĐŊа ОйŅаŅĐŊа вŅŅСĐēа",
|
||||||
"has_quota": "ĐиĐŧиŅ",
|
"has_quota": "ĐиĐŧиŅ",
|
||||||
|
"hash_asset": "ĐĐąĐĩĐēŅ Ņ Ņ
ĐĩŅ",
|
||||||
|
"hashed_assets": "ĐĨĐĩŅиŅаĐŊи ОйĐĩĐēŅи",
|
||||||
|
"hashing": "ĐĨĐĩŅиŅаĐŊĐĩ",
|
||||||
"header_settings_add_header_tip": "ĐОйави ĐˇĐ°ĐŗĐģавиĐĩ",
|
"header_settings_add_header_tip": "ĐОйави ĐˇĐ°ĐŗĐģавиĐĩ",
|
||||||
"header_settings_field_validator_msg": "ĐĐĩĐ´ĐžĐŋŅŅŅиĐŧĐž Đĩ да ĐŊŅĐŧа ŅŅОКĐŊĐžŅŅ",
|
"header_settings_field_validator_msg": "ĐĐĩĐ´ĐžĐŋŅŅŅиĐŧĐž Đĩ да ĐŊŅĐŧа ŅŅОКĐŊĐžŅŅ",
|
||||||
"header_settings_header_name_input": "ĐĐŧĐĩ ĐŊа ĐˇĐ°ĐŗĐģавиĐĩŅĐž",
|
"header_settings_header_name_input": "ĐĐŧĐĩ ĐŊа ĐˇĐ°ĐŗĐģавиĐĩŅĐž",
|
||||||
@@ -1077,7 +1123,9 @@
|
|||||||
"home_page_upload_err_limit": "ĐĐžĐļĐĩ да ĐēаŅваŅĐĩ ĐŧаĐēŅиĐŧŅĐŧ 30 ОйĐĩĐēŅа ĐĩĐ´ĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž, ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ",
|
"home_page_upload_err_limit": "ĐĐžĐļĐĩ да ĐēаŅваŅĐĩ ĐŧаĐēŅиĐŧŅĐŧ 30 ОйĐĩĐēŅа ĐĩĐ´ĐŊОвŅĐĩĐŧĐĩĐŊĐŊĐž, ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ",
|
||||||
"host": "ĐĨĐžŅŅ",
|
"host": "ĐĨĐžŅŅ",
|
||||||
"hour": "ЧаŅ",
|
"hour": "ЧаŅ",
|
||||||
|
"hours": "ЧаŅа",
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
|
"idle": "ĐĐĩСдĐĩĐšŅŅвиĐĩ",
|
||||||
"ignore_icloud_photos": "ĐŅĐžĐŋŅŅĐŊи ŅĐŊиĐŧĐēи ĐžŅ iCloud",
|
"ignore_icloud_photos": "ĐŅĐžĐŋŅŅĐŊи ŅĐŊиĐŧĐēи ĐžŅ iCloud",
|
||||||
"ignore_icloud_photos_description": "ĐĄĐŊиĐŧĐēи, ĐēОиŅĐž Ņа СаĐŋаСĐĩĐŊи в iCloud ĐŊŅĐŧа да ŅĐĩ ĐēаŅĐ˛Đ°Ņ Đ˛ Immich ŅŅŅвŅŅа",
|
"ignore_icloud_photos_description": "ĐĄĐŊиĐŧĐēи, ĐēОиŅĐž Ņа СаĐŋаСĐĩĐŊи в iCloud ĐŊŅĐŧа да ŅĐĩ ĐēаŅĐ˛Đ°Ņ Đ˛ Immich ŅŅŅвŅŅа",
|
||||||
"image": "ĐСОйŅаĐļĐĩĐŊиĐĩ",
|
"image": "ĐСОйŅаĐļĐĩĐŊиĐĩ",
|
||||||
@@ -1135,10 +1183,13 @@
|
|||||||
"language_no_results_title": "ĐĐĩ Ņа ĐŊаĐŧĐĩŅĐĩĐŊи ĐĩСиŅи",
|
"language_no_results_title": "ĐĐĩ Ņа ĐŊаĐŧĐĩŅĐĩĐŊи ĐĩСиŅи",
|
||||||
"language_search_hint": "ĐĸŅŅŅĐĩĐŊĐĩ ĐŊа ĐĩСиŅи...",
|
"language_search_hint": "ĐĸŅŅŅĐĩĐŊĐĩ ĐŊа ĐĩСиŅи...",
|
||||||
"language_setting_description": "ĐСйĐĩŅĐĩŅĐĩ ĐŋŅĐĩĐ´ĐŋĐžŅиŅаĐŊ ĐĩСиĐē",
|
"language_setting_description": "ĐСйĐĩŅĐĩŅĐĩ ĐŋŅĐĩĐ´ĐŋĐžŅиŅаĐŊ ĐĩСиĐē",
|
||||||
|
"large_files": "ĐĐžĐģĐĩĐŧи ŅаКĐģОвĐĩ",
|
||||||
|
"last": "ĐĐžŅĐģĐĩĐ´ĐĩĐŊ",
|
||||||
"last_seen": "ĐĐžŅĐģĐĩĐ´ĐŊĐž видŅĐŊĐž",
|
"last_seen": "ĐĐžŅĐģĐĩĐ´ĐŊĐž видŅĐŊĐž",
|
||||||
"latest_version": "ĐĐžŅĐģĐĩĐ´ĐŊа вĐĩŅŅиŅ",
|
"latest_version": "ĐĐžŅĐģĐĩĐ´ĐŊа вĐĩŅŅиŅ",
|
||||||
"latitude": "ШиŅиĐŊа",
|
"latitude": "ШиŅиĐŊа",
|
||||||
"leave": "ĐСĐģĐĩС",
|
"leave": "ĐСĐģĐĩС",
|
||||||
|
"leave_album": "ĐаĐŋŅŅĐēаĐŊĐĩ ĐŊа аĐģĐąŅĐŧа",
|
||||||
"lens_model": "ĐОдĐĩĐģ ĐģĐĩŅа",
|
"lens_model": "ĐОдĐĩĐģ ĐģĐĩŅа",
|
||||||
"let_others_respond": "ĐОСвОĐģĐĩŅĐĩ ĐŊа Đ´ŅŅĐŗĐ¸ŅĐĩ да ĐžŅĐŗĐžĐ˛ĐžŅŅŅ",
|
"let_others_respond": "ĐОСвОĐģĐĩŅĐĩ ĐŊа Đ´ŅŅĐŗĐ¸ŅĐĩ да ĐžŅĐŗĐžĐ˛ĐžŅŅŅ",
|
||||||
"level": "ĐивО",
|
"level": "ĐивО",
|
||||||
@@ -1152,15 +1203,17 @@
|
|||||||
"library_page_sort_title": "ĐĐ°ĐŗĐģавиĐĩ ĐŊа аĐģĐąŅĐŧа",
|
"library_page_sort_title": "ĐĐ°ĐŗĐģавиĐĩ ĐŊа аĐģĐąŅĐŧа",
|
||||||
"licenses": "ĐиŅĐĩĐŊСи",
|
"licenses": "ĐиŅĐĩĐŊСи",
|
||||||
"light": "ХвĐĩŅĐģĐž",
|
"light": "ХвĐĩŅĐģĐž",
|
||||||
|
"like": "ĐĨаŅĐĩŅаКŅĐĩ",
|
||||||
"like_deleted": "ĐаŅĐž иСŅŅиŅ",
|
"like_deleted": "ĐаŅĐž иСŅŅиŅ",
|
||||||
"link_motion_video": "ĐиĐŊĐē ĐēŅĐŧ видĐĩĐž",
|
"link_motion_video": "ĐиĐŊĐē ĐēŅĐŧ видĐĩĐž",
|
||||||
"link_options": "ĐĐŋŅии ĐŊа ĐģиĐŊĐē Са ŅĐŋОдĐĩĐģŅĐŊĐĩ",
|
|
||||||
"link_to_oauth": "ĐиĐŊĐē ĐēŅĐŧ OAuth",
|
"link_to_oauth": "ĐиĐŊĐē ĐēŅĐŧ OAuth",
|
||||||
"linked_oauth_account": "ХвŅŅСаĐŊ OAuth аĐēаŅĐŊŅ",
|
"linked_oauth_account": "ХвŅŅСаĐŊ OAuth аĐēаŅĐŊŅ",
|
||||||
"list": "ĐиŅŅ",
|
"list": "ĐиŅŅ",
|
||||||
"loading": "ĐаŅĐĩĐļдаĐŊĐĩ",
|
"loading": "ĐаŅĐĩĐļдаĐŊĐĩ",
|
||||||
"loading_search_results_failed": "ĐаŅĐĩĐļдаĐŊĐĩŅĐž ĐŊа ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž Đĩ ĐŊĐĩŅŅĐŋĐĩŅĐŊĐž",
|
"loading_search_results_failed": "ĐаŅĐĩĐļдаĐŊĐĩŅĐž ĐŊа ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž Đĩ ĐŊĐĩŅŅĐŋĐĩŅĐŊĐž",
|
||||||
|
"local": "ĐĐžĐēаĐģĐŊĐž",
|
||||||
"local_asset_cast_failed": "ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋŅĐĩдава ОйĐĩĐēŅ, ĐēОКŅĐž ĐžŅĐĩ ĐŊĐĩ Đĩ ĐēаŅĐĩĐŊ ĐŊа ŅŅŅвŅŅа",
|
"local_asset_cast_failed": "ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋŅĐĩдава ОйĐĩĐēŅ, ĐēОКŅĐž ĐžŅĐĩ ĐŊĐĩ Đĩ ĐēаŅĐĩĐŊ ĐŊа ŅŅŅвŅŅа",
|
||||||
|
"local_assets": "ĐĐžĐēаĐģĐŊи ОйĐĩĐēŅи",
|
||||||
"local_network": "ĐĐžĐēаĐģĐŊа ĐŧŅĐĩĐļа",
|
"local_network": "ĐĐžĐēаĐģĐŊа ĐŧŅĐĩĐļа",
|
||||||
"local_network_sheet_info": "ĐŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž ŅĐĩ ŅĐĩ ŅвŅŅĐļĐĩ ŅŅŅ ŅŅŅвŅŅа ĐŊа ŅОСи URL, ĐēĐžĐŗĐ°ŅĐž ŅŅŅŅОКŅŅвОŅĐž Đĩ ŅвŅŅСаĐŊĐž ĐēŅĐŧ СададĐĩĐŊаŅа Wi-Fi ĐŧŅĐĩĐļа",
|
"local_network_sheet_info": "ĐŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž ŅĐĩ ŅĐĩ ŅвŅŅĐļĐĩ ŅŅŅ ŅŅŅвŅŅа ĐŊа ŅОСи URL, ĐēĐžĐŗĐ°ŅĐž ŅŅŅŅОКŅŅвОŅĐž Đĩ ŅвŅŅСаĐŊĐž ĐēŅĐŧ СададĐĩĐŊаŅа Wi-Fi ĐŧŅĐĩĐļа",
|
||||||
"location_permission": "РаСŅĐĩŅĐĩĐŊиĐĩ Са ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
"location_permission": "РаСŅĐĩŅĐĩĐŊиĐĩ Са ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||||
@@ -1217,8 +1270,7 @@
|
|||||||
"manage_your_devices": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа вĐģĐĩСĐģиŅĐĩ в ŅиŅŅĐĩĐŧаŅа ŅŅŅŅОКŅŅва",
|
"manage_your_devices": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа вĐģĐĩСĐģиŅĐĩ в ŅиŅŅĐĩĐŧаŅа ŅŅŅŅОКŅŅва",
|
||||||
"manage_your_oauth_connection": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа OAuth вŅŅСĐēаŅа",
|
"manage_your_oauth_connection": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа OAuth вŅŅСĐēаŅа",
|
||||||
"map": "ĐаŅŅа",
|
"map": "ĐаŅŅа",
|
||||||
"map_assets_in_bound": "{count} ŅĐŊиĐŧĐēи",
|
"map_assets_in_bounds": "{count, plural, =0 {ĐŅĐŧа ŅĐŊиĐŧĐēи} one {# ŅĐŊиĐŧĐēа} other {# ŅĐŊиĐŧĐēи}}",
|
||||||
"map_assets_in_bounds": "{count} ŅĐŊиĐŧĐēи",
|
|
||||||
"map_cannot_get_user_location": "ĐĐĩ ĐŧĐžĐļаŅ
да ĐŋĐžĐģŅŅа ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
"map_cannot_get_user_location": "ĐĐĩ ĐŧĐžĐļаŅ
да ĐŋĐžĐģŅŅа ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž",
|
||||||
"map_location_dialog_yes": "Đа",
|
"map_location_dialog_yes": "Đа",
|
||||||
"map_location_picker_page_use_location": "ĐСĐŋĐžĐģСваК ŅОва ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
"map_location_picker_page_use_location": "ĐСĐŋĐžĐģСваК ŅОва ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||||
@@ -1226,7 +1278,6 @@
|
|||||||
"map_location_service_disabled_title": "ĐŖŅĐģŅĐŗĐ°Ņа Са ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Đĩ иСĐēĐģŅŅĐĩĐŊа",
|
"map_location_service_disabled_title": "ĐŖŅĐģŅĐŗĐ°Ņа Са ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Đĩ иСĐēĐģŅŅĐĩĐŊа",
|
||||||
"map_marker_for_images": "ĐаŅĐēĐĩŅи ĐŊа ĐēаŅŅаŅа Са ŅĐŊиĐŧĐēи ĐŊаĐŋŅавĐĩĐŊи в {city}, {country}",
|
"map_marker_for_images": "ĐаŅĐēĐĩŅи ĐŊа ĐēаŅŅаŅа Са ŅĐŊиĐŧĐēи ĐŊаĐŋŅавĐĩĐŊи в {city}, {country}",
|
||||||
"map_marker_with_image": "ĐаŅĐēĐĩŅ ĐŊа ĐēаŅŅаŅа Ņ Đ¸ĐˇĐžĐąŅаĐļĐĩĐŊиĐĩ",
|
"map_marker_with_image": "ĐаŅĐēĐĩŅ ĐŊа ĐēаŅŅаŅа Ņ Đ¸ĐˇĐžĐąŅаĐļĐĩĐŊиĐĩ",
|
||||||
"map_no_assets_in_bounds": "ĐŅĐŧа ŅĐŊиĐŧĐēи ĐžŅ ŅОСи ŅаКОĐŊ",
|
|
||||||
"map_no_location_permission_content": "Đа да ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐžĐąĐĩĐēŅиŅĐĩ ĐžŅ ŅĐĩĐēŅŅĐžŅĐž ĐŧŅŅŅĐž, ŅŅŅйва ŅаСŅĐĩŅĐĩĐŊиĐĩ Са ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž. ĐŅĐēаŅĐĩ Đģи да ĐŋŅĐĩĐ´ĐžŅŅавиŅĐĩ ŅаСŅĐĩŅĐĩĐŊиĐĩ ŅĐĩĐŗĐ°?",
|
"map_no_location_permission_content": "Đа да ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐžĐąĐĩĐēŅиŅĐĩ ĐžŅ ŅĐĩĐēŅŅĐžŅĐž ĐŧŅŅŅĐž, ŅŅŅйва ŅаСŅĐĩŅĐĩĐŊиĐĩ Са ĐžĐŋŅĐĩĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅĐž. ĐŅĐēаŅĐĩ Đģи да ĐŋŅĐĩĐ´ĐžŅŅавиŅĐĩ ŅаСŅĐĩŅĐĩĐŊиĐĩ ŅĐĩĐŗĐ°?",
|
||||||
"map_no_location_permission_title": "ĐŅĐēаСаĐŊ Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
"map_no_location_permission_title": "ĐŅĐēаСаĐŊ Đ´ĐžŅŅŅĐŋ Đ´Đž ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
|
||||||
"map_settings": "ĐаŅŅŅОКĐēи ĐŊа ĐēаŅŅаŅа",
|
"map_settings": "ĐаŅŅŅОКĐēи ĐŊа ĐēаŅŅаŅа",
|
||||||
@@ -1263,6 +1314,7 @@
|
|||||||
"merged_people_count": "ĐĄĐģŅŅ {count, plural, one {# ŅОвĐĩĐē} other {# ŅОвĐĩĐēа}}",
|
"merged_people_count": "ĐĄĐģŅŅ {count, plural, one {# ŅОвĐĩĐē} other {# ŅОвĐĩĐēа}}",
|
||||||
"minimize": "ĐиĐŊиĐŧиСиŅаĐŊĐĩ",
|
"minimize": "ĐиĐŊиĐŧиСиŅаĐŊĐĩ",
|
||||||
"minute": "ĐиĐŊŅŅа",
|
"minute": "ĐиĐŊŅŅа",
|
||||||
|
"minutes": "ĐиĐŊŅŅи",
|
||||||
"missing": "ĐиĐŋŅваŅи",
|
"missing": "ĐиĐŋŅваŅи",
|
||||||
"model": "ĐОдĐĩĐģ",
|
"model": "ĐОдĐĩĐģ",
|
||||||
"month": "ĐĐĩŅĐĩŅ",
|
"month": "ĐĐĩŅĐĩŅ",
|
||||||
@@ -1282,6 +1334,9 @@
|
|||||||
"my_albums": "ĐОи аĐģĐąŅĐŧи",
|
"my_albums": "ĐОи аĐģĐąŅĐŧи",
|
||||||
"name": "ĐĐŧĐĩ",
|
"name": "ĐĐŧĐĩ",
|
||||||
"name_or_nickname": "ĐĐŧĐĩ иĐģи ĐŋŅŅĐēĐžŅ",
|
"name_or_nickname": "ĐĐŧĐĩ иĐģи ĐŋŅŅĐēĐžŅ",
|
||||||
|
"network_requirement_photos_upload": "ĐСĐŋĐžĐģСваК ĐŧОйиĐģĐŊи даĐŊĐŊи Са аŅŅ
ивиŅаĐŊĐĩ ĐŊа ŅĐŊиĐŧĐēи",
|
||||||
|
"network_requirement_videos_upload": "ĐСĐŋĐžĐģСваК ĐŧОйиĐģĐŊи даĐŊĐŊи Са аŅŅ
ивиŅаĐŊĐĩ ĐŊа видĐĩĐž",
|
||||||
|
"network_requirements_updated": "ĐŅĐĩĐļОвиŅĐĩ ĐŊаŅŅŅОКĐēи Ņа ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊи, ĐŊŅĐģиŅаĐŊĐĩ ĐŊа ĐžĐŋаŅĐēаŅа Са аŅŅ
ивиŅаĐŊĐĩ",
|
||||||
"networking_settings": "ĐŅĐĩĐļа",
|
"networking_settings": "ĐŅĐĩĐļа",
|
||||||
"networking_subtitle": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са вŅŅСĐēа ŅŅŅ ŅŅŅвŅŅа",
|
"networking_subtitle": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ Са вŅŅСĐēа ŅŅŅ ŅŅŅвŅŅа",
|
||||||
"never": "ĐиĐēĐžĐŗĐ°",
|
"never": "ĐиĐēĐžĐŗĐ°",
|
||||||
@@ -1317,6 +1372,7 @@
|
|||||||
"no_results": "ĐŅĐŧа ŅĐĩСŅĐģŅаŅи",
|
"no_results": "ĐŅĐŧа ŅĐĩСŅĐģŅаŅи",
|
||||||
"no_results_description": "ĐĐŋиŅаКŅĐĩ ŅŅŅ ŅиĐŊĐžĐŊиĐŧ иĐģи ĐŋĐž-ОйŅа ĐēĐģŅŅОва Đ´ŅĐŧа",
|
"no_results_description": "ĐĐŋиŅаКŅĐĩ ŅŅŅ ŅиĐŊĐžĐŊиĐŧ иĐģи ĐŋĐž-ОйŅа ĐēĐģŅŅОва Đ´ŅĐŧа",
|
||||||
"no_shared_albums_message": "ĐĄŅСдаКŅĐĩ аĐģĐąŅĐŧ, Са да ŅĐŋОдĐĩĐģŅŅĐĩ ŅĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ Ņ Ņ
ĐžŅаŅа в ĐŧŅĐĩĐļаŅа Ņи",
|
"no_shared_albums_message": "ĐĄŅСдаКŅĐĩ аĐģĐąŅĐŧ, Са да ŅĐŋОдĐĩĐģŅŅĐĩ ŅĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ Ņ Ņ
ĐžŅаŅа в ĐŧŅĐĩĐļаŅа Ņи",
|
||||||
|
"no_uploads_in_progress": "ĐŅĐŧа ĐēаŅваĐŊĐĩ в ĐŧĐžĐŧĐĩĐŊŅа",
|
||||||
"not_in_any_album": "ĐĐĩ Đĩ в ĐŊиĐēОК аĐģĐąŅĐŧ",
|
"not_in_any_album": "ĐĐĩ Đĩ в ĐŊиĐēОК аĐģĐąŅĐŧ",
|
||||||
"not_selected": "ĐĐĩ Đĩ иСйŅаĐŊĐž",
|
"not_selected": "ĐĐĩ Đĩ иСйŅаĐŊĐž",
|
||||||
"note_apply_storage_label_to_previously_uploaded assets": "ĐайĐĩĐģĐĩĐļĐēа: Đа да ĐŋŅиĐģĐžĐļиŅĐĩ ĐĩŅиĐēĐĩŅа Са ŅŅŅ
ŅаĐŊĐĩĐŊиĐĩ ĐēŅĐŧ ĐŋŅĐĩдваŅиŅĐĩĐģĐŊĐž ĐēаŅĐĩĐŊи аĐēŅиви, ŅŅаŅŅиŅаКŅĐĩ",
|
"note_apply_storage_label_to_previously_uploaded assets": "ĐайĐĩĐģĐĩĐļĐēа: Đа да ĐŋŅиĐģĐžĐļиŅĐĩ ĐĩŅиĐēĐĩŅа Са ŅŅŅ
ŅаĐŊĐĩĐŊиĐĩ ĐēŅĐŧ ĐŋŅĐĩдваŅиŅĐĩĐģĐŊĐž ĐēаŅĐĩĐŊи аĐēŅиви, ŅŅаŅŅиŅаКŅĐĩ",
|
||||||
@@ -1332,6 +1388,7 @@
|
|||||||
"oauth": "OAuth",
|
"oauth": "OAuth",
|
||||||
"official_immich_resources": "ĐŅиŅиаĐģĐŊа иĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐˇĐ° Immich",
|
"official_immich_resources": "ĐŅиŅиаĐģĐŊа иĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐˇĐ° Immich",
|
||||||
"offline": "ĐŅĐģаКĐŊ",
|
"offline": "ĐŅĐģаКĐŊ",
|
||||||
|
"offset": "ĐŅĐŧĐĩŅŅваĐŊĐĩ",
|
||||||
"ok": "ĐОйŅĐĩ",
|
"ok": "ĐОйŅĐĩ",
|
||||||
"oldest_first": "ĐаК-ŅŅаŅиŅĐĩ ĐŋŅŅви",
|
"oldest_first": "ĐаК-ŅŅаŅиŅĐĩ ĐŋŅŅви",
|
||||||
"on_this_device": "Đа ŅОва ŅŅŅŅОКŅŅвО",
|
"on_this_device": "Đа ŅОва ŅŅŅŅОКŅŅвО",
|
||||||
@@ -1354,6 +1411,7 @@
|
|||||||
"original": "ĐžŅĐ¸ĐŗĐ¸ĐŊаĐģ",
|
"original": "ĐžŅĐ¸ĐŗĐ¸ĐŊаĐģ",
|
||||||
"other": "ĐŅŅĐŗĐ¸",
|
"other": "ĐŅŅĐŗĐ¸",
|
||||||
"other_devices": "ĐŅŅĐŗĐ¸ ŅŅŅŅОКŅŅва",
|
"other_devices": "ĐŅŅĐŗĐ¸ ŅŅŅŅОКŅŅва",
|
||||||
|
"other_entities": "ĐŅŅĐŗĐ¸ ОйĐĩĐēŅи",
|
||||||
"other_variables": "ĐŅŅĐŗĐ¸ ĐŋŅĐžĐŧĐĩĐŊĐģиви",
|
"other_variables": "ĐŅŅĐŗĐ¸ ĐŋŅĐžĐŧĐĩĐŊĐģиви",
|
||||||
"owned": "ĐОиŅĐĩ",
|
"owned": "ĐОиŅĐĩ",
|
||||||
"owner": "ХОйŅŅвĐĩĐŊиĐē",
|
"owner": "ХОйŅŅвĐĩĐŊиĐē",
|
||||||
@@ -1408,6 +1466,9 @@
|
|||||||
"permission_onboarding_permission_limited": "ĐĐŗŅаĐŊиŅĐĩĐŊ Đ´ĐžŅŅŅĐŋ. Đа да ĐŧĐžĐļĐĩ Immich да аŅŅ
ивиŅа и ŅĐŋŅавĐģŅва ĐŗĐ°ĐģĐĩŅиŅŅа, ĐŋŅĐĩĐ´ĐžŅŅавĐĩŅĐĩ Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐŊиĐŧĐēи и видĐĩĐž в ĐŊаŅŅŅОКĐēиŅĐĩ.",
|
"permission_onboarding_permission_limited": "ĐĐŗŅаĐŊиŅĐĩĐŊ Đ´ĐžŅŅŅĐŋ. Đа да ĐŧĐžĐļĐĩ Immich да аŅŅ
ивиŅа и ŅĐŋŅавĐģŅва ĐŗĐ°ĐģĐĩŅиŅŅа, ĐŋŅĐĩĐ´ĐžŅŅавĐĩŅĐĩ Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐŊиĐŧĐēи и видĐĩĐž в ĐŊаŅŅŅОКĐēиŅĐĩ.",
|
||||||
"permission_onboarding_request": "Immich ŅĐĩ ĐŊŅĐļдаĐĩ ĐžŅ ŅаСŅĐĩŅĐĩĐŊиĐĩ Са ĐŋŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅĐŊиĐŧĐēи и видĐĩĐž.",
|
"permission_onboarding_request": "Immich ŅĐĩ ĐŊŅĐļдаĐĩ ĐžŅ ŅаСŅĐĩŅĐĩĐŊиĐĩ Са ĐŋŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅĐŊиĐŧĐēи и видĐĩĐž.",
|
||||||
"person": "ЧОвĐĩĐē",
|
"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_birthdate": "ĐаŅа ĐŊа ŅаĐļдаĐŊĐĩ {date}",
|
||||||
"person_hidden": "{name}{hidden, select, true { (ŅĐēŅиŅ)} other {}}",
|
"person_hidden": "{name}{hidden, select, true { (ŅĐēŅиŅ)} other {}}",
|
||||||
"photo_shared_all_users": "ĐĐˇĐŗĐģĐĩĐļда, ŅĐĩ ŅŅĐĩ ŅĐŋОдĐĩĐģиĐģи ŅĐŊиĐŧĐēиŅĐĩ Ņи Ņ Đ˛ŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи иĐģи ĐŊŅĐŧаŅĐĩ ĐŋĐžŅŅĐĩйиŅĐĩĐģи, Ņ ĐēОиŅĐž да ŅĐŋОдĐĩĐģŅŅĐĩ.",
|
"photo_shared_all_users": "ĐĐˇĐŗĐģĐĩĐļда, ŅĐĩ ŅŅĐĩ ŅĐŋОдĐĩĐģиĐģи ŅĐŊиĐŧĐēиŅĐĩ Ņи Ņ Đ˛ŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи иĐģи ĐŊŅĐŧаŅĐĩ ĐŋĐžŅŅĐĩйиŅĐĩĐģи, Ņ ĐēОиŅĐž да ŅĐŋОдĐĩĐģŅŅĐĩ.",
|
||||||
@@ -1485,6 +1546,7 @@
|
|||||||
"purchase_server_description_2": "ĐĄŅаŅŅŅ ĐŊа ĐŋОддŅŅĐļĐŊиĐē",
|
"purchase_server_description_2": "ĐĄŅаŅŅŅ ĐŊа ĐŋОддŅŅĐļĐŊиĐē",
|
||||||
"purchase_server_title": "ĐĄŅŅвŅŅ",
|
"purchase_server_title": "ĐĄŅŅвŅŅ",
|
||||||
"purchase_settings_server_activated": "ĐŅОдŅĐēŅОвиŅŅ ĐēĐģŅŅ ĐŊа ŅŅŅвŅŅа ŅĐĩ ŅĐŋŅавĐģŅва ĐžŅ Đ°Đ´ĐŧиĐŊиŅŅŅаŅĐžŅа",
|
"purchase_settings_server_activated": "ĐŅОдŅĐēŅОвиŅŅ ĐēĐģŅŅ ĐŊа ŅŅŅвŅŅа ŅĐĩ ŅĐŋŅавĐģŅва ĐžŅ Đ°Đ´ĐŧиĐŊиŅŅŅаŅĐžŅа",
|
||||||
|
"queue_status": "Đ ĐžĐŋаŅĐēа {count} ĐžŅ {total}",
|
||||||
"rating": "ĐŅĐĩĐŊĐēа ŅŅŅ ĐˇĐ˛ĐĩСди",
|
"rating": "ĐŅĐĩĐŊĐēа ŅŅŅ ĐˇĐ˛ĐĩСди",
|
||||||
"rating_clear": "ĐСŅиŅŅи ĐžŅĐĩĐŊĐēаŅа",
|
"rating_clear": "ĐСŅиŅŅи ĐžŅĐĩĐŊĐēаŅа",
|
||||||
"rating_count": "{count, plural, one {# СвĐĩСда} other {# СвĐĩСди}}",
|
"rating_count": "{count, plural, one {# СвĐĩСда} other {# СвĐĩСди}}",
|
||||||
@@ -1513,6 +1575,8 @@
|
|||||||
"refreshing_faces": "ĐĐŋŅĐĩŅĐŊŅваĐŊĐĩ ĐŊа ĐģиŅаŅа",
|
"refreshing_faces": "ĐĐŋŅĐĩŅĐŊŅваĐŊĐĩ ĐŊа ĐģиŅаŅа",
|
||||||
"refreshing_metadata": "ĐĐŋŅĐĩŅĐŊŅваĐŊĐĩ ĐŊа ĐŧĐĩŅадаĐŊĐŊиŅĐĩ",
|
"refreshing_metadata": "ĐĐŋŅĐĩŅĐŊŅваĐŊĐĩ ĐŊа ĐŧĐĩŅадаĐŊĐŊиŅĐĩ",
|
||||||
"regenerating_thumbnails": "ĐŅĐĩŅŅСдаваĐŊĐĩ ĐŊа ĐŧиĐŊиаŅŅŅиŅĐĩ",
|
"regenerating_thumbnails": "ĐŅĐĩŅŅСдаваĐŊĐĩ ĐŊа ĐŧиĐŊиаŅŅŅиŅĐĩ",
|
||||||
|
"remote": "Đа ŅŅŅвŅŅа",
|
||||||
|
"remote_assets": "ĐĐąĐĩĐēŅи ĐŊа ŅŅŅвŅŅа",
|
||||||
"remove": "ĐŅĐĩĐŧаŅ
ĐŊи",
|
"remove": "ĐŅĐĩĐŧаŅ
ĐŊи",
|
||||||
"remove_assets_album_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐžŅ Đ°ĐģĐąŅĐŧа?",
|
"remove_assets_album_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐžŅ Đ°ĐģĐąŅĐŧа?",
|
||||||
"remove_assets_shared_link_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐžŅ ŅОСи ŅĐŋĐžĐĩĐ´ĐĩĐģĐĩĐŊ ĐģиĐŊĐē?",
|
"remove_assets_shared_link_confirmation": "ĐĄĐ¸ĐŗŅŅĐŊи Đģи ŅŅĐĩ, ŅĐĩ иŅĐēаŅĐĩ да ĐŋŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅа}} ĐžŅ ŅОСи ŅĐŋĐžĐĩĐ´ĐĩĐģĐĩĐŊ ĐģиĐŊĐē?",
|
||||||
@@ -1550,19 +1614,28 @@
|
|||||||
"reset_password": "ĐŅĐģиŅаĐŊĐĩ ĐŊа ĐŋаŅĐžĐģаŅа",
|
"reset_password": "ĐŅĐģиŅаĐŊĐĩ ĐŊа ĐŋаŅĐžĐģаŅа",
|
||||||
"reset_people_visibility": "ĐŅĐģиŅаĐŊĐĩ ĐŊа видиĐŧĐžŅŅŅа ĐŊа Ņ
ĐžŅаŅа",
|
"reset_people_visibility": "ĐŅĐģиŅаĐŊĐĩ ĐŊа видиĐŧĐžŅŅŅа ĐŊа Ņ
ĐžŅаŅа",
|
||||||
"reset_pin_code": "ĐŅĐģиŅаК PIN ĐēОда",
|
"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": "ĐŅŅŅаĐŊĐĩ ĐŊа ŅайŅиŅĐŊи ĐŊаŅŅŅОКĐēи",
|
"reset_to_default": "ĐŅŅŅаĐŊĐĩ ĐŊа ŅайŅиŅĐŊи ĐŊаŅŅŅОКĐēи",
|
||||||
"resolve_duplicates": "Đ ĐĩŅи Đ´ŅĐąĐģиĐēаŅиŅĐĩ",
|
"resolve_duplicates": "Đ ĐĩŅи Đ´ŅĐąĐģиĐēаŅиŅĐĩ",
|
||||||
"resolved_all_duplicates": "ĐŅиŅĐēи Đ´ŅĐąĐģиĐēаŅи Ņа ŅĐĩŅĐĩĐŊи",
|
"resolved_all_duplicates": "ĐŅиŅĐēи Đ´ŅĐąĐģиĐēаŅи Ņа ŅĐĩŅĐĩĐŊи",
|
||||||
"restore": "ĐŅСŅŅаĐŊОвŅваĐŊĐĩ",
|
"restore": "ĐŅСŅŅаĐŊОвŅваĐŊĐĩ",
|
||||||
"restore_all": "ĐŅСŅŅаĐŊОви вŅиŅĐēи",
|
"restore_all": "ĐŅСŅŅаĐŊОви вŅиŅĐēи",
|
||||||
|
"restore_trash_action_prompt": "{count} вŅСŅŅаĐŊОвĐĩĐŊи ĐžŅ ĐēĐžŅа",
|
||||||
"restore_user": "ĐŅСŅŅаĐŊОви ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
"restore_user": "ĐŅСŅŅаĐŊОви ĐŋĐžŅŅĐĩйиŅĐĩĐģ",
|
||||||
"restored_asset": "ĐŅСŅŅаĐŊОвĐĩĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ",
|
"restored_asset": "ĐŅСŅŅаĐŊОвĐĩĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ",
|
||||||
"resume": "ĐŅОдŅĐģĐļаваĐŊĐĩ",
|
"resume": "ĐŅОдŅĐģĐļаваĐŊĐĩ",
|
||||||
"retry_upload": "ĐĐŋиŅаК ĐēаŅваĐŊĐĩŅĐž ĐžŅĐŊОвО",
|
"retry_upload": "ĐĐŋиŅаК ĐēаŅваĐŊĐĩŅĐž ĐžŅĐŊОвО",
|
||||||
"review_duplicates": "Đ Đ°ĐˇĐŗĐģĐĩдаК Đ´ŅĐąĐģиĐēаŅиŅĐĩ",
|
"review_duplicates": "Đ Đ°ĐˇĐŗĐģĐĩдаК Đ´ŅĐąĐģиĐēаŅиŅĐĩ",
|
||||||
|
"review_large_files": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ĐŗĐžĐģĐĩĐŧи ŅаКĐģОвĐĩ",
|
||||||
"role": "Đ ĐžĐģŅ",
|
"role": "Đ ĐžĐģŅ",
|
||||||
"role_editor": "Đ ĐĩдаĐēŅĐžŅ",
|
"role_editor": "Đ ĐĩдаĐēŅĐžŅ",
|
||||||
"role_viewer": "ĐŅиŅĐĩĐģ",
|
"role_viewer": "ĐŅиŅĐĩĐģ",
|
||||||
|
"running": "ĐСĐŋŅĐģĐŊŅваĐŊĐĩ",
|
||||||
"save": "ĐаĐŋаСи",
|
"save": "ĐаĐŋаСи",
|
||||||
"save_to_gallery": "ĐаĐŋаСи в ĐŗĐ°ĐģĐĩŅиŅŅа",
|
"save_to_gallery": "ĐаĐŋаСи в ĐŗĐ°ĐģĐĩŅиŅŅа",
|
||||||
"saved_api_key": "ĐаĐŋаСĐĩĐŊ API Key",
|
"saved_api_key": "ĐаĐŋаСĐĩĐŊ API Key",
|
||||||
@@ -1716,6 +1789,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "ĐĐžĐŋиŅаĐŊĐž в ĐēĐģиĐŋйОŅда",
|
"shared_link_clipboard_copied_massage": "ĐĐžĐŋиŅаĐŊĐž в ĐēĐģиĐŋйОŅда",
|
||||||
"shared_link_clipboard_text": "ĐŅŅСĐēа: {link}\nĐаŅĐžĐģа: {password}",
|
"shared_link_clipboard_text": "ĐŅŅСĐēа: {link}\nĐаŅĐžĐģа: {password}",
|
||||||
"shared_link_create_error": "ĐŅĐĩŅĐēа ĐŋŅи ŅŅСдаваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
"shared_link_create_error": "ĐŅĐĩŅĐēа ĐŋŅи ŅŅСдаваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
||||||
|
"shared_link_custom_url_description": "ĐĐžŅŅŅĐŋĐĩŅĐĩ ŅĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ ĐģиĐŊĐē Ņ ĐŋĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ URL адŅĐĩŅ",
|
||||||
"shared_link_edit_description_hint": "ĐŅвĐĩди ĐžĐŋиŅаĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊĐžŅĐž",
|
"shared_link_edit_description_hint": "ĐŅвĐĩди ĐžĐŋиŅаĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊĐžŅĐž",
|
||||||
"shared_link_edit_expire_after_option_day": "1 Đ´ĐĩĐŊ",
|
"shared_link_edit_expire_after_option_day": "1 Đ´ĐĩĐŊ",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} Đ´ĐŊи",
|
"shared_link_edit_expire_after_option_days": "{count} Đ´ĐŊи",
|
||||||
@@ -1741,6 +1815,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊиŅĐĩ вŅŅСĐēи",
|
"shared_link_manage_links": "ĐŖĐŋŅавĐģĐĩĐŊиĐĩ ĐŊа ŅĐŋОдĐĩĐģĐĩĐŊиŅĐĩ вŅŅСĐēи",
|
||||||
"shared_link_options": "ĐĐŋŅии Са ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
"shared_link_options": "ĐĐŋŅии Са ŅĐŋОдĐĩĐģĐĩĐŊа вŅŅСĐēа",
|
||||||
|
"shared_link_password_description": "ĐСиŅĐēваĐŊĐĩ ĐŊа ĐŋаŅĐžĐģа Са Đ´ĐžŅŅŅĐŋ Đ´Đž ŅĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ ĐģиĐŊĐē",
|
||||||
"shared_links": "ĐĄĐŋОдĐĩĐģĐĩĐŊи вŅŅСĐēи",
|
"shared_links": "ĐĄĐŋОдĐĩĐģĐĩĐŊи вŅŅСĐēи",
|
||||||
"shared_links_description": "ĐĄĐŋОдĐĩĐģи ŅĐŊиĐŧĐēи и видĐĩа Ņ ĐģиĐŊĐē",
|
"shared_links_description": "ĐĄĐŋОдĐĩĐģи ŅĐŊиĐŧĐēи и видĐĩа Ņ ĐģиĐŊĐē",
|
||||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# ŅĐŋОдĐĩĐģĐĩĐŊи ŅĐŊиĐŧĐēи и видĐĩа.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, other {# ŅĐŋОдĐĩĐģĐĩĐŊи ŅĐŊиĐŧĐēи и видĐĩа.}}",
|
||||||
@@ -1790,6 +1865,7 @@
|
|||||||
"sort_created": "ĐаŅа ĐŊа ŅŅСдаваĐŊĐĩ",
|
"sort_created": "ĐаŅа ĐŊа ŅŅСдаваĐŊĐĩ",
|
||||||
"sort_items": "ĐŅОК ĐĩĐģĐĩĐŧĐĩĐŊŅи",
|
"sort_items": "ĐŅОК ĐĩĐģĐĩĐŧĐĩĐŊŅи",
|
||||||
"sort_modified": "ĐаŅа ĐŊа ĐŋŅĐžĐŧŅĐŊа",
|
"sort_modified": "ĐаŅа ĐŊа ĐŋŅĐžĐŧŅĐŊа",
|
||||||
|
"sort_newest": "ĐаК-ĐŊОви ŅĐŊиĐŧĐēи",
|
||||||
"sort_oldest": "ĐаК-ŅŅаŅаŅа ŅĐŊиĐŧĐēа",
|
"sort_oldest": "ĐаК-ŅŅаŅаŅа ŅĐŊиĐŧĐēа",
|
||||||
"sort_people_by_similarity": "ĐĄĐžŅŅиŅаĐŊĐĩ ĐŊа Ņ
ĐžŅа ĐŋĐž ĐŋŅиĐģиĐēа",
|
"sort_people_by_similarity": "ĐĄĐžŅŅиŅаĐŊĐĩ ĐŊа Ņ
ĐžŅа ĐŋĐž ĐŋŅиĐģиĐēа",
|
||||||
"sort_recent": "ĐаК-ĐŊОваŅа ŅĐŊиĐŧĐēа",
|
"sort_recent": "ĐаК-ĐŊОваŅа ŅĐŊиĐŧĐēа",
|
||||||
@@ -1816,6 +1892,7 @@
|
|||||||
"storage_quota": "ĐвОŅа ĐŊа Ņ
ŅаĐŊиĐģиŅĐĩŅĐž",
|
"storage_quota": "ĐвОŅа ĐŊа Ņ
ŅаĐŊиĐģиŅĐĩŅĐž",
|
||||||
"storage_usage": "ĐСĐŋĐžĐģСваĐŊи {used} ĐžŅ {available}",
|
"storage_usage": "ĐСĐŋĐžĐģСваĐŊи {used} ĐžŅ {available}",
|
||||||
"submit": "ĐСĐŋŅаŅаĐŊĐĩ",
|
"submit": "ĐСĐŋŅаŅаĐŊĐĩ",
|
||||||
|
"success": "ĐŖŅĐŋĐĩŅĐŊĐž",
|
||||||
"suggestions": "ĐŅĐĩĐ´ĐģĐžĐļĐĩĐŊиŅ",
|
"suggestions": "ĐŅĐĩĐ´ĐģĐžĐļĐĩĐŊиŅ",
|
||||||
"sunrise_on_the_beach": "ĐĐˇĐŗŅĐĩв ĐŊа ĐŋĐģаĐļа",
|
"sunrise_on_the_beach": "ĐĐˇĐŗŅĐĩв ĐŊа ĐŋĐģаĐļа",
|
||||||
"support": "ĐОддŅŅĐļĐēа",
|
"support": "ĐОддŅŅĐļĐēа",
|
||||||
@@ -1825,6 +1902,8 @@
|
|||||||
"sync": "ХиĐŊŅ
ŅĐžĐŊиСиŅаĐŊĐĩ",
|
"sync": "ХиĐŊŅ
ŅĐžĐŊиСиŅаĐŊĐĩ",
|
||||||
"sync_albums": "ХиĐŊŅ
ŅĐžĐŊиСиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧи",
|
"sync_albums": "ХиĐŊŅ
ŅĐžĐŊиСиŅаĐŊĐĩ ĐŊа аĐģĐąŅĐŧи",
|
||||||
"sync_albums_manual_subtitle": "ХиĐŊŅ
ŅĐžĐŊиСиŅаК вŅиŅĐēи СаŅĐĩĐ´ĐĩĐŊи видĐĩа и ŅĐŊиĐŧĐēи в иСйŅаĐŊиŅĐĩ аŅŅ
ивĐŊи аĐģĐąŅĐŧи",
|
"sync_albums_manual_subtitle": "ХиĐŊŅ
ŅĐžĐŊиСиŅаК вŅиŅĐēи СаŅĐĩĐ´ĐĩĐŊи видĐĩа и ŅĐŊиĐŧĐēи в иСйŅаĐŊиŅĐĩ аŅŅ
ивĐŊи аĐģĐąŅĐŧи",
|
||||||
|
"sync_local": "ĐĐžĐēаĐģĐŊа ŅиĐŊŅ
ŅĐžĐŊиСаŅиŅ",
|
||||||
|
"sync_remote": "ХиĐŊŅ
ŅĐžĐŊиСаŅĐ¸Ņ ŅŅŅ ŅŅŅвŅŅа",
|
||||||
"sync_upload_album_setting_subtitle": "ĐĄŅСдаваКŅĐĩ и СаŅĐĩĐļдаКŅĐĩ ŅĐŊиĐŧĐēи и видĐĩа в иСйŅаĐŊи аĐģĐąŅĐŧи в Immich",
|
"sync_upload_album_setting_subtitle": "ĐĄŅСдаваКŅĐĩ и СаŅĐĩĐļдаКŅĐĩ ŅĐŊиĐŧĐēи и видĐĩа в иСйŅаĐŊи аĐģĐąŅĐŧи в Immich",
|
||||||
"tag": "ĐĸĐ°Đŗ",
|
"tag": "ĐĸĐ°Đŗ",
|
||||||
"tag_assets": "ĐĸĐ°ĐŗĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅи",
|
"tag_assets": "ĐĸĐ°ĐŗĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅи",
|
||||||
@@ -1835,6 +1914,7 @@
|
|||||||
"tag_updated": "ĐĐēŅŅаĐģиСиŅаĐŊ ĐĩŅиĐēĐĩŅ: {tag}",
|
"tag_updated": "ĐĐēŅŅаĐģиСиŅаĐŊ ĐĩŅиĐēĐĩŅ: {tag}",
|
||||||
"tagged_assets": "ĐĸĐ°ĐŗĐŊаŅи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅи}}",
|
"tagged_assets": "ĐĸĐ°ĐŗĐŊаŅи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅи}}",
|
||||||
"tags": "ĐŅиĐēĐĩŅ",
|
"tags": "ĐŅиĐēĐĩŅ",
|
||||||
|
"tap_to_run_job": "ĐĐžĐēĐžŅĐŊĐĩŅĐĩ, Са да ŅŅаŅŅиŅаŅĐĩ СадаŅаŅа",
|
||||||
"template": "ШайĐģĐžĐŊ",
|
"template": "ШайĐģĐžĐŊ",
|
||||||
"theme": "ĐĸĐĩĐŧа",
|
"theme": "ĐĸĐĩĐŧа",
|
||||||
"theme_selection": "ĐĐˇĐąĐžŅ ĐŊа ŅĐĩĐŧа",
|
"theme_selection": "ĐĐˇĐąĐžŅ ĐŊа ŅĐĩĐŧа",
|
||||||
@@ -1914,10 +1994,13 @@
|
|||||||
"updated_at": "ĐĐąĐŊОвĐĩĐŊĐž",
|
"updated_at": "ĐĐąĐŊОвĐĩĐŊĐž",
|
||||||
"updated_password": "ĐаŅĐžĐģаŅа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
"updated_password": "ĐаŅĐžĐģаŅа Đĩ аĐēŅŅаĐģиСиŅаĐŊа",
|
||||||
"upload": "ĐаŅваĐŊĐĩ",
|
"upload": "ĐаŅваĐŊĐĩ",
|
||||||
|
"upload_action_prompt": "{count} ĐŊа ĐžĐŋаŅĐēа Са ĐēаŅваĐŊĐĩ",
|
||||||
"upload_concurrency": "ĐŖŅĐŋĐžŅĐĩĐ´ĐŊи ĐēаŅваĐŊиŅ",
|
"upload_concurrency": "ĐŖŅĐŋĐžŅĐĩĐ´ĐŊи ĐēаŅваĐŊиŅ",
|
||||||
|
"upload_details": "ĐĐĩŅаКĐģи Са ĐēаŅваĐŊĐĩŅĐž",
|
||||||
"upload_dialog_info": "ĐŅĐēаŅĐĩ Đģи да аŅŅ
ивиŅаŅĐĩ ĐŊа ŅŅŅвŅŅа иСйŅаĐŊиŅĐĩ ОйĐĩĐēŅи?",
|
"upload_dialog_info": "ĐŅĐēаŅĐĩ Đģи да аŅŅ
ивиŅаŅĐĩ ĐŊа ŅŅŅвŅŅа иСйŅаĐŊиŅĐĩ ОйĐĩĐēŅи?",
|
||||||
"upload_dialog_title": "ĐаŅи ОйĐĩĐēŅ",
|
"upload_dialog_title": "ĐаŅи ОйĐĩĐēŅ",
|
||||||
"upload_errors": "ĐаŅваĐŊĐĩŅĐž Đĩ СавŅŅĐĩĐŊĐž Ņ {count, plural, one {# ĐŗŅĐĩŅĐēа} other {# ĐŗŅĐĩŅĐēи}}, ОйĐŊОвĐĩŅĐĩ ŅŅŅаĐŊиŅаŅа Са да видиŅĐĩ ĐŊОвиŅĐĩ ĐĩĐģĐĩĐŧĐĩĐŊŅи.",
|
"upload_errors": "ĐаŅваĐŊĐĩŅĐž Đĩ СавŅŅĐĩĐŊĐž Ņ {count, plural, one {# ĐŗŅĐĩŅĐēа} other {# ĐŗŅĐĩŅĐēи}}, ОйĐŊОвĐĩŅĐĩ ŅŅŅаĐŊиŅаŅа Са да видиŅĐĩ ĐŊОвиŅĐĩ ĐĩĐģĐĩĐŧĐĩĐŊŅи.",
|
||||||
|
"upload_finished": "ĐаŅваĐŊĐĩŅĐž СавŅŅŅи",
|
||||||
"upload_progress": "ĐŅŅĐ°Đ˛Đ°Ņ {remaining, number} - ĐĐąŅайОŅĐĩĐŊи {processed, number}/{total, number}",
|
"upload_progress": "ĐŅŅĐ°Đ˛Đ°Ņ {remaining, number} - ĐĐąŅайОŅĐĩĐŊи {processed, number}/{total, number}",
|
||||||
"upload_skipped_duplicates": "ĐŅĐĩŅĐēĐžŅĐĩĐŊи {count, plural, one {# Đ´ŅĐąĐģиŅаĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# Đ´ŅĐąĐģиŅаĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅи}}",
|
"upload_skipped_duplicates": "ĐŅĐĩŅĐēĐžŅĐĩĐŊи {count, plural, one {# Đ´ŅĐąĐģиŅаĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ} other {# Đ´ŅĐąĐģиŅаĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅи}}",
|
||||||
"upload_status_duplicates": "ĐŅĐąĐģиĐēаŅи",
|
"upload_status_duplicates": "ĐŅĐąĐģиĐēаŅи",
|
||||||
@@ -1926,6 +2009,7 @@
|
|||||||
"upload_success": "ĐаŅваĐŊĐĩŅĐž Đĩ ŅŅĐŋĐĩŅĐŊĐž, ĐžĐŋŅĐĩŅĐŊĐĩŅĐĩ ŅŅŅаĐŊиŅаŅа, Са да видиŅĐĩ ĐŊОвиŅĐĩ ŅаКĐģОвĐĩ.",
|
"upload_success": "ĐаŅваĐŊĐĩŅĐž Đĩ ŅŅĐŋĐĩŅĐŊĐž, ĐžĐŋŅĐĩŅĐŊĐĩŅĐĩ ŅŅŅаĐŊиŅаŅа, Са да видиŅĐĩ ĐŊОвиŅĐĩ ŅаКĐģОвĐĩ.",
|
||||||
"upload_to_immich": "ĐаСваĐŊĐĩ в Immich ({count})",
|
"upload_to_immich": "ĐаСваĐŊĐĩ в Immich ({count})",
|
||||||
"uploading": "ĐаŅваĐŧĐĩ",
|
"uploading": "ĐаŅваĐŧĐĩ",
|
||||||
|
"uploading_media": "ĐаŅваĐŊĐĩ ĐŊа ĐŧĐĩдиКĐŊи ŅаКĐģОвĐĩ",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"usage": "ĐĐžŅŅĐĩĐąĐģĐĩĐŊиĐĩ",
|
"usage": "ĐĐžŅŅĐĩĐąĐģĐĩĐŊиĐĩ",
|
||||||
"use_biometric": "ĐСĐŋĐžĐģСваК йиОĐŧĐĩŅŅиŅ",
|
"use_biometric": "ĐСĐŋĐžĐģСваК йиОĐŧĐĩŅŅиŅ",
|
||||||
@@ -1946,6 +2030,7 @@
|
|||||||
"user_usage_stats_description": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅŅаŅиŅŅиĐēаŅа Са иСĐŋĐžĐģСваĐŊĐĩŅĐž ĐŊа аĐēаŅĐŊŅа",
|
"user_usage_stats_description": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅŅаŅиŅŅиĐēаŅа Са иСĐŋĐžĐģСваĐŊĐĩŅĐž ĐŊа аĐēаŅĐŊŅа",
|
||||||
"username": "ĐĐžŅŅĐĩйиŅĐĩĐģŅĐēĐž иĐŧĐĩ",
|
"username": "ĐĐžŅŅĐĩйиŅĐĩĐģŅĐēĐž иĐŧĐĩ",
|
||||||
"users": "ĐĐžŅŅĐĩйиŅĐĩĐģи",
|
"users": "ĐĐžŅŅĐĩйиŅĐĩĐģи",
|
||||||
|
"users_added_to_album_count": "{count, plural, one {ĐОйавĐĩĐŊ Đĩ # ĐŋĐžŅŅĐĩйиŅĐĩĐģ} other {ĐОйавĐĩĐŊи Ņа # ĐŋĐžŅŅĐĩйиŅĐĩĐģŅ}} ĐŊа аĐģĐąŅĐŧа",
|
||||||
"utilities": "ĐĐŊŅŅŅŅĐŧĐĩĐŊŅи",
|
"utilities": "ĐĐŊŅŅŅŅĐŧĐĩĐŊŅи",
|
||||||
"validate": "ĐаĐģидиŅаĐŊĐĩ",
|
"validate": "ĐаĐģидиŅаĐŊĐĩ",
|
||||||
"validate_endpoint_error": "ĐĐžĐģŅ, вŅвĐĩди ĐŋŅавиĐģĐĩĐŊ URL",
|
"validate_endpoint_error": "ĐĐžĐģŅ, вŅвĐĩди ĐŋŅавиĐģĐĩĐŊ URL",
|
||||||
@@ -1964,6 +2049,7 @@
|
|||||||
"view_album": "Đ Đ°ĐˇĐŗĐģĐĩдаК аĐģĐąŅĐŧа",
|
"view_album": "Đ Đ°ĐˇĐŗĐģĐĩдаК аĐģĐąŅĐŧа",
|
||||||
"view_all": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅиŅĐēи",
|
"view_all": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅиŅĐēи",
|
||||||
"view_all_users": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
"view_all_users": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅиŅĐēи ĐŋĐžŅŅĐĩйиŅĐĩĐģи",
|
||||||
|
"view_details": "ĐОдŅОйĐŊĐžŅŅи Са Đ¸ĐˇĐŗĐģĐĩда",
|
||||||
"view_in_timeline": "ĐĐžĐēаĐļи вŅв вŅĐĩĐŧĐĩва ĐģиĐŊиŅ",
|
"view_in_timeline": "ĐĐžĐēаĐļи вŅв вŅĐĩĐŧĐĩва ĐģиĐŊиŅ",
|
||||||
"view_link": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅŅСĐēаŅа",
|
"view_link": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅŅСĐēаŅа",
|
||||||
"view_links": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅŅСĐēиŅĐĩ",
|
"view_links": "ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа вŅŅСĐēиŅĐĩ",
|
||||||
|
|||||||
44
i18n/bn.json
@@ -14,6 +14,7 @@
|
|||||||
"add_a_location": "āĻāĻāĻāĻŋ āĻ
āĻŦāϏā§āĻĨāĻžāύ āϝā§āĻ āĻāϰā§āύ",
|
"add_a_location": "āĻāĻāĻāĻŋ āĻ
āĻŦāϏā§āĻĨāĻžāύ āϝā§āĻ āĻāϰā§āύ",
|
||||||
"add_a_name": "āĻāĻāĻāĻŋ āύāĻžāĻŽ āϝā§āĻ āĻāϰā§āύ",
|
"add_a_name": "āĻāĻāĻāĻŋ āύāĻžāĻŽ āϝā§āĻ āĻāϰā§āύ",
|
||||||
"add_a_title": "āĻāĻāĻāĻŋ āĻļāĻŋāϰā§āύāĻžāĻŽ āϝā§āĻ āĻāϰā§āύ",
|
"add_a_title": "āĻāĻāĻāĻŋ āĻļāĻŋāϰā§āύāĻžāĻŽ āϝā§āĻ āĻāϰā§āύ",
|
||||||
|
"add_birthday": "āĻāĻāĻāĻŋ āĻāύā§āĻŽāĻĻāĻŋāύ āϝā§āĻ āĻāϰā§āύ",
|
||||||
"add_endpoint": "āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āϝā§āĻ āĻāϰā§āύ",
|
"add_endpoint": "āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āϝā§āĻ āĻāϰā§āύ",
|
||||||
"add_exclusion_pattern": "āĻŦāĻšāĻŋāϰā§āĻā§āϤāĻāϰāĻŖ āύāĻŽā§āύāĻž",
|
"add_exclusion_pattern": "āĻŦāĻšāĻŋāϰā§āĻā§āϤāĻāϰāĻŖ āύāĻŽā§āύāĻž",
|
||||||
"add_import_path": "āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻžāϰ āĻĒāĻžāĻĨ āϝā§āĻā§āϤ āĻāϰā§āύ",
|
"add_import_path": "āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻžāϰ āĻĒāĻžāĻĨ āϝā§āĻā§āϤ āĻāϰā§āύ",
|
||||||
@@ -27,6 +28,9 @@
|
|||||||
"add_to_album": "āĻāϞāĻŦāĻžāĻŽ āĻ āϝā§āĻ āĻāϰā§āύ",
|
"add_to_album": "āĻāϞāĻŦāĻžāĻŽ āĻ āϝā§āĻ āĻāϰā§āύ",
|
||||||
"add_to_album_bottom_sheet_added": "{album} āĻ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
"add_to_album_bottom_sheet_added": "{album} āĻ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
||||||
"add_to_album_bottom_sheet_already_exists": "{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_to_shared_album": "āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āĻ
ā§āϝāĻžāϞāĻŦāĻžāĻŽā§ āϝā§āĻ āĻāϰā§āύ",
|
||||||
"add_url": "āϞāĻŋāĻā§āĻ āϝā§āĻ āĻāϰā§āύ",
|
"add_url": "āϞāĻŋāĻā§āĻ āϝā§āĻ āĻāϰā§āύ",
|
||||||
"added_to_archive": "āĻāϰā§āĻāĻžāĻāĻ āĻ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
"added_to_archive": "āĻāϰā§āĻāĻžāĻāĻ āĻ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
||||||
@@ -44,6 +48,13 @@
|
|||||||
"backup_database": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϤā§āϰāĻŋ āĻāϰā§āύ",
|
"backup_database": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϤā§āϰāĻŋ āĻāϰā§āύ",
|
||||||
"backup_database_enable_description": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏāĻā§āϰāĻŋāϝāĻŧ āĻāϰā§āύ",
|
"backup_database_enable_description": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏāĻā§āϰāĻŋāϝāĻŧ āĻāϰā§āύ",
|
||||||
"backup_keep_last_amount": "āĻāĻā§āϰ āĻĄāĻžāĻŽā§āĻĒā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āϰāĻžāĻāĻž āĻšāĻŦā§",
|
"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": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏā§āĻāĻŋāĻāϏ",
|
||||||
"backup_settings_description": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏā§āĻāĻŋāĻāϏ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύāĨ¤",
|
"backup_settings_description": "āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĄāĻžāĻŽā§āĻĒ āϏā§āĻāĻŋāĻāϏ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύāĨ¤",
|
||||||
"cleared_jobs": "{job} āĻāϰ āĻāύā§āϝ jobs āĻāĻžāϞāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
"cleared_jobs": "{job} āĻāϰ āĻāύā§āϝ jobs āĻāĻžāϞāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§",
|
||||||
@@ -63,8 +74,8 @@
|
|||||||
"exclusion_pattern_description": "āĻāĻā§āϏāĻā§āϞā§āĻļāύ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϏā§āĻā§āϝāĻžāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻĢāĻžāĻāϞ āĻāĻŦāĻ āĻĢā§āϞā§āĻĄāĻžāϰāĻā§āϞāĻŋāĻā§ āĻāĻĒā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤ āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻŽāύ āĻĢā§āϞā§āĻĄāĻžāϰ āĻĨāĻžāĻā§ āϝā§āĻāĻžāύ⧠āĻāĻŽāύ āĻĢāĻžāĻāϞ āĻĨāĻžāĻā§ āϝāĻž āĻāĻĒāύāĻŋ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāϤ⧠āĻāĻžāύ āύāĻž, āϝā§āĻŽāύ RAW āĻĢāĻžāĻāϞāĨ¤",
|
"exclusion_pattern_description": "āĻāĻā§āϏāĻā§āϞā§āĻļāύ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϏā§āĻā§āϝāĻžāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻĢāĻžāĻāϞ āĻāĻŦāĻ āĻĢā§āϞā§āĻĄāĻžāϰāĻā§āϞāĻŋāĻā§ āĻāĻĒā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤ āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻŽāύ āĻĢā§āϞā§āĻĄāĻžāϰ āĻĨāĻžāĻā§ āϝā§āĻāĻžāύ⧠āĻāĻŽāύ āĻĢāĻžāĻāϞ āĻĨāĻžāĻā§ āϝāĻž āĻāĻĒāύāĻŋ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāϤ⧠āĻāĻžāύ āύāĻž, āϝā§āĻŽāύ RAW āĻĢāĻžāĻāϞāĨ¤",
|
||||||
"external_library_management": "āĻŦāĻšāĻŋāϰāĻžāĻāϤ āĻā§āϰāύā§āĻĨāĻžāĻāĻžāϰ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž",
|
"external_library_management": "āĻŦāĻšāĻŋāϰāĻžāĻāϤ āĻā§āϰāύā§āĻĨāĻžāĻāĻžāϰ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž",
|
||||||
"face_detection": "āĻŽā§āĻ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ",
|
"face_detection": "āĻŽā§āĻ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ",
|
||||||
"face_detection_description": "āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ
ā§āϝāĻžāϏā§āĻā§ āĻĨāĻžāĻāĻž āĻŽā§āĻāĻā§āϞāĻŋ āϏāύāĻžāĻā§āϤ āĻāϰā§āύāĨ¤ āĻāĻŋāĻĄāĻŋāĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧāĨ¤ \"āϰāĻŋāĻĢā§āϰā§āĻļ\" (āĻĒā§āύāϰāĻžāϝāĻŧ) āϏāĻŽāϏā§āϤ āĻ
ā§āϝāĻžāϏā§āĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰā§āĨ¤ \"āϰāĻŋāϏā§āĻ\" āĻ
āϤāĻŋāϰāĻŋāĻā§āϤāĻāĻžāĻŦā§ āϏāĻŽāϏā§āϤ āĻŦāϰā§āϤāĻŽāĻžāύ āĻŽā§āĻā§āϰ āĻĄā§āĻāĻž āϏāĻžāĻĢ āĻāϰā§āĨ¤ \"āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ\" āĻ
ā§āϝāĻžāϏā§āĻāĻā§āϞāĻŋāĻā§ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰ⧠āϝāĻž āĻāĻāύāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤ āϏāύāĻžāĻā§āϤ āĻāϰāĻž āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āĻĢā§āϏāĻŋāϝāĻŧāĻžāϞ āϰāĻŋāĻāĻāύāĻŋāĻļāύā§āϰ āĻāύā§āϝ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰāĻž āĻšāĻŦā§, āĻĢā§āϏāĻŋāϝāĻŧāĻžāϞ āĻĄāĻŋāĻā§āĻāĻļāύ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰā§, āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦāĻž āύāϤā§āύ āĻŦā§āϝāĻā§āϤāĻŋāĻĻā§āϰ āĻŽāϧā§āϝ⧠āĻā§āώā§āĻ ā§āĻŦāĻĻā§āϧ āĻāϰā§āĨ¤",
|
"face_detection_description": "āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ
ā§āϝāĻžāϏā§āĻā§ āĻĨāĻžāĻāĻž āĻŽā§āĻ/āĻā§āĻšāĻžāϰāĻž āĻā§āϞāĻŋ āϏāύāĻžāĻā§āϤ āĻāϰā§āύāĨ¤ āĻāĻŋāĻĄāĻŋāĻ āĻā§āϞāĻŋāϰ āĻāύā§āϝ, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧāĨ¤ \"āϰāĻŋāĻĢā§āϰā§āĻļ\" (āĻĒā§āύāϰāĻžāϝāĻŧ) āϏāĻŽāϏā§āϤ āĻ
ā§āϝāĻžāϏā§āĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰā§āĨ¤ \"āϰāĻŋāϏā§āĻ\" āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤāĻāĻžāĻŦā§ āϏāĻŽāϏā§āϤ āĻŦāϰā§āϤāĻŽāĻžāύ āĻŽā§āĻā§āϰ āĻĄā§āĻāĻž āϏāĻžāĻĢ āĻāϰā§āĨ¤ \"āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ\" āĻ
ā§āϝāĻžāϏā§āĻāĻā§āϞāĻŋāĻā§ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰ⧠āϝāĻž āĻāĻāύāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤ āϏāύāĻžāĻā§āϤ āĻāϰāĻž āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āĻĢā§āϏāĻŋāϝāĻŧāĻžāϞ āϰāĻŋāĻāĻāύāĻŋāĻļāύā§āϰ āĻāύā§āϝ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰāĻž āĻšāĻŦā§, āĻĢā§āϏāĻŋāϝāĻŧāĻžāϞ āĻĄāĻŋāĻā§āĻāĻļāύ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰā§, āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦāĻž āύāϤā§āύ āĻŦā§āϝāĻā§āϤāĻŋāĻĻā§āϰ āĻŽāϧā§āϝ⧠āĻā§āώā§āĻ ā§āĻŦāĻĻā§āϧ āĻāϰā§āĨ¤",
|
||||||
"facial_recognition_job_description": "āĻļāύāĻžāĻā§āϤ āĻāϰāĻž āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āĻŽāĻžāύā§āώā§āϰ āĻŽāϧā§āϝ⧠āĻā§āώā§āĻ ā§āĻā§āĻā§āϤ āĻāϰā§āύāĨ¤ āĻŽā§āĻ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰ⧠āĻāĻ āϧāĻžāĻĒāĻāĻŋ āĻāϞā§āĨ¤ \"āϰāĻŋāϏā§āĻ\" (āĻĒā§āύāϰāĻžāϝāĻŧ) āϏāĻŽāϏā§āϤ āĻŽā§āĻāĻā§ āĻā§āϞāĻžāϏā§āĻāĻžāϰ āĻāϰā§āĨ¤ \"āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ\" āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āϏāĻžāϰāĻŋāϤ⧠āϰāĻžāĻā§ āϝā§āĻāĻžāύ⧠āĻā§āύāĻ āĻŦā§āϝāĻā§āϤāĻŋāĻā§ āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤",
|
"facial_recognition_job_description": "āĻļāύāĻžāĻā§āϤ āĻāϰāĻž āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āĻŽāĻžāύā§āώā§āϰ āĻŽāϧā§āϝ⧠āĻā§āώā§āĻ ā§āĻā§āĻā§āϤ/āĻā§āϰā§āĻĒ āĻāϰā§āύāĨ¤ āĻŽā§āĻ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰ⧠āĻāĻ āϧāĻžāĻĒāĻāĻŋ āĻāϞā§āĨ¤ \"āϰāĻŋāϏā§āĻ\" (āĻĒā§āύāϰāĻžāϝāĻŧ) āϏāĻŽāϏā§āϤ āĻŽā§āĻāĻā§ āĻā§āϞāĻžāϏā§āĻāĻžāϰ āĻāϰā§āĨ¤ \"āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ/āĻŽāĻŋāϏāĻŋāĻ\" āĻŽā§āĻāĻā§āϞāĻŋāĻā§ āϏāĻžāϰāĻŋāϤ⧠āϰāĻžāĻā§ āϝā§āĻā§āϞ⧠āĻā§āύāĻ āĻŦā§āϝāĻā§āϤāĻŋāĻā§ āĻāϏāĻžāĻāύ/āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤",
|
||||||
"failed_job_command": "āĻāĻŽāĻžāύā§āĻĄ {command} āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻŦā§āϝāϰā§āĻĨ āĻšāϝāĻŧā§āĻā§: {job}",
|
"failed_job_command": "āĻāĻŽāĻžāύā§āĻĄ {command} āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻŦā§āϝāϰā§āĻĨ āĻšāϝāĻŧā§āĻā§: {job}",
|
||||||
"force_delete_user_warning": "āϏāϤāϰā§āĻāϤāĻž: āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻŦāĻ āϏāĻŽāϏā§āϤ āϏāĻŽā§āĻĒāĻĻ āĻ
āĻŦāĻŋāϞāĻŽā§āĻŦā§ āϏāϰāĻŋāϝāĻŧā§ āĻĢā§āϞāĻŦā§āĨ¤ āĻāĻāĻŋ āĻĒā§āϰā§āĻŦāĻžāĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻĢā§āϰāĻžāύ⧠āϝāĻžāĻŦā§ āύāĻž āĻāĻŦāĻ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤",
|
"force_delete_user_warning": "āϏāϤāϰā§āĻāϤāĻž: āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻŦāĻ āϏāĻŽāϏā§āϤ āϏāĻŽā§āĻĒāĻĻ āĻ
āĻŦāĻŋāϞāĻŽā§āĻŦā§ āϏāϰāĻŋāϝāĻŧā§ āĻĢā§āϞāĻŦā§āĨ¤ āĻāĻāĻŋ āĻĒā§āϰā§āĻŦāĻžāĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻĢā§āϰāĻžāύ⧠āϝāĻžāĻŦā§ āύāĻž āĻāĻŦāĻ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤",
|
||||||
"image_format": "āĻĢāϰāĻŽā§āϝāĻžāĻ",
|
"image_format": "āĻĢāϰāĻŽā§āϝāĻžāĻ",
|
||||||
@@ -75,9 +86,9 @@
|
|||||||
"image_fullsize_quality_description": "āĻĒā§āϰā§āĻŖ-āĻāĻāĻžāϰā§āϰ āĻāĻŦāĻŋāϰ āĻŽāĻžāύ ā§§-ā§§ā§Ļā§ĻāĨ¤ āĻāĻā§āĻāϤāϰ āĻšāϞ⧠āĻāĻžāϞā§, āĻāĻŋāύā§āϤ⧠āĻāϰāĻ āĻŦāĻĄāĻŧ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤",
|
"image_fullsize_quality_description": "āĻĒā§āϰā§āĻŖ-āĻāĻāĻžāϰā§āϰ āĻāĻŦāĻŋāϰ āĻŽāĻžāύ ā§§-ā§§ā§Ļā§ĻāĨ¤ āĻāĻā§āĻāϤāϰ āĻšāϞ⧠āĻāĻžāϞā§, āĻāĻŋāύā§āϤ⧠āĻāϰāĻ āĻŦāĻĄāĻŧ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤",
|
||||||
"image_fullsize_title": "āĻĒā§āϰā§āĻŖ-āĻāĻāĻžāϰā§āϰ āĻāĻŋāϤā§āϰ āϏā§āĻāĻŋāĻāϏ",
|
"image_fullsize_title": "āĻĒā§āϰā§āĻŖ-āĻāĻāĻžāϰā§āϰ āĻāĻŋāϤā§āϰ āϏā§āĻāĻŋāĻāϏ",
|
||||||
"image_prefer_embedded_preview": "āĻāĻŽā§āĻŦā§āĻĄ āĻāϰāĻž āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻĒāĻāύā§āĻĻ āĻāϰā§āύ",
|
"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": "āĻĒā§āϰāĻļāϏā§āϤ āĻĒāϰāĻŋāϏāϰ āĻĒāĻāύā§āĻĻ āĻāϰā§āύ",
|
||||||
"image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞā§āϰ āĻāύā§āϝ āĻĄāĻŋāϏāĻĒā§āϞ⧠P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻĒā§āϰāĻļāϏā§āϤ āϰāĻā§āϰ āϏā§āĻĨāĻžāύ āϏāĻš āĻāĻŦāĻŋāϰ āĻĒā§āϰāĻžāĻŖāĻŦāύā§āϤāϤāĻž āĻāϰāĻ āĻāĻžāϞāĻāĻžāĻŦā§ āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§, āϤāĻŦā§ āĻĒā§āϰāĻžāύ⧠āĻŦā§āϰāĻžāĻāĻāĻžāϰ āϏāĻāϏā§āĻāϰāĻŖ āϏāĻš āĻĒā§āϰāĻžāύ⧠āĻĄāĻŋāĻāĻžāĻāϏāĻā§āϞāĻŋāϤ⧠āĻāĻŦāĻŋāĻā§āϞāĻŋ āĻāĻŋāύā§āύāĻāĻžāĻŦā§ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϰāĻā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāĻĄāĻŧāĻžāϤ⧠sRGB āĻāĻŦāĻŋāĻā§āϞāĻŋāĻā§ sRGB āĻšāĻŋāϏāĻžāĻŦā§ āϰāĻžāĻāĻž āĻšāϝāĻŧāĨ¤",
|
"image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞā§āϰ āĻāύā§āϝ Display P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻā§āĻžāĻāĻĄ āĻāĻžāϞāĻžāϰāϏā§āĻĒā§āϏ āĻāĻŦāĻŋāϰ āĻāĻā§āĻā§āĻŦāϞāϤāĻž āĻ āĻĒā§āϰāĻžāĻŖāĻŦāύā§āϤ āϰāĻ āĻāĻžāϞā§āĻāĻžāĻŦā§ āϧāϰ⧠āϰāĻžāĻā§, āϤāĻŦā§ āĻĒā§āϰāύ⧠āĻĄāĻŋāĻāĻžāĻāϏ āĻŦāĻž āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻāĻŦāĻŋāĻā§āϞ⧠āĻāĻŋāύā§āύāĻāĻžāĻŦā§ āĻĻā§āĻāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ sRGB āĻāĻŦāĻŋāĻā§āϞ⧠āϰāĻā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻā§āĻžāϤ⧠sRGB āĻšāĻŋāϏā§āĻŦā§āĻ āϰāĻžāĻāĻž āĻšāĻŦā§āĨ¤",
|
||||||
"image_preview_description": "āϏā§āĻā§āϰāĻŋāĻĒāĻĄ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏāĻš āĻŽāĻžāĻāĻžāϰāĻŋ āĻāĻāĻžāϰā§āϰ āĻāĻŦāĻŋ, āĻāĻāĻāĻŋ āĻāĻāĻ āϏāĻŽā§āĻĒāĻĻ āĻĻā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŦāĻ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ",
|
"image_preview_description": "āϏā§āĻā§āϰāĻŋāĻĒāĻĄ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏāĻš āĻŽāĻžāĻāĻžāϰāĻŋ āĻāĻāĻžāϰā§āϰ āĻāĻŦāĻŋ, āĻāĻāĻāĻŋ āĻāĻāĻ āϏāĻŽā§āĻĒāĻĻ āĻĻā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŦāĻ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ",
|
||||||
"image_preview_quality_description": "ā§§-ā§§ā§Ļā§Ļ āĻāϰ āĻŽāϧā§āϝ⧠āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻā§āϝāĻŧāĻžāϞāĻŋāĻāĻŋāĨ¤ āĻŦā§āĻļāĻŋ āĻšāϞ⧠āĻāĻžāϞā§, āĻāĻŋāύā§āϤ⧠āĻŦāĻĄāĻŧ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻšāϝāĻŧ āĻāĻŦāĻ āĻ
ā§āϝāĻžāĻĒā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāĻļā§āϞāϤāĻž āĻāĻŽāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽ āĻŽāĻžāύ āϏā§āĻ āĻāϰāϞ⧠āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻā§āϝāĻŧāĻžāϞāĻŋāĻāĻŋāϰ āĻāĻĒāϰ āĻĒā§āϰāĻāĻžāĻŦ āĻĒāĻĄāĻŧāϤ⧠āĻĒāĻžāϰā§āĨ¤",
|
"image_preview_quality_description": "ā§§-ā§§ā§Ļā§Ļ āĻāϰ āĻŽāϧā§āϝ⧠āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻā§āϝāĻŧāĻžāϞāĻŋāĻāĻŋāĨ¤ āĻŦā§āĻļāĻŋ āĻšāϞ⧠āĻāĻžāϞā§, āĻāĻŋāύā§āϤ⧠āĻŦāĻĄāĻŧ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻšāϝāĻŧ āĻāĻŦāĻ āĻ
ā§āϝāĻžāĻĒā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāĻļā§āϞāϤāĻž āĻāĻŽāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽ āĻŽāĻžāύ āϏā§āĻ āĻāϰāϞ⧠āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻā§āϝāĻŧāĻžāϞāĻŋāĻāĻŋāϰ āĻāĻĒāϰ āĻĒā§āϰāĻāĻžāĻŦ āĻĒāĻĄāĻŧāϤ⧠āĻĒāĻžāϰā§āĨ¤",
|
||||||
"image_preview_title": "āĻĒā§āϰāĻŋāĻāĻŋāĻ āϏā§āĻāĻŋāĻāϏ",
|
"image_preview_title": "āĻĒā§āϰāĻŋāĻāĻŋāĻ āϏā§āĻāĻŋāĻāϏ",
|
||||||
@@ -91,9 +102,30 @@
|
|||||||
"image_thumbnail_title": "āĻĨāĻžāĻŽā§āĻŦāύā§āϞ āϏā§āĻāĻŋāĻāϏ",
|
"image_thumbnail_title": "āĻĨāĻžāĻŽā§āĻŦāύā§āϞ āϏā§āĻāĻŋāĻāϏ",
|
||||||
"job_concurrency": "{job} āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ",
|
"job_concurrency": "{job} āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ",
|
||||||
"job_created": "Job āϤā§āϰāĻŋ āĻšāϝāĻŧā§āĻā§",
|
"job_created": "Job āϤā§āϰāĻŋ āĻšāϝāĻŧā§āĻā§",
|
||||||
"job_not_concurrency_safe": "āĻāĻ āĻāĻžāĻāĻāĻŋ āϏāĻŽāĻāĻžāϞā§āύ-āύāĻŋāϰāĻžāĻĒāĻĻ āύāϝāĻŧāĨ¤",
|
"job_not_concurrency_safe": "āĻāĻ āĻāĻžāĻāĻāĻŋ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāĻāĻžāĻŦā§ āĻāĻžāϞāĻžāύ⧠āύāĻŋāϰāĻžāĻĒāĻĻ āύā§",
|
||||||
"job_settings": "āĻāĻžāĻā§āϰ āϏā§āĻāĻŋāĻāϏ",
|
"job_settings": "āĻāĻžāĻā§āϰ āϏā§āĻāĻŋāĻāϏ",
|
||||||
"job_settings_description": "āĻāĻžāĻā§āϰ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāϤāĻž āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ",
|
"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": "āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āĻļāύāĻžāĻā§āϤāĻāϰāĻŖ āĻāĻžāϞ⧠āĻāϰā§āύ"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||