Compare commits
216 Commits
drift-auth
...
chore/use_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12e31fafa1 | ||
|
|
0167ec1668 | ||
|
|
845b0f2073 | ||
|
|
acb1e513a7 | ||
|
|
4d4e54967d | ||
|
|
e2dcebfe6c | ||
|
|
d4f2b43f64 | ||
|
|
f343b0e58f | ||
|
|
a8b4a5e856 | ||
|
|
e7e030279b | ||
|
|
9ff664ed36 | ||
|
|
e00556a34a | ||
|
|
a313e4338e | ||
|
|
257b0c74af | ||
|
|
3d515f5072 | ||
|
|
ec01db5c8b | ||
|
|
cd6d8fcdfe | ||
|
|
1198311d64 | ||
|
|
1a4eab9655 | ||
|
|
1926c90780 | ||
|
|
4d5975b717 | ||
|
|
8cbd6b29c4 | ||
|
|
8c1b630a2b | ||
|
|
c961d2aaf7 | ||
|
|
41c75dc93e | ||
|
|
f92247c99b | ||
|
|
53f9fc2d1c | ||
|
|
bede19a3ca | ||
|
|
aefa62b234 | ||
|
|
b3fb831994 | ||
|
|
0d60199514 | ||
|
|
54960157c0 | ||
|
|
244d097d01 | ||
|
|
adb55f3726 | ||
|
|
5d2777a5c6 | ||
|
|
24db881c14 | ||
|
|
f09bed9ad2 | ||
|
|
e29cc66361 | ||
|
|
669b765662 | ||
|
|
e7060dc292 | ||
|
|
03a8b6cb38 | ||
|
|
f317cbe221 | ||
|
|
d6d31c6695 | ||
|
|
4b9019e762 | ||
|
|
13563fc507 | ||
|
|
2ce4f8dd3b | ||
|
|
538d5c81ea | ||
|
|
9ecaa3fa9d | ||
|
|
b1aacfdbd9 | ||
|
|
cfbc24579d | ||
|
|
1d4d8e7a9a | ||
|
|
7b83b7b2d5 | ||
|
|
a896c5a4dd | ||
|
|
c74989d304 | ||
|
|
1283491cc2 | ||
|
|
89522daaac | ||
|
|
011a667314 | ||
|
|
df2525ee08 | ||
|
|
01a9f735c8 | ||
|
|
af10c3bc2f | ||
|
|
395f2e155d | ||
|
|
10cbed55c4 | ||
|
|
325d5f7ba9 | ||
|
|
746252fe39 | ||
|
|
f36efd128b | ||
|
|
f1c494ef97 | ||
|
|
9c8c52874a | ||
|
|
68b617130a | ||
|
|
89292fecb4 | ||
|
|
1193a23282 | ||
|
|
bbfff64927 | ||
|
|
c5c9a522c1 | ||
|
|
3cd7f5ab90 | ||
|
|
f2067221c5 | ||
|
|
89598cf0be | ||
|
|
0121043d7d | ||
|
|
1ca46fbd98 | ||
|
|
6ddef3a7e4 | ||
|
|
0d9ebdc46a | ||
|
|
fa26d0de33 | ||
|
|
a5760129f0 | ||
|
|
d430b869ac | ||
|
|
4179c8a17d | ||
|
|
0a9cbf01d2 | ||
|
|
9567a2a560 | ||
|
|
58dd6f094c | ||
|
|
02381343ff | ||
|
|
09a5963eee | ||
|
|
a573a23c83 | ||
|
|
7118dca559 | ||
|
|
13d43e193e | ||
|
|
7a7843467c | ||
|
|
9e6fee4064 | ||
|
|
9680f1290d | ||
|
|
ce2ea98926 | ||
|
|
5c76cc34e1 | ||
|
|
eb2f4c866e | ||
|
|
2a370087e8 | ||
|
|
272c8a5812 | ||
|
|
08fe549ed8 | ||
|
|
ae15efdf2a | ||
|
|
8e003f95db | ||
|
|
3e92e837f1 | ||
|
|
081307ced2 | ||
|
|
a91bb399f0 | ||
|
|
42b78c59b5 | ||
|
|
750d21aeba | ||
|
|
990d9ba9a8 | ||
|
|
4d0c9172e5 | ||
|
|
094e3a2757 | ||
|
|
278668b8c5 | ||
|
|
10141504a2 | ||
|
|
67736c8fce | ||
|
|
b56a272f64 | ||
|
|
5901c2e963 | ||
|
|
be85832b20 | ||
|
|
c8f9a72d3e | ||
|
|
3d633a81c4 | ||
|
|
4efbf36d82 | ||
|
|
e2c3c39597 | ||
|
|
007ba1d9ef | ||
|
|
4d5cd1a6b5 | ||
|
|
8108f50c4e | ||
|
|
1b8354ed36 | ||
|
|
9242afb4b0 | ||
|
|
c5f14adff0 | ||
|
|
1378f22368 | ||
|
|
4bd465e752 | ||
|
|
a07531be3b | ||
|
|
3cdc6844a1 | ||
|
|
c3263e50fc | ||
|
|
7391ea6ff9 | ||
|
|
f972b8d514 | ||
|
|
6b50d958f4 | ||
|
|
27c456eb75 | ||
|
|
e7d051db3c | ||
|
|
86d31d7d29 | ||
|
|
f416342eff | ||
|
|
d73335ecbc | ||
|
|
641a3baadd | ||
|
|
f85d8add01 | ||
|
|
c278b7ad17 | ||
|
|
10e9c278ee | ||
|
|
47a025f39f | ||
|
|
749f999f2a | ||
|
|
d5a01c0310 | ||
|
|
097e132fba | ||
|
|
da5deffd03 | ||
|
|
9f20522df5 | ||
|
|
baadf9db20 | ||
|
|
4ea4ee40af | ||
|
|
d8a6552811 | ||
|
|
444133a72b | ||
|
|
29f16c6a47 | ||
|
|
268b411a6f | ||
|
|
07ed060c32 | ||
|
|
2f5d543ad9 | ||
|
|
9b65cd4d7b | ||
|
|
290e325c5c | ||
|
|
58521c9efb | ||
|
|
4cae15f28d | ||
|
|
e6ec019852 | ||
|
|
3b5e00131b | ||
|
|
a0fa7318ed | ||
|
|
2a005629a0 | ||
|
|
59a50b8697 | ||
|
|
90eac40e02 | ||
|
|
ad6f7f8089 | ||
|
|
056b262cba | ||
|
|
cfae134ecf | ||
|
|
fbbb6af27a | ||
|
|
1804a8fe58 | ||
|
|
ae1d60e259 | ||
|
|
7d759edfcc | ||
|
|
34974b036c | ||
|
|
e52b9d15b5 | ||
|
|
9b3718120b | ||
|
|
16b14b390f | ||
|
|
7e7b8da128 | ||
|
|
66ea75072d | ||
|
|
d34670bae6 | ||
|
|
1e1c2ea627 | ||
|
|
c7fcb23a23 | ||
|
|
708e42d8a3 | ||
|
|
d15f67da5d | ||
|
|
6becf409da | ||
|
|
ee4ae40d61 | ||
|
|
ebd644eedd | ||
|
|
7c36cbaf0f | ||
|
|
3a5d82f790 | ||
|
|
b14c768208 | ||
|
|
07cb2fb04e | ||
|
|
9bbad45990 | ||
|
|
e85655d34c | ||
|
|
d0576697c3 | ||
|
|
f9847bee51 | ||
|
|
f2141de5bb | ||
|
|
cb344cb014 | ||
|
|
c6b25ef111 | ||
|
|
0fdeac0417 | ||
|
|
153bb70f6e | ||
|
|
da80b69062 | ||
|
|
f9292c9c96 | ||
|
|
2e0ee6ec05 | ||
|
|
7f2e4f85f8 | ||
|
|
c63f805cb4 | ||
|
|
03a13828e1 | ||
|
|
e5ee1c8db6 | ||
|
|
25e2d37490 | ||
|
|
ed5759fe07 | ||
|
|
edefed56ae | ||
|
|
13281f8531 | ||
|
|
b48406bd20 | ||
|
|
06c78dfa91 | ||
|
|
de67d22bc0 | ||
|
|
b4780e89af |
@@ -11,8 +11,8 @@ services:
|
|||||||
- open_api_node_modules:/workspaces/immich/open-api/typescript-sdk/node_modules
|
- open_api_node_modules:/workspaces/immich/open-api/typescript-sdk/node_modules
|
||||||
- server_node_modules:/workspaces/immich/server/node_modules
|
- server_node_modules:/workspaces/immich/server/node_modules
|
||||||
- web_node_modules:/workspaces/immich/web/node_modules
|
- web_node_modules:/workspaces/immich/web/node_modules
|
||||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos:/data
|
||||||
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
|
||||||
database:
|
database:
|
||||||
|
|||||||
@@ -49,10 +49,11 @@ fix_permissions() {
|
|||||||
|
|
||||||
log "Fixing permissions for ${IMMICH_WORKSPACE}"
|
log "Fixing permissions for ${IMMICH_WORKSPACE}"
|
||||||
|
|
||||||
run_cmd sudo find "${IMMICH_WORKSPACE}/server/upload" -not -path "${IMMICH_WORKSPACE}/server/upload/postgres/*" -not -path "${IMMICH_WORKSPACE}/server/upload/postgres" -exec chown node {} +
|
|
||||||
|
|
||||||
# Change ownership for directories that exist
|
# Change ownership for directories that exist
|
||||||
for dir in "${IMMICH_WORKSPACE}/.vscode" \
|
for dir in "${IMMICH_WORKSPACE}/.vscode" \
|
||||||
|
"${IMMICH_WORKSPACE}/server/upload" \
|
||||||
|
"${IMMICH_WORKSPACE}/.pnpm-store" \
|
||||||
|
"${IMMICH_WORKSPACE}/.github/node_modules" \
|
||||||
"${IMMICH_WORKSPACE}/cli/node_modules" \
|
"${IMMICH_WORKSPACE}/cli/node_modules" \
|
||||||
"${IMMICH_WORKSPACE}/e2e/node_modules" \
|
"${IMMICH_WORKSPACE}/e2e/node_modules" \
|
||||||
"${IMMICH_WORKSPACE}/open-api/typescript-sdk/node_modules" \
|
"${IMMICH_WORKSPACE}/open-api/typescript-sdk/node_modules" \
|
||||||
|
|||||||
@@ -8,21 +8,13 @@ services:
|
|||||||
- IMMICH_SERVER_URL=http://127.0.0.1:2283/
|
- IMMICH_SERVER_URL=http://127.0.0.1:2283/
|
||||||
volumes: !override
|
volumes: !override
|
||||||
- ..:/workspaces/immich
|
- ..:/workspaces/immich
|
||||||
- cli_node_modules:/workspaces/immich/cli/node_modules
|
- ${UPLOAD_LOCATION:-upload1-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data
|
||||||
- e2e_node_modules:/workspaces/immich/e2e/node_modules
|
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/data/upload
|
||||||
- open_api_node_modules:/workspaces/immich/open-api/typescript-sdk/node_modules
|
|
||||||
- server_node_modules:/workspaces/immich/server/node_modules
|
|
||||||
- web_node_modules:/workspaces/immich/web/node_modules
|
|
||||||
- ${UPLOAD_LOCATION:-upload1-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/usr/src/app/upload
|
|
||||||
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/usr/src/app/upload/upload
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
|
||||||
immich-web:
|
immich-web:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
|
|
||||||
immich-machine-learning:
|
immich-machine-learning:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
|
|
||||||
database:
|
database:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
environment: !override
|
environment: !override
|
||||||
@@ -33,17 +25,10 @@ services:
|
|||||||
POSTGRES_HOST_AUTH_METHOD: md5
|
POSTGRES_HOST_AUTH_METHOD: md5
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION:-postgres-devcontainer-volume}${UPLOAD_LOCATION:+/postgres}:/var/lib/postgresql/data
|
- ${UPLOAD_LOCATION:-postgres-devcontainer-volume}${UPLOAD_LOCATION:+/postgres}:/var/lib/postgresql/data
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
env_file: !reset []
|
env_file: !reset []
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
# Node modules for each service to avoid conflicts and ensure consistent dependencies
|
# Node modules for each service to avoid conflicts and ensure consistent dependencies
|
||||||
cli_node_modules:
|
|
||||||
e2e_node_modules:
|
|
||||||
open_api_node_modules:
|
|
||||||
server_node_modules:
|
|
||||||
web_node_modules:
|
|
||||||
upload1-devcontainer-volume:
|
upload1-devcontainer-volume:
|
||||||
upload2-devcontainer-volume:
|
upload2-devcontainer-volume:
|
||||||
postgres-devcontainer-volume:
|
postgres-devcontainer-volume:
|
||||||
|
|||||||
@@ -3,15 +3,20 @@
|
|||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
source /immich-devcontainer/container-common.sh
|
source /immich-devcontainer/container-common.sh
|
||||||
|
|
||||||
|
log "Preparing Immich Nest API Server"
|
||||||
|
log ""
|
||||||
|
export CI=1
|
||||||
|
run_cmd pnpm --filter immich install
|
||||||
|
|
||||||
log "Starting Nest API Server"
|
log "Starting Nest API Server"
|
||||||
log ""
|
log ""
|
||||||
cd "${IMMICH_WORKSPACE}/server" || (
|
cd "${IMMICH_WORKSPACE}/server" || (
|
||||||
log "Immich workspace not found"
|
log "Immich workspace not found"jj
|
||||||
exit 1
|
exit 1
|
||||||
)
|
)
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
run_cmd node ./node_modules/.bin/nest start --debug "0.0.0.0:9230" --watch
|
run_cmd pnpm --filter immich exec nest start --debug "0.0.0.0:9230" --watch
|
||||||
log "Nest API Server crashed with exit code $?. Respawning in 3s ..."
|
log "Nest API Server crashed with exit code $?. Respawning in 3s ..."
|
||||||
sleep 3
|
sleep 3
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -3,6 +3,13 @@
|
|||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
source /immich-devcontainer/container-common.sh
|
source /immich-devcontainer/container-common.sh
|
||||||
|
|
||||||
|
export CI=1
|
||||||
|
log "Preparing Immich Web Frontend"
|
||||||
|
log ""
|
||||||
|
run_cmd pnpm --filter @immich/sdk install
|
||||||
|
run_cmd pnpm --filter @immich/sdk build
|
||||||
|
run_cmd pnpm --filter immich-web install
|
||||||
|
|
||||||
log "Starting Immich Web Frontend"
|
log "Starting Immich Web Frontend"
|
||||||
log ""
|
log ""
|
||||||
cd "${IMMICH_WORKSPACE}/web" || (
|
cd "${IMMICH_WORKSPACE}/web" || (
|
||||||
@@ -16,7 +23,7 @@ until curl --output /dev/null --silent --head --fail "http://127.0.0.1:${IMMICH_
|
|||||||
done
|
done
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
run_cmd node ./node_modules/.bin/vite dev --host 0.0.0.0 --port "${DEV_PORT}"
|
run_cmd pnpm --filter immich-web exec vite dev --host 0.0.0.0 --port "${DEV_PORT}"
|
||||||
log "Web crashed with exit code $?. Respawning in 3s ..."
|
log "Web crashed with exit code $?. Respawning in 3s ..."
|
||||||
sleep 3
|
sleep 3
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ source /immich-devcontainer/container-common.sh
|
|||||||
log "Setting up Immich dev container..."
|
log "Setting up Immich dev container..."
|
||||||
fix_permissions
|
fix_permissions
|
||||||
|
|
||||||
log "Installing npm dependencies (node_modules)..."
|
|
||||||
install_dependencies
|
|
||||||
|
|
||||||
log "Setup complete, please wait while backend and frontend services automatically start"
|
log "Setup complete, please wait while backend and frontend services automatically start"
|
||||||
log
|
log
|
||||||
log "If necessary, the services may be manually started using"
|
log "If necessary, the services may be manually started using"
|
||||||
|
|||||||
2
.github/.nvmrc
vendored
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
28
.github/package-lock.json
generated
vendored
@@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"name": ".github",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"": {
|
|
||||||
"devDependencies": {
|
|
||||||
"prettier": "^3.5.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prettier": {
|
|
||||||
"version": "3.6.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
|
|
||||||
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"bin": {
|
|
||||||
"prettier": "bin/prettier.cjs"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
25
.github/workflows/cli.yml
vendored
@@ -33,21 +33,24 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
# Setup .npmrc file to publish to npm
|
- name: Setup pnpm
|
||||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
|
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './cli/.nvmrc'
|
node-version-file: './cli/.nvmrc'
|
||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Prepare SDK
|
- name: Setup typescript-sdk
|
||||||
run: npm ci --prefix ../open-api/typescript-sdk/
|
run: pnpm install && pnpm run build
|
||||||
- name: Build SDK
|
working-directory: ./open-api/typescript-sdk
|
||||||
run: npm run build --prefix ../open-api/typescript-sdk/
|
|
||||||
- run: npm ci
|
- run: pnpm install --frozen-lockfile
|
||||||
- run: npm run build
|
- run: pnpm build
|
||||||
- run: npm publish
|
- run: pnpm publish
|
||||||
if: ${{ github.event_name == 'release' }}
|
if: ${{ github.event_name == 'release' }}
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|||||||
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. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \
|
||||||
|
-f query='
|
||||||
|
mutation CommentAndCloseIssue($issueId: ID!, $body: String!) {
|
||||||
|
addComment(input: {
|
||||||
|
subjectId: $issueId,
|
||||||
|
body: $body
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
|
||||||
|
closeIssue(input: {
|
||||||
|
issueId: $issueId,
|
||||||
|
stateReason: DUPLICATE
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
|
||||||
|
- name: Close discussion
|
||||||
|
if: ${{ github.event_name == 'discussion' && github.event.discussion.category.name == 'Feature Request' }}
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
NODE_ID: ${{ github.event.discussion.node_id }}
|
||||||
|
run: |
|
||||||
|
gh api graphql \
|
||||||
|
-f discussionId="$NODE_ID" \
|
||||||
|
-f body="This discussion has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \
|
||||||
|
-f query='
|
||||||
|
mutation CommentAndCloseDiscussion($discussionId: ID!, $body: String!) {
|
||||||
|
addDiscussionComment(input: {
|
||||||
|
discussionId: $discussionId,
|
||||||
|
body: $body
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
|
||||||
|
closeDiscussion(input: {
|
||||||
|
discussionId: $discussionId,
|
||||||
|
reason: DUPLICATE
|
||||||
|
}) {
|
||||||
|
__typename
|
||||||
|
}
|
||||||
|
}'
|
||||||
6
.github/workflows/codeql-analysis.yml
vendored
@@ -50,7 +50,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/init@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@@ -63,7 +63,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/autobuild@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
@@ -76,6 +76,6 @@ jobs:
|
|||||||
# ./location_of_script_within_repo/buildscript.sh
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/analyze@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||||
with:
|
with:
|
||||||
category: '/language:${{matrix.language}}'
|
category: '/language:${{matrix.language}}'
|
||||||
|
|||||||
19
.github/workflows/docs-build.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
outputs:
|
outputs:
|
||||||
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.found_paths.outputs.open-api == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
@@ -32,6 +32,8 @@ jobs:
|
|||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
workflow:
|
workflow:
|
||||||
- '.github/workflows/docs-build.yml'
|
- '.github/workflows/docs-build.yml'
|
||||||
|
open-api:
|
||||||
|
- 'open-api/immich-openapi-specs.json'
|
||||||
- name: Check if we should force jobs to run
|
- name: Check if we should force jobs to run
|
||||||
id: should_force
|
id: should_force
|
||||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
|
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
|
||||||
@@ -53,21 +55,24 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './docs/.nvmrc'
|
node-version-file: './docs/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run npm install
|
- name: Run install
|
||||||
run: npm ci
|
run: pnpm install
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
|
|
||||||
- name: Run build
|
- name: Run build
|
||||||
run: npm run build
|
run: pnpm build
|
||||||
|
|
||||||
- name: Upload build output
|
- name: Upload build output
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
|
|||||||
4
.github/workflows/fix-format.yml
vendored
@@ -32,8 +32,8 @@ jobs:
|
|||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Fix formatting
|
- name: Fix formatting
|
||||||
run: make install-all && make format-all
|
run: make install-all && make format-all
|
||||||
|
|||||||
14
.github/workflows/preview-label.yaml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
|
|
||||||
remove-label:
|
remove-label:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ github.event.action == 'closed' && contains(github.event.pull_request.labels.*.name, 'preview') }}
|
if: ${{ (github.event.action == 'closed' || github.event.pull_request.head.repo.fork) && contains(github.event.pull_request.labels.*.name, 'preview') }}
|
||||||
permissions:
|
permissions:
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
@@ -33,3 +33,15 @@ jobs:
|
|||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
name: 'preview'
|
name: 'preview'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
- uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2
|
||||||
|
if: ${{ github.event.pull_request.head.repo.fork }}
|
||||||
|
with:
|
||||||
|
message-id: 'preview-status'
|
||||||
|
message: 'PRs from forks cannot have preview environments.'
|
||||||
|
|
||||||
|
- uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2
|
||||||
|
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||||
|
with:
|
||||||
|
message-id: 'preview-status'
|
||||||
|
message: 'Preview environment has been removed.'
|
||||||
|
|||||||
13
.github/workflows/sdk.yml
vendored
@@ -20,18 +20,21 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
|
|
||||||
# Setup .npmrc file to publish to npm
|
# Setup .npmrc file to publish to npm
|
||||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './open-api/typescript-sdk/.nvmrc'
|
node-version-file: './open-api/typescript-sdk/.nvmrc'
|
||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
- name: Build
|
- name: Build
|
||||||
run: npm run build
|
run: pnpm build
|
||||||
- name: Publish
|
- name: Publish
|
||||||
run: npm publish
|
run: pnpm publish
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|||||||
7
.github/workflows/static_analysis.yml
vendored
@@ -90,7 +90,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
||||||
run: |
|
run: |
|
||||||
echo "ERROR: Generated files not up to date! Run make_build inside the mobile directory"
|
echo "ERROR: Generated files not up to date! Run 'make build' and 'make pigeon' inside the mobile directory"
|
||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
@@ -98,8 +98,7 @@ jobs:
|
|||||||
run: dart analyze --fatal-infos
|
run: dart analyze --fatal-infos
|
||||||
|
|
||||||
- name: Run dart format
|
- name: Run dart format
|
||||||
# Ignore generated files manually until https://github.com/dart-lang/dart_style/issues/864 is resolved
|
run: make format
|
||||||
run: dart format --set-exit-if-changed $(find lib -name '*.dart' -not \( -name 'generated_plugin_registrant.dart' -o -name '*.g.dart' -o -name '*.drift.dart' \))
|
|
||||||
|
|
||||||
- name: Run dart custom_lint
|
- name: Run dart custom_lint
|
||||||
run: dart run custom_lint
|
run: dart run custom_lint
|
||||||
@@ -130,7 +129,7 @@ jobs:
|
|||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Upload SARIF file
|
- name: Upload SARIF file
|
||||||
uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
category: zizmor
|
category: zizmor
|
||||||
|
|||||||
461
.github/workflows/test.yml
vendored
@@ -4,13 +4,10 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
permissions: {}
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pre-job:
|
pre-job:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -32,7 +29,6 @@ jobs:
|
|||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- id: found_paths
|
- id: found_paths
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||||
with:
|
with:
|
||||||
@@ -58,11 +54,9 @@ jobs:
|
|||||||
- '.github/workflows/test.yml'
|
- '.github/workflows/test.yml'
|
||||||
.github:
|
.github:
|
||||||
- '.github/**'
|
- '.github/**'
|
||||||
|
|
||||||
- name: Check if we should force jobs to run
|
- name: Check if we should force jobs to run
|
||||||
id: should_force
|
id: should_force
|
||||||
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
|
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
server-unit-tests:
|
server-unit-tests:
|
||||||
name: Test & Lint Server
|
name: Test & Lint Server
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -73,39 +67,33 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./server
|
working-directory: ./server
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
- name: Run package manager install
|
||||||
- name: Run npm install
|
run: pnpm install
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint
|
run: pnpm lint
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run small tests & coverage
|
- name: Run small tests & coverage
|
||||||
run: npm test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
cli-unit-tests:
|
cli-unit-tests:
|
||||||
name: Unit Test CLI
|
name: Unit Test CLI
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -116,43 +104,36 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./cli
|
working-directory: ./cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './cli/.nvmrc'
|
node-version-file: './cli/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Setup typescript-sdk
|
- name: Setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install && pnpm run build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: npm ci
|
run: pnpm install
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint
|
run: pnpm lint
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run unit tests & coverage
|
- name: Run unit tests & coverage
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
cli-unit-tests-win:
|
cli-unit-tests-win:
|
||||||
name: Unit Test CLI (Windows)
|
name: Unit Test CLI (Windows)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -163,36 +144,31 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./cli
|
working-directory: ./cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './cli/.nvmrc'
|
node-version-file: './cli/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Setup typescript-sdk
|
- name: Setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
# Skip linter & formatter in Windows test.
|
# Skip linter & formatter in Windows test.
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run unit tests & coverage
|
- name: Run unit tests & coverage
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
web-lint:
|
web-lint:
|
||||||
name: Lint Web
|
name: Lint Web
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -203,39 +179,33 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./web
|
working-directory: ./web
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './web/.nvmrc'
|
node-version-file: './web/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
- name: Run pnpm install
|
||||||
- name: Run npm install
|
run: pnpm rebuild && pnpm install --frozen-lockfile
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint:p
|
run: pnpm lint:p
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run svelte checks
|
- name: Run svelte checks
|
||||||
run: npm run check:svelte
|
run: pnpm check:svelte
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
web-unit-tests:
|
web-unit-tests:
|
||||||
name: Test Web
|
name: Test Web
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -246,35 +216,30 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./web
|
working-directory: ./web
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './web/.nvmrc'
|
node-version-file: './web/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
|
|
||||||
- name: Run npm install
|
- name: Run npm install
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check:typescript
|
run: pnpm check:typescript
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run unit tests & coverage
|
- name: Run unit tests & coverage
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
i18n-tests:
|
i18n-tests:
|
||||||
name: Test i18n
|
name: Test i18n
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -287,27 +252,24 @@ jobs:
|
|||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './web/.nvmrc'
|
node-version-file: './web/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm --prefix=web ci
|
run: pnpm --filter=immich-web install --frozen-lockfile
|
||||||
|
|
||||||
- name: Format
|
- name: Format
|
||||||
run: npm --prefix=web run format:i18n
|
run: pnpm --filter=immich-web format:i18n
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
i18n/**
|
i18n/**
|
||||||
|
|
||||||
- name: Verify files have not changed
|
- name: Verify files have not changed
|
||||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||||
env:
|
env:
|
||||||
@@ -316,7 +278,6 @@ jobs:
|
|||||||
echo "ERROR: i18n files not up to date!"
|
echo "ERROR: i18n files not up to date!"
|
||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
e2e-tests-lint:
|
e2e-tests-lint:
|
||||||
name: End-to-End Lint
|
name: End-to-End Lint
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -327,41 +288,35 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./e2e
|
working-directory: ./e2e
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './e2e/.nvmrc'
|
node-version-file: './e2e/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: npm run lint
|
run: pnpm lint
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run check
|
run: pnpm check
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
server-medium-tests:
|
server-medium-tests:
|
||||||
name: Medium Tests (Server)
|
name: Medium Tests (Server)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -372,27 +327,24 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./server
|
working-directory: ./server
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
- name: Run pnpm install
|
||||||
- name: Run npm install
|
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run medium tests
|
- name: Run medium tests
|
||||||
run: npm run test:medium
|
run: pnpm test:medium
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
e2e-tests-server-cli:
|
e2e-tests-server-cli:
|
||||||
name: End-to-End Tests (Server & CLI)
|
name: End-to-End Tests (Server & CLI)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -406,43 +358,41 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './e2e/.nvmrc'
|
node-version-file: './e2e/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
- name: Run setup web
|
||||||
|
run: pnpm install --frozen-lockfile && pnpm exec svelte-kit sync
|
||||||
|
working-directory: ./web
|
||||||
|
if: ${{ !cancelled() }}
|
||||||
- name: Run setup cli
|
- name: Run setup cli
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./cli
|
working-directory: ./cli
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Docker build
|
- name: Docker build
|
||||||
run: docker compose build
|
run: docker compose build
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run e2e tests (api & cli)
|
- name: Run e2e tests (api & cli)
|
||||||
run: npm run test
|
run: pnpm test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
e2e-tests-web:
|
e2e-tests-web:
|
||||||
name: End-to-End Tests (Web)
|
name: End-to-End Tests (Web)
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -456,42 +406,36 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
runner: [ubuntu-latest, ubuntu-24.04-arm]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './e2e/.nvmrc'
|
node-version-file: './e2e/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Run setup typescript-sdk
|
- name: Run setup typescript-sdk
|
||||||
run: npm ci && npm run build
|
run: pnpm install --frozen-lockfile && pnpm build
|
||||||
working-directory: ./open-api/typescript-sdk
|
working-directory: ./open-api/typescript-sdk
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
run: npx playwright install chromium --only-shell
|
run: npx playwright install chromium --only-shell
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Docker build
|
- name: Docker build
|
||||||
run: docker compose build
|
run: docker compose build
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
- name: Run e2e tests (web)
|
- name: Run e2e tests (web)
|
||||||
run: npx playwright test
|
run: npx playwright test
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
success-check-e2e:
|
success-check-e2e:
|
||||||
name: End-to-End Tests Success
|
name: End-to-End Tests Success
|
||||||
needs: [e2e-tests-server-cli, e2e-tests-web]
|
needs: [e2e-tests-server-cli, e2e-tests-web]
|
||||||
@@ -502,7 +446,6 @@ jobs:
|
|||||||
- uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
|
- uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
|
||||||
with:
|
with:
|
||||||
needs: ${{ toJSON(needs) }}
|
needs: ${{ toJSON(needs) }}
|
||||||
|
|
||||||
mobile-unit-tests:
|
mobile-unit-tests:
|
||||||
name: Unit Test Mobile
|
name: Unit Test Mobile
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -514,21 +457,19 @@ jobs:
|
|||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Setup Flutter SDK
|
- name: Setup Flutter SDK
|
||||||
uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
|
uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
|
||||||
with:
|
with:
|
||||||
channel: 'stable'
|
channel: 'stable'
|
||||||
flutter-version-file: ./mobile/pubspec.yaml
|
flutter-version-file: ./mobile/pubspec.yaml
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Generate translation file
|
- name: Generate translation file
|
||||||
run: make translation
|
run: make translation
|
||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
run: flutter test -j 1
|
run: flutter test -j 1
|
||||||
|
|
||||||
ml-unit-tests:
|
ml-unit-tests:
|
||||||
name: Unit Test ML
|
name: Unit Test ML
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -543,7 +484,6 @@ jobs:
|
|||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Install uv
|
- name: Install uv
|
||||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
|
||||||
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
||||||
@@ -566,7 +506,6 @@ jobs:
|
|||||||
- name: Run tests and coverage
|
- name: Run tests and coverage
|
||||||
run: |
|
run: |
|
||||||
uv run pytest --cov=immich_ml --cov-report term-missing
|
uv run pytest --cov=immich_ml --cov-report term-missing
|
||||||
|
|
||||||
github-files-formatting:
|
github-files-formatting:
|
||||||
name: .github Files Formatting
|
name: .github Files Formatting
|
||||||
needs: pre-job
|
needs: pre-job
|
||||||
@@ -577,27 +516,24 @@ jobs:
|
|||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./.github
|
working-directory: ./.github
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './.github/.nvmrc'
|
node-version-file: './.github/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
- name: Run pnpm install
|
||||||
- name: Run npm install
|
run: pnpm install --frozen-lockfile
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run formatter
|
- name: Run formatter
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
shellcheck:
|
shellcheck:
|
||||||
name: ShellCheck
|
name: ShellCheck
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -607,15 +543,11 @@ jobs:
|
|||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Run ShellCheck
|
- name: Run ShellCheck
|
||||||
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
|
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
|
||||||
with:
|
with:
|
||||||
ignore_paths: >-
|
ignore_paths: >-
|
||||||
**/open-api/**
|
**/open-api/** **/openapi** **/node_modules/**
|
||||||
**/openapi**
|
|
||||||
**/node_modules/**
|
|
||||||
|
|
||||||
generated-api-up-to-date:
|
generated-api-up-to-date:
|
||||||
name: OpenAPI Clients
|
name: OpenAPI Clients
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -626,23 +558,20 @@ jobs:
|
|||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Install server dependencies
|
- name: Install server dependencies
|
||||||
run: npm --prefix=server ci
|
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich install --frozen-lockfile
|
||||||
|
|
||||||
- name: Build the app
|
- name: Build the app
|
||||||
run: npm --prefix=server run build
|
run: pnpm --filter immich build
|
||||||
|
|
||||||
- name: Run API generation
|
- name: Run API generation
|
||||||
run: make open-api
|
run: make open-api
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
@@ -651,7 +580,6 @@ jobs:
|
|||||||
mobile/openapi
|
mobile/openapi
|
||||||
open-api/typescript-sdk
|
open-api/typescript-sdk
|
||||||
open-api/immich-openapi-specs.json
|
open-api/immich-openapi-specs.json
|
||||||
|
|
||||||
- name: Verify files have not changed
|
- name: Verify files have not changed
|
||||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||||
env:
|
env:
|
||||||
@@ -660,7 +588,6 @@ jobs:
|
|||||||
echo "ERROR: Generated files not up to date!"
|
echo "ERROR: Generated files not up to date!"
|
||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
sql-schema-up-to-date:
|
sql-schema-up-to-date:
|
||||||
name: SQL Schema Checks
|
name: SQL Schema Checks
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -668,51 +595,42 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:1f5583fe3397210a0fbc7f11b0cec18bacc4a99e3e8ea0548e9bd6bcf26ec37a
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:ec713143dca1a426eba2e03707c319e2ec3cc9d304ef767f777f8e297dee820c
|
||||||
env:
|
env:
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: postgres
|
||||||
POSTGRES_DB: immich
|
POSTGRES_DB: immich
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd pg_isready
|
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
||||||
--health-interval 10s
|
|
||||||
--health-timeout 5s
|
|
||||||
--health-retries 5
|
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: ./server
|
working-directory: ./server
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: './server/.nvmrc'
|
node-version-file: './server/.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: '**/package-lock.json'
|
cache-dependency-path: '**/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Install server dependencies
|
- name: Install server dependencies
|
||||||
run: npm ci
|
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Build the app
|
- name: Build the app
|
||||||
run: npm run build
|
run: pnpm build
|
||||||
|
|
||||||
- name: Run existing migrations
|
- name: Run existing migrations
|
||||||
run: npm run migrations:run
|
run: pnpm migrations:run
|
||||||
|
|
||||||
- name: Test npm run schema:reset command works
|
- name: Test npm run schema:reset command works
|
||||||
run: npm run schema:reset
|
run: pnpm schema:reset
|
||||||
|
|
||||||
- name: Generate new migrations
|
- name: Generate new migrations
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: npm run migrations:generate src/TestMigration
|
run: pnpm migrations:generate src/TestMigration
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
@@ -728,19 +646,16 @@ jobs:
|
|||||||
echo "Changed files: ${CHANGED_FILES}"
|
echo "Changed files: ${CHANGED_FILES}"
|
||||||
cat ./src/*-TestMigration.ts
|
cat ./src/*-TestMigration.ts
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Run SQL generation
|
- name: Run SQL generation
|
||||||
run: npm run sync:sql
|
run: pnpm sync:sql
|
||||||
env:
|
env:
|
||||||
DB_URL: postgres://postgres:postgres@localhost:5432/immich
|
DB_URL: postgres://postgres:postgres@localhost:5432/immich
|
||||||
|
|
||||||
- name: Find file changes
|
- name: Find file changes
|
||||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||||
id: verify-changed-sql-files
|
id: verify-changed-sql-files
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
server/src/queries
|
server/src/queries
|
||||||
|
|
||||||
- name: Verify SQL files have not changed
|
- name: Verify SQL files have not changed
|
||||||
if: steps.verify-changed-sql-files.outputs.files_changed == 'true'
|
if: steps.verify-changed-sql-files.outputs.files_changed == 'true'
|
||||||
env:
|
env:
|
||||||
@@ -751,77 +666,77 @@ jobs:
|
|||||||
git diff
|
git diff
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
# mobile-integration-tests:
|
# mobile-integration-tests:
|
||||||
# name: Run mobile end-to-end integration tests
|
# name: Run mobile end-to-end integration tests
|
||||||
# runs-on: macos-latest
|
# runs-on: macos-latest
|
||||||
# steps:
|
# steps:
|
||||||
# - uses: actions/checkout@v4
|
# - uses: actions/checkout@v4
|
||||||
# - uses: actions/setup-java@v3
|
# - uses: actions/setup-java@v3
|
||||||
# with:
|
# with:
|
||||||
# distribution: 'zulu'
|
# distribution: 'zulu'
|
||||||
# java-version: '12.x'
|
# java-version: '12.x'
|
||||||
# cache: 'gradle'
|
# cache: 'gradle'
|
||||||
# - name: Cache android SDK
|
# - name: Cache android SDK
|
||||||
# uses: actions/cache@v3
|
# uses: actions/cache@v3
|
||||||
# id: android-sdk
|
# id: android-sdk
|
||||||
# with:
|
# with:
|
||||||
# key: android-sdk
|
# key: android-sdk
|
||||||
# path: |
|
# path: |
|
||||||
# /usr/local/lib/android/
|
# /usr/local/lib/android/
|
||||||
# ~/.android
|
# ~/.android
|
||||||
# - name: Cache Gradle
|
# - name: Cache Gradle
|
||||||
# uses: actions/cache@v3
|
# uses: actions/cache@v3
|
||||||
# with:
|
# with:
|
||||||
# path: |
|
# path: |
|
||||||
# ./mobile/build/
|
# ./mobile/build/
|
||||||
# ./mobile/android/.gradle/
|
# ./mobile/android/.gradle/
|
||||||
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
|
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
|
||||||
# - name: Setup Android SDK
|
# - name: Setup Android SDK
|
||||||
# if: steps.android-sdk.outputs.cache-hit != 'true'
|
# if: steps.android-sdk.outputs.cache-hit != 'true'
|
||||||
# uses: android-actions/setup-android@v2
|
# uses: android-actions/setup-android@v2
|
||||||
# - name: AVD cache
|
# - name: AVD cache
|
||||||
# uses: actions/cache@v3
|
# uses: actions/cache@v3
|
||||||
# id: avd-cache
|
# id: avd-cache
|
||||||
# with:
|
# with:
|
||||||
# path: |
|
# path: |
|
||||||
# ~/.android/avd/*
|
# ~/.android/avd/*
|
||||||
# ~/.android/adb*
|
# ~/.android/adb*
|
||||||
# key: avd-29
|
# key: avd-29
|
||||||
# - name: create AVD and generate snapshot for caching
|
# - name: create AVD and generate snapshot for caching
|
||||||
# if: steps.avd-cache.outputs.cache-hit != 'true'
|
# if: steps.avd-cache.outputs.cache-hit != 'true'
|
||||||
# uses: reactivecircus/android-emulator-runner@v2.27.0
|
# uses: reactivecircus/android-emulator-runner@v2.27.0
|
||||||
# with:
|
# with:
|
||||||
# working-directory: ./mobile
|
# working-directory: ./mobile
|
||||||
# cores: 2
|
# cores: 2
|
||||||
# api-level: 29
|
# api-level: 29
|
||||||
# arch: x86_64
|
# arch: x86_64
|
||||||
# profile: pixel
|
# profile: pixel
|
||||||
# target: default
|
# target: default
|
||||||
# force-avd-creation: false
|
# force-avd-creation: false
|
||||||
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||||
# disable-animations: false
|
# disable-animations: false
|
||||||
# script: echo "Generated AVD snapshot for caching."
|
# script: echo "Generated AVD snapshot for caching."
|
||||||
# - name: Setup Flutter SDK
|
# - name: Setup Flutter SDK
|
||||||
# uses: subosito/flutter-action@v2
|
# uses: subosito/flutter-action@v2
|
||||||
# with:
|
# with:
|
||||||
# channel: 'stable'
|
# channel: 'stable'
|
||||||
# flutter-version: '3.7.3'
|
# flutter-version: '3.7.3'
|
||||||
# cache: true
|
# cache: true
|
||||||
# - name: Run integration tests
|
# - name: Run integration tests
|
||||||
# uses: Wandalen/wretry.action@master
|
# uses: Wandalen/wretry.action@master
|
||||||
# with:
|
# with:
|
||||||
# action: reactivecircus/android-emulator-runner@v2.27.0
|
# action: reactivecircus/android-emulator-runner@v2.27.0
|
||||||
# with: |
|
# with: |
|
||||||
# working-directory: ./mobile
|
# working-directory: ./mobile
|
||||||
# cores: 2
|
# cores: 2
|
||||||
# api-level: 29
|
# api-level: 29
|
||||||
# arch: x86_64
|
# arch: x86_64
|
||||||
# profile: pixel
|
# profile: pixel
|
||||||
# target: default
|
# target: default
|
||||||
# force-avd-creation: false
|
# force-avd-creation: false
|
||||||
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||||
# disable-animations: true
|
# disable-animations: true
|
||||||
# script: |
|
# script: |
|
||||||
# flutter pub get
|
# flutter pub get
|
||||||
# flutter test integration_test
|
# flutter test integration_test
|
||||||
# attempt_limit: 3
|
# attempt_limit: 3
|
||||||
|
|||||||
2
.github/workflows/weblate-lock.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
- name: Find Pull Request
|
- name: Find Pull Request
|
||||||
uses: juliangruber/find-pull-request-action@48b6133aa6c826f267ebd33aa2d29470f9d9e7d0 # v1.9.0
|
uses: juliangruber/find-pull-request-action@952b3bb1ddb2dcc0aa3479e98bb1c2d1a922f096 # v1.10.0
|
||||||
id: find-pr
|
id: find-pr
|
||||||
with:
|
with:
|
||||||
branch: chore/translations
|
branch: chore/translations
|
||||||
|
|||||||
39
.pnpmfile.cjs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
module.exports = {
|
||||||
|
hooks: {
|
||||||
|
readPackage: (pkg) => {
|
||||||
|
if (!pkg.name) {
|
||||||
|
return pkg;
|
||||||
|
}
|
||||||
|
switch (pkg.name) {
|
||||||
|
case "exiftool-vendored":
|
||||||
|
if (pkg.optionalDependencies["exiftool-vendored.pl"]) {
|
||||||
|
// make exiftool-vendored.pl a regular dependency
|
||||||
|
pkg.dependencies["exiftool-vendored.pl"] =
|
||||||
|
pkg.optionalDependencies["exiftool-vendored.pl"];
|
||||||
|
delete pkg.optionalDependencies["exiftool-vendored.pl"];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "sharp":
|
||||||
|
const optionalDeps = Object.keys(pkg.optionalDependencies).filter(
|
||||||
|
(dep) => dep.startsWith("@img")
|
||||||
|
);
|
||||||
|
for (const dep of optionalDeps) {
|
||||||
|
// remove all optionalDepdencies from sharp (they will be compiled from source), except:
|
||||||
|
// include the precompiled musl version of sharp, for web/Dockerfile
|
||||||
|
// include precompiled linux-x64 version of sharp, for server/Dockerfile, stage: web-prod
|
||||||
|
// include precompiled linux-arm64 version of sharp, for server/Dockerfile, stage: web-prod
|
||||||
|
if (
|
||||||
|
dep.includes("musl") ||
|
||||||
|
dep.includes("linux-x64") ||
|
||||||
|
dep.includes("linux-arm64")
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
delete pkg.optionalDependencies[dep];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return pkg;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
4
.vscode/launch.json
vendored
@@ -7,7 +7,7 @@
|
|||||||
"restart": true,
|
"restart": true,
|
||||||
"port": 9231,
|
"port": 9231,
|
||||||
"name": "Immich API Server",
|
"name": "Immich API Server",
|
||||||
"remoteRoot": "/usr/src/app",
|
"remoteRoot": "/usr/src/app/server",
|
||||||
"localRoot": "${workspaceFolder}/server"
|
"localRoot": "${workspaceFolder}/server"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
"restart": true,
|
"restart": true,
|
||||||
"port": 9230,
|
"port": 9230,
|
||||||
"name": "Immich Workers",
|
"name": "Immich Workers",
|
||||||
"remoteRoot": "/usr/src/app",
|
"remoteRoot": "/usr/src/app/server",
|
||||||
"localRoot": "${workspaceFolder}/server"
|
"localRoot": "${workspaceFolder}/server"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
@@ -56,7 +56,8 @@
|
|||||||
"explorer.fileNesting.enabled": true,
|
"explorer.fileNesting.enabled": true,
|
||||||
"explorer.fileNesting.patterns": {
|
"explorer.fileNesting.patterns": {
|
||||||
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
|
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
|
||||||
"*.ts": "${capture}.spec.ts,${capture}.mock.ts"
|
"*.ts": "${capture}.spec.ts,${capture}.mock.ts",
|
||||||
|
"package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb, bun.lock, pnpm-workspace.yaml, .pnpmfile.cjs"
|
||||||
},
|
},
|
||||||
"svelte.enable-ts-plugin": true,
|
"svelte.enable-ts-plugin": true,
|
||||||
"typescript.preferences.importModuleSpecifier": "non-relative"
|
"typescript.preferences.importModuleSpecifier": "non-relative"
|
||||||
|
|||||||
77
Makefile
@@ -8,7 +8,10 @@ dev-update:
|
|||||||
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
|
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
|
||||||
|
|
||||||
dev-scale:
|
dev-scale:
|
||||||
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans
|
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans
|
||||||
|
|
||||||
|
dev-docs:
|
||||||
|
npm --prefix docs run start
|
||||||
|
|
||||||
.PHONY: e2e
|
.PHONY: e2e
|
||||||
e2e:
|
e2e:
|
||||||
@@ -40,7 +43,7 @@ open-api-typescript:
|
|||||||
cd ./open-api && bash ./bin/generate-open-api.sh typescript
|
cd ./open-api && bash ./bin/generate-open-api.sh typescript
|
||||||
|
|
||||||
sql:
|
sql:
|
||||||
npm --prefix server run sync:sql
|
pnpm --filter immich run sync:sql
|
||||||
|
|
||||||
attach-server:
|
attach-server:
|
||||||
docker exec -it docker_immich-server_1 sh
|
docker exec -it docker_immich-server_1 sh
|
||||||
@@ -50,31 +53,40 @@ renovate:
|
|||||||
|
|
||||||
MODULES = e2e server web cli sdk docs .github
|
MODULES = e2e server web cli sdk docs .github
|
||||||
|
|
||||||
|
# directory to package name mapping function
|
||||||
|
# cli = @immich/cli
|
||||||
|
# docs = documentation
|
||||||
|
# e2e = immich-e2e
|
||||||
|
# open-api/typescript-sdk = @immich/sdk
|
||||||
|
# server = immich
|
||||||
|
# web = immich-web
|
||||||
|
map-package = $(subst sdk,@immich/sdk,$(subst cli,@immich/cli,$(subst docs,documentation,$(subst e2e,immich-e2e,$(subst server,immich,$(subst web,immich-web,$1))))))
|
||||||
|
|
||||||
audit-%:
|
audit-%:
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) audit fix
|
pnpm --filter $(call map-package,$*) audit fix
|
||||||
install-%:
|
install-%:
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) i
|
pnpm --filter $(call map-package,$*) install $(if $(FROZEN),--frozen-lockfile) $(if $(OFFLINE),--offline)
|
||||||
ci-%:
|
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) ci
|
|
||||||
build-cli: build-sdk
|
build-cli: build-sdk
|
||||||
build-web: build-sdk
|
build-web: build-sdk
|
||||||
build-%: install-%
|
build-%: install-%
|
||||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) run build
|
pnpm --filter $(call map-package,$*) run build
|
||||||
format-%:
|
format-%:
|
||||||
npm --prefix $* run format:fix
|
pnpm --filter $(call map-package,$*) run format:fix
|
||||||
lint-%:
|
lint-%:
|
||||||
npm --prefix $* run lint:fix
|
pnpm --filter $(call map-package,$*) run lint:fix
|
||||||
|
lint-web:
|
||||||
|
pnpm --filter $(call map-package,$*) run lint:p
|
||||||
check-%:
|
check-%:
|
||||||
npm --prefix $* run check
|
pnpm --filter $(call map-package,$*) run check
|
||||||
check-web:
|
check-web:
|
||||||
npm --prefix web run check:typescript
|
pnpm --filter immich-web run check:typescript
|
||||||
npm --prefix web run check:svelte
|
pnpm --filter immich-web run check:svelte
|
||||||
test-%:
|
test-%:
|
||||||
npm --prefix $* run test
|
pnpm --filter $(call map-package,$*) run test
|
||||||
test-e2e:
|
test-e2e:
|
||||||
docker compose -f ./e2e/docker-compose.yml build
|
docker compose -f ./e2e/docker-compose.yml build
|
||||||
npm --prefix e2e run test
|
pnpm --filter immich-e2e run test
|
||||||
npm --prefix e2e run test:web
|
pnpm --filter immich-e2e run test:web
|
||||||
test-medium:
|
test-medium:
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
@@ -84,25 +96,36 @@ test-medium:
|
|||||||
-v ./server/tsconfig.json:/usr/src/app/tsconfig.json \
|
-v ./server/tsconfig.json:/usr/src/app/tsconfig.json \
|
||||||
-e NODE_ENV=development \
|
-e NODE_ENV=development \
|
||||||
immich-server:latest \
|
immich-server:latest \
|
||||||
-c "npm ci && npm run test:medium -- --run"
|
-c "pnpm test:medium -- --run"
|
||||||
test-medium-dev:
|
test-medium-dev:
|
||||||
docker exec -it immich_server /bin/sh -c "npm run test:medium"
|
docker exec -it immich_server /bin/sh -c "pnpm run test:medium"
|
||||||
|
|
||||||
build-all: $(foreach M,$(filter-out e2e .github,$(MODULES)),build-$M) ;
|
install-all:
|
||||||
install-all: $(foreach M,$(MODULES),install-$M) ;
|
pnpm -r --filter '!documentation' install
|
||||||
ci-all: $(foreach M,$(filter-out .github,$(MODULES)),ci-$M) ;
|
|
||||||
check-all: $(foreach M,$(filter-out sdk cli docs .github,$(MODULES)),check-$M) ;
|
build-all: $(foreach M,$(filter-out e2e docs .github,$(MODULES)),build-$M) ;
|
||||||
lint-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),lint-$M) ;
|
|
||||||
format-all: $(foreach M,$(filter-out sdk,$(MODULES)),format-$M) ;
|
check-all:
|
||||||
audit-all: $(foreach M,$(MODULES),audit-$M) ;
|
pnpm -r --filter '!documentation' run "/^(check|check\:svelte|check\:typescript)$/"
|
||||||
hygiene-all: lint-all format-all check-all sql audit-all;
|
lint-all:
|
||||||
test-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),test-$M) ;
|
pnpm -r --filter '!documentation' run lint:fix
|
||||||
|
format-all:
|
||||||
|
pnpm -r --filter '!documentation' run format:fix
|
||||||
|
audit-all:
|
||||||
|
pnpm -r --filter '!documentation' audit fix
|
||||||
|
hygiene-all: audit-all
|
||||||
|
pnpm -r --filter '!documentation' run "/(format:fix|check|check:svelte|check:typescript|sql)/"
|
||||||
|
|
||||||
|
test-all:
|
||||||
|
pnpm -r --filter '!documentation' run "/^test/"
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
find . -name "node_modules" -type d -prune -exec rm -rf {} +
|
find . -name "node_modules" -type d -prune -exec rm -rf {} +
|
||||||
find . -name "dist" -type d -prune -exec rm -rf '{}' +
|
find . -name "dist" -type d -prune -exec rm -rf '{}' +
|
||||||
find . -name "build" -type d -prune -exec rm -rf '{}' +
|
find . -name "build" -type d -prune -exec rm -rf '{}' +
|
||||||
find . -name "svelte-kit" -type d -prune -exec rm -rf '{}' +
|
find . -name ".svelte-kit" -type d -prune -exec rm -rf '{}' +
|
||||||
|
find . -name "coverage" -type d -prune -exec rm -rf '{}' +
|
||||||
|
find . -name ".pnpm-store" -type d -prune -exec rm -rf '{}' +
|
||||||
command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml rm -v -f || true
|
command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml rm -v -f || true
|
||||||
command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml rm -v -f || true
|
command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml rm -v -f || true
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
@@ -1,19 +1,14 @@
|
|||||||
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e AS core
|
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e AS core
|
||||||
|
|
||||||
WORKDIR /usr/src/open-api/typescript-sdk
|
|
||||||
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./
|
|
||||||
RUN npm ci
|
|
||||||
COPY open-api/typescript-sdk/ ./
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
COPY package* pnpm* .pnpmfile.cjs ./
|
||||||
COPY cli/package.json cli/package-lock.json ./
|
COPY ./cli ./cli/
|
||||||
RUN npm ci
|
COPY ./open-api/typescript-sdk ./open-api/typescript-sdk/
|
||||||
|
RUN corepack enable pnpm && \
|
||||||
COPY cli .
|
pnpm install --filter @immich/sdk --filter @immich/cli --frozen-lockfile && \
|
||||||
RUN npm run build
|
pnpm --filter @immich/sdk build && \
|
||||||
|
pnpm --filter @immich/cli build
|
||||||
|
|
||||||
WORKDIR /import
|
WORKDIR /import
|
||||||
|
|
||||||
ENTRYPOINT ["node", "/usr/src/app/dist"]
|
ENTRYPOINT ["node", "/usr/src/app/cli/dist"]
|
||||||
|
|||||||
4632
cli/package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@immich/cli",
|
"name": "@immich/cli",
|
||||||
"version": "2.2.73",
|
"version": "2.2.79",
|
||||||
"description": "Command Line Interface (CLI) for Immich",
|
"description": "Command Line Interface (CLI) for Immich",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"exports": "./dist/index.js",
|
"exports": "./dist/index.js",
|
||||||
@@ -21,15 +21,15 @@
|
|||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/micromatch": "^4.0.9",
|
"@types/micromatch": "^4.0.9",
|
||||||
"@types/mock-fs": "^4.13.1",
|
"@types/mock-fs": "^4.13.1",
|
||||||
"@types/node": "^22.16.4",
|
"@types/node": "^22.17.1",
|
||||||
"@vitest/coverage-v8": "^3.0.0",
|
"@vitest/coverage-v8": "^3.0.0",
|
||||||
"byte-size": "^9.0.0",
|
"byte-size": "^9.0.0",
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
"commander": "^12.0.0",
|
"commander": "^12.0.0",
|
||||||
"eslint": "^9.14.0",
|
"eslint": "^9.14.0",
|
||||||
"eslint-config-prettier": "^10.0.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-unicorn": "^59.0.0",
|
"eslint-plugin-unicorn": "^60.0.0",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.0.0",
|
||||||
"mock-fs": "^5.2.0",
|
"mock-fs": "^5.2.0",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
@@ -69,6 +69,6 @@
|
|||||||
"micromatch": "^4.0.8"
|
"micromatch": "^4.0.8"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.17.1"
|
"node": "22.18.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,37 +2,37 @@
|
|||||||
# Manual edits may be lost in future updates.
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
constraints = "4.52.0"
|
constraints = "4.52.1"
|
||||||
hashes = [
|
hashes = [
|
||||||
"h1:2BEJyXJtYC4B4nda/WCYUmuJYDaYk88F8t1pwPzr0iQ=",
|
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||||
"h1:4IASk5SESeWKQ7JU0+M7KApuF5mZyklvwMXPBabim3c=",
|
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||||
"h1:5ImZxxALSnWfH/4EXw/wFirSmk5Tr0ACmcysy51AafE=",
|
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||||
"h1:6TJ3dxLSin4ZKBJLsZDn95H2ZYnGm8S7GGHvvXuuMQU=",
|
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||||
"h1:IzTUjg9kQ4N3qizP9CjYLeHwjsuGgtxwXvfUQWyOLcA=",
|
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||||
"h1:NTaOQfYINA0YTG/V1/9+SYtgX1it63+cBugj4WK4FWc=",
|
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||||
"h1:PXH48LuJn329sCfMXprdMDk51EZaWFyajVvS03qhQLs=",
|
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||||
"h1:Pi5M+GeoMSN2eJ6QnIeXjBf19O+rby/74CfB2ocpv20=",
|
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||||
"h1:ShXZ2ZjBvm3thfoPPzPT8+OhyismnydQVkUAfI8X12w=",
|
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||||
"h1:WQ9hu0Wge2msBbODfottCSKgu8oKUrw4Opz+fDPVVHk=",
|
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||||
"h1:Z5yXML2DE0uH9UU+M0ut9JMQAORcwVZz1CxBHzeBmao=",
|
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||||
"h1:jqI2qKknpleS3JDSplyGYHMu0u9K/tor1ZOjFwDgEMk=",
|
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||||
"h1:kgfutDh14Q5nw4eg6qGFamFxIiY8Ae0FPKRBLDOzpcI=",
|
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||||
"h1:zCAO7GZmfYhWb+i6TfqlqhMeDyPZWGio2IzEzAh3YTs=",
|
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||||
"zh:19be1a91c982b902c42aba47766860dfa5dc151eed1e95fd39ca642229381ef0",
|
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||||
"zh:1de451c4d1ecf7efbe67b6dace3426ba810711afdd644b0f1b870364c8ae91f8",
|
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||||
"zh:352b4a2120173298622e669258744554339d959ac3a95607b117a48ee4a83238",
|
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||||
"zh:3c6f1346d9154afbd2d558fabb4b0150fc8d559aa961254144fe1bc17fe6032f",
|
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||||
"zh:4c4c92d53fb535b1e0eff26f222bbd627b97d3b4c891ec9c321268676d06152f",
|
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||||
"zh:53276f68006c9ceb7cdb10a6ccf91a5c1eadd1407a28edb5741e84e88d7e29e8",
|
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||||
"zh:7925a97773948171a63d4f65bb81ee92fd6d07a447e36012977313293a5435c9",
|
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||||
"zh:7dfb0a4496cfe032437386d0a2cd9229a1956e9c30bd920923c141b0f0440060",
|
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||||
|
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||||
"zh:8d4aa79f0a414bb4163d771063c70cd991c8fac6c766e685bac2ee12903c5bd6",
|
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||||
"zh:a67540c13565616a7e7e51ee9366e88b0dc60046e1d75c72680e150bd02725bb",
|
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||||
"zh:a936383a4767f5393f38f622e92bf2d0c03fe04b69c284951f27345766c7b31b",
|
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||||
"zh:d4887d73c466ff036eecf50ad6404ba38fd82ea4855296b1846d244b0f13c380",
|
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||||
"zh:e9093c8bd5b6cd99c81666e315197791781b8f93afa14fc2e0f732d1bb2a44b7",
|
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||||
"zh:efd3b3f1ec59a37f635aa1d4efcf178734c2fcf8ddb0d56ea690bec342da8672",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
cloudflare = {
|
cloudflare = {
|
||||||
source = "cloudflare/cloudflare"
|
source = "cloudflare/cloudflare"
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,37 +2,37 @@
|
|||||||
# Manual edits may be lost in future updates.
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
constraints = "4.52.0"
|
constraints = "4.52.1"
|
||||||
hashes = [
|
hashes = [
|
||||||
"h1:2BEJyXJtYC4B4nda/WCYUmuJYDaYk88F8t1pwPzr0iQ=",
|
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
|
||||||
"h1:4IASk5SESeWKQ7JU0+M7KApuF5mZyklvwMXPBabim3c=",
|
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
|
||||||
"h1:5ImZxxALSnWfH/4EXw/wFirSmk5Tr0ACmcysy51AafE=",
|
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
|
||||||
"h1:6TJ3dxLSin4ZKBJLsZDn95H2ZYnGm8S7GGHvvXuuMQU=",
|
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
|
||||||
"h1:IzTUjg9kQ4N3qizP9CjYLeHwjsuGgtxwXvfUQWyOLcA=",
|
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
|
||||||
"h1:NTaOQfYINA0YTG/V1/9+SYtgX1it63+cBugj4WK4FWc=",
|
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
|
||||||
"h1:PXH48LuJn329sCfMXprdMDk51EZaWFyajVvS03qhQLs=",
|
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
|
||||||
"h1:Pi5M+GeoMSN2eJ6QnIeXjBf19O+rby/74CfB2ocpv20=",
|
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
|
||||||
"h1:ShXZ2ZjBvm3thfoPPzPT8+OhyismnydQVkUAfI8X12w=",
|
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
|
||||||
"h1:WQ9hu0Wge2msBbODfottCSKgu8oKUrw4Opz+fDPVVHk=",
|
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
|
||||||
"h1:Z5yXML2DE0uH9UU+M0ut9JMQAORcwVZz1CxBHzeBmao=",
|
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
|
||||||
"h1:jqI2qKknpleS3JDSplyGYHMu0u9K/tor1ZOjFwDgEMk=",
|
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
|
||||||
"h1:kgfutDh14Q5nw4eg6qGFamFxIiY8Ae0FPKRBLDOzpcI=",
|
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
|
||||||
"h1:zCAO7GZmfYhWb+i6TfqlqhMeDyPZWGio2IzEzAh3YTs=",
|
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
|
||||||
"zh:19be1a91c982b902c42aba47766860dfa5dc151eed1e95fd39ca642229381ef0",
|
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
|
||||||
"zh:1de451c4d1ecf7efbe67b6dace3426ba810711afdd644b0f1b870364c8ae91f8",
|
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
|
||||||
"zh:352b4a2120173298622e669258744554339d959ac3a95607b117a48ee4a83238",
|
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
|
||||||
"zh:3c6f1346d9154afbd2d558fabb4b0150fc8d559aa961254144fe1bc17fe6032f",
|
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
|
||||||
"zh:4c4c92d53fb535b1e0eff26f222bbd627b97d3b4c891ec9c321268676d06152f",
|
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
|
||||||
"zh:53276f68006c9ceb7cdb10a6ccf91a5c1eadd1407a28edb5741e84e88d7e29e8",
|
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
|
||||||
"zh:7925a97773948171a63d4f65bb81ee92fd6d07a447e36012977313293a5435c9",
|
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
|
||||||
"zh:7dfb0a4496cfe032437386d0a2cd9229a1956e9c30bd920923c141b0f0440060",
|
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
|
||||||
|
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
|
||||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||||
"zh:8d4aa79f0a414bb4163d771063c70cd991c8fac6c766e685bac2ee12903c5bd6",
|
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
|
||||||
"zh:a67540c13565616a7e7e51ee9366e88b0dc60046e1d75c72680e150bd02725bb",
|
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
|
||||||
"zh:a936383a4767f5393f38f622e92bf2d0c03fe04b69c284951f27345766c7b31b",
|
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
|
||||||
"zh:d4887d73c466ff036eecf50ad6404ba38fd82ea4855296b1846d244b0f13c380",
|
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
|
||||||
"zh:e9093c8bd5b6cd99c81666e315197791781b8f93afa14fc2e0f732d1bb2a44b7",
|
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
|
||||||
"zh:efd3b3f1ec59a37f635aa1d4efcf178734c2fcf8ddb0d56ea690bec342da8672",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
cloudflare = {
|
cloudflare = {
|
||||||
source = "cloudflare/cloudflare"
|
source = "cloudflare/cloudflare"
|
||||||
version = "4.52.0"
|
version = "4.52.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,17 +21,16 @@ services:
|
|||||||
# extends:
|
# extends:
|
||||||
# file: hwaccel.transcoding.yml
|
# file: hwaccel.transcoding.yml
|
||||||
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
||||||
|
user: "${UID:-1000}:${GID:-1000}"
|
||||||
build:
|
build:
|
||||||
context: ../
|
context: ../
|
||||||
dockerfile: server/Dockerfile
|
dockerfile: server/Dockerfile
|
||||||
target: dev
|
target: dev
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- ../server:/usr/src/app/server
|
- ..:/usr/src/app
|
||||||
- ../open-api:/usr/src/app/open-api
|
- ${UPLOAD_LOCATION}/photos:/data
|
||||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
|
||||||
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/upload/upload
|
|
||||||
- /usr/src/app/server/node_modules
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -58,8 +57,12 @@ services:
|
|||||||
- 9231:9231
|
- 9231:9231
|
||||||
- 2283:2283
|
- 2283:2283
|
||||||
depends_on:
|
depends_on:
|
||||||
- redis
|
redis:
|
||||||
- database
|
condition: service_started
|
||||||
|
database:
|
||||||
|
condition: service_started
|
||||||
|
init:
|
||||||
|
condition: service_completed_successfully
|
||||||
healthcheck:
|
healthcheck:
|
||||||
disable: false
|
disable: false
|
||||||
|
|
||||||
@@ -68,6 +71,7 @@ services:
|
|||||||
image: immich-web-dev:latest
|
image: immich-web-dev:latest
|
||||||
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
|
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
|
||||||
# user: 0:0
|
# user: 0:0
|
||||||
|
user: "${UID:-1000}:${GID:-1000}"
|
||||||
build:
|
build:
|
||||||
context: ../
|
context: ../
|
||||||
dockerfile: web/Dockerfile
|
dockerfile: web/Dockerfile
|
||||||
@@ -78,18 +82,17 @@ services:
|
|||||||
- 3000:3000
|
- 3000:3000
|
||||||
- 24678:24678
|
- 24678:24678
|
||||||
volumes:
|
volumes:
|
||||||
- ../web:/usr/src/app/web
|
- ..:/usr/src/app
|
||||||
- ../i18n:/usr/src/app/i18n
|
|
||||||
- ../open-api/:/usr/src/app/open-api/
|
|
||||||
# - ../../ui:/usr/ui
|
|
||||||
- /usr/src/app/web/node_modules
|
|
||||||
ulimits:
|
ulimits:
|
||||||
nofile:
|
nofile:
|
||||||
soft: 1048576
|
soft: 1048576
|
||||||
hard: 1048576
|
hard: 1048576
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
- immich-server
|
immich-server:
|
||||||
|
condition: service_started
|
||||||
|
init:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
|
||||||
immich-machine-learning:
|
immich-machine-learning:
|
||||||
container_name: immich_machine_learning
|
container_name: immich_machine_learning
|
||||||
@@ -117,13 +120,13 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
image: docker.io/valkey/valkey:8-bookworm@sha256:5b8f8c333bef895c925f56629d6ba90aea95a4f7391f62411e625267c600b19c
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
|
|
||||||
database:
|
database:
|
||||||
container_name: immich_postgres
|
container_name: immich_postgres
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
@@ -157,6 +160,14 @@ services:
|
|||||||
# volumes:
|
# volumes:
|
||||||
# - grafana-data:/var/lib/grafana
|
# - grafana-data:/var/lib/grafana
|
||||||
|
|
||||||
|
init:
|
||||||
|
container_name: init
|
||||||
|
image: busybox
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
user: 0:0
|
||||||
|
command: sh -c 'for path in /usr/src/app/.pnpm-store /usr/src/app/server/node_modules /usr/src/app/.github/node_modules /usr/src/app/cli/node_modules /usr/src/app/docs/node_modules /usr/src/app/e2e/node_modules /usr/src/app/open-api/typescript-sdk/node_modules /usr/src/app/web/.svelte-kit /usr/src/app/web/coverage /usr/src/app/node_modules /usr/src/app/web/node_modules; do [ -e "$$path" ] && chown -R ${UID:-1000}:${GID:-1000} "$$path" || true; done'
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
model-cache:
|
model-cache:
|
||||||
prometheus-data:
|
prometheus-data:
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ services:
|
|||||||
context: ../
|
context: ../
|
||||||
dockerfile: server/Dockerfile
|
dockerfile: server/Dockerfile
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}/photos:/data
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -56,14 +56,14 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
image: docker.io/valkey/valkey:8-bookworm@sha256:5b8f8c333bef895c925f56629d6ba90aea95a4f7391f62411e625267c600b19c
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
database:
|
database:
|
||||||
container_name: immich_postgres
|
container_name: immich_postgres
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
@@ -95,7 +95,7 @@ services:
|
|||||||
command: ['./run.sh', '-disable-reporting']
|
command: ['./run.sh', '-disable-reporting']
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
image: grafana/grafana:12.0.2-ubuntu@sha256:0512d81cdeaaff0e370a9aa66027b465d1f1f04379c3a9c801a905fabbdbc7a5
|
image: grafana/grafana:12.1.1-ubuntu@sha256:d1da838234ff2de93e0065ee1bf0e66d38f948dcc5d718c25fa6237e14b4424a
|
||||||
volumes:
|
volumes:
|
||||||
- grafana-data:/var/lib/grafana
|
- grafana-data:/var/lib/grafana
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ services:
|
|||||||
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
||||||
volumes:
|
volumes:
|
||||||
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -49,14 +49,14 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
image: docker.io/valkey/valkey:8-bookworm@sha256:5b8f8c333bef895c925f56629d6ba90aea95a4f7391f62411e625267c600b19c
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
database:
|
database:
|
||||||
container_name: immich_postgres
|
container_name: immich_postgres
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:5f6a838e4e44c8e0e019d0ebfe3ee8952b69afc2809b2c25f7b0119641978e91
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
POSTGRES_USER: ${DB_USERNAME}
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
|||||||
4
docs/.gitignore
vendored
@@ -18,4 +18,6 @@
|
|||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
yarn.lock
|
yarn.lock
|
||||||
|
|
||||||
|
/static/openapi.json
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ services:
|
|||||||
...
|
...
|
||||||
volumes:
|
volumes:
|
||||||
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
+ - originals:/usr/src/app/originals
|
+ - originals:/usr/src/app/originals
|
||||||
...
|
...
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ Once you have a new OAuth client application configured, Immich can be configure
|
|||||||
| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**¹** |
|
| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**¹** |
|
||||||
| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**¹** |
|
| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**¹** |
|
||||||
| Storage Quota Claim | string | immich_quota | Claim mapping for the user's storage**¹** |
|
| Storage Quota Claim | string | immich_quota | Claim mapping for the user's storage**¹** |
|
||||||
| Default Storage Quota (GiB) | number | 0 | Default quota for user without storage quota claim (Enter 0 for unlimited quota) |
|
| Default Storage Quota (GiB) | number | 0 | Default quota for user without storage quota claim (empty for unlimited quota) |
|
||||||
| Button Text | string | Login with OAuth | Text for the OAuth button on the web |
|
| Button Text | string | Login with OAuth | Text for the OAuth button on the web |
|
||||||
| Auto Register | boolean | true | When true, will automatically register a user the first time they sign in |
|
| Auto Register | boolean | true | When true, will automatically register a user the first time they sign in |
|
||||||
| [Auto Launch](#auto-launch) | boolean | false | When true, will skip the login page and automatically start the OAuth login process |
|
| [Auto Launch](#auto-launch) | boolean | false | When true, will skip the login page and automatically start the OAuth login process |
|
||||||
@@ -106,6 +106,89 @@ Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to
|
|||||||
|
|
||||||
## Example Configuration
|
## Example Configuration
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Authelia Example</summary>
|
||||||
|
|
||||||
|
### Authelia Example
|
||||||
|
|
||||||
|
Here's an example of OAuth configured for Authelia:
|
||||||
|
|
||||||
|
This assumes there exist an attribute `immichquota` in the user schema, which is used to set the user's storage quota in Immich.
|
||||||
|
The configuration concerning the quota is optional.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
authentication_backend:
|
||||||
|
ldap:
|
||||||
|
# The LDAP server configuration goes here.
|
||||||
|
# See: https://www.authelia.com/c/ldap
|
||||||
|
attributes:
|
||||||
|
extra:
|
||||||
|
immichquota: # The attribute name from LDAP
|
||||||
|
name: 'immich_quota'
|
||||||
|
multi_valued: false
|
||||||
|
value_type: 'integer'
|
||||||
|
identity_providers:
|
||||||
|
oidc:
|
||||||
|
## The other portions of the mandatory OpenID Connect 1.0 configuration go here.
|
||||||
|
## See: https://www.authelia.com/c/oidc
|
||||||
|
claims_policies:
|
||||||
|
immich_policy:
|
||||||
|
custom_claims:
|
||||||
|
immich_quota:
|
||||||
|
attribute: 'immich_quota'
|
||||||
|
scopes:
|
||||||
|
immich_scope:
|
||||||
|
claims:
|
||||||
|
- 'immich_quota'
|
||||||
|
|
||||||
|
clients:
|
||||||
|
- client_id: 'immich'
|
||||||
|
client_name: 'Immich'
|
||||||
|
# https://www.authelia.com/integration/openid-connect/frequently-asked-questions/#how-do-i-generate-a-client-identifier-or-client-secret
|
||||||
|
client_secret: $pbkdf2-sha512$310000$c8p78n7pUMln0jzvd4aK4Q$JNRBzwAo0ek5qKn50cFzzvE9RXV88h1wJn5KGiHrD0YKtZaR/nCb2CJPOsKaPK0hjf.9yHxzQGZziziccp6Yng'
|
||||||
|
public: false
|
||||||
|
require_pkce: false
|
||||||
|
redirect_uris:
|
||||||
|
- 'https://example.immich.app/auth/login'
|
||||||
|
- 'https://example.immich.app/user-settings'
|
||||||
|
- 'app.immich:///oauth-callback'
|
||||||
|
scopes:
|
||||||
|
- 'openid'
|
||||||
|
- 'profile'
|
||||||
|
- 'email'
|
||||||
|
- 'immich_scope'
|
||||||
|
claims_policy: 'immich_policy'
|
||||||
|
response_types:
|
||||||
|
- 'code'
|
||||||
|
grant_types:
|
||||||
|
- 'authorization_code'
|
||||||
|
id_token_signed_response_alg: 'RS256'
|
||||||
|
userinfo_signed_response_alg: 'RS256'
|
||||||
|
token_endpoint_auth_method: 'client_secret_post'
|
||||||
|
```
|
||||||
|
|
||||||
|
Configuration of OAuth in Immich System Settings
|
||||||
|
|
||||||
|
| Setting | Value |
|
||||||
|
| ---------------------------------- | ------------------------------------------------------------------- |
|
||||||
|
| Issuer URL | `https://example.immich.app/.well-known/openid-configuration` |
|
||||||
|
| Client ID | immich |
|
||||||
|
| Client Secret | 0v89FXkQOWO\***\*\*\*\*\***\*\*\***\*\*\*\*\***mprbvXD549HH6s1iw... |
|
||||||
|
| Token Endpoint Auth Method | client_secret_post |
|
||||||
|
| Scope | openid email profile immich_scope |
|
||||||
|
| ID Token Signed Response Algorithm | RS256 |
|
||||||
|
| Userinfo Signed Response Algorithm | RS256 |
|
||||||
|
| Storage Label Claim | uid |
|
||||||
|
| Storage Quota Claim | immich_quota |
|
||||||
|
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
|
||||||
|
| Button Text | Sign in with Authelia (optional) |
|
||||||
|
| Auto Register | Enabled (optional) |
|
||||||
|
| Auto Launch | Enabled (optional) |
|
||||||
|
| Mobile Redirect URI Override | Disable |
|
||||||
|
| Mobile Redirect URI | |
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Authentik Example</summary>
|
<summary>Authentik Example</summary>
|
||||||
|
|
||||||
@@ -128,7 +211,7 @@ Configuration of OAuth in Immich System Settings
|
|||||||
| Signing Algorithm | RS256 |
|
| Signing Algorithm | RS256 |
|
||||||
| Storage Label Claim | preferred_username |
|
| Storage Label Claim | preferred_username |
|
||||||
| Storage Quota Claim | immich_quota |
|
| Storage Quota Claim | immich_quota |
|
||||||
| Default Storage Quota (GiB) | 0 (0 for unlimited quota) |
|
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
|
||||||
| Button Text | Sign in with Authentik (optional) |
|
| Button Text | Sign in with Authentik (optional) |
|
||||||
| Auto Register | Enabled (optional) |
|
| Auto Register | Enabled (optional) |
|
||||||
| Auto Launch | Enabled (optional) |
|
| Auto Launch | Enabled (optional) |
|
||||||
@@ -159,7 +242,7 @@ Configuration of OAuth in Immich System Settings
|
|||||||
| Signing Algorithm | RS256 |
|
| Signing Algorithm | RS256 |
|
||||||
| Storage Label Claim | preferred_username |
|
| Storage Label Claim | preferred_username |
|
||||||
| Storage Quota Claim | immich_quota |
|
| Storage Quota Claim | immich_quota |
|
||||||
| Default Storage Quota (GiB) | 0 (0 for unlimited quota) |
|
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
|
||||||
| Button Text | Sign in with Google (optional) |
|
| Button Text | Sign in with Google (optional) |
|
||||||
| Auto Register | Enabled (optional) |
|
| Auto Register | Enabled (optional) |
|
||||||
| Auto Launch | Enabled |
|
| Auto Launch | Enabled |
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
Users can deploy a custom reverse proxy that forwards requests to Immich. This way, the reverse proxy can handle TLS termination, load balancing, or other advanced features. All reverse proxies between Immich and the user must forward all headers and set the `Host`, `X-Real-IP`, `X-Forwarded-Proto` and `X-Forwarded-For` headers to their appropriate values. Additionally, your reverse proxy should allow for big enough uploads. By following these practices, you ensure that all custom reverse proxies are fully compatible with Immich.
|
Users can deploy a custom reverse proxy that forwards requests to Immich. This way, the reverse proxy can handle TLS termination, load balancing, or other advanced features. All reverse proxies between Immich and the user must forward all headers and set the `Host`, `X-Real-IP`, `X-Forwarded-Proto` and `X-Forwarded-For` headers to their appropriate values. Additionally, your reverse proxy should allow for big enough uploads. By following these practices, you ensure that all custom reverse proxies are fully compatible with Immich.
|
||||||
|
|
||||||
:::note
|
|
||||||
The Repair page can take a long time to load. To avoid server timeouts or errors, we recommend specifying a timeout of at least 10 minutes on your proxy server.
|
|
||||||
:::
|
|
||||||
|
|
||||||
:::caution
|
:::caution
|
||||||
Immich does not support being served on a sub-path such as `location /immich {`. It has to be served on the root path of a (sub)domain.
|
Immich does not support being served on a sub-path such as `location /immich {`. It has to be served on the root path of a (sub)domain.
|
||||||
:::
|
:::
|
||||||
|
|||||||
@@ -94,19 +94,16 @@ Change media location
|
|||||||
|
|
||||||
```
|
```
|
||||||
immich-admin change-media-location
|
immich-admin change-media-location
|
||||||
? Enter the previous value of IMMICH_MEDIA_LOCATION: /usr/src/app/upload
|
? Enter the previous value of IMMICH_MEDIA_LOCATION: /data
|
||||||
? Enter the new value of IMMICH_MEDIA_LOCATION: /data
|
? Enter the new value of IMMICH_MEDIA_LOCATION: /my-data
|
||||||
|
...
|
||||||
|
Previous value: /data
|
||||||
|
Current value: /my-data
|
||||||
|
|
||||||
Previous value: /usr/src/app/upload
|
Changing database paths from "/data/*" to "/my-data/*"
|
||||||
Current value: /data
|
|
||||||
|
|
||||||
Changing database paths from "/usr/src/app/upload/*" to "/data/*"
|
|
||||||
|
|
||||||
? Do you want to proceed? [Y/n] y
|
? Do you want to proceed? [Y/n] y
|
||||||
|
|
||||||
Database file paths updated successfully! 🎉
|
Database file paths updated successfully! 🎉
|
||||||
|
...
|
||||||
You may now set IMMICH_MEDIA_LOCATION=/data and restart!
|
|
||||||
|
|
||||||
(please remember to update applicable volume mounts e.g. ${UPLOAD_LOCATION}:/data)
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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`.
|
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
|
## 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.
|
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.
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Internally, Immich uses the [glob](https://www.npmjs.com/package/glob) package t
|
|||||||
|
|
||||||
This feature is considered experimental and for advanced users only. If enabled, it will allow automatic watching of the filesystem which means new assets are automatically imported to Immich without needing to rescan.
|
This feature is considered experimental and for advanced users only. If enabled, it will allow automatic watching of the filesystem which means new assets are automatically imported to Immich without needing to rescan.
|
||||||
|
|
||||||
If your photos are on a network drive, automatic file watching likely won't work. In that case, you will have to rely on a periodic library refresh to pull in your changes.
|
If your photos are on a network drive, automatic file watching likely won't work. In that case, you will have to rely on a [periodic library refresh](#set-custom-scan-interval) to pull in your changes.
|
||||||
|
|
||||||
#### Troubleshooting
|
#### Troubleshooting
|
||||||
|
|
||||||
@@ -72,7 +72,9 @@ In rare cases, the library watcher can hang, preventing Immich from starting up.
|
|||||||
|
|
||||||
### Nightly job
|
### Nightly job
|
||||||
|
|
||||||
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library management page.
|
There is an automatic scan job that is scheduled to run once a day. Its schedule is configurable, see [Set Custom Scan Interval](#set-custom-scan-interval).
|
||||||
|
|
||||||
|
This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library management page.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@@ -91,7 +93,7 @@ The `immich-server` container will need access to the gallery. Modify your docke
|
|||||||
```diff title="docker-compose.yml"
|
```diff title="docker-compose.yml"
|
||||||
immich-server:
|
immich-server:
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
|
+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
|
||||||
+ - /home/user/old-pics:/mnt/media/old-pics:ro
|
+ - /home/user/old-pics:/mnt/media/old-pics:ro
|
||||||
+ - /mnt/media/videos:/mnt/media/videos:ro
|
+ - /mnt/media/videos:/mnt/media/videos:ro
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ After defining the locations of these files, we will edit the `docker-compose.ym
|
|||||||
services:
|
services:
|
||||||
immich-server:
|
immich-server:
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
+ - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
|
+ - ${THUMB_LOCATION}:/data/thumbs
|
||||||
+ - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
|
+ - ${ENCODED_VIDEO_LOCATION}:/data/encoded-video
|
||||||
+ - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
|
+ - ${PROFILE_LOCATION}:/data/profile
|
||||||
+ - ${BACKUP_LOCATION}:/usr/src/app/upload/backups
|
+ - ${BACKUP_LOCATION}:/data/backups
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ docker compose up -d
|
|||||||
|
|
||||||
:::note
|
:::note
|
||||||
Because of the underlying properties of docker bind mounts, it is not recommended to mount the `upload/` and `library/` folders as separate bind mounts if they are on the same device.
|
Because of the underlying properties of docker bind mounts, it is not recommended to mount the `upload/` and `library/` folders as separate bind mounts if they are on the same device.
|
||||||
For this reason, we mount the HDD or the network storage (NAS) to `/usr/src/app/upload` and then mount the folders we want to access under that folder.
|
For this reason, we mount the HDD or the network storage (NAS) to `/data` and then mount the folders we want to access under that folder.
|
||||||
|
|
||||||
The `thumbs/` folder contains both the small thumbnails displayed in the timeline and the larger previews shown when clicking into an image. These cannot be separated.
|
The `thumbs/` folder contains both the small thumbnails displayed in the timeline and the larger previews shown when clicking into an image. These cannot be separated.
|
||||||
|
|
||||||
|
|||||||
@@ -12,118 +12,148 @@ Run `docker exec -it immich_postgres psql --dbname=<DB_DATABASE_NAME> --username
|
|||||||
|
|
||||||
## Assets
|
## Assets
|
||||||
|
|
||||||
|
### Name
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
The `"originalFileName"` column is the name of the file at time of upload, including the extension.
|
The `"originalFileName"` column is the name of the file at time of upload, including the extension.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
```sql title="Find by original filename"
|
```sql title="Find by original filename"
|
||||||
SELECT * FROM "assets" WHERE "originalFileName" = 'PXL_20230903_232542848.jpg';
|
SELECT * FROM "asset" WHERE "originalFileName" = 'PXL_20230903_232542848.jpg';
|
||||||
SELECT * FROM "assets" WHERE "originalFileName" LIKE 'PXL_%'; -- all files starting with PXL_
|
SELECT * FROM "asset" WHERE "originalFileName" LIKE 'PXL_%'; -- all files starting with PXL_
|
||||||
SELECT * FROM "assets" WHERE "originalFileName" LIKE '%_2023_%'; -- all files with _2023_ in the middle
|
SELECT * FROM "asset" WHERE "originalFileName" LIKE '%_2023_%'; -- all files with _2023_ in the middle
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Find by path"
|
```sql title="Find by path"
|
||||||
SELECT * FROM "assets" WHERE "originalPath" = 'upload/library/admin/2023/2023-09-03/PXL_2023.jpg';
|
SELECT * FROM "asset" WHERE "originalPath" = 'upload/library/admin/2023/2023-09-03/PXL_2023.jpg';
|
||||||
SELECT * FROM "assets" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
|
SELECT * FROM "asset" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### ID
|
||||||
|
|
||||||
```sql title="Find by ID"
|
```sql title="Find by ID"
|
||||||
SELECT * FROM "assets" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
|
SELECT * FROM "asset" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Find by partial ID"
|
```sql title="Find by partial ID"
|
||||||
SELECT * FROM "assets" WHERE "id"::text LIKE '%ab431d3a%';
|
SELECT * FROM "asset" WHERE "id"::text LIKE '%ab431d3a%';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Checksum
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
You can calculate the checksum for a particular file by using the command `sha1sum <filename>`.
|
You can calculate the checksum for a particular file by using the command `sha1sum <filename>`.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
```sql title="Find by checksum (SHA-1)"
|
```sql title="Find by checksum (SHA-1)"
|
||||||
SELECT encode("checksum", 'hex') FROM "assets";
|
SELECT encode("checksum", 'hex') FROM "asset";
|
||||||
SELECT * FROM "assets" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
|
SELECT * FROM "asset" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
|
||||||
SELECT * FROM "assets" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation
|
SELECT * FROM "asset" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Find duplicate assets with identical checksum (SHA-1) (excluding trashed files)"
|
```sql title="Find duplicate assets with identical checksum (SHA-1) (excluding trashed files)"
|
||||||
SELECT T1."checksum", array_agg(T2."id") ids FROM "assets" T1
|
SELECT T1."checksum", array_agg(T2."id") ids FROM "asset" T1
|
||||||
INNER JOIN "assets" T2 ON T1."checksum" = T2."checksum" AND T1."id" != T2."id" AND T2."deletedAt" IS NULL
|
INNER JOIN "asset" T2 ON T1."checksum" = T2."checksum" AND T1."id" != T2."id" AND T2."deletedAt" IS NULL
|
||||||
WHERE T1."deletedAt" IS NULL GROUP BY T1."checksum";
|
WHERE T1."deletedAt" IS NULL GROUP BY T1."checksum";
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Metadata
|
||||||
|
|
||||||
```sql title="Live photos"
|
```sql title="Live photos"
|
||||||
SELECT * FROM "assets" WHERE "livePhotoVideoId" IS NOT NULL;
|
SELECT * FROM "asset" WHERE "livePhotoVideoId" IS NOT NULL;
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="By description"
|
```sql title="By description"
|
||||||
SELECT "assets".*, "exif"."description" FROM "exif"
|
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
|
||||||
JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE TRIM("exif"."description") <> ''; -- all files with a description
|
WHERE TRIM("asset_exif"."description") <> ''; -- all files with a description
|
||||||
SELECT "assets".*, "exif"."description" FROM "exif"
|
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
|
||||||
JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE "exif"."description" ILIKE '%string to match%'; -- search by string
|
WHERE "asset_exif"."description" ILIKE '%string to match%'; -- search by string
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Without metadata"
|
```sql title="Without metadata"
|
||||||
SELECT "assets".* FROM "exif"
|
SELECT "asset".* FROM "asset_exif"
|
||||||
LEFT JOIN "assets" ON "assets"."id" = "exif"."assetId"
|
LEFT JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE "exif"."assetId" IS NULL;
|
WHERE "asset_exif"."assetId" IS NULL;
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="size < 100,000 bytes, smallest to largest"
|
```sql title="size < 100,000 bytes, smallest to largest"
|
||||||
SELECT * FROM "assets"
|
SELECT * FROM "asset"
|
||||||
JOIN "exif" ON "assets"."id" = "exif"."assetId"
|
JOIN "asset_exif" ON "asset"."id" = "asset_exif"."assetId"
|
||||||
WHERE "exif"."fileSizeInByte" < 100000
|
WHERE "asset_exif"."fileSizeInByte" < 100000
|
||||||
ORDER BY "exif"."fileSizeInByte" ASC;
|
ORDER BY "asset_exif"."fileSizeInByte" ASC;
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Without thumbnails"
|
### Type
|
||||||
SELECT * FROM "assets" WHERE "assets"."previewPath" IS NULL OR "assets"."thumbnailPath" IS NULL;
|
|
||||||
```
|
|
||||||
|
|
||||||
```sql title="By type"
|
```sql title="By type"
|
||||||
SELECT * FROM "assets" WHERE "assets"."type" = 'VIDEO';
|
SELECT * FROM "asset" WHERE "asset"."type" = 'VIDEO';
|
||||||
SELECT * FROM "assets" WHERE "assets"."type" = 'IMAGE';
|
SELECT * FROM "asset" WHERE "asset"."type" = 'IMAGE';
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Count by type"
|
```sql title="Count by type"
|
||||||
SELECT "assets"."type", COUNT(*) FROM "assets" GROUP BY "assets"."type";
|
SELECT "asset"."type", COUNT(*) FROM "asset" GROUP BY "asset"."type";
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Count by type (per user)"
|
```sql title="Count by type (per user)"
|
||||||
SELECT "users"."email", "assets"."type", COUNT(*) FROM "assets"
|
SELECT "user"."email", "asset"."type", COUNT(*) FROM "asset"
|
||||||
JOIN "users" ON "assets"."ownerId" = "users"."id"
|
JOIN "user" ON "asset"."ownerId" = "user"."id"
|
||||||
GROUP BY "assets"."type", "users"."email" ORDER BY "users"."email";
|
GROUP BY "asset"."type", "user"."email" ORDER BY "user"."email";
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Failed file movements"
|
## Tags
|
||||||
SELECT * FROM "move_history";
|
|
||||||
|
```sql title="Count by tag"
|
||||||
|
SELECT "t"."value" AS "tag_name", COUNT(*) AS "number_assets" FROM "tag" "t"
|
||||||
|
JOIN "tag_asset" "ta" ON "t"."id" = "ta"."tagsId" JOIN "asset" "a" ON "ta"."assetsId" = "a"."id"
|
||||||
|
WHERE "a"."visibility" != 'hidden'
|
||||||
|
GROUP BY "t"."value" ORDER BY "number_assets" DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql title="Count by tag (per user)"
|
||||||
|
SELECT "t"."value" AS "tag_name", "u"."email" as "user_email", COUNT(*) AS "number_assets" FROM "tag" "t"
|
||||||
|
JOIN "tag_asset" "ta" ON "t"."id" = "ta"."tagsId" JOIN "asset" "a" ON "ta"."assetsId" = "a"."id" JOIN "user" "u" ON "a"."ownerId" = "u"."id"
|
||||||
|
WHERE "a"."visibility" != 'hidden'
|
||||||
|
GROUP BY "t"."value", "u"."email" ORDER BY "number_assets" DESC;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Users
|
## Users
|
||||||
|
|
||||||
```sql title="List all users"
|
```sql title="List all users"
|
||||||
SELECT * FROM "users";
|
SELECT * FROM "user";
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql title="Get owner info from asset ID"
|
```sql title="Get owner info from asset ID"
|
||||||
SELECT "users".* FROM "users" JOIN "assets" ON "users"."id" = "assets"."ownerId" WHERE "assets"."id" = 'fa310b01-2f26-4b7a-9042-d578226e021f';
|
SELECT "user".* FROM "user" JOIN "asset" ON "user"."id" = "asset"."ownerId" WHERE "asset"."id" = 'fa310b01-2f26-4b7a-9042-d578226e021f';
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Config
|
|
||||||
|
|
||||||
```sql title="Custom settings"
|
|
||||||
SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';
|
|
||||||
```
|
|
||||||
|
|
||||||
(Only used when not using the [config file](/docs/install/config-file))
|
|
||||||
|
|
||||||
## Persons
|
## Persons
|
||||||
|
|
||||||
```sql title="Delete person and unset it for the faces it was associated with"
|
```sql title="Delete person and unset it for the faces it was associated with"
|
||||||
DELETE FROM "person" WHERE "name" = 'PersonNameHere';
|
DELETE FROM "person" WHERE "name" = 'PersonNameHere';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## System
|
||||||
|
|
||||||
|
### Config
|
||||||
|
|
||||||
|
```sql title="Custom settings"
|
||||||
|
SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';
|
||||||
|
```
|
||||||
|
|
||||||
|
(Only used when not using the [config file](/docs/install/config-file))
|
||||||
|
|
||||||
|
### File properties
|
||||||
|
|
||||||
|
```sql title="Without thumbnails"
|
||||||
|
SELECT * FROM "asset" WHERE "asset"."previewPath" IS NULL OR "asset"."thumbnailPath" IS NULL;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql title="Failed file movements"
|
||||||
|
SELECT * FROM "move_history";
|
||||||
|
```
|
||||||
|
|
||||||
## Postgres internal
|
## Postgres internal
|
||||||
|
|
||||||
```sql title="Change DB_PASSWORD"
|
```sql title="Change DB_PASSWORD"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ If you want Immich to be able to delete the images in the external library or ad
|
|||||||
```diff
|
```diff
|
||||||
immich-server:
|
immich-server:
|
||||||
volumes:
|
volumes:
|
||||||
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
- ${UPLOAD_LOCATION}:/data
|
||||||
+ - /home/user/photos1:/home/user/photos1:ro
|
+ - /home/user/photos1:/home/user/photos1:ro
|
||||||
+ - /mnt/photos2:/mnt/photos2:ro # you can delete this line if you only have one mount point, or you can add more lines if you have more than two
|
+ - /mnt/photos2:/mnt/photos2:ro # you can delete this line if you only have one mount point, or you can add more lines if you have more than two
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
|
|||||||
| `TZ` | Timezone | <sup>\*1</sup> | server | microservices |
|
| `TZ` | Timezone | <sup>\*1</sup> | server | microservices |
|
||||||
| `IMMICH_ENV` | Environment (production, development) | `production` | server, machine learning | api, microservices |
|
| `IMMICH_ENV` | Environment (production, development) | `production` | server, machine learning | api, microservices |
|
||||||
| `IMMICH_LOG_LEVEL` | Log level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
|
| `IMMICH_LOG_LEVEL` | Log level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
|
||||||
| `IMMICH_MEDIA_LOCATION` | Media location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `/usr/src/app/upload` | server | api, microservices |
|
| `IMMICH_MEDIA_LOCATION` | Media location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `/data` | server | api, microservices |
|
||||||
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
|
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
|
||||||
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
|
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
|
||||||
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
|
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
|
||||||
@@ -199,12 +199,11 @@ Additional machine learning parameters can be tuned from the admin UI.
|
|||||||
| `IMMICH_TELEMETRY_INCLUDE` | Collect these telemetries. List of `host`, `api`, `io`, `repo`, `job`. Note: You can also specify `all` to enable all | | server | api, microservices |
|
| `IMMICH_TELEMETRY_INCLUDE` | Collect these telemetries. List of `host`, `api`, `io`, `repo`, `job`. Note: You can also specify `all` to enable all | | server | api, microservices |
|
||||||
| `IMMICH_TELEMETRY_EXCLUDE` | Do not collect these telemetries. List of `host`, `api`, `io`, `repo`, `job` | | server | api, microservices |
|
| `IMMICH_TELEMETRY_EXCLUDE` | Do not collect these telemetries. List of `host`, `api`, `io`, `repo`, `job` | | server | api, microservices |
|
||||||
|
|
||||||
## Docker Secrets
|
## Secrets
|
||||||
|
|
||||||
The following variables support the use of [Docker secrets][docker-secrets] for additional security.
|
The following variables support reading from files, either via [Systemd Credentials][systemd-creds] or [Docker secrets][docker-secrets] for additional security.
|
||||||
|
|
||||||
To use any of these, replace the regular environment variable with the equivalent `_FILE` environment variable. The value of
|
To use any of these, either set `CREDENTIALS_DIRECTORY` to a directory that contains files whose name is the “regular variable” name, and whose content is the secret. If using Docker Secrets, setting `CREDENTIALS_DIRECTORY=/run/secrets` will cause all secrets present to be used. Alternatively, replace the regular variable with the equivalent `_FILE` environment variable as below. The value of the `_FILE` variable should be set to the path of a file containing the variable value.
|
||||||
the `_FILE` variable should be set to the path of a file containing the variable value.
|
|
||||||
|
|
||||||
| Regular Variable | Equivalent Docker Secrets '\_FILE' Variable |
|
| Regular Variable | Equivalent Docker Secrets '\_FILE' Variable |
|
||||||
| :----------------- | :------------------------------------------ |
|
| :----------------- | :------------------------------------------ |
|
||||||
@@ -226,3 +225,4 @@ to use a Docker secret for the password in the Redis container.
|
|||||||
[docker-secrets-docs]: https://github.com/docker-library/docs/tree/master/postgres#docker-secrets
|
[docker-secrets-docs]: https://github.com/docker-library/docs/tree/master/postgres#docker-secrets
|
||||||
[docker-secrets]: https://docs.docker.com/engine/swarm/secrets/
|
[docker-secrets]: https://docs.docker.com/engine/swarm/secrets/
|
||||||
[ioredis]: https://ioredis.readthedocs.io/en/latest/README/#connect-to-redis
|
[ioredis]: https://ioredis.readthedocs.io/en/latest/README/#connect-to-redis
|
||||||
|
[systemd-creds]: https://systemd.io/CREDENTIALS/
|
||||||
|
|||||||
BIN
docs/docs/install/img/truenas/truenas00.webp
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
BIN
docs/docs/install/img/truenas/truenas04.webp
Normal file
|
After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
docs/docs/install/img/truenas/truenas06.webp
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
docs/docs/install/img/truenas/truenas07.webp
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
docs/docs/install/img/truenas/truenas08.webp
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
docs/docs/install/img/truenas/truenas09.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/docs/install/img/truenas/truenas10.webp
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
@@ -2,6 +2,9 @@
|
|||||||
sidebar_position: 80
|
sidebar_position: 80
|
||||||
---
|
---
|
||||||
|
|
||||||
|
import Tabs from '@theme/Tabs';
|
||||||
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
# TrueNAS [Community]
|
# TrueNAS [Community]
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
@@ -9,211 +12,324 @@ This is a community contribution and not officially supported by the Immich team
|
|||||||
|
|
||||||
Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/).
|
Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/).
|
||||||
|
|
||||||
**Please report app issues to the corresponding [Github Repository](https://github.com/truenas/apps/tree/master/trains/community/immich).**
|
**Please report app issues to the corresponding [GitHub Repository](https://github.com/truenas/apps/tree/master/trains/community/immich).**
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
This guide covers the installation of Immich on TrueNAS Community Edition 24.10.2.2 (Electric Eel) and later.
|
||||||
|
|
||||||
|
We recommend keeping TrueNAS Community Edition and Immich relatively up to date with the latest versions to avoid any issues.
|
||||||
|
|
||||||
|
If you are using an older version of TrueNAS, we ask that you upgrade to the latest version before installing Immich. Check the [TrueNAS Community Edition Release Notes](https://www.truenas.com/docs/softwarereleases/) for more information on breaking changes, new features, and how to upgrade your system.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
Immich can easily be installed on TrueNAS Community Edition via the **Community** train application.
|
Immich can easily be installed on TrueNAS Community Edition via the **Community** train application.
|
||||||
Consider reviewing the TrueNAS [Apps resources](https://apps.truenas.com/getting-started/) if you have not previously configured applications on your system.
|
Consider reviewing the TrueNAS [Apps resources](https://apps.truenas.com/getting-started/) if you have not previously configured applications on your system.
|
||||||
|
|
||||||
TrueNAS Community Edition makes installing and updating Immich easy, but you must use the Immich web portal and mobile app to configure accounts and access libraries.
|
|
||||||
|
|
||||||
## First Steps
|
## First Steps
|
||||||
|
|
||||||
The Immich app in TrueNAS Community Edition installs, completes the initial configuration, then starts the Immich web portal.
|
|
||||||
When updates become available, TrueNAS alerts and provides easy updates.
|
|
||||||
|
|
||||||
Before installing the Immich app in TrueNAS, review the [Environment Variables](#environment-variables) documentation to see if you want to configure any during installation.
|
|
||||||
You may also configure environment variables at any time after deploying the application.
|
|
||||||
|
|
||||||
### Setting up Storage Datasets
|
### Setting up Storage Datasets
|
||||||
|
|
||||||
Before beginning app installation, [create the datasets](https://www.truenas.com/docs/scale/scaletutorials/storage/datasets/datasetsscale/) to use in the **Storage Configuration** section during installation.
|
Before beginning app installation, [create the datasets](https://www.truenas.com/docs/scale/scaletutorials/storage/datasets/datasetsscale/) to use in the **Storage Configuration** section during installation.
|
||||||
Immich requires seven datasets: `library`, `upload`, `thumbs`, `profile`, `video`, `backups`, and `pgData`.
|
|
||||||
You can organize these as one parent with seven child datasets, for example `/mnt/tank/immich/library`, `/mnt/tank/immich/upload`, and so on.
|
In TrueNAS, Immich requires 2 datasets for the application to function correctly: `data` and `pgData`. You can set the datasets to any names to match your naming conventions or preferences.
|
||||||
|
You can organize these as one parent with two child datasets, for example `/mnt/tank/immich/data` and `/mnt/tank/immich/pgData`.
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas12.webp').default}
|
src={require('./img/truenas/truenas00.webp').default}
|
||||||
width="30%"
|
width="40%"
|
||||||
alt="Immich App Widget"
|
alt="Immich App Widget"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
:::info Permissions
|
:::info Datasets Permissions
|
||||||
The **pgData** dataset must be owned by the user `netdata` (UID 999) for postgres to start. The other datasets must be owned by the user `root` (UID 0) or a group that includes the user `root` (UID 0) for immich to have the necessary permissions.
|
|
||||||
|
|
||||||
If the **library** dataset uses ACL it must have [ACL mode](https://www.truenas.com/docs/core/coretutorials/storage/pools/permissions/#access-control-lists) set to `Passthrough` if you plan on using a [storage template](/docs/administration/storage-template.mdx) and the dataset is configured for network sharing (its ACL type is set to `SMB/NFSv4`). When the template is applied and files need to be moved from **upload** to **library**, Immich performs `chmod` internally and needs to be allowed to execute the command. [More info.](https://github.com/immich-app/immich/pull/13017)
|
The **pgData** dataset must be owned by the user `netdata` (UID 999) for Postgres to start.
|
||||||
|
|
||||||
|
The `data` dataset must have given the **_modify_** permission to the user who will run Immich.
|
||||||
|
|
||||||
|
Since TrueNAS Community Edition 24.10.2.2 and later, Immich can be run as any user and group, the default user being `apps` (UID 568) and the default group being `apps` (GID 568). This user, either `apps` or another user you choose, must have **_modify_** permissions on the **data** dataset.
|
||||||
|
|
||||||
|
For an easy setup:
|
||||||
|
|
||||||
|
- Create the parent dataset `immich` keeping the default **Generic** preset.
|
||||||
|
- Select `Dataset Preset` **Apps** instead of **Generic** when creating the `data` dataset. This will automatically give the correct permissions to the dataset. If you want to use another user for Immich, you can keep the **Generic** preset, but you will need to give the **_modify_** permission to that other user.
|
||||||
|
- For the `pgData` dataset, you can keep the default preset **Generic** as permissions can be set during the installation of the Immich app (See [Storage Configuration](#storage-configuration) section).
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
To improve performance, Immich recommends using SSDs for the database. If you have a pool made of SSDs, you can create the `pgData` dataset on that pool.
|
||||||
|
|
||||||
|
Thumbnails can also be stored on the SSDs for faster access. This is an advanced option and not required for Immich to run. More information on how you can use multiple datasets to manage Immich storage in a finer-grained manner can be found in the [Advanced: Multiple Datasets for Immich Storage](#advanced-multiple-datasets-for-immich-storage) section below.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
If you just created the datasets using the **Apps** preset, you can skip this warning section.
|
||||||
|
|
||||||
|
If the **data** dataset uses ACL it must have [ACL mode](https://www.truenas.com/docs/scale/scaletutorials/datasets/permissionsscale/) set to `Passthrough` if you plan on using a [storage template](/docs/administration/storage-template.mdx) and the dataset is configured for network sharing (its ACL type is set to `SMB/NFSv4`). When the template is applied and files need to be moved from **upload** to **library** (internal folder created by Immich within the **data** dataset), Immich performs `chmod` internally and must be allowed to execute the command. [More info.](https://github.com/immich-app/immich/pull/13017)
|
||||||
|
|
||||||
|
To change or verify the ACL mode, go to the **Datasets** screen, select the **library** dataset, click on the **Edit** button next to **Dataset Details**, then click on the **Advanced Options** tab, scroll down to the **ACL Mode** section, and select `Passthrough` from the dropdown menu. Click **Save** to apply the changes. If the option is greyed out, set the **ACL Type** to `SMB/NFSv4` first, then you can change the **ACL Mode** to `Passthrough`.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Installing the Immich Application
|
## Installing the Immich Application
|
||||||
|
|
||||||
To install the **Immich** application, go to **Apps**, click **Discover Apps**, either begin typing Immich into the search field or scroll down to locate the **Immich** application widget.
|
To install the **Immich** application, go to **Apps**, click **Discover Apps**, and either begin typing Immich into the search field or scroll down to locate the **Immich** application widget.
|
||||||
|
|
||||||
|
<div style={{ marginBottom: '2rem', border: '1px solid #ccc', padding: '1rem', borderRadius: '8px' }}>
|
||||||
|
|
||||||
|
Click on the widget to open the **Immich** application details screen.
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas01.webp').default}
|
src={require('./img/truenas/truenas01.webp').default}
|
||||||
width="50%"
|
width="50%"
|
||||||
alt="Immich App Widget"
|
alt="Immich App Widget"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Click on the widget to open the **Immich** application details screen.
|
</div>
|
||||||
|
|
||||||
<br/><br/>
|
<div style={{ marginBottom: '2rem', border: '1px solid #ccc', padding: '1rem', borderRadius: '8px' }}>
|
||||||
|
|
||||||
|
Click **Install** to open the Immich application configuration screen.
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas02.webp').default}
|
src={require('./img/truenas/truenas02.webp').default}
|
||||||
width="100%"
|
width="100%"
|
||||||
alt="Immich App Details Screen"
|
alt="Immich App Details Screen"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Click **Install** to open the Immich application configuration screen.
|
</div>
|
||||||
|
|
||||||
<br/><br/>
|
|
||||||
|
|
||||||
Application configuration settings are presented in several sections, each explained below.
|
Application configuration settings are presented in several sections, each explained below.
|
||||||
To find specific fields click in the **Search Input Fields** search field, scroll down to a particular section or click on the section heading on the navigation area in the upper-right corner.
|
To find specific fields, click in the **Search Input Fields** search field, scroll down to a particular section, or click on the section heading on the navigation area in the upper-right corner.
|
||||||
|
|
||||||
### Application Name and Version
|
### Application Name and Version
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas03.webp').default}
|
src={require('./img/truenas/truenas03.webp').default}
|
||||||
width="100%"
|
width="100%"
|
||||||
alt="Install Immich Screen"
|
alt="Install Immich Screen"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl mb-4"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default value or enter a name in **Application Name** field.
|
Keep the default value or enter a name in the **Application Name** field.
|
||||||
In most cases use the default name, but if adding a second deployment of the application you must change this name.
|
Change it if you’re deploying a second instance.
|
||||||
|
|
||||||
Accept the default version number in **Version**.
|
Immich version within TrueNAS catalog (Different from Immich release version).
|
||||||
When a new version becomes available, the application has an update badge.
|
|
||||||
The **Installed Applications** screen shows the option to update applications.
|
|
||||||
|
|
||||||
### Immich Configuration
|
### Immich Configuration
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas05.webp').default}
|
src={require('./img/truenas/truenas04.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Configuration Settings"
|
alt="Configuration Settings"
|
||||||
|
className="border rounded-xl mb-4"
|
||||||
|
/>
|
||||||
|
|
||||||
|
The **Timezone** is set to the system default, which usually matches your local timezone. You can change it to another timezone if you prefer.
|
||||||
|
|
||||||
|
**Enable Machine Learning** is enabled by default. It allows Immich to use machine learning features such as face recognition, image search, and smart duplicate detection. Untick this option if you do not want to use these features.
|
||||||
|
|
||||||
|
Select the **Machine Learning Image Type** based on the hardware you have. More details here: [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md)
|
||||||
|
|
||||||
|
**Database Password** should be set to a custom value using only the characters `A-Za-z0-9`. This password is used to secure the Postgres database.
|
||||||
|
|
||||||
|
**Redis Password** should be set to a custom value using only the characters `A-Za-z0-9`. Preferably, use a different password from the database password.
|
||||||
|
|
||||||
|
Keep the **Log Level** to the default `Log` value.
|
||||||
|
|
||||||
|
Leave **Hugging Face Endpoint** blank. (This is used to download ML models from a different source.)
|
||||||
|
|
||||||
|
Set **Database Storage Type** to the type of storage (**HDD** or **SSD**) that the pool where the **pgData** dataset is located uses.
|
||||||
|
|
||||||
|
**Additional Environment Variables** can be left blank.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Advanced users: Adding Environment Variables</summary>
|
||||||
|
|
||||||
|
Environment variables can be set by clicking the **Add** button and filling in the **Name** and **Value** fields.
|
||||||
|
|
||||||
|
<img
|
||||||
|
src={require('./img/truenas/truenas05.webp').default}
|
||||||
|
width="40%"
|
||||||
|
alt="Environment Variables"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default value in **Timezone** or change to match your local timezone.
|
These are used to add custom configuration options or to enable specific features.
|
||||||
**Timezone** is only used by the Immich `exiftool` microservice if it cannot be determined from the image metadata.
|
More information on available environment variables can be found in the **[environment variables documentation](/docs/install/environment-variables/)**.
|
||||||
|
|
||||||
Untick **Enable Machine Learning** if you will not use face recognition, image search, and smart duplicate detection.
|
:::info
|
||||||
|
Some environment variables are not available for the TrueNAS Community Edition app as they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings).
|
||||||
|
|
||||||
Accept the default option or select the **Machine Learning Image Type** for your hardware based on the [Hardware-Accelerated Machine Learning Supported Backends](/docs/features/ml-hardware-acceleration.md#supported-backends).
|
Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`, `IMMICH_LOG_LEVEL`, `DB_PASSWORD`, `REDIS_PASSWORD`.
|
||||||
|
:::
|
||||||
|
|
||||||
Immich's default is `postgres` but you should consider setting the **Database Password** to a custom value using only the characters `A-Za-z0-9`.
|
</details>
|
||||||
|
|
||||||
The **Redis Password** should be set to a custom value using only the characters `A-Za-z0-9`.
|
### User and Group Configuration
|
||||||
|
|
||||||
Accept the **Log Level** default of **Log**.
|
Application in TrueNAS runs as a specific user and group. Immich uses the default user `apps` (UID 568) and the default group `apps` (GID 568).
|
||||||
|
|
||||||
Leave **Hugging Face Endpoint** blank. (This is for downloading ML models from a different source.)
|
<img
|
||||||
|
src={require('./img/truenas/truenas06.webp').default}
|
||||||
|
width="40%"
|
||||||
|
alt="User and Group Configuration"
|
||||||
|
className="border rounded-xl"
|
||||||
|
/>
|
||||||
|
|
||||||
Leave **Additional Environment Variables** blank or see [Environment Variables](#environment-variables) to set before installing.
|
- **User ID**: Keep the default value `apps` (UID 568) or define a different one if needed.
|
||||||
|
|
||||||
|
- **Group ID**: Keep the default value `apps` (GID 568) or define a different one if needed.
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
If you change the user or group, make sure that the datasets you created for Immich data storage have the correct permissions set for that user and group as specified in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above.
|
||||||
|
:::
|
||||||
|
|
||||||
### Network Configuration
|
### Network Configuration
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas06.webp').default}
|
src={require('./img/truenas/truenas07.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Networking Settings"
|
alt="Networking Settings"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default port `30041` in **WebUI Port** or enter a custom port number.
|
- **Port Bind Mode**: This lets you expose the port to the host system, allowing you to access Immich from outside the TrueNAS system. Keep the default **_Publish port on the host for external access_** value unless you have a specific reason to change it.
|
||||||
:::info Allowed Port Numbers
|
|
||||||
Only numbers within the range 9000-65535 may be used on TrueNAS versions below TrueNAS Community Edition 24.10 Electric Eel.
|
|
||||||
|
|
||||||
Regardless of version, to avoid port conflicts, don't use [ports on this list](https://www.truenas.com/docs/solutions/optimizations/security/#truenas-default-ports).
|
- **Port Number**: Keep the default port `30041` or enter a custom port number.
|
||||||
:::
|
|
||||||
|
- **Host IPs**: Leave the default blank value.
|
||||||
|
|
||||||
### Storage Configuration
|
### Storage Configuration
|
||||||
|
|
||||||
Immich requires seven storage datasets.
|
:::danger Default Settings (Not recommended)
|
||||||
|
The default setting for datasets is **ixVolume (dataset created automatically by the system)**. This is not recommended as this results in your data being harder to access manually and can result in data loss if you delete the immich app. It is also harder to manage snapshots and replication tasks. It is recommended to use the **Host Path (Path that already exists on the system)** option instead.
|
||||||
<img
|
|
||||||
src={require('./img/truenas07.webp').default}
|
|
||||||
width="20%"
|
|
||||||
alt="Configure Storage ixVolumes"
|
|
||||||
className="border rounded-xl"
|
|
||||||
/>
|
|
||||||
|
|
||||||
:::note Default Setting (Not recommended)
|
|
||||||
The default setting for datasets is **ixVolume (dataset created automatically by the system)** but this results in your data being harder to access manually and can result in data loss if you delete the immich app. (Not recommended)
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
For each Storage option select **Host Path (Path that already exists on the system)** and then select the matching dataset [created before installing the app](#setting-up-storage-datasets): **Immich Library Storage**: `library`, **Immich Uploads Storage**: `upload`, **Immich Thumbs Storage**: `thumbs`, **Immich Profile Storage**: `profile`, **Immich Video Storage**: `video`, **Immich Backups Storage**: `backups`, **Postgres Data Storage**: `pgData`.
|
The storage configuration section allows you to set up the storage locations for Immich data. You can select the datasets created in the previous step.
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas08.webp').default}
|
src={require('./img/truenas/truenas08.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Configure Storage Host Paths"
|
alt="Configure Storage Volumes"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
The image above has example values.
|
|
||||||
|
|
||||||
<br/>
|
For the Data Storage, select **Host Path (Path that already exists on the system)** and then select the dataset you created for Immich data storage, for example, `data`.
|
||||||
|
|
||||||
### Additional Storage [(External Libraries)](/docs/features/libraries)
|
The Machine Learning cache can be left with default _Temporary_
|
||||||
|
|
||||||
|
For the Postgres Data Storage, select **Host Path (Path that already exists on the system)** and then select the dataset you created for Postgres data storage, for example, `pgData`.
|
||||||
|
|
||||||
|
:::info
|
||||||
|
**Postgres Data Storage**
|
||||||
|
Once **Host Path** is selected, a checkbox appears with **_Automatic Permissions_**. If you have not set the ownership of the **pgData** dataset to `netdata` (UID 999), tick this box as it will set the user ownership to `netdata` (UID 999) and the group ownership to `docker` (GID 999) automatically. If you have set the ownership of the **pgData** dataset to `netdata` (UID 999), you can leave this box unticked.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Additional Storage (Advanced Users)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>External Libraries</summary>
|
||||||
|
|
||||||
:::danger Advanced Users Only
|
:::danger Advanced Users Only
|
||||||
This feature should only be used by advanced users. If this is your first time installing Immich, then DO NOT mount an external library until you have a working setup. Also, your mount path MUST be something unique and should NOT be your library or upload location or a Linux directory like `/lib`. The picture below shows a valid example.
|
This feature should only be used by advanced users. If this is your first time installing Immich, then DO NOT mount an external library until you have a working setup.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas10.webp').default}
|
src={require('./img/truenas/truenas09.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Configure Storage Host Paths"
|
alt="Add External Libraries with Additional Storage"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
You may configure [External Libraries](/docs/features/libraries) by mounting them using **Additional Storage**.
|
You may configure [external libraries](/docs/features/libraries) by mounting them using **Additional Storage**.
|
||||||
The **Mount Path** is the location you will need to copy and paste into the External Library settings within Immich.
|
|
||||||
The **Host Path** is the location on the TrueNAS Community Edition server where your external library is located.
|
|
||||||
|
|
||||||
<!-- A section for Labels would go here but I don't know what they do. -->
|
The dataset that contains your external library files must at least give **read** access to the user running Immich (Default: `apps` (UID 568), `apps` (GID 568)).
|
||||||
|
If you want to be able to delete files or edit metadata in the external library using Immich, you will need to give the **modify** permission to the user running Immich.
|
||||||
|
|
||||||
|
- **Mount Path** is the location you will need to copy and paste into the external library settings within Immich.
|
||||||
|
- **Host Path** is the location on the TrueNAS Community Edition server where your external library is located.
|
||||||
|
- **Read Only** is a checkbox that you can tick if you want to prevent Immich from modifying the files in the external library. This is useful if you want to use Immich to view and search your external library without modifying it.
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Each mount path MUST be something unique and should NOT be your library or upload location or a Linux directory like `/lib`.
|
||||||
|
|
||||||
|
A general recommendation is to mount any external libraries to a path beginning with `/mnt` or `/media` followed by a unique name, such as `/mnt/external-libraries` or `/media/my-external-libraries`. If you plan to mount multiple external libraries, you can use paths like `/mnt/external-libraries/library1`, `/mnt/external-libraries/library2`, etc.
|
||||||
|
:::
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Multiple Datasets for Immich Storage</summary>
|
||||||
|
|
||||||
|
:::danger Advanced Users Only
|
||||||
|
This feature should only be used by advanced users.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Immich can use multiple datasets for its storage, allowing you to manage your data more granularly, similar to the old storage configuration. This is useful if you want to separate your data into different datasets for performance or organizational reasons. There is a general guide for this [here](/docs/guides/custom-locations), but read on for the TrueNAS guide.
|
||||||
|
|
||||||
|
Each additional dataset has to give the permission **_modify_** to the user who will run Immich (Default: `apps` (UID 568), `apps` (GID 568))
|
||||||
|
As described in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above, you have to create the datasets with the **Apps** preset to ensure the correct permissions are set, or you can set the permissions manually after creating the datasets.
|
||||||
|
|
||||||
|
Immich uses 6 folders for its storage: `library`, `upload`, `thumbs`, `profile`, `encoded-video`, and `backups`. You can create a dataset for each of these folders or only for some of them.
|
||||||
|
|
||||||
|
To mount these datasets:
|
||||||
|
|
||||||
|
1. Add an **Additional Storage** entry for each dataset you want to use.
|
||||||
|
2. Select **Type** as **Host Path (Path that already exists on the system)**.
|
||||||
|
3. Enter the **Mount Path** with `/data/<folder-name>`. The `<folder-name>` is the name of the folder you want to mount, for example, `library`, `upload`, `thumbs`, `profile`, `encoded-video`, or `backups`.
|
||||||
|
:::danger Important
|
||||||
|
You have to write the full path, including `/data/`, as Immich expects the data to be in that location.
|
||||||
|
If you do not include this path, Immich will not be able to find the data and will not write the data to the location you specified.
|
||||||
|
:::
|
||||||
|
4. Select the **Host Path** as the dataset you created for that folder, for example, `/mnt/tank/immich/library`, `/mnt/tank/immich/upload`, etc.
|
||||||
|
|
||||||
|
<img
|
||||||
|
src={require('./img/truenas/truenas10.webp').default}
|
||||||
|
width="40%"
|
||||||
|
alt="Use Multiple Datasets for Immich Storage with Additional Storage"
|
||||||
|
className="border rounded-xl"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<!-- A section for Labels could be added, but I don't think it is needed as they are of no use for Immich. -->
|
||||||
|
|
||||||
### Resources Configuration
|
### Resources Configuration
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas09.webp').default}
|
src={require('./img/truenas/truenas11.webp').default}
|
||||||
width="40%"
|
width="40%"
|
||||||
alt="Resource Limits"
|
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Accept the default **CPU** limit of `2` threads or specify the number of threads (CPUs with Multi-/Hyper-threading have 2 threads per core).
|
- **CPU**: Depending on your system resources, you can keep the default value of `2` threads or specify a different number. Immich recommends at least `8` threads.
|
||||||
|
|
||||||
Specify the **Memory** limit in MB of RAM. Immich recommends at least 6000 MB (6GB). If you selected **Enable Machine Learning** in **Immich Configuration**, you should probably set this above 8000 MB.
|
- **Memory**: Limit in MB of RAM. Immich recommends at least 6000 MB (6GB). If you selected **Enable Machine Learning** in **Immich Configuration**, you should probably set this above 8000 MB.
|
||||||
|
|
||||||
:::info Older TrueNAS Versions
|
Both **CPU** and **Memory** are limits, not reservations. This means that Immich can use up to the specified amount of CPU threads and RAM, but it will not reserve that amount of resources at all times. The system will allocate resources as needed, and Immich will use less than the specified amount most of the time.
|
||||||
Before TrueNAS Community Edition version 24.10 Electric Eel:
|
|
||||||
|
|
||||||
The **CPU** value was specified in a different format with a default of `4000m` which is 4 threads.
|
- Enable **GPU Configuration** options if you have a GPU or CPU with integrated graphics that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md).
|
||||||
|
|
||||||
The **Memory** value was specified in a different format with a default of `8Gi` which is 8 GiB of RAM. The value was specified in bytes or a number with a measurement suffix. Examples: `129M`, `123Mi`, `1000000000`
|
The process for NVIDIA GPU passthrough requires additional steps.
|
||||||
:::
|
More details here: [GPU Passthrough Docs for TrueNAS Apps](https://apps.truenas.com/managing-apps/installing-apps/#gpu-passthrough)
|
||||||
|
|
||||||
Enable **GPU Configuration** options if you have a GPU that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md). More info: [GPU Passthrough Docs for TrueNAS Apps](https://apps.truenas.com/managing-apps/installing-apps/#gpu-passthrough)
|
|
||||||
|
|
||||||
### Install
|
### Install
|
||||||
|
|
||||||
Finally, click **Install**.
|
Finally, click **Install**.
|
||||||
The system opens the **Installed Applications** screen with the Immich app in the **Deploying** state.
|
The system opens the **Installed Applications** screen with the Immich app in the **Deploying** state.
|
||||||
When the installation completes it changes to **Running**.
|
When the installation completes, it changes to **Running**.
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src={require('./img/truenas04.webp').default}
|
src={require('./img/truenas/truenas12.webp').default}
|
||||||
width="100%"
|
width="100%"
|
||||||
alt="Immich Installed"
|
alt="Immich Installed"
|
||||||
className="border rounded-xl"
|
className="border rounded-xl"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
Click **Web Portal** on the **Application Info** widget to open the Immich web interface to set up your account and begin uploading photos.
|
Click **Web Portal** on the **Application Info** widget, or go to the URL `http://<your-truenas-ip>:30041` in your web browser to open the Immich web interface. This will show you the onboarding process to set up your first user account, which will be an administrator account.
|
||||||
|
|
||||||
|
After that, you can start using Immich to upload and manage your photos and videos.
|
||||||
|
|
||||||
:::tip
|
:::tip
|
||||||
For more information on how to use the application once installed, please refer to the [Post Install](/docs/install/post-install.mdx) guide.
|
For more information on how to use the application once installed, please refer to the [Post Install](/docs/install/post-install.mdx) guide.
|
||||||
@@ -228,23 +344,6 @@ For more information on how to use the application once installed, please refer
|
|||||||
- Click **Update** at the very bottom of the page to save changes.
|
- Click **Update** at the very bottom of the page to save changes.
|
||||||
- TrueNAS automatically updates, recreates, and redeploys the Immich container with the updated settings.
|
- TrueNAS automatically updates, recreates, and redeploys the Immich container with the updated settings.
|
||||||
|
|
||||||
## Environment Variables
|
|
||||||
|
|
||||||
You can set [Environment Variables](/docs/install/environment-variables) by clicking **Add** on the **Additional Environment Variables** option and filling in the **Name** and **Value**.
|
|
||||||
|
|
||||||
<img
|
|
||||||
src={require('./img/truenas11.webp').default}
|
|
||||||
width="40%"
|
|
||||||
alt="Environment Variables"
|
|
||||||
className="border rounded-xl"
|
|
||||||
/>
|
|
||||||
|
|
||||||
:::info
|
|
||||||
Some Environment Variables are not available for the TrueNAS Community Edition app. This is mainly because they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings).
|
|
||||||
|
|
||||||
Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`, `IMMICH_LOG_LEVEL`, `DB_PASSWORD`, `REDIS_PASSWORD`.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Updating the App
|
## Updating the App
|
||||||
|
|
||||||
:::danger
|
:::danger
|
||||||
@@ -261,3 +360,116 @@ To update the app to the latest version:
|
|||||||
- You may view the Changelog.
|
- You may view the Changelog.
|
||||||
- Click **Upgrade** to begin the process and open a counter dialog that shows the upgrade progress.
|
- Click **Upgrade** to begin the process and open a counter dialog that shows the upgrade progress.
|
||||||
- When complete, the update badge and buttons disappear and the application Update state on the Installed screen changes from Update Available to Up to date.
|
- When complete, the update badge and buttons disappear and the application Update state on the Installed screen changes from Update Available to Up to date.
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
:::danger
|
||||||
|
Perform a backup of your Immich data before proceeding with the migration steps below. This is crucial to prevent any data loss if something goes wrong during the migration process.
|
||||||
|
|
||||||
|
The migration should also be performed when the Immich app is not running to ensure no data is being written while you are copying the data.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Migration from Old Storage Configuration
|
||||||
|
|
||||||
|
There are two ways to migrate from the old storage configuration to the new one, depending on whether you want to keep the old multiple datasets or if you want to move to a double dataset configuration with a single dataset for Immich data storage and a single dataset for Postgres data storage.
|
||||||
|
|
||||||
|
:::note Old TrueNAS Versions Permissions
|
||||||
|
If you were using an older version of TrueNAS (before 24.10.2.2), the datasets, except the one for **pgData** had only to be owned by the `root` user (UID 0). You might have to add the **modify** permission to the `apps` user (UID 568) or the user you want to run Immich as, to all of them, except **pgData**. The steps to add or change ACL permissions are described in the [TrueNAS documentation](https://www.truenas.com/docs/scale/scaletutorials/datasets/permissionsscale/).
|
||||||
|
:::
|
||||||
|
|
||||||
|
<Tabs groupId="truenas-migration-tabs">
|
||||||
|
<TabItem value="migrate-new-dataset" label="Migrate data to a new dataset (recommended)" default>
|
||||||
|
|
||||||
|
To migrate from the old storage configuration to the new one, you will need to create a new dataset for the Immich data storage and copy the data from the old datasets to the new ones. The steps are as follows:
|
||||||
|
|
||||||
|
1. **Stop the Immich app** from the TrueNAS web interface to ensure no data is being written while you are copying the data.
|
||||||
|
2. **Create a new dataset** for the Immich data storage, for example, `data`. As described in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above, create the dataset with the **Apps** preset to ensure the correct permissions are set.
|
||||||
|
3. **Copy the data** from the old datasets to the new dataset. We advise using the `rsync` command to copy the data, as it will preserve the permissions and ownership of the files. The following commands are examples:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/tank/immich/library/ /mnt/tank/immich/data/library/
|
||||||
|
rsync -av /mnt/tank/immich/upload/ /mnt/tank/immich/data/upload/
|
||||||
|
rsync -av /mnt/tank/immich/thumbs/ /mnt/tank/immich/data/thumbs/
|
||||||
|
rsync -av /mnt/tank/immich/profile/ /mnt/tank/immich/data/profile/
|
||||||
|
rsync -av /mnt/tank/immich/video/ /mnt/tank/immich/data/encoded-video/
|
||||||
|
rsync -av /mnt/tank/immich/backups/ /mnt/tank/immich/data/backups/
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure to replace `/mnt/tank/immich/` with the correct path to your old datasets and `/mnt/tank/immich/data/` with the correct path to your new dataset.
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
If you were using **ixVolume (dataset created automatically by the system)** for Immich data storage, the path to the data should be `/mnt/.ix-apps/app_mounts/immich/`. You have to use this path instead of `/mnt/tank/immich/` in the `rsync` command above, for example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/.ix-apps/app_mounts/immich/library/ /mnt/tank/immich/data/library/
|
||||||
|
```
|
||||||
|
|
||||||
|
If you were also using an ixVolume for Postgres data storage, you also should, first create the pgData dataset, as described in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above, and then you can use the following command to copy the Postgres data:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/.ix-apps/app_mounts/immich/pgData/ /mnt/tank/immich/pgData/
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Make sure that for each folder, the `.immich` file is copied as well, as it contains important metadata for Immich. If for some reason the `.immich` file is not copied, you can copy it manually with the `rsync` command, for example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -av /mnt/tank/immich/library/.immich /mnt/tank/immich/data/library/
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `library` with the name of the folder where you are copying the file.
|
||||||
|
:::
|
||||||
|
|
||||||
|
4. **Update the permissions** as the permissions of the data that have been copied has been preserved, to ensure that the `apps` user (UID 568) has the correct permissions on all the copied data. If you just created the dataset with the **Apps** preset, from the TrueNAS web interface, go to the **Datasets** screen, select the **data** dataset, click on the **Edit** button next to **Permissions**, tick the "Apply permissions recursively" checkbox, and click **Save**. This will apply the correct permissions to all the copied data.
|
||||||
|
5. **Update the Immich app** to use the new dataset:
|
||||||
|
- Go to the **Installed Applications** screen and select Immich from the list of installed applications.
|
||||||
|
- Click **Edit** on the **Application Info** widget.
|
||||||
|
- In the **Storage Configuration** section, untick the **Use Old Storage Configuration (Deprecated)** checkbox.
|
||||||
|
- For the **Data Storage**, select **Host Path (Path that already exists on the system)** and then select the new dataset you created for Immich data storage, for example, `data`.
|
||||||
|
- For the **Postgres Data Storage**, verify that it is still set to the dataset you created for Postgres data storage, for example, `pgData`.
|
||||||
|
- Click **Update** at the bottom of the page to save changes.
|
||||||
|
|
||||||
|
6. **Start the Immich app** from the TrueNAS web interface.
|
||||||
|
|
||||||
|
This will recreate the Immich container with the new storage configuration and start the app.
|
||||||
|
|
||||||
|
If everything went well, you should now be able to access Immich with the new storage configuration. You can verify that the data has been copied correctly by checking the Immich web interface and ensuring that all your photos and videos are still available. You may delete the old datasets, if you no longer need them, using the TrueNAS web interface.
|
||||||
|
|
||||||
|
If you were using **ixVolume (dataset created automatically by the system)** or folders for Immich data storage, you can delete the old datasets using the following commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/library
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/uploads
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/thumbs
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/profile
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/video
|
||||||
|
rm -r /mnt/.ix-apps/app_mounts/immich/backups
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem value="migrate-old-dataset" label="Keep the existing datasets">
|
||||||
|
|
||||||
|
To migrate from the old storage configuration to the new one without creating new datasets.
|
||||||
|
1. **Stop the Immich app** from the TrueNAS web interface to ensure no data is being written while you are updating the app.
|
||||||
|
2. **Update the datasets permissions**: Ensure that the datasets used for Immich data storage (`library`, `upload`, `thumbs`, `profile`, `video`, `backups`) have the correct permissions set for the user who will run Immich. The user should have ***modify*** permissions on these datasets. The default user for Immich is `apps` (UID 568) and the default group is `apps` (GID 568). If you are using a different user, make sure to set the permissions accordingly. You can do this from the TrueNAS web interface by going to the **Datasets** screen, selecting each dataset, clicking on the **Edit** button next to **Permissions**, and adding the user with ***modify*** permissions.
|
||||||
|
3. **Update the Immich app** to use the existing datasets:
|
||||||
|
- Go to the **Installed Applications** screen and select Immich from the list of installed applications.
|
||||||
|
- Click **Edit** on the **Application Info** widget.
|
||||||
|
- In the **Storage Configuration** section, untick the **Use Old Storage Configuration (Deprecated)** checkbox.
|
||||||
|
- For the **Data Storage**, you can keep the **ixVolume (dataset created automatically by the system)** as no data will be directly written to it. We recommend selecting **Host Path (Path that already exists on the system)** and then select a **new** dataset you created for Immich data storage, for example, `data`.
|
||||||
|
- For the **Postgres Data Storage**, keep **Host Path (Path that already exists on the system)** and then select the existing dataset you used for Postgres data storage, for example, `pgData`.
|
||||||
|
- Following the instructions in the [Multiple Datasets for Immich Storage](#additional-storage-advanced-users) section, you can add, **for each old dataset**, a new Additional Storage with the following settings:
|
||||||
|
- **Type**: `Host Path (Path that already exists on the system)`
|
||||||
|
- **Mount Path**: `/data/<folder-name>` (e.g. `/data/library`)
|
||||||
|
- **Host Path**: `/mnt/<your-pool-name>/<dataset-name>` (e.g. `/mnt/tank/immich/library`)
|
||||||
|
:::danger Ensure using the correct paths names
|
||||||
|
Make sure to replace `<folder-name>` with the actual name of the folder used by Immich: `library`, `upload`, `thumbs`, `profile`, `encoded-video`, and `backups`. Also, replace `<your-pool-name>` and `<dataset-name>` with the actual names of your pool and dataset.
|
||||||
|
:::
|
||||||
|
- **Read Only**: Keep it unticked as Immich needs to write to these datasets.
|
||||||
|
- Click **Update** at the bottom of the page to save changes.
|
||||||
|
4. **Start the Immich app** from the TrueNAS web interface. This will recreate the Immich container with the new storage configuration and start the app. If everything went well, you should now be able to access Immich with the new storage configuration. You can verify that the data is still available by checking the Immich web interface and ensuring that all your photos and videos are still accessible.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
</Tabs>
|
||||||
|
|||||||
@@ -27,3 +27,102 @@ docker image prune
|
|||||||
[watchtower]: https://containrrr.dev/watchtower/
|
[watchtower]: https://containrrr.dev/watchtower/
|
||||||
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
|
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
|
||||||
[releases]: https://github.com/immich-app/immich/releases
|
[releases]: https://github.com/immich-app/immich/releases
|
||||||
|
|
||||||
|
## Migrating to VectorChord
|
||||||
|
|
||||||
|
:::info
|
||||||
|
If you deploy Immich using Docker Compose, see `ghcr.io/immich-app/postgres` in the `docker-compose.yml` file and have not explicitly set the `DB_VECTOR_EXTENSION` environmental variable, your Immich database is already using VectorChord and this section does not apply to you.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::important
|
||||||
|
If you do not deploy Immich using Docker Compose and see a deprecation warning for pgvecto.rs on server startup, you should refer to the maintainers of the Immich distribution for guidance (if using a turnkey solution) or adapt the instructions for your specific setup.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Immich has migrated off of the deprecated pgvecto.rs database extension to its successor, [VectorChord](https://github.com/tensorchord/VectorChord), which comes with performance improvements in almost every aspect. This section will guide you on how to make this change in a Docker Compose setup.
|
||||||
|
|
||||||
|
Before making any changes, please [back up your database](/docs/administration/backup-and-restore). While every effort has been made to make this migration as smooth as possible, there’s always a chance that something can go wrong.
|
||||||
|
|
||||||
|
After making a backup, please modify your `docker-compose.yml` file with the following information.
|
||||||
|
|
||||||
|
```diff
|
||||||
|
[...]
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: immich_postgres
|
||||||
|
- image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||||
|
+ image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||||
|
POSTGRES_INITDB_ARGS: '--data-checksums'
|
||||||
|
+ # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
|
||||||
|
+ # DB_STORAGE_TYPE: 'HDD'
|
||||||
|
volumes:
|
||||||
|
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
|
||||||
|
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
|
||||||
|
- healthcheck:
|
||||||
|
- test: >-
|
||||||
|
- pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
|
||||||
|
- Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
|
||||||
|
- --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
|
||||||
|
- echo "checksum failure count is $$Chksum";
|
||||||
|
- [ "$$Chksum" = '0' ] || exit 1
|
||||||
|
- interval: 5m
|
||||||
|
- start_interval: 30s
|
||||||
|
- start_period: 5m
|
||||||
|
- command: >-
|
||||||
|
- postgres
|
||||||
|
- -c shared_preload_libraries=vectors.so
|
||||||
|
- -c 'search_path="$$user", public, vectors'
|
||||||
|
- -c logging_collector=on
|
||||||
|
- -c max_wal_size=2GB
|
||||||
|
- -c shared_buffers=512MB
|
||||||
|
- -c wal_compression=on
|
||||||
|
+ shm_size: 128mb
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
:::important
|
||||||
|
If you deviated from the defaults of pg14 or pgvectors0.2.0, you must adjust the pg major version and pgvecto.rs version. If you are still using the default `docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0` image, you can just follow the changes above. For example, if the previous image is `docker.io/tensorchord/pgvecto-rs:pg16-v0.3.0`, the new image should be `ghcr.io/immich-app/postgres:16-vectorchord0.3.0-pgvectors0.3.0` instead of the image specified in the diff.
|
||||||
|
:::
|
||||||
|
|
||||||
|
After making these changes, you can start Immich as normal. Immich will make some changes to the DB during startup, which can take seconds to minutes to finish, depending on hardware and library size. In particular, it’s normal for the server logs to be seemingly stuck at `Reindexing clip_index` and `Reindexing face_index`for some time if you have over 100k assets in Immich and/or Immich is on a relatively weak server. If you see these logs and there are no errors, just give it time.
|
||||||
|
|
||||||
|
:::danger
|
||||||
|
After switching to VectorChord, you should not downgrade Immich below 1.133.0.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Please don’t hesitate to contact us on [GitHub](https://github.com/immich-app/immich/discussions) or [Discord](https://discord.immich.app/) if you encounter migration issues.
|
||||||
|
|
||||||
|
### VectorChord FAQ
|
||||||
|
|
||||||
|
#### I have a separate PostgreSQL instance shared with multiple services. How can I switch to VectorChord?
|
||||||
|
|
||||||
|
Please see the [standalone PostgreSQL documentation](/docs/administration/postgres-standalone#migrating-to-vectorchord) for migration instructions. The migration path will be different depending on whether you’re currently using pgvecto.rs or pgvector, as well as whether Immich has superuser DB permissions.
|
||||||
|
|
||||||
|
#### Why are so many lines removed from the `docker-compose.yml` file? Does this mean the health check is removed?
|
||||||
|
|
||||||
|
These lines are now incorporated into the image itself along with some additional tuning.
|
||||||
|
|
||||||
|
#### What does this change mean for my existing DB backups?
|
||||||
|
|
||||||
|
The new DB image includes pgvector and pgvecto.rs in addition to VectorChord, so you can use this image to restore from existing backups that used either of these extensions. However, backups made after switching to VectorChord require an image containing VectorChord to restore successfully.
|
||||||
|
|
||||||
|
#### Do I still need pgvecto.rs installed after migrating to VectorChord?
|
||||||
|
|
||||||
|
pgvecto.rs only needs to be available during the migration, or if you need to restore from a backup that used pgvecto.rs. For a leaner DB and a smaller image, you can optionally switch to an image variant that doesn’t have pgvecto.rs installed after you’ve performed the migration and started Immich: `ghcr.io/immich-app/postgres:14-vectorchord0.4.3`, changing the PostgreSQL version as appropriate.
|
||||||
|
|
||||||
|
#### Why does it matter whether my database is on an SSD or an HDD?
|
||||||
|
|
||||||
|
These storage mediums have different performance characteristics. As a result, the optimal settings for an SSD are not the same as those for an HDD. Either configuration is compatible with SSD and HDD, but using the right configuration will make Immich snappier. As a general tip, we recommend users store the database on an SSD whenever possible.
|
||||||
|
|
||||||
|
#### Can I use the new database image as a general PostgreSQL image outside of Immich?
|
||||||
|
|
||||||
|
It’s a standard PostgreSQL container image that additionally contains the VectorChord, pgvector, and (optionally) pgvecto.rs extensions. If you were using the previous pgvecto.rs image for other purposes, you can similarly do so with this image.
|
||||||
|
|
||||||
|
#### If pgvecto.rs and pgvector still work, why should I switch to VectorChord?
|
||||||
|
|
||||||
|
VectorChord is faster, more stable, uses less RAM, and (with the settings Immich uses) offers higher-quality results than pgvector and pgvecto.rs. This translates to better search and facial recognition experiences. In addition, pgvecto.rs support will be dropped in the future, so changing it sooner will avoid disruption.
|
||||||
|
|||||||
20545
docs/package-lock.json
generated
@@ -7,7 +7,8 @@
|
|||||||
"format": "prettier --check .",
|
"format": "prettier --check .",
|
||||||
"format:fix": "prettier --write .",
|
"format:fix": "prettier --write .",
|
||||||
"start": "docusaurus start --port 3005",
|
"start": "docusaurus start --port 3005",
|
||||||
"build": "docusaurus build",
|
"copy:openapi": "jq -c < ../open-api/immich-openapi-specs.json > ./static/openapi.json || exit 0",
|
||||||
|
"build": "npm run copy:openapi && docusaurus build",
|
||||||
"swizzle": "docusaurus swizzle",
|
"swizzle": "docusaurus swizzle",
|
||||||
"deploy": "docusaurus deploy",
|
"deploy": "docusaurus deploy",
|
||||||
"clear": "docusaurus clear",
|
"clear": "docusaurus clear",
|
||||||
@@ -59,6 +60,6 @@
|
|||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.17.1"
|
"node": "22.18.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,6 +100,11 @@ const projects: CommunityProjectProps[] = [
|
|||||||
description: 'Automatically optimize files uploaded to Immich in order to save storage space',
|
description: 'Automatically optimize files uploaded to Immich in order to save storage space',
|
||||||
url: 'https://github.com/miguelangel-nubla/immich-upload-optimizer',
|
url: 'https://github.com/miguelangel-nubla/immich-upload-optimizer',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Immich Machine Learning Load Balancer',
|
||||||
|
description: 'Speed up your machine learning by load balancing your requests to multiple computers',
|
||||||
|
url: 'https://github.com/apetersson/immich_ml_balancer',
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {
|
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ import {
|
|||||||
mdiCloudKeyOutline,
|
mdiCloudKeyOutline,
|
||||||
mdiRegex,
|
mdiRegex,
|
||||||
mdiCodeJson,
|
mdiCodeJson,
|
||||||
|
mdiClockOutline,
|
||||||
|
mdiAccountOutline,
|
||||||
|
mdiRestart,
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import Layout from '@theme/Layout';
|
import Layout from '@theme/Layout';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
@@ -26,6 +29,42 @@ const withLanguage = (date: Date) => (language: string) => date.toLocaleDateStri
|
|||||||
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
|
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
|
||||||
|
|
||||||
const items: Item[] = [
|
const items: Item[] = [
|
||||||
|
{
|
||||||
|
icon: mdiClockOutline,
|
||||||
|
iconColor: 'gray',
|
||||||
|
title: 'setTimeout is cursed',
|
||||||
|
description:
|
||||||
|
'The setTimeout method in JavaScript is cursed when used with small values because the implementation may or may not actually wait the specified time.',
|
||||||
|
link: {
|
||||||
|
url: 'https://github.com/immich-app/immich/pull/20655',
|
||||||
|
text: '#20655',
|
||||||
|
},
|
||||||
|
date: new Date(2025, 7, 4),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: mdiAccountOutline,
|
||||||
|
iconColor: '#DAB1DA',
|
||||||
|
title: 'PostgreSQL USER is cursed',
|
||||||
|
description:
|
||||||
|
'The USER keyword in PostgreSQL is cursed because you can select from it like a table, which leads to confusion if you have a table name user as well.',
|
||||||
|
link: {
|
||||||
|
url: 'https://github.com/immich-app/immich/pull/19891',
|
||||||
|
text: '#19891',
|
||||||
|
},
|
||||||
|
date: new Date(2025, 7, 4),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: mdiRestart,
|
||||||
|
iconColor: '#8395e3',
|
||||||
|
title: 'PostgreSQL RESET is cursed',
|
||||||
|
description:
|
||||||
|
'PostgreSQL RESET is cursed because it is impossible to RESET a PostgreSQL extension parameter if the extension has been uninstalled.',
|
||||||
|
link: {
|
||||||
|
url: 'https://github.com/immich-app/immich/pull/19363',
|
||||||
|
text: '#19363',
|
||||||
|
},
|
||||||
|
date: new Date(2025, 5, 20),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
icon: mdiRegex,
|
icon: mdiRegex,
|
||||||
iconColor: 'purple',
|
iconColor: 'purple',
|
||||||
|
|||||||
@@ -2,4 +2,23 @@
|
|||||||
|
|
||||||
## TypeORM Upgrade
|
## TypeORM Upgrade
|
||||||
|
|
||||||
The upgrade to Immich `v2.x.x` has a required upgrade path to `v1.132.0+`. This means it is required to start up the application at least once on version `1.132.0` (or later). Doing so will complete database schema upgrades that are required for `v2.0.0`. After Immich has successfully booted on this version, shut the system down and try the `v2.x.x` upgrade again.
|
In order to update to Immich to `v1.137.0` (or above), the application must be started at least once on a version in the range between `1.132.0` and `1.136.0`. Doing so will complete database schema upgrades that are required for `v1.137.0` (and above). After Immich has successfully updated to a version in this range, you can now attempt to update to v1.137.0 (or above). We recommend users upgrade to `1.132.0` since it does not have any other breaking changes.
|
||||||
|
|
||||||
|
## Inconsistent Media Location
|
||||||
|
|
||||||
|
:::caution
|
||||||
|
This error is related to the location of media files _inside the container_. Never move files on the host system when you run into this error message.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Immich automatically tries to detect where your Immich data is located. On start up, it compares the detected media location with the file paths in the database and throws an Inconsistent Media Location error when they do not match.
|
||||||
|
|
||||||
|
To fix this issue, verify that the `IMMICH_MEDIA_LOCATION` environment variable and `UPLOAD_LOCATION` volume mount are in sync with the database paths.
|
||||||
|
|
||||||
|
If you would like to migrate from one media location to another, simply successfully start Immich on `v1.136.0` or later, then do the following steps:
|
||||||
|
|
||||||
|
1. Stop Immich
|
||||||
|
2. Update `IMMICH_MEDIA_LOCATION` to the new location
|
||||||
|
3. Update the right-hand side of the `UPLOAD_LOCATION` volume mount to the new location
|
||||||
|
4. Start up Immich
|
||||||
|
|
||||||
|
After version `1.136.0`, Immich can detect when a media location has moved and will automatically update the database paths to keep them in sync.
|
||||||
|
|||||||
24
docs/static/archived-versions.json
vendored
@@ -1,4 +1,28 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"label": "v1.138.1",
|
||||||
|
"url": "https://v1.138.1.archive.immich.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.138.0",
|
||||||
|
"url": "https://v1.138.0.archive.immich.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.137.3",
|
||||||
|
"url": "https://v1.137.3.archive.immich.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.137.2",
|
||||||
|
"url": "https://v1.137.2.archive.immich.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.137.1",
|
||||||
|
"url": "https://v1.137.1.archive.immich.app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "v1.137.0",
|
||||||
|
"url": "https://v1.137.0.archive.immich.app"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "v1.136.0",
|
"label": "v1.136.0",
|
||||||
"url": "https://v1.136.0.archive.immich.app"
|
"url": "https://v1.136.0.archive.immich.app"
|
||||||
|
|||||||
1
e2e/.gitignore
vendored
@@ -3,3 +3,4 @@ node_modules/
|
|||||||
/playwright-report/
|
/playwright-report/
|
||||||
/blob-report/
|
/blob-report/
|
||||||
/playwright/.cache/
|
/playwright/.cache/
|
||||||
|
/dist
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
22.17.1
|
22.18.0
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
image: redis:6.2-alpine@sha256:7fe72c486b910f6b1a9769c937dad5d63648ddee82e056f47417542dd40825bb
|
image: redis:6.2-alpine@sha256:7fe72c486b910f6b1a9769c937dad5d63648ddee82e056f47417542dd40825bb
|
||||||
|
|
||||||
database:
|
database:
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:3aef84a0a4fabbda17ef115c3019ba0c914ec73e9f6e59203674322d858b8eea
|
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:0e763a2383d56f90364fcd72767ac41400cd30d2627f407f7e7960c9f1923c21
|
||||||
command: -c fsync=off -c shared_preload_libraries=vchord.so -c config_file=/var/lib/postgresql/data/postgresql.conf
|
command: -c fsync=off -c shared_preload_libraries=vchord.so -c config_file=/var/lib/postgresql/data/postgresql.conf
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
|
|||||||
7450
e2e/package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "immich-e2e",
|
"name": "immich-e2e",
|
||||||
"version": "1.136.0",
|
"version": "1.138.1",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -26,16 +26,16 @@
|
|||||||
"@playwright/test": "^1.44.1",
|
"@playwright/test": "^1.44.1",
|
||||||
"@socket.io/component-emitter": "^3.1.2",
|
"@socket.io/component-emitter": "^3.1.2",
|
||||||
"@types/luxon": "^3.4.2",
|
"@types/luxon": "^3.4.2",
|
||||||
"@types/node": "^22.16.4",
|
"@types/node": "^22.17.1",
|
||||||
"@types/oidc-provider": "^9.0.0",
|
"@types/oidc-provider": "^9.0.0",
|
||||||
"@types/pg": "^8.15.1",
|
"@types/pg": "^8.15.1",
|
||||||
"@types/pngjs": "^6.0.4",
|
"@types/pngjs": "^6.0.4",
|
||||||
"@types/supertest": "^6.0.2",
|
"@types/supertest": "^6.0.2",
|
||||||
"@vitest/coverage-v8": "^3.0.0",
|
"@vitest/coverage-v8": "^3.0.0",
|
||||||
"eslint": "^9.14.0",
|
"eslint": "^9.14.0",
|
||||||
"eslint-config-prettier": "^10.0.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-unicorn": "^59.0.0",
|
"eslint-plugin-unicorn": "^60.0.0",
|
||||||
"exiftool-vendored": "^28.3.1",
|
"exiftool-vendored": "^28.3.1",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.0.0",
|
||||||
"jose": "^5.6.3",
|
"jose": "^5.6.3",
|
||||||
@@ -54,6 +54,6 @@
|
|||||||
"vitest": "^3.0.0"
|
"vitest": "^3.0.0"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.17.1"
|
"node": "22.18.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ describe('/albums', () => {
|
|||||||
.send({ ids: [asset.id] });
|
.send({ ids: [asset.id] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest('Not found or no album.addAsset access'));
|
expect(body).toEqual(errorDto.badRequest('Not found or no albumAsset.create access'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should add duplicate assets only once', async () => {
|
it('should add duplicate assets only once', async () => {
|
||||||
@@ -599,7 +599,7 @@ describe('/albums', () => {
|
|||||||
.send({ ids: [user1Asset1.id] });
|
.send({ ids: [user1Asset1.id] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest('Not found or no album.removeAsset access'));
|
expect(body).toEqual(errorDto.badRequest('Not found or no albumAsset.delete access'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should remove duplicate assets only once', async () => {
|
it('should remove duplicate assets only once', async () => {
|
||||||
@@ -683,7 +683,7 @@ describe('/albums', () => {
|
|||||||
.set('Authorization', `Bearer ${user1.accessToken}`)
|
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||||
.send({ role: AlbumUserRole.Editor });
|
.send({ role: AlbumUserRole.Editor });
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
|
|
||||||
// Get album to verify the role change
|
// Get album to verify the role change
|
||||||
const { body } = await request(app)
|
const { body } = await request(app)
|
||||||
|
|||||||
@@ -555,7 +555,7 @@ describe('/asset', () => {
|
|||||||
expect(body).toMatchObject({ id: user1Assets[0].id, livePhotoVideoId: null });
|
expect(body).toMatchObject({ id: user1Assets[0].id, livePhotoVideoId: null });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should update date time original when sidecar file contains DateTimeOriginal', async () => {
|
it.skip('should update date time original when sidecar file contains DateTimeOriginal', async () => {
|
||||||
const sidecarData = `<?xpacket begin='?' id='W5M0MpCehiHzreSzNTczkc9d'?>
|
const sidecarData = `<?xpacket begin='?' id='W5M0MpCehiHzreSzNTczkc9d'?>
|
||||||
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 12.40'>
|
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 12.40'>
|
||||||
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
|
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
|
||||||
@@ -854,6 +854,30 @@ describe('/asset', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('PUT /assets', () => {
|
||||||
|
it('should update date time original relatively', async () => {
|
||||||
|
const { status, body } = await request(app)
|
||||||
|
.put(`/assets/`)
|
||||||
|
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||||
|
.send({ ids: [user1Assets[0].id], dateTimeRelative: -1441 });
|
||||||
|
|
||||||
|
expect(body).toEqual({});
|
||||||
|
expect(status).toEqual(204);
|
||||||
|
|
||||||
|
const result = await request(app)
|
||||||
|
.get(`/assets/${user1Assets[0].id}`)
|
||||||
|
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||||
|
.send();
|
||||||
|
|
||||||
|
expect(result.body).toMatchObject({
|
||||||
|
id: user1Assets[0].id,
|
||||||
|
exifInfo: expect.objectContaining({
|
||||||
|
dateTimeOriginal: '2023-11-19T01:10:00+00:00',
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('POST /assets', () => {
|
describe('POST /assets', () => {
|
||||||
beforeAll(setupTests, 30_000);
|
beforeAll(setupTests, 30_000);
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ describe('/partners', () => {
|
|||||||
.delete(`/partners/${user3.userId}`)
|
.delete(`/partners/${user3.userId}`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw a bad request if partner not found', async () => {
|
it('should throw a bad request if partner not found', async () => {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
import { createUserDto, uuidDto } from 'src/fixtures';
|
import { createUserDto, uuidDto } from 'src/fixtures';
|
||||||
import { errorDto } from 'src/responses';
|
import { errorDto } from 'src/responses';
|
||||||
import { app, asBearerAuth, shareUrl, utils } from 'src/utils';
|
import { app, asBearerAuth, baseUrl, shareUrl, utils } from 'src/utils';
|
||||||
import request from 'supertest';
|
import request from 'supertest';
|
||||||
import { beforeAll, describe, expect, it } from 'vitest';
|
import { beforeAll, describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
@@ -78,6 +78,7 @@ describe('/shared-links', () => {
|
|||||||
type: SharedLinkType.Album,
|
type: SharedLinkType.Album,
|
||||||
albumId: metadataAlbum.id,
|
albumId: metadataAlbum.id,
|
||||||
showMetadata: true,
|
showMetadata: true,
|
||||||
|
slug: 'metadata-album',
|
||||||
}),
|
}),
|
||||||
utils.createSharedLink(user1.accessToken, {
|
utils.createSharedLink(user1.accessToken, {
|
||||||
type: SharedLinkType.Album,
|
type: SharedLinkType.Album,
|
||||||
@@ -138,6 +139,17 @@ describe('/shared-links', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('GET /s/:slug', () => {
|
||||||
|
it('should work for slug auth', async () => {
|
||||||
|
const resp = await request(baseUrl).get(`/s/${linkWithMetadata.slug}`);
|
||||||
|
expect(resp.status).toBe(200);
|
||||||
|
expect(resp.header['content-type']).toContain('text/html');
|
||||||
|
expect(resp.text).toContain(
|
||||||
|
`<meta name="description" content="${metadataAlbum.assets.length} shared photos & videos" />`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('GET /shared-links', () => {
|
describe('GET /shared-links', () => {
|
||||||
it('should require authentication', async () => {
|
it('should require authentication', async () => {
|
||||||
const { status, body } = await request(app).get('/shared-links');
|
const { status, body } = await request(app).get('/shared-links');
|
||||||
@@ -473,7 +485,7 @@ describe('/shared-links', () => {
|
|||||||
.delete(`/shared-links/${linkWithAlbum.id}`)
|
.delete(`/shared-links/${linkWithAlbum.id}`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ describe('/users', () => {
|
|||||||
const { status } = await request(app)
|
const { status } = await request(app)
|
||||||
.delete(`/users/me/license`)
|
.delete(`/users/me/license`)
|
||||||
.set('Authorization', `Bearer ${nonAdmin.accessToken}`);
|
.set('Authorization', `Bearer ${nonAdmin.accessToken}`);
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(204);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ export const tempDir = tmpdir();
|
|||||||
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
|
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
|
||||||
export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
|
export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
|
||||||
export const immichCli = (args: string[]) =>
|
export const immichCli = (args: string[]) =>
|
||||||
executeCommand('node', ['node_modules/.bin/immich', '-d', `/${tempDir}/immich/`, ...args]).promise;
|
executeCommand('pnpm', ['exec', 'immich', '-d', `/${tempDir}/immich/`, ...args], { cwd: '../cli' }).promise;
|
||||||
export const immichAdmin = (args: string[]) =>
|
export const immichAdmin = (args: string[]) =>
|
||||||
executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]);
|
executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]);
|
||||||
export const specialCharStrings = ["'", '"', ',', '{', '}', '*'];
|
export const specialCharStrings = ["'", '"', ',', '{', '}', '*'];
|
||||||
@@ -186,18 +186,6 @@ export const utils = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
resetFilesystem: async () => {
|
|
||||||
const mediaInternal = '/usr/src/app/upload';
|
|
||||||
const dirs = [
|
|
||||||
`"${mediaInternal}/thumbs"`,
|
|
||||||
`"${mediaInternal}/upload"`,
|
|
||||||
`"${mediaInternal}/library"`,
|
|
||||||
`"${mediaInternal}/encoded-video"`,
|
|
||||||
].join(' ');
|
|
||||||
|
|
||||||
await execPromise(`docker exec -i "immich-e2e-server" /bin/bash -c "rm -rf ${dirs} && mkdir ${dirs}"`);
|
|
||||||
},
|
|
||||||
|
|
||||||
unzip: async (input: string, output: string) => {
|
unzip: async (input: string, output: string) => {
|
||||||
await execPromise(`unzip -o -d "${output}" "${input}"`);
|
await execPromise(`unzip -o -d "${output}" "${input}"`);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ test.describe('Registration', () => {
|
|||||||
await page.getByRole('button', { name: 'Server Privacy' }).click();
|
await page.getByRole('button', { name: 'Server Privacy' }).click();
|
||||||
await page.getByRole('button', { name: 'User Privacy' }).click();
|
await page.getByRole('button', { name: 'User Privacy' }).click();
|
||||||
await page.getByRole('button', { name: 'Storage Template' }).click();
|
await page.getByRole('button', { name: 'Storage Template' }).click();
|
||||||
|
await page.getByRole('button', { name: 'Backups' }).click();
|
||||||
await page.getByRole('button', { name: 'Done' }).click();
|
await page.getByRole('button', { name: 'Done' }).click();
|
||||||
|
|
||||||
// success
|
// success
|
||||||
|
|||||||
26
i18n/ar.json
@@ -393,6 +393,7 @@
|
|||||||
"album_cover_updated": "تم تحديث غلاف الألبوم",
|
"album_cover_updated": "تم تحديث غلاف الألبوم",
|
||||||
"album_delete_confirmation": "هل أنت متأكد أنك تريد حذف الألبوم {album}؟",
|
"album_delete_confirmation": "هل أنت متأكد أنك تريد حذف الألبوم {album}؟",
|
||||||
"album_delete_confirmation_description": "إذا تمت مشاركة هذا الألبوم، فلن يتمكن المستخدمون الآخرون من الوصول إليه بعد الآن.",
|
"album_delete_confirmation_description": "إذا تمت مشاركة هذا الألبوم، فلن يتمكن المستخدمون الآخرون من الوصول إليه بعد الآن.",
|
||||||
|
"album_deleted": "تم حذف الالبوم",
|
||||||
"album_info_card_backup_album_excluded": "مستبعد",
|
"album_info_card_backup_album_excluded": "مستبعد",
|
||||||
"album_info_card_backup_album_included": "متضمنة",
|
"album_info_card_backup_album_included": "متضمنة",
|
||||||
"album_info_updated": "تم تحديث معلومات الألبوم",
|
"album_info_updated": "تم تحديث معلومات الألبوم",
|
||||||
@@ -402,6 +403,7 @@
|
|||||||
"album_options": "إعدادات الألبوم",
|
"album_options": "إعدادات الألبوم",
|
||||||
"album_remove_user": "هل ترغب في إزالة المستخدم؟",
|
"album_remove_user": "هل ترغب في إزالة المستخدم؟",
|
||||||
"album_remove_user_confirmation": "هل أنت متأكد أنك تريد إزالة {user}؟",
|
"album_remove_user_confirmation": "هل أنت متأكد أنك تريد إزالة {user}؟",
|
||||||
|
"album_search_not_found": "لم يتم ايجاد البوم مطابق لبحثك",
|
||||||
"album_share_no_users": "يبدو أنك قمت بمشاركة هذا الألبوم مع جميع المستخدمين أو ليس لديك أي مستخدم للمشاركة معه.",
|
"album_share_no_users": "يبدو أنك قمت بمشاركة هذا الألبوم مع جميع المستخدمين أو ليس لديك أي مستخدم للمشاركة معه.",
|
||||||
"album_updated": "تم تحديث الألبوم",
|
"album_updated": "تم تحديث الألبوم",
|
||||||
"album_updated_setting_description": "تلقي إشعارًا عبر البريد الإلكتروني عندما يحتوي الألبوم المشترك على محتويات جديدة",
|
"album_updated_setting_description": "تلقي إشعارًا عبر البريد الإلكتروني عندما يحتوي الألبوم المشترك على محتويات جديدة",
|
||||||
@@ -421,6 +423,7 @@
|
|||||||
"albums_default_sort_order": "ترتيب الألبوم الافتراضي",
|
"albums_default_sort_order": "ترتيب الألبوم الافتراضي",
|
||||||
"albums_default_sort_order_description": "ترتيب فرز الأصول الأولي عند إنشاء ألبومات جديدة.",
|
"albums_default_sort_order_description": "ترتيب فرز الأصول الأولي عند إنشاء ألبومات جديدة.",
|
||||||
"albums_feature_description": "مجموعة من الأصول التي يمكن مشاركتها مع مستخدمين آخرين.",
|
"albums_feature_description": "مجموعة من الأصول التي يمكن مشاركتها مع مستخدمين آخرين.",
|
||||||
|
"albums_on_device_count": "عدد الالبومات على الجهاز ({count})",
|
||||||
"all": "الكل",
|
"all": "الكل",
|
||||||
"all_albums": "جميع الألبومات",
|
"all_albums": "جميع الألبومات",
|
||||||
"all_people": "جميع الأشخاص",
|
"all_people": "جميع الأشخاص",
|
||||||
@@ -435,7 +438,7 @@
|
|||||||
"api_key_description": "سيتم عرض هذه القيمة مرة واحدة فقط. يرجى التأكد من نسخها قبل إغلاق النافذة.",
|
"api_key_description": "سيتم عرض هذه القيمة مرة واحدة فقط. يرجى التأكد من نسخها قبل إغلاق النافذة.",
|
||||||
"api_key_empty": "يجب ألا يكون اسم مفتاح API فارغًا",
|
"api_key_empty": "يجب ألا يكون اسم مفتاح API فارغًا",
|
||||||
"api_keys": "مفاتيح API",
|
"api_keys": "مفاتيح API",
|
||||||
"app_bar_signout_dialog_content": "هل أنت متأكد أنك تريد الخروج",
|
"app_bar_signout_dialog_content": "هل أنت متأكد أنك تريد تسجيل الخروج؟",
|
||||||
"app_bar_signout_dialog_ok": "نعم",
|
"app_bar_signout_dialog_ok": "نعم",
|
||||||
"app_bar_signout_dialog_title": "خروج",
|
"app_bar_signout_dialog_title": "خروج",
|
||||||
"app_settings": "إعدادات التطبيق",
|
"app_settings": "إعدادات التطبيق",
|
||||||
@@ -504,6 +507,7 @@
|
|||||||
"back_close_deselect": "الرجوع أو الإغلاق أو إلغاء التحديد",
|
"back_close_deselect": "الرجوع أو الإغلاق أو إلغاء التحديد",
|
||||||
"background_location_permission": "اذن الوصول للموقع في الخلفية",
|
"background_location_permission": "اذن الوصول للموقع في الخلفية",
|
||||||
"background_location_permission_content": "للتمكن من تبديل الشبكه بالخلفية، Immich يحتاج*دائما* للحصول على موقع دقيق ليتمكن التطبيق من قرائة اسم شبكة الWi-Fi",
|
"background_location_permission_content": "للتمكن من تبديل الشبكه بالخلفية، Immich يحتاج*دائما* للحصول على موقع دقيق ليتمكن التطبيق من قرائة اسم شبكة الWi-Fi",
|
||||||
|
"backup": "دعم",
|
||||||
"backup_album_selection_page_albums_device": "الالبومات على الجهاز ({count})",
|
"backup_album_selection_page_albums_device": "الالبومات على الجهاز ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "انقر للتضمين، وانقر نقرًا مزدوجًا للاستثناء",
|
"backup_album_selection_page_albums_tap": "انقر للتضمين، وانقر نقرًا مزدوجًا للاستثناء",
|
||||||
"backup_album_selection_page_assets_scatter": "يمكن أن تنتشر الأصول عبر ألبومات متعددة. وبالتالي، يمكن تضمين الألبومات أو استبعادها أثناء عملية النسخ الاحتياطي.",
|
"backup_album_selection_page_assets_scatter": "يمكن أن تنتشر الأصول عبر ألبومات متعددة. وبالتالي، يمكن تضمين الألبومات أو استبعادها أثناء عملية النسخ الاحتياطي.",
|
||||||
@@ -567,6 +571,8 @@
|
|||||||
"backup_options_page_title": "خيارات النسخ الاحتياطي",
|
"backup_options_page_title": "خيارات النسخ الاحتياطي",
|
||||||
"backup_setting_subtitle": "ادارة اعدادات التحميل في الخلفية والمقدمة",
|
"backup_setting_subtitle": "ادارة اعدادات التحميل في الخلفية والمقدمة",
|
||||||
"backward": "الى الوراء",
|
"backward": "الى الوراء",
|
||||||
|
"beta_sync": "حالة المزامنة التجريبية",
|
||||||
|
"beta_sync_subtitle": "ادارة نظام المزامنة الجديد",
|
||||||
"biometric_auth_enabled": "المصادقة البايومترية مفعله",
|
"biometric_auth_enabled": "المصادقة البايومترية مفعله",
|
||||||
"biometric_locked_out": "لقد قفلت عنك المصادقة البيومترية",
|
"biometric_locked_out": "لقد قفلت عنك المصادقة البيومترية",
|
||||||
"biometric_no_options": "لا توجد خيارات بايومترية متوفرة",
|
"biometric_no_options": "لا توجد خيارات بايومترية متوفرة",
|
||||||
@@ -584,7 +590,7 @@
|
|||||||
"cache_settings_clear_cache_button": "مسح ذاكرة التخزين المؤقت",
|
"cache_settings_clear_cache_button": "مسح ذاكرة التخزين المؤقت",
|
||||||
"cache_settings_clear_cache_button_title": "يقوم بمسح ذاكرة التخزين المؤقت للتطبيق.سيؤثر هذا بشكل كبير على أداء التطبيق حتى إعادة بناء ذاكرة التخزين المؤقت.",
|
"cache_settings_clear_cache_button_title": "يقوم بمسح ذاكرة التخزين المؤقت للتطبيق.سيؤثر هذا بشكل كبير على أداء التطبيق حتى إعادة بناء ذاكرة التخزين المؤقت.",
|
||||||
"cache_settings_duplicated_assets_clear_button": "واضح",
|
"cache_settings_duplicated_assets_clear_button": "واضح",
|
||||||
"cache_settings_duplicated_assets_subtitle": "الصور ومقاطع الفيديو اللتي تم تجاهلها المدرجة في التطبيق",
|
"cache_settings_duplicated_assets_subtitle": "الصور والفيديوهات اللتي تم تجاهلها في التطبيق",
|
||||||
"cache_settings_duplicated_assets_title": "الاصول المكررة ({count})",
|
"cache_settings_duplicated_assets_title": "الاصول المكررة ({count})",
|
||||||
"cache_settings_statistics_album": "مكتبه الصور المصغره",
|
"cache_settings_statistics_album": "مكتبه الصور المصغره",
|
||||||
"cache_settings_statistics_full": "صور كاملة",
|
"cache_settings_statistics_full": "صور كاملة",
|
||||||
@@ -601,6 +607,7 @@
|
|||||||
"cancel": "إلغاء",
|
"cancel": "إلغاء",
|
||||||
"cancel_search": "الغاء البحث",
|
"cancel_search": "الغاء البحث",
|
||||||
"canceled": "تم الالغاء",
|
"canceled": "تم الالغاء",
|
||||||
|
"canceling": "جارِ الالغاء",
|
||||||
"cannot_merge_people": "لا يمكن دمج الأشخاص",
|
"cannot_merge_people": "لا يمكن دمج الأشخاص",
|
||||||
"cannot_undo_this_action": "لا يمكنك التراجع عن هذا الإجراء!",
|
"cannot_undo_this_action": "لا يمكنك التراجع عن هذا الإجراء!",
|
||||||
"cannot_update_the_description": "لا يمكن تحديث الوصف",
|
"cannot_update_the_description": "لا يمكن تحديث الوصف",
|
||||||
@@ -616,7 +623,7 @@
|
|||||||
"change_password": "تغيير كلمة المرور",
|
"change_password": "تغيير كلمة المرور",
|
||||||
"change_password_description": "هذه إما هي المرة الأولى التي تقوم فيها بتسجيل الدخول إلى النظام أو أنه تم تقديم طلب لتغيير كلمة المرور الخاصة بك. الرجاء إدخال كلمة المرور الجديدة أدناه.",
|
"change_password_description": "هذه إما هي المرة الأولى التي تقوم فيها بتسجيل الدخول إلى النظام أو أنه تم تقديم طلب لتغيير كلمة المرور الخاصة بك. الرجاء إدخال كلمة المرور الجديدة أدناه.",
|
||||||
"change_password_form_confirm_password": "تأكيد كلمة المرور",
|
"change_password_form_confirm_password": "تأكيد كلمة المرور",
|
||||||
"change_password_form_description": "مرحبًا ،هذه هي المرة الأولى التي تقوم فيها بالتسجيل في النظام أو تم تقديم طلب لتغيير كلمة المرور الخاصة بك.الرجاء إدخال كلمة المرور الجديدة أدناه",
|
"change_password_form_description": "مرحبًا {name}،\n\nاما ان تكون هذه هي المرة الأولى التي تقوم فيها بالتسجيل في النظام أو تم تقديم طلب لتغيير كلمة المرور الخاصة بك. الرجاء إدخال كلمة المرور الجديدة أدناه.",
|
||||||
"change_password_form_new_password": "كلمة المرور الجديدة",
|
"change_password_form_new_password": "كلمة المرور الجديدة",
|
||||||
"change_password_form_password_mismatch": "كلمة المرور غير مطابقة",
|
"change_password_form_password_mismatch": "كلمة المرور غير مطابقة",
|
||||||
"change_password_form_reenter_new_password": "أعد إدخال كلمة مرور جديدة",
|
"change_password_form_reenter_new_password": "أعد إدخال كلمة مرور جديدة",
|
||||||
@@ -733,7 +740,8 @@
|
|||||||
"default_locale": "اللغة الافتراضية",
|
"default_locale": "اللغة الافتراضية",
|
||||||
"default_locale_description": "تنسيق التواريخ والأرقام بناءً على لغة المتصفح الخاص بك",
|
"default_locale_description": "تنسيق التواريخ والأرقام بناءً على لغة المتصفح الخاص بك",
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
"delete_action_prompt": "{count} حذف بشكل نهائي",
|
"delete_action_confirmation_message": "هل انت متأكد من حذف هذا الملف؟ هذا سؤدي الى نقل الملف الى سلة مهملات الخادم وسيتم اشعارك ان كنت تريد حذفه على الجهاز",
|
||||||
|
"delete_action_prompt": "تم حذف {count}",
|
||||||
"delete_album": "حذف الألبوم",
|
"delete_album": "حذف الألبوم",
|
||||||
"delete_api_key_prompt": "هل أنت متأكد أنك تريد حذف مفتاح API هذا؟",
|
"delete_api_key_prompt": "هل أنت متأكد أنك تريد حذف مفتاح API هذا؟",
|
||||||
"delete_dialog_alert": "هذه العناصر سيتم حذفها بشكل دائم من Immich و من جهازك",
|
"delete_dialog_alert": "هذه العناصر سيتم حذفها بشكل دائم من Immich و من جهازك",
|
||||||
@@ -747,9 +755,12 @@
|
|||||||
"delete_key": "حذف المفتاح",
|
"delete_key": "حذف المفتاح",
|
||||||
"delete_library": "حذف المكتبة",
|
"delete_library": "حذف المكتبة",
|
||||||
"delete_link": "حذف الرابط",
|
"delete_link": "حذف الرابط",
|
||||||
|
"delete_local_action_prompt": "تم حذف {count} من الجهاز",
|
||||||
"delete_local_dialog_ok_backed_up_only": "حذف النسخة الاحتياطية فقط",
|
"delete_local_dialog_ok_backed_up_only": "حذف النسخة الاحتياطية فقط",
|
||||||
"delete_local_dialog_ok_force": "احذف على أي حال",
|
"delete_local_dialog_ok_force": "احذف على أي حال",
|
||||||
"delete_others": "حذف الأخرى",
|
"delete_others": "حذف الأخرى",
|
||||||
|
"delete_permanently": "حذف بشكل نهائي",
|
||||||
|
"delete_permanently_action_prompt": "تم حذف {count} بشكل نهائي",
|
||||||
"delete_shared_link": "حذف الرابط المشترك",
|
"delete_shared_link": "حذف الرابط المشترك",
|
||||||
"delete_shared_link_dialog_title": "حذف الرابط المشترك",
|
"delete_shared_link_dialog_title": "حذف الرابط المشترك",
|
||||||
"delete_tag": "حذف العلامة",
|
"delete_tag": "حذف العلامة",
|
||||||
@@ -760,6 +771,7 @@
|
|||||||
"description": "وصف",
|
"description": "وصف",
|
||||||
"description_input_hint_text": "اضف وصفا...",
|
"description_input_hint_text": "اضف وصفا...",
|
||||||
"description_input_submit_error": "خطأ تحديث الوصف ، تحقق من السجل لمزيد من التفاصيل",
|
"description_input_submit_error": "خطأ تحديث الوصف ، تحقق من السجل لمزيد من التفاصيل",
|
||||||
|
"deselect_all": "الغاء تحديد الكل",
|
||||||
"details": "تفاصيل",
|
"details": "تفاصيل",
|
||||||
"direction": "الإتجاه",
|
"direction": "الإتجاه",
|
||||||
"disabled": "معطل",
|
"disabled": "معطل",
|
||||||
@@ -777,6 +789,7 @@
|
|||||||
"documentation": "الوثائق",
|
"documentation": "الوثائق",
|
||||||
"done": "تم",
|
"done": "تم",
|
||||||
"download": "تنزيل",
|
"download": "تنزيل",
|
||||||
|
"download_action_prompt": "يتم تنزيل {count} ملف",
|
||||||
"download_canceled": "الغي التنزيل",
|
"download_canceled": "الغي التنزيل",
|
||||||
"download_complete": "اكتمل التنزيل",
|
"download_complete": "اكتمل التنزيل",
|
||||||
"download_enqueue": "تنزيل في قائمة الانتظار",
|
"download_enqueue": "تنزيل في قائمة الانتظار",
|
||||||
@@ -833,6 +846,7 @@
|
|||||||
"empty_trash": "أفرغ سلة المهملات",
|
"empty_trash": "أفرغ سلة المهملات",
|
||||||
"empty_trash_confirmation": "هل أنت متأكد أنك تريد إفراغ سلة المهملات؟ سيؤدي هذا إلى إزالة جميع المحتويات الموجودة في سلة المهملات بشكل نهائي من Immich.\nلا يمكنك التراجع عن هذا الإجراء!",
|
"empty_trash_confirmation": "هل أنت متأكد أنك تريد إفراغ سلة المهملات؟ سيؤدي هذا إلى إزالة جميع المحتويات الموجودة في سلة المهملات بشكل نهائي من Immich.\nلا يمكنك التراجع عن هذا الإجراء!",
|
||||||
"enable": "تفعيل",
|
"enable": "تفعيل",
|
||||||
|
"enable_backup": "تشغيل النسخ الاحتياطي",
|
||||||
"enable_biometric_auth_description": "أدخل رمز PIN الخاص بك لتمكين المصادقة البيومترية",
|
"enable_biometric_auth_description": "أدخل رمز PIN الخاص بك لتمكين المصادقة البيومترية",
|
||||||
"enabled": "مفعل",
|
"enabled": "مفعل",
|
||||||
"end_date": "تاريخ الإنتهاء",
|
"end_date": "تاريخ الإنتهاء",
|
||||||
@@ -989,6 +1003,8 @@
|
|||||||
"explorer": "المستكشف",
|
"explorer": "المستكشف",
|
||||||
"export": "تصدير",
|
"export": "تصدير",
|
||||||
"export_as_json": "تصدير كـ JSON",
|
"export_as_json": "تصدير كـ JSON",
|
||||||
|
"export_database": "تصدير قاعدة البيانات",
|
||||||
|
"export_database_description": "تصدير قاعدة البيانات من نوع SQLite",
|
||||||
"extension": "الإمتداد",
|
"extension": "الإمتداد",
|
||||||
"external": "خارجي",
|
"external": "خارجي",
|
||||||
"external_libraries": "المكتبات الخارجية",
|
"external_libraries": "المكتبات الخارجية",
|
||||||
@@ -1147,7 +1163,6 @@
|
|||||||
"light": "المضيئ",
|
"light": "المضيئ",
|
||||||
"like_deleted": "تم حذف الإعجاب",
|
"like_deleted": "تم حذف الإعجاب",
|
||||||
"link_motion_video": "رابط فيديو الحركة",
|
"link_motion_video": "رابط فيديو الحركة",
|
||||||
"link_options": "خيارات الرابط",
|
|
||||||
"link_to_oauth": "الربط مع OAuth",
|
"link_to_oauth": "الربط مع OAuth",
|
||||||
"linked_oauth_account": "حساب مرتبط بـ OAuth",
|
"linked_oauth_account": "حساب مرتبط بـ OAuth",
|
||||||
"list": "قائمة",
|
"list": "قائمة",
|
||||||
@@ -1210,7 +1225,6 @@
|
|||||||
"manage_your_devices": "إدارة الأجهزة التي تم تسجيل الدخول إليها",
|
"manage_your_devices": "إدارة الأجهزة التي تم تسجيل الدخول إليها",
|
||||||
"manage_your_oauth_connection": "إدارة اتصال OAuth الخاص بك",
|
"manage_your_oauth_connection": "إدارة اتصال OAuth الخاص بك",
|
||||||
"map": "الخريطة",
|
"map": "الخريطة",
|
||||||
"map_assets_in_bound": "{count} صوره",
|
|
||||||
"map_assets_in_bounds": "{count} صور",
|
"map_assets_in_bounds": "{count} صور",
|
||||||
"map_cannot_get_user_location": "لا يمكن الحصول على موقع المستخدم",
|
"map_cannot_get_user_location": "لا يمكن الحصول على موقع المستخدم",
|
||||||
"map_location_dialog_yes": "نعم",
|
"map_location_dialog_yes": "نعم",
|
||||||
|
|||||||
91
i18n/be.json
@@ -6,7 +6,7 @@
|
|||||||
"action": "Дзеянне",
|
"action": "Дзеянне",
|
||||||
"action_common_update": "Абнавіць",
|
"action_common_update": "Абнавіць",
|
||||||
"actions": "Дзеянні",
|
"actions": "Дзеянні",
|
||||||
"active": "Актыўны",
|
"active": "Актыўных",
|
||||||
"activity": "Актыўнасць",
|
"activity": "Актыўнасць",
|
||||||
"activity_changed": "Актыўнасць {enabled, select, true {уключана} other {адключана}}",
|
"activity_changed": "Актыўнасць {enabled, select, true {уключана} other {адключана}}",
|
||||||
"add": "Дадаць",
|
"add": "Дадаць",
|
||||||
@@ -74,8 +74,11 @@
|
|||||||
"image_fullsize_enabled_description": "Ствараць выяву ў поўным памеры для фарматаў, што не прыдатныя для вэб. Калі ўключана опцыя \"Аддаваць перавагу ўбудаванай праяве\", прагляды выкарыстоўваюцца непасрэдна без канвертацыі. Не ўплывае на вэб-прыдатныя фарматы, такія як JPEG.",
|
"image_fullsize_enabled_description": "Ствараць выяву ў поўным памеры для фарматаў, што не прыдатныя для вэб. Калі ўключана опцыя \"Аддаваць перавагу ўбудаванай праяве\", прагляды выкарыстоўваюцца непасрэдна без канвертацыі. Не ўплывае на вэб-прыдатныя фарматы, такія як JPEG.",
|
||||||
"image_fullsize_quality_description": "Якасць выявы ў поўным памеры ад 1 да 100. Больш высокае значэнне лепшае, але прыводзіць да павелічэння памеру файла.",
|
"image_fullsize_quality_description": "Якасць выявы ў поўным памеры ад 1 да 100. Больш высокае значэнне лепшае, але прыводзіць да павелічэння памеру файла.",
|
||||||
"image_fullsize_title": "Налады выявы ў поўным памеры",
|
"image_fullsize_title": "Налады выявы ў поўным памеры",
|
||||||
|
"image_prefer_embedded_preview": "Аддаваць перавагу ўбудаванай праяве",
|
||||||
"image_prefer_embedded_preview_setting_description": "Выкарыстоўваць убудаваныя праявы ў RAW-фотаздымках ў якасці ўваходных дадзеных для апрацоўкі малюнкаў, калі магчыма. Гэта дазваляе атрымаць больш дакладныя колеры для некаторых відарысаў, але ж якасць праяў залежыць ад камеры, і на відарысе можа быць больш артэфактаў сціску.",
|
"image_prefer_embedded_preview_setting_description": "Выкарыстоўваць убудаваныя праявы ў RAW-фотаздымках ў якасці ўваходных дадзеных для апрацоўкі малюнкаў, калі магчыма. Гэта дазваляе атрымаць больш дакладныя колеры для некаторых відарысаў, але ж якасць праяў залежыць ад камеры, і на відарысе можа быць больш артэфактаў сціску.",
|
||||||
"image_prefer_wide_gamut": "Аддаць перавагу шырокай гаме",
|
"image_prefer_wide_gamut": "Аддаць перавагу шырокай гаме",
|
||||||
|
"image_preview_description": "Відарыс сярэдняга памеру з выдаленымі метададзенымі, выкарыстоўваецца пры праглядзе асобнага рэсурсу і для машыннага навучання",
|
||||||
|
"image_preview_quality_description": "Якасць праявы ад 1 да 100. Чым вышэй, тым лепш, але пры гэтым ствараюцца файлы большага памеру і можа знізіцца хуткасць водгуку прыкладання. Ўстаноўка нізкага значэння можа паўплываць на якасць машыннага навучання.",
|
||||||
"image_preview_title": "Налады папярэдняга прагляду",
|
"image_preview_title": "Налады папярэдняга прагляду",
|
||||||
"image_quality": "Якасць",
|
"image_quality": "Якасць",
|
||||||
"image_resolution": "Раздзяляльнасць",
|
"image_resolution": "Раздзяляльнасць",
|
||||||
@@ -93,33 +96,119 @@
|
|||||||
"metadata_settings": "Налады метаданых",
|
"metadata_settings": "Налады метаданых",
|
||||||
"oauth_button_text": "Тэкст кнопкі",
|
"oauth_button_text": "Тэкст кнопкі",
|
||||||
"oauth_settings": "OAuth",
|
"oauth_settings": "OAuth",
|
||||||
|
"refreshing_all_libraries": "Абнаўленне ўсіх бібліятэк",
|
||||||
|
"registration": "Рэгістрацыя адміністратара",
|
||||||
|
"registration_description": "Вы з'яўляецеся першым карыстальнікам сістэмы, таму вы будзеце прызначаны адміністратарам. Вы будзеце адказваць за адміністрацыйныя задачы, а таксама ствараць новых карыстальнікаў.",
|
||||||
|
"require_password_change_on_login": "Патрабаваць змяніць пароль пры першым уваходзе ў сістэму",
|
||||||
|
"reset_settings_to_default": "Скінуць налады да прадвызначаных",
|
||||||
|
"reset_settings_to_recent_saved": "Скінуць налады да нядаўна захаваных",
|
||||||
|
"scanning_library": "Сканіраванне бібліятэкі",
|
||||||
|
"server_external_domain_settings": "Знешні дамен",
|
||||||
|
"server_settings": "Налады сервера",
|
||||||
|
"server_settings_description": "Кіраванне наладамі сервера",
|
||||||
|
"server_welcome_message": "Прывітальнае паведамленне",
|
||||||
|
"server_welcome_message_description": "Паведамленне, якое адлюстроўваецца на старонцы ўваходу.",
|
||||||
"system_settings": "Сістэмныя налады",
|
"system_settings": "Сістэмныя налады",
|
||||||
|
"tag_cleanup_job": "Ачыстка тэгаў",
|
||||||
|
"template_email_preview": "Перадпрагляд",
|
||||||
"theme_settings": "Налады тэмы",
|
"theme_settings": "Налады тэмы",
|
||||||
|
"transcoding_acceleration_nvenc": "NVENC (патрабуецца відэакарта NVIDIA)",
|
||||||
"transcoding_acceleration_vaapi": "VAAPI",
|
"transcoding_acceleration_vaapi": "VAAPI",
|
||||||
|
"transcoding_accepted_containers": "Прынятыя кантэйнеры",
|
||||||
|
"transcoding_accepted_video_codecs": "Прынятыя відэакодэкі",
|
||||||
|
"transcoding_advanced_options_description": "Параметры, якія большасці карыстальнікаў не трэба змяняць",
|
||||||
"transcoding_audio_codec": "Аудыякодэк",
|
"transcoding_audio_codec": "Аудыякодэк",
|
||||||
|
"transcoding_encoding_options": "Параметры кадзіравання",
|
||||||
"transcoding_video_codec": "Відэакодэк",
|
"transcoding_video_codec": "Відэакодэк",
|
||||||
|
"trash_enabled_description": "Уключыць функцыі сметніцы",
|
||||||
|
"trash_number_of_days": "Колькасць дзён",
|
||||||
"trash_settings": "Налады сметніцы",
|
"trash_settings": "Налады сметніцы",
|
||||||
"trash_settings_description": "Кіраванне наладамі сметніцы",
|
"trash_settings_description": "Кіраванне наладамі сметніцы",
|
||||||
|
"user_cleanup_job": "Ачыстка карыстальніка",
|
||||||
|
"user_management": "Кіраванне карыстальнікамі",
|
||||||
|
"user_password_has_been_reset": "Пароль карыстальніка быў скінуты:",
|
||||||
|
"user_password_reset_description": "Задайце карыстальніку часовы пароль і паведаміце яму, што пры наступным уваходзе ў сістэму яму трэба будзе змяніць пароль.",
|
||||||
|
"user_restore_description": "Уліковы запіс карыстальніка <b>{user}</b> будзе адноўлены.",
|
||||||
|
"user_settings": "Налады карыстальніка",
|
||||||
|
"user_settings_description": "Кіраванне наладамі карыстальніка",
|
||||||
|
"user_successfully_removed": "Карыстальнік {email} быў паспяхова выдалены.",
|
||||||
|
"version_check_enabled_description": "Уключыць праверку версіі",
|
||||||
|
"version_check_implications": "Функцыі праверкі версіі перыядычна звяртаецца да github.com",
|
||||||
"version_check_settings": "Праверка версіі",
|
"version_check_settings": "Праверка версіі",
|
||||||
"version_check_settings_description": "Уключыць/адключыць апавяшчэнні аб новай версіі"
|
"version_check_settings_description": "Уключыць/адключыць апавяшчэнні аб новай версіі"
|
||||||
},
|
},
|
||||||
|
"admin_email": "Электронная пошта адміністратара",
|
||||||
|
"admin_password": "Пароль адміністратара",
|
||||||
|
"administration": "Кіраванне серверам",
|
||||||
|
"advanced": "Пашыраныя",
|
||||||
|
"advanced_settings_log_level_title": "Узровень вядзення журнала: {level}",
|
||||||
|
"advanced_settings_proxy_headers_title": "Загалоўкі проксі",
|
||||||
|
"advanced_settings_tile_subtitle": "Пашыраныя налады карыстальніка",
|
||||||
|
"advanced_settings_troubleshooting_subtitle": "Уключыць дадатковыя функцыі для выпраўлення непаладак",
|
||||||
"advanced_settings_troubleshooting_title": "Выпраўленне непаладак",
|
"advanced_settings_troubleshooting_title": "Выпраўленне непаладак",
|
||||||
|
"age_months": "Узрост {months, plural, one {# месяц} few {# месяцы} many {# месяцаў} other {# месяцаў}}",
|
||||||
|
"age_year_months": "Узрост 1 год, {months, plural, one {# месяц} few {# месяцы} many {# месяцаў} other {# месяцаў}}",
|
||||||
|
"age_years": "{years, plural, other {Узрост #}}",
|
||||||
"album_added": "Альбом дададзены",
|
"album_added": "Альбом дададзены",
|
||||||
|
"album_cover_updated": "Вокладка альбома абноўлена",
|
||||||
|
"album_delete_confirmation": "Вы ўпэўнены, што хочаце выдаліць альбом {album}?",
|
||||||
|
"album_delete_confirmation_description": "Калі гэты альбом абагулены, іншыя карыстальнікі больш не змогуць атрымаць да яго доступ.",
|
||||||
|
"album_deleted": "Альбом выдалены",
|
||||||
|
"album_info_card_backup_album_excluded": "ВЫКЛЮЧАНЫ",
|
||||||
|
"album_info_card_backup_album_included": "УКЛЮЧАНЫ",
|
||||||
|
"album_info_updated": "Інфармацыя пра альбом абноўлена",
|
||||||
|
"album_leave": "Пакінуць альбом?",
|
||||||
|
"album_leave_confirmation": "Вы ўпэўнены, што хочаце пакінуць {album}?",
|
||||||
"album_name": "Назва альбома",
|
"album_name": "Назва альбома",
|
||||||
|
"album_options": "Параметры альбома",
|
||||||
"album_remove_user": "Выдаліць карыстальніка?",
|
"album_remove_user": "Выдаліць карыстальніка?",
|
||||||
|
"album_remove_user_confirmation": "Вы ўпэўнены, што хочаце выдаліць {user}?",
|
||||||
|
"album_search_not_found": "Па вашым запыце не знойдзена альбомаў",
|
||||||
|
"album_share_no_users": "Здаецца, вы падзяліліся гэтым альбомам з усімі карыстальнікамі, або ў вас няма ніводнага карыстальніка, з якім можна падзяліцца.",
|
||||||
"album_updated": "Альбом абноўлены",
|
"album_updated": "Альбом абноўлены",
|
||||||
|
"album_user_left": "Вы пакінулі {album}",
|
||||||
|
"album_user_removed": "Карыстальнік {user} выдалены",
|
||||||
|
"album_viewer_appbar_delete_confirm": "Вы ўпэўнены, што хочаце выдаліць гэты альбом са свайго ўліковага запісу?",
|
||||||
|
"album_viewer_appbar_share_err_delete": "Не ўдалося выдаліць альбом",
|
||||||
|
"album_viewer_appbar_share_err_leave": "Не ўдалося пакінуць альбом",
|
||||||
|
"album_viewer_appbar_share_err_title": "Не ўдалося змяніць назву альбома",
|
||||||
|
"album_viewer_appbar_share_leave": "Пакінуць альбом",
|
||||||
|
"album_viewer_appbar_share_to": "Абагуліць з",
|
||||||
|
"album_viewer_page_share_add_users": "Дадаць карыстальнікаў",
|
||||||
|
"album_with_link_access": "Дазволіць усім, хто мае спасылку, бачыць фота і людзей у гэтым альбоме.",
|
||||||
"albums": "Альбомы",
|
"albums": "Альбомы",
|
||||||
|
"albums_count": "{count, plural, one {1 альбом} few {{count, number} альбомы} many {{count, number} альбомаў} other {{count, number} альбомаў}}",
|
||||||
|
"albums_default_sort_order": "Прадвызначаны парадак сартавання альбомаў",
|
||||||
|
"albums_on_device_count": "Альбомы на прыладзе ({count})",
|
||||||
"all": "Усе",
|
"all": "Усе",
|
||||||
"all_albums": "Усе альбомы",
|
"all_albums": "Усе альбомы",
|
||||||
"all_people": "Усе людзі",
|
"all_people": "Усе людзі",
|
||||||
"all_videos": "Усе відэа",
|
"all_videos": "Усе відэа",
|
||||||
|
"allow_dark_mode": "Дазволіць цёмны рэжым",
|
||||||
|
"allow_edits": "Дазволіць рэдагаванне",
|
||||||
|
"alt_text_qr_code": "Відарыс QR-кода",
|
||||||
|
"anti_clockwise": "Супраць гадзіннікавай стрэлкі",
|
||||||
|
"api_key": "Ключ API",
|
||||||
|
"api_key_empty": "Назва ключа API не павінна быць пустой",
|
||||||
|
"api_keys": "Ключы API",
|
||||||
|
"app_bar_signout_dialog_content": "Вы ўпэўнены, што хочаце выйсці?",
|
||||||
"app_bar_signout_dialog_ok": "Так",
|
"app_bar_signout_dialog_ok": "Так",
|
||||||
"app_bar_signout_dialog_title": "Выйсці",
|
"app_bar_signout_dialog_title": "Выйсці",
|
||||||
"app_settings": "Налады праграмы",
|
"app_settings": "Налады праграмы",
|
||||||
"archive": "Архіў",
|
"archive": "Архіў",
|
||||||
|
"archive_page_title": "Архіў ({count})",
|
||||||
"archive_size": "Памер архіва",
|
"archive_size": "Памер архіва",
|
||||||
|
"are_these_the_same_person": "Ці гэта адзін і той жа чалавек?",
|
||||||
|
"are_you_sure_to_do_this": "Вы ўпэўнены, што хочаце гэта зрабіць?",
|
||||||
|
"asset_added_to_album": "Дададзена ў альбом",
|
||||||
|
"asset_adding_to_album": "Дадаванне ў альбом…",
|
||||||
|
"asset_skipped": "Прапушчана",
|
||||||
|
"asset_skipped_in_trash": "У сметніцы",
|
||||||
|
"asset_uploaded": "Запампавана",
|
||||||
"asset_uploading": "Запампоўванне…",
|
"asset_uploading": "Запампоўванне…",
|
||||||
|
"authorized_devices": "Аўтарызаваныя прылады",
|
||||||
"back": "Назад",
|
"back": "Назад",
|
||||||
|
"backup_album_selection_page_albums_device": "Альбомы на прыладзе ({count})",
|
||||||
"backup_all": "Усе",
|
"backup_all": "Усе",
|
||||||
"backup_controller_page_background_wifi": "Толькі праз Wi-Fi",
|
"backup_controller_page_background_wifi": "Толькі праз Wi-Fi",
|
||||||
"buy": "Купіць Immich",
|
"buy": "Купіць Immich",
|
||||||
|
|||||||
@@ -508,6 +508,7 @@
|
|||||||
"back_close_deselect": "Назад, затваряне или премахване на избора",
|
"back_close_deselect": "Назад, затваряне или премахване на избора",
|
||||||
"background_location_permission": "Разрешение за достъп до местоположението във фонов режим",
|
"background_location_permission": "Разрешение за достъп до местоположението във фонов режим",
|
||||||
"background_location_permission_content": "За да може да чете имената на Wi-Fi мрежите и да ги превключва при работа във фонов режим, Immich трябва *винаги* да има достъп до точното местоположение",
|
"background_location_permission_content": "За да може да чете имената на Wi-Fi мрежите и да ги превключва при работа във фонов режим, Immich трябва *винаги* да има достъп до точното местоположение",
|
||||||
|
"backup": "Архивиране",
|
||||||
"backup_album_selection_page_albums_device": "Албуми на устройството ({count})",
|
"backup_album_selection_page_albums_device": "Албуми на устройството ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Натисни за да включиш, двойно за да изключиш",
|
"backup_album_selection_page_albums_tap": "Натисни за да включиш, двойно за да изключиш",
|
||||||
"backup_album_selection_page_assets_scatter": "Обектите могат да бъдат разпръснати в няколко албума. По този начин албумите могат да бъдат включени или изключени по време на процеса на архивиране.",
|
"backup_album_selection_page_assets_scatter": "Обектите могат да бъдат разпръснати в няколко албума. По този начин албумите могат да бъдат включени или изключени по време на процеса на архивиране.",
|
||||||
@@ -1154,7 +1155,6 @@
|
|||||||
"light": "Светло",
|
"light": "Светло",
|
||||||
"like_deleted": "Като изтрит",
|
"like_deleted": "Като изтрит",
|
||||||
"link_motion_video": "Линк към видео",
|
"link_motion_video": "Линк към видео",
|
||||||
"link_options": "Опции на линк за споделяне",
|
|
||||||
"link_to_oauth": "Линк към OAuth",
|
"link_to_oauth": "Линк към OAuth",
|
||||||
"linked_oauth_account": "Свързан OAuth акаунт",
|
"linked_oauth_account": "Свързан OAuth акаунт",
|
||||||
"list": "Лист",
|
"list": "Лист",
|
||||||
@@ -1217,7 +1217,6 @@
|
|||||||
"manage_your_devices": "Управление на влезлите в системата устройства",
|
"manage_your_devices": "Управление на влезлите в системата устройства",
|
||||||
"manage_your_oauth_connection": "Управление на OAuth връзката",
|
"manage_your_oauth_connection": "Управление на OAuth връзката",
|
||||||
"map": "Карта",
|
"map": "Карта",
|
||||||
"map_assets_in_bound": "{count} снимки",
|
|
||||||
"map_assets_in_bounds": "{count} снимки",
|
"map_assets_in_bounds": "{count} снимки",
|
||||||
"map_cannot_get_user_location": "Не можах да получа местоположението",
|
"map_cannot_get_user_location": "Не можах да получа местоположението",
|
||||||
"map_location_dialog_yes": "Да",
|
"map_location_dialog_yes": "Да",
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
"exclusion_pattern_description": "এক্সক্লুশন প্যাটার্ন ব্যবহার করে আপনি আপনার লাইব্রেরি স্ক্যান করার সময় ফাইল এবং ফোল্ডারগুলিকে উপেক্ষা করতে পারবেন। যদি আপনার এমন ফোল্ডার থাকে যেখানে এমন ফাইল থাকে যা আপনি আমদানি করতে চান না, যেমন RAW ফাইল।",
|
"exclusion_pattern_description": "এক্সক্লুশন প্যাটার্ন ব্যবহার করে আপনি আপনার লাইব্রেরি স্ক্যান করার সময় ফাইল এবং ফোল্ডারগুলিকে উপেক্ষা করতে পারবেন। যদি আপনার এমন ফোল্ডার থাকে যেখানে এমন ফাইল থাকে যা আপনি আমদানি করতে চান না, যেমন RAW ফাইল।",
|
||||||
"external_library_management": "বহিরাগত গ্রন্থাগার ব্যবস্থাপনা",
|
"external_library_management": "বহিরাগত গ্রন্থাগার ব্যবস্থাপনা",
|
||||||
"face_detection": "মুখ সনাক্তকরণ",
|
"face_detection": "মুখ সনাক্তকরণ",
|
||||||
"face_detection_description": "মেশিন লার্নিং ব্যবহার করে অ্যাসেটে থাকা মুখগুলি সনাক্ত করুন। ভিডিওগুলির জন্য, শুধুমাত্র থাম্বনেইল বিবেচনা করা হয়। \"রিফ্রেশ\" (পুনরায়) সমস্ত অ্যাসেট প্রক্রিয়া করে। \"রিসেট\" অতিরিক্তভাবে সমস্ত বর্তমান মুখের ডেটা সাফ করে। \"অনুপস্থিত\" অ্যাসেটগুলিকে সারিবদ্ধ করে যা এখনও প্রক্রিয়া করা হয়নি। সনাক্ত করা মুখগুলিকে ফেসিয়াল রিকগনিশনের জন্য সারিবদ্ধ করা হবে, ফেসিয়াল ডিটেকশন সম্পূর্ণ হওয়ার পরে, বিদ্যমান বা নতুন ব্যক্তিদের মধ্যে গোষ্ঠীবদ্ধ করে।",
|
"face_detection_description": "মেশিন লার্নিং ব্যবহার করে অ্যাসেটে থাকা মুখ/চেহারা গুলি সনাক্ত করুন। ভিডিও গুলির জন্য, শুধুমাত্র থাম্বনেইল বিবেচনা করা হয়। \"রিফ্রেশ\" (পুনরায়) সমস্ত অ্যাসেট প্রক্রিয়া করে। \"রিসেট\" করার মাধ্যমে অতিরিক্তভাবে সমস্ত বর্তমান মুখের ডেটা সাফ করে। \"অনুপস্থিত\" অ্যাসেটগুলিকে সারিবদ্ধ করে যা এখনও প্রক্রিয়া করা হয়নি। সনাক্ত করা মুখগুলিকে ফেসিয়াল রিকগনিশনের জন্য সারিবদ্ধ করা হবে, ফেসিয়াল ডিটেকশন সম্পূর্ণ হওয়ার পরে, বিদ্যমান বা নতুন ব্যক্তিদের মধ্যে গোষ্ঠীবদ্ধ করে।",
|
||||||
"facial_recognition_job_description": "শনাক্ত করা মুখগুলিকে মানুষের মধ্যে গোষ্ঠীভুক্ত করুন। মুখ সনাক্তকরণ সম্পূর্ণ হওয়ার পরে এই ধাপটি চলে। \"রিসেট\" (পুনরায়) সমস্ত মুখকে ক্লাস্টার করে। \"অনুপস্থিত\" মুখগুলিকে সারিতে রাখে যেখানে কোনও ব্যক্তিকে বরাদ্দ করা হয়নি।",
|
"facial_recognition_job_description": "শনাক্ত করা মুখগুলিকে মানুষের মধ্যে গোষ্ঠীভুক্ত করুন। মুখ সনাক্তকরণ সম্পূর্ণ হওয়ার পরে এই ধাপটি চলে। \"রিসেট\" (পুনরায়) সমস্ত মুখকে ক্লাস্টার করে। \"অনুপস্থিত\" মুখগুলিকে সারিতে রাখে যেখানে কোনও ব্যক্তিকে বরাদ্দ করা হয়নি।",
|
||||||
"failed_job_command": "কমান্ড {command} কাজের জন্য ব্যর্থ হয়েছে: {job}",
|
"failed_job_command": "কমান্ড {command} কাজের জন্য ব্যর্থ হয়েছে: {job}",
|
||||||
"force_delete_user_warning": "সতর্কতা: এটি ব্যবহারকারী এবং সমস্ত সম্পদ অবিলম্বে সরিয়ে ফেলবে। এটি পূর্বাবস্থায় ফেরানো যাবে না এবং ফাইলগুলি পুনরুদ্ধার করা যাবে না।",
|
"force_delete_user_warning": "সতর্কতা: এটি ব্যবহারকারী এবং সমস্ত সম্পদ অবিলম্বে সরিয়ে ফেলবে। এটি পূর্বাবস্থায় ফেরানো যাবে না এবং ফাইলগুলি পুনরুদ্ধার করা যাবে না।",
|
||||||
|
|||||||
@@ -496,6 +496,7 @@
|
|||||||
"back_close_deselect": "Tornar, tancar o anul·lar la selecció",
|
"back_close_deselect": "Tornar, tancar o anul·lar la selecció",
|
||||||
"background_location_permission": "Permís d'ubicació en segon pla",
|
"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",
|
"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_device": "Àlbums al dispositiu ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Un toc per incloure, doble toc per excloure",
|
"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.",
|
"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.",
|
||||||
@@ -1139,7 +1140,6 @@
|
|||||||
"light": "Llum",
|
"light": "Llum",
|
||||||
"like_deleted": "M'agrada suprimit",
|
"like_deleted": "M'agrada suprimit",
|
||||||
"link_motion_video": "Enllaçar vídeo en moviment",
|
"link_motion_video": "Enllaçar vídeo en moviment",
|
||||||
"link_options": "Opcions d'enllaç",
|
|
||||||
"link_to_oauth": "Enllaç a OAuth",
|
"link_to_oauth": "Enllaç a OAuth",
|
||||||
"linked_oauth_account": "Compte OAuth enllaçat",
|
"linked_oauth_account": "Compte OAuth enllaçat",
|
||||||
"list": "Llista",
|
"list": "Llista",
|
||||||
@@ -1202,7 +1202,6 @@
|
|||||||
"manage_your_devices": "Gestioneu els vostres dispositius connectats",
|
"manage_your_devices": "Gestioneu els vostres dispositius connectats",
|
||||||
"manage_your_oauth_connection": "Gestioneu la vostra connexió OAuth",
|
"manage_your_oauth_connection": "Gestioneu la vostra connexió OAuth",
|
||||||
"map": "Mapa",
|
"map": "Mapa",
|
||||||
"map_assets_in_bound": "{count} foto",
|
|
||||||
"map_assets_in_bounds": "{count} fotos",
|
"map_assets_in_bounds": "{count} fotos",
|
||||||
"map_cannot_get_user_location": "No es pot obtenir la ubicació de l'usuari",
|
"map_cannot_get_user_location": "No es pot obtenir la ubicació de l'usuari",
|
||||||
"map_location_dialog_yes": "Sí",
|
"map_location_dialog_yes": "Sí",
|
||||||
|
|||||||
37
i18n/cs.json
@@ -14,6 +14,7 @@
|
|||||||
"add_a_location": "Přidat polohu",
|
"add_a_location": "Přidat polohu",
|
||||||
"add_a_name": "Přidat jméno",
|
"add_a_name": "Přidat jméno",
|
||||||
"add_a_title": "Přidat název",
|
"add_a_title": "Přidat název",
|
||||||
|
"add_birthday": "Přidat datum narození",
|
||||||
"add_endpoint": "Přidat koncový bod",
|
"add_endpoint": "Přidat koncový bod",
|
||||||
"add_exclusion_pattern": "Přidat vzor vyloučení",
|
"add_exclusion_pattern": "Přidat vzor vyloučení",
|
||||||
"add_import_path": "Přidat cestu importu",
|
"add_import_path": "Přidat cestu importu",
|
||||||
@@ -44,6 +45,13 @@
|
|||||||
"backup_database": "Vytvořit výpis databáze",
|
"backup_database": "Vytvořit výpis databáze",
|
||||||
"backup_database_enable_description": "Povolit výpisy z 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_keep_last_amount": "Počet předchozích výpisů, které se mají ponechat",
|
||||||
|
"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": "Zálohování databáze",
|
||||||
"backup_settings_description": "Správa nastavení výpisu databáze.",
|
"backup_settings_description": "Správa nastavení výpisu databáze.",
|
||||||
"cleared_jobs": "Hotové úlohy pro: {job}",
|
"cleared_jobs": "Hotové úlohy pro: {job}",
|
||||||
@@ -374,7 +382,7 @@
|
|||||||
"administration": "Administrace",
|
"administration": "Administrace",
|
||||||
"advanced": "Pokročilé",
|
"advanced": "Pokročilé",
|
||||||
"advanced_settings_beta_timeline_subtitle": "Vyzkoušejte nové prostředí aplikace",
|
"advanced_settings_beta_timeline_subtitle": "Vyzkoušejte nové prostředí aplikace",
|
||||||
"advanced_settings_beta_timeline_title": "Časová osa beta verze",
|
"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_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_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_log_level_title": "Úroveň protokolování: {level}",
|
||||||
@@ -397,6 +405,7 @@
|
|||||||
"album_cover_updated": "Obal alba aktualizován",
|
"album_cover_updated": "Obal alba aktualizován",
|
||||||
"album_delete_confirmation": "Opravdu chcete album {album} odstranit?",
|
"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_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_excluded": "VYLOUČENO",
|
||||||
"album_info_card_backup_album_included": "ZAHRNUTO",
|
"album_info_card_backup_album_included": "ZAHRNUTO",
|
||||||
"album_info_updated": "Informace o albu aktualizovány",
|
"album_info_updated": "Informace o albu aktualizovány",
|
||||||
@@ -510,6 +519,7 @@
|
|||||||
"back_close_deselect": "Zpět, zavřít nebo zrušit výběr",
|
"back_close_deselect": "Zpět, zavřít nebo zrušit výběr",
|
||||||
"background_location_permission": "Povolení polohy na pozadí",
|
"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ě",
|
"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_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_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í.",
|
"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í.",
|
||||||
@@ -573,7 +583,7 @@
|
|||||||
"backup_options_page_title": "Nastavení záloh",
|
"backup_options_page_title": "Nastavení záloh",
|
||||||
"backup_setting_subtitle": "Správa nastavení zálohování na pozadí a na popředí",
|
"backup_setting_subtitle": "Správa nastavení zálohování na pozadí a na popředí",
|
||||||
"backward": "Pozpátku",
|
"backward": "Pozpátku",
|
||||||
"beta_sync": "Stav synchronizace beta verze",
|
"beta_sync": "Stav synchronizace (beta)",
|
||||||
"beta_sync_subtitle": "Správa nového systému synchronizace",
|
"beta_sync_subtitle": "Správa nového systému synchronizace",
|
||||||
"biometric_auth_enabled": "Biometrické ověřování je povoleno",
|
"biometric_auth_enabled": "Biometrické ověřování je povoleno",
|
||||||
"biometric_locked_out": "Jste vyloučeni z biometrického ověřování",
|
"biometric_locked_out": "Jste vyloučeni z biometrického ověřování",
|
||||||
@@ -723,6 +733,7 @@
|
|||||||
"current_server_address": "Aktuální adresa serveru",
|
"current_server_address": "Aktuální adresa serveru",
|
||||||
"custom_locale": "Vlastní lokalizace",
|
"custom_locale": "Vlastní lokalizace",
|
||||||
"custom_locale_description": "Formátovat datumy a čísla podle jazyka a oblasti",
|
"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": "EEEE, d. MMMM",
|
||||||
"daily_title_text_date_year": "EEEE, d. MMMM y",
|
"daily_title_text_date_year": "EEEE, d. MMMM y",
|
||||||
"dark": "Tmavý",
|
"dark": "Tmavý",
|
||||||
@@ -742,7 +753,8 @@
|
|||||||
"default_locale": "Výchozí jazyk",
|
"default_locale": "Výchozí jazyk",
|
||||||
"default_locale_description": "Formátovat datumy a čísla podle místního prostředí prohlížeče",
|
"default_locale_description": "Formátovat datumy a čísla podle místního prostředí prohlížeče",
|
||||||
"delete": "Smazat",
|
"delete": "Smazat",
|
||||||
"delete_action_prompt": "{count} trvale smazaných",
|
"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_album": "Smazat album",
|
||||||
"delete_api_key_prompt": "Opravdu chcete tento API klíč odstranit?",
|
"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í",
|
"delete_dialog_alert": "Tyto položky budou trvale smazány z aplikace Immich i z vašeho zařízení",
|
||||||
@@ -759,7 +771,9 @@
|
|||||||
"delete_local_action_prompt": "{count} smazáno lokálně",
|
"delete_local_action_prompt": "{count} smazáno lokálně",
|
||||||
"delete_local_dialog_ok_backed_up_only": "Smazat pouze zálohované",
|
"delete_local_dialog_ok_backed_up_only": "Smazat pouze zálohované",
|
||||||
"delete_local_dialog_ok_force": "Přesto smazat",
|
"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": "Smazat sdílený odkaz",
|
||||||
"delete_shared_link_dialog_title": "Odstranit sdílený odkaz",
|
"delete_shared_link_dialog_title": "Odstranit sdílený odkaz",
|
||||||
"delete_tag": "Smazat značku",
|
"delete_tag": "Smazat značku",
|
||||||
@@ -815,6 +829,7 @@
|
|||||||
"edit": "Upravit",
|
"edit": "Upravit",
|
||||||
"edit_album": "Upravit album",
|
"edit_album": "Upravit album",
|
||||||
"edit_avatar": "Upravit avatar",
|
"edit_avatar": "Upravit avatar",
|
||||||
|
"edit_birthday": "Upravit datum narození",
|
||||||
"edit_date": "Upravit datum",
|
"edit_date": "Upravit datum",
|
||||||
"edit_date_and_time": "Upravit datum a čas",
|
"edit_date_and_time": "Upravit datum a čas",
|
||||||
"edit_description": "Upravit popis",
|
"edit_description": "Upravit popis",
|
||||||
@@ -982,6 +997,7 @@
|
|||||||
},
|
},
|
||||||
"exif": "Exif",
|
"exif": "Exif",
|
||||||
"exif_bottom_sheet_description": "Přidat popis...",
|
"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_details": "PODROBNOSTI",
|
||||||
"exif_bottom_sheet_location": "POLOHA",
|
"exif_bottom_sheet_location": "POLOHA",
|
||||||
"exif_bottom_sheet_people": "LIDÉ",
|
"exif_bottom_sheet_people": "LIDÉ",
|
||||||
@@ -1002,6 +1018,8 @@
|
|||||||
"explorer": "Průzkumník",
|
"explorer": "Průzkumník",
|
||||||
"export": "Export",
|
"export": "Export",
|
||||||
"export_as_json": "Exportovat jako JSON",
|
"export_as_json": "Exportovat jako JSON",
|
||||||
|
"export_database": "Exportovat databázi",
|
||||||
|
"export_database_description": "Exportovat databázi SQLite",
|
||||||
"extension": "Přípona",
|
"extension": "Přípona",
|
||||||
"external": "Externí",
|
"external": "Externí",
|
||||||
"external_libraries": "Externí knihovny",
|
"external_libraries": "Externí knihovny",
|
||||||
@@ -1146,6 +1164,7 @@
|
|||||||
"language_no_results_title": "Nebyly nalezeny žádné jazyky",
|
"language_no_results_title": "Nebyly nalezeny žádné jazyky",
|
||||||
"language_search_hint": "Vyhledat jazyk...",
|
"language_search_hint": "Vyhledat jazyk...",
|
||||||
"language_setting_description": "Vyberte upřednostňovaný jazyk",
|
"language_setting_description": "Vyberte upřednostňovaný jazyk",
|
||||||
|
"large_files": "Velké soubory",
|
||||||
"last_seen": "Naposledy viděno",
|
"last_seen": "Naposledy viděno",
|
||||||
"latest_version": "Nejnovější verze",
|
"latest_version": "Nejnovější verze",
|
||||||
"latitude": "Zeměpisná šířka",
|
"latitude": "Zeměpisná šířka",
|
||||||
@@ -1165,7 +1184,6 @@
|
|||||||
"light": "Světlý",
|
"light": "Světlý",
|
||||||
"like_deleted": "Lajk smazán",
|
"like_deleted": "Lajk smazán",
|
||||||
"link_motion_video": "Připojit pohyblivé video",
|
"link_motion_video": "Připojit pohyblivé video",
|
||||||
"link_options": "Možnosti odkazu",
|
|
||||||
"link_to_oauth": "Propojit s OAuth",
|
"link_to_oauth": "Propojit s OAuth",
|
||||||
"linked_oauth_account": "Propojený OAuth účet",
|
"linked_oauth_account": "Propojený OAuth účet",
|
||||||
"list": "Seznam",
|
"list": "Seznam",
|
||||||
@@ -1230,8 +1248,7 @@
|
|||||||
"manage_your_devices": "Správa přihlášených zařízení",
|
"manage_your_devices": "Správa přihlášených zařízení",
|
||||||
"manage_your_oauth_connection": "Správa OAuth propojení",
|
"manage_your_oauth_connection": "Správa OAuth propojení",
|
||||||
"map": "Mapa",
|
"map": "Mapa",
|
||||||
"map_assets_in_bound": "{count} fotka",
|
"map_assets_in_bounds": "{count, plural, one {# fotka} few{# fotky} other {# fotek}}",
|
||||||
"map_assets_in_bounds": "{count} fotek",
|
|
||||||
"map_cannot_get_user_location": "Nelze zjistit polohu uživatele",
|
"map_cannot_get_user_location": "Nelze zjistit polohu uživatele",
|
||||||
"map_location_dialog_yes": "Ano",
|
"map_location_dialog_yes": "Ano",
|
||||||
"map_location_picker_page_use_location": "Použít tuto polohu",
|
"map_location_picker_page_use_location": "Použít tuto polohu",
|
||||||
@@ -1582,6 +1599,7 @@
|
|||||||
"resume": "Pokračovat",
|
"resume": "Pokračovat",
|
||||||
"retry_upload": "Opakování nahrávání",
|
"retry_upload": "Opakování nahrávání",
|
||||||
"review_duplicates": "Kontrola duplicit",
|
"review_duplicates": "Kontrola duplicit",
|
||||||
|
"review_large_files": "Kontrola velkých souborů",
|
||||||
"role": "Role",
|
"role": "Role",
|
||||||
"role_editor": "Editor",
|
"role_editor": "Editor",
|
||||||
"role_viewer": "Divák",
|
"role_viewer": "Divák",
|
||||||
@@ -1739,6 +1757,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "Zkopírováno do schránky",
|
"shared_link_clipboard_copied_massage": "Zkopírováno do schránky",
|
||||||
"shared_link_clipboard_text": "Odkaz: {link}\nHeslo: {password}",
|
"shared_link_clipboard_text": "Odkaz: {link}\nHeslo: {password}",
|
||||||
"shared_link_create_error": "Chyba při vytváření sdíleného odkazu",
|
"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_description_hint": "Zadejte popis sdílení",
|
||||||
"shared_link_edit_expire_after_option_day": "1 den",
|
"shared_link_edit_expire_after_option_day": "1 den",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} dní",
|
"shared_link_edit_expire_after_option_days": "{count} dní",
|
||||||
@@ -1764,6 +1783,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "Spravovat sdílené odkazy",
|
"shared_link_manage_links": "Spravovat sdílené odkazy",
|
||||||
"shared_link_options": "Možnosti sdíleného odkazu",
|
"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": "Sdílené odkazy",
|
||||||
"shared_links_description": "Sdílet fotky a videa pomocí odkazu",
|
"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í.}}",
|
"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í.}}",
|
||||||
@@ -1941,11 +1961,13 @@
|
|||||||
"updated_at": "Aktualizováno",
|
"updated_at": "Aktualizováno",
|
||||||
"updated_password": "Heslo aktualizováno",
|
"updated_password": "Heslo aktualizováno",
|
||||||
"upload": "Nahrát",
|
"upload": "Nahrát",
|
||||||
|
"upload_action_prompt": "{count} ve frontě pro nahrání",
|
||||||
"upload_concurrency": "Souběžnost nahrávání",
|
"upload_concurrency": "Souběžnost nahrávání",
|
||||||
"upload_details": "Detaily nahrávání",
|
"upload_details": "Detaily nahrávání",
|
||||||
"upload_dialog_info": "Chcete zálohovat vybrané položky na server?",
|
"upload_dialog_info": "Chcete zálohovat vybrané položky na server?",
|
||||||
"upload_dialog_title": "Nahrát položku",
|
"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_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_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_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",
|
"upload_status_duplicates": "Duplicity",
|
||||||
@@ -1954,6 +1976,7 @@
|
|||||||
"upload_success": "Nahrání proběhlo úspěšně, obnovením stránky se zobrazí nově nahrané položky.",
|
"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})",
|
"upload_to_immich": "Nahrát do Immich ({count})",
|
||||||
"uploading": "Nahrávání",
|
"uploading": "Nahrávání",
|
||||||
|
"uploading_media": "Nahrávání médií",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"usage": "Využití",
|
"usage": "Využití",
|
||||||
"use_biometric": "Použít biometrické údaje",
|
"use_biometric": "Použít biometrické údaje",
|
||||||
|
|||||||
18
i18n/da.json
@@ -167,6 +167,19 @@
|
|||||||
"migration_job": "Migrering",
|
"migration_job": "Migrering",
|
||||||
"migration_job_description": "Migrér miniaturebilleder for aktiver og ansigter til den seneste mappestruktur",
|
"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_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_paths_added": "Ingen stier tilføjet",
|
||||||
"no_pattern_added": "Intet mønster 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",
|
"note_apply_storage_label_previous_assets": "Bemærk: For at anvende Lagringsmærkatet på tidligere uploadede mediefiler, kør",
|
||||||
@@ -205,7 +218,7 @@
|
|||||||
"oauth_storage_quota_claim": "Lagringskvotefordring",
|
"oauth_storage_quota_claim": "Lagringskvotefordring",
|
||||||
"oauth_storage_quota_claim_description": "Sæt automatisk brugeres lagringskvote til denne nye fordrings værdi.",
|
"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": "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": "Forespørgslen udløb",
|
||||||
"oauth_timeout_description": "Udløbstid for forespørgsel i milisekunder",
|
"oauth_timeout_description": "Udløbstid for forespørgsel i milisekunder",
|
||||||
"password_enable_description": "Log ind med email og adgangskode",
|
"password_enable_description": "Log ind med email og adgangskode",
|
||||||
@@ -489,6 +502,7 @@
|
|||||||
"back_close_deselect": "Tilbage, luk eller fravælg",
|
"back_close_deselect": "Tilbage, luk eller fravælg",
|
||||||
"background_location_permission": "Tilladelse til baggrundsplacering",
|
"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",
|
"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_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_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.",
|
"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.",
|
||||||
@@ -1128,7 +1142,6 @@
|
|||||||
"light": "Lys",
|
"light": "Lys",
|
||||||
"like_deleted": "Ligesom slettet",
|
"like_deleted": "Ligesom slettet",
|
||||||
"link_motion_video": "Link bevægelsesvideo",
|
"link_motion_video": "Link bevægelsesvideo",
|
||||||
"link_options": "Link-indstillinger",
|
|
||||||
"link_to_oauth": "Link til OAuth",
|
"link_to_oauth": "Link til OAuth",
|
||||||
"linked_oauth_account": "Tilsluttet OAuth-konto",
|
"linked_oauth_account": "Tilsluttet OAuth-konto",
|
||||||
"list": "Liste",
|
"list": "Liste",
|
||||||
@@ -1190,7 +1203,6 @@
|
|||||||
"manage_your_devices": "Administrér dine enheder der er logget ind",
|
"manage_your_devices": "Administrér dine enheder der er logget ind",
|
||||||
"manage_your_oauth_connection": "Administrér din OAuth-tilslutning",
|
"manage_your_oauth_connection": "Administrér din OAuth-tilslutning",
|
||||||
"map": "Kort",
|
"map": "Kort",
|
||||||
"map_assets_in_bound": "{count} billede",
|
|
||||||
"map_assets_in_bounds": "{count} billeder",
|
"map_assets_in_bounds": "{count} billeder",
|
||||||
"map_cannot_get_user_location": "Kan ikke finde brugerens placering",
|
"map_cannot_get_user_location": "Kan ikke finde brugerens placering",
|
||||||
"map_location_dialog_yes": "Ja",
|
"map_location_dialog_yes": "Ja",
|
||||||
|
|||||||
49
i18n/de.json
@@ -14,6 +14,7 @@
|
|||||||
"add_a_location": "Standort hinzufügen",
|
"add_a_location": "Standort hinzufügen",
|
||||||
"add_a_name": "Name hinzufügen",
|
"add_a_name": "Name hinzufügen",
|
||||||
"add_a_title": "Titel hinzufügen",
|
"add_a_title": "Titel hinzufügen",
|
||||||
|
"add_birthday": "Geburtsdatum hinzufügen",
|
||||||
"add_endpoint": "Endpunkt hinzufügen",
|
"add_endpoint": "Endpunkt hinzufügen",
|
||||||
"add_exclusion_pattern": "Ausschlussmuster hinzufügen",
|
"add_exclusion_pattern": "Ausschlussmuster hinzufügen",
|
||||||
"add_import_path": "Importpfad 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_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.",
|
"authentication_settings_reenable": "Nutze einen <link>Server-Befehl</link> zur Reaktivierung.",
|
||||||
"background_task_job": "Hintergrundaufgaben",
|
"background_task_job": "Hintergrundaufgaben",
|
||||||
"backup_database": "Datenbanksicherung regelmäßig erstellen",
|
"backup_database": "Datenbanksicherung erstellen",
|
||||||
"backup_database_enable_description": "Datenbank regelmäßig sichern",
|
"backup_database_enable_description": "Datenbank regelmäßig sichern",
|
||||||
"backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Backups",
|
"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": "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.",
|
"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}",
|
"cleared_jobs": "Folgende Aufgaben zurückgesetzt: {job}",
|
||||||
@@ -120,7 +128,7 @@
|
|||||||
"machine_learning_duplicate_detection_setting_description": "Verwendung von CLIP-Embeddings zum Erkennen möglicher Duplikate",
|
"machine_learning_duplicate_detection_setting_description": "Verwendung von CLIP-Embeddings zum Erkennen möglicher Duplikate",
|
||||||
"machine_learning_enabled": "Maschinelles Lernen aktivieren",
|
"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_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_description": "Erkenne, identifiziere und gruppiere Gesichter in Bildern",
|
||||||
"machine_learning_facial_recognition_model": "Gesichtserkennungs-Modell",
|
"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.",
|
"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.",
|
||||||
@@ -385,7 +393,7 @@
|
|||||||
"advanced_settings_self_signed_ssl_subtitle": "Verifizierung von SSL-Zertifikaten vom Server überspringen. Notwendig bei selbstsignierten Zertifikaten.",
|
"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_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_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_tile_subtitle": "Erweiterte Benutzereinstellungen",
|
||||||
"advanced_settings_troubleshooting_subtitle": "Erweiterte Funktionen zur Fehlersuche aktivieren",
|
"advanced_settings_troubleshooting_subtitle": "Erweiterte Funktionen zur Fehlersuche aktivieren",
|
||||||
"advanced_settings_troubleshooting_title": "Fehlersuche",
|
"advanced_settings_troubleshooting_title": "Fehlersuche",
|
||||||
@@ -397,6 +405,7 @@
|
|||||||
"album_cover_updated": "Album-Cover aktualisiert",
|
"album_cover_updated": "Album-Cover aktualisiert",
|
||||||
"album_delete_confirmation": "Bist du sicher, dass du das Album {album} löschen willst?",
|
"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_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_excluded": "AUSGESCHLOSSEN",
|
||||||
"album_info_card_backup_album_included": "EINGESCHLOSSEN",
|
"album_info_card_backup_album_included": "EINGESCHLOSSEN",
|
||||||
"album_info_updated": "Album-Infos aktualisiert",
|
"album_info_updated": "Album-Infos aktualisiert",
|
||||||
@@ -510,6 +519,7 @@
|
|||||||
"back_close_deselect": "Zurück, Schließen oder Abwählen",
|
"back_close_deselect": "Zurück, Schließen oder Abwählen",
|
||||||
"background_location_permission": "Hintergrund Standortfreigabe",
|
"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",
|
"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_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_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.",
|
"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.",
|
||||||
@@ -573,7 +583,7 @@
|
|||||||
"backup_options_page_title": "Sicherungsoptionen",
|
"backup_options_page_title": "Sicherungsoptionen",
|
||||||
"backup_setting_subtitle": "Verwaltung der Upload-Einstellungen im Hintergrund und im Vordergrund",
|
"backup_setting_subtitle": "Verwaltung der Upload-Einstellungen im Hintergrund und im Vordergrund",
|
||||||
"backward": "Rückwärts",
|
"backward": "Rückwärts",
|
||||||
"beta_sync": "Status des Beta Sync",
|
"beta_sync": "Status der Beta-Synchronisierung",
|
||||||
"beta_sync_subtitle": "Verwalte das neue Synchronisierungssystem",
|
"beta_sync_subtitle": "Verwalte das neue Synchronisierungssystem",
|
||||||
"biometric_auth_enabled": "Biometrische Authentifizierung aktiviert",
|
"biometric_auth_enabled": "Biometrische Authentifizierung aktiviert",
|
||||||
"biometric_locked_out": "Du bist von der biometrischen Authentifizierung ausgeschlossen",
|
"biometric_locked_out": "Du bist von der biometrischen Authentifizierung ausgeschlossen",
|
||||||
@@ -723,6 +733,7 @@
|
|||||||
"current_server_address": "Aktuelle Serveradresse",
|
"current_server_address": "Aktuelle Serveradresse",
|
||||||
"custom_locale": "Benutzerdefinierte Sprache",
|
"custom_locale": "Benutzerdefinierte Sprache",
|
||||||
"custom_locale_description": "Datumsangaben und Zahlen je nach Sprache und Land formatieren",
|
"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": "E, dd MMM",
|
||||||
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
||||||
"dark": "Dunkel",
|
"dark": "Dunkel",
|
||||||
@@ -742,7 +753,8 @@
|
|||||||
"default_locale": "Standard-Sprache",
|
"default_locale": "Standard-Sprache",
|
||||||
"default_locale_description": "Datumsangaben und Zahlen basierend auf dem Gebietsschema des Browsers formatieren",
|
"default_locale_description": "Datumsangaben und Zahlen basierend auf dem Gebietsschema des Browsers formatieren",
|
||||||
"delete": "Löschen",
|
"delete": "Löschen",
|
||||||
"delete_action_prompt": "{count} endgültig gelöscht",
|
"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_album": "Album löschen",
|
||||||
"delete_api_key_prompt": "Bist du sicher, dass du diesen API-Schlüssel löschen willst?",
|
"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",
|
"delete_dialog_alert": "Diese Elemente werden unwiderruflich von Immich und dem Gerät entfernt",
|
||||||
@@ -760,6 +772,8 @@
|
|||||||
"delete_local_dialog_ok_backed_up_only": "Nur gesicherte Inhalte löschen",
|
"delete_local_dialog_ok_backed_up_only": "Nur gesicherte Inhalte löschen",
|
||||||
"delete_local_dialog_ok_force": "Trotzdem löschen",
|
"delete_local_dialog_ok_force": "Trotzdem löschen",
|
||||||
"delete_others": "Andere 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": "geteilten Link löschen",
|
||||||
"delete_shared_link_dialog_title": "Geteilten Link löschen",
|
"delete_shared_link_dialog_title": "Geteilten Link löschen",
|
||||||
"delete_tag": "Tag löschen",
|
"delete_tag": "Tag löschen",
|
||||||
@@ -815,6 +829,7 @@
|
|||||||
"edit": "Bearbeiten",
|
"edit": "Bearbeiten",
|
||||||
"edit_album": "Album bearbeiten",
|
"edit_album": "Album bearbeiten",
|
||||||
"edit_avatar": "Avatar bearbeiten",
|
"edit_avatar": "Avatar bearbeiten",
|
||||||
|
"edit_birthday": "Geburtsdatum bearbeiten",
|
||||||
"edit_date": "Datum bearbeiten",
|
"edit_date": "Datum bearbeiten",
|
||||||
"edit_date_and_time": "Datum und Uhrzeit bearbeiten",
|
"edit_date_and_time": "Datum und Uhrzeit bearbeiten",
|
||||||
"edit_description": "Beschreibung bearbeiten",
|
"edit_description": "Beschreibung bearbeiten",
|
||||||
@@ -982,6 +997,7 @@
|
|||||||
},
|
},
|
||||||
"exif": "EXIF",
|
"exif": "EXIF",
|
||||||
"exif_bottom_sheet_description": "Beschreibung hinzufügen...",
|
"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_details": "DETAILS",
|
||||||
"exif_bottom_sheet_location": "STANDORT",
|
"exif_bottom_sheet_location": "STANDORT",
|
||||||
"exif_bottom_sheet_people": "PERSONEN",
|
"exif_bottom_sheet_people": "PERSONEN",
|
||||||
@@ -1002,6 +1018,8 @@
|
|||||||
"explorer": "Datei-Explorer",
|
"explorer": "Datei-Explorer",
|
||||||
"export": "Exportieren",
|
"export": "Exportieren",
|
||||||
"export_as_json": "Als JSON exportieren",
|
"export_as_json": "Als JSON exportieren",
|
||||||
|
"export_database": "Datenbank exportieren",
|
||||||
|
"export_database_description": "Exportiert die SQLite Datenbank",
|
||||||
"extension": "Erweiterung",
|
"extension": "Erweiterung",
|
||||||
"external": "Extern",
|
"external": "Extern",
|
||||||
"external_libraries": "Externe Bibliotheken",
|
"external_libraries": "Externe Bibliotheken",
|
||||||
@@ -1077,7 +1095,7 @@
|
|||||||
"home_page_archive_err_partner": "Inhalte von Partnern können nicht archiviert werden",
|
"home_page_archive_err_partner": "Inhalte von Partnern können nicht archiviert werden",
|
||||||
"home_page_building_timeline": "Zeitachse wird erstellt",
|
"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_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_local": "Kann lokale Elemente noch nicht favorisieren, überspringen",
|
||||||
"home_page_favorite_err_partner": "Inhalte von Partnern können nicht favorisiert werden, überspringe",
|
"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",
|
"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",
|
||||||
@@ -1146,6 +1164,7 @@
|
|||||||
"language_no_results_title": "Keine Sprachen gefunden",
|
"language_no_results_title": "Keine Sprachen gefunden",
|
||||||
"language_search_hint": "Sprachen durchsuchen...",
|
"language_search_hint": "Sprachen durchsuchen...",
|
||||||
"language_setting_description": "Wähle deine bevorzugte Sprache",
|
"language_setting_description": "Wähle deine bevorzugte Sprache",
|
||||||
|
"large_files": "Große Dateien",
|
||||||
"last_seen": "Zuletzt gesehen",
|
"last_seen": "Zuletzt gesehen",
|
||||||
"latest_version": "Aktuellste Version",
|
"latest_version": "Aktuellste Version",
|
||||||
"latitude": "Breitengrad",
|
"latitude": "Breitengrad",
|
||||||
@@ -1165,7 +1184,6 @@
|
|||||||
"light": "Hell",
|
"light": "Hell",
|
||||||
"like_deleted": "Like gelöscht",
|
"like_deleted": "Like gelöscht",
|
||||||
"link_motion_video": "Bewegungsvideo verknüpfen",
|
"link_motion_video": "Bewegungsvideo verknüpfen",
|
||||||
"link_options": "Link-Optionen",
|
|
||||||
"link_to_oauth": "Mit OAuth verknüpfen",
|
"link_to_oauth": "Mit OAuth verknüpfen",
|
||||||
"linked_oauth_account": "Verknüpftes OAuth-Konto",
|
"linked_oauth_account": "Verknüpftes OAuth-Konto",
|
||||||
"list": "Liste",
|
"list": "Liste",
|
||||||
@@ -1230,8 +1248,7 @@
|
|||||||
"manage_your_devices": "Deine eingeloggten Geräte verwalten",
|
"manage_your_devices": "Deine eingeloggten Geräte verwalten",
|
||||||
"manage_your_oauth_connection": "Deine OAuth-Verknüpfung verwalten",
|
"manage_your_oauth_connection": "Deine OAuth-Verknüpfung verwalten",
|
||||||
"map": "Karte",
|
"map": "Karte",
|
||||||
"map_assets_in_bound": "{count} Foto",
|
"map_assets_in_bounds": "{count, plural, one {# Foto} other {# Fotos}}",
|
||||||
"map_assets_in_bounds": "{count} Fotos",
|
|
||||||
"map_cannot_get_user_location": "Standort konnte nicht ermittelt werden",
|
"map_cannot_get_user_location": "Standort konnte nicht ermittelt werden",
|
||||||
"map_location_dialog_yes": "Ja",
|
"map_location_dialog_yes": "Ja",
|
||||||
"map_location_picker_page_use_location": "Aufnahmeort verwenden",
|
"map_location_picker_page_use_location": "Aufnahmeort verwenden",
|
||||||
@@ -1529,8 +1546,8 @@
|
|||||||
"refreshing_faces": "Gesichter werden aktualisiert",
|
"refreshing_faces": "Gesichter werden aktualisiert",
|
||||||
"refreshing_metadata": "Metadaten werden aktualisiert",
|
"refreshing_metadata": "Metadaten werden aktualisiert",
|
||||||
"regenerating_thumbnails": "Miniaturansichten werden neu erstellt",
|
"regenerating_thumbnails": "Miniaturansichten werden neu erstellt",
|
||||||
"remote": "Entfernt",
|
"remote": "Server",
|
||||||
"remote_assets": "Entfernte Dateien",
|
"remote_assets": "Server-Dateien",
|
||||||
"remove": "Entfernen",
|
"remove": "Entfernen",
|
||||||
"remove_assets_album_confirmation": "Bist du sicher, dass du {count, plural, one {# Datei} other {# Dateien}} aus dem Album entfernen willst?",
|
"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?",
|
"remove_assets_shared_link_confirmation": "Bist du sicher, dass du {count, plural, one {# Datei} other {# Dateien}} von diesem geteilten Link entfernen willst?",
|
||||||
@@ -1582,6 +1599,7 @@
|
|||||||
"resume": "Fortsetzen",
|
"resume": "Fortsetzen",
|
||||||
"retry_upload": "Upload wiederholen",
|
"retry_upload": "Upload wiederholen",
|
||||||
"review_duplicates": "Duplikate überprüfen",
|
"review_duplicates": "Duplikate überprüfen",
|
||||||
|
"review_large_files": "Große Dateien überprüfen",
|
||||||
"role": "Rolle",
|
"role": "Rolle",
|
||||||
"role_editor": "Bearbeiter",
|
"role_editor": "Bearbeiter",
|
||||||
"role_viewer": "Betrachter",
|
"role_viewer": "Betrachter",
|
||||||
@@ -1739,6 +1757,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "Link kopiert",
|
"shared_link_clipboard_copied_massage": "Link kopiert",
|
||||||
"shared_link_clipboard_text": "Link: {link}\nPasswort: {password}",
|
"shared_link_clipboard_text": "Link: {link}\nPasswort: {password}",
|
||||||
"shared_link_create_error": "Fehler beim Erstellen der Linkfreigabe",
|
"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_description_hint": "Beschreibung eingeben",
|
||||||
"shared_link_edit_expire_after_option_day": "1 Tag",
|
"shared_link_edit_expire_after_option_day": "1 Tag",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} Tagen",
|
"shared_link_edit_expire_after_option_days": "{count} Tagen",
|
||||||
@@ -1764,6 +1783,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "Geteilte Links verwalten",
|
"shared_link_manage_links": "Geteilte Links verwalten",
|
||||||
"shared_link_options": "Optionen für geteilten Link",
|
"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": "Geteilte Links",
|
||||||
"shared_links_description": "Teile Fotos und Videos mit einem Link",
|
"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.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, one {# geteiltes Foto oder Video.} other {# geteilte Fotos & Videos.}}",
|
||||||
@@ -1850,7 +1870,7 @@
|
|||||||
"sync_albums": "Alben synchronisieren",
|
"sync_albums": "Alben synchronisieren",
|
||||||
"sync_albums_manual_subtitle": "Synchronisiere alle hochgeladenen Videos und Fotos in die ausgewählten Backup-Alben",
|
"sync_albums_manual_subtitle": "Synchronisiere alle hochgeladenen Videos und Fotos in die ausgewählten Backup-Alben",
|
||||||
"sync_local": "Lokal synchronisieren",
|
"sync_local": "Lokal synchronisieren",
|
||||||
"sync_remote": "Entfernt 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",
|
"sync_upload_album_setting_subtitle": "Erstelle deine ausgewählten Alben in Immich und lade die Fotos und Videos dort hoch",
|
||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
"tag_assets": "Dateien taggen",
|
"tag_assets": "Dateien taggen",
|
||||||
@@ -1866,7 +1886,7 @@
|
|||||||
"theme": "Theme",
|
"theme": "Theme",
|
||||||
"theme_selection": "Themenauswahl",
|
"theme_selection": "Themenauswahl",
|
||||||
"theme_selection_description": "Automatische Einstellung des Themes auf Hell oder Dunkel, je nach Systemeinstellung des Browsers",
|
"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_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_subtitle": "Primärfarbe auf App-Hintergrund anwenden.",
|
||||||
"theme_setting_colorful_interface_title": "Farbige UI-Oberfläche",
|
"theme_setting_colorful_interface_title": "Farbige UI-Oberfläche",
|
||||||
@@ -1941,11 +1961,13 @@
|
|||||||
"updated_at": "Aktualisiert",
|
"updated_at": "Aktualisiert",
|
||||||
"updated_password": "Passwort aktualisiert",
|
"updated_password": "Passwort aktualisiert",
|
||||||
"upload": "Hochladen",
|
"upload": "Hochladen",
|
||||||
|
"upload_action_prompt": "{count} in der Warteschlange für Upload",
|
||||||
"upload_concurrency": "Parallelität beim Hochladen",
|
"upload_concurrency": "Parallelität beim Hochladen",
|
||||||
"upload_details": "Upload Details",
|
"upload_details": "Upload Details",
|
||||||
"upload_dialog_info": "Willst du die ausgewählten Elemente auf dem Server sichern?",
|
"upload_dialog_info": "Willst du die ausgewählten Elemente auf dem Server sichern?",
|
||||||
"upload_dialog_title": "Element hochladen",
|
"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_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_progress": "{remaining, number} verbleibend - {processed, number}/{total, number} verarbeitet",
|
||||||
"upload_skipped_duplicates": "{count, plural, one {# doppelte Datei} other {# doppelte Dateien}} ausgelassen",
|
"upload_skipped_duplicates": "{count, plural, one {# doppelte Datei} other {# doppelte Dateien}} ausgelassen",
|
||||||
"upload_status_duplicates": "Duplikate",
|
"upload_status_duplicates": "Duplikate",
|
||||||
@@ -1954,6 +1976,7 @@
|
|||||||
"upload_success": "Hochladen erfolgreich. Aktualisiere die Seite, um neue hochgeladene Dateien zu sehen.",
|
"upload_success": "Hochladen erfolgreich. Aktualisiere die Seite, um neue hochgeladene Dateien zu sehen.",
|
||||||
"upload_to_immich": "Auf Immich hochladen ({count})",
|
"upload_to_immich": "Auf Immich hochladen ({count})",
|
||||||
"uploading": "Wird hochgeladen",
|
"uploading": "Wird hochgeladen",
|
||||||
|
"uploading_media": "Medien werden hochgeladen",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"usage": "Verwendung",
|
"usage": "Verwendung",
|
||||||
"use_biometric": "Biometrie verwenden",
|
"use_biometric": "Biometrie verwenden",
|
||||||
|
|||||||
87
i18n/el.json
@@ -166,6 +166,20 @@
|
|||||||
"metadata_settings_description": "Διαχείρηση ρυθμίσεων μεταδεδομένων",
|
"metadata_settings_description": "Διαχείρηση ρυθμίσεων μεταδεδομένων",
|
||||||
"migration_job": "Μεταφορά δεδομένων (Migration)",
|
"migration_job": "Μεταφορά δεδομένων (Migration)",
|
||||||
"migration_job_description": "Μεταφορά των εικονιδίων για αρχεία και πρόσωπα στην πιο πρόσφατη δομή αρχείων",
|
"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_paths_added": "Δεν προστέθηκαν διαδρομές",
|
||||||
"no_pattern_added": "Δεν προστέθηκε μοτίβο",
|
"no_pattern_added": "Δεν προστέθηκε μοτίβο",
|
||||||
"note_apply_storage_label_previous_assets": "Σημείωση: Για να εφαρμοστεί η Ετικέτα Αποθήκευσης σε στοιχεία που είχαν αναρτηθεί παλαιότερα, εκτέλεσε το",
|
"note_apply_storage_label_previous_assets": "Σημείωση: Για να εφαρμοστεί η Ετικέτα Αποθήκευσης σε στοιχεία που είχαν αναρτηθεί παλαιότερα, εκτέλεσε το",
|
||||||
@@ -196,6 +210,8 @@
|
|||||||
"oauth_mobile_redirect_uri": "URI Ανακατεύθυνσης για κινητά τηλέφωνα",
|
"oauth_mobile_redirect_uri": "URI Ανακατεύθυνσης για κινητά τηλέφωνα",
|
||||||
"oauth_mobile_redirect_uri_override": "Προσπέλαση URI ανακατεύθυνσης για κινητά τηλέφωνα",
|
"oauth_mobile_redirect_uri_override": "Προσπέλαση URI ανακατεύθυνσης για κινητά τηλέφωνα",
|
||||||
"oauth_mobile_redirect_uri_override_description": "Ενεργοποιήστε το όταν ο πάροχος OAuth δεν επιτρέπει μια URI για κινητά, όπως το ''{callback}''",
|
"oauth_mobile_redirect_uri_override_description": "Ενεργοποιήστε το όταν ο πάροχος OAuth δεν επιτρέπει μια URI για κινητά, όπως το ''{callback}''",
|
||||||
|
"oauth_role_claim": "Ανάθεση ρόλου",
|
||||||
|
"oauth_role_claim_description": "Αυτόματη παραχώρηση πρόσβασης διαχειριστή με βάση την ύπαρξη αυτής της ανάθεσης. Η ανάθεση μπορεί να είναι είτε 'χρήστης' είτε 'διαχειριστής'.",
|
||||||
"oauth_settings": "OAuth",
|
"oauth_settings": "OAuth",
|
||||||
"oauth_settings_description": "Διαχείριση ρυθμίσεων σύνδεσης OAuth",
|
"oauth_settings_description": "Διαχείριση ρυθμίσεων σύνδεσης OAuth",
|
||||||
"oauth_settings_more_details": "Για περισσότερες λεπτομέρειες σχετικά με αυτήν τη δυνατότητα, ανατρέξτε στην <link>τεκμηρίωση</link>.",
|
"oauth_settings_more_details": "Για περισσότερες λεπτομέρειες σχετικά με αυτήν τη δυνατότητα, ανατρέξτε στην <link>τεκμηρίωση</link>.",
|
||||||
@@ -357,10 +373,12 @@
|
|||||||
"admin_password": "Κωδικός πρόσβασης Διαχειριστή",
|
"admin_password": "Κωδικός πρόσβασης Διαχειριστή",
|
||||||
"administration": "Διαχείριση",
|
"administration": "Διαχείριση",
|
||||||
"advanced": "Για προχωρημένους",
|
"advanced": "Για προχωρημένους",
|
||||||
|
"advanced_settings_beta_timeline_subtitle": "Δοκίμασε τη νέα εμπειρία της εφαρμογής",
|
||||||
|
"advanced_settings_beta_timeline_title": "Δοκιμαστικό χρονολόγιο",
|
||||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Χρησιμοποιήστε αυτήν την επιλογή για να φιλτράρετε τα μέσα ενημέρωσης κατά τον συγχρονισμό με βάση εναλλακτικά κριτήρια. Δοκιμάστε αυτή τη δυνατότητα μόνο αν έχετε προβλήματα με την εφαρμογή που εντοπίζει όλα τα άλμπουμ.",
|
"advanced_settings_enable_alternate_media_filter_subtitle": "Χρησιμοποιήστε αυτήν την επιλογή για να φιλτράρετε τα μέσα ενημέρωσης κατά τον συγχρονισμό με βάση εναλλακτικά κριτήρια. Δοκιμάστε αυτή τη δυνατότητα μόνο αν έχετε προβλήματα με την εφαρμογή που εντοπίζει όλα τα άλμπουμ.",
|
||||||
"advanced_settings_enable_alternate_media_filter_title": "[ΠΕΙΡΑΜΑΤΙΚΟ] Χρήση εναλλακτικού φίλτρου συγχρονισμού άλμπουμ συσκευής",
|
"advanced_settings_enable_alternate_media_filter_title": "[ΠΕΙΡΑΜΑΤΙΚΟ] Χρήση εναλλακτικού φίλτρου συγχρονισμού άλμπουμ συσκευής",
|
||||||
"advanced_settings_log_level_title": "Επίπεδο σύνδεσης: {level}",
|
"advanced_settings_log_level_title": "Επίπεδο σύνδεσης: {level}",
|
||||||
"advanced_settings_prefer_remote_subtitle": "Μερικές συσκευές αργούν πολύ να φορτώσουν μικρογραφίες από αρχεία στη συσκευή. Ενεργοποιήστε αυτήν τη ρύθμιση για να φορτώνονται αντί αυτού απομακρυσμένες εικόνες.",
|
"advanced_settings_prefer_remote_subtitle": "Μερικές συσκευές αργούν πολύ να φορτώσουν μικρογραφίες από τοπικά αρχεία. Ενεργοποιήστε αυτήν τη ρύθμιση για να φορτώνονται αντί αυτού απομακρυσμένες εικόνες.",
|
||||||
"advanced_settings_prefer_remote_title": "Προτίμηση απομακρυσμένων εικόνων",
|
"advanced_settings_prefer_remote_title": "Προτίμηση απομακρυσμένων εικόνων",
|
||||||
"advanced_settings_proxy_headers_subtitle": "Καθορισμός κεφαλίδων διακομιστή μεσολάβησης που το Immich πρέπει να στέλνει με κάθε αίτημα δικτύου",
|
"advanced_settings_proxy_headers_subtitle": "Καθορισμός κεφαλίδων διακομιστή μεσολάβησης που το Immich πρέπει να στέλνει με κάθε αίτημα δικτύου",
|
||||||
"advanced_settings_proxy_headers_title": "Κεφαλίδες διακομιστή μεσολάβησης",
|
"advanced_settings_proxy_headers_title": "Κεφαλίδες διακομιστή μεσολάβησης",
|
||||||
@@ -379,6 +397,7 @@
|
|||||||
"album_cover_updated": "Το εξώφυλλο του άλμπουμ, ενημερώθηκε",
|
"album_cover_updated": "Το εξώφυλλο του άλμπουμ, ενημερώθηκε",
|
||||||
"album_delete_confirmation": "Είστε σίγουροι ότι θέλετε να διαγράψετε το άλμπουμ {album};",
|
"album_delete_confirmation": "Είστε σίγουροι ότι θέλετε να διαγράψετε το άλμπουμ {album};",
|
||||||
"album_delete_confirmation_description": "Εάν αυτό το άλμπουμ είναι κοινόχρηστο, οι άλλοι χρήστες δεν θα μπορούν να έχουν πρόσβαση.",
|
"album_delete_confirmation_description": "Εάν αυτό το άλμπουμ είναι κοινόχρηστο, οι άλλοι χρήστες δεν θα μπορούν να έχουν πρόσβαση.",
|
||||||
|
"album_deleted": "Το άλμπουμ διαγράφηκε",
|
||||||
"album_info_card_backup_album_excluded": "ΕΞΑΙΡΟΥΜΕΝΟ",
|
"album_info_card_backup_album_excluded": "ΕΞΑΙΡΟΥΜΕΝΟ",
|
||||||
"album_info_card_backup_album_included": "ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΟ",
|
"album_info_card_backup_album_included": "ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΟ",
|
||||||
"album_info_updated": "Οι πληροφορίες του άλμπουμ, ενημερώθηκαν",
|
"album_info_updated": "Οι πληροφορίες του άλμπουμ, ενημερώθηκαν",
|
||||||
@@ -388,6 +407,7 @@
|
|||||||
"album_options": "Επιλογές άλμπουμ",
|
"album_options": "Επιλογές άλμπουμ",
|
||||||
"album_remove_user": "Διαγραφή χρήστη;",
|
"album_remove_user": "Διαγραφή χρήστη;",
|
||||||
"album_remove_user_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε τον/την {user};",
|
"album_remove_user_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε τον/την {user};",
|
||||||
|
"album_search_not_found": "Δε βρέθηκαν άλμπουμ που να ταιριάζουν με την αναζήτησή σας",
|
||||||
"album_share_no_users": "Φαίνεται ότι έχετε κοινοποιήσει αυτό το άλμπουμ σε όλους τους χρήστες ή δεν έχετε χρήστες για να το κοινοποιήσετε.",
|
"album_share_no_users": "Φαίνεται ότι έχετε κοινοποιήσει αυτό το άλμπουμ σε όλους τους χρήστες ή δεν έχετε χρήστες για να το κοινοποιήσετε.",
|
||||||
"album_updated": "Το άλμπουμ, ενημερώθηκε",
|
"album_updated": "Το άλμπουμ, ενημερώθηκε",
|
||||||
"album_updated_setting_description": "Λάβετε ειδοποίηση μέσω email όταν ένα κοινόχρηστο άλμπουμ έχει νέα αρχεία",
|
"album_updated_setting_description": "Λάβετε ειδοποίηση μέσω email όταν ένα κοινόχρηστο άλμπουμ έχει νέα αρχεία",
|
||||||
@@ -407,6 +427,7 @@
|
|||||||
"albums_default_sort_order": "Προεπιλεγμένη ταξινόμηση άλμπουμ",
|
"albums_default_sort_order": "Προεπιλεγμένη ταξινόμηση άλμπουμ",
|
||||||
"albums_default_sort_order_description": "Αρχική ταξινόμηση κατά τη δημιουργία νέων άλμπουμ.",
|
"albums_default_sort_order_description": "Αρχική ταξινόμηση κατά τη δημιουργία νέων άλμπουμ.",
|
||||||
"albums_feature_description": "Συλλογές στοιχείων που μπορούν να κοινοποιηθούν σε άλλους χρήστες.",
|
"albums_feature_description": "Συλλογές στοιχείων που μπορούν να κοινοποιηθούν σε άλλους χρήστες.",
|
||||||
|
"albums_on_device_count": "Άλμπουμ στη συσκευή ({count})",
|
||||||
"all": "Όλα",
|
"all": "Όλα",
|
||||||
"all_albums": "Όλα τα άλμπουμ",
|
"all_albums": "Όλα τα άλμπουμ",
|
||||||
"all_people": "Όλα τα άτομα",
|
"all_people": "Όλα τα άτομα",
|
||||||
@@ -427,6 +448,7 @@
|
|||||||
"app_settings": "Ρυθμίσεις εφαρμογής",
|
"app_settings": "Ρυθμίσεις εφαρμογής",
|
||||||
"appears_in": "Εμφανίζεται σε",
|
"appears_in": "Εμφανίζεται σε",
|
||||||
"archive": "Αρχείο",
|
"archive": "Αρχείο",
|
||||||
|
"archive_action_prompt": "Προστέθηκαν {count} στο Αρχείο",
|
||||||
"archive_or_unarchive_photo": "Αρχειοθέτηση ή αποαρχειοθέτηση φωτογραφίας",
|
"archive_or_unarchive_photo": "Αρχειοθέτηση ή αποαρχειοθέτηση φωτογραφίας",
|
||||||
"archive_page_no_archived_assets": "Δε βρέθηκαν αρχειοθετημένα στοιχεία",
|
"archive_page_no_archived_assets": "Δε βρέθηκαν αρχειοθετημένα στοιχεία",
|
||||||
"archive_page_title": "Αρχείο ({count})",
|
"archive_page_title": "Αρχείο ({count})",
|
||||||
@@ -489,6 +511,7 @@
|
|||||||
"back_close_deselect": "Πίσω, κλείσιμο ή αποεπιλογή",
|
"back_close_deselect": "Πίσω, κλείσιμο ή αποεπιλογή",
|
||||||
"background_location_permission": "Άδεια τοποθεσίας στο παρασκήνιο",
|
"background_location_permission": "Άδεια τοποθεσίας στο παρασκήνιο",
|
||||||
"background_location_permission_content": "Το Immich για να μπορεί να αλλάζει δίκτυα όταν τρέχει στο παρασκήνιο, πρέπει *πάντα* να έχει πρόσβαση στην ακριβή τοποθεσία ώστε η εφαρμογή να μπορεί να διαβάζει το όνομα του δικτύου Wi-Fi",
|
"background_location_permission_content": "Το Immich για να μπορεί να αλλάζει δίκτυα όταν τρέχει στο παρασκήνιο, πρέπει *πάντα* να έχει πρόσβαση στην ακριβή τοποθεσία ώστε η εφαρμογή να μπορεί να διαβάζει το όνομα του δικτύου Wi-Fi",
|
||||||
|
"backup": "Αντίγραφα ασφαλείας",
|
||||||
"backup_album_selection_page_albums_device": "Άλμπουμ στη συσκευή ({count})",
|
"backup_album_selection_page_albums_device": "Άλμπουμ στη συσκευή ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Πάτημα για συμπερίληψη, διπλό πάτημα για εξαίρεση",
|
"backup_album_selection_page_albums_tap": "Πάτημα για συμπερίληψη, διπλό πάτημα για εξαίρεση",
|
||||||
"backup_album_selection_page_assets_scatter": "Τα στοιχεία μπορεί να διασκορπιστούν σε πολλά άλμπουμ. Έτσι, τα άλμπουμ μπορούν να περιληφθούν ή να εξαιρεθούν κατά τη διαδικασία δημιουργίας αντιγράφων ασφαλείας.",
|
"backup_album_selection_page_assets_scatter": "Τα στοιχεία μπορεί να διασκορπιστούν σε πολλά άλμπουμ. Έτσι, τα άλμπουμ μπορούν να περιληφθούν ή να εξαιρεθούν κατά τη διαδικασία δημιουργίας αντιγράφων ασφαλείας.",
|
||||||
@@ -552,6 +575,8 @@
|
|||||||
"backup_options_page_title": "Επιλογές αντιγράφων ασφαλείας",
|
"backup_options_page_title": "Επιλογές αντιγράφων ασφαλείας",
|
||||||
"backup_setting_subtitle": "Διαχείριση ρυθμίσεων μεταφόρτωσης στο παρασκήνιο και στο προσκήνιο",
|
"backup_setting_subtitle": "Διαχείριση ρυθμίσεων μεταφόρτωσης στο παρασκήνιο και στο προσκήνιο",
|
||||||
"backward": "Προς τα πίσω",
|
"backward": "Προς τα πίσω",
|
||||||
|
"beta_sync": "Κατάσταση Συγχρονισμού Beta (δοκιμαστική)",
|
||||||
|
"beta_sync_subtitle": "Διαχείριση του νέου συστήματος συγχρονισμού",
|
||||||
"biometric_auth_enabled": "Βιομετρική ταυτοποίηση ενεργοποιήθηκε",
|
"biometric_auth_enabled": "Βιομετρική ταυτοποίηση ενεργοποιήθηκε",
|
||||||
"biometric_locked_out": "Είστε κλειδωμένοι εκτός της βιομετρικής ταυτοποίησης",
|
"biometric_locked_out": "Είστε κλειδωμένοι εκτός της βιομετρικής ταυτοποίησης",
|
||||||
"biometric_no_options": "Δεν υπάρχουν διαθέσιμοι τρόποι βιομετρικής ταυτοποίησης",
|
"biometric_no_options": "Δεν υπάρχουν διαθέσιμοι τρόποι βιομετρικής ταυτοποίησης",
|
||||||
@@ -586,6 +611,7 @@
|
|||||||
"cancel": "Ακύρωση",
|
"cancel": "Ακύρωση",
|
||||||
"cancel_search": "Ακύρωση αναζήτησης",
|
"cancel_search": "Ακύρωση αναζήτησης",
|
||||||
"canceled": "Ακυρωμένο",
|
"canceled": "Ακυρωμένο",
|
||||||
|
"canceling": "Ακυρώνεται",
|
||||||
"cannot_merge_people": "Αδύνατη η συγχώνευση ατόμων",
|
"cannot_merge_people": "Αδύνατη η συγχώνευση ατόμων",
|
||||||
"cannot_undo_this_action": "Δεν μπορείτε να αναιρέσετε αυτήν την ενέργεια!",
|
"cannot_undo_this_action": "Δεν μπορείτε να αναιρέσετε αυτήν την ενέργεια!",
|
||||||
"cannot_update_the_description": "Αδύνατη η ενημέρωση της περιγραφής",
|
"cannot_update_the_description": "Αδύνατη η ενημέρωση της περιγραφής",
|
||||||
@@ -699,9 +725,11 @@
|
|||||||
"current_server_address": "Τρέχουσα διεύθυνση διακομιστή",
|
"current_server_address": "Τρέχουσα διεύθυνση διακομιστή",
|
||||||
"custom_locale": "Προσαρμοσμένη Τοπική Ρύθμιση",
|
"custom_locale": "Προσαρμοσμένη Τοπική Ρύθμιση",
|
||||||
"custom_locale_description": "Μορφοποιήστε τις ημερομηνίες και τους αριθμούς, σύμφωνα με τη γλώσσα και την περιοχή",
|
"custom_locale_description": "Μορφοποιήστε τις ημερομηνίες και τους αριθμούς, σύμφωνα με τη γλώσσα και την περιοχή",
|
||||||
|
"custom_url": "Προσαρμοσμένη διεύθυνση URL",
|
||||||
"daily_title_text_date": "Ε, MMM dd",
|
"daily_title_text_date": "Ε, MMM dd",
|
||||||
"daily_title_text_date_year": "Ε, MMM dd, yyyy",
|
"daily_title_text_date_year": "Ε, MMM dd, yyyy",
|
||||||
"dark": "Σκούρο",
|
"dark": "Σκούρο",
|
||||||
|
"dark_theme": "Εναλλαγή σκοτεινής εμφάνισης",
|
||||||
"date_after": "Ημερομηνία μετά",
|
"date_after": "Ημερομηνία μετά",
|
||||||
"date_and_time": "Ημερομηνία και ώρα",
|
"date_and_time": "Ημερομηνία και ώρα",
|
||||||
"date_before": "Ημερομηνία πριν",
|
"date_before": "Ημερομηνία πριν",
|
||||||
@@ -717,6 +745,8 @@
|
|||||||
"default_locale": "Προεπιλεγμένη Τοπική Ρύθμιση",
|
"default_locale": "Προεπιλεγμένη Τοπική Ρύθμιση",
|
||||||
"default_locale_description": "Μορφοποιήστε τις ημερομηνίες και τους αριθμούς με βάση την τοπική ρύθμιση του προγράμματος περιήγησής σας",
|
"default_locale_description": "Μορφοποιήστε τις ημερομηνίες και τους αριθμούς με βάση την τοπική ρύθμιση του προγράμματος περιήγησής σας",
|
||||||
"delete": "Διαγραφή",
|
"delete": "Διαγραφή",
|
||||||
|
"delete_action_confirmation_message": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο; Αυτή η ενέργεια θα το μετακινήσει στον κάδο απορριμμάτων του διακομιστή και θα εμφανιστεί μήνυμα για το αν θέλετε να το διαγράψετε και τοπικά",
|
||||||
|
"delete_action_prompt": "{count} διαγράφηκαν",
|
||||||
"delete_album": "Διαγραφή άλμπουμ",
|
"delete_album": "Διαγραφή άλμπουμ",
|
||||||
"delete_api_key_prompt": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό κλειδί API;",
|
"delete_api_key_prompt": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό κλειδί API;",
|
||||||
"delete_dialog_alert": "Αυτά τα αντικείμενα θα διαγραφούν οριστικά από το Immich και από τη συσκευή σας",
|
"delete_dialog_alert": "Αυτά τα αντικείμενα θα διαγραφούν οριστικά από το Immich και από τη συσκευή σας",
|
||||||
@@ -730,9 +760,12 @@
|
|||||||
"delete_key": "Διαγραφή κλειδιού",
|
"delete_key": "Διαγραφή κλειδιού",
|
||||||
"delete_library": "Διαγραφή Βιβλιοθήκης",
|
"delete_library": "Διαγραφή Βιβλιοθήκης",
|
||||||
"delete_link": "Διαγραφή συνδέσμου",
|
"delete_link": "Διαγραφή συνδέσμου",
|
||||||
|
"delete_local_action_prompt": "{count} διαγράφηκαν τοπικά",
|
||||||
"delete_local_dialog_ok_backed_up_only": "Διαγραφή μόνο των αντιγράφων ασφαλείας",
|
"delete_local_dialog_ok_backed_up_only": "Διαγραφή μόνο των αντιγράφων ασφαλείας",
|
||||||
"delete_local_dialog_ok_force": "Διαγραφή όπως και να έχει",
|
"delete_local_dialog_ok_force": "Διαγραφή όπως και να έχει",
|
||||||
"delete_others": "Διαγραφή υπολοίπων",
|
"delete_others": "Διαγραφή υπολοίπων",
|
||||||
|
"delete_permanently": "Διαγραφή οριστικά",
|
||||||
|
"delete_permanently_action_prompt": "{count} διαγράφηκε οριστικά",
|
||||||
"delete_shared_link": "Διαγραφή κοινόχρηστου συνδέσμου",
|
"delete_shared_link": "Διαγραφή κοινόχρηστου συνδέσμου",
|
||||||
"delete_shared_link_dialog_title": "Διαγραφή Κοινοποιημένου Συνδέσμου",
|
"delete_shared_link_dialog_title": "Διαγραφή Κοινοποιημένου Συνδέσμου",
|
||||||
"delete_tag": "Διαγραφή ετικέτας",
|
"delete_tag": "Διαγραφή ετικέτας",
|
||||||
@@ -743,6 +776,7 @@
|
|||||||
"description": "Περιγραφή",
|
"description": "Περιγραφή",
|
||||||
"description_input_hint_text": "Προσθήκη περιγραφής...",
|
"description_input_hint_text": "Προσθήκη περιγραφής...",
|
||||||
"description_input_submit_error": "Σφάλμα κατά την ενημέρωση της περιγραφής, ελέγξτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες",
|
"description_input_submit_error": "Σφάλμα κατά την ενημέρωση της περιγραφής, ελέγξτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες",
|
||||||
|
"deselect_all": "Ακύρωση όλων των επιλογών",
|
||||||
"details": "Λεπτομέρειες",
|
"details": "Λεπτομέρειες",
|
||||||
"direction": "Κατεύθυνση",
|
"direction": "Κατεύθυνση",
|
||||||
"disabled": "Απενεργοποιημένο",
|
"disabled": "Απενεργοποιημένο",
|
||||||
@@ -760,6 +794,7 @@
|
|||||||
"documentation": "Τεκμηρίωση",
|
"documentation": "Τεκμηρίωση",
|
||||||
"done": "Έγινε",
|
"done": "Έγινε",
|
||||||
"download": "Λήψη",
|
"download": "Λήψη",
|
||||||
|
"download_action_prompt": "Κατέβασμα {count} στοιχείων",
|
||||||
"download_canceled": "Η λήψη ακυρώθηκε",
|
"download_canceled": "Η λήψη ακυρώθηκε",
|
||||||
"download_complete": "Η λήψη ολοκληρώθηκε",
|
"download_complete": "Η λήψη ολοκληρώθηκε",
|
||||||
"download_enqueue": "Η λήψη τέθηκε σε ουρά",
|
"download_enqueue": "Η λήψη τέθηκε σε ουρά",
|
||||||
@@ -797,6 +832,7 @@
|
|||||||
"edit_key": "Επεξεργασία κλειδιού",
|
"edit_key": "Επεξεργασία κλειδιού",
|
||||||
"edit_link": "Επεξεργασία συνδέσμου",
|
"edit_link": "Επεξεργασία συνδέσμου",
|
||||||
"edit_location": "Επεξεργασία τοποθεσίας",
|
"edit_location": "Επεξεργασία τοποθεσίας",
|
||||||
|
"edit_location_action_prompt": "Επεξεργάστηκαν {count} τοποθεσίες",
|
||||||
"edit_location_dialog_title": "Τοποθεσία",
|
"edit_location_dialog_title": "Τοποθεσία",
|
||||||
"edit_name": "Επεξεργασία ονόματος",
|
"edit_name": "Επεξεργασία ονόματος",
|
||||||
"edit_people": "Επεξεργασία ατόμων",
|
"edit_people": "Επεξεργασία ατόμων",
|
||||||
@@ -815,6 +851,7 @@
|
|||||||
"empty_trash": "Άδειασμα κάδου απορριμμάτων",
|
"empty_trash": "Άδειασμα κάδου απορριμμάτων",
|
||||||
"empty_trash_confirmation": "Είστε σίγουροι οτι θέλετε να αδειάσετε τον κάδο απορριμμάτων; Αυτό θα αφαιρέσει μόνιμα όλα τα στοιχεία του κάδου απορριμμάτων του Immich. \nΑυτή η ενέργεια δεν μπορεί να αναιρεθεί!",
|
"empty_trash_confirmation": "Είστε σίγουροι οτι θέλετε να αδειάσετε τον κάδο απορριμμάτων; Αυτό θα αφαιρέσει μόνιμα όλα τα στοιχεία του κάδου απορριμμάτων του Immich. \nΑυτή η ενέργεια δεν μπορεί να αναιρεθεί!",
|
||||||
"enable": "Ενεργοποίηση",
|
"enable": "Ενεργοποίηση",
|
||||||
|
"enable_backup": "Ενεργοποίηση αντιγράφου ασφαλείας",
|
||||||
"enable_biometric_auth_description": "Εισάγετε τον κωδικό PIN σας για να ενεργοποιήσετε την βιομετρική ταυτοποίηση",
|
"enable_biometric_auth_description": "Εισάγετε τον κωδικό PIN σας για να ενεργοποιήσετε την βιομετρική ταυτοποίηση",
|
||||||
"enabled": "Ενεργοποιημένο",
|
"enabled": "Ενεργοποιημένο",
|
||||||
"end_date": "Τελική ημερομηνία",
|
"end_date": "Τελική ημερομηνία",
|
||||||
@@ -971,6 +1008,8 @@
|
|||||||
"explorer": "Περιηγητής",
|
"explorer": "Περιηγητής",
|
||||||
"export": "Εξαγωγή",
|
"export": "Εξαγωγή",
|
||||||
"export_as_json": "Εξαγωγή ως JSON",
|
"export_as_json": "Εξαγωγή ως JSON",
|
||||||
|
"export_database": "Εξαγωγή βάσης δεδομένων",
|
||||||
|
"export_database_description": "Εξαγωγή της SQLite βάσης δεδομένων",
|
||||||
"extension": "Επέκταση",
|
"extension": "Επέκταση",
|
||||||
"external": "Εξωτερικός",
|
"external": "Εξωτερικός",
|
||||||
"external_libraries": "Εξωτερικές βιβλιοθήκες",
|
"external_libraries": "Εξωτερικές βιβλιοθήκες",
|
||||||
@@ -982,6 +1021,7 @@
|
|||||||
"failed_to_load_assets": "Αποτυχία φόρτωσης στοιχείων",
|
"failed_to_load_assets": "Αποτυχία φόρτωσης στοιχείων",
|
||||||
"failed_to_load_folder": "Αποτυχία φόρτωσης φακέλου",
|
"failed_to_load_folder": "Αποτυχία φόρτωσης φακέλου",
|
||||||
"favorite": "Αγαπημένο",
|
"favorite": "Αγαπημένο",
|
||||||
|
"favorite_action_prompt": "Προστέθηκαν {count} στα Αγαπημένα",
|
||||||
"favorite_or_unfavorite_photo": "Ορίστε μία φωτογραφία ως αγαπημένη ή αφαιρέστε την από τα αγαπημένα",
|
"favorite_or_unfavorite_photo": "Ορίστε μία φωτογραφία ως αγαπημένη ή αφαιρέστε την από τα αγαπημένα",
|
||||||
"favorites": "Αγαπημένα",
|
"favorites": "Αγαπημένα",
|
||||||
"favorites_page_no_favorites": "Δεν βρέθηκαν αγαπημένα στοιχεία",
|
"favorites_page_no_favorites": "Δεν βρέθηκαν αγαπημένα στοιχεία",
|
||||||
@@ -1021,6 +1061,9 @@
|
|||||||
"haptic_feedback_switch": "Ενεργοποίηση απτικής ανάδρασης",
|
"haptic_feedback_switch": "Ενεργοποίηση απτικής ανάδρασης",
|
||||||
"haptic_feedback_title": "Απτική Ανάδραση",
|
"haptic_feedback_title": "Απτική Ανάδραση",
|
||||||
"has_quota": "Έχει ποσόστωση",
|
"has_quota": "Έχει ποσόστωση",
|
||||||
|
"hash_asset": "Κατακερματισμός στοιχείου",
|
||||||
|
"hashed_assets": "Κατακερματισμένα στοιχεία",
|
||||||
|
"hashing": "Κατακερματισμός",
|
||||||
"header_settings_add_header_tip": "Προσθήκη Κεφαλίδας",
|
"header_settings_add_header_tip": "Προσθήκη Κεφαλίδας",
|
||||||
"header_settings_field_validator_msg": "Η τιμή δεν μπορεί να είναι κενή",
|
"header_settings_field_validator_msg": "Η τιμή δεν μπορεί να είναι κενή",
|
||||||
"header_settings_header_name_input": "Όνομα κεφαλίδας",
|
"header_settings_header_name_input": "Όνομα κεφαλίδας",
|
||||||
@@ -1053,6 +1096,7 @@
|
|||||||
"host": "Φιλοξενία",
|
"host": "Φιλοξενία",
|
||||||
"hour": "Ώρα",
|
"hour": "Ώρα",
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
|
"idle": "Αδράνεια",
|
||||||
"ignore_icloud_photos": "Αγνοήστε τις φωτογραφίες iCloud",
|
"ignore_icloud_photos": "Αγνοήστε τις φωτογραφίες iCloud",
|
||||||
"ignore_icloud_photos_description": "Οι φωτογραφίες που είναι αποθηκευμένες στο iCloud δεν θα μεταφορτωθούν στον διακομιστή Immich",
|
"ignore_icloud_photos_description": "Οι φωτογραφίες που είναι αποθηκευμένες στο iCloud δεν θα μεταφορτωθούν στον διακομιστή Immich",
|
||||||
"image": "Εικόνα",
|
"image": "Εικόνα",
|
||||||
@@ -1110,6 +1154,7 @@
|
|||||||
"language_no_results_title": "Δε βρέθηκαν γλώσσες",
|
"language_no_results_title": "Δε βρέθηκαν γλώσσες",
|
||||||
"language_search_hint": "Αναζήτηση γλωσσών...",
|
"language_search_hint": "Αναζήτηση γλωσσών...",
|
||||||
"language_setting_description": "Επιλέξτε τη γλώσσα που προτιμάτε",
|
"language_setting_description": "Επιλέξτε τη γλώσσα που προτιμάτε",
|
||||||
|
"large_files": "Μεγάλα Αρχεία",
|
||||||
"last_seen": "Τελευταία προβολή",
|
"last_seen": "Τελευταία προβολή",
|
||||||
"latest_version": "Τελευταία Έκδοση",
|
"latest_version": "Τελευταία Έκδοση",
|
||||||
"latitude": "Γεωγραφικό πλάτος",
|
"latitude": "Γεωγραφικό πλάτος",
|
||||||
@@ -1125,16 +1170,18 @@
|
|||||||
"library_page_sort_created": "Ημερομηνία δημιουργίας",
|
"library_page_sort_created": "Ημερομηνία δημιουργίας",
|
||||||
"library_page_sort_last_modified": "Τελευταία τροποποίηση",
|
"library_page_sort_last_modified": "Τελευταία τροποποίηση",
|
||||||
"library_page_sort_title": "Τίτλος άλμπουμ",
|
"library_page_sort_title": "Τίτλος άλμπουμ",
|
||||||
|
"licenses": "Άδειες",
|
||||||
"light": "Φωτεινό",
|
"light": "Φωτεινό",
|
||||||
"like_deleted": "Το \"μου αρέσει\" διαγράφηκε",
|
"like_deleted": "Το \"μου αρέσει\" διαγράφηκε",
|
||||||
"link_motion_video": "Σύνδεσε βίντεο κίνησης",
|
"link_motion_video": "Σύνδεσε βίντεο κίνησης",
|
||||||
"link_options": "Επιλογές συνδέσμου",
|
|
||||||
"link_to_oauth": "Σύνδεση στον OAuth",
|
"link_to_oauth": "Σύνδεση στον OAuth",
|
||||||
"linked_oauth_account": "Ο OAuth λογαριασμός συνδέθηκε",
|
"linked_oauth_account": "Ο OAuth λογαριασμός συνδέθηκε",
|
||||||
"list": "Λίστα",
|
"list": "Λίστα",
|
||||||
"loading": "Φόρτωση",
|
"loading": "Φόρτωση",
|
||||||
"loading_search_results_failed": "Η φόρτωση αποτελεσμάτων αναζήτησης απέτυχε",
|
"loading_search_results_failed": "Η φόρτωση αποτελεσμάτων αναζήτησης απέτυχε",
|
||||||
|
"local": "Τοπικά",
|
||||||
"local_asset_cast_failed": "Αδυναμία μετάδοσης στοιχείου που δεν έχει ανέβει στον διακομιστή",
|
"local_asset_cast_failed": "Αδυναμία μετάδοσης στοιχείου που δεν έχει ανέβει στον διακομιστή",
|
||||||
|
"local_assets": "Τοπικά στοιχεία",
|
||||||
"local_network": "Τοπικό δίκτυο",
|
"local_network": "Τοπικό δίκτυο",
|
||||||
"local_network_sheet_info": "Η εφαρμογή θα συνδεθεί με τον διακομιστή μέσω αυτού του URL όταν χρησιμοποιείται το καθορισμένο δίκτυο Wi-Fi",
|
"local_network_sheet_info": "Η εφαρμογή θα συνδεθεί με τον διακομιστή μέσω αυτού του URL όταν χρησιμοποιείται το καθορισμένο δίκτυο Wi-Fi",
|
||||||
"location_permission": "Άδεια τοποθεσίας",
|
"location_permission": "Άδεια τοποθεσίας",
|
||||||
@@ -1191,8 +1238,7 @@
|
|||||||
"manage_your_devices": "Διαχειριστείτε τις συνδεδεμένες συσκευές σας",
|
"manage_your_devices": "Διαχειριστείτε τις συνδεδεμένες συσκευές σας",
|
||||||
"manage_your_oauth_connection": "Διαχειριστείτε τη σύνδεσή σας OAuth",
|
"manage_your_oauth_connection": "Διαχειριστείτε τη σύνδεσή σας OAuth",
|
||||||
"map": "Χάρτης",
|
"map": "Χάρτης",
|
||||||
"map_assets_in_bound": "{count} φωτογραφία",
|
"map_assets_in_bounds": "{count, plural, one {# φωτογραφία} other {# φωτογραφίες}}",
|
||||||
"map_assets_in_bounds": "{count} φωτογραφίες",
|
|
||||||
"map_cannot_get_user_location": "Δεν είναι δυνατή η λήψη της τοποθεσίας του χρήστη",
|
"map_cannot_get_user_location": "Δεν είναι δυνατή η λήψη της τοποθεσίας του χρήστη",
|
||||||
"map_location_dialog_yes": "Ναι",
|
"map_location_dialog_yes": "Ναι",
|
||||||
"map_location_picker_page_use_location": "Χρησιμοποιήστε αυτήν την τοποθεσία",
|
"map_location_picker_page_use_location": "Χρησιμοποιήστε αυτήν την τοποθεσία",
|
||||||
@@ -1244,6 +1290,7 @@
|
|||||||
"more": "Περισσότερα",
|
"more": "Περισσότερα",
|
||||||
"move": "Μετακίνηση",
|
"move": "Μετακίνηση",
|
||||||
"move_off_locked_folder": "Μετακίνηση έξω από τον κλειδωμένο φάκελο",
|
"move_off_locked_folder": "Μετακίνηση έξω από τον κλειδωμένο φάκελο",
|
||||||
|
"move_to_lock_folder_action_prompt": "Προστέθηκαν {count} στον κλειδωμένο φάκελο",
|
||||||
"move_to_locked_folder": "Μετακίνηση σε κλειδωμένο φάκελο",
|
"move_to_locked_folder": "Μετακίνηση σε κλειδωμένο φάκελο",
|
||||||
"move_to_locked_folder_confirmation": "Αυτές οι φωτογραφίες και τα βίντεο θα αφαιρεθούν από όλα τα άλμπουμ και θα μπορούν να προβληθούν μόνο από τον κλειδωμένο φάκελο",
|
"move_to_locked_folder_confirmation": "Αυτές οι φωτογραφίες και τα βίντεο θα αφαιρεθούν από όλα τα άλμπουμ και θα μπορούν να προβληθούν μόνο από τον κλειδωμένο φάκελο",
|
||||||
"moved_to_archive": "Μετακινήθηκαν {count, plural, one {# στοιχείο} other {# στοιχεία}} στο αρχείο",
|
"moved_to_archive": "Μετακινήθηκαν {count, plural, one {# στοιχείο} other {# στοιχεία}} στο αρχείο",
|
||||||
@@ -1290,6 +1337,7 @@
|
|||||||
"no_results": "Κανένα αποτέλεσμα",
|
"no_results": "Κανένα αποτέλεσμα",
|
||||||
"no_results_description": "Δοκιμάστε ένα συνώνυμο ή πιο γενική λέξη-κλειδί",
|
"no_results_description": "Δοκιμάστε ένα συνώνυμο ή πιο γενική λέξη-κλειδί",
|
||||||
"no_shared_albums_message": "Δημιουργήστε ένα άλμπουμ για να μοιράζεστε φωτογραφίες και βίντεο με άτομα στο δίκτυό σας",
|
"no_shared_albums_message": "Δημιουργήστε ένα άλμπουμ για να μοιράζεστε φωτογραφίες και βίντεο με άτομα στο δίκτυό σας",
|
||||||
|
"no_uploads_in_progress": "Καμία μεταφόρτωση σε εξέλιξη",
|
||||||
"not_in_any_album": "Σε κανένα άλμπουμ",
|
"not_in_any_album": "Σε κανένα άλμπουμ",
|
||||||
"not_selected": "Δεν επιλέχθηκε",
|
"not_selected": "Δεν επιλέχθηκε",
|
||||||
"note_apply_storage_label_to_previously_uploaded assets": "Σημείωση: Για να εφαρμόσετε την Ετικέτα Αποθήκευσης σε στοιχεία που έχουν μεταφορτωθεί προηγουμένως, εκτελέστε το",
|
"note_apply_storage_label_to_previously_uploaded assets": "Σημείωση: Για να εφαρμόσετε την Ετικέτα Αποθήκευσης σε στοιχεία που έχουν μεταφορτωθεί προηγουμένως, εκτελέστε το",
|
||||||
@@ -1327,6 +1375,7 @@
|
|||||||
"original": "πρωτότυπο",
|
"original": "πρωτότυπο",
|
||||||
"other": "Άλλες",
|
"other": "Άλλες",
|
||||||
"other_devices": "Άλλες συσκευές",
|
"other_devices": "Άλλες συσκευές",
|
||||||
|
"other_entities": "Άλλες οντότητες",
|
||||||
"other_variables": "Άλλες μεταβλητές",
|
"other_variables": "Άλλες μεταβλητές",
|
||||||
"owned": "Δικά μου",
|
"owned": "Δικά μου",
|
||||||
"owner": "Κάτοχος",
|
"owner": "Κάτοχος",
|
||||||
@@ -1458,6 +1507,7 @@
|
|||||||
"purchase_server_description_2": "Κατάσταση υποστηρικτή",
|
"purchase_server_description_2": "Κατάσταση υποστηρικτή",
|
||||||
"purchase_server_title": "Διακομιστής",
|
"purchase_server_title": "Διακομιστής",
|
||||||
"purchase_settings_server_activated": "Η διαχείριση του κλειδιού προϊόντος του διακομιστή γίνεται από τον διαχειριστή",
|
"purchase_settings_server_activated": "Η διαχείριση του κλειδιού προϊόντος του διακομιστή γίνεται από τον διαχειριστή",
|
||||||
|
"queue_status": "Τοποθέτηση στη ουρά {count} από {total}",
|
||||||
"rating": "Αξιολόγηση με αστέρια",
|
"rating": "Αξιολόγηση με αστέρια",
|
||||||
"rating_clear": "Εκκαθάριση αξιολόγησης",
|
"rating_clear": "Εκκαθάριση αξιολόγησης",
|
||||||
"rating_count": "{count, plural, one {# αστέρι} other {# αστέρια}}",
|
"rating_count": "{count, plural, one {# αστέρι} other {# αστέρια}}",
|
||||||
@@ -1486,6 +1536,8 @@
|
|||||||
"refreshing_faces": "Ανανεώνονται πρόσωπα",
|
"refreshing_faces": "Ανανεώνονται πρόσωπα",
|
||||||
"refreshing_metadata": "Τα μεταδεδομένα ανανεώνονται",
|
"refreshing_metadata": "Τα μεταδεδομένα ανανεώνονται",
|
||||||
"regenerating_thumbnails": "Οι μικρογραφίες αναγεννώνται",
|
"regenerating_thumbnails": "Οι μικρογραφίες αναγεννώνται",
|
||||||
|
"remote": "Απομακρυσμένος",
|
||||||
|
"remote_assets": "Απομακρυσμένα στοιχεία",
|
||||||
"remove": "Αφαίρεση",
|
"remove": "Αφαίρεση",
|
||||||
"remove_assets_album_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count, plural, one {# στοιχείο} other {# στοιχεία}} από το άλμπουμ;",
|
"remove_assets_album_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count, plural, one {# στοιχείο} other {# στοιχεία}} από το άλμπουμ;",
|
||||||
"remove_assets_shared_link_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count, plural, one {# στοιχείο} other {# στοιχεία}} από αυτόν τον κοινόχρηστο σύνδεσμο;",
|
"remove_assets_shared_link_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count, plural, one {# στοιχείο} other {# στοιχεία}} από αυτόν τον κοινόχρηστο σύνδεσμο;",
|
||||||
@@ -1493,7 +1545,9 @@
|
|||||||
"remove_custom_date_range": "Αφαίρεση προσαρμοσμένης χρονικής περιόδου",
|
"remove_custom_date_range": "Αφαίρεση προσαρμοσμένης χρονικής περιόδου",
|
||||||
"remove_deleted_assets": "Αφαίρεση Διεγραμμένων Στοιχείων",
|
"remove_deleted_assets": "Αφαίρεση Διεγραμμένων Στοιχείων",
|
||||||
"remove_from_album": "Αφαίρεση από το άλμπουμ",
|
"remove_from_album": "Αφαίρεση από το άλμπουμ",
|
||||||
|
"remove_from_album_action_prompt": "{count} αφαιρέθηκαν από το άλμπουμ",
|
||||||
"remove_from_favorites": "Αφαίρεση από τα αγαπημένα",
|
"remove_from_favorites": "Αφαίρεση από τα αγαπημένα",
|
||||||
|
"remove_from_lock_folder_action_prompt": "{count} αφαιρέθηκαν από τον κλειδωμένο φάκελο",
|
||||||
"remove_from_locked_folder": "Αφαίρεση από κλειδωμένο φάκελο",
|
"remove_from_locked_folder": "Αφαίρεση από κλειδωμένο φάκελο",
|
||||||
"remove_from_locked_folder_confirmation": "Είστε σίγουροι ότι θέλετε να μετακινήσετε αυτές τις φωτογραφίες και τα βίντεο από τον κλειδωμένο φάκελο; Θα είναι πλέον ορατές στη βιβλιοθήκη σας.",
|
"remove_from_locked_folder_confirmation": "Είστε σίγουροι ότι θέλετε να μετακινήσετε αυτές τις φωτογραφίες και τα βίντεο από τον κλειδωμένο φάκελο; Θα είναι πλέον ορατές στη βιβλιοθήκη σας.",
|
||||||
"remove_from_shared_link": "Αφαίρεση από τον κοινόχρηστο σύνδεσμο",
|
"remove_from_shared_link": "Αφαίρεση από τον κοινόχρηστο σύνδεσμο",
|
||||||
@@ -1521,19 +1575,25 @@
|
|||||||
"reset_password": "Επαναφορά κωδικού πρόσβασης",
|
"reset_password": "Επαναφορά κωδικού πρόσβασης",
|
||||||
"reset_people_visibility": "Επαναφορά προβολής ατόμων",
|
"reset_people_visibility": "Επαναφορά προβολής ατόμων",
|
||||||
"reset_pin_code": "Επαναφορά κωδικού PIN",
|
"reset_pin_code": "Επαναφορά κωδικού PIN",
|
||||||
|
"reset_sqlite": "Επαναφορά SQLite βάσης δεδομένων",
|
||||||
|
"reset_sqlite_confirmation": "Είσαι σίγουρος ότι θέλεις να επαναφέρεις τη βάση δεδομένων SQLite; Θα χρειαστεί να κάνεις αποσύνδεση και επανασύνδεση για να επανασυγχρονίσεις τα δεδομένα",
|
||||||
|
"reset_sqlite_success": "Η επαναφορά της SQLite βάσης δεδομένων ολοκληρώθηκε με επιτυχία",
|
||||||
"reset_to_default": "Επαναφορά στις προεπιλογές",
|
"reset_to_default": "Επαναφορά στις προεπιλογές",
|
||||||
"resolve_duplicates": "Επίλυση διπλοτύπων",
|
"resolve_duplicates": "Επίλυση διπλοτύπων",
|
||||||
"resolved_all_duplicates": "Επιλύθηκαν όλα τα διπλότυπα",
|
"resolved_all_duplicates": "Επιλύθηκαν όλα τα διπλότυπα",
|
||||||
"restore": "Ανάκτηση",
|
"restore": "Ανάκτηση",
|
||||||
"restore_all": "Ανάκτηση όλων",
|
"restore_all": "Ανάκτηση όλων",
|
||||||
|
"restore_trash_action_prompt": "{count} ανακτήθηκαν από τα απορρίμματα",
|
||||||
"restore_user": "Επαναφορά χρήστη",
|
"restore_user": "Επαναφορά χρήστη",
|
||||||
"restored_asset": "Ανακτήθηκε το αρχείο",
|
"restored_asset": "Ανακτήθηκε το αρχείο",
|
||||||
"resume": "Συνέχιση",
|
"resume": "Συνέχιση",
|
||||||
"retry_upload": "Επανάληψη ανεβάσματος",
|
"retry_upload": "Επανάληψη ανεβάσματος",
|
||||||
"review_duplicates": "Προβολή διπλότυπων",
|
"review_duplicates": "Προβολή διπλότυπων",
|
||||||
|
"review_large_files": "Επισκόπηση μεγάλων αρχείων",
|
||||||
"role": "Ρόλος",
|
"role": "Ρόλος",
|
||||||
"role_editor": "Επεξεργαστής",
|
"role_editor": "Επεξεργαστής",
|
||||||
"role_viewer": "Θεατής",
|
"role_viewer": "Θεατής",
|
||||||
|
"running": "Σε λειτουργία",
|
||||||
"save": "Αποθήκευση",
|
"save": "Αποθήκευση",
|
||||||
"save_to_gallery": "Αποθήκευση στη συλλογή",
|
"save_to_gallery": "Αποθήκευση στη συλλογή",
|
||||||
"saved_api_key": "Αποθηκευμένο API key",
|
"saved_api_key": "Αποθηκευμένο API key",
|
||||||
@@ -1665,6 +1725,7 @@
|
|||||||
"settings_saved": "Οι ρυθμίσεις αποθηκεύτηκαν",
|
"settings_saved": "Οι ρυθμίσεις αποθηκεύτηκαν",
|
||||||
"setup_pin_code": "Ρύθμιση κωδικού PIN",
|
"setup_pin_code": "Ρύθμιση κωδικού PIN",
|
||||||
"share": "Κοινοποίηση",
|
"share": "Κοινοποίηση",
|
||||||
|
"share_action_prompt": "Κοινή χρήση {count} στοιχείων",
|
||||||
"share_add_photos": "Προσθήκη φωτογραφιών",
|
"share_add_photos": "Προσθήκη φωτογραφιών",
|
||||||
"share_assets_selected": "{count} επιλεγμένα",
|
"share_assets_selected": "{count} επιλεγμένα",
|
||||||
"share_dialog_preparing": "Προετοιμασία...",
|
"share_dialog_preparing": "Προετοιμασία...",
|
||||||
@@ -1686,6 +1747,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "Αντιγράφηκε στο πρόχειρο",
|
"shared_link_clipboard_copied_massage": "Αντιγράφηκε στο πρόχειρο",
|
||||||
"shared_link_clipboard_text": "Σύνδεσμος: {link}\nΚωδικός πρόσβασης: {password}",
|
"shared_link_clipboard_text": "Σύνδεσμος: {link}\nΚωδικός πρόσβασης: {password}",
|
||||||
"shared_link_create_error": "Σφάλμα κατά τη δημιουργία κοινόχρηστου συνδέσμου",
|
"shared_link_create_error": "Σφάλμα κατά τη δημιουργία κοινόχρηστου συνδέσμου",
|
||||||
|
"shared_link_custom_url_description": "Αποκτήστε πρόσβαση σε αυτόν τον κοινόχρηστο σύνδεσμο με μια προσαρμοσμένη διεύθυνση URL",
|
||||||
"shared_link_edit_description_hint": "Εισαγάγετε την περιγραφή της κοινής χρήσης",
|
"shared_link_edit_description_hint": "Εισαγάγετε την περιγραφή της κοινής χρήσης",
|
||||||
"shared_link_edit_expire_after_option_day": "1 ημέρα",
|
"shared_link_edit_expire_after_option_day": "1 ημέρα",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} ημέρες",
|
"shared_link_edit_expire_after_option_days": "{count} ημέρες",
|
||||||
@@ -1711,6 +1773,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "Διαχείριση Κοινόχρηστων Συνδέσμων",
|
"shared_link_manage_links": "Διαχείριση Κοινόχρηστων Συνδέσμων",
|
||||||
"shared_link_options": "Επιλογές κοινόχρηστου συνδέσμου",
|
"shared_link_options": "Επιλογές κοινόχρηστου συνδέσμου",
|
||||||
|
"shared_link_password_description": "Απαίτηση κωδικού για πρόσβαση στον κοινοποιημένο σύνδεσμο",
|
||||||
"shared_links": "Κοινόχρηστοι σύνδεσμοι",
|
"shared_links": "Κοινόχρηστοι σύνδεσμοι",
|
||||||
"shared_links_description": "Μοιραστείτε φωτογραφίες και βίντεο με σύνδεσμο",
|
"shared_links_description": "Μοιραστείτε φωτογραφίες και βίντεο με σύνδεσμο",
|
||||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# κοινόχρηστες φωτογραφίες & βίντεο.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, other {# κοινόχρηστες φωτογραφίες & βίντεο.}}",
|
||||||
@@ -1766,6 +1829,7 @@
|
|||||||
"sort_title": "Τίτλος",
|
"sort_title": "Τίτλος",
|
||||||
"source": "Πηγή",
|
"source": "Πηγή",
|
||||||
"stack": "Στοίβα",
|
"stack": "Στοίβα",
|
||||||
|
"stack_action_prompt": "{count} συσσωρεύτηκαν",
|
||||||
"stack_duplicates": "Στοίβαξη διπλότυπων",
|
"stack_duplicates": "Στοίβαξη διπλότυπων",
|
||||||
"stack_select_one_photo": "Επιλέξτε μια κύρια φωτογραφία για τη στοίβαξη",
|
"stack_select_one_photo": "Επιλέξτε μια κύρια φωτογραφία για τη στοίβαξη",
|
||||||
"stack_selected_photos": "Στοίβαγμα επιλεγμένων φωτογραφιών",
|
"stack_selected_photos": "Στοίβαγμα επιλεγμένων φωτογραφιών",
|
||||||
@@ -1785,6 +1849,7 @@
|
|||||||
"storage_quota": "Ποσοστό αποθηκευτικού χώρου",
|
"storage_quota": "Ποσοστό αποθηκευτικού χώρου",
|
||||||
"storage_usage": "{used} από {available} σε χρήση",
|
"storage_usage": "{used} από {available} σε χρήση",
|
||||||
"submit": "Υποβολή",
|
"submit": "Υποβολή",
|
||||||
|
"success": "Επιτυχία",
|
||||||
"suggestions": "Προτάσεις",
|
"suggestions": "Προτάσεις",
|
||||||
"sunrise_on_the_beach": "Ηλιοβασίλεμα στην παραλία",
|
"sunrise_on_the_beach": "Ηλιοβασίλεμα στην παραλία",
|
||||||
"support": "Υποστήριξη",
|
"support": "Υποστήριξη",
|
||||||
@@ -1794,6 +1859,8 @@
|
|||||||
"sync": "Συγχρονισμός",
|
"sync": "Συγχρονισμός",
|
||||||
"sync_albums": "Συγχρονισμός άλμπουμ",
|
"sync_albums": "Συγχρονισμός άλμπουμ",
|
||||||
"sync_albums_manual_subtitle": "Συγχρονίστε όλα τα μεταφορτωμένα βίντεο και φωτογραφίες με τα επιλεγμένα εφεδρικά άλμπουμ",
|
"sync_albums_manual_subtitle": "Συγχρονίστε όλα τα μεταφορτωμένα βίντεο και φωτογραφίες με τα επιλεγμένα εφεδρικά άλμπουμ",
|
||||||
|
"sync_local": "Τοπικός Συγχρονισμός",
|
||||||
|
"sync_remote": "Απομακρυσμένος Συγχρονισμός",
|
||||||
"sync_upload_album_setting_subtitle": "Δημιουργήστε και ανεβάστε τις φωτογραφίες και τα βίντεό σας στα επιλεγμένα άλμπουμ στο Immich",
|
"sync_upload_album_setting_subtitle": "Δημιουργήστε και ανεβάστε τις φωτογραφίες και τα βίντεό σας στα επιλεγμένα άλμπουμ στο Immich",
|
||||||
"tag": "Ετικέτα",
|
"tag": "Ετικέτα",
|
||||||
"tag_assets": "Ετικετοποίηση στοιχείων",
|
"tag_assets": "Ετικετοποίηση στοιχείων",
|
||||||
@@ -1804,6 +1871,7 @@
|
|||||||
"tag_updated": "Ενημερώθηκε η ετικέτα: {tag}",
|
"tag_updated": "Ενημερώθηκε η ετικέτα: {tag}",
|
||||||
"tagged_assets": "Ετικετοποιημένο/α {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
"tagged_assets": "Ετικετοποιημένο/α {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
||||||
"tags": "Ετικέτες",
|
"tags": "Ετικέτες",
|
||||||
|
"tap_to_run_job": "Πατήστε για να ξεκινήσει η εργασία",
|
||||||
"template": "Πρότυπο",
|
"template": "Πρότυπο",
|
||||||
"theme": "Θέμα",
|
"theme": "Θέμα",
|
||||||
"theme_selection": "Επιλογή θέματος",
|
"theme_selection": "Επιλογή θέματος",
|
||||||
@@ -1836,6 +1904,7 @@
|
|||||||
"total": "Σύνολο",
|
"total": "Σύνολο",
|
||||||
"total_usage": "Συνολικη χρηση",
|
"total_usage": "Συνολικη χρηση",
|
||||||
"trash": "Κάδος απορριμμάτων",
|
"trash": "Κάδος απορριμμάτων",
|
||||||
|
"trash_action_prompt": "{count} μετακινήθηκαν στα απορρίμματα",
|
||||||
"trash_all": "Διαγραφή Όλων",
|
"trash_all": "Διαγραφή Όλων",
|
||||||
"trash_count": "Διαγραφή {count, number}",
|
"trash_count": "Διαγραφή {count, number}",
|
||||||
"trash_delete_asset": "Διαγραφή/Οριστ. Διαγραφή Αντικειμένου",
|
"trash_delete_asset": "Διαγραφή/Οριστ. Διαγραφή Αντικειμένου",
|
||||||
@@ -1853,9 +1922,11 @@
|
|||||||
"unable_to_change_pin_code": "Αδυναμία αλλαγής κωδικού PIN",
|
"unable_to_change_pin_code": "Αδυναμία αλλαγής κωδικού PIN",
|
||||||
"unable_to_setup_pin_code": "Αδυναμία ρύθμισης κωδικού PIN",
|
"unable_to_setup_pin_code": "Αδυναμία ρύθμισης κωδικού PIN",
|
||||||
"unarchive": "Αναίρεση αρχειοθέτησης",
|
"unarchive": "Αναίρεση αρχειοθέτησης",
|
||||||
|
"unarchive_action_prompt": "{count} αφαιρέθηκαν από το Αρχείο",
|
||||||
"unarchived_count": "{count, plural, other {Αρχειοθετήσεις αναιρέθηκαν #}}",
|
"unarchived_count": "{count, plural, other {Αρχειοθετήσεις αναιρέθηκαν #}}",
|
||||||
"undo": "Αναίρεση",
|
"undo": "Αναίρεση",
|
||||||
"unfavorite": "Αποεπιλογή από τα αγαπημένα",
|
"unfavorite": "Αποεπιλογή από τα αγαπημένα",
|
||||||
|
"unfavorite_action_prompt": "{count} αφαιρέθηκαν από τα Αγαπημένα",
|
||||||
"unhide_person": "Αναίρεση απόκρυψης ατόμου",
|
"unhide_person": "Αναίρεση απόκρυψης ατόμου",
|
||||||
"unknown": "Άγνωστο",
|
"unknown": "Άγνωστο",
|
||||||
"unknown_country": "Άγνωστη Χώρα",
|
"unknown_country": "Άγνωστη Χώρα",
|
||||||
@@ -1873,15 +1944,20 @@
|
|||||||
"unselect_all_duplicates": "Αποεπιλογή όλων των διπλότυπων",
|
"unselect_all_duplicates": "Αποεπιλογή όλων των διπλότυπων",
|
||||||
"unselect_all_in": "Αποεπιλογή όλων στο {group}",
|
"unselect_all_in": "Αποεπιλογή όλων στο {group}",
|
||||||
"unstack": "Αποστοίβαξη",
|
"unstack": "Αποστοίβαξη",
|
||||||
|
"unstack_action_prompt": "{count} αποσυσσωρεύτηκαν",
|
||||||
"unstacked_assets_count": "Αποστοιβάξατε {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
"unstacked_assets_count": "Αποστοιβάξατε {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
||||||
|
"untagged": "Χωρίς ετικέτα",
|
||||||
"up_next": "Ακολουθεί",
|
"up_next": "Ακολουθεί",
|
||||||
"updated_at": "Ενημερωμένο",
|
"updated_at": "Ενημερωμένο",
|
||||||
"updated_password": "Ο κωδικός πρόσβασης ενημερώθηκε",
|
"updated_password": "Ο κωδικός πρόσβασης ενημερώθηκε",
|
||||||
"upload": "Μεταφόρτωση",
|
"upload": "Μεταφόρτωση",
|
||||||
|
"upload_action_prompt": "{count} τοποθετήθηκαν στην ουρά για μεταφόρτωση",
|
||||||
"upload_concurrency": "Ταυτόχρονη μεταφόρτωση",
|
"upload_concurrency": "Ταυτόχρονη μεταφόρτωση",
|
||||||
|
"upload_details": "Λεπτομέρειες μεταφόρτωσης",
|
||||||
"upload_dialog_info": "Θέλετε να αντιγράψετε (κάνετε backup) τα επιλεγμένo(α) στοιχείο(α) στο διακομιστή;",
|
"upload_dialog_info": "Θέλετε να αντιγράψετε (κάνετε backup) τα επιλεγμένo(α) στοιχείο(α) στο διακομιστή;",
|
||||||
"upload_dialog_title": "Ανέβασμα στοιχείου",
|
"upload_dialog_title": "Ανέβασμα στοιχείου",
|
||||||
"upload_errors": "Η μεταφόρτωση ολοκληρώθηκε με {count, plural, one {# σφάλμα} other {# σφάλματα}}, ανανεώστε τη σελίδα για να δείτε νέα στοιχεία μεταφόρτωσης.",
|
"upload_errors": "Η μεταφόρτωση ολοκληρώθηκε με {count, plural, one {# σφάλμα} other {# σφάλματα}}, ανανεώστε τη σελίδα για να δείτε νέα στοιχεία μεταφόρτωσης.",
|
||||||
|
"upload_finished": "Ολοκλήρωση μεταφόρτωσης",
|
||||||
"upload_progress": "Απομένουν {remaining, number} - Ολοκληρώθηκαν {processed, number}/{total, number}",
|
"upload_progress": "Απομένουν {remaining, number} - Ολοκληρώθηκαν {processed, number}/{total, number}",
|
||||||
"upload_skipped_duplicates": "Παραλείφθηκαν {count, plural, one {# διπλότυπο στοιχείο} other {# διπλότυπα στοιχεία}}",
|
"upload_skipped_duplicates": "Παραλείφθηκαν {count, plural, one {# διπλότυπο στοιχείο} other {# διπλότυπα στοιχεία}}",
|
||||||
"upload_status_duplicates": "Διπλότυπα",
|
"upload_status_duplicates": "Διπλότυπα",
|
||||||
@@ -1890,6 +1966,7 @@
|
|||||||
"upload_success": "Η μεταφόρτωση ολοκληρώθηκε, ανανεώστε τη σελίδα για να δείτε τα νέα αντικείμενα.",
|
"upload_success": "Η μεταφόρτωση ολοκληρώθηκε, ανανεώστε τη σελίδα για να δείτε τα νέα αντικείμενα.",
|
||||||
"upload_to_immich": "Μεταφόρτωση στο Immich ({count})",
|
"upload_to_immich": "Μεταφόρτωση στο Immich ({count})",
|
||||||
"uploading": "Μεταφορτώνεται",
|
"uploading": "Μεταφορτώνεται",
|
||||||
|
"uploading_media": "Μεταφόρτωση πολυμέσων",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"usage": "Χρήση",
|
"usage": "Χρήση",
|
||||||
"use_biometric": "Χρήση βιομετρικών στοιχείων",
|
"use_biometric": "Χρήση βιομετρικών στοιχείων",
|
||||||
@@ -1910,6 +1987,7 @@
|
|||||||
"user_usage_stats_description": "Προβολή στατιστικών χρήσης λογαριασμού",
|
"user_usage_stats_description": "Προβολή στατιστικών χρήσης λογαριασμού",
|
||||||
"username": "Όνομα Χρήστη",
|
"username": "Όνομα Χρήστη",
|
||||||
"users": "Χρήστες",
|
"users": "Χρήστες",
|
||||||
|
"users_added_to_album_count": "Προστέθηκε {count, plural, one {# χρήστης} other {# χρήστες}} στο άλμπουμ",
|
||||||
"utilities": "Βοηθητικά προγράμματα",
|
"utilities": "Βοηθητικά προγράμματα",
|
||||||
"validate": "Επικύρωση",
|
"validate": "Επικύρωση",
|
||||||
"validate_endpoint_error": "Παρακαλώ εισάγετε ένα έγκυρο URL",
|
"validate_endpoint_error": "Παρακαλώ εισάγετε ένα έγκυρο URL",
|
||||||
@@ -1928,6 +2006,7 @@
|
|||||||
"view_album": "Προβολή Άλμπουμ",
|
"view_album": "Προβολή Άλμπουμ",
|
||||||
"view_all": "Προβολή Όλων",
|
"view_all": "Προβολή Όλων",
|
||||||
"view_all_users": "Προβολή όλων των χρηστών",
|
"view_all_users": "Προβολή όλων των χρηστών",
|
||||||
|
"view_details": "Προβολή Λεπτομερειών",
|
||||||
"view_in_timeline": "Προβολή στο χρονοδιάγραμμα",
|
"view_in_timeline": "Προβολή στο χρονοδιάγραμμα",
|
||||||
"view_link": "Προβολή σύνδεσμου",
|
"view_link": "Προβολή σύνδεσμου",
|
||||||
"view_links": "Προβολή συνδέσμων",
|
"view_links": "Προβολή συνδέσμων",
|
||||||
|
|||||||
66
i18n/en.json
@@ -14,6 +14,7 @@
|
|||||||
"add_a_location": "Add a location",
|
"add_a_location": "Add a location",
|
||||||
"add_a_name": "Add a name",
|
"add_a_name": "Add a name",
|
||||||
"add_a_title": "Add a title",
|
"add_a_title": "Add a title",
|
||||||
|
"add_birthday": "Add a birthday",
|
||||||
"add_endpoint": "Add endpoint",
|
"add_endpoint": "Add endpoint",
|
||||||
"add_exclusion_pattern": "Add exclusion pattern",
|
"add_exclusion_pattern": "Add exclusion pattern",
|
||||||
"add_import_path": "Add import path",
|
"add_import_path": "Add import path",
|
||||||
@@ -27,6 +28,9 @@
|
|||||||
"add_to_album": "Add to album",
|
"add_to_album": "Add to album",
|
||||||
"add_to_album_bottom_sheet_added": "Added to {album}",
|
"add_to_album_bottom_sheet_added": "Added to {album}",
|
||||||
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
|
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
|
||||||
|
"add_to_album_toggle": "Toggle selection for {album}",
|
||||||
|
"add_to_albums": "Add to albums",
|
||||||
|
"add_to_albums_count": "Add to albums ({count})",
|
||||||
"add_to_shared_album": "Add to shared album",
|
"add_to_shared_album": "Add to shared album",
|
||||||
"add_url": "Add URL",
|
"add_url": "Add URL",
|
||||||
"added_to_archive": "Added to archive",
|
"added_to_archive": "Added to archive",
|
||||||
@@ -44,6 +48,13 @@
|
|||||||
"backup_database": "Create Database Dump",
|
"backup_database": "Create Database Dump",
|
||||||
"backup_database_enable_description": "Enable database dumps",
|
"backup_database_enable_description": "Enable database dumps",
|
||||||
"backup_keep_last_amount": "Amount of previous dumps to keep",
|
"backup_keep_last_amount": "Amount of previous dumps to keep",
|
||||||
|
"backup_onboarding_1_description": "offsite copy in the cloud or at another physical location.",
|
||||||
|
"backup_onboarding_2_description": "local copies on different devices. This includes the main files and a backup of those files locally.",
|
||||||
|
"backup_onboarding_3_description": "total copies of your data, including the original files. This includes 1 offsite copy and 2 local copies.",
|
||||||
|
"backup_onboarding_description": "A <backblaze-link>3-2-1 backup strategy</backblaze-link> is recommended to protect your data. You should keep copies of your uploaded photos/videos as well as the Immich database for a comprehensive backup solution.",
|
||||||
|
"backup_onboarding_footer": "For more information about backing up Immich, please refer to the <link>documentation</link>.",
|
||||||
|
"backup_onboarding_parts_title": "A 3-2-1 backup includes:",
|
||||||
|
"backup_onboarding_title": "Backups",
|
||||||
"backup_settings": "Database Dump Settings",
|
"backup_settings": "Database Dump Settings",
|
||||||
"backup_settings_description": "Manage database dump settings.",
|
"backup_settings_description": "Manage database dump settings.",
|
||||||
"cleared_jobs": "Cleared jobs for: {job}",
|
"cleared_jobs": "Cleared jobs for: {job}",
|
||||||
@@ -347,6 +358,9 @@
|
|||||||
"trash_number_of_days_description": "Number of days to keep the assets in trash before permanently removing them",
|
"trash_number_of_days_description": "Number of days to keep the assets in trash before permanently removing them",
|
||||||
"trash_settings": "Trash Settings",
|
"trash_settings": "Trash Settings",
|
||||||
"trash_settings_description": "Manage trash settings",
|
"trash_settings_description": "Manage trash settings",
|
||||||
|
"unlink_all_oauth_accounts": "Unlink all OAuth accounts",
|
||||||
|
"unlink_all_oauth_accounts_description": "Remember to unlink all OAuth accounts before migrating to a new provider.",
|
||||||
|
"unlink_all_oauth_accounts_prompt": "Are you sure you want to unlink all OAuth accounts? This will reset the OAuth ID for each user and cannot be undone.",
|
||||||
"user_cleanup_job": "User cleanup",
|
"user_cleanup_job": "User cleanup",
|
||||||
"user_delete_delay": "<b>{user}</b>'s account and assets will be scheduled for permanent deletion in {delay, plural, one {# day} other {# days}}.",
|
"user_delete_delay": "<b>{user}</b>'s account and assets will be scheduled for permanent deletion in {delay, plural, one {# day} other {# days}}.",
|
||||||
"user_delete_delay_settings": "Delete delay",
|
"user_delete_delay_settings": "Delete delay",
|
||||||
@@ -486,7 +500,9 @@
|
|||||||
"assets": "Assets",
|
"assets": "Assets",
|
||||||
"assets_added_count": "Added {count, plural, one {# asset} other {# assets}}",
|
"assets_added_count": "Added {count, plural, one {# asset} other {# assets}}",
|
||||||
"assets_added_to_album_count": "Added {count, plural, one {# asset} other {# assets}} to the album",
|
"assets_added_to_album_count": "Added {count, plural, one {# asset} other {# assets}} to the album",
|
||||||
|
"assets_added_to_albums_count": "Added {assetTotal} assets to {albumTotal} albums",
|
||||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} cannot be added to the album",
|
"assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} cannot be added to the album",
|
||||||
|
"assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} cannot be added to any of the albums",
|
||||||
"assets_count": "{count, plural, one {# asset} other {# assets}}",
|
"assets_count": "{count, plural, one {# asset} other {# assets}}",
|
||||||
"assets_deleted_permanently": "{count} asset(s) deleted permanently",
|
"assets_deleted_permanently": "{count} asset(s) deleted permanently",
|
||||||
"assets_deleted_permanently_from_server": "{count} asset(s) deleted permanently from the Immich server",
|
"assets_deleted_permanently_from_server": "{count} asset(s) deleted permanently from the Immich server",
|
||||||
@@ -503,6 +519,7 @@
|
|||||||
"assets_trashed_count": "Trashed {count, plural, one {# asset} other {# assets}}",
|
"assets_trashed_count": "Trashed {count, plural, one {# asset} other {# assets}}",
|
||||||
"assets_trashed_from_server": "{count} asset(s) trashed from the Immich server",
|
"assets_trashed_from_server": "{count} asset(s) trashed from the Immich server",
|
||||||
"assets_were_part_of_album_count": "{count, plural, one {Asset was} other {Assets were}} already part of the album",
|
"assets_were_part_of_album_count": "{count, plural, one {Asset was} other {Assets were}} already part of the album",
|
||||||
|
"assets_were_part_of_albums_count": "{count, plural, one {Asset was} other {Assets were}} already part of the albums",
|
||||||
"authorized_devices": "Authorized Devices",
|
"authorized_devices": "Authorized Devices",
|
||||||
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
|
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
|
||||||
"automatic_endpoint_switching_title": "Automatic URL switching",
|
"automatic_endpoint_switching_title": "Automatic URL switching",
|
||||||
@@ -511,6 +528,7 @@
|
|||||||
"back_close_deselect": "Back, close, or deselect",
|
"back_close_deselect": "Back, close, or deselect",
|
||||||
"background_location_permission": "Background location permission",
|
"background_location_permission": "Background location permission",
|
||||||
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
|
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
|
||||||
|
"backup": "Backup",
|
||||||
"backup_album_selection_page_albums_device": "Albums on device ({count})",
|
"backup_album_selection_page_albums_device": "Albums on device ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
|
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
|
||||||
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
|
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
|
||||||
@@ -571,8 +589,10 @@
|
|||||||
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
|
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
|
||||||
"backup_manual_success": "Success",
|
"backup_manual_success": "Success",
|
||||||
"backup_manual_title": "Upload status",
|
"backup_manual_title": "Upload status",
|
||||||
|
"backup_options": "Backup Options",
|
||||||
"backup_options_page_title": "Backup options",
|
"backup_options_page_title": "Backup options",
|
||||||
"backup_setting_subtitle": "Manage background and foreground upload settings",
|
"backup_setting_subtitle": "Manage background and foreground upload settings",
|
||||||
|
"backup_settings_subtitle": "Manage upload settings",
|
||||||
"backward": "Backward",
|
"backward": "Backward",
|
||||||
"beta_sync": "Beta Sync Status",
|
"beta_sync": "Beta Sync Status",
|
||||||
"beta_sync_subtitle": "Manage the new sync system",
|
"beta_sync_subtitle": "Manage the new sync system",
|
||||||
@@ -642,6 +662,7 @@
|
|||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"clear_all": "Clear all",
|
"clear_all": "Clear all",
|
||||||
"clear_all_recent_searches": "Clear all recent searches",
|
"clear_all_recent_searches": "Clear all recent searches",
|
||||||
|
"clear_file_cache": "Clear File Cache",
|
||||||
"clear_message": "Clear message",
|
"clear_message": "Clear message",
|
||||||
"clear_value": "Clear value",
|
"clear_value": "Clear value",
|
||||||
"client_cert_dialog_msg_confirm": "OK",
|
"client_cert_dialog_msg_confirm": "OK",
|
||||||
@@ -712,6 +733,7 @@
|
|||||||
"create_new_user": "Create new user",
|
"create_new_user": "Create new user",
|
||||||
"create_shared_album_page_share_add_assets": "ADD ASSETS",
|
"create_shared_album_page_share_add_assets": "ADD ASSETS",
|
||||||
"create_shared_album_page_share_select_photos": "Select Photos",
|
"create_shared_album_page_share_select_photos": "Select Photos",
|
||||||
|
"create_shared_link": "Create shared link",
|
||||||
"create_tag": "Create tag",
|
"create_tag": "Create tag",
|
||||||
"create_tag_description": "Create a new tag. For nested tags, please enter the full path of the tag including forward slashes.",
|
"create_tag_description": "Create a new tag. For nested tags, please enter the full path of the tag including forward slashes.",
|
||||||
"create_user": "Create user",
|
"create_user": "Create user",
|
||||||
@@ -724,6 +746,7 @@
|
|||||||
"current_server_address": "Current server address",
|
"current_server_address": "Current server address",
|
||||||
"custom_locale": "Custom Locale",
|
"custom_locale": "Custom Locale",
|
||||||
"custom_locale_description": "Format dates and numbers based on the language and the region",
|
"custom_locale_description": "Format dates and numbers based on the language and the region",
|
||||||
|
"custom_url": "Custom URL",
|
||||||
"daily_title_text_date": "E, MMM dd",
|
"daily_title_text_date": "E, MMM dd",
|
||||||
"daily_title_text_date_year": "E, MMM dd, yyyy",
|
"daily_title_text_date_year": "E, MMM dd, yyyy",
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
@@ -735,6 +758,7 @@
|
|||||||
"date_of_birth_saved": "Date of birth saved successfully",
|
"date_of_birth_saved": "Date of birth saved successfully",
|
||||||
"date_range": "Date range",
|
"date_range": "Date range",
|
||||||
"day": "Day",
|
"day": "Day",
|
||||||
|
"days": "Days",
|
||||||
"deduplicate_all": "Deduplicate All",
|
"deduplicate_all": "Deduplicate All",
|
||||||
"deduplication_criteria_1": "Image size in bytes",
|
"deduplication_criteria_1": "Image size in bytes",
|
||||||
"deduplication_criteria_2": "Count of EXIF data",
|
"deduplication_criteria_2": "Count of EXIF data",
|
||||||
@@ -743,7 +767,8 @@
|
|||||||
"default_locale": "Default Locale",
|
"default_locale": "Default Locale",
|
||||||
"default_locale_description": "Format dates and numbers based on your browser locale",
|
"default_locale_description": "Format dates and numbers based on your browser locale",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
"delete_action_prompt": "{count} deleted permanently",
|
"delete_action_confirmation_message": "Are you sure you want to delete this asset? This action will move the asset to the server's trash and will prompt if you want to delete it locally",
|
||||||
|
"delete_action_prompt": "{count} deleted",
|
||||||
"delete_album": "Delete album",
|
"delete_album": "Delete album",
|
||||||
"delete_api_key_prompt": "Are you sure you want to delete this API key?",
|
"delete_api_key_prompt": "Are you sure you want to delete this API key?",
|
||||||
"delete_dialog_alert": "These items will be permanently deleted from Immich and from your device",
|
"delete_dialog_alert": "These items will be permanently deleted from Immich and from your device",
|
||||||
@@ -761,6 +786,8 @@
|
|||||||
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
|
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
|
||||||
"delete_local_dialog_ok_force": "Delete Anyway",
|
"delete_local_dialog_ok_force": "Delete Anyway",
|
||||||
"delete_others": "Delete others",
|
"delete_others": "Delete others",
|
||||||
|
"delete_permanently": "Delete permanently",
|
||||||
|
"delete_permanently_action_prompt": "{count} deleted permanently",
|
||||||
"delete_shared_link": "Delete shared link",
|
"delete_shared_link": "Delete shared link",
|
||||||
"delete_shared_link_dialog_title": "Delete Shared Link",
|
"delete_shared_link_dialog_title": "Delete Shared Link",
|
||||||
"delete_tag": "Delete tag",
|
"delete_tag": "Delete tag",
|
||||||
@@ -816,8 +843,12 @@
|
|||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"edit_album": "Edit album",
|
"edit_album": "Edit album",
|
||||||
"edit_avatar": "Edit avatar",
|
"edit_avatar": "Edit avatar",
|
||||||
|
"edit_birthday": "Edit birthday",
|
||||||
"edit_date": "Edit date",
|
"edit_date": "Edit date",
|
||||||
"edit_date_and_time": "Edit date and time",
|
"edit_date_and_time": "Edit date and time",
|
||||||
|
"edit_date_and_time_action_prompt": "{count} date and time edited",
|
||||||
|
"edit_date_and_time_by_offset": "Change date by offset",
|
||||||
|
"edit_date_and_time_by_offset_interval": "New date range: {from} - {to}",
|
||||||
"edit_description": "Edit description",
|
"edit_description": "Edit description",
|
||||||
"edit_description_prompt": "Please select a new description:",
|
"edit_description_prompt": "Please select a new description:",
|
||||||
"edit_exclusion_pattern": "Edit exclusion pattern",
|
"edit_exclusion_pattern": "Edit exclusion pattern",
|
||||||
@@ -890,6 +921,7 @@
|
|||||||
"failed_to_load_notifications": "Failed to load notifications",
|
"failed_to_load_notifications": "Failed to load notifications",
|
||||||
"failed_to_load_people": "Failed to load people",
|
"failed_to_load_people": "Failed to load people",
|
||||||
"failed_to_remove_product_key": "Failed to remove product key",
|
"failed_to_remove_product_key": "Failed to remove product key",
|
||||||
|
"failed_to_reset_pin_code": "Failed to reset PIN code",
|
||||||
"failed_to_stack_assets": "Failed to stack assets",
|
"failed_to_stack_assets": "Failed to stack assets",
|
||||||
"failed_to_unstack_assets": "Failed to un-stack assets",
|
"failed_to_unstack_assets": "Failed to un-stack assets",
|
||||||
"failed_to_update_notification_status": "Failed to update notification status",
|
"failed_to_update_notification_status": "Failed to update notification status",
|
||||||
@@ -898,6 +930,7 @@
|
|||||||
"paths_validation_failed": "{paths, plural, one {# path} other {# paths}} failed validation",
|
"paths_validation_failed": "{paths, plural, one {# path} other {# paths}} failed validation",
|
||||||
"profile_picture_transparent_pixels": "Profile pictures cannot have transparent pixels. Please zoom in and/or move the image.",
|
"profile_picture_transparent_pixels": "Profile pictures cannot have transparent pixels. Please zoom in and/or move the image.",
|
||||||
"quota_higher_than_disk_size": "You set a quota higher than the disk size",
|
"quota_higher_than_disk_size": "You set a quota higher than the disk size",
|
||||||
|
"something_went_wrong": "Something went wrong",
|
||||||
"unable_to_add_album_users": "Unable to add users to album",
|
"unable_to_add_album_users": "Unable to add users to album",
|
||||||
"unable_to_add_assets_to_shared_link": "Unable to add assets to shared link",
|
"unable_to_add_assets_to_shared_link": "Unable to add assets to shared link",
|
||||||
"unable_to_add_comment": "Unable to add comment",
|
"unable_to_add_comment": "Unable to add comment",
|
||||||
@@ -983,13 +1016,11 @@
|
|||||||
},
|
},
|
||||||
"exif": "Exif",
|
"exif": "Exif",
|
||||||
"exif_bottom_sheet_description": "Add Description...",
|
"exif_bottom_sheet_description": "Add Description...",
|
||||||
|
"exif_bottom_sheet_description_error": "Error updating description",
|
||||||
"exif_bottom_sheet_details": "DETAILS",
|
"exif_bottom_sheet_details": "DETAILS",
|
||||||
"exif_bottom_sheet_location": "LOCATION",
|
"exif_bottom_sheet_location": "LOCATION",
|
||||||
"exif_bottom_sheet_people": "PEOPLE",
|
"exif_bottom_sheet_people": "PEOPLE",
|
||||||
"exif_bottom_sheet_person_add_person": "Add name",
|
"exif_bottom_sheet_person_add_person": "Add name",
|
||||||
"exif_bottom_sheet_person_age_months": "Age {months} months",
|
|
||||||
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {months} months",
|
|
||||||
"exif_bottom_sheet_person_age_years": "Age {years}",
|
|
||||||
"exit_slideshow": "Exit Slideshow",
|
"exit_slideshow": "Exit Slideshow",
|
||||||
"expand_all": "Expand all",
|
"expand_all": "Expand all",
|
||||||
"experimental_settings_new_asset_list_subtitle": "Work in progress",
|
"experimental_settings_new_asset_list_subtitle": "Work in progress",
|
||||||
@@ -1031,11 +1062,13 @@
|
|||||||
"filter_people": "Filter people",
|
"filter_people": "Filter people",
|
||||||
"filter_places": "Filter places",
|
"filter_places": "Filter places",
|
||||||
"find_them_fast": "Find them fast by name with search",
|
"find_them_fast": "Find them fast by name with search",
|
||||||
|
"first": "First",
|
||||||
"fix_incorrect_match": "Fix incorrect match",
|
"fix_incorrect_match": "Fix incorrect match",
|
||||||
"folder": "Folder",
|
"folder": "Folder",
|
||||||
"folder_not_found": "Folder not found",
|
"folder_not_found": "Folder not found",
|
||||||
"folders": "Folders",
|
"folders": "Folders",
|
||||||
"folders_feature_description": "Browsing the folder view for the photos and videos on the file system",
|
"folders_feature_description": "Browsing the folder view for the photos and videos on the file system",
|
||||||
|
"forgot_pin_code_question": "Forgot your PIN?",
|
||||||
"forward": "Forward",
|
"forward": "Forward",
|
||||||
"gcast_enabled": "Google Cast",
|
"gcast_enabled": "Google Cast",
|
||||||
"gcast_enabled_description": "This feature loads external resources from Google in order to work.",
|
"gcast_enabled_description": "This feature loads external resources from Google in order to work.",
|
||||||
@@ -1090,6 +1123,7 @@
|
|||||||
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
|
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
|
||||||
"host": "Host",
|
"host": "Host",
|
||||||
"hour": "Hour",
|
"hour": "Hour",
|
||||||
|
"hours": "Hours",
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"idle": "Idle",
|
"idle": "Idle",
|
||||||
"ignore_icloud_photos": "Ignore iCloud photos",
|
"ignore_icloud_photos": "Ignore iCloud photos",
|
||||||
@@ -1149,10 +1183,13 @@
|
|||||||
"language_no_results_title": "No languages found",
|
"language_no_results_title": "No languages found",
|
||||||
"language_search_hint": "Search languages...",
|
"language_search_hint": "Search languages...",
|
||||||
"language_setting_description": "Select your preferred language",
|
"language_setting_description": "Select your preferred language",
|
||||||
|
"large_files": "Large Files",
|
||||||
|
"last": "Last",
|
||||||
"last_seen": "Last seen",
|
"last_seen": "Last seen",
|
||||||
"latest_version": "Latest Version",
|
"latest_version": "Latest Version",
|
||||||
"latitude": "Latitude",
|
"latitude": "Latitude",
|
||||||
"leave": "Leave",
|
"leave": "Leave",
|
||||||
|
"leave_album": "Leave album",
|
||||||
"lens_model": "Lens model",
|
"lens_model": "Lens model",
|
||||||
"let_others_respond": "Let others respond",
|
"let_others_respond": "Let others respond",
|
||||||
"level": "Level",
|
"level": "Level",
|
||||||
@@ -1166,9 +1203,9 @@
|
|||||||
"library_page_sort_title": "Album title",
|
"library_page_sort_title": "Album title",
|
||||||
"licenses": "Licenses",
|
"licenses": "Licenses",
|
||||||
"light": "Light",
|
"light": "Light",
|
||||||
|
"like": "Like",
|
||||||
"like_deleted": "Like deleted",
|
"like_deleted": "Like deleted",
|
||||||
"link_motion_video": "Link motion video",
|
"link_motion_video": "Link motion video",
|
||||||
"link_options": "Link options",
|
|
||||||
"link_to_oauth": "Link to OAuth",
|
"link_to_oauth": "Link to OAuth",
|
||||||
"linked_oauth_account": "Linked OAuth account",
|
"linked_oauth_account": "Linked OAuth account",
|
||||||
"list": "List",
|
"list": "List",
|
||||||
@@ -1233,8 +1270,7 @@
|
|||||||
"manage_your_devices": "Manage your logged-in devices",
|
"manage_your_devices": "Manage your logged-in devices",
|
||||||
"manage_your_oauth_connection": "Manage your OAuth connection",
|
"manage_your_oauth_connection": "Manage your OAuth connection",
|
||||||
"map": "Map",
|
"map": "Map",
|
||||||
"map_assets_in_bound": "{count} photo",
|
"map_assets_in_bounds": "{count, plural, =0 {No photos in this area} one {# photo} other {# photos}}",
|
||||||
"map_assets_in_bounds": "{count} photos",
|
|
||||||
"map_cannot_get_user_location": "Cannot get user's location",
|
"map_cannot_get_user_location": "Cannot get user's location",
|
||||||
"map_location_dialog_yes": "Yes",
|
"map_location_dialog_yes": "Yes",
|
||||||
"map_location_picker_page_use_location": "Use this location",
|
"map_location_picker_page_use_location": "Use this location",
|
||||||
@@ -1242,7 +1278,6 @@
|
|||||||
"map_location_service_disabled_title": "Location Service disabled",
|
"map_location_service_disabled_title": "Location Service disabled",
|
||||||
"map_marker_for_images": "Map marker for images taken in {city}, {country}",
|
"map_marker_for_images": "Map marker for images taken in {city}, {country}",
|
||||||
"map_marker_with_image": "Map marker with image",
|
"map_marker_with_image": "Map marker with image",
|
||||||
"map_no_assets_in_bounds": "No photos in this area",
|
|
||||||
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
|
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
|
||||||
"map_no_location_permission_title": "Location Permission denied",
|
"map_no_location_permission_title": "Location Permission denied",
|
||||||
"map_settings": "Map settings",
|
"map_settings": "Map settings",
|
||||||
@@ -1279,6 +1314,7 @@
|
|||||||
"merged_people_count": "Merged {count, plural, one {# person} other {# people}}",
|
"merged_people_count": "Merged {count, plural, one {# person} other {# people}}",
|
||||||
"minimize": "Minimize",
|
"minimize": "Minimize",
|
||||||
"minute": "Minute",
|
"minute": "Minute",
|
||||||
|
"minutes": "Minutes",
|
||||||
"missing": "Missing",
|
"missing": "Missing",
|
||||||
"model": "Model",
|
"model": "Model",
|
||||||
"month": "Month",
|
"month": "Month",
|
||||||
@@ -1298,6 +1334,9 @@
|
|||||||
"my_albums": "My albums",
|
"my_albums": "My albums",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"name_or_nickname": "Name or nickname",
|
"name_or_nickname": "Name or nickname",
|
||||||
|
"network_requirement_photos_upload": "Use cellular data to backup photos",
|
||||||
|
"network_requirement_videos_upload": "Use cellular data to backup videos",
|
||||||
|
"network_requirements_updated": "Network requirements changed, resetting backup queue",
|
||||||
"networking_settings": "Networking",
|
"networking_settings": "Networking",
|
||||||
"networking_subtitle": "Manage the server endpoint settings",
|
"networking_subtitle": "Manage the server endpoint settings",
|
||||||
"never": "Never",
|
"never": "Never",
|
||||||
@@ -1349,6 +1388,7 @@
|
|||||||
"oauth": "OAuth",
|
"oauth": "OAuth",
|
||||||
"official_immich_resources": "Official Immich Resources",
|
"official_immich_resources": "Official Immich Resources",
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
|
"offset": "Offset",
|
||||||
"ok": "Ok",
|
"ok": "Ok",
|
||||||
"oldest_first": "Oldest first",
|
"oldest_first": "Oldest first",
|
||||||
"on_this_device": "On this device",
|
"on_this_device": "On this device",
|
||||||
@@ -1426,6 +1466,9 @@
|
|||||||
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
|
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
|
||||||
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
|
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
|
||||||
"person": "Person",
|
"person": "Person",
|
||||||
|
"person_age_months": "{months, plural, one {# month} other {# months}} old",
|
||||||
|
"person_age_year_months": "1 year, {months, plural, one {# month} other {# months}} old",
|
||||||
|
"person_age_years": "{years, plural, other {# years}} old",
|
||||||
"person_birthdate": "Born on {date}",
|
"person_birthdate": "Born on {date}",
|
||||||
"person_hidden": "{name}{hidden, select, true { (hidden)} other {}}",
|
"person_hidden": "{name}{hidden, select, true { (hidden)} other {}}",
|
||||||
"photo_shared_all_users": "Looks like you shared your photos with all users or you don't have any user to share with.",
|
"photo_shared_all_users": "Looks like you shared your photos with all users or you don't have any user to share with.",
|
||||||
@@ -1571,6 +1614,9 @@
|
|||||||
"reset_password": "Reset password",
|
"reset_password": "Reset password",
|
||||||
"reset_people_visibility": "Reset people visibility",
|
"reset_people_visibility": "Reset people visibility",
|
||||||
"reset_pin_code": "Reset PIN code",
|
"reset_pin_code": "Reset PIN code",
|
||||||
|
"reset_pin_code_description": "If you forgot your PIN code, you can contact the server administrator to reset it",
|
||||||
|
"reset_pin_code_success": "Successfully reset PIN code",
|
||||||
|
"reset_pin_code_with_password": "You can always reset your PIN code with your password",
|
||||||
"reset_sqlite": "Reset SQLite Database",
|
"reset_sqlite": "Reset SQLite Database",
|
||||||
"reset_sqlite_confirmation": "Are you sure you want to reset the SQLite database? You will need to log out and log in again to resync the data",
|
"reset_sqlite_confirmation": "Are you sure you want to reset the SQLite database? You will need to log out and log in again to resync the data",
|
||||||
"reset_sqlite_success": "Successfully reset the SQLite database",
|
"reset_sqlite_success": "Successfully reset the SQLite database",
|
||||||
@@ -1585,6 +1631,7 @@
|
|||||||
"resume": "Resume",
|
"resume": "Resume",
|
||||||
"retry_upload": "Retry upload",
|
"retry_upload": "Retry upload",
|
||||||
"review_duplicates": "Review duplicates",
|
"review_duplicates": "Review duplicates",
|
||||||
|
"review_large_files": "Review large files",
|
||||||
"role": "Role",
|
"role": "Role",
|
||||||
"role_editor": "Editor",
|
"role_editor": "Editor",
|
||||||
"role_viewer": "Viewer",
|
"role_viewer": "Viewer",
|
||||||
@@ -1742,6 +1789,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "Copied to clipboard",
|
"shared_link_clipboard_copied_massage": "Copied to clipboard",
|
||||||
"shared_link_clipboard_text": "Link: {link}\nPassword: {password}",
|
"shared_link_clipboard_text": "Link: {link}\nPassword: {password}",
|
||||||
"shared_link_create_error": "Error while creating shared link",
|
"shared_link_create_error": "Error while creating shared link",
|
||||||
|
"shared_link_custom_url_description": "Access this shared link with a custom URL",
|
||||||
"shared_link_edit_description_hint": "Enter the share description",
|
"shared_link_edit_description_hint": "Enter the share description",
|
||||||
"shared_link_edit_expire_after_option_day": "1 day",
|
"shared_link_edit_expire_after_option_day": "1 day",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} days",
|
"shared_link_edit_expire_after_option_days": "{count} days",
|
||||||
@@ -1767,6 +1815,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "Manage Shared links",
|
"shared_link_manage_links": "Manage Shared links",
|
||||||
"shared_link_options": "Shared link options",
|
"shared_link_options": "Shared link options",
|
||||||
|
"shared_link_password_description": "Require a password to access this shared link",
|
||||||
"shared_links": "Shared links",
|
"shared_links": "Shared links",
|
||||||
"shared_links_description": "Share photos and videos with a link",
|
"shared_links_description": "Share photos and videos with a link",
|
||||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# shared photos & videos.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, other {# shared photos & videos.}}",
|
||||||
@@ -1816,6 +1865,7 @@
|
|||||||
"sort_created": "Date created",
|
"sort_created": "Date created",
|
||||||
"sort_items": "Number of items",
|
"sort_items": "Number of items",
|
||||||
"sort_modified": "Date modified",
|
"sort_modified": "Date modified",
|
||||||
|
"sort_newest": "Newest photo",
|
||||||
"sort_oldest": "Oldest photo",
|
"sort_oldest": "Oldest photo",
|
||||||
"sort_people_by_similarity": "Sort people by similarity",
|
"sort_people_by_similarity": "Sort people by similarity",
|
||||||
"sort_recent": "Most recent photo",
|
"sort_recent": "Most recent photo",
|
||||||
|
|||||||
62
i18n/es.json
@@ -182,7 +182,7 @@
|
|||||||
"nightly_tasks_sync_quota_usage_setting_description": "Actualizar la cuota de almacenamiento del usuario, según el uso actual",
|
"nightly_tasks_sync_quota_usage_setting_description": "Actualizar la cuota de almacenamiento del usuario, según el uso actual",
|
||||||
"no_paths_added": "No se han añadido carpetas",
|
"no_paths_added": "No se han añadido carpetas",
|
||||||
"no_pattern_added": "No se han añadido patrones",
|
"no_pattern_added": "No se han añadido patrones",
|
||||||
"note_apply_storage_label_previous_assets": "Nota: para aplicar una Etiqueta de Almacenamiento a un elemento anteriormente cargado, lanza el",
|
"note_apply_storage_label_previous_assets": "Nota: para aplicar una Etiqueta de Almacenamiento a un elemento anteriormente subido, lanza el",
|
||||||
"note_cannot_be_changed_later": "NOTA: ¡No se puede cambiar posteriormente!",
|
"note_cannot_be_changed_later": "NOTA: ¡No se puede cambiar posteriormente!",
|
||||||
"notification_email_from_address": "Desde",
|
"notification_email_from_address": "Desde",
|
||||||
"notification_email_from_address_description": "Dirección de correo electrónico del remitente, por ejemplo: \"Immich Photo Server <noreply@example.com>\". Asegúrate de utilizar una dirección desde la que puedas enviar correos electrónicos.",
|
"notification_email_from_address_description": "Dirección de correo electrónico del remitente, por ejemplo: \"Immich Photo Server <noreply@example.com>\". Asegúrate de utilizar una dirección desde la que puedas enviar correos electrónicos.",
|
||||||
@@ -263,7 +263,7 @@
|
|||||||
"storage_template_onboarding_description_v2": "Al habilitar esta función, los archivos se organizarán automáticamente según la plantilla definida por el usuario. Para más información, consulte la <link>documentación</link>.",
|
"storage_template_onboarding_description_v2": "Al habilitar esta función, los archivos se organizarán automáticamente según la plantilla definida por el usuario. Para más información, consulte la <link>documentación</link>.",
|
||||||
"storage_template_path_length": "Límite aproximado de la longitud de la ruta: <b>{length, number}</b>/{limit, number}",
|
"storage_template_path_length": "Límite aproximado de la longitud de la ruta: <b>{length, number}</b>/{limit, number}",
|
||||||
"storage_template_settings": "Plantilla de almacenamiento",
|
"storage_template_settings": "Plantilla de almacenamiento",
|
||||||
"storage_template_settings_description": "Administrar la estructura de carpetas y el nombre de archivo del recurso cargado",
|
"storage_template_settings_description": "Administrar la estructura de carpetas y el nombre de archivo del recurso subido",
|
||||||
"storage_template_user_label": "<code>{label}</code> es la etiqueta de almacenamiento del usuario",
|
"storage_template_user_label": "<code>{label}</code> es la etiqueta de almacenamiento del usuario",
|
||||||
"system_settings": "Ajustes del Sistema",
|
"system_settings": "Ajustes del Sistema",
|
||||||
"tag_cleanup_job": "Limpieza de etiquetas",
|
"tag_cleanup_job": "Limpieza de etiquetas",
|
||||||
@@ -397,6 +397,7 @@
|
|||||||
"album_cover_updated": "Portada del álbum actualizada",
|
"album_cover_updated": "Portada del álbum actualizada",
|
||||||
"album_delete_confirmation": "¿Estás seguro de que deseas eliminar el álbum {album}?",
|
"album_delete_confirmation": "¿Estás seguro de que deseas eliminar el álbum {album}?",
|
||||||
"album_delete_confirmation_description": "Si este álbum se comparte, otros usuarios ya no podrán acceder a él.",
|
"album_delete_confirmation_description": "Si este álbum se comparte, otros usuarios ya no podrán acceder a él.",
|
||||||
|
"album_deleted": "Álbum eliminado",
|
||||||
"album_info_card_backup_album_excluded": "EXCLUIDOS",
|
"album_info_card_backup_album_excluded": "EXCLUIDOS",
|
||||||
"album_info_card_backup_album_included": "INCLUIDOS",
|
"album_info_card_backup_album_included": "INCLUIDOS",
|
||||||
"album_info_updated": "Información del álbum actualizada",
|
"album_info_updated": "Información del álbum actualizada",
|
||||||
@@ -406,6 +407,7 @@
|
|||||||
"album_options": "Opciones del Album",
|
"album_options": "Opciones del Album",
|
||||||
"album_remove_user": "¿Eliminar usuario?",
|
"album_remove_user": "¿Eliminar usuario?",
|
||||||
"album_remove_user_confirmation": "¿Estás seguro de que quieres eliminar a {user}?",
|
"album_remove_user_confirmation": "¿Estás seguro de que quieres eliminar a {user}?",
|
||||||
|
"album_search_not_found": "No se encontraron álbumes que coincidan con tu búsqueda",
|
||||||
"album_share_no_users": "Parece que has compartido este álbum con todos los usuarios o no tienes ningún usuario con quien compartirlo.",
|
"album_share_no_users": "Parece que has compartido este álbum con todos los usuarios o no tienes ningún usuario con quien compartirlo.",
|
||||||
"album_updated": "Album actualizado",
|
"album_updated": "Album actualizado",
|
||||||
"album_updated_setting_description": "Reciba una notificación por correo electrónico cuando un álbum compartido tenga nuevos archivos",
|
"album_updated_setting_description": "Reciba una notificación por correo electrónico cuando un álbum compartido tenga nuevos archivos",
|
||||||
@@ -425,6 +427,7 @@
|
|||||||
"albums_default_sort_order": "Ordenación por defecto de los álbumes",
|
"albums_default_sort_order": "Ordenación por defecto de los álbumes",
|
||||||
"albums_default_sort_order_description": "Orden de clasificación inicial de los recursos al crear nuevos álbumes.",
|
"albums_default_sort_order_description": "Orden de clasificación inicial de los recursos al crear nuevos álbumes.",
|
||||||
"albums_feature_description": "Colecciones de recursos que pueden ser compartidos con otros usuarios.",
|
"albums_feature_description": "Colecciones de recursos que pueden ser compartidos con otros usuarios.",
|
||||||
|
"albums_on_device_count": "Álbumes en el dispositivo ({count})",
|
||||||
"all": "Todos",
|
"all": "Todos",
|
||||||
"all_albums": "Todos los albums",
|
"all_albums": "Todos los albums",
|
||||||
"all_people": "Todas las personas",
|
"all_people": "Todas las personas",
|
||||||
@@ -508,6 +511,7 @@
|
|||||||
"back_close_deselect": "Atrás, cerrar o anular la selección",
|
"back_close_deselect": "Atrás, cerrar o anular la selección",
|
||||||
"background_location_permission": "Permiso de ubicación en segundo plano",
|
"background_location_permission": "Permiso de ubicación en segundo plano",
|
||||||
"background_location_permission_content": "Para poder cambiar de red mientras se ejecuta en segundo plano, Immich debe tener *siempre* acceso a la ubicación precisa para que la aplicación pueda leer el nombre de la red Wi-Fi",
|
"background_location_permission_content": "Para poder cambiar de red mientras se ejecuta en segundo plano, Immich debe tener *siempre* acceso a la ubicación precisa para que la aplicación pueda leer el nombre de la red Wi-Fi",
|
||||||
|
"backup": "Copia de Seguridad",
|
||||||
"backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({count})",
|
"backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir",
|
"backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir",
|
||||||
"backup_album_selection_page_assets_scatter": "Los elementos pueden dispersarse en varios álbumes. De este modo, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.",
|
"backup_album_selection_page_assets_scatter": "Los elementos pueden dispersarse en varios álbumes. De este modo, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.",
|
||||||
@@ -571,6 +575,8 @@
|
|||||||
"backup_options_page_title": "Opciones de Copia de Seguridad",
|
"backup_options_page_title": "Opciones de Copia de Seguridad",
|
||||||
"backup_setting_subtitle": "Administra las configuraciones de respaldo en segundo y primer plano",
|
"backup_setting_subtitle": "Administra las configuraciones de respaldo en segundo y primer plano",
|
||||||
"backward": "Retroceder",
|
"backward": "Retroceder",
|
||||||
|
"beta_sync": "Estado de Sincronización Beta",
|
||||||
|
"beta_sync_subtitle": "Administrar el nuevo sistema de sincronización",
|
||||||
"biometric_auth_enabled": "Autentificación biométrica habilitada",
|
"biometric_auth_enabled": "Autentificación biométrica habilitada",
|
||||||
"biometric_locked_out": "Estás bloqueado de la autentificación biométrica",
|
"biometric_locked_out": "Estás bloqueado de la autentificación biométrica",
|
||||||
"biometric_no_options": "Sin opciones biométricas disponibles",
|
"biometric_no_options": "Sin opciones biométricas disponibles",
|
||||||
@@ -588,7 +594,7 @@
|
|||||||
"cache_settings_clear_cache_button": "Borrar caché",
|
"cache_settings_clear_cache_button": "Borrar caché",
|
||||||
"cache_settings_clear_cache_button_title": "Borra la caché de la aplicación. Esto afectará significativamente el rendimiento de la aplicación hasta que se reconstruya la caché.",
|
"cache_settings_clear_cache_button_title": "Borra la caché de la aplicación. Esto afectará significativamente el rendimiento de la aplicación hasta que se reconstruya la caché.",
|
||||||
"cache_settings_duplicated_assets_clear_button": "LIMPIAR",
|
"cache_settings_duplicated_assets_clear_button": "LIMPIAR",
|
||||||
"cache_settings_duplicated_assets_subtitle": "Fotos y vídeos en la lista negra de la app",
|
"cache_settings_duplicated_assets_subtitle": "Fotos y vídeos ignorados por la aplicación",
|
||||||
"cache_settings_duplicated_assets_title": "Elementos duplicados ({count})",
|
"cache_settings_duplicated_assets_title": "Elementos duplicados ({count})",
|
||||||
"cache_settings_statistics_album": "Miniaturas de la biblioteca",
|
"cache_settings_statistics_album": "Miniaturas de la biblioteca",
|
||||||
"cache_settings_statistics_full": "Imágenes completas",
|
"cache_settings_statistics_full": "Imágenes completas",
|
||||||
@@ -605,6 +611,7 @@
|
|||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"cancel_search": "Cancelar búsqueda",
|
"cancel_search": "Cancelar búsqueda",
|
||||||
"canceled": "Cancelado",
|
"canceled": "Cancelado",
|
||||||
|
"canceling": "Cancelando",
|
||||||
"cannot_merge_people": "No se pueden fusionar personas",
|
"cannot_merge_people": "No se pueden fusionar personas",
|
||||||
"cannot_undo_this_action": "¡No puedes deshacer esta acción!",
|
"cannot_undo_this_action": "¡No puedes deshacer esta acción!",
|
||||||
"cannot_update_the_description": "No se puede actualizar la descripción",
|
"cannot_update_the_description": "No se puede actualizar la descripción",
|
||||||
@@ -718,6 +725,7 @@
|
|||||||
"current_server_address": "Dirección actual del servidor",
|
"current_server_address": "Dirección actual del servidor",
|
||||||
"custom_locale": "Configuración regional personalizada",
|
"custom_locale": "Configuración regional personalizada",
|
||||||
"custom_locale_description": "Formatear fechas y números según el idioma y la región",
|
"custom_locale_description": "Formatear fechas y números según el idioma y la región",
|
||||||
|
"custom_url": "URL personalizada",
|
||||||
"daily_title_text_date": "E dd, MMM",
|
"daily_title_text_date": "E dd, MMM",
|
||||||
"daily_title_text_date_year": "E dd de MMM, yyyy",
|
"daily_title_text_date_year": "E dd de MMM, yyyy",
|
||||||
"dark": "Oscuro",
|
"dark": "Oscuro",
|
||||||
@@ -737,13 +745,14 @@
|
|||||||
"default_locale": "Configuración regional predeterminada",
|
"default_locale": "Configuración regional predeterminada",
|
||||||
"default_locale_description": "Formatee fechas y números según la configuración regional de su navegador",
|
"default_locale_description": "Formatee fechas y números según la configuración regional de su navegador",
|
||||||
"delete": "Eliminar",
|
"delete": "Eliminar",
|
||||||
"delete_action_prompt": "{count} eliminados permanentemente",
|
"delete_action_confirmation_message": "¿Está seguro que desea eliminar este archivo? Esta acción lo moverá a la papelera del servidor y le preguntará si desea eliminarlo localmente",
|
||||||
|
"delete_action_prompt": "{count} eliminados",
|
||||||
"delete_album": "Eliminar álbum",
|
"delete_album": "Eliminar álbum",
|
||||||
"delete_api_key_prompt": "¿Está seguro de que desea eliminar esta clave API?",
|
"delete_api_key_prompt": "¿Está seguro de que desea eliminar esta clave API?",
|
||||||
"delete_dialog_alert": "Estos elementos serán eliminados permanentemente de Immich y de tu dispositivo",
|
"delete_dialog_alert": "Estos elementos serán eliminados permanentemente de Immich y de tu dispositivo",
|
||||||
"delete_dialog_alert_local": "Estas imágenes van a ser borradas de tu dispositivo, pero seguirán disponibles en el servidor Immich",
|
"delete_dialog_alert_local": "Estos elementos se eliminarán permanente de tu dispositivo pero seguirán disponibles en el servidor de Immich",
|
||||||
"delete_dialog_alert_local_non_backed_up": "Algunas de las imágenes no tienen copia de seguridad y serán borradas de forma permanente de tu dispositivo",
|
"delete_dialog_alert_local_non_backed_up": "Algunos de los elementos no tienen copia de seguridad en Immich y serán borrados permanentemente de tu dispositivo",
|
||||||
"delete_dialog_alert_remote": "Estas imágenes van a ser borradas de forma permanente del servidor Immich",
|
"delete_dialog_alert_remote": "Estas imágenes van a ser borradas permanentemente del servidor de Immich",
|
||||||
"delete_dialog_ok_force": "Borrar de todos modos",
|
"delete_dialog_ok_force": "Borrar de todos modos",
|
||||||
"delete_dialog_title": "Eliminar Permanentemente",
|
"delete_dialog_title": "Eliminar Permanentemente",
|
||||||
"delete_duplicates_confirmation": "¿Está seguro de que desea eliminar permanentemente estos duplicados?",
|
"delete_duplicates_confirmation": "¿Está seguro de que desea eliminar permanentemente estos duplicados?",
|
||||||
@@ -755,6 +764,8 @@
|
|||||||
"delete_local_dialog_ok_backed_up_only": "Borrar solo las que tengan copia de seguridad",
|
"delete_local_dialog_ok_backed_up_only": "Borrar solo las que tengan copia de seguridad",
|
||||||
"delete_local_dialog_ok_force": "Borrar de todos modos",
|
"delete_local_dialog_ok_force": "Borrar de todos modos",
|
||||||
"delete_others": "Eliminar otros",
|
"delete_others": "Eliminar otros",
|
||||||
|
"delete_permanently": "Eliminar permanentemente",
|
||||||
|
"delete_permanently_action_prompt": "{count} eliminados permanentemente",
|
||||||
"delete_shared_link": "Eliminar enlace compartido",
|
"delete_shared_link": "Eliminar enlace compartido",
|
||||||
"delete_shared_link_dialog_title": "Eliminar enlace compartido",
|
"delete_shared_link_dialog_title": "Eliminar enlace compartido",
|
||||||
"delete_tag": "Eliminar etiqueta",
|
"delete_tag": "Eliminar etiqueta",
|
||||||
@@ -765,6 +776,7 @@
|
|||||||
"description": "Descripción",
|
"description": "Descripción",
|
||||||
"description_input_hint_text": "Agregar descripción...",
|
"description_input_hint_text": "Agregar descripción...",
|
||||||
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
|
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
|
||||||
|
"deselect_all": "Deseleccionar Todo",
|
||||||
"details": "Detalles",
|
"details": "Detalles",
|
||||||
"direction": "Dirección",
|
"direction": "Dirección",
|
||||||
"disabled": "Deshabilitado",
|
"disabled": "Deshabilitado",
|
||||||
@@ -839,6 +851,7 @@
|
|||||||
"empty_trash": "Vaciar papelera",
|
"empty_trash": "Vaciar papelera",
|
||||||
"empty_trash_confirmation": "¿Estás seguro de que quieres vaciar la papelera? Esto eliminará permanentemente todos los archivos de la basura de Immich.\n¡No puedes deshacer esta acción!",
|
"empty_trash_confirmation": "¿Estás seguro de que quieres vaciar la papelera? Esto eliminará permanentemente todos los archivos de la basura de Immich.\n¡No puedes deshacer esta acción!",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
|
"enable_backup": "Habilitar Copia de Seguridad",
|
||||||
"enable_biometric_auth_description": "Introduce tu código PIN para habilitar la autentificación biométrica",
|
"enable_biometric_auth_description": "Introduce tu código PIN para habilitar la autentificación biométrica",
|
||||||
"enabled": "Habilitado",
|
"enabled": "Habilitado",
|
||||||
"end_date": "Fecha final",
|
"end_date": "Fecha final",
|
||||||
@@ -995,6 +1008,8 @@
|
|||||||
"explorer": "Explorador",
|
"explorer": "Explorador",
|
||||||
"export": "Exportar",
|
"export": "Exportar",
|
||||||
"export_as_json": "Exportar a JSON",
|
"export_as_json": "Exportar a JSON",
|
||||||
|
"export_database": "Exportar Base de Datos",
|
||||||
|
"export_database_description": "Exportar la Base de Datos SQLite",
|
||||||
"extension": "Extensión",
|
"extension": "Extensión",
|
||||||
"external": "Externo",
|
"external": "Externo",
|
||||||
"external_libraries": "Bibliotecas Externas",
|
"external_libraries": "Bibliotecas Externas",
|
||||||
@@ -1046,6 +1061,9 @@
|
|||||||
"haptic_feedback_switch": "Activar respuesta háptica",
|
"haptic_feedback_switch": "Activar respuesta háptica",
|
||||||
"haptic_feedback_title": "Respuesta Háptica",
|
"haptic_feedback_title": "Respuesta Háptica",
|
||||||
"has_quota": "Su cuota",
|
"has_quota": "Su cuota",
|
||||||
|
"hash_asset": "Generar hash del archivo",
|
||||||
|
"hashed_assets": "Archivos con hash generado",
|
||||||
|
"hashing": "Generando hash",
|
||||||
"header_settings_add_header_tip": "Añadir cabecera",
|
"header_settings_add_header_tip": "Añadir cabecera",
|
||||||
"header_settings_field_validator_msg": "El valor no puede estar vacío",
|
"header_settings_field_validator_msg": "El valor no puede estar vacío",
|
||||||
"header_settings_header_name_input": "Nombre de la cabecera",
|
"header_settings_header_name_input": "Nombre de la cabecera",
|
||||||
@@ -1078,6 +1096,7 @@
|
|||||||
"host": "Host",
|
"host": "Host",
|
||||||
"hour": "Hora",
|
"hour": "Hora",
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
|
"idle": "Inactivo",
|
||||||
"ignore_icloud_photos": "Ignorar fotos de iCloud",
|
"ignore_icloud_photos": "Ignorar fotos de iCloud",
|
||||||
"ignore_icloud_photos_description": "Las fotos almacenadas en iCloud no se subirán a Immich",
|
"ignore_icloud_photos_description": "Las fotos almacenadas en iCloud no se subirán a Immich",
|
||||||
"image": "Imagen",
|
"image": "Imagen",
|
||||||
@@ -1135,6 +1154,7 @@
|
|||||||
"language_no_results_title": "No se han encontrado idiomas",
|
"language_no_results_title": "No se han encontrado idiomas",
|
||||||
"language_search_hint": "Buscar idiomas...",
|
"language_search_hint": "Buscar idiomas...",
|
||||||
"language_setting_description": "Selecciona tu idioma preferido",
|
"language_setting_description": "Selecciona tu idioma preferido",
|
||||||
|
"large_files": "Archivos Grandes",
|
||||||
"last_seen": "Ultima vez visto",
|
"last_seen": "Ultima vez visto",
|
||||||
"latest_version": "Última versión",
|
"latest_version": "Última versión",
|
||||||
"latitude": "Latitud",
|
"latitude": "Latitud",
|
||||||
@@ -1154,13 +1174,14 @@
|
|||||||
"light": "Claro",
|
"light": "Claro",
|
||||||
"like_deleted": "Me gusta eliminado",
|
"like_deleted": "Me gusta eliminado",
|
||||||
"link_motion_video": "Enlazar vídeo en movimiento",
|
"link_motion_video": "Enlazar vídeo en movimiento",
|
||||||
"link_options": "Opciones de enlace",
|
|
||||||
"link_to_oauth": "Enlace a OAuth",
|
"link_to_oauth": "Enlace a OAuth",
|
||||||
"linked_oauth_account": "Cuenta OAuth vinculada",
|
"linked_oauth_account": "Cuenta OAuth vinculada",
|
||||||
"list": "Listar",
|
"list": "Listar",
|
||||||
"loading": "Cargando",
|
"loading": "Cargando",
|
||||||
"loading_search_results_failed": "Error al cargar los resultados de la búsqueda",
|
"loading_search_results_failed": "Error al cargar los resultados de la búsqueda",
|
||||||
|
"local": "Local",
|
||||||
"local_asset_cast_failed": "No es posible transmitir un recurso que no está subido al servidor",
|
"local_asset_cast_failed": "No es posible transmitir un recurso que no está subido al servidor",
|
||||||
|
"local_assets": "Archivos Locales",
|
||||||
"local_network": "Red local",
|
"local_network": "Red local",
|
||||||
"local_network_sheet_info": "La aplicación se conectará al servidor a través de esta URL cuando utilice la red Wi-Fi especificada",
|
"local_network_sheet_info": "La aplicación se conectará al servidor a través de esta URL cuando utilice la red Wi-Fi especificada",
|
||||||
"location_permission": "Permiso de ubicación",
|
"location_permission": "Permiso de ubicación",
|
||||||
@@ -1217,8 +1238,7 @@
|
|||||||
"manage_your_devices": "Administre sus dispositivos conectados",
|
"manage_your_devices": "Administre sus dispositivos conectados",
|
||||||
"manage_your_oauth_connection": "Administra tu conexión OAuth",
|
"manage_your_oauth_connection": "Administra tu conexión OAuth",
|
||||||
"map": "Mapa",
|
"map": "Mapa",
|
||||||
"map_assets_in_bound": "{count} foto",
|
"map_assets_in_bounds": "{count, plural, one {# foto} other {# fotos}}",
|
||||||
"map_assets_in_bounds": "{count} fotos",
|
|
||||||
"map_cannot_get_user_location": "No se pudo obtener la posición del usuario",
|
"map_cannot_get_user_location": "No se pudo obtener la posición del usuario",
|
||||||
"map_location_dialog_yes": "Sí",
|
"map_location_dialog_yes": "Sí",
|
||||||
"map_location_picker_page_use_location": "Usar esta ubicación",
|
"map_location_picker_page_use_location": "Usar esta ubicación",
|
||||||
@@ -1317,6 +1337,7 @@
|
|||||||
"no_results": "Sin resultados",
|
"no_results": "Sin resultados",
|
||||||
"no_results_description": "Pruebe con un sinónimo o una palabra clave más general",
|
"no_results_description": "Pruebe con un sinónimo o una palabra clave más general",
|
||||||
"no_shared_albums_message": "Crea un álbum para compartir fotos y vídeos con personas de tu red",
|
"no_shared_albums_message": "Crea un álbum para compartir fotos y vídeos con personas de tu red",
|
||||||
|
"no_uploads_in_progress": "No hay cargas en progreso",
|
||||||
"not_in_any_album": "Sin álbum",
|
"not_in_any_album": "Sin álbum",
|
||||||
"not_selected": "No seleccionado",
|
"not_selected": "No seleccionado",
|
||||||
"note_apply_storage_label_to_previously_uploaded assets": "Nota: Para aplicar la etiqueta de almacenamiento a los archivos subidos previamente, ejecute el",
|
"note_apply_storage_label_to_previously_uploaded assets": "Nota: Para aplicar la etiqueta de almacenamiento a los archivos subidos previamente, ejecute el",
|
||||||
@@ -1354,6 +1375,7 @@
|
|||||||
"original": "original",
|
"original": "original",
|
||||||
"other": "Otro",
|
"other": "Otro",
|
||||||
"other_devices": "Otro dispositivo",
|
"other_devices": "Otro dispositivo",
|
||||||
|
"other_entities": "Otras entidades",
|
||||||
"other_variables": "Otras variables",
|
"other_variables": "Otras variables",
|
||||||
"owned": "Propio",
|
"owned": "Propio",
|
||||||
"owner": "Propietario",
|
"owner": "Propietario",
|
||||||
@@ -1485,6 +1507,7 @@
|
|||||||
"purchase_server_description_2": "Estado del soporte",
|
"purchase_server_description_2": "Estado del soporte",
|
||||||
"purchase_server_title": "Servidor",
|
"purchase_server_title": "Servidor",
|
||||||
"purchase_settings_server_activated": "La clave del producto del servidor la administra el administrador",
|
"purchase_settings_server_activated": "La clave del producto del servidor la administra el administrador",
|
||||||
|
"queue_status": "Poniendo en cola {count}/{total}",
|
||||||
"rating": "Valoración",
|
"rating": "Valoración",
|
||||||
"rating_clear": "Borrar calificación",
|
"rating_clear": "Borrar calificación",
|
||||||
"rating_count": "{count, plural, one {# estrella} other {# estrellas}}",
|
"rating_count": "{count, plural, one {# estrella} other {# estrellas}}",
|
||||||
@@ -1513,6 +1536,8 @@
|
|||||||
"refreshing_faces": "Recargando caras",
|
"refreshing_faces": "Recargando caras",
|
||||||
"refreshing_metadata": "Recargando metadatos",
|
"refreshing_metadata": "Recargando metadatos",
|
||||||
"regenerating_thumbnails": "Recargando miniaturas",
|
"regenerating_thumbnails": "Recargando miniaturas",
|
||||||
|
"remote": "Remoto",
|
||||||
|
"remote_assets": "Elementos remotos",
|
||||||
"remove": "Eliminar",
|
"remove": "Eliminar",
|
||||||
"remove_assets_album_confirmation": "¿Estás seguro que quieres eliminar {count, plural, one {# elemento} other {# elementos}} del álbum?",
|
"remove_assets_album_confirmation": "¿Estás seguro que quieres eliminar {count, plural, one {# elemento} other {# elementos}} del álbum?",
|
||||||
"remove_assets_shared_link_confirmation": "¿Estás seguro que quieres eliminar {count, plural, one {# elemento} other {# elementos}} del enlace compartido?",
|
"remove_assets_shared_link_confirmation": "¿Estás seguro que quieres eliminar {count, plural, one {# elemento} other {# elementos}} del enlace compartido?",
|
||||||
@@ -1550,19 +1575,25 @@
|
|||||||
"reset_password": "Restablecer la contraseña",
|
"reset_password": "Restablecer la contraseña",
|
||||||
"reset_people_visibility": "Restablecer la visibilidad de las personas",
|
"reset_people_visibility": "Restablecer la visibilidad de las personas",
|
||||||
"reset_pin_code": "Restablecer PIN",
|
"reset_pin_code": "Restablecer PIN",
|
||||||
|
"reset_sqlite": "Restablecer la Base de Datos SQLite",
|
||||||
|
"reset_sqlite_confirmation": "¿Estás seguro que deseas restablecer la base de datos SQLite? Deberás cerrar sesión y volver a iniciarla para resincronizar los datos",
|
||||||
|
"reset_sqlite_success": "Restablecer exitosamente la base de datos SQLite",
|
||||||
"reset_to_default": "Restablecer los valores predeterminados",
|
"reset_to_default": "Restablecer los valores predeterminados",
|
||||||
"resolve_duplicates": "Resolver duplicados",
|
"resolve_duplicates": "Resolver duplicados",
|
||||||
"resolved_all_duplicates": "Todos los duplicados resueltos",
|
"resolved_all_duplicates": "Todos los duplicados resueltos",
|
||||||
"restore": "Restaurar",
|
"restore": "Restaurar",
|
||||||
"restore_all": "Restaurar todo",
|
"restore_all": "Restaurar todo",
|
||||||
|
"restore_trash_action_prompt": "{count} restaurado de la papelera",
|
||||||
"restore_user": "Restaurar usuario",
|
"restore_user": "Restaurar usuario",
|
||||||
"restored_asset": "Archivo restaurado",
|
"restored_asset": "Archivo restaurado",
|
||||||
"resume": "Continuar",
|
"resume": "Continuar",
|
||||||
"retry_upload": "Reintentar subida",
|
"retry_upload": "Reintentar subida",
|
||||||
"review_duplicates": "Revisar duplicados",
|
"review_duplicates": "Revisar duplicados",
|
||||||
|
"review_large_files": "Revisar archivos grandes",
|
||||||
"role": "Rol",
|
"role": "Rol",
|
||||||
"role_editor": "Editor",
|
"role_editor": "Editor",
|
||||||
"role_viewer": "Visor",
|
"role_viewer": "Visor",
|
||||||
|
"running": "En ejecución",
|
||||||
"save": "Guardar",
|
"save": "Guardar",
|
||||||
"save_to_gallery": "Guardado en la galería",
|
"save_to_gallery": "Guardado en la galería",
|
||||||
"saved_api_key": "Clave API guardada",
|
"saved_api_key": "Clave API guardada",
|
||||||
@@ -1716,6 +1747,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "Copiado al portapapeles",
|
"shared_link_clipboard_copied_massage": "Copiado al portapapeles",
|
||||||
"shared_link_clipboard_text": "Enlace: {link}\nContraseña: {password}",
|
"shared_link_clipboard_text": "Enlace: {link}\nContraseña: {password}",
|
||||||
"shared_link_create_error": "Error creando el enlace compartido",
|
"shared_link_create_error": "Error creando el enlace compartido",
|
||||||
|
"shared_link_custom_url_description": "Accede a este enlace compartido con una URL personalizada",
|
||||||
"shared_link_edit_description_hint": "Introduce la descripción del enlace",
|
"shared_link_edit_description_hint": "Introduce la descripción del enlace",
|
||||||
"shared_link_edit_expire_after_option_day": "1 día",
|
"shared_link_edit_expire_after_option_day": "1 día",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} días",
|
"shared_link_edit_expire_after_option_days": "{count} días",
|
||||||
@@ -1741,6 +1773,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "Administrar enlaces compartidos",
|
"shared_link_manage_links": "Administrar enlaces compartidos",
|
||||||
"shared_link_options": "Opciones de enlaces compartidos",
|
"shared_link_options": "Opciones de enlaces compartidos",
|
||||||
|
"shared_link_password_description": "Requerir una contraseña para acceder a este enlace compartido",
|
||||||
"shared_links": "Enlaces compartidos",
|
"shared_links": "Enlaces compartidos",
|
||||||
"shared_links_description": "Comparte fotos y vídeos con un enlace",
|
"shared_links_description": "Comparte fotos y vídeos con un enlace",
|
||||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# Fotos y vídeos compartidos.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, other {# Fotos y vídeos compartidos.}}",
|
||||||
@@ -1816,6 +1849,7 @@
|
|||||||
"storage_quota": "Cuota de Almacenamiento",
|
"storage_quota": "Cuota de Almacenamiento",
|
||||||
"storage_usage": "{used} de {available} en uso",
|
"storage_usage": "{used} de {available} en uso",
|
||||||
"submit": "Enviar",
|
"submit": "Enviar",
|
||||||
|
"success": "Éxito",
|
||||||
"suggestions": "Sugerencias",
|
"suggestions": "Sugerencias",
|
||||||
"sunrise_on_the_beach": "Amanecer en la playa",
|
"sunrise_on_the_beach": "Amanecer en la playa",
|
||||||
"support": "Soporte",
|
"support": "Soporte",
|
||||||
@@ -1825,6 +1859,8 @@
|
|||||||
"sync": "Sincronizar",
|
"sync": "Sincronizar",
|
||||||
"sync_albums": "Sincronizar álbumes",
|
"sync_albums": "Sincronizar álbumes",
|
||||||
"sync_albums_manual_subtitle": "Sincroniza todos los videos y fotos subidos con los álbumes seleccionados a respaldar",
|
"sync_albums_manual_subtitle": "Sincroniza todos los videos y fotos subidos con los álbumes seleccionados a respaldar",
|
||||||
|
"sync_local": "Sincronización Local",
|
||||||
|
"sync_remote": "Sincronización Remota",
|
||||||
"sync_upload_album_setting_subtitle": "Crea y sube tus fotos y videos a los álbumes seleccionados en Immich",
|
"sync_upload_album_setting_subtitle": "Crea y sube tus fotos y videos a los álbumes seleccionados en Immich",
|
||||||
"tag": "Etiqueta",
|
"tag": "Etiqueta",
|
||||||
"tag_assets": "Etiquetar activos",
|
"tag_assets": "Etiquetar activos",
|
||||||
@@ -1835,6 +1871,7 @@
|
|||||||
"tag_updated": "Etiqueta actualizada: {tag}",
|
"tag_updated": "Etiqueta actualizada: {tag}",
|
||||||
"tagged_assets": "Etiquetado(s) {count, plural, one {# activo} other {# activos}}",
|
"tagged_assets": "Etiquetado(s) {count, plural, one {# activo} other {# activos}}",
|
||||||
"tags": "Etiquetas",
|
"tags": "Etiquetas",
|
||||||
|
"tap_to_run_job": "Toca para ejecutar la tarea",
|
||||||
"template": "Plantilla",
|
"template": "Plantilla",
|
||||||
"theme": "Tema",
|
"theme": "Tema",
|
||||||
"theme_selection": "Selección de tema",
|
"theme_selection": "Selección de tema",
|
||||||
@@ -1914,10 +1951,13 @@
|
|||||||
"updated_at": "Actualizado",
|
"updated_at": "Actualizado",
|
||||||
"updated_password": "Contraseña actualizada",
|
"updated_password": "Contraseña actualizada",
|
||||||
"upload": "Subir",
|
"upload": "Subir",
|
||||||
|
"upload_action_prompt": "{count} en cola para carga",
|
||||||
"upload_concurrency": "Subidas simultáneas",
|
"upload_concurrency": "Subidas simultáneas",
|
||||||
|
"upload_details": "Cargar Detalles",
|
||||||
"upload_dialog_info": "¿Quieres hacer una copia de seguridad al servidor de los elementos seleccionados?",
|
"upload_dialog_info": "¿Quieres hacer una copia de seguridad al servidor de los elementos seleccionados?",
|
||||||
"upload_dialog_title": "Subir elementos",
|
"upload_dialog_title": "Subir elementos",
|
||||||
"upload_errors": "Subida completada con {count, plural, one {# error} other {# errores}}, actualice la página para ver los nuevos recursos de la subida.",
|
"upload_errors": "Subida completada con {count, plural, one {# error} other {# errores}}, actualice la página para ver los nuevos recursos de la subida.",
|
||||||
|
"upload_finished": "Carga finalizada",
|
||||||
"upload_progress": "Restante {remaining, number} - Procesado {processed, number}/{total, number}",
|
"upload_progress": "Restante {remaining, number} - Procesado {processed, number}/{total, number}",
|
||||||
"upload_skipped_duplicates": "Saltado {count, plural, one {# duplicate asset} other {# duplicate assets}}",
|
"upload_skipped_duplicates": "Saltado {count, plural, one {# duplicate asset} other {# duplicate assets}}",
|
||||||
"upload_status_duplicates": "Duplicados",
|
"upload_status_duplicates": "Duplicados",
|
||||||
@@ -1926,6 +1966,7 @@
|
|||||||
"upload_success": "Subida realizada correctamente, actualice la página para ver los nuevos recursos de subida.",
|
"upload_success": "Subida realizada correctamente, actualice la página para ver los nuevos recursos de subida.",
|
||||||
"upload_to_immich": "Subir a Immich ({count})",
|
"upload_to_immich": "Subir a Immich ({count})",
|
||||||
"uploading": "Subiendo",
|
"uploading": "Subiendo",
|
||||||
|
"uploading_media": "Subiendo medios",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"usage": "Uso",
|
"usage": "Uso",
|
||||||
"use_biometric": "Uso biométrico",
|
"use_biometric": "Uso biométrico",
|
||||||
@@ -1965,6 +2006,7 @@
|
|||||||
"view_album": "Ver Álbum",
|
"view_album": "Ver Álbum",
|
||||||
"view_all": "Ver todas",
|
"view_all": "Ver todas",
|
||||||
"view_all_users": "Mostrar todos los usuarios",
|
"view_all_users": "Mostrar todos los usuarios",
|
||||||
|
"view_details": "Ver Detalles",
|
||||||
"view_in_timeline": "Mostrar en la línea de tiempo",
|
"view_in_timeline": "Mostrar en la línea de tiempo",
|
||||||
"view_link": "Ver enlace",
|
"view_link": "Ver enlace",
|
||||||
"view_links": "Mostrar enlaces",
|
"view_links": "Mostrar enlaces",
|
||||||
|
|||||||
35
i18n/et.json
@@ -14,6 +14,7 @@
|
|||||||
"add_a_location": "Lisa asukoht",
|
"add_a_location": "Lisa asukoht",
|
||||||
"add_a_name": "Lisa nimi",
|
"add_a_name": "Lisa nimi",
|
||||||
"add_a_title": "Lisa pealkiri",
|
"add_a_title": "Lisa pealkiri",
|
||||||
|
"add_birthday": "Lisa sünnipäev",
|
||||||
"add_endpoint": "Lisa lõpp-punkt",
|
"add_endpoint": "Lisa lõpp-punkt",
|
||||||
"add_exclusion_pattern": "Lisa välistamismuster",
|
"add_exclusion_pattern": "Lisa välistamismuster",
|
||||||
"add_import_path": "Lisa imporditee",
|
"add_import_path": "Lisa imporditee",
|
||||||
@@ -44,6 +45,13 @@
|
|||||||
"backup_database": "Loo andmebaasi tõmmis",
|
"backup_database": "Loo andmebaasi tõmmis",
|
||||||
"backup_database_enable_description": "Luba andmebaasi tõmmised",
|
"backup_database_enable_description": "Luba andmebaasi tõmmised",
|
||||||
"backup_keep_last_amount": "Eelmiste tõmmiste arv, mida alles hoida",
|
"backup_keep_last_amount": "Eelmiste tõmmiste arv, mida alles hoida",
|
||||||
|
"backup_onboarding_1_description": "asukohaväline koopia pilves või teises füüsilises asukohas.",
|
||||||
|
"backup_onboarding_2_description": "lokaalset koopiat erinevatel seadmetel. See hõlmab põhifaile ja nende failide lokaalsed varundust.",
|
||||||
|
"backup_onboarding_3_description": "koopiat su andmetest, kaasa arvatud originaalfailid. See hõlmab üht asukohavälist ja kaht lokaalset koopiat.",
|
||||||
|
"backup_onboarding_description": "Andmete kaitsmiseks on soovituslik <backblaze-link>3-2-1 varundusstrateegia</backblaze-link>. Põhjaliku varunduse jaoks peaksid talletama koopiaid nii oma üleslaaditud fotodest ja videotest kui ka Immich'i andmebaasist.",
|
||||||
|
"backup_onboarding_footer": "Rohkem informatsiooni Immich'i varundamise kohta leiad <link>dokumentatsioonist</link>.",
|
||||||
|
"backup_onboarding_parts_title": "3-2-1 varundus hõlmab:",
|
||||||
|
"backup_onboarding_title": "Varukoopiad",
|
||||||
"backup_settings": "Andmebaasi tõmmiste seaded",
|
"backup_settings": "Andmebaasi tõmmiste seaded",
|
||||||
"backup_settings_description": "Halda andmebaasi tõmmiste seadeid.",
|
"backup_settings_description": "Halda andmebaasi tõmmiste seadeid.",
|
||||||
"cleared_jobs": "Tööted eemaldatud: {job}",
|
"cleared_jobs": "Tööted eemaldatud: {job}",
|
||||||
@@ -397,6 +405,7 @@
|
|||||||
"album_cover_updated": "Albumi kaanepilt muudetud",
|
"album_cover_updated": "Albumi kaanepilt muudetud",
|
||||||
"album_delete_confirmation": "Kas oled kindel, et soovid albumi {album} kustutada?",
|
"album_delete_confirmation": "Kas oled kindel, et soovid albumi {album} kustutada?",
|
||||||
"album_delete_confirmation_description": "Kui see album on jagatud, ei pääse teised kasutajad sellele enam ligi.",
|
"album_delete_confirmation_description": "Kui see album on jagatud, ei pääse teised kasutajad sellele enam ligi.",
|
||||||
|
"album_deleted": "Album kustutatud",
|
||||||
"album_info_card_backup_album_excluded": "VÄLJA JÄETUD",
|
"album_info_card_backup_album_excluded": "VÄLJA JÄETUD",
|
||||||
"album_info_card_backup_album_included": "LISATUD",
|
"album_info_card_backup_album_included": "LISATUD",
|
||||||
"album_info_updated": "Albumi info muudetud",
|
"album_info_updated": "Albumi info muudetud",
|
||||||
@@ -510,6 +519,7 @@
|
|||||||
"back_close_deselect": "Tagasi, sulge või tühista valik",
|
"back_close_deselect": "Tagasi, sulge või tühista valik",
|
||||||
"background_location_permission": "Taustal asukoha luba",
|
"background_location_permission": "Taustal asukoha luba",
|
||||||
"background_location_permission_content": "Et taustal töötades võrguühendust vahetada, peab Immich'il *alati* olema täpse asukoha luba, et rakendus saaks WiFi-võrgu nime lugeda",
|
"background_location_permission_content": "Et taustal töötades võrguühendust vahetada, peab Immich'il *alati* olema täpse asukoha luba, et rakendus saaks WiFi-võrgu nime lugeda",
|
||||||
|
"backup": "Varundamine",
|
||||||
"backup_album_selection_page_albums_device": "Albumid seadmel ({count})",
|
"backup_album_selection_page_albums_device": "Albumid seadmel ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Puuduta kaasamiseks, topeltpuuduta välistamiseks",
|
"backup_album_selection_page_albums_tap": "Puuduta kaasamiseks, topeltpuuduta välistamiseks",
|
||||||
"backup_album_selection_page_assets_scatter": "Üksused võivad olla jaotatud mitme albumi vahel. Seega saab albumeid varundamise protsessi kaasata või välistada.",
|
"backup_album_selection_page_assets_scatter": "Üksused võivad olla jaotatud mitme albumi vahel. Seega saab albumeid varundamise protsessi kaasata või välistada.",
|
||||||
@@ -723,6 +733,7 @@
|
|||||||
"current_server_address": "Praegune serveri aadress",
|
"current_server_address": "Praegune serveri aadress",
|
||||||
"custom_locale": "Kohandatud lokaat",
|
"custom_locale": "Kohandatud lokaat",
|
||||||
"custom_locale_description": "Vorminda kuupäevad ja arvud vastavalt keelele ja regioonile",
|
"custom_locale_description": "Vorminda kuupäevad ja arvud vastavalt keelele ja regioonile",
|
||||||
|
"custom_url": "Kohandatud URL",
|
||||||
"daily_title_text_date": "d. MMMM",
|
"daily_title_text_date": "d. MMMM",
|
||||||
"daily_title_text_date_year": "d. MMMM yyyy",
|
"daily_title_text_date_year": "d. MMMM yyyy",
|
||||||
"dark": "Tume",
|
"dark": "Tume",
|
||||||
@@ -742,7 +753,8 @@
|
|||||||
"default_locale": "Vaikimisi lokaat",
|
"default_locale": "Vaikimisi lokaat",
|
||||||
"default_locale_description": "Vorminda kuupäevad ja numbrid vastavalt brauseri lokaadile",
|
"default_locale_description": "Vorminda kuupäevad ja numbrid vastavalt brauseri lokaadile",
|
||||||
"delete": "Kustuta",
|
"delete": "Kustuta",
|
||||||
"delete_action_prompt": "{count} jäädavalt kustutatud",
|
"delete_action_confirmation_message": "Kas oled kindel, et soovid selle üksuse kustutada? See toiming liigutab üksuse serveri prügikasti ja küsib, kas soovid selle lokaalselt kustutada",
|
||||||
|
"delete_action_prompt": "{count} kustutatud",
|
||||||
"delete_album": "Kustuta album",
|
"delete_album": "Kustuta album",
|
||||||
"delete_api_key_prompt": "Kas oled kindel, et soovid selle API võtme kustutada?",
|
"delete_api_key_prompt": "Kas oled kindel, et soovid selle API võtme kustutada?",
|
||||||
"delete_dialog_alert": "Need üksused kustutatakse jäädavalt Immich'ist ja sinu seadmest",
|
"delete_dialog_alert": "Need üksused kustutatakse jäädavalt Immich'ist ja sinu seadmest",
|
||||||
@@ -760,6 +772,8 @@
|
|||||||
"delete_local_dialog_ok_backed_up_only": "Kustuta ainult varundatud",
|
"delete_local_dialog_ok_backed_up_only": "Kustuta ainult varundatud",
|
||||||
"delete_local_dialog_ok_force": "Kustuta sellegipoolest",
|
"delete_local_dialog_ok_force": "Kustuta sellegipoolest",
|
||||||
"delete_others": "Kustuta teised",
|
"delete_others": "Kustuta teised",
|
||||||
|
"delete_permanently": "Kustuta jäädavalt",
|
||||||
|
"delete_permanently_action_prompt": "{count} jäädavalt kustutatud",
|
||||||
"delete_shared_link": "Kustuta jagatud link",
|
"delete_shared_link": "Kustuta jagatud link",
|
||||||
"delete_shared_link_dialog_title": "Kustuta jagatud link",
|
"delete_shared_link_dialog_title": "Kustuta jagatud link",
|
||||||
"delete_tag": "Kustuta silt",
|
"delete_tag": "Kustuta silt",
|
||||||
@@ -815,6 +829,7 @@
|
|||||||
"edit": "Muuda",
|
"edit": "Muuda",
|
||||||
"edit_album": "Muuda albumit",
|
"edit_album": "Muuda albumit",
|
||||||
"edit_avatar": "Muuda avatari",
|
"edit_avatar": "Muuda avatari",
|
||||||
|
"edit_birthday": "Muuda sünnipäeva",
|
||||||
"edit_date": "Muuda kuupäeva",
|
"edit_date": "Muuda kuupäeva",
|
||||||
"edit_date_and_time": "Muuda kuupäeva ja kellaaega",
|
"edit_date_and_time": "Muuda kuupäeva ja kellaaega",
|
||||||
"edit_description": "Muuda kirjeldust",
|
"edit_description": "Muuda kirjeldust",
|
||||||
@@ -982,6 +997,7 @@
|
|||||||
},
|
},
|
||||||
"exif": "Exif",
|
"exif": "Exif",
|
||||||
"exif_bottom_sheet_description": "Lisa kirjeldus...",
|
"exif_bottom_sheet_description": "Lisa kirjeldus...",
|
||||||
|
"exif_bottom_sheet_description_error": "Viga kirjelduse muutmisel",
|
||||||
"exif_bottom_sheet_details": "ÜKSIKASJAD",
|
"exif_bottom_sheet_details": "ÜKSIKASJAD",
|
||||||
"exif_bottom_sheet_location": "ASUKOHT",
|
"exif_bottom_sheet_location": "ASUKOHT",
|
||||||
"exif_bottom_sheet_people": "ISIKUD",
|
"exif_bottom_sheet_people": "ISIKUD",
|
||||||
@@ -1002,6 +1018,8 @@
|
|||||||
"explorer": "Brauser",
|
"explorer": "Brauser",
|
||||||
"export": "Ekspordi",
|
"export": "Ekspordi",
|
||||||
"export_as_json": "Ekspordi JSON-formaati",
|
"export_as_json": "Ekspordi JSON-formaati",
|
||||||
|
"export_database": "Ekspordi andmebaas",
|
||||||
|
"export_database_description": "Ekspordi SQLite andmebaas",
|
||||||
"extension": "Laiend",
|
"extension": "Laiend",
|
||||||
"external": "Väline",
|
"external": "Väline",
|
||||||
"external_libraries": "Välised kogud",
|
"external_libraries": "Välised kogud",
|
||||||
@@ -1146,6 +1164,7 @@
|
|||||||
"language_no_results_title": "Ühtegi keelt ei leitud",
|
"language_no_results_title": "Ühtegi keelt ei leitud",
|
||||||
"language_search_hint": "Otsi keeli...",
|
"language_search_hint": "Otsi keeli...",
|
||||||
"language_setting_description": "Vali oma eelistatud keel",
|
"language_setting_description": "Vali oma eelistatud keel",
|
||||||
|
"large_files": "Suured failid",
|
||||||
"last_seen": "Viimati nähtud",
|
"last_seen": "Viimati nähtud",
|
||||||
"latest_version": "Uusim versioon",
|
"latest_version": "Uusim versioon",
|
||||||
"latitude": "Laiuskraad",
|
"latitude": "Laiuskraad",
|
||||||
@@ -1165,13 +1184,12 @@
|
|||||||
"light": "Hele",
|
"light": "Hele",
|
||||||
"like_deleted": "Meeldimine kustutatud",
|
"like_deleted": "Meeldimine kustutatud",
|
||||||
"link_motion_video": "Lingi liikuv video",
|
"link_motion_video": "Lingi liikuv video",
|
||||||
"link_options": "Lingi valikud",
|
|
||||||
"link_to_oauth": "Ühenda OAuth",
|
"link_to_oauth": "Ühenda OAuth",
|
||||||
"linked_oauth_account": "OAuth konto ühendatud",
|
"linked_oauth_account": "OAuth konto ühendatud",
|
||||||
"list": "Loend",
|
"list": "Loend",
|
||||||
"loading": "Laadimine",
|
"loading": "Laadimine",
|
||||||
"loading_search_results_failed": "Otsitulemuste laadimine ebaõnnestus",
|
"loading_search_results_failed": "Otsitulemuste laadimine ebaõnnestus",
|
||||||
"local": "Lokaalne üksus",
|
"local": "Lokaalsed",
|
||||||
"local_asset_cast_failed": "Ei saa edastada üksust, mis pole serverisse üles laaditud",
|
"local_asset_cast_failed": "Ei saa edastada üksust, mis pole serverisse üles laaditud",
|
||||||
"local_assets": "Lokaalsed üksused",
|
"local_assets": "Lokaalsed üksused",
|
||||||
"local_network": "Kohalik võrk",
|
"local_network": "Kohalik võrk",
|
||||||
@@ -1230,8 +1248,7 @@
|
|||||||
"manage_your_devices": "Halda oma autenditud seadmeid",
|
"manage_your_devices": "Halda oma autenditud seadmeid",
|
||||||
"manage_your_oauth_connection": "Halda oma OAuth ühendust",
|
"manage_your_oauth_connection": "Halda oma OAuth ühendust",
|
||||||
"map": "Kaart",
|
"map": "Kaart",
|
||||||
"map_assets_in_bound": "{count} foto",
|
"map_assets_in_bounds": "{count, plural, one {# foto} other {# fotot}}",
|
||||||
"map_assets_in_bounds": "{count} fotot",
|
|
||||||
"map_cannot_get_user_location": "Ei saa kasutaja asukohta tuvastada",
|
"map_cannot_get_user_location": "Ei saa kasutaja asukohta tuvastada",
|
||||||
"map_location_dialog_yes": "Jah",
|
"map_location_dialog_yes": "Jah",
|
||||||
"map_location_picker_page_use_location": "Kasuta seda asukohta",
|
"map_location_picker_page_use_location": "Kasuta seda asukohta",
|
||||||
@@ -1529,7 +1546,7 @@
|
|||||||
"refreshing_faces": "Nägude värskendamine",
|
"refreshing_faces": "Nägude värskendamine",
|
||||||
"refreshing_metadata": "Metaandmete värskendamine",
|
"refreshing_metadata": "Metaandmete värskendamine",
|
||||||
"regenerating_thumbnails": "Pisipiltide uuesti genereerimine",
|
"regenerating_thumbnails": "Pisipiltide uuesti genereerimine",
|
||||||
"remote": "Kaugüksus",
|
"remote": "Serveris",
|
||||||
"remote_assets": "Kaugüksused",
|
"remote_assets": "Kaugüksused",
|
||||||
"remove": "Eemalda",
|
"remove": "Eemalda",
|
||||||
"remove_assets_album_confirmation": "Kas oled kindel, et soovid {count, plural, one {# üksuse} other {# üksust}} albumist eemaldada?",
|
"remove_assets_album_confirmation": "Kas oled kindel, et soovid {count, plural, one {# üksuse} other {# üksust}} albumist eemaldada?",
|
||||||
@@ -1582,6 +1599,7 @@
|
|||||||
"resume": "Jätka",
|
"resume": "Jätka",
|
||||||
"retry_upload": "Proovi üleslaadimist uuesti",
|
"retry_upload": "Proovi üleslaadimist uuesti",
|
||||||
"review_duplicates": "Vaata duplikaadid läbi",
|
"review_duplicates": "Vaata duplikaadid läbi",
|
||||||
|
"review_large_files": "Vaata suured failid läbi",
|
||||||
"role": "Roll",
|
"role": "Roll",
|
||||||
"role_editor": "Muutja",
|
"role_editor": "Muutja",
|
||||||
"role_viewer": "Vaataja",
|
"role_viewer": "Vaataja",
|
||||||
@@ -1739,6 +1757,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "Kopeeritud lõikelauale",
|
"shared_link_clipboard_copied_massage": "Kopeeritud lõikelauale",
|
||||||
"shared_link_clipboard_text": "Link: {link}\nParool: {password}",
|
"shared_link_clipboard_text": "Link: {link}\nParool: {password}",
|
||||||
"shared_link_create_error": "Viga jagatud lingi loomisel",
|
"shared_link_create_error": "Viga jagatud lingi loomisel",
|
||||||
|
"shared_link_custom_url_description": "Ligipääs jagatud lingile kohandatud URL-i kaudu",
|
||||||
"shared_link_edit_description_hint": "Sisesta jagatud lingi kirjeldus",
|
"shared_link_edit_description_hint": "Sisesta jagatud lingi kirjeldus",
|
||||||
"shared_link_edit_expire_after_option_day": "1 päev",
|
"shared_link_edit_expire_after_option_day": "1 päev",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} päeva",
|
"shared_link_edit_expire_after_option_days": "{count} päeva",
|
||||||
@@ -1764,6 +1783,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "Halda jagatud linke",
|
"shared_link_manage_links": "Halda jagatud linke",
|
||||||
"shared_link_options": "Jagatud lingi valikud",
|
"shared_link_options": "Jagatud lingi valikud",
|
||||||
|
"shared_link_password_description": "Nõua jagatud lingile ligi pääsemiseks parooli",
|
||||||
"shared_links": "Jagatud lingid",
|
"shared_links": "Jagatud lingid",
|
||||||
"shared_links_description": "Jaga fotosid ja videosid lingiga",
|
"shared_links_description": "Jaga fotosid ja videosid lingiga",
|
||||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# jagatud fotot ja videot.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, other {# jagatud fotot ja videot.}}",
|
||||||
@@ -1941,11 +1961,13 @@
|
|||||||
"updated_at": "Uuendatud",
|
"updated_at": "Uuendatud",
|
||||||
"updated_password": "Parool muudetud",
|
"updated_password": "Parool muudetud",
|
||||||
"upload": "Laadi üles",
|
"upload": "Laadi üles",
|
||||||
|
"upload_action_prompt": "{count} üleslaadimise ootel",
|
||||||
"upload_concurrency": "Üleslaadimise samaaegsus",
|
"upload_concurrency": "Üleslaadimise samaaegsus",
|
||||||
"upload_details": "Üleslaadimise üksikasjad",
|
"upload_details": "Üleslaadimise üksikasjad",
|
||||||
"upload_dialog_info": "Kas soovid valitud üksuse(d) serverisse varundada?",
|
"upload_dialog_info": "Kas soovid valitud üksuse(d) serverisse varundada?",
|
||||||
"upload_dialog_title": "Üksuse üleslaadimine",
|
"upload_dialog_title": "Üksuse üleslaadimine",
|
||||||
"upload_errors": "Üleslaadimine lõpetatud {count, plural, one {# veaga} other {# veaga}}, uute üksuste nägemiseks värskenda lehte.",
|
"upload_errors": "Üleslaadimine lõpetatud {count, plural, one {# veaga} other {# veaga}}, uute üksuste nägemiseks värskenda lehte.",
|
||||||
|
"upload_finished": "Üleslaadimine lõpetatud",
|
||||||
"upload_progress": "Ootel {remaining, number} - Töödeldud {processed, number}/{total, number}",
|
"upload_progress": "Ootel {remaining, number} - Töödeldud {processed, number}/{total, number}",
|
||||||
"upload_skipped_duplicates": "{count, plural, one {# dubleeritud üksus} other {# dubleeritud üksust}} vahele jäetud",
|
"upload_skipped_duplicates": "{count, plural, one {# dubleeritud üksus} other {# dubleeritud üksust}} vahele jäetud",
|
||||||
"upload_status_duplicates": "Duplikaadid",
|
"upload_status_duplicates": "Duplikaadid",
|
||||||
@@ -1954,6 +1976,7 @@
|
|||||||
"upload_success": "Üleslaadimine õnnestus, uute üksuste nägemiseks värskenda lehte.",
|
"upload_success": "Üleslaadimine õnnestus, uute üksuste nägemiseks värskenda lehte.",
|
||||||
"upload_to_immich": "Laadi Immich'isse ({count})",
|
"upload_to_immich": "Laadi Immich'isse ({count})",
|
||||||
"uploading": "Üleslaadimine",
|
"uploading": "Üleslaadimine",
|
||||||
|
"uploading_media": "Meediumi üleslaadimine",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"usage": "Kasutus",
|
"usage": "Kasutus",
|
||||||
"use_biometric": "Kasuta biomeetriat",
|
"use_biometric": "Kasuta biomeetriat",
|
||||||
|
|||||||
@@ -471,7 +471,6 @@
|
|||||||
"library": "کتابخانه",
|
"library": "کتابخانه",
|
||||||
"library_options": "گزینههای کتابخانه",
|
"library_options": "گزینههای کتابخانه",
|
||||||
"light": "روشن",
|
"light": "روشن",
|
||||||
"link_options": "گزینههای لینک",
|
|
||||||
"link_to_oauth": "اتصال به OAuth",
|
"link_to_oauth": "اتصال به OAuth",
|
||||||
"linked_oauth_account": "حساب OAuth متصل شده",
|
"linked_oauth_account": "حساب OAuth متصل شده",
|
||||||
"list": "لیست",
|
"list": "لیست",
|
||||||
@@ -493,7 +492,6 @@
|
|||||||
"manage_your_devices": "مدیریت دستگاههای متصل",
|
"manage_your_devices": "مدیریت دستگاههای متصل",
|
||||||
"manage_your_oauth_connection": "مدیریت اتصال OAuth",
|
"manage_your_oauth_connection": "مدیریت اتصال OAuth",
|
||||||
"map": "نقشه",
|
"map": "نقشه",
|
||||||
"map_assets_in_bound": "{count} عکس",
|
|
||||||
"map_assets_in_bounds": "{count} عکس ها",
|
"map_assets_in_bounds": "{count} عکس ها",
|
||||||
"map_cannot_get_user_location": "موقعیت مکانی در دسترس نیست",
|
"map_cannot_get_user_location": "موقعیت مکانی در دسترس نیست",
|
||||||
"map_location_dialog_yes": "بله",
|
"map_location_dialog_yes": "بله",
|
||||||
|
|||||||
@@ -373,6 +373,7 @@
|
|||||||
"admin_password": "Ylläpitäjän salasana",
|
"admin_password": "Ylläpitäjän salasana",
|
||||||
"administration": "Ylläpito",
|
"administration": "Ylläpito",
|
||||||
"advanced": "Edistyneet",
|
"advanced": "Edistyneet",
|
||||||
|
"advanced_settings_beta_timeline_subtitle": "Kokeile uutta sovelluskokemusta",
|
||||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Käytä tätä vaihtoehtoa suodattaaksesi mediaa synkronoinnin aikana vaihtoehtoisten kriteerien perusteella. Kokeile tätä vain, jos sovelluksessa on ongelmia kaikkien albumien tunnistamisessa.",
|
"advanced_settings_enable_alternate_media_filter_subtitle": "Käytä tätä vaihtoehtoa suodattaaksesi mediaa synkronoinnin aikana vaihtoehtoisten kriteerien perusteella. Kokeile tätä vain, jos sovelluksessa on ongelmia kaikkien albumien tunnistamisessa.",
|
||||||
"advanced_settings_enable_alternate_media_filter_title": "[KOKEELLINEN] Käytä vaihtoehtoisen laitteen albumin synkronointisuodatinta",
|
"advanced_settings_enable_alternate_media_filter_title": "[KOKEELLINEN] Käytä vaihtoehtoisen laitteen albumin synkronointisuodatinta",
|
||||||
"advanced_settings_log_level_title": "Kirjaustaso: {level}",
|
"advanced_settings_log_level_title": "Kirjaustaso: {level}",
|
||||||
@@ -506,6 +507,7 @@
|
|||||||
"back_close_deselect": "Palaa, sulje tai poista valinnat",
|
"back_close_deselect": "Palaa, sulje tai poista valinnat",
|
||||||
"background_location_permission": "Taustasijainnin käyttöoikeus",
|
"background_location_permission": "Taustasijainnin käyttöoikeus",
|
||||||
"background_location_permission_content": "Jotta sovellus voi vaihtaa verkkoa taustalla toimiessaan, Immichillä on *aina* oltava pääsy tarkkaan sijaintiin, jotta se voi lukea Wi-Fi-verkon nimen",
|
"background_location_permission_content": "Jotta sovellus voi vaihtaa verkkoa taustalla toimiessaan, Immichillä on *aina* oltava pääsy tarkkaan sijaintiin, jotta se voi lukea Wi-Fi-verkon nimen",
|
||||||
|
"backup": "Varmuuskopiointi",
|
||||||
"backup_album_selection_page_albums_device": "Laitteen albumit ({count})",
|
"backup_album_selection_page_albums_device": "Laitteen albumit ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Napauta sisällyttääksesi, kaksoisnapauta jättääksesi pois",
|
"backup_album_selection_page_albums_tap": "Napauta sisällyttääksesi, kaksoisnapauta jättääksesi pois",
|
||||||
"backup_album_selection_page_assets_scatter": "Kohteet voivat olla hajaantuneina useisiin albumeihin. Albumeita voidaan sisällyttää varmuuskopiointiin tai jättää siitä pois.",
|
"backup_album_selection_page_assets_scatter": "Kohteet voivat olla hajaantuneina useisiin albumeihin. Albumeita voidaan sisällyttää varmuuskopiointiin tai jättää siitä pois.",
|
||||||
@@ -1149,7 +1151,6 @@
|
|||||||
"light": "Vaalea",
|
"light": "Vaalea",
|
||||||
"like_deleted": "Tykkäys poistettu",
|
"like_deleted": "Tykkäys poistettu",
|
||||||
"link_motion_video": "Linkitä liikevideo",
|
"link_motion_video": "Linkitä liikevideo",
|
||||||
"link_options": "Linkin asetukset",
|
|
||||||
"link_to_oauth": "Linkki OAuth",
|
"link_to_oauth": "Linkki OAuth",
|
||||||
"linked_oauth_account": "Linkitetty OAuth-tili",
|
"linked_oauth_account": "Linkitetty OAuth-tili",
|
||||||
"list": "Lista",
|
"list": "Lista",
|
||||||
@@ -1212,7 +1213,6 @@
|
|||||||
"manage_your_devices": "Hallitse sisäänkirjautuneita laitteitasi",
|
"manage_your_devices": "Hallitse sisäänkirjautuneita laitteitasi",
|
||||||
"manage_your_oauth_connection": "Hallitse OAuth-yhteyttäsi",
|
"manage_your_oauth_connection": "Hallitse OAuth-yhteyttäsi",
|
||||||
"map": "Kartta",
|
"map": "Kartta",
|
||||||
"map_assets_in_bound": "{count} kuva",
|
|
||||||
"map_assets_in_bounds": "{count} kuvaa",
|
"map_assets_in_bounds": "{count} kuvaa",
|
||||||
"map_cannot_get_user_location": "Käyttäjän sijaintia ei voitu määrittää",
|
"map_cannot_get_user_location": "Käyttäjän sijaintia ei voitu määrittää",
|
||||||
"map_location_dialog_yes": "Kyllä",
|
"map_location_dialog_yes": "Kyllä",
|
||||||
|
|||||||
40
i18n/fr.json
@@ -397,6 +397,7 @@
|
|||||||
"album_cover_updated": "Couverture de l'album mise à jour",
|
"album_cover_updated": "Couverture de l'album mise à jour",
|
||||||
"album_delete_confirmation": "Êtes-vous sûr de vouloir supprimer l'album {album} ?",
|
"album_delete_confirmation": "Êtes-vous sûr de vouloir supprimer l'album {album} ?",
|
||||||
"album_delete_confirmation_description": "Si cet album est partagé, les autres utilisateurs ne pourront plus y accéder.",
|
"album_delete_confirmation_description": "Si cet album est partagé, les autres utilisateurs ne pourront plus y accéder.",
|
||||||
|
"album_deleted": "Album supprimé",
|
||||||
"album_info_card_backup_album_excluded": "EXCLUS",
|
"album_info_card_backup_album_excluded": "EXCLUS",
|
||||||
"album_info_card_backup_album_included": "INCLUS",
|
"album_info_card_backup_album_included": "INCLUS",
|
||||||
"album_info_updated": "Détails de l'album mis à jour",
|
"album_info_updated": "Détails de l'album mis à jour",
|
||||||
@@ -510,6 +511,7 @@
|
|||||||
"back_close_deselect": "Retournez en arrière, fermez ou désélectionnez",
|
"back_close_deselect": "Retournez en arrière, fermez ou désélectionnez",
|
||||||
"background_location_permission": "Permission de localisation en arrière plan",
|
"background_location_permission": "Permission de localisation en arrière plan",
|
||||||
"background_location_permission_content": "Afin de pouvoir changer d'adresse en arrière plan, Immich doit avoir *en permanence* accès à la localisation précise, afin d'accéder au le nom du réseau Wi-Fi utilisé",
|
"background_location_permission_content": "Afin de pouvoir changer d'adresse en arrière plan, Immich doit avoir *en permanence* accès à la localisation précise, afin d'accéder au le nom du réseau Wi-Fi utilisé",
|
||||||
|
"backup": "Sauvegarde",
|
||||||
"backup_album_selection_page_albums_device": "Albums sur l'appareil ({count})",
|
"backup_album_selection_page_albums_device": "Albums sur l'appareil ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Tapez pour inclure, tapez deux fois pour exclure",
|
"backup_album_selection_page_albums_tap": "Tapez pour inclure, tapez deux fois pour exclure",
|
||||||
"backup_album_selection_page_assets_scatter": "Les éléments peuvent être répartis sur plusieurs albums. De ce fait, les albums peuvent être inclus ou exclus pendant le processus de sauvegarde.",
|
"backup_album_selection_page_assets_scatter": "Les éléments peuvent être répartis sur plusieurs albums. De ce fait, les albums peuvent être inclus ou exclus pendant le processus de sauvegarde.",
|
||||||
@@ -562,7 +564,7 @@
|
|||||||
"backup_controller_page_to_backup": "Albums à sauvegarder",
|
"backup_controller_page_to_backup": "Albums à sauvegarder",
|
||||||
"backup_controller_page_total_sub": "Toutes les photos et vidéos uniques des albums sélectionnés",
|
"backup_controller_page_total_sub": "Toutes les photos et vidéos uniques des albums sélectionnés",
|
||||||
"backup_controller_page_turn_off": "Désactiver la sauvegarde",
|
"backup_controller_page_turn_off": "Désactiver la sauvegarde",
|
||||||
"backup_controller_page_turn_on": "Activer la sauvegarde",
|
"backup_controller_page_turn_on": "Activer la sauvegarde au premier plan",
|
||||||
"backup_controller_page_uploading_file_info": "Envoi des informations du fichier",
|
"backup_controller_page_uploading_file_info": "Envoi des informations du fichier",
|
||||||
"backup_err_only_album": "Impossible de retirer le seul album",
|
"backup_err_only_album": "Impossible de retirer le seul album",
|
||||||
"backup_info_card_assets": "éléments",
|
"backup_info_card_assets": "éléments",
|
||||||
@@ -592,7 +594,7 @@
|
|||||||
"cache_settings_clear_cache_button": "Effacer le cache",
|
"cache_settings_clear_cache_button": "Effacer le cache",
|
||||||
"cache_settings_clear_cache_button_title": "Efface le cache de l'application. Cela aura un impact significatif sur les performances de l'application jusqu'à ce que le cache soit reconstruit.",
|
"cache_settings_clear_cache_button_title": "Efface le cache de l'application. Cela aura un impact significatif sur les performances de l'application jusqu'à ce que le cache soit reconstruit.",
|
||||||
"cache_settings_duplicated_assets_clear_button": "EFFACER",
|
"cache_settings_duplicated_assets_clear_button": "EFFACER",
|
||||||
"cache_settings_duplicated_assets_subtitle": "Photos et vidéos qui sont exclues par l'application",
|
"cache_settings_duplicated_assets_subtitle": "Photos et vidéos qui sont ignorées par l'application",
|
||||||
"cache_settings_duplicated_assets_title": "Médias dupliqués ({count})",
|
"cache_settings_duplicated_assets_title": "Médias dupliqués ({count})",
|
||||||
"cache_settings_statistics_album": "Miniatures de la bibliothèque",
|
"cache_settings_statistics_album": "Miniatures de la bibliothèque",
|
||||||
"cache_settings_statistics_full": "Images complètes",
|
"cache_settings_statistics_full": "Images complètes",
|
||||||
@@ -723,6 +725,7 @@
|
|||||||
"current_server_address": "Adresse actuelle du serveur",
|
"current_server_address": "Adresse actuelle du serveur",
|
||||||
"custom_locale": "Paramètres régionaux personnalisés",
|
"custom_locale": "Paramètres régionaux personnalisés",
|
||||||
"custom_locale_description": "Afficher les dates et nombres en fonction des paramètres régionaux",
|
"custom_locale_description": "Afficher les dates et nombres en fonction des paramètres régionaux",
|
||||||
|
"custom_url": "URL personnalisée",
|
||||||
"daily_title_text_date": "E, dd MMM",
|
"daily_title_text_date": "E, dd MMM",
|
||||||
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
||||||
"dark": "Sombre",
|
"dark": "Sombre",
|
||||||
@@ -742,7 +745,8 @@
|
|||||||
"default_locale": "Région par défaut",
|
"default_locale": "Région par défaut",
|
||||||
"default_locale_description": "Afficher les dates et nombres en fonction des paramètres de votre navigateur",
|
"default_locale_description": "Afficher les dates et nombres en fonction des paramètres de votre navigateur",
|
||||||
"delete": "Supprimer",
|
"delete": "Supprimer",
|
||||||
"delete_action_prompt": "{count} supprimé(s) définitivement",
|
"delete_action_confirmation_message": "Êtes-vous sûr de vouloir supprimer ce média ? Cela déplacera le média dans la poubelle du serveur et vous demandera si vous voulez le supprimer localement",
|
||||||
|
"delete_action_prompt": "{count} supprimé(s)",
|
||||||
"delete_album": "Supprimer l'album",
|
"delete_album": "Supprimer l'album",
|
||||||
"delete_api_key_prompt": "Voulez-vous vraiment supprimer cette clé API ?",
|
"delete_api_key_prompt": "Voulez-vous vraiment supprimer cette clé API ?",
|
||||||
"delete_dialog_alert": "Ces médias seront définitivement supprimés de Immich et de votre appareil",
|
"delete_dialog_alert": "Ces médias seront définitivement supprimés de Immich et de votre appareil",
|
||||||
@@ -760,6 +764,8 @@
|
|||||||
"delete_local_dialog_ok_backed_up_only": "Suppression des données sauvegardées uniquement",
|
"delete_local_dialog_ok_backed_up_only": "Suppression des données sauvegardées uniquement",
|
||||||
"delete_local_dialog_ok_force": "Supprimer tout de même",
|
"delete_local_dialog_ok_force": "Supprimer tout de même",
|
||||||
"delete_others": "Supprimer les autres",
|
"delete_others": "Supprimer les autres",
|
||||||
|
"delete_permanently": "Supprimer définitivement",
|
||||||
|
"delete_permanently_action_prompt": "{count} supprimé(s) définitivement",
|
||||||
"delete_shared_link": "Supprimer le lien partagé",
|
"delete_shared_link": "Supprimer le lien partagé",
|
||||||
"delete_shared_link_dialog_title": "Supprimer le lien partagé",
|
"delete_shared_link_dialog_title": "Supprimer le lien partagé",
|
||||||
"delete_tag": "Supprimer l'étiquette",
|
"delete_tag": "Supprimer l'étiquette",
|
||||||
@@ -845,11 +851,11 @@
|
|||||||
"empty_trash": "Vider la corbeille",
|
"empty_trash": "Vider la corbeille",
|
||||||
"empty_trash_confirmation": "Êtes-vous sûr de vouloir vider la corbeille ? Cela supprimera définitivement de Immich tous les médias qu'elle contient.\nVous ne pouvez pas annuler cette action !",
|
"empty_trash_confirmation": "Êtes-vous sûr de vouloir vider la corbeille ? Cela supprimera définitivement de Immich tous les médias qu'elle contient.\nVous ne pouvez pas annuler cette action !",
|
||||||
"enable": "Active",
|
"enable": "Active",
|
||||||
"enable_backup": "Activer Backup",
|
"enable_backup": "Activer la sauvegarde",
|
||||||
"enable_biometric_auth_description": "Entrez votre code PIN pour activer l'authentification biométrique",
|
"enable_biometric_auth_description": "Entrez votre code PIN pour activer l'authentification biométrique",
|
||||||
"enabled": "Activé",
|
"enabled": "Activé",
|
||||||
"end_date": "Date de fin",
|
"end_date": "Date de fin",
|
||||||
"enqueued": "Mis en file",
|
"enqueued": "Mis en file d'attente",
|
||||||
"enter_wifi_name": "Entrez le nom du réseau wifi",
|
"enter_wifi_name": "Entrez le nom du réseau wifi",
|
||||||
"enter_your_pin_code": "Entrez votre code PIN",
|
"enter_your_pin_code": "Entrez votre code PIN",
|
||||||
"enter_your_pin_code_subtitle": "Entrez votre code PIN pour accéder au dossier verrouillé",
|
"enter_your_pin_code_subtitle": "Entrez votre code PIN pour accéder au dossier verrouillé",
|
||||||
@@ -1002,6 +1008,8 @@
|
|||||||
"explorer": "Explorateur",
|
"explorer": "Explorateur",
|
||||||
"export": "Exporter",
|
"export": "Exporter",
|
||||||
"export_as_json": "Exporter en JSON",
|
"export_as_json": "Exporter en JSON",
|
||||||
|
"export_database": "Exporter la base de données",
|
||||||
|
"export_database_description": "Exporter la base de données SQLite",
|
||||||
"extension": "Extension",
|
"extension": "Extension",
|
||||||
"external": "Externe",
|
"external": "Externe",
|
||||||
"external_libraries": "Bibliothèques externes",
|
"external_libraries": "Bibliothèques externes",
|
||||||
@@ -1088,6 +1096,7 @@
|
|||||||
"host": "Hôte",
|
"host": "Hôte",
|
||||||
"hour": "Heure",
|
"hour": "Heure",
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
|
"idle": "Inactif",
|
||||||
"ignore_icloud_photos": "Ignorer les photos iCloud",
|
"ignore_icloud_photos": "Ignorer les photos iCloud",
|
||||||
"ignore_icloud_photos_description": "Les photos stockées sur iCloud ne seront pas envoyées sur le serveur Immich",
|
"ignore_icloud_photos_description": "Les photos stockées sur iCloud ne seront pas envoyées sur le serveur Immich",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
@@ -1145,6 +1154,7 @@
|
|||||||
"language_no_results_title": "Aucune langue trouvée",
|
"language_no_results_title": "Aucune langue trouvée",
|
||||||
"language_search_hint": "Recherche de langues...",
|
"language_search_hint": "Recherche de langues...",
|
||||||
"language_setting_description": "Sélectionnez votre langue préférée",
|
"language_setting_description": "Sélectionnez votre langue préférée",
|
||||||
|
"large_files": "Fichiers volumineux",
|
||||||
"last_seen": "Dernièrement utilisé",
|
"last_seen": "Dernièrement utilisé",
|
||||||
"latest_version": "Dernière version",
|
"latest_version": "Dernière version",
|
||||||
"latitude": "Latitude",
|
"latitude": "Latitude",
|
||||||
@@ -1164,7 +1174,6 @@
|
|||||||
"light": "Clair",
|
"light": "Clair",
|
||||||
"like_deleted": "Réaction « j'aime » supprimée",
|
"like_deleted": "Réaction « j'aime » supprimée",
|
||||||
"link_motion_video": "Lier la photo animée",
|
"link_motion_video": "Lier la photo animée",
|
||||||
"link_options": "Options de lien",
|
|
||||||
"link_to_oauth": "Lien au service OAuth",
|
"link_to_oauth": "Lien au service OAuth",
|
||||||
"linked_oauth_account": "Compte OAuth rattaché",
|
"linked_oauth_account": "Compte OAuth rattaché",
|
||||||
"list": "Liste",
|
"list": "Liste",
|
||||||
@@ -1229,8 +1238,7 @@
|
|||||||
"manage_your_devices": "Gérer vos appareils",
|
"manage_your_devices": "Gérer vos appareils",
|
||||||
"manage_your_oauth_connection": "Gérer votre connexion OAuth",
|
"manage_your_oauth_connection": "Gérer votre connexion OAuth",
|
||||||
"map": "Carte",
|
"map": "Carte",
|
||||||
"map_assets_in_bound": "{count} photo",
|
"map_assets_in_bounds": "{count, plural, one {# photo} other {# photos}}",
|
||||||
"map_assets_in_bounds": "{count} photos",
|
|
||||||
"map_cannot_get_user_location": "Impossible d'obtenir la localisation de l'utilisateur",
|
"map_cannot_get_user_location": "Impossible d'obtenir la localisation de l'utilisateur",
|
||||||
"map_location_dialog_yes": "Oui",
|
"map_location_dialog_yes": "Oui",
|
||||||
"map_location_picker_page_use_location": "Utiliser ma position",
|
"map_location_picker_page_use_location": "Utiliser ma position",
|
||||||
@@ -1499,7 +1507,7 @@
|
|||||||
"purchase_server_description_2": "Statut de contributeur",
|
"purchase_server_description_2": "Statut de contributeur",
|
||||||
"purchase_server_title": "Serveur",
|
"purchase_server_title": "Serveur",
|
||||||
"purchase_settings_server_activated": "La clé du produit pour le Serveur est gérée par l'administrateur",
|
"purchase_settings_server_activated": "La clé du produit pour le Serveur est gérée par l'administrateur",
|
||||||
"queue_status": "File d'attente {count}/{total}",
|
"queue_status": "{count}/{total} en file d'attente",
|
||||||
"rating": "Étoile d'évaluation",
|
"rating": "Étoile d'évaluation",
|
||||||
"rating_clear": "Effacer l'évaluation",
|
"rating_clear": "Effacer l'évaluation",
|
||||||
"rating_count": "{count, plural, one {# étoile} other {# étoiles}}",
|
"rating_count": "{count, plural, one {# étoile} other {# étoiles}}",
|
||||||
@@ -1528,7 +1536,7 @@
|
|||||||
"refreshing_faces": "Actualisation des visages",
|
"refreshing_faces": "Actualisation des visages",
|
||||||
"refreshing_metadata": "Actualisation des métadonnées",
|
"refreshing_metadata": "Actualisation des métadonnées",
|
||||||
"regenerating_thumbnails": "Regénération des miniatures",
|
"regenerating_thumbnails": "Regénération des miniatures",
|
||||||
"remote": "A distance",
|
"remote": "À distance",
|
||||||
"remote_assets": "Média à distance",
|
"remote_assets": "Média à distance",
|
||||||
"remove": "Supprimer",
|
"remove": "Supprimer",
|
||||||
"remove_assets_album_confirmation": "Êtes-vous sûr de vouloir supprimer {count, plural, one {# média} other {# médias}} de l'album ?",
|
"remove_assets_album_confirmation": "Êtes-vous sûr de vouloir supprimer {count, plural, one {# média} other {# médias}} de l'album ?",
|
||||||
@@ -1568,7 +1576,7 @@
|
|||||||
"reset_people_visibility": "Réinitialiser la visibilité des personnes",
|
"reset_people_visibility": "Réinitialiser la visibilité des personnes",
|
||||||
"reset_pin_code": "Réinitialiser le code PIN",
|
"reset_pin_code": "Réinitialiser le code PIN",
|
||||||
"reset_sqlite": "Réinitialiser la base de données SQLite",
|
"reset_sqlite": "Réinitialiser la base de données SQLite",
|
||||||
"reset_sqlite_confirmation": "Êtes vous sur que vous voulez réinitialiser la base de données SQLite ? Vous devrez vous déconnecter and vous reconnecter à nouveau pour re-synchroniser les données",
|
"reset_sqlite_confirmation": "Êtes-vous certain de vouloir réinitialiser la base de données SQLite ? Vous devrez vous déconnecter puis vous reconnecter à nouveau pour resynchroniser les données",
|
||||||
"reset_sqlite_success": "La base de données SQLite à été réinitialisé avec succès",
|
"reset_sqlite_success": "La base de données SQLite à été réinitialisé avec succès",
|
||||||
"reset_to_default": "Rétablir les valeurs par défaut",
|
"reset_to_default": "Rétablir les valeurs par défaut",
|
||||||
"resolve_duplicates": "Résoudre les doublons",
|
"resolve_duplicates": "Résoudre les doublons",
|
||||||
@@ -1581,10 +1589,11 @@
|
|||||||
"resume": "Reprendre",
|
"resume": "Reprendre",
|
||||||
"retry_upload": "Réessayer l'envoi",
|
"retry_upload": "Réessayer l'envoi",
|
||||||
"review_duplicates": "Consulter les doublons",
|
"review_duplicates": "Consulter les doublons",
|
||||||
|
"review_large_files": "Consulter les fichiers volumineux",
|
||||||
"role": "Rôle",
|
"role": "Rôle",
|
||||||
"role_editor": "Éditeur",
|
"role_editor": "Éditeur",
|
||||||
"role_viewer": "Visionneuse",
|
"role_viewer": "Visionneuse",
|
||||||
"running": "En marche",
|
"running": "En cours",
|
||||||
"save": "Sauvegarder",
|
"save": "Sauvegarder",
|
||||||
"save_to_gallery": "Enregistrer",
|
"save_to_gallery": "Enregistrer",
|
||||||
"saved_api_key": "Clé API sauvegardée",
|
"saved_api_key": "Clé API sauvegardée",
|
||||||
@@ -1738,6 +1747,7 @@
|
|||||||
"shared_link_clipboard_copied_massage": "Copié dans le presse-papier",
|
"shared_link_clipboard_copied_massage": "Copié dans le presse-papier",
|
||||||
"shared_link_clipboard_text": "Lien : {link}\nMot de passe : {password}",
|
"shared_link_clipboard_text": "Lien : {link}\nMot de passe : {password}",
|
||||||
"shared_link_create_error": "Erreur pendant la création du lien partagé",
|
"shared_link_create_error": "Erreur pendant la création du lien partagé",
|
||||||
|
"shared_link_custom_url_description": "Accéder à ce lien partagé avec une URL personnalisée",
|
||||||
"shared_link_edit_description_hint": "Saisir la description du partage",
|
"shared_link_edit_description_hint": "Saisir la description du partage",
|
||||||
"shared_link_edit_expire_after_option_day": "1 jour",
|
"shared_link_edit_expire_after_option_day": "1 jour",
|
||||||
"shared_link_edit_expire_after_option_days": "{count} jours",
|
"shared_link_edit_expire_after_option_days": "{count} jours",
|
||||||
@@ -1763,6 +1773,7 @@
|
|||||||
"shared_link_info_chip_metadata": "EXIF",
|
"shared_link_info_chip_metadata": "EXIF",
|
||||||
"shared_link_manage_links": "Gérer les liens partagés",
|
"shared_link_manage_links": "Gérer les liens partagés",
|
||||||
"shared_link_options": "Options de lien partagé",
|
"shared_link_options": "Options de lien partagé",
|
||||||
|
"shared_link_password_description": "Demander un mot de passe pour accéder à ce lien partagé",
|
||||||
"shared_links": "Liens partagés",
|
"shared_links": "Liens partagés",
|
||||||
"shared_links_description": "Partager les photos et vidéos via un lien",
|
"shared_links_description": "Partager les photos et vidéos via un lien",
|
||||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# photos et vidéos partagées.}}",
|
"shared_photos_and_videos_count": "{assetCount, plural, other {# photos et vidéos partagées.}}",
|
||||||
@@ -1940,11 +1951,13 @@
|
|||||||
"updated_at": "Mis à jour à",
|
"updated_at": "Mis à jour à",
|
||||||
"updated_password": "Mot de passe mis à jour",
|
"updated_password": "Mot de passe mis à jour",
|
||||||
"upload": "Envoyer",
|
"upload": "Envoyer",
|
||||||
|
"upload_action_prompt": "{count} en attente d'envoi",
|
||||||
"upload_concurrency": "Envois simultanés",
|
"upload_concurrency": "Envois simultanés",
|
||||||
"upload_details": "Uploader les details",
|
"upload_details": "Détails des envois",
|
||||||
"upload_dialog_info": "Voulez-vous sauvegarder la sélection vers le serveur ?",
|
"upload_dialog_info": "Voulez-vous sauvegarder la sélection vers le serveur ?",
|
||||||
"upload_dialog_title": "Envoyer le média",
|
"upload_dialog_title": "Envoyer le média",
|
||||||
"upload_errors": "L'envoi s'est complété avec {count, plural, one {# erreur} other {# erreurs}}. Rafraîchissez la page pour voir les nouveaux médias envoyés.",
|
"upload_errors": "L'envoi s'est complété avec {count, plural, one {# erreur} other {# erreurs}}. Rafraîchissez la page pour voir les nouveaux médias envoyés.",
|
||||||
|
"upload_finished": "Envoi fini",
|
||||||
"upload_progress": "{remaining, number} restant(s) - {processed, number} traité(s)/{total, number}",
|
"upload_progress": "{remaining, number} restant(s) - {processed, number} traité(s)/{total, number}",
|
||||||
"upload_skipped_duplicates": "{count, plural, one {# doublon ignoré} other {# doublons ignorés}}",
|
"upload_skipped_duplicates": "{count, plural, one {# doublon ignoré} other {# doublons ignorés}}",
|
||||||
"upload_status_duplicates": "Doublons",
|
"upload_status_duplicates": "Doublons",
|
||||||
@@ -1953,6 +1966,7 @@
|
|||||||
"upload_success": "Envoi réussi. Rafraîchissez la page pour voir les nouveaux médias envoyés.",
|
"upload_success": "Envoi réussi. Rafraîchissez la page pour voir les nouveaux médias envoyés.",
|
||||||
"upload_to_immich": "Envoyer vers Immich ({count})",
|
"upload_to_immich": "Envoyer vers Immich ({count})",
|
||||||
"uploading": "Envoi",
|
"uploading": "Envoi",
|
||||||
|
"uploading_media": "Envoi du média",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"usage": "Utilisation",
|
"usage": "Utilisation",
|
||||||
"use_biometric": "Utiliser l'authentification biométrique",
|
"use_biometric": "Utiliser l'authentification biométrique",
|
||||||
|
|||||||
@@ -476,6 +476,7 @@
|
|||||||
"back_close_deselect": "Atrás, pechar ou deseleccionar",
|
"back_close_deselect": "Atrás, pechar ou deseleccionar",
|
||||||
"background_location_permission": "Permiso de ubicación en segundo plano",
|
"background_location_permission": "Permiso de ubicación en segundo plano",
|
||||||
"background_location_permission_content": "Para cambiar de rede cando se executa en segundo plano, Immich debe ter *sempre* acceso á ubicación precisa para que a aplicación poida ler o nome da rede wifi",
|
"background_location_permission_content": "Para cambiar de rede cando se executa en segundo plano, Immich debe ter *sempre* acceso á ubicación precisa para que a aplicación poida ler o nome da rede wifi",
|
||||||
|
"backup": "Copia de Seguridade",
|
||||||
"backup_album_selection_page_albums_device": "Álbums no dispositivo ({count})",
|
"backup_album_selection_page_albums_device": "Álbums no dispositivo ({count})",
|
||||||
"backup_album_selection_page_albums_tap": "Tocar para incluír, dobre toque para excluír",
|
"backup_album_selection_page_albums_tap": "Tocar para incluír, dobre toque para excluír",
|
||||||
"backup_album_selection_page_assets_scatter": "Os activos poden dispersarse por varios álbums. Polo tanto, os álbums poden incluírse ou excluírse durante o proceso de copia de seguridade.",
|
"backup_album_selection_page_assets_scatter": "Os activos poden dispersarse por varios álbums. Polo tanto, os álbums poden incluírse ou excluírse durante o proceso de copia de seguridade.",
|
||||||
@@ -1070,7 +1071,6 @@
|
|||||||
"light": "Claro",
|
"light": "Claro",
|
||||||
"like_deleted": "Gústame eliminado",
|
"like_deleted": "Gústame eliminado",
|
||||||
"link_motion_video": "Ligar vídeo en movemento",
|
"link_motion_video": "Ligar vídeo en movemento",
|
||||||
"link_options": "Opcións da ligazón",
|
|
||||||
"link_to_oauth": "Ligar a OAuth",
|
"link_to_oauth": "Ligar a OAuth",
|
||||||
"linked_oauth_account": "Conta OAuth ligada",
|
"linked_oauth_account": "Conta OAuth ligada",
|
||||||
"list": "Lista",
|
"list": "Lista",
|
||||||
@@ -1129,7 +1129,6 @@
|
|||||||
"manage_your_devices": "Xestionar os teus dispositivos con sesión iniciada",
|
"manage_your_devices": "Xestionar os teus dispositivos con sesión iniciada",
|
||||||
"manage_your_oauth_connection": "Xestionar a túa conexión OAuth",
|
"manage_your_oauth_connection": "Xestionar a túa conexión OAuth",
|
||||||
"map": "Mapa",
|
"map": "Mapa",
|
||||||
"map_assets_in_bound": "{count} foto",
|
|
||||||
"map_assets_in_bounds": "{count} fotos",
|
"map_assets_in_bounds": "{count} fotos",
|
||||||
"map_cannot_get_user_location": "Non se pode obter a ubicación do usuario",
|
"map_cannot_get_user_location": "Non se pode obter a ubicación do usuario",
|
||||||
"map_location_dialog_yes": "Si",
|
"map_location_dialog_yes": "Si",
|
||||||
|
|||||||