Compare commits
355 Commits
fix-scrubb
...
refactor/m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e639041b84 | ||
|
|
0f772ea875 | ||
|
|
2c5fc4e953 | ||
|
|
2d0c39ed04 | ||
|
|
86ee4ff822 | ||
|
|
cb51300356 | ||
|
|
98c1f3c476 | ||
|
|
be0fe36210 | ||
|
|
4f19dacecd | ||
|
|
b81081e777 | ||
|
|
97a6c6d7a0 | ||
|
|
fc6415cdc3 | ||
|
|
af2a4ae3fc | ||
|
|
a67374df75 | ||
|
|
f9687888b0 | ||
|
|
ddd65dea58 | ||
|
|
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 | ||
|
|
ad65e9011a | ||
|
|
977c9b96ba | ||
|
|
aa2828ab33 | ||
|
|
a36840d7cc | ||
|
|
e34f46fa0d | ||
|
|
6170a3843c | ||
|
|
563e2ab503 | ||
|
|
79157e1043 | ||
|
|
02688a2a03 | ||
|
|
3b9bfceef0 | ||
|
|
089085fcdb | ||
|
|
fc68cf4f32 | ||
|
|
0051a9bba5 | ||
|
|
f27bdf7523 | ||
|
|
c1c9f30ea4 | ||
|
|
bc8cb9b671 | ||
|
|
a675922172 | ||
|
|
2bead445bd | ||
|
|
0e1c8c2b80 | ||
|
|
0174de19dd | ||
|
|
1a35a01149 | ||
|
|
08122d6871 | ||
|
|
92384c28de | ||
|
|
ab597155fa | ||
|
|
1d9cc4ca5f | ||
|
|
05d26dc683 | ||
|
|
c91382625c | ||
|
|
c7853fbe9d | ||
|
|
1a70896113 | ||
|
|
1011cdb376 | ||
|
|
f1cac122ed | ||
|
|
3c7f0a2900 | ||
|
|
277e39ac98 | ||
|
|
b3061f1e4f | ||
|
|
250548dea6 | ||
|
|
ac44f6d1e0 | ||
|
|
ab61bcfcc8 | ||
|
|
aa344a3989 | ||
|
|
2efca67217 | ||
|
|
97daf42fd5 | ||
|
|
5548033cae | ||
|
|
637eba6e08 | ||
|
|
f16457d2f9 | ||
|
|
7b41c6348c | ||
|
|
bd92f6b12d | ||
|
|
496b0c7076 | ||
|
|
166452640d | ||
|
|
30f6dc3a6e | ||
|
|
02c423b326 | ||
|
|
df318ac641 | ||
|
|
826eaedae6 | ||
|
|
737e768212 | ||
|
|
99e5b33969 | ||
|
|
7ea8783593 | ||
|
|
4d27f187ea | ||
|
|
1dc62fce5f | ||
|
|
5fc4393e7a | ||
|
|
dee6d072fb | ||
|
|
261818ddd9 | ||
|
|
fafb88d31c | ||
|
|
f929dc0816 | ||
|
|
9e94f52b05 | ||
|
|
5d244c6fec | ||
|
|
dcfe8d5ade | ||
|
|
635f5de186 | ||
|
|
9719965caf | ||
|
|
f33e1ad94c | ||
|
|
576f681b5c | ||
|
|
493d85b021 | ||
|
|
f32d4f15b6 | ||
|
|
7bae49ebd5 | ||
|
|
2e63b9d951 | ||
|
|
137f0d48c0 | ||
|
|
53acf08263 | ||
|
|
f32cd74232 | ||
|
|
546f841b2c | ||
|
|
8491fe459d | ||
|
|
2046dcc5b4 | ||
|
|
03ff425664 | ||
|
|
055b930066 | ||
|
|
531515daf9 | ||
|
|
b256c51b6b | ||
|
|
238dc7c085 | ||
|
|
184c7390a1 | ||
|
|
649221176c | ||
|
|
eae2471ab5 | ||
|
|
bfceed15da | ||
|
|
d9891f759e | ||
|
|
32f23b8d38 | ||
|
|
743b6644e9 | ||
|
|
34620e1e9a | ||
|
|
bcb968e3d1 | ||
|
|
e73abe0762 | ||
|
|
920d7de349 | ||
|
|
351701c4d6 | ||
|
|
68f249bc03 | ||
|
|
eca54871d0 | ||
|
|
b359eea124 | ||
|
|
c18f167e29 | ||
|
|
ba262fbaa8 | ||
|
|
59e7754bdc | ||
|
|
0acbf1199a | ||
|
|
daea57f7d2 | ||
|
|
82c3165247 | ||
|
|
3a854d77ac | ||
|
|
ccd0c35ca1 | ||
|
|
5f10a4cae7 | ||
|
|
9abb95d34a | ||
|
|
805ec3e351 | ||
|
|
a97ba4862f | ||
|
|
c699df002a | ||
|
|
33c29e4305 | ||
|
|
b0098d6d23 | ||
|
|
04aab6ecce | ||
|
|
47c0dc0d7e | ||
|
|
df581cc0d5 | ||
|
|
9e48ae3052 | ||
|
|
1d19d308e2 | ||
|
|
de4217cefc | ||
|
|
617a2f146d | ||
|
|
2b07d7ac63 | ||
|
|
1cc5ca14ca | ||
|
|
a625921e8f | ||
|
|
a17bba3328 | ||
|
|
4b3a4725c6 | ||
|
|
34f0f6c813 | ||
|
|
906d14c172 | ||
|
|
d087f7c870 | ||
|
|
de345a9524 | ||
|
|
badd7ea2a9 | ||
|
|
7d8f56b483 | ||
|
|
70b73145f1 | ||
|
|
d178c52ba6 | ||
|
|
55fe67dd20 | ||
|
|
ed4c7817e7 | ||
|
|
39c95f1280 | ||
|
|
4ddd3764b4 | ||
|
|
68db17028b | ||
|
|
1f50a0075e | ||
|
|
b19884d01e | ||
|
|
feff1899ee | ||
|
|
977d6452f6 | ||
|
|
f778adea92 | ||
|
|
818bdde317 | ||
|
|
fd48a33686 | ||
|
|
a918481c0b | ||
|
|
a201665b7e | ||
|
|
2a222fcfba | ||
|
|
d902e7f87d | ||
|
|
6278fe43c0 | ||
|
|
dfe6d27bbd | ||
|
|
51ab7498e9 | ||
|
|
4db76ddcf0 | ||
|
|
d03eb87058 | ||
|
|
a556de67b0 | ||
|
|
e703685d8d | ||
|
|
172388c455 | ||
|
|
df4a27e8a7 | ||
|
|
1f9813a28e | ||
|
|
bbfff45058 | ||
|
|
87dd09d103 | ||
|
|
dd94ad17aa |
@@ -11,8 +11,8 @@ services:
|
||||
- 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}/photos:/workspaces/immich/server/upload
|
||||
- ${UPLOAD_LOCATION}/photos/upload:/workspaces/immich/server/upload/upload
|
||||
- ${UPLOAD_LOCATION}/photos:/data
|
||||
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
|
||||
database:
|
||||
|
||||
@@ -74,7 +74,7 @@ install_dependencies() {
|
||||
(
|
||||
cd "${IMMICH_WORKSPACE}" || exit 1
|
||||
export CI=1 FROZEN=1 OFFLINE=1
|
||||
run_cmd make setup-dev
|
||||
run_cmd make setup-web-dev setup-server-dev
|
||||
)
|
||||
log ""
|
||||
}
|
||||
|
||||
@@ -13,8 +13,8 @@ services:
|
||||
- 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}:/workspaces/immich/server/upload
|
||||
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/workspaces/immich/server/upload/upload
|
||||
- ${UPLOAD_LOCATION:-upload1-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data
|
||||
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/data/upload
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
|
||||
immich-web:
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
.vscode/
|
||||
.github/
|
||||
.git/
|
||||
.env*
|
||||
*.log
|
||||
*.tmp
|
||||
*.temp
|
||||
|
||||
**/Dockerfile
|
||||
**/node_modules/
|
||||
**/.pnpm-store/
|
||||
**/dist/
|
||||
**/coverage/
|
||||
**/build/
|
||||
|
||||
design/
|
||||
docker/
|
||||
Dockerfile
|
||||
!docker/scripts
|
||||
|
||||
docs/
|
||||
!docs/package.json
|
||||
!docs/package-lock.json
|
||||
|
||||
e2e/
|
||||
!e2e/package.json
|
||||
!e2e/package-lock.json
|
||||
|
||||
fastlane/
|
||||
machine-learning/
|
||||
misc/
|
||||
mobile/
|
||||
|
||||
cli/coverage/
|
||||
cli/dist/
|
||||
cli/node_modules/
|
||||
cli/Dockerfile
|
||||
|
||||
open-api/typescript-sdk/build/
|
||||
open-api/typescript-sdk/node_modules/
|
||||
!open-api/typescript-sdk/package.json
|
||||
!open-api/typescript-sdk/package-lock.json
|
||||
|
||||
server/coverage/
|
||||
server/node_modules/
|
||||
server/upload/
|
||||
server/src/queries
|
||||
server/dist/
|
||||
server/www/
|
||||
server/Dockerfile
|
||||
|
||||
web/node_modules/
|
||||
web/coverage/
|
||||
web/.svelte-kit
|
||||
web/build/
|
||||
web/.env
|
||||
web/Dockerfile
|
||||
|
||||
6
.gitattributes
vendored
@@ -12,6 +12,12 @@ mobile/lib/**/*.drift.dart linguist-generated=true
|
||||
mobile/drift_schemas/main/drift_schema_*.json -diff -merge
|
||||
mobile/drift_schemas/main/drift_schema_*.json linguist-generated=true
|
||||
|
||||
mobile/lib/infrastructure/repositories/db.repository.steps.dart -diff -merge
|
||||
mobile/lib/infrastructure/repositories/db.repository.steps.dart linguist-generated=true
|
||||
|
||||
mobile/test/drift/main/generated/** -diff -merge
|
||||
mobile/test/drift/main/generated/** linguist-generated=true
|
||||
|
||||
open-api/typescript-sdk/fetch-client.ts -diff -merge
|
||||
open-api/typescript-sdk/fetch-client.ts linguist-generated=true
|
||||
|
||||
|
||||
2
.github/.nvmrc
vendored
@@ -1 +1 @@
|
||||
22.17.0
|
||||
22.18.0
|
||||
|
||||
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.7.2
|
||||
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." \
|
||||
-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." \
|
||||
-f query='
|
||||
mutation CommentAndCloseDiscussion($discussionId: ID!, $body: String!) {
|
||||
addDiscussionComment(input: {
|
||||
discussionId: $discussionId,
|
||||
body: $body
|
||||
}) {
|
||||
__typename
|
||||
}
|
||||
|
||||
closeDiscussion(input: {
|
||||
discussionId: $discussionId,
|
||||
reason: DUPLICATE
|
||||
}) {
|
||||
__typename
|
||||
}
|
||||
}'
|
||||
6
.github/workflows/codeql-analysis.yml
vendored
@@ -50,7 +50,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
||||
uses: github/codeql-action/init@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@@ -63,7 +63,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
||||
uses: github/codeql-action/autobuild@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
@@ -76,6 +76,6 @@ jobs:
|
||||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
||||
uses: github/codeql-action/analyze@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
with:
|
||||
category: '/language:${{matrix.language}}'
|
||||
|
||||
4
.github/workflows/docker.yml
vendored
@@ -131,7 +131,7 @@ jobs:
|
||||
tag-suffix: '-rocm'
|
||||
platforms: linux/amd64
|
||||
runner-mapping: '{"linux/amd64": "mich"}'
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@094bfb927b8cd75b343abaac27b3241be0fccfe9 # multi-runner-build-workflow-0.1.0
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@129aeda75a450666ce96e8bc8126652e717917a7 # multi-runner-build-workflow-0.1.1
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
@@ -154,7 +154,7 @@ jobs:
|
||||
name: Build and Push Server
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@094bfb927b8cd75b343abaac27b3241be0fccfe9 # multi-runner-build-workflow-0.1.0
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@129aeda75a450666ce96e8bc8126652e717917a7 # multi-runner-build-workflow-0.1.1
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
|
||||
4
.github/workflows/docs-build.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
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:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
@@ -32,6 +32,8 @@ jobs:
|
||||
- 'docs/**'
|
||||
workflow:
|
||||
- '.github/workflows/docs-build.yml'
|
||||
open-api:
|
||||
- 'open-api/immich-openapi-specs.json'
|
||||
- name: Check if we should force jobs to run
|
||||
id: should_force
|
||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
13
.github/workflows/org-checks.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
name: Org Checks
|
||||
|
||||
on:
|
||||
pull_request_review:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
check-approvals:
|
||||
name: Check for Team/Admin Review
|
||||
uses: immich-app/devtools/.github/workflows/required-approval.yml@main
|
||||
permissions:
|
||||
pull-requests: read
|
||||
contents: read
|
||||
14
.github/workflows/preview-label.yaml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
|
||||
remove-label:
|
||||
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:
|
||||
pull-requests: write
|
||||
steps:
|
||||
@@ -33,3 +33,15 @@ jobs:
|
||||
repo: context.repo.repo,
|
||||
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.'
|
||||
|
||||
9
.github/workflows/static_analysis.yml
vendored
@@ -61,8 +61,7 @@ jobs:
|
||||
run: dart pub get
|
||||
|
||||
- name: Install DCM
|
||||
# TODO: Move to upstream after https://github.com/CQLabs/setup-dcm/pull/235 merges
|
||||
uses: bo0tzz/setup-dcm@b4952ab813659c03513b57bd78bfe3f634171f8a
|
||||
uses: CQLabs/setup-dcm@8697ae0790c0852e964a6ef1d768d62a6675481a # v2.0.1
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version: auto
|
||||
@@ -91,7 +90,7 @@ jobs:
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
||||
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}"
|
||||
exit 1
|
||||
|
||||
@@ -99,7 +98,7 @@ jobs:
|
||||
run: dart analyze --fatal-infos
|
||||
|
||||
- name: Run dart format
|
||||
run: dart format lib/ --set-exit-if-changed
|
||||
run: make format
|
||||
|
||||
- name: Run dart custom_lint
|
||||
run: dart run custom_lint
|
||||
@@ -130,7 +129,7 @@ jobs:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Upload SARIF file
|
||||
uses: github/codeql-action/upload-sarif@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
||||
uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
category: zizmor
|
||||
|
||||
2
.github/workflows/test.yml
vendored
@@ -668,7 +668,7 @@ jobs:
|
||||
contents: read
|
||||
services:
|
||||
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:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_USER: postgres
|
||||
|
||||
2
.github/workflows/weblate-lock.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
- 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
|
||||
with:
|
||||
branch: chore/translations
|
||||
|
||||
1
.gitignore
vendored
@@ -24,3 +24,4 @@ mobile/android/fastlane/report.xml
|
||||
mobile/ios/fastlane/report.xml
|
||||
|
||||
vite.config.js.timestamp-*
|
||||
.pnpm-store
|
||||
|
||||
4
.vscode/launch.json
vendored
@@ -7,7 +7,7 @@
|
||||
"restart": true,
|
||||
"port": 9231,
|
||||
"name": "Immich API Server",
|
||||
"remoteRoot": "/usr/src/app",
|
||||
"remoteRoot": "/usr/src/app/server",
|
||||
"localRoot": "${workspaceFolder}/server"
|
||||
},
|
||||
{
|
||||
@@ -16,7 +16,7 @@
|
||||
"restart": true,
|
||||
"port": 9230,
|
||||
"name": "Immich Workers",
|
||||
"remoteRoot": "/usr/src/app",
|
||||
"remoteRoot": "/usr/src/app/server",
|
||||
"localRoot": "${workspaceFolder}/server"
|
||||
}
|
||||
]
|
||||
|
||||
8
Makefile
@@ -10,6 +10,9 @@ dev-update:
|
||||
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
|
||||
|
||||
dev-docs:
|
||||
npm --prefix docs run start
|
||||
|
||||
.PHONY: e2e
|
||||
e2e:
|
||||
@trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --build -V --remove-orphans
|
||||
@@ -89,7 +92,7 @@ test-medium-dev:
|
||||
docker exec -it immich_server /bin/sh -c "npm run test:medium"
|
||||
|
||||
build-all: $(foreach M,$(filter-out e2e .github,$(MODULES)),build-$M) ;
|
||||
install-all: $(foreach M,$(MODULES),install-$M) ;
|
||||
install-all: $(foreach M,$(MODULES),install-$M) ;
|
||||
ci-all: $(foreach M,$(filter-out .github,$(MODULES)),ci-$M) ;
|
||||
check-all: $(foreach M,$(filter-out sdk cli docs .github,$(MODULES)),check-$M) ;
|
||||
lint-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),lint-$M) ;
|
||||
@@ -106,4 +109,5 @@ clean:
|
||||
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
|
||||
|
||||
setup-dev: install-server install-sdk build-sdk install-web
|
||||
setup-server-dev: install-server
|
||||
setup-web-dev: install-sdk build-sdk install-web
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.17.0
|
||||
22.18.0
|
||||
|
||||
353
cli/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@immich/cli",
|
||||
"version": "2.2.72",
|
||||
"version": "2.2.77",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@immich/cli",
|
||||
"version": "2.2.72",
|
||||
"version": "2.2.77",
|
||||
"license": "GNU Affero General Public License version 3",
|
||||
"dependencies": {
|
||||
"chokidar": "^4.0.3",
|
||||
@@ -27,22 +27,22 @@
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/micromatch": "^4.0.9",
|
||||
"@types/mock-fs": "^4.13.1",
|
||||
"@types/node": "^22.15.33",
|
||||
"@types/node": "^22.17.0",
|
||||
"@vitest/coverage-v8": "^3.0.0",
|
||||
"byte-size": "^9.0.0",
|
||||
"cli-progress": "^3.12.0",
|
||||
"commander": "^12.0.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-unicorn": "^59.0.0",
|
||||
"eslint-plugin-unicorn": "^60.0.0",
|
||||
"globals": "^16.0.0",
|
||||
"mock-fs": "^5.2.0",
|
||||
"prettier": "^3.2.5",
|
||||
"prettier-plugin-organize-imports": "^4.0.0",
|
||||
"typescript": "^5.3.3",
|
||||
"typescript-eslint": "^8.28.0",
|
||||
"vite": "^6.0.0",
|
||||
"vite": "^7.0.0",
|
||||
"vite-tsconfig-paths": "^5.0.0",
|
||||
"vitest": "^3.0.0",
|
||||
"vitest-fetch-mock": "^0.4.0",
|
||||
@@ -54,14 +54,14 @@
|
||||
},
|
||||
"../open-api/typescript-sdk": {
|
||||
"name": "@immich/sdk",
|
||||
"version": "1.135.3",
|
||||
"version": "1.137.3",
|
||||
"dev": true,
|
||||
"license": "GNU Affero General Public License version 3",
|
||||
"dependencies": {
|
||||
"@oazapfts/runtime": "^1.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.15.33",
|
||||
"@types/node": "^22.17.0",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
},
|
||||
@@ -90,9 +90,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-validator-identifier": {
|
||||
"version": "7.25.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
|
||||
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
|
||||
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -632,9 +632,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/core": {
|
||||
"version": "0.14.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
|
||||
"integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
|
||||
"version": "0.15.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
|
||||
"integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@@ -682,9 +682,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/js": {
|
||||
"version": "9.30.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz",
|
||||
"integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==",
|
||||
"version": "9.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz",
|
||||
"integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -705,13 +705,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/plugin-kit": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
|
||||
"integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
|
||||
"version": "0.3.4",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz",
|
||||
"integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@eslint/core": "^0.14.0",
|
||||
"@eslint/core": "^0.15.1",
|
||||
"levn": "^0.4.1"
|
||||
},
|
||||
"engines": {
|
||||
@@ -1355,9 +1355,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "22.15.34",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.34.tgz",
|
||||
"integrity": "sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==",
|
||||
"version": "22.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.0.tgz",
|
||||
"integrity": "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -1365,17 +1365,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
|
||||
"integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz",
|
||||
"integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@eslint-community/regexpp": "^4.10.0",
|
||||
"@typescript-eslint/scope-manager": "8.35.1",
|
||||
"@typescript-eslint/type-utils": "8.35.1",
|
||||
"@typescript-eslint/utils": "8.35.1",
|
||||
"@typescript-eslint/visitor-keys": "8.35.1",
|
||||
"@typescript-eslint/scope-manager": "8.38.0",
|
||||
"@typescript-eslint/type-utils": "8.38.0",
|
||||
"@typescript-eslint/utils": "8.38.0",
|
||||
"@typescript-eslint/visitor-keys": "8.38.0",
|
||||
"graphemer": "^1.4.0",
|
||||
"ignore": "^7.0.0",
|
||||
"natural-compare": "^1.4.0",
|
||||
@@ -1389,7 +1389,7 @@
|
||||
"url": "https://opencollective.com/typescript-eslint"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@typescript-eslint/parser": "^8.35.1",
|
||||
"@typescript-eslint/parser": "^8.38.0",
|
||||
"eslint": "^8.57.0 || ^9.0.0",
|
||||
"typescript": ">=4.8.4 <5.9.0"
|
||||
}
|
||||
@@ -1405,16 +1405,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/parser": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
|
||||
"integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz",
|
||||
"integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "8.35.1",
|
||||
"@typescript-eslint/types": "8.35.1",
|
||||
"@typescript-eslint/typescript-estree": "8.35.1",
|
||||
"@typescript-eslint/visitor-keys": "8.35.1",
|
||||
"@typescript-eslint/scope-manager": "8.38.0",
|
||||
"@typescript-eslint/types": "8.38.0",
|
||||
"@typescript-eslint/typescript-estree": "8.38.0",
|
||||
"@typescript-eslint/visitor-keys": "8.38.0",
|
||||
"debug": "^4.3.4"
|
||||
},
|
||||
"engines": {
|
||||
@@ -1430,14 +1430,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/project-service": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
|
||||
"integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
|
||||
"integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/tsconfig-utils": "^8.35.1",
|
||||
"@typescript-eslint/types": "^8.35.1",
|
||||
"@typescript-eslint/tsconfig-utils": "^8.38.0",
|
||||
"@typescript-eslint/types": "^8.38.0",
|
||||
"debug": "^4.3.4"
|
||||
},
|
||||
"engines": {
|
||||
@@ -1452,14 +1452,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/scope-manager": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
|
||||
"integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
|
||||
"integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "8.35.1",
|
||||
"@typescript-eslint/visitor-keys": "8.35.1"
|
||||
"@typescript-eslint/types": "8.38.0",
|
||||
"@typescript-eslint/visitor-keys": "8.38.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
@@ -1470,9 +1470,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/tsconfig-utils": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
|
||||
"integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
|
||||
"integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -1487,14 +1487,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/type-utils": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
|
||||
"integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz",
|
||||
"integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/typescript-estree": "8.35.1",
|
||||
"@typescript-eslint/utils": "8.35.1",
|
||||
"@typescript-eslint/types": "8.38.0",
|
||||
"@typescript-eslint/typescript-estree": "8.38.0",
|
||||
"@typescript-eslint/utils": "8.38.0",
|
||||
"debug": "^4.3.4",
|
||||
"ts-api-utils": "^2.1.0"
|
||||
},
|
||||
@@ -1511,9 +1512,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/types": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
|
||||
"integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
|
||||
"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -1525,16 +1526,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/typescript-estree": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
|
||||
"integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
|
||||
"integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/project-service": "8.35.1",
|
||||
"@typescript-eslint/tsconfig-utils": "8.35.1",
|
||||
"@typescript-eslint/types": "8.35.1",
|
||||
"@typescript-eslint/visitor-keys": "8.35.1",
|
||||
"@typescript-eslint/project-service": "8.38.0",
|
||||
"@typescript-eslint/tsconfig-utils": "8.38.0",
|
||||
"@typescript-eslint/types": "8.38.0",
|
||||
"@typescript-eslint/visitor-keys": "8.38.0",
|
||||
"debug": "^4.3.4",
|
||||
"fast-glob": "^3.3.2",
|
||||
"is-glob": "^4.0.3",
|
||||
@@ -1580,16 +1581,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/utils": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
|
||||
"integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
|
||||
"integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.7.0",
|
||||
"@typescript-eslint/scope-manager": "8.35.1",
|
||||
"@typescript-eslint/types": "8.35.1",
|
||||
"@typescript-eslint/typescript-estree": "8.35.1"
|
||||
"@typescript-eslint/scope-manager": "8.38.0",
|
||||
"@typescript-eslint/types": "8.38.0",
|
||||
"@typescript-eslint/typescript-estree": "8.38.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
@@ -1604,13 +1605,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/visitor-keys": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
|
||||
"integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
|
||||
"integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "8.35.1",
|
||||
"@typescript-eslint/types": "8.38.0",
|
||||
"eslint-visitor-keys": "^4.2.1"
|
||||
},
|
||||
"engines": {
|
||||
@@ -1896,9 +1897,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/browserslist": {
|
||||
"version": "4.24.4",
|
||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
|
||||
"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
|
||||
"version": "4.25.1",
|
||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
|
||||
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -1916,10 +1917,10 @@
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"caniuse-lite": "^1.0.30001688",
|
||||
"electron-to-chromium": "^1.5.73",
|
||||
"caniuse-lite": "^1.0.30001726",
|
||||
"electron-to-chromium": "^1.5.173",
|
||||
"node-releases": "^2.0.19",
|
||||
"update-browserslist-db": "^1.1.1"
|
||||
"update-browserslist-db": "^1.1.3"
|
||||
},
|
||||
"bin": {
|
||||
"browserslist": "cli.js"
|
||||
@@ -1980,9 +1981,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001713",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz",
|
||||
"integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==",
|
||||
"version": "1.0.30001731",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz",
|
||||
"integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -2034,6 +2035,13 @@
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/change-case": {
|
||||
"version": "5.4.4",
|
||||
"resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
|
||||
"integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/check-error": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
|
||||
@@ -2060,9 +2068,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ci-info": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
|
||||
"integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz",
|
||||
"integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -2149,13 +2157,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/core-js-compat": {
|
||||
"version": "3.41.0",
|
||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz",
|
||||
"integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==",
|
||||
"version": "3.45.0",
|
||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.0.tgz",
|
||||
"integrity": "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.24.4"
|
||||
"browserslist": "^4.25.1"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
@@ -2220,9 +2228,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/electron-to-chromium": {
|
||||
"version": "1.5.137",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz",
|
||||
"integrity": "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==",
|
||||
"version": "1.5.195",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.195.tgz",
|
||||
"integrity": "sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
@@ -2305,9 +2313,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "9.30.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz",
|
||||
"integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==",
|
||||
"version": "9.32.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz",
|
||||
"integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -2315,10 +2323,10 @@
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
"@eslint/config-array": "^0.21.0",
|
||||
"@eslint/config-helpers": "^0.3.0",
|
||||
"@eslint/core": "^0.14.0",
|
||||
"@eslint/core": "^0.15.0",
|
||||
"@eslint/eslintrc": "^3.3.1",
|
||||
"@eslint/js": "9.30.1",
|
||||
"@eslint/plugin-kit": "^0.3.1",
|
||||
"@eslint/js": "9.32.0",
|
||||
"@eslint/plugin-kit": "^0.3.4",
|
||||
"@humanfs/node": "^0.16.6",
|
||||
"@humanwhocodes/module-importer": "^1.0.1",
|
||||
"@humanwhocodes/retry": "^0.4.2",
|
||||
@@ -2366,9 +2374,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-config-prettier": {
|
||||
"version": "10.1.5",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz",
|
||||
"integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==",
|
||||
"version": "10.1.8",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
|
||||
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
@@ -2382,9 +2390,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-prettier": {
|
||||
"version": "5.5.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz",
|
||||
"integrity": "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==",
|
||||
"version": "5.5.3",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz",
|
||||
"integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -2413,65 +2421,39 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-unicorn": {
|
||||
"version": "59.0.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz",
|
||||
"integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==",
|
||||
"version": "60.0.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz",
|
||||
"integrity": "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-validator-identifier": "^7.25.9",
|
||||
"@eslint-community/eslint-utils": "^4.5.1",
|
||||
"@eslint/plugin-kit": "^0.2.7",
|
||||
"ci-info": "^4.2.0",
|
||||
"@babel/helper-validator-identifier": "^7.27.1",
|
||||
"@eslint-community/eslint-utils": "^4.7.0",
|
||||
"@eslint/plugin-kit": "^0.3.3",
|
||||
"change-case": "^5.4.4",
|
||||
"ci-info": "^4.3.0",
|
||||
"clean-regexp": "^1.0.0",
|
||||
"core-js-compat": "^3.41.0",
|
||||
"core-js-compat": "^3.44.0",
|
||||
"esquery": "^1.6.0",
|
||||
"find-up-simple": "^1.0.1",
|
||||
"globals": "^16.0.0",
|
||||
"globals": "^16.3.0",
|
||||
"indent-string": "^5.0.0",
|
||||
"is-builtin-module": "^5.0.0",
|
||||
"jsesc": "^3.1.0",
|
||||
"pluralize": "^8.0.0",
|
||||
"regexp-tree": "^0.1.27",
|
||||
"regjsparser": "^0.12.0",
|
||||
"semver": "^7.7.1",
|
||||
"semver": "^7.7.2",
|
||||
"strip-indent": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.20.0 || ^20.10.0 || >=21.0.0"
|
||||
"node": "^20.10.0 || >=21.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": ">=9.22.0"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": {
|
||||
"version": "0.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
|
||||
"integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.15"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": {
|
||||
"version": "0.2.8",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
|
||||
"integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@eslint/core": "^0.13.0",
|
||||
"levn": "^0.4.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
"eslint": ">=9.29.0"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-scope": {
|
||||
@@ -3466,9 +3448,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.3",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
|
||||
"integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
|
||||
"version": "8.5.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
|
||||
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -3486,7 +3468,7 @@
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.8",
|
||||
"nanoid": "^3.3.11",
|
||||
"picocolors": "^1.1.1",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
@@ -3534,15 +3516,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/prettier-plugin-organize-imports": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz",
|
||||
"integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==",
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.2.0.tgz",
|
||||
"integrity": "sha512-Zdy27UhlmyvATZi67BTnLcKTo8fm6Oik59Sz6H64PgZJVs6NJpPD1mT240mmJn62c98/QaL+r3kx9Q3gRpDajg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"prettier": ">=2.0",
|
||||
"typescript": ">=2.9",
|
||||
"vue-tsc": "^2.1.0"
|
||||
"vue-tsc": "^2.1.0 || 3"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"vue-tsc": {
|
||||
@@ -3713,9 +3695,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||
"version": "7.7.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
||||
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
@@ -4125,15 +4107,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript-eslint": {
|
||||
"version": "8.35.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz",
|
||||
"integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==",
|
||||
"version": "8.38.0",
|
||||
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz",
|
||||
"integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "8.35.1",
|
||||
"@typescript-eslint/parser": "8.35.1",
|
||||
"@typescript-eslint/utils": "8.35.1"
|
||||
"@typescript-eslint/eslint-plugin": "8.38.0",
|
||||
"@typescript-eslint/parser": "8.38.0",
|
||||
"@typescript-eslint/typescript-estree": "8.38.0",
|
||||
"@typescript-eslint/utils": "8.38.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
@@ -4196,24 +4179,24 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "6.3.5",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
|
||||
"integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz",
|
||||
"integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
"fdir": "^6.4.4",
|
||||
"picomatch": "^4.0.2",
|
||||
"postcss": "^8.5.3",
|
||||
"rollup": "^4.34.9",
|
||||
"tinyglobby": "^0.2.13"
|
||||
"fdir": "^6.4.6",
|
||||
"picomatch": "^4.0.3",
|
||||
"postcss": "^8.5.6",
|
||||
"rollup": "^4.40.0",
|
||||
"tinyglobby": "^0.2.14"
|
||||
},
|
||||
"bin": {
|
||||
"vite": "bin/vite.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/vitejs/vite?sponsor=1"
|
||||
@@ -4222,14 +4205,14 @@
|
||||
"fsevents": "~2.3.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
|
||||
"@types/node": "^20.19.0 || >=22.12.0",
|
||||
"jiti": ">=1.21.0",
|
||||
"less": "*",
|
||||
"less": "^4.0.0",
|
||||
"lightningcss": "^1.21.0",
|
||||
"sass": "*",
|
||||
"sass-embedded": "*",
|
||||
"stylus": "*",
|
||||
"sugarss": "*",
|
||||
"sass": "^1.70.0",
|
||||
"sass-embedded": "^1.70.0",
|
||||
"stylus": ">=0.54.8",
|
||||
"sugarss": "^5.0.0",
|
||||
"terser": "^5.16.0",
|
||||
"tsx": "^4.8.1",
|
||||
"yaml": "^2.4.2"
|
||||
@@ -4314,9 +4297,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vite/node_modules/fdir": {
|
||||
"version": "6.4.4",
|
||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
|
||||
"integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
|
||||
"version": "6.4.6",
|
||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
|
||||
"integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
@@ -4329,9 +4312,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vite/node_modules/picomatch": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
|
||||
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
|
||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@immich/cli",
|
||||
"version": "2.2.72",
|
||||
"version": "2.2.77",
|
||||
"description": "Command Line Interface (CLI) for Immich",
|
||||
"type": "module",
|
||||
"exports": "./dist/index.js",
|
||||
@@ -21,22 +21,22 @@
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/micromatch": "^4.0.9",
|
||||
"@types/mock-fs": "^4.13.1",
|
||||
"@types/node": "^22.15.33",
|
||||
"@types/node": "^22.17.0",
|
||||
"@vitest/coverage-v8": "^3.0.0",
|
||||
"byte-size": "^9.0.0",
|
||||
"cli-progress": "^3.12.0",
|
||||
"commander": "^12.0.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-unicorn": "^59.0.0",
|
||||
"eslint-plugin-unicorn": "^60.0.0",
|
||||
"globals": "^16.0.0",
|
||||
"mock-fs": "^5.2.0",
|
||||
"prettier": "^3.2.5",
|
||||
"prettier-plugin-organize-imports": "^4.0.0",
|
||||
"typescript": "^5.3.3",
|
||||
"typescript-eslint": "^8.28.0",
|
||||
"vite": "^6.0.0",
|
||||
"vite": "^7.0.0",
|
||||
"vite-tsconfig-paths": "^5.0.0",
|
||||
"vitest": "^3.0.0",
|
||||
"vitest-fetch-mock": "^0.4.0",
|
||||
@@ -69,6 +69,6 @@
|
||||
"micromatch": "^4.0.8"
|
||||
},
|
||||
"volta": {
|
||||
"node": "22.17.0"
|
||||
"node": "22.18.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,37 +2,37 @@
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||
version = "4.52.0"
|
||||
constraints = "4.52.0"
|
||||
version = "4.52.1"
|
||||
constraints = "4.52.1"
|
||||
hashes = [
|
||||
"h1:2BEJyXJtYC4B4nda/WCYUmuJYDaYk88F8t1pwPzr0iQ=",
|
||||
"h1:4IASk5SESeWKQ7JU0+M7KApuF5mZyklvwMXPBabim3c=",
|
||||
"h1:5ImZxxALSnWfH/4EXw/wFirSmk5Tr0ACmcysy51AafE=",
|
||||
"h1:6TJ3dxLSin4ZKBJLsZDn95H2ZYnGm8S7GGHvvXuuMQU=",
|
||||
"h1:IzTUjg9kQ4N3qizP9CjYLeHwjsuGgtxwXvfUQWyOLcA=",
|
||||
"h1:NTaOQfYINA0YTG/V1/9+SYtgX1it63+cBugj4WK4FWc=",
|
||||
"h1:PXH48LuJn329sCfMXprdMDk51EZaWFyajVvS03qhQLs=",
|
||||
"h1:Pi5M+GeoMSN2eJ6QnIeXjBf19O+rby/74CfB2ocpv20=",
|
||||
"h1:ShXZ2ZjBvm3thfoPPzPT8+OhyismnydQVkUAfI8X12w=",
|
||||
"h1:WQ9hu0Wge2msBbODfottCSKgu8oKUrw4Opz+fDPVVHk=",
|
||||
"h1:Z5yXML2DE0uH9UU+M0ut9JMQAORcwVZz1CxBHzeBmao=",
|
||||
"h1:jqI2qKknpleS3JDSplyGYHMu0u9K/tor1ZOjFwDgEMk=",
|
||||
"h1:kgfutDh14Q5nw4eg6qGFamFxIiY8Ae0FPKRBLDOzpcI=",
|
||||
"h1:zCAO7GZmfYhWb+i6TfqlqhMeDyPZWGio2IzEzAh3YTs=",
|
||||
"zh:19be1a91c982b902c42aba47766860dfa5dc151eed1e95fd39ca642229381ef0",
|
||||
"zh:1de451c4d1ecf7efbe67b6dace3426ba810711afdd644b0f1b870364c8ae91f8",
|
||||
"zh:352b4a2120173298622e669258744554339d959ac3a95607b117a48ee4a83238",
|
||||
"zh:3c6f1346d9154afbd2d558fabb4b0150fc8d559aa961254144fe1bc17fe6032f",
|
||||
"zh:4c4c92d53fb535b1e0eff26f222bbd627b97d3b4c891ec9c321268676d06152f",
|
||||
"zh:53276f68006c9ceb7cdb10a6ccf91a5c1eadd1407a28edb5741e84e88d7e29e8",
|
||||
"zh:7925a97773948171a63d4f65bb81ee92fd6d07a447e36012977313293a5435c9",
|
||||
"zh:7dfb0a4496cfe032437386d0a2cd9229a1956e9c30bd920923c141b0f0440060",
|
||||
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||
"zh:8d4aa79f0a414bb4163d771063c70cd991c8fac6c766e685bac2ee12903c5bd6",
|
||||
"zh:a67540c13565616a7e7e51ee9366e88b0dc60046e1d75c72680e150bd02725bb",
|
||||
"zh:a936383a4767f5393f38f622e92bf2d0c03fe04b69c284951f27345766c7b31b",
|
||||
"zh:d4887d73c466ff036eecf50ad6404ba38fd82ea4855296b1846d244b0f13c380",
|
||||
"zh:e9093c8bd5b6cd99c81666e315197791781b8f93afa14fc2e0f732d1bb2a44b7",
|
||||
"zh:efd3b3f1ec59a37f635aa1d4efcf178734c2fcf8ddb0d56ea690bec342da8672",
|
||||
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ terraform {
|
||||
required_providers {
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "4.52.0"
|
||||
version = "4.52.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,37 +2,37 @@
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||
version = "4.52.0"
|
||||
constraints = "4.52.0"
|
||||
version = "4.52.1"
|
||||
constraints = "4.52.1"
|
||||
hashes = [
|
||||
"h1:2BEJyXJtYC4B4nda/WCYUmuJYDaYk88F8t1pwPzr0iQ=",
|
||||
"h1:4IASk5SESeWKQ7JU0+M7KApuF5mZyklvwMXPBabim3c=",
|
||||
"h1:5ImZxxALSnWfH/4EXw/wFirSmk5Tr0ACmcysy51AafE=",
|
||||
"h1:6TJ3dxLSin4ZKBJLsZDn95H2ZYnGm8S7GGHvvXuuMQU=",
|
||||
"h1:IzTUjg9kQ4N3qizP9CjYLeHwjsuGgtxwXvfUQWyOLcA=",
|
||||
"h1:NTaOQfYINA0YTG/V1/9+SYtgX1it63+cBugj4WK4FWc=",
|
||||
"h1:PXH48LuJn329sCfMXprdMDk51EZaWFyajVvS03qhQLs=",
|
||||
"h1:Pi5M+GeoMSN2eJ6QnIeXjBf19O+rby/74CfB2ocpv20=",
|
||||
"h1:ShXZ2ZjBvm3thfoPPzPT8+OhyismnydQVkUAfI8X12w=",
|
||||
"h1:WQ9hu0Wge2msBbODfottCSKgu8oKUrw4Opz+fDPVVHk=",
|
||||
"h1:Z5yXML2DE0uH9UU+M0ut9JMQAORcwVZz1CxBHzeBmao=",
|
||||
"h1:jqI2qKknpleS3JDSplyGYHMu0u9K/tor1ZOjFwDgEMk=",
|
||||
"h1:kgfutDh14Q5nw4eg6qGFamFxIiY8Ae0FPKRBLDOzpcI=",
|
||||
"h1:zCAO7GZmfYhWb+i6TfqlqhMeDyPZWGio2IzEzAh3YTs=",
|
||||
"zh:19be1a91c982b902c42aba47766860dfa5dc151eed1e95fd39ca642229381ef0",
|
||||
"zh:1de451c4d1ecf7efbe67b6dace3426ba810711afdd644b0f1b870364c8ae91f8",
|
||||
"zh:352b4a2120173298622e669258744554339d959ac3a95607b117a48ee4a83238",
|
||||
"zh:3c6f1346d9154afbd2d558fabb4b0150fc8d559aa961254144fe1bc17fe6032f",
|
||||
"zh:4c4c92d53fb535b1e0eff26f222bbd627b97d3b4c891ec9c321268676d06152f",
|
||||
"zh:53276f68006c9ceb7cdb10a6ccf91a5c1eadd1407a28edb5741e84e88d7e29e8",
|
||||
"zh:7925a97773948171a63d4f65bb81ee92fd6d07a447e36012977313293a5435c9",
|
||||
"zh:7dfb0a4496cfe032437386d0a2cd9229a1956e9c30bd920923c141b0f0440060",
|
||||
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||
"zh:8d4aa79f0a414bb4163d771063c70cd991c8fac6c766e685bac2ee12903c5bd6",
|
||||
"zh:a67540c13565616a7e7e51ee9366e88b0dc60046e1d75c72680e150bd02725bb",
|
||||
"zh:a936383a4767f5393f38f622e92bf2d0c03fe04b69c284951f27345766c7b31b",
|
||||
"zh:d4887d73c466ff036eecf50ad6404ba38fd82ea4855296b1846d244b0f13c380",
|
||||
"zh:e9093c8bd5b6cd99c81666e315197791781b8f93afa14fc2e0f732d1bb2a44b7",
|
||||
"zh:efd3b3f1ec59a37f635aa1d4efcf178734c2fcf8ddb0d56ea690bec342da8672",
|
||||
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ terraform {
|
||||
required_providers {
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "4.52.0"
|
||||
version = "4.52.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ name: immich-dev
|
||||
services:
|
||||
immich-server:
|
||||
container_name: immich_server
|
||||
command: ['/usr/src/app/bin/immich-dev']
|
||||
command: ['immich-dev']
|
||||
image: immich-server-dev:latest
|
||||
# extends:
|
||||
# file: hwaccel.transcoding.yml
|
||||
@@ -27,11 +27,11 @@ services:
|
||||
target: dev
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../server:/usr/src/app
|
||||
- ../open-api:/usr/src/open-api
|
||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
||||
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/upload/upload
|
||||
- /usr/src/app/node_modules
|
||||
- ../server:/usr/src/app/server
|
||||
- ../open-api:/usr/src/app/open-api
|
||||
- ${UPLOAD_LOCATION}/photos:/data
|
||||
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||
- /usr/src/app/server/node_modules
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
env_file:
|
||||
- .env
|
||||
@@ -69,19 +69,20 @@ services:
|
||||
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
|
||||
# user: 0:0
|
||||
build:
|
||||
context: ../web
|
||||
command: ['/usr/src/app/bin/immich-web']
|
||||
context: ../
|
||||
dockerfile: web/Dockerfile
|
||||
command: ['immich-web']
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- 3000:3000
|
||||
- 24678:24678
|
||||
volumes:
|
||||
- ../web:/usr/src/app
|
||||
- ../i18n:/usr/src/i18n
|
||||
- ../open-api/:/usr/src/open-api/
|
||||
- ../web:/usr/src/app/web
|
||||
- ../i18n:/usr/src/app/i18n
|
||||
- ../open-api/:/usr/src/app/open-api/
|
||||
# - ../../ui:/usr/ui
|
||||
- /usr/src/app/node_modules
|
||||
- /usr/src/app/web/node_modules
|
||||
ulimits:
|
||||
nofile:
|
||||
soft: 1048576
|
||||
@@ -116,13 +117,13 @@ services:
|
||||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
|
||||
@@ -20,7 +20,7 @@ services:
|
||||
context: ../
|
||||
dockerfile: server/Dockerfile
|
||||
volumes:
|
||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
||||
- ${UPLOAD_LOCATION}/photos:/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
env_file:
|
||||
- .env
|
||||
@@ -56,14 +56,14 @@ services:
|
||||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
@@ -83,7 +83,7 @@ services:
|
||||
container_name: immich_prometheus
|
||||
ports:
|
||||
- 9090:9090
|
||||
image: prom/prometheus@sha256:7a34573f0b9c952286b33d537f233cd5b708e12263733aa646e50c33f598f16c
|
||||
image: prom/prometheus@sha256:63805ebb8d2b3920190daf1cb14a60871b16fd38bed42b857a3182bc621f4996
|
||||
volumes:
|
||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
@@ -95,7 +95,7 @@ services:
|
||||
command: ['./run.sh', '-disable-reporting']
|
||||
ports:
|
||||
- 3000:3000
|
||||
image: grafana/grafana:12.0.2-ubuntu@sha256:0512d81cdeaaff0e370a9aa66027b465d1f1f04379c3a9c801a905fabbdbc7a5
|
||||
image: grafana/grafana:12.1.0-ubuntu@sha256:397aa30dd1af16cb6c5c9879498e467973a7f87eacf949f6d5a29407a3843809
|
||||
volumes:
|
||||
- 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
|
||||
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
|
||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||
- ${UPLOAD_LOCATION}:/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
env_file:
|
||||
- .env
|
||||
@@ -49,14 +49,14 @@ services:
|
||||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
POSTGRES_USER: ${DB_USERNAME}
|
||||
|
||||
4
docs/.gitignore
vendored
@@ -18,4 +18,6 @@
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
yarn.lock
|
||||
yarn.lock
|
||||
|
||||
/static/openapi.json
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.17.0
|
||||
22.18.0
|
||||
|
||||
@@ -180,7 +180,7 @@ services:
|
||||
...
|
||||
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
|
||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||
- ${UPLOAD_LOCATION}:/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
+ - originals:/usr/src/app/originals
|
||||
...
|
||||
|
||||
BIN
docs/docs/administration/img/admin-nightly-tasks.webp
Normal file
|
After Width: | Height: | Size: 33 KiB |
@@ -46,6 +46,12 @@ services:
|
||||
|
||||
When a new asset is uploaded it kicks off a series of jobs, which include metadata extraction, thumbnail generation, machine learning tasks, and storage template migration, if enabled. To view the status of a job navigate to the Administration -> Jobs page.
|
||||
|
||||
Additionally, some jobs run on a schedule, which is every night at midnight. This schedule, with the exception of [External Libraries](/docs/features/libraries) scanning, cannot be changed.
|
||||
|
||||
<img src={require('./img/admin-jobs.webp').default} width="60%" title="Admin jobs" />
|
||||
|
||||
Additionally, some jobs (such as memories generation) run on a schedule, which is every night at midnight by default. To change when they run or enable/disable a job navigate to System Settings -> [Nightly Tasks Settings](https://my.immich.app/admin/system-settings?isOpen=nightly-tasks).
|
||||
|
||||
<img src={require('./img/admin-nightly-tasks.webp').default} width="60%" title="Admin nightly tasks" />
|
||||
|
||||
:::note
|
||||
Some jobs ([External Libraries](/docs/features/libraries) scanning, Database Dump) are configured in their own sections in System Settings.
|
||||
:::
|
||||
|
||||
@@ -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**¹** |
|
||||
| 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**¹** |
|
||||
| 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 |
|
||||
| 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 |
|
||||
@@ -106,6 +106,89 @@ Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to
|
||||
|
||||
## 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>
|
||||
<summary>Authentik Example</summary>
|
||||
|
||||
@@ -128,7 +211,7 @@ Configuration of OAuth in Immich System Settings
|
||||
| Signing Algorithm | RS256 |
|
||||
| Storage Label Claim | preferred_username |
|
||||
| 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) |
|
||||
| Auto Register | Enabled (optional) |
|
||||
| Auto Launch | Enabled (optional) |
|
||||
@@ -159,7 +242,7 @@ Configuration of OAuth in Immich System Settings
|
||||
| Signing Algorithm | RS256 |
|
||||
| Storage Label Claim | preferred_username |
|
||||
| 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) |
|
||||
| Auto Register | Enabled (optional) |
|
||||
| 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.
|
||||
|
||||
:::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
|
||||
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.
|
||||
:::
|
||||
|
||||
@@ -2,16 +2,17 @@
|
||||
|
||||
The `immich-server` docker image comes preinstalled with an administrative CLI (`immich-admin`) that supports the following commands:
|
||||
|
||||
| Command | Description |
|
||||
| ------------------------ | ------------------------------------- |
|
||||
| `help` | Display help |
|
||||
| `reset-admin-password` | Reset the password for the admin user |
|
||||
| `disable-password-login` | Disable password login |
|
||||
| `enable-password-login` | Enable password login |
|
||||
| `enable-oauth-login` | Enable OAuth login |
|
||||
| `disable-oauth-login` | Disable OAuth login |
|
||||
| `list-users` | List Immich users |
|
||||
| `version` | Print Immich version |
|
||||
| Command | Description |
|
||||
| ------------------------ | ------------------------------------------------------------- |
|
||||
| `help` | Display help |
|
||||
| `reset-admin-password` | Reset the password for the admin user |
|
||||
| `disable-password-login` | Disable password login |
|
||||
| `enable-password-login` | Enable password login |
|
||||
| `enable-oauth-login` | Enable OAuth login |
|
||||
| `disable-oauth-login` | Disable OAuth login |
|
||||
| `list-users` | List Immich users |
|
||||
| `version` | Print Immich version |
|
||||
| `change-media-location` | Change database file paths to align with a new media location |
|
||||
|
||||
## How to run a command
|
||||
|
||||
@@ -88,3 +89,21 @@ Print Immich Version
|
||||
immich-admin version
|
||||
v1.129.0
|
||||
```
|
||||
|
||||
Change media location
|
||||
|
||||
```
|
||||
immich-admin change-media-location
|
||||
? Enter the previous value of IMMICH_MEDIA_LOCATION: /data
|
||||
? Enter the new value of IMMICH_MEDIA_LOCATION: /my-data
|
||||
...
|
||||
Previous value: /data
|
||||
Current value: /my-data
|
||||
|
||||
Changing database paths from "/data/*" to "/my-data/*"
|
||||
|
||||
? Do you want to proceed? [Y/n] y
|
||||
|
||||
Database file paths updated successfully! 🎉
|
||||
...
|
||||
```
|
||||
|
||||
@@ -7,7 +7,7 @@ sidebar_position: 3
|
||||
|
||||
Dev Containers provide a consistent, reproducible development environment using Docker containers. With a single click, you can get started with an Immich development environment on Mac, Linux, Windows, or in the cloud using GitHub Codespaces.
|
||||
|
||||
[](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/immich-app/immich/)
|
||||
Get started fast!
|
||||
|
||||
[](https://codespaces.new/immich-app/immich/)
|
||||
|
||||
@@ -71,7 +71,7 @@ cd immich
|
||||
|
||||
The immich dev containers read environment variables from your shell environment, not from `.env` files. This allows them to work in cloud environments without pre-configuration.
|
||||
|
||||
:::important Required Configuration
|
||||
:::important Configuration
|
||||
When running locally, and if you want to create (or use an existing) DB and/or photo storage folder, you must set the `UPLOAD_LOCATION` variable in your shell environment before launching the Dev Container. This determines where uploaded files are stored and also where the DB stores it data.
|
||||
|
||||
```bash
|
||||
@@ -88,6 +88,10 @@ source ~/.bashrc
|
||||
|
||||
### Step 3: Launch the Dev Container
|
||||
|
||||
:::tip
|
||||
Immich development makes extensive use of specialized [base images](https://github.com/immich-app/base-images) for its docker-compose based development. For this reason, you won't be able to use VSCode's **_Clone Repository in a Container Volume_** command.
|
||||
:::
|
||||
|
||||
#### Using VS Code UI:
|
||||
|
||||
1. Open the cloned repository in VS Code
|
||||
|
||||
@@ -38,6 +38,19 @@ Run all server checks with `npm run check:all`
|
||||
You can use `npm run __:fix` to potentially correct some issues automatically for `npm 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
|
||||
|
||||
The OpenAPI client libraries need to be regenerated whenever there are changes to the `immich-openapi-specs.json` file. Note that you should not modify this file directly as it is auto-generated. See [OpenAPI](/docs/developer/open-api.md) for more details.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Folder view provides an additional view besides the timeline that is similar to a file explorer. It allows you to navigate through the folders and files in the library. This feature is handy for a highly curated and customized external library or a nicely configured storage template.
|
||||
|
||||
You can enable this feature under [`Account Settings > Features > Folder View`](https://my.immich.app/user-settings?isOpen=feature+folders)
|
||||
You can enable this feature under [`Account Settings > Features > Folders`](https://my.immich.app/user-settings?isOpen=feature+folders)
|
||||
|
||||
## Enable folder view
|
||||
|
||||
|
||||
@@ -56,9 +56,9 @@ Internally, Immich uses the [glob](https://www.npmjs.com/package/glob) package t
|
||||
|
||||
### Automatic watching (EXPERIMENTAL)
|
||||
|
||||
This feature - currently hidden in the config file - 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
|
||||
|
||||
@@ -72,7 +72,9 @@ In rare cases, the library watcher can hang, preventing Immich from starting up.
|
||||
|
||||
### 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
|
||||
|
||||
@@ -91,7 +93,7 @@ The `immich-server` container will need access to the gallery. Modify your docke
|
||||
```diff title="docker-compose.yml"
|
||||
immich-server:
|
||||
volumes:
|
||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||
- ${UPLOAD_LOCATION}:/data
|
||||
+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
|
||||
+ - /home/user/old-pics:/mnt/media/old-pics:ro
|
||||
+ - /mnt/media/videos:/mnt/media/videos:ro
|
||||
@@ -112,7 +114,7 @@ _Remember to run `docker compose up -d` to register the changes. Make sure you c
|
||||
|
||||
These actions must be performed by the Immich administrator.
|
||||
|
||||
- Click on your avatar on the upper right corner
|
||||
- Click on your avatar in the upper right corner
|
||||
- Click on Administration -> External Libraries
|
||||
- Click on Create an external library…
|
||||
- Select which user owns the library, this can not be changed later
|
||||
@@ -159,9 +161,7 @@ Within seconds, the assets from the old-pics and videos folders should show up i
|
||||
|
||||
Folder view provides an additional view besides the timeline that is similar to a file explorer. It allows you to navigate through the folders and files in the library. This feature is handy for a highly curated and customized external library or a nicely configured storage template.
|
||||
|
||||
You can enable this feature under [`Account Settings > Features > Folder View`](https://my.immich.app/user-settings?isOpen=feature+folders)
|
||||
|
||||
The UI is currently only available for the web; mobile will come in a subsequent release.
|
||||
You can enable this feature under [`Account Settings > Features > Folders`](https://my.immich.app/user-settings?isOpen=feature+folders)
|
||||
|
||||
<img src={require('./img/folder-view-1.webp').default} width="100%" title='Folder-view' />
|
||||
|
||||
@@ -171,7 +171,7 @@ The UI is currently only available for the web; mobile will come in a subsequent
|
||||
Only an admin can do this.
|
||||
:::
|
||||
|
||||
You can define a custom interval for the trigger external library rescan under Administration -> Settings -> Library.
|
||||
You can define a custom interval for the trigger external library rescan under Administration -> Settings -> External Library.
|
||||
You can set the scanning interval using the preset or cron format. For more information you can refer to [Crontab Guru](https://crontab.guru/).
|
||||
|
||||
<img src={require('./img/library-custom-scan-interval.webp').default} width="75%" title='Set custom scan interval for external library' />
|
||||
|
||||
@@ -88,9 +88,9 @@ It will only reflect files you add.
|
||||
:::
|
||||
|
||||
If the same asset is in more than one album it will only sync to the first album it's in, after that it won't sync again even if the user clicks sync albums manually.
|
||||
To overcome this limitation, the files must be removed from the blacklist by
|
||||
To overcome this limitation, the files must be removed from the ignore list by
|
||||
App settings -> Advanced -> Duplicate Assets -> Clear
|
||||
|
||||
:::info
|
||||
Cleaning duplicate assets from the list will cause all the previously uploaded duplicate files to be re-uploaded, the files will not actually be uploaded and will be rejected on the server side (due to duplication) but will be synchronized to the album and at the end will be added to the black list again at the end of the synchronization.
|
||||
Cleaning duplicate assets from the list will cause all the previously uploaded duplicate files to be re-uploaded, the files will not actually be uploaded and will be rejected on the server side (due to duplication) but will be synchronized to the album and at the end will be added to the ignore list again at the end of the synchronization.
|
||||
:::
|
||||
|
||||
@@ -27,11 +27,11 @@ After defining the locations of these files, we will edit the `docker-compose.ym
|
||||
services:
|
||||
immich-server:
|
||||
volumes:
|
||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||
+ - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
|
||||
+ - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
|
||||
+ - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
|
||||
+ - ${BACKUP_LOCATION}:/usr/src/app/upload/backups
|
||||
- ${UPLOAD_LOCATION}:/data
|
||||
+ - ${THUMB_LOCATION}:/data/thumbs
|
||||
+ - ${ENCODED_VIDEO_LOCATION}:/data/encoded-video
|
||||
+ - ${PROFILE_LOCATION}:/data/profile
|
||||
+ - ${BACKUP_LOCATION}:/data/backups
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
```
|
||||
|
||||
@@ -44,7 +44,7 @@ docker compose up -d
|
||||
|
||||
:::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.
|
||||
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.
|
||||
|
||||
|
||||
@@ -12,118 +12,148 @@ Run `docker exec -it immich_postgres psql --dbname=<DB_DATABASE_NAME> --username
|
||||
|
||||
## Assets
|
||||
|
||||
### Name
|
||||
|
||||
:::note
|
||||
The `"originalFileName"` column is the name of the file at time of upload, including the extension.
|
||||
:::
|
||||
|
||||
```sql title="Find by original filename"
|
||||
SELECT * FROM "assets" WHERE "originalFileName" = 'PXL_20230903_232542848.jpg';
|
||||
SELECT * FROM "assets" 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" = 'PXL_20230903_232542848.jpg';
|
||||
SELECT * FROM "asset" WHERE "originalFileName" LIKE 'PXL_%'; -- all files starting with PXL_
|
||||
SELECT * FROM "asset" WHERE "originalFileName" LIKE '%_2023_%'; -- all files with _2023_ in the middle
|
||||
```
|
||||
|
||||
```sql title="Find by path"
|
||||
SELECT * FROM "assets" 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" = 'upload/library/admin/2023/2023-09-03/PXL_2023.jpg';
|
||||
SELECT * FROM "asset" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
|
||||
```
|
||||
|
||||
### 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"
|
||||
SELECT * FROM "assets" WHERE "id"::text LIKE '%ab431d3a%';
|
||||
SELECT * FROM "asset" WHERE "id"::text LIKE '%ab431d3a%';
|
||||
```
|
||||
|
||||
### Checksum
|
||||
|
||||
:::note
|
||||
You can calculate the checksum for a particular file by using the command `sha1sum <filename>`.
|
||||
:::
|
||||
|
||||
```sql title="Find by checksum (SHA-1)"
|
||||
SELECT encode("checksum", 'hex') FROM "assets";
|
||||
SELECT * FROM "assets" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
|
||||
SELECT * FROM "assets" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation
|
||||
SELECT encode("checksum", 'hex') FROM "asset";
|
||||
SELECT * FROM "asset" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
|
||||
SELECT * FROM "asset" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation
|
||||
```
|
||||
|
||||
```sql title="Find duplicate assets with identical checksum (SHA-1) (excluding trashed files)"
|
||||
SELECT T1."checksum", array_agg(T2."id") ids FROM "assets" T1
|
||||
INNER JOIN "assets" T2 ON T1."checksum" = T2."checksum" AND T1."id" != T2."id" AND T2."deletedAt" IS NULL
|
||||
SELECT T1."checksum", array_agg(T2."id") ids FROM "asset" T1
|
||||
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";
|
||||
```
|
||||
|
||||
### Metadata
|
||||
|
||||
```sql title="Live photos"
|
||||
SELECT * FROM "assets" WHERE "livePhotoVideoId" IS NOT NULL;
|
||||
SELECT * FROM "asset" WHERE "livePhotoVideoId" IS NOT NULL;
|
||||
```
|
||||
|
||||
```sql title="By description"
|
||||
SELECT "assets".*, "exif"."description" FROM "exif"
|
||||
JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
||||
WHERE TRIM("exif"."description") <> ''; -- all files with a description
|
||||
SELECT "assets".*, "exif"."description" FROM "exif"
|
||||
JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
||||
WHERE "exif"."description" ILIKE '%string to match%'; -- search by string
|
||||
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
|
||||
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||
WHERE TRIM("asset_exif"."description") <> ''; -- all files with a description
|
||||
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
|
||||
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||
WHERE "asset_exif"."description" ILIKE '%string to match%'; -- search by string
|
||||
```
|
||||
|
||||
```sql title="Without metadata"
|
||||
SELECT "assets".* FROM "exif"
|
||||
LEFT JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
||||
WHERE "exif"."assetId" IS NULL;
|
||||
SELECT "asset".* FROM "asset_exif"
|
||||
LEFT JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||
WHERE "asset_exif"."assetId" IS NULL;
|
||||
```
|
||||
|
||||
```sql title="size < 100,000 bytes, smallest to largest"
|
||||
SELECT * FROM "assets"
|
||||
JOIN "exif" ON "assets"."id" = "exif"."assetId"
|
||||
WHERE "exif"."fileSizeInByte" < 100000
|
||||
ORDER BY "exif"."fileSizeInByte" ASC;
|
||||
SELECT * FROM "asset"
|
||||
JOIN "asset_exif" ON "asset"."id" = "asset_exif"."assetId"
|
||||
WHERE "asset_exif"."fileSizeInByte" < 100000
|
||||
ORDER BY "asset_exif"."fileSizeInByte" ASC;
|
||||
```
|
||||
|
||||
```sql title="Without thumbnails"
|
||||
SELECT * FROM "assets" WHERE "assets"."previewPath" IS NULL OR "assets"."thumbnailPath" IS NULL;
|
||||
```
|
||||
### Type
|
||||
|
||||
```sql title="By type"
|
||||
SELECT * FROM "assets" WHERE "assets"."type" = 'VIDEO';
|
||||
SELECT * FROM "assets" WHERE "assets"."type" = 'IMAGE';
|
||||
SELECT * FROM "asset" WHERE "asset"."type" = 'VIDEO';
|
||||
SELECT * FROM "asset" WHERE "asset"."type" = 'IMAGE';
|
||||
```
|
||||
|
||||
```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)"
|
||||
SELECT "users"."email", "assets"."type", COUNT(*) FROM "assets"
|
||||
JOIN "users" ON "assets"."ownerId" = "users"."id"
|
||||
GROUP BY "assets"."type", "users"."email" ORDER BY "users"."email";
|
||||
SELECT "user"."email", "asset"."type", COUNT(*) FROM "asset"
|
||||
JOIN "user" ON "asset"."ownerId" = "user"."id"
|
||||
GROUP BY "asset"."type", "user"."email" ORDER BY "user"."email";
|
||||
```
|
||||
|
||||
```sql title="Failed file movements"
|
||||
SELECT * FROM "move_history";
|
||||
## Tags
|
||||
|
||||
```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
|
||||
|
||||
```sql title="List all users"
|
||||
SELECT * FROM "users";
|
||||
SELECT * FROM "user";
|
||||
```
|
||||
|
||||
```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
|
||||
|
||||
```sql title="Delete person and unset it for the faces it was associated with"
|
||||
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
|
||||
|
||||
```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
|
||||
immich-server:
|
||||
volumes:
|
||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||
- ${UPLOAD_LOCATION}:/data
|
||||
+ - /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
|
||||
```
|
||||
@@ -41,7 +41,7 @@ In the Immich web UI:
|
||||
- Click Add path
|
||||
<img src={require('./img/add-path-button.webp').default} width="50%" title="Add Path button" />
|
||||
|
||||
- Enter **/usr/src/app/external** as the path and click Add
|
||||
- Enter **/home/user/photos1** as the path and click Add
|
||||
<img src={require('./img/add-path-field.webp').default} width="50%" title="Add Path field" />
|
||||
|
||||
- Save the new path
|
||||
|
||||
@@ -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 |
|
||||
| `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_MEDIA_LOCATION` | Media location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `./upload`<sup>\*3</sup> | 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 |
|
||||
| `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 | |
|
||||
@@ -49,9 +49,6 @@ These environment variables are used by the `docker-compose.yml` file and do **N
|
||||
|
||||
\*2: This path is where the Immich code looks for the files, which is internal to the docker container. Setting it to a path on your host will certainly break things, you should use the `UPLOAD_LOCATION` variable instead.
|
||||
|
||||
\*3: With the default `WORKDIR` of `/usr/src/app`, this path will resolve to `/usr/src/app/upload`.
|
||||
It only needs to be set if the Immich deployment method is changing.
|
||||
|
||||
## Workers
|
||||
|
||||
| Variable | Description | Default | Containers |
|
||||
@@ -202,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_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
|
||||
the `_FILE` variable should be set to the path of a file containing the variable value.
|
||||
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.
|
||||
|
||||
| Regular Variable | Equivalent Docker Secrets '\_FILE' Variable |
|
||||
| :----------------- | :------------------------------------------ |
|
||||
@@ -229,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]: https://docs.docker.com/engine/swarm/secrets/
|
||||
[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
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
# TrueNAS [Community]
|
||||
|
||||
:::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/).
|
||||
|
||||
**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.
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
src={require('./img/truenas12.webp').default}
|
||||
width="30%"
|
||||
src={require('./img/truenas/truenas00.webp').default}
|
||||
width="40%"
|
||||
alt="Immich App Widget"
|
||||
className="border rounded-xl"
|
||||
/>
|
||||
|
||||
:::info 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.
|
||||
:::info Datasets 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
|
||||
|
||||
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
|
||||
src={require('./img/truenas01.webp').default}
|
||||
src={require('./img/truenas/truenas01.webp').default}
|
||||
width="50%"
|
||||
alt="Immich App Widget"
|
||||
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
|
||||
src={require('./img/truenas02.webp').default}
|
||||
src={require('./img/truenas/truenas02.webp').default}
|
||||
width="100%"
|
||||
alt="Immich App Details Screen"
|
||||
className="border rounded-xl"
|
||||
/>
|
||||
|
||||
Click **Install** to open the Immich application configuration screen.
|
||||
|
||||
<br/><br/>
|
||||
</div>
|
||||
|
||||
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
|
||||
|
||||
<img
|
||||
src={require('./img/truenas03.webp').default}
|
||||
src={require('./img/truenas/truenas03.webp').default}
|
||||
width="100%"
|
||||
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.
|
||||
In most cases use the default name, but if adding a second deployment of the application you must change this name.
|
||||
Keep the default value or enter a name in the **Application Name** field.
|
||||
Change it if you’re deploying a second instance.
|
||||
|
||||
Accept the default version number in **Version**.
|
||||
When a new version becomes available, the application has an update badge.
|
||||
The **Installed Applications** screen shows the option to update applications.
|
||||
Immich version within TrueNAS catalog (Different from Immich release version).
|
||||
|
||||
### Immich Configuration
|
||||
|
||||
<img
|
||||
src={require('./img/truenas05.webp').default}
|
||||
src={require('./img/truenas/truenas04.webp').default}
|
||||
width="40%"
|
||||
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"
|
||||
/>
|
||||
|
||||
Accept the default value in **Timezone** or change to match your local timezone.
|
||||
**Timezone** is only used by the Immich `exiftool` microservice if it cannot be determined from the image metadata.
|
||||
These are used to add custom configuration options or to enable specific features.
|
||||
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
|
||||
|
||||
<img
|
||||
src={require('./img/truenas06.webp').default}
|
||||
src={require('./img/truenas/truenas07.webp').default}
|
||||
width="40%"
|
||||
alt="Networking Settings"
|
||||
className="border rounded-xl"
|
||||
/>
|
||||
|
||||
Accept the default port `30041` in **WebUI Port** or enter a custom port number.
|
||||
:::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.
|
||||
- **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.
|
||||
|
||||
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
|
||||
|
||||
Immich requires seven storage datasets.
|
||||
|
||||
<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)
|
||||
:::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.
|
||||
:::
|
||||
|
||||
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
|
||||
src={require('./img/truenas08.webp').default}
|
||||
src={require('./img/truenas/truenas08.webp').default}
|
||||
width="40%"
|
||||
alt="Configure Storage Host Paths"
|
||||
alt="Configure Storage Volumes"
|
||||
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
|
||||
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
|
||||
src={require('./img/truenas10.webp').default}
|
||||
src={require('./img/truenas/truenas09.webp').default}
|
||||
width="40%"
|
||||
alt="Configure Storage Host Paths"
|
||||
alt="Add External Libraries with Additional Storage"
|
||||
className="border rounded-xl"
|
||||
/>
|
||||
|
||||
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.
|
||||
You may configure [external libraries](/docs/features/libraries) by mounting them using **Additional Storage**.
|
||||
|
||||
<!-- 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
|
||||
|
||||
<img
|
||||
src={require('./img/truenas09.webp').default}
|
||||
src={require('./img/truenas/truenas11.webp').default}
|
||||
width="40%"
|
||||
alt="Resource Limits"
|
||||
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
|
||||
Before TrueNAS Community Edition version 24.10 Electric Eel:
|
||||
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.
|
||||
|
||||
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`
|
||||
:::
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
### Install
|
||||
|
||||
Finally, click **Install**.
|
||||
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
|
||||
src={require('./img/truenas04.webp').default}
|
||||
src={require('./img/truenas/truenas12.webp').default}
|
||||
width="100%"
|
||||
alt="Immich Installed"
|
||||
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
|
||||
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.
|
||||
- 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
|
||||
|
||||
:::danger
|
||||
@@ -261,3 +360,116 @@ To update the app to the latest version:
|
||||
- You may view the Changelog.
|
||||
- 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.
|
||||
|
||||
## 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>
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
"format": "prettier --check .",
|
||||
"format:fix": "prettier --write .",
|
||||
"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",
|
||||
"deploy": "docusaurus deploy",
|
||||
"clear": "docusaurus clear",
|
||||
@@ -59,6 +60,6 @@
|
||||
"node": ">=20"
|
||||
},
|
||||
"volta": {
|
||||
"node": "22.17.0"
|
||||
"node": "22.18.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,6 +100,11 @@ const projects: CommunityProjectProps[] = [
|
||||
description: 'Automatically optimize files uploaded to Immich in order to save storage space',
|
||||
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 {
|
||||
|
||||
@@ -16,6 +16,9 @@ import {
|
||||
mdiCloudKeyOutline,
|
||||
mdiRegex,
|
||||
mdiCodeJson,
|
||||
mdiClockOutline,
|
||||
mdiAccountOutline,
|
||||
mdiRestart,
|
||||
} from '@mdi/js';
|
||||
import Layout from '@theme/Layout';
|
||||
import React from 'react';
|
||||
@@ -26,6 +29,42 @@ const withLanguage = (date: Date) => (language: string) => date.toLocaleDateStri
|
||||
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
|
||||
|
||||
const items: Item[] = [
|
||||
{
|
||||
icon: mdiClockOutline,
|
||||
iconColor: 'gray',
|
||||
title: 'setTimeout is cursed',
|
||||
description:
|
||||
'The setTimeout method in JavaScript is cursed when used with small values because the implementation may or may not actually wait the specified time.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/20655',
|
||||
text: '#20655',
|
||||
},
|
||||
date: new Date(2025, 7, 4),
|
||||
},
|
||||
{
|
||||
icon: mdiAccountOutline,
|
||||
iconColor: '#DAB1DA',
|
||||
title: 'PostgreSQL USER is cursed',
|
||||
description:
|
||||
'The USER keyword in PostgreSQL is cursed because you can select from it like a table, which leads to confusion if you have a table name user as well.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/19891',
|
||||
text: '#19891',
|
||||
},
|
||||
date: new Date(2025, 7, 4),
|
||||
},
|
||||
{
|
||||
icon: mdiRestart,
|
||||
iconColor: '#8395e3',
|
||||
title: 'PostgreSQL RESET is cursed',
|
||||
description:
|
||||
'PostgreSQL RESET is cursed because it is impossible to RESET a PostgreSQL extension parameter if the extension has been uninstalled.',
|
||||
link: {
|
||||
url: 'https://github.com/immich-app/immich/pull/19363',
|
||||
text: '#19363',
|
||||
},
|
||||
date: new Date(2025, 5, 20),
|
||||
},
|
||||
{
|
||||
icon: mdiRegex,
|
||||
iconColor: 'purple',
|
||||
|
||||
@@ -2,4 +2,23 @@
|
||||
|
||||
## 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.
|
||||
|
||||
@@ -85,6 +85,7 @@ import React from 'react';
|
||||
import { Item, Timeline } from '../components/timeline';
|
||||
|
||||
const releases = {
|
||||
'v1.135.0': new Date(2025, 5, 18),
|
||||
'v1.133.0': new Date(2025, 4, 21),
|
||||
'v1.130.0': new Date(2025, 2, 25),
|
||||
'v1.127.0': new Date(2025, 1, 26),
|
||||
@@ -196,14 +197,6 @@ const roadmap: Item[] = [
|
||||
description: 'Automate tasks with workflows',
|
||||
getDateLabel: () => 'Planned for 2025',
|
||||
},
|
||||
{
|
||||
done: false,
|
||||
icon: mdiTableKey,
|
||||
iconColor: 'gray',
|
||||
title: 'Fine grained access controls',
|
||||
description: 'Granular access controls for users and api keys',
|
||||
getDateLabel: () => 'Planned for 2025',
|
||||
},
|
||||
{
|
||||
done: false,
|
||||
icon: mdiImageEdit,
|
||||
@@ -239,12 +232,26 @@ const roadmap: Item[] = [
|
||||
];
|
||||
|
||||
const milestones: Item[] = [
|
||||
{
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '70,000 Stars',
|
||||
description: 'Reached 70K Stars on GitHub!',
|
||||
getDateLabel: withLanguage(new Date(2025, 6, 9)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiTableKey,
|
||||
iconColor: 'gray',
|
||||
title: 'Fine grained access controls',
|
||||
description: 'Granular access controls for api keys',
|
||||
release: 'v1.135.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiCast,
|
||||
iconColor: 'aqua',
|
||||
title: 'Google Cast (web)',
|
||||
title: 'Google Cast (web and mobile)',
|
||||
description: 'Cast assets to Google Cast/Chromecast compatible devices',
|
||||
release: 'v1.133.0',
|
||||
release: 'v1.135.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiLockOutline,
|
||||
|
||||
5
docs/static/_redirects
vendored
@@ -1,4 +1,5 @@
|
||||
/docs /docs/overview/introduction 307
|
||||
/docs /docs/overview/welcome 307
|
||||
/docs/ /docs/overview/welcome 307
|
||||
/docs/mobile-app-beta-program /docs/features/mobile-app 307
|
||||
/docs/contribution-guidelines /docs/overview/support-the-project#contributing 307
|
||||
/docs/install /docs/install/docker-compose 307
|
||||
@@ -30,4 +31,4 @@
|
||||
/docs/guides/api-album-sync /docs/community-projects 307
|
||||
/docs/guides/remove-offline-files /docs/community-projects 307
|
||||
/milestones /roadmap 307
|
||||
/docs/overview/introduction /docs/overview/welcome 307
|
||||
/docs/overview/introduction /docs/overview/welcome 307
|
||||
|
||||
20
docs/static/archived-versions.json
vendored
@@ -1,4 +1,24 @@
|
||||
[
|
||||
{
|
||||
"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",
|
||||
"url": "https://v1.136.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.135.3",
|
||||
"url": "https://v1.135.3.archive.immich.app"
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.17.0
|
||||
22.18.0
|
||||
|
||||
@@ -3,7 +3,6 @@ name: immich-e2e
|
||||
services:
|
||||
immich-server:
|
||||
container_name: immich-e2e-server
|
||||
command: ['./start.sh']
|
||||
image: immich-server:latest
|
||||
build:
|
||||
context: ../
|
||||
@@ -36,10 +35,10 @@ services:
|
||||
- 2285:2285
|
||||
|
||||
redis:
|
||||
image: redis:6.2-alpine@sha256:3211c33a618c457e5d241922c975dbc4f446d0bdb2dc75694f5573ef8e2d01fa
|
||||
image: redis:6.2-alpine@sha256:7fe72c486b910f6b1a9769c937dad5d63648ddee82e056f47417542dd40825bb
|
||||
|
||||
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
|
||||
environment:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
|
||||
626
e2e/package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "immich-e2e",
|
||||
"version": "1.135.3",
|
||||
"version": "1.137.3",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
@@ -24,17 +24,18 @@
|
||||
"@immich/cli": "file:../cli",
|
||||
"@immich/sdk": "file:../open-api/typescript-sdk",
|
||||
"@playwright/test": "^1.44.1",
|
||||
"@socket.io/component-emitter": "^3.1.2",
|
||||
"@types/luxon": "^3.4.2",
|
||||
"@types/node": "^22.15.33",
|
||||
"@types/node": "^22.17.0",
|
||||
"@types/oidc-provider": "^9.0.0",
|
||||
"@types/pg": "^8.15.1",
|
||||
"@types/pngjs": "^6.0.4",
|
||||
"@types/supertest": "^6.0.2",
|
||||
"@vitest/coverage-v8": "^3.0.0",
|
||||
"eslint": "^9.14.0",
|
||||
"eslint-config-prettier": "^10.0.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"eslint-plugin-unicorn": "^59.0.0",
|
||||
"eslint-plugin-unicorn": "^60.0.0",
|
||||
"exiftool-vendored": "^28.3.1",
|
||||
"globals": "^16.0.0",
|
||||
"jose": "^5.6.3",
|
||||
@@ -53,6 +54,6 @@
|
||||
"vitest": "^3.0.0"
|
||||
},
|
||||
"volta": {
|
||||
"node": "22.17.0"
|
||||
"node": "22.18.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
ReactionType,
|
||||
createActivity as create,
|
||||
createAlbum,
|
||||
removeAssetFromAlbum,
|
||||
} from '@immich/sdk';
|
||||
import { createUserDto, uuidDto } from 'src/fixtures';
|
||||
import { errorDto } from 'src/responses';
|
||||
@@ -342,5 +343,36 @@ describe('/activities', () => {
|
||||
|
||||
expect(status).toBe(204);
|
||||
});
|
||||
|
||||
it('should return empty list when asset is removed', async () => {
|
||||
const album3 = await createAlbum(
|
||||
{
|
||||
createAlbumDto: {
|
||||
albumName: 'Album 3',
|
||||
assetIds: [asset.id],
|
||||
},
|
||||
},
|
||||
{ headers: asBearerAuth(admin.accessToken) },
|
||||
);
|
||||
|
||||
await createActivity({ albumId: album3.id, assetId: asset.id, type: ReactionType.Like });
|
||||
|
||||
await removeAssetFromAlbum(
|
||||
{
|
||||
id: album3.id,
|
||||
bulkIdsDto: {
|
||||
ids: [asset.id],
|
||||
},
|
||||
},
|
||||
{ headers: asBearerAuth(admin.accessToken) },
|
||||
);
|
||||
|
||||
const { status, body } = await request(app)
|
||||
.get('/activities')
|
||||
.query({ albumId: album.id })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toEqual(200);
|
||||
expect(body).toEqual([]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -470,7 +470,7 @@ describe('/albums', () => {
|
||||
.send({ ids: [asset.id] });
|
||||
|
||||
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 () => {
|
||||
@@ -599,7 +599,7 @@ describe('/albums', () => {
|
||||
.send({ ids: [user1Asset1.id] });
|
||||
|
||||
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 () => {
|
||||
@@ -683,7 +683,7 @@ describe('/albums', () => {
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||
.send({ role: AlbumUserRole.Editor });
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(status).toBe(204);
|
||||
|
||||
// Get album to verify the role change
|
||||
const { body } = await request(app)
|
||||
|
||||
@@ -20,7 +20,7 @@ describe('/api-keys', () => {
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await utils.resetDatabase(['api_keys']);
|
||||
await utils.resetDatabase(['api_key']);
|
||||
});
|
||||
|
||||
describe('POST /api-keys', () => {
|
||||
|
||||
@@ -555,7 +555,7 @@ describe('/asset', () => {
|
||||
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'?>
|
||||
<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#'>
|
||||
@@ -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', () => {
|
||||
beforeAll(setupTests, 30_000);
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ describe('/partners', () => {
|
||||
.delete(`/partners/${user3.userId}`)
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(status).toBe(204);
|
||||
});
|
||||
|
||||
it('should throw a bad request if partner not found', async () => {
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
} from '@immich/sdk';
|
||||
import { createUserDto, uuidDto } from 'src/fixtures';
|
||||
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 { beforeAll, describe, expect, it } from 'vitest';
|
||||
|
||||
@@ -78,6 +78,7 @@ describe('/shared-links', () => {
|
||||
type: SharedLinkType.Album,
|
||||
albumId: metadataAlbum.id,
|
||||
showMetadata: true,
|
||||
slug: 'metadata-album',
|
||||
}),
|
||||
utils.createSharedLink(user1.accessToken, {
|
||||
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', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/shared-links');
|
||||
@@ -473,7 +485,7 @@ describe('/shared-links', () => {
|
||||
.delete(`/shared-links/${linkWithAlbum.id}`)
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(status).toBe(204);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -15,12 +15,6 @@ describe('/system-config', () => {
|
||||
});
|
||||
|
||||
describe('PUT /system-config', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).put('/system-config');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should always return the new config', async () => {
|
||||
const config = await getSystemConfig(admin.accessToken);
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ describe('/tags', () => {
|
||||
beforeEach(async () => {
|
||||
// tagging assets eventually triggers metadata extraction which can impact other tests
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
|
||||
await utils.resetDatabase(['tags']);
|
||||
await utils.resetDatabase(['tag']);
|
||||
});
|
||||
|
||||
describe('POST /tags', () => {
|
||||
|
||||
@@ -304,7 +304,7 @@ describe('/users', () => {
|
||||
const { status } = await request(app)
|
||||
.delete(`/users/me/license`)
|
||||
.set('Authorization', `Bearer ${nonAdmin.accessToken}`);
|
||||
expect(status).toBe(200);
|
||||
expect(status).toBe(204);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -97,7 +97,7 @@ describe(`immich upload`, () => {
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await utils.resetDatabase(['assets', 'albums']);
|
||||
await utils.resetDatabase(['asset', 'album']);
|
||||
});
|
||||
|
||||
describe(`immich upload /path/to/file.jpg`, () => {
|
||||
|
||||
@@ -116,6 +116,7 @@ export const deviceDto = {
|
||||
createdAt: expect.any(String),
|
||||
updatedAt: expect.any(String),
|
||||
current: true,
|
||||
isPendingSyncReset: false,
|
||||
deviceOS: '',
|
||||
deviceType: '',
|
||||
},
|
||||
|
||||
@@ -154,19 +154,19 @@ export const utils = {
|
||||
|
||||
tables = tables || [
|
||||
// TODO e2e test for deleting a stack, since it is quite complex
|
||||
'asset_stack',
|
||||
'libraries',
|
||||
'shared_links',
|
||||
'stack',
|
||||
'library',
|
||||
'shared_link',
|
||||
'person',
|
||||
'albums',
|
||||
'assets',
|
||||
'asset_faces',
|
||||
'album',
|
||||
'asset',
|
||||
'asset_face',
|
||||
'activity',
|
||||
'api_keys',
|
||||
'sessions',
|
||||
'users',
|
||||
'api_key',
|
||||
'session',
|
||||
'user',
|
||||
'system_metadata',
|
||||
'tags',
|
||||
'tag',
|
||||
];
|
||||
|
||||
const sql: string[] = [];
|
||||
@@ -175,7 +175,7 @@ export const utils = {
|
||||
if (table === 'system_metadata') {
|
||||
sql.push(`DELETE FROM "system_metadata" where "key" NOT IN ('reverse-geocoding-state', 'system-flags');`);
|
||||
} else {
|
||||
sql.push(`DELETE FROM ${table} CASCADE;`);
|
||||
sql.push(`DELETE FROM "${table}" CASCADE;`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) => {
|
||||
await execPromise(`unzip -o -d "${output}" "${input}"`);
|
||||
},
|
||||
@@ -451,7 +439,7 @@ export const utils = {
|
||||
return;
|
||||
}
|
||||
|
||||
await client.query('INSERT INTO asset_faces ("assetId", "personId") VALUES ($1, $2)', [assetId, personId]);
|
||||
await client.query('INSERT INTO asset_face ("assetId", "personId") VALUES ($1, $2)', [assetId, personId]);
|
||||
},
|
||||
|
||||
setPersonThumbnail: async (personId: string) => {
|
||||
|
||||
@@ -37,6 +37,7 @@ test.describe('Registration', () => {
|
||||
await page.getByRole('button', { name: 'Server Privacy' }).click();
|
||||
await page.getByRole('button', { name: 'User Privacy' }).click();
|
||||
await page.getByRole('button', { name: 'Storage Template' }).click();
|
||||
await page.getByRole('button', { name: 'Backups' }).click();
|
||||
await page.getByRole('button', { name: 'Done' }).click();
|
||||
|
||||
// success
|
||||
|
||||
118
i18n/af.json
@@ -4,6 +4,7 @@
|
||||
"account_settings": "Rekeninginstellings",
|
||||
"acknowledge": "Erken",
|
||||
"action": "Aksie",
|
||||
"action_common_update": "Opdateur",
|
||||
"actions": "Aksies",
|
||||
"active": "Aktief",
|
||||
"activity": "Aktiwiteite",
|
||||
@@ -13,6 +14,7 @@
|
||||
"add_a_location": "Voeg 'n ligging by",
|
||||
"add_a_name": "Voeg 'n naam by",
|
||||
"add_a_title": "Voeg 'n titel by",
|
||||
"add_endpoint": "Voeg Koppelvlakpunt by",
|
||||
"add_exclusion_pattern": "Voeg uitsgluitingspatrone by",
|
||||
"add_import_path": "Voeg invoerpad by",
|
||||
"add_location": "Voeg ligging by",
|
||||
@@ -20,26 +22,30 @@
|
||||
"add_partner": "Voeg vennoot by",
|
||||
"add_path": "Voeg pad by",
|
||||
"add_photos": "Voeg foto's by",
|
||||
"add_tag": "Voeg tag by",
|
||||
"add_to": "Voeg by…",
|
||||
"add_to_album": "Voeg na album",
|
||||
"add_to_shared_album": "Voeg na gedeelde album",
|
||||
"add_to_album_bottom_sheet_added": "By {album} bygevoeg",
|
||||
"add_to_album_bottom_sheet_already_exists": "Reeds in {album}",
|
||||
"add_to_shared_album": "Voeg toe aan gedeelde album",
|
||||
"add_url": "Voeg URL by",
|
||||
"added_to_archive": "By argief gevoeg",
|
||||
"added_to_favorites": "By gunstelinge gevoeg",
|
||||
"added_to_favorites_count": "Het {count, number} by gunstelinge gevoeg",
|
||||
"added_to_archive": "By argief toegevoegd",
|
||||
"added_to_favorites": "By gunstelinge toegevoegd",
|
||||
"added_to_favorites_count": "Het {count, number} by gunstelinge toegevoegd",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "Voeg uitsluitingspatrone by. Globbing met *, ** en ? word ondersteun. Om alle lêers in enige lêergids genaamd \"Raw\" te ignoreer, gebruik \"**/Raw/**\". Om alle lêers wat op \".tif\" eindig, te ignoreer, gebruik \"**/*.tif\". Om 'n absolute pad te ignoreer, gebruik \"/path/to/ignore/**\".",
|
||||
"admin_user": "Admin gebruiker",
|
||||
"asset_offline_description": "Hierdie eksterne biblioteekbate word nie meer op skyf gevind nie en is na die asblik geskuif. As die lêer binne die biblioteek geskuif is, gaan jou tydlyn na vir die nuwe ooreenstemmende bate. Om hierdie bate te herstel, maak asseblief seker dat die lêerpad hieronder deur Immich verkry kan word en skandeer die biblioteek.",
|
||||
"authentication_settings": "Verifikasie instellings",
|
||||
"authentication_settings_description": "Bestuur wagwoord, OAuth en ander verifikasie instellings",
|
||||
"authentication_settings_disable_all": "Is jy seker jy wil alle aanmeldmetodes deaktiveer? Aanmelding sal heeltemal gedeaktiveer word.",
|
||||
"authentication_settings_reenable": "Om te heraktiveer, gebruik 'n <link>Server Command</link>.",
|
||||
"background_task_job": "Agtergrondtake",
|
||||
"backup_database": "Rugsteun databasis",
|
||||
"backup_database": "Skep Datastortlêer",
|
||||
"backup_database_enable_description": "Aktiveer databasisrugsteun",
|
||||
"backup_keep_last_amount": "Aantal vorige rugsteune om te hou",
|
||||
"backup_settings": "Rugsteun instellings",
|
||||
"backup_settings_description": "Bestuur databasis rugsteun instellings",
|
||||
"backup_settings_description": "Bestuur databasis rugsteun instellings.",
|
||||
"cleared_jobs": "Poste gevee vir: {job}",
|
||||
"config_set_by_file": "Config word tans deur 'n konfigurasielêer gestel",
|
||||
"confirm_delete_library": "Is jy seker jy wil {library}-biblioteek uitvee?",
|
||||
@@ -47,6 +53,7 @@
|
||||
"confirm_email_below": "Om te bevestig, tik \"{email}\" hieronder",
|
||||
"confirm_reprocess_all_faces": "Is jy seker jy wil alle gesigte herverwerk? Dit sal ook genoemde mense skoonmaak.",
|
||||
"confirm_user_password_reset": "Is jy seker jy wil {user} se wagwoord terugstel?",
|
||||
"confirm_user_pin_code_reset": "Is jy seker jy wil {user} se PIN kode herstel?",
|
||||
"create_job": "Skep werk",
|
||||
"cron_expression": "Cron uitdrukking",
|
||||
"cron_expression_description": "Stel die skanderingsinterval in met die cron-formaat. Vir meer inligting verwys asseblief na bv. <link>Crontab Guru</link>",
|
||||
@@ -56,10 +63,14 @@
|
||||
"exclusion_pattern_description": "Met uitsluitingspatrone kan jy lêers en vouers ignoreer wanneer jy jou biblioteek skandeer. Dit is nuttig as jy vouers het wat lêers bevat wat jy nie wil invoer nie, soos RAW-lêers.",
|
||||
"external_library_management": "Eksterne Biblioteekbestuur",
|
||||
"face_detection": "Gesig deteksie",
|
||||
"face_detection_description": "Detecteer die gesigte in media deur middel van masjienleer. Vir videos word slegs die duimnaelskets oorweeg. “Herlaai” (ver)werk al die media weer. “Stel terug” verwyder boonop alle huidige gesigdata. “Onverwerk” plaas bates in die tou wat nog nie verwerk is nie. Gedekte gesigte sal ná voltooiing van Gesigdetectie vir Gesigherkenning in die tou geplaas word, om hulle in bestaande of nuwe persone te groepeer.",
|
||||
"facial_recognition_job_description": "Groepeer gesigte in mense in. Die stap is vinniger nadat Gesig Deteksie klaar is. \"Herstel\" (her-)groepeer alle gesigte. \"Vermiste\" plaas gesigte in ry wat nie 'n persoon gekoppel het nie.",
|
||||
"failed_job_command": "Opdrag {command} het misluk vir werk: {job}",
|
||||
"force_delete_user_warning": "WAARSKUWING: Dit sal onmiddellik die gebruiker en alle bates verwyder. Dit kan nie ontdoen word nie en die lêers kan nie herstel word nie.",
|
||||
"image_format": "Formaat",
|
||||
"image_format_description": "WebP produseer kleiner lêers as JPEG, maar is stadiger om te enkodeer.",
|
||||
"image_fullsize_description": "Vol grote prent met geen metadata, gebruik wanner ingezoem",
|
||||
"image_fullsize_enabled": "Skakel aan vol grote prent generasie",
|
||||
"image_prefer_embedded_preview": "Verkies ingebedde voorskou",
|
||||
"image_prefer_wide_gamut": "Verkies wide gamut",
|
||||
"image_prefer_wide_gamut_setting_description": "Gebruik Display P3 vir kleinkiekies. Dit behou die lewendheid van beelde met wye kleurruimtes beter, maar beelde kan anders verskyn op ou apparate met 'n ou blaaierweergawe. sRGB-beelde gebruik steeds sRGB om kleurverskuiwings te voorkom.",
|
||||
@@ -77,8 +88,99 @@
|
||||
"job_concurrency": "{job} gelyktydigheid",
|
||||
"job_created": "Taak gemaak",
|
||||
"job_not_concurrency_safe": "Hierdie taak kan nie gelyktydig uitgevoer word nie.",
|
||||
"job_settings": "Agtergrondtaakinstellings"
|
||||
"job_settings": "Agtergrondtaakinstellings",
|
||||
"job_settings_description": "Bestuur werkgelyktydigheid",
|
||||
"job_status": "Werkstatus",
|
||||
"library_created": "Biblioteek geskep: {library}",
|
||||
"library_deleted": "Biblioteek verwyder",
|
||||
"library_import_path_description": "Spesifiseer 'n leer om in te neem. Hierdie leer, en al die sub leers, gaan geskandeer for vir prente en videos.",
|
||||
"library_scanning": "Periodieke Skandering",
|
||||
"library_scanning_description": "Stel periodieke skandering van biblioteek in",
|
||||
"library_scanning_enable_description": "Aktiveer periodieke biblioteekskandering",
|
||||
"library_settings": "Eksterne Biblioteek",
|
||||
"map_settings": "Kaart",
|
||||
"migration_job": "Migrasie",
|
||||
"oauth_settings": "OAuth",
|
||||
"transcoding_acceleration_vaapi": "VAAPI"
|
||||
},
|
||||
"administration": "Administrasie",
|
||||
"advanced": "Gevorderde",
|
||||
"albums": "Albums",
|
||||
"all": "Alle",
|
||||
"anti_clockwise": "Anti-kloksgewys",
|
||||
"archive": "Argief",
|
||||
"asset_skipped": "Oorgeslaan",
|
||||
"asset_uploaded": "Opgelaai",
|
||||
"asset_uploading": "Oplaai…",
|
||||
"assets": "Bates",
|
||||
"back": "Terug",
|
||||
"backward": "Agteruit",
|
||||
"build": "Bou",
|
||||
"camera": "Kamera",
|
||||
"cancel": "Kanselleer",
|
||||
"city": "Stad",
|
||||
"clockwise": "Kloksgewys",
|
||||
"close": "Maak toe",
|
||||
"color": "Kleur",
|
||||
"confirm": "Bevestig",
|
||||
"contain": "Bevat",
|
||||
"context": "Konteks",
|
||||
"continue": "Gaan voort",
|
||||
"country": "Land",
|
||||
"cover": "Bedek",
|
||||
"create": "Skep",
|
||||
"created": "Geskep",
|
||||
"dark": "Donker",
|
||||
"day": "Dag",
|
||||
"delete": "Verwyder",
|
||||
"description": "Beskrywing",
|
||||
"details": "Besonderhede",
|
||||
"direction": "Rigting",
|
||||
"discover": "Ontdek",
|
||||
"documentation": "Dokumentasie",
|
||||
"done": "Klaar",
|
||||
"download": "Aflaai",
|
||||
"download_settings": "Aflaai",
|
||||
"duplicates": "Duplikate",
|
||||
"duration": "Duur",
|
||||
"edit": "Wysig",
|
||||
"edited": "Gewysigd",
|
||||
"search_by_description": "Soek by beskrywing",
|
||||
"search_by_description_example": "Stapdag in Sapa"
|
||||
"search_by_description_example": "Stapdag in Sapa",
|
||||
"version": "Weergawe",
|
||||
"version_announcement_closing": "Jou friend, Alex",
|
||||
"version_history": "Weergawegeskiedenis",
|
||||
"version_history_item": "{version} geinstaleerd op {date}",
|
||||
"video": "Video",
|
||||
"videos": "Video's",
|
||||
"view": "Bekyk",
|
||||
"view_album": "Bekyk Album",
|
||||
"view_all": "Bekyk alle",
|
||||
"view_all_users": "Bekyk alle gebruikers",
|
||||
"view_in_timeline": "Bekyk in tydlyn",
|
||||
"view_link": "Bekyk skakel",
|
||||
"view_links": "Bekyk skakels",
|
||||
"view_name": "Bekyk",
|
||||
"view_next_asset": "Bekyk volgende bate",
|
||||
"view_previous_asset": "Bekyk vorige bate",
|
||||
"view_qr_code": "Bekyk QR-kode",
|
||||
"view_stack": "Bekyk stapel",
|
||||
"view_user": "Bekyk gebruiker",
|
||||
"viewer_remove_from_stack": "Verwyder van stapel",
|
||||
"viewer_stack_use_as_main_asset": "Gebruik as hoofbate",
|
||||
"viewer_unstack": "Ontstapel",
|
||||
"visibility_changed": "Sigbaarheid verander voor {count, plural, one {# person} other {# people}}",
|
||||
"waiting": "Wag",
|
||||
"warning": "Waaskuwing",
|
||||
"week": "Week",
|
||||
"welcome": "Welkom",
|
||||
"welcome_to_immich": "Welkom by Immich",
|
||||
"wifi_name": "Wi-Fi Naam",
|
||||
"wrong_pin_code": "Verkeerde PIN-kode",
|
||||
"year": "Jaar",
|
||||
"years_ago": "{years, plural, one {# year} other {# years}} gelede",
|
||||
"yes": "Ja",
|
||||
"you_dont_have_any_shared_links": "Jy het geen gedeelde skakels",
|
||||
"your_wifi_name": "Jou Wi-Fi naam",
|
||||
"zoom_image": "Vergroot Prent"
|
||||
}
|
||||
|
||||
492
i18n/ar.json
367
i18n/be.json
@@ -6,7 +6,7 @@
|
||||
"action": "Дзеянне",
|
||||
"action_common_update": "Абнавіць",
|
||||
"actions": "Дзеянні",
|
||||
"active": "Актыўны",
|
||||
"active": "Актыўных",
|
||||
"activity": "Актыўнасць",
|
||||
"activity_changed": "Актыўнасць {enabled, select, true {уключана} other {адключана}}",
|
||||
"add": "Дадаць",
|
||||
@@ -22,6 +22,7 @@
|
||||
"add_partner": "Дадаць партнёра",
|
||||
"add_path": "Дадаць шлях",
|
||||
"add_photos": "Дадаць фота",
|
||||
"add_tag": "Дадаць тэг",
|
||||
"add_to": "Дадаць у…",
|
||||
"add_to_album": "Дадаць у альбом",
|
||||
"add_to_album_bottom_sheet_added": "Дададзена да {album}",
|
||||
@@ -33,28 +34,30 @@
|
||||
"added_to_favorites_count": "Дададзена {count, number} да абранага",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "Дадайце шаблоны выключэнняў. Падтрымліваецца выкарыстанне сімвалаў * , ** і ?. Каб ігнараваць усе файлы ў любой дырэкторыі з назвай \"Raw\", выкарыстоўвайце \"**/Raw/**\". Каб ігнараваць усе файлы, якія заканчваюцца на \".tif\", выкарыстоўвайце \"**/.tif\". Каб ігнараваць абсолютны шлях, выкарыстоўвайце \"/path/to/ignore/**\".",
|
||||
"admin_user": "Адміністратар",
|
||||
"asset_offline_description": "Гэты знешні бібліятэчны актыў больш не знойдзены на дыску і быў перамешчаны ў сметніцу. Калі файл быў перамешчаны ў межах бібліятэкі, праверце вашу хроніку для новага адпаведнага актыва. Каб аднавіць гэты актыў, пераканайцеся, што шлях да файла ніжэй даступны для Immich і адскануйце бібліятэку.",
|
||||
"authentication_settings": "Налады праверкі сапраўднасці",
|
||||
"authentication_settings_description": "Кіраванне паролямі, OAuth, і іншыя налады праверкі сапраўднасці",
|
||||
"authentication_settings_disable_all": "Вы ўпэўнены, што жадаеце адключыць усе спосабы логіну? Логін будзе цалкам адключаны.",
|
||||
"authentication_settings_reenable": "Каб зноў уключыць, выкарыстайце <link>Каманду сервера</link>.",
|
||||
"background_task_job": "Фонавыя заданні",
|
||||
"backup_database": "Рэзервовая копія базы даных",
|
||||
"backup_database": "Стварыць рэзервовую копію базы даных",
|
||||
"backup_database_enable_description": "Уключыць рэзерваванне базы даных",
|
||||
"backup_keep_last_amount": "Колькасць папярэдніх рэзервовых копій для захавання",
|
||||
"backup_settings": "Налады рэзервовага капіявання",
|
||||
"backup_settings_description": "Кіраванне наладамі дампа базы дадзеных. Заўвага: гэтыя задачы не кантралююцца, і ў выпадку няўдачы паведамленне адпраўлена не будзе.",
|
||||
"backup_settings_description": "Кіраванне наладамі рэзервавання базы даных.",
|
||||
"cleared_jobs": "Ачышчаны заданні для: {job}",
|
||||
"config_set_by_file": "Канфігурацыя ў зараз усталявана праз файл канфігурацыі",
|
||||
"confirm_delete_library": "Вы ўпэўнены што жадаеце выдаліць {library} бібліятэку?",
|
||||
"config_set_by_file": "Канфігурацыя зараз усталявана праз файл канфігурацыі",
|
||||
"confirm_delete_library": "Вы ўпэўнены што жадаеце выдаліць бібліятэку {library}?",
|
||||
"confirm_delete_library_assets": "Вы ўпэўнены, што хочаце выдаліць гэтую бібліятэку? Гэта прывядзе да выдалення {count, plural, one {# актыву} other {усіх # актываў}}, якія змяшчаюцца ў Immich, і гэта дзеянне немагчыма будзе адмяніць. Файлы застануцца на дыску.",
|
||||
"confirm_email_below": "Каб пацвердзіць, увядзіце \"{email}\" ніжэй",
|
||||
"confirm_reprocess_all_faces": "Вы ўпэўнены, што хочаце пераапрацаваць усе твары? Гэта таксама прывядзе да выдалення імя людзей.",
|
||||
"confirm_user_password_reset": "Вы ўпэўнены ў тым, што жадаеце скінуць пароль {user}?",
|
||||
"confirm_user_pin_code_reset": "Вы ўпэўнены ў тым, што жадаеце скінуць PIN-код {user}?",
|
||||
"create_job": "Стварыць заданне",
|
||||
"cron_expression": "Выраз Cron",
|
||||
"cron_expression_description": "Усталюйце інтэрвал сканавання, выкарыстоўваючы фармат cron. Для атрымання дадатковай інфармацыі, калі ласка, звярніцеся, напрыклад, да <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Прадустановкі выразаў Cron",
|
||||
"cron_expression_presets": "Прадустаноўкі выразаў Cron",
|
||||
"disable_login": "Адключыць уваход",
|
||||
"duplicate_detection_job_description": "Запусціць машыннае навучанне на актывах для выяўлення падобных выяў. Залежыць ад Smart Search",
|
||||
"exclusion_pattern_description": "Шаблоны выключэння дазваляюць ігнараваць файлы і папкі пры сканаванні вашай бібліятэкі. Гэта карысна, калі ў вас ёсць папкі, якія змяшчаюць файлы, якія вы не хочаце імпартаваць, напрыклад, файлы RAW.",
|
||||
@@ -71,15 +74,361 @@
|
||||
"image_fullsize_enabled_description": "Ствараць выяву ў поўным памеры для фарматаў, што не прыдатныя для вэб. Калі ўключана опцыя \"Аддаваць перавагу ўбудаванай праяве\", прагляды выкарыстоўваюцца непасрэдна без канвертацыі. Не ўплывае на вэб-прыдатныя фарматы, такія як JPEG.",
|
||||
"image_fullsize_quality_description": "Якасць выявы ў поўным памеры ад 1 да 100. Больш высокае значэнне лепшае, але прыводзіць да павелічэння памеру файла.",
|
||||
"image_fullsize_title": "Налады выявы ў поўным памеры",
|
||||
"image_prefer_embedded_preview": "Аддаваць перавагу ўбудаванай праяве",
|
||||
"image_prefer_embedded_preview_setting_description": "Выкарыстоўваць убудаваныя праявы ў RAW-фотаздымках ў якасці ўваходных дадзеных для апрацоўкі малюнкаў, калі магчыма. Гэта дазваляе атрымаць больш дакладныя колеры для некаторых відарысаў, але ж якасць праяў залежыць ад камеры, і на відарысе можа быць больш артэфактаў сціску.",
|
||||
"image_prefer_wide_gamut": "Аддаць перавагу шырокай гаме",
|
||||
"image_preview_description": "Відарыс сярэдняга памеру з выдаленымі метададзенымі, выкарыстоўваецца пры праглядзе асобнага рэсурсу і для машыннага навучання",
|
||||
"image_preview_quality_description": "Якасць праявы ад 1 да 100. Чым вышэй, тым лепш, але пры гэтым ствараюцца файлы большага памеру і можа знізіцца хуткасць водгуку прыкладання. Ўстаноўка нізкага значэння можа паўплываць на якасць машыннага навучання.",
|
||||
"image_preview_title": "Налады папярэдняга прагляду",
|
||||
"image_quality": "Якасць",
|
||||
"image_resolution": "Раздзяляльнасць",
|
||||
"image_settings": "Налады відарыса",
|
||||
"image_settings_description": "Кіруйце якасцю і раздзяляльнасцю сгенерыраваных відарысаў"
|
||||
"image_settings_description": "Кіруйце якасцю і раздзяляльнасцю сгенерыраваных відарысаў",
|
||||
"library_created": "Створана бібліятэка: {library}",
|
||||
"library_deleted": "Бібліятэка выдалена",
|
||||
"map_dark_style": "Цёмны стыль",
|
||||
"map_enable_description": "Уключыць функцыі карты",
|
||||
"map_gps_settings": "Налады карты і GPS",
|
||||
"map_light_style": "Светлы стыль",
|
||||
"map_settings": "Карта",
|
||||
"map_settings_description": "Кіраванне наладамі карты",
|
||||
"map_style_description": "URL-адрас style.json тэмы карты",
|
||||
"metadata_settings": "Налады метаданых",
|
||||
"oauth_button_text": "Тэкст кнопкі",
|
||||
"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": "Сістэмныя налады",
|
||||
"tag_cleanup_job": "Ачыстка тэгаў",
|
||||
"template_email_preview": "Перадпрагляд",
|
||||
"theme_settings": "Налады тэмы",
|
||||
"transcoding_acceleration_nvenc": "NVENC (патрабуецца відэакарта NVIDIA)",
|
||||
"transcoding_acceleration_vaapi": "VAAPI",
|
||||
"transcoding_accepted_containers": "Прынятыя кантэйнеры",
|
||||
"transcoding_accepted_video_codecs": "Прынятыя відэакодэкі",
|
||||
"transcoding_advanced_options_description": "Параметры, якія большасці карыстальнікаў не трэба змяняць",
|
||||
"transcoding_audio_codec": "Аудыякодэк",
|
||||
"transcoding_encoding_options": "Параметры кадзіравання",
|
||||
"transcoding_video_codec": "Відэакодэк",
|
||||
"trash_enabled_description": "Уключыць функцыі сметніцы",
|
||||
"trash_number_of_days": "Колькасць дзён",
|
||||
"trash_settings": "Налады сметніцы",
|
||||
"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_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": "Выпраўленне непаладак",
|
||||
"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_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_options": "Параметры альбома",
|
||||
"album_remove_user": "Выдаліць карыстальніка?",
|
||||
"album_remove_user_confirmation": "Вы ўпэўнены, што хочаце выдаліць {user}?",
|
||||
"album_search_not_found": "Па вашым запыце не знойдзена альбомаў",
|
||||
"album_share_no_users": "Здаецца, вы падзяліліся гэтым альбомам з усімі карыстальнікамі, або ў вас няма ніводнага карыстальніка, з якім можна падзяліцца.",
|
||||
"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_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_albums": "Усе альбомы",
|
||||
"all_people": "Усе людзі",
|
||||
"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_title": "Выйсці",
|
||||
"app_settings": "Налады праграмы",
|
||||
"archive": "Архіў",
|
||||
"archive_page_title": "Архіў ({count})",
|
||||
"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": "Запампоўванне…",
|
||||
"authorized_devices": "Аўтарызаваныя прылады",
|
||||
"back": "Назад",
|
||||
"backup_album_selection_page_albums_device": "Альбомы на прыладзе ({count})",
|
||||
"backup_all": "Усе",
|
||||
"backup_controller_page_background_wifi": "Толькі праз Wi-Fi",
|
||||
"buy": "Купіць Immich",
|
||||
"cache_settings_clear_cache_button": "Ачысціць кэш",
|
||||
"cache_settings_tile_title": "Лакальнае сховішча",
|
||||
"cancel": "Скасаваць",
|
||||
"cancel_search": "Скасаваць пошук",
|
||||
"canceled": "Скасавана",
|
||||
"city": "Горад",
|
||||
"clear": "Ачысціць",
|
||||
"clear_all": "Ачысціць усё",
|
||||
"client_cert_dialog_msg_confirm": "ОК",
|
||||
"client_cert_enter_password": "Увядзіце пароль",
|
||||
"client_cert_import": "Імпарт",
|
||||
"close": "Закрыць",
|
||||
"collapse": "Згарнуць",
|
||||
"collapse_all": "Згарнуць усё",
|
||||
"color": "Колер",
|
||||
"color_theme": "Колеравая тэма",
|
||||
"continue": "Працягнуць",
|
||||
"control_bottom_app_bar_create_new_album": "Стварыць новы альбом",
|
||||
"control_bottom_app_bar_delete_from_immich": "Выдаліць з Immich",
|
||||
"control_bottom_app_bar_delete_from_local": "Выдаліць з прылады",
|
||||
"control_bottom_app_bar_edit_location": "Рэдагаваць месцазнаходжанне",
|
||||
"country": "Краіна",
|
||||
"cover": "Вокладка",
|
||||
"covers": "Вокладкі",
|
||||
"create": "Стварыць",
|
||||
"create_album": "Стварыць альбом",
|
||||
"create_album_page_untitled": "Без назвы",
|
||||
"create_library": "Стварыць бібліятэку",
|
||||
"create_link": "Стварыць спасылку",
|
||||
"create_new_user": "Стварыць новага карыстальніка",
|
||||
"create_tag": "Стварыць тэг",
|
||||
"create_user": "Стварыць карыстальніка",
|
||||
"dark": "Цёмная",
|
||||
"day": "Дзень",
|
||||
"delete": "Выдаліць",
|
||||
"delete_album": "Выдаліць альбом",
|
||||
"delete_dialog_ok_force": "Усё адно выдаліць",
|
||||
"delete_dialog_title": "Выдаліць назаўжды",
|
||||
"delete_face": "Выдаліць твар",
|
||||
"delete_key": "Выдаліць ключ",
|
||||
"delete_library": "Выдаліць бібліятэку",
|
||||
"delete_link": "Выдаліць спасылку",
|
||||
"delete_local_dialog_ok_force": "Усё адно выдаліць",
|
||||
"delete_others": "Выдаліць іншыя",
|
||||
"delete_tag": "Выдаліць тэг",
|
||||
"delete_user": "Выдаліць карыстальніка",
|
||||
"discord": "Discord",
|
||||
"documentation": "Дакументацыя",
|
||||
"done": "Гатова",
|
||||
"download": "Спампаваць",
|
||||
"download_canceled": "Спампоўванне скасавана",
|
||||
"download_complete": "Спампоўванне завершана",
|
||||
"download_enqueue": "Спампоўванне дададзена ў чаргу",
|
||||
"downloading": "Спампоўванне",
|
||||
"edit": "Рэдагаваць",
|
||||
"edit_album": "Рэдагаваць альбом",
|
||||
"edit_avatar": "Рэдагаваць аватар",
|
||||
"edit_date": "Рэдагаваць дату",
|
||||
"edit_date_and_time": "Рэдагаваь дату і час",
|
||||
"edit_description": "Рэдагаваць апісанне",
|
||||
"edit_description_prompt": "Выберыце новае апісанне:",
|
||||
"edit_faces": "Рэдагаваць твары",
|
||||
"edit_import_path": "Рэдагаваць шлях імпарту",
|
||||
"edit_import_paths": "Рэдагаваць шляхі імпарту",
|
||||
"edit_key": "Рэдагаваць ключ",
|
||||
"edit_link": "Рэдагаваць спасылку",
|
||||
"edit_location": "Рэдагаваць месцазнаходжанне",
|
||||
"edit_location_dialog_title": "Месцазнаходжанне",
|
||||
"edit_name": "Рэдагаваць назву",
|
||||
"edit_people": "Рэдагаваць людзей",
|
||||
"edit_tag": "Рэдагаваць тэг",
|
||||
"edit_title": "Рэдагаваць загаловак",
|
||||
"edit_user": "Рэдагаваць карыстальніка",
|
||||
"edited": "Адрэдагавана",
|
||||
"editor": "Рэдактар",
|
||||
"editor_close_without_save_prompt": "Змены не будуць захаваны",
|
||||
"editor_close_without_save_title": "Закрыць рэдактар?",
|
||||
"editor_crop_tool_h2_aspect_ratios": "Суадносіны бакоў",
|
||||
"editor_crop_tool_h2_rotation": "Паварот",
|
||||
"error": "Памылка",
|
||||
"error_saving_image": "Памылка: {error}",
|
||||
"exif": "Exif",
|
||||
"exif_bottom_sheet_description": "Дадаць апісанне...",
|
||||
"favorite": "У абраным",
|
||||
"favorite_or_unfavorite_photo": "Дадаць або выдаліць фота з абранага",
|
||||
"favorites": "Абраныя",
|
||||
"file_name": "Назва файла",
|
||||
"filename": "Назва файла",
|
||||
"filetype": "Тып файла",
|
||||
"filter": "Фільтр",
|
||||
"forward": "Наперад",
|
||||
"gcast_enabled": "Google Cast",
|
||||
"general": "Агульныя",
|
||||
"go_back": "Назад",
|
||||
"go_to_folder": "Перайсці да папкі",
|
||||
"hi_user": "Вітаем, {name} ({email})",
|
||||
"hide_all_people": "Схаваць усіх людзей",
|
||||
"hide_gallery": "Схаваць галерэю",
|
||||
"hide_named_person": "Схаваць {name}",
|
||||
"hide_password": "Схаваць пароль",
|
||||
"hide_person": "Схаваць чалавека",
|
||||
"image_viewer_page_state_provider_download_started": "Спампоўванне пачалося",
|
||||
"immich_logo": "Лагатып Immich",
|
||||
"interval": {
|
||||
"day_at_onepm": "Кожны дзень а 13-й гадзіне",
|
||||
"hours": "{hours, plural, one {Кожную гадзіну} few {Кожныя {hours, number} гадзіны} many {Кожныя {hours, number} гадзін} other {Кожныя {hours, number} гадзін}}",
|
||||
"night_at_midnight": "Кожную ноч апоўначы",
|
||||
"night_at_twoam": "Кожную ноч а 2-й гадзіне"
|
||||
},
|
||||
"language": "Мова",
|
||||
"library": "Бібліятэка",
|
||||
"light": "Светлая",
|
||||
"login_form_back_button_text": "Назад",
|
||||
"login_form_email_hint": "youremail@email.com",
|
||||
"login_form_endpoint_hint": "http://your-server-ip:port",
|
||||
"login_form_password_hint": "пароль",
|
||||
"login_form_save_login": "Заставацца ў сістэме",
|
||||
"main_menu": "Галоўнае меню",
|
||||
"map_location_dialog_yes": "Так",
|
||||
"map_settings_dark_mode": "Цёмны рэжым",
|
||||
"map_settings_date_range_option_day": "Апошнія 24 гадзіны",
|
||||
"map_settings_date_range_option_days": "Апошніх дзён: {days}",
|
||||
"map_settings_date_range_option_year": "Апошні год",
|
||||
"map_settings_date_range_option_years": "Апошніх год: {years}",
|
||||
"map_settings_dialog_title": "Налады карты",
|
||||
"map_settings_theme_settings": "Тэма карты",
|
||||
"menu": "Меню",
|
||||
"minute": "Хвіліна",
|
||||
"month": "Месяц",
|
||||
"monthly_title_text_date_format": "MMMM y",
|
||||
"my_albums": "Мае альбомы",
|
||||
"name": "Імя",
|
||||
"name_or_nickname": "Імя або псеўданім",
|
||||
"next": "Далей",
|
||||
"no": "Не",
|
||||
"offline": "Па-за сеткай",
|
||||
"ok": "ОК",
|
||||
"online": "У сетцы",
|
||||
"open": "Адкрыць",
|
||||
"or": "або",
|
||||
"partner_list_user_photos": "Фота карыстальніка {user}",
|
||||
"pause": "Прыпыніць",
|
||||
"people": "Людзі",
|
||||
"permission_onboarding_back": "Назад",
|
||||
"permission_onboarding_continue_anyway": "Усё адно працягнуць",
|
||||
"photos": "Фота",
|
||||
"photos_and_videos": "Фота і відэа",
|
||||
"place": "Месца",
|
||||
"places": "Месцы",
|
||||
"port": "Порт",
|
||||
"previous": "Папярэдняе",
|
||||
"profile": "Профіль",
|
||||
"profile_drawer_app_logs": "Журналы",
|
||||
"profile_drawer_github": "GitHub",
|
||||
"purchase_button_buy": "Купіць",
|
||||
"purchase_button_buy_immich": "Купіць Immich",
|
||||
"purchase_button_select": "Выбраць",
|
||||
"remove": "Выдаліць",
|
||||
"remove_from_album": "Выдаліць з альбома",
|
||||
"remove_from_favorites": "Выдаліць з абраных",
|
||||
"remove_tag": "Выдаліць тэг",
|
||||
"remove_url": "Выдаліць URL-адрас",
|
||||
"remove_user": "Выдаліць карыстальніка",
|
||||
"rename": "Перайменаваць",
|
||||
"repository": "Рэпазіторый",
|
||||
"reset": "Скінуць",
|
||||
"reset_password": "Скінуць пароль",
|
||||
"restore": "Аднавіць",
|
||||
"restore_all": "Аднавіць усё",
|
||||
"restore_user": "Аднавіць карыстальніка",
|
||||
"resume": "Узнавіць",
|
||||
"role": "Роля",
|
||||
"role_editor": "Рэдактар",
|
||||
"role_viewer": "Глядач",
|
||||
"save": "Захаваць",
|
||||
"save_to_gallery": "Захаваць у галерэю",
|
||||
"search_filter_date": "Дата",
|
||||
"search_filter_location": "Месцазнаходжанне",
|
||||
"search_filter_location_title": "Выберыце месцазнаходжанне",
|
||||
"search_filter_media_type": "Тып медыя",
|
||||
"search_filter_media_type_title": "Выберыце тып медыя",
|
||||
"search_page_screenshots": "Здымкі экрана",
|
||||
"search_page_selfies": "Сэлфі",
|
||||
"search_page_things": "Рэчы",
|
||||
"search_page_your_map": "Ваша карта",
|
||||
"second": "Секунда",
|
||||
"send_message": "Адправіць паведамленне",
|
||||
"setting_languages_apply": "Ужыць",
|
||||
"setting_notifications_notify_never": "ніколі",
|
||||
"settings": "Налады",
|
||||
"share_add_photos": "Дадаць фота",
|
||||
"shared_album_section_people_title": "ЛЮДЗІ",
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"sharing_page_empty_list": "ПУСТЫ СПІС",
|
||||
"sign_out": "Выйсці",
|
||||
"sign_up": "Зарэгістравацца",
|
||||
"size": "Памер",
|
||||
"sort_title": "Загаловак",
|
||||
"source": "Крыніца",
|
||||
"tag": "Тэг",
|
||||
"tags": "Тэгі",
|
||||
"theme": "Тэма",
|
||||
"theme_selection": "Выбар тэмы",
|
||||
"timeline": "Хроніка",
|
||||
"total": "Усяго",
|
||||
"trash": "Сметніца",
|
||||
"trash_page_delete_all": "Выдаліць усе",
|
||||
"trash_page_restore_all": "Аднавіць усе",
|
||||
"trash_page_title": "Сметніца ({count})",
|
||||
"type": "Тып",
|
||||
"undo": "Адрабіць",
|
||||
"upload": "Запампаваць",
|
||||
"upload_status_errors": "Памылкі",
|
||||
"uploading": "Запампоўванне",
|
||||
"url": "URL-адрас",
|
||||
"user": "Карыстальнік",
|
||||
"user_has_been_deleted": "Гэты карыстальнік быў выдалены.",
|
||||
"user_id": "ID карыстальніка",
|
||||
"user_purchase_settings": "Купля",
|
||||
"user_purchase_settings_description": "Кіруйце пакупкамі",
|
||||
@@ -112,14 +461,14 @@
|
||||
"view_next_asset": "Паказаць наступны аб'ект",
|
||||
"view_previous_asset": "Праглядзець папярэдні аб'ект",
|
||||
"view_stack": "Прагляд стэка",
|
||||
"visibility_changed": "Відзімасць змянілася для {count, plural, one {# чалавек(-аў)} астатніх {# чалавек}}",
|
||||
"visibility_changed": "Бачнасць змянілася для {count, plural, one {# чалавека} other {# чалавек}}",
|
||||
"waiting": "Чакаюць",
|
||||
"warning": "Папярэджанне",
|
||||
"week": "Тыдзень",
|
||||
"welcome": "Вітаем",
|
||||
"welcome_to_immich": "Вітаем у Immich",
|
||||
"year": "Год",
|
||||
"years_ago": "{years, plural, one {# год} other {# гадоў}} таму",
|
||||
"years_ago": "{years, plural, one {# год} few {# гады} many {# гадоў} other {# гадоў}} таму",
|
||||
"yes": "Так",
|
||||
"you_dont_have_any_shared_links": "У вас няма абагуленых спасылак",
|
||||
"zoom_image": "Павялічыць відарыс"
|
||||
|
||||
45
i18n/bg.json
@@ -166,6 +166,20 @@
|
||||
"metadata_settings_description": "Управление на настройките за метаданни",
|
||||
"migration_job": "Миграция",
|
||||
"migration_job_description": "Мигриране на миниатюрите за елементи и лица към най-новата структура на папките",
|
||||
"nightly_tasks_cluster_faces_setting_description": "Изпълни разпознаване на лице за открити нови лица",
|
||||
"nightly_tasks_cluster_new_faces_setting": "Разпознаване на нови лица",
|
||||
"nightly_tasks_database_cleanup_setting": "Задачи по почистване на базата данни",
|
||||
"nightly_tasks_database_cleanup_setting_description": "Премахни стари, ненужни записи от базата данни",
|
||||
"nightly_tasks_generate_memories_setting": "Създаване на спомени",
|
||||
"nightly_tasks_generate_memories_setting_description": "Създаване на нови спомени от съществуващи обекти",
|
||||
"nightly_tasks_missing_thumbnails_setting": "Генериране на липсващи миниатюри",
|
||||
"nightly_tasks_missing_thumbnails_setting_description": "Добавяне на обекти без миниатюра в опашката за създаване на миниатюра",
|
||||
"nightly_tasks_settings": "Настройка на задачи за през нощта",
|
||||
"nightly_tasks_settings_description": "Управление на задачите, изпълнявани през нощта",
|
||||
"nightly_tasks_start_time_setting": "Време за начало",
|
||||
"nightly_tasks_start_time_setting_description": "Време, когато сървъра ще започне изпълнение на нощни задачи",
|
||||
"nightly_tasks_sync_quota_usage_setting": "Квота за синхронизация",
|
||||
"nightly_tasks_sync_quota_usage_setting_description": "Обновяване на квотата според текущото потребление",
|
||||
"no_paths_added": "Няма добавени пътища",
|
||||
"no_pattern_added": "Няма добавен модел",
|
||||
"note_apply_storage_label_previous_assets": "Забележка: За да приложите етикета за съхранение към предварително качени файлове, стартирайте",
|
||||
@@ -196,6 +210,8 @@
|
||||
"oauth_mobile_redirect_uri": "URI за мобилно пренасочване",
|
||||
"oauth_mobile_redirect_uri_override": "URI пренасочване за мобилни устройства",
|
||||
"oauth_mobile_redirect_uri_override_description": "Разреши когато доставчика за OAuth удостоверяване не позволява за мобилни URI идентификатори, като ''{callback}''",
|
||||
"oauth_role_claim": "Потвърждение на роля",
|
||||
"oauth_role_claim_description": "Автоматично предоставяне на административни права при наличие на това потвържение. Потвърждението може да има стойност 'user' или 'admin'.",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Управление на настройките за вход с OAuth",
|
||||
"oauth_settings_more_details": "За повече информация за функционалността, се потърсете в <link>docs</link>.",
|
||||
@@ -357,6 +373,8 @@
|
||||
"admin_password": "Администраторска парола",
|
||||
"administration": "Администрация",
|
||||
"advanced": "Разширено",
|
||||
"advanced_settings_beta_timeline_subtitle": "Опитайте новите функции на приложението",
|
||||
"advanced_settings_beta_timeline_title": "Бета версия на времевата линия",
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "При синхронизация, използвайте тази опция като филтър, основан на промяна на даден критерии. Опитайте само в случай, че приложението има проблем с откриване на всички албуми.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "[ЕКСПЕРИМЕНТАЛНО] Използвай филтъра на алтернативното устройство за синхронизация на албуми",
|
||||
"advanced_settings_log_level_title": "Ниво на запис в дневника: {level}",
|
||||
@@ -427,6 +445,7 @@
|
||||
"app_settings": "Настройки ма приложението",
|
||||
"appears_in": "Излиза в",
|
||||
"archive": "Архив",
|
||||
"archive_action_prompt": "{count} са добавени в Архива",
|
||||
"archive_or_unarchive_photo": "Архивиране или деархивиране на снимка",
|
||||
"archive_page_no_archived_assets": "Не са намерени обекти в архива",
|
||||
"archive_page_title": "Архив ({count})",
|
||||
@@ -464,7 +483,6 @@
|
||||
"assets": "Елементи",
|
||||
"assets_added_count": "Добавено {count, plural, one {# asset} other {# assets}}",
|
||||
"assets_added_to_album_count": "Добавен(и) са {count, plural, one {# актив} other {# актива}} в албума",
|
||||
"assets_added_to_name_count": "Добавен(и) са {count, plural, one {# актив} other {# актива}} към {hasName, select, true {<b>{name}</b>} other {нов албум}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Обекта не може да се добави} other {Обектите не може да се добавят}} в албума",
|
||||
"assets_count": "{count, plural, one {# актив} other {# актива}}",
|
||||
"assets_deleted_permanently": "{count} обекта са изтрити завинаги",
|
||||
@@ -490,6 +508,7 @@
|
||||
"back_close_deselect": "Назад, затваряне или премахване на избора",
|
||||
"background_location_permission": "Разрешение за достъп до местоположението във фонов режим",
|
||||
"background_location_permission_content": "За да може да чете имената на Wi-Fi мрежите и да ги превключва при работа във фонов режим, Immich трябва *винаги* да има достъп до точното местоположение",
|
||||
"backup": "Архивиране",
|
||||
"backup_album_selection_page_albums_device": "Албуми на устройството ({count})",
|
||||
"backup_album_selection_page_albums_tap": "Натисни за да включиш, двойно за да изключиш",
|
||||
"backup_album_selection_page_assets_scatter": "Обектите могат да бъдат разпръснати в няколко албума. По този начин албумите могат да бъдат включени или изключени по време на процеса на архивиране.",
|
||||
@@ -703,7 +722,7 @@
|
||||
"daily_title_text_date": "E, dd MMM",
|
||||
"daily_title_text_date_year": "E, dd MMM yyyy",
|
||||
"dark": "Тъмен",
|
||||
"darkTheme": "Превключи на тъмна тема",
|
||||
"dark_theme": "Тъмна тема",
|
||||
"date_after": "Дата след",
|
||||
"date_and_time": "Дата и час",
|
||||
"date_before": "Дата преди",
|
||||
@@ -719,6 +738,7 @@
|
||||
"default_locale": "Локализация по подразбиране",
|
||||
"default_locale_description": "Форматиране на дати и числа в зависимост от езиковата настройка на браузъра",
|
||||
"delete": "Изтрий",
|
||||
"delete_action_prompt": "{count} са изтрити завинаги",
|
||||
"delete_album": "Изтрий албум",
|
||||
"delete_api_key_prompt": "Сигурни ли сте, че искате да изтриете този API ключ?",
|
||||
"delete_dialog_alert": "Тези обекти ще бъдат изтрити завинаги и от Immich сървъра и от устройството",
|
||||
@@ -732,19 +752,20 @@
|
||||
"delete_key": "Изтрий ключ",
|
||||
"delete_library": "Изтрий библиотека",
|
||||
"delete_link": "Изтрий линк",
|
||||
"delete_local_action_prompt": "{count} са изтрити локално",
|
||||
"delete_local_dialog_ok_backed_up_only": "Изтрий локално само архивираните",
|
||||
"delete_local_dialog_ok_force": "Въпреки това изтрий",
|
||||
"delete_others": "Изтрий останалите",
|
||||
"delete_shared_link": "Изтриване на споделен линк",
|
||||
"delete_shared_link_dialog_title": "Изтрий споделената връзка",
|
||||
"delete_tag": "Изтрий таг",
|
||||
"delete_tag_confirmation_prompt": "Сигурни ли сте, че искате да изтриете таг {tagName}?",
|
||||
"delete_tag_confirmation_prompt": "Сигурни ли сте, че искате да изтриете тага {tagName}?",
|
||||
"delete_user": "Изтрий потребител",
|
||||
"deleted_shared_link": "Изтрит споделен линк",
|
||||
"deletes_missing_assets": "Изтрива файлове, които липсват на диска",
|
||||
"description": "Описание",
|
||||
"description_input_hint_text": "Добави описание...",
|
||||
"description_input_submit_error": "Неуспешно обновяване на описанието. За подробности виж в дневника",
|
||||
"description_input_submit_error": "Неуспешно обновяване на описанието. За подробности вижте в дневника",
|
||||
"details": "Детайли",
|
||||
"direction": "Посока",
|
||||
"disabled": "Изключено",
|
||||
@@ -762,6 +783,7 @@
|
||||
"documentation": "Документация",
|
||||
"done": "Готово",
|
||||
"download": "Изтегли",
|
||||
"download_action_prompt": "Зареждане на {count} обекта",
|
||||
"download_canceled": "Изтеглянето е отменено",
|
||||
"download_complete": "Изтеглянето завърши",
|
||||
"download_enqueue": "Изтеглянето е добавено в опашката",
|
||||
@@ -799,6 +821,7 @@
|
||||
"edit_key": "Редактиране на ключ",
|
||||
"edit_link": "Редактиране на линк",
|
||||
"edit_location": "Редактиране на местоположението",
|
||||
"edit_location_action_prompt": "{count} локации са редактирани",
|
||||
"edit_location_dialog_title": "Местоположение",
|
||||
"edit_name": "Редактиране на име",
|
||||
"edit_people": "Редактиране на хора",
|
||||
@@ -984,6 +1007,7 @@
|
||||
"failed_to_load_assets": "Неуспешно зареждане на елементи",
|
||||
"failed_to_load_folder": "Неуспешно зареждане на папка",
|
||||
"favorite": "Любим",
|
||||
"favorite_action_prompt": "{count} са добавени в Любими",
|
||||
"favorite_or_unfavorite_photo": "Добави или премахни снимка от Любими",
|
||||
"favorites": "Любими",
|
||||
"favorites_page_no_favorites": "Не са намерени любими обекти",
|
||||
@@ -1127,10 +1151,10 @@
|
||||
"library_page_sort_created": "Дата на създаване",
|
||||
"library_page_sort_last_modified": "Последна промяна",
|
||||
"library_page_sort_title": "Заглавие на албума",
|
||||
"licenses": "Лицензи",
|
||||
"light": "Светло",
|
||||
"like_deleted": "Като изтрит",
|
||||
"link_motion_video": "Линк към видео",
|
||||
"link_options": "Опции на линк за споделяне",
|
||||
"link_to_oauth": "Линк към OAuth",
|
||||
"linked_oauth_account": "Свързан OAuth акаунт",
|
||||
"list": "Лист",
|
||||
@@ -1193,7 +1217,6 @@
|
||||
"manage_your_devices": "Управление на влезлите в системата устройства",
|
||||
"manage_your_oauth_connection": "Управление на OAuth връзката",
|
||||
"map": "Карта",
|
||||
"map_assets_in_bound": "{count} снимки",
|
||||
"map_assets_in_bounds": "{count} снимки",
|
||||
"map_cannot_get_user_location": "Не можах да получа местоположението",
|
||||
"map_location_dialog_yes": "Да",
|
||||
@@ -1246,6 +1269,7 @@
|
||||
"more": "Още",
|
||||
"move": "Премести",
|
||||
"move_off_locked_folder": "Извади от заключената папка",
|
||||
"move_to_lock_folder_action_prompt": "{count} са добавени в заключената папка",
|
||||
"move_to_locked_folder": "Премести в заключена папка",
|
||||
"move_to_locked_folder_confirmation": "Тези снимки и видеа ще бъдат изтрити от всички албуми и ще са достъпни само в заключената папка",
|
||||
"moved_to_archive": "{count, plural, one {# обект е преместен} many {# обекта са преместени} other {# обекта са преместени}} в архива",
|
||||
@@ -1495,7 +1519,9 @@
|
||||
"remove_custom_date_range": "Премахни зададения диапазон от дати",
|
||||
"remove_deleted_assets": "Премахни Изтритите Елементи",
|
||||
"remove_from_album": "Премахни от албума",
|
||||
"remove_from_album_action_prompt": "{count} са премахнати от албума",
|
||||
"remove_from_favorites": "Премахни от Любими",
|
||||
"remove_from_lock_folder_action_prompt": "{count} са премахнати от заключената папка",
|
||||
"remove_from_locked_folder": "Махни от заключената папка",
|
||||
"remove_from_locked_folder_confirmation": "Сигурни ли си, че искате тези снимки и видеа да бъдат извадени от заключената папка? Те ще бъдат видими в библиотеката.",
|
||||
"remove_from_shared_link": "Премахни от споделения линк",
|
||||
@@ -1667,6 +1693,7 @@
|
||||
"settings_saved": "Настройките са запазени",
|
||||
"setup_pin_code": "Задай PIN код",
|
||||
"share": "Споделяне",
|
||||
"share_action_prompt": "{count} споделени обекта",
|
||||
"share_add_photos": "Добави снимки",
|
||||
"share_assets_selected": "{count} избрани",
|
||||
"share_dialog_preparing": "Подготовка...",
|
||||
@@ -1768,6 +1795,7 @@
|
||||
"sort_title": "Заглавие",
|
||||
"source": "Код",
|
||||
"stack": "Събери",
|
||||
"stack_action_prompt": "{count} са групирани",
|
||||
"stack_duplicates": "Подреждане на дубликати",
|
||||
"stack_select_one_photo": "Избери една главна снимка за събраните снимки",
|
||||
"stack_selected_photos": "Подреждане на избрани снимки",
|
||||
@@ -1838,6 +1866,7 @@
|
||||
"total": "Общо",
|
||||
"total_usage": "Общо използвано",
|
||||
"trash": "Кошче",
|
||||
"trash_action_prompt": "{count} са преместени в коша",
|
||||
"trash_all": "Изхвърли всички",
|
||||
"trash_count": "В Кошчето {count, number}",
|
||||
"trash_delete_asset": "Вкарай в Кошчето/Изтрий елемент",
|
||||
@@ -1855,9 +1884,11 @@
|
||||
"unable_to_change_pin_code": "Невъзможна промяна на PIN кода",
|
||||
"unable_to_setup_pin_code": "Неуспешно задаване на PIN кода",
|
||||
"unarchive": "Разархивирай",
|
||||
"unarchive_action_prompt": "{count} са премахнати от Архива",
|
||||
"unarchived_count": "{count, plural, other {Неархивирани #}}",
|
||||
"undo": "Отмени",
|
||||
"unfavorite": "Премахване от любимите",
|
||||
"unfavorite_action_prompt": "{count} са премахнати от Любими",
|
||||
"unhide_person": "Покажи отново човека",
|
||||
"unknown": "Неизвестно",
|
||||
"unknown_country": "Непозната Държава",
|
||||
@@ -1875,7 +1906,9 @@
|
||||
"unselect_all_duplicates": "От маркирай всички дубликати",
|
||||
"unselect_all_in": "Премахни избора на всички от групата {group}",
|
||||
"unstack": "Разкачи",
|
||||
"unstack_action_prompt": "{count} са разгрупирани",
|
||||
"unstacked_assets_count": "Разкачени {count, plural, one {# елемент} other {# елементи}}",
|
||||
"untagged": "Немаркирани",
|
||||
"up_next": "Следващ",
|
||||
"updated_at": "Обновено",
|
||||
"updated_password": "Паролата е актуализирана",
|
||||
|
||||
82
i18n/bn.json
@@ -8,6 +8,7 @@
|
||||
"actions": "কর্ম",
|
||||
"active": "সচল",
|
||||
"activity": "কার্যকলাপ",
|
||||
"activity_changed": "একটিভিটি এখন {enabled, select, true {চালু} other {বন্ধ}} আছে",
|
||||
"add": "যোগ করুন",
|
||||
"add_a_description": "একটি বিবরণ যোগ করুন",
|
||||
"add_a_location": "একটি অবস্থান যোগ করুন",
|
||||
@@ -15,5 +16,84 @@
|
||||
"add_a_title": "একটি শিরোনাম যোগ করুন",
|
||||
"add_endpoint": "এন্ডপয়েন্ট যোগ করুন",
|
||||
"add_exclusion_pattern": "বহির্ভূতকরণ নমুনা",
|
||||
"add_url": "লিঙ্ক যোগ করুন"
|
||||
"add_import_path": "ইমপোর্ট করার পাথ যুক্ত করুন",
|
||||
"add_location": "অবস্থান যুক্ত করুন",
|
||||
"add_more_users": "আরো ব্যবহারকারী যুক্ত করুন",
|
||||
"add_partner": "অংশীদার যোগ করুন",
|
||||
"add_path": "পাথ যুক্ত করুন",
|
||||
"add_photos": "ছবি যুক্ত করুন",
|
||||
"add_tag": "ট্যাগ যুক্ত করুন",
|
||||
"add_to": "যুক্ত করুন…",
|
||||
"add_to_album": "এলবাম এ যোগ করুন",
|
||||
"add_to_album_bottom_sheet_added": "{album} এ যোগ করা হয়েছে",
|
||||
"add_to_album_bottom_sheet_already_exists": "{album} এ আগে থেকেই আছে",
|
||||
"add_to_shared_album": "শেয়ার করা অ্যালবামে যোগ করুন",
|
||||
"add_url": "লিঙ্ক যোগ করুন",
|
||||
"added_to_archive": "আর্কাইভ এ যোগ করা হয়েছে",
|
||||
"added_to_favorites": "ফেভারিটে যোগ করা হয়েছে",
|
||||
"added_to_favorites_count": "পছন্দের তালিকায় {count, number} যোগ করা হয়েছে",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "এক্সক্লুশন প্যাটার্ন যোগ করুন। *, **, এবং ? ব্যবহার করে গ্লোবিং করা সম্ভব। \"Raw\" নামের যেকোনো ডিরেক্টরিতে থাকা সমস্ত ফাইল বাদ দিতে \"**/Raw/**\" ব্যবহার করুন। \".tif\" দিয়ে শেষ হওয়া সমস্ত ফাইল বাদ দিতে \"**/*.tif\" ব্যবহার করুন। একটি সম্পূর্ণ পাথ বাদ দিতে, \"/path/to/ignore/**\" ব্যবহার করুন।",
|
||||
"admin_user": "এডমিন ইউজার",
|
||||
"asset_offline_description": "এই বহিরাগত লাইব্রেরি সম্পদটি আর ডিস্কে পাওয়া যাচ্ছে না এবং ট্র্যাশে সরানো হয়েছে। যদি ফাইলটি লাইব্রেরির মধ্যে সরানো হয়ে থাকে, তাহলে নতুন সংশ্লিষ্ট সম্পদের জন্য আপনার টাইমলাইন পরীক্ষা করুন। এই সম্পদটি পুনরুদ্ধার করতে, দয়া করে নিশ্চিত করুন যে নীচের ফাইল পাথটি Immich দ্বারা অ্যাক্সেস করা যেতে পারে এবং লাইব্রেরিটি স্ক্যান করুন।",
|
||||
"authentication_settings": "প্রমাণীকরণ সেটিংস",
|
||||
"authentication_settings_description": "পাসওয়ার্ড, OAuth এবং অন্যান্য প্রমাণীকরণ সেটিংস পরিচালনা করুন",
|
||||
"authentication_settings_disable_all": "আপনি কি নিশ্চিত যে আপনি সমস্ত লগইন পদ্ধতি অক্ষম করতে চান? লগইন সম্পূর্ণরূপে অক্ষম করা হবে।",
|
||||
"authentication_settings_reenable": "পুনরায় সক্ষম করতে, একটি <link>সার্ভার কমান্ড</link> ব্যবহার করুন।",
|
||||
"background_task_job": "ব্যাকগ্রাউন্ড টাস্ক",
|
||||
"backup_database": "ডাটাবেস ডাম্প তৈরি করুন",
|
||||
"backup_database_enable_description": "ডাটাবেস ডাম্প সক্রিয় করুন",
|
||||
"backup_keep_last_amount": "আগের ডাম্পের পরিমাণ রাখা হবে",
|
||||
"backup_settings": "ডাটাবেস ডাম্প সেটিংস",
|
||||
"backup_settings_description": "ডাটাবেস ডাম্প সেটিংস পরিচালনা করুন।",
|
||||
"cleared_jobs": "{job} এর জন্য jobs খালি করা হয়েছে",
|
||||
"config_set_by_file": "কনফিগ বর্তমানে একটি কনফিগ ফাইল দ্বারা সেট করা আছে",
|
||||
"confirm_delete_library": "আপনি কি নিশ্চিত যে আপনি {library} লাইব্রেরি মুছে ফেলতে চান?",
|
||||
"confirm_delete_library_assets": "আপনি কি নিশ্চিত যে আপনি এই লাইব্রেরিটি মুছে ফেলতে চান? এটি Immich থেকে {count, plural, one {# contained asset} other {all # contained asset}} মুছে ফেলবে এবং পূর্বাবস্থায় ফেরানো যাবে না। ফাইলগুলি ডিস্কে থাকবে।",
|
||||
"confirm_email_below": "নিশ্চিত করতে, নিচে \"{email}\" টাইপ করুন",
|
||||
"confirm_reprocess_all_faces": "আপনি কি নিশ্চিত যে আপনি সমস্ত মুখ পুনরায় প্রক্রিয়া করতে চান? এটি নামযুক্ত ব্যক্তিদেরও মুছে ফেলবে।",
|
||||
"confirm_user_password_reset": "আপনি কি নিশ্চিত যে আপনি {user} এর পাসওয়ার্ড রিসেট করতে চান?",
|
||||
"confirm_user_pin_code_reset": "আপনি কি নিশ্চিত যে আপনি {user} এর পিন কোড রিসেট করতে চান?",
|
||||
"create_job": "job তৈরি করুন",
|
||||
"cron_expression": "ক্রোন এক্সপ্রেশন",
|
||||
"cron_expression_description": "ক্রোন ফর্ম্যাট ব্যবহার করে স্ক্যানিং ব্যবধান সেট করুন। আরও তথ্যের জন্য দয়া করে দেখুন যেমন <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "ক্রোন এক্সপ্রেশন প্রিসেট",
|
||||
"disable_login": "লগইন অক্ষম করুন",
|
||||
"duplicate_detection_job_description": "অনুরূপ ছবি সনাক্ত করতে সম্পদগুলিতে মেশিন লার্নিং চালান। স্মার্ট অনুসন্ধানের উপর নির্ভর করে",
|
||||
"exclusion_pattern_description": "এক্সক্লুশন প্যাটার্ন ব্যবহার করে আপনি আপনার লাইব্রেরি স্ক্যান করার সময় ফাইল এবং ফোল্ডারগুলিকে উপেক্ষা করতে পারবেন। যদি আপনার এমন ফোল্ডার থাকে যেখানে এমন ফাইল থাকে যা আপনি আমদানি করতে চান না, যেমন RAW ফাইল।",
|
||||
"external_library_management": "বহিরাগত গ্রন্থাগার ব্যবস্থাপনা",
|
||||
"face_detection": "মুখ সনাক্তকরণ",
|
||||
"face_detection_description": "মেশিন লার্নিং ব্যবহার করে অ্যাসেটে থাকা মুখ/চেহারা গুলি সনাক্ত করুন। ভিডিও গুলির জন্য, শুধুমাত্র থাম্বনেইল বিবেচনা করা হয়। \"রিফ্রেশ\" (পুনরায়) সমস্ত অ্যাসেট প্রক্রিয়া করে। \"রিসেট\" করার মাধ্যমে অতিরিক্তভাবে সমস্ত বর্তমান মুখের ডেটা সাফ করে। \"অনুপস্থিত\" অ্যাসেটগুলিকে সারিবদ্ধ করে যা এখনও প্রক্রিয়া করা হয়নি। সনাক্ত করা মুখগুলিকে ফেসিয়াল রিকগনিশনের জন্য সারিবদ্ধ করা হবে, ফেসিয়াল ডিটেকশন সম্পূর্ণ হওয়ার পরে, বিদ্যমান বা নতুন ব্যক্তিদের মধ্যে গোষ্ঠীবদ্ধ করে।",
|
||||
"facial_recognition_job_description": "শনাক্ত করা মুখগুলিকে মানুষের মধ্যে গোষ্ঠীভুক্ত করুন। মুখ সনাক্তকরণ সম্পূর্ণ হওয়ার পরে এই ধাপটি চলে। \"রিসেট\" (পুনরায়) সমস্ত মুখকে ক্লাস্টার করে। \"অনুপস্থিত\" মুখগুলিকে সারিতে রাখে যেখানে কোনও ব্যক্তিকে বরাদ্দ করা হয়নি।",
|
||||
"failed_job_command": "কমান্ড {command} কাজের জন্য ব্যর্থ হয়েছে: {job}",
|
||||
"force_delete_user_warning": "সতর্কতা: এটি ব্যবহারকারী এবং সমস্ত সম্পদ অবিলম্বে সরিয়ে ফেলবে। এটি পূর্বাবস্থায় ফেরানো যাবে না এবং ফাইলগুলি পুনরুদ্ধার করা যাবে না।",
|
||||
"image_format": "ফরম্যাট",
|
||||
"image_format_description": "WebP JPEG এর তুলনায় ছোট ফাইল তৈরি করে, কিন্তু এনকোড করতে ধীর।",
|
||||
"image_fullsize_description": "জুম ইন করার সময় ব্যবহৃত স্ট্রিপড মেটাডেটা সহ পূর্ণ আকারের ছবি",
|
||||
"image_fullsize_enabled": "পূর্ণ-আকারের ছবি তৈরি সক্ষম করুন",
|
||||
"image_fullsize_enabled_description": "ওয়েব-বান্ধব নয় এমন ফর্ম্যাটের জন্য পূর্ণ-আকারের ছবি তৈরি করুন। \"এমবেডেড প্রিভিউ পছন্দ করুন\" সক্ষম করা থাকলে, রূপান্তর ছাড়াই এমবেডেড প্রিভিউ সরাসরি ব্যবহার করা হয়। JPEG-এর মতো ওয়েব-বান্ধব ফর্ম্যাটগুলিকে প্রভাবিত করে না।",
|
||||
"image_fullsize_quality_description": "পূর্ণ-আকারের ছবির মান ১-১০০। উচ্চতর হলে ভালো, কিন্তু আরও বড় ফাইল তৈরি হয়।",
|
||||
"image_fullsize_title": "পূর্ণ-আকারের চিত্র সেটিংস",
|
||||
"image_prefer_embedded_preview": "এম্বেড করা প্রিভিউ পছন্দ করুন",
|
||||
"image_prefer_embedded_preview_setting_description": "ছবি প্রক্রিয়াকরণের জন্য এবং যখনই উপলব্ধ থাকবে তখন RAW ফটোতে এমবেডেড প্রিভিউ ব্যবহার করুন। এটি কিছু ছবির জন্য আরও সঠিক রঙ তৈরি করতে পারে, তবে প্রিভিউয়ের মান ক্যামেরা-নির্ভর এবং ছবিতে আরও কম্প্রেশন আর্টিফ্যাক্ট থাকতে পারে।",
|
||||
"image_prefer_wide_gamut": "প্রশস্ত পরিসর পছন্দ করুন",
|
||||
"image_prefer_wide_gamut_setting_description": "থাম্বনেইলের জন্য ডিসপ্লে P3 ব্যবহার করুন। এটি প্রশস্ত রঙের স্থান সহ ছবির প্রাণবন্ততা আরও ভালভাবে সংরক্ষণ করে, তবে পুরানো ব্রাউজার সংস্করণ সহ পুরানো ডিভাইসগুলিতে ছবিগুলি ভিন্নভাবে প্রদর্শিত হতে পারে। রঙের পরিবর্তন এড়াতে sRGB ছবিগুলিকে sRGB হিসাবে রাখা হয়।",
|
||||
"image_preview_description": "স্ট্রিপড মেটাডেটা সহ মাঝারি আকারের ছবি, একটি একক সম্পদ দেখার সময় এবং মেশিন লার্নিংয়ের জন্য ব্যবহৃত হয়",
|
||||
"image_preview_quality_description": "১-১০০ এর মধ্যে প্রিভিউ কোয়ালিটি। বেশি হলে ভালো, কিন্তু বড় ফাইল তৈরি হয় এবং অ্যাপের প্রতিক্রিয়াশীলতা কমাতে পারে। কম মান সেট করলে মেশিন লার্নিং কোয়ালিটির উপর প্রভাব পড়তে পারে।",
|
||||
"image_preview_title": "প্রিভিউ সেটিংস",
|
||||
"image_quality": "গুণমান",
|
||||
"image_resolution": "রেজোলিউশন",
|
||||
"image_resolution_description": "উচ্চ রেজোলিউশনের ক্ষেত্রে আরও বিস্তারিত তথ্য সংরক্ষণ করা সম্ভব কিন্তু এনকোড করতে বেশি সময় লাগে, ফাইলের আকার বড় হয় এবং অ্যাপের প্রতিক্রিয়াশীলতা কমাতে পারে।",
|
||||
"image_settings": "চিত্র সেটিংস",
|
||||
"image_settings_description": "তৈরি করা ছবির মান এবং রেজোলিউশন পরিচালনা করুন",
|
||||
"image_thumbnail_description": "মেটাডেটা বাদ দেওয়া ছোট থাম্বনেইল, মূল টাইমলাইনের মতো ছবির গ্রুপ দেখার সময় ব্যবহৃত হয়",
|
||||
"image_thumbnail_quality_description": "থাম্বনেইলের মান ১-১০০। বেশি হলে ভালো, কিন্তু বড় ফাইল তৈরি হয় এবং অ্যাপের প্রতিক্রিয়াশীলতা কমাতে পারে।",
|
||||
"image_thumbnail_title": "থাম্বনেল সেটিংস",
|
||||
"job_concurrency": "{job} কনকারেন্সি",
|
||||
"job_created": "Job তৈরি হয়েছে",
|
||||
"job_not_concurrency_safe": "এই কাজটি সমকালীন-নিরাপদ নয়।",
|
||||
"job_settings": "কাজের সেটিংস",
|
||||
"job_settings_description": "কাজের সমান্তরালতা পরিচালনা করুন",
|
||||
"job_status": "চাকরির অবস্থা"
|
||||
}
|
||||
}
|
||||
|
||||
27
i18n/ca.json
@@ -166,6 +166,10 @@
|
||||
"metadata_settings_description": "Administrar la configuració de les metadades",
|
||||
"migration_job": "Migració",
|
||||
"migration_job_description": "Migra les miniatures d'elements i cares cap a la nova estructura de carpetes",
|
||||
"nightly_tasks_cluster_new_faces_setting": "Agrupa cares noves",
|
||||
"nightly_tasks_database_cleanup_setting": "Tasques de neteja de la base de dades",
|
||||
"nightly_tasks_database_cleanup_setting_description": "Netegeu les dades antigues i caducades de la base de dades",
|
||||
"nightly_tasks_missing_thumbnails_setting": "Generar les miniatures restants",
|
||||
"no_paths_added": "No s'ha afegit cap ruta",
|
||||
"no_pattern_added": "Cap patró aplicat",
|
||||
"note_apply_storage_label_previous_assets": "Nota: Per aplicar l'etiquetatge d'emmagatzematge a elements pujats prèviament, executeu la",
|
||||
@@ -196,6 +200,8 @@
|
||||
"oauth_mobile_redirect_uri": "URI de redirecció mòbil",
|
||||
"oauth_mobile_redirect_uri_override": "Sobreescriu l'URI de redirecció mòbil",
|
||||
"oauth_mobile_redirect_uri_override_description": "Habilita quan el proveïdor d'OAuth no permet una URI mòbil, com ara ''{callback}''",
|
||||
"oauth_role_claim": "Concessió de rol",
|
||||
"oauth_role_claim_description": "Atorgar accés d'administrador automàticament segons la presència d'aquesta concessió. La concessió pot ser 'usuari' o 'admin'.",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Gestiona la configuració de l'inici de sessió OAuth",
|
||||
"oauth_settings_more_details": "Per a més detalls sobre aquesta funcionalitat, consulteu la <link>documentació</link>.",
|
||||
@@ -244,6 +250,7 @@
|
||||
"storage_template_migration_info": "Les extensions es convertiran a minúscules. Els canvis de plantilla només s'aplicaran a nous elements. Per aplicar la plantilla rectroactivament a elements pujats prèviament, executeu la <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Tasca de migració de la plantilla d'emmagatzematge",
|
||||
"storage_template_more_details": "Per obtenir més detalls sobre aquesta funció, consulteu la <template-link>Storage Template</template-link> i les seves <implications-link>implications</implications-link>",
|
||||
"storage_template_onboarding_description_v2": "Un cop habilitada, aquesta funció organitzarà automàticament els fitxers a partir d'una plantilla definida per l'usuari. Per a més informació, podeu consultar la <link>documentació</link>.",
|
||||
"storage_template_path_length": "Límit aproximat de longitud de la ruta: <b>{length, number}</b>/{limit, number}",
|
||||
"storage_template_settings": "Plantilla d'emmagatzematge",
|
||||
"storage_template_settings_description": "Gestiona l'estructura de les carpetes i el nom del fitxers dels elements pujats",
|
||||
@@ -359,7 +366,7 @@
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Feu servir aquesta opció per filtrar els continguts multimèdia durant la sincronització segons criteris alternatius. Només proveu-ho si teniu problemes amb l'aplicació per detectar tots els àlbums.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "Utilitza el filtre de sincronització d'àlbums de dispositius alternatius",
|
||||
"advanced_settings_log_level_title": "Nivell de registre: {level}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Alguns dispositius són molt lents en carregar miniatures dels elements del dispositiu. Activeu aquest paràmetre per carregar imatges remotes en el seu lloc.",
|
||||
"advanced_settings_prefer_remote_subtitle": "Alguns dispositius són molt lents en carregar miniatures dels elements locals. Activeu aquest paràmetre per carregar imatges remotes en el seu lloc.",
|
||||
"advanced_settings_prefer_remote_title": "Prefereix imatges remotes",
|
||||
"advanced_settings_proxy_headers_subtitle": "Definiu les capçaleres de proxy que Immich per enviar amb cada sol·licitud de xarxa",
|
||||
"advanced_settings_proxy_headers_title": "Capçaleres de proxy",
|
||||
@@ -426,6 +433,7 @@
|
||||
"app_settings": "Configuració de l'app",
|
||||
"appears_in": "Apareix a",
|
||||
"archive": "Arxiu",
|
||||
"archive_action_prompt": "{count} afegit a Arxiu",
|
||||
"archive_or_unarchive_photo": "Arxivar o desarxivar fotografia",
|
||||
"archive_page_no_archived_assets": "No s'ha trobat res arxivat",
|
||||
"archive_page_title": "Arxiu({count})",
|
||||
@@ -463,7 +471,6 @@
|
||||
"assets": "Elements",
|
||||
"assets_added_count": "{count, plural, one {Afegit un element} other {Afegits # elements}}",
|
||||
"assets_added_to_album_count": "{count, plural, one {Afegit un element} other {Afegits # elements}} a l'àlbum",
|
||||
"assets_added_to_name_count": "{count, plural, one {S'ha afegit # recurs} other {S'han afegit # recursos}} a {hasName, select, true {<b>{name}</b>} other {new album}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} no es pot afegir a l'àlbum",
|
||||
"assets_count": "{count, plural, one {# recurs} other {# recursos}}",
|
||||
"assets_deleted_permanently": "{count} element(s) esborrats permanentment",
|
||||
@@ -489,6 +496,7 @@
|
||||
"back_close_deselect": "Tornar, tancar o anul·lar la selecció",
|
||||
"background_location_permission": "Permís d'ubicació en segon pla",
|
||||
"background_location_permission_content": "Per canviar de xarxa quan s'executa en segon pla, Immich ha de *sempre* tenir accés a la ubicació precisa perquè l'aplicació pugui llegir el nom de la xarxa Wi-Fi",
|
||||
"backup": "Còpia",
|
||||
"backup_album_selection_page_albums_device": "Àlbums al dispositiu ({count})",
|
||||
"backup_album_selection_page_albums_tap": "Un toc per incloure, doble toc per excloure",
|
||||
"backup_album_selection_page_assets_scatter": "Els elements poden dispersar-se en diversos àlbums. Per tant, els àlbums es poden incloure o excloure durant el procés de còpia de seguretat.",
|
||||
@@ -702,7 +710,7 @@
|
||||
"daily_title_text_date": "E, dd MMM",
|
||||
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
||||
"dark": "Fosc",
|
||||
"darkTheme": "Activa/desactiva el tema fosc",
|
||||
"dark_theme": "Canviar a tema fosc",
|
||||
"date_after": "Data posterior a",
|
||||
"date_and_time": "Data i hora",
|
||||
"date_before": "Data anterior a",
|
||||
@@ -718,6 +726,7 @@
|
||||
"default_locale": "Localització predeterminada",
|
||||
"default_locale_description": "Format de dates i números segons la configuració del navegador",
|
||||
"delete": "Esborra",
|
||||
"delete_action_prompt": "{count} eliminats permanentment",
|
||||
"delete_album": "Esborra l'àlbum",
|
||||
"delete_api_key_prompt": "Esteu segurs que voleu eliminar aquesta clau API?",
|
||||
"delete_dialog_alert": "Aquests elements seran eliminats de manera permanent d'Immich i del vostre dispositiu",
|
||||
@@ -798,6 +807,7 @@
|
||||
"edit_key": "Edita clau",
|
||||
"edit_link": "Edita enllaç",
|
||||
"edit_location": "Edita ubicació",
|
||||
"edit_location_action_prompt": "{count} ubicacions editades",
|
||||
"edit_location_dialog_title": "Ubicació",
|
||||
"edit_name": "Edita el nom",
|
||||
"edit_people": "Edita la gent",
|
||||
@@ -983,6 +993,7 @@
|
||||
"failed_to_load_assets": "Error carregant recursos",
|
||||
"failed_to_load_folder": "No s'ha pogut carregar la carpeta",
|
||||
"favorite": "Preferit",
|
||||
"favorite_action_prompt": "{count} afegit a Favorits",
|
||||
"favorite_or_unfavorite_photo": "Foto preferida o no preferida",
|
||||
"favorites": "Preferits",
|
||||
"favorites_page_no_favorites": "No s'han trobat preferits",
|
||||
@@ -1129,7 +1140,6 @@
|
||||
"light": "Llum",
|
||||
"like_deleted": "M'agrada suprimit",
|
||||
"link_motion_video": "Enllaçar vídeo en moviment",
|
||||
"link_options": "Opcions d'enllaç",
|
||||
"link_to_oauth": "Enllaç a OAuth",
|
||||
"linked_oauth_account": "Compte OAuth enllaçat",
|
||||
"list": "Llista",
|
||||
@@ -1149,6 +1159,7 @@
|
||||
"locked_folder": "Carpeta bloquejada",
|
||||
"log_out": "Tanca la sessió",
|
||||
"log_out_all_devices": "Tanqueu la sessió de tots els dispositius",
|
||||
"logged_in_as": "Sessió iniciada com a {user}",
|
||||
"logged_out_all_devices": "S'ha tancat la sessió de tots els dispositius",
|
||||
"logged_out_device": "Dispositiu tancat",
|
||||
"login": "Iniciar sessió",
|
||||
@@ -1191,7 +1202,6 @@
|
||||
"manage_your_devices": "Gestioneu els vostres dispositius connectats",
|
||||
"manage_your_oauth_connection": "Gestioneu la vostra connexió OAuth",
|
||||
"map": "Mapa",
|
||||
"map_assets_in_bound": "{count} foto",
|
||||
"map_assets_in_bounds": "{count} fotos",
|
||||
"map_cannot_get_user_location": "No es pot obtenir la ubicació de l'usuari",
|
||||
"map_location_dialog_yes": "Sí",
|
||||
@@ -1244,6 +1254,7 @@
|
||||
"more": "Més",
|
||||
"move": "Moure",
|
||||
"move_off_locked_folder": "Moure fora de la carpeta bloquejada",
|
||||
"move_to_lock_folder_action_prompt": "{count} afegides a la carpeta protegida",
|
||||
"move_to_locked_folder": "Moure a la carpeta bloquejada",
|
||||
"move_to_locked_folder_confirmation": "Aquestes fotos i vídeos seran eliminades de tots els àlbums, i només podran ser vistes des de la carpeta bloquejada",
|
||||
"moved_to_archive": "S'han mogut {count, plural, one {# asset} other {# assets}} a l'arxiu",
|
||||
@@ -1494,6 +1505,7 @@
|
||||
"remove_deleted_assets": "Suprimeix fitxers fora de línia",
|
||||
"remove_from_album": "Treu de l'àlbum",
|
||||
"remove_from_favorites": "Eliminar dels preferits",
|
||||
"remove_from_lock_folder_action_prompt": "{count} eliminades de la carpeta protegida",
|
||||
"remove_from_locked_folder": "Elimina de la carpeta bloquejada",
|
||||
"remove_from_locked_folder_confirmation": "Segur que vols moure aquestes fotos i vídeos fora de la carpeta bloquejada? Seran visibles a la teva biblioteca.",
|
||||
"remove_from_shared_link": "Eliminar de l'enllaç compartit",
|
||||
@@ -1606,6 +1618,7 @@
|
||||
"select_album_cover": "Seleccionar la portada de l'àlbum",
|
||||
"select_all": "Selecciona-ho tot",
|
||||
"select_all_duplicates": "Seleccioneu tots els duplicats",
|
||||
"select_all_in": "Selecciona tot en {group}",
|
||||
"select_avatar_color": "Tria color de l'avatar",
|
||||
"select_face": "Selecciona cara",
|
||||
"select_featured_photo": "Selecciona foto principal",
|
||||
@@ -1835,6 +1848,7 @@
|
||||
"total": "Total",
|
||||
"total_usage": "Ús total",
|
||||
"trash": "Paperera",
|
||||
"trash_action_prompt": "{count} mogudes a la brossa",
|
||||
"trash_all": "Envia-ho tot a la paperera",
|
||||
"trash_count": "Paperera {count, number}",
|
||||
"trash_delete_asset": "Esborra/Elimina element",
|
||||
@@ -1852,9 +1866,11 @@
|
||||
"unable_to_change_pin_code": "No es pot canviar el codi PIN",
|
||||
"unable_to_setup_pin_code": "No s'ha pogut configurar el codi PIN",
|
||||
"unarchive": "Desarxivar",
|
||||
"unarchive_action_prompt": "{count} eliminades de l'arxiu",
|
||||
"unarchived_count": "{count, plural, other {# elements desarxivats}}",
|
||||
"undo": "Desfer",
|
||||
"unfavorite": "Reverteix preferit",
|
||||
"unfavorite_action_prompt": "{count} eliminades de preferits",
|
||||
"unhide_person": "Mostra persona",
|
||||
"unknown": "Desconegut",
|
||||
"unknown_country": "País Desconegut",
|
||||
@@ -1870,6 +1886,7 @@
|
||||
"unsaved_change": "Canvi no desat",
|
||||
"unselect_all": "Deselecciona-ho tot",
|
||||
"unselect_all_duplicates": "Desmarqueu tots els duplicats",
|
||||
"unselect_all_in": "Desseleccionar tots els elements de {group}",
|
||||
"unstack": "Desapila",
|
||||
"unstacked_assets_count": "No apilat {count, plural, one {# recurs} other {# recursos}}",
|
||||
"up_next": "Pròxim",
|
||||
|
||||
123
i18n/cs.json
@@ -14,6 +14,7 @@
|
||||
"add_a_location": "Přidat polohu",
|
||||
"add_a_name": "Přidat jméno",
|
||||
"add_a_title": "Přidat název",
|
||||
"add_birthday": "Přidat datum narození",
|
||||
"add_endpoint": "Přidat koncový bod",
|
||||
"add_exclusion_pattern": "Přidat vzor vyloučení",
|
||||
"add_import_path": "Přidat cestu importu",
|
||||
@@ -44,7 +45,14 @@
|
||||
"backup_database": "Vytvořit výpis databáze",
|
||||
"backup_database_enable_description": "Povolit výpisy z databáze",
|
||||
"backup_keep_last_amount": "Počet předchozích výpisů, které se mají ponechat",
|
||||
"backup_settings": "Nastavení výpisu databáze",
|
||||
"backup_onboarding_1_description": "kopie v cloudu nebo na jiném fyzickém místě.",
|
||||
"backup_onboarding_2_description": "místní kopie na různých zařízeních. To zahrnuje hlavní soubory a jejich místní zálohu.",
|
||||
"backup_onboarding_3_description": "kompletní kopie vašich dat, včetně původních souborů. To zahrnuje 1 kopii na jiném místě a 2 místní kopie.",
|
||||
"backup_onboarding_description": "K ochraně vašich dat doporučujeme strategii zálohování <backblaze-link>3-2-1</backblaze-link>. Pro komplexní zálohování byste měli uchovávat kopie nahraných fotografií/videí i databáze Immich.",
|
||||
"backup_onboarding_footer": "Další informace o zálohování Immiche naleznete v <link>dokumentaci</link>.",
|
||||
"backup_onboarding_parts_title": "Záloha 3-2-1 zahrnuje:",
|
||||
"backup_onboarding_title": "Zálohy",
|
||||
"backup_settings": "Zálohování databáze",
|
||||
"backup_settings_description": "Správa nastavení výpisu databáze.",
|
||||
"cleared_jobs": "Hotové úlohy pro: {job}",
|
||||
"config_set_by_file": "Konfigurace je aktuálně prováděna konfiguračním souborem",
|
||||
@@ -166,6 +174,20 @@
|
||||
"metadata_settings_description": "Správa nastavení metadat",
|
||||
"migration_job": "Migrace",
|
||||
"migration_job_description": "Migrace miniatur snímků a obličejů do nejnovější struktury složek",
|
||||
"nightly_tasks_cluster_faces_setting_description": "Spustit rozpoznávání obličeje na nově nalezených obličejích",
|
||||
"nightly_tasks_cluster_new_faces_setting": "Seskupit nové tváře",
|
||||
"nightly_tasks_database_cleanup_setting": "Úlohy čištění databáze",
|
||||
"nightly_tasks_database_cleanup_setting_description": "Vyčistit databázi od starých dat, jejichž platnost vypršela",
|
||||
"nightly_tasks_generate_memories_setting": "Vytváření vzpomínek",
|
||||
"nightly_tasks_generate_memories_setting_description": "Vytváření nových vzpomínek z položek",
|
||||
"nightly_tasks_missing_thumbnails_setting": "Generovat chybějící miniatury",
|
||||
"nightly_tasks_missing_thumbnails_setting_description": "Řadit položky bez miniatur do fronty pro generování miniatur",
|
||||
"nightly_tasks_settings": "Noční úlohy",
|
||||
"nightly_tasks_settings_description": "Správa nočních úkolů",
|
||||
"nightly_tasks_start_time_setting": "Čas zahájení",
|
||||
"nightly_tasks_start_time_setting_description": "Čas, kdy server spustí noční úlohy",
|
||||
"nightly_tasks_sync_quota_usage_setting": "Synchronizace využití kvóty",
|
||||
"nightly_tasks_sync_quota_usage_setting_description": "Aktualizovat kvótu úložiště uživatele na základě aktuálního využití",
|
||||
"no_paths_added": "Nebyly přidány žádné cesty",
|
||||
"no_pattern_added": "Nebyl přidán žádný vzor",
|
||||
"note_apply_storage_label_previous_assets": "Upozornění: Pro uplatnění Štítku úložiště na dříve nahrané položky spusťte",
|
||||
@@ -196,6 +218,8 @@
|
||||
"oauth_mobile_redirect_uri": "Mobilní přesměrování URI",
|
||||
"oauth_mobile_redirect_uri_override": "Přepsat mobilní přesměrování URI",
|
||||
"oauth_mobile_redirect_uri_override_description": "Povolit, pokud poskytovatel OAuth nepovoluje mobilní URI, například ''{callback}''",
|
||||
"oauth_role_claim": "Deklarace Role",
|
||||
"oauth_role_claim_description": "Automaticky udělit přístup správce na základě přítomnosti této deklarace. Deklarace může mít hodnotu 'user' nebo 'admin'.",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Správa nastavení OAuth přihlášení",
|
||||
"oauth_settings_more_details": "Další podrobnosti o této funkci naleznete v <link>dokumentaci</link>.",
|
||||
@@ -357,10 +381,12 @@
|
||||
"admin_password": "Heslo správce",
|
||||
"administration": "Administrace",
|
||||
"advanced": "Pokročilé",
|
||||
"advanced_settings_beta_timeline_subtitle": "Vyzkoušejte nové prostředí aplikace",
|
||||
"advanced_settings_beta_timeline_title": "Beta verze časové osy",
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Tuto možnost použijte k filtrování médií během synchronizace na základě alternativních kritérií. Tuto možnost vyzkoušejte pouze v případě, že máte problémy s detekcí všech alb v aplikaci.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTÁLNÍ] Použít alternativní filtr pro synchronizaci alb zařízení",
|
||||
"advanced_settings_log_level_title": "Úroveň protokolování: {level}",
|
||||
"advanced_settings_prefer_remote_subtitle": "U některých zařízení je načítání miniatur z prostředků v zařízení velmi pomalé. Aktivujte toto nastavení, aby se místo toho načítaly vzdálené obrázky.",
|
||||
"advanced_settings_prefer_remote_subtitle": "U některých zařízení je načítání miniatur z lokálních prostředků velmi pomalé. Aktivujte toto nastavení, aby se místo toho načítaly vzdálené obrázky.",
|
||||
"advanced_settings_prefer_remote_title": "Preferovat vzdálené obrázky",
|
||||
"advanced_settings_proxy_headers_subtitle": "Definice hlaviček proxy serveru, které by měl Immich odesílat s každým síťovým požadavkem",
|
||||
"advanced_settings_proxy_headers_title": "Proxy hlavičky",
|
||||
@@ -379,6 +405,7 @@
|
||||
"album_cover_updated": "Obal alba aktualizován",
|
||||
"album_delete_confirmation": "Opravdu chcete album {album} odstranit?",
|
||||
"album_delete_confirmation_description": "Pokud je toto album sdíleno, ostatní uživatelé k němu již nebudou mít přístup.",
|
||||
"album_deleted": "Album smazáno",
|
||||
"album_info_card_backup_album_excluded": "VYLOUČENO",
|
||||
"album_info_card_backup_album_included": "ZAHRNUTO",
|
||||
"album_info_updated": "Informace o albu aktualizovány",
|
||||
@@ -388,6 +415,7 @@
|
||||
"album_options": "Možnosti alba",
|
||||
"album_remove_user": "Odebrat uživatele?",
|
||||
"album_remove_user_confirmation": "Opravdu chcete odebrat uživatele {user}?",
|
||||
"album_search_not_found": "Nebyla nalezena žádná alba odpovídající vašemu hledání",
|
||||
"album_share_no_users": "Zřejmě jste toto album sdíleli se všemi uživateli, nebo nemáte žádného uživatele, se kterým byste ho mohli sdílet.",
|
||||
"album_updated": "Album aktualizováno",
|
||||
"album_updated_setting_description": "Dostávat e-mailová oznámení o nových položkách sdíleného alba",
|
||||
@@ -407,6 +435,7 @@
|
||||
"albums_default_sort_order": "Výchozí řazení alb",
|
||||
"albums_default_sort_order_description": "Výchozí řazení položek při vytváření nových alb.",
|
||||
"albums_feature_description": "Sbírky položek, které lze sdílet s ostatními uživateli.",
|
||||
"albums_on_device_count": "Alba v zařízení ({count})",
|
||||
"all": "Vše",
|
||||
"all_albums": "Všechna alba",
|
||||
"all_people": "Všichni lidé",
|
||||
@@ -427,7 +456,8 @@
|
||||
"app_settings": "Aplikace",
|
||||
"appears_in": "Vyskytuje se v",
|
||||
"archive": "Archiv",
|
||||
"archive_or_unarchive_photo": "Archivovat nebo odarchivovat fotku",
|
||||
"archive_action_prompt": "{count} přidaných do archivu",
|
||||
"archive_or_unarchive_photo": "Přidat nebo odebrat fotku z archivu",
|
||||
"archive_page_no_archived_assets": "Nebyla nalezena žádná archivovaná média",
|
||||
"archive_page_title": "Archiv ({count})",
|
||||
"archive_size": "Velikost archivu",
|
||||
@@ -464,14 +494,13 @@
|
||||
"assets": "Položky",
|
||||
"assets_added_count": "{count, plural, one {Přidána # položka} few {Přidány # položky} other {Přidáno # položek}}",
|
||||
"assets_added_to_album_count": "Do alba {count, plural, one {byla přidána # položka} few {byly přidány # položky} other {bylo přidáno # položek}}",
|
||||
"assets_added_to_name_count": "{count, plural, one {Přidána # položka} few {Přidány # položky} other {Přidáno # položek}} do {hasName, select, true {alba <b>{name}</b>} other {nového alba}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Položku} other {Položky}} nelze přidat do alba",
|
||||
"assets_count": "{count, plural, one {# položka} few {# položky} other {# položek}}",
|
||||
"assets_deleted_permanently": "{count} položek trvale odstraněno",
|
||||
"assets_deleted_permanently_from_server": "{count} položek trvale odstraněno z Immich serveru",
|
||||
"assets_downloaded_failed": "{count, plural, one {Stažen # soubor - {error} souborů selhalo} few {Staženy # soubory - {error} souborů selhalo} other {Staženo # souborů - {error} souborů selhalo}}",
|
||||
"assets_downloaded_successfully": "{count, plural, one {Úspěšně stažen # soubor} few {Úspěšně staženy # soubory} other {Úspěšně staženo # souborů}}",
|
||||
"assets_moved_to_trash_count": "Do koše {count, plural, one {přesunuta # položka} few {přesunuty # položky} other {přesunuto # položek}}",
|
||||
"assets_moved_to_trash_count": "{count, plural, one {# položka přesunuta} few {# položky přesunuty} other {# položek přesunuto}} do koše",
|
||||
"assets_permanently_deleted_count": "Trvale {count, plural, one {smazána # položka} few {smazány # položky} other {smazáno # položek}}",
|
||||
"assets_removed_count": "{count, plural, one {Odstraněna # položka} few {Odstraněny # položky} other {Odstraněno # položek}}",
|
||||
"assets_removed_permanently_from_device": "{count} položek trvale odstraněno z vašeho zařízení",
|
||||
@@ -490,6 +519,7 @@
|
||||
"back_close_deselect": "Zpět, zavřít nebo zrušit výběr",
|
||||
"background_location_permission": "Povolení polohy na pozadí",
|
||||
"background_location_permission_content": "Aby bylo možné přepínat sítě při běhu na pozadí, musí mít Immich *vždy* přístup k přesné poloze, aby mohl zjistit název Wi-Fi sítě",
|
||||
"backup": "Záloha",
|
||||
"backup_album_selection_page_albums_device": "Alba v zařízení ({count})",
|
||||
"backup_album_selection_page_albums_tap": "Klepnutím na položku ji zahrnete, opětovným klepnutím ji vyloučíte",
|
||||
"backup_album_selection_page_assets_scatter": "Položky mohou být roztroušeny ve více albech. To umožňuje zahrnout nebo vyloučit alba během procesu zálohování.",
|
||||
@@ -553,6 +583,8 @@
|
||||
"backup_options_page_title": "Nastavení záloh",
|
||||
"backup_setting_subtitle": "Správa nastavení zálohování na pozadí a na popředí",
|
||||
"backward": "Pozpátku",
|
||||
"beta_sync": "Stav synchronizace (beta)",
|
||||
"beta_sync_subtitle": "Správa nového systému synchronizace",
|
||||
"biometric_auth_enabled": "Biometrické ověřování je povoleno",
|
||||
"biometric_locked_out": "Jste vyloučeni z biometrického ověřování",
|
||||
"biometric_no_options": "Biometrické možnosti nejsou k dispozici",
|
||||
@@ -570,7 +602,7 @@
|
||||
"cache_settings_clear_cache_button": "Vymazat vyrovnávací paměť",
|
||||
"cache_settings_clear_cache_button_title": "Vymaže vyrovnávací paměť aplikace. To výrazně ovlivní výkon aplikace, dokud se vyrovnávací paměť neobnoví.",
|
||||
"cache_settings_duplicated_assets_clear_button": "VYMAZAT",
|
||||
"cache_settings_duplicated_assets_subtitle": "Fotografie a videa, které aplikace zařadila na černou listinu",
|
||||
"cache_settings_duplicated_assets_subtitle": "Fotografie a videa, které aplikace ignoruje",
|
||||
"cache_settings_duplicated_assets_title": "Duplicitní položky ({count})",
|
||||
"cache_settings_statistics_album": "Knihovna náhledů",
|
||||
"cache_settings_statistics_full": "Kompletní fotografie",
|
||||
@@ -587,6 +619,7 @@
|
||||
"cancel": "Zrušit",
|
||||
"cancel_search": "Zrušit vyhledávání",
|
||||
"canceled": "Zrušeno",
|
||||
"canceling": "Rušení",
|
||||
"cannot_merge_people": "Nelze sloučit osoby",
|
||||
"cannot_undo_this_action": "Tuto akci nelze vrátit zpět!",
|
||||
"cannot_update_the_description": "Nelze aktualizovat popis",
|
||||
@@ -700,10 +733,11 @@
|
||||
"current_server_address": "Aktuální adresa serveru",
|
||||
"custom_locale": "Vlastní lokalizace",
|
||||
"custom_locale_description": "Formátovat datumy a čísla podle jazyka a oblasti",
|
||||
"custom_url": "Vlastní URL",
|
||||
"daily_title_text_date": "EEEE, d. MMMM",
|
||||
"daily_title_text_date_year": "EEEE, d. MMMM y",
|
||||
"dark": "Tmavý",
|
||||
"darkTheme": "Přepnout tmavý motiv",
|
||||
"dark_theme": "Přepnout tmavý motiv",
|
||||
"date_after": "Datum po",
|
||||
"date_and_time": "Datum a čas",
|
||||
"date_before": "Datum před",
|
||||
@@ -719,6 +753,8 @@
|
||||
"default_locale": "Výchozí jazyk",
|
||||
"default_locale_description": "Formátovat datumy a čísla podle místního prostředí prohlížeče",
|
||||
"delete": "Smazat",
|
||||
"delete_action_confirmation_message": "Opravdu chcete odstranit tuto položku? Tato akce přesune položku do serverového koše a zeptá se vás, zda ji chcete odstranit lokálně",
|
||||
"delete_action_prompt": "{count} smazáno",
|
||||
"delete_album": "Smazat album",
|
||||
"delete_api_key_prompt": "Opravdu chcete tento API klíč odstranit?",
|
||||
"delete_dialog_alert": "Tyto položky budou trvale smazány z aplikace Immich i z vašeho zařízení",
|
||||
@@ -732,9 +768,12 @@
|
||||
"delete_key": "Smazat klíč",
|
||||
"delete_library": "Smazat knihovnu",
|
||||
"delete_link": "Smazat odkaz",
|
||||
"delete_local_action_prompt": "{count} smazáno lokálně",
|
||||
"delete_local_dialog_ok_backed_up_only": "Smazat pouze zálohované",
|
||||
"delete_local_dialog_ok_force": "Přesto smazat",
|
||||
"delete_others": "Odstranit ostatní",
|
||||
"delete_others": "Smazat ostatní",
|
||||
"delete_permanently": "Trvale smazat",
|
||||
"delete_permanently_action_prompt": "{count} trvale smazáno",
|
||||
"delete_shared_link": "Smazat sdílený odkaz",
|
||||
"delete_shared_link_dialog_title": "Odstranit sdílený odkaz",
|
||||
"delete_tag": "Smazat značku",
|
||||
@@ -745,6 +784,7 @@
|
||||
"description": "Popis",
|
||||
"description_input_hint_text": "Přidat popis...",
|
||||
"description_input_submit_error": "Chyba aktualizace popisu, další podrobnosti najdete v logu",
|
||||
"deselect_all": "Zrušit výběr všech",
|
||||
"details": "Podrobnosti",
|
||||
"direction": "Směr",
|
||||
"disabled": "Zakázáno",
|
||||
@@ -762,6 +802,7 @@
|
||||
"documentation": "Dokumentace",
|
||||
"done": "Hotovo",
|
||||
"download": "Stáhnout",
|
||||
"download_action_prompt": "Stahování {count} položek",
|
||||
"download_canceled": "Stahování zrušeno",
|
||||
"download_complete": "Stahování kompletní",
|
||||
"download_enqueue": "Stahování ve frontě",
|
||||
@@ -788,6 +829,7 @@
|
||||
"edit": "Upravit",
|
||||
"edit_album": "Upravit album",
|
||||
"edit_avatar": "Upravit avatar",
|
||||
"edit_birthday": "Upravit datum narození",
|
||||
"edit_date": "Upravit datum",
|
||||
"edit_date_and_time": "Upravit datum a čas",
|
||||
"edit_description": "Upravit popis",
|
||||
@@ -799,6 +841,7 @@
|
||||
"edit_key": "Upravit klíč",
|
||||
"edit_link": "Upravit odkaz",
|
||||
"edit_location": "Upravit polohu",
|
||||
"edit_location_action_prompt": "{count} upravených poloh",
|
||||
"edit_location_dialog_title": "Poloha",
|
||||
"edit_name": "Upravit jméno",
|
||||
"edit_people": "Upravit lidi",
|
||||
@@ -817,6 +860,7 @@
|
||||
"empty_trash": "Vyprázdnit koš",
|
||||
"empty_trash_confirmation": "Opravdu chcete vysypat koš? Tím se z Immiche trvale odstraní všechny položky v koši.\nTuto akci nelze vrátit zpět!",
|
||||
"enable": "Povolit",
|
||||
"enable_backup": "Povolit zálohování",
|
||||
"enable_biometric_auth_description": "Zadejte váš PIN kód pro povolení biometrického ověřování",
|
||||
"enabled": "Povoleno",
|
||||
"end_date": "Konečné datum",
|
||||
@@ -861,7 +905,7 @@
|
||||
"failed_to_load_people": "Chyba načítání osob",
|
||||
"failed_to_remove_product_key": "Nepodařilo se odebrat klíč produktu",
|
||||
"failed_to_stack_assets": "Nepodařilo se seskupit položky",
|
||||
"failed_to_unstack_assets": "Nepodařilo se rozložit položky",
|
||||
"failed_to_unstack_assets": "Nepodařilo se zrušit seskupení položek",
|
||||
"failed_to_update_notification_status": "Nepodařilo se aktualizovat stav oznámení",
|
||||
"import_path_already_exists": "Tato cesta importu již existuje.",
|
||||
"incorrect_email_or_password": "Nesprávný e-mail nebo heslo",
|
||||
@@ -876,7 +920,7 @@
|
||||
"unable_to_add_partners": "Nelze přidat partnery",
|
||||
"unable_to_add_remove_archive": "Nelze {archived, select, true {odstranit položku z} other {přidat položku do}} archivu",
|
||||
"unable_to_add_remove_favorites": "Nelze {favorite, select, true {oblíbit položku} other {zrušit oblíbení položky}}",
|
||||
"unable_to_archive_unarchive": "Nelze {archived, select, true {archivovat} other {odarchivovat}}",
|
||||
"unable_to_archive_unarchive": "Nelze {archived, select, true {archivovat} other {odebrat z archivu}}",
|
||||
"unable_to_change_album_user_role": "Nelze změnit roli uživatele alba",
|
||||
"unable_to_change_date": "Nelze změnit datum",
|
||||
"unable_to_change_description": "Nelze změnit popis",
|
||||
@@ -953,6 +997,7 @@
|
||||
},
|
||||
"exif": "Exif",
|
||||
"exif_bottom_sheet_description": "Přidat popis...",
|
||||
"exif_bottom_sheet_description_error": "Chyba při aktualizaci popisu",
|
||||
"exif_bottom_sheet_details": "PODROBNOSTI",
|
||||
"exif_bottom_sheet_location": "POLOHA",
|
||||
"exif_bottom_sheet_people": "LIDÉ",
|
||||
@@ -973,6 +1018,8 @@
|
||||
"explorer": "Průzkumník",
|
||||
"export": "Export",
|
||||
"export_as_json": "Exportovat jako JSON",
|
||||
"export_database": "Exportovat databázi",
|
||||
"export_database_description": "Exportovat databázi SQLite",
|
||||
"extension": "Přípona",
|
||||
"external": "Externí",
|
||||
"external_libraries": "Externí knihovny",
|
||||
@@ -984,6 +1031,7 @@
|
||||
"failed_to_load_assets": "Nepodařilo se načíst položky",
|
||||
"failed_to_load_folder": "Nepodařilo se načíst složku",
|
||||
"favorite": "Oblíbit",
|
||||
"favorite_action_prompt": "{count} přidáno do Oblíbených",
|
||||
"favorite_or_unfavorite_photo": "Oblíbit nebo zrušit oblíbení fotky",
|
||||
"favorites": "Oblíbené",
|
||||
"favorites_page_no_favorites": "Nebyla nalezena žádná oblíbená média",
|
||||
@@ -1023,6 +1071,9 @@
|
||||
"haptic_feedback_switch": "Povolit dotykovou zpětnou vazbu",
|
||||
"haptic_feedback_title": "Dotyková zpětná vazba",
|
||||
"has_quota": "Má kvótu",
|
||||
"hash_asset": "Hash položky",
|
||||
"hashed_assets": "Hashované položky",
|
||||
"hashing": "Hashování",
|
||||
"header_settings_add_header_tip": "Přidat hlavičku",
|
||||
"header_settings_field_validator_msg": "Hodnota nemůže být prázdná",
|
||||
"header_settings_header_name_input": "Název hlavičky",
|
||||
@@ -1055,6 +1106,7 @@
|
||||
"host": "Hostitel",
|
||||
"hour": "Hodina",
|
||||
"id": "ID",
|
||||
"idle": "Nečinnost",
|
||||
"ignore_icloud_photos": "Ignorovat fotografie na iCloudu",
|
||||
"ignore_icloud_photos_description": "Fotografie uložené na iCloudu se nebudou nahrávat na Immich server",
|
||||
"image": "Obrázek",
|
||||
@@ -1112,6 +1164,7 @@
|
||||
"language_no_results_title": "Nebyly nalezeny žádné jazyky",
|
||||
"language_search_hint": "Vyhledat jazyk...",
|
||||
"language_setting_description": "Vyberte upřednostňovaný jazyk",
|
||||
"large_files": "Velké soubory",
|
||||
"last_seen": "Naposledy viděno",
|
||||
"latest_version": "Nejnovější verze",
|
||||
"latitude": "Zeměpisná šířka",
|
||||
@@ -1127,16 +1180,18 @@
|
||||
"library_page_sort_created": "Naposledy vytvořené",
|
||||
"library_page_sort_last_modified": "Naposledy upraveno",
|
||||
"library_page_sort_title": "Podle názvu alba",
|
||||
"licenses": "Licence",
|
||||
"light": "Světlý",
|
||||
"like_deleted": "Lajk smazán",
|
||||
"link_motion_video": "Připojit pohyblivé video",
|
||||
"link_options": "Možnosti odkazu",
|
||||
"link_to_oauth": "Propojit s OAuth",
|
||||
"linked_oauth_account": "Propojený OAuth účet",
|
||||
"list": "Seznam",
|
||||
"loading": "Načítání",
|
||||
"loading_search_results_failed": "Načítání výsledků vyhledávání se nezdařilo",
|
||||
"local": "Místní",
|
||||
"local_asset_cast_failed": "Nelze odeslat položku, která není nahraná na serveru",
|
||||
"local_assets": "Místní položky",
|
||||
"local_network": "Místní síť",
|
||||
"local_network_sheet_info": "Aplikace se při použití zadané sítě Wi-Fi připojí k serveru prostřednictvím tohoto URL",
|
||||
"location_permission": "Oprávnění polohy",
|
||||
@@ -1193,8 +1248,7 @@
|
||||
"manage_your_devices": "Správa přihlášených zařízení",
|
||||
"manage_your_oauth_connection": "Správa OAuth propojení",
|
||||
"map": "Mapa",
|
||||
"map_assets_in_bound": "{count} fotka",
|
||||
"map_assets_in_bounds": "{count} fotek",
|
||||
"map_assets_in_bounds": "{count, plural, one {# fotka} few{# fotky} other {# fotek}}",
|
||||
"map_cannot_get_user_location": "Nelze zjistit polohu uživatele",
|
||||
"map_location_dialog_yes": "Ano",
|
||||
"map_location_picker_page_use_location": "Použít tuto polohu",
|
||||
@@ -1246,10 +1300,11 @@
|
||||
"more": "Více",
|
||||
"move": "Přesunout",
|
||||
"move_off_locked_folder": "Přesunout z uzamčené složky",
|
||||
"move_to_lock_folder_action_prompt": "{count} přidaných do uzamčené složky",
|
||||
"move_to_locked_folder": "Přesunout do uzamčené složky",
|
||||
"move_to_locked_folder_confirmation": "Tyto fotky a videa budou odstraněny ze všech alb a bude je možné zobrazit pouze v uzamčené složce",
|
||||
"moved_to_archive": "{count, plural, one {Přesunuta # položka} few {Přesunuty # položky} other {Přesunuto # položek}} do archivu",
|
||||
"moved_to_library": "{count, plural, one {Přesunuta # položka} few {Přesunuty # položky} other {Přesunuto # položek}} do knihovny",
|
||||
"moved_to_archive": "{count, plural, one {# položka přesunuta} few {# položky přesunuty} other {# položek přesunuto}} do archivu",
|
||||
"moved_to_library": "{count, plural, one {# položka přesunuta} few {# položky přesunuty} other {# položek přesunuto}} do knihovny",
|
||||
"moved_to_trash": "Přesunuto do koše",
|
||||
"multiselect_grid_edit_date_time_err_read_only": "Nelze upravit datum položek pouze pro čtení, přeskakuji",
|
||||
"multiselect_grid_edit_gps_err_read_only": "Nelze upravit polohu položek pouze pro čtení, přeskakuji",
|
||||
@@ -1292,6 +1347,7 @@
|
||||
"no_results": "Žádné výsledky",
|
||||
"no_results_description": "Zkuste použít synonymum nebo obecnější klíčové slovo",
|
||||
"no_shared_albums_message": "Vytvořte si album a sdílejte fotografie a videa s lidmi ve své síti",
|
||||
"no_uploads_in_progress": "Neprobíhá žádné nahrávání",
|
||||
"not_in_any_album": "Bez alba",
|
||||
"not_selected": "Není vybráno",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "Upozornění: Chcete-li použít štítek úložiště na dříve nahrané položky, spusťte příkaz",
|
||||
@@ -1329,6 +1385,7 @@
|
||||
"original": "originál",
|
||||
"other": "Ostatní",
|
||||
"other_devices": "Ostatní zařízení",
|
||||
"other_entities": "Ostatní entity",
|
||||
"other_variables": "Další proměnné",
|
||||
"owned": "Vlastní",
|
||||
"owner": "Vlastník",
|
||||
@@ -1460,6 +1517,7 @@
|
||||
"purchase_server_description_2": "Stav podporovatele",
|
||||
"purchase_server_title": "Server",
|
||||
"purchase_settings_server_activated": "Produktový klíč serveru spravuje správce",
|
||||
"queue_status": "Ve frontě {count}/{total}",
|
||||
"rating": "Hodnocení hvězdičkami",
|
||||
"rating_clear": "Vyčistit hodnocení",
|
||||
"rating_count": "{count, plural, one {# hvězdička} few {# hvězdičky} other {# hvězdček}}",
|
||||
@@ -1488,6 +1546,8 @@
|
||||
"refreshing_faces": "Obnovování obličejů",
|
||||
"refreshing_metadata": "Obnovování metadat",
|
||||
"regenerating_thumbnails": "Regenerace miniatur",
|
||||
"remote": "Vzdálený",
|
||||
"remote_assets": "Vzdálené položky",
|
||||
"remove": "Odstranit",
|
||||
"remove_assets_album_confirmation": "Opravdu chcete z alba odstranit {count, plural, one {# položku} few {# položky} other {# položek}}?",
|
||||
"remove_assets_shared_link_confirmation": "Opravdu chcete ze sdíleného odkazu odstranit {count, plural, one {# položku} few {# položky} other {# položek}}?",
|
||||
@@ -1495,7 +1555,9 @@
|
||||
"remove_custom_date_range": "Odstranit vlastní rozsah datumů",
|
||||
"remove_deleted_assets": "Odstranit offline soubory",
|
||||
"remove_from_album": "Odstranit z alba",
|
||||
"remove_from_album_action_prompt": "{count} odstraněných z alba",
|
||||
"remove_from_favorites": "Odstranit z oblíbených",
|
||||
"remove_from_lock_folder_action_prompt": "{count} odebraných z uzamčené složky",
|
||||
"remove_from_locked_folder": "Odstranit z uzamčené složky",
|
||||
"remove_from_locked_folder_confirmation": "Opravdu chcete tyto fotky a videa přesunout z uzamčené složky? Budou viditelné ve vaší knihovně.",
|
||||
"remove_from_shared_link": "Odstranit ze sdíleného odkazu",
|
||||
@@ -1523,19 +1585,25 @@
|
||||
"reset_password": "Obnovit heslo",
|
||||
"reset_people_visibility": "Obnovit viditelnost lidí",
|
||||
"reset_pin_code": "Resetovat PIN kód",
|
||||
"reset_sqlite": "Obnovit SQLite databázi",
|
||||
"reset_sqlite_confirmation": "Jste si jisti, že chcete obnovit SQLite databázi? Pro opětovnou synchronizaci dat se budete muset odhlásit a znovu přihlásit",
|
||||
"reset_sqlite_success": "Obnovení SQLite databáze proběhlo úspěšně",
|
||||
"reset_to_default": "Obnovit výchozí nastavení",
|
||||
"resolve_duplicates": "Vyřešit duplicity",
|
||||
"resolved_all_duplicates": "Vyřešeny všechny duplicity",
|
||||
"restore": "Obnovit",
|
||||
"restore_all": "Obnovit vše",
|
||||
"restore_trash_action_prompt": "{count} obnoveno z koše",
|
||||
"restore_user": "Obnovit uživatele",
|
||||
"restored_asset": "Položka obnovena",
|
||||
"resume": "Pokračovat",
|
||||
"retry_upload": "Opakování nahrávání",
|
||||
"review_duplicates": "Kontrola duplicit",
|
||||
"review_large_files": "Kontrola velkých souborů",
|
||||
"role": "Role",
|
||||
"role_editor": "Editor",
|
||||
"role_viewer": "Divák",
|
||||
"running": "Probíhá",
|
||||
"save": "Uložit",
|
||||
"save_to_gallery": "Uložit do galerie",
|
||||
"saved_api_key": "API klíč uložen",
|
||||
@@ -1667,6 +1735,7 @@
|
||||
"settings_saved": "Nastavení uloženo",
|
||||
"setup_pin_code": "Nastavení PIN kódu",
|
||||
"share": "Sdílet",
|
||||
"share_action_prompt": "Sdíleno {count} položek",
|
||||
"share_add_photos": "Přidat fotografie",
|
||||
"share_assets_selected": "{count} vybráno",
|
||||
"share_dialog_preparing": "Připravuji...",
|
||||
@@ -1688,6 +1757,7 @@
|
||||
"shared_link_clipboard_copied_massage": "Zkopírováno do schránky",
|
||||
"shared_link_clipboard_text": "Odkaz: {link}\nHeslo: {password}",
|
||||
"shared_link_create_error": "Chyba při vytváření sdíleného odkazu",
|
||||
"shared_link_custom_url_description": "Přístup k tomuto sdílenému odkazu pomocí vlastního URL",
|
||||
"shared_link_edit_description_hint": "Zadejte popis sdílení",
|
||||
"shared_link_edit_expire_after_option_day": "1 den",
|
||||
"shared_link_edit_expire_after_option_days": "{count} dní",
|
||||
@@ -1713,6 +1783,7 @@
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Spravovat sdílené odkazy",
|
||||
"shared_link_options": "Možnosti sdíleného odkazu",
|
||||
"shared_link_password_description": "Vyžadovat heslo pro přístup k tomuto sdílenému odkazu",
|
||||
"shared_links": "Sdílené odkazy",
|
||||
"shared_links_description": "Sdílet fotky a videa pomocí odkazu",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, one {# sdílená fotografie a video.} few {# sdílené fotografie a videa.} other {# sdílených fotografií a videí.}}",
|
||||
@@ -1768,6 +1839,7 @@
|
||||
"sort_title": "Název alba",
|
||||
"source": "Zdroj",
|
||||
"stack": "Seskupit",
|
||||
"stack_action_prompt": "{count} seskupeno",
|
||||
"stack_duplicates": "Seskupit duplicity",
|
||||
"stack_select_one_photo": "Vyberte jednu hlavní fotografii pro seskupení",
|
||||
"stack_selected_photos": "Seskupení vybraných fotografií",
|
||||
@@ -1787,6 +1859,7 @@
|
||||
"storage_quota": "Kvóta úložiště",
|
||||
"storage_usage": "Využito {used} z {available}",
|
||||
"submit": "Odeslat",
|
||||
"success": "Úspěch",
|
||||
"suggestions": "Návrhy",
|
||||
"sunrise_on_the_beach": "Východ slunce na pláži",
|
||||
"support": "Podpora",
|
||||
@@ -1796,6 +1869,8 @@
|
||||
"sync": "Synchronizovat",
|
||||
"sync_albums": "Synchronizovat alba",
|
||||
"sync_albums_manual_subtitle": "Synchronizovat všechna nahraná videa a fotografie do vybraných záložních alb",
|
||||
"sync_local": "Synchronizovat místní",
|
||||
"sync_remote": "Synchronizovat vzdálené",
|
||||
"sync_upload_album_setting_subtitle": "Vytvořit a nahrát fotografie a videa do vybraných alb na Immich",
|
||||
"tag": "Značka",
|
||||
"tag_assets": "Přiřadit značku",
|
||||
@@ -1806,6 +1881,7 @@
|
||||
"tag_updated": "Aktualizována značka: {tag}",
|
||||
"tagged_assets": "Přiřazena značka {count, plural, one {# položce} other {# položkám}}",
|
||||
"tags": "Značky",
|
||||
"tap_to_run_job": "Klepnutím na spustíte úlohu",
|
||||
"template": "Šablona",
|
||||
"theme": "Motiv",
|
||||
"theme_selection": "Výběr motivu",
|
||||
@@ -1838,6 +1914,7 @@
|
||||
"total": "Celkem",
|
||||
"total_usage": "Celkové využití",
|
||||
"trash": "Koš",
|
||||
"trash_action_prompt": "{count} přesunutých do koše",
|
||||
"trash_all": "Vyhodit vše",
|
||||
"trash_count": "Vyhodit {count, number}",
|
||||
"trash_delete_asset": "Vyhodit/Smazat položku",
|
||||
@@ -1854,10 +1931,12 @@
|
||||
"type": "Typ",
|
||||
"unable_to_change_pin_code": "Nelze změnit PIN kód",
|
||||
"unable_to_setup_pin_code": "Nelze nastavit PIN kód",
|
||||
"unarchive": "Odarchivovat",
|
||||
"unarchive": "Odebrat z archivu",
|
||||
"unarchive_action_prompt": "{count} odstraněných z archivu",
|
||||
"unarchived_count": "{count, plural, one {Odarchivována #} few {Odarchivovány #} other {Odarchivováno #}}",
|
||||
"undo": "Vrátit zpět",
|
||||
"unfavorite": "Zrušit oblíbení",
|
||||
"unfavorite_action_prompt": "{count} odstraněných z oblíbených",
|
||||
"unhide_person": "Zrušit skrytí osoby",
|
||||
"unknown": "Neznámý",
|
||||
"unknown_country": "Neznámá země",
|
||||
@@ -1875,15 +1954,20 @@
|
||||
"unselect_all_duplicates": "Zrušit výběr všech duplicit",
|
||||
"unselect_all_in": "Zrušit výběr ve skupině {group}",
|
||||
"unstack": "Zrušit seskupení",
|
||||
"unstacked_assets_count": "{count, plural, one {Rozložená # položka} few {Rozložené # položky} other {Rozložených # položiek}}",
|
||||
"unstack_action_prompt": "{count} seskupených zrušeno",
|
||||
"unstacked_assets_count": "{count, plural, one {Rozložená # položka} few {Rozložené # položky} other {Rozložených # položek}}",
|
||||
"untagged": "Neoznačeno",
|
||||
"up_next": "To je prozatím vše",
|
||||
"updated_at": "Aktualizováno",
|
||||
"updated_password": "Heslo aktualizováno",
|
||||
"upload": "Nahrát",
|
||||
"upload_action_prompt": "{count} ve frontě pro nahrání",
|
||||
"upload_concurrency": "Souběžnost nahrávání",
|
||||
"upload_details": "Detaily nahrávání",
|
||||
"upload_dialog_info": "Chcete zálohovat vybrané položky na server?",
|
||||
"upload_dialog_title": "Nahrát položku",
|
||||
"upload_errors": "Nahrávání bylo dokončeno s {count, plural, one {# chybou} other {# chybami}}, obnovte stránku pro zobrazení nových položek.",
|
||||
"upload_finished": "Nahrávání dokončeno",
|
||||
"upload_progress": "Zbývá {remaining, number} - Zpracováno {processed, number}/{total, number}",
|
||||
"upload_skipped_duplicates": "{count, plural, one {Přeskočena # duplicitní položka} few {Přeskočeny # duplicitní položky} other {Přeskočeno # duplicitních položek}}",
|
||||
"upload_status_duplicates": "Duplicity",
|
||||
@@ -1892,6 +1976,7 @@
|
||||
"upload_success": "Nahrání proběhlo úspěšně, obnovením stránky se zobrazí nově nahrané položky.",
|
||||
"upload_to_immich": "Nahrát do Immich ({count})",
|
||||
"uploading": "Nahrávání",
|
||||
"uploading_media": "Nahrávání médií",
|
||||
"url": "URL",
|
||||
"usage": "Využití",
|
||||
"use_biometric": "Použít biometrické údaje",
|
||||
@@ -1912,6 +1997,7 @@
|
||||
"user_usage_stats_description": "Zobrazit statistiky používání účtu",
|
||||
"username": "Uživateleské jméno",
|
||||
"users": "Uživatelé",
|
||||
"users_added_to_album_count": "{count, plural, one {Přidán # uživatel} few {Přidány # uživatelé} other {Přidáno # uživatelů}} do alba",
|
||||
"utilities": "Nástroje",
|
||||
"validate": "Ověřit",
|
||||
"validate_endpoint_error": "Zadejte platné URL",
|
||||
@@ -1930,6 +2016,7 @@
|
||||
"view_album": "Zobrazit album",
|
||||
"view_all": "Zobrazit vše",
|
||||
"view_all_users": "Zobrazit všechny uživatele",
|
||||
"view_details": "Zobrazit podrobnosti",
|
||||
"view_in_timeline": "Zobrazit na časové ose",
|
||||
"view_link": "Zobrazit odkaz",
|
||||
"view_links": "Zobrazit odkazy",
|
||||
@@ -1941,7 +2028,7 @@
|
||||
"view_user": "Zobrazit uživatele",
|
||||
"viewer_remove_from_stack": "Odstranit ze zásobníku",
|
||||
"viewer_stack_use_as_main_asset": "Použít jako hlavní položku",
|
||||
"viewer_unstack": "Rozbalit zásobník",
|
||||
"viewer_unstack": "Zrušit zásobník",
|
||||
"visibility_changed": "Viditelnost změněna u {count, plural, one {# osoby} few {# osob} other {# lidí}}",
|
||||
"waiting": "Čekající",
|
||||
"warning": "Upozornění",
|
||||
|
||||
22
i18n/da.json
@@ -34,6 +34,7 @@
|
||||
"added_to_favorites_count": "Tilføjet {count, number} til favoritter",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "Tilføj udelukkelsesmønstre. Globbing ved hjælp af *, ** og ? understøttes. For at ignorere alle filer i enhver mappe med navnet \"Raw\", brug \"**/Raw/**\". For at ignorere alle filer, der slutter på \".tif\", brug \"**/*.tif\". For at ignorere en absolut sti, brug \"/sti/til/ignoreret/**\".",
|
||||
"admin_user": "Administrator bruger",
|
||||
"asset_offline_description": "Denne eksterne biblioteksressource findes ikke længere på disken og er blevet flyttet til papirkurven. Hvis filen blev flyttet inde i biblioteket, skal du tjekke din tidslinje for den nye tilsvarende ressource. For at gendanne denne ressource skal du sikre, at filstien nedenfor kan tilgås af Immich og scanne biblioteket.",
|
||||
"authentication_settings": "Godkendelsesindstillinger",
|
||||
"authentication_settings_description": "Administrer adgangskode, OAuth og andre godkendelsesindstillinger",
|
||||
@@ -165,6 +166,20 @@
|
||||
"metadata_settings_description": "Håndtér metadataindstillinger",
|
||||
"migration_job": "Migrering",
|
||||
"migration_job_description": "Migrér miniaturebilleder for aktiver og ansigter til den seneste mappestruktur",
|
||||
"nightly_tasks_cluster_faces_setting_description": "Kør ansigtsgenkendelse på nye ansigter",
|
||||
"nightly_tasks_cluster_new_faces_setting": "Gruppér nye ansigter",
|
||||
"nightly_tasks_database_cleanup_setting": "Databaseoprydning opgaver",
|
||||
"nightly_tasks_database_cleanup_setting_description": "Ryd op i gamle, udløbne data fra databasen",
|
||||
"nightly_tasks_generate_memories_setting": "Generer minder",
|
||||
"nightly_tasks_generate_memories_setting_description": "Skab nye minder ud fra dine medier",
|
||||
"nightly_tasks_missing_thumbnails_setting": "Generer manglende miniaturebilleder",
|
||||
"nightly_tasks_missing_thumbnails_setting_description": "Sæt medier uden thumbnails i kø til generering af thumbnails",
|
||||
"nightly_tasks_settings": "Indstillinger for opgaver om natten",
|
||||
"nightly_tasks_settings_description": "Administrér opgaver om natten",
|
||||
"nightly_tasks_start_time_setting": "Starttidspunkt",
|
||||
"nightly_tasks_start_time_setting_description": "Tidspunktet hvor serveren begynder at køre opgaver om natten",
|
||||
"nightly_tasks_sync_quota_usage_setting": "Synkronisér kvoteforbrug",
|
||||
"nightly_tasks_sync_quota_usage_setting_description": "Opdater brugerens lagerkvote baseret på aktuelt forbrug",
|
||||
"no_paths_added": "Ingen stier tilføjet",
|
||||
"no_pattern_added": "Intet mønster tilføjet",
|
||||
"note_apply_storage_label_previous_assets": "Bemærk: For at anvende Lagringsmærkatet på tidligere uploadede mediefiler, kør",
|
||||
@@ -203,7 +218,7 @@
|
||||
"oauth_storage_quota_claim": "Lagringskvotefordring",
|
||||
"oauth_storage_quota_claim_description": "Sæt automatisk brugeres lagringskvote til denne nye fordrings værdi.",
|
||||
"oauth_storage_quota_default": "Standard lagringskvote (GiB)",
|
||||
"oauth_storage_quota_default_description": "Kvote i GiB som bruges, når der ikke bliver oplyst en fordring (Indtast 0 for uendelig kvote).",
|
||||
"oauth_storage_quota_default_description": "Kvote i GiB som bruges, når der ikke bliver oplyst en fordring.",
|
||||
"oauth_timeout": "Forespørgslen udløb",
|
||||
"oauth_timeout_description": "Udløbstid for forespørgsel i milisekunder",
|
||||
"password_enable_description": "Log ind med email og adgangskode",
|
||||
@@ -462,7 +477,6 @@
|
||||
"assets": "elementer",
|
||||
"assets_added_count": "Tilføjet {count, plural, one {# mediefil} other {# mediefiler}}",
|
||||
"assets_added_to_album_count": "{count, plural, one {# mediefil} other {# mediefiler}} tilføjet til albummet",
|
||||
"assets_added_to_name_count": "Tilføjet {count, plural, one {# mediefil} other {# mediefiler}} til {hasName, select, true {<b>{name}</b>} other {nyt album}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Billed} other {Billeder}} kan ikke blive tilføjet til album",
|
||||
"assets_count": "{count, plural, one {# mediefil} other {# mediefiler}}",
|
||||
"assets_deleted_permanently": "{count} element(er) blev fjernet permanent",
|
||||
@@ -488,6 +502,7 @@
|
||||
"back_close_deselect": "Tilbage, luk eller fravælg",
|
||||
"background_location_permission": "Tilladelse til baggrundsplacering",
|
||||
"background_location_permission_content": "For at skifte netværk, når appen kører i baggrunden, skal Immich *altid* have præcis placeringsadgang, så appen kan læse WiFi-netværkets navn",
|
||||
"backup": "Sikkerhedskopier",
|
||||
"backup_album_selection_page_albums_device": "Albummer på enheden ({count})",
|
||||
"backup_album_selection_page_albums_tap": "Tryk en gang for at inkludere, tryk to gange for at ekskludere",
|
||||
"backup_album_selection_page_assets_scatter": "Elementer kan være spredt på tværs af flere albummer. Albummer kan således inkluderes eller udelukkes under sikkerhedskopieringsprocessen.",
|
||||
@@ -701,7 +716,6 @@
|
||||
"daily_title_text_date": "E, dd MMM",
|
||||
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
||||
"dark": "Mørk",
|
||||
"darkTheme": "Skift til mørkt tema",
|
||||
"date_after": "Dato efter",
|
||||
"date_and_time": "Dato og klokkeslæt",
|
||||
"date_before": "Dato før",
|
||||
@@ -1128,7 +1142,6 @@
|
||||
"light": "Lys",
|
||||
"like_deleted": "Ligesom slettet",
|
||||
"link_motion_video": "Link bevægelsesvideo",
|
||||
"link_options": "Link-indstillinger",
|
||||
"link_to_oauth": "Link til OAuth",
|
||||
"linked_oauth_account": "Tilsluttet OAuth-konto",
|
||||
"list": "Liste",
|
||||
@@ -1190,7 +1203,6 @@
|
||||
"manage_your_devices": "Administrér dine enheder der er logget ind",
|
||||
"manage_your_oauth_connection": "Administrér din OAuth-tilslutning",
|
||||
"map": "Kort",
|
||||
"map_assets_in_bound": "{count} billede",
|
||||
"map_assets_in_bounds": "{count} billeder",
|
||||
"map_cannot_get_user_location": "Kan ikke finde brugerens placering",
|
||||
"map_location_dialog_yes": "Ja",
|
||||
|
||||
114
i18n/de.json
@@ -14,6 +14,7 @@
|
||||
"add_a_location": "Standort hinzufügen",
|
||||
"add_a_name": "Name hinzufügen",
|
||||
"add_a_title": "Titel hinzufügen",
|
||||
"add_birthday": "Geburtsdatum hinzufügen",
|
||||
"add_endpoint": "Endpunkt hinzufügen",
|
||||
"add_exclusion_pattern": "Ausschlussmuster hinzufügen",
|
||||
"add_import_path": "Importpfad hinzufügen",
|
||||
@@ -41,9 +42,16 @@
|
||||
"authentication_settings_disable_all": "Bist du sicher, dass du alle Anmeldemethoden deaktivieren willst? Die Anmeldung wird vollständig deaktiviert.",
|
||||
"authentication_settings_reenable": "Nutze einen <link>Server-Befehl</link> zur Reaktivierung.",
|
||||
"background_task_job": "Hintergrundaufgaben",
|
||||
"backup_database": "Datenbanksicherung regelmäßig erstellen",
|
||||
"backup_database": "Datenbanksicherung erstellen",
|
||||
"backup_database_enable_description": "Datenbank regelmäßig sichern",
|
||||
"backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Backups",
|
||||
"backup_onboarding_1_description": "Offsite-Kopie in der Cloud oder an einem anderen physischen Ort.",
|
||||
"backup_onboarding_2_description": "Lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.",
|
||||
"backup_onboarding_3_description": "3 komplette Kopien deiner Daten, inkl. der Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopie.",
|
||||
"backup_onboarding_description": "Eine <backblaze-link>3-2-1 Backup-Strategie</backblaze-link> wird empfohlen, um deine Daten zu schützen. Du solltest sowohl Kopien deiner hochgeladenen Fotos/Videos als auch der Immich-Datenbank aufbewahren, um eine umfassende Backup-Lösung zu haben.",
|
||||
"backup_onboarding_footer": "Weitere Informationen zum Sichern von Immich findest du in der <link>Dokumentation</link>.",
|
||||
"backup_onboarding_parts_title": "Eine 3-2-1-Sicherung umfasst:",
|
||||
"backup_onboarding_title": "Backups",
|
||||
"backup_settings": "Einstellungen für Datenbanksicherung",
|
||||
"backup_settings_description": "Einstellungen zur regelmäßigen Sicherung der Datenbank. Hinweis: Diese Jobs werden nicht überwacht und du wirst nicht über Fehler informiert.",
|
||||
"cleared_jobs": "Folgende Aufgaben zurückgesetzt: {job}",
|
||||
@@ -56,9 +64,9 @@
|
||||
"confirm_user_pin_code_reset": "Bist du sicher, dass du den PIN Code von {user} zurücksetzen möchtest?",
|
||||
"create_job": "Aufgabe erstellen",
|
||||
"cron_expression": "Cron Zeitangabe",
|
||||
"cron_expression_description": "Setze ein Intervall für die Sicherung mittels cron. Hilfe mit dem Format bietet dir dabei z.B der <link>Crontab Guru</link>",
|
||||
"cron_expression_description": "Setze ein Intervall für die Sicherung mittels cron. Hilfe mit dem Format bietet dir dabei z. B. der <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Nützliche Zeitangaben für Cron",
|
||||
"disable_login": "Login deaktvieren",
|
||||
"disable_login": "Login deaktivieren",
|
||||
"duplicate_detection_job_description": "Diese Aufgabe führt das maschinelle Lernen für jede Datei aus, um Duplikate zu finden. Diese Aufgabe beruht auf der intelligenten Suche",
|
||||
"exclusion_pattern_description": "Mit Ausschlussmustern können Dateien und Ordner beim Scannen Ihrer Bibliothek ignoriert werden. Dies ist nützlich, wenn du Ordner hast, die Dateien enthalten, die du nicht importieren möchtest, wie z. B. RAW-Dateien.",
|
||||
"external_library_management": "Verwaltung externer Bibliotheken",
|
||||
@@ -120,7 +128,7 @@
|
||||
"machine_learning_duplicate_detection_setting_description": "Verwendung von CLIP-Embeddings zum Erkennen möglicher Duplikate",
|
||||
"machine_learning_enabled": "Maschinelles Lernen aktivieren",
|
||||
"machine_learning_enabled_description": "Wenn diese Option deaktiviert ist, werden alle ML-Funktionen unabhängig von den unten aufgeführten Einstellungen deaktiviert.",
|
||||
"machine_learning_facial_recognition": "Gesichtsidentifikation",
|
||||
"machine_learning_facial_recognition": "Gesichtsidentifizierung",
|
||||
"machine_learning_facial_recognition_description": "Erkenne, identifiziere und gruppiere Gesichter in Bildern",
|
||||
"machine_learning_facial_recognition_model": "Gesichtserkennungs-Modell",
|
||||
"machine_learning_facial_recognition_model_description": "Die Modelle sind in absteigender Reihenfolge ihrer Größe aufgeführt. Größere Modelle sind langsamer und verbrauchen mehr Speicher, liefern aber bessere Ergebnisse. Bitte beachte dabei, dass du die Gesichtserkennungsaufgabe für alle Bilder neu starten musst, wenn du ein Modell änderst.",
|
||||
@@ -166,6 +174,20 @@
|
||||
"metadata_settings_description": "Metadaten-Einstellungen verwalten",
|
||||
"migration_job": "Migration",
|
||||
"migration_job_description": "Diese Aufgabe migriert Miniaturansichten für Dateien und Gesichter in die neueste Ordnerstruktur",
|
||||
"nightly_tasks_cluster_faces_setting_description": "Gesichtsidentifikation auf neu erkannten Gesichtern ausführen",
|
||||
"nightly_tasks_cluster_new_faces_setting": "Neue Gesichter gruppieren",
|
||||
"nightly_tasks_database_cleanup_setting": "Datenbankbereinigungs-Aufgaben",
|
||||
"nightly_tasks_database_cleanup_setting_description": "Alte, abgelaufene Daten aus der Datenbank bereinigen",
|
||||
"nightly_tasks_generate_memories_setting": "Erinnerungen generieren",
|
||||
"nightly_tasks_generate_memories_setting_description": "Neue Erinnerungen aus Dateien erstellen",
|
||||
"nightly_tasks_missing_thumbnails_setting": "Fehlende Miniaturansichten generieren",
|
||||
"nightly_tasks_missing_thumbnails_setting_description": "Dateien ohne Miniaturansicht in die Warteschlange zur Miniaturansicht-Generierung hinzufügen",
|
||||
"nightly_tasks_settings": "Einstellungen für nächtliche Aufgaben",
|
||||
"nightly_tasks_settings_description": "Nächtliche Aufgaben verwalten",
|
||||
"nightly_tasks_start_time_setting": "Startzeit",
|
||||
"nightly_tasks_start_time_setting_description": "Die Zeit, zu der der Server mit der Ausführung der nächtlichen Aufgaben beginnt",
|
||||
"nightly_tasks_sync_quota_usage_setting": "Kontingentnutzung synchronisieren",
|
||||
"nightly_tasks_sync_quota_usage_setting_description": "Benutzerspeicherkontingent basierend auf der aktuellen Nutzung aktualisieren",
|
||||
"no_paths_added": "Keine Pfade hinzugefügt",
|
||||
"no_pattern_added": "Kein Ausschlussmuster hinzugefügt",
|
||||
"note_apply_storage_label_previous_assets": "Hinweis: Um den Speicherpfad auf die vorher hochgeladenen Dateien anzuwenden, starte den",
|
||||
@@ -196,6 +218,8 @@
|
||||
"oauth_mobile_redirect_uri": "Mobile Umleitungs-URI",
|
||||
"oauth_mobile_redirect_uri_override": "Mobile Umleitungs-URI überschreiben",
|
||||
"oauth_mobile_redirect_uri_override_description": "Einschalten, wenn der OAuth-Anbieter keine mobile URI wie ''{callback}'' erlaubt",
|
||||
"oauth_role_claim": "Rollen-Claim",
|
||||
"oauth_role_claim_description": "Gewähre automatisch Admin-Zugriff basierend auf dem Vorhandensein dieses Claims. Der Claim kann entweder 'user' oder 'admin' sein.",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "OAuth-Anmeldeeinstellungen verwalten",
|
||||
"oauth_settings_more_details": "Weitere Informationen zu dieser Funktion findest du in der <link>Dokumentation</link>.",
|
||||
@@ -244,6 +268,7 @@
|
||||
"storage_template_migration_info": "Die Speichervorlage wird alle Dateierweiterungen in Kleinbuchstaben umwandeln. Vorlagenänderungen gelten nur für neue Dateien. Um die Vorlage rückwirkend auf bereits hochgeladene Assets anzuwenden, führe den <link>{job}</link> aus.",
|
||||
"storage_template_migration_job": "Speichervorlagenmigrations-Aufgabe",
|
||||
"storage_template_more_details": "Weitere Details zu dieser Funktion findest du unter <template-link>Speichervorlage</template-link> und dessen <implications-link>Implikationen</implications-link>",
|
||||
"storage_template_onboarding_description_v2": "Wenn aktiviert, werden Dateien automatisch nach einer benutzerdefinierten Vorlage organisiert. Für mehr Informationen siehe die <link>Dokumentation</link>.",
|
||||
"storage_template_path_length": "Ungefähres Pfadlängen-Limit: <b>{length, number}</b>/{limit, number}",
|
||||
"storage_template_settings": "Speichervorlage",
|
||||
"storage_template_settings_description": "Die Ordnerstruktur und den Dateinamen der hochgeladenen Datei verwalten",
|
||||
@@ -356,17 +381,19 @@
|
||||
"admin_password": "Administrator Passwort",
|
||||
"administration": "Verwaltung",
|
||||
"advanced": "Erweitert",
|
||||
"advanced_settings_beta_timeline_subtitle": "Probier die neue App-Erfahrung aus",
|
||||
"advanced_settings_beta_timeline_title": "Beta-Timeline",
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Verwende diese Option, um Medien während der Synchronisierung nach anderen Kriterien zu filtern. Versuchen dies nur, wenn Probleme mit der Erkennung aller Alben durch die App auftreten.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTELL] Benutze alternativen Filter für Synchronisierung der Gerätealben",
|
||||
"advanced_settings_log_level_title": "Log-Level: {level}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Einige Geräte sind sehr langsam beim Laden von Miniaturbildern direkt aus dem Gerät. Aktivieren Sie diese Einstellung, um stattdessen die Server-Bilder zu laden.",
|
||||
"advanced_settings_prefer_remote_subtitle": "Einige Geräte sind sehr langsam beim Laden von lokalen Vorschaubildern. Aktivieren Sie diese Einstellung, um stattdessen die Server-Bilder zu laden.",
|
||||
"advanced_settings_prefer_remote_title": "Server-Bilder bevorzugen",
|
||||
"advanced_settings_proxy_headers_subtitle": "Definiere einen Proxy-Header, den Immich bei jeder Netzwerkanfrage mitschicken soll",
|
||||
"advanced_settings_proxy_headers_title": "Proxy-Headers",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "Verifizierung von SSL-Zertifikaten vom Server überspringen. Notwendig bei selbstsignierten Zertifikaten.",
|
||||
"advanced_settings_self_signed_ssl_title": "Selbstsignierte SSL-Zertifikate erlauben",
|
||||
"advanced_settings_sync_remote_deletions_subtitle": "Automatisches Löschen oder Wiederherstellen einer Datei auf diesem Gerät, wenn diese Aktion im Web durchgeführt wird",
|
||||
"advanced_settings_sync_remote_deletions_title": "Synchrone Remote-Löschungen [Experimentell]",
|
||||
"advanced_settings_sync_remote_deletions_title": "Mit Server-Löschungen synchronisieren [Experimentell]",
|
||||
"advanced_settings_tile_subtitle": "Erweiterte Benutzereinstellungen",
|
||||
"advanced_settings_troubleshooting_subtitle": "Erweiterte Funktionen zur Fehlersuche aktivieren",
|
||||
"advanced_settings_troubleshooting_title": "Fehlersuche",
|
||||
@@ -378,6 +405,7 @@
|
||||
"album_cover_updated": "Album-Cover aktualisiert",
|
||||
"album_delete_confirmation": "Bist du sicher, dass du das Album {album} löschen willst?",
|
||||
"album_delete_confirmation_description": "Falls dieses Album geteilt wurde, können andere Benutzer nicht mehr darauf zugreifen.",
|
||||
"album_deleted": "Album gelöscht",
|
||||
"album_info_card_backup_album_excluded": "AUSGESCHLOSSEN",
|
||||
"album_info_card_backup_album_included": "EINGESCHLOSSEN",
|
||||
"album_info_updated": "Album-Infos aktualisiert",
|
||||
@@ -387,6 +415,7 @@
|
||||
"album_options": "Albumoptionen",
|
||||
"album_remove_user": "Nutzer entfernen?",
|
||||
"album_remove_user_confirmation": "Bist du sicher, dass du {user} entfernen willst?",
|
||||
"album_search_not_found": "Keine Alben gefunden, die zur Suche passen",
|
||||
"album_share_no_users": "Es sieht so aus, als hättest du dieses Album mit allen Benutzern geteilt oder du hast keine Benutzer, mit denen du teilen kannst.",
|
||||
"album_updated": "Album aktualisiert",
|
||||
"album_updated_setting_description": "Erhalte eine E-Mail-Benachrichtigung, wenn ein freigegebenes Album neue Dateien enthält",
|
||||
@@ -406,6 +435,7 @@
|
||||
"albums_default_sort_order": "Standard Album Sortierung",
|
||||
"albums_default_sort_order_description": "Sortierreihenfolge der Dateien bei der Erstellung neuer Alben.",
|
||||
"albums_feature_description": "Sammlung an Alben die mit anderen Benutzern geteilt werden können.",
|
||||
"albums_on_device_count": "Alben auf dem Gerät ({count})",
|
||||
"all": "Alle",
|
||||
"all_albums": "Alle Alben",
|
||||
"all_people": "Alle Personen",
|
||||
@@ -426,6 +456,7 @@
|
||||
"app_settings": "App-Einstellungen",
|
||||
"appears_in": "Erscheint in",
|
||||
"archive": "Archiv",
|
||||
"archive_action_prompt": "{count} zum Archiv hinzugefügt",
|
||||
"archive_or_unarchive_photo": "Foto archivieren bzw. Archivierung aufheben",
|
||||
"archive_page_no_archived_assets": "Keine archivierten Inhalte gefunden",
|
||||
"archive_page_title": "Archiv ({count})",
|
||||
@@ -463,7 +494,6 @@
|
||||
"assets": "Dateien",
|
||||
"assets_added_count": "{count, plural, one {# Datei} other {# Dateien}} hinzugefügt",
|
||||
"assets_added_to_album_count": "{count, plural, one {# Datei} other {# Dateien}} zum Album hinzugefügt",
|
||||
"assets_added_to_name_count": "{count, plural, one {# Element} other {# Elemente}} zu {hasName, select, true {<b>{name}</b>} other {neuem Album}} hinzugefügt",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Datei kann}other {Dateien können}} nicht zum Album hinzugefügt werden",
|
||||
"assets_count": "{count, plural, one {# Datei} other {# Dateien}}",
|
||||
"assets_deleted_permanently": "{count} Element(e) permanent gelöscht",
|
||||
@@ -489,6 +519,7 @@
|
||||
"back_close_deselect": "Zurück, Schließen oder Abwählen",
|
||||
"background_location_permission": "Hintergrund Standortfreigabe",
|
||||
"background_location_permission_content": "Um im Hintergrund zwischen den Netzwerken wechseln zu können, muss Immich *immer* Zugriff auf den genauen Standort haben, damit die App den Namen des WLAN-Netzwerks ermitteln kann",
|
||||
"backup": "Sicherung",
|
||||
"backup_album_selection_page_albums_device": "Alben auf dem Gerät ({count})",
|
||||
"backup_album_selection_page_albums_tap": "Einmalig das Album antippen um es zu sichern, doppelt antippen um es nicht mehr zu sichern",
|
||||
"backup_album_selection_page_assets_scatter": "Elemente (Fotos / Videos) können sich über mehrere Alben verteilen. Daher können diese vor der Sicherung eingeschlossen oder ausgeschlossen werden.",
|
||||
@@ -552,6 +583,8 @@
|
||||
"backup_options_page_title": "Sicherungsoptionen",
|
||||
"backup_setting_subtitle": "Verwaltung der Upload-Einstellungen im Hintergrund und im Vordergrund",
|
||||
"backward": "Rückwärts",
|
||||
"beta_sync": "Status der Beta-Synchronisierung",
|
||||
"beta_sync_subtitle": "Verwalte das neue Synchronisierungssystem",
|
||||
"biometric_auth_enabled": "Biometrische Authentifizierung aktiviert",
|
||||
"biometric_locked_out": "Du bist von der biometrischen Authentifizierung ausgeschlossen",
|
||||
"biometric_no_options": "Keine biometrischen Optionen verfügbar",
|
||||
@@ -586,6 +619,7 @@
|
||||
"cancel": "Abbrechen",
|
||||
"cancel_search": "Suche abbrechen",
|
||||
"canceled": "Abgebrochen",
|
||||
"canceling": "Abbrechen",
|
||||
"cannot_merge_people": "Personen können nicht zusammengeführt werden",
|
||||
"cannot_undo_this_action": "Diese Aktion kann nicht rückgängig gemacht werden!",
|
||||
"cannot_update_the_description": "Beschreibung kann nicht aktualisiert werden",
|
||||
@@ -699,10 +733,11 @@
|
||||
"current_server_address": "Aktuelle Serveradresse",
|
||||
"custom_locale": "Benutzerdefinierte Sprache",
|
||||
"custom_locale_description": "Datumsangaben und Zahlen je nach Sprache und Land formatieren",
|
||||
"custom_url": "Benutzerdefinierte URL",
|
||||
"daily_title_text_date": "E, dd MMM",
|
||||
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
||||
"dark": "Dunkel",
|
||||
"darkTheme": "Dunkles Theme umschalten",
|
||||
"dark_theme": "Dunkle Ansicht umschalten",
|
||||
"date_after": "Datum nach",
|
||||
"date_and_time": "Datum und Zeit",
|
||||
"date_before": "Datum vor",
|
||||
@@ -718,6 +753,8 @@
|
||||
"default_locale": "Standard-Sprache",
|
||||
"default_locale_description": "Datumsangaben und Zahlen basierend auf dem Gebietsschema des Browsers formatieren",
|
||||
"delete": "Löschen",
|
||||
"delete_action_confirmation_message": "Bist du sicher, dass du dieses Objekt löschen willst? Diese Aktion wird das Objekt in den Papierkorb des Servers verschieben und fragen, ob du es lokal löschen willst",
|
||||
"delete_action_prompt": "{count} gelöscht",
|
||||
"delete_album": "Album löschen",
|
||||
"delete_api_key_prompt": "Bist du sicher, dass du diesen API-Schlüssel löschen willst?",
|
||||
"delete_dialog_alert": "Diese Elemente werden unwiderruflich von Immich und dem Gerät entfernt",
|
||||
@@ -731,9 +768,12 @@
|
||||
"delete_key": "Schlüssel löschen",
|
||||
"delete_library": "Bibliothek löschen",
|
||||
"delete_link": "Link löschen",
|
||||
"delete_local_action_prompt": "{count} lokal gelöscht",
|
||||
"delete_local_dialog_ok_backed_up_only": "Nur gesicherte Inhalte löschen",
|
||||
"delete_local_dialog_ok_force": "Trotzdem löschen",
|
||||
"delete_others": "Andere löschen",
|
||||
"delete_permanently": "Endgültig löschen",
|
||||
"delete_permanently_action_prompt": "{count} endgültig gelöscht",
|
||||
"delete_shared_link": "geteilten Link löschen",
|
||||
"delete_shared_link_dialog_title": "Geteilten Link löschen",
|
||||
"delete_tag": "Tag löschen",
|
||||
@@ -744,6 +784,7 @@
|
||||
"description": "Beschreibung",
|
||||
"description_input_hint_text": "Beschreibung hinzufügen...",
|
||||
"description_input_submit_error": "Beschreibung konnte nicht geändert werden, bitte im Log für mehr Details nachsehen",
|
||||
"deselect_all": "Alle abwählen",
|
||||
"details": "Details",
|
||||
"direction": "Richtung",
|
||||
"disabled": "Deaktiviert",
|
||||
@@ -761,6 +802,7 @@
|
||||
"documentation": "Dokumentation",
|
||||
"done": "Fertig",
|
||||
"download": "Herunterladen",
|
||||
"download_action_prompt": "Herunterladen von {count} Dateien",
|
||||
"download_canceled": "Download abgebrochen",
|
||||
"download_complete": "Download vollständig",
|
||||
"download_enqueue": "Download in die Warteschlange gesetzt",
|
||||
@@ -787,6 +829,7 @@
|
||||
"edit": "Bearbeiten",
|
||||
"edit_album": "Album bearbeiten",
|
||||
"edit_avatar": "Avatar bearbeiten",
|
||||
"edit_birthday": "Geburtsdatum bearbeiten",
|
||||
"edit_date": "Datum bearbeiten",
|
||||
"edit_date_and_time": "Datum und Uhrzeit bearbeiten",
|
||||
"edit_description": "Beschreibung bearbeiten",
|
||||
@@ -798,6 +841,7 @@
|
||||
"edit_key": "Schlüssel bearbeiten",
|
||||
"edit_link": "Link bearbeiten",
|
||||
"edit_location": "Standort bearbeiten",
|
||||
"edit_location_action_prompt": "{count} Geolokationen angepasst",
|
||||
"edit_location_dialog_title": "Ort bearbeiten",
|
||||
"edit_name": "Name bearbeiten",
|
||||
"edit_people": "Personen bearbeiten",
|
||||
@@ -816,6 +860,7 @@
|
||||
"empty_trash": "Papierkorb leeren",
|
||||
"empty_trash_confirmation": "Bist du sicher, dass du den Papierkorb leeren willst?\nDies entfernt alle Dateien im Papierkorb endgültig aus Immich und kann nicht rückgängig gemacht werden!",
|
||||
"enable": "Aktivieren",
|
||||
"enable_backup": "Sicherung aktivieren",
|
||||
"enable_biometric_auth_description": "Gib deinen PIN Code ein, um die biometrische Authentifizierung zu aktivieren",
|
||||
"enabled": "Aktiviert",
|
||||
"end_date": "Enddatum",
|
||||
@@ -952,6 +997,7 @@
|
||||
},
|
||||
"exif": "EXIF",
|
||||
"exif_bottom_sheet_description": "Beschreibung hinzufügen...",
|
||||
"exif_bottom_sheet_description_error": "Fehler bei der Aktualisierung der Beschreibung",
|
||||
"exif_bottom_sheet_details": "DETAILS",
|
||||
"exif_bottom_sheet_location": "STANDORT",
|
||||
"exif_bottom_sheet_people": "PERSONEN",
|
||||
@@ -972,6 +1018,8 @@
|
||||
"explorer": "Datei-Explorer",
|
||||
"export": "Exportieren",
|
||||
"export_as_json": "Als JSON exportieren",
|
||||
"export_database": "Datenbank exportieren",
|
||||
"export_database_description": "Exportiert die SQLite Datenbank",
|
||||
"extension": "Erweiterung",
|
||||
"external": "Extern",
|
||||
"external_libraries": "Externe Bibliotheken",
|
||||
@@ -983,6 +1031,7 @@
|
||||
"failed_to_load_assets": "Laden der Assets fehlgeschlagen",
|
||||
"failed_to_load_folder": "Fehler beim Laden des Ordners",
|
||||
"favorite": "Favorit",
|
||||
"favorite_action_prompt": "{count} zu den Favoriten hinzugefügt",
|
||||
"favorite_or_unfavorite_photo": "Favorisiertes oder nicht favorisiertes Foto",
|
||||
"favorites": "Favoriten",
|
||||
"favorites_page_no_favorites": "Keine favorisierten Inhalte gefunden",
|
||||
@@ -1022,6 +1071,9 @@
|
||||
"haptic_feedback_switch": "Haptisches Feedback aktivieren",
|
||||
"haptic_feedback_title": "Haptisches Feedback",
|
||||
"has_quota": "Kontingent",
|
||||
"hash_asset": "Dateihash",
|
||||
"hashed_assets": "Gehashte Dateien",
|
||||
"hashing": "Hashen",
|
||||
"header_settings_add_header_tip": "Header hinzufügen",
|
||||
"header_settings_field_validator_msg": "Der Wert darf nicht leer sein",
|
||||
"header_settings_header_name_input": "Header-Name",
|
||||
@@ -1043,7 +1095,7 @@
|
||||
"home_page_archive_err_partner": "Inhalte von Partnern können nicht archiviert werden",
|
||||
"home_page_building_timeline": "Zeitachse wird erstellt",
|
||||
"home_page_delete_err_partner": "Inhalte von Partnern können nicht gelöscht werden, überspringe",
|
||||
"home_page_delete_remote_err_local": "Lokale Inhalte in der Auswahl, überspringen",
|
||||
"home_page_delete_remote_err_local": "Lokale Elemente in der Auswahl zum Entfernen von Remote-Elementen, Überspringe",
|
||||
"home_page_favorite_err_local": "Kann lokale Elemente noch nicht favorisieren, überspringen",
|
||||
"home_page_favorite_err_partner": "Inhalte von Partnern können nicht favorisiert werden, überspringe",
|
||||
"home_page_first_time_notice": "Wenn dies das erste Mal ist dass Du Immich nutzt, stelle bitte sicher, dass mindestens ein Album zur Sicherung ausgewählt ist, sodass die Zeitachse mit Fotos und Videos gefüllt werden kann",
|
||||
@@ -1054,6 +1106,7 @@
|
||||
"host": "Host",
|
||||
"hour": "Stunde",
|
||||
"id": "ID",
|
||||
"idle": "Untätig",
|
||||
"ignore_icloud_photos": "iCloud Fotos ignorieren",
|
||||
"ignore_icloud_photos_description": "Fotos, die in der iCloud gespeichert sind, werden nicht auf den immich Server hochgeladen",
|
||||
"image": "Bild",
|
||||
@@ -1111,6 +1164,7 @@
|
||||
"language_no_results_title": "Keine Sprachen gefunden",
|
||||
"language_search_hint": "Sprachen durchsuchen...",
|
||||
"language_setting_description": "Wähle deine bevorzugte Sprache",
|
||||
"large_files": "Große Dateien",
|
||||
"last_seen": "Zuletzt gesehen",
|
||||
"latest_version": "Aktuellste Version",
|
||||
"latitude": "Breitengrad",
|
||||
@@ -1126,16 +1180,18 @@
|
||||
"library_page_sort_created": "Zuletzt erstellt",
|
||||
"library_page_sort_last_modified": "Zuletzt bearbeitet",
|
||||
"library_page_sort_title": "Titel des Albums",
|
||||
"licenses": "Lizenzen",
|
||||
"light": "Hell",
|
||||
"like_deleted": "Like gelöscht",
|
||||
"link_motion_video": "Bewegungsvideo verknüpfen",
|
||||
"link_options": "Link-Optionen",
|
||||
"link_to_oauth": "Mit OAuth verknüpfen",
|
||||
"linked_oauth_account": "Verknüpftes OAuth-Konto",
|
||||
"list": "Liste",
|
||||
"loading": "Laden",
|
||||
"loading_search_results_failed": "Laden von Suchergebnissen fehlgeschlagen",
|
||||
"local": "Lokal",
|
||||
"local_asset_cast_failed": "Eine Datei, die nicht auf den Server hochgeladen wurde, kann nicht gecastet werden",
|
||||
"local_assets": "Lokale Dateien",
|
||||
"local_network": "Lokales Netzwerk",
|
||||
"local_network_sheet_info": "Die App stellt über diese URL eine Verbindung zum Server her, wenn sie das angegebene WLAN-Netzwerk verwendet",
|
||||
"location_permission": "Standort Genehmigung",
|
||||
@@ -1192,8 +1248,7 @@
|
||||
"manage_your_devices": "Deine eingeloggten Geräte verwalten",
|
||||
"manage_your_oauth_connection": "Deine OAuth-Verknüpfung verwalten",
|
||||
"map": "Karte",
|
||||
"map_assets_in_bound": "{count} Foto",
|
||||
"map_assets_in_bounds": "{count} Fotos",
|
||||
"map_assets_in_bounds": "{count, plural, one {# Foto} other {# Fotos}}",
|
||||
"map_cannot_get_user_location": "Standort konnte nicht ermittelt werden",
|
||||
"map_location_dialog_yes": "Ja",
|
||||
"map_location_picker_page_use_location": "Aufnahmeort verwenden",
|
||||
@@ -1245,6 +1300,7 @@
|
||||
"more": "Mehr",
|
||||
"move": "Verschieben",
|
||||
"move_off_locked_folder": "Aus dem gesperrten Ordner verschieben",
|
||||
"move_to_lock_folder_action_prompt": "{count} zum gesperrten Ordner hinzugefügt",
|
||||
"move_to_locked_folder": "In den gesperrten Ordner verschieben",
|
||||
"move_to_locked_folder_confirmation": "Diese Fotos und Videos werden aus allen Alben entfernt und können nur noch im gesperrten Ordner angezeigt werden",
|
||||
"moved_to_archive": "{count, plural, one {# Datei} other {# Dateien}} archiviert",
|
||||
@@ -1291,6 +1347,7 @@
|
||||
"no_results": "Keine Ergebnisse",
|
||||
"no_results_description": "Versuche es mit einem Synonym oder einem allgemeineren Stichwort",
|
||||
"no_shared_albums_message": "Erstelle ein Album, um Fotos und Videos mit Personen in deinem Netzwerk zu teilen",
|
||||
"no_uploads_in_progress": "Kein Upload in Bearbeitung",
|
||||
"not_in_any_album": "In keinem Album",
|
||||
"not_selected": "Nicht ausgewählt",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "Hinweis: Um eine Speicherpfadbezeichnung anzuwenden, starte den",
|
||||
@@ -1328,6 +1385,7 @@
|
||||
"original": "Original",
|
||||
"other": "Sonstiges",
|
||||
"other_devices": "Andere Geräte",
|
||||
"other_entities": "Andere Entitäten",
|
||||
"other_variables": "Sonstige Variablen",
|
||||
"owned": "Eigenes",
|
||||
"owner": "Besitzer",
|
||||
@@ -1459,6 +1517,7 @@
|
||||
"purchase_server_description_2": "Unterstützerstatus",
|
||||
"purchase_server_title": "Server",
|
||||
"purchase_settings_server_activated": "Der Server-Produktschlüssel wird durch den Administrator verwaltet",
|
||||
"queue_status": "Warteschlange {count}/{total}",
|
||||
"rating": "Bewertung",
|
||||
"rating_clear": "Bewertung löschen",
|
||||
"rating_count": "{count, plural, one {# Stern} other {# Sterne}}",
|
||||
@@ -1487,6 +1546,8 @@
|
||||
"refreshing_faces": "Gesichter werden aktualisiert",
|
||||
"refreshing_metadata": "Metadaten werden aktualisiert",
|
||||
"regenerating_thumbnails": "Miniaturansichten werden neu erstellt",
|
||||
"remote": "Server",
|
||||
"remote_assets": "Server-Dateien",
|
||||
"remove": "Entfernen",
|
||||
"remove_assets_album_confirmation": "Bist du sicher, dass du {count, plural, one {# Datei} other {# Dateien}} aus dem Album entfernen willst?",
|
||||
"remove_assets_shared_link_confirmation": "Bist du sicher, dass du {count, plural, one {# Datei} other {# Dateien}} von diesem geteilten Link entfernen willst?",
|
||||
@@ -1494,7 +1555,9 @@
|
||||
"remove_custom_date_range": "Benutzerdefinierten Datumsbereich entfernen",
|
||||
"remove_deleted_assets": "Offline-Dateien entfernen",
|
||||
"remove_from_album": "Aus Album entfernen",
|
||||
"remove_from_album_action_prompt": "{count} vom Album entfernt",
|
||||
"remove_from_favorites": "Aus Favoriten entfernen",
|
||||
"remove_from_lock_folder_action_prompt": "{count} aus dem gesperrten Ordner entfernt",
|
||||
"remove_from_locked_folder": "Aus gesperrtem Ordner entfernen",
|
||||
"remove_from_locked_folder_confirmation": "Bist du sicher, dass du diese Fotos und Videos aus dem gesperrten Ordner entfernen möchtest? Sie werden wieder in deiner Bibliothek sichtbar sein.",
|
||||
"remove_from_shared_link": "Aus geteiltem Link entfernen",
|
||||
@@ -1522,19 +1585,25 @@
|
||||
"reset_password": "Passwort zurücksetzen",
|
||||
"reset_people_visibility": "Sichtbarkeit von Personen zurücksetzen",
|
||||
"reset_pin_code": "PIN Code zurücksetzen",
|
||||
"reset_sqlite": "SQLite Datenbank zurücksetzen",
|
||||
"reset_sqlite_confirmation": "Bist du sicher, dass du die SQLite-Datenbank zurücksetzen willst? Du musst dich ab- und wieder anmelden, um die Daten neu zu synchronisieren",
|
||||
"reset_sqlite_success": "SQLite Datenbank erfolgreich zurückgesetzt",
|
||||
"reset_to_default": "Auf Standard zurücksetzen",
|
||||
"resolve_duplicates": "Duplikate entfernen",
|
||||
"resolved_all_duplicates": "Alle Duplikate aufgelöst",
|
||||
"restore": "Wiederherstellen",
|
||||
"restore_all": "Alle wiederherstellen",
|
||||
"restore_trash_action_prompt": "{count} aus dem Papierkorb wiederhergestellt",
|
||||
"restore_user": "Nutzer wiederherstellen",
|
||||
"restored_asset": "Datei wiederhergestellt",
|
||||
"resume": "Fortsetzen",
|
||||
"retry_upload": "Upload wiederholen",
|
||||
"review_duplicates": "Duplikate überprüfen",
|
||||
"review_large_files": "Große Dateien überprüfen",
|
||||
"role": "Rolle",
|
||||
"role_editor": "Bearbeiter",
|
||||
"role_viewer": "Betrachter",
|
||||
"running": "Läuft",
|
||||
"save": "Speichern",
|
||||
"save_to_gallery": "In Galerie speichern",
|
||||
"saved_api_key": "API-Schlüssel wurde gespeichert",
|
||||
@@ -1666,6 +1735,7 @@
|
||||
"settings_saved": "Einstellungen gespeichert",
|
||||
"setup_pin_code": "Einen PIN Code festlegen",
|
||||
"share": "Teilen",
|
||||
"share_action_prompt": "{count} Dateien geteilt",
|
||||
"share_add_photos": "Fotos hinzufügen",
|
||||
"share_assets_selected": "{count} ausgewählt",
|
||||
"share_dialog_preparing": "Vorbereiten...",
|
||||
@@ -1687,6 +1757,7 @@
|
||||
"shared_link_clipboard_copied_massage": "Link kopiert",
|
||||
"shared_link_clipboard_text": "Link: {link}\nPasswort: {password}",
|
||||
"shared_link_create_error": "Fehler beim Erstellen der Linkfreigabe",
|
||||
"shared_link_custom_url_description": "Greife über eine benutzerdefinierte URL auf diesen Freigabelink zu",
|
||||
"shared_link_edit_description_hint": "Beschreibung eingeben",
|
||||
"shared_link_edit_expire_after_option_day": "1 Tag",
|
||||
"shared_link_edit_expire_after_option_days": "{count} Tagen",
|
||||
@@ -1712,6 +1783,7 @@
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Geteilte Links verwalten",
|
||||
"shared_link_options": "Optionen für geteilten Link",
|
||||
"shared_link_password_description": "Für den Zugriff auf diesen freigegebenen Link ist ein Passwort erforderlich",
|
||||
"shared_links": "Geteilte Links",
|
||||
"shared_links_description": "Teile Fotos und Videos mit einem Link",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, one {# geteiltes Foto oder Video.} other {# geteilte Fotos & Videos.}}",
|
||||
@@ -1767,6 +1839,7 @@
|
||||
"sort_title": "Titel",
|
||||
"source": "Quellcode",
|
||||
"stack": "Stapel",
|
||||
"stack_action_prompt": "{count} gestapelt",
|
||||
"stack_duplicates": "Duplikate stapeln",
|
||||
"stack_select_one_photo": "Hauptfoto für den Stapel auswählen",
|
||||
"stack_selected_photos": "Ausgewählte Fotos stapeln",
|
||||
@@ -1786,6 +1859,7 @@
|
||||
"storage_quota": "Speicherplatz-Kontingent",
|
||||
"storage_usage": "{used} von {available} verwendet",
|
||||
"submit": "Bestätigen",
|
||||
"success": "Erfolgreich",
|
||||
"suggestions": "Vorschläge",
|
||||
"sunrise_on_the_beach": "Sonnenaufgang am Strand",
|
||||
"support": "Unterstützung",
|
||||
@@ -1795,6 +1869,8 @@
|
||||
"sync": "Synchronisieren",
|
||||
"sync_albums": "Alben synchronisieren",
|
||||
"sync_albums_manual_subtitle": "Synchronisiere alle hochgeladenen Videos und Fotos in die ausgewählten Backup-Alben",
|
||||
"sync_local": "Lokal synchronisieren",
|
||||
"sync_remote": "mit Server synchronisieren",
|
||||
"sync_upload_album_setting_subtitle": "Erstelle deine ausgewählten Alben in Immich und lade die Fotos und Videos dort hoch",
|
||||
"tag": "Tag",
|
||||
"tag_assets": "Dateien taggen",
|
||||
@@ -1805,11 +1881,12 @@
|
||||
"tag_updated": "Tag aktualisiert: {tag}",
|
||||
"tagged_assets": "{count, plural, one {# Datei} other {# Dateien}} getagged",
|
||||
"tags": "Tags",
|
||||
"tap_to_run_job": "Tippen um den Job zu starten",
|
||||
"template": "Vorlage",
|
||||
"theme": "Theme",
|
||||
"theme_selection": "Themenauswahl",
|
||||
"theme_selection_description": "Automatische Einstellung des Themes auf Hell oder Dunkel, je nach Systemeinstellung des Browsers",
|
||||
"theme_setting_asset_list_storage_indicator_title": "Forschrittsbalken der Sicherung auf dem Vorschaubild",
|
||||
"theme_setting_asset_list_storage_indicator_title": "Fortschrittsbalken der Sicherung auf dem Vorschaubild",
|
||||
"theme_setting_asset_list_tiles_per_row_title": "Anzahl der Elemente pro Reihe ({count})",
|
||||
"theme_setting_colorful_interface_subtitle": "Primärfarbe auf App-Hintergrund anwenden.",
|
||||
"theme_setting_colorful_interface_title": "Farbige UI-Oberfläche",
|
||||
@@ -1837,6 +1914,7 @@
|
||||
"total": "Gesamt",
|
||||
"total_usage": "Gesamtnutzung",
|
||||
"trash": "Papierkorb",
|
||||
"trash_action_prompt": "{count} in den Papierkorb verschoben",
|
||||
"trash_all": "Alle löschen",
|
||||
"trash_count": "Papierkorb {count, number}",
|
||||
"trash_delete_asset": "Datei löschen/in den Papierkorb verschieben",
|
||||
@@ -1854,9 +1932,11 @@
|
||||
"unable_to_change_pin_code": "PIN Code konnte nicht geändert werden",
|
||||
"unable_to_setup_pin_code": "PIN Code konnte nicht festgelegt werden",
|
||||
"unarchive": "Entarchivieren",
|
||||
"unarchive_action_prompt": "{count} aus dem Archiv entfernt",
|
||||
"unarchived_count": "{count, plural, other {# entarchiviert}}",
|
||||
"undo": "Rückgängig",
|
||||
"unfavorite": "Entfavorisieren",
|
||||
"unfavorite_action_prompt": "{count} aus den Favoriten entfernt",
|
||||
"unhide_person": "Person einblenden",
|
||||
"unknown": "Unbekannt",
|
||||
"unknown_country": "Unbekanntes Land",
|
||||
@@ -1874,15 +1954,20 @@
|
||||
"unselect_all_duplicates": "Alle Duplikate abwählen",
|
||||
"unselect_all_in": "Alle in {group} abwählen",
|
||||
"unstack": "Entstapeln",
|
||||
"unstack_action_prompt": "{count} entstapelt",
|
||||
"unstacked_assets_count": "{count, plural, one {# Datei} other {# Dateien}} entstapelt",
|
||||
"untagged": "Ohne Tag",
|
||||
"up_next": "Weiter",
|
||||
"updated_at": "Aktualisiert",
|
||||
"updated_password": "Passwort aktualisiert",
|
||||
"upload": "Hochladen",
|
||||
"upload_action_prompt": "{count} in der Warteschlange für Upload",
|
||||
"upload_concurrency": "Parallelität beim Hochladen",
|
||||
"upload_details": "Upload Details",
|
||||
"upload_dialog_info": "Willst du die ausgewählten Elemente auf dem Server sichern?",
|
||||
"upload_dialog_title": "Element hochladen",
|
||||
"upload_errors": "Hochladen mit {count, plural, one {# Fehler} other {# Fehlern}} abgeschlossen, aktualisiere die Seite, um neu hochgeladene Dateien zu sehen.",
|
||||
"upload_finished": "Upload fertig",
|
||||
"upload_progress": "{remaining, number} verbleibend - {processed, number}/{total, number} verarbeitet",
|
||||
"upload_skipped_duplicates": "{count, plural, one {# doppelte Datei} other {# doppelte Dateien}} ausgelassen",
|
||||
"upload_status_duplicates": "Duplikate",
|
||||
@@ -1891,6 +1976,7 @@
|
||||
"upload_success": "Hochladen erfolgreich. Aktualisiere die Seite, um neue hochgeladene Dateien zu sehen.",
|
||||
"upload_to_immich": "Auf Immich hochladen ({count})",
|
||||
"uploading": "Wird hochgeladen",
|
||||
"uploading_media": "Medien werden hochgeladen",
|
||||
"url": "URL",
|
||||
"usage": "Verwendung",
|
||||
"use_biometric": "Biometrie verwenden",
|
||||
@@ -1911,6 +1997,7 @@
|
||||
"user_usage_stats_description": "Statistiken zur Kontonutzung anzeigen",
|
||||
"username": "Nutzername",
|
||||
"users": "Benutzer",
|
||||
"users_added_to_album_count": "{count, plural, one {# Benutzer} other {# Benutzer}} zum Album hinzugefügt",
|
||||
"utilities": "Hilfsmittel",
|
||||
"validate": "Validieren",
|
||||
"validate_endpoint_error": "Bitte gib eine gültige URL ein",
|
||||
@@ -1929,6 +2016,7 @@
|
||||
"view_album": "Album anzeigen",
|
||||
"view_all": "Alles anzeigen",
|
||||
"view_all_users": "Alle Nutzer anzeigen",
|
||||
"view_details": "Details ansehen",
|
||||
"view_in_timeline": "In Zeitleiste anzeigen",
|
||||
"view_link": "Link anzeigen",
|
||||
"view_links": "Links anzeigen",
|
||||
|
||||
89
i18n/el.json
@@ -166,6 +166,20 @@
|
||||
"metadata_settings_description": "Διαχείρηση ρυθμίσεων μεταδεδομένων",
|
||||
"migration_job": "Μεταφορά δεδομένων (Migration)",
|
||||
"migration_job_description": "Μεταφορά των εικονιδίων για αρχεία και πρόσωπα στην πιο πρόσφατη δομή αρχείων",
|
||||
"nightly_tasks_cluster_faces_setting_description": "Εκτέλεση αναγνώρισης προσώπου σε νέα ανιχνευμένα πρόσωπα",
|
||||
"nightly_tasks_cluster_new_faces_setting": "Ομαδοποίηση νέων προσώπων",
|
||||
"nightly_tasks_database_cleanup_setting": "Εργασίες καθαρισμού βάσης δεδομένων",
|
||||
"nightly_tasks_database_cleanup_setting_description": "Εκκαθάριση παλιών και ληγμένων δεδομένων από τη βάση δεδομένων",
|
||||
"nightly_tasks_generate_memories_setting": "Δημιουργία αναμνήσεων",
|
||||
"nightly_tasks_generate_memories_setting_description": "Δημιουργία νέων αναμνήσεων από αντικείμενα",
|
||||
"nightly_tasks_missing_thumbnails_setting": "Δημιουργία ελλειπόντων μικρογραφιών",
|
||||
"nightly_tasks_missing_thumbnails_setting_description": "Τοποθέτηση στη ουρά των αρχείων χωρίς μικρογραφίες για δημιουργία μικρογραφιών",
|
||||
"nightly_tasks_settings": "Ρυθμίσεις για τις νυχτερινές εργασίες",
|
||||
"nightly_tasks_settings_description": "Διαχείριση νυχτερινών εργασιών",
|
||||
"nightly_tasks_start_time_setting": "Ώρα έναρξης",
|
||||
"nightly_tasks_start_time_setting_description": "Η ώρα κατά την οποία ο διακομιστής ξεκινάει να εκτελεί τις νυχτερινές εργασίες",
|
||||
"nightly_tasks_sync_quota_usage_setting": "Συγχρονισμός χρήσης χώρου",
|
||||
"nightly_tasks_sync_quota_usage_setting_description": "Ενημέρωση του διαθέσιμου χώρου χρήστη, με βάση την τρέχουσα χρήση",
|
||||
"no_paths_added": "Δεν προστέθηκαν διαδρομές",
|
||||
"no_pattern_added": "Δεν προστέθηκε μοτίβο",
|
||||
"note_apply_storage_label_previous_assets": "Σημείωση: Για να εφαρμοστεί η Ετικέτα Αποθήκευσης σε στοιχεία που είχαν αναρτηθεί παλαιότερα, εκτέλεσε το",
|
||||
@@ -196,6 +210,8 @@
|
||||
"oauth_mobile_redirect_uri": "URI Ανακατεύθυνσης για κινητά τηλέφωνα",
|
||||
"oauth_mobile_redirect_uri_override": "Προσπέλαση URI ανακατεύθυνσης για κινητά τηλέφωνα",
|
||||
"oauth_mobile_redirect_uri_override_description": "Ενεργοποιήστε το όταν ο πάροχος OAuth δεν επιτρέπει μια URI για κινητά, όπως το ''{callback}''",
|
||||
"oauth_role_claim": "Ανάθεση ρόλου",
|
||||
"oauth_role_claim_description": "Αυτόματη παραχώρηση πρόσβασης διαχειριστή με βάση την ύπαρξη αυτής της ανάθεσης. Η ανάθεση μπορεί να είναι είτε 'χρήστης' είτε 'διαχειριστής'.",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Διαχείριση ρυθμίσεων σύνδεσης OAuth",
|
||||
"oauth_settings_more_details": "Για περισσότερες λεπτομέρειες σχετικά με αυτήν τη δυνατότητα, ανατρέξτε στην <link>τεκμηρίωση</link>.",
|
||||
@@ -357,10 +373,12 @@
|
||||
"admin_password": "Κωδικός πρόσβασης Διαχειριστή",
|
||||
"administration": "Διαχείριση",
|
||||
"advanced": "Για προχωρημένους",
|
||||
"advanced_settings_beta_timeline_subtitle": "Δοκίμασε τη νέα εμπειρία της εφαρμογής",
|
||||
"advanced_settings_beta_timeline_title": "Δοκιμαστικό χρονολόγιο",
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Χρησιμοποιήστε αυτήν την επιλογή για να φιλτράρετε τα μέσα ενημέρωσης κατά τον συγχρονισμό με βάση εναλλακτικά κριτήρια. Δοκιμάστε αυτή τη δυνατότητα μόνο αν έχετε προβλήματα με την εφαρμογή που εντοπίζει όλα τα άλμπουμ.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "[ΠΕΙΡΑΜΑΤΙΚΟ] Χρήση εναλλακτικού φίλτρου συγχρονισμού άλμπουμ συσκευής",
|
||||
"advanced_settings_log_level_title": "Επίπεδο σύνδεσης: {level}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Μερικές συσκευές αργούν πολύ να φορτώσουν μικρογραφίες από αρχεία στη συσκευή. Ενεργοποιήστε αυτήν τη ρύθμιση για να φορτώνονται αντί αυτού απομακρυσμένες εικόνες.",
|
||||
"advanced_settings_prefer_remote_subtitle": "Μερικές συσκευές αργούν πολύ να φορτώσουν μικρογραφίες από τοπικά αρχεία. Ενεργοποιήστε αυτήν τη ρύθμιση για να φορτώνονται αντί αυτού απομακρυσμένες εικόνες.",
|
||||
"advanced_settings_prefer_remote_title": "Προτίμηση απομακρυσμένων εικόνων",
|
||||
"advanced_settings_proxy_headers_subtitle": "Καθορισμός κεφαλίδων διακομιστή μεσολάβησης που το Immich πρέπει να στέλνει με κάθε αίτημα δικτύου",
|
||||
"advanced_settings_proxy_headers_title": "Κεφαλίδες διακομιστή μεσολάβησης",
|
||||
@@ -379,6 +397,7 @@
|
||||
"album_cover_updated": "Το εξώφυλλο του άλμπουμ, ενημερώθηκε",
|
||||
"album_delete_confirmation": "Είστε σίγουροι ότι θέλετε να διαγράψετε το άλμπουμ {album};",
|
||||
"album_delete_confirmation_description": "Εάν αυτό το άλμπουμ είναι κοινόχρηστο, οι άλλοι χρήστες δεν θα μπορούν να έχουν πρόσβαση.",
|
||||
"album_deleted": "Το άλμπουμ διαγράφηκε",
|
||||
"album_info_card_backup_album_excluded": "ΕΞΑΙΡΟΥΜΕΝΟ",
|
||||
"album_info_card_backup_album_included": "ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΟ",
|
||||
"album_info_updated": "Οι πληροφορίες του άλμπουμ, ενημερώθηκαν",
|
||||
@@ -388,6 +407,7 @@
|
||||
"album_options": "Επιλογές άλμπουμ",
|
||||
"album_remove_user": "Διαγραφή χρήστη;",
|
||||
"album_remove_user_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε τον/την {user};",
|
||||
"album_search_not_found": "Δε βρέθηκαν άλμπουμ που να ταιριάζουν με την αναζήτησή σας",
|
||||
"album_share_no_users": "Φαίνεται ότι έχετε κοινοποιήσει αυτό το άλμπουμ σε όλους τους χρήστες ή δεν έχετε χρήστες για να το κοινοποιήσετε.",
|
||||
"album_updated": "Το άλμπουμ, ενημερώθηκε",
|
||||
"album_updated_setting_description": "Λάβετε ειδοποίηση μέσω email όταν ένα κοινόχρηστο άλμπουμ έχει νέα αρχεία",
|
||||
@@ -407,6 +427,7 @@
|
||||
"albums_default_sort_order": "Προεπιλεγμένη ταξινόμηση άλμπουμ",
|
||||
"albums_default_sort_order_description": "Αρχική ταξινόμηση κατά τη δημιουργία νέων άλμπουμ.",
|
||||
"albums_feature_description": "Συλλογές στοιχείων που μπορούν να κοινοποιηθούν σε άλλους χρήστες.",
|
||||
"albums_on_device_count": "Άλμπουμ στη συσκευή ({count})",
|
||||
"all": "Όλα",
|
||||
"all_albums": "Όλα τα άλμπουμ",
|
||||
"all_people": "Όλα τα άτομα",
|
||||
@@ -427,6 +448,7 @@
|
||||
"app_settings": "Ρυθμίσεις εφαρμογής",
|
||||
"appears_in": "Εμφανίζεται σε",
|
||||
"archive": "Αρχείο",
|
||||
"archive_action_prompt": "Προστέθηκαν {count} στο Αρχείο",
|
||||
"archive_or_unarchive_photo": "Αρχειοθέτηση ή αποαρχειοθέτηση φωτογραφίας",
|
||||
"archive_page_no_archived_assets": "Δε βρέθηκαν αρχειοθετημένα στοιχεία",
|
||||
"archive_page_title": "Αρχείο ({count})",
|
||||
@@ -464,7 +486,6 @@
|
||||
"assets": "Αντικείμενα",
|
||||
"assets_added_count": "Προστέθηκε {count, plural, one {# αρχείο} other {# αρχεία}}",
|
||||
"assets_added_to_album_count": "Προστέθηκε {count, plural, one {# αρχείο} other {# αρχεία}} στο άλμπουμ",
|
||||
"assets_added_to_name_count": "Προστέθηκε {count, plural, one {# αρχείο} other {# αρχεία}} στο {hasName, select, true {<b>{name}</b>} other {νέο άλμπουμ}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Στοιχείο} other {Στοιχεία}} δεν μπορούν να προστεθούν στο άλμπουμ",
|
||||
"assets_count": "{count, plural, one {# αρχείο} other {# αρχεία}}",
|
||||
"assets_deleted_permanently": "{count} τα στοιχεία διαγράφηκαν οριστικά",
|
||||
@@ -490,6 +511,7 @@
|
||||
"back_close_deselect": "Πίσω, κλείσιμο ή αποεπιλογή",
|
||||
"background_location_permission": "Άδεια τοποθεσίας στο παρασκήνιο",
|
||||
"background_location_permission_content": "Το Immich για να μπορεί να αλλάζει δίκτυα όταν τρέχει στο παρασκήνιο, πρέπει *πάντα* να έχει πρόσβαση στην ακριβή τοποθεσία ώστε η εφαρμογή να μπορεί να διαβάζει το όνομα του δικτύου Wi-Fi",
|
||||
"backup": "Αντίγραφα ασφαλείας",
|
||||
"backup_album_selection_page_albums_device": "Άλμπουμ στη συσκευή ({count})",
|
||||
"backup_album_selection_page_albums_tap": "Πάτημα για συμπερίληψη, διπλό πάτημα για εξαίρεση",
|
||||
"backup_album_selection_page_assets_scatter": "Τα στοιχεία μπορεί να διασκορπιστούν σε πολλά άλμπουμ. Έτσι, τα άλμπουμ μπορούν να περιληφθούν ή να εξαιρεθούν κατά τη διαδικασία δημιουργίας αντιγράφων ασφαλείας.",
|
||||
@@ -553,6 +575,8 @@
|
||||
"backup_options_page_title": "Επιλογές αντιγράφων ασφαλείας",
|
||||
"backup_setting_subtitle": "Διαχείριση ρυθμίσεων μεταφόρτωσης στο παρασκήνιο και στο προσκήνιο",
|
||||
"backward": "Προς τα πίσω",
|
||||
"beta_sync": "Κατάσταση Συγχρονισμού Beta (δοκιμαστική)",
|
||||
"beta_sync_subtitle": "Διαχείριση του νέου συστήματος συγχρονισμού",
|
||||
"biometric_auth_enabled": "Βιομετρική ταυτοποίηση ενεργοποιήθηκε",
|
||||
"biometric_locked_out": "Είστε κλειδωμένοι εκτός της βιομετρικής ταυτοποίησης",
|
||||
"biometric_no_options": "Δεν υπάρχουν διαθέσιμοι τρόποι βιομετρικής ταυτοποίησης",
|
||||
@@ -587,6 +611,7 @@
|
||||
"cancel": "Ακύρωση",
|
||||
"cancel_search": "Ακύρωση αναζήτησης",
|
||||
"canceled": "Ακυρωμένο",
|
||||
"canceling": "Ακυρώνεται",
|
||||
"cannot_merge_people": "Αδύνατη η συγχώνευση ατόμων",
|
||||
"cannot_undo_this_action": "Δεν μπορείτε να αναιρέσετε αυτήν την ενέργεια!",
|
||||
"cannot_update_the_description": "Αδύνατη η ενημέρωση της περιγραφής",
|
||||
@@ -700,10 +725,11 @@
|
||||
"current_server_address": "Τρέχουσα διεύθυνση διακομιστή",
|
||||
"custom_locale": "Προσαρμοσμένη Τοπική Ρύθμιση",
|
||||
"custom_locale_description": "Μορφοποιήστε τις ημερομηνίες και τους αριθμούς, σύμφωνα με τη γλώσσα και την περιοχή",
|
||||
"custom_url": "Προσαρμοσμένη διεύθυνση URL",
|
||||
"daily_title_text_date": "Ε, MMM dd",
|
||||
"daily_title_text_date_year": "Ε, MMM dd, yyyy",
|
||||
"dark": "Σκούρο",
|
||||
"darkTheme": "Εναλλαγή σκούρου θέματος",
|
||||
"dark_theme": "Εναλλαγή σκοτεινής εμφάνισης",
|
||||
"date_after": "Ημερομηνία μετά",
|
||||
"date_and_time": "Ημερομηνία και ώρα",
|
||||
"date_before": "Ημερομηνία πριν",
|
||||
@@ -719,6 +745,8 @@
|
||||
"default_locale": "Προεπιλεγμένη Τοπική Ρύθμιση",
|
||||
"default_locale_description": "Μορφοποιήστε τις ημερομηνίες και τους αριθμούς με βάση την τοπική ρύθμιση του προγράμματος περιήγησής σας",
|
||||
"delete": "Διαγραφή",
|
||||
"delete_action_confirmation_message": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο; Αυτή η ενέργεια θα το μετακινήσει στον κάδο απορριμμάτων του διακομιστή και θα εμφανιστεί μήνυμα για το αν θέλετε να το διαγράψετε και τοπικά",
|
||||
"delete_action_prompt": "{count} διαγράφηκαν",
|
||||
"delete_album": "Διαγραφή άλμπουμ",
|
||||
"delete_api_key_prompt": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό κλειδί API;",
|
||||
"delete_dialog_alert": "Αυτά τα αντικείμενα θα διαγραφούν οριστικά από το Immich και από τη συσκευή σας",
|
||||
@@ -732,9 +760,12 @@
|
||||
"delete_key": "Διαγραφή κλειδιού",
|
||||
"delete_library": "Διαγραφή Βιβλιοθήκης",
|
||||
"delete_link": "Διαγραφή συνδέσμου",
|
||||
"delete_local_action_prompt": "{count} διαγράφηκαν τοπικά",
|
||||
"delete_local_dialog_ok_backed_up_only": "Διαγραφή μόνο των αντιγράφων ασφαλείας",
|
||||
"delete_local_dialog_ok_force": "Διαγραφή όπως και να έχει",
|
||||
"delete_others": "Διαγραφή υπολοίπων",
|
||||
"delete_permanently": "Διαγραφή οριστικά",
|
||||
"delete_permanently_action_prompt": "{count} διαγράφηκε οριστικά",
|
||||
"delete_shared_link": "Διαγραφή κοινόχρηστου συνδέσμου",
|
||||
"delete_shared_link_dialog_title": "Διαγραφή Κοινοποιημένου Συνδέσμου",
|
||||
"delete_tag": "Διαγραφή ετικέτας",
|
||||
@@ -745,6 +776,7 @@
|
||||
"description": "Περιγραφή",
|
||||
"description_input_hint_text": "Προσθήκη περιγραφής...",
|
||||
"description_input_submit_error": "Σφάλμα κατά την ενημέρωση της περιγραφής, ελέγξτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες",
|
||||
"deselect_all": "Ακύρωση όλων των επιλογών",
|
||||
"details": "Λεπτομέρειες",
|
||||
"direction": "Κατεύθυνση",
|
||||
"disabled": "Απενεργοποιημένο",
|
||||
@@ -762,6 +794,7 @@
|
||||
"documentation": "Τεκμηρίωση",
|
||||
"done": "Έγινε",
|
||||
"download": "Λήψη",
|
||||
"download_action_prompt": "Κατέβασμα {count} στοιχείων",
|
||||
"download_canceled": "Η λήψη ακυρώθηκε",
|
||||
"download_complete": "Η λήψη ολοκληρώθηκε",
|
||||
"download_enqueue": "Η λήψη τέθηκε σε ουρά",
|
||||
@@ -799,6 +832,7 @@
|
||||
"edit_key": "Επεξεργασία κλειδιού",
|
||||
"edit_link": "Επεξεργασία συνδέσμου",
|
||||
"edit_location": "Επεξεργασία τοποθεσίας",
|
||||
"edit_location_action_prompt": "Επεξεργάστηκαν {count} τοποθεσίες",
|
||||
"edit_location_dialog_title": "Τοποθεσία",
|
||||
"edit_name": "Επεξεργασία ονόματος",
|
||||
"edit_people": "Επεξεργασία ατόμων",
|
||||
@@ -817,6 +851,7 @@
|
||||
"empty_trash": "Άδειασμα κάδου απορριμμάτων",
|
||||
"empty_trash_confirmation": "Είστε σίγουροι οτι θέλετε να αδειάσετε τον κάδο απορριμμάτων; Αυτό θα αφαιρέσει μόνιμα όλα τα στοιχεία του κάδου απορριμμάτων του Immich. \nΑυτή η ενέργεια δεν μπορεί να αναιρεθεί!",
|
||||
"enable": "Ενεργοποίηση",
|
||||
"enable_backup": "Ενεργοποίηση αντιγράφου ασφαλείας",
|
||||
"enable_biometric_auth_description": "Εισάγετε τον κωδικό PIN σας για να ενεργοποιήσετε την βιομετρική ταυτοποίηση",
|
||||
"enabled": "Ενεργοποιημένο",
|
||||
"end_date": "Τελική ημερομηνία",
|
||||
@@ -973,6 +1008,8 @@
|
||||
"explorer": "Περιηγητής",
|
||||
"export": "Εξαγωγή",
|
||||
"export_as_json": "Εξαγωγή ως JSON",
|
||||
"export_database": "Εξαγωγή βάσης δεδομένων",
|
||||
"export_database_description": "Εξαγωγή της SQLite βάσης δεδομένων",
|
||||
"extension": "Επέκταση",
|
||||
"external": "Εξωτερικός",
|
||||
"external_libraries": "Εξωτερικές βιβλιοθήκες",
|
||||
@@ -984,6 +1021,7 @@
|
||||
"failed_to_load_assets": "Αποτυχία φόρτωσης στοιχείων",
|
||||
"failed_to_load_folder": "Αποτυχία φόρτωσης φακέλου",
|
||||
"favorite": "Αγαπημένο",
|
||||
"favorite_action_prompt": "Προστέθηκαν {count} στα Αγαπημένα",
|
||||
"favorite_or_unfavorite_photo": "Ορίστε μία φωτογραφία ως αγαπημένη ή αφαιρέστε την από τα αγαπημένα",
|
||||
"favorites": "Αγαπημένα",
|
||||
"favorites_page_no_favorites": "Δεν βρέθηκαν αγαπημένα στοιχεία",
|
||||
@@ -1023,6 +1061,9 @@
|
||||
"haptic_feedback_switch": "Ενεργοποίηση απτικής ανάδρασης",
|
||||
"haptic_feedback_title": "Απτική Ανάδραση",
|
||||
"has_quota": "Έχει ποσόστωση",
|
||||
"hash_asset": "Κατακερματισμός στοιχείου",
|
||||
"hashed_assets": "Κατακερματισμένα στοιχεία",
|
||||
"hashing": "Κατακερματισμός",
|
||||
"header_settings_add_header_tip": "Προσθήκη Κεφαλίδας",
|
||||
"header_settings_field_validator_msg": "Η τιμή δεν μπορεί να είναι κενή",
|
||||
"header_settings_header_name_input": "Όνομα κεφαλίδας",
|
||||
@@ -1055,6 +1096,7 @@
|
||||
"host": "Φιλοξενία",
|
||||
"hour": "Ώρα",
|
||||
"id": "ID",
|
||||
"idle": "Αδράνεια",
|
||||
"ignore_icloud_photos": "Αγνοήστε τις φωτογραφίες iCloud",
|
||||
"ignore_icloud_photos_description": "Οι φωτογραφίες που είναι αποθηκευμένες στο iCloud δεν θα μεταφορτωθούν στον διακομιστή Immich",
|
||||
"image": "Εικόνα",
|
||||
@@ -1112,6 +1154,7 @@
|
||||
"language_no_results_title": "Δε βρέθηκαν γλώσσες",
|
||||
"language_search_hint": "Αναζήτηση γλωσσών...",
|
||||
"language_setting_description": "Επιλέξτε τη γλώσσα που προτιμάτε",
|
||||
"large_files": "Μεγάλα Αρχεία",
|
||||
"last_seen": "Τελευταία προβολή",
|
||||
"latest_version": "Τελευταία Έκδοση",
|
||||
"latitude": "Γεωγραφικό πλάτος",
|
||||
@@ -1127,16 +1170,18 @@
|
||||
"library_page_sort_created": "Ημερομηνία δημιουργίας",
|
||||
"library_page_sort_last_modified": "Τελευταία τροποποίηση",
|
||||
"library_page_sort_title": "Τίτλος άλμπουμ",
|
||||
"licenses": "Άδειες",
|
||||
"light": "Φωτεινό",
|
||||
"like_deleted": "Το \"μου αρέσει\" διαγράφηκε",
|
||||
"link_motion_video": "Σύνδεσε βίντεο κίνησης",
|
||||
"link_options": "Επιλογές συνδέσμου",
|
||||
"link_to_oauth": "Σύνδεση στον OAuth",
|
||||
"linked_oauth_account": "Ο OAuth λογαριασμός συνδέθηκε",
|
||||
"list": "Λίστα",
|
||||
"loading": "Φόρτωση",
|
||||
"loading_search_results_failed": "Η φόρτωση αποτελεσμάτων αναζήτησης απέτυχε",
|
||||
"local": "Τοπικά",
|
||||
"local_asset_cast_failed": "Αδυναμία μετάδοσης στοιχείου που δεν έχει ανέβει στον διακομιστή",
|
||||
"local_assets": "Τοπικά στοιχεία",
|
||||
"local_network": "Τοπικό δίκτυο",
|
||||
"local_network_sheet_info": "Η εφαρμογή θα συνδεθεί με τον διακομιστή μέσω αυτού του URL όταν χρησιμοποιείται το καθορισμένο δίκτυο Wi-Fi",
|
||||
"location_permission": "Άδεια τοποθεσίας",
|
||||
@@ -1193,8 +1238,7 @@
|
||||
"manage_your_devices": "Διαχειριστείτε τις συνδεδεμένες συσκευές σας",
|
||||
"manage_your_oauth_connection": "Διαχειριστείτε τη σύνδεσή σας OAuth",
|
||||
"map": "Χάρτης",
|
||||
"map_assets_in_bound": "{count} φωτογραφία",
|
||||
"map_assets_in_bounds": "{count} φωτογραφίες",
|
||||
"map_assets_in_bounds": "{count, plural, one {# φωτογραφία} other {# φωτογραφίες}}",
|
||||
"map_cannot_get_user_location": "Δεν είναι δυνατή η λήψη της τοποθεσίας του χρήστη",
|
||||
"map_location_dialog_yes": "Ναι",
|
||||
"map_location_picker_page_use_location": "Χρησιμοποιήστε αυτήν την τοποθεσία",
|
||||
@@ -1246,6 +1290,7 @@
|
||||
"more": "Περισσότερα",
|
||||
"move": "Μετακίνηση",
|
||||
"move_off_locked_folder": "Μετακίνηση έξω από τον κλειδωμένο φάκελο",
|
||||
"move_to_lock_folder_action_prompt": "Προστέθηκαν {count} στον κλειδωμένο φάκελο",
|
||||
"move_to_locked_folder": "Μετακίνηση σε κλειδωμένο φάκελο",
|
||||
"move_to_locked_folder_confirmation": "Αυτές οι φωτογραφίες και τα βίντεο θα αφαιρεθούν από όλα τα άλμπουμ και θα μπορούν να προβληθούν μόνο από τον κλειδωμένο φάκελο",
|
||||
"moved_to_archive": "Μετακινήθηκαν {count, plural, one {# στοιχείο} other {# στοιχεία}} στο αρχείο",
|
||||
@@ -1292,6 +1337,7 @@
|
||||
"no_results": "Κανένα αποτέλεσμα",
|
||||
"no_results_description": "Δοκιμάστε ένα συνώνυμο ή πιο γενική λέξη-κλειδί",
|
||||
"no_shared_albums_message": "Δημιουργήστε ένα άλμπουμ για να μοιράζεστε φωτογραφίες και βίντεο με άτομα στο δίκτυό σας",
|
||||
"no_uploads_in_progress": "Καμία μεταφόρτωση σε εξέλιξη",
|
||||
"not_in_any_album": "Σε κανένα άλμπουμ",
|
||||
"not_selected": "Δεν επιλέχθηκε",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "Σημείωση: Για να εφαρμόσετε την Ετικέτα Αποθήκευσης σε στοιχεία που έχουν μεταφορτωθεί προηγουμένως, εκτελέστε το",
|
||||
@@ -1329,6 +1375,7 @@
|
||||
"original": "πρωτότυπο",
|
||||
"other": "Άλλες",
|
||||
"other_devices": "Άλλες συσκευές",
|
||||
"other_entities": "Άλλες οντότητες",
|
||||
"other_variables": "Άλλες μεταβλητές",
|
||||
"owned": "Δικά μου",
|
||||
"owner": "Κάτοχος",
|
||||
@@ -1460,6 +1507,7 @@
|
||||
"purchase_server_description_2": "Κατάσταση υποστηρικτή",
|
||||
"purchase_server_title": "Διακομιστής",
|
||||
"purchase_settings_server_activated": "Η διαχείριση του κλειδιού προϊόντος του διακομιστή γίνεται από τον διαχειριστή",
|
||||
"queue_status": "Τοποθέτηση στη ουρά {count} από {total}",
|
||||
"rating": "Αξιολόγηση με αστέρια",
|
||||
"rating_clear": "Εκκαθάριση αξιολόγησης",
|
||||
"rating_count": "{count, plural, one {# αστέρι} other {# αστέρια}}",
|
||||
@@ -1488,6 +1536,8 @@
|
||||
"refreshing_faces": "Ανανεώνονται πρόσωπα",
|
||||
"refreshing_metadata": "Τα μεταδεδομένα ανανεώνονται",
|
||||
"regenerating_thumbnails": "Οι μικρογραφίες αναγεννώνται",
|
||||
"remote": "Απομακρυσμένος",
|
||||
"remote_assets": "Απομακρυσμένα στοιχεία",
|
||||
"remove": "Αφαίρεση",
|
||||
"remove_assets_album_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count, plural, one {# στοιχείο} other {# στοιχεία}} από το άλμπουμ;",
|
||||
"remove_assets_shared_link_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count, plural, one {# στοιχείο} other {# στοιχεία}} από αυτόν τον κοινόχρηστο σύνδεσμο;",
|
||||
@@ -1495,7 +1545,9 @@
|
||||
"remove_custom_date_range": "Αφαίρεση προσαρμοσμένης χρονικής περιόδου",
|
||||
"remove_deleted_assets": "Αφαίρεση Διεγραμμένων Στοιχείων",
|
||||
"remove_from_album": "Αφαίρεση από το άλμπουμ",
|
||||
"remove_from_album_action_prompt": "{count} αφαιρέθηκαν από το άλμπουμ",
|
||||
"remove_from_favorites": "Αφαίρεση από τα αγαπημένα",
|
||||
"remove_from_lock_folder_action_prompt": "{count} αφαιρέθηκαν από τον κλειδωμένο φάκελο",
|
||||
"remove_from_locked_folder": "Αφαίρεση από κλειδωμένο φάκελο",
|
||||
"remove_from_locked_folder_confirmation": "Είστε σίγουροι ότι θέλετε να μετακινήσετε αυτές τις φωτογραφίες και τα βίντεο από τον κλειδωμένο φάκελο; Θα είναι πλέον ορατές στη βιβλιοθήκη σας.",
|
||||
"remove_from_shared_link": "Αφαίρεση από τον κοινόχρηστο σύνδεσμο",
|
||||
@@ -1523,19 +1575,25 @@
|
||||
"reset_password": "Επαναφορά κωδικού πρόσβασης",
|
||||
"reset_people_visibility": "Επαναφορά προβολής ατόμων",
|
||||
"reset_pin_code": "Επαναφορά κωδικού PIN",
|
||||
"reset_sqlite": "Επαναφορά SQLite βάσης δεδομένων",
|
||||
"reset_sqlite_confirmation": "Είσαι σίγουρος ότι θέλεις να επαναφέρεις τη βάση δεδομένων SQLite; Θα χρειαστεί να κάνεις αποσύνδεση και επανασύνδεση για να επανασυγχρονίσεις τα δεδομένα",
|
||||
"reset_sqlite_success": "Η επαναφορά της SQLite βάσης δεδομένων ολοκληρώθηκε με επιτυχία",
|
||||
"reset_to_default": "Επαναφορά στις προεπιλογές",
|
||||
"resolve_duplicates": "Επίλυση διπλοτύπων",
|
||||
"resolved_all_duplicates": "Επιλύθηκαν όλα τα διπλότυπα",
|
||||
"restore": "Ανάκτηση",
|
||||
"restore_all": "Ανάκτηση όλων",
|
||||
"restore_trash_action_prompt": "{count} ανακτήθηκαν από τα απορρίμματα",
|
||||
"restore_user": "Επαναφορά χρήστη",
|
||||
"restored_asset": "Ανακτήθηκε το αρχείο",
|
||||
"resume": "Συνέχιση",
|
||||
"retry_upload": "Επανάληψη ανεβάσματος",
|
||||
"review_duplicates": "Προβολή διπλότυπων",
|
||||
"review_large_files": "Επισκόπηση μεγάλων αρχείων",
|
||||
"role": "Ρόλος",
|
||||
"role_editor": "Επεξεργαστής",
|
||||
"role_viewer": "Θεατής",
|
||||
"running": "Σε λειτουργία",
|
||||
"save": "Αποθήκευση",
|
||||
"save_to_gallery": "Αποθήκευση στη συλλογή",
|
||||
"saved_api_key": "Αποθηκευμένο API key",
|
||||
@@ -1667,6 +1725,7 @@
|
||||
"settings_saved": "Οι ρυθμίσεις αποθηκεύτηκαν",
|
||||
"setup_pin_code": "Ρύθμιση κωδικού PIN",
|
||||
"share": "Κοινοποίηση",
|
||||
"share_action_prompt": "Κοινή χρήση {count} στοιχείων",
|
||||
"share_add_photos": "Προσθήκη φωτογραφιών",
|
||||
"share_assets_selected": "{count} επιλεγμένα",
|
||||
"share_dialog_preparing": "Προετοιμασία...",
|
||||
@@ -1688,6 +1747,7 @@
|
||||
"shared_link_clipboard_copied_massage": "Αντιγράφηκε στο πρόχειρο",
|
||||
"shared_link_clipboard_text": "Σύνδεσμος: {link}\nΚωδικός πρόσβασης: {password}",
|
||||
"shared_link_create_error": "Σφάλμα κατά τη δημιουργία κοινόχρηστου συνδέσμου",
|
||||
"shared_link_custom_url_description": "Αποκτήστε πρόσβαση σε αυτόν τον κοινόχρηστο σύνδεσμο με μια προσαρμοσμένη διεύθυνση URL",
|
||||
"shared_link_edit_description_hint": "Εισαγάγετε την περιγραφή της κοινής χρήσης",
|
||||
"shared_link_edit_expire_after_option_day": "1 ημέρα",
|
||||
"shared_link_edit_expire_after_option_days": "{count} ημέρες",
|
||||
@@ -1713,6 +1773,7 @@
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Διαχείριση Κοινόχρηστων Συνδέσμων",
|
||||
"shared_link_options": "Επιλογές κοινόχρηστου συνδέσμου",
|
||||
"shared_link_password_description": "Απαίτηση κωδικού για πρόσβαση στον κοινοποιημένο σύνδεσμο",
|
||||
"shared_links": "Κοινόχρηστοι σύνδεσμοι",
|
||||
"shared_links_description": "Μοιραστείτε φωτογραφίες και βίντεο με σύνδεσμο",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# κοινόχρηστες φωτογραφίες & βίντεο.}}",
|
||||
@@ -1768,6 +1829,7 @@
|
||||
"sort_title": "Τίτλος",
|
||||
"source": "Πηγή",
|
||||
"stack": "Στοίβα",
|
||||
"stack_action_prompt": "{count} συσσωρεύτηκαν",
|
||||
"stack_duplicates": "Στοίβαξη διπλότυπων",
|
||||
"stack_select_one_photo": "Επιλέξτε μια κύρια φωτογραφία για τη στοίβαξη",
|
||||
"stack_selected_photos": "Στοίβαγμα επιλεγμένων φωτογραφιών",
|
||||
@@ -1787,6 +1849,7 @@
|
||||
"storage_quota": "Ποσοστό αποθηκευτικού χώρου",
|
||||
"storage_usage": "{used} από {available} σε χρήση",
|
||||
"submit": "Υποβολή",
|
||||
"success": "Επιτυχία",
|
||||
"suggestions": "Προτάσεις",
|
||||
"sunrise_on_the_beach": "Ηλιοβασίλεμα στην παραλία",
|
||||
"support": "Υποστήριξη",
|
||||
@@ -1796,6 +1859,8 @@
|
||||
"sync": "Συγχρονισμός",
|
||||
"sync_albums": "Συγχρονισμός άλμπουμ",
|
||||
"sync_albums_manual_subtitle": "Συγχρονίστε όλα τα μεταφορτωμένα βίντεο και φωτογραφίες με τα επιλεγμένα εφεδρικά άλμπουμ",
|
||||
"sync_local": "Τοπικός Συγχρονισμός",
|
||||
"sync_remote": "Απομακρυσμένος Συγχρονισμός",
|
||||
"sync_upload_album_setting_subtitle": "Δημιουργήστε και ανεβάστε τις φωτογραφίες και τα βίντεό σας στα επιλεγμένα άλμπουμ στο Immich",
|
||||
"tag": "Ετικέτα",
|
||||
"tag_assets": "Ετικετοποίηση στοιχείων",
|
||||
@@ -1806,6 +1871,7 @@
|
||||
"tag_updated": "Ενημερώθηκε η ετικέτα: {tag}",
|
||||
"tagged_assets": "Ετικετοποιημένο/α {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
||||
"tags": "Ετικέτες",
|
||||
"tap_to_run_job": "Πατήστε για να ξεκινήσει η εργασία",
|
||||
"template": "Πρότυπο",
|
||||
"theme": "Θέμα",
|
||||
"theme_selection": "Επιλογή θέματος",
|
||||
@@ -1838,6 +1904,7 @@
|
||||
"total": "Σύνολο",
|
||||
"total_usage": "Συνολικη χρηση",
|
||||
"trash": "Κάδος απορριμμάτων",
|
||||
"trash_action_prompt": "{count} μετακινήθηκαν στα απορρίμματα",
|
||||
"trash_all": "Διαγραφή Όλων",
|
||||
"trash_count": "Διαγραφή {count, number}",
|
||||
"trash_delete_asset": "Διαγραφή/Οριστ. Διαγραφή Αντικειμένου",
|
||||
@@ -1855,9 +1922,11 @@
|
||||
"unable_to_change_pin_code": "Αδυναμία αλλαγής κωδικού PIN",
|
||||
"unable_to_setup_pin_code": "Αδυναμία ρύθμισης κωδικού PIN",
|
||||
"unarchive": "Αναίρεση αρχειοθέτησης",
|
||||
"unarchive_action_prompt": "{count} αφαιρέθηκαν από το Αρχείο",
|
||||
"unarchived_count": "{count, plural, other {Αρχειοθετήσεις αναιρέθηκαν #}}",
|
||||
"undo": "Αναίρεση",
|
||||
"unfavorite": "Αποεπιλογή από τα αγαπημένα",
|
||||
"unfavorite_action_prompt": "{count} αφαιρέθηκαν από τα Αγαπημένα",
|
||||
"unhide_person": "Αναίρεση απόκρυψης ατόμου",
|
||||
"unknown": "Άγνωστο",
|
||||
"unknown_country": "Άγνωστη Χώρα",
|
||||
@@ -1875,15 +1944,20 @@
|
||||
"unselect_all_duplicates": "Αποεπιλογή όλων των διπλότυπων",
|
||||
"unselect_all_in": "Αποεπιλογή όλων στο {group}",
|
||||
"unstack": "Αποστοίβαξη",
|
||||
"unstack_action_prompt": "{count} αποσυσσωρεύτηκαν",
|
||||
"unstacked_assets_count": "Αποστοιβάξατε {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
||||
"untagged": "Χωρίς ετικέτα",
|
||||
"up_next": "Ακολουθεί",
|
||||
"updated_at": "Ενημερωμένο",
|
||||
"updated_password": "Ο κωδικός πρόσβασης ενημερώθηκε",
|
||||
"upload": "Μεταφόρτωση",
|
||||
"upload_action_prompt": "{count} τοποθετήθηκαν στην ουρά για μεταφόρτωση",
|
||||
"upload_concurrency": "Ταυτόχρονη μεταφόρτωση",
|
||||
"upload_details": "Λεπτομέρειες μεταφόρτωσης",
|
||||
"upload_dialog_info": "Θέλετε να αντιγράψετε (κάνετε backup) τα επιλεγμένo(α) στοιχείο(α) στο διακομιστή;",
|
||||
"upload_dialog_title": "Ανέβασμα στοιχείου",
|
||||
"upload_errors": "Η μεταφόρτωση ολοκληρώθηκε με {count, plural, one {# σφάλμα} other {# σφάλματα}}, ανανεώστε τη σελίδα για να δείτε νέα στοιχεία μεταφόρτωσης.",
|
||||
"upload_finished": "Ολοκλήρωση μεταφόρτωσης",
|
||||
"upload_progress": "Απομένουν {remaining, number} - Ολοκληρώθηκαν {processed, number}/{total, number}",
|
||||
"upload_skipped_duplicates": "Παραλείφθηκαν {count, plural, one {# διπλότυπο στοιχείο} other {# διπλότυπα στοιχεία}}",
|
||||
"upload_status_duplicates": "Διπλότυπα",
|
||||
@@ -1892,6 +1966,7 @@
|
||||
"upload_success": "Η μεταφόρτωση ολοκληρώθηκε, ανανεώστε τη σελίδα για να δείτε τα νέα αντικείμενα.",
|
||||
"upload_to_immich": "Μεταφόρτωση στο Immich ({count})",
|
||||
"uploading": "Μεταφορτώνεται",
|
||||
"uploading_media": "Μεταφόρτωση πολυμέσων",
|
||||
"url": "URL",
|
||||
"usage": "Χρήση",
|
||||
"use_biometric": "Χρήση βιομετρικών στοιχείων",
|
||||
@@ -1912,6 +1987,7 @@
|
||||
"user_usage_stats_description": "Προβολή στατιστικών χρήσης λογαριασμού",
|
||||
"username": "Όνομα Χρήστη",
|
||||
"users": "Χρήστες",
|
||||
"users_added_to_album_count": "Προστέθηκε {count, plural, one {# χρήστης} other {# χρήστες}} στο άλμπουμ",
|
||||
"utilities": "Βοηθητικά προγράμματα",
|
||||
"validate": "Επικύρωση",
|
||||
"validate_endpoint_error": "Παρακαλώ εισάγετε ένα έγκυρο URL",
|
||||
@@ -1930,6 +2006,7 @@
|
||||
"view_album": "Προβολή Άλμπουμ",
|
||||
"view_all": "Προβολή Όλων",
|
||||
"view_all_users": "Προβολή όλων των χρηστών",
|
||||
"view_details": "Προβολή Λεπτομερειών",
|
||||
"view_in_timeline": "Προβολή στο χρονοδιάγραμμα",
|
||||
"view_link": "Προβολή σύνδεσμου",
|
||||
"view_links": "Προβολή συνδέσμων",
|
||||
|
||||