Compare commits

..

37 Commits

Author SHA1 Message Date
Alex
94e315c845 open database 2024-09-04 08:58:30 -05:00
Alex
6f37ab6a9e fix(server): empty trash for archived assets (#12281)
* fix(server): empty trash for archived assets

* use withArchived

* add e2e test
2024-09-03 16:04:35 -05:00
Ben McCann
e5667f09c7 chore(web): upgrade pre-req dependencies for Svelte 5 (#12283) 2024-09-03 16:42:46 -04:00
Zack Pollard
668632c398 ci: split e2e into web / server & cli / linting & run on mich (#12267)
* ci: split e2e tests into web / server & cli / linting

* ci: run e2e on mich
2024-09-03 15:19:47 -04:00
Alex
5d6716d265 chore(mobile): post release task (#12268) 2024-09-03 18:32:20 +01:00
Zack Pollard
b6cad7715f fix: docs oauth formatting issue (#12272) 2024-09-03 15:35:12 +00:00
github-actions
48da4c9317 chore: version v1.113.1 2024-09-03 14:12:24 +00:00
Weblate (bot)
a1d9619a6e chore(web): update translations (#12148)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/et/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/kmr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Cyrl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/vi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: Florian Ostertag <florian.kuepper@gmail.com>
Co-authored-by: Indrek Haav <IndrekHaav@users.noreply.hosted.weblate.org>
Co-authored-by: Jacek <jacek64@gmail.com>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Mihai Paraipan <paraipanmihai@gmail.com>
Co-authored-by: Miki Mrvos <medolino2009@gmail.com>
Co-authored-by: Mário Victor Ribeiro Silva <mariovictorrs@gmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: PanSzelescik <panszelescik@gmail.com>
Co-authored-by: Polla Fattah <polla.fattah@gmail.com>
Co-authored-by: Ponas <le.slab124@aleeas.com>
Co-authored-by: Rasmus Sehlin <rasmus@sehl.in>
Co-authored-by: S-H-Y-A <yamada0@hotmail.co.jp>
Co-authored-by: Sam Smith <ja49619@gmail.com>
Co-authored-by: Thomas <thomas.ceccato.02@gmail.com>
Co-authored-by: Vladimir Petrov (Vlado) <mr.vlado@gmail.com>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: aarhor <aaron.horstmann9916@gmail.com>
Co-authored-by: chapvic <victor@chapaev.org>
Co-authored-by: dvbthien <dvbthien@dvbthien.onmicrosoft.com>
Co-authored-by: fmis13 <fmis13@disroot.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: kiwinho <kiwicaja@gmail.com>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: rbasliana <91536894+rbasliana@users.noreply.github.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: 李奕寯 <eugenelego88@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2024-09-03 13:52:06 +00:00
Zack Pollard
5dd9a2f850 ci: replace deprecate cloudflare properties on cloudflare_record (#12262) 2024-09-03 09:27:50 -04:00
renovate[bot]
058b5ea5ca chore(deps): update base-image to v20240903 (major) (#12261)
chore(deps): update base-image to v20240903

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-03 13:58:11 +01:00
Zack Pollard
441b009a0b ci: more path filtering, path filtering happens in pre-job so all jobs can be required (#12260)
ci: don't use gha path filtering, use a pre-job to skip instead, add path filtering to more workflows
2024-09-03 13:23:39 +01:00
renovate[bot]
cb903db308 chore(deps): update grafana/grafana docker tag to v11.2.0 (#12209)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-03 09:00:54 +01:00
renovate[bot]
03ceca8552 chore(deps): update typescript-projects (#12251)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-03 08:59:17 +01:00
renovate[bot]
53609d45fe chore(deps): update dependency @types/node to ^20.16.2 (#12250)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-03 08:53:35 +01:00
PyKen
4af8433aad fix(server): remove thumbnailAt in asset_job_status for missing thumbnails (#12254)
* Remove thumbnailAt in asset_job_status for missing thumbnails

* fix linter error
2024-09-03 00:19:15 -04:00
Biepa
7c978571e0 docs: fixing example docker compose (#12230)
* Fixing example docker compose

Change needed so the following statement included in the docs a bit below makes sense:
NOTE: We have to use the `/mnt/media/christmas-trip` path and not the `/mnt/nas/christmas-trip` path since all paths have to be what the Docker containers see.

* another fix
2024-09-02 19:49:28 +00:00
martin
efdf1b49f4 fix: hide scrollbar when the asset grid is empty (#12217) 2024-09-02 14:43:36 -05:00
Yun Jiang
f46abbb5b5 fix(mobile): set SSL options properly in background backup process (#11870) (#12206)
Co-authored-by: Yun Jiang <yjiang@pulsesecure.net>
2024-09-02 19:42:51 +00:00
Ben
d8b602f757 feat(web): shared breadcrumbs component for folders and tags (#12215)
* feat(web): shared breadcrumbs component for folders and tags

* chore: revert changes to tree view
2024-09-02 14:42:27 -05:00
Alex
59507e557e fix(web): auto grow area extend when there is no content (#12197)
* fix(web): text area expand when there is no description

* use correct content
2024-09-02 14:41:19 -05:00
Ivan Mondragon
174de979db fix(mobile): Android back gesture closes app (#12221)
fix(mobile): Android back gesture closes app, disable predictive back gestures on Android

Co-authored-by: Ivan Mondragon <ivanmondragon42@gmail.com>
2024-09-02 14:40:11 -05:00
Vietbao Tran
862d6d9abe feat(web): load original panorama image when zoomed in to 75% or above (#12222)
* feat(web): load original panorama image when zoomed in to 75% or above

* add checks that original 360 image is web compatible and better error handling

* fix web compatability check typing

* fix asset type
2024-09-02 14:39:55 -05:00
Alex
bd6c5e1b1c feat(web): tag button in album/shared album (#12172) 2024-09-02 14:39:16 -05:00
Niklas Fischer
b80cc0d90f fix(web): German translation for explorer (#12180)
fix German translation for explorer
2024-09-02 12:33:32 -04:00
PyKen
438344fc8f fix(server): get assetFiles when retrieving assets WithoutProperty.THUMBNAIL (#12225) 2024-09-02 09:31:02 -04:00
Jonathan Jogenfors
39141d3f1c fix(server): remove offline assets from trash (#12199)
* use port not taken by immich-dev for e2e

* remove offline files from trash
2024-09-02 01:06:35 +02:00
Qhilm
28bc7f318e docs: typo - accesible => accessible (#12178)
[typo] accesible => accessible
2024-08-31 14:52:20 -05:00
Marco Malavolti
6bfe54788f docs: update google oauth examples (#12162)
* Small update on oauth.md for Google Authn

* Replace "demo" with "example" to be consistent with other example
2024-08-31 13:33:17 -04:00
Michel Heusschen
67468ea367 fix(web): avoid deleting empty album unexpectedly (#12175) 2024-08-31 12:24:38 -05:00
Alex
40327ad987 chore(mobile): post release tasks (#12157)
* sent to reviewer

* sent to reviewer

* update to app store

* update to app store
2024-08-30 16:35:06 -05:00
Jason Rasmussen
d18bc7007a fix: keyword parsing (#12164) 2024-08-30 21:33:42 +00:00
Ben
4cc11efd04 fix(web): hide tree view text overflow with ellipsis (#12161)
fix(web): hide tree view overflow with ellipsis
2024-08-30 17:32:12 -04:00
kaziu687
18fcc3569f fix(web): unable to scroll timeline after using gesture (#12163) 2024-08-30 21:31:42 +00:00
Alex
fcbc1ba399 fix(web): memory view in timeline href (#12158) 2024-08-30 15:00:31 -04:00
Jason Rasmussen
5e6ac87eaf chore: object shorthand linting rule (#12152)
chore: object shorthand
2024-08-30 14:38:53 -04:00
renovate[bot]
40854f358c chore(deps): update dependency svelte to v4.2.19 [security] (#12147)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-30 14:03:44 -04:00
Bastian Machek
51a11d0cb6 docs(project): lightroom project (#12149)
* Update community-projects.tsx

Added my community project: lrc-immich-plugin

* Update community-projects.tsx

typo
2024-08-30 14:01:50 -04:00
113 changed files with 3626 additions and 1923 deletions

View File

@@ -16,10 +16,28 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
pre-job:
runs-on: ubuntu-latest
outputs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- id: found_paths
uses: dorny/paths-filter@v3
with:
filters: |
mobile:
- 'mobile/**'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
build-sign-android: build-sign-android:
name: Build and sign Android name: Build and sign Android
needs: pre-job
# Skip when PR from a fork # Skip when PR from a fork
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }} if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && needs.pre-job.outputs.should_run == 'true' }}
runs-on: macos-14 runs-on: macos-14
steps: steps:

View File

@@ -17,47 +17,58 @@ permissions:
packages: write packages: write
jobs: jobs:
build_and_push: pre-job:
name: Build and Push
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs:
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- id: found_paths
uses: dorny/paths-filter@v3
with:
filters: |
server:
- 'server/**'
- 'openapi/**'
- 'web/**'
machine-learning:
- 'machine-learning/**'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ github.event_name == 'workflow_dispatch' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
build_and_push_ml:
name: Build and Push ML
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
runs-on: ubuntu-latest
env:
image: immich-machine-learning
context: machine-learning
file: machine-learning/Dockerfile
strategy: strategy:
# Prevent a failure in one image from stopping the other builds # Prevent a failure in one image from stopping the other builds
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- image: immich-machine-learning - platforms: linux/amd64,linux/arm64
context: machine-learning
file: machine-learning/Dockerfile
platforms: linux/amd64,linux/arm64
device: cpu device: cpu
- image: immich-machine-learning - platforms: linux/amd64
context: machine-learning
file: machine-learning/Dockerfile
platforms: linux/amd64
device: cuda device: cuda
suffix: -cuda suffix: -cuda
- image: immich-machine-learning - platforms: linux/amd64
context: machine-learning
file: machine-learning/Dockerfile
platforms: linux/amd64
device: openvino device: openvino
suffix: -openvino suffix: -openvino
- image: immich-machine-learning - platforms: linux/arm64
context: machine-learning
file: machine-learning/Dockerfile
platforms: linux/arm64
device: armnn device: armnn
suffix: -armnn suffix: -armnn
- image: immich-server
context: .
file: server/Dockerfile
platforms: linux/amd64,linux/arm64
device: cpu
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -93,8 +104,8 @@ jobs:
# Disable latest tag # Disable latest tag
latest=false latest=false
images: | images: |
name=ghcr.io/${{ github.repository_owner }}/${{matrix.image}} name=ghcr.io/${{ github.repository_owner }}/${{env.image}}
name=altran1502/${{matrix.image}},enable=${{ github.event_name == 'release' }} name=altran1502/${{env.image}},enable=${{ github.event_name == 'release' }}
tags: | tags: |
# Tag with branch name # Tag with branch name
type=ref,event=branch,suffix=${{ matrix.suffix }} type=ref,event=branch,suffix=${{ matrix.suffix }}
@@ -111,18 +122,109 @@ jobs:
# Essentially just ignore the cache output (PR can't write to registry cache) # Essentially just ignore the cache output (PR can't write to registry cache)
echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT
else else
echo "cache-to=type=registry,mode=max,ref=ghcr.io/${{ github.repository_owner }}/immich-build-cache:${{ matrix.image }}" >> $GITHUB_OUTPUT echo "cache-to=type=registry,mode=max,ref=ghcr.io/${{ github.repository_owner }}/immich-build-cache:${{ env.image }}" >> $GITHUB_OUTPUT
fi fi
- name: Build and push image - name: Build and push image
uses: docker/build-push-action@v6.7.0 uses: docker/build-push-action@v6.7.0
with: with:
context: ${{ matrix.context }} context: ${{ env.context }}
file: ${{ matrix.file }} file: ${{ env.file }}
platforms: ${{ matrix.platforms }} platforms: ${{ matrix.platforms }}
# Skip pushing when PR from a fork # Skip pushing when PR from a fork
push: ${{ !github.event.pull_request.head.repo.fork }} push: ${{ !github.event.pull_request.head.repo.fork }}
cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/immich-build-cache:${{matrix.image}} cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/immich-build-cache:${{env.image}}
cache-to: ${{ steps.cache-target.outputs.cache-to }}
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
build-args: |
DEVICE=${{ matrix.device }}
BUILD_ID=${{ github.run_id }}
BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.metadata.outputs.tags }}
BUILD_SOURCE_REF=${{ github.ref_name }}
BUILD_SOURCE_COMMIT=${{ github.sha }}
build_and_push_server:
name: Build and Push Server
runs-on: ubuntu-latest
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
env:
image: immich-server
context: .
file: server/Dockerfile
strategy:
fail-fast: false
matrix:
include:
- platforms: linux/amd64,linux/arm64
device: cpu
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.2.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.6.1
- name: Login to Docker Hub
# Only push to Docker Hub when making a release
if: ${{ github.event_name == 'release' }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
# Skip when PR from a fork
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Generate docker image tags
id: metadata
uses: docker/metadata-action@v5
with:
flavor: |
# Disable latest tag
latest=false
images: |
name=ghcr.io/${{ github.repository_owner }}/${{env.image}}
name=altran1502/${{env.image}},enable=${{ github.event_name == 'release' }}
tags: |
# Tag with branch name
type=ref,event=branch,suffix=${{ matrix.suffix }}
# Tag with pr-number
type=ref,event=pr,suffix=${{ matrix.suffix }}
# Tag with git tag on release
type=ref,event=tag,suffix=${{ matrix.suffix }}
type=raw,value=release,enable=${{ github.event_name == 'release' }},suffix=${{ matrix.suffix }}
- name: Determine build cache output
id: cache-target
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
# Essentially just ignore the cache output (PR can't write to registry cache)
echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT
else
echo "cache-to=type=registry,mode=max,ref=ghcr.io/${{ github.repository_owner }}/immich-build-cache:${{ env.image }}" >> $GITHUB_OUTPUT
fi
- name: Build and push image
uses: docker/build-push-action@v6.7.0
with:
context: ${{ env.context }}
file: ${{ env.file }}
platforms: ${{ matrix.platforms }}
# Skip pushing when PR from a fork
push: ${{ !github.event.pull_request.head.repo.fork }}
cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/immich-build-cache:${{env.image}}
cache-to: ${{ steps.cache-target.outputs.cache-to }} cache-to: ${{ steps.cache-target.outputs.cache-to }}
tags: ${{ steps.metadata.outputs.tags }} tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }} labels: ${{ steps.metadata.outputs.labels }}

View File

@@ -2,12 +2,8 @@ name: Docs build
on: on:
push: push:
branches: [main] branches: [main]
paths:
- "docs/**"
pull_request: pull_request:
branches: [main] branches: [main]
paths:
- "docs/**"
release: release:
types: [published] types: [published]
@@ -16,7 +12,26 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
pre-job:
runs-on: ubuntu-latest
outputs:
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- id: found_paths
uses: dorny/paths-filter@v3
with:
filters: |
docs:
- 'docs/**'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
build: build:
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:

View File

@@ -10,10 +10,28 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
parameters: ${{ steps.parameters.outputs.result }} parameters: ${{ steps.parameters.outputs.result }}
artifact: ${{ steps.get-artifact.outputs.result }}
steps: steps:
- if: ${{ github.event.workflow_run.conclusion == 'failure' }} - if: ${{ github.event.workflow_run.conclusion != 'success' }}
run: echo 'The triggering workflow failed' && exit 1 run: echo 'The triggering workflow did not succeed' && exit 1
- name: Get artifact
id: get-artifact
uses: actions/github-script@v7
with:
script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
return artifact.name == "docs-build-output"
})[0];
if (!matchArtifact) {
console.log("No artifact found with the name docs-build-output, build job was skipped")
return { found: false };
}
return { found: true, id: matchArtifact.id };
- name: Determine deploy parameters - name: Determine deploy parameters
id: parameters id: parameters
uses: actions/github-script@v7 uses: actions/github-script@v7
@@ -75,7 +93,7 @@ jobs:
deploy: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: checks needs: checks
if: ${{ fromJson(needs.checks.outputs.parameters).shouldDeploy }} if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -98,18 +116,11 @@ jobs:
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ let artifact = ${{ needs.checks.outputs.artifact }};
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
return artifact.name == "docs-build-output"
})[0];
let download = await github.rest.actions.downloadArtifact({ let download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
artifact_id: matchArtifact.id, artifact_id: artifact.id,
archive_format: 'zip', archive_format: 'zip',
}); });
let fs = require('fs'); let fs = require('fs');

View File

@@ -10,8 +10,27 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
pre-job:
runs-on: ubuntu-latest
outputs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- id: found_paths
uses: dorny/paths-filter@v3
with:
filters: |
mobile:
- 'mobile/**'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
mobile-dart-analyze: mobile-dart-analyze:
name: Run Dart Code Analysis name: Run Dart Code Analysis
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest

View File

@@ -10,8 +10,47 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
pre-job:
runs-on: ubuntu-latest
outputs:
should_run_web: ${{ steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_cli: ${{ steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e: ${{ steps.found_paths.outputs.e2e == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_mobile: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_web: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_server_cli: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.server == 'true' || steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- id: found_paths
uses: dorny/paths-filter@v3
with:
filters: |
web:
- 'web/**'
- 'open-api/typescript-sdk/**'
server:
- 'server/**'
cli:
- 'cli/**'
- 'open-api/typescript-sdk/**'
e2e:
- 'e2e/**'
mobile:
- 'mobile/**'
machine-learning:
- 'machine-learning/**'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
server-unit-tests: server-unit-tests:
name: Server name: Server
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
@@ -47,6 +86,8 @@ jobs:
cli-unit-tests: cli-unit-tests:
name: CLI name: CLI
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
@@ -86,6 +127,8 @@ jobs:
cli-unit-tests-win: cli-unit-tests-win:
name: CLI (Windows) name: CLI (Windows)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
runs-on: windows-latest runs-on: windows-latest
defaults: defaults:
run: run:
@@ -118,6 +161,8 @@ jobs:
web-unit-tests: web-unit-tests:
name: Web name: Web
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
@@ -159,13 +204,54 @@ jobs:
run: npm run test:cov run: npm run test:cov
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
e2e-tests: e2e-tests-lint:
name: End-to-End Tests name: End-to-End Lint
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
working-directory: ./e2e working-directory: ./e2e
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: './e2e/.nvmrc'
- name: Run setup typescript-sdk
run: npm ci && npm run build
working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }}
- name: Install dependencies
run: npm ci
if: ${{ !cancelled() }}
- name: Run linter
run: npm run lint
if: ${{ !cancelled() }}
- name: Run formatter
run: npm run format
if: ${{ !cancelled() }}
- name: Run tsc
run: npm run check
if: ${{ !cancelled() }}
e2e-tests-server-cli:
name: End-to-End Tests (Server & CLI)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_server_cli == 'true' }}
runs-on: mich
defaults:
run:
working-directory: ./e2e
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -191,16 +277,41 @@ jobs:
run: npm ci run: npm ci
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run linter - name: Docker build
run: npm run lint run: docker compose build
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run formatter - name: Run e2e tests (api & cli)
run: npm run format run: npm run test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run tsc e2e-tests-web:
run: npm run check name: End-to-End Tests (Web)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_web == 'true' }}
runs-on: mich
defaults:
run:
working-directory: ./e2e
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: './e2e/.nvmrc'
- name: Run setup typescript-sdk
run: npm ci && npm run build
working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }}
- name: Install dependencies
run: npm ci
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Install Playwright Browsers - name: Install Playwright Browsers
@@ -211,16 +322,14 @@ jobs:
run: docker compose build run: docker compose build
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run e2e tests (api & cli)
run: npm run test
if: ${{ !cancelled() }}
- name: Run e2e tests (web) - name: Run e2e tests (web)
run: npx playwright test run: npx playwright test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
mobile-unit-tests: mobile-unit-tests:
name: Mobile name: Mobile
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -235,6 +344,8 @@ jobs:
ml-unit-tests: ml-unit-tests:
name: Machine Learning name: Machine Learning
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:

View File

@@ -55,6 +55,7 @@ export default [
'unicorn/import-style': 'off', 'unicorn/import-style': 'off',
curly: 2, curly: 2,
'prettier/prettier': 0, 'prettier/prettier': 0,
'object-shorthand': ['error', 'always'],
}, },
}, },
]; ];

188
cli/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.16", "version": "2.2.17",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.16", "version": "2.2.17",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"fast-glob": "^3.3.2", "fast-glob": "^3.3.2",
@@ -24,7 +24,7 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitest/coverage-v8": "^2.0.5", "@vitest/coverage-v8": "^2.0.5",
@@ -52,14 +52,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.113.0", "version": "1.113.1",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@@ -727,9 +727,9 @@
} }
}, },
"node_modules/@eslint/config-array": { "node_modules/@eslint/config-array": {
"version": "0.17.1", "version": "0.18.0",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
"integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@@ -825,9 +825,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "9.9.0", "version": "9.9.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz",
"integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1324,9 +1324,9 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.16.1", "version": "20.16.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.3.tgz",
"integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "integrity": "sha512-/wdGiWRkMOm53gAsSyFMXFZHbVg7C6CbkrzHNpaHoYfsUWPg7m6ZRKtvQjgvQ9i8WT540a3ydRlRQbxjY30XxQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -1340,17 +1340,17 @@
"dev": true "dev": true
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz",
"integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==", "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.2.0", "@typescript-eslint/scope-manager": "8.3.0",
"@typescript-eslint/type-utils": "8.2.0", "@typescript-eslint/type-utils": "8.3.0",
"@typescript-eslint/utils": "8.2.0", "@typescript-eslint/utils": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0", "@typescript-eslint/visitor-keys": "8.3.0",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
@@ -1374,16 +1374,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz",
"integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==", "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.2.0", "@typescript-eslint/scope-manager": "8.3.0",
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/typescript-estree": "8.2.0", "@typescript-eslint/typescript-estree": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0", "@typescript-eslint/visitor-keys": "8.3.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -1403,14 +1403,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz",
"integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0" "@typescript-eslint/visitor-keys": "8.3.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1421,14 +1421,14 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz",
"integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==", "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "8.2.0", "@typescript-eslint/typescript-estree": "8.3.0",
"@typescript-eslint/utils": "8.2.0", "@typescript-eslint/utils": "8.3.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@@ -1446,9 +1446,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz",
"integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1460,16 +1460,16 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz",
"integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0", "@typescript-eslint/visitor-keys": "8.3.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "fast-glob": "^3.3.2",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
"minimatch": "^9.0.4", "minimatch": "^9.0.4",
"semver": "^7.6.0", "semver": "^7.6.0",
@@ -1489,16 +1489,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz",
"integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==", "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.2.0", "@typescript-eslint/scope-manager": "8.3.0",
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/typescript-estree": "8.2.0" "@typescript-eslint/typescript-estree": "8.3.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1512,13 +1512,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz",
"integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@@ -1705,16 +1705,6 @@
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true "dev": true
}, },
"node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/assertion-error": { "node_modules/assertion-error": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
@@ -2034,19 +2024,6 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true "dev": true
}, },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/eastasianwidth": { "node_modules/eastasianwidth": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -2135,17 +2112,17 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.9.0", "version": "9.9.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz",
"integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.11.0", "@eslint-community/regexpp": "^4.11.0",
"@eslint/config-array": "^0.17.1", "@eslint/config-array": "^0.18.0",
"@eslint/eslintrc": "^3.1.0", "@eslint/eslintrc": "^3.1.0",
"@eslint/js": "9.9.0", "@eslint/js": "9.9.1",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.3.0", "@humanwhocodes/retry": "^0.3.0",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
@@ -2666,27 +2643,6 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.2.9",
"ignore": "^5.2.0",
"merge2": "^1.4.1",
"slash": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/globrex": { "node_modules/globrex": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
@@ -3437,16 +3393,6 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/pathe": { "node_modules/pathe": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
@@ -3880,16 +3826,6 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.16", "version": "2.2.17",
"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",
@@ -20,7 +20,7 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitest/coverage-v8": "^2.0.5", "@vitest/coverage-v8": "^2.0.5",

View File

@@ -9,6 +9,6 @@ resource "cloudflare_record" "immich_app_release_domain" {
proxied = true proxied = true
ttl = 1 ttl = 1
type = "CNAME" type = "CNAME"
value = data.terraform_remote_state.cloudflare_immich_app_docs.outputs.immich_app_branch_pages_hostname content = data.terraform_remote_state.cloudflare_immich_app_docs.outputs.immich_app_branch_pages_hostname
zone_id = data.terraform_remote_state.cloudflare_account.outputs.immich_app_zone_id zone_id = data.terraform_remote_state.cloudflare_account.outputs.immich_app_zone_id
} }

View File

@@ -9,7 +9,7 @@ resource "cloudflare_record" "immich_app_branch_subdomain" {
proxied = true proxied = true
ttl = 1 ttl = 1
type = "CNAME" type = "CNAME"
value = "${replace(var.prefix_name, "/\\/|\\./", "-")}.${local.is_release ? data.terraform_remote_state.cloudflare_account.outputs.immich_app_archive_pages_project_subdomain : data.terraform_remote_state.cloudflare_account.outputs.immich_app_preview_pages_project_subdomain}" content = "${replace(var.prefix_name, "/\\/|\\./", "-")}.${local.is_release ? data.terraform_remote_state.cloudflare_account.outputs.immich_app_archive_pages_project_subdomain : data.terraform_remote_state.cloudflare_account.outputs.immich_app_preview_pages_project_subdomain}"
zone_id = data.terraform_remote_state.cloudflare_account.outputs.immich_app_zone_id zone_id = data.terraform_remote_state.cloudflare_account.outputs.immich_app_zone_id
} }

View File

@@ -91,7 +91,7 @@ services:
command: ['./run.sh', '-disable-reporting'] command: ['./run.sh', '-disable-reporting']
ports: ports:
- 3000:3000 - 3000:3000
image: grafana/grafana:11.1.4-ubuntu@sha256:8e74fb7eed4d59fb5595acd0576c21411167f6b6401426ae29f2e8f9f71b68f6 image: grafana/grafana:11.2.0-ubuntu@sha256:8e2c13739563c3da9d45de96c6bcb63ba617cac8c571c060112c7fc8ad6914e9
volumes: volumes:
- grafana-data:/var/lib/grafana - grafana-data:/var/lib/grafana

View File

@@ -154,21 +154,21 @@ Configuration of Authorised redirect URIs (Google Console)
Configuration of OAuth in Immich System Settings Configuration of OAuth in Immich System Settings
| Setting | Value | | Setting | Value |
| ---------------------------- | ------------------------------------------------------------------------------------------------------ | | ---------------------------- | ---------------------------------------------------------------------------- |
| Issuer URL | [https://accounts.google.com](https://accounts.google.com) | | Issuer URL | `https://accounts.google.com` |
| Client ID | 7\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***vuls.apps.googleusercontent.com | | Client ID | 7\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***vuls.apps.googleusercontent.com |
| Client Secret | G\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***OO | | Client Secret | G\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***OO |
| Scope | openid email profile | | Scope | openid email profile |
| 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 (0 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 |
| Mobile Redirect URI Override | Enabled (required) | | Mobile Redirect URI Override | Enabled (required) |
| Mobile Redirect URI | [https://demo.immich.app/api/oauth/mobile-redirect](https://demo.immich.app/api/oauth/mobile-redirect) | | Mobile Redirect URI | `https://example.immich.app/api/oauth/mobile-redirect` |
</details> </details>

View File

@@ -104,8 +104,8 @@ The `immich-server` container will need access to the gallery. Modify your docke
immich-server: immich-server:
volumes: volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload - ${UPLOAD_LOCATION}:/usr/src/app/upload
+ - /mnt/nas/christmas-trip:/mnt/nas/christmas-trip:ro + - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
+ - /home/user/old-pics:/home/user/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
+ - /mnt/media/videos2:/mnt/media/videos2 # the files in this folder can be deleted, as it does not end with :ro + - /mnt/media/videos2:/mnt/media/videos2 # the files in this folder can be deleted, as it does not end with :ro
+ - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system. + - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system.

View File

@@ -48,7 +48,7 @@ A reverse proxy is a service that sits between web servers and clients. A revers
If you're hosting your own reverse proxy, [Nginx](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) is a great option. An example configuration for Nginx is provided [here](/docs/administration/reverse-proxy.md). If you're hosting your own reverse proxy, [Nginx](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) is a great option. An example configuration for Nginx is provided [here](/docs/administration/reverse-proxy.md).
You'll also need your own certificate to authenticate https connections. If you're making Immich publicly accesible, [Let's Encrypt](https://letsencrypt.org/) can provide a free certificate for your domain and is the recommended option. Alternatively, a [self-signed certificate](https://en.wikipedia.org/wiki/Self-signed_certificate) allows you to encrypt your connection to Immich, but it raises a security warning on the client's browser. You'll also need your own certificate to authenticate https connections. If you're making Immich publicly accessible, [Let's Encrypt](https://letsencrypt.org/) can provide a free certificate for your domain and is the recommended option. Alternatively, a [self-signed certificate](https://en.wikipedia.org/wiki/Self-signed_certificate) allows you to encrypt your connection to Immich, but it raises a security warning on the client's browser.
A remote reverse proxy like [Cloudflare](https://www.cloudflare.com/learning/cdn/glossary/reverse-proxy/) increases security by hiding the server IP address, which makes targeted attacks like [DDoS](https://www.cloudflare.com/learning/ddos/what-is-a-ddos-attack/) harder. A remote reverse proxy like [Cloudflare](https://www.cloudflare.com/learning/cdn/glossary/reverse-proxy/) increases security by hiding the server IP address, which makes targeted attacks like [DDoS](https://www.cloudflare.com/learning/ddos/what-is-a-ddos-attack/) harder.

View File

@@ -38,6 +38,11 @@ const projects: CommunityProjectProps[] = [
description: 'Lightroom plugin to publish photos from Lightroom collections to Immich albums.', description: 'Lightroom plugin to publish photos from Lightroom collections to Immich albums.',
url: 'https://github.com/midzelis/mi.Immich.Publisher', url: 'https://github.com/midzelis/mi.Immich.Publisher',
}, },
{
title: 'Lightroom Immich Plugin: lrc-immich-plugin',
description: 'Another Lightroom plugin to publish or export photos from Lightroom to Immich.',
url: 'https://github.com/bmachek/lrc-immich-plugin',
},
{ {
title: 'Immich Duplicate Finder', title: 'Immich Duplicate Finder',
description: 'Webapp that uses machine learning to identify near-duplicate images.', description: 'Webapp that uses machine learning to identify near-duplicate images.',

View File

@@ -1,4 +1,8 @@
[ [
{
"label": "v1.113.1",
"url": "https://v1.113.1.archive.immich.app"
},
{ {
"label": "v1.113.0", "label": "v1.113.0",
"url": "https://v1.113.0.archive.immich.app" "url": "https://v1.113.0.archive.immich.app"

View File

@@ -59,6 +59,7 @@ export default [
'unicorn/prefer-top-level-await': 'off', 'unicorn/prefer-top-level-await': 'off',
'unicorn/prefer-event-target': 'off', 'unicorn/prefer-event-target': 'off',
'unicorn/no-thenable': 'off', 'unicorn/no-thenable': 'off',
'object-shorthand': ['error', 'always'],
}, },
}, },
]; ];

210
e2e/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.113.0", "version": "1.113.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.113.0", "version": "1.113.1",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.1.0", "@eslint/eslintrc": "^3.1.0",
@@ -15,7 +15,7 @@
"@immich/sdk": "file:../open-api/typescript-sdk", "@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"@types/oidc-provider": "^8.5.1", "@types/oidc-provider": "^8.5.1",
"@types/pg": "^8.11.0", "@types/pg": "^8.11.0",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",
@@ -45,7 +45,7 @@
}, },
"../cli": { "../cli": {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.16", "version": "2.2.17",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
@@ -64,7 +64,7 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitest/coverage-v8": "^2.0.5", "@vitest/coverage-v8": "^2.0.5",
@@ -92,14 +92,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.113.0", "version": "1.113.1",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@@ -747,9 +747,9 @@
} }
}, },
"node_modules/@eslint/config-array": { "node_modules/@eslint/config-array": {
"version": "0.17.1", "version": "0.18.0",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
"integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@@ -799,9 +799,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "9.9.0", "version": "9.9.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz",
"integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1516,9 +1516,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.16.1", "version": "20.16.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.3.tgz",
"integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "integrity": "sha512-/wdGiWRkMOm53gAsSyFMXFZHbVg7C6CbkrzHNpaHoYfsUWPg7m6ZRKtvQjgvQ9i8WT540a3ydRlRQbxjY30XxQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -1543,10 +1543,11 @@
} }
}, },
"node_modules/@types/pg": { "node_modules/@types/pg": {
"version": "8.11.6", "version": "8.11.8",
"resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.8.tgz",
"integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", "integrity": "sha512-IqpCf8/569txXN/HoP5i1LjXfKZWL76Yr2R77xgeIICUbAYHeoaEZFhYHo2uDftecLWrTJUq63JvQu8q3lnDyA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@types/node": "*", "@types/node": "*",
"pg-protocol": "*", "pg-protocol": "*",
@@ -1558,6 +1559,7 @@
"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz",
"integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"pg-int8": "1.0.1", "pg-int8": "1.0.1",
"pg-numeric": "1.0.2", "pg-numeric": "1.0.2",
@@ -1576,6 +1578,7 @@
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz",
"integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
@@ -1585,6 +1588,7 @@
"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz",
"integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"obuf": "~1.1.2" "obuf": "~1.1.2"
}, },
@@ -1597,6 +1601,7 @@
"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz",
"integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
@@ -1606,6 +1611,7 @@
"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz",
"integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
@@ -1674,17 +1680,17 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz",
"integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==", "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.2.0", "@typescript-eslint/scope-manager": "8.3.0",
"@typescript-eslint/type-utils": "8.2.0", "@typescript-eslint/type-utils": "8.3.0",
"@typescript-eslint/utils": "8.2.0", "@typescript-eslint/utils": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0", "@typescript-eslint/visitor-keys": "8.3.0",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
@@ -1708,16 +1714,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz",
"integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==", "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.2.0", "@typescript-eslint/scope-manager": "8.3.0",
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/typescript-estree": "8.2.0", "@typescript-eslint/typescript-estree": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0", "@typescript-eslint/visitor-keys": "8.3.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -1737,14 +1743,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz",
"integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0" "@typescript-eslint/visitor-keys": "8.3.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1755,14 +1761,14 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz",
"integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==", "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "8.2.0", "@typescript-eslint/typescript-estree": "8.3.0",
"@typescript-eslint/utils": "8.2.0", "@typescript-eslint/utils": "8.3.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@@ -1780,9 +1786,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz",
"integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1794,16 +1800,16 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz",
"integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/visitor-keys": "8.2.0", "@typescript-eslint/visitor-keys": "8.3.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "fast-glob": "^3.3.2",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
"minimatch": "^9.0.4", "minimatch": "^9.0.4",
"semver": "^7.6.0", "semver": "^7.6.0",
@@ -1849,16 +1855,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz",
"integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==", "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.2.0", "@typescript-eslint/scope-manager": "8.3.0",
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"@typescript-eslint/typescript-estree": "8.2.0" "@typescript-eslint/typescript-estree": "8.3.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1872,13 +1878,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.2.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz",
"integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.2.0", "@typescript-eslint/types": "8.3.0",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@@ -2112,16 +2118,6 @@
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true "dev": true
}, },
"node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/asap": { "node_modules/asap": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -2725,19 +2721,6 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/eastasianwidth": { "node_modules/eastasianwidth": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -2889,17 +2872,17 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.9.0", "version": "9.9.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz",
"integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.11.0", "@eslint-community/regexpp": "^4.11.0",
"@eslint/config-array": "^0.17.1", "@eslint/config-array": "^0.18.0",
"@eslint/eslintrc": "^3.1.0", "@eslint/eslintrc": "^3.1.0",
"@eslint/js": "9.9.0", "@eslint/js": "9.9.1",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.3.0", "@humanwhocodes/retry": "^0.3.0",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
@@ -3582,27 +3565,6 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.2.9",
"ignore": "^5.2.0",
"merge2": "^1.4.1",
"slash": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/gopd": { "node_modules/gopd": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
@@ -4134,9 +4096,9 @@
} }
}, },
"node_modules/jose": { "node_modules/jose": {
"version": "5.7.0", "version": "5.8.0",
"resolved": "https://registry.npmjs.org/jose/-/jose-5.7.0.tgz", "resolved": "https://registry.npmjs.org/jose/-/jose-5.8.0.tgz",
"integrity": "sha512-3P9qfTYDVnNn642LCAqIKbTGb9a1TBxZ9ti5zEVEr48aDdflgRjhspWFb6WM4PzAfFbGMJYC4+803v8riCRAKw==", "integrity": "sha512-E7CqYpL/t7MMnfGnK/eg416OsFCVUrU/Y3Vwe7QjKhu/BkS1Ms455+2xsqZQVN57/U2MHMBvEb5SrmAZWAIntA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"funding": { "funding": {
@@ -5044,16 +5006,6 @@
"integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==",
"dev": true "dev": true
}, },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/pathe": { "node_modules/pathe": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
@@ -5839,16 +5791,6 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/socket.io-client": { "node_modules/socket.io-client": {
"version": "4.7.5", "version": "4.7.5",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz",

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.113.0", "version": "1.113.1",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -25,7 +25,7 @@
"@immich/sdk": "file:../open-api/typescript-sdk", "@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"@types/oidc-provider": "^8.5.1", "@types/oidc-provider": "^8.5.1",
"@types/pg": "^8.11.0", "@types/pg": "^8.11.0",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",

View File

@@ -635,10 +635,11 @@ describe('/libraries', () => {
it('should remove offline files', async () => { it('should remove offline files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/offline2`], importPaths: [`${testAssetDirInternal}/temp/offline`],
}); });
utils.createImageFile(`${testAssetDir}/temp/offline2/assetA.png`); utils.createImageFile(`${testAssetDir}/temp/offline/online.png`);
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
@@ -646,9 +647,9 @@ describe('/libraries', () => {
const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, { const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, {
libraryId: library.id, libraryId: library.id,
}); });
expect(initialAssets.count).toBe(1); expect(initialAssets.count).toBe(2);
utils.removeImageFile(`${testAssetDir}/temp/offline2/assetA.png`); utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
@@ -669,7 +670,54 @@ describe('/libraries', () => {
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id }); const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(0); expect(assets.count).toBe(1);
utils.removeImageFile(`${testAssetDir}/temp/offline/online.png`);
});
it('should remove offline files from trash', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/offline`],
});
utils.createImageFile(`${testAssetDir}/temp/offline/online.png`);
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, {
libraryId: library.id,
});
expect(initialAssets.count).toBe(2);
utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
const { assets: offlineAssets } = await utils.metadataSearch(admin.accessToken, {
libraryId: library.id,
isOffline: true,
});
expect(offlineAssets.count).toBe(1);
const { status } = await request(app)
.post(`/libraries/${library.id}/removeOffline`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send();
expect(status).toBe(204);
await utils.waitForQueueFinish(admin.accessToken, 'library');
await utils.waitForQueueFinish(admin.accessToken, 'backgroundTask');
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(1);
expect(assets.items[0].isOffline).toBe(false);
expect(assets.items[0].originalPath).toEqual(`${testAssetDirInternal}/temp/offline/online.png`);
utils.removeImageFile(`${testAssetDir}/temp/offline/online.png`);
}); });
it('should not remove online files', async () => { it('should not remove online files', async () => {

View File

@@ -42,6 +42,23 @@ describe('/trash', () => {
const after = await getAssetStatistics({ isTrashed: true }, { headers: asBearerAuth(admin.accessToken) }); const after = await getAssetStatistics({ isTrashed: true }, { headers: asBearerAuth(admin.accessToken) });
expect(after.total).toBe(0); expect(after.total).toBe(0);
}); });
it('should empty the trash with archived assets', async () => {
const { id: assetId } = await utils.createAsset(admin.accessToken);
await utils.archiveAssets(admin.accessToken, [assetId]);
await utils.deleteAssets(admin.accessToken, [assetId]);
const before = await getAssetInfo({ id: assetId }, { headers: asBearerAuth(admin.accessToken) });
expect(before).toStrictEqual(expect.objectContaining({ id: assetId, isTrashed: true, isArchived: true }));
const { status } = await request(app).post('/trash/empty').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(204);
await utils.waitForWebsocketEvent({ event: 'assetDelete', id: assetId });
const after = await getAssetStatistics({ isTrashed: true }, { headers: asBearerAuth(admin.accessToken) });
expect(after.total).toBe(0);
});
}); });
describe('POST /trash/restore', () => { describe('POST /trash/restore', () => {

View File

@@ -30,6 +30,7 @@ import {
signUpAdmin, signUpAdmin,
updateAdminOnboarding, updateAdminOnboarding,
updateAlbumUser, updateAlbumUser,
updateAssets,
updateConfig, updateConfig,
validate, validate,
} from '@immich/sdk'; } from '@immich/sdk';
@@ -389,6 +390,9 @@ export const utils = {
return searchMetadata({ metadataSearchDto: dto }, { headers: asBearerAuth(accessToken) }); return searchMetadata({ metadataSearchDto: dto }, { headers: asBearerAuth(accessToken) });
}, },
archiveAssets: (accessToken: string, ids: string[]) =>
updateAssets({ assetBulkUpdateDto: { ids, isArchived: true } }, { headers: asBearerAuth(accessToken) }),
deleteAssets: (accessToken: string, ids: string[]) => deleteAssets: (accessToken: string, ids: string[]) =>
deleteAssets({ assetBulkDeleteDto: { ids } }, { headers: asBearerAuth(accessToken) }), deleteAssets({ assetBulkDeleteDto: { ids } }, { headers: asBearerAuth(accessToken) }),

View File

@@ -0,0 +1,25 @@
import { LoginResponseDto } from '@immich/sdk';
import { test } from '@playwright/test';
import { utils } from 'src/utils';
test.describe('Album', () => {
let admin: LoginResponseDto;
test.beforeAll(async () => {
utils.initSdk();
await utils.resetDatabase();
admin = await utils.adminSetup();
});
test(`doesn't delete album after canceling add assets`, async ({ context, page }) => {
await utils.setAuthCookies(context, admin.accessToken);
await page.goto('/albums');
await page.getByRole('button', { name: 'Create album' }).click();
await page.getByRole('button', { name: 'Select photos' }).click();
await page.getByRole('button', { name: 'Close' }).click();
await page.reload();
await page.getByRole('button', { name: 'Select photos' }).waitFor();
});
});

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "machine-learning" name = "machine-learning"
version = "1.113.0" version = "1.113.1"
description = "" description = ""
authors = ["Hau Tran <alex.tran1502@gmail.com>"] authors = ["Hau Tran <alex.tran1502@gmail.com>"]
readme = "README.md" readme = "README.md"

View File

@@ -24,7 +24,7 @@
<application android:label="Immich" android:name=".ImmichApp" android:usesCleartextTraffic="true" <application android:label="Immich" android:name=".ImmichApp" android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true" android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true"
android:largeHeap="true" android:enableOnBackInvokedCallback="true"> android:largeHeap="true" android:enableOnBackInvokedCallback="false">
<service <service
android:name="androidx.work.impl.foreground.SystemForegroundService" android:name="androidx.work.impl.foreground.SystemForegroundService"
@@ -69,7 +69,7 @@
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="app.immich" android:pathPrefix="/oauth-callback"/> <data android:scheme="app.immich" android:pathPrefix="/oauth-callback" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle', task: 'bundle',
build_type: 'Release', build_type: 'Release',
properties: { properties: {
"android.injected.version.code" => 155, "android.injected.version.code" => 157,
"android.injected.version.name" => "1.113.0", "android.injected.version.name" => "1.113.1",
} }
) )
upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab') upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab')

View File

@@ -155,7 +155,7 @@
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
D218A34AEE62BC1EF119F5B0 /* [CP] Embed Pods Frameworks */, D218A34AEE62BC1EF119F5B0 /* [CP] Embed Pods Frameworks */,
C494C1A226E78FAB736DAB6C /* [CP] Copy Pods Resources */, 6724EEB7D74949FA08581154 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@@ -253,22 +253,7 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
9740EEB61CF901F6004384FC /* Run Script */ = { 6724EEB7D74949FA08581154 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
C494C1A226E78FAB736DAB6C /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@@ -285,6 +270,21 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
D218A34AEE62BC1EF119F5B0 /* [CP] Embed Pods Frameworks */ = { D218A34AEE62BC1EF119F5B0 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -401,7 +401,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 169; CURRENT_PROJECT_VERSION = 172;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -543,7 +543,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 169; CURRENT_PROJECT_VERSION = 172;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -571,7 +571,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 169; CURRENT_PROJECT_VERSION = 172;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;

View File

@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--Flutter View Controller--> <!--Flutter View Controller-->
@@ -14,13 +16,14 @@
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides> </layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/> <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view> </view>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="68" y="-2"/>
</scene> </scene>
</scenes> </scenes>
</document> </document>

View File

@@ -58,11 +58,11 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.112.1</string> <string>1.113.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>169</string> <string>172</string>
<key>FLTEnableImpeller</key> <key>FLTEnableImpeller</key>
<true/> <true/>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>

View File

@@ -19,7 +19,7 @@ platform :ios do
desc "iOS Release" desc "iOS Release"
lane :release do lane :release do
increment_version_number( increment_version_number(
version_number: "1.113.0" version_number: "1.113.1"
) )
increment_build_number( increment_build_number(
build_number: latest_testflight_build_number + 1, build_number: latest_testflight_build_number + 1,

View File

@@ -9,6 +9,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/utils/sqlite.dart';
import 'package:timezone/data/latest.dart'; import 'package:timezone/data/latest.dart';
import 'package:immich_mobile/constants/locales.dart'; import 'package:immich_mobile/constants/locales.dart';
import 'package:immich_mobile/services/background.service.dart'; import 'package:immich_mobile/services/background.service.dart';
@@ -54,6 +55,7 @@ void main() async {
Future<void> initApp() async { Future<void> initApp() async {
await EasyLocalization.ensureInitialized(); await EasyLocalization.ensureInitialized();
await openSqliteDatabase();
if (kReleaseMode && Platform.isAndroid) { if (kReleaseMode && Platform.isAndroid) {
try { try {

View File

@@ -349,6 +349,7 @@ class BackgroundService {
Future<bool> _onAssetsChanged() async { Future<bool> _onAssetsChanged() async {
final Isar db = await loadDb(); final Isar db = await loadDb();
HttpOverrides.global = HttpSSLCertOverride();
ApiService apiService = ApiService(); ApiService apiService = ApiService();
apiService.setAccessToken(Store.get(StoreKey.accessToken)); apiService.setAccessToken(Store.get(StoreKey.accessToken));
AppSettingsService settingService = AppSettingsService(); AppSettingsService settingService = AppSettingsService();

View File

@@ -0,0 +1,22 @@
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
Future<void> openSqliteDatabase() async {
final database = openDatabase(
// Set the path to the database. Note: Using the `join` function from the
// `path` package is best practice to ensure the path is correctly
// constructed for each platform.
join(await getDatabasesPath(), 'immich_database.db'),
// When the database is first created, create a table to store dogs.
onCreate: (db, version) {
// Run the CREATE TABLE statement on the database.
return db.execute(
'CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
);
},
// Set the version. This executes the onCreate function and provides a
// path to perform database upgrades and downgrades.
version: 1,
);
}

View File

@@ -3,7 +3,7 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.113.0 - API version: 1.113.1
- Generator version: 7.5.0 - Generator version: 7.5.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen - Build package: org.openapitools.codegen.languages.DartClientCodegen

View File

@@ -1454,7 +1454,7 @@ packages:
source: hosted source: hosted
version: "7.0.0" version: "7.0.0"
sqflite: sqflite:
dependency: transitive dependency: "direct main"
description: description:
name: sqflite name: sqflite
sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d

View File

@@ -2,7 +2,7 @@ name: immich_mobile
description: Immich - selfhosted backup media file on mobile phone description: Immich - selfhosted backup media file on mobile phone
publish_to: 'none' publish_to: 'none'
version: 1.113.0+155 version: 1.113.1+157
environment: environment:
sdk: '>=3.3.0 <4.0.0' sdk: '>=3.3.0 <4.0.0'
@@ -38,7 +38,7 @@ dependencies:
share_plus: ^10.0.0 share_plus: ^10.0.0
flutter_displaymode: ^0.6.0 flutter_displaymode: ^0.6.0
scrollable_positioned_list: ^0.3.8 scrollable_positioned_list: ^0.3.8
path: ^1.8.3 path: ^1.9.0
path_provider: ^2.1.2 path_provider: ^2.1.2
collection: ^1.18.0 collection: ^1.18.0
http_parser: ^4.0.2 http_parser: ^4.0.2
@@ -67,6 +67,7 @@ dependencies:
image_picker: ^1.0.7 # only used to select user profile image from system gallery -> we can simply select an image from within immich? image_picker: ^1.0.7 # only used to select user profile image from system gallery -> we can simply select an image from within immich?
logging: ^1.2.0 logging: ^1.2.0
file_picker: ^8.0.0+1 file_picker: ^8.0.0+1
sqflite: ^2.3.3+1
# This is uncommented in F-Droid build script # This is uncommented in F-Droid build script
# Taken from https://github.com/Myzel394/locus/blob/445013d22ec1d759027d4303bd65b30c5c8588c8/pubspec.yaml#L105 # Taken from https://github.com/Myzel394/locus/blob/445013d22ec1d759027d4303bd65b30c5c8588c8/pubspec.yaml#L105

View File

@@ -7394,7 +7394,7 @@
"info": { "info": {
"title": "Immich", "title": "Immich",
"description": "Immich API", "description": "Immich API",
"version": "1.113.0", "version": "1.113.1",
"contact": {} "contact": {}
}, },
"tags": [], "tags": [],

View File

@@ -1,18 +1,18 @@
{ {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.113.0", "version": "1.113.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.113.0", "version": "1.113.1",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@@ -22,9 +22,9 @@
"integrity": "sha512-8tKiYffhwTGHSHYGnZ3oneLGCjX0po/XAXQ5Ng9fqKkvIdl/xz8+Vh8i+6xjzZqvZ2pLVpUcuSfnvNI/x67L0g==" "integrity": "sha512-8tKiYffhwTGHSHYGnZ3oneLGCjX0po/XAXQ5Ng9fqKkvIdl/xz8+Vh8i+6xjzZqvZ2pLVpUcuSfnvNI/x67L0g=="
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.16.1", "version": "20.16.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.3.tgz",
"integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "integrity": "sha512-/wdGiWRkMOm53gAsSyFMXFZHbVg7C6CbkrzHNpaHoYfsUWPg7m6ZRKtvQjgvQ9i8WT540a3ydRlRQbxjY30XxQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.113.0", "version": "1.113.1",
"description": "Auto-generated TypeScript SDK for the Immich API", "description": "Auto-generated TypeScript SDK for the Immich API",
"type": "module", "type": "module",
"main": "./build/index.js", "main": "./build/index.js",
@@ -19,7 +19,7 @@
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"typescript": "^5.3.3" "typescript": "^5.3.3"
}, },
"repository": { "repository": {

View File

@@ -1,6 +1,6 @@
/** /**
* Immich * Immich
* 1.113.0 * 1.113.1
* DO NOT MODIFY - This file has been generated using oazapfts. * DO NOT MODIFY - This file has been generated using oazapfts.
* See https://www.npmjs.com/package/oazapfts * See https://www.npmjs.com/package/oazapfts
*/ */

View File

@@ -1,5 +1,5 @@
# dev build # dev build
FROM ghcr.io/immich-app/base-server-dev:20240827@sha256:c882c0a354faaac4f7256d30ecc2c45435eafa9b64d60793a171abb74ec5ca95 AS dev FROM ghcr.io/immich-app/base-server-dev:20240903@sha256:ca18e2805ec8ddcf0ac7734a6eaf6d9a08bd3a14218bf0dbdbe865d83117190f AS dev
RUN apt-get install --no-install-recommends -yqq tini RUN apt-get install --no-install-recommends -yqq tini
WORKDIR /usr/src/app WORKDIR /usr/src/app
@@ -41,7 +41,7 @@ RUN npm run build
# prod build # prod build
FROM ghcr.io/immich-app/base-server-prod:20240827@sha256:72a419dd703b0f530c43f3e00f3aa56be9efb61b4eb9fe911bae8c6f98237967 FROM ghcr.io/immich-app/base-server-prod:20240903@sha256:d0d170ceeee7ef6c7b62b5d927820d74c14a9893f3e6285c1b9df45b33951b09
WORKDIR /usr/src/app WORKDIR /usr/src/app
ENV NODE_ENV=production \ ENV NODE_ENV=production \

View File

@@ -63,6 +63,7 @@ export default [
'@typescript-eslint/require-await': 'error', '@typescript-eslint/require-await': 'error',
curly: 2, curly: 2,
'prettier/prettier': 0, 'prettier/prettier': 0,
'object-shorthand': ['error', 'always'],
'no-restricted-imports': [ 'no-restricted-imports': [
'error', 'error',

2387
server/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich", "name": "immich",
"version": "1.113.0", "version": "1.113.1",
"description": "", "description": "",
"author": "", "author": "",
"private": true, "private": true,
@@ -48,8 +48,8 @@
"@nestjs/websockets": "^10.2.2", "@nestjs/websockets": "^10.2.2",
"@opentelemetry/auto-instrumentations-node": "^0.49.0", "@opentelemetry/auto-instrumentations-node": "^0.49.0",
"@opentelemetry/context-async-hooks": "^1.24.0", "@opentelemetry/context-async-hooks": "^1.24.0",
"@opentelemetry/exporter-prometheus": "^0.52.0", "@opentelemetry/exporter-prometheus": "^0.53.0",
"@opentelemetry/sdk-node": "^0.52.0", "@opentelemetry/sdk-node": "^0.53.0",
"@react-email/components": "^0.0.23", "@react-email/components": "^0.0.23",
"@socket.io/redis-adapter": "^8.3.0", "@socket.io/redis-adapter": "^8.3.0",
"archiver": "^7.0.0", "archiver": "^7.0.0",
@@ -109,7 +109,7 @@
"@types/lodash": "^4.14.197", "@types/lodash": "^4.14.197",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/multer": "^1.4.7", "@types/multer": "^1.4.7",
"@types/node": "^20.16.1", "@types/node": "^20.16.2",
"@types/nodemailer": "^6.4.14", "@types/nodemailer": "^6.4.14",
"@types/picomatch": "^3.0.0", "@types/picomatch": "^3.0.0",
"@types/react": "^18.3.4", "@types/react": "^18.3.4",

View File

@@ -13,7 +13,7 @@ export class CreateProfileImageResponseDto {
export function mapCreateProfileImageResponse(userId: string, profileImagePath: string): CreateProfileImageResponseDto { export function mapCreateProfileImageResponse(userId: string, profileImagePath: string): CreateProfileImageResponseDto {
return { return {
userId: userId, userId,
profileImagePath: profileImagePath, profileImagePath,
}; };
} }

View File

@@ -169,7 +169,12 @@ export interface IAssetRepository {
order?: FindOptionsOrder<AssetEntity>, order?: FindOptionsOrder<AssetEntity>,
): Promise<AssetEntity | null>; ): Promise<AssetEntity | null>;
getWithout(pagination: PaginationOptions, property: WithoutProperty): Paginated<AssetEntity>; getWithout(pagination: PaginationOptions, property: WithoutProperty): Paginated<AssetEntity>;
getWith(pagination: PaginationOptions, property: WithProperty, libraryId?: string): Paginated<AssetEntity>; getWith(
pagination: PaginationOptions,
property: WithProperty,
libraryId?: string,
withDeleted?: boolean,
): Paginated<AssetEntity>;
getRandom(userId: string, count: number): Promise<AssetEntity[]>; getRandom(userId: string, count: number): Promise<AssetEntity[]>;
getFirstAssetForAlbumId(albumId: string): Promise<AssetEntity | null>; getFirstAssetForAlbumId(albumId: string): Promise<AssetEntity | null>;
getLastUpdatedAssetForAlbumId(albumId: string): Promise<AssetEntity | null>; getLastUpdatedAssetForAlbumId(albumId: string): Promise<AssetEntity | null>;

View File

@@ -0,0 +1,21 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
export class UpsertMissingAssetJobStatus1725258039306 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`INSERT INTO "asset_job_status" ("assetId", "facesRecognizedAt", "metadataExtractedAt", "duplicatesDetectedAt", "previewAt", "thumbnailAt") SELECT "assetId", NULL, NULL, NULL, NULL, NULL FROM "asset_files" f WHERE "f"."path" IS NOT NULL ON CONFLICT DO NOTHING`,
);
await queryRunner.query(
`UPDATE "asset_job_status" SET "previewAt" = NOW() FROM "asset_files" f WHERE "previewAt" IS NULL AND "asset_job_status"."assetId" = "f"."assetId" AND "f"."type" = 'preview' AND "f"."path" IS NOT NULL`,
);
await queryRunner.query(
`UPDATE "asset_job_status" SET "thumbnailAt" = NOW() FROM "asset_files" f WHERE "thumbnailAt" IS NULL AND "asset_job_status"."assetId" = "f"."assetId" AND "f"."type" = 'thumbnail' AND "f"."path" IS NOT NULL`,
);
}
public async down(): Promise<void> {
// do nothing
}
}

View File

@@ -0,0 +1,13 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class RemoveThumbailAtForMissingThumbnails1725327902980 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`UPDATE "asset_job_status" j SET "thumbnailAt" = NULL WHERE j."thumbnailAt" IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM public.asset_files f WHERE j."assetId" = f."assetId" AND f."type" = 'thumbnail' AND f."path" IS NOT NULL )`);
}
public async down(): Promise<void> {
// do nothing
}
}

View File

@@ -395,7 +395,7 @@ export class AssetRepository implements IAssetRepository {
switch (property) { switch (property) {
case WithoutProperty.THUMBNAIL: { case WithoutProperty.THUMBNAIL: {
relations = { jobStatus: true }; relations = { jobStatus: true, files: true };
where = [ where = [
{ jobStatus: { previewAt: IsNull() }, isVisible: true }, { jobStatus: { previewAt: IsNull() }, isVisible: true },
{ jobStatus: { thumbnailAt: IsNull() }, isVisible: true }, { jobStatus: { thumbnailAt: IsNull() }, isVisible: true },
@@ -527,7 +527,12 @@ export class AssetRepository implements IAssetRepository {
}); });
} }
getWith(pagination: PaginationOptions, property: WithProperty, libraryId?: string): Paginated<AssetEntity> { getWith(
pagination: PaginationOptions,
property: WithProperty,
libraryId?: string,
withDeleted = false,
): Paginated<AssetEntity> {
let where: FindOptionsWhere<AssetEntity> | FindOptionsWhere<AssetEntity>[] = {}; let where: FindOptionsWhere<AssetEntity> | FindOptionsWhere<AssetEntity>[] = {};
switch (property) { switch (property) {
@@ -557,6 +562,7 @@ export class AssetRepository implements IAssetRepository {
return paginate(this.repository, pagination, { return paginate(this.repository, pagination, {
where, where,
withDeleted,
order: { order: {
// Ensures correct order when paginating // Ensures correct order when paginating
createdAt: 'ASC', createdAt: 'ASC',

View File

@@ -317,7 +317,7 @@ export class MapRepository implements IMapRepository {
} }
const input = createReadStream(filePath); const input = createReadStream(filePath);
const lineReader = readLine.createInterface({ input: input }); const lineReader = readLine.createInterface({ input });
const adminMap = new Map<string, string>(); const adminMap = new Map<string, string>();
for await (const line of lineReader) { for await (const line of lineReader) {

View File

@@ -239,7 +239,7 @@ export class AlbumService {
throw new BadRequestException('User not found'); throw new BadRequestException('User not found');
} }
await this.albumUserRepository.create({ userId: userId, albumId: id, role }); await this.albumUserRepository.create({ userId, albumId: id, role });
await this.eventRepository.emit('album.invite', { id, userId }); await this.eventRepository.emit('album.invite', { id, userId });
} }

View File

@@ -46,7 +46,7 @@ const fixtures = {
}; };
const oauthUserWithDefaultQuota = { const oauthUserWithDefaultQuota = {
email: email, email,
name: ' ', name: ' ',
oauthId: sub, oauthId: sub,
quotaSizeInBytes: 1_073_741_824, quotaSizeInBytes: 1_073_741_824,
@@ -561,7 +561,7 @@ describe('AuthService', () => {
); );
expect(userMock.create).toHaveBeenCalledWith({ expect(userMock.create).toHaveBeenCalledWith({
email: email, email,
name: ' ', name: ' ',
oauthId: sub, oauthId: sub,
quotaSizeInBytes: null, quotaSizeInBytes: null,
@@ -581,7 +581,7 @@ describe('AuthService', () => {
); );
expect(userMock.create).toHaveBeenCalledWith({ expect(userMock.create).toHaveBeenCalledWith({
email: email, email,
name: ' ', name: ' ',
oauthId: sub, oauthId: sub,
quotaSizeInBytes: 5_368_709_120, quotaSizeInBytes: 5_368_709_120,

View File

@@ -421,7 +421,7 @@ export class AuthService {
await this.sessionRepository.update({ id: session.id, updatedAt: new Date() }); await this.sessionRepository.update({ id: session.id, updatedAt: new Date() });
} }
return { user: session.user, session: session }; return { user: session.user, session };
} }
throw new UnauthorizedException('Invalid user token'); throw new UnauthorizedException('Invalid user token');

View File

@@ -339,7 +339,7 @@ export class LibraryService {
const libraryId = job.id; const libraryId = job.id;
const assetPagination = usePagination(JOBS_LIBRARY_PAGINATION_SIZE, (pagination) => const assetPagination = usePagination(JOBS_LIBRARY_PAGINATION_SIZE, (pagination) =>
this.assetRepository.getAll(pagination, { libraryId: libraryId, withDeleted: true }), this.assetRepository.getAll(pagination, { libraryId, withDeleted: true }),
); );
let assetsFound = false; let assetsFound = false;
@@ -465,7 +465,7 @@ export class LibraryService {
libraryId: job.id, libraryId: job.id,
checksum: pathHash, checksum: pathHash,
originalPath: assetPath, originalPath: assetPath,
deviceAssetId: deviceAssetId, deviceAssetId,
deviceId: 'Library Import', deviceId: 'Library Import',
fileCreatedAt: stats.mtime, fileCreatedAt: stats.mtime,
fileModifiedAt: stats.mtime, fileModifiedAt: stats.mtime,
@@ -581,7 +581,7 @@ export class LibraryService {
this.logger.debug(`Removing offline assets for library ${job.id}`); this.logger.debug(`Removing offline assets for library ${job.id}`);
const assetPagination = usePagination(JOBS_LIBRARY_PAGINATION_SIZE, (pagination) => const assetPagination = usePagination(JOBS_LIBRARY_PAGINATION_SIZE, (pagination) =>
this.assetRepository.getWith(pagination, WithProperty.IS_OFFLINE, job.id), this.assetRepository.getWith(pagination, WithProperty.IS_OFFLINE, job.id, true),
); );
let offlineAssets = 0; let offlineAssets = 0;

View File

@@ -408,6 +408,17 @@ describe(MetadataService.name, () => {
expect(tagMock.upsertValue).toHaveBeenCalledWith({ userId: 'user-id', value: 'Parent', parent: undefined }); expect(tagMock.upsertValue).toHaveBeenCalledWith({ userId: 'user-id', value: 'Parent', parent: undefined });
}); });
it('should extract tags from Keywords as a list with a number', async () => {
assetMock.getByIds.mockResolvedValue([assetStub.image]);
metadataMock.readTags.mockResolvedValue({ Keywords: ['Parent', 2024] as any[] });
tagMock.upsertValue.mockResolvedValue(tagStub.parent);
await sut.handleMetadataExtraction({ id: assetStub.image.id });
expect(tagMock.upsertValue).toHaveBeenCalledWith({ userId: 'user-id', value: 'Parent', parent: undefined });
expect(tagMock.upsertValue).toHaveBeenCalledWith({ userId: 'user-id', value: '2024', parent: undefined });
});
it('should extract hierarchal tags from Keywords', async () => { it('should extract hierarchal tags from Keywords', async () => {
assetMock.getByIds.mockResolvedValue([assetStub.image]); assetMock.getByIds.mockResolvedValue([assetStub.image]);
metadataMock.readTags.mockResolvedValue({ Keywords: 'Parent/Child' }); metadataMock.readTags.mockResolvedValue({ Keywords: 'Parent/Child' });

View File

@@ -352,22 +352,21 @@ export class MetadataService {
} }
private async applyTagList(asset: AssetEntity, exifTags: ImmichTags) { private async applyTagList(asset: AssetEntity, exifTags: ImmichTags) {
const tags: string[] = []; const tags: unknown[] = [];
if (exifTags.TagsList) { if (exifTags.TagsList) {
tags.push(...exifTags.TagsList); tags.push(...exifTags.TagsList);
} }
if (exifTags.Keywords) { if (exifTags.Keywords) {
let keywords = exifTags.Keywords; let keywords = exifTags.Keywords;
if (typeof keywords === 'string') { if (!Array.isArray(keywords)) {
keywords = [keywords]; keywords = [keywords];
} }
tags.push(...keywords); tags.push(...keywords);
} }
if (tags.length > 0) { if (tags.length > 0) {
const results = await upsertTags(this.tagRepository, { userId: asset.ownerId, tags }); const results = await upsertTags(this.tagRepository, { userId: asset.ownerId, tags: tags.map(String) });
const tagIds = results.map((tag) => tag.id); const tagIds = results.map((tag) => tag.id);
await this.tagRepository.upsertAssetTags({ assetId: asset.id, tagIds }); await this.tagRepository.upsertAssetTags({ assetId: asset.id, tagIds });
} }

View File

@@ -309,7 +309,7 @@ describe(StorageTemplateService.name, () => {
entityId: assetStub.image.id, entityId: assetStub.image.id,
pathType: AssetPathType.ORIGINAL, pathType: AssetPathType.ORIGINAL,
oldPath: assetStub.image.originalPath, oldPath: assetStub.image.originalPath,
newPath: newPath, newPath,
}); });
expect(storageMock.rename).toHaveBeenCalledWith(assetStub.image.originalPath, newPath); expect(storageMock.rename).toHaveBeenCalledWith(assetStub.image.originalPath, newPath);
expect(storageMock.copyFile).toHaveBeenCalledWith(assetStub.image.originalPath, newPath); expect(storageMock.copyFile).toHaveBeenCalledWith(assetStub.image.originalPath, newPath);

View File

@@ -227,7 +227,7 @@ export class StorageTemplateService {
const storagePath = this.render(this.template.compiled, { const storagePath = this.render(this.template.compiled, {
asset, asset,
filename: sanitized, filename: sanitized,
extension: extension, extension,
albumName, albumName,
}); });
const fullPath = path.normalize(path.join(rootPath, storagePath)); const fullPath = path.normalize(path.join(rootPath, storagePath));

View File

@@ -41,6 +41,7 @@ export class TrashService {
const assetPagination = usePagination(JOBS_ASSET_PAGINATION_SIZE, (pagination) => const assetPagination = usePagination(JOBS_ASSET_PAGINATION_SIZE, (pagination) =>
this.assetRepository.getByUserId(pagination, auth.user.id, { this.assetRepository.getByUserId(pagination, auth.user.id, {
trashedBefore: DateTime.now().toJSDate(), trashedBefore: DateTime.now().toJSDate(),
withArchived: true,
}), }),
); );

View File

@@ -31,7 +31,7 @@ const files: AssetFileEntity[] = [previewFile, thumbnailFile];
export const stackStub = (stackId: string, assets: AssetEntity[]): StackEntity => { export const stackStub = (stackId: string, assets: AssetEntity[]): StackEntity => {
return { return {
id: stackId, id: stackId,
assets: assets, assets,
owner: assets[0].owner, owner: assets[0].owner,
ownerId: assets[0].ownerId, ownerId: assets[0].ownerId,
primaryAsset: assets[0], primaryAsset: assets[0],

View File

@@ -87,6 +87,7 @@ export default [
'@typescript-eslint/no-floating-promises': 'error', '@typescript-eslint/no-floating-promises': 'error',
'@typescript-eslint/no-misused-promises': 'error', '@typescript-eslint/no-misused-promises': 'error',
'@typescript-eslint/require-await': 'error', '@typescript-eslint/require-await': 'error',
'object-shorthand': ['error', 'always'],
}, },
}, },
{ {

793
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich-web", "name": "immich-web",
"version": "1.113.0", "version": "1.113.1",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"scripts": { "scripts": {
"dev": "vite dev --host 0.0.0.0 --port 3000", "dev": "vite dev --host 0.0.0.0 --port 3000",
@@ -29,8 +29,8 @@
"@socket.io/component-emitter": "^3.1.0", "@socket.io/component-emitter": "^3.1.0",
"@sveltejs/adapter-static": "^3.0.1", "@sveltejs/adapter-static": "^3.0.1",
"@sveltejs/enhanced-img": "^0.3.0", "@sveltejs/enhanced-img": "^0.3.0",
"@sveltejs/kit": "^2.5.2", "@sveltejs/kit": "^2.5.18",
"@sveltejs/vite-plugin-svelte": "^3.0.2", "@sveltejs/vite-plugin-svelte": "^3.1.2",
"@testing-library/jest-dom": "^6.4.2", "@testing-library/jest-dom": "^6.4.2",
"@testing-library/svelte": "^5.2.0", "@testing-library/svelte": "^5.2.0",
"@testing-library/user-event": "^14.5.2", "@testing-library/user-event": "^14.5.2",
@@ -45,7 +45,7 @@
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"eslint": "^9.0.0", "eslint": "^9.0.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-svelte": "^2.35.1", "eslint-plugin-svelte": "^2.43.0",
"eslint-plugin-unicorn": "^55.0.0", "eslint-plugin-unicorn": "^55.0.0",
"factory.ts": "^1.4.1", "factory.ts": "^1.4.1",
"globals": "^15.9.0", "globals": "^15.9.0",
@@ -53,13 +53,13 @@
"prettier": "^3.2.5", "prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^4.0.0", "prettier-plugin-organize-imports": "^4.0.0",
"prettier-plugin-sort-json": "^4.0.0", "prettier-plugin-sort-json": "^4.0.0",
"prettier-plugin-svelte": "^3.2.1", "prettier-plugin-svelte": "^3.2.6",
"rollup-plugin-visualizer": "^5.12.0", "rollup-plugin-visualizer": "^5.12.0",
"svelte": "^4.2.12", "svelte": "^4.2.19",
"svelte-check": "^3.6.5", "svelte-check": "^4.0.0",
"tailwindcss": "^3.4.1", "tailwindcss": "^3.4.1",
"tslib": "^2.6.2", "tslib": "^2.6.2",
"typescript": "^5.3.3", "typescript": "^5.5.0",
"vite": "^5.1.4", "vite": "^5.1.4",
"vitest": "^2.0.5" "vitest": "^2.0.5"
}, },

View File

@@ -476,7 +476,7 @@
<section class="px-6 pt-6 dark:text-immich-dark-fg"> <section class="px-6 pt-6 dark:text-immich-dark-fg">
<p class="pb-4 text-sm">{$t('appears_in').toUpperCase()}</p> <p class="pb-4 text-sm">{$t('appears_in').toUpperCase()}</p>
{#each albums as album} {#each albums as album}
<a data-sveltekit-preload-data="hover" href={`/albums/${album.id}`}> <a href="{AppRoute.ALBUMS}/{album.id}">
<div class="flex gap-4 pt-2 hover:cursor-pointer items-center"> <div class="flex gap-4 pt-2 hover:cursor-pointer items-center">
<div> <div>
<img <img

View File

@@ -1,11 +1,12 @@
<script lang="ts"> <script lang="ts">
import { getAssetOriginalUrl, getKey } from '$lib/utils'; import { getAssetOriginalUrl, getKey } from '$lib/utils';
import { isWebCompatibleImage } from '$lib/utils/asset-utils';
import { AssetMediaSize, AssetTypeEnum, viewAsset, type AssetResponseDto } from '@immich/sdk'; import { AssetMediaSize, AssetTypeEnum, viewAsset, type AssetResponseDto } from '@immich/sdk';
import type { AdapterConstructor, PluginConstructor } from '@photo-sphere-viewer/core'; import type { AdapterConstructor, PluginConstructor } from '@photo-sphere-viewer/core';
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
import LoadingSpinner from '../shared-components/loading-spinner.svelte'; import LoadingSpinner from '../shared-components/loading-spinner.svelte';
import { t } from 'svelte-i18n'; import { t } from 'svelte-i18n';
export let asset: Pick<AssetResponseDto, 'id' | 'type'>; export let asset: { id: string; type: AssetTypeEnum.Video } | AssetResponseDto;
const photoSphereConfigs = const photoSphereConfigs =
asset.type === AssetTypeEnum.Video asset.type === AssetTypeEnum.Video
@@ -27,6 +28,9 @@
const url = URL.createObjectURL(data); const url = URL.createObjectURL(data);
return url; return url;
}; };
const originalImageUrl =
asset.type === AssetTypeEnum.Image && isWebCompatibleImage(asset) ? getAssetOriginalUrl(asset.id) : null;
</script> </script>
<div transition:fade={{ duration: 150 }} class="flex h-full select-none place-content-center place-items-center"> <div transition:fade={{ duration: 150 }} class="flex h-full select-none place-content-center place-items-center">
@@ -34,7 +38,14 @@
{#await Promise.all([loadAssetData(), import('./photo-sphere-viewer-adapter.svelte'), ...photoSphereConfigs])} {#await Promise.all([loadAssetData(), import('./photo-sphere-viewer-adapter.svelte'), ...photoSphereConfigs])}
<LoadingSpinner /> <LoadingSpinner />
{:then [data, module, adapter, plugins, navbar]} {:then [data, module, adapter, plugins, navbar]}
<svelte:component this={module.default} panorama={data} plugins={plugins ?? undefined} {navbar} {adapter} /> <svelte:component
this={module.default}
panorama={data}
plugins={plugins ?? undefined}
{navbar}
{adapter}
{originalImageUrl}
/>
{:catch} {:catch}
{$t('errors.failed_to_load_asset')} {$t('errors.failed_to_load_asset')}
{/await} {/await}

View File

@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import { import {
Viewer, Viewer,
events,
EquirectangularAdapter, EquirectangularAdapter,
type PluginConstructor, type PluginConstructor,
type AdapterConstructor, type AdapterConstructor,
@@ -9,6 +10,7 @@
import { onDestroy, onMount } from 'svelte'; import { onDestroy, onMount } from 'svelte';
export let panorama: string | { source: string }; export let panorama: string | { source: string };
export let originalImageUrl: string | null;
export let adapter: AdapterConstructor | [AdapterConstructor, unknown] = EquirectangularAdapter; export let adapter: AdapterConstructor | [AdapterConstructor, unknown] = EquirectangularAdapter;
export let plugins: (PluginConstructor | [PluginConstructor, unknown])[] = []; export let plugins: (PluginConstructor | [PluginConstructor, unknown])[] = [];
export let navbar = false; export let navbar = false;
@@ -28,6 +30,20 @@
maxFov: 180, maxFov: 180,
fisheye: true, fisheye: true,
}); });
if (originalImageUrl) {
const zoomHandler = ({ zoomLevel }: events.ZoomUpdatedEvent) => {
// zoomLevel range: [0, 100]
if (Math.round(zoomLevel) >= 75) {
// Replace the preview with the original
viewer.setPanorama(originalImageUrl, { showLoader: false, speed: 150 }).catch(() => {
viewer.setPanorama(panorama, { showLoader: false, speed: 0 }).catch(() => {});
});
viewer.removeEventListener(events.ZoomUpdatedEvent.type, zoomHandler);
}
};
viewer.addEventListener(events.ZoomUpdatedEvent.type, zoomHandler);
}
}); });
onDestroy(() => { onDestroy(() => {

View File

@@ -169,7 +169,13 @@
<LoadingSpinner /> <LoadingSpinner />
</div> </div>
{:else if !imageError} {:else if !imageError}
<div use:zoomImageAction class="h-full w-full" transition:fade={{ duration: haveFadeTransition ? 150 : 0 }}> <div
use:zoomImageAction
use:swipe
on:swipe={onSwipe}
class="h-full w-full"
transition:fade={{ duration: haveFadeTransition ? 150 : 0 }}
>
{#if $slideshowState !== SlideshowState.None && $slideshowLook === SlideshowLook.BlurredBackground} {#if $slideshowState !== SlideshowState.None && $slideshowLook === SlideshowLook.BlurredBackground}
<img <img
src={assetFileUrl} src={assetFileUrl}
@@ -181,8 +187,6 @@
<img <img
bind:this={$photoViewer} bind:this={$photoViewer}
src={assetFileUrl} src={assetFileUrl}
use:swipe
on:swipe={onSwipe}
alt={$getAltText(asset)} alt={$getAltText(asset)}
class="h-full w-full {$slideshowState === SlideshowState.None class="h-full w-full {$slideshowState === SlideshowState.None
? 'object-contain' ? 'object-contain'

View File

@@ -81,7 +81,7 @@
const mergedPerson = await getPerson({ id: person.id }); const mergedPerson = await getPerson({ id: person.id });
const count = results.filter(({ success }) => success).length; const count = results.filter(({ success }) => success).length;
notificationController.show({ notificationController.show({
message: $t('merged_people_count', { values: { count: count } }), message: $t('merged_people_count', { values: { count } }),
type: NotificationType.Info, type: NotificationType.Info,
}); });
dispatch('merge', mergedPerson); dispatch('merge', mergedPerson);

View File

@@ -309,7 +309,7 @@
class:opacity-100={!galleryInView} class:opacity-100={!galleryInView}
> >
<CircleIconButton <CircleIconButton
href="${AppRoute.PHOTOS}?at=${currentAsset.id}" href="{AppRoute.PHOTOS}?at={currentAsset.id}"
icon={mdiImageSearch} icon={mdiImageSearch}
title={$t('view_in_timeline')} title={$t('view_in_timeline')}
color="light" color="light"

View File

@@ -40,7 +40,7 @@
const count = results.filter(({ success }) => success).length; const count = results.filter(({ success }) => success).length;
notificationController.show({ notificationController.show({
type: NotificationType.Info, type: NotificationType.Info,
message: $t('assets_removed_count', { values: { count: count } }), message: $t('assets_removed_count', { values: { count } }),
}); });
clearSelect(); clearSelect();

View File

@@ -45,7 +45,7 @@
notificationController.show({ notificationController.show({
type: NotificationType.Info, type: NotificationType.Info,
message: $t('assets_removed_count', { values: { count: count } }), message: $t('assets_removed_count', { values: { count } }),
}); });
clearSelect(); clearSelect();

View File

@@ -762,20 +762,21 @@
{#if showShortcuts} {#if showShortcuts}
<ShowShortcuts on:close={() => (showShortcuts = !showShortcuts)} /> <ShowShortcuts on:close={() => (showShortcuts = !showShortcuts)} />
{/if} {/if}
{#if assetStore.buckets.length > 0}
<Scrubber <Scrubber
invisible={showSkeleton} invisible={showSkeleton}
{assetStore} {assetStore}
height={safeViewport.height} height={safeViewport.height}
timelineTopOffset={topSectionHeight} timelineTopOffset={topSectionHeight}
timelineBottomOffset={bottomSectionHeight} timelineBottomOffset={bottomSectionHeight}
{leadout} {leadout}
{scrubOverallPercent} {scrubOverallPercent}
{scrubBucketPercent} {scrubBucketPercent}
{scrubBucket} {scrubBucket}
{onScrub} {onScrub}
{stopScrub} {stopScrub}
/> />
{/if}
<!-- Right margin MUST be equal to the width of immich-scrubbable-scrollbar --> <!-- Right margin MUST be equal to the width of immich-scrubbable-scrollbar -->
<section <section

View File

@@ -39,7 +39,7 @@
if (!heightPending) { if (!heightPending) {
const height = element.getBoundingClientRect().height; const height = element.getBoundingClientRect().height;
if (height !== 0) { if (height !== 0) {
$assetStore.updateBucket(bucket.bucketDate, { height: height, measured: true }); $assetStore.updateBucket(bucket.bucketDate, { height, measured: true });
} }
onMeasured(); onMeasured();
@@ -65,9 +65,7 @@
<section id="measure-asset-group-by-date" class="flex flex-wrap gap-x-12" use:measure> <section id="measure-asset-group-by-date" class="flex flex-wrap gap-x-12" use:measure>
{#each bucket.dateGroups as dateGroup} {#each bucket.dateGroups as dateGroup}
<div id="date-group" data-date-group={dateGroup.date}> <div id="date-group" data-date-group={dateGroup.date}>
<div <div use:resizeObserver={({ height }) => $assetStore.updateBucketDateGroup(bucket, dateGroup, { height })}>
use:resizeObserver={({ height }) => $assetStore.updateBucketDateGroup(bucket, dateGroup, { height: height })}
>
<div <div
class="flex z-[100] sticky top-[-1px] pt-7 pb-5 h-6 place-items-center text-xs font-medium text-immich-fg bg-immich-bg dark:bg-immich-dark-bg dark:text-immich-dark-fg md:text-sm" class="flex z-[100] sticky top-[-1px] pt-7 pb-5 h-6 place-items-center text-xs font-medium text-immich-fg bg-immich-bg dark:bg-immich-dark-bg dark:text-immich-dark-fg md:text-sm"
style:width={dateGroup.geometry.containerWidth + 'px'} style:width={dateGroup.geometry.containerWidth + 'px'}

View File

@@ -16,7 +16,7 @@
// re-visit with svelte 5. runes will make this better. // re-visit with svelte 5. runes will make this better.
// eslint-disable-next-line @typescript-eslint/no-unused-expressions // eslint-disable-next-line @typescript-eslint/no-unused-expressions
newContent; newContent;
if (textarea) { if (textarea && newContent.length > 0) {
void tick().then(() => autoGrowHeight(textarea)); void tick().then(() => autoGrowHeight(textarea));
} }
} }

View File

@@ -0,0 +1,59 @@
<script lang="ts">
import CircleIconButton from '$lib/components/elements/buttons/circle-icon-button.svelte';
import Icon from '$lib/components/elements/icon.svelte';
import { mdiArrowUpLeft, mdiChevronRight } from '@mdi/js';
import { t } from 'svelte-i18n';
export let pathSegments: string[] = [];
export let getLink: (path: string) => string;
export let title: string;
export let icon: string;
$: isRoot = pathSegments.length === 0;
</script>
<nav class="flex items-center py-2">
{#if !isRoot}
<div>
<CircleIconButton
icon={mdiArrowUpLeft}
title={$t('to_parent')}
href={getLink(pathSegments.slice(0, -1).join('/'))}
class="mr-2"
padding="2"
/>
</div>
{/if}
<div
class="bg-gray-50 dark:bg-immich-dark-gray/50 w-full p-2 rounded-2xl border border-gray-100 dark:border-gray-900 overflow-y-auto immich-scrollbar"
>
<ol class="flex gap-2 items-center">
<li>
<CircleIconButton
{icon}
href={getLink('')}
{title}
size="1.25em"
padding="2"
aria-current={isRoot ? 'page' : undefined}
/>
</li>
{#each pathSegments as segment, index}
{@const isLastSegment = index === pathSegments.length - 1}
<li
class="flex gap-2 items-center font-mono text-sm text-nowrap text-immich-primary dark:text-immich-dark-primary"
>
<Icon path={mdiChevronRight} class="text-gray-500 dark:text-gray-300" size={16} ariaHidden />
{#if isLastSegment}
<p class="cursor-default">{segment}</p>
{:else}
<a class="underline hover:font-semibold" href={getLink(pathSegments.slice(0, index + 1).join('/'))}>
{segment}
</a>
{/if}
</li>
{/each}
</ol>
</div>
</nav>

View File

@@ -39,7 +39,7 @@
size={20} size={20}
/> />
</div> </div>
<span class="text-nowrap overflow-clip font-mono pl-1 pt-1">{value}</span> <span class="text-nowrap overflow-hidden text-ellipsis font-mono pl-1 pt-1">{value}</span>
</a> </a>
{#if isOpen} {#if isOpen}

View File

@@ -50,7 +50,7 @@ describe('ShareCover component', () => {
it.skip('renders fallback image when asset is not resized', () => { it.skip('renders fallback image when asset is not resized', () => {
const link = sharedLinkFactory.build({ assets: [assetFactory.build()] }); const link = sharedLinkFactory.build({ assets: [assetFactory.build()] });
render(ShareCover, { render(ShareCover, {
link: link, link,
preload: false, preload: false,
}); });

View File

@@ -377,7 +377,10 @@
"assets_moved_to_trash": "", "assets_moved_to_trash": "",
"authorized_devices": "Удостоверени устройства", "authorized_devices": "Удостоверени устройства",
"back": "Назад", "back": "Назад",
"back_close_deselect": "Назад, затваряне или премахване на избора",
"backward": "Назад", "backward": "Назад",
"birthdate_saved": "Датата на раждане е запазена успешно",
"birthdate_set_description": "Датата на раждане се използва за изчисляване на възрастта на този човек към момента на снимката.",
"blurred_background": "Замъглен заден фон", "blurred_background": "Замъглен заден фон",
"bulk_delete_duplicates_confirmation": "", "bulk_delete_duplicates_confirmation": "",
"bulk_keep_duplicates_confirmation": "", "bulk_keep_duplicates_confirmation": "",

View File

@@ -174,7 +174,7 @@
"oauth_issuer_url": "URL vydavatele", "oauth_issuer_url": "URL vydavatele",
"oauth_mobile_redirect_uri": "Mobilní přesměrování URI", "oauth_mobile_redirect_uri": "Mobilní přesměrování URI",
"oauth_mobile_redirect_uri_override": "Přepsat mobilní přesměrování URI", "oauth_mobile_redirect_uri_override": "Přepsat mobilní přesměrování URI",
"oauth_mobile_redirect_uri_override_description": "Povolit, pokud poskytovatel OAuth nepovoluje mobilní URI, například '{callback}'.", "oauth_mobile_redirect_uri_override_description": "Povolit, pokud poskytovatel OAuth nepovoluje mobilní URI, například '{callback}'",
"oauth_profile_signing_algorithm": "Algoritmus podepisování profilu", "oauth_profile_signing_algorithm": "Algoritmus podepisování profilu",
"oauth_profile_signing_algorithm_description": "Algoritmus použitý k podepsání profilu uživatele.", "oauth_profile_signing_algorithm_description": "Algoritmus použitý k podepsání profilu uživatele.",
"oauth_scope": "Rozsah", "oauth_scope": "Rozsah",
@@ -1245,6 +1245,7 @@
"tag_assets": "Přiřadit značku", "tag_assets": "Přiřadit značku",
"tag_created": "Vytvořena značka: {tag}", "tag_created": "Vytvořena značka: {tag}",
"tag_feature_description": "Procházení fotografií a videí seskupených podle témat logických značek", "tag_feature_description": "Procházení fotografií a videí seskupených podle témat logických značek",
"tag_not_found_question": "Nemůžete najít značku? Vytvořte ji <link>zde</link>",
"tag_updated": "Aktualizována značka: {tag}", "tag_updated": "Aktualizována značka: {tag}",
"tagged_assets": "Přiřazena značka {count, plural, one {# položce} other {# položkám}}", "tagged_assets": "Přiřazena značka {count, plural, one {# položce} other {# položkám}}",
"tags": "Značky", "tags": "Značky",

View File

@@ -29,7 +29,7 @@
"admin": { "admin": {
"add_exclusion_pattern_description": "Ausschlussmuster hinzufügen. Platzhalter, wie *, **, und ? werden unterstützt. Um alle Dateien in einem Verzeichnis namens „Raw\" zu ignorieren, „**/Raw/**“ verwenden. Um alle Dateien zu ignorieren, die auf „.tif“ enden, „**/*.tif“ verwenden. Um einen absoluten Pfad zu ignorieren, „/pfad/zum/ignorieren/**“ verwenden.", "add_exclusion_pattern_description": "Ausschlussmuster hinzufügen. Platzhalter, wie *, **, und ? werden unterstützt. Um alle Dateien in einem Verzeichnis namens „Raw\" zu ignorieren, „**/Raw/**“ verwenden. Um alle Dateien zu ignorieren, die auf „.tif“ enden, „**/*.tif“ verwenden. Um einen absoluten Pfad zu ignorieren, „/pfad/zum/ignorieren/**“ verwenden.",
"authentication_settings": "Authentifizierungseinstellungen", "authentication_settings": "Authentifizierungseinstellungen",
"authentication_settings_description": "Verwaltung von Passwort-, OAuth- und sonstigen Authentifizierungseinstellungen", "authentication_settings_description": "Passwort-, OAuth- und sonstigen Authentifizierungseinstellungen verwalten",
"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": "Hintergrund-Aufgaben", "background_task_job": "Hintergrund-Aufgaben",
@@ -65,14 +65,14 @@
"image_quality": "Qualität", "image_quality": "Qualität",
"image_quality_description": "Bildqualität von 1-100. Höher bedeutet bessere Qualität, erzeugt aber größere Dateien. Diese Option betrifft die Vorschaubilder und Miniaturansichten.", "image_quality_description": "Bildqualität von 1-100. Höher bedeutet bessere Qualität, erzeugt aber größere Dateien. Diese Option betrifft die Vorschaubilder und Miniaturansichten.",
"image_settings": "Bildeinstellungen", "image_settings": "Bildeinstellungen",
"image_settings_description": "Verwaltung der Qualität und Auflösung von generierten Bildern", "image_settings_description": "Qualität und Auflösung von generierten Bildern verwalten",
"image_thumbnail_format": "Miniaturansichts-Format", "image_thumbnail_format": "Miniaturansichts-Format",
"image_thumbnail_resolution": "Miniaturansichts-Auflösung", "image_thumbnail_resolution": "Miniaturansichts-Auflösung",
"image_thumbnail_resolution_description": "Dies wird bei der Anzeige von Bildergruppen („Zeitleiste“, „Albumansicht“ usw.) verwendet. Höhere Auflösungen können mehr Details beibehalten, benötigen aber mehr Zeit für die Kodierung, haben größere Dateigrößen und können die Reaktionsfähigkeit der App beeinträchtigen.", "image_thumbnail_resolution_description": "Dies wird bei der Anzeige von Bildergruppen („Zeitleiste“, „Albumansicht“ usw.) verwendet. Höhere Auflösungen können mehr Details beibehalten, benötigen aber mehr Zeit für die Kodierung, haben größere Dateigrößen und können die Reaktionsfähigkeit der App beeinträchtigen.",
"job_concurrency": "{job} - (Anzahl gleichzeitiger Prozesse)", "job_concurrency": "{job} - (Anzahl gleichzeitiger Prozesse)",
"job_not_concurrency_safe": "Dieser Job ist nicht parallelisierungssicher.", "job_not_concurrency_safe": "Dieser Job ist nicht parallelisierungssicher.",
"job_settings": "Job-Einstellungen", "job_settings": "Job-Einstellungen",
"job_settings_description": "Verwaltung von gleichzeitigen Job-Prozessen", "job_settings_description": "Gleichzeitige Job-Prozessen verwalten",
"job_status": "Job-Status", "job_status": "Job-Status",
"jobs_delayed": "{jobCount, plural, other {# verzögert}}", "jobs_delayed": "{jobCount, plural, other {# verzögert}}",
"jobs_failed": "{jobCount, plural, other {# fehlgeschlagen}}", "jobs_failed": "{jobCount, plural, other {# fehlgeschlagen}}",
@@ -86,7 +86,7 @@
"library_scanning_description": "Regelmäßiges Durchsuchen der Bibliothek einstellen", "library_scanning_description": "Regelmäßiges Durchsuchen der Bibliothek einstellen",
"library_scanning_enable_description": "Regelmäßiges Scannen der Bibliothek aktivieren", "library_scanning_enable_description": "Regelmäßiges Scannen der Bibliothek aktivieren",
"library_settings": "Externe Bibliothek", "library_settings": "Externe Bibliothek",
"library_settings_description": "Verwaltung von Einstellungen externer Bibliotheken", "library_settings_description": "Einstellungen externer Bibliotheken verwalten",
"library_tasks_description": "Diese Aufgabe aktualisiert und überprüft die Bibliotheken", "library_tasks_description": "Diese Aufgabe aktualisiert und überprüft die Bibliotheken",
"library_watching_enable_description": "Überwache externe Bibliotheken auf Dateiänderungen", "library_watching_enable_description": "Überwache externe Bibliotheken auf Dateiänderungen",
"library_watching_settings": "Bibliotheksüberwachung (EXPERIMENTELL)", "library_watching_settings": "Bibliotheksüberwachung (EXPERIMENTELL)",
@@ -117,14 +117,14 @@
"machine_learning_min_recognized_faces": "Mindestens erkannte Gesichter", "machine_learning_min_recognized_faces": "Mindestens erkannte Gesichter",
"machine_learning_min_recognized_faces_description": "Die Mindestanzahl von erkannten Gesichtern, damit eine Person erstellt werden kann. Eine Erhöhung dieses Wertes macht die Gesichtserkennung präziser, erhöht aber die Wahrscheinlichkeit, dass ein Gesicht nicht zu einer Person zugeordnet werden kann.", "machine_learning_min_recognized_faces_description": "Die Mindestanzahl von erkannten Gesichtern, damit eine Person erstellt werden kann. Eine Erhöhung dieses Wertes macht die Gesichtserkennung präziser, erhöht aber die Wahrscheinlichkeit, dass ein Gesicht nicht zu einer Person zugeordnet werden kann.",
"machine_learning_settings": "Einstellungen für maschinelles Lernen", "machine_learning_settings": "Einstellungen für maschinelles Lernen",
"machine_learning_settings_description": "Verwaltung von Funktionen und Einstellungen für das maschinelle Lernen", "machine_learning_settings_description": "Funktionen und Einstellungen für das maschinelle Lernen verwalten",
"machine_learning_smart_search": "Intelligente Suche", "machine_learning_smart_search": "Intelligente Suche",
"machine_learning_smart_search_description": "Semantische Bildsuche mit CLIP-Einbettungen", "machine_learning_smart_search_description": "Semantische Bildsuche mit CLIP-Einbettungen",
"machine_learning_smart_search_enabled": "Intelligente Suche aktivieren", "machine_learning_smart_search_enabled": "Intelligente Suche aktivieren",
"machine_learning_smart_search_enabled_description": "Ist diese Option deaktiviert, werden die Bilder nicht für die intelligente Suche verwendet.", "machine_learning_smart_search_enabled_description": "Ist diese Option deaktiviert, werden die Bilder nicht für die intelligente Suche verwendet.",
"machine_learning_url_description": "Server-URL für maschinelles Lernen", "machine_learning_url_description": "Server-URL für maschinelles Lernen",
"manage_concurrency": "Gleichzeitige Ausführungen verwalten", "manage_concurrency": "Gleichzeitige Ausführungen verwalten",
"manage_log_settings": "Verwaltung der Immich Log-Einstellungen", "manage_log_settings": "Log-Einstellungen verwalten",
"map_dark_style": "Dunkler Stil", "map_dark_style": "Dunkler Stil",
"map_enable_description": "Kartenfunktionen aktivieren", "map_enable_description": "Kartenfunktionen aktivieren",
"map_gps_settings": "Karten & GPS Einstellungen", "map_gps_settings": "Karten & GPS Einstellungen",
@@ -136,7 +136,7 @@
"map_reverse_geocoding_enable_description": "Umgekehrte Geokodierung aktivieren", "map_reverse_geocoding_enable_description": "Umgekehrte Geokodierung aktivieren",
"map_reverse_geocoding_settings": "Einstellungen für Umgekehrte Geokodierung", "map_reverse_geocoding_settings": "Einstellungen für Umgekehrte Geokodierung",
"map_settings": "Karten", "map_settings": "Karten",
"map_settings_description": "Verwaltung der Karten- & GPS Einstellungen", "map_settings_description": "Karten- und GPS Einstellungen verwalten",
"map_style_description": "URL zu einem style.json Karten-Theme", "map_style_description": "URL zu einem style.json Karten-Theme",
"metadata_extraction_job": "Metadaten extrahieren", "metadata_extraction_job": "Metadaten extrahieren",
"metadata_extraction_job_description": "Extrahieren von Metadaten, wie zum Beispiel GPS und Auflösung aus jeder Datei", "metadata_extraction_job_description": "Extrahieren von Metadaten, wie zum Beispiel GPS und Auflösung aus jeder Datei",
@@ -162,7 +162,7 @@
"notification_email_username_description": "Benutzername, der bei der Anmeldung am E-Mail-Server verwendet wird", "notification_email_username_description": "Benutzername, der bei der Anmeldung am E-Mail-Server verwendet wird",
"notification_enable_email_notifications": "E-Mail-Benachrichtigungen aktivieren", "notification_enable_email_notifications": "E-Mail-Benachrichtigungen aktivieren",
"notification_settings": "Benachrichtigungseinstellungen", "notification_settings": "Benachrichtigungseinstellungen",
"notification_settings_description": "Verwaltung der Benachrichtigungseinstellungen (inkl. E-Mail)", "notification_settings_description": "Eenachrichtigungseinstellungen (inkl. E-Mail) verwalten",
"oauth_auto_launch": "Auto-Start", "oauth_auto_launch": "Auto-Start",
"oauth_auto_launch_description": "Automatischer Start des OAuth-Anmeldevorgangs beim Aufrufen der Anmeldeseite", "oauth_auto_launch_description": "Automatischer Start des OAuth-Anmeldevorgangs beim Aufrufen der Anmeldeseite",
"oauth_auto_register": "Automatische Registrierung", "oauth_auto_register": "Automatische Registrierung",
@@ -284,7 +284,7 @@
"transcoding_reference_frames_description": "Die Anzahl der Bilder, auf die bei der Komprimierung eines bestimmten Bildes Bezug genommen wird. Höhere Werte verbessern die Komprimierungseffizienz, verlangsamen aber die Kodierung. 0 setzt diesen Wert automatisch.", "transcoding_reference_frames_description": "Die Anzahl der Bilder, auf die bei der Komprimierung eines bestimmten Bildes Bezug genommen wird. Höhere Werte verbessern die Komprimierungseffizienz, verlangsamen aber die Kodierung. 0 setzt diesen Wert automatisch.",
"transcoding_required_description": "Nur Videos in einem nicht akzeptierten Format", "transcoding_required_description": "Nur Videos in einem nicht akzeptierten Format",
"transcoding_settings": "Video-Transkodierungseinstellungen", "transcoding_settings": "Video-Transkodierungseinstellungen",
"transcoding_settings_description": "Verwalten der Auflösungs- und Kodierungsinformationen von Videodateien", "transcoding_settings_description": "Auflösungs- und Kodierungsinformationen von Videodateien verwalten",
"transcoding_target_resolution": "Ziel-Auflösung", "transcoding_target_resolution": "Ziel-Auflösung",
"transcoding_target_resolution_description": "Höhere Auflösungen können mehr Details erhalten, benötigen aber mehr Zeit für die Codierung, haben größere Dateigrößen und können die Reaktionszeit der Anwendung beeinträchtigen.", "transcoding_target_resolution_description": "Höhere Auflösungen können mehr Details erhalten, benötigen aber mehr Zeit für die Codierung, haben größere Dateigrößen und können die Reaktionszeit der Anwendung beeinträchtigen.",
"transcoding_temporal_aq": "Temporäre AQ", "transcoding_temporal_aq": "Temporäre AQ",
@@ -530,7 +530,7 @@
"download_include_embedded_motion_videos": "Eingebettete Videos", "download_include_embedded_motion_videos": "Eingebettete Videos",
"download_include_embedded_motion_videos_description": "Videos, die in Bewegungsfotos eingebettet sind, als separate Datei einfügen", "download_include_embedded_motion_videos_description": "Videos, die in Bewegungsfotos eingebettet sind, als separate Datei einfügen",
"download_settings": "Download", "download_settings": "Download",
"download_settings_description": "Verwaltung der Einstellungen für den Dateidownload", "download_settings_description": "Einstellungen für den Dateidownload verwalten",
"downloading": "Downloaden", "downloading": "Downloaden",
"downloading_asset_filename": "Datei {filename} wird heruntergeladen", "downloading_asset_filename": "Datei {filename} wird heruntergeladen",
"drop_files_to_upload": "Lade Dateien hoch, indem du sie hierhin ziehst", "drop_files_to_upload": "Lade Dateien hoch, indem du sie hierhin ziehst",
@@ -716,7 +716,7 @@
"expired": "Verfallen", "expired": "Verfallen",
"expires_date": "Läuft am {date} ab", "expires_date": "Läuft am {date} ab",
"explore": "Erkunden", "explore": "Erkunden",
"explorer": "Entdeccker", "explorer": "Datei-Explorer",
"export": "Exportieren", "export": "Exportieren",
"export_as_json": "Als JSON exportieren", "export_as_json": "Als JSON exportieren",
"extension": "Erweiterung", "extension": "Erweiterung",
@@ -731,7 +731,7 @@
"feature_photo_updated": "Profilbild aktualisiert", "feature_photo_updated": "Profilbild aktualisiert",
"featurecollection": "Funktionssammlung", "featurecollection": "Funktionssammlung",
"features": "Funktionen", "features": "Funktionen",
"features_setting_description": "Verwalte die Funktionen der App", "features_setting_description": "Funktionen der App verwalten",
"file_name": "Dateiname", "file_name": "Dateiname",
"file_name_or_extension": "Dateiname oder -erweiterung", "file_name_or_extension": "Dateiname oder -erweiterung",
"filename": "Dateiname", "filename": "Dateiname",
@@ -862,10 +862,10 @@
"make": "Marke", "make": "Marke",
"manage_shared_links": "Freigegebene Links verwalten", "manage_shared_links": "Freigegebene Links verwalten",
"manage_sharing_with_partners": "Gemeinsame Nutzung mit Partnern verwalten", "manage_sharing_with_partners": "Gemeinsame Nutzung mit Partnern verwalten",
"manage_the_app_settings": "Verwalten der App-Einstellungen", "manage_the_app_settings": "App-Einstellungen verwalten",
"manage_your_account": "Dein Konto verwalten", "manage_your_account": "Dein Konto verwalten",
"manage_your_api_keys": "Deine API-Schlüssel verwalten", "manage_your_api_keys": "Deine API-Schlüssel verwalten",
"manage_your_devices": "Verwalte Deine eingeloggten Geräte", "manage_your_devices": "Deine eingeloggten Geräte verwalten",
"manage_your_oauth_connection": "Deine OAuth-Verbindung verwalten", "manage_your_oauth_connection": "Deine OAuth-Verbindung verwalten",
"map": "Karte", "map": "Karte",
"map_marker_for_images": "Kartemarkierung für Bilder, die in {city}, {country} aufgenommen wurden", "map_marker_for_images": "Kartemarkierung für Bilder, die in {city}, {country} aufgenommen wurden",
@@ -1244,6 +1244,7 @@
"tag_assets": "Dateien taggen", "tag_assets": "Dateien taggen",
"tag_created": "Tag erstellt: {tag}", "tag_created": "Tag erstellt: {tag}",
"tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen", "tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen",
"tag_not_found_question": "Kein Tag zu finden? Erstelle einen <link>hier</link>",
"tag_updated": "Tag aktualisiert: {tag}", "tag_updated": "Tag aktualisiert: {tag}",
"tagged_assets": "{count, plural, one {# Datei} other {# Dateien}} getagged", "tagged_assets": "{count, plural, one {# Datei} other {# Dateien}} getagged",
"tags": "Tags", "tags": "Tags",

View File

@@ -1191,7 +1191,7 @@
"to_change_password": "Change password", "to_change_password": "Change password",
"to_favorite": "Favorite", "to_favorite": "Favorite",
"to_login": "Login", "to_login": "Login",
"to_root": "To root", "to_parent": "Go to parent",
"to_trash": "Trash", "to_trash": "Trash",
"toggle_settings": "Toggle settings", "toggle_settings": "Toggle settings",
"toggle_theme": "Toggle dark theme", "toggle_theme": "Toggle dark theme",

View File

@@ -195,7 +195,7 @@
"password_settings_description": "Administrar la configuración de inicio de sesión con contraseña", "password_settings_description": "Administrar la configuración de inicio de sesión con contraseña",
"paths_validated_successfully": "Todas las carpetas se han validado satisfactoriamente", "paths_validated_successfully": "Todas las carpetas se han validado satisfactoriamente",
"quota_size_gib": "Tamaño de Quota (GiB)", "quota_size_gib": "Tamaño de Quota (GiB)",
"refreshing_all_libraries": "Recargando todas las bibliotecas", "refreshing_all_libraries": "Actualizar todas las bibliotecas",
"registration": "Registrar administrador", "registration": "Registrar administrador",
"registration_description": "Dado que eres el primer usuario del sistema, se te asignará como Admin y serás responsable de las tareas administrativas, y de crear a los usuarios adicionales.", "registration_description": "Dado que eres el primer usuario del sistema, se te asignará como Admin y serás responsable de las tareas administrativas, y de crear a los usuarios adicionales.",
"removing_offline_files": "Eliminando archivos sin conexión", "removing_offline_files": "Eliminando archivos sin conexión",
@@ -1060,7 +1060,7 @@
"reassing_hint": "Asignar archivos seleccionados a una persona existente", "reassing_hint": "Asignar archivos seleccionados a una persona existente",
"recent": "Reciente", "recent": "Reciente",
"recent_searches": "Búsquedas recientes", "recent_searches": "Búsquedas recientes",
"refresh": "Recargar", "refresh": "Actualizar",
"refresh_encoded_videos": "Recargar los vídeos codificados", "refresh_encoded_videos": "Recargar los vídeos codificados",
"refresh_metadata": "Recargar los metadatos", "refresh_metadata": "Recargar los metadatos",
"refresh_thumbnails": "Recargar miniaturas", "refresh_thumbnails": "Recargar miniaturas",
@@ -1244,6 +1244,7 @@
"tag_assets": "Etiquetar activos", "tag_assets": "Etiquetar activos",
"tag_created": "Etiqueta creada: {tag}", "tag_created": "Etiqueta creada: {tag}",
"tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas lógicas", "tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas lógicas",
"tag_not_found_question": "¿No encuentras una etiqueta? Crea una <link>aquí</link>",
"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",

View File

@@ -32,9 +32,9 @@
"authentication_settings_description": "Halda parooli, OAuth ja muid autentimise seadeid", "authentication_settings_description": "Halda parooli, OAuth ja muid autentimise seadeid",
"authentication_settings_disable_all": "Kas oled kindel, et soovid kõik sisselogimismeetodid välja lülitada? Sisselogimine lülitatakse täielikult välja.", "authentication_settings_disable_all": "Kas oled kindel, et soovid kõik sisselogimismeetodid välja lülitada? Sisselogimine lülitatakse täielikult välja.",
"authentication_settings_reenable": "Et taas lubada, kasuta <link>serveri käsku</link>.", "authentication_settings_reenable": "Et taas lubada, kasuta <link>serveri käsku</link>.",
"background_task_job": "Taustaülesanded", "background_task_job": "Tausttegumid",
"check_all": "Märgi kõik", "check_all": "Märgi kõik",
"cleared_jobs": "Ülesanded eemaldatud: {job}", "cleared_jobs": "Tööted eemaldatud: {job}",
"config_set_by_file": "Konfiguratsioon on määratud konfifaili abil", "config_set_by_file": "Konfiguratsioon on määratud konfifaili abil",
"confirm_delete_library": "Kas oled kindel, et soovid kustutada {library} kogu?", "confirm_delete_library": "Kas oled kindel, et soovid kustutada {library} kogu?",
"confirm_delete_library_assets": "Kas oled kindel, et soovid selle kogu kustutada? Sellega kustutatakse {count, plural, one {# sisalduv üksus} other {kõik # sisalduvat üksust}} Immich'ist ning seda ei saa tagasi võtta. Failid jäävad kettale alles.", "confirm_delete_library_assets": "Kas oled kindel, et soovid selle kogu kustutada? Sellega kustutatakse {count, plural, one {# sisalduv üksus} other {kõik # sisalduvat üksust}} Immich'ist ning seda ei saa tagasi võtta. Failid jäävad kettale alles.",
@@ -42,23 +42,34 @@
"confirm_reprocess_all_faces": "Kas oled kindel, et soovid kõik näod uuesti töödelda? See eemaldab kõik nimega isikud.", "confirm_reprocess_all_faces": "Kas oled kindel, et soovid kõik näod uuesti töödelda? See eemaldab kõik nimega isikud.",
"confirm_user_password_reset": "Kas oled kindel, et soovid kasutaja {user} parooli lähtestada?", "confirm_user_password_reset": "Kas oled kindel, et soovid kasutaja {user} parooli lähtestada?",
"disable_login": "Keela sisselogimine", "disable_login": "Keela sisselogimine",
"duplicate_detection_job_description": "Rakenda üksustele masinõpet, et tuvastada sarnaseid pilte. Kasutab nutiotsingut",
"exclusion_pattern_description": "Välistamismustrid võimaldavad ignoreerida faile ja kaustu kogu skaneerimisel. See on kasulik, kui sul on kaustu, mis sisaldavad faile, mida sa ei soovi importida, nagu RAW failid.", "exclusion_pattern_description": "Välistamismustrid võimaldavad ignoreerida faile ja kaustu kogu skaneerimisel. See on kasulik, kui sul on kaustu, mis sisaldavad faile, mida sa ei soovi importida, nagu RAW failid.",
"external_library_created_at": "Väline kogu (lisatud {date})", "external_library_created_at": "Väline kogu (lisatud {date})",
"external_library_management": "Väliste kogude haldus", "external_library_management": "Väliste kogude haldus",
"face_detection": "Näotuvastus", "face_detection": "Näotuvastus",
"face_detection_description": "Otsi üksustest nägusid masinõppe abil. Videote puhul kasutatakse ainult pisipilti. \"Kõik\" töötleb kõik üksused uuesti. \"Puuduvad\" võtab ette üksused, mida pole veel töödeldud. Leitud näod suunatakse näotuvastusse, et grupeerida nad olemasolevateks või uuteks isikuteks.", "face_detection_description": "Otsi üksustest nägusid masinõppe abil. Videote puhul kasutatakse ainult pisipilti. \"Kõik\" töötleb kõik üksused uuesti. \"Puuduvad\" võtab ette üksused, mida pole veel töödeldud. Leitud näod suunatakse näotuvastusse, et grupeerida nad olemasolevateks või uuteks isikuteks.",
"facial_recognition_job_description": "Grupeeri leitud näod inimesteks. See samm käivitub siis, kui näotuvastus on lõppenud. \"Kõik\" grupeerib kõik näod uuesti. \"Puuduvad\" võtab ette näod, mida pole isikuga seostatud.", "facial_recognition_job_description": "Grupeeri leitud näod inimesteks. See samm käivitub siis, kui näotuvastus on lõppenud. \"Kõik\" grupeerib kõik näod uuesti. \"Puuduvad\" võtab ette näod, mida pole isikuga seostatud.",
"failed_job_command": "Käsk {command} ebaõnnestus töötes: {job}",
"force_delete_user_warning": "HOIATUS: See kustutab koheselt kasutaja ja kõik üksused. Seda ei saa tagasi võtta ja faile ei saa taastada.", "force_delete_user_warning": "HOIATUS: See kustutab koheselt kasutaja ja kõik üksused. Seda ei saa tagasi võtta ja faile ei saa taastada.",
"forcing_refresh_library_files": "Kogu kõigi failide sundvärskendamine",
"image_format_description": "WebP failid on väiksemad kui JPEG, aga kodeerimine on aeglasem.", "image_format_description": "WebP failid on väiksemad kui JPEG, aga kodeerimine on aeglasem.",
"image_prefer_embedded_preview": "Eelista manustatud eelvaadet",
"image_prefer_embedded_preview_setting_description": "Kasuta pilditöötluse sisendina võimalusel RAW fotodesse manustatud eelvaateid. See võib mõnede piltide puhul anda tulemuseks täpsemad värvid, aga eelvaate kvaliteet sõltub konkreetsest kaamerast ning pildis võib olla rohkem tihendusmüra.", "image_prefer_embedded_preview_setting_description": "Kasuta pilditöötluse sisendina võimalusel RAW fotodesse manustatud eelvaateid. See võib mõnede piltide puhul anda tulemuseks täpsemad värvid, aga eelvaate kvaliteet sõltub konkreetsest kaamerast ning pildis võib olla rohkem tihendusmüra.",
"image_prefer_wide_gamut_setting_description": "Kasuta pisipiltide jaoks Display P3. See säilitab paremini laia värviruumiga piltide erksuse, aga vanematel seadmetel ja vanemate brauseritega võivad pildid teistsugused välja näha. sRGB pildid säilitatakse värvinihete vältimiseks.", "image_prefer_wide_gamut_setting_description": "Kasuta pisipiltide jaoks Display P3. See säilitab paremini laia värviruumiga piltide erksuse, aga vanematel seadmetel ja vanemate brauseritega võivad pildid teistsugused välja näha. sRGB pildid säilitatakse värvinihete vältimiseks.",
"image_preview_format": "Eelvaate formaat", "image_preview_format": "Eelvaate formaat",
"image_preview_resolution": "Eelvaate resolutsioon", "image_preview_resolution": "Eelvaate resolutsioon",
"image_preview_resolution_description": "Kasutusel üksiku foto vaatamisel ja masinõppe jaoks. Kõrgem resolutsioon säilitab rohkem detaile, aga kodeerimine võtab rohkem aega, tekitab suurema faili ning võib mõjutada rakenduse töökiirust.", "image_preview_resolution_description": "Kasutusel üksiku foto vaatamisel ja masinõppe jaoks. Kõrgem resolutsioon säilitab rohkem detaile, aga kodeerimine võtab rohkem aega, tekitab suurema faili ning võib mõjutada rakenduse töökiirust.",
"image_quality": "Kvaliteet",
"image_quality_description": "Pildikvaliteet vahemikus 1-100. Kõrgem väärtus tähendab paremat kvaliteeti ja suuremaid faile. See valik mõjutab eelvaateid ja pisipilte.", "image_quality_description": "Pildikvaliteet vahemikus 1-100. Kõrgem väärtus tähendab paremat kvaliteeti ja suuremaid faile. See valik mõjutab eelvaateid ja pisipilte.",
"image_settings": "Pildi seaded",
"image_settings_description": "Halda genereeritud piltide kvaliteeti ja resolutsiooni",
"image_thumbnail_format": "Pisipildi formaat", "image_thumbnail_format": "Pisipildi formaat",
"image_thumbnail_resolution": "Pisipildi resolutsioon", "image_thumbnail_resolution": "Pisipildi resolutsioon",
"image_thumbnail_resolution_description": "Kasutusel fotode mitmekaupa vaatamisel (ajajoon, albumi vaade, jne). Kõrgem resolutsioon säilitab rohkem detaile, aga kodeerimine võtab rohkem aega, tekitab suurema faili ning võib mõjutada rakenduse töökiirust.", "image_thumbnail_resolution_description": "Kasutusel fotode mitmekaupa vaatamisel (ajajoon, albumi vaade, jne). Kõrgem resolutsioon säilitab rohkem detaile, aga kodeerimine võtab rohkem aega, tekitab suurema faili ning võib mõjutada rakenduse töökiirust.",
"job_concurrency": "{job} samaaegsus",
"job_settings": "Tööte seaded",
"job_settings_description": "Halda töödete samaaegsust",
"job_status": "Tööte seisund",
"library_created": "Lisatud kogu: {library}", "library_created": "Lisatud kogu: {library}",
"library_cron_expression": "Cron avaldis", "library_cron_expression": "Cron avaldis",
"library_cron_expression_description": "Sea skaneerimise intervall cron formaadis. Rohkema info jaoks vaata nt. <link>Crontab Guru</link>", "library_cron_expression_description": "Sea skaneerimise intervall cron formaadis. Rohkema info jaoks vaata nt. <link>Crontab Guru</link>",
@@ -73,21 +84,44 @@
"library_watching_enable_description": "Jälgi välises kogus failide muudatusi", "library_watching_enable_description": "Jälgi välises kogus failide muudatusi",
"library_watching_settings": "Kogu jälgimine (EKSPERIMENTAALNE)", "library_watching_settings": "Kogu jälgimine (EKSPERIMENTAALNE)",
"library_watching_settings_description": "Jälgi automaatselt muutunud faile", "library_watching_settings_description": "Jälgi automaatselt muutunud faile",
"logging_enable_description": "Luba logimine",
"logging_level_description": "Kui lubatud, millist logimistaset kasutada.",
"logging_settings": "Logimine",
"machine_learning_clip_model": "CLIP mudel",
"machine_learning_clip_model_description": "CLIP mudeli nimi, mis on loetletud <link>siin</link>. Pane tähele, et mudeli muutmisel pead kõigi piltide peal nutiotsingu tööte uuesti käivitama.",
"machine_learning_duplicate_detection": "Duplikaatide tuvastus",
"machine_learning_duplicate_detection_enabled": "Luba duplikaatide tuvastus",
"machine_learning_duplicate_detection_enabled_description": "Kui keelatud, dedubleeritakse siiski täpselt identsed üksused.", "machine_learning_duplicate_detection_enabled_description": "Kui keelatud, dedubleeritakse siiski täpselt identsed üksused.",
"machine_learning_duplicate_detection_setting_description": "Kasuta CLIP-manuseid, et leida tõenäoliseid duplikaate",
"machine_learning_enabled": "Luba masinõpe",
"machine_learning_enabled_description": "Kui keelatud, lülitatakse kõik masinõppe funktsioonid välja, sõltumata allolevatest seadetest.",
"machine_learning_facial_recognition": "Näotuvastus",
"machine_learning_facial_recognition_description": "Otsi, tuvasta ja grupeeri piltidel näod", "machine_learning_facial_recognition_description": "Otsi, tuvasta ja grupeeri piltidel näod",
"machine_learning_facial_recognition_model_description": "Mudelid on järjestatud suuruse järgi kahanevalt. Suuremad mudelid on aeglasemad ja kasutavad rohkem mälu, kuid annavad parema tulemuse. Mudeli muutmisel tuleb kõik pildid uuesti näotuvastusest läbi lasta.", "machine_learning_facial_recognition_model": "Näotuvastuse mudel",
"machine_learning_facial_recognition_model_description": "Mudelid on järjestatud suuruse järgi kahanevalt. Suuremad mudelid on aeglasemad ja kasutavad rohkem mälu, kuid annavad parema tulemuse. Mudeli muutmisel tuleb näotuvastuse tööde kõigi piltide peal uuesti käivitada.",
"machine_learning_facial_recognition_setting": "Luba näotuvastus",
"machine_learning_max_detection_distance": "Maksimaalne tuvastuskaugus",
"machine_learning_max_detection_distance_description": "Maksimaalne kaugus kahe pildi vahel, mille puhul loetakse nad duplikaatideks, vahemikus 0.001-0.1. Kõrgemad väärtused tuvastavad rohkem duplikaate, aga võivad anda valepositiivseid.",
"machine_learning_max_recognition_distance_description": "Maksimaalne kaugus kahe näo vahel, mida tuleks lugeda samaks isikuks, vahemikus 0-2. Selle vähendamine aitab vältida erinevate inimeste samaks isikuks märkimist ja tõstmine aitab vältida sama inimese kaheks erinevaks isikuks märkimist. Pane tähele, et kaht isikut ühendada on lihtsam kui üht isikut kaheks eraldada, seega võimalusel kasuta madalamat lävendit.", "machine_learning_max_recognition_distance_description": "Maksimaalne kaugus kahe näo vahel, mida tuleks lugeda samaks isikuks, vahemikus 0-2. Selle vähendamine aitab vältida erinevate inimeste samaks isikuks märkimist ja tõstmine aitab vältida sama inimese kaheks erinevaks isikuks märkimist. Pane tähele, et kaht isikut ühendada on lihtsam kui üht isikut kaheks eraldada, seega võimalusel kasuta madalamat lävendit.",
"machine_learning_min_detection_score_description": "Minimaalne usaldusskoor näo tuvastamiseks, vahemikus 0-1. Madalamad väärtused leiavad rohkem nägusid, kuid võib esineda valepositiivseid.", "machine_learning_min_detection_score_description": "Minimaalne usaldusskoor näo tuvastamiseks, vahemikus 0-1. Madalamad väärtused leiavad rohkem nägusid, kuid võib esineda valepositiivseid.",
"machine_learning_min_recognized_faces": "Minimaalne leitud nägude arv", "machine_learning_min_recognized_faces": "Minimaalne leitud nägude arv",
"machine_learning_min_recognized_faces_description": "Minimaalne leitud nägude arv, mida saab isikuks grupeerida. Selle suurendamine teeb näotuvastuse täpsemaks, kuid suureneb tõenäosus, et nägu ei seostata ühegi isikuga.", "machine_learning_min_recognized_faces_description": "Minimaalne leitud nägude arv, mida saab isikuks grupeerida. Selle suurendamine teeb näotuvastuse täpsemaks, kuid suureneb tõenäosus, et nägu ei seostata ühegi isikuga.",
"machine_learning_settings": "Masinõppe seaded", "machine_learning_settings": "Masinõppe seaded",
"machine_learning_settings_description": "Halda masinõppe funktsioone ja seadeid",
"machine_learning_smart_search": "Nutiotsing",
"machine_learning_smart_search_description": "Otsi pilte semantiliselt CLIP-manuste abil",
"machine_learning_smart_search_enabled": "Luba nutiotsing",
"machine_learning_smart_search_enabled_description": "Kui keelatud, siis ei kodeerita pilte nutiotsingu jaoks.",
"machine_learning_url_description": "Masinõppe serveri URL", "machine_learning_url_description": "Masinõppe serveri URL",
"manage_log_settings": "Halda logi seadeid",
"map_dark_style": "Tume stiil", "map_dark_style": "Tume stiil",
"map_gps_settings": "Kaardi ja GPS-i seaded", "map_gps_settings": "Kaardi ja GPS-i seaded",
"map_light_style": "Hele stiil", "map_light_style": "Hele stiil",
"map_settings": "Kaart", "map_settings": "Kaart",
"map_settings_description": "Halda kaardi seadeid", "map_settings_description": "Halda kaardi seadeid",
"metadata_extraction_job": "Metaandmete eraldamine",
"metadata_extraction_job_description": "Eralda igast üksusest metaandmed, nagu GPS-koordinaadid ja resolutsioon", "metadata_extraction_job_description": "Eralda igast üksusest metaandmed, nagu GPS-koordinaadid ja resolutsioon",
"migration_job": "Migratsioon",
"migration_job_description": "Migreeri üksuste ja nägude pisipildid uusimale kaustastruktuurile", "migration_job_description": "Migreeri üksuste ja nägude pisipildid uusimale kaustastruktuurile",
"note_cannot_be_changed_later": "MÄRKUS: Seda ei saa hiljem muuta!", "note_cannot_be_changed_later": "MÄRKUS: Seda ei saa hiljem muuta!",
"notification_email_from_address": "Saatja aadress", "notification_email_from_address": "Saatja aadress",
@@ -98,19 +132,34 @@
"notification_email_password_description": "Parool e-posti serveriga autentimiseks", "notification_email_password_description": "Parool e-posti serveriga autentimiseks",
"notification_email_port_description": "E-posti serveri port (nt. 25, 465 või 587)", "notification_email_port_description": "E-posti serveri port (nt. 25, 465 või 587)",
"notification_email_sent_test_email_button": "Saada test e-kiri ja salvesta", "notification_email_sent_test_email_button": "Saada test e-kiri ja salvesta",
"notification_email_setting_description": "E-posti teel teavituste saatmise seaded",
"notification_email_test_email": "Saada test e-kiri", "notification_email_test_email": "Saada test e-kiri",
"notification_email_test_email_failed": "Test e-kirja saatmine ebaõnnestus, kontrolli seadistust",
"notification_email_test_email_sent": "Test e-kiri saadeti aadressile {email}. Kontrolli oma kirjakasti.", "notification_email_test_email_sent": "Test e-kiri saadeti aadressile {email}. Kontrolli oma kirjakasti.",
"notification_email_username_description": "Kasutajanimi e-posti serveriga autentimiseks", "notification_email_username_description": "Kasutajanimi e-posti serveriga autentimiseks",
"notification_enable_email_notifications": "Luba e-posti teel teavitused",
"notification_settings": "Teavituse seaded",
"notification_settings_description": "Halda teavituste seadeid, sh. e-posti teel",
"oauth_button_text": "Nupu tekst",
"oauth_client_id": "Kliendi ID",
"oauth_client_secret": "Kliendi saladus",
"oauth_enable_description": "Sisene OAuth abil", "oauth_enable_description": "Sisene OAuth abil",
"oauth_issuer_url": "Väljastaja URL",
"oauth_settings": "OAuth",
"oauth_settings_description": "Halda OAuth sisselogimise seadeid", "oauth_settings_description": "Halda OAuth sisselogimise seadeid",
"password_enable_description": "Logi sisse e-posti aadressi ja parooliga", "password_enable_description": "Logi sisse e-posti aadressi ja parooliga",
"password_settings": "Parooliga sisselogimine", "password_settings": "Parooliga sisselogimine",
"password_settings_description": "Halda parooliga sisselogimise seadeid", "password_settings_description": "Halda parooliga sisselogimise seadeid",
"paths_validated_successfully": "Kõik teed edukalt valideeritud",
"quota_size_gib": "Kvoot (GiB)", "quota_size_gib": "Kvoot (GiB)",
"refreshing_all_libraries": "Kõikide kogude värskendamine",
"registration_description": "Kuna sa oled süsteemis esimene kasutaja, määratakse sind administraatoriks, ning sa saad lisada täiendavaid kasutajaid.", "registration_description": "Kuna sa oled süsteemis esimene kasutaja, määratakse sind administraatoriks, ning sa saad lisada täiendavaid kasutajaid.",
"require_password_change_on_login": "Nõua kasutajalt esmakordsel sisenemisel parooli muutmist", "require_password_change_on_login": "Nõua kasutajalt esmakordsel sisenemisel parooli muutmist",
"reset_settings_to_default": "Lähtesta seaded", "reset_settings_to_default": "Lähtesta seaded",
"reset_settings_to_recent_saved": "Taasta hiljuti salvestatud seaded", "reset_settings_to_recent_saved": "Taasta hiljuti salvestatud seaded",
"scanning_library_for_changed_files": "Kogu muutunud failide skaneerimine",
"scanning_library_for_new_files": "Kogu uute failide skaneerimine",
"send_welcome_email": "Saada tervituskiri",
"server_external_domain_settings": "Väline domeen", "server_external_domain_settings": "Väline domeen",
"server_external_domain_settings_description": "Domeen avalikult jagatud linkide jaoks, k.a. http(s)://", "server_external_domain_settings_description": "Domeen avalikult jagatud linkide jaoks, k.a. http(s)://",
"server_settings": "Serveri seaded", "server_settings": "Serveri seaded",
@@ -118,11 +167,14 @@
"server_welcome_message": "Tervitusteade", "server_welcome_message": "Tervitusteade",
"server_welcome_message_description": "Teade, mida kuvatakse sisselogimise lehel.", "server_welcome_message_description": "Teade, mida kuvatakse sisselogimise lehel.",
"slideshow_duration_description": "Mitu sekundit igat pilti kuvada", "slideshow_duration_description": "Mitu sekundit igat pilti kuvada",
"smart_search_job_description": "Käivita üksuste peal masinõpe, et toetada nutiotsingut",
"storage_template_migration_info": "Malli muudatused rakenduvad ainult uutele üksustele. Et rakendada malli tagasiulatuvalt olemasolevatele üksustele, käivita <link>{job}</link>.",
"storage_template_settings_description": "Halda üleslaaditud üksuse kaustastruktuuri ja failinime", "storage_template_settings_description": "Halda üleslaaditud üksuse kaustastruktuuri ja failinime",
"system_settings": "Süsteemi seaded", "system_settings": "Süsteemi seaded",
"theme_settings_description": "Halda Immich'i veebiliidese kohandamist", "theme_settings_description": "Halda Immich'i veebiliidese kohandamist",
"thumbnail_generation_job": "Genereeri pisipildid", "thumbnail_generation_job": "Genereeri pisipildid",
"thumbnail_generation_job_description": "Genereeri iga üksuse kohta suur, väike ja udustatud pisipilt ning iga isiku kohta pisipilt", "thumbnail_generation_job_description": "Genereeri iga üksuse kohta suur, väike ja udustatud pisipilt ning iga isiku kohta pisipilt",
"transcoding_acceleration_api_description": "API, mis suhtleb su seadmega transkodeerimise kiirendamiseks. See seadistus on 'anname parima': ebaõnnestumisel kasutatakse tarkvaralist transkodeerimist. VP9 ei pruugi töötada, sõltuvalt riistvarast.",
"transcoding_acceleration_nvenc": "NVENC (vajab NVIDIA GPU-d)", "transcoding_acceleration_nvenc": "NVENC (vajab NVIDIA GPU-d)",
"transcoding_acceleration_qsv": "Quick Sync (vajab Inteli 7. põlvkonna või uuemat CPU-d)", "transcoding_acceleration_qsv": "Quick Sync (vajab Inteli 7. põlvkonna või uuemat CPU-d)",
"transcoding_acceleration_rkmpp": "RKMPP (ainult Rockchip SOC-d)", "transcoding_acceleration_rkmpp": "RKMPP (ainult Rockchip SOC-d)",
@@ -178,6 +230,7 @@
"trash_number_of_days": "Päevade arv", "trash_number_of_days": "Päevade arv",
"trash_number_of_days_description": "Päevade arv, kui kaua hoida üksusi prügikastis enne nende lõplikku kustutamist", "trash_number_of_days_description": "Päevade arv, kui kaua hoida üksusi prügikastis enne nende lõplikku kustutamist",
"user_delete_delay": "Kasutaja <b>{user}</b> konto ja üksuste lõplik kustutamine on planeeritud {delay, plural, one {# päeva} other {# päeva}} pärast.", "user_delete_delay": "Kasutaja <b>{user}</b> konto ja üksuste lõplik kustutamine on planeeritud {delay, plural, one {# päeva} other {# päeva}} pärast.",
"user_delete_delay_settings_description": "Päevade arv, pärast mida kustutatakse eemaldatud kasutaja konto ja üksused jäädavalt. Kasutajate kustutamise tööde käivitub keskööl, et otsida kustutamiseks valmis kasutajaid. Selle seadistuse muudatused rakenduvad järgmisel käivitumisel.",
"user_delete_immediately": "Kasutaja <b>{user}</b> konto ja üksused suunatakse <b>koheselt</b> jäädavale kustutamisele.", "user_delete_immediately": "Kasutaja <b>{user}</b> konto ja üksused suunatakse <b>koheselt</b> jäädavale kustutamisele.",
"user_delete_immediately_checkbox": "Suuna kasutaja ja üksused jäädavale kustutamisele", "user_delete_immediately_checkbox": "Suuna kasutaja ja üksused jäädavale kustutamisele",
"user_password_has_been_reset": "Kasutaja parool on lähtestatud:", "user_password_has_been_reset": "Kasutaja parool on lähtestatud:",
@@ -209,10 +262,13 @@
"album_remove_user": "Eemalda kasutaja?", "album_remove_user": "Eemalda kasutaja?",
"album_remove_user_confirmation": "Kas oled kindel, et soovid kasutaja {user} eemaldada?", "album_remove_user_confirmation": "Kas oled kindel, et soovid kasutaja {user} eemaldada?",
"album_updated": "Album muudetud", "album_updated": "Album muudetud",
"album_updated_setting_description": "Saa e-posti teel teavitus, kui jagatud albumis on uusi üksuseid", "album_updated_setting_description": "Saa teavitus e-posti teel, kui jagatud albumis on uusi üksuseid",
"album_with_link_access": "Luba kõigil, kellel on link, näha selle albumi fotosid ja isikuid.",
"albums": "Albumid", "albums": "Albumid",
"albums_count": "{count, plural, one {{count, number} album} other {{count, number} albumit}}", "albums_count": "{count, plural, one {{count, number} album} other {{count, number} albumit}}",
"all": "Kõik",
"all_albums": "Kõik albumid", "all_albums": "Kõik albumid",
"all_people": "Kõik isikud",
"all_videos": "Kõik videod", "all_videos": "Kõik videod",
"api_key_description": "Seda väärtust kuvatakse ainult üks kord. Kopeeri see enne akna sulgemist.", "api_key_description": "Seda väärtust kuvatakse ainult üks kord. Kopeeri see enne akna sulgemist.",
"archive": "Arhiiv", "archive": "Arhiiv",
@@ -244,8 +300,10 @@
"assets_trashed_count": "{count, plural, one {# üksus} other {# üksust}} kustutatud", "assets_trashed_count": "{count, plural, one {# üksus} other {# üksust}} kustutatud",
"assets_were_part_of_album_count": "{count, plural, one {Üksus oli} other {Üksused olid}} juba osa albumist", "assets_were_part_of_album_count": "{count, plural, one {Üksus oli} other {Üksused olid}} juba osa albumist",
"authorized_devices": "Autoriseeritud seadmed", "authorized_devices": "Autoriseeritud seadmed",
"back": "Tagasi",
"birthdate_saved": "Sünnikuupäev salvestatud", "birthdate_saved": "Sünnikuupäev salvestatud",
"birthdate_set_description": "Sünnikuupäeva kasutatakse isiku vanuse arvutamiseks foto tegemise hetkel.", "birthdate_set_description": "Sünnikuupäeva kasutatakse isiku vanuse arvutamiseks foto tegemise hetkel.",
"blurred_background": "Udustatud taust",
"bulk_delete_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud üksuse} other {# dubleeritud üksust}} masskustutada? Sellega jäetakse alles iga grupi suurim üksus ning duplikaadid kustutatakse jäädavalt. Seda tegevust ei saa tagasi võtta!", "bulk_delete_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud üksuse} other {# dubleeritud üksust}} masskustutada? Sellega jäetakse alles iga grupi suurim üksus ning duplikaadid kustutatakse jäädavalt. Seda tegevust ei saa tagasi võtta!",
"bulk_keep_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud üksuse} other {# dubleeritud üksust}} alles jätta? Sellega märgitakse kõik duplikaadigrupid lahendatuks ilma midagi kustutamata.", "bulk_keep_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud üksuse} other {# dubleeritud üksust}} alles jätta? Sellega märgitakse kõik duplikaadigrupid lahendatuks ilma midagi kustutamata.",
"bulk_trash_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud üksuse} other {# dubleeritud üksust}} masskustutada? Sellega jäetakse alles iga grupi suurim üksus ning duplikaadid liigutatakse prügikasti.", "bulk_trash_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud üksuse} other {# dubleeritud üksust}} masskustutada? Sellega jäetakse alles iga grupi suurim üksus ning duplikaadid liigutatakse prügikasti.",
@@ -253,12 +311,16 @@
"camera_brand": "Kaamera mark", "camera_brand": "Kaamera mark",
"camera_model": "Kaamera mudel", "camera_model": "Kaamera mudel",
"cancel": "Katkesta", "cancel": "Katkesta",
"cannot_merge_people": "Ei saa isikuid ühendada",
"cannot_undo_this_action": "Sa ei saa seda tagasi võtta!", "cannot_undo_this_action": "Sa ei saa seda tagasi võtta!",
"cannot_update_the_description": "Kirjelduse muutmine ebaõnnestus",
"change_password": "Parooli muutmine", "change_password": "Parooli muutmine",
"change_password_description": "See on su esimene kord süsteemi siseneda, või on tehtud taotlus parooli muutmiseks. Palun sisesta allpool uus parool.", "change_password_description": "See on su esimene kord süsteemi siseneda, või on tehtud taotlus parooli muutmiseks. Palun sisesta allpool uus parool.",
"change_your_password": "Muuda oma parooli", "change_your_password": "Muuda oma parooli",
"changed_visibility_successfully": "Nähtavus muudetud", "changed_visibility_successfully": "Nähtavus muudetud",
"check_all": "Märgi kõik", "check_all": "Märgi kõik",
"check_logs": "Vaata logisid",
"choose_matching_people_to_merge": "Vali kattuvad isikud, mida ühendada",
"city": "Linn", "city": "Linn",
"clockwise": "Päripäeva", "clockwise": "Päripäeva",
"close": "Sulge", "close": "Sulge",
@@ -283,20 +345,36 @@
"copy_password": "Kopeeri parool", "copy_password": "Kopeeri parool",
"copy_to_clipboard": "Kopeeri lõikelauale", "copy_to_clipboard": "Kopeeri lõikelauale",
"country": "Riik", "country": "Riik",
"covers": "Kaanepildid",
"create": "Lisa",
"create_album": "Lisa album", "create_album": "Lisa album",
"create_library": "Lisa kogu", "create_library": "Lisa kogu",
"create_link": "Lisa link",
"create_link_to_share": "Lisa jagamiseks link",
"create_new_person": "Lisa uus isik",
"create_new_person_hint": "Seosta valitud üksused uue isikuga", "create_new_person_hint": "Seosta valitud üksused uue isikuga",
"create_new_user": "Lisa uus kasutaja",
"create_tag": "Lisa silt", "create_tag": "Lisa silt",
"create_tag_description": "Lisa uus silt. Pesastatud siltide jaoks sisesta täielik tee koos kaldkriipsudega.",
"create_user": "Lisa kasutaja",
"created": "Lisatud",
"current_device": "Praegune seade", "current_device": "Praegune seade",
"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",
"dark": "Tume",
"date_after": "Kuupäev pärast",
"date_and_time": "Kuupäev ja kellaaeg",
"date_before": "Kuupäev enne",
"date_of_birth_saved": "Sünnikuupäev salvestatud", "date_of_birth_saved": "Sünnikuupäev salvestatud",
"date_range": "Kuupäevavahemik",
"day": "Päev", "day": "Päev",
"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_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_duplicates_confirmation": "Kas oled kindel, et soovid need duplikaadid jäädavalt kustutada?", "delete_duplicates_confirmation": "Kas oled kindel, et soovid need duplikaadid jäädavalt kustutada?",
"delete_key": "Kustuta võti",
"delete_library": "Kustuta kogu", "delete_library": "Kustuta kogu",
"delete_link": "Kustuta link", "delete_link": "Kustuta link",
"delete_shared_link": "Kustuta jagatud link", "delete_shared_link": "Kustuta jagatud link",
@@ -306,12 +384,17 @@
"deleted_shared_link": "Jagatud link kustutatud", "deleted_shared_link": "Jagatud link kustutatud",
"description": "Kirjeldus", "description": "Kirjeldus",
"direction": "Suund", "direction": "Suund",
"discover": "Avasta",
"display_options": "Kuva valikud",
"display_original_photos_setting_description": "Eelista üksuse vaatamisel pisipildile algset fotot, kui see on veebiga ühilduv. See võib mõjutada fotode kuvamise kiirust.", "display_original_photos_setting_description": "Eelista üksuse vaatamisel pisipildile algset fotot, kui see on veebiga ühilduv. See võib mõjutada fotode kuvamise kiirust.",
"do_not_show_again": "Ära näita enam seda teadet",
"done": "Tehtud", "done": "Tehtud",
"download": "Laadi alla", "download": "Laadi alla",
"download_settings": "Allalaadimine", "download_settings": "Allalaadimine",
"download_settings_description": "Halda üksuste allalaadimise seadeid", "download_settings_description": "Halda üksuste allalaadimise seadeid",
"downloading": "Allalaadimine",
"downloading_asset_filename": "Üksuse {filename} allalaadimine", "downloading_asset_filename": "Üksuse {filename} allalaadimine",
"drop_files_to_upload": "Failide üleslaadimiseks sikuta need ükskõik kuhu",
"duplicates": "Duplikaadid", "duplicates": "Duplikaadid",
"duplicates_description": "Lahenda iga grupp, valides duplikaadid, kui neid on", "duplicates_description": "Lahenda iga grupp, valides duplikaadid, kui neid on",
"duration": "Kestus", "duration": "Kestus",
@@ -358,11 +441,14 @@
"error_removing_assets_from_album": "Viga üksuste albumist eemaldamisel, rohkem infot leiad konsoolilt", "error_removing_assets_from_album": "Viga üksuste albumist eemaldamisel, rohkem infot leiad konsoolilt",
"error_selecting_all_assets": "Viga kõigi üksuste valimisel", "error_selecting_all_assets": "Viga kõigi üksuste valimisel",
"exclusion_pattern_already_exists": "See välistamismuster on juba olemas.", "exclusion_pattern_already_exists": "See välistamismuster on juba olemas.",
"failed_job_command": "Käsk {command} ebaõnnestus töötes: {job}",
"failed_to_create_album": "Albumi lisamine ebaõnnestus", "failed_to_create_album": "Albumi lisamine ebaõnnestus",
"failed_to_create_shared_link": "Jagatud lingi lisamine ebaõnnestus", "failed_to_create_shared_link": "Jagatud lingi lisamine ebaõnnestus",
"failed_to_edit_shared_link": "Jagatud lingi muutmine ebaõnnestus", "failed_to_edit_shared_link": "Jagatud lingi muutmine ebaõnnestus",
"failed_to_get_people": "Isikute pärimine ebaõnnestus",
"failed_to_load_asset": "Üksuse laadimine ebaõnnestus", "failed_to_load_asset": "Üksuse laadimine ebaõnnestus",
"failed_to_load_assets": "Üksuste laadimine ebaõnnestus", "failed_to_load_assets": "Üksuste laadimine ebaõnnestus",
"failed_to_load_people": "Isikute laadimine ebaõnnestus",
"failed_to_remove_product_key": "Tootevõtme eemaldamine ebaõnnestus", "failed_to_remove_product_key": "Tootevõtme eemaldamine ebaõnnestus",
"failed_to_stack_assets": "Üksuste virnastamine ebaõnnestus", "failed_to_stack_assets": "Üksuste virnastamine ebaõnnestus",
"import_path_already_exists": "See imporditee on juba olemas.", "import_path_already_exists": "See imporditee on juba olemas.",
@@ -460,7 +546,10 @@
"file_name_or_extension": "Failinimi või -laiend", "file_name_or_extension": "Failinimi või -laiend",
"filename": "Failinimi", "filename": "Failinimi",
"filetype": "Failitüüp", "filetype": "Failitüüp",
"filter_people": "Filtreeri isikuid",
"folders": "Kaustad", "folders": "Kaustad",
"folders_feature_description": "Kaustavaate abil failisüsteemis olevate fotode ja videote sirvimine",
"force_re-scan_library_files": "Sundskaneeri kogu kõik failid uuesti",
"forward": "Edasi", "forward": "Edasi",
"general": "Üldine", "general": "Üldine",
"go_back": "Tagasi", "go_back": "Tagasi",
@@ -496,6 +585,7 @@
}, },
"invite_people": "Kutsu inimesi", "invite_people": "Kutsu inimesi",
"invite_to_album": "Kutsu albumisse", "invite_to_album": "Kutsu albumisse",
"jobs": "Tööted",
"keep": "Jäta alles", "keep": "Jäta alles",
"keep_all": "Jäta kõik alles", "keep_all": "Jäta kõik alles",
"keyboard_shortcuts": "Kiirklahvid", "keyboard_shortcuts": "Kiirklahvid",
@@ -507,6 +597,7 @@
"leave": "Lahku", "leave": "Lahku",
"library": "Kogu", "library": "Kogu",
"library_options": "Kogu seaded", "library_options": "Kogu seaded",
"list": "Loend",
"loading_search_results_failed": "Otsitulemuste laadimine ebaõnnestus", "loading_search_results_failed": "Otsitulemuste laadimine ebaõnnestus",
"log_out": "Logi välja", "log_out": "Logi välja",
"log_out_all_devices": "Logi kõigist seadmetest välja", "log_out_all_devices": "Logi kõigist seadmetest välja",
@@ -544,7 +635,7 @@
"new_api_key": "Uus API võti", "new_api_key": "Uus API võti",
"new_password": "Uus parool", "new_password": "Uus parool",
"new_person": "Uus isik", "new_person": "Uus isik",
"new_user_created": "Uus isik lisatud", "new_user_created": "Uus kasutaja lisatud",
"new_version_available": "UUS VERSIOON SAADAVAL", "new_version_available": "UUS VERSIOON SAADAVAL",
"newest_first": "Uuemad eespool", "newest_first": "Uuemad eespool",
"next": "Järgmine", "next": "Järgmine",
@@ -557,6 +648,8 @@
"no_exif_info_available": "Exif info pole saadaval", "no_exif_info_available": "Exif info pole saadaval",
"no_favorites_message": "Lisa lemmikud, et oma parimaid fotosid ja videosid kiiresti leida", "no_favorites_message": "Lisa lemmikud, et oma parimaid fotosid ja videosid kiiresti leida",
"no_libraries_message": "Lisa väline kogu oma fotode ja videote vaatamiseks", "no_libraries_message": "Lisa väline kogu oma fotode ja videote vaatamiseks",
"no_shared_albums_message": "Lisa album, et fotosid ja videosid teistega jagada",
"notification_toggle_setting_description": "Luba e-posti teel teavitused",
"notifications": "Teavitused", "notifications": "Teavitused",
"notifications_setting_description": "Halda teavitusi", "notifications_setting_description": "Halda teavitusi",
"oauth": "OAuth", "oauth": "OAuth",
@@ -564,6 +657,7 @@
"onboarding_theme_description": "Vali oma serverile värviteema. Saad seda hiljem seadetes muuta.", "onboarding_theme_description": "Vali oma serverile värviteema. Saad seda hiljem seadetes muuta.",
"onboarding_welcome_user": "Tere tulemast, {user}", "onboarding_welcome_user": "Tere tulemast, {user}",
"only_favorites": "Ainult lemmikud", "only_favorites": "Ainult lemmikud",
"only_refreshes_modified_files": "Värskendab ainult muudetud failid",
"open_in_map_view": "Ava kaardi vaates", "open_in_map_view": "Ava kaardi vaates",
"open_in_openstreetmap": "Ava OpenStreetMap", "open_in_openstreetmap": "Ava OpenStreetMap",
"options": "Valikud", "options": "Valikud",
@@ -571,6 +665,7 @@
"organize_your_library": "Korrasta oma kogu", "organize_your_library": "Korrasta oma kogu",
"original": "originaal", "original": "originaal",
"other_devices": "Muud seadmed", "other_devices": "Muud seadmed",
"owned": "Minu omad",
"owner": "Omanik", "owner": "Omanik",
"partner": "Partner", "partner": "Partner",
"partner_can_access": "{partner} pääseb ligi", "partner_can_access": "{partner} pääseb ligi",
@@ -587,8 +682,14 @@
"hours": "{hours, plural, one {Viimane tund} other {Viimased # tundi}}", "hours": "{hours, plural, one {Viimane tund} other {Viimased # tundi}}",
"years": "{years, plural, one {Viimane aasta} other {Viimased # aastat}}" "years": "{years, plural, one {Viimane aasta} other {Viimased # aastat}}"
}, },
"path": "Tee",
"pattern": "Muster",
"pause_memories": "Peata mälestused",
"paused": "Peatatud",
"pending": "Ootel",
"people": "Isikud", "people": "Isikud",
"people_edits_count": "{count, plural, one {# isik} other {# isikut}} muudetud", "people_edits_count": "{count, plural, one {# isik} other {# isikut}} muudetud",
"people_feature_description": "Fotode ja videote sirvimine inimeste kaupa grupeeritult",
"people_sidebar_description": "Kuva külgmenüüs Isikute link", "people_sidebar_description": "Kuva külgmenüüs Isikute link",
"permanent_deletion_warning": "Jäädavalt kustutamise hoiatus", "permanent_deletion_warning": "Jäädavalt kustutamise hoiatus",
"permanent_deletion_warning_setting_description": "Kuva hoiatust üksuste jäädaval kustutamisel", "permanent_deletion_warning_setting_description": "Kuva hoiatust üksuste jäädaval kustutamisel",
@@ -605,6 +706,8 @@
"pick_a_location": "Vali asukoht", "pick_a_location": "Vali asukoht",
"place": "Asukoht", "place": "Asukoht",
"places": "Kohad", "places": "Kohad",
"play_memories": "Esita mälestused",
"play_or_pause_video": "Esita või peata video",
"port": "Port", "port": "Port",
"preset": "Eelseadistus", "preset": "Eelseadistus",
"preview": "Eelvaade", "preview": "Eelvaade",
@@ -633,6 +736,7 @@
"purchase_license_subtitle": "Osta Immich, et toetada selle jätkuvat arendust", "purchase_license_subtitle": "Osta Immich, et toetada selle jätkuvat arendust",
"purchase_lifetime_description": "Eluaegne ost", "purchase_lifetime_description": "Eluaegne ost",
"purchase_option_title": "OSTMISE VALIKUD", "purchase_option_title": "OSTMISE VALIKUD",
"purchase_panel_info_1": "Immich'i arendamine nõuab palju aega ja vaeva ning meie täiskohaga insenerid töötavad selle nimel, et teha see nii heaks kui vähegi võimalik. Meie missiooniks on muuta avatud lähtekoodiga tarkvara ja eetilised äritavad arendajatele jätkusuutlikuks sissetulekuallikaks ning luua privaatsust austav ökosüsteem, mis pakub tõelisi alternatiive ekspluatatiivsetele pilveteenustele.",
"purchase_panel_info_2": "Kuna oleme otsustanud maksumüüre mitte lisada, ei anna see ost sulle Immich'is lisavõimalusi. Me loodame Immich'i jätkuvaks arenduseks sinusuguste kasutajate toetusele.", "purchase_panel_info_2": "Kuna oleme otsustanud maksumüüre mitte lisada, ei anna see ost sulle Immich'is lisavõimalusi. Me loodame Immich'i jätkuvaks arenduseks sinusuguste kasutajate toetusele.",
"purchase_panel_title": "Toeta projekti", "purchase_panel_title": "Toeta projekti",
"purchase_remove_product_key": "Eemalda tootevõti", "purchase_remove_product_key": "Eemalda tootevõti",
@@ -643,6 +747,7 @@
"purchase_server_description_2": "Toetaja staatus", "purchase_server_description_2": "Toetaja staatus",
"purchase_server_title": "Server", "purchase_server_title": "Server",
"purchase_settings_server_activated": "Serveri tootevõtit haldab administraator", "purchase_settings_server_activated": "Serveri tootevõtit haldab administraator",
"read_changelog": "Vaata muudatuste ülevaadet",
"reassigned_assets_to_existing_person": "{count, plural, one {# üksus} other {# üksust}} seostatud {name, select, null {olemasoleva isikuga} other {isikuga {name}}}", "reassigned_assets_to_existing_person": "{count, plural, one {# üksus} other {# üksust}} seostatud {name, select, null {olemasoleva isikuga} other {isikuga {name}}}",
"reassigned_assets_to_new_person": "{count, plural, one {# üksus} other {# üksust}} seostatud uue isikuga", "reassigned_assets_to_new_person": "{count, plural, one {# üksus} other {# üksust}} seostatud uue isikuga",
"reassing_hint": "Seosta valitud üksused olemasoleva isikuga", "reassing_hint": "Seosta valitud üksused olemasoleva isikuga",
@@ -651,7 +756,9 @@
"refresh_metadata": "Värskenda metaandmed", "refresh_metadata": "Värskenda metaandmed",
"refresh_thumbnails": "Värskenda pisipildid", "refresh_thumbnails": "Värskenda pisipildid",
"refreshed": "Värskendatud", "refreshed": "Värskendatud",
"refreshes_every_file": "Värskendab kõik failid",
"refreshing_encoded_video": "Kodeeritud videote värskendamine", "refreshing_encoded_video": "Kodeeritud videote värskendamine",
"refreshing_metadata": "Metaandmete värskendamine",
"regenerating_thumbnails": "Pisipiltide uuesti genereerimine", "regenerating_thumbnails": "Pisipiltide uuesti genereerimine",
"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?",
@@ -662,12 +769,16 @@
"remove_user": "Eemalda kasutaja", "remove_user": "Eemalda kasutaja",
"removed_api_key": "API võti eemaldatud: {name}", "removed_api_key": "API võti eemaldatud: {name}",
"removed_from_archive": "Arhiivist eemaldatud", "removed_from_archive": "Arhiivist eemaldatud",
"removed_from_favorites": "Lemmikutest eemaldatud",
"removed_tagged_assets": "Silt eemaldatud {count, plural, one {# üksuselt} other {# üksuselt}}", "removed_tagged_assets": "Silt eemaldatud {count, plural, one {# üksuselt} other {# üksuselt}}",
"require_password": "Nõua parooli", "require_password": "Nõua parooli",
"require_user_to_change_password_on_first_login": "Nõua kasutajalt esmakordsel sisenemisel parooli muutmist", "require_user_to_change_password_on_first_login": "Nõua kasutajalt esmakordsel sisenemisel parooli muutmist",
"reset": "Lähtesta", "reset": "Lähtesta",
"reset_password": "Lähtesta parool", "reset_password": "Lähtesta parool",
"reset_people_visibility": "Lähtesta isikute nähtavus",
"reset_to_default": "Lähtesta", "reset_to_default": "Lähtesta",
"resolve_duplicates": "Lahenda duplikaadid",
"resolved_all_duplicates": "Kõik duplikaadid lahendatud",
"restore": "Taasta", "restore": "Taasta",
"restore_all": "Taasta kõik", "restore_all": "Taasta kõik",
"restore_user": "Taasta kasutaja", "restore_user": "Taasta kasutaja",
@@ -679,31 +790,54 @@
"saved_profile": "Profiil salvestatud", "saved_profile": "Profiil salvestatud",
"saved_settings": "Seaded salvestatud", "saved_settings": "Seaded salvestatud",
"say_something": "Ütle midagi", "say_something": "Ütle midagi",
"scan_all_libraries": "Skaneeri kõik kogud",
"scan_all_library_files": "Skaneeri kogu kõik failid uuesti",
"scan_new_library_files": "Skaneeri kogu uued failid",
"scan_settings": "Skaneerimise seaded",
"search": "Otsi", "search": "Otsi",
"search_albums": "Otsi albumeid",
"search_by_context": "Otsi konteksti alusel",
"search_by_filename": "Otsi failinime või -laiendi järgi", "search_by_filename": "Otsi failinime või -laiendi järgi",
"search_by_filename_example": "st. IMG_1234.JPG või PNG", "search_by_filename_example": "st. IMG_1234.JPG või PNG",
"search_camera_make": "Otsi kaamera marki...", "search_camera_make": "Otsi kaamera marki...",
"search_camera_model": "Otsi kaamera mudelit...", "search_camera_model": "Otsi kaamera mudelit...",
"search_city": "Otsi linna...", "search_city": "Otsi linna...",
"search_country": "Otsi riiki...", "search_country": "Otsi riiki...",
"search_for_existing_person": "Otsi olemasolevat isikut",
"search_no_people": "Isikuid ei ole",
"search_no_people_named": "Ei ole isikuid nimega \"{name}\"",
"search_people": "Otsi inimesi",
"search_places": "Otsi kohti",
"search_state": "Otsi osariiki...", "search_state": "Otsi osariiki...",
"search_tags": "Otsi silte...", "search_tags": "Otsi silte...",
"search_timezone": "Otsi ajavööndit...", "search_timezone": "Otsi ajavööndit...",
"search_type": "Otsingu tüüp",
"search_your_photos": "Otsi oma fotosid", "search_your_photos": "Otsi oma fotosid",
"second": "Sekund", "second": "Sekund",
"see_all_people": "Vaata kõiki isikuid",
"select_album_cover": "Vali albumi kaanepilt", "select_album_cover": "Vali albumi kaanepilt",
"select_all": "Vali kõik", "select_all": "Vali kõik",
"select_all_duplicates": "Vali kõik duplikaadid", "select_all_duplicates": "Vali kõik duplikaadid",
"select_avatar_color": "Vali avatari värv", "select_avatar_color": "Vali avatari värv",
"select_face": "Vali nägu", "select_face": "Vali nägu",
"select_featured_photo": "Vali esiletõstetud foto", "select_featured_photo": "Vali esiletõstetud foto",
"select_from_computer": "Vali arvutist",
"select_library_owner": "Vali kogu omanik", "select_library_owner": "Vali kogu omanik",
"select_new_face": "Vali uus nägu", "select_new_face": "Vali uus nägu",
"select_photos": "Vali fotod", "select_photos": "Vali fotod",
"selected": "Valitud",
"selected_count": "{count, plural, other {# valitud}}",
"send_message": "Saada sõnum",
"send_welcome_email": "Saada tervituskiri",
"server_stats": "Serveri statistika", "server_stats": "Serveri statistika",
"server_version": "Serveri versioon", "server_version": "Serveri versioon",
"set_as_album_cover": "Sea albumi kaanepildiks", "set_as_album_cover": "Sea albumi kaanepildiks",
"set_as_profile_picture": "Sea profiilipildiks",
"settings": "Seaded",
"settings_saved": "Seaded salvestatud",
"share": "Jaga",
"shared": "Jagatud", "shared": "Jagatud",
"shared_by": "Jagas",
"shared_by_user": "Jagas {user}", "shared_by_user": "Jagas {user}",
"shared_by_you": "Jagasid sina", "shared_by_you": "Jagasid sina",
"shared_from_partner": "Fotod partnerilt {partner}", "shared_from_partner": "Fotod partnerilt {partner}",
@@ -711,44 +845,93 @@
"shared_links": "Jagatud lingid", "shared_links": "Jagatud lingid",
"shared_photos_and_videos_count": "{assetCount, plural, other {# jagatud fotot ja videot.}}", "shared_photos_and_videos_count": "{assetCount, plural, other {# jagatud fotot ja videot.}}",
"shared_with_partner": "Jagatud partneriga {partner}", "shared_with_partner": "Jagatud partneriga {partner}",
"sharing": "Jagamine",
"sharing_enter_password": "Palun sisesta selle lehe vaatamiseks salasõna.", "sharing_enter_password": "Palun sisesta selle lehe vaatamiseks salasõna.",
"sharing_sidebar_description": "Kuva külgmenüüs Jagamise linki",
"shift_to_permanent_delete": "vajuta ⇧, et üksus jäädavalt kustutada", "shift_to_permanent_delete": "vajuta ⇧, et üksus jäädavalt kustutada",
"show_album_options": "Näita albumi valikuid",
"show_albums": "Näita albumeid",
"show_all_people": "Näita kõiki isikuid",
"show_and_hide_people": "Näita ja peida isikuid",
"show_file_location": "Näita faili asukohta",
"show_gallery": "Näita galeriid",
"show_hidden_people": "Kuva peidetud inimesed",
"show_in_timeline": "Näita ajajoonel",
"show_in_timeline_setting_description": "Kuva oma ajajoonel selle kasutaja fotosid ja videosid", "show_in_timeline_setting_description": "Kuva oma ajajoonel selle kasutaja fotosid ja videosid",
"show_keyboard_shortcuts": "Kuva kiirklahvid",
"show_metadata": "Kuva metaandmed",
"show_or_hide_info": "Kuva või peida info",
"show_password": "Kuva parooli", "show_password": "Kuva parooli",
"show_supporter_badge": "Toetaja märk", "show_supporter_badge": "Toetaja märk",
"show_supporter_badge_description": "Kuva toetaja märki", "show_supporter_badge_description": "Kuva toetaja märki",
"sidebar": "Külgmenüü",
"sign_out": "Logi välja",
"sign_up": "Registreeru",
"size": "Suurus",
"skip_to_content": "Sisu juurde",
"slideshow": "Slaidiesitlus",
"slideshow_settings": "Slaidiesitluse seaded",
"sort_albums_by": "Järjesta albumid...", "sort_albums_by": "Järjesta albumid...",
"sort_created": "Loomise aeg",
"sort_items": "Üksuste arv",
"sort_modified": "Muutmise aeg",
"sort_oldest": "Vanim foto", "sort_oldest": "Vanim foto",
"sort_recent": "Kõige hiljutisem foto", "sort_recent": "Kõige hiljutisem foto",
"sort_title": "Pealkiri",
"stack": "Virn", "stack": "Virn",
"stack_select_one_photo": "Vali virnale kaanefoto", "stack_select_one_photo": "Vali virnale kaanefoto",
"stack_selected_photos": "Virnasta valitud fotod", "stack_selected_photos": "Virnasta valitud fotod",
"stacked_assets_count": "{count, plural, one {# üksus} other {# üksust}} virnastatud", "stacked_assets_count": "{count, plural, one {# üksus} other {# üksust}} virnastatud",
"start_date": "Alguskuupäev",
"state": "Osariik", "state": "Osariik",
"status": "Staatus",
"stop_photo_sharing": "Lõpeta oma fotode jagamine?", "stop_photo_sharing": "Lõpeta oma fotode jagamine?",
"stop_photo_sharing_description": "{partner} ei pääse rohkem su fotodele ligi.", "stop_photo_sharing_description": "{partner} ei pääse rohkem su fotodele ligi.",
"stop_sharing_photos_with_user": "Lõpeta oma fotode selle kasutajaga jagamine", "stop_sharing_photos_with_user": "Lõpeta oma fotode selle kasutajaga jagamine",
"storage_usage": "{used}/{available} kasutatud",
"suggestions": "Soovitused",
"sunrise_on_the_beach": "Päikesetõus rannal",
"tag": "Silt", "tag": "Silt",
"tag_assets": "Sildista üksuseid", "tag_assets": "Sildista üksuseid",
"tag_created": "Lisatud silt: {tag}", "tag_created": "Lisatud silt: {tag}",
"tag_feature_description": "Fotode ja videote lehitsemine siltide kaupa grupeeritult",
"tag_not_found_question": "Ei leia silti? Lisa uus <link>siin</link>",
"tag_updated": "Muudetud silt: {tag}", "tag_updated": "Muudetud silt: {tag}",
"tagged_assets": "{count, plural, one {# üksus} other {# üksust}} sildistatud", "tagged_assets": "{count, plural, one {# üksus} other {# üksust}} sildistatud",
"tags": "Sildid", "tags": "Sildid",
"theme": "Teema",
"theme_selection": "Teema valik",
"theme_selection_description": "Sea automaatselt hele või tume teema vastavalt veebilehitseja eelistustele",
"timezone": "Ajavöönd", "timezone": "Ajavöönd",
"to_archive": "Arhiivi", "to_archive": "Arhiivi",
"to_change_password": "Muuda parool", "to_change_password": "Muuda parool",
"to_favorite": "Lemmik",
"to_trash": "Prügi",
"trash_delete_asset": "Kustuta üksus", "trash_delete_asset": "Kustuta üksus",
"type": "Tüüp",
"unarchive": "Taasta arhiivist", "unarchive": "Taasta arhiivist",
"unhide_person": "Ära peida isikut",
"unknown_year": "Teadmata aasta",
"unlimited": "Piiramatu",
"unnamed_album": "Nimetu album", "unnamed_album": "Nimetu album",
"unnamed_album_delete_confirmation": "Kas oled kindel, et soovid selle albumi kustutada?", "unnamed_album_delete_confirmation": "Kas oled kindel, et soovid selle albumi kustutada?",
"unsaved_change": "Salvestamata muudatus",
"updated_password": "Parool muudetud", "updated_password": "Parool muudetud",
"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_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_errors": "Vead",
"upload_status_uploaded": "Üleslaaditud",
"upload_success": "Üleslaadimine õnnestus, uute üksuste nägemiseks värskenda lehte.", "upload_success": "Üleslaadimine õnnestus, uute üksuste nägemiseks värskenda lehte.",
"url": "URL",
"user": "Kasutaja",
"user_id": "Kasutaja ID",
"user_liked": "Kasutajale {user} meeldis {type, select, photo {see foto} video {see video} asset {see üksus} other {see}}", "user_liked": "Kasutajale {user} meeldis {type, select, photo {see foto} video {see video} asset {see üksus} other {see}}",
"user_purchase_settings_description": "Halda oma ostu",
"username": "Kasutajanimi", "username": "Kasutajanimi",
"users": "Kasutajad", "users": "Kasutajad",
"utilities": "Tööriistad", "utilities": "Tööriistad",
"validate": "Valideeri",
"variables": "Muutujad", "variables": "Muutujad",
"version": "Versioon", "version": "Versioon",
"version_announcement_closing": "Sinu sõber, Alex", "version_announcement_closing": "Sinu sõber, Alex",
@@ -758,10 +941,22 @@
"videos": "Videod", "videos": "Videod",
"videos_count": "{count, plural, one {# video} other {# videot}}", "videos_count": "{count, plural, one {# video} other {# videot}}",
"view_album": "Vaata albumit", "view_album": "Vaata albumit",
"view_all": "Vaata kõiki",
"view_all_users": "Vaata kõiki kasutajaid",
"view_in_timeline": "Vaata ajajoonel",
"view_links": "Vaata linke",
"view_next_asset": "Vaata järgmist üksust", "view_next_asset": "Vaata järgmist üksust",
"view_previous_asset": "Vaata eelmist üksust", "view_previous_asset": "Vaata eelmist üksust",
"view_stack": "Vaata virna",
"visibility_changed": "{count, plural, one {# isiku} other {# isiku}} nähtavus muudetud",
"waiting": "Ootel",
"warning": "Hoiatus",
"week": "Nädal", "week": "Nädal",
"welcome": "Tere tulemast",
"welcome_to_immich": "Tere tulemast Immich'isse",
"year": "Aasta", "year": "Aasta",
"years_ago": "{years, plural, one {# aasta} other {# aastat}} tagasi", "years_ago": "{years, plural, one {# aasta} other {# aastat}} tagasi",
"you_dont_have_any_shared_links": "Sul pole ühtegi jagatud linki" "yes": "Jah",
"you_dont_have_any_shared_links": "Sul pole ühtegi jagatud linki",
"zoom_image": "Suumi pilti"
} }

View File

@@ -14,7 +14,7 @@
"add_a_name": "Ajouter un nom", "add_a_name": "Ajouter un nom",
"add_a_title": "Ajouter un titre", "add_a_title": "Ajouter un titre",
"add_exclusion_pattern": "Ajouter un schéma d'exclusion", "add_exclusion_pattern": "Ajouter un schéma d'exclusion",
"add_import_path": "Ajouter un chemin d'import", "add_import_path": "Ajouter un chemin d'importation",
"add_location": "Ajouter un lieu", "add_location": "Ajouter un lieu",
"add_more_users": "Ajouter plus d'utilisateurs", "add_more_users": "Ajouter plus d'utilisateurs",
"add_partner": "Ajouter un partenaire", "add_partner": "Ajouter un partenaire",
@@ -1202,7 +1202,7 @@
"show_supporter_badge": "Badge de contributeur", "show_supporter_badge": "Badge de contributeur",
"show_supporter_badge_description": "Afficher le badge de contributeur", "show_supporter_badge_description": "Afficher le badge de contributeur",
"shuffle": "Mélanger", "shuffle": "Mélanger",
"sidebar": "Bar latérale", "sidebar": "Barre latérale",
"sidebar_display_description": "Afficher un lien vers la vue dans la barre latérale", "sidebar_display_description": "Afficher un lien vers la vue dans la barre latérale",
"sign_out": "Déconnexion", "sign_out": "Déconnexion",
"sign_up": "S'enregistrer", "sign_up": "S'enregistrer",
@@ -1238,12 +1238,13 @@
"submit": "Soumettre", "submit": "Soumettre",
"suggestions": "Suggestions", "suggestions": "Suggestions",
"sunrise_on_the_beach": "Aurore sur la plage", "sunrise_on_the_beach": "Aurore sur la plage",
"swap_merge_direction": "Changer la direction de fusion", "swap_merge_direction": "Inverser la direction de fusion",
"sync": "Synchroniser", "sync": "Synchroniser",
"tag": "Tag", "tag": "Tag",
"tag_assets": "Taguer les médias", "tag_assets": "Taguer les médias",
"tag_created": "Tag créé: {tag}", "tag_created": "Tag créé: {tag}",
"tag_feature_description": "Parcourir les photos et vidéos groupées par thèmes logiques", "tag_feature_description": "Parcourir les photos et vidéos groupées par thèmes logiques",
"tag_not_found_question": "Vous ne trouvez pas un tag? Créez-en un <link>ici</link>",
"tag_updated": "Tag mis à jour: {tag}", "tag_updated": "Tag mis à jour: {tag}",
"tagged_assets": "Tag ajouté à {count, plural, one {# média} other {# médias}}", "tagged_assets": "Tag ajouté à {count, plural, one {# média} other {# médias}}",
"tags": "Tags", "tags": "Tags",

View File

@@ -174,7 +174,7 @@
"oauth_issuer_url": "כתובת אתר המנפיק", "oauth_issuer_url": "כתובת אתר המנפיק",
"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": "אפשר כאשר 'app.immich:/' היא כתובת להפניה מחדש לא חוקית.", "oauth_mobile_redirect_uri_override_description": "אפשר כאשר ספק OAuth לא מאפשר כתובת URI לנייד, כמו '{callback}'",
"oauth_profile_signing_algorithm": "אלגוריתם חתימת פרופיל", "oauth_profile_signing_algorithm": "אלגוריתם חתימת פרופיל",
"oauth_profile_signing_algorithm_description": "אלגוריתם המשמש לחתימה על פרופיל המשתמש.", "oauth_profile_signing_algorithm_description": "אלגוריתם המשמש לחתימה על פרופיל המשתמש.",
"oauth_scope": "רמת הרשאה", "oauth_scope": "רמת הרשאה",
@@ -338,7 +338,8 @@
"album_added": "אלבום נוסף", "album_added": "אלבום נוסף",
"album_added_notification_setting_description": "קבלת הודעת דוא\"ל כאשר מוסיפים אותך לאלבום משותף", "album_added_notification_setting_description": "קבלת הודעת דוא\"ל כאשר מוסיפים אותך לאלבום משותף",
"album_cover_updated": "עטיפת האלבום עודכנה", "album_cover_updated": "עטיפת האלבום עודכנה",
"album_delete_confirmation": "את/ה בטוח/ה שברצונך למחוק את האלבום {album}?\nאם האלבום הזה משותף, משתמשים אחרים לא יוכלו לגשת אליו יותר.", "album_delete_confirmation": "את/ה בטוח/ה שברצונך למחוק את האלבום {album}?",
"album_delete_confirmation_description": "אם האלבום הזה משותף, משתמשים אחרים לא יוכלו לגשת אליו יותר.",
"album_info_updated": "מידע האלבום עודכן", "album_info_updated": "מידע האלבום עודכן",
"album_leave": "לעזוב אלבום?", "album_leave": "לעזוב אלבום?",
"album_leave_confirmation": "האם את/ה בטוח/ה שברצונך לעזוב את {album}?", "album_leave_confirmation": "האם את/ה בטוח/ה שברצונך לעזוב את {album}?",
@@ -448,6 +449,7 @@
"close": "סגור", "close": "סגור",
"collapse": "כווץ", "collapse": "כווץ",
"collapse_all": "כווץ הכל", "collapse_all": "כווץ הכל",
"color": "צבע",
"color_theme": "צבע ערכת נושא", "color_theme": "צבע ערכת נושא",
"comment_deleted": "תגובה נמחקה", "comment_deleted": "תגובה נמחקה",
"comment_options": "אפשרויות תגובה", "comment_options": "אפשרויות תגובה",
@@ -481,6 +483,8 @@
"create_new_person": "צור אדם חדש", "create_new_person": "צור אדם חדש",
"create_new_person_hint": "הקצה את הנכסים שנבחרו לאדם חדש", "create_new_person_hint": "הקצה את הנכסים שנבחרו לאדם חדש",
"create_new_user": "צור משתמש חדש", "create_new_user": "צור משתמש חדש",
"create_tag": "צור תג",
"create_tag_description": "צור תג חדש. עבור תגים מקוננים, נא להזין את הנתיב המלא של התג כולל קווים נטויים.",
"create_user": "צור משתמש", "create_user": "צור משתמש",
"created": "נוצר", "created": "נוצר",
"current_device": "מכשיר נוכחי", "current_device": "מכשיר נוכחי",
@@ -504,6 +508,8 @@
"delete_library": "מחק ספרייה", "delete_library": "מחק ספרייה",
"delete_link": "מחק קישור", "delete_link": "מחק קישור",
"delete_shared_link": "מחק קישור משותף", "delete_shared_link": "מחק קישור משותף",
"delete_tag": "מחק תג",
"delete_tag_confirmation_prompt": "האם את/ה בטוח/ה שברצונך למחוק תג {tagName}?",
"delete_user": "מחק משתמש", "delete_user": "מחק משתמש",
"deleted_shared_link": "קישור משותף נמחק", "deleted_shared_link": "קישור משותף נמחק",
"description": "תיאור", "description": "תיאור",
@@ -552,6 +558,7 @@
"edit_location": "ערוך מיקום", "edit_location": "ערוך מיקום",
"edit_name": "ערוך שם", "edit_name": "ערוך שם",
"edit_people": "ערוך אנשים", "edit_people": "ערוך אנשים",
"edit_tag": "ערוך תג",
"edit_title": "ערוך כותרת", "edit_title": "ערוך כותרת",
"edit_user": "ערוך משתמש", "edit_user": "ערוך משתמש",
"edited": "נערך", "edited": "נערך",
@@ -709,6 +716,7 @@
"expired": "פג", "expired": "פג",
"expires_date": "יפוג {date}", "expires_date": "יפוג {date}",
"explore": "חקור", "explore": "חקור",
"explorer": "סייר",
"export": "ייצוא", "export": "ייצוא",
"export_as_json": "ייצוא כ-JSON", "export_as_json": "ייצוא כ-JSON",
"extension": "סיומת", "extension": "סיומת",
@@ -722,6 +730,8 @@
"feature": "", "feature": "",
"feature_photo_updated": "תמונה מייצגת עודכנה", "feature_photo_updated": "תמונה מייצגת עודכנה",
"featurecollection": "", "featurecollection": "",
"features": "תכונות",
"features_setting_description": "נהל את תכונות היישום",
"file_name": "שם הקובץ", "file_name": "שם הקובץ",
"file_name_or_extension": "שם קובץ או סיומת", "file_name_or_extension": "שם קובץ או סיומת",
"filename": "שם קובץ", "filename": "שם קובץ",
@@ -730,6 +740,8 @@
"filter_people": "סנן אנשים", "filter_people": "סנן אנשים",
"find_them_fast": "מצא אותם מהר לפי שם עם חיפוש", "find_them_fast": "מצא אותם מהר לפי שם עם חיפוש",
"fix_incorrect_match": "תקן התאמה שגויה", "fix_incorrect_match": "תקן התאמה שגויה",
"folders": "תיקיות",
"folders_feature_description": "עיון בתצוגת התיקייה עבור התמונות והסרטונים שבמערכת הקבצים",
"force_re-scan_library_files": "כפה סריקה מחדש של כל קבצי הספרייה", "force_re-scan_library_files": "כפה סריקה מחדש של כל קבצי הספרייה",
"forward": "קדימה", "forward": "קדימה",
"general": "כללי", "general": "כללי",
@@ -964,6 +976,7 @@
"pending": "ממתין", "pending": "ממתין",
"people": "אנשים", "people": "אנשים",
"people_edits_count": "{count, plural, one {אדם # נערך} other {# אנשים נערכו}}", "people_edits_count": "{count, plural, one {אדם # נערך} other {# אנשים נערכו}}",
"people_feature_description": "עיון בתמונות וסרטונים שקובצו על ידי אנשים",
"people_sidebar_description": "הצג קישור אל אנשים בסרגל הצד", "people_sidebar_description": "הצג קישור אל אנשים בסרגל הצד",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "אזהרת מחיקה לצמיתות", "permanent_deletion_warning": "אזהרת מחיקה לצמיתות",
@@ -1035,7 +1048,9 @@
"purchase_settings_server_activated": "מפתח המוצר של השרת מנוהל על ידי מנהל המערכת", "purchase_settings_server_activated": "מפתח המוצר של השרת מנוהל על ידי מנהל המערכת",
"range": "", "range": "",
"rating": "דירוג כוכב", "rating": "דירוג כוכב",
"rating_description": "הצג את דירוג ה-exif בלוח המידע", "rating_clear": "נקה דירוג",
"rating_count": "{count, plural, one {כוכב #} other {# כוכבים}}",
"rating_description": "הצג את דירוג ה-EXIF בלוח המידע",
"raw": "", "raw": "",
"reaction_options": "אפשרויות הגבה", "reaction_options": "אפשרויות הגבה",
"read_changelog": "קרא את יומן השינויים", "read_changelog": "קרא את יומן השינויים",
@@ -1068,6 +1083,7 @@
"removed_from_archive": "הוסר מארכיון", "removed_from_archive": "הוסר מארכיון",
"removed_from_favorites": "הוסר ממועדפים", "removed_from_favorites": "הוסר ממועדפים",
"removed_from_favorites_count": "{count, plural, other {הוסרו #}} מהמועדפים", "removed_from_favorites_count": "{count, plural, other {הוסרו #}} מהמועדפים",
"removed_tagged_assets": "תג הוסר מ{count, plural, one {נכס #} other {# נכסים}}",
"rename": "שנה שם", "rename": "שנה שם",
"repair": "תיקון", "repair": "תיקון",
"repair_no_results_message": "קבצים חסרי מעקב וחסרים יופיעו כאן", "repair_no_results_message": "קבצים חסרי מעקב וחסרים יופיעו כאן",
@@ -1117,6 +1133,7 @@
"search_people": "חפש אנשים", "search_people": "חפש אנשים",
"search_places": "חפש מקומות", "search_places": "חפש מקומות",
"search_state": "חפש מדינה...", "search_state": "חפש מדינה...",
"search_tags": "חיפוש תגים...",
"search_timezone": "חפש אזור זמן...", "search_timezone": "חפש אזור זמן...",
"search_type": "סוג חיפוש", "search_type": "סוג חיפוש",
"search_your_photos": "חפש בתמונות שלך", "search_your_photos": "חפש בתמונות שלך",
@@ -1185,6 +1202,8 @@
"show_supporter_badge": "תג תומך", "show_supporter_badge": "תג תומך",
"show_supporter_badge_description": "הצג תג תומך", "show_supporter_badge_description": "הצג תג תומך",
"shuffle": "ערבוב", "shuffle": "ערבוב",
"sidebar": "סרגל צד",
"sidebar_display_description": "הצג קישור לתצוגה בסרגל הצד",
"sign_out": "יציאה מהמערכת", "sign_out": "יציאה מהמערכת",
"sign_up": "הרשמה", "sign_up": "הרשמה",
"size": "גודל", "size": "גודל",
@@ -1221,6 +1240,14 @@
"sunrise_on_the_beach": "Sunrise on the beach (מומלץ לחפש באנגלית לתוצאות טובות יותר)", "sunrise_on_the_beach": "Sunrise on the beach (מומלץ לחפש באנגלית לתוצאות טובות יותר)",
"swap_merge_direction": "החלף כיוון מיזוג", "swap_merge_direction": "החלף כיוון מיזוג",
"sync": "סנכרן", "sync": "סנכרן",
"tag": "תג",
"tag_assets": "תיוג נכסים",
"tag_created": "נוצר תג: {tag}",
"tag_feature_description": "עיון בתמונות וסרטונים שקובצו על ידי נושאי תג לוגיים",
"tag_not_found_question": "לא מצליח למצוא תג? צור אחד <link>כאן</link>",
"tag_updated": "תג מעודכן: {tag}",
"tagged_assets": "תויגו {count, plural, one {נכס #} other {# נכסים}}",
"tags": "תגים",
"template": "תבנית", "template": "תבנית",
"theme": "ערכת נושא", "theme": "ערכת נושא",
"theme_selection": "בחירת ערכת נושא", "theme_selection": "בחירת ערכת נושא",
@@ -1232,9 +1259,10 @@
"to_change_password": "שנה סיסמה", "to_change_password": "שנה סיסמה",
"to_favorite": "מועדף", "to_favorite": "מועדף",
"to_login": "כניסה", "to_login": "כניסה",
"to_root": "לשורש",
"to_trash": "אשפה", "to_trash": "אשפה",
"toggle_settings": "החלף מצב הגדרות", "toggle_settings": "החלף מצב הגדרות",
"toggle_theme": "החלף מצב ערכת נושא", "toggle_theme": "החלף ערכת נושא כהה",
"toggle_visibility": "החלף נראות", "toggle_visibility": "החלף נראות",
"total_usage": "שימוש כולל", "total_usage": "שימוש כולל",
"trash": "אשפה", "trash": "אשפה",
@@ -1256,6 +1284,7 @@
"unlink_oauth": "בטל קישור OAuth", "unlink_oauth": "בטל קישור OAuth",
"unlinked_oauth_account": "בוטל קישור חשבון OAuth", "unlinked_oauth_account": "בוטל קישור חשבון OAuth",
"unnamed_album": "אלבום ללא שם", "unnamed_album": "אלבום ללא שם",
"unnamed_album_delete_confirmation": "את/ה בטוח/ה שברצונך למחוק את האלבום הזה?",
"unnamed_share": "שיתוף ללא שם", "unnamed_share": "שיתוף ללא שם",
"unsaved_change": "שינוי לא נשמר", "unsaved_change": "שינוי לא נשמר",
"unselect_all": "בטל בחירה בהכל", "unselect_all": "בטל בחירה בהכל",
@@ -1304,6 +1333,7 @@
"view_album": "הצג אלבום", "view_album": "הצג אלבום",
"view_all": "הצג הכל", "view_all": "הצג הכל",
"view_all_users": "הצג את כל המשתמשים", "view_all_users": "הצג את כל המשתמשים",
"view_in_timeline": "ראה בציר הזמן",
"view_links": "הצג קישורים", "view_links": "הצג קישורים",
"view_next_asset": "הצג את הנכס הבא", "view_next_asset": "הצג את הנכס הבא",
"view_previous_asset": "הצג את הנכס הקודם", "view_previous_asset": "הצג את הנכס הקודם",

View File

@@ -98,24 +98,26 @@
"machine_learning_duplicate_detection_enabled": "Omogući detekciju duplikata", "machine_learning_duplicate_detection_enabled": "Omogući detekciju duplikata",
"machine_learning_duplicate_detection_enabled_description": "", "machine_learning_duplicate_detection_enabled_description": "",
"machine_learning_duplicate_detection_setting_description": "", "machine_learning_duplicate_detection_setting_description": "",
"machine_learning_enabled_description": "", "machine_learning_enabled": "Uključi strojsko učenje",
"machine_learning_facial_recognition": "", "machine_learning_enabled_description": "Ukoliko je ovo isključeno, sve funkcije strojnoga učenja biti će isključene bez obzira na postavke ispod.",
"machine_learning_facial_recognition_description": "", "machine_learning_facial_recognition": "Detekcija lica",
"machine_learning_facial_recognition_model": "", "machine_learning_facial_recognition_description": "Detektiraj, prepoznaj i grupiraj lica u fotografijama",
"machine_learning_facial_recognition_model_description": "", "machine_learning_facial_recognition_model": "Model prepoznavanja lica",
"machine_learning_facial_recognition_setting_description": "", "machine_learning_facial_recognition_model_description": "Modeli su navedeni silaznim redoslijedom veličine. Veći modeli su sporiji i koriste više memorije, ali daju bolje rezultate. Imajte na umu da morate ponovno pokrenuti posao detekcije lica za sve slike nakon promjene modela.",
"machine_learning_max_detection_distance": "", "machine_learning_facial_recognition_setting": "Omogući prepoznavanje lica",
"machine_learning_max_detection_distance_description": "", "machine_learning_facial_recognition_setting_description": "Ako je onemogućeno, slike neće biti kodirane za prepoznavanje lica i neće popuniti odjeljak Ljudi na stranici Istraživanje.",
"machine_learning_max_recognition_distance": "", "machine_learning_max_detection_distance": "Maksimalna udaljenost za detektiranje",
"machine_learning_max_recognition_distance_description": "", "machine_learning_max_detection_distance_description": "Maksimalna udaljenost između dvije slike da bi se smatrale duplikatima, u rasponu od 0,001-0,1. Više vrijednosti otkrit će više duplikata, ali mogu rezultirati netočnim rezultatima.",
"machine_learning_min_detection_score": "", "machine_learning_max_recognition_distance": "Maksimalna udaljenost za detekciju",
"machine_learning_min_detection_score_description": "", "machine_learning_max_recognition_distance_description": "Maksimalna udaljenost između dva lica koja se smatraju istom osobom, u rasponu od 0-2. Snižavanje može spriječiti označavanje dvije osobe kao iste osobe, dok podizanje može spriječiti označavanje iste osobe kao dvije različite osobe. Imajte na umu da je lakše spojiti dvije osobe nego jednu osobu podijeliti na dvije, stoga koristite niži prag kada je to moguće.",
"machine_learning_min_recognized_faces": "", "machine_learning_min_detection_score": "Minimalni rezultat otkrivanja",
"machine_learning_min_recognized_faces_description": "", "machine_learning_min_detection_score_description": "Minimalni rezultat pouzdanosti za detektirano lice od 0-1. Niže vrijednosti otkrit će više lica, ali mogu dovesti do lažno pozitivnih rezultata.",
"machine_learning_settings": "", "machine_learning_min_recognized_faces": "Minimum prepoznatih lica",
"machine_learning_settings_description": "", "machine_learning_min_recognized_faces_description": "Najmanji broj prepoznatih lica za osobu koja se stvara. Povećanje toga čini prepoznavanje lica preciznijim po cijenu povećanja šanse da lice nije dodijeljeno osobi.",
"machine_learning_smart_search": "", "machine_learning_settings": "Postavke strojnog učenja",
"machine_learning_smart_search_description": "", "machine_learning_settings_description": "Upravljajte značajkama i postavkama strojnog učenja",
"machine_learning_smart_search": "Pametna pretraga",
"machine_learning_smart_search_description": "Pretražujte slike semantički koristeći CLIP ugradnje",
"machine_learning_smart_search_enabled": "Omogući pametno pretraživanje", "machine_learning_smart_search_enabled": "Omogući pametno pretraživanje",
"machine_learning_smart_search_enabled_description": "Ako je onemogućeno, slike neće biti kodirane za pametno pretraživanje.", "machine_learning_smart_search_enabled_description": "Ako je onemogućeno, slike neće biti kodirane za pametno pretraživanje.",
"machine_learning_url_description": "URL poslužitelja strojnog učenja", "machine_learning_url_description": "URL poslužitelja strojnog učenja",
@@ -138,7 +140,7 @@
"metadata_extraction_job_description": "Izdvojite podatke o metapodacima iz svakog sredstva, kao što su GPS i rezolucija", "metadata_extraction_job_description": "Izdvojite podatke o metapodacima iz svakog sredstva, kao što su GPS i rezolucija",
"migration_job": "Migracija", "migration_job": "Migracija",
"migration_job_description": "Premjestite minijature za sredstva i lica u najnoviju strukturu mapa", "migration_job_description": "Premjestite minijature za sredstva i lica u najnoviju strukturu mapa",
"no_paths_added": "", "no_paths_added": "Nema dodanih putanja",
"no_pattern_added": "Nije dodan uzorak", "no_pattern_added": "Nije dodan uzorak",
"note_apply_storage_label_previous_assets": "Napomena: da biste primijenili Oznaku Pohrane na prethodno prenesena sredstva, pokrenite", "note_apply_storage_label_previous_assets": "Napomena: da biste primijenili Oznaku Pohrane na prethodno prenesena sredstva, pokrenite",
"note_cannot_be_changed_later": "NAPOMENA: Ovo se ne može promijeniti kasnije!", "note_cannot_be_changed_later": "NAPOMENA: Ovo se ne može promijeniti kasnije!",
@@ -172,39 +174,42 @@
"oauth_mobile_redirect_uri_override": "", "oauth_mobile_redirect_uri_override": "",
"oauth_mobile_redirect_uri_override_description": "", "oauth_mobile_redirect_uri_override_description": "",
"oauth_scope": "", "oauth_scope": "",
"oauth_settings": "", "oauth_settings": "OAuth",
"oauth_settings_description": "", "oauth_settings_description": "Upravljanje postavkama za prijavu kroz OAuth",
"oauth_settings_more_details": "Za više pojedinosti o ovoj značajci pogledajte <link>uputstva</link>.",
"oauth_signing_algorithm": "", "oauth_signing_algorithm": "",
"oauth_storage_label_claim": "", "oauth_storage_label_claim": "",
"oauth_storage_label_claim_description": "", "oauth_storage_label_claim_description": "",
"oauth_storage_quota_claim": "", "oauth_storage_quota_claim": "",
"oauth_storage_quota_claim_description": "", "oauth_storage_quota_claim_description": "",
"oauth_storage_quota_default": "", "oauth_storage_quota_default": "",
"oauth_storage_quota_default_description": "", "oauth_storage_quota_default_description": "Kvota u GiB koja će se koristiti kada nema zahtjeva (unesite 0 za neograničenu kvotu).",
"offline_paths": "", "offline_paths": "Izvanmrežne putanje",
"offline_paths_description": "", "offline_paths_description": "Ovi rezultati mogu biti posljedica ručnog brisanja datoteka koje nisu dio vanjske biblioteke.",
"password_enable_description": "", "password_enable_description": "Prijava s email adresom i zaporkom",
"password_settings": "", "password_settings": "Prijava zaporkom",
"password_settings_description": "", "password_settings_description": "Upravljanje postavkama za prijavu zaporkom",
"paths_validated_successfully": "", "paths_validated_successfully": "Sve su putanje uspješno potvrđene",
"quota_size_gib": "", "quota_size_gib": "Veličina kvote (GiB)",
"refreshing_all_libraries": "", "refreshing_all_libraries": "Osvježavanje svih biblioteka",
"removing_offline_files": "", "registration": "Registracija administratora",
"repair_all": "", "registration_description": "Budući da ste prvi korisnik na sustavu, bit ćete dodijeljeni administratorsku ulogu i odgovorni ste za administrativne poslove, a dodatne korisnike kreirat ćete sami.",
"removing_offline_files": "Uklanjanje izvanmrežnih datoteka",
"repair_all": "Popravi sve",
"repair_matched_items": "", "repair_matched_items": "",
"repaired_items": "", "repaired_items": "",
"require_password_change_on_login": "", "require_password_change_on_login": "Zahtijevajte od korisnika promjenu lozinke pri prvoj prijavi",
"reset_settings_to_default": "", "reset_settings_to_default": "Vrati postavke na zadane",
"reset_settings_to_recent_saved": "", "reset_settings_to_recent_saved": "Resetirajte postavke na nedavno spremljene postavke",
"scanning_library_for_changed_files": "", "scanning_library_for_changed_files": "Skeniranje biblioteke za promijenjene datoteke",
"scanning_library_for_new_files": "", "scanning_library_for_new_files": "Skeniranje biblioteke za nove datoteke",
"send_welcome_email": "", "send_welcome_email": "Pošaljite email dobrodošlice",
"server_external_domain_settings": "", "server_external_domain_settings": "Vanjska domena",
"server_external_domain_settings_description": "", "server_external_domain_settings_description": "Domena za javno dijeljene linkove, uključujući http(s)://",
"server_settings": "", "server_settings": "Postavke servera",
"server_settings_description": "", "server_settings_description": "Upravljanje postavkama servera",
"server_welcome_message": "", "server_welcome_message": "Poruka dobrodošlice",
"server_welcome_message_description": "", "server_welcome_message_description": "Poruka koja je prikazana na prijavi.",
"sidecar_job": "", "sidecar_job": "",
"sidecar_job_description": "", "sidecar_job_description": "",
"slideshow_duration_description": "", "slideshow_duration_description": "",
@@ -217,27 +222,29 @@
"storage_template_settings": "", "storage_template_settings": "",
"storage_template_settings_description": "", "storage_template_settings_description": "",
"system_settings": "", "system_settings": "",
"theme_custom_css_settings": "", "theme_custom_css_settings": "Prilagođeni CSS",
"theme_custom_css_settings_description": "", "theme_custom_css_settings_description": "Kaskadni listovi stilova (CSS) omogućuju prilagođavanje dizajna Immicha.",
"theme_settings": "", "theme_settings": "Postavke tema",
"theme_settings_description": "", "theme_settings_description": "Upravljajte prilagodbom Immich web sučelja",
"these_files_matched_by_checksum": "", "these_files_matched_by_checksum": "",
"thumbnail_generation_job": "", "thumbnail_generation_job": "Generirajte sličice",
"thumbnail_generation_job_description": "", "thumbnail_generation_job_description": "",
"transcoding_acceleration_api": "", "transcoding_acceleration_api": "API ubrzanja",
"transcoding_acceleration_api_description": "", "transcoding_acceleration_api_description": "API koji će komunicirati s vašim uređajem radi ubrzanja transkodiranja. Ova postavka je 'najveći trud': vratit će se na softversko transkodiranje u slučaju kvara. VP9 može ili ne mora raditi ovisno o vašem hardveru.",
"transcoding_acceleration_nvenc": "", "transcoding_acceleration_nvenc": "NVENC (zahtjeva NVIDIA GPU)",
"transcoding_acceleration_qsv": "", "transcoding_acceleration_qsv": "Quick Sync (zahtjeva Intel CPU sedme ili veće generacije)",
"transcoding_acceleration_rkmpp": "", "transcoding_acceleration_rkmpp": "RKMPP (samo na Rockchip SOCima)",
"transcoding_acceleration_vaapi": "", "transcoding_acceleration_vaapi": "VAAPI",
"transcoding_accepted_audio_codecs": "", "transcoding_accepted_audio_codecs": "Prihvačeni audio kodeci",
"transcoding_accepted_audio_codecs_description": "", "transcoding_accepted_audio_codecs_description": "Odaberite koji audio kodeci ne trebaju biti transkodirani. Samo korišteno za neka pravila za transkodiranje.",
"transcoding_accepted_video_codecs": "", "transcoding_accepted_containers": "Prihvaćeni kontenjeri",
"transcoding_accepted_containers_description": "Odaberite koji formati spremnika ne moraju biti remulksirani u MP4. Koristi se samo za određena pravila transkodiranja.",
"transcoding_accepted_video_codecs": "Prihvaćeni video kodeci",
"transcoding_accepted_video_codecs_description": "", "transcoding_accepted_video_codecs_description": "",
"transcoding_advanced_options_description": "", "transcoding_advanced_options_description": "Postavke većina korisnika ne treba mjenjati",
"transcoding_audio_codec": "", "transcoding_audio_codec": "Audio kodek",
"transcoding_audio_codec_description": "", "transcoding_audio_codec_description": "Opus je opcija s najvećom kvalitetom, no ima manju podršku s starim uređajima i softverima.",
"transcoding_bitrate_description": "", "transcoding_bitrate_description": "Videozapisi veći od maksimalne brzine prijenosa ili nisu u prihvatljivom formatu",
"transcoding_constant_quality_mode": "", "transcoding_constant_quality_mode": "",
"transcoding_constant_quality_mode_description": "", "transcoding_constant_quality_mode_description": "",
"transcoding_constant_rate_factor": "", "transcoding_constant_rate_factor": "",
@@ -247,10 +254,10 @@
"transcoding_hardware_acceleration_description": "", "transcoding_hardware_acceleration_description": "",
"transcoding_hardware_decoding": "", "transcoding_hardware_decoding": "",
"transcoding_hardware_decoding_setting_description": "", "transcoding_hardware_decoding_setting_description": "",
"transcoding_hevc_codec": "", "transcoding_hevc_codec": "HEVC kodek",
"transcoding_max_b_frames": "", "transcoding_max_b_frames": "",
"transcoding_max_b_frames_description": "", "transcoding_max_b_frames_description": "",
"transcoding_max_bitrate": "", "transcoding_max_bitrate": "Maksimalne brzina prijenosa (bitrate)",
"transcoding_max_bitrate_description": "", "transcoding_max_bitrate_description": "",
"transcoding_max_keyframe_interval": "", "transcoding_max_keyframe_interval": "",
"transcoding_max_keyframe_interval_description": "", "transcoding_max_keyframe_interval_description": "",

View File

@@ -481,7 +481,7 @@
"create_new_person_hint": "Tetapkan aset yang dipilih ke orang yang baru", "create_new_person_hint": "Tetapkan aset yang dipilih ke orang yang baru",
"create_new_user": "Buat pengguna baru", "create_new_user": "Buat pengguna baru",
"create_tag": "Buat tag", "create_tag": "Buat tag",
"create_tag_description": "Buat tag baru. Untuk tag bersarang, harap di input jalur tag secara lengkap termasuk tanda /", "create_tag_description": "Buat tag baru. Untuk tag bersarang, harap input jalur tag secara lengkap termasuk tanda garis miring ke depan.",
"create_user": "Buat pengguna", "create_user": "Buat pengguna",
"created": "Dibuat", "created": "Dibuat",
"current_device": "Perangkat saat ini", "current_device": "Perangkat saat ini",
@@ -506,6 +506,7 @@
"delete_link": "Hapus tautan", "delete_link": "Hapus tautan",
"delete_shared_link": "Hapus tautan terbagi", "delete_shared_link": "Hapus tautan terbagi",
"delete_tag": "Hapus tag", "delete_tag": "Hapus tag",
"delete_tag_confirmation_prompt": "Apakah Anda yakin ingin menghapus label tag {tagName}?",
"delete_user": "Hapus pengguna", "delete_user": "Hapus pengguna",
"deleted_shared_link": "Tautan terbagi dihapus", "deleted_shared_link": "Tautan terbagi dihapus",
"description": "Deskripsi", "description": "Deskripsi",
@@ -547,6 +548,7 @@
"edit_location": "Sunting lokasi", "edit_location": "Sunting lokasi",
"edit_name": "Sunting nama", "edit_name": "Sunting nama",
"edit_people": "Sunting orang", "edit_people": "Sunting orang",
"edit_tag": "Ubah tag",
"edit_title": "Sunting Judul", "edit_title": "Sunting Judul",
"edit_user": "Sunting pengguna", "edit_user": "Sunting pengguna",
"edited": "Disunting", "edited": "Disunting",
@@ -706,6 +708,8 @@
"favorite_or_unfavorite_photo": "Favorit atau batalkan pemfavoritan foto", "favorite_or_unfavorite_photo": "Favorit atau batalkan pemfavoritan foto",
"favorites": "Favorit", "favorites": "Favorit",
"feature_photo_updated": "Foto terfitur diperbarui", "feature_photo_updated": "Foto terfitur diperbarui",
"features": "Fitur",
"features_setting_description": "Kelola fitur aplikasi",
"file_name": "Nama berkas", "file_name": "Nama berkas",
"file_name_or_extension": "Nama berkas atau ekstensi", "file_name_or_extension": "Nama berkas atau ekstensi",
"filename": "Nama berkas", "filename": "Nama berkas",
@@ -714,6 +718,7 @@
"find_them_fast": "Temukan dengan cepat berdasarkan nama dengan pencarian", "find_them_fast": "Temukan dengan cepat berdasarkan nama dengan pencarian",
"fix_incorrect_match": "Perbaiki pencocokan salah", "fix_incorrect_match": "Perbaiki pencocokan salah",
"folders": "Berkas", "folders": "Berkas",
"folders_feature_description": "Menjelajahi tampilan folder untuk foto dan video pada sistem file",
"force_re-scan_library_files": "Paksa Pindai Ulang Semua Berkas Pustaka", "force_re-scan_library_files": "Paksa Pindai Ulang Semua Berkas Pustaka",
"forward": "Maju", "forward": "Maju",
"general": "Umum", "general": "Umum",
@@ -946,6 +951,7 @@
"pending": "Tertunda", "pending": "Tertunda",
"people": "Orang", "people": "Orang",
"people_edits_count": "{count, plural, one {# orang} other {# orang}} disunting", "people_edits_count": "{count, plural, one {# orang} other {# orang}} disunting",
"people_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan orang",
"people_sidebar_description": "Tampilkan tautan ke Orang dalam bilah samping", "people_sidebar_description": "Tampilkan tautan ke Orang dalam bilah samping",
"permanent_deletion_warning": "Peringatan penghapusan permanen", "permanent_deletion_warning": "Peringatan penghapusan permanen",
"permanent_deletion_warning_setting_description": "Tampilkan peringatan ketika menghapus aset secara permanen", "permanent_deletion_warning_setting_description": "Tampilkan peringatan ketika menghapus aset secara permanen",
@@ -1016,7 +1022,7 @@
"rating": "Peringkat bintang", "rating": "Peringkat bintang",
"rating_clear": "Hapus peringkat", "rating_clear": "Hapus peringkat",
"rating_count": "{count, plural, one {# peringkat} other {# peringkat}}", "rating_count": "{count, plural, one {# peringkat} other {# peringkat}}",
"rating_description": "Tampilkan peringkat exif pada panel info", "rating_description": "Tampilkan peringkat EXIF pada panel info",
"reaction_options": "Opsi reaksi", "reaction_options": "Opsi reaksi",
"read_changelog": "Baca Log Perubahan", "read_changelog": "Baca Log Perubahan",
"reassign": "Tetapkan ulang", "reassign": "Tetapkan ulang",
@@ -1048,6 +1054,7 @@
"removed_from_archive": "Dihapus dari arsip", "removed_from_archive": "Dihapus dari arsip",
"removed_from_favorites": "Dihapus dari favorit", "removed_from_favorites": "Dihapus dari favorit",
"removed_from_favorites_count": "{count, plural, other {Menghapus #}} dari favorit", "removed_from_favorites_count": "{count, plural, other {Menghapus #}} dari favorit",
"removed_tagged_assets": "Hapus tag dari {count, plural, one {# aset} other {# aset}}",
"rename": "Ubah nama", "rename": "Ubah nama",
"repair": "Perbaiki", "repair": "Perbaiki",
"repair_no_results_message": "Berkas yang tidak dilacak dan hilang akan muncul di sini", "repair_no_results_message": "Berkas yang tidak dilacak dan hilang akan muncul di sini",
@@ -1096,6 +1103,7 @@
"search_people": "Cari orang", "search_people": "Cari orang",
"search_places": "Cari tempat", "search_places": "Cari tempat",
"search_state": "Cari negara bagian...", "search_state": "Cari negara bagian...",
"search_tags": "Cari tag...",
"search_timezone": "Cari zona waktu...", "search_timezone": "Cari zona waktu...",
"search_type": "Jenis pencarian", "search_type": "Jenis pencarian",
"search_your_photos": "Cari foto Anda", "search_your_photos": "Cari foto Anda",
@@ -1164,6 +1172,8 @@
"show_supporter_badge": "Lencana suporter", "show_supporter_badge": "Lencana suporter",
"show_supporter_badge_description": "Tampilkan lencana suporter", "show_supporter_badge_description": "Tampilkan lencana suporter",
"shuffle": "Acak", "shuffle": "Acak",
"sidebar": "Bilah sisi",
"sidebar_display_description": "Menampilkan tautan ke tampilan di bilah sisi",
"sign_out": "Keluar", "sign_out": "Keluar",
"sign_up": "Daftar", "sign_up": "Daftar",
"size": "Ukuran", "size": "Ukuran",
@@ -1200,6 +1210,14 @@
"sunrise_on_the_beach": "Matahari terbit di pantai", "sunrise_on_the_beach": "Matahari terbit di pantai",
"swap_merge_direction": "Ganti arah penggabungan", "swap_merge_direction": "Ganti arah penggabungan",
"sync": "Sinkronisasikan", "sync": "Sinkronisasikan",
"tag": "Tag",
"tag_assets": "Tag aset",
"tag_created": "Tag yang di buat: {tag}",
"tag_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan topik tag logis",
"tag_not_found_question": "Tidak dapat menemukan tag? Buat satu <link>disini</link>",
"tag_updated": "Tag yang diperbarui: {tag}",
"tagged_assets": "Ditandai {count, plural, one {# aset} other {# aset}}",
"tags": "Tag",
"template": "Templat", "template": "Templat",
"theme": "Tema", "theme": "Tema",
"theme_selection": "Pemilihan tema", "theme_selection": "Pemilihan tema",
@@ -1211,6 +1229,7 @@
"to_change_password": "Ubah kata sandi", "to_change_password": "Ubah kata sandi",
"to_favorite": "Favorit", "to_favorite": "Favorit",
"to_login": "Log masuk", "to_login": "Log masuk",
"to_root": "Untuk melakukan root",
"to_trash": "Sampah", "to_trash": "Sampah",
"toggle_settings": "Saklar pengaturan", "toggle_settings": "Saklar pengaturan",
"toggle_theme": "Beralih tema gelap", "toggle_theme": "Beralih tema gelap",
@@ -1283,6 +1302,7 @@
"view_album": "Tampilkan Album", "view_album": "Tampilkan Album",
"view_all": "Tampilkan Semua", "view_all": "Tampilkan Semua",
"view_all_users": "Tampilkan semua pengguna", "view_all_users": "Tampilkan semua pengguna",
"view_in_timeline": "Lihat di timeline",
"view_links": "Tampilkan tautan", "view_links": "Tampilkan tautan",
"view_next_asset": "Tampilkan aset berikutnya", "view_next_asset": "Tampilkan aset berikutnya",
"view_previous_asset": "Tampilkan aset sebelumnya", "view_previous_asset": "Tampilkan aset sebelumnya",

View File

@@ -1,6 +1,6 @@
{ {
"about": "Informazioni", "about": "Informazioni",
"account": "Account", "account": "Profilo",
"account_settings": "Impostazioni Account", "account_settings": "Impostazioni Account",
"acknowledge": "Ho capito", "acknowledge": "Ho capito",
"action": "Azione", "action": "Azione",
@@ -174,7 +174,7 @@
"oauth_issuer_url": "URL emittente", "oauth_issuer_url": "URL emittente",
"oauth_mobile_redirect_uri": "URI reindirizzamento mobile", "oauth_mobile_redirect_uri": "URI reindirizzamento mobile",
"oauth_mobile_redirect_uri_override": "Sovrascrivi URI reindirizzamento cellulare", "oauth_mobile_redirect_uri_override": "Sovrascrivi URI reindirizzamento cellulare",
"oauth_mobile_redirect_uri_override_description": "Abilita quando 'app.immich:/' non è un URI di reindirizzamento valido.", "oauth_mobile_redirect_uri_override_description": "Abilita quando il gestore OAuth non consente un URL come '{callback}'",
"oauth_profile_signing_algorithm": "Algoritmo firma profilo", "oauth_profile_signing_algorithm": "Algoritmo firma profilo",
"oauth_profile_signing_algorithm_description": "L'algoritmo usato per firmare il profilo utente.", "oauth_profile_signing_algorithm_description": "L'algoritmo usato per firmare il profilo utente.",
"oauth_scope": "Ambito di autorizzazione", "oauth_scope": "Ambito di autorizzazione",
@@ -338,7 +338,8 @@
"album_added": "Album aggiunto", "album_added": "Album aggiunto",
"album_added_notification_setting_description": "Ricevi una notifica email quando sei aggiunto a un album condiviso", "album_added_notification_setting_description": "Ricevi una notifica email quando sei aggiunto a un album condiviso",
"album_cover_updated": "Copertina dell'album aggiornata", "album_cover_updated": "Copertina dell'album aggiornata",
"album_delete_confirmation": "Sei sicuro di voler cancellare l'album {album}?\nSe l'album è stato condiviso, gli altri utenti non potranno più accedervi.", "album_delete_confirmation": "Sei sicuro di voler cancellare l'album {album}?",
"album_delete_confirmation_description": "Se l'album è condiviso gli altri utenti perderanno l'accesso.",
"album_info_updated": "Informazioni dell'album aggiornate", "album_info_updated": "Informazioni dell'album aggiornate",
"album_leave": "Abbandona l'album?", "album_leave": "Abbandona l'album?",
"album_leave_confirmation": "Sei sicuro di voler abbandonare {album}?", "album_leave_confirmation": "Sei sicuro di voler abbandonare {album}?",
@@ -448,6 +449,7 @@
"close": "Chiudi", "close": "Chiudi",
"collapse": "Restringi", "collapse": "Restringi",
"collapse_all": "Comprimi tutto", "collapse_all": "Comprimi tutto",
"color": "Colore",
"color_theme": "Colore Tema", "color_theme": "Colore Tema",
"comment_deleted": "Commento eliminato", "comment_deleted": "Commento eliminato",
"comment_options": "Opzioni per i commenti", "comment_options": "Opzioni per i commenti",
@@ -481,6 +483,8 @@
"create_new_person": "Crea nuova persona", "create_new_person": "Crea nuova persona",
"create_new_person_hint": "Assegna gli asset selezionati a una nuova persona", "create_new_person_hint": "Assegna gli asset selezionati a una nuova persona",
"create_new_user": "Crea nuovo utente", "create_new_user": "Crea nuovo utente",
"create_tag": "Crea tag",
"create_tag_description": "Crea un nuova tag. Per i tag annidati, si prega di inserire il percorso completo del tag tra cui slash in avanti.",
"create_user": "Crea utente", "create_user": "Crea utente",
"created": "Creato", "created": "Creato",
"current_device": "Dispositivo corrente", "current_device": "Dispositivo corrente",
@@ -504,6 +508,8 @@
"delete_library": "Elimina libreria", "delete_library": "Elimina libreria",
"delete_link": "Elimina link", "delete_link": "Elimina link",
"delete_shared_link": "Elimina link condiviso", "delete_shared_link": "Elimina link condiviso",
"delete_tag": "Elimina tag",
"delete_tag_confirmation_prompt": "Sei sicuro di voler cancellare il tag {tagName}?",
"delete_user": "Elimina utente", "delete_user": "Elimina utente",
"deleted_shared_link": "Elimina link condiviso", "deleted_shared_link": "Elimina link condiviso",
"description": "Descrizione", "description": "Descrizione",
@@ -552,6 +558,7 @@
"edit_location": "Modifica posizione", "edit_location": "Modifica posizione",
"edit_name": "Modifica nome", "edit_name": "Modifica nome",
"edit_people": "Modifica persone", "edit_people": "Modifica persone",
"edit_tag": "Modifica tag",
"edit_title": "Modifica Titolo", "edit_title": "Modifica Titolo",
"edit_user": "Modifica utente", "edit_user": "Modifica utente",
"edited": "Modificato", "edited": "Modificato",
@@ -709,6 +716,7 @@
"expired": "Scaduto", "expired": "Scaduto",
"expires_date": "Scade il {date}", "expires_date": "Scade il {date}",
"explore": "Esplora", "explore": "Esplora",
"explorer": "Esplora",
"export": "Esporta", "export": "Esporta",
"export_as_json": "Esporta come JSON", "export_as_json": "Esporta come JSON",
"extension": "Estensione", "extension": "Estensione",
@@ -722,6 +730,8 @@
"feature": "", "feature": "",
"feature_photo_updated": "Foto in evidenza aggiornata", "feature_photo_updated": "Foto in evidenza aggiornata",
"featurecollection": "", "featurecollection": "",
"features": "Funzionalità",
"features_setting_description": "Gestisci le funzionalità dell'app",
"file_name": "Nome file", "file_name": "Nome file",
"file_name_or_extension": "Nome file o estensione", "file_name_or_extension": "Nome file o estensione",
"filename": "Nome file", "filename": "Nome file",
@@ -730,6 +740,8 @@
"filter_people": "Filtra persone", "filter_people": "Filtra persone",
"find_them_fast": "Trovale velocemente con la ricerca", "find_them_fast": "Trovale velocemente con la ricerca",
"fix_incorrect_match": "Correggi corrispondenza errata", "fix_incorrect_match": "Correggi corrispondenza errata",
"folders": "Cartelle",
"folders_feature_description": "Navigare la visualizzazione a cartelle per le foto e i video sul file system",
"force_re-scan_library_files": "Forza nuova scansione di tutti i file della libreria", "force_re-scan_library_files": "Forza nuova scansione di tutti i file della libreria",
"forward": "Avanti", "forward": "Avanti",
"general": "Generale", "general": "Generale",
@@ -964,6 +976,7 @@
"pending": "In attesa", "pending": "In attesa",
"people": "Persone", "people": "Persone",
"people_edits_count": "{count, plural, one {Modificata # persona} other {Modificate # persone}}", "people_edits_count": "{count, plural, one {Modificata # persona} other {Modificate # persone}}",
"people_feature_description": "Navigare foto e video raggruppati da persone",
"people_sidebar_description": "Mostra un link alle persone nella barra laterale", "people_sidebar_description": "Mostra un link alle persone nella barra laterale",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "Avviso eliminazione permanente", "permanent_deletion_warning": "Avviso eliminazione permanente",
@@ -1034,6 +1047,7 @@
"purchase_settings_server_activated": "La chiave del prodotto del server è gestita dall'amministratore", "purchase_settings_server_activated": "La chiave del prodotto del server è gestita dall'amministratore",
"range": "", "range": "",
"rating": "Valutazione a stelle", "rating": "Valutazione a stelle",
"rating_clear": "Crea valutazione",
"rating_description": "Visualizza la valutazione EXIF nel pannello informazioni", "rating_description": "Visualizza la valutazione EXIF nel pannello informazioni",
"raw": "", "raw": "",
"reaction_options": "Impostazioni Reazioni", "reaction_options": "Impostazioni Reazioni",
@@ -1116,6 +1130,7 @@
"search_people": "Cerca persone", "search_people": "Cerca persone",
"search_places": "Cerca luoghi", "search_places": "Cerca luoghi",
"search_state": "Cerca stato...", "search_state": "Cerca stato...",
"search_tags": "Cerca tag...",
"search_timezone": "Cerca fuso orario...", "search_timezone": "Cerca fuso orario...",
"search_type": "Cerca tipo", "search_type": "Cerca tipo",
"search_your_photos": "Cerca le tue foto", "search_your_photos": "Cerca le tue foto",
@@ -1184,6 +1199,8 @@
"show_supporter_badge": "Medaglia di Contributore", "show_supporter_badge": "Medaglia di Contributore",
"show_supporter_badge_description": "Mostra la medaglia di contributore", "show_supporter_badge_description": "Mostra la medaglia di contributore",
"shuffle": "Casuale", "shuffle": "Casuale",
"sidebar": "Barra laterale",
"sidebar_display_description": "Visualizzare un link alla vista nella barra laterale",
"sign_out": "Esci", "sign_out": "Esci",
"sign_up": "Registrati", "sign_up": "Registrati",
"size": "Dimensione", "size": "Dimensione",
@@ -1220,6 +1237,13 @@
"sunrise_on_the_beach": "Tramonto sulla spiaggia", "sunrise_on_the_beach": "Tramonto sulla spiaggia",
"swap_merge_direction": "Scambia direzione di unione", "swap_merge_direction": "Scambia direzione di unione",
"sync": "Sincronizza", "sync": "Sincronizza",
"tag": "Tag",
"tag_assets": "Tagga risorse",
"tag_created": "Tag creata: {tag}",
"tag_feature_description": "Navigazione foto e video raggruppati per argomenti tag logici",
"tag_not_found_question": "Non riesci a trovare una tag? Creane una <link>qui</link>",
"tag_updated": "Tag {tag} aggiornata",
"tags": "Tag",
"template": "Modello", "template": "Modello",
"theme": "Tema", "theme": "Tema",
"theme_selection": "Selezione tema", "theme_selection": "Selezione tema",
@@ -1231,9 +1255,10 @@
"to_change_password": "Modifica password", "to_change_password": "Modifica password",
"to_favorite": "Preferito", "to_favorite": "Preferito",
"to_login": "Login", "to_login": "Login",
"to_root": "Alla radice",
"to_trash": "Cancella", "to_trash": "Cancella",
"toggle_settings": "Attiva/disattiva impostazioni", "toggle_settings": "Attiva/disattiva impostazioni",
"toggle_theme": "Cambia tema", "toggle_theme": "Abilita tema scuro",
"toggle_visibility": "Cambia visibilità", "toggle_visibility": "Cambia visibilità",
"total_usage": "Utilizzo totale", "total_usage": "Utilizzo totale",
"trash": "Cestino", "trash": "Cestino",
@@ -1255,6 +1280,7 @@
"unlink_oauth": "Scollega OAuth", "unlink_oauth": "Scollega OAuth",
"unlinked_oauth_account": "Scollega account OAuth", "unlinked_oauth_account": "Scollega account OAuth",
"unnamed_album": "Album senza nome", "unnamed_album": "Album senza nome",
"unnamed_album_delete_confirmation": "Sei sicuro di voler eliminare questo album?",
"unnamed_share": "Condivisione senza nome", "unnamed_share": "Condivisione senza nome",
"unsaved_change": "Modifica non salvata", "unsaved_change": "Modifica non salvata",
"unselect_all": "Deseleziona tutto", "unselect_all": "Deseleziona tutto",
@@ -1303,6 +1329,7 @@
"view_album": "Visualizza Album", "view_album": "Visualizza Album",
"view_all": "Vedi tutto", "view_all": "Vedi tutto",
"view_all_users": "Visualizza tutti gli utenti", "view_all_users": "Visualizza tutti gli utenti",
"view_in_timeline": "Visualizza in timeline",
"view_links": "Visualizza i link", "view_links": "Visualizza i link",
"view_next_asset": "Visualizza risorsa successiva", "view_next_asset": "Visualizza risorsa successiva",
"view_previous_asset": "Visualizza risorsa precedente", "view_previous_asset": "Visualizza risorsa precedente",

View File

@@ -49,8 +49,8 @@
"external_library_created_at": "外部ライブラリ(作成日:{date}", "external_library_created_at": "外部ライブラリ(作成日:{date}",
"external_library_management": "外部ライブラリ管理", "external_library_management": "外部ライブラリ管理",
"face_detection": "顔検出", "face_detection": "顔検出",
"face_detection_description": "機械学習を使用してアセット内の顔を検出します。動画の場合は、サムネイルのみが対象となります。\"All\" はすべてのアセットを(再)処理します。 \"Missing\" はまだ処理されていないアセットをキューに入れます。顔検出の完了後、検出された顔は顔認識のキューへ入れられ、既存または新規の人物にグループ化されます。", "face_detection_description": "機械学習を使用してアセット内の顔を検出します。動画の場合は、サムネイルのみが対象となります。\"すべて\" はすべてのアセットを(再)処理します。 \"欠落\" はまだ処理されていないアセットをキューに入れます。顔検出の完了後、検出された顔は顔認識のキューへ入れられ、既存または新規の人物にグループ化されます。",
"facial_recognition_job_description": "検出された顔を人物にグループ化します。このステップは顔検出が完了した後に実行されます。 \"All\" はすべての顔を(再)クラスタリングし、 \"Missing\" は人物が割り当てられていない顔をキューに入れます。", "facial_recognition_job_description": "検出された顔を人物にグループ化します。このステップは顔検出が完了した後に実行されます。 \"すべて\" はすべての顔を(再)クラスタリングし、 \"欠落\" は人物が割り当てられていない顔をキューに入れます。",
"failed_job_command": "ジョブ {job}のコマンド {command}が失敗しました", "failed_job_command": "ジョブ {job}のコマンド {command}が失敗しました",
"force_delete_user_warning": "警告:この操作を行うと、ユーザーとすべてのアセットが直ちに削除されます。これは元に戻せず、ファイルも復元できません。", "force_delete_user_warning": "警告:この操作を行うと、ユーザーとすべてのアセットが直ちに削除されます。これは元に戻せず、ファイルも復元できません。",
"forcing_refresh_library_files": "すべてのライブラリファイルを強制更新", "forcing_refresh_library_files": "すべてのライブラリファイルを強制更新",
@@ -560,7 +560,7 @@
"edit_tag": "タグを編集する", "edit_tag": "タグを編集する",
"edit_title": "タイトルを編集", "edit_title": "タイトルを編集",
"edit_user": "ユーザーを編集", "edit_user": "ユーザーを編集",
"edited": "変更を保存しました", "edited": "編集しました",
"editor": "編集画面", "editor": "編集画面",
"editor_close_without_save_prompt": "変更は破棄されます", "editor_close_without_save_prompt": "変更は破棄されます",
"editor_close_without_save_title": "編集画面を閉じますか?", "editor_close_without_save_title": "編集画面を閉じますか?",
@@ -859,7 +859,7 @@
"merged_people_count": "{count, plural, one {#人} other {#人}}の人物を統合しました", "merged_people_count": "{count, plural, one {#人} other {#人}}の人物を統合しました",
"minimize": "最小化", "minimize": "最小化",
"minute": "分", "minute": "分",
"missing": "行方不明", "missing": "欠落",
"model": "モデル", "model": "モデル",
"month": "月", "month": "月",
"more": "もっと表示", "more": "もっと表示",
@@ -1073,7 +1073,7 @@
"restore": "復元", "restore": "復元",
"restore_all": "全て復元", "restore_all": "全て復元",
"restore_user": "ユーザーを復元", "restore_user": "ユーザーを復元",
"restored_asset": "復元されたアセット", "restored_asset": "アセットを復元しました",
"resume": "再開", "resume": "再開",
"retry_upload": "アップロードを再試行", "retry_upload": "アップロードを再試行",
"review_duplicates": "重複を調査", "review_duplicates": "重複を調査",
@@ -1215,6 +1215,7 @@
"tag": "タグ付けする", "tag": "タグ付けする",
"tag_assets": "アセットにタグ付けする", "tag_assets": "アセットにタグ付けする",
"tag_created": "タグ: {tag} を作成しました", "tag_created": "タグ: {tag} を作成しました",
"tag_not_found_question": "タグが見つかりませんか? <link>こちら</link>からタグを作成できます",
"tag_updated": "タグ: {tag} を更新しました", "tag_updated": "タグ: {tag} を更新しました",
"tagged_assets": "{count, plural, one {#個のアセット} other {#個のアセット}}をタグ付けしました", "tagged_assets": "{count, plural, one {#個のアセット} other {#個のアセット}}をタグ付けしました",
"tags": "タグ", "tags": "タグ",

View File

@@ -1,7 +1,8 @@
{ {
"account": "", "about": "دەربارە",
"account_settings": "", "account": "هەژمار",
"acknowledge": "", "account_settings": "ڕێکخستنی هەژمار",
"acknowledge": "دانپێدانان",
"action": "", "action": "",
"actions": "", "actions": "",
"active": "", "active": "",

View File

@@ -34,8 +34,8 @@
"authentication_settings_reenable": "다시 활성화하려면 <link>서버 커맨드</link>를 사용하세요.", "authentication_settings_reenable": "다시 활성화하려면 <link>서버 커맨드</link>를 사용하세요.",
"background_task_job": "백그라운드 작업", "background_task_job": "백그라운드 작업",
"check_all": "모두 확인", "check_all": "모두 확인",
"cleared_jobs": "{job} 작업 중단됨", "cleared_jobs": "작업 중단: {job}",
"config_set_by_file": "업로드한 설정 파일이 현재 설정에 적용됩니다.", "config_set_by_file": "현재 설정은 구성 파일에 의해 관리됩니다.",
"confirm_delete_library": "{library} 라이브러리를 삭제하시겠습니까?", "confirm_delete_library": "{library} 라이브러리를 삭제하시겠습니까?",
"confirm_delete_library_assets": "이 라이브러리를 삭제하시겠습니까? Immich에서 항목 {count, plural, one {#개} other {#개}}가 삭제되며 되돌릴 수 없습니다. 원본 파일은 삭제되지 않습니다.", "confirm_delete_library_assets": "이 라이브러리를 삭제하시겠습니까? Immich에서 항목 {count, plural, one {#개} other {#개}}가 삭제되며 되돌릴 수 없습니다. 원본 파일은 삭제되지 않습니다.",
"confirm_email_below": "계속 진행하려면 아래에 \"{email}\" 입력", "confirm_email_below": "계속 진행하려면 아래에 \"{email}\" 입력",
@@ -174,7 +174,7 @@
"oauth_issuer_url": "발급자 URL", "oauth_issuer_url": "발급자 URL",
"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": "'app.immich:/'가 잘못된 리다이렉트 URI인 경우 활성화하세요.", "oauth_mobile_redirect_uri_override_description": "OAuth 공급자가 '{callback}' 과 같은 모바일 URI를 제공하지 않는 경우 활성화하세요.",
"oauth_profile_signing_algorithm": "사용자 정보 서명 알고리즘", "oauth_profile_signing_algorithm": "사용자 정보 서명 알고리즘",
"oauth_profile_signing_algorithm_description": "사용자 정보 서명에 사용되는 알고리즘을 선택합니다.", "oauth_profile_signing_algorithm_description": "사용자 정보 서명에 사용되는 알고리즘을 선택합니다.",
"oauth_scope": "스코프", "oauth_scope": "스코프",
@@ -449,6 +449,7 @@
"close": "닫기", "close": "닫기",
"collapse": "접기", "collapse": "접기",
"collapse_all": "모두 접기", "collapse_all": "모두 접기",
"color": "색상",
"color_theme": "테마 색상", "color_theme": "테마 색상",
"comment_deleted": "댓글이 삭제되었습니다.", "comment_deleted": "댓글이 삭제되었습니다.",
"comment_options": "댓글 옵션", "comment_options": "댓글 옵션",
@@ -482,6 +483,8 @@
"create_new_person": "인물 생성", "create_new_person": "인물 생성",
"create_new_person_hint": "선택한 항목의 인물을 새 인물로 변경", "create_new_person_hint": "선택한 항목의 인물을 새 인물로 변경",
"create_new_user": "사용자 생성", "create_new_user": "사용자 생성",
"create_tag": "태그 생성",
"create_tag_description": "새 태그를 생성합니다. 하위 태그의 경우 /를 포함한 전체 태그명을 입력하세요.",
"create_user": "사용자 생성", "create_user": "사용자 생성",
"created": "생성됨", "created": "생성됨",
"current_device": "현재 기기", "current_device": "현재 기기",
@@ -505,6 +508,8 @@
"delete_library": "라이브러리 삭제", "delete_library": "라이브러리 삭제",
"delete_link": "링크 삭제", "delete_link": "링크 삭제",
"delete_shared_link": "공유 링크 삭제", "delete_shared_link": "공유 링크 삭제",
"delete_tag": "태그 삭제",
"delete_tag_confirmation_prompt": "{tagName} 태그를 삭제하시겠습니까?",
"delete_user": "사용자 삭제", "delete_user": "사용자 삭제",
"deleted_shared_link": "공유 링크가 삭제되었습니다.", "deleted_shared_link": "공유 링크가 삭제되었습니다.",
"description": "설명", "description": "설명",
@@ -522,6 +527,8 @@
"do_not_show_again": "다시 표시하지 않음", "do_not_show_again": "다시 표시하지 않음",
"done": "완료", "done": "완료",
"download": "다운로드", "download": "다운로드",
"download_include_embedded_motion_videos": "내장된 동영상",
"download_include_embedded_motion_videos_description": "모션 포토에 내장된 동영상을 개별 파일로 포함",
"download_settings": "다운로드", "download_settings": "다운로드",
"download_settings_description": "다운로드 설정 관리", "download_settings_description": "다운로드 설정 관리",
"downloading": "다운로드", "downloading": "다운로드",
@@ -551,6 +558,7 @@
"edit_location": "위치 변경", "edit_location": "위치 변경",
"edit_name": "이름 변경", "edit_name": "이름 변경",
"edit_people": "인물 변경", "edit_people": "인물 변경",
"edit_tag": "태그 편집",
"edit_title": "제목 변경", "edit_title": "제목 변경",
"edit_user": "사용자 수정", "edit_user": "사용자 수정",
"edited": "펀집되었습니다.", "edited": "펀집되었습니다.",
@@ -708,6 +716,7 @@
"expired": "만료됨", "expired": "만료됨",
"expires_date": "{date} 만료", "expires_date": "{date} 만료",
"explore": "탐색", "explore": "탐색",
"explorer": "탐색기",
"export": "내보내기", "export": "내보내기",
"export_as_json": "JSON으로 내보내기", "export_as_json": "JSON으로 내보내기",
"extension": "확장자", "extension": "확장자",
@@ -721,6 +730,8 @@
"feature": "", "feature": "",
"feature_photo_updated": "대표 사진이 설정되었습니다.", "feature_photo_updated": "대표 사진이 설정되었습니다.",
"featurecollection": "", "featurecollection": "",
"features": "기능",
"features_setting_description": "앱 기능 관리",
"file_name": "파일 이름", "file_name": "파일 이름",
"file_name_or_extension": "파일명 또는 확장자", "file_name_or_extension": "파일명 또는 확장자",
"filename": "파일명", "filename": "파일명",
@@ -730,6 +741,7 @@
"find_them_fast": "이름으로 검색하여 빠르게 찾기", "find_them_fast": "이름으로 검색하여 빠르게 찾기",
"fix_incorrect_match": "잘못된 분류 수정", "fix_incorrect_match": "잘못된 분류 수정",
"folders": "폴더", "folders": "폴더",
"folders_feature_description": "파일 시스템의 사진 및 동영상을 폴더 뷰로 탐색",
"force_re-scan_library_files": "모든 파일 강제 다시 스캔", "force_re-scan_library_files": "모든 파일 강제 다시 스캔",
"forward": "앞으로", "forward": "앞으로",
"general": "일반", "general": "일반",
@@ -948,6 +960,7 @@
"pending": "진행 중", "pending": "진행 중",
"people": "인물", "people": "인물",
"people_edits_count": "인물 {count, plural, one {#명} other {#명}}을 변경했습니다.", "people_edits_count": "인물 {count, plural, one {#명} other {#명}}을 변경했습니다.",
"people_feature_description": "사진 및 동영상을 인물 그룹별로 탐색",
"people_sidebar_description": "사이드바에 인물 링크 표시", "people_sidebar_description": "사이드바에 인물 링크 표시",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "영구 삭제 경고", "permanent_deletion_warning": "영구 삭제 경고",
@@ -1054,6 +1067,7 @@
"removed_from_archive": "보관함에서 제거되었습니다.", "removed_from_archive": "보관함에서 제거되었습니다.",
"removed_from_favorites": "즐겨찾기에서 제거되었습니다.", "removed_from_favorites": "즐겨찾기에서 제거되었습니다.",
"removed_from_favorites_count": "즐겨찾기에서 항목 {count, plural, other {#개}} 제거됨", "removed_from_favorites_count": "즐겨찾기에서 항목 {count, plural, other {#개}} 제거됨",
"removed_tagged_assets": "항목 {count, plural, one {#개} other {#개}}에서 태그를 제거함",
"rename": "이름 바꾸기", "rename": "이름 바꾸기",
"repair": "수리", "repair": "수리",
"repair_no_results_message": "추적되지 않거나 누락된 파일이 이곳에 표시됩니다.", "repair_no_results_message": "추적되지 않거나 누락된 파일이 이곳에 표시됩니다.",
@@ -1103,6 +1117,7 @@
"search_people": "인물 검색", "search_people": "인물 검색",
"search_places": "장소 검색", "search_places": "장소 검색",
"search_state": "지역 검색...", "search_state": "지역 검색...",
"search_tags": "태그로 검색...",
"search_timezone": "시간대 검색...", "search_timezone": "시간대 검색...",
"search_type": "검색 종류", "search_type": "검색 종류",
"search_your_photos": "사진 검색", "search_your_photos": "사진 검색",
@@ -1171,6 +1186,8 @@
"show_supporter_badge": "서포터 배지", "show_supporter_badge": "서포터 배지",
"show_supporter_badge_description": "서포터 배지 표시", "show_supporter_badge_description": "서포터 배지 표시",
"shuffle": "셔플", "shuffle": "셔플",
"sidebar": "사이드바",
"sidebar_display_description": "뷰 링크를 사이드바에 표시",
"sign_out": "로그아웃", "sign_out": "로그아웃",
"sign_up": "로그인", "sign_up": "로그인",
"size": "크기", "size": "크기",
@@ -1207,6 +1224,14 @@
"sunrise_on_the_beach": "동해안에서 맞이하는 새해 일출", "sunrise_on_the_beach": "동해안에서 맞이하는 새해 일출",
"swap_merge_direction": "병합 방향 변경", "swap_merge_direction": "병합 방향 변경",
"sync": "동기화", "sync": "동기화",
"tag": "태그",
"tag_assets": "항목 태그",
"tag_created": "{tag} 태그가 생성되었습니다.",
"tag_feature_description": "사진 및 동영상을 주제별 그룹화된 태그로 탐색",
"tag_not_found_question": "태그를 찾을 수 없나요? <link>이곳</link>에서 생성하세요.",
"tag_updated": "{tag} 태그를 수정했습니다.",
"tagged_assets": "항목 {count, plural, one {#개} other {#개}}에 태그를 적용함",
"tags": "태그",
"template": "템플릿", "template": "템플릿",
"theme": "테마", "theme": "테마",
"theme_selection": "테마 설정", "theme_selection": "테마 설정",
@@ -1218,6 +1243,7 @@
"to_change_password": "비밀번호 변경", "to_change_password": "비밀번호 변경",
"to_favorite": "즐겨찾기", "to_favorite": "즐겨찾기",
"to_login": "로그인", "to_login": "로그인",
"to_root": "루트",
"to_trash": "삭제", "to_trash": "삭제",
"toggle_settings": "설정 변경", "toggle_settings": "설정 변경",
"toggle_theme": "다크 모드 사용", "toggle_theme": "다크 모드 사용",
@@ -1289,6 +1315,7 @@
"view_album": "앨범 보기", "view_album": "앨범 보기",
"view_all": "모두 보기", "view_all": "모두 보기",
"view_all_users": "모든 사용자 보기", "view_all_users": "모든 사용자 보기",
"view_in_timeline": "타임라인에서 보기",
"view_links": "링크 보기", "view_links": "링크 보기",
"view_next_asset": "다음 항목 보기", "view_next_asset": "다음 항목 보기",
"view_previous_asset": "이전 항목 보기", "view_previous_asset": "이전 항목 보기",

View File

@@ -1026,5 +1026,5 @@
"welcome_to_immich": "", "welcome_to_immich": "",
"year": "Metai", "year": "Metai",
"yes": "Taip", "yes": "Taip",
"zoom_image": "" "zoom_image": "Priartinti vaizdą"
} }

View File

@@ -1245,6 +1245,7 @@
"tag_assets": "Assets taggen", "tag_assets": "Assets taggen",
"tag_created": "Tag aangemaakt: {tag}", "tag_created": "Tag aangemaakt: {tag}",
"tag_feature_description": "Bladeren door foto's en video's gegroepeerd op tags", "tag_feature_description": "Bladeren door foto's en video's gegroepeerd op tags",
"tag_not_found_question": "Kun je een tag niet vinden? Maak er <link>hier</link> een aan",
"tag_updated": "Tag bijgewerkt: {tag}", "tag_updated": "Tag bijgewerkt: {tag}",
"tagged_assets": "{count, plural, one {# asset} other {# assets}} getagd", "tagged_assets": "{count, plural, one {# asset} other {# assets}} getagd",
"tags": "Tags", "tags": "Tags",

View File

@@ -174,7 +174,7 @@
"oauth_issuer_url": "Adres URL wydawcy", "oauth_issuer_url": "Adres URL wydawcy",
"oauth_mobile_redirect_uri": "Mobilny adres zwrotny", "oauth_mobile_redirect_uri": "Mobilny adres zwrotny",
"oauth_mobile_redirect_uri_override": "Zapasowy URI przekierowania mobilnego", "oauth_mobile_redirect_uri_override": "Zapasowy URI przekierowania mobilnego",
"oauth_mobile_redirect_uri_override_description": "Włącz, gdy „app.immich:/” jest nieprawidłowym identyfikatorem URI przekierowania.", "oauth_mobile_redirect_uri_override_description": "Włącz, gdy dostawca OAuth nie pozwala na mobilne identyfikatory URI typu '{callback}'",
"oauth_profile_signing_algorithm": "Algorytm logowania do profilu", "oauth_profile_signing_algorithm": "Algorytm logowania do profilu",
"oauth_profile_signing_algorithm_description": "Algorytm używany podczas logowania do profilu użytkownika.", "oauth_profile_signing_algorithm_description": "Algorytm używany podczas logowania do profilu użytkownika.",
"oauth_scope": "Zakres", "oauth_scope": "Zakres",
@@ -222,7 +222,7 @@
"storage_template_date_time_sample": "Przykładowy czas {date}", "storage_template_date_time_sample": "Przykładowy czas {date}",
"storage_template_enable_description": "Włącz silnik szablonów magazynu", "storage_template_enable_description": "Włącz silnik szablonów magazynu",
"storage_template_hash_verification_enabled": "Weryfikacja hashu włączona", "storage_template_hash_verification_enabled": "Weryfikacja hashu włączona",
"storage_template_hash_verification_enabled_description": "Włącza weryfikację hasha. Nie wyłączaj tej opcji, jeśli nie jesteś pewien konsekwencji", "storage_template_hash_verification_enabled_description": "Włącza weryfikację sumy kontrolnej. Nie wyłączaj tej opcji, jeśli nie jesteś pewien konsekwencji",
"storage_template_migration": "Migracja szablonu magazynu", "storage_template_migration": "Migracja szablonu magazynu",
"storage_template_migration_description": "Zastosuj aktualny szablon <link>{template}</link> do wcześniej przesłanych zasobów", "storage_template_migration_description": "Zastosuj aktualny szablon <link>{template}</link> do wcześniej przesłanych zasobów",
"storage_template_migration_info": "Zmiany w szablonie zostaną zastosowane tylko do nowych zasobów. Aby wstecznie zastosować szablon do wcześniej przesłanych zasobów, uruchom zadanie <link>{job}</link>.", "storage_template_migration_info": "Zmiany w szablonie zostaną zastosowane tylko do nowych zasobów. Aby wstecznie zastosować szablon do wcześniej przesłanych zasobów, uruchom zadanie <link>{job}</link>.",
@@ -449,6 +449,7 @@
"close": "Zamknij", "close": "Zamknij",
"collapse": "Zwiń", "collapse": "Zwiń",
"collapse_all": "Zwiń wszystko", "collapse_all": "Zwiń wszystko",
"color": "Kolor",
"color_theme": "Motyw kolorów", "color_theme": "Motyw kolorów",
"comment_deleted": "Usunięto komentarz", "comment_deleted": "Usunięto komentarz",
"comment_options": "Opcje komentarza", "comment_options": "Opcje komentarza",
@@ -482,6 +483,8 @@
"create_new_person": "Stwórz nową osobę", "create_new_person": "Stwórz nową osobę",
"create_new_person_hint": "Przypisz wybrane zasoby do nowej osoby", "create_new_person_hint": "Przypisz wybrane zasoby do nowej osoby",
"create_new_user": "Stwórz nowego użytkownika", "create_new_user": "Stwórz nowego użytkownika",
"create_tag": "Stwórz etykietę",
"create_tag_description": "Stwórz nową etykietę. Dla etykiet zagnieżdżonych, wprowadź pełną ścieżkę etykiety zawierającą ukośniki.",
"create_user": "Stwórz użytkownika", "create_user": "Stwórz użytkownika",
"created": "Utworzono", "created": "Utworzono",
"current_device": "Obecne urządzenie", "current_device": "Obecne urządzenie",
@@ -505,6 +508,8 @@
"delete_library": "Usuń bibliotekę", "delete_library": "Usuń bibliotekę",
"delete_link": "Usuń link", "delete_link": "Usuń link",
"delete_shared_link": "Usuń udostępniony link", "delete_shared_link": "Usuń udostępniony link",
"delete_tag": "Usuń etykietę",
"delete_tag_confirmation_prompt": "Czy jesteś pewny(a), że chcesz usunąć etykietę {tagName}?",
"delete_user": "Usuń użytkownika", "delete_user": "Usuń użytkownika",
"deleted_shared_link": "Pomyślnie usunięto udostępniony link", "deleted_shared_link": "Pomyślnie usunięto udostępniony link",
"description": "Opis", "description": "Opis",
@@ -553,6 +558,7 @@
"edit_location": "Edytuj lokalizację", "edit_location": "Edytuj lokalizację",
"edit_name": "Edytuj imię", "edit_name": "Edytuj imię",
"edit_people": "Edytuj osoby", "edit_people": "Edytuj osoby",
"edit_tag": "Edytuj etykietę",
"edit_title": "Edytuj Tytuł", "edit_title": "Edytuj Tytuł",
"edit_user": "Edytuj użytkownika", "edit_user": "Edytuj użytkownika",
"edited": "Edytowane", "edited": "Edytowane",
@@ -710,6 +716,7 @@
"expired": "Wygasły", "expired": "Wygasły",
"expires_date": "Wygasa {date}", "expires_date": "Wygasa {date}",
"explore": "Przeglądaj", "explore": "Przeglądaj",
"explorer": "Eksplorator",
"export": "Eksportuj", "export": "Eksportuj",
"export_as_json": "Eksportuj jako JSON", "export_as_json": "Eksportuj jako JSON",
"extension": "Rozszerzenie", "extension": "Rozszerzenie",
@@ -723,6 +730,8 @@
"feature": "", "feature": "",
"feature_photo_updated": "Pomyślnie zmieniono główne zdjęcie", "feature_photo_updated": "Pomyślnie zmieniono główne zdjęcie",
"featurecollection": "", "featurecollection": "",
"features": "Funkcje",
"features_setting_description": "Zarządzaj funkcjami aplikacji",
"file_name": "Nazwa pliku", "file_name": "Nazwa pliku",
"file_name_or_extension": "Nazwie lub rozszerzeniu pliku", "file_name_or_extension": "Nazwie lub rozszerzeniu pliku",
"filename": "Nazwa pliku", "filename": "Nazwa pliku",
@@ -732,6 +741,7 @@
"find_them_fast": "Wyszukuj szybciej przypisując nazwę", "find_them_fast": "Wyszukuj szybciej przypisując nazwę",
"fix_incorrect_match": "Napraw nieprawidłowe dopasowanie", "fix_incorrect_match": "Napraw nieprawidłowe dopasowanie",
"folders": "Foldery", "folders": "Foldery",
"folders_feature_description": "Przeglądanie zdjęć i filmów w widoku folderów",
"force_re-scan_library_files": "Wymuś ponowne przeskanowanie wszystkich plików biblioteki", "force_re-scan_library_files": "Wymuś ponowne przeskanowanie wszystkich plików biblioteki",
"forward": "Do przodu", "forward": "Do przodu",
"general": "Ogólne", "general": "Ogólne",
@@ -941,6 +951,7 @@
"pending": "Oczekujące", "pending": "Oczekujące",
"people": "Osoby", "people": "Osoby",
"people_edits_count": "Edytowano {count, plural, one {# osoba} few {# osoby} many {# osób} other {# osób}}", "people_edits_count": "Edytowano {count, plural, one {# osoba} few {# osoby} many {# osób} other {# osób}}",
"people_feature_description": "Przeglądanie zdjęć i filmów pogrupowanych według osób",
"people_sidebar_description": "Pokazuj link do Osób w panelu bocznym", "people_sidebar_description": "Pokazuj link do Osób w panelu bocznym",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "Ostrzeżenie o trwałym usunięciu", "permanent_deletion_warning": "Ostrzeżenie o trwałym usunięciu",
@@ -1011,8 +1022,9 @@
"purchase_settings_server_activated": "Klucz produktu serwera jest zarządzany przez administratora", "purchase_settings_server_activated": "Klucz produktu serwera jest zarządzany przez administratora",
"range": "", "range": "",
"rating": "Ocena gwiazdkowa", "rating": "Ocena gwiazdkowa",
"rating_count": "{count, plural, one {# star} other {# stars}}", "rating_clear": "Wyczyść oceną",
"rating_description": "Wyświetl ocenę EXIF w panelu informacji", "rating_count": "{count, plural, one {# gwiazdka} other {# gwiazdek}}",
"rating_description": "Wyświetl ocenę z EXIF w panelu informacji",
"raw": "", "raw": "",
"reaction_options": "Opcje reakcji", "reaction_options": "Opcje reakcji",
"read_changelog": "Zobacz Zmiany", "read_changelog": "Zobacz Zmiany",
@@ -1045,6 +1057,7 @@
"removed_from_archive": "Usunięto z archiwum", "removed_from_archive": "Usunięto z archiwum",
"removed_from_favorites": "Usunięto z ulubionych", "removed_from_favorites": "Usunięto z ulubionych",
"removed_from_favorites_count": "{count, plural, other {Usunięto #}} z ulubionych", "removed_from_favorites_count": "{count, plural, other {Usunięto #}} z ulubionych",
"removed_tagged_assets": "Usunięto etykietę z {count, plural, one {# zasobu} other {# zasobów}}",
"rename": "Zmień nazwę", "rename": "Zmień nazwę",
"repair": "Napraw", "repair": "Napraw",
"repair_no_results_message": "Tutaj pojawią się nieśledzone i brakujące pliki", "repair_no_results_message": "Tutaj pojawią się nieśledzone i brakujące pliki",
@@ -1093,7 +1106,8 @@
"search_no_people_named": "Brak osób nazwanych \"{name}\"", "search_no_people_named": "Brak osób nazwanych \"{name}\"",
"search_people": "Wyszukaj osoby", "search_people": "Wyszukaj osoby",
"search_places": "Wyszukaj miejsca", "search_places": "Wyszukaj miejsca",
"search_state": "Wyszukaj byt...", "search_state": "Wyszukaj stan...",
"search_tags": "Wyszukaj etykiety...",
"search_timezone": "Wyszukaj strefę czasową...", "search_timezone": "Wyszukaj strefę czasową...",
"search_type": "Wyszukaj w", "search_type": "Wyszukaj w",
"search_your_photos": "Szukaj swoich zdjęć", "search_your_photos": "Szukaj swoich zdjęć",
@@ -1198,6 +1212,13 @@
"sunrise_on_the_beach": "Wschód słońca na plaży", "sunrise_on_the_beach": "Wschód słońca na plaży",
"swap_merge_direction": "Zmień kierunek złączenia", "swap_merge_direction": "Zmień kierunek złączenia",
"sync": "Synchronizuj", "sync": "Synchronizuj",
"tag": "Etykieta",
"tag_assets": "Zasoby etykiet",
"tag_created": "Utworzono etykietę: {tag}",
"tag_feature_description": "Przeglądanie zdjęć i filmów pogrupowanych według tematów z logiki etykiet",
"tag_not_found_question": "Nie możesz znaleźć etykiety? Utwórz ją <link>tutaj</link>",
"tag_updated": "Uaktualniono etykietę: {tag}",
"tags": "Etykiety",
"template": "Szablon", "template": "Szablon",
"theme": "Motyw", "theme": "Motyw",
"theme_selection": "Wybór motywu", "theme_selection": "Wybór motywu",
@@ -1280,6 +1301,7 @@
"view_album": "Wyświetl Album", "view_album": "Wyświetl Album",
"view_all": "Pokaż wszystkie", "view_all": "Pokaż wszystkie",
"view_all_users": "Pokaż wszystkich użytkowników", "view_all_users": "Pokaż wszystkich użytkowników",
"view_in_timeline": "Pokaż na osi czasu",
"view_links": "Pokaż łącza", "view_links": "Pokaż łącza",
"view_next_asset": "Wyświetl następny zasób", "view_next_asset": "Wyświetl następny zasób",
"view_previous_asset": "Wyświetl poprzedni zasób", "view_previous_asset": "Wyświetl poprzedni zasób",

View File

@@ -448,6 +448,7 @@
"close": "Fechar", "close": "Fechar",
"collapse": "Recolher", "collapse": "Recolher",
"collapse_all": "Colapsar tudo", "collapse_all": "Colapsar tudo",
"color": "Cor",
"color_theme": "Tema de cores", "color_theme": "Tema de cores",
"comment_deleted": "Comentário excluído", "comment_deleted": "Comentário excluído",
"comment_options": "Opções de comentário", "comment_options": "Opções de comentário",
@@ -481,6 +482,7 @@
"create_new_person": "Criar nova pessoa", "create_new_person": "Criar nova pessoa",
"create_new_person_hint": "Atribuir arquivos selecionados a uma nova pessoa", "create_new_person_hint": "Atribuir arquivos selecionados a uma nova pessoa",
"create_new_user": "Criar novo usuário", "create_new_user": "Criar novo usuário",
"create_tag": "Criar tag",
"create_user": "Criar usuário", "create_user": "Criar usuário",
"created": "Criado", "created": "Criado",
"current_device": "Dispositivo atual", "current_device": "Dispositivo atual",
@@ -504,6 +506,8 @@
"delete_library": "Excluir biblioteca", "delete_library": "Excluir biblioteca",
"delete_link": "Excluir link", "delete_link": "Excluir link",
"delete_shared_link": "Excluir link de compartilhamento", "delete_shared_link": "Excluir link de compartilhamento",
"delete_tag": "Remover tag",
"delete_tag_confirmation_prompt": "Tem certeza que deseja excluir a tag {tagName} ?",
"delete_user": "Excluir usuário", "delete_user": "Excluir usuário",
"deleted_shared_link": "Link de compartilhamento excluído", "deleted_shared_link": "Link de compartilhamento excluído",
"description": "Descrição", "description": "Descrição",
@@ -552,6 +556,7 @@
"edit_location": "Editar Localização", "edit_location": "Editar Localização",
"edit_name": "Editar nome", "edit_name": "Editar nome",
"edit_people": "Editar pessoas", "edit_people": "Editar pessoas",
"edit_tag": "Editar tag",
"edit_title": "Editar Título", "edit_title": "Editar Título",
"edit_user": "Editar usuário", "edit_user": "Editar usuário",
"edited": "Editado", "edited": "Editado",
@@ -966,6 +971,7 @@
"pending": "Pendente", "pending": "Pendente",
"people": "Pessoas", "people": "Pessoas",
"people_edits_count": "{count, plural, one {# pessoa editada} other {# pessoas editadas}}", "people_edits_count": "{count, plural, one {# pessoa editada} other {# pessoas editadas}}",
"people_feature_description": "Navegar por fotos e vídeos agrupados por pessoas",
"people_sidebar_description": "Exibe o link Pessoas na barra lateral", "people_sidebar_description": "Exibe o link Pessoas na barra lateral",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "Aviso para deletar permanentemente", "permanent_deletion_warning": "Aviso para deletar permanentemente",
@@ -1037,7 +1043,8 @@
"purchase_settings_server_activated": "A chave do produto para servidor é gerenciada pelo administrador", "purchase_settings_server_activated": "A chave do produto para servidor é gerenciada pelo administrador",
"range": "", "range": "",
"rating": "Estrelas", "rating": "Estrelas",
"rating_description": "Exibir os metadados de classificação (estrelas) no painel de informações", "rating_clear": "Limpar classificação",
"rating_description": "Exibir o EXIF de classificação no painel de informações",
"raw": "", "raw": "",
"reaction_options": "Opções de reação", "reaction_options": "Opções de reação",
"read_changelog": "Ler Novidades", "read_changelog": "Ler Novidades",
@@ -1119,6 +1126,7 @@
"search_people": "Pesquisar pessoas", "search_people": "Pesquisar pessoas",
"search_places": "Pesquisar lugares", "search_places": "Pesquisar lugares",
"search_state": "Pesquisar estado...", "search_state": "Pesquisar estado...",
"search_tags": "Procurar tags...",
"search_timezone": "Pesquisar fuso horário...", "search_timezone": "Pesquisar fuso horário...",
"search_type": "Pesquisar tipo", "search_type": "Pesquisar tipo",
"search_your_photos": "Pesquisar fotos", "search_your_photos": "Pesquisar fotos",
@@ -1187,6 +1195,7 @@
"show_supporter_badge": "Insígnia de Contribuidor", "show_supporter_badge": "Insígnia de Contribuidor",
"show_supporter_badge_description": "Mostrar a insígnia de contribuidor", "show_supporter_badge_description": "Mostrar a insígnia de contribuidor",
"shuffle": "Aleatório", "shuffle": "Aleatório",
"sidebar": "Barra lateral",
"sign_out": "Sair", "sign_out": "Sair",
"sign_up": "Registrar", "sign_up": "Registrar",
"size": "Tamanho", "size": "Tamanho",
@@ -1223,6 +1232,8 @@
"sunrise_on_the_beach": "Nascer do sol na praia", "sunrise_on_the_beach": "Nascer do sol na praia",
"swap_merge_direction": "Alternar direção da mesclagem", "swap_merge_direction": "Alternar direção da mesclagem",
"sync": "Sincronizar", "sync": "Sincronizar",
"tag": "Tag",
"tags": "Tags",
"template": "Modelo", "template": "Modelo",
"theme": "Tema", "theme": "Tema",
"theme_selection": "Selecionar tema", "theme_selection": "Selecionar tema",
@@ -1236,7 +1247,7 @@
"to_login": "Iniciar sessão", "to_login": "Iniciar sessão",
"to_trash": "Mover para a lixeira", "to_trash": "Mover para a lixeira",
"toggle_settings": "Alternar configurações", "toggle_settings": "Alternar configurações",
"toggle_theme": "Alternar tema", "toggle_theme": "Alternar tema escuro",
"toggle_visibility": "Alternar visibilidade", "toggle_visibility": "Alternar visibilidade",
"total_usage": "Utilização total", "total_usage": "Utilização total",
"trash": "Lixeira", "trash": "Lixeira",
@@ -1306,6 +1317,7 @@
"view_album": "Ver álbum", "view_album": "Ver álbum",
"view_all": "Ver tudo", "view_all": "Ver tudo",
"view_all_users": "Ver todos usuários", "view_all_users": "Ver todos usuários",
"view_in_timeline": "Ver na linha do tempo",
"view_links": "Ver links", "view_links": "Ver links",
"view_next_asset": "Ver próximo arquivo", "view_next_asset": "Ver próximo arquivo",
"view_previous_asset": "Ver arquivo anterior", "view_previous_asset": "Ver arquivo anterior",

View File

@@ -219,9 +219,12 @@
"slideshow_duration_description": "Numǎrul de secunde pentru afișarea fiecǎrei imagini", "slideshow_duration_description": "Numǎrul de secunde pentru afișarea fiecǎrei imagini",
"smart_search_job_description": "Rulați machine learning pe active pentru a sprijini căutarea inteligentă", "smart_search_job_description": "Rulați machine learning pe active pentru a sprijini căutarea inteligentă",
"storage_template_date_time_description": "Momentul creării activului este utilizat pentru informațiile privind data și ora", "storage_template_date_time_description": "Momentul creării activului este utilizat pentru informațiile privind data și ora",
"storage_template_enable_description": "", "storage_template_enable_description": "Activați motorul de șabloane de stocare",
"storage_template_hash_verification_enabled": "", "storage_template_hash_verification_enabled": "Verificarea hash este activată",
"storage_template_hash_verification_enabled_description": "", "storage_template_hash_verification_enabled_description": "Activează verificarea hash, nu o dezactivați decât dacă sunteți sigur de implicații",
"storage_template_migration": "Migrarea șablonului de stocare",
"storage_template_migration_description": "Aplicați <link>{template}</link> actual la elementele încărcate anterior",
"storage_template_migration_info": "Modificările de șablon se vor aplica numai materialelor noi. Pentru a aplica retroactiv șablonul la materialele încărcate anterior, rulați <link>{job}</link>.",
"storage_template_migration_job": "", "storage_template_migration_job": "",
"storage_template_settings": "", "storage_template_settings": "",
"storage_template_settings_description": "", "storage_template_settings_description": "",

View File

@@ -49,8 +49,8 @@
"external_library_created_at": "Внешняя библиотека (создана {date})", "external_library_created_at": "Внешняя библиотека (создана {date})",
"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": "ПРЕДУПРЕЖДЕНИЕ: Это приведет к немедленному удалению пользователя и всех ресурсов. Это невозможно отменить, и файлы не могут быть восстановлены.",
"forcing_refresh_library_files": "Принудительное обновление всех файлов библиотеки", "forcing_refresh_library_files": "Принудительное обновление всех файлов библиотеки",
@@ -449,6 +449,7 @@
"close": "Закрыть", "close": "Закрыть",
"collapse": "Свернуть", "collapse": "Свернуть",
"collapse_all": "Свернуть всё", "collapse_all": "Свернуть всё",
"color": "Цвет",
"color_theme": "Цветовая тема", "color_theme": "Цветовая тема",
"comment_deleted": "Комментарий удалён", "comment_deleted": "Комментарий удалён",
"comment_options": "Параметры комментариев", "comment_options": "Параметры комментариев",
@@ -482,6 +483,8 @@
"create_new_person": "Создать нового человека", "create_new_person": "Создать нового человека",
"create_new_person_hint": "Назначить выбранные ресурсы новому человеку", "create_new_person_hint": "Назначить выбранные ресурсы новому человеку",
"create_new_user": "Создать нового пользователя", "create_new_user": "Создать нового пользователя",
"create_tag": "Создать тег",
"create_tag_description": "Создайте новый тег. Для вложенных тегов введите полный путь к тегу, включая слэши.",
"create_user": "Создать пользователя", "create_user": "Создать пользователя",
"created": "Создан", "created": "Создан",
"current_device": "Текущее устройство", "current_device": "Текущее устройство",
@@ -505,6 +508,8 @@
"delete_library": "Удалить библиотеку", "delete_library": "Удалить библиотеку",
"delete_link": "Удалить ссылку", "delete_link": "Удалить ссылку",
"delete_shared_link": "Удалить общую ссылку", "delete_shared_link": "Удалить общую ссылку",
"delete_tag": "Удалить тег",
"delete_tag_confirmation_prompt": "Вы уверены, что хотите удалить тег {tagName}?",
"delete_user": "Удалить пользователя", "delete_user": "Удалить пользователя",
"deleted_shared_link": "Удалена публичная ссылка", "deleted_shared_link": "Удалена публичная ссылка",
"description": "Описание", "description": "Описание",
@@ -553,6 +558,7 @@
"edit_location": "Редактировать местоположение", "edit_location": "Редактировать местоположение",
"edit_name": "Редактировать имя", "edit_name": "Редактировать имя",
"edit_people": "Редактировать человека", "edit_people": "Редактировать человека",
"edit_tag": "Изменить тег",
"edit_title": "Редактировать Заголовок", "edit_title": "Редактировать Заголовок",
"edit_user": "Редактировать пользователя", "edit_user": "Редактировать пользователя",
"edited": "Отредактировано", "edited": "Отредактировано",
@@ -724,6 +730,8 @@
"feature": "", "feature": "",
"feature_photo_updated": "Избранное фото обновлено", "feature_photo_updated": "Избранное фото обновлено",
"featurecollection": "", "featurecollection": "",
"features": "Дополнительные возможности",
"features_setting_description": "Управление дополнительными возможностями приложения",
"file_name": "Имя файла", "file_name": "Имя файла",
"file_name_or_extension": "Имя файла или расширение", "file_name_or_extension": "Имя файла или расширение",
"filename": "Имя файла", "filename": "Имя файла",
@@ -733,6 +741,7 @@
"find_them_fast": "Быстро найдите их по имени с помощью поиска", "find_them_fast": "Быстро найдите их по имени с помощью поиска",
"fix_incorrect_match": "Исправить неправильное соответствие", "fix_incorrect_match": "Исправить неправильное соответствие",
"folders": "Папки", "folders": "Папки",
"folders_feature_description": "Просмотр папок с фотографиями и видео в файловой системе",
"force_re-scan_library_files": "Принудительное повторное сканирование всех файлов библиотеки", "force_re-scan_library_files": "Принудительное повторное сканирование всех файлов библиотеки",
"forward": "Переслать", "forward": "Переслать",
"general": "Общие", "general": "Общие",
@@ -877,7 +886,7 @@
"merged_people_count": "Объединено {count, plural, one {# человек} few {# человека} many {# человек} other {# человека}}", "merged_people_count": "Объединено {count, plural, one {# человек} few {# человека} many {# человек} other {# человека}}",
"minimize": "Минимизировать", "minimize": "Минимизировать",
"minute": "Минута", "minute": "Минута",
"missing": "Отсутствующие", "missing": "Пропущенные",
"model": "Модель", "model": "Модель",
"month": "Месяц", "month": "Месяц",
"more": "Больше", "more": "Больше",
@@ -967,6 +976,7 @@
"pending": "Ожидает", "pending": "Ожидает",
"people": "Люди", "people": "Люди",
"people_edits_count": "Изменено {count, plural, one {# человек} few {# человека} many {# людей} other {# человек}}", "people_edits_count": "Изменено {count, plural, one {# человек} few {# человека} many {# людей} other {# человек}}",
"people_feature_description": "Просмотр фотографий и видео, сгруппированных по людям",
"people_sidebar_description": "Отображать пункт меню \"Люди\" в боковой панели", "people_sidebar_description": "Отображать пункт меню \"Люди\" в боковой панели",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "Предупреждение об удалении", "permanent_deletion_warning": "Предупреждение об удалении",
@@ -1040,7 +1050,7 @@
"rating": "Рейтинг звёзд", "rating": "Рейтинг звёзд",
"rating_clear": "Очистить рейтинг", "rating_clear": "Очистить рейтинг",
"rating_count": "{count, plural, one {# звезда} other {# звезд}}", "rating_count": "{count, plural, one {# звезда} other {# звезд}}",
"rating_description": "Показывать рейтинг exif в панели информации", "rating_description": "Показывать рейтинг в панели информации",
"raw": "", "raw": "",
"reaction_options": "Опции реакций", "reaction_options": "Опции реакций",
"read_changelog": "Прочитать список изменений", "read_changelog": "Прочитать список изменений",
@@ -1073,10 +1083,11 @@
"removed_from_archive": "Удален из архива", "removed_from_archive": "Удален из архива",
"removed_from_favorites": "Удалено из избранного", "removed_from_favorites": "Удалено из избранного",
"removed_from_favorites_count": "{count, plural, other {Удалено #}} из избранного", "removed_from_favorites_count": "{count, plural, other {Удалено #}} из избранного",
"removed_tagged_assets": "Тег для {count, plural, one {# объекта} other {# объектов}} удален",
"rename": "Переименовать", "rename": "Переименовать",
"repair": "Ремонт", "repair": "Ремонт",
"repair_no_results_message": "Здесь будут отображаться неотслеживаемые и отсутствующие файлы", "repair_no_results_message": "Здесь будут отображаться неотслеживаемые и отсутствующие файлы",
"replace_with_upload": "Загрузить и заменить здесь", "replace_with_upload": "Загрузить и заменить",
"repository": "Репозиторий", "repository": "Репозиторий",
"require_password": "Требуется пароль", "require_password": "Требуется пароль",
"require_user_to_change_password_on_first_login": "Требовать у пользователя сменить пароль при первом входе", "require_user_to_change_password_on_first_login": "Требовать у пользователя сменить пароль при первом входе",
@@ -1122,6 +1133,7 @@
"search_people": "Поиск людей", "search_people": "Поиск людей",
"search_places": "Поиск мест", "search_places": "Поиск мест",
"search_state": "Поиск региона...", "search_state": "Поиск региона...",
"search_tags": "Поиск по тегам...",
"search_timezone": "Поиск часового пояса...", "search_timezone": "Поиск часового пояса...",
"search_type": "Тип поиска", "search_type": "Тип поиска",
"search_your_photos": "Поиск фотографий", "search_your_photos": "Поиск фотографий",
@@ -1151,7 +1163,7 @@
"server_version": "Версия Сервера", "server_version": "Версия Сервера",
"set": "Установить", "set": "Установить",
"set_as_album_cover": "Установить в качестве обложки альбома", "set_as_album_cover": "Установить в качестве обложки альбома",
"set_as_profile_picture": "Установить в качестве изображения профиля", "set_as_profile_picture": "Установить как фото профиля",
"set_date_of_birth": "Установить дату рождения", "set_date_of_birth": "Установить дату рождения",
"set_profile_picture": "Установить изображение профиля", "set_profile_picture": "Установить изображение профиля",
"set_slideshow_to_fullscreen": "Переведите слайд-шоу в полноэкранный режим", "set_slideshow_to_fullscreen": "Переведите слайд-шоу в полноэкранный режим",
@@ -1190,6 +1202,8 @@
"show_supporter_badge": "Значок поддержки", "show_supporter_badge": "Значок поддержки",
"show_supporter_badge_description": "Показать значок поддержки", "show_supporter_badge_description": "Показать значок поддержки",
"shuffle": "Перемешать", "shuffle": "Перемешать",
"sidebar": "Боковая панель",
"sidebar_display_description": "Показывать ссылку на представление в боковой панели",
"sign_out": "Выход", "sign_out": "Выход",
"sign_up": "Войти", "sign_up": "Войти",
"size": "Размер", "size": "Размер",
@@ -1225,7 +1239,15 @@
"suggestions": "Предложения", "suggestions": "Предложения",
"sunrise_on_the_beach": "Восход солнца на пляже", "sunrise_on_the_beach": "Восход солнца на пляже",
"swap_merge_direction": "Изменить направление слияния", "swap_merge_direction": "Изменить направление слияния",
"sync": "Синхронизировать", "sync": "Синхр.",
"tag": "Тег",
"tag_assets": "Добавить теги",
"tag_created": "Тег {tag} создан",
"tag_feature_description": "Просмотр фотографий и видео, сгруппированных по тегам",
"tag_not_found_question": "Не удается найти тег? Создайте его <link>здесь</link>",
"tag_updated": "Тег {tag} изменен",
"tagged_assets": "Помечено {count, plural, one {# объект} other {# объектов}}",
"tags": "Теги",
"template": "Шаблон", "template": "Шаблон",
"theme": "Тема", "theme": "Тема",
"theme_selection": "Выбор темы", "theme_selection": "Выбор темы",
@@ -1237,6 +1259,7 @@
"to_change_password": "Изменить пароль", "to_change_password": "Изменить пароль",
"to_favorite": "Добавить в избранное", "to_favorite": "Добавить в избранное",
"to_login": "Вход", "to_login": "Вход",
"to_root": "В начало",
"to_trash": "Корзина", "to_trash": "Корзина",
"toggle_settings": "Переключение настроек", "toggle_settings": "Переключение настроек",
"toggle_theme": "Переключение темы", "toggle_theme": "Переключение темы",
@@ -1310,6 +1333,7 @@
"view_album": "Просмотреть альбом", "view_album": "Просмотреть альбом",
"view_all": "Посмотреть всё", "view_all": "Посмотреть всё",
"view_all_users": "Показать всех пользователей", "view_all_users": "Показать всех пользователей",
"view_in_timeline": "Посмотреть на временной шкале",
"view_links": "Посмотреть ссылки", "view_links": "Посмотреть ссылки",
"view_next_asset": "Посмотреть следующий объект", "view_next_asset": "Посмотреть следующий объект",
"view_previous_asset": "Посмотреть предыдущий объект", "view_previous_asset": "Посмотреть предыдущий объект",

View File

@@ -449,6 +449,7 @@
"close": "Затвори", "close": "Затвори",
"collapse": "Скупи", "collapse": "Скупи",
"collapse_all": "Скупи све", "collapse_all": "Скупи све",
"color": "Боја",
"color_theme": "Режим боја", "color_theme": "Режим боја",
"comment_deleted": "Коментар обрисан", "comment_deleted": "Коментар обрисан",
"comment_options": "Опције коментара", "comment_options": "Опције коментара",
@@ -482,6 +483,8 @@
"create_new_person": "Направи нову особу", "create_new_person": "Направи нову особу",
"create_new_person_hint": "Доделите изабране датотеке новој особи", "create_new_person_hint": "Доделите изабране датотеке новој особи",
"create_new_user": "Направи новог корисника", "create_new_user": "Направи новог корисника",
"create_tag": "Креирајте ознаку (tag)",
"create_tag_description": "Направите нову ознаку (tag). За угнежђене ознаке, унесите пуну путању ознаке укључујући косе црте.",
"create_user": "Направи корисника", "create_user": "Направи корисника",
"created": "Направљен", "created": "Направљен",
"current_device": "Тренутни уређај", "current_device": "Тренутни уређај",
@@ -505,6 +508,8 @@
"delete_library": "Обриши библиотеку", "delete_library": "Обриши библиотеку",
"delete_link": "Обриши везу", "delete_link": "Обриши везу",
"delete_shared_link": "Обриши дељену везу", "delete_shared_link": "Обриши дељену везу",
"delete_tag": "Обриши ознаку (tag)",
"delete_tag_confirmation_prompt": "Да ли стварно желите да избришете ознаку (tag) {tagName}?",
"delete_user": "Обриши корисника", "delete_user": "Обриши корисника",
"deleted_shared_link": "Обришена дељена веза", "deleted_shared_link": "Обришена дељена веза",
"description": "Опис", "description": "Опис",
@@ -553,6 +558,7 @@
"edit_location": "Уреди локацију", "edit_location": "Уреди локацију",
"edit_name": "Уреди име", "edit_name": "Уреди име",
"edit_people": "Уреди особе", "edit_people": "Уреди особе",
"edit_tag": "Уреди ознаку (tag)",
"edit_title": "Уреди титулу", "edit_title": "Уреди титулу",
"edit_user": "Уреди корисника", "edit_user": "Уреди корисника",
"edited": "Уређено", "edited": "Уређено",
@@ -724,6 +730,8 @@
"feature": "", "feature": "",
"feature_photo_updated": "Главна фотографија је ажурирана", "feature_photo_updated": "Главна фотографија је ажурирана",
"featurecollection": "", "featurecollection": "",
"features": "Функције",
"features_setting_description": "Управљајте функцијама апликације",
"file_name": "Назив документа", "file_name": "Назив документа",
"file_name_or_extension": "Име датотеке или екстензија", "file_name_or_extension": "Име датотеке или екстензија",
"filename": "Име датотеке", "filename": "Име датотеке",
@@ -733,6 +741,7 @@
"find_them_fast": "Брзо их пронађите по имену помоћу претраге", "find_them_fast": "Брзо их пронађите по имену помоћу претраге",
"fix_incorrect_match": "Исправите нетачно подударање", "fix_incorrect_match": "Исправите нетачно подударање",
"folders": "Фасцикле (Folders)", "folders": "Фасцикле (Folders)",
"folders_feature_description": "Прегледавање приказа фасцикле за фотографије и видео записе у систему датотека",
"force_re-scan_library_files": "Принудно поново скенирајте све датотеке библиотеке", "force_re-scan_library_files": "Принудно поново скенирајте све датотеке библиотеке",
"forward": "Напред", "forward": "Напред",
"general": "Генерално", "general": "Генерално",
@@ -967,6 +976,7 @@
"pending": "На чекању", "pending": "На чекању",
"people": "Особе", "people": "Особе",
"people_edits_count": "Измењено {count, plural, one {# особа} other {# особе}}", "people_edits_count": "Измењено {count, plural, one {# особа} other {# особе}}",
"people_feature_description": "Прегледавање фотографија и видео снимака груписаних по особама",
"people_sidebar_description": "Прикажите везу до особа на бочној траци", "people_sidebar_description": "Прикажите везу до особа на бочној траци",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "Упозорење за трајно брисање", "permanent_deletion_warning": "Упозорење за трајно брисање",
@@ -1040,7 +1050,7 @@
"rating": "Оцена звездица", "rating": "Оцена звездица",
"rating_clear": "Обриши оцену", "rating_clear": "Обриши оцену",
"rating_count": "{count, plural, one {# звезда} other {# звезде}}", "rating_count": "{count, plural, one {# звезда} other {# звезде}}",
"rating_description": "Прикажите exif оцену у инфо панелу", "rating_description": "Прикажите EXIF оцену у инфо панелу",
"raw": "", "raw": "",
"reaction_options": "Опције реакције", "reaction_options": "Опције реакције",
"read_changelog": "Прочитајте дневник промена", "read_changelog": "Прочитајте дневник промена",
@@ -1073,6 +1083,7 @@
"removed_from_archive": "Уклоњено из архиве", "removed_from_archive": "Уклоњено из архиве",
"removed_from_favorites": "Уклоњено из омиљених (фаворитес)", "removed_from_favorites": "Уклоњено из омиљених (фаворитес)",
"removed_from_favorites_count": "{count, plural, other {Уклоњено #}} из омиљених", "removed_from_favorites_count": "{count, plural, other {Уклоњено #}} из омиљених",
"removed_tagged_assets": "Уклоњена ознака (tag) из {count, plural, one {# датотеке} other {# датотека}}",
"rename": "Преименуј", "rename": "Преименуј",
"repair": "Поправи", "repair": "Поправи",
"repair_no_results_message": "Овде ће се појавити датотеке које нису праћене и недостају", "repair_no_results_message": "Овде ће се појавити датотеке које нису праћене и недостају",
@@ -1122,6 +1133,7 @@
"search_people": "Претражи особе", "search_people": "Претражи особе",
"search_places": "Претражи места", "search_places": "Претражи места",
"search_state": "Тражи регион...", "search_state": "Тражи регион...",
"search_tags": "Претражи ознаке (tags)...",
"search_timezone": "Претражи временску зону...", "search_timezone": "Претражи временску зону...",
"search_type": "Врста претраге", "search_type": "Врста претраге",
"search_your_photos": "Претражи своје фотографије", "search_your_photos": "Претражи своје фотографије",
@@ -1190,6 +1202,8 @@
"show_supporter_badge": "Значка подршке", "show_supporter_badge": "Значка подршке",
"show_supporter_badge_description": "Покажите значку подршке", "show_supporter_badge_description": "Покажите значку подршке",
"shuffle": "Мешање", "shuffle": "Мешање",
"sidebar": "Бочна трака",
"sidebar_display_description": "Прикажите везу до приказа на бочној траци",
"sign_out": "Одјава", "sign_out": "Одјава",
"sign_up": "Пријави се", "sign_up": "Пријави се",
"size": "Величина", "size": "Величина",
@@ -1226,6 +1240,14 @@
"sunrise_on_the_beach": "Излазак сунца на плажи", "sunrise_on_the_beach": "Излазак сунца на плажи",
"swap_merge_direction": "Замените правац спајања", "swap_merge_direction": "Замените правац спајања",
"sync": "Синхронизација", "sync": "Синхронизација",
"tag": "Ознака (tag)",
"tag_assets": "Означите датотеке",
"tag_created": "Направљена ознака (tag): {tag}",
"tag_feature_description": "Прегледавање фотографија и видео снимака груписаних по логичним темама ознака",
"tag_not_found_question": "Не можете да пронађете ознаку (tag)? Направите једну <link>овде</link>",
"tag_updated": "Ажурирана ознака (tag): {tag}",
"tagged_assets": "Означено (tagged) {count, plural, one {# датотека} other {# датотеке}}",
"tags": "Ознаке (tags)",
"template": "Шаблон (Темплате)", "template": "Шаблон (Темплате)",
"theme": "Теме", "theme": "Теме",
"theme_selection": "Избор теме", "theme_selection": "Избор теме",
@@ -1237,6 +1259,7 @@
"to_change_password": "Промени лозинку", "to_change_password": "Промени лозинку",
"to_favorite": "Постави као фаворит", "to_favorite": "Постави као фаворит",
"to_login": "Пријава", "to_login": "Пријава",
"to_root": "На почетак",
"to_trash": "Смеће", "to_trash": "Смеће",
"toggle_settings": "Намести подешавања", "toggle_settings": "Намести подешавања",
"toggle_theme": "Намести тамну тему", "toggle_theme": "Намести тамну тему",
@@ -1310,6 +1333,7 @@
"view_album": "Погледај албум", "view_album": "Погледај албум",
"view_all": "Прикажи Све", "view_all": "Прикажи Све",
"view_all_users": "Прикажи све кориснике", "view_all_users": "Прикажи све кориснике",
"view_in_timeline": "Прикажи у временској линији",
"view_links": "Прикажи везе", "view_links": "Прикажи везе",
"view_next_asset": "Погледајте следећу датотеку", "view_next_asset": "Погледајте следећу датотеку",
"view_previous_asset": "Погледај претходну датотеку", "view_previous_asset": "Погледај претходну датотеку",

View File

@@ -449,6 +449,7 @@
"close": "Zatvori", "close": "Zatvori",
"collapse": "Skupi", "collapse": "Skupi",
"collapse_all": "Skupi sve", "collapse_all": "Skupi sve",
"color": "Boja",
"color_theme": "Režim boja", "color_theme": "Režim boja",
"comment_deleted": "Komentar obrisan", "comment_deleted": "Komentar obrisan",
"comment_options": "Opcije komentara", "comment_options": "Opcije komentara",
@@ -482,6 +483,8 @@
"create_new_person": "Napravi novu osobu", "create_new_person": "Napravi novu osobu",
"create_new_person_hint": "Dodelite izabrane datoteke novoj osobi", "create_new_person_hint": "Dodelite izabrane datoteke novoj osobi",
"create_new_user": "Napravi novog korisnika", "create_new_user": "Napravi novog korisnika",
"create_tag": "Kreirajte oznaku (tag)",
"create_tag_description": "Napravite novu oznaku (tag). Za ugnežđene oznake, unesite punu putanju oznake uključujući kose crte.",
"create_user": "Napravi korisnika", "create_user": "Napravi korisnika",
"created": "Napravljen", "created": "Napravljen",
"current_device": "Trenutni uređaj", "current_device": "Trenutni uređaj",
@@ -505,6 +508,8 @@
"delete_library": "Obriši biblioteku", "delete_library": "Obriši biblioteku",
"delete_link": "Obriši vezu", "delete_link": "Obriši vezu",
"delete_shared_link": "Obriši deljenu vezu", "delete_shared_link": "Obriši deljenu vezu",
"delete_tag": "Obriši oznaku (tag)",
"delete_tag_confirmation_prompt": "Da li stvarno želite da izbrišete oznaku {tagName}?",
"delete_user": "Obriši korisnika", "delete_user": "Obriši korisnika",
"deleted_shared_link": "Obrišena deljena veza", "deleted_shared_link": "Obrišena deljena veza",
"description": "Opis", "description": "Opis",
@@ -553,6 +558,7 @@
"edit_location": "Uredi lokaciju", "edit_location": "Uredi lokaciju",
"edit_name": "Uredi ime", "edit_name": "Uredi ime",
"edit_people": "Uredi osobe", "edit_people": "Uredi osobe",
"edit_tag": "Uredi oznaku (tag)",
"edit_title": "Uredi titulu", "edit_title": "Uredi titulu",
"edit_user": "Uredi korisnika", "edit_user": "Uredi korisnika",
"edited": "Uređeno", "edited": "Uređeno",
@@ -724,6 +730,8 @@
"feature": "", "feature": "",
"feature_photo_updated": "Glavna fotografija je ažurirana", "feature_photo_updated": "Glavna fotografija je ažurirana",
"featurecollection": "", "featurecollection": "",
"features": "Funkcije (features)",
"features_setting_description": "Upravljajte funkcijama aplikacije",
"file_name": "Naziv dokumenta", "file_name": "Naziv dokumenta",
"file_name_or_extension": "Ime datoteke ili ekstenzija", "file_name_or_extension": "Ime datoteke ili ekstenzija",
"filename": "Ime datoteke", "filename": "Ime datoteke",
@@ -733,6 +741,7 @@
"find_them_fast": "Brzo ih pronađite po imenu pomoću pretrage", "find_them_fast": "Brzo ih pronađite po imenu pomoću pretrage",
"fix_incorrect_match": "Ispravite netačno podudaranje", "fix_incorrect_match": "Ispravite netačno podudaranje",
"folders": "Fascikle (Folders)", "folders": "Fascikle (Folders)",
"folders_feature_description": "Pregledavanje prikaza fascikle za fotografije i video zapisa u sistemu datoteka",
"force_re-scan_library_files": "Prinudno ponovo skenirajte sve datoteke biblioteke", "force_re-scan_library_files": "Prinudno ponovo skenirajte sve datoteke biblioteke",
"forward": "Napred", "forward": "Napred",
"general": "Generalno", "general": "Generalno",
@@ -967,6 +976,7 @@
"pending": "Na čekanju", "pending": "Na čekanju",
"people": "Osobe", "people": "Osobe",
"people_edits_count": "Izmenjeno {count, plural, one {# osoba} other {# osobe}}", "people_edits_count": "Izmenjeno {count, plural, one {# osoba} other {# osobe}}",
"people_feature_description": "Pregledavanje fotografija i video snimaka grupisanih po osobama",
"people_sidebar_description": "Prikažite vezu do osoba na bočnoj traci", "people_sidebar_description": "Prikažite vezu do osoba na bočnoj traci",
"perform_library_tasks": "", "perform_library_tasks": "",
"permanent_deletion_warning": "Upozorenje za trajno brisanje", "permanent_deletion_warning": "Upozorenje za trajno brisanje",
@@ -1040,7 +1050,7 @@
"rating": "Ocena zvezdica", "rating": "Ocena zvezdica",
"rating_clear": "Obriši ocenu", "rating_clear": "Obriši ocenu",
"rating_count": "{count, plural, one {# zvezda} other {# zvezde}}", "rating_count": "{count, plural, one {# zvezda} other {# zvezde}}",
"rating_description": "Prikažite exif ocenu u info panelu", "rating_description": "Prikažite EXIF ocenu u info panelu",
"raw": "", "raw": "",
"reaction_options": "Opcije reakcije", "reaction_options": "Opcije reakcije",
"read_changelog": "Pročitajte dnevnik promena", "read_changelog": "Pročitajte dnevnik promena",
@@ -1073,6 +1083,7 @@
"removed_from_archive": "Uklonjeno iz arhive", "removed_from_archive": "Uklonjeno iz arhive",
"removed_from_favorites": "Uklonjeno iz omiljenih (favorites)", "removed_from_favorites": "Uklonjeno iz omiljenih (favorites)",
"removed_from_favorites_count": "{count, plural, other {Uklonjeno #}} iz omiljenih", "removed_from_favorites_count": "{count, plural, other {Uklonjeno #}} iz omiljenih",
"removed_tagged_assets": "Uklonjena oznaka iz {count, plural, one {# datoteke} other {# datoteka}}",
"rename": "Preimenuj", "rename": "Preimenuj",
"repair": "Popravi", "repair": "Popravi",
"repair_no_results_message": "Ovde će se pojaviti datoteke koje nisu praćene i nedostaju", "repair_no_results_message": "Ovde će se pojaviti datoteke koje nisu praćene i nedostaju",
@@ -1122,6 +1133,7 @@
"search_people": "Pretraži osobe", "search_people": "Pretraži osobe",
"search_places": "Pretraži mesta", "search_places": "Pretraži mesta",
"search_state": "Traži region...", "search_state": "Traži region...",
"search_tags": "Pretraži oznake (tags)...",
"search_timezone": "Pretraži vremensku zonu...", "search_timezone": "Pretraži vremensku zonu...",
"search_type": "Vrsta pretrage", "search_type": "Vrsta pretrage",
"search_your_photos": "Pretraži svoje fotografije", "search_your_photos": "Pretraži svoje fotografije",
@@ -1190,6 +1202,8 @@
"show_supporter_badge": "Značka podrške", "show_supporter_badge": "Značka podrške",
"show_supporter_badge_description": "Pokažite značku podrške", "show_supporter_badge_description": "Pokažite značku podrške",
"shuffle": "Mešanje", "shuffle": "Mešanje",
"sidebar": "Bočna traka",
"sidebar_display_description": "Prikažite vezu do prikaza na bočnoj traci",
"sign_out": "Odjava", "sign_out": "Odjava",
"sign_up": "Prijavi se", "sign_up": "Prijavi se",
"size": "Veličina", "size": "Veličina",
@@ -1226,6 +1240,14 @@
"sunrise_on_the_beach": "Izlazak sunca na plaži", "sunrise_on_the_beach": "Izlazak sunca na plaži",
"swap_merge_direction": "Zamenite pravac spajanja", "swap_merge_direction": "Zamenite pravac spajanja",
"sync": "Sinhronizacija", "sync": "Sinhronizacija",
"tag": "Oznaka (tag)",
"tag_assets": "Označite (tag) sredstva",
"tag_created": "Napravljena oznaka (tag): {tag}",
"tag_feature_description": "Pregledavanje fotografija i video snimaka grupisanih po logičnim temama oznaka",
"tag_not_found_question": "Ne možete da pronađete oznaku (tag)? Napravite jednu <link>ovde</link>",
"tag_updated": "Ažurirana oznaka (tag): {tag}",
"tagged_assets": "Označeno (tagged) {count, plural, one {# datoteka} other {# datoteke}}",
"tags": "Oznake (tags)",
"template": "Šablon (Template)", "template": "Šablon (Template)",
"theme": "Teme", "theme": "Teme",
"theme_selection": "Izbor teme", "theme_selection": "Izbor teme",
@@ -1237,6 +1259,7 @@
"to_change_password": "Promeni lozinku", "to_change_password": "Promeni lozinku",
"to_favorite": "Postavi kao favorit", "to_favorite": "Postavi kao favorit",
"to_login": "Prijava", "to_login": "Prijava",
"to_root": "Na početak",
"to_trash": "Smeće", "to_trash": "Smeće",
"toggle_settings": "Namesti podešavanja", "toggle_settings": "Namesti podešavanja",
"toggle_theme": "Namesti tamnu temu", "toggle_theme": "Namesti tamnu temu",
@@ -1310,6 +1333,7 @@
"view_album": "Pogledaj album", "view_album": "Pogledaj album",
"view_all": "Prikaži Sve", "view_all": "Prikaži Sve",
"view_all_users": "Prikaži sve korisnike", "view_all_users": "Prikaži sve korisnike",
"view_in_timeline": "Prikaži u vremenskoj liniji",
"view_links": "Prikaži veze", "view_links": "Prikaži veze",
"view_next_asset": "Pogledajte sledeću datoteku", "view_next_asset": "Pogledajte sledeću datoteku",
"view_previous_asset": "Pogledaj prethodnu datoteku", "view_previous_asset": "Pogledaj prethodnu datoteku",

Some files were not shown because too many files have changed in this diff Show More