mirror of
https://github.com/immich-app/immich.git
synced 2025-06-12 21:38:37 +02:00
Merge branch 'main' into patch-1
This commit is contained in:
commit
761cec622e
988 changed files with 60558 additions and 57407 deletions
.devcontainer
.github/workflows
build-mobile.ymlcache-cleanup.ymlcli.ymlcodeql-analysis.ymldocker.ymldocs-build.ymldocs-deploy.ymldocs-destroy.ymlfix-format.ymlpr-label-validation.ymlpr-labeler.ymlpr-require-conventional-commit.ymlprepare-release.ymlpreview-label.yamlsdk.ymlstatic_analysis.ymltest.ymlweblate-lock.yml
.vscode
Makefilecli
docker
docs
e2e
i18n
|
@ -1,4 +1,4 @@
|
|||
ARG BASEIMAGE=mcr.microsoft.com/devcontainers/typescript-node:22@sha256:2ef23730ec68d8511ec8e6e0b82550ca728b256805d81f60ed890f3bfb21cfb9
|
||||
ARG BASEIMAGE=mcr.microsoft.com/devcontainers/typescript-node:22@sha256:a20b8a3538313487ac9266875bbf733e544c1aa2091df2bb99ab592a6d4f7399
|
||||
FROM ${BASEIMAGE}
|
||||
|
||||
# Flutter SDK
|
||||
|
|
35
.github/workflows/build-mobile.yml
vendored
35
.github/workflows/build-mobile.yml
vendored
|
@ -7,6 +7,15 @@ on:
|
|||
ref:
|
||||
required: false
|
||||
type: string
|
||||
secrets:
|
||||
KEY_JKS:
|
||||
required: true
|
||||
ALIAS:
|
||||
required: true
|
||||
ANDROID_KEY_PASSWORD:
|
||||
required: true
|
||||
ANDROID_STORE_PASSWORD:
|
||||
required: true
|
||||
pull_request:
|
||||
push:
|
||||
branches: [main]
|
||||
|
@ -15,14 +24,21 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
with:
|
||||
|
@ -38,24 +54,19 @@ jobs:
|
|||
build-sign-android:
|
||||
name: Build and sign Android
|
||||
needs: pre-job
|
||||
permissions:
|
||||
contents: read
|
||||
# Skip when PR from a fork
|
||||
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && needs.pre-job.outputs.should_run == 'true' }}
|
||||
runs-on: macos-14
|
||||
|
||||
steps:
|
||||
- name: Determine ref
|
||||
id: get-ref
|
||||
run: |
|
||||
input_ref="${{ inputs.ref }}"
|
||||
github_ref="${{ github.sha }}"
|
||||
ref="${input_ref:-$github_ref}"
|
||||
echo "ref=$ref" >> $GITHUB_OUTPUT
|
||||
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
ref: ${{ steps.get-ref.outputs.ref }}
|
||||
ref: ${{ inputs.ref || github.sha }}
|
||||
persist-credentials: false
|
||||
|
||||
- uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
|
||||
- uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
|
@ -78,6 +89,10 @@ jobs:
|
|||
working-directory: ./mobile
|
||||
run: flutter pub get
|
||||
|
||||
- name: Generate translation file
|
||||
run: make translation
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Build Android App Bundle
|
||||
working-directory: ./mobile
|
||||
env:
|
||||
|
|
17
.github/workflows/cache-cleanup.yml
vendored
17
.github/workflows/cache-cleanup.yml
vendored
|
@ -8,31 +8,38 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
cleanup:
|
||||
name: Cleanup
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Cleanup
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REF: ${{ github.ref }}
|
||||
run: |
|
||||
gh extension install actions/gh-actions-cache
|
||||
|
||||
REPO=${{ github.repository }}
|
||||
BRANCH=${{ github.ref }}
|
||||
|
||||
echo "Fetching list of cache keys"
|
||||
cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH -L 100 | cut -f 1 )
|
||||
cacheKeysForPR=$(gh actions-cache list -R $REPO -B ${REF} -L 100 | cut -f 1 )
|
||||
|
||||
## Setting this to not fail the workflow while deleting cache keys.
|
||||
set +e
|
||||
echo "Deleting caches..."
|
||||
for cacheKey in $cacheKeysForPR
|
||||
do
|
||||
gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm
|
||||
gh actions-cache delete $cacheKey -R "$REPO" -B "${REF}" --confirm
|
||||
done
|
||||
echo "Done"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
17
.github/workflows/cli.yml
vendored
17
.github/workflows/cli.yml
vendored
|
@ -16,21 +16,25 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
packages: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
name: CLI Publish
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Setup .npmrc file to publish to npm
|
||||
- uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
@ -48,11 +52,16 @@ jobs:
|
|||
docker:
|
||||
name: Docker
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
needs: publish
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
|
@ -87,7 +96,7 @@ jobs:
|
|||
type=raw,value=latest,enable=${{ github.event_name == 'release' }}
|
||||
|
||||
- name: Build and push image
|
||||
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
|
||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
|
||||
with:
|
||||
file: cli/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
|
|
10
.github/workflows/codeql-analysis.yml
vendored
10
.github/workflows/codeql-analysis.yml
vendored
|
@ -24,6 +24,8 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
|
@ -43,10 +45,12 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
|
||||
uses: github/codeql-action/init@28deaeda66b76a05916b6923827895f2b14ab387 # v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
|
@ -59,7 +63,7 @@ jobs:
|
|||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
|
||||
uses: github/codeql-action/autobuild@28deaeda66b76a05916b6923827895f2b14ab387 # v3
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
|
@ -72,6 +76,6 @@ jobs:
|
|||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
|
||||
uses: github/codeql-action/analyze@28deaeda66b76a05916b6923827895f2b14ab387 # v3
|
||||
with:
|
||||
category: '/language:${{matrix.language}}'
|
||||
|
|
147
.github/workflows/docker.yml
vendored
147
.github/workflows/docker.yml
vendored
|
@ -12,18 +12,21 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
packages: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
with:
|
||||
|
@ -45,6 +48,9 @@ jobs:
|
|||
retag_ml:
|
||||
name: Re-Tag ML
|
||||
needs: pre-job
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
if: ${{ needs.pre-job.outputs.should_run_ml == 'false' && !github.event.pull_request.head.repo.fork }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
|
@ -58,18 +64,22 @@ jobs:
|
|||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Re-tag image
|
||||
env:
|
||||
REGISTRY_NAME: 'ghcr.io'
|
||||
REPOSITORY: ${{ github.repository_owner }}/immich-machine-learning
|
||||
TAG_OLD: main${{ matrix.suffix }}
|
||||
TAG_PR: ${{ github.event.number == 0 && github.ref_name || format('pr-{0}', github.event.number) }}${{ matrix.suffix }}
|
||||
TAG_COMMIT: commit-${{ github.event_name != 'pull_request' && github.sha || github.event.pull_request.head.sha }}${{ matrix.suffix }}
|
||||
run: |
|
||||
REGISTRY_NAME="ghcr.io"
|
||||
REPOSITORY=${{ github.repository_owner }}/immich-machine-learning
|
||||
TAG_OLD=main${{ matrix.suffix }}
|
||||
TAG_PR=${{ github.event.number == 0 && github.ref_name || format('pr-{0}', github.event.number) }}${{ matrix.suffix }}
|
||||
TAG_COMMIT=commit-${{ github.event_name != 'pull_request' && github.sha || github.event.pull_request.head.sha }}${{ matrix.suffix }}
|
||||
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_PR $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
|
||||
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_COMMIT $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
|
||||
docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_PR}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}"
|
||||
docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_COMMIT}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}"
|
||||
|
||||
retag_server:
|
||||
name: Re-Tag Server
|
||||
needs: pre-job
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'false' && !github.event.pull_request.head.repo.fork }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
|
@ -83,18 +93,22 @@ jobs:
|
|||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Re-tag image
|
||||
env:
|
||||
REGISTRY_NAME: 'ghcr.io'
|
||||
REPOSITORY: ${{ github.repository_owner }}/immich-server
|
||||
TAG_OLD: main${{ matrix.suffix }}
|
||||
TAG_PR: ${{ github.event.number == 0 && github.ref_name || format('pr-{0}', github.event.number) }}${{ matrix.suffix }}
|
||||
TAG_COMMIT: commit-${{ github.event_name != 'pull_request' && github.sha || github.event.pull_request.head.sha }}${{ matrix.suffix }}
|
||||
run: |
|
||||
REGISTRY_NAME="ghcr.io"
|
||||
REPOSITORY=${{ github.repository_owner }}/immich-server
|
||||
TAG_OLD=main${{ matrix.suffix }}
|
||||
TAG_PR=${{ github.event.number == 0 && github.ref_name || format('pr-{0}', github.event.number) }}${{ matrix.suffix }}
|
||||
TAG_COMMIT=commit-${{ github.event_name != 'pull_request' && github.sha || github.event.pull_request.head.sha }}${{ matrix.suffix }}
|
||||
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_PR $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
|
||||
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_COMMIT $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
|
||||
docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_PR}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}"
|
||||
docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_COMMIT}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}"
|
||||
|
||||
build_and_push_ml:
|
||||
name: Build and Push ML
|
||||
needs: pre-job
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
|
||||
runs-on: ${{ matrix.runner }}
|
||||
env:
|
||||
|
@ -148,6 +162,8 @@ jobs:
|
|||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
|
||||
|
@ -161,11 +177,14 @@ jobs:
|
|||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Generate cache key suffix
|
||||
env:
|
||||
REF: ${{ github.ref_name }}
|
||||
run: |
|
||||
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||
echo "CACHE_KEY_SUFFIX=pr-${{ github.event.number }}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "CACHE_KEY_SUFFIX=$(echo ${{ github.ref_name }} | sed 's/[^a-zA-Z0-9]/-/g')" >> $GITHUB_ENV
|
||||
SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g')
|
||||
echo "CACHE_KEY_SUFFIX=${SUFFIX}" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Generate cache target
|
||||
|
@ -175,17 +194,23 @@ jobs:
|
|||
# Essentially just ignore the cache output (forks 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,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ matrix.device }}-${{ env.CACHE_KEY_SUFFIX }},mode=max,compression=zstd" >> $GITHUB_OUTPUT
|
||||
echo "cache-to=type=registry,ref=${GHCR_REPO}-build-cache:${PLATFORM_PAIR}-${{ matrix.device }}-${CACHE_KEY_SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Generate docker image tags
|
||||
id: meta
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
|
||||
env:
|
||||
DOCKER_METADATA_PR_HEAD_SHA: 'true'
|
||||
|
||||
- name: Build and push image
|
||||
id: build
|
||||
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
|
||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
|
||||
with:
|
||||
context: ${{ env.context }}
|
||||
file: ${{ env.file }}
|
||||
platforms: ${{ matrix.platforms }}
|
||||
labels: ${{ steps.metadata.outputs.labels }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-to: ${{ steps.cache-target.outputs.cache-to }}
|
||||
cache-from: |
|
||||
type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ matrix.device }}-${{ env.CACHE_KEY_SUFFIX }}
|
||||
|
@ -199,7 +224,7 @@ jobs:
|
|||
BUILD_SOURCE_COMMIT=${{ github.sha }}
|
||||
|
||||
- name: Export digest
|
||||
run: |
|
||||
run: | # zizmor: ignore[template-injection]
|
||||
mkdir -p ${{ runner.temp }}/digests
|
||||
digest="${{ steps.build.outputs.digest }}"
|
||||
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
||||
|
@ -215,6 +240,10 @@ jobs:
|
|||
merge_ml:
|
||||
name: Merge & Push ML
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
packages: write
|
||||
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' && !github.event.pull_request.head.repo.fork }}
|
||||
env:
|
||||
GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-machine-learning
|
||||
|
@ -237,7 +266,7 @@ jobs:
|
|||
- build_and_push_ml
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
|
||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
||||
with:
|
||||
path: ${{ runner.temp }}/digests
|
||||
pattern: ml-digests-${{ matrix.device }}-*
|
||||
|
@ -287,12 +316,31 @@ jobs:
|
|||
- name: Create manifest list and push
|
||||
working-directory: ${{ runner.temp }}/digests
|
||||
run: |
|
||||
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||
$(printf '${{ env.GHCR_REPO }}@sha256:%s ' *)
|
||||
# Process annotations
|
||||
declare -a ANNOTATIONS=()
|
||||
if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then
|
||||
while IFS= read -r annotation; do
|
||||
# Extract key and value by removing the manifest: prefix
|
||||
if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then
|
||||
key="${BASH_REMATCH[1]}"
|
||||
value="${BASH_REMATCH[2]}"
|
||||
# Use array to properly handle arguments with spaces
|
||||
ANNOTATIONS+=(--annotation "index:$key=$value")
|
||||
fi
|
||||
done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON")
|
||||
fi
|
||||
|
||||
TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||
SOURCE_ARGS=$(printf "${GHCR_REPO}@sha256:%s " *)
|
||||
|
||||
docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS
|
||||
|
||||
build_and_push_server:
|
||||
name: Build and Push Server
|
||||
runs-on: ${{ matrix.runner }}
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
|
||||
env:
|
||||
|
@ -316,6 +364,8 @@ jobs:
|
|||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
|
||||
|
@ -329,11 +379,14 @@ jobs:
|
|||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Generate cache key suffix
|
||||
env:
|
||||
REF: ${{ github.ref_name }}
|
||||
run: |
|
||||
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||
echo "CACHE_KEY_SUFFIX=pr-${{ github.event.number }}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "CACHE_KEY_SUFFIX=$(echo ${{ github.ref_name }} | sed 's/[^a-zA-Z0-9]/-/g')" >> $GITHUB_ENV
|
||||
SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g')
|
||||
echo "CACHE_KEY_SUFFIX=${SUFFIX}" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Generate cache target
|
||||
|
@ -343,17 +396,23 @@ jobs:
|
|||
# Essentially just ignore the cache output (forks 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,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ matrix.device }}-${{ env.CACHE_KEY_SUFFIX }},mode=max,compression=zstd" >> $GITHUB_OUTPUT
|
||||
echo "cache-to=type=registry,ref=${GHCR_REPO}-build-cache:${PLATFORM_PAIR}-${CACHE_KEY_SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Generate docker image tags
|
||||
id: meta
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
|
||||
env:
|
||||
DOCKER_METADATA_PR_HEAD_SHA: 'true'
|
||||
|
||||
- name: Build and push image
|
||||
id: build
|
||||
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
|
||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
|
||||
with:
|
||||
context: ${{ env.context }}
|
||||
file: ${{ env.file }}
|
||||
platforms: ${{ matrix.platform }}
|
||||
labels: ${{ steps.metadata.outputs.labels }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-to: ${{ steps.cache-target.outputs.cache-to }}
|
||||
cache-from: |
|
||||
type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ env.CACHE_KEY_SUFFIX }}
|
||||
|
@ -367,7 +426,7 @@ jobs:
|
|||
BUILD_SOURCE_COMMIT=${{ github.sha }}
|
||||
|
||||
- name: Export digest
|
||||
run: |
|
||||
run: | # zizmor: ignore[template-injection]
|
||||
mkdir -p ${{ runner.temp }}/digests
|
||||
digest="${{ steps.build.outputs.digest }}"
|
||||
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
||||
|
@ -383,6 +442,10 @@ jobs:
|
|||
merge_server:
|
||||
name: Merge & Push Server
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
packages: write
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' && !github.event.pull_request.head.repo.fork }}
|
||||
env:
|
||||
GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-server
|
||||
|
@ -391,7 +454,7 @@ jobs:
|
|||
- build_and_push_server
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
|
||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
||||
with:
|
||||
path: ${{ runner.temp }}/digests
|
||||
pattern: server-digests-*
|
||||
|
@ -441,12 +504,29 @@ jobs:
|
|||
- name: Create manifest list and push
|
||||
working-directory: ${{ runner.temp }}/digests
|
||||
run: |
|
||||
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||
$(printf '${{ env.GHCR_REPO }}@sha256:%s ' *)
|
||||
# Process annotations
|
||||
declare -a ANNOTATIONS=()
|
||||
if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then
|
||||
while IFS= read -r annotation; do
|
||||
# Extract key and value by removing the manifest: prefix
|
||||
if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then
|
||||
key="${BASH_REMATCH[1]}"
|
||||
value="${BASH_REMATCH[2]}"
|
||||
# Use array to properly handle arguments with spaces
|
||||
ANNOTATIONS+=(--annotation "index:$key=$value")
|
||||
fi
|
||||
done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON")
|
||||
fi
|
||||
|
||||
TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||
SOURCE_ARGS=$(printf "${GHCR_REPO}@sha256:%s " *)
|
||||
|
||||
docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS
|
||||
|
||||
success-check-server:
|
||||
name: Docker Build & Push Server Success
|
||||
needs: [merge_server, retag_server]
|
||||
permissions: {}
|
||||
runs-on: ubuntu-latest
|
||||
if: always()
|
||||
steps:
|
||||
|
@ -455,11 +535,13 @@ jobs:
|
|||
run: exit 1
|
||||
- name: All jobs passed or skipped
|
||||
if: ${{ !(contains(needs.*.result, 'failure')) }}
|
||||
# zizmor: ignore[template-injection]
|
||||
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"
|
||||
|
||||
success-check-ml:
|
||||
name: Docker Build & Push ML Success
|
||||
needs: [merge_ml, retag_ml]
|
||||
permissions: {}
|
||||
runs-on: ubuntu-latest
|
||||
if: always()
|
||||
steps:
|
||||
|
@ -468,4 +550,5 @@ jobs:
|
|||
run: exit 1
|
||||
- name: All jobs passed or skipped
|
||||
if: ${{ !(contains(needs.*.result, 'failure')) }}
|
||||
# zizmor: ignore[template-injection]
|
||||
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"
|
||||
|
|
13
.github/workflows/docs-build.yml
vendored
13
.github/workflows/docs-build.yml
vendored
|
@ -10,14 +10,20 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
with:
|
||||
|
@ -33,6 +39,8 @@ jobs:
|
|||
build:
|
||||
name: Docs Build
|
||||
needs: pre-job
|
||||
permissions:
|
||||
contents: read
|
||||
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
|
@ -42,9 +50,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './docs/.nvmrc'
|
||||
|
||||
|
@ -62,4 +72,5 @@ jobs:
|
|||
with:
|
||||
name: docs-build-output
|
||||
path: docs/build/
|
||||
include-hidden-files: true
|
||||
retention-days: 1
|
||||
|
|
34
.github/workflows/docs-deploy.yml
vendored
34
.github/workflows/docs-deploy.yml
vendored
|
@ -1,6 +1,6 @@
|
|||
name: Docs deploy
|
||||
on:
|
||||
workflow_run:
|
||||
workflow_run: # zizmor: ignore[dangerous-triggers] no attacker inputs are used here
|
||||
workflows: ['Docs build']
|
||||
types:
|
||||
- completed
|
||||
|
@ -9,6 +9,9 @@ jobs:
|
|||
checks:
|
||||
name: Docs Deploy Checks
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
pull-requests: read
|
||||
outputs:
|
||||
parameters: ${{ steps.parameters.outputs.result }}
|
||||
artifact: ${{ steps.get-artifact.outputs.result }}
|
||||
|
@ -36,6 +39,8 @@ jobs:
|
|||
- name: Determine deploy parameters
|
||||
id: parameters
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
env:
|
||||
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
with:
|
||||
script: |
|
||||
const eventType = context.payload.workflow_run.event;
|
||||
|
@ -57,7 +62,8 @@ jobs:
|
|||
} else if (eventType == "pull_request") {
|
||||
let pull_number = context.payload.workflow_run.pull_requests[0]?.number;
|
||||
if(!pull_number) {
|
||||
const response = await github.rest.search.issuesAndPullRequests({q: 'repo:${{ github.repository }} is:pr sha:${{ github.event.workflow_run.head_sha }}',per_page: 1,})
|
||||
const {HEAD_SHA} = process.env;
|
||||
const response = await github.rest.search.issuesAndPullRequests({q: `repo:${{ github.repository }} is:pr sha:${HEAD_SHA}`,per_page: 1,})
|
||||
const items = response.data.items
|
||||
if (items.length < 1) {
|
||||
throw new Error("No pull request found for the commit")
|
||||
|
@ -95,30 +101,36 @@ jobs:
|
|||
name: Docs Deploy
|
||||
runs-on: ubuntu-latest
|
||||
needs: checks
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
pull-requests: write
|
||||
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Load parameters
|
||||
id: parameters
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
env:
|
||||
PARAM_JSON: ${{ needs.checks.outputs.parameters }}
|
||||
with:
|
||||
script: |
|
||||
const json = `${{ needs.checks.outputs.parameters }}`;
|
||||
const parameters = JSON.parse(json);
|
||||
const parameters = JSON.parse(process.env.PARAM_JSON);
|
||||
core.setOutput("event", parameters.event);
|
||||
core.setOutput("name", parameters.name);
|
||||
core.setOutput("shouldDeploy", parameters.shouldDeploy);
|
||||
|
||||
- run: |
|
||||
echo "Starting docs deployment for ${{ steps.parameters.outputs.event }} ${{ steps.parameters.outputs.name }}"
|
||||
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
env:
|
||||
ARTIFACT_JSON: ${{ needs.checks.outputs.artifact }}
|
||||
with:
|
||||
script: |
|
||||
let artifact = ${{ needs.checks.outputs.artifact }};
|
||||
let artifact = JSON.parse(process.env.ARTIFACT_JSON);
|
||||
let download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
|
@ -162,9 +174,11 @@ jobs:
|
|||
|
||||
- name: Output Cleaning
|
||||
id: clean
|
||||
env:
|
||||
TG_OUTPUT: ${{ steps.docs-output.outputs.tg_action_output }}
|
||||
run: |
|
||||
TG_OUT=$(echo '${{ steps.docs-output.outputs.tg_action_output }}' | sed 's|%0A|\n|g ; s|%3C|<|g' | jq -c .)
|
||||
echo "output=$TG_OUT" >> $GITHUB_OUTPUT
|
||||
CLEANED=$(echo "$TG_OUTPUT" | sed 's|%0A|\n|g ; s|%3C|<|g' | jq -c .)
|
||||
echo "output=$CLEANED" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Publish to Cloudflare Pages
|
||||
uses: cloudflare/pages-action@f0a1cd58cd66095dee69bfa18fa5efd1dde93bca # v1
|
||||
|
|
9
.github/workflows/docs-destroy.yml
vendored
9
.github/workflows/docs-destroy.yml
vendored
|
@ -1,15 +1,22 @@
|
|||
name: Docs destroy
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers] no attacker inputs are used here
|
||||
types: [closed]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Docs Destroy
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Destroy Docs Subdomain
|
||||
env:
|
||||
|
|
8
.github/workflows/fix-format.yml
vendored
8
.github/workflows/fix-format.yml
vendored
|
@ -4,16 +4,19 @@ on:
|
|||
pull_request:
|
||||
types: [labeled]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
fix-formatting:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.label.name == 'fix:formatting' }}
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
|
||||
uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
@ -23,9 +26,10 @@ jobs:
|
|||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
persist-credentials: true
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
|
|
4
.github/workflows/pr-label-validation.yml
vendored
4
.github/workflows/pr-label-validation.yml
vendored
|
@ -1,9 +1,11 @@
|
|||
name: PR Label Validation
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers] no attacker inputs are used here
|
||||
types: [opened, labeled, unlabeled, synchronize]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
validate-release-label:
|
||||
runs-on: ubuntu-latest
|
||||
|
|
4
.github/workflows/pr-labeler.yml
vendored
4
.github/workflows/pr-labeler.yml
vendored
|
@ -1,6 +1,8 @@
|
|||
name: 'Pull Request Labeler'
|
||||
on:
|
||||
- pull_request_target
|
||||
- pull_request_target # zizmor: ignore[dangerous-triggers] no attacker inputs are used here
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
labeler:
|
||||
|
|
|
@ -4,9 +4,13 @@ on:
|
|||
pull_request:
|
||||
types: [opened, synchronize, reopened, edited]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
validate-pr-title:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: PR Conventional Commit Validation
|
||||
uses: ytanikin/PRConventionalCommits@b628c5a234cc32513014b7bfdd1e47b532124d98 # 1.3.0
|
||||
|
|
35
.github/workflows/prepare-release.yml
vendored
35
.github/workflows/prepare-release.yml
vendored
|
@ -21,17 +21,18 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}-root
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
bump_version:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
outputs:
|
||||
ref: ${{ steps.push-tag.outputs.commit_long_sha }}
|
||||
|
||||
permissions: {} # No job-level permissions are needed because it uses the app-token
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
|
||||
uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
@ -40,12 +41,16 @@ jobs:
|
|||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
persist-credentials: true
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182 # v5
|
||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
|
||||
|
||||
- name: Bump version
|
||||
run: misc/release/pump-version.sh -s "${{ inputs.serverBump }}" -m "${{ inputs.mobileBump }}"
|
||||
env:
|
||||
SERVER_BUMP: ${{ inputs.serverBump }}
|
||||
MOBILE_BUMP: ${{ inputs.mobileBump }}
|
||||
run: misc/release/pump-version.sh -s "${SERVER_BUMP}" -m "${MOBILE_BUMP}"
|
||||
|
||||
- name: Commit and tag
|
||||
id: push-tag
|
||||
|
@ -59,18 +64,26 @@ jobs:
|
|||
build_mobile:
|
||||
uses: ./.github/workflows/build-mobile.yml
|
||||
needs: bump_version
|
||||
secrets: inherit
|
||||
permissions:
|
||||
contents: read
|
||||
secrets:
|
||||
KEY_JKS: ${{ secrets.KEY_JKS }}
|
||||
ALIAS: ${{ secrets.ALIAS }}
|
||||
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
|
||||
ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
|
||||
with:
|
||||
ref: ${{ needs.bump_version.outputs.ref }}
|
||||
|
||||
prepare_release:
|
||||
runs-on: ubuntu-latest
|
||||
needs: build_mobile
|
||||
|
||||
permissions:
|
||||
actions: read # To download the app artifact
|
||||
# No content permissions are needed because it uses the app-token
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
|
||||
uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
@ -79,17 +92,19 @@ jobs:
|
|||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Download APK
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
|
||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
||||
with:
|
||||
name: release-apk-signed
|
||||
|
||||
- name: Create draft release
|
||||
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2
|
||||
uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2
|
||||
with:
|
||||
draft: true
|
||||
tag_name: ${{ env.IMMICH_VERSION }}
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
generate_release_notes: true
|
||||
body_path: misc/release/notes.tmpl
|
||||
files: |
|
||||
|
|
2
.github/workflows/preview-label.yaml
vendored
2
.github/workflows/preview-label.yaml
vendored
|
@ -4,6 +4,8 @@ on:
|
|||
pull_request:
|
||||
types: [labeled, closed]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
comment-status:
|
||||
runs-on: ubuntu-latest
|
||||
|
|
10
.github/workflows/sdk.yml
vendored
10
.github/workflows/sdk.yml
vendored
|
@ -4,20 +4,24 @@ on:
|
|||
release:
|
||||
types: [published]
|
||||
|
||||
permissions:
|
||||
packages: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
name: Publish `@immich/sdk`
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Setup .npmrc file to publish to npm
|
||||
- uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './open-api/typescript-sdk/.nvmrc'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
|
47
.github/workflows/static_analysis.yml
vendored
47
.github/workflows/static_analysis.yml
vendored
|
@ -9,14 +9,20 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
with:
|
||||
|
@ -33,12 +39,14 @@ jobs:
|
|||
name: Run Dart Code Analysis
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Flutter SDK
|
||||
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
|
||||
|
@ -50,6 +58,10 @@ jobs:
|
|||
run: dart pub get
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Generate translation file
|
||||
run: make translation; dart format lib/generated/codegen_loader.g.dart
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Run Build Runner
|
||||
run: make build
|
||||
working-directory: ./mobile
|
||||
|
@ -65,9 +77,11 @@ jobs:
|
|||
|
||||
- name: Verify files have not changed
|
||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
||||
run: |
|
||||
echo "ERROR: Generated files not up to date! Run make_build inside the mobile directory"
|
||||
echo "Changed files: ${{ steps.verify-changed-files.outputs.changed_files }}"
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
exit 1
|
||||
|
||||
- name: Run dart analyze
|
||||
|
@ -81,3 +95,30 @@ jobs:
|
|||
- name: Run dart custom_lint
|
||||
run: dart run custom_lint
|
||||
working-directory: ./mobile
|
||||
|
||||
zizmor:
|
||||
name: zizmor
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
security-events: write
|
||||
contents: read
|
||||
actions: read
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install the latest version of uv
|
||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
|
||||
|
||||
- name: Run zizmor 🌈
|
||||
run: uvx zizmor --format=sarif . > results.sarif
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Upload SARIF file
|
||||
uses: github/codeql-action/upload-sarif@28deaeda66b76a05916b6923827895f2b14ab387 # v3
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
category: zizmor
|
||||
|
|
172
.github/workflows/test.yml
vendored
172
.github/workflows/test.yml
vendored
|
@ -9,9 +9,13 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
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' }}
|
||||
|
@ -25,6 +29,9 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
with:
|
||||
|
@ -58,6 +65,8 @@ jobs:
|
|||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./server
|
||||
|
@ -65,9 +74,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
|
@ -95,6 +106,8 @@ jobs:
|
|||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./cli
|
||||
|
@ -102,9 +115,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
|
||||
|
@ -136,6 +151,8 @@ jobs:
|
|||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
|
||||
runs-on: windows-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./cli
|
||||
|
@ -143,9 +160,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
|
||||
|
@ -165,11 +184,13 @@ jobs:
|
|||
run: npm run test:cov
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
web-unit-tests:
|
||||
name: Test & Lint Web
|
||||
web-lint:
|
||||
name: Lint Web
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: mich
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./web
|
||||
|
@ -177,9 +198,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './web/.nvmrc'
|
||||
|
||||
|
@ -191,7 +214,7 @@ jobs:
|
|||
run: npm ci
|
||||
|
||||
- name: Run linter
|
||||
run: npm run lint
|
||||
run: npm run lint:p
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Run formatter
|
||||
|
@ -202,6 +225,35 @@ jobs:
|
|||
run: npm run check:svelte
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
web-unit-tests:
|
||||
name: Test Web
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./web
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './web/.nvmrc'
|
||||
|
||||
- name: Run setup typescript-sdk
|
||||
run: npm ci && npm run build
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
- name: Run tsc
|
||||
run: npm run check:typescript
|
||||
if: ${{ !cancelled() }}
|
||||
|
@ -215,6 +267,8 @@ jobs:
|
|||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_e2e == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./e2e
|
||||
|
@ -222,9 +276,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
|
||||
|
@ -254,6 +310,8 @@ jobs:
|
|||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./server
|
||||
|
@ -261,9 +319,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
|
@ -278,19 +338,25 @@ jobs:
|
|||
name: End-to-End Tests (Server & CLI)
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_e2e_server_cli == 'true' }}
|
||||
runs-on: mich
|
||||
runs-on: ${{ matrix.runner }}
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./e2e
|
||||
strategy:
|
||||
matrix:
|
||||
runner: [mich, ubuntu-24.04-arm]
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: 'recursive'
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
|
||||
|
@ -320,19 +386,25 @@ jobs:
|
|||
name: End-to-End Tests (Web)
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_e2e_web == 'true' }}
|
||||
runs-on: mich
|
||||
runs-on: ${{ matrix.runner }}
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./e2e
|
||||
strategy:
|
||||
matrix:
|
||||
runner: [mich, ubuntu-24.04-arm]
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: 'recursive'
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
|
||||
|
@ -357,13 +429,33 @@ jobs:
|
|||
run: npx playwright test
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
success-check-e2e:
|
||||
name: End-to-End Tests Success
|
||||
needs: [e2e-tests-server-cli, e2e-tests-web]
|
||||
permissions: {}
|
||||
runs-on: ubuntu-latest
|
||||
if: always()
|
||||
steps:
|
||||
- name: Any jobs failed?
|
||||
if: ${{ contains(needs.*.result, 'failure') }}
|
||||
run: exit 1
|
||||
- name: All jobs passed or skipped
|
||||
if: ${{ !(contains(needs.*.result, 'failure')) }}
|
||||
# zizmor: ignore[template-injection]
|
||||
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"
|
||||
|
||||
mobile-unit-tests:
|
||||
name: Unit Test Mobile
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Flutter SDK
|
||||
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
|
||||
with:
|
||||
|
@ -378,14 +470,19 @@ jobs:
|
|||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./machine-learning
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182 # v5
|
||||
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5
|
||||
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
|
||||
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
|
||||
# TODO: add caching when supported (https://github.com/actions/setup-python/pull/818)
|
||||
# with:
|
||||
# python-version: 3.11
|
||||
|
@ -411,6 +508,8 @@ jobs:
|
|||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs['should_run_.github'] == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./.github
|
||||
|
@ -418,9 +517,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './.github/.nvmrc'
|
||||
|
||||
|
@ -434,25 +535,34 @@ jobs:
|
|||
shellcheck:
|
||||
name: ShellCheck
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Run ShellCheck
|
||||
uses: ludeeus/action-shellcheck@master
|
||||
with:
|
||||
ignore_paths: >-
|
||||
**/open-api/**
|
||||
**/openapi/**
|
||||
**/openapi**
|
||||
**/node_modules/**
|
||||
|
||||
generated-api-up-to-date:
|
||||
name: OpenAPI Clients
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
|
@ -476,14 +586,18 @@ jobs:
|
|||
|
||||
- name: Verify files have not changed
|
||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
||||
run: |
|
||||
echo "ERROR: Generated files not up to date!"
|
||||
echo "Changed files: ${{ steps.verify-changed-files.outputs.changed_files }}"
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
exit 1
|
||||
|
||||
generated-typeorm-migrations-up-to-date:
|
||||
name: TypeORM Checks
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
services:
|
||||
postgres:
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||
|
@ -505,9 +619,11 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
|
@ -518,10 +634,10 @@ jobs:
|
|||
run: npm run build
|
||||
|
||||
- name: Run existing migrations
|
||||
run: npm run typeorm:migrations:run
|
||||
run: npm run migrations:run
|
||||
|
||||
- name: Test npm run schema:reset command works
|
||||
run: npm run typeorm:schema:reset
|
||||
run: npm run schema:reset
|
||||
|
||||
- name: Generate new migrations
|
||||
continue-on-error: true
|
||||
|
@ -532,12 +648,14 @@ jobs:
|
|||
id: verify-changed-files
|
||||
with:
|
||||
files: |
|
||||
server/src/migrations/
|
||||
server/src
|
||||
- name: Verify migration files have not changed
|
||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
||||
run: |
|
||||
echo "ERROR: Generated migration files not up to date!"
|
||||
echo "Changed files: ${{ steps.verify-changed-files.outputs.changed_files }}"
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
cat ./src/*-TestMigration.ts
|
||||
exit 1
|
||||
|
||||
|
@ -555,9 +673,11 @@ jobs:
|
|||
|
||||
- name: Verify SQL files have not changed
|
||||
if: steps.verify-changed-sql-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.verify-changed-sql-files.outputs.changed_files }}
|
||||
run: |
|
||||
echo "ERROR: Generated SQL files not up to date!"
|
||||
echo "Changed files: ${{ steps.verify-changed-sql-files.outputs.changed_files }}"
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
exit 1
|
||||
|
||||
# mobile-integration-tests:
|
||||
|
|
14
.github/workflows/weblate-lock.yml
vendored
14
.github/workflows/weblate-lock.yml
vendored
|
@ -4,30 +4,32 @@ on:
|
|||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
with:
|
||||
filters: |
|
||||
i18n:
|
||||
- 'i18n/!(en)**\.json'
|
||||
- name: Debug
|
||||
run: |
|
||||
echo "Should run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}"
|
||||
echo "Found i18n paths: ${{ steps.found_paths.outputs.i18n }}"
|
||||
echo "Head ref: ${{ github.head_ref }}"
|
||||
|
||||
enforce-lock:
|
||||
name: Check Weblate Lock
|
||||
needs: [pre-job]
|
||||
runs-on: ubuntu-latest
|
||||
permissions: {}
|
||||
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
|
||||
steps:
|
||||
- name: Check weblate lock
|
||||
|
@ -47,6 +49,7 @@ jobs:
|
|||
name: Weblate Lock Check Success
|
||||
needs: [enforce-lock]
|
||||
runs-on: ubuntu-latest
|
||||
permissions: {}
|
||||
if: always()
|
||||
steps:
|
||||
- name: Any jobs failed?
|
||||
|
@ -54,4 +57,5 @@ jobs:
|
|||
run: exit 1
|
||||
- name: All jobs passed or skipped
|
||||
if: ${{ !(contains(needs.*.result, 'failure')) }}
|
||||
# zizmor: ignore[template-injection]
|
||||
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"
|
||||
|
|
80
.vscode/settings.json
vendored
80
.vscode/settings.json
vendored
|
@ -1,45 +1,63 @@
|
|||
{
|
||||
"editor.formatOnSave": true,
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.tabSize": 2,
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.tabSize": 2,
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[css]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.tabSize": 2,
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[svelte]": {
|
||||
"editor.defaultFormatter": "svelte.svelte-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.tabSize": 2
|
||||
},
|
||||
"svelte.enable-ts-plugin": true,
|
||||
"eslint.validate": [
|
||||
"javascript",
|
||||
"svelte"
|
||||
],
|
||||
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||
"[dart]": {
|
||||
"editor.defaultFormatter": "Dart-Code.dart-code",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.selectionHighlight": false,
|
||||
"editor.suggest.snippetsPreventQuickSuggestions": false,
|
||||
"editor.suggestSelection": "first",
|
||||
"editor.tabCompletion": "onlySnippets",
|
||||
"editor.wordBasedSuggestions": "off",
|
||||
"editor.defaultFormatter": "Dart-Code.dart-code"
|
||||
"editor.wordBasedSuggestions": "off"
|
||||
},
|
||||
"cSpell.words": [
|
||||
"immich"
|
||||
],
|
||||
"[javascript]": {
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit",
|
||||
"source.removeUnusedImports": "explicit"
|
||||
},
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.tabSize": 2
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.tabSize": 2
|
||||
},
|
||||
"[jsonc]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.tabSize": 2
|
||||
},
|
||||
"[svelte]": {
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit",
|
||||
"source.removeUnusedImports": "explicit"
|
||||
},
|
||||
"editor.defaultFormatter": "svelte.svelte-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.tabSize": 2
|
||||
},
|
||||
"[typescript]": {
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit",
|
||||
"source.removeUnusedImports": "explicit"
|
||||
},
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.tabSize": 2
|
||||
},
|
||||
"cSpell.words": ["immich"],
|
||||
"editor.formatOnSave": true,
|
||||
"eslint.validate": ["javascript", "svelte"],
|
||||
"explorer.fileNesting.enabled": true,
|
||||
"explorer.fileNesting.patterns": {
|
||||
"*.ts": "${capture}.spec.ts,${capture}.mock.ts",
|
||||
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart"
|
||||
}
|
||||
}
|
||||
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
|
||||
"*.ts": "${capture}.spec.ts,${capture}.mock.ts"
|
||||
},
|
||||
"svelte.enable-ts-plugin": true,
|
||||
"typescript.preferences.importModuleSpecifier": "non-relative"
|
||||
}
|
||||
|
|
3
Makefile
3
Makefile
|
@ -17,6 +17,9 @@ e2e:
|
|||
prod:
|
||||
docker compose -f ./docker/docker-compose.prod.yml up --build -V --remove-orphans
|
||||
|
||||
prod-down:
|
||||
docker compose -f ./docker/docker-compose.prod.yml down --remove-orphans
|
||||
|
||||
prod-scale:
|
||||
docker compose -f ./docker/docker-compose.prod.yml up --build -V --scale immich-server=3 --scale immich-microservices=3 --remove-orphans
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:22.14.0-alpine3.20@sha256:40be979442621049f40b1d51a26b55e281246b5de4e5f51a18da7beb6e17e3f9 AS core
|
||||
FROM node:22.15.0-alpine3.20@sha256:686b8892b69879ef5bfd6047589666933508f9a5451c67320df3070ba0e9807b AS core
|
||||
|
||||
WORKDIR /usr/src/open-api/typescript-sdk
|
||||
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./
|
||||
|
|
1377
cli/package-lock.json
generated
1377
cli/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@immich/cli",
|
||||
"version": "2.2.61",
|
||||
"version": "2.2.65",
|
||||
"description": "Command Line Interface (CLI) for Immich",
|
||||
"type": "module",
|
||||
"exports": "./dist/index.js",
|
||||
|
@ -21,7 +21,7 @@
|
|||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/micromatch": "^4.0.9",
|
||||
"@types/mock-fs": "^4.13.1",
|
||||
"@types/node": "^22.13.14",
|
||||
"@types/node": "^22.14.1",
|
||||
"@vitest/coverage-v8": "^3.0.0",
|
||||
"byte-size": "^9.0.0",
|
||||
"cli-progress": "^3.12.0",
|
||||
|
|
|
@ -116,7 +116,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:42cba146593a5ea9a622002c1b7cba5da7be248650cbb64ecb9c6c33d29794b1
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:c855f98e09d558a0d7cc1a4e56473231206a4c54c0114ada9c485b47aeb92ec8
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:42cba146593a5ea9a622002c1b7cba5da7be248650cbb64ecb9c6c33d29794b1
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:c855f98e09d558a0d7cc1a4e56473231206a4c54c0114ada9c485b47aeb92ec8
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
@ -90,7 +90,7 @@ services:
|
|||
container_name: immich_prometheus
|
||||
ports:
|
||||
- 9090:9090
|
||||
image: prom/prometheus@sha256:502ad90314c7485892ce696cb14a99fceab9fc27af29f4b427f41bd39701a199
|
||||
image: prom/prometheus@sha256:339ce86a59413be18d0e445472891d022725b4803fab609069110205e79fb2f1
|
||||
volumes:
|
||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
|
@ -102,7 +102,7 @@ services:
|
|||
command: [ './run.sh', '-disable-reporting' ]
|
||||
ports:
|
||||
- 3000:3000
|
||||
image: grafana/grafana:11.5.2-ubuntu@sha256:8b5858c447e06fd7a89006b562ba7bba7c4d5813600c7982374c41852adefaeb
|
||||
image: grafana/grafana:11.6.1-ubuntu@sha256:6fc273288470ef499dd3c6b36aeade093170d4f608f864c5dd3a7fabeae77b50
|
||||
volumes:
|
||||
- grafana-data:/var/lib/grafana
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:42cba146593a5ea9a622002c1b7cba5da7be248650cbb64ecb9c6c33d29794b1
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:c855f98e09d558a0d7cc1a4e56473231206a4c54c0114ada9c485b47aeb92ec8
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
|
|
@ -23,23 +23,32 @@ Refer to the official [postgres documentation](https://www.postgresql.org/docs/c
|
|||
It is not recommended to directly backup the `DB_DATA_LOCATION` folder. Doing so while the database is running can lead to a corrupted backup that cannot be restored.
|
||||
:::
|
||||
|
||||
### Automatic Database Backups
|
||||
### Automatic Database Dumps
|
||||
|
||||
For convenience, Immich will automatically create database backups by default. The backups are stored in `UPLOAD_LOCATION/backups`.
|
||||
As mentioned above, you should make your own backup of these together with the asset folders as noted below.
|
||||
You can adjust the schedule and amount of kept backups in the [admin settings](http://my.immich.app/admin/system-settings?isOpen=backup).
|
||||
By default, Immich will keep the last 14 backups and create a new backup every day at 2:00 AM.
|
||||
:::warning
|
||||
The automatic database dumps can be used to restore the database in the event of damage to the Postgres database files.
|
||||
There is no monitoring for these dumps and you will not be notified if they are unsuccessful.
|
||||
:::
|
||||
|
||||
#### Trigger Backup
|
||||
:::caution
|
||||
The database dumps do **NOT** contain any pictures or videos, only metadata. They are only usable with a copy of the other files in `UPLOAD_LOCATION` as outlined below.
|
||||
:::
|
||||
|
||||
You are able to trigger a backup in the [admin job status page](http://my.immich.app/admin/jobs-status).
|
||||
Visit the page, open the "Create job" modal from the top right, select "Backup Database" and click "Confirm".
|
||||
A job will run and trigger a backup, you can verify this worked correctly by checking the logs or the backup folder.
|
||||
This backup will count towards the last X backups that will be kept based on your settings.
|
||||
For disaster-recovery purposes, Immich will automatically create database dumps. The dumps are stored in `UPLOAD_LOCATION/backups`.
|
||||
Please be sure to make your own, independent backup of the database together with the asset folders as noted below.
|
||||
You can adjust the schedule and amount of kept database dumps in the [admin settings](http://my.immich.app/admin/system-settings?isOpen=backup).
|
||||
By default, Immich will keep the last 14 database dumps and create a new dump every day at 2:00 AM.
|
||||
|
||||
#### Trigger Dump
|
||||
|
||||
You are able to trigger a database dump in the [admin job status page](http://my.immich.app/admin/jobs-status).
|
||||
Visit the page, open the "Create job" modal from the top right, select "Create Database Dump" and click "Confirm".
|
||||
A job will run and trigger a dump, you can verify this worked correctly by checking the logs or the `backups/` folder.
|
||||
This dumps will count towards the last `X` dumps that will be kept based on your settings.
|
||||
|
||||
#### Restoring
|
||||
|
||||
We hope to make restoring simpler in future versions, for now you can find the backups in the `UPLOAD_LOCATION/backups` folder on your host.
|
||||
We hope to make restoring simpler in future versions, for now you can find the database dumps in the `UPLOAD_LOCATION/backups` folder on your host.
|
||||
Then please follow the steps in the following section for restoring the database.
|
||||
|
||||
### Manual Backup and Restore
|
||||
|
|
Binary file not shown.
Before ![]() (image error) Size: 12 KiB After ![]() (image error) Size: 16 KiB ![]() ![]() |
|
@ -31,7 +31,7 @@ Admin can send a welcome email if the Email option is set, you can learn here ho
|
|||
|
||||
Admin can specify the storage quota for the user as the instance's admin; once the limit is reached, the user won't be able to upload to the instance anymore.
|
||||
|
||||
In order to select a storage quota, click on the pencil icon and enter the storage quota in GiB. You can choose an unlimited quota using the value 0 (default).
|
||||
In order to select a storage quota, click on the pencil icon and enter the storage quota in GiB. You can choose an unlimited quota by leaving it empty (default).
|
||||
|
||||
:::tip
|
||||
The system administrator can see the usage quota percentage of all users in Server Stats page.
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
# Database Migrations
|
||||
|
||||
After making any changes in the `server/src/entities`, a database migration need to run in order to register the changes in the database. Follow the steps below to create a new migration.
|
||||
After making any changes in the `server/src/schema`, a database migration need to run in order to register the changes in the database. Follow the steps below to create a new migration.
|
||||
|
||||
1. Run the command
|
||||
|
||||
```bash
|
||||
npm run typeorm:migrations:generate <migration-name>
|
||||
npm run migrations:generate <migration-name>
|
||||
```
|
||||
|
||||
2. Check if the migration file makes sense.
|
||||
3. Move the migration file to folder `./server/src/migrations` in your code editor.
|
||||
3. Move the migration file to folder `./server/src/schema/migrations` in your code editor.
|
||||
|
||||
The server will automatically detect `*.ts` file changes and restart. Part of the server start-up process includes running any new migrations, so it will be applied immediately.
|
||||
|
|
|
@ -63,6 +63,13 @@ If you only want to do web development connected to an existing, remote backend,
|
|||
IMMICH_SERVER_URL=https://demo.immich.app/ npm run dev
|
||||
```
|
||||
|
||||
If you're using PowerShell on Windows you may need to set the env var separately like so:
|
||||
|
||||
```powershell
|
||||
$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
|
||||
npm run dev
|
||||
```
|
||||
|
||||
#### `@immich/ui`
|
||||
|
||||
To see local changes to `@immich/ui` in Immich, do the following:
|
||||
|
@ -76,9 +83,20 @@ To see local changes to `@immich/ui` in Immich, do the following:
|
|||
|
||||
### Mobile app
|
||||
|
||||
The mobile app `(/mobile)` will required Flutter toolchain 3.13.x and FVM to be installed on your system.
|
||||
#### Setup
|
||||
|
||||
Please refer to the [Flutter's official documentation](https://flutter.dev/docs/get-started/install) for more information on setting up the toolchain on your machine.
|
||||
1. Setup Flutter toolchain using FVM.
|
||||
2. Run `flutter pub get` to install the dependencies.
|
||||
3. Run `make translation` to generate the translation file.
|
||||
4. Run `fvm flutter run` to start the app.
|
||||
|
||||
#### Translation
|
||||
|
||||
To add a new translation text, enter the key-value pair in the `i18n/en.json` in the root of the immich project. Then, from the `mobile/` directory, run
|
||||
|
||||
```bash
|
||||
make translation
|
||||
```
|
||||
|
||||
The mobile app asks you what backend to connect to. You can utilize the demo backend (https://demo.immich.app/) if you don't need to change server code or upload photos. Alternatively, you can run the server yourself per the instructions above.
|
||||
|
||||
|
|
|
@ -42,6 +42,12 @@ docker run -it -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=https://your-immich
|
|||
|
||||
Please modify the `IMMICH_INSTANCE_URL` and `IMMICH_API_KEY` environment variables as suitable. You can also use a Docker env file to store your sensitive API key.
|
||||
|
||||
This `docker run` command will directly run the command `immich` inside the container. You can directly append the desired parameters (see under "usage") to the commandline like this:
|
||||
|
||||
```bash
|
||||
docker run -it -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=https://your-immich-instance/api -e IMMICH_API_KEY=your-api-key ghcr.io/immich-app/immich-cli:latest upload -a -c 5 --recursive directory/
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
<details>
|
||||
|
@ -112,7 +118,7 @@ You begin by authenticating to your Immich server. For instance:
|
|||
immich login http://192.168.1.216:2283/api HFEJ38DNSDUEG
|
||||
```
|
||||
|
||||
This will store your credentials in a `auth.yml` file in the configuration directory which defaults to `~/.config/`. The directory can be set with the `-d` option or the environment variable `IMMICH_CONFIG_DIR`. Please keep the file secure, either by performing the logout command after you are done, or deleting it manually.
|
||||
This will store your credentials in a `auth.yml` file in the configuration directory which defaults to `~/.config/immich/`. The directory can be set with the `-d` option or the environment variable `IMMICH_CONFIG_DIR`. Please keep the file secure, either by performing the logout command after you are done, or deleting it manually.
|
||||
|
||||
Once you are authenticated, you can upload assets to your Immich server.
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ You do not need to redo any machine learning jobs after enabling hardware accele
|
|||
|
||||
- The GPU must have compute capability 5.2 or greater.
|
||||
- The server must have the official NVIDIA driver installed.
|
||||
- The installed driver must be >= 535 (it must support CUDA 12.2).
|
||||
- The installed driver must be >= 545 (it must support CUDA 12.3).
|
||||
- On Linux (except for WSL2), you also need to have [NVIDIA Container Toolkit][nvct] installed.
|
||||
|
||||
#### ROCm
|
||||
|
|
|
@ -14,14 +14,14 @@ online generators you can use.
|
|||
2. Paste the link to your JSON style in either the **Light Style** or **Dark Style**. (You can add different styles which will help make the map style more appropriate depending on whether you set **Immich** to Light or Dark mode.)
|
||||
3. Save your selections. Reload the map, and enjoy your custom map style!
|
||||
|
||||
## Use Maptiler to build a custom style
|
||||
## Use MapTiler to build a custom style
|
||||
|
||||
Customizing the map style can be done easily using Maptiler, if you do not want to write an entire JSON document by hand.
|
||||
Customizing the map style can be done easily using MapTiler, if you do not want to write an entire JSON document by hand.
|
||||
|
||||
1. Create a free account at https://cloud.maptiler.com
|
||||
2. Once logged in, you can either create a brand new map by clicking on **New Map**, selecting a starter map, and then clicking **Customize**, OR by selecting a **Standard Map** and customizing it from there.
|
||||
3. The **editor** interface is self-explanatory. You can change colors, remove visible layers, or add optional layers (e.g., administrative, topo, hydro, etc.) in the composer.
|
||||
4. Once you have your map composed, click on **Save** at the top right. Give it a unique name to save it to your account.
|
||||
5. Next, **Publish** your style using the **Publish** button at the top right. This will deploy it to production, which means it is able to be exposed over the Internet. Maptiler will present an interactive side-by-side map with the original and your changes prior to publication.<br/>
|
||||
6. Maptiler will warn you that changing the map will change it across all apps using the map. Since no apps are using the map yet, this is okay.
|
||||
7. Clicking on the name of your new map at the top left will bring you to the item's **details** page. From here, copy the link to the JSON style under **Use vector style**. This link will automatically contain your personal API key to Maptiler.
|
||||
5. Next, **Publish** your style using the **Publish** button at the top right. This will deploy it to production, which means it is able to be exposed over the Internet. MapTiler will present an interactive side-by-side map with the original and your changes prior to publication.<br/>
|
||||
6. MapTiler will warn you that changing the map will change it across all apps using the map. Since no apps are using the map yet, this is okay.
|
||||
7. Clicking on the name of your new map at the top left will bring you to the item's **details** page. From here, copy the link to the JSON style under **Use vector style**. This link will automatically contain your personal API key to MapTiler.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Database Queries
|
||||
|
||||
:::danger
|
||||
Keep in mind that mucking around in the database might set the moon on fire. Avoid modifying the database directly when possible, and always have current backups.
|
||||
Keep in mind that mucking around in the database might set the Moon on fire. Avoid modifying the database directly when possible, and always have current backups.
|
||||
:::
|
||||
|
||||
:::tip
|
||||
|
|
|
@ -70,3 +70,6 @@ If you get an error `can't set healthcheck.start_interval as feature require Doc
|
|||
## Next Steps
|
||||
|
||||
Read the [Post Installation](/docs/install/post-install.mdx) steps and [upgrade instructions](/docs/install/upgrading.md).
|
||||
|
||||
[compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
|
||||
[env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env
|
||||
|
|
|
@ -29,7 +29,7 @@ Download [`docker-compose.yml`](https://github.com/immich-app/immich/releases/la
|
|||
|
||||
## Step 2 - Populate the .env file with custom values
|
||||
|
||||
Follow [Step 2 in Docker Compose](./docker-compose#step-2---populate-the-env-file-with-custom-values) for instructions on customizing the `.env` file, and then return back to this guide to continue.
|
||||
Follow [Step 2 in Docker Compose](/docs/install/docker-compose#step-2---populate-the-env-file-with-custom-values) for instructions on customizing the `.env` file, and then return back to this guide to continue.
|
||||
|
||||
## Step 3 - Create a new project in Container Manager
|
||||
|
||||
|
|
|
@ -24,9 +24,6 @@ To clean up disk space, the old version's obsolete container images can be delet
|
|||
docker image prune
|
||||
```
|
||||
|
||||
[compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
|
||||
[env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env
|
||||
[watchtower]: https://containrrr.dev/watchtower/
|
||||
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
|
||||
[container-auth]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry
|
||||
[releases]: https://github.com/immich-app/immich/releases
|
||||
|
|
5324
docs/package-lock.json
generated
5324
docs/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -40,8 +40,9 @@ const projects: CommunityProjectProps[] = [
|
|||
},
|
||||
{
|
||||
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',
|
||||
description:
|
||||
'Lightroom plugin to publish, export photos from Lightroom to Immich. Import from Immich to Lightroom is also supported.',
|
||||
url: 'https://blog.fokuspunk.de/lrc-immich-plugin/',
|
||||
},
|
||||
{
|
||||
title: 'Immich Duplicate Finder',
|
||||
|
|
5
docs/src/pages/errors.md
Normal file
5
docs/src/pages/errors.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# Errors
|
||||
|
||||
## TypeORM Upgrade
|
||||
|
||||
The upgrade to Immich `v2.x.x` has a required upgrade path to `v1.132.0+`. This means it is required to start up the application at least once on version `1.132.0` (or later). Doing so will complete database schema upgrades that are required for `v2.0.0`. After Immich has successfully booted on this version, shut the system down and try the `v2.x.x` upgrade again.
|
|
@ -4,6 +4,7 @@ import Layout from '@theme/Layout';
|
|||
import { discordPath, discordViewBox } from '@site/src/components/svg-paths';
|
||||
import ThemedImage from '@theme/ThemedImage';
|
||||
import Icon from '@mdi/react';
|
||||
import { mdiAndroid } from '@mdi/js';
|
||||
function HomepageHeader() {
|
||||
return (
|
||||
<header>
|
||||
|
@ -88,11 +89,18 @@ function HomepageHeader() {
|
|||
<img className="h-24" alt="Get it on Google Play" src="/img/google-play-badge.png" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="h-24">
|
||||
<a href="https://apps.apple.com/sg/app/immich/id1613945652">
|
||||
<img className="h-24 sm:p-3.5 p-3" alt="Download on the App Store" src="/img/ios-app-store-badge.svg" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="h-24">
|
||||
<a href="https://github.com/immich-app/immich/releases/latest">
|
||||
<img className="h-24 sm:p-3.5 p-3" alt="Download APK" src="/img/download-apk-github.svg" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<ThemedImage
|
||||
sources={{ dark: '/img/app-qr-code-dark.svg', light: '/img/app-qr-code-light.svg' }}
|
||||
|
|
|
@ -76,6 +76,7 @@ import {
|
|||
mdiWeb,
|
||||
mdiDatabaseOutline,
|
||||
mdiLinkEdit,
|
||||
mdiTagFaces,
|
||||
mdiMovieOpenPlayOutline,
|
||||
} from '@mdi/js';
|
||||
import Layout from '@theme/Layout';
|
||||
|
@ -83,6 +84,8 @@ import React from 'react';
|
|||
import { Item, Timeline } from '../components/timeline';
|
||||
|
||||
const releases = {
|
||||
'v1.130.0': new Date(2025, 2, 25),
|
||||
'v1.127.0': new Date(2025, 1, 26),
|
||||
'v1.122.0': new Date(2024, 11, 5),
|
||||
'v1.120.0': new Date(2024, 10, 6),
|
||||
'v1.114.0': new Date(2024, 8, 6),
|
||||
|
@ -242,6 +245,13 @@ const roadmap: Item[] = [
|
|||
];
|
||||
|
||||
const milestones: Item[] = [
|
||||
withRelease({
|
||||
icon: mdiFolderMultiple,
|
||||
iconColor: 'brown',
|
||||
title: 'Folders view in the mobile app',
|
||||
description: 'Browse your photos and videos in their folder structure inside the mobile app',
|
||||
release: 'v1.130.0',
|
||||
}),
|
||||
{
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
|
@ -249,6 +259,14 @@ const milestones: Item[] = [
|
|||
description: 'Reached 60K Stars on GitHub!',
|
||||
getDateLabel: withLanguage(new Date(2025, 2, 4)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiTagFaces,
|
||||
iconColor: 'teal',
|
||||
title: 'Manual face tagging',
|
||||
description:
|
||||
'Manually tag or remove faces in photos and videos, even when automatic detection misses or misidentifies them.',
|
||||
release: 'v1.127.0',
|
||||
}),
|
||||
withRelease({
|
||||
icon: mdiLinkEdit,
|
||||
iconColor: 'crimson',
|
||||
|
@ -266,8 +284,8 @@ const milestones: Item[] = [
|
|||
withRelease({
|
||||
icon: mdiDatabaseOutline,
|
||||
iconColor: 'brown',
|
||||
title: 'Automatic database backups',
|
||||
description: 'Database backups are now integrated into the Immich server',
|
||||
title: 'Automatic database dumps',
|
||||
description: 'Database dumps are now integrated into the Immich server',
|
||||
release: 'v1.120.0',
|
||||
}),
|
||||
{
|
||||
|
@ -300,7 +318,7 @@ const milestones: Item[] = [
|
|||
withRelease({
|
||||
icon: mdiFolderMultiple,
|
||||
iconColor: 'brown',
|
||||
title: 'Folders',
|
||||
title: 'Folders view',
|
||||
description: 'Browse your photos and videos in their folder structure',
|
||||
release: 'v1.113.0',
|
||||
}),
|
||||
|
|
5
docs/static/.well-known/security.txt
vendored
Normal file
5
docs/static/.well-known/security.txt
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
Policy: https://github.com/immich-app/immich/blob/main/SECURITY.md
|
||||
Contact: mailto:security@immich.app
|
||||
Preferred-Languages: en
|
||||
Expires: 2026-05-01T23:59:00.000Z
|
||||
Canonical: https://immich.app/.well-known/security.txt
|
16
docs/static/archived-versions.json
vendored
16
docs/static/archived-versions.json
vendored
|
@ -1,4 +1,20 @@
|
|||
[
|
||||
{
|
||||
"label": "v1.132.3",
|
||||
"url": "https://v1.132.3.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.132.2",
|
||||
"url": "https://v1.132.2.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.132.1",
|
||||
"url": "https://v1.132.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.132.0",
|
||||
"url": "https://v1.132.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.131.3",
|
||||
"url": "https://v1.131.3.archive.immich.app"
|
||||
|
|
13
docs/static/img/download-apk-github.svg
vendored
Normal file
13
docs/static/img/download-apk-github.svg
vendored
Normal file
File diff suppressed because one or more lines are too long
After (image error) Size: 14 KiB |
|
@ -34,7 +34,7 @@ services:
|
|||
- 2285:2285
|
||||
|
||||
redis:
|
||||
image: redis:6.2-alpine@sha256:148bb5411c184abd288d9aaed139c98123eeb8824c5d3fce03cf721db58066d8
|
||||
image: redis:6.2-alpine@sha256:3211c33a618c457e5d241922c975dbc4f446d0bdb2dc75694f5573ef8e2d01fa
|
||||
|
||||
database:
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||
|
|
2718
e2e/package-lock.json
generated
2718
e2e/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "immich-e2e",
|
||||
"version": "1.131.3",
|
||||
"version": "1.132.3",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
|
@ -25,7 +25,7 @@
|
|||
"@immich/sdk": "file:../open-api/typescript-sdk",
|
||||
"@playwright/test": "^1.44.1",
|
||||
"@types/luxon": "^3.4.2",
|
||||
"@types/node": "^22.13.14",
|
||||
"@types/node": "^22.14.1",
|
||||
"@types/oidc-provider": "^8.5.1",
|
||||
"@types/pg": "^8.11.0",
|
||||
"@types/pngjs": "^6.0.4",
|
||||
|
|
|
@ -46,38 +46,6 @@ describe('/activities', () => {
|
|||
});
|
||||
|
||||
describe('GET /activities', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/activities');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require an albumId', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/activities')
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID'])));
|
||||
});
|
||||
|
||||
it('should reject an invalid albumId', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/activities')
|
||||
.query({ albumId: uuidDto.invalid })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID'])));
|
||||
});
|
||||
|
||||
it('should reject an invalid assetId', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/activities')
|
||||
.query({ albumId: uuidDto.notFound, assetId: uuidDto.invalid })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['assetId must be a UUID'])));
|
||||
});
|
||||
|
||||
it('should start off empty', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/activities')
|
||||
|
@ -192,30 +160,6 @@ describe('/activities', () => {
|
|||
});
|
||||
|
||||
describe('POST /activities', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post('/activities');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require an albumId', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/activities')
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`)
|
||||
.send({ albumId: uuidDto.invalid });
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID'])));
|
||||
});
|
||||
|
||||
it('should require a comment when type is comment', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/activities')
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`)
|
||||
.send({ albumId: uuidDto.notFound, type: 'comment', comment: null });
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['comment must be a string', 'comment should not be empty']));
|
||||
});
|
||||
|
||||
it('should add a comment to an album', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/activities')
|
||||
|
@ -330,20 +274,6 @@ describe('/activities', () => {
|
|||
});
|
||||
|
||||
describe('DELETE /activities/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).delete(`/activities/${uuidDto.notFound}`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require a valid uuid', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.delete(`/activities/${uuidDto.invalid}`)
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
|
||||
});
|
||||
|
||||
it('should remove a comment from an album', async () => {
|
||||
const reaction = await createActivity({
|
||||
albumId: album.id,
|
||||
|
|
|
@ -9,7 +9,7 @@ import {
|
|||
LoginResponseDto,
|
||||
SharedLinkType,
|
||||
} from '@immich/sdk';
|
||||
import { createUserDto, uuidDto } from 'src/fixtures';
|
||||
import { createUserDto } from 'src/fixtures';
|
||||
import { errorDto } from 'src/responses';
|
||||
import { app, asBearerAuth, utils } from 'src/utils';
|
||||
import request from 'supertest';
|
||||
|
@ -128,28 +128,6 @@ describe('/albums', () => {
|
|||
});
|
||||
|
||||
describe('GET /albums', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/albums');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should reject an invalid shared param', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/albums?shared=invalid')
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['shared must be a boolean value']));
|
||||
});
|
||||
|
||||
it('should reject an invalid assetId param', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/albums?assetId=invalid')
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['assetId must be a UUID']));
|
||||
});
|
||||
|
||||
it("should not show other users' favorites", async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
|
||||
|
@ -323,12 +301,6 @@ describe('/albums', () => {
|
|||
});
|
||||
|
||||
describe('GET /albums/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/albums/${user1Albums[0].id}`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should return album info for own album', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
|
||||
|
@ -421,12 +393,6 @@ describe('/albums', () => {
|
|||
});
|
||||
|
||||
describe('GET /albums/statistics', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/albums/statistics');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should return total count of albums the user has access to', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/albums/statistics')
|
||||
|
@ -438,12 +404,6 @@ describe('/albums', () => {
|
|||
});
|
||||
|
||||
describe('POST /albums', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post('/albums').send({ albumName: 'New album' });
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should create an album', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/albums')
|
||||
|
@ -471,12 +431,6 @@ describe('/albums', () => {
|
|||
});
|
||||
|
||||
describe('PUT /albums/:id/assets', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/assets`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should be able to add own asset to own album', async () => {
|
||||
const asset = await utils.createAsset(user1.accessToken);
|
||||
const { status, body } = await request(app)
|
||||
|
@ -526,14 +480,6 @@ describe('/albums', () => {
|
|||
});
|
||||
|
||||
describe('PATCH /albums/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.patch(`/albums/${uuidDto.notFound}`)
|
||||
.send({ albumName: 'New album name' });
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should update an album', async () => {
|
||||
const album = await utils.createAlbum(user1.accessToken, {
|
||||
albumName: 'New album',
|
||||
|
@ -576,15 +522,6 @@ describe('/albums', () => {
|
|||
});
|
||||
|
||||
describe('DELETE /albums/:id/assets', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.delete(`/albums/${user1Albums[0].id}/assets`)
|
||||
.send({ ids: [user1Asset1.id] });
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require authorization', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.delete(`/albums/${user1Albums[1].id}/assets`)
|
||||
|
@ -679,13 +616,6 @@ describe('/albums', () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/users`).send({ sharedUserIds: [] });
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should be able to add user to own album', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/albums/${album.id}/users`)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { LoginResponseDto, Permission, createApiKey } from '@immich/sdk';
|
||||
import { createUserDto, uuidDto } from 'src/fixtures';
|
||||
import { createUserDto } from 'src/fixtures';
|
||||
import { errorDto } from 'src/responses';
|
||||
import { app, asBearerAuth, utils } from 'src/utils';
|
||||
import request from 'supertest';
|
||||
|
@ -24,12 +24,6 @@ describe('/api-keys', () => {
|
|||
});
|
||||
|
||||
describe('POST /api-keys', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post('/api-keys').send({ name: 'API Key' });
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should not work without permission', async () => {
|
||||
const { secret } = await create(user.accessToken, [Permission.ApiKeyRead]);
|
||||
const { status, body } = await request(app).post('/api-keys').set('x-api-key', secret).send({ name: 'API Key' });
|
||||
|
@ -99,12 +93,6 @@ describe('/api-keys', () => {
|
|||
});
|
||||
|
||||
describe('GET /api-keys', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/api-keys');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should start off empty', async () => {
|
||||
const { status, body } = await request(app).get('/api-keys').set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(body).toEqual([]);
|
||||
|
@ -125,12 +113,6 @@ describe('/api-keys', () => {
|
|||
});
|
||||
|
||||
describe('GET /api-keys/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/api-keys/${uuidDto.notFound}`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require authorization', async () => {
|
||||
const { apiKey } = await create(user.accessToken, [Permission.All]);
|
||||
const { status, body } = await request(app)
|
||||
|
@ -140,14 +122,6 @@ describe('/api-keys', () => {
|
|||
expect(body).toEqual(errorDto.badRequest('API Key not found'));
|
||||
});
|
||||
|
||||
it('should require a valid uuid', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get(`/api-keys/${uuidDto.invalid}`)
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
|
||||
});
|
||||
|
||||
it('should get api key details', async () => {
|
||||
const { apiKey } = await create(user.accessToken, [Permission.All]);
|
||||
const { status, body } = await request(app)
|
||||
|
@ -165,12 +139,6 @@ describe('/api-keys', () => {
|
|||
});
|
||||
|
||||
describe('PUT /api-keys/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).put(`/api-keys/${uuidDto.notFound}`).send({ name: 'new name' });
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require authorization', async () => {
|
||||
const { apiKey } = await create(user.accessToken, [Permission.All]);
|
||||
const { status, body } = await request(app)
|
||||
|
@ -181,15 +149,6 @@ describe('/api-keys', () => {
|
|||
expect(body).toEqual(errorDto.badRequest('API Key not found'));
|
||||
});
|
||||
|
||||
it('should require a valid uuid', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/api-keys/${uuidDto.invalid}`)
|
||||
.send({ name: 'new name' })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
|
||||
});
|
||||
|
||||
it('should update api key details', async () => {
|
||||
const { apiKey } = await create(user.accessToken, [Permission.All]);
|
||||
const { status, body } = await request(app)
|
||||
|
@ -208,12 +167,6 @@ describe('/api-keys', () => {
|
|||
});
|
||||
|
||||
describe('DELETE /api-keys/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).delete(`/api-keys/${uuidDto.notFound}`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require authorization', async () => {
|
||||
const { apiKey } = await create(user.accessToken, [Permission.All]);
|
||||
const { status, body } = await request(app)
|
||||
|
@ -223,14 +176,6 @@ describe('/api-keys', () => {
|
|||
expect(body).toEqual(errorDto.badRequest('API Key not found'));
|
||||
});
|
||||
|
||||
it('should require a valid uuid', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.delete(`/api-keys/${uuidDto.invalid}`)
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
|
||||
});
|
||||
|
||||
it('should delete an api key', async () => {
|
||||
const { apiKey } = await create(user.accessToken, [Permission.All]);
|
||||
const { status } = await request(app)
|
||||
|
|
|
@ -22,24 +22,6 @@ import { app, asBearerAuth, tempDir, TEN_TIMES, testAssetDir, utils } from 'src/
|
|||
import request from 'supertest';
|
||||
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
||||
|
||||
const makeUploadDto = (options?: { omit: string }): Record<string, any> => {
|
||||
const dto: Record<string, any> = {
|
||||
deviceAssetId: 'example-image',
|
||||
deviceId: 'TEST',
|
||||
fileCreatedAt: new Date().toISOString(),
|
||||
fileModifiedAt: new Date().toISOString(),
|
||||
isFavorite: 'testing',
|
||||
duration: '0:00:00.000000',
|
||||
};
|
||||
|
||||
const omit = options?.omit;
|
||||
if (omit) {
|
||||
delete dto[omit];
|
||||
}
|
||||
|
||||
return dto;
|
||||
};
|
||||
|
||||
const locationAssetFilepath = `${testAssetDir}/metadata/gps-position/thompson-springs.jpg`;
|
||||
const ratingAssetFilepath = `${testAssetDir}/metadata/rating/mongolels.jpg`;
|
||||
const facesAssetFilepath = `${testAssetDir}/metadata/faces/portrait.jpg`;
|
||||
|
@ -160,13 +142,6 @@ describe('/asset', () => {
|
|||
});
|
||||
|
||||
describe('GET /assets/:id/original', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/assets/${uuidDto.notFound}/original`);
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should download the file', async () => {
|
||||
const response = await request(app)
|
||||
.get(`/assets/${user1Assets[0].id}/original`)
|
||||
|
@ -178,20 +153,6 @@ describe('/asset', () => {
|
|||
});
|
||||
|
||||
describe('GET /assets/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/assets/${uuidDto.notFound}`);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
expect(status).toBe(401);
|
||||
});
|
||||
|
||||
it('should require a valid id', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get(`/assets/${uuidDto.invalid}`)
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
|
||||
});
|
||||
|
||||
it('should require access', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get(`/assets/${user2Assets[0].id}`)
|
||||
|
@ -354,13 +315,6 @@ describe('/asset', () => {
|
|||
});
|
||||
|
||||
describe('GET /assets/statistics', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/assets/statistics');
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should return stats of all assets', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/assets/statistics')
|
||||
|
@ -425,13 +379,6 @@ describe('/asset', () => {
|
|||
await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration');
|
||||
});
|
||||
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/assets/random');
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it.each(TEN_TIMES)('should return 1 random assets', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/assets/random')
|
||||
|
@ -467,14 +414,6 @@ describe('/asset', () => {
|
|||
expect(status).toBe(200);
|
||||
expect(body).toEqual([expect.objectContaining({ id: user2Assets[0].id })]);
|
||||
});
|
||||
|
||||
it('should return error', async () => {
|
||||
const { status } = await request(app)
|
||||
.get('/assets/random?count=ABC')
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
|
||||
expect(status).toBe(400);
|
||||
});
|
||||
});
|
||||
|
||||
describe('PUT /assets/:id', () => {
|
||||
|
@ -619,28 +558,6 @@ describe('/asset', () => {
|
|||
expect(status).toEqual(200);
|
||||
});
|
||||
|
||||
it('should reject invalid gps coordinates', async () => {
|
||||
for (const test of [
|
||||
{ latitude: 12 },
|
||||
{ longitude: 12 },
|
||||
{ latitude: 12, longitude: 'abc' },
|
||||
{ latitude: 'abc', longitude: 12 },
|
||||
{ latitude: null, longitude: 12 },
|
||||
{ latitude: 12, longitude: null },
|
||||
{ latitude: 91, longitude: 12 },
|
||||
{ latitude: -91, longitude: 12 },
|
||||
{ latitude: 12, longitude: -181 },
|
||||
{ latitude: 12, longitude: 181 },
|
||||
]) {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/assets/${user1Assets[0].id}`)
|
||||
.send(test)
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest());
|
||||
}
|
||||
});
|
||||
|
||||
it('should update gps data', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/assets/${user1Assets[0].id}`)
|
||||
|
@ -712,17 +629,6 @@ describe('/asset', () => {
|
|||
expect(status).toEqual(200);
|
||||
});
|
||||
|
||||
it('should reject invalid rating', async () => {
|
||||
for (const test of [{ rating: 7 }, { rating: 3.5 }, { rating: null }]) {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/assets/${user1Assets[0].id}`)
|
||||
.send(test)
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest());
|
||||
}
|
||||
});
|
||||
|
||||
it('should return tagged people', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/assets/${user1Assets[0].id}`)
|
||||
|
@ -746,25 +652,6 @@ describe('/asset', () => {
|
|||
});
|
||||
|
||||
describe('DELETE /assets', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.delete(`/assets`)
|
||||
.send({ ids: [uuidDto.notFound] });
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require a valid uuid', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.delete(`/assets`)
|
||||
.send({ ids: [uuidDto.invalid] })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest(['each value in ids must be a UUID']));
|
||||
});
|
||||
|
||||
it('should throw an error when the id is not found', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.delete(`/assets`)
|
||||
|
@ -877,13 +764,6 @@ describe('/asset', () => {
|
|||
});
|
||||
|
||||
describe('GET /assets/:id/thumbnail', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/assets/${locationAsset.id}/thumbnail`);
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should not include gps data for webp thumbnails', async () => {
|
||||
await utils.waitForWebsocketEvent({
|
||||
event: 'assetUpload',
|
||||
|
@ -919,13 +799,6 @@ describe('/asset', () => {
|
|||
});
|
||||
|
||||
describe('GET /assets/:id/original', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/assets/${locationAsset.id}/original`);
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should download the original', async () => {
|
||||
const { status, body, type } = await request(app)
|
||||
.get(`/assets/${locationAsset.id}/original`)
|
||||
|
@ -946,43 +819,9 @@ describe('/asset', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('PUT /assets', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).put('/assets');
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
});
|
||||
|
||||
describe('POST /assets', () => {
|
||||
beforeAll(setupTests, 30_000);
|
||||
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post(`/assets`);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
expect(status).toBe(401);
|
||||
});
|
||||
|
||||
it.each([
|
||||
{ should: 'require `deviceAssetId`', dto: { ...makeUploadDto({ omit: 'deviceAssetId' }) } },
|
||||
{ should: 'require `deviceId`', dto: { ...makeUploadDto({ omit: 'deviceId' }) } },
|
||||
{ should: 'require `fileCreatedAt`', dto: { ...makeUploadDto({ omit: 'fileCreatedAt' }) } },
|
||||
{ should: 'require `fileModifiedAt`', dto: { ...makeUploadDto({ omit: 'fileModifiedAt' }) } },
|
||||
{ should: 'require `duration`', dto: { ...makeUploadDto({ omit: 'duration' }) } },
|
||||
{ should: 'throw if `isFavorite` is not a boolean', dto: { ...makeUploadDto(), isFavorite: 'not-a-boolean' } },
|
||||
{ should: 'throw if `isVisible` is not a boolean', dto: { ...makeUploadDto(), isVisible: 'not-a-boolean' } },
|
||||
{ should: 'throw if `isArchived` is not a boolean', dto: { ...makeUploadDto(), isArchived: 'not-a-boolean' } },
|
||||
])('should $should', async ({ dto }) => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/assets')
|
||||
.set('Authorization', `Bearer ${user1.accessToken}`)
|
||||
.attach('assetData', makeRandomImage(), 'example.png')
|
||||
.field(dto);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest());
|
||||
});
|
||||
|
||||
const tests = [
|
||||
{
|
||||
input: 'formats/avif/8bit-sRGB.avif',
|
||||
|
@ -1141,7 +980,7 @@ describe('/asset', () => {
|
|||
fNumber: 8,
|
||||
focalLength: 97,
|
||||
iso: 100,
|
||||
lensModel: 'E PZ 18-105mm F4 G OSS',
|
||||
lensModel: 'Sony E PZ 18-105mm F4 G OSS',
|
||||
fileSizeInByte: 25_001_984,
|
||||
dateTimeOriginal: '2016-09-27T10:51:44+00:00',
|
||||
orientation: '1',
|
||||
|
@ -1163,7 +1002,7 @@ describe('/asset', () => {
|
|||
fNumber: 22,
|
||||
focalLength: 25,
|
||||
iso: 100,
|
||||
lensModel: 'E 25mm F2',
|
||||
lensModel: 'Zeiss Batis 25mm F2',
|
||||
fileSizeInByte: 49_512_448,
|
||||
dateTimeOriginal: '2016-01-08T14:08:01+00:00',
|
||||
orientation: '1',
|
||||
|
@ -1234,7 +1073,7 @@ describe('/asset', () => {
|
|||
focalLength: 18.3,
|
||||
iso: 100,
|
||||
latitude: 36.613_24,
|
||||
lensModel: 'GR LENS 18.3mm F2.8',
|
||||
lensModel: '18.3mm F2.8',
|
||||
longitude: -121.897_85,
|
||||
make: 'RICOH IMAGING COMPANY, LTD.',
|
||||
model: 'RICOH GR III',
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
import { deleteAssets, getAuditFiles, updateAsset, type LoginResponseDto } from '@immich/sdk';
|
||||
import { asBearerAuth, utils } from 'src/utils';
|
||||
import { beforeAll, describe, expect, it } from 'vitest';
|
||||
|
||||
describe('/audits', () => {
|
||||
let admin: LoginResponseDto;
|
||||
|
||||
beforeAll(async () => {
|
||||
await utils.resetDatabase();
|
||||
await utils.resetFilesystem();
|
||||
|
||||
admin = await utils.adminSetup();
|
||||
});
|
||||
|
||||
// TODO: Enable these tests again once #7436 is resolved as these were flaky
|
||||
describe.skip('GET :/file-report', () => {
|
||||
it('excludes assets without issues from report', async () => {
|
||||
const [trashedAsset, archivedAsset] = await Promise.all([
|
||||
utils.createAsset(admin.accessToken),
|
||||
utils.createAsset(admin.accessToken),
|
||||
utils.createAsset(admin.accessToken),
|
||||
]);
|
||||
|
||||
await Promise.all([
|
||||
deleteAssets({ assetBulkDeleteDto: { ids: [trashedAsset.id] } }, { headers: asBearerAuth(admin.accessToken) }),
|
||||
updateAsset(
|
||||
{
|
||||
id: archivedAsset.id,
|
||||
updateAssetDto: { isArchived: true },
|
||||
},
|
||||
{ headers: asBearerAuth(admin.accessToken) },
|
||||
),
|
||||
]);
|
||||
|
||||
const body = await getAuditFiles({
|
||||
headers: asBearerAuth(admin.accessToken),
|
||||
});
|
||||
|
||||
expect(body.orphans).toHaveLength(0);
|
||||
expect(body.extras).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -5,7 +5,7 @@ import { app, utils } from 'src/utils';
|
|||
import request from 'supertest';
|
||||
import { beforeEach, describe, expect, it } from 'vitest';
|
||||
|
||||
const { name, email, password } = signupDto.admin;
|
||||
const { email, password } = signupDto.admin;
|
||||
|
||||
describe(`/auth/admin-sign-up`, () => {
|
||||
beforeEach(async () => {
|
||||
|
@ -13,33 +13,6 @@ describe(`/auth/admin-sign-up`, () => {
|
|||
});
|
||||
|
||||
describe('POST /auth/admin-sign-up', () => {
|
||||
const invalid = [
|
||||
{
|
||||
should: 'require an email address',
|
||||
data: { name, password },
|
||||
},
|
||||
{
|
||||
should: 'require a password',
|
||||
data: { name, email },
|
||||
},
|
||||
{
|
||||
should: 'require a name',
|
||||
data: { email, password },
|
||||
},
|
||||
{
|
||||
should: 'require a valid email',
|
||||
data: { name, email: 'immich', password },
|
||||
},
|
||||
];
|
||||
|
||||
for (const { should, data } of invalid) {
|
||||
it(`should ${should}`, async () => {
|
||||
const { status, body } = await request(app).post('/auth/admin-sign-up').send(data);
|
||||
expect(status).toEqual(400);
|
||||
expect(body).toEqual(errorDto.badRequest());
|
||||
});
|
||||
}
|
||||
|
||||
it(`should sign up the admin`, async () => {
|
||||
const { status, body } = await request(app).post('/auth/admin-sign-up').send(signupDto.admin);
|
||||
expect(status).toBe(201);
|
||||
|
@ -57,14 +30,6 @@ describe(`/auth/admin-sign-up`, () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('should transform email to lower case', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/auth/admin-sign-up')
|
||||
.send({ ...signupDto.admin, email: 'aDmIn@IMMICH.cloud' });
|
||||
expect(status).toEqual(201);
|
||||
expect(body).toEqual(signupResponseDto.admin);
|
||||
});
|
||||
|
||||
it('should not allow a second admin to sign up', async () => {
|
||||
await signUpAdmin({ signUpDto: signupDto.admin });
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import {
|
|||
startOAuth,
|
||||
updateConfig,
|
||||
} from '@immich/sdk';
|
||||
import { createHash, randomBytes } from 'node:crypto';
|
||||
import { errorDto } from 'src/responses';
|
||||
import { OAuthClient, OAuthUser } from 'src/setup/auth-server';
|
||||
import { app, asBearerAuth, baseUrl, utils } from 'src/utils';
|
||||
|
@ -21,18 +22,30 @@ const mobileOverrideRedirectUri = 'https://photos.immich.app/oauth/mobile-redire
|
|||
|
||||
const redirect = async (url: string, cookies?: string[]) => {
|
||||
const { headers } = await request(url)
|
||||
.get('/')
|
||||
.get('')
|
||||
.set('Cookie', cookies || []);
|
||||
return { cookies: (headers['set-cookie'] as unknown as string[]) || [], location: headers.location };
|
||||
};
|
||||
|
||||
// Function to generate a code challenge from the verifier
|
||||
const generateCodeChallenge = async (codeVerifier: string): Promise<string> => {
|
||||
const hashed = createHash('sha256').update(codeVerifier).digest();
|
||||
return hashed.toString('base64url');
|
||||
};
|
||||
|
||||
const loginWithOAuth = async (sub: OAuthUser | string, redirectUri?: string) => {
|
||||
const { url } = await startOAuth({ oAuthConfigDto: { redirectUri: redirectUri ?? `${baseUrl}/auth/login` } });
|
||||
const state = randomBytes(16).toString('base64url');
|
||||
const codeVerifier = randomBytes(64).toString('base64url');
|
||||
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
||||
|
||||
const { url } = await startOAuth({
|
||||
oAuthConfigDto: { redirectUri: redirectUri ?? `${baseUrl}/auth/login`, state, codeChallenge },
|
||||
});
|
||||
|
||||
// login
|
||||
const response1 = await redirect(url.replace(authServer.internal, authServer.external));
|
||||
const response2 = await request(authServer.external + response1.location)
|
||||
.post('/')
|
||||
.post('')
|
||||
.set('Cookie', response1.cookies)
|
||||
.type('form')
|
||||
.send({ prompt: 'login', login: sub, password: 'password' });
|
||||
|
@ -40,7 +53,7 @@ const loginWithOAuth = async (sub: OAuthUser | string, redirectUri?: string) =>
|
|||
// approve
|
||||
const response3 = await redirect(response2.header.location, response1.cookies);
|
||||
const response4 = await request(authServer.external + response3.location)
|
||||
.post('/')
|
||||
.post('')
|
||||
.type('form')
|
||||
.set('Cookie', response3.cookies)
|
||||
.send({ prompt: 'consent' });
|
||||
|
@ -51,9 +64,9 @@ const loginWithOAuth = async (sub: OAuthUser | string, redirectUri?: string) =>
|
|||
expect(redirectUrl).toBeDefined();
|
||||
const params = new URL(redirectUrl).searchParams;
|
||||
expect(params.get('code')).toBeDefined();
|
||||
expect(params.get('state')).toBeDefined();
|
||||
expect(params.get('state')).toBe(state);
|
||||
|
||||
return redirectUrl;
|
||||
return { url: redirectUrl, state, codeVerifier };
|
||||
};
|
||||
|
||||
const setupOAuth = async (token: string, dto: Partial<SystemConfigOAuthDto>) => {
|
||||
|
@ -119,9 +132,42 @@ describe(`/oauth`, () => {
|
|||
expect(body).toEqual(errorDto.badRequest(['url should not be empty']));
|
||||
});
|
||||
|
||||
it('should auto register the user by default', async () => {
|
||||
const url = await loginWithOAuth('oauth-auto-register');
|
||||
it(`should throw an error if the state is not provided`, async () => {
|
||||
const { url } = await loginWithOAuth('oauth-auto-register');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest('OAuth state is missing'));
|
||||
});
|
||||
|
||||
it(`should throw an error if the state mismatches`, async () => {
|
||||
const callbackParams = await loginWithOAuth('oauth-auto-register');
|
||||
const { state } = await loginWithOAuth('oauth-auto-register');
|
||||
const { status } = await request(app)
|
||||
.post('/oauth/callback')
|
||||
.send({ ...callbackParams, state });
|
||||
expect(status).toBeGreaterThanOrEqual(400);
|
||||
});
|
||||
|
||||
it(`should throw an error if the codeVerifier is not provided`, async () => {
|
||||
const { url, state } = await loginWithOAuth('oauth-auto-register');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url, state });
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest('OAuth code verifier is missing'));
|
||||
});
|
||||
|
||||
it(`should throw an error if the codeVerifier doesn't match the challenge`, async () => {
|
||||
const callbackParams = await loginWithOAuth('oauth-auto-register');
|
||||
const { codeVerifier } = await loginWithOAuth('oauth-auto-register');
|
||||
const { status, body } = await request(app)
|
||||
.post('/oauth/callback')
|
||||
.send({ ...callbackParams, codeVerifier });
|
||||
console.log(body);
|
||||
expect(status).toBeGreaterThanOrEqual(400);
|
||||
});
|
||||
|
||||
it('should auto register the user by default', async () => {
|
||||
const callbackParams = await loginWithOAuth('oauth-auto-register');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
accessToken: expect.any(String),
|
||||
|
@ -132,16 +178,30 @@ describe(`/oauth`, () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('should allow passing state and codeVerifier via cookies', async () => {
|
||||
const { url, state, codeVerifier } = await loginWithOAuth('oauth-auto-register');
|
||||
const { status, body } = await request(app)
|
||||
.post('/oauth/callback')
|
||||
.set('Cookie', [`immich_oauth_state=${state}`, `immich_oauth_code_verifier=${codeVerifier}`])
|
||||
.send({ url });
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
accessToken: expect.any(String),
|
||||
userId: expect.any(String),
|
||||
userEmail: 'oauth-auto-register@immich.app',
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a user without an email', async () => {
|
||||
const url = await loginWithOAuth(OAuthUser.NO_EMAIL);
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth(OAuthUser.NO_EMAIL);
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest('OAuth profile does not have an email address'));
|
||||
});
|
||||
|
||||
it('should set the quota from a claim', async () => {
|
||||
const url = await loginWithOAuth(OAuthUser.WITH_QUOTA);
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth(OAuthUser.WITH_QUOTA);
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
accessToken: expect.any(String),
|
||||
|
@ -154,8 +214,8 @@ describe(`/oauth`, () => {
|
|||
});
|
||||
|
||||
it('should set the storage label from a claim', async () => {
|
||||
const url = await loginWithOAuth(OAuthUser.WITH_USERNAME);
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth(OAuthUser.WITH_USERNAME);
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
accessToken: expect.any(String),
|
||||
|
@ -176,8 +236,8 @@ describe(`/oauth`, () => {
|
|||
buttonText: 'Login with Immich',
|
||||
signingAlgorithm: 'RS256',
|
||||
});
|
||||
const url = await loginWithOAuth('oauth-RS256-token');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth('oauth-RS256-token');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
accessToken: expect.any(String),
|
||||
|
@ -196,8 +256,8 @@ describe(`/oauth`, () => {
|
|||
buttonText: 'Login with Immich',
|
||||
profileSigningAlgorithm: 'RS256',
|
||||
});
|
||||
const url = await loginWithOAuth('oauth-signed-profile');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth('oauth-signed-profile');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
userId: expect.any(String),
|
||||
|
@ -213,8 +273,8 @@ describe(`/oauth`, () => {
|
|||
buttonText: 'Login with Immich',
|
||||
signingAlgorithm: 'something-that-does-not-work',
|
||||
});
|
||||
const url = await loginWithOAuth('oauth-signed-bad');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth('oauth-signed-bad');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(500);
|
||||
expect(body).toMatchObject({
|
||||
error: 'Internal Server Error',
|
||||
|
@ -235,8 +295,8 @@ describe(`/oauth`, () => {
|
|||
});
|
||||
|
||||
it('should not auto register the user', async () => {
|
||||
const url = await loginWithOAuth('oauth-no-auto-register');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth('oauth-no-auto-register');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest('User does not exist and auto registering is disabled.'));
|
||||
});
|
||||
|
@ -247,8 +307,8 @@ describe(`/oauth`, () => {
|
|||
email: 'oauth-user3@immich.app',
|
||||
password: 'password',
|
||||
});
|
||||
const url = await loginWithOAuth('oauth-user3');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url });
|
||||
const callbackParams = await loginWithOAuth('oauth-user3');
|
||||
const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
userId,
|
||||
|
@ -286,13 +346,15 @@ describe(`/oauth`, () => {
|
|||
});
|
||||
|
||||
it('should auto register the user by default', async () => {
|
||||
const url = await loginWithOAuth('oauth-mobile-override', 'app.immich:///oauth-callback');
|
||||
expect(url).toEqual(expect.stringContaining(mobileOverrideRedirectUri));
|
||||
const callbackParams = await loginWithOAuth('oauth-mobile-override', 'app.immich:///oauth-callback');
|
||||
expect(callbackParams.url).toEqual(expect.stringContaining(mobileOverrideRedirectUri));
|
||||
|
||||
// simulate redirecting back to mobile app
|
||||
const redirectUri = url.replace(mobileOverrideRedirectUri, 'app.immich:///oauth-callback');
|
||||
const url = callbackParams.url.replace(mobileOverrideRedirectUri, 'app.immich:///oauth-callback');
|
||||
|
||||
const { status, body } = await request(app).post('/oauth/callback').send({ url: redirectUri });
|
||||
const { status, body } = await request(app)
|
||||
.post('/oauth/callback')
|
||||
.send({ ...callbackParams, url });
|
||||
expect(status).toBe(201);
|
||||
expect(body).toMatchObject({
|
||||
accessToken: expect.any(String),
|
||||
|
|
|
@ -3,7 +3,6 @@ import { DateTime } from 'luxon';
|
|||
import { readFile } from 'node:fs/promises';
|
||||
import { join } from 'node:path';
|
||||
import { Socket } from 'socket.io-client';
|
||||
import { errorDto } from 'src/responses';
|
||||
import { app, asBearerAuth, TEN_TIMES, testAssetDir, utils } from 'src/utils';
|
||||
import request from 'supertest';
|
||||
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
||||
|
@ -141,65 +140,6 @@ describe('/search', () => {
|
|||
});
|
||||
|
||||
describe('POST /search/metadata', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post('/search/metadata');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
const badTests = [
|
||||
{
|
||||
should: 'should reject page as a string',
|
||||
dto: { page: 'abc' },
|
||||
expected: ['page must not be less than 1', 'page must be an integer number'],
|
||||
},
|
||||
{
|
||||
should: 'should reject page as a decimal',
|
||||
dto: { page: 1.5 },
|
||||
expected: ['page must be an integer number'],
|
||||
},
|
||||
{
|
||||
should: 'should reject page as a negative number',
|
||||
dto: { page: -10 },
|
||||
expected: ['page must not be less than 1'],
|
||||
},
|
||||
{
|
||||
should: 'should reject page as 0',
|
||||
dto: { page: 0 },
|
||||
expected: ['page must not be less than 1'],
|
||||
},
|
||||
{
|
||||
should: 'should reject size as a string',
|
||||
dto: { size: 'abc' },
|
||||
expected: [
|
||||
'size must not be greater than 1000',
|
||||
'size must not be less than 1',
|
||||
'size must be an integer number',
|
||||
],
|
||||
},
|
||||
{
|
||||
should: 'should reject an invalid size',
|
||||
dto: { size: -1.5 },
|
||||
expected: ['size must not be less than 1', 'size must be an integer number'],
|
||||
},
|
||||
...['isArchived', 'isFavorite', 'isEncoded', 'isOffline', 'isMotion', 'isVisible'].map((value) => ({
|
||||
should: `should reject ${value} not a boolean`,
|
||||
dto: { [value]: 'immich' },
|
||||
expected: [`${value} must be a boolean value`],
|
||||
})),
|
||||
];
|
||||
|
||||
for (const { should, dto, expected } of badTests) {
|
||||
it(should, async () => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/search/metadata')
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`)
|
||||
.send(dto);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest(expected));
|
||||
});
|
||||
}
|
||||
|
||||
const searchTests = [
|
||||
{
|
||||
should: 'should get my assets',
|
||||
|
@ -454,14 +394,6 @@ describe('/search', () => {
|
|||
}
|
||||
});
|
||||
|
||||
describe('POST /search/smart', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post('/search/smart');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
});
|
||||
|
||||
describe('POST /search/random', () => {
|
||||
beforeAll(async () => {
|
||||
await Promise.all([
|
||||
|
@ -476,13 +408,6 @@ describe('/search', () => {
|
|||
await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration');
|
||||
});
|
||||
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post('/search/random').send({ size: 1 });
|
||||
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it.each(TEN_TIMES)('should return 1 random assets', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.post('/search/random')
|
||||
|
@ -512,12 +437,6 @@ describe('/search', () => {
|
|||
});
|
||||
|
||||
describe('GET /search/explore', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/search/explore');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should get explore data', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/search/explore')
|
||||
|
@ -528,12 +447,6 @@ describe('/search', () => {
|
|||
});
|
||||
|
||||
describe('GET /search/places', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/search/places');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should get relevant places', async () => {
|
||||
const name = 'Paris';
|
||||
|
||||
|
@ -552,12 +465,6 @@ describe('/search', () => {
|
|||
});
|
||||
|
||||
describe('GET /search/cities', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/search/cities');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should get all cities', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/search/cities')
|
||||
|
@ -576,12 +483,6 @@ describe('/search', () => {
|
|||
});
|
||||
|
||||
describe('GET /search/suggestions', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/search/suggestions');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should get suggestions for country (including null)', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/search/suggestions?type=country&includeNull=true')
|
||||
|
|
|
@ -246,15 +246,7 @@ describe('/shared-links', () => {
|
|||
const { status, body } = await request(app).get('/shared-links/me').query({ key: linkWithMetadata.key });
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(body.assets).toHaveLength(1);
|
||||
expect(body.assets[0]).toEqual(
|
||||
expect.objectContaining({
|
||||
originalFileName: 'example.png',
|
||||
localDateTime: expect.any(String),
|
||||
fileCreatedAt: expect.any(String),
|
||||
exifInfo: expect.any(Object),
|
||||
}),
|
||||
);
|
||||
expect(body.assets).toHaveLength(0);
|
||||
expect(body.album).toBeDefined();
|
||||
});
|
||||
|
||||
|
|
|
@ -215,6 +215,19 @@ describe('/admin/users', () => {
|
|||
const user = await getMyUser({ headers: asBearerAuth(token.accessToken) });
|
||||
expect(user).toMatchObject({ email: nonAdmin.userEmail });
|
||||
});
|
||||
|
||||
it('should update the avatar color', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/admin/users/${admin.userId}`)
|
||||
.send({ avatarColor: 'orange' })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(body).toMatchObject({ avatarColor: 'orange' });
|
||||
|
||||
const after = await getUserAdmin({ id: admin.userId }, { headers: asBearerAuth(admin.accessToken) });
|
||||
expect(after).toMatchObject({ avatarColor: 'orange' });
|
||||
});
|
||||
});
|
||||
|
||||
describe('PUT /admin/users/:id/preferences', () => {
|
||||
|
@ -240,19 +253,6 @@ describe('/admin/users', () => {
|
|||
expect(after).toMatchObject({ memories: { enabled: false } });
|
||||
});
|
||||
|
||||
it('should update the avatar color', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/admin/users/${admin.userId}/preferences`)
|
||||
.send({ avatar: { color: 'orange' } })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(body).toMatchObject({ avatar: { color: 'orange' } });
|
||||
|
||||
const after = await getUserPreferencesAdmin({ id: admin.userId }, { headers: asBearerAuth(admin.accessToken) });
|
||||
expect(after).toMatchObject({ avatar: { color: 'orange' } });
|
||||
});
|
||||
|
||||
it('should update download archive size', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/admin/users/${admin.userId}/preferences`)
|
||||
|
|
|
@ -31,33 +31,7 @@ describe('/users', () => {
|
|||
);
|
||||
});
|
||||
|
||||
describe('GET /users', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/users');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should get users', async () => {
|
||||
const { status, body } = await request(app).get('/users').set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(status).toEqual(200);
|
||||
expect(body).toHaveLength(2);
|
||||
expect(body).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ email: 'admin@immich.cloud' }),
|
||||
expect.objectContaining({ email: 'user2@immich.cloud' }),
|
||||
]),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('GET /users/me', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/users/me`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should not work for shared links', async () => {
|
||||
const album = await utils.createAlbum(admin.accessToken, { albumName: 'Album' });
|
||||
const sharedLink = await utils.createSharedLink(admin.accessToken, {
|
||||
|
@ -99,24 +73,6 @@ describe('/users', () => {
|
|||
});
|
||||
|
||||
describe('PUT /users/me', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).put(`/users/me`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
for (const key of ['email', 'name']) {
|
||||
it(`should not allow null ${key}`, async () => {
|
||||
const dto = { [key]: null };
|
||||
const { status, body } = await request(app)
|
||||
.put(`/users/me`)
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`)
|
||||
.send(dto);
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest());
|
||||
});
|
||||
}
|
||||
|
||||
it('should update first and last name', async () => {
|
||||
const before = await getMyUser({ headers: asBearerAuth(admin.accessToken) });
|
||||
|
||||
|
@ -183,6 +139,19 @@ describe('/users', () => {
|
|||
profileChangedAt: expect.anything(),
|
||||
});
|
||||
});
|
||||
|
||||
it('should update avatar color', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/users/me`)
|
||||
.send({ avatarColor: 'blue' })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(body).toMatchObject({ avatarColor: 'blue' });
|
||||
|
||||
const after = await getMyUser({ headers: asBearerAuth(admin.accessToken) });
|
||||
expect(after).toMatchObject({ avatarColor: 'blue' });
|
||||
});
|
||||
});
|
||||
|
||||
describe('PUT /users/me/preferences', () => {
|
||||
|
@ -202,19 +171,6 @@ describe('/users', () => {
|
|||
expect(after).toMatchObject({ memories: { enabled: false } });
|
||||
});
|
||||
|
||||
it('should update avatar color', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/users/me/preferences`)
|
||||
.send({ avatar: { color: 'blue' } })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(body).toMatchObject({ avatar: { color: 'blue' } });
|
||||
|
||||
const after = await getMyPreferences({ headers: asBearerAuth(admin.accessToken) });
|
||||
expect(after).toMatchObject({ avatar: { color: 'blue' } });
|
||||
});
|
||||
|
||||
it('should require an integer for download archive size', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/users/me/preferences`)
|
||||
|
@ -269,11 +225,6 @@ describe('/users', () => {
|
|||
});
|
||||
|
||||
describe('GET /users/:id', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status } = await request(app).get(`/users/${admin.userId}`);
|
||||
expect(status).toEqual(401);
|
||||
});
|
||||
|
||||
it('should get the user', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get(`/users/${admin.userId}`)
|
||||
|
@ -292,12 +243,6 @@ describe('/users', () => {
|
|||
});
|
||||
|
||||
describe('GET /server/license', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get('/users/me/license');
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should return the user license', async () => {
|
||||
await request(app)
|
||||
.put('/users/me/license')
|
||||
|
@ -315,11 +260,6 @@ describe('/users', () => {
|
|||
});
|
||||
|
||||
describe('PUT /users/me/license', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status } = await request(app).put(`/users/me/license`);
|
||||
expect(status).toEqual(401);
|
||||
});
|
||||
|
||||
it('should set the user license', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.put(`/users/me/license`)
|
||||
|
|
|
@ -25,7 +25,7 @@ test.describe('Registration', () => {
|
|||
|
||||
// login
|
||||
await expect(page).toHaveTitle(/Login/);
|
||||
await page.goto('/auth/login');
|
||||
await page.goto('/auth/login?autoLaunch=0');
|
||||
await page.getByLabel('Email').fill('admin@immich.app');
|
||||
await page.getByLabel('Password').fill('password');
|
||||
await page.getByRole('button', { name: 'Login' }).click();
|
||||
|
@ -59,7 +59,7 @@ test.describe('Registration', () => {
|
|||
await context.clearCookies();
|
||||
|
||||
// login
|
||||
await page.goto('/auth/login');
|
||||
await page.goto('/auth/login?autoLaunch=0');
|
||||
await page.getByLabel('Email').fill('user@immich.cloud');
|
||||
await page.getByLabel('Password').fill('password');
|
||||
await page.getByRole('button', { name: 'Login' }).click();
|
||||
|
@ -72,7 +72,7 @@ test.describe('Registration', () => {
|
|||
await page.getByRole('button', { name: 'Change password' }).click();
|
||||
|
||||
// login with new password
|
||||
await expect(page).toHaveURL('/auth/login');
|
||||
await expect(page).toHaveURL('/auth/login?autoLaunch=0');
|
||||
await page.getByLabel('Email').fill('user@immich.cloud');
|
||||
await page.getByLabel('Password').fill('new-password');
|
||||
await page.getByRole('button', { name: 'Login' }).click();
|
||||
|
|
|
@ -21,23 +21,9 @@ test.describe('Photo Viewer', () => {
|
|||
test.beforeEach(async ({ context, page }) => {
|
||||
// before each test, login as user
|
||||
await utils.setAuthCookies(context, admin.accessToken);
|
||||
await page.goto('/photos');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('initially shows a loading spinner', async ({ page }) => {
|
||||
await page.route(`/api/assets/${asset.id}/thumbnail**`, async (route) => {
|
||||
// slow down the request for thumbnail, so spinner has chance to show up
|
||||
await new Promise((f) => setTimeout(f, 2000));
|
||||
await route.continue();
|
||||
});
|
||||
await page.goto(`/photos/${asset.id}`);
|
||||
await page.waitForLoadState('load');
|
||||
// this is the spinner
|
||||
await page.waitForSelector('svg[role=status]');
|
||||
await expect(page.getByTestId('loading-spinner')).toBeVisible();
|
||||
});
|
||||
|
||||
test('loads original photo when zoomed', async ({ page }) => {
|
||||
await page.goto(`/photos/${asset.id}`);
|
||||
await expect.poll(async () => await imageLocator(page).getAttribute('src')).toContain('thumbnail');
|
||||
|
|
|
@ -48,14 +48,14 @@ test.describe('Shared Links', () => {
|
|||
await page.waitForSelector('[data-group] svg');
|
||||
await page.getByRole('checkbox').click();
|
||||
await page.getByRole('button', { name: 'Download' }).click();
|
||||
await page.getByText('DOWNLOADING', { exact: true }).waitFor();
|
||||
await page.waitForEvent('download');
|
||||
});
|
||||
|
||||
test('download all from shared link', async ({ page }) => {
|
||||
await page.goto(`/share/${sharedLink.key}`);
|
||||
await page.getByRole('heading', { name: 'Test Album' }).waitFor();
|
||||
await page.getByRole('button', { name: 'Download' }).click();
|
||||
await page.getByText('DOWNLOADING', { exact: true }).waitFor();
|
||||
await page.waitForEvent('download');
|
||||
});
|
||||
|
||||
test('enter password for a shared link', async ({ page }) => {
|
||||
|
|
516
i18n/ar.json
516
i18n/ar.json
File diff suppressed because it is too large
Load diff
19
i18n/be.json
19
i18n/be.json
|
@ -4,6 +4,7 @@
|
|||
"account_settings": "Налады ўліковага запісу",
|
||||
"acknowledge": "Пацвердзіць",
|
||||
"action": "Дзеянне",
|
||||
"action_common_update": "Абнавіць",
|
||||
"actions": "Дзеянні",
|
||||
"active": "Актыўны",
|
||||
"activity": "Актыўнасць",
|
||||
|
@ -13,6 +14,7 @@
|
|||
"add_a_location": "Дадаць месца",
|
||||
"add_a_name": "Дадаць імя",
|
||||
"add_a_title": "Дадаць загаловак",
|
||||
"add_endpoint": "Дадаць кропку доступу",
|
||||
"add_exclusion_pattern": "Дадаць шаблон выключэння",
|
||||
"add_import_path": "Дадаць шлях імпарту",
|
||||
"add_location": "Дадайце месца",
|
||||
|
@ -20,8 +22,10 @@
|
|||
"add_partner": "Дадаць партнёра",
|
||||
"add_path": "Дадаць шлях",
|
||||
"add_photos": "Дадаць фота",
|
||||
"add_to": "Дадаць у...",
|
||||
"add_to": "Дадаць у…",
|
||||
"add_to_album": "Дадаць у альбом",
|
||||
"add_to_album_bottom_sheet_added": "Дададзена да {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Ужо знаходзіцца ў {album}",
|
||||
"add_to_shared_album": "Дадаць у агульны альбом",
|
||||
"add_url": "Дадаць URL",
|
||||
"added_to_archive": "Дададзена ў архіў",
|
||||
|
@ -39,8 +43,9 @@
|
|||
"backup_database_enable_description": "Уключыць рэзерваванне базы даных",
|
||||
"backup_keep_last_amount": "Колькасць папярэдніх рэзервовых копій для захавання",
|
||||
"backup_settings": "Налады рэзервовага капіявання",
|
||||
"backup_settings_description": "Кіраванне наладкамі рэзервовага капіявання базы даных",
|
||||
"backup_settings_description": "Кіраванне наладамі дампа базы дадзеных. Заўвага: гэтыя задачы не кантралююцца, і ў выпадку няўдачы паведамленне адпраўлена не будзе.",
|
||||
"check_all": "Праверыць усе",
|
||||
"cleanup": "Ачыстка",
|
||||
"cleared_jobs": "Ачышчаны заданні для: {job}",
|
||||
"config_set_by_file": "Канфігурацыя ў зараз усталявана праз файл канфігурацыі",
|
||||
"confirm_delete_library": "Вы ўпэўнены што жадаеце выдаліць {library} бібліятэку?",
|
||||
|
@ -58,8 +63,18 @@
|
|||
"external_library_created_at": "Знешняя бібліятэка (створана {date})",
|
||||
"external_library_management": "Кіраванне знешняй бібліятэкай",
|
||||
"face_detection": "Выяўленне твараў",
|
||||
"face_detection_description": "Выяўляць твары на фотаздымках і відэа з дапамогай машыннага навучання. Для відэа ўлічваецца толькі мініяцюра. \"Абнавіць\" (пера)апрацоўвае ўсе медыя. \"Скінуць\" дадаткова ачышчае ўсе бягучыя дадзеныя пра твары. \"Адсутнічае\" ставіць у чаргу медыя, якія яшчэ не былі апрацаваныя. Выяўленыя твары будуць пастаўлены ў чаргу для распазнавання асоб пасля завяршэння выяўлення твараў, з групаваннем іх па існуючых або новых людзях.",
|
||||
"facial_recognition_job_description": "Групаваць выяўленыя твары па асобах. Гэты этап выконваецца пасля завяршэння выяўлення твараў. \"Скінуць\" (паўторна) перагрупоўвае ўсе твары. \"Адсутнічае\" ставіць у чаргу твары, якія яшчэ не прыпісаныя да якой-небудзь асобы.",
|
||||
"failed_job_command": "Каманда {command} не выканалася для задання: {job}",
|
||||
"force_delete_user_warning": "ПАПЯРЭДЖАННЕ: Гэта дзеянне неадкладна выдаліць карыстальніка і ўсе аб'екты. Гэта дзеянне не можа быць адроблена і файлы немагчыма будзе аднавіць.",
|
||||
"forcing_refresh_library_files": "Прымусовае абнаўленне ўсіх файлаў бібліятэкі",
|
||||
"image_format": "Фармат",
|
||||
"image_format_description": "WebP стварае меншыя файлы, чым JPEG, але павольней кадуе.",
|
||||
"image_fullsize_description": "Выява ў поўным памеры без метаданых, выкарыстоўваецца пры павелічэнні",
|
||||
"image_fullsize_enabled": "Уключыць стварэнне выявы ў поўным памеры",
|
||||
"image_fullsize_enabled_description": "Ствараць выяву ў поўным памеры для фарматаў, што не прыдатныя для вэб. Калі ўключана опцыя \"Аддаваць перавагу ўбудаванай праяве\", прагляды выкарыстоўваюцца непасрэдна без канвертацыі. Не ўплывае на вэб-прыдатныя фарматы, такія як JPEG.",
|
||||
"image_fullsize_quality_description": "Якасць выявы ў поўным памеры ад 1 да 100. Больш высокае значэнне лепшае, але прыводзіць да павелічэння памеру файла.",
|
||||
"image_fullsize_title": "Налады выявы ў поўным памеры",
|
||||
"image_preview_title": "Налады папярэдняга прагляду",
|
||||
"image_quality": "Якасць",
|
||||
"image_resolution": "Раздзяляльнасць",
|
||||
|
|
11
i18n/bg.json
11
i18n/bg.json
|
@ -162,7 +162,6 @@
|
|||
"no_pattern_added": "Няма добавен модел",
|
||||
"note_apply_storage_label_previous_assets": "Забележка: За да приложите етикета за съхранение към предварително качени файлове, стартирайте",
|
||||
"note_cannot_be_changed_later": "ВНИМАНИЕ: Това не може да бъде променено по-късно!",
|
||||
"note_unlimited_quota": "Бележка: Въведете 0 за да нямате лимит на квотата",
|
||||
"notification_email_from_address": "От адрес",
|
||||
"notification_email_from_address_description": "Електронна поща на изпращача, например: \"Immich Photo Server <noreply@example.com>\"",
|
||||
"notification_email_host_description": "Хост на сървъра за електронна поща (например: smtp.immich.app)",
|
||||
|
@ -184,20 +183,13 @@
|
|||
"oauth_auto_register": "Автоматична регистрация",
|
||||
"oauth_auto_register_description": "Автоматично регистриране на нови потребители след влизане с OAuth",
|
||||
"oauth_button_text": "Текст на бутона",
|
||||
"oauth_client_id": "Клиентски ID",
|
||||
"oauth_client_secret": "Клиентска тайна",
|
||||
"oauth_enable_description": "Влизане с OAuth",
|
||||
"oauth_issuer_url": "URL на издателя",
|
||||
"oauth_mobile_redirect_uri": "URI за мобилно пренасочване",
|
||||
"oauth_mobile_redirect_uri_override": "URI пренасочване за мобилни устройства",
|
||||
"oauth_mobile_redirect_uri_override_description": "Разреши когато доставчика за OAuth удостоверяване не позволява за мобилни URI идентификатори, като '{callback}'",
|
||||
"oauth_profile_signing_algorithm": "Алгоритъм за създаване на профили",
|
||||
"oauth_profile_signing_algorithm_description": "Алгоритъм използван за вписване на потребителски профил.",
|
||||
"oauth_scope": "Област/обхват на приложение",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Управление на настройките за вход с OAuth",
|
||||
"oauth_settings_more_details": "За повече информация за функционалността, се потърсете в <link>docs</link>.",
|
||||
"oauth_signing_algorithm": "Алгоритъм за вписване",
|
||||
"oauth_storage_label_claim": "Заявка за етикет за съхранение",
|
||||
"oauth_storage_label_claim_description": "Автоматично задайте етикета за съхранение на потребителя със стойността от тази заявка.",
|
||||
"oauth_storage_quota_claim": "Заявка за квота за съхранение",
|
||||
|
@ -923,7 +915,6 @@
|
|||
"no_shared_albums_message": "Създайте албум, за да споделяте снимки и видеоклипове с хората в мрежата си",
|
||||
"not_in_any_album": "Не е в никой албум",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "Забележка: За да приложите етикета за съхранение към предварително качени активи, стартирайте",
|
||||
"note_unlimited_quota": "Забележка: Въведете 0 за неограничена квота",
|
||||
"notes": "Бележки",
|
||||
"notification_toggle_setting_description": "Активиране на имейл известия",
|
||||
"notifications": "Известия",
|
||||
|
@ -1374,4 +1365,4 @@
|
|||
"yes": "Да",
|
||||
"you_dont_have_any_shared_links": "Нямате споделени връзки",
|
||||
"zoom_image": "Увеличаване на изображението"
|
||||
}
|
||||
}
|
||||
|
|
37
i18n/bi.json
37
i18n/bi.json
|
@ -1,20 +1,22 @@
|
|||
{
|
||||
"account": "",
|
||||
"account_settings": "",
|
||||
"acknowledge": "",
|
||||
"about": "abaot",
|
||||
"account": "Akaont",
|
||||
"account_settings": "Seting blo Akaont",
|
||||
"acknowledge": "Akcept",
|
||||
"action": "",
|
||||
"actions": "",
|
||||
"active": "",
|
||||
"activity": "",
|
||||
"add": "",
|
||||
"add_a_description": "",
|
||||
"add_a_location": "",
|
||||
"add_a_name": "",
|
||||
"add_a_title": "",
|
||||
"add_exclusion_pattern": "",
|
||||
"add_import_path": "",
|
||||
"add_location": "",
|
||||
"add_more_users": "",
|
||||
"active": "Stap Mekem",
|
||||
"activity": "Wanem hemi Mekem",
|
||||
"activity_changed": "WAnem hemi Mekem hemi",
|
||||
"add": "Ad",
|
||||
"add_a_description": "Putem Description blo hem",
|
||||
"add_a_location": "Putem place blo hem",
|
||||
"add_a_name": "Putem nam blo hem",
|
||||
"add_a_title": "Putem wan name blo hem",
|
||||
"add_exclusion_pattern": "Putem wan paten wae hemi karem aot",
|
||||
"add_import_path": "Putem wan pat blo import",
|
||||
"add_location": "Putem wan place blo hem",
|
||||
"add_more_users": "Putem mor man",
|
||||
"add_partner": "",
|
||||
"add_path": "",
|
||||
"add_photos": "",
|
||||
|
@ -116,7 +118,6 @@
|
|||
"no_pattern_added": "",
|
||||
"note_apply_storage_label_previous_assets": "",
|
||||
"note_cannot_be_changed_later": "",
|
||||
"note_unlimited_quota": "",
|
||||
"notification_email_from_address": "",
|
||||
"notification_email_from_address_description": "",
|
||||
"notification_email_host_description": "",
|
||||
|
@ -137,17 +138,12 @@
|
|||
"oauth_auto_register": "",
|
||||
"oauth_auto_register_description": "",
|
||||
"oauth_button_text": "",
|
||||
"oauth_client_id": "",
|
||||
"oauth_client_secret": "",
|
||||
"oauth_enable_description": "",
|
||||
"oauth_issuer_url": "",
|
||||
"oauth_mobile_redirect_uri": "",
|
||||
"oauth_mobile_redirect_uri_override": "",
|
||||
"oauth_mobile_redirect_uri_override_description": "",
|
||||
"oauth_scope": "",
|
||||
"oauth_settings": "",
|
||||
"oauth_settings_description": "",
|
||||
"oauth_signing_algorithm": "",
|
||||
"oauth_storage_label_claim": "",
|
||||
"oauth_storage_label_claim_description": "",
|
||||
"oauth_storage_quota_claim": "",
|
||||
|
@ -612,7 +608,6 @@
|
|||
"no_shared_albums_message": "",
|
||||
"not_in_any_album": "",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "",
|
||||
"note_unlimited_quota": "",
|
||||
"notes": "",
|
||||
"notification_toggle_setting_description": "",
|
||||
"notifications": "",
|
||||
|
|
541
i18n/ca.json
541
i18n/ca.json
File diff suppressed because it is too large
Load diff
564
i18n/cs.json
564
i18n/cs.json
File diff suppressed because it is too large
Load diff
524
i18n/da.json
524
i18n/da.json
File diff suppressed because it is too large
Load diff
570
i18n/de.json
570
i18n/de.json
File diff suppressed because it is too large
Load diff
563
i18n/el.json
563
i18n/el.json
File diff suppressed because it is too large
Load diff
574
i18n/en.json
574
i18n/en.json
File diff suppressed because it is too large
Load diff
585
i18n/es.json
585
i18n/es.json
File diff suppressed because it is too large
Load diff
344
i18n/et.json
344
i18n/et.json
|
@ -4,6 +4,7 @@
|
|||
"account_settings": "Konto seaded",
|
||||
"acknowledge": "Sain aru",
|
||||
"action": "Tegevus",
|
||||
"action_common_update": "Uuenda",
|
||||
"actions": "Tegevused",
|
||||
"active": "Aktiivne",
|
||||
"activity": "Aktiivsus",
|
||||
|
@ -13,6 +14,7 @@
|
|||
"add_a_location": "Lisa asukoht",
|
||||
"add_a_name": "Lisa nimi",
|
||||
"add_a_title": "Lisa pealkiri",
|
||||
"add_endpoint": "Lisa lõpp-punkt",
|
||||
"add_exclusion_pattern": "Lisa välistamismuster",
|
||||
"add_import_path": "Lisa imporditee",
|
||||
"add_location": "Lisa asukoht",
|
||||
|
@ -22,6 +24,8 @@
|
|||
"add_photos": "Lisa fotosid",
|
||||
"add_to": "Lisa kohta…",
|
||||
"add_to_album": "Lisa albumisse",
|
||||
"add_to_album_bottom_sheet_added": "Lisatud albumisse {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "On juba albumis {album}",
|
||||
"add_to_shared_album": "Lisa jagatud albumisse",
|
||||
"add_url": "Lisa URL",
|
||||
"added_to_archive": "Lisatud arhiivi",
|
||||
|
@ -35,11 +39,11 @@
|
|||
"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>.",
|
||||
"background_task_job": "Tausttegumid",
|
||||
"backup_database": "Varunda andmebaas",
|
||||
"backup_database_enable_description": "Luba andmebaasi varundamine",
|
||||
"backup_keep_last_amount": "Varukoopiate arv, mida alles hoida",
|
||||
"backup_settings": "Varundamise seaded",
|
||||
"backup_settings_description": "Halda andmebaasi varundamise seadeid",
|
||||
"backup_database": "Loo andmebaasi tõmmis",
|
||||
"backup_database_enable_description": "Luba andmebaasi tõmmised",
|
||||
"backup_keep_last_amount": "Eelmiste tõmmiste arv, mida alles hoida",
|
||||
"backup_settings": "Andmebaasi tõmmiste seaded",
|
||||
"backup_settings_description": "Halda andmebaasi tõmmiste seadeid. Märkus: Neid tööteid ei jälgita ning ebaõnnestumisest ei hoiatata.",
|
||||
"check_all": "Märgi kõik",
|
||||
"cleanup": "Koristus",
|
||||
"cleared_jobs": "Tööted eemaldatud: {job}",
|
||||
|
@ -66,6 +70,11 @@
|
|||
"forcing_refresh_library_files": "Kogu kõigi failide sundvärskendamine",
|
||||
"image_format": "Formaat",
|
||||
"image_format_description": "WebP failid on väiksemad kui JPEG, aga kodeerimine on aeglasem.",
|
||||
"image_fullsize_description": "Täismõõdus pilt ilma metaandmeteta, kasutatakse sisse suumimisel",
|
||||
"image_fullsize_enabled": "Luba täismõõdus piltide genereerimine",
|
||||
"image_fullsize_enabled_description": "Genereeri mitte-veebisõbralike formaatide jaoks täismõõdus pilt. Kui \"Eelista manustatud eelvaadet\" on lubatud, kasutatakse manustatud eelvaateid otse ilma teisendamiseta. Ei mõjuta veebisõbralikke formaate nagu JPEG.",
|
||||
"image_fullsize_quality_description": "Täismõõdus pildi kvaliteet vahemikus 1-100. Kõrgem väärtus on parem, aga tulemuseks on suuremad failid.",
|
||||
"image_fullsize_title": "Täismõõdus pildi seaded",
|
||||
"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_wide_gamut": "Eelista laia värvigammat",
|
||||
|
@ -162,7 +171,6 @@
|
|||
"no_pattern_added": "Mustreid ei ole",
|
||||
"note_apply_storage_label_previous_assets": "Märkus: Et rakendada talletussilt varem üleslaaditud üksustele, käivita",
|
||||
"note_cannot_be_changed_later": "MÄRKUS: Seda ei saa hiljem muuta!",
|
||||
"note_unlimited_quota": "Märkus: Piiramatu kvoodi jaoks sisesta 0",
|
||||
"notification_email_from_address": "Saatja aadress",
|
||||
"notification_email_from_address_description": "Saatja e-posti aadress, näiteks: \"Immich Photo Server <noreply@example.com>\"",
|
||||
"notification_email_host_description": "E-posti serveri host (nt. smtp.immich.app)",
|
||||
|
@ -184,26 +192,22 @@
|
|||
"oauth_auto_register": "Automaatne registreerimine",
|
||||
"oauth_auto_register_description": "Registreeri uued kasutajad automaatselt OAuth abil sisselogimisel",
|
||||
"oauth_button_text": "Nupu tekst",
|
||||
"oauth_client_id": "Kliendi ID",
|
||||
"oauth_client_secret": "Kliendi saladus",
|
||||
"oauth_client_secret_description": "Nõutud, kui PKCE (Proof Key for Code Exchange) ei ole OAuth pakkuja poolt toetatud",
|
||||
"oauth_enable_description": "Sisene OAuth abil",
|
||||
"oauth_issuer_url": "Väljastaja URL",
|
||||
"oauth_mobile_redirect_uri": "Mobiilne ümbersuunamise URI",
|
||||
"oauth_mobile_redirect_uri_override": "Mobiilse ümbersuunamise URI ülekirjutamine",
|
||||
"oauth_mobile_redirect_uri_override_description": "Lülita sisse, kui OAuth pakkuja ei luba mobiilset URI-d, näiteks '{callback}'",
|
||||
"oauth_profile_signing_algorithm": "Profiili allkirjastamise algoritm",
|
||||
"oauth_profile_signing_algorithm_description": "Algoritm, mida kasutatakse kasutajaprofiili allkirjastamiseks.",
|
||||
"oauth_scope": "Skoop",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Halda OAuth sisselogimise seadeid",
|
||||
"oauth_settings_more_details": "Selle funktsiooni kohta rohkem teada saamiseks loe <link>dokumentatsiooni</link>.",
|
||||
"oauth_signing_algorithm": "Allkirjastamise algoritm",
|
||||
"oauth_storage_label_claim": "Talletussildi väide",
|
||||
"oauth_storage_label_claim_description": "Sea kasutaja talletussildiks automaatselt selle väite väärtus.",
|
||||
"oauth_storage_quota_claim": "Talletuskvoodi väide",
|
||||
"oauth_storage_quota_claim_description": "Sea kasutaja talletuskvoodiks automaatselt selle väite väärtus.",
|
||||
"oauth_storage_quota_default": "Vaikimisi talletuskvoot (GiB)",
|
||||
"oauth_storage_quota_default_description": "Kvoot (GiB), mida kasutada, kui ühtegi väidet pole esitatud (piiramatu kvoodi jaoks sisesta 0).",
|
||||
"oauth_timeout": "Päringu ajalõpp",
|
||||
"oauth_timeout_description": "Päringute ajalõpp millisekundites",
|
||||
"offline_paths": "Ühenduseta failiteed",
|
||||
"offline_paths_description": "Need tulemused võivad olla põhjustatud manuaalselt kustutatud failidest, mis ei ole osa välisest kogust.",
|
||||
"password_enable_description": "Logi sisse e-posti aadressi ja parooliga",
|
||||
|
@ -363,6 +367,19 @@
|
|||
"admin_password": "Administraatori parool",
|
||||
"administration": "Administratsioon",
|
||||
"advanced": "Täpsemad valikud",
|
||||
"advanced_settings_enable_alternate_media_filter_subtitle": "Kasuta seda valikut, et filtreerida sünkroonimise ajal üksuseid alternatiivsete kriteeriumite alusel. Proovi seda ainult siis, kui rakendusel on probleeme kõigi albumite tuvastamisega.",
|
||||
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAALNE] Kasuta alternatiivset seadme albumi sünkroonimise filtrit",
|
||||
"advanced_settings_log_level_title": "Logimistase: {}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Mõned seadmed laadivad seadmes olevate üksuste pisipilte piinavalt aeglaselt. Aktiveeri see seadistus, et laadida selle asemel kaugpilte.",
|
||||
"advanced_settings_prefer_remote_title": "Eelista kaugpilte",
|
||||
"advanced_settings_proxy_headers_subtitle": "Määra vaheserveri päised, mida Immich peaks iga päringuga saatma",
|
||||
"advanced_settings_proxy_headers_title": "Vaheserveri päised",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "Jätab serveri lõpp-punkti SSL-sertifikaadi kontrolli vahele. Nõutud endasigneeritud sertifikaatide jaoks.",
|
||||
"advanced_settings_self_signed_ssl_title": "Luba endasigneeritud SSL-sertifikaadid",
|
||||
"advanced_settings_sync_remote_deletions_subtitle": "Kustuta või taasta üksus selles seadmes automaatself, kui sama tegevus toimub veebis",
|
||||
"advanced_settings_sync_remote_deletions_title": "Sünkrooni kaugkustutamised [EKSPERIMENTAALNE]",
|
||||
"advanced_settings_troubleshooting_subtitle": "Luba lisafunktsioonid tõrkeotsinguks",
|
||||
"advanced_settings_troubleshooting_title": "Tõrkeotsing",
|
||||
"age_months": "Vanus {months, plural, one {# kuu} other {# kuud}}",
|
||||
"age_year_months": "Vanus 1 aasta, {months, plural, one {# kuu} other {# kuud}}",
|
||||
"age_years": "{years, plural, other {Vanus #}}",
|
||||
|
@ -371,6 +388,8 @@
|
|||
"album_cover_updated": "Albumi kaanepilt muudetud",
|
||||
"album_delete_confirmation": "Kas oled kindel, et soovid albumi {album} kustutada?",
|
||||
"album_delete_confirmation_description": "Kui see album on jagatud, ei pääse teised kasutajad sellele enam ligi.",
|
||||
"album_info_card_backup_album_excluded": "VÄLJA JÄETUD",
|
||||
"album_info_card_backup_album_included": "LISATUD",
|
||||
"album_info_updated": "Albumi info muudetud",
|
||||
"album_leave": "Lahku albumist?",
|
||||
"album_leave_confirmation": "Kas oled kindel, et soovid albumist {album} lahkuda?",
|
||||
|
@ -379,10 +398,22 @@
|
|||
"album_remove_user": "Eemalda kasutaja?",
|
||||
"album_remove_user_confirmation": "Kas oled kindel, et soovid kasutaja {user} eemaldada?",
|
||||
"album_share_no_users": "Paistab, et oled seda albumit kõikide kasutajatega jaganud, või pole ühtegi kasutajat, kellega jagada.",
|
||||
"album_thumbnail_card_item": "1 üksus",
|
||||
"album_thumbnail_card_items": "{} üksust",
|
||||
"album_thumbnail_card_shared": " · Jagatud",
|
||||
"album_thumbnail_shared_by": "Jagas {}",
|
||||
"album_updated": "Album muudetud",
|
||||
"album_updated_setting_description": "Saa teavitus e-posti teel, kui jagatud albumis on uusi üksuseid",
|
||||
"album_user_left": "Lahkutud albumist {album}",
|
||||
"album_user_removed": "Kasutaja {user} eemaldatud",
|
||||
"album_viewer_appbar_delete_confirm": "Kas oled kindel, et soovid selle albumi oma kontolt kustutada?",
|
||||
"album_viewer_appbar_share_err_delete": "Albumi kustutamine ebaõnnestus",
|
||||
"album_viewer_appbar_share_err_leave": "Albumist lahkumine ebaõnnestus",
|
||||
"album_viewer_appbar_share_err_remove": "Üksuste albumist eemaldamisel tekkis probleeme",
|
||||
"album_viewer_appbar_share_err_title": "Albumi pealkirja muutmine ebaõnnestus",
|
||||
"album_viewer_appbar_share_leave": "Lahku albumist",
|
||||
"album_viewer_appbar_share_to": "Jaga",
|
||||
"album_viewer_page_share_add_users": "Lisa kasutajaid",
|
||||
"album_with_link_access": "Luba kõigil, kellel on link, näha selle albumi fotosid ja isikuid.",
|
||||
"albums": "Albumid",
|
||||
"albums_count": "{count, plural, one {{count, number} album} other {{count, number} albumit}}",
|
||||
|
@ -400,42 +431,94 @@
|
|||
"api_key_description": "Seda väärtust kuvatakse ainult üks kord. Kopeeri see enne akna sulgemist.",
|
||||
"api_key_empty": "Su API võtme nimi ei tohiks olla tühi",
|
||||
"api_keys": "API võtmed",
|
||||
"app_bar_signout_dialog_content": "Kas oled kindel, et soovid välja logida?",
|
||||
"app_bar_signout_dialog_ok": "Jah",
|
||||
"app_bar_signout_dialog_title": "Logi välja",
|
||||
"app_settings": "Rakenduse seaded",
|
||||
"appears_in": "Albumid",
|
||||
"archive": "Arhiiv",
|
||||
"archive_or_unarchive_photo": "Arhiveeri või taasta foto",
|
||||
"archive_page_no_archived_assets": "Arhiveeritud üksuseid ei leitud",
|
||||
"archive_page_title": "Arhiveeri ({})",
|
||||
"archive_size": "Arhiivi suurus",
|
||||
"archive_size_description": "Seadista arhiivi suurus allalaadimiseks (GiB)",
|
||||
"archived": "Arhiveeritud",
|
||||
"archived_count": "{count, plural, other {# arhiveeritud}}",
|
||||
"are_these_the_same_person": "Kas need on sama isik?",
|
||||
"are_you_sure_to_do_this": "Kas oled kindel, et soovid seda teha?",
|
||||
"asset_action_delete_err_read_only": "Kirjutuskaitstud üksuseid ei saa kustutada, jätan vahele",
|
||||
"asset_added_to_album": "Lisatud albumisse",
|
||||
"asset_adding_to_album": "Albumisse lisamine…",
|
||||
"asset_description_updated": "Üksuse kirjeldus on muudetud",
|
||||
"asset_filename_is_offline": "Üksus {filename} ei ole kättesaadav",
|
||||
"asset_has_unassigned_faces": "Üksusel on seostamata nägusid",
|
||||
"asset_hashing": "Räsimine…",
|
||||
"asset_list_group_by_sub_title": "Grupeeri",
|
||||
"asset_list_layout_settings_dynamic_layout_title": "Dünaamiline asetus",
|
||||
"asset_list_layout_settings_group_automatically": "Automaatne",
|
||||
"asset_list_layout_settings_group_by": "Grupeeri üksused",
|
||||
"asset_list_layout_settings_group_by_month_day": "Kuu + päev",
|
||||
"asset_list_layout_sub_title": "Asetus",
|
||||
"asset_list_settings_subtitle": "Fotoruudustiku paigutuse sätted",
|
||||
"asset_list_settings_title": "Fotoruudustik",
|
||||
"asset_offline": "Üksus pole kättesaadav",
|
||||
"asset_offline_description": "Seda välise kogu üksust ei leitud kettalt. Abi saamiseks palun võta ühendust oma Immich'i administraatoriga.",
|
||||
"asset_restored_successfully": "Üksus edukalt taastatud",
|
||||
"asset_skipped": "Vahele jäetud",
|
||||
"asset_skipped_in_trash": "Prügikastis",
|
||||
"asset_uploaded": "Üleslaaditud",
|
||||
"asset_uploading": "Üleslaadimine…",
|
||||
"asset_viewer_settings_subtitle": "Halda galeriivaaturi seadeid",
|
||||
"asset_viewer_settings_title": "Üksuste vaatur",
|
||||
"assets": "Üksused",
|
||||
"assets_added_count": "{count, plural, one {# üksus} other {# üksust}} lisatud",
|
||||
"assets_added_to_album_count": "{count, plural, one {# üksus} other {# üksust}} albumisse lisatud",
|
||||
"assets_added_to_name_count": "{count, plural, one {# üksus} other {# üksust}} lisatud {hasName, select, true {albumisse <b>{name}</b>} other {uude albumisse}}",
|
||||
"assets_count": "{count, plural, one {# üksus} other {# üksust}}",
|
||||
"assets_deleted_permanently": "{} üksus(t) jäädavalt kustutatud",
|
||||
"assets_deleted_permanently_from_server": "{} üksus(t) Immich'i serverist jäädavalt kustutatud",
|
||||
"assets_moved_to_trash_count": "{count, plural, one {# üksus} other {# üksust}} liigutatud prügikasti",
|
||||
"assets_permanently_deleted_count": "{count, plural, one {# üksus} other {# üksust}} jäädavalt kustutatud",
|
||||
"assets_removed_count": "{count, plural, one {# üksus} other {# üksust}} eemaldatud",
|
||||
"assets_removed_permanently_from_device": "{} üksus(t) seadmest jäädavalt eemaldatud",
|
||||
"assets_restore_confirmation": "Kas oled kindel, et soovid oma prügikasti liigutatud üksused taastada? Seda ei saa tagasi võtta! Pane tähele, et sel meetodil ei saa taastada ühenduseta üksuseid.",
|
||||
"assets_restored_count": "{count, plural, one {# üksus} other {# üksust}} taastatud",
|
||||
"assets_restored_successfully": "{} üksus(t) edukalt taastatud",
|
||||
"assets_trashed": "{} üksus(t) liigutatud prügikasti",
|
||||
"assets_trashed_count": "{count, plural, one {# üksus} other {# üksust}} liigutatud prügikasti",
|
||||
"assets_trashed_from_server": "{} üksus(t) liigutatud Immich'i serveris prügikasti",
|
||||
"assets_were_part_of_album_count": "{count, plural, one {Üksus oli} other {Üksused olid}} juba osa albumist",
|
||||
"authorized_devices": "Autoriseeritud seadmed",
|
||||
"automatic_endpoint_switching_subtitle": "Ühendu lokaalselt üle valitud WiFi-võrgu, kui see on saadaval, ja kasuta mujal alternatiivseid ühendusi",
|
||||
"automatic_endpoint_switching_title": "Automaatne URL-i ümberlülitamine",
|
||||
"back": "Tagasi",
|
||||
"back_close_deselect": "Tagasi, sulge või tühista valik",
|
||||
"backup_album_selection_page_select_albums": "Vali albumid",
|
||||
"backup_album_selection_page_selection_info": "Valiku info",
|
||||
"backup_album_selection_page_total_assets": "Unikaalseid üksuseid kokku",
|
||||
"backup_all": "Kõik",
|
||||
"backup_background_service_default_notification": "Uute üksuste kontrollimine…",
|
||||
"backup_background_service_error_title": "Varundamise viga",
|
||||
"backup_controller_page_background_app_refresh_disabled_content": "Taustal varundamise kasutamiseks luba rakenduse taustal värskendamine: Seaded > Üldine > Rakenduse taustal värskendamine.",
|
||||
"backup_controller_page_background_app_refresh_disabled_title": "Rakenduse taustal värskendamine keelatud",
|
||||
"backup_controller_page_background_battery_info_link": "Näita mulle, kuidas",
|
||||
"backup_controller_page_background_battery_info_ok": "OK",
|
||||
"backup_controller_page_background_configure_error": "Taustateenuse seadistamine ebaõnnestus",
|
||||
"backup_controller_page_background_description": "Lülita taustateenus sisse, et uusi üksuseid automaatselt varundada, ilma et peaks rakendust avama",
|
||||
"backup_controller_page_background_is_off": "Automaatne varundamine on välja lülitatud",
|
||||
"backup_controller_page_background_is_on": "Automaatne varundamine on sisse lülitatud",
|
||||
"backup_controller_page_background_turn_off": "Lülita taustateenus välja",
|
||||
"backup_controller_page_background_turn_on": "Lülita taustateenus sisse",
|
||||
"backup_controller_page_background_wifi": "Ainult WiFi-võrgus",
|
||||
"backup_controller_page_backup_sub": "Varundatud fotod ja videod",
|
||||
"backup_controller_page_desc_backup": "Lülita sisse esiplaanil varundamine, et rakenduse avamisel uued üksused automaatselt serverisse üles laadida.",
|
||||
"backup_controller_page_to_backup": "Albumid, mida varundada",
|
||||
"backup_controller_page_total_sub": "Kõik unikaalsed fotod ja videod valitud albumitest",
|
||||
"backup_err_only_album": "Ei saa ainsat albumit eemaldada",
|
||||
"backup_info_card_assets": "üksused",
|
||||
"backup_manual_cancelled": "Tühistatud",
|
||||
"backup_manual_title": "Üleslaadimise staatus",
|
||||
"backup_setting_subtitle": "Halda taustal ja esiplaanil üleslaadimise seadeid",
|
||||
"backward": "Tagasi",
|
||||
"birthdate_saved": "Sünnikuupäev salvestatud",
|
||||
"birthdate_set_description": "Sünnikuupäeva kasutatakse isiku vanuse arvutamiseks foto tegemise hetkel.",
|
||||
|
@ -447,11 +530,19 @@
|
|||
"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.",
|
||||
"buy": "Osta Immich",
|
||||
"cache_settings_clear_cache_button": "Tühjenda puhver",
|
||||
"cache_settings_statistics_album": "Kogu pisipildid",
|
||||
"cache_settings_statistics_full": "Täismõõdus pildid",
|
||||
"cache_settings_statistics_shared": "Jagatud albumite pisipildid",
|
||||
"cache_settings_statistics_thumbnail": "Pisipildid",
|
||||
"cache_settings_statistics_title": "Puhvri kasutus",
|
||||
"cache_settings_thumbnail_size": "Pisipiltide puhvri suurus ({} üksust)",
|
||||
"camera": "Kaamera",
|
||||
"camera_brand": "Kaamera mark",
|
||||
"camera_model": "Kaamera mudel",
|
||||
"cancel": "Katkesta",
|
||||
"cancel_search": "Katkesta otsing",
|
||||
"canceled": "Tühistatud",
|
||||
"cannot_merge_people": "Ei saa isikuid ühendada",
|
||||
"cannot_undo_this_action": "Sa ei saa seda tagasi võtta!",
|
||||
"cannot_update_the_description": "Kirjelduse muutmine ebaõnnestus",
|
||||
|
@ -462,6 +553,10 @@
|
|||
"change_name_successfully": "Nimi edukalt muudetud",
|
||||
"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_form_confirm_password": "Kinnita parool",
|
||||
"change_password_form_new_password": "Uus parool",
|
||||
"change_password_form_password_mismatch": "Paroolid ei klapi",
|
||||
"change_password_form_reenter_new_password": "Korda uut parooli",
|
||||
"change_your_password": "Muuda oma parooli",
|
||||
"changed_visibility_successfully": "Nähtavus muudetud",
|
||||
"check_all": "Märgi kõik",
|
||||
|
@ -473,6 +568,14 @@
|
|||
"clear_all_recent_searches": "Tühjenda hiljutised otsingud",
|
||||
"clear_message": "Tühjenda sõnum",
|
||||
"clear_value": "Tühjenda väärtus",
|
||||
"client_cert_dialog_msg_confirm": "OK",
|
||||
"client_cert_enter_password": "Sisesta parool",
|
||||
"client_cert_import": "Impordi",
|
||||
"client_cert_import_success_msg": "Klientsertifikaat on imporditud",
|
||||
"client_cert_invalid_msg": "Vigane sertifikaadi fail või vale parool",
|
||||
"client_cert_remove_msg": "Klientsertifikaat on eemaldatud",
|
||||
"client_cert_subtitle": "Toetab ainult PKCS12 (.p12, .pfx) formaati. Sertifikaadi importimine/eemaldamine on saadaval ainult enne sisselogimist",
|
||||
"client_cert_title": "SSL klientsertifikaat",
|
||||
"clockwise": "Päripäeva",
|
||||
"close": "Sulge",
|
||||
"collapse": "Peida",
|
||||
|
@ -483,6 +586,8 @@
|
|||
"comment_options": "Kommentaari valikud",
|
||||
"comments_and_likes": "Kommentaarid ja meeldimised",
|
||||
"comments_are_disabled": "Kommentaarid on keelatud",
|
||||
"common_create_new_album": "Lisa uus album",
|
||||
"completed": "Lõpetatud",
|
||||
"confirm": "Kinnita",
|
||||
"confirm_admin_password": "Kinnita administraatori parool",
|
||||
"confirm_delete_face": "Kas oled kindel, et soovid isiku {name} näo üksuselt kustutada?",
|
||||
|
@ -492,6 +597,10 @@
|
|||
"contain": "Mahuta ära",
|
||||
"context": "Kontekst",
|
||||
"continue": "Jätka",
|
||||
"control_bottom_app_bar_create_new_album": "Lisa uus album",
|
||||
"control_bottom_app_bar_delete_from_local": "Kustuta seadmest",
|
||||
"control_bottom_app_bar_edit_location": "Muuda asukohta",
|
||||
"control_bottom_app_bar_edit_time": "Muuda kuupäeva ja aega",
|
||||
"copied_image_to_clipboard": "Pilt kopeeritud lõikelauale.",
|
||||
"copied_to_clipboard": "Kopeeritud lõikelauale!",
|
||||
"copy_error": "Kopeeri viga",
|
||||
|
@ -513,6 +622,7 @@
|
|||
"create_new_person": "Lisa uus isik",
|
||||
"create_new_person_hint": "Seosta valitud üksused uue isikuga",
|
||||
"create_new_user": "Lisa uus kasutaja",
|
||||
"create_shared_album_page_share_select_photos": "Vali fotod",
|
||||
"create_tag": "Lisa silt",
|
||||
"create_tag_description": "Lisa uus silt. Pesastatud siltide jaoks sisesta täielik tee koos kaldkriipsudega.",
|
||||
"create_user": "Lisa kasutaja",
|
||||
|
@ -537,19 +647,23 @@
|
|||
"delete": "Kustuta",
|
||||
"delete_album": "Kustuta album",
|
||||
"delete_api_key_prompt": "Kas oled kindel, et soovid selle API võtme kustutada?",
|
||||
"delete_dialog_title": "Kustuta jäädavalt",
|
||||
"delete_duplicates_confirmation": "Kas oled kindel, et soovid need duplikaadid jäädavalt kustutada?",
|
||||
"delete_face": "Kustuta nägu",
|
||||
"delete_key": "Kustuta võti",
|
||||
"delete_library": "Kustuta kogu",
|
||||
"delete_link": "Kustuta link",
|
||||
"delete_local_dialog_ok_backed_up_only": "Kustuta ainult varundatud",
|
||||
"delete_others": "Kustuta teised",
|
||||
"delete_shared_link": "Kustuta jagatud link",
|
||||
"delete_shared_link_dialog_title": "Kustuta jagatud link",
|
||||
"delete_tag": "Kustuta silt",
|
||||
"delete_tag_confirmation_prompt": "Kas oled kindel, et soovid sildi {tagName} kustutada?",
|
||||
"delete_user": "Kustuta kasutaja",
|
||||
"deleted_shared_link": "Jagatud link kustutatud",
|
||||
"deletes_missing_assets": "Kustutab üksused, mis on kettalt puudu",
|
||||
"description": "Kirjeldus",
|
||||
"description_input_hint_text": "Lisa kirjeldus...",
|
||||
"details": "Üksikasjad",
|
||||
"direction": "Suund",
|
||||
"disabled": "Välja lülitatud",
|
||||
|
@ -566,10 +680,20 @@
|
|||
"documentation": "Dokumentatsioon",
|
||||
"done": "Tehtud",
|
||||
"download": "Laadi alla",
|
||||
"download_canceled": "Allalaadimine katkestatud",
|
||||
"download_complete": "Allalaadimine lõpetatud",
|
||||
"download_enqueue": "Allalaadimine ootel",
|
||||
"download_error": "Allalaadimise viga",
|
||||
"download_failed": "Allalaadimine ebaõnnestus",
|
||||
"download_finished": "Allalaadimine lõpetatud",
|
||||
"download_include_embedded_motion_videos": "Manustatud videod",
|
||||
"download_include_embedded_motion_videos_description": "Lisa liikuvatesse fotodesse manustatud videod eraldi failidena",
|
||||
"download_paused": "Allalaadimine peatatud",
|
||||
"download_settings": "Allalaadimine",
|
||||
"download_settings_description": "Halda üksuste allalaadimise seadeid",
|
||||
"download_started": "Allalaadimine alustatud",
|
||||
"download_sucess": "Allalaadimine õnnestus",
|
||||
"download_sucess_android": "Meediumid laaditi alla kataloogi DCIM/Immich",
|
||||
"downloading": "Allalaadimine",
|
||||
"downloading_asset_filename": "Üksuse {filename} allalaadimine",
|
||||
"drop_files_to_upload": "Failide üleslaadimiseks sikuta need ükskõik kuhu",
|
||||
|
@ -588,6 +712,7 @@
|
|||
"edit_key": "Muuda võtit",
|
||||
"edit_link": "Muuda linki",
|
||||
"edit_location": "Muuda asukohta",
|
||||
"edit_location_dialog_title": "Asukoht",
|
||||
"edit_name": "Muuda nime",
|
||||
"edit_people": "Muuda isikuid",
|
||||
"edit_tag": "Muuda silti",
|
||||
|
@ -600,12 +725,15 @@
|
|||
"editor_crop_tool_h2_aspect_ratios": "Kuvasuhted",
|
||||
"editor_crop_tool_h2_rotation": "Pööre",
|
||||
"email": "E-post",
|
||||
"empty_folder": "See kaust on tühi",
|
||||
"empty_trash": "Tühjenda prügikast",
|
||||
"empty_trash_confirmation": "Kas oled kindel, et soovid prügikasti tühjendada? See eemaldab kõik seal olevad üksused Immich'ist jäädavalt.\nSeda tegevust ei saa tagasi võtta!",
|
||||
"enable": "Luba",
|
||||
"enabled": "Lubatud",
|
||||
"end_date": "Lõppkuupäev",
|
||||
"enter_wifi_name": "Sisesta WiFi-võrgu nimi",
|
||||
"error": "Viga",
|
||||
"error_change_sort_album": "Albumi sorteerimisjärjestuse muutmine ebaõnnestus",
|
||||
"error_delete_face": "Viga näo kustutamisel",
|
||||
"error_loading_image": "Viga pildi laadimisel",
|
||||
"error_title": "Viga - midagi läks valesti",
|
||||
|
@ -637,10 +765,12 @@
|
|||
"failed_to_keep_this_delete_others": "Selle üksuse säilitamine ja ülejäänute kustutamine ebaõnnestus",
|
||||
"failed_to_load_asset": "Üksuse laadimine ebaõnnestus",
|
||||
"failed_to_load_assets": "Üksuste laadimine ebaõnnestus",
|
||||
"failed_to_load_notifications": "Teavituste laadimine ebaõnnestus",
|
||||
"failed_to_load_people": "Isikute laadimine ebaõnnestus",
|
||||
"failed_to_remove_product_key": "Tootevõtme eemaldamine ebaõnnestus",
|
||||
"failed_to_stack_assets": "Üksuste virnastamine ebaõnnestus",
|
||||
"failed_to_unstack_assets": "Üksuste eraldamine ebaõnnestus",
|
||||
"failed_to_update_notification_status": "Teavituste seisundi uuendamine ebaõnnestus",
|
||||
"import_path_already_exists": "See imporditee on juba olemas.",
|
||||
"incorrect_email_or_password": "Vale e-posti aadress või parool",
|
||||
"paths_validation_failed": "{paths, plural, one {# tee} other {# teed}} ei valideerunud",
|
||||
|
@ -736,8 +866,14 @@
|
|||
"unable_to_upload_file": "Faili üleslaadimine ebaõnnestus"
|
||||
},
|
||||
"exif": "Exif",
|
||||
"exif_bottom_sheet_description": "Lisa kirjeldus...",
|
||||
"exif_bottom_sheet_details": "ÜKSIKASJAD",
|
||||
"exif_bottom_sheet_location": "ASUKOHT",
|
||||
"exif_bottom_sheet_people": "ISIKUD",
|
||||
"exif_bottom_sheet_person_add_person": "Lisa nimi",
|
||||
"exit_slideshow": "Sulge slaidiesitlus",
|
||||
"expand_all": "Näita kõik",
|
||||
"experimental_settings_title": "Eksperimentaalne",
|
||||
"expire_after": "Aegub",
|
||||
"expired": "Aegunud",
|
||||
"expires_date": "Aegub {date}",
|
||||
|
@ -748,6 +884,7 @@
|
|||
"extension": "Laiend",
|
||||
"external": "Väline",
|
||||
"external_libraries": "Välised kogud",
|
||||
"external_network_sheet_info": "Kui seade ei ole eelistatud WiFi-võrgus, ühendub rakendus serveriga allolevatest URL-idest esimese kättesaadava kaudu, alustades ülevalt",
|
||||
"face_unassigned": "Seostamata",
|
||||
"failed_to_load_assets": "Üksuste laadimine ebaõnnestus",
|
||||
"favorite": "Lemmik",
|
||||
|
@ -763,6 +900,8 @@
|
|||
"filter_people": "Filtreeri isikuid",
|
||||
"find_them_fast": "Leia teda kiiresti nime järgi otsides",
|
||||
"fix_incorrect_match": "Paranda ebaõige vaste",
|
||||
"folder": "Kaust",
|
||||
"folder_not_found": "Kausta ei leitud",
|
||||
"folders": "Kaustad",
|
||||
"folders_feature_description": "Kaustavaate abil failisüsteemis olevate fotode ja videote sirvimine",
|
||||
"forward": "Edasi",
|
||||
|
@ -778,7 +917,15 @@
|
|||
"group_owner": "Grupeeri omaniku kaupa",
|
||||
"group_places_by": "Grupeeri kohad...",
|
||||
"group_year": "Grupeeri aasta kaupa",
|
||||
"haptic_feedback_switch": "Luba haptiline tagasiside",
|
||||
"haptic_feedback_title": "Haptiline tagasiside",
|
||||
"has_quota": "On kvoot",
|
||||
"header_settings_add_header_tip": "Lisa päis",
|
||||
"header_settings_field_validator_msg": "Väärtus ei saa olla tühi",
|
||||
"header_settings_header_name_input": "Päise nimi",
|
||||
"header_settings_header_value_input": "Päise väärtus",
|
||||
"headers_settings_tile_subtitle": "Määra vaheserveri päised, mida rakendus peaks iga päringuga saatma",
|
||||
"headers_settings_tile_title": "Kohandatud vaheserveri päised",
|
||||
"hi_user": "Tere {name} ({email})",
|
||||
"hide_all_people": "Peida kõik isikud",
|
||||
"hide_gallery": "Peida galerii",
|
||||
|
@ -786,8 +933,20 @@
|
|||
"hide_password": "Peida parool",
|
||||
"hide_person": "Peida isik",
|
||||
"hide_unnamed_people": "Peida nimetud isikud",
|
||||
"home_page_add_to_album_conflicts": "{added} üksust lisati albumisse {album}. {failed} üksust oli juba albumis.",
|
||||
"home_page_add_to_album_err_local": "Lokaalseid üksuseid ei saa veel albumisse lisada, jätan vahele",
|
||||
"home_page_add_to_album_success": "{added} üksust lisati albumisse {album}.",
|
||||
"home_page_album_err_partner": "Partneri üksuseid ei saa veel albumisse lisada, jätan vahele",
|
||||
"home_page_archive_err_local": "Lokaalseid üksuseid ei saa veel arhiveerida, jätan vahele",
|
||||
"home_page_archive_err_partner": "Partneri üksuseid ei saa arhiveerida, jätan vahele",
|
||||
"home_page_building_timeline": "Ajajoone koostamine",
|
||||
"home_page_delete_err_partner": "Partneri üksuseid ei saa kustutada, jätan vahele",
|
||||
"home_page_favorite_err_local": "Lokaalseid üksuseid ei saa lemmikuks märkida, jätan vahele",
|
||||
"home_page_favorite_err_partner": "Partneri üksuseid ei saa lemmikuks märkida, jätan vahele",
|
||||
"home_page_share_err_local": "Lokaalseid üksuseid ei saa lingiga jagada, jätan vahele",
|
||||
"host": "Host",
|
||||
"hour": "Tund",
|
||||
"ignore_icloud_photos": "Ignoreeri iCloud fotosid",
|
||||
"image": "Pilt",
|
||||
"image_alt_text_date": "{isVideo, select, true {Video} other {Pilt}} tehtud {date}",
|
||||
"image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Pilt}} tehtud {date} koos isikuga {person1}",
|
||||
|
@ -799,6 +958,8 @@
|
|||
"image_alt_text_date_place_2_people": "{isVideo, select, true {Video} other {Pilt}} tehtud {date} kohas {city}, {country} koos isikutega {person1} ja {person2}",
|
||||
"image_alt_text_date_place_3_people": "{isVideo, select, true {Video} other {Pilt}} tehtud {date} kohas {city}, {country} koos isikutega {person1}, {person2} ja {person3}",
|
||||
"image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Pilt}} tehtud {date} kohas {city}, {country} koos {person1}, {person2} ja veel {additionalCount, number} isikuga",
|
||||
"image_viewer_page_state_provider_download_started": "Allalaadimine alustatud",
|
||||
"image_viewer_page_state_provider_download_success": "Allalaadimine õnnestus",
|
||||
"immich_logo": "Immich'i logo",
|
||||
"immich_web_interface": "Immich'i veebiliides",
|
||||
"import_from_json": "Impordi JSON-formaadist",
|
||||
|
@ -817,6 +978,8 @@
|
|||
"night_at_midnight": "Iga päev keskööl",
|
||||
"night_at_twoam": "Iga öö kell 2"
|
||||
},
|
||||
"invalid_date": "Vigane kuupäev",
|
||||
"invalid_date_format": "Vigane kuupäevaformaat",
|
||||
"invite_people": "Kutsu inimesi",
|
||||
"invite_to_album": "Kutsu albumisse",
|
||||
"items_count": "{count, plural, one {# üksus} other {# üksust}}",
|
||||
|
@ -837,6 +1000,9 @@
|
|||
"level": "Tase",
|
||||
"library": "Kogu",
|
||||
"library_options": "Kogu seaded",
|
||||
"library_page_new_album": "Uus album",
|
||||
"library_page_sort_asset_count": "Üksuste arv",
|
||||
"library_page_sort_title": "Albumi pealkiri",
|
||||
"light": "Hele",
|
||||
"like_deleted": "Meeldimine kustutatud",
|
||||
"link_motion_video": "Lingi liikuv video",
|
||||
|
@ -846,12 +1012,29 @@
|
|||
"list": "Loend",
|
||||
"loading": "Laadimine",
|
||||
"loading_search_results_failed": "Otsitulemuste laadimine ebaõnnestus",
|
||||
"local_network_sheet_info": "Rakendus ühendub valitud Wi-Fi võrgus olles serveriga selle URL-i kaudu",
|
||||
"location_permission_content": "Automaatseks ümberlülitumiseks vajab Immich täpse asukoha luba, et saaks lugeda aktiivse WiFi-võrgu nime",
|
||||
"location_picker_choose_on_map": "Vali kaardil",
|
||||
"log_out": "Logi välja",
|
||||
"log_out_all_devices": "Logi kõigist seadmetest välja",
|
||||
"logged_out_all_devices": "Kõigist seadmetest välja logitud",
|
||||
"logged_out_device": "Seadmest välja logitud",
|
||||
"login": "Logi sisse",
|
||||
"login_form_back_button_text": "Tagasi",
|
||||
"login_form_email_hint": "sinunimi@email.com",
|
||||
"login_form_endpoint_hint": "http://serveri-ip:port",
|
||||
"login_form_endpoint_url": "Serveri lõpp-punkti URL",
|
||||
"login_form_err_http": "Palun täpsusta http:// või https://",
|
||||
"login_form_err_invalid_email": "Vigane e-posti aadress",
|
||||
"login_form_err_invalid_url": "Vigane URL",
|
||||
"login_form_err_leading_whitespace": "Eelnevad tühikud",
|
||||
"login_form_err_trailing_whitespace": "Järgnevad tühikud",
|
||||
"login_form_password_hint": "parool",
|
||||
"login_form_save_login": "Jää sisselogituks",
|
||||
"login_form_server_empty": "Sisesta serveri URL.",
|
||||
"login_form_server_error": "Serveriga ühendumine ebaõnnestus.",
|
||||
"login_has_been_disabled": "Sisselogimine on keelatud.",
|
||||
"login_password_changed_success": "Parool edukalt uuendatud",
|
||||
"logout_all_device_confirmation": "Kas oled kindel, et soovid kõigist seadmetest välja logida?",
|
||||
"logout_this_device_confirmation": "Kas oled kindel, et soovid sellest seadmest välja logida?",
|
||||
"longitude": "Pikkuskraad",
|
||||
|
@ -859,6 +1042,7 @@
|
|||
"loop_videos": "Taasesita videod",
|
||||
"loop_videos_description": "Lülita sisse, et detailvaates videot automaatselt taasesitada.",
|
||||
"main_branch_warning": "Sa kasutad arendusversiooni; soovitame tungivalt kasutada väljalaskeversiooni!",
|
||||
"main_menu": "Peamenüü",
|
||||
"make": "Mark",
|
||||
"manage_shared_links": "Halda jagatud linke",
|
||||
"manage_sharing_with_partners": "Halda partneritega jagamist",
|
||||
|
@ -868,13 +1052,27 @@
|
|||
"manage_your_devices": "Halda oma autenditud seadmeid",
|
||||
"manage_your_oauth_connection": "Halda oma OAuth ühendust",
|
||||
"map": "Kaart",
|
||||
"map_assets_in_bound": "{} foto",
|
||||
"map_assets_in_bounds": "{} fotot",
|
||||
"map_location_dialog_yes": "Jah",
|
||||
"map_location_picker_page_use_location": "Kasuta seda asukohta",
|
||||
"map_marker_for_images": "Kaardimarker kohas {city}, {country} tehtud piltide jaoks",
|
||||
"map_marker_with_image": "Kaardimarker pildiga",
|
||||
"map_settings": "Kaardi seaded",
|
||||
"map_settings_date_range_option_day": "Viimased 24 tundi",
|
||||
"map_settings_date_range_option_days": "Viimased {} päeva",
|
||||
"map_settings_date_range_option_year": "Viimane aasta",
|
||||
"map_settings_date_range_option_years": "Viimased {} aastat",
|
||||
"map_settings_dialog_title": "Kaardi seaded",
|
||||
"mark_all_as_read": "Märgi kõik loetuks",
|
||||
"mark_as_read": "Märgi loetuks",
|
||||
"marked_all_as_read": "Kõik märgiti loetuks",
|
||||
"matches": "Ühtivad failid",
|
||||
"media_type": "Meedia tüüp",
|
||||
"media_type": "Meediumi tüüp",
|
||||
"memories": "Mälestused",
|
||||
"memories_setting_description": "Halda, mida sa oma mälestustes näed",
|
||||
"memories_year_ago": "Aasta tagasi",
|
||||
"memories_years_ago": "{} aastat tagasi",
|
||||
"memory": "Mälestus",
|
||||
"memory_lane_title": "Mälestus {title}",
|
||||
"menu": "Menüü",
|
||||
|
@ -889,12 +1087,19 @@
|
|||
"missing": "Puuduvad",
|
||||
"model": "Mudel",
|
||||
"month": "Kuu",
|
||||
"monthly_title_text_date_format": "MMMM y",
|
||||
"more": "Rohkem",
|
||||
"moved_to_archive": "{count, plural, one {# üksus} other {# üksust}} liigutatud arhiivi",
|
||||
"moved_to_library": "{count, plural, one {# üksus} other {# üksust}} liigutatud kogusse",
|
||||
"moved_to_trash": "Liigutatud prügikasti",
|
||||
"multiselect_grid_edit_date_time_err_read_only": "Kirjutuskaitsega üksus(t)e kuupäeva ei saa muuta, jätan vahele",
|
||||
"multiselect_grid_edit_gps_err_read_only": "Kirjutuskaitsega üksus(t)e asukohta ei saa muuta, jätan vahele",
|
||||
"mute_memories": "Vaigista mälestused",
|
||||
"my_albums": "Minu albumid",
|
||||
"name": "Nimi",
|
||||
"name_or_nickname": "Nimi või hüüdnimi",
|
||||
"networking_settings": "Võrguühendus",
|
||||
"networking_subtitle": "Halda serveri lõpp-punkti seadeid",
|
||||
"never": "Mitte kunagi",
|
||||
"new_album": "Uus album",
|
||||
"new_api_key": "Uus API võti",
|
||||
|
@ -917,14 +1122,17 @@
|
|||
"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_name": "Nimetu",
|
||||
"no_notifications": "Teavitusi pole",
|
||||
"no_places": "Kohti ei ole",
|
||||
"no_results": "Vasteid pole",
|
||||
"no_results_description": "Proovi sünonüümi või üldisemat märksõna",
|
||||
"no_shared_albums_message": "Lisa album, et fotosid ja videosid teistega jagada",
|
||||
"not_in_any_album": "Pole üheski albumis",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "Märkus: Et rakendada talletussilt varem üleslaaditud üksustele, käivita",
|
||||
"note_unlimited_quota": "Märkus: Piiramatu kvoodi jaoks sisesta 0",
|
||||
"notes": "Märkused",
|
||||
"notification_permission_list_tile_content": "Anna luba teavituste saatmiseks.",
|
||||
"notification_permission_list_tile_enable_button": "Luba teavitused",
|
||||
"notification_permission_list_tile_title": "Teavituste luba",
|
||||
"notification_toggle_setting_description": "Luba e-posti teel teavitused",
|
||||
"notifications": "Teavitused",
|
||||
"notifications_setting_description": "Halda teavitusi",
|
||||
|
@ -935,6 +1143,7 @@
|
|||
"offline_paths_description": "Need tulemused võivad olla põhjustatud manuaalselt kustutatud failidest, mis ei ole osa välisest kogust.",
|
||||
"ok": "Ok",
|
||||
"oldest_first": "Vanemad eespool",
|
||||
"on_this_device": "Sellel seadmel",
|
||||
"onboarding": "Kasutuselevõtt",
|
||||
"onboarding_privacy_description": "Järgnevad (valikulised) funktsioonid sõltuvad välistest teenustest ning neid saab igal ajal administraatori seadetes välja lülitada.",
|
||||
"onboarding_theme_description": "Vali oma serverile värviteema. Saad seda hiljem seadetes muuta.",
|
||||
|
@ -942,6 +1151,7 @@
|
|||
"onboarding_welcome_user": "Tere tulemast, {user}",
|
||||
"online": "Ühendatud",
|
||||
"only_favorites": "Ainult lemmikud",
|
||||
"open": "Ava",
|
||||
"open_in_map_view": "Ava kaardi vaates",
|
||||
"open_in_openstreetmap": "Ava OpenStreetMap",
|
||||
"open_the_search_filters": "Ava otsingufiltrid",
|
||||
|
@ -958,6 +1168,10 @@
|
|||
"partner_can_access": "{partner} pääseb ligi",
|
||||
"partner_can_access_assets": "Kõik su fotod ja videod, välja arvatud arhiveeritud ja kustutatud",
|
||||
"partner_can_access_location": "Asukohad, kus su fotod tehti",
|
||||
"partner_list_user_photos": "Kasutaja {user} fotod",
|
||||
"partner_list_view_all": "Vaata kõiki",
|
||||
"partner_page_partner_add_failed": "Partneri lisamine ebaõnnestus",
|
||||
"partner_page_select_partner": "Vali partner",
|
||||
"partner_sharing": "Partneriga jagamine",
|
||||
"partners": "Partnerid",
|
||||
"password": "Parool",
|
||||
|
@ -986,6 +1200,8 @@
|
|||
"permanently_delete_assets_prompt": "Kas oled kindel, et soovid {count, plural, one {selle üksuse} other {need <b>#</b> üksust}} jäädavalt kustutada? Sellega eemaldatakse {count, plural, one {see} other {need}} ka oma albumi(te)st.",
|
||||
"permanently_deleted_asset": "Üksus jäädavalt kustutatud",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {# üksus} other {# üksust}} jäädavalt kustutatud",
|
||||
"permission_onboarding_back": "Tagasi",
|
||||
"permission_onboarding_continue_anyway": "Jätka sellegipoolest",
|
||||
"person": "Isik",
|
||||
"person_birthdate": "Sündinud {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (peidetud)} other {}}",
|
||||
|
@ -1003,6 +1219,8 @@
|
|||
"play_motion_photo": "Esita liikuv foto",
|
||||
"play_or_pause_video": "Esita või peata video",
|
||||
"port": "Port",
|
||||
"preferences_settings_subtitle": "Halda rakenduse eelistusi",
|
||||
"preferences_settings_title": "Eelistused",
|
||||
"preset": "Eelseadistus",
|
||||
"preview": "Eelvaade",
|
||||
"previous": "Eelmine",
|
||||
|
@ -1010,6 +1228,8 @@
|
|||
"previous_or_next_photo": "Eelmine või järgmine foto",
|
||||
"primary": "Peamine",
|
||||
"privacy": "Privaatsus",
|
||||
"profile_drawer_app_logs": "Logid",
|
||||
"profile_drawer_github": "GitHub",
|
||||
"profile_image_of_user": "Kasutaja {user} profiilipilt",
|
||||
"profile_picture_set": "Profiilipilt määratud.",
|
||||
"public_album": "Avalik album",
|
||||
|
@ -1059,6 +1279,8 @@
|
|||
"recent": "Hiljutine",
|
||||
"recent-albums": "Hiljutised albumid",
|
||||
"recent_searches": "Hiljutised otsingud",
|
||||
"recently_added": "Hiljuti lisatud",
|
||||
"recently_added_page_title": "Hiljuti lisatud",
|
||||
"refresh": "Värskenda",
|
||||
"refresh_encoded_videos": "Värskenda kodeeritud videod",
|
||||
"refresh_faces": "Värskenda näod",
|
||||
|
@ -1115,6 +1337,7 @@
|
|||
"role_editor": "Muutja",
|
||||
"role_viewer": "Vaataja",
|
||||
"save": "Salvesta",
|
||||
"save_to_gallery": "Salvesta galeriisse",
|
||||
"saved_api_key": "API võti salvestatud",
|
||||
"saved_profile": "Profiil salvestatud",
|
||||
"saved_settings": "Seaded salvestatud",
|
||||
|
@ -1134,14 +1357,33 @@
|
|||
"search_camera_model": "Otsi kaamera mudelit...",
|
||||
"search_city": "Otsi linna...",
|
||||
"search_country": "Otsi riiki...",
|
||||
"search_filter_apply": "Rakenda filter",
|
||||
"search_filter_camera_title": "Vali kaamera tüüp",
|
||||
"search_filter_date": "Kuupäev",
|
||||
"search_filter_date_interval": "{start} kuni {end}",
|
||||
"search_filter_date_title": "Vali kuupäevavahemik",
|
||||
"search_filter_display_options": "Kuva valikud",
|
||||
"search_filter_filename": "Otsi failinime alusel",
|
||||
"search_filter_location": "Asukoht",
|
||||
"search_filter_location_title": "Vali asukoht",
|
||||
"search_filter_media_type": "Meediumi tüüp",
|
||||
"search_filter_media_type_title": "Vali meediumi tüüp",
|
||||
"search_filter_people_title": "Vali isikud",
|
||||
"search_for": "Otsi",
|
||||
"search_for_existing_person": "Otsi olemasolevat isikut",
|
||||
"search_no_people": "Isikuid ei ole",
|
||||
"search_no_people_named": "Ei ole isikuid nimega \"{name}\"",
|
||||
"search_options": "Otsingu valikud",
|
||||
"search_page_categories": "Kategooriad",
|
||||
"search_page_screenshots": "Ekraanipildid",
|
||||
"search_page_search_photos_videos": "Otsi oma fotosid ja videosid",
|
||||
"search_page_selfies": "Selfid",
|
||||
"search_page_things": "Asjad",
|
||||
"search_page_view_all_button": "Vaata kõiki",
|
||||
"search_people": "Otsi inimesi",
|
||||
"search_places": "Otsi kohti",
|
||||
"search_rating": "Otsi hinnangu järgi...",
|
||||
"search_result_page_new_search_hint": "Uus otsing",
|
||||
"search_settings": "Otsi seadeid",
|
||||
"search_state": "Otsi osariiki...",
|
||||
"search_tags": "Otsi silte...",
|
||||
|
@ -1162,12 +1404,17 @@
|
|||
"select_keep_all": "Vali jäta kõik alles",
|
||||
"select_library_owner": "Vali kogu omanik",
|
||||
"select_new_face": "Vali uus nägu",
|
||||
"select_person_to_tag": "Vali sildistamiseks isik",
|
||||
"select_photos": "Vali fotod",
|
||||
"select_trash_all": "Vali kõik prügikasti",
|
||||
"select_user_for_sharing_page_err_album": "Albumi lisamine ebaõnnestus",
|
||||
"selected": "Valitud",
|
||||
"selected_count": "{count, plural, other {# valitud}}",
|
||||
"send_message": "Saada sõnum",
|
||||
"send_welcome_email": "Saada tervituskiri",
|
||||
"server_endpoint": "Serveri lõpp-punkt",
|
||||
"server_info_box_app_version": "Rakenduse versioon",
|
||||
"server_info_box_server_url": "Serveri URL",
|
||||
"server_offline": "Serveriga ühendus puudub",
|
||||
"server_online": "Server ühendatud",
|
||||
"server_stats": "Serveri statistika",
|
||||
|
@ -1179,22 +1426,70 @@
|
|||
"set_date_of_birth": "Määra sünnikuupäev",
|
||||
"set_profile_picture": "Sea profiilipilt",
|
||||
"set_slideshow_to_fullscreen": "Kuva slaidiesitlus täisekraanil",
|
||||
"setting_image_viewer_help": "Detailivaatur laadib kõigepealt väikese pisipildi, seejärel keskmises mõõdus eelvaate (kui lubatud) ja lõpuks originaalpildi (kui lubatud).",
|
||||
"setting_image_viewer_preview_subtitle": "Luba keskmise resolutsiooniga pildi laadimine. Keela, et laadida kohe originaalpilt või kasutada ainult pisipilti.",
|
||||
"setting_image_viewer_preview_title": "Laadi pildi eelvaade",
|
||||
"setting_image_viewer_title": "Pildid",
|
||||
"setting_languages_apply": "Rakenda",
|
||||
"setting_languages_subtitle": "Muuda rakenduse keelt",
|
||||
"setting_languages_title": "Keeled",
|
||||
"setting_notifications_notify_hours": "{} tundi",
|
||||
"setting_notifications_notify_immediately": "kohe",
|
||||
"setting_notifications_notify_minutes": "{} minutit",
|
||||
"setting_notifications_notify_never": "mitte kunagi",
|
||||
"setting_notifications_notify_seconds": "{} sekundit",
|
||||
"setting_notifications_single_progress_title": "Kuva taustal varundamise detailset edenemist",
|
||||
"setting_notifications_subtitle": "Halda oma teavituste eelistusi",
|
||||
"setting_notifications_total_progress_title": "Kuva taustal varundamise üldist edenemist",
|
||||
"settings": "Seaded",
|
||||
"settings_saved": "Seaded salvestatud",
|
||||
"share": "Jaga",
|
||||
"share_add_photos": "Lisa fotosid",
|
||||
"share_assets_selected": "{} valitud",
|
||||
"shared": "Jagatud",
|
||||
"shared_album_section_people_action_error": "Viga albumist eemaldamisel/lahkumisel",
|
||||
"shared_album_section_people_action_leave": "Eemalda kasutaja albumist",
|
||||
"shared_album_section_people_action_remove_user": "Eemalda kasutaja albumist",
|
||||
"shared_album_section_people_title": "ISIKUD",
|
||||
"shared_by": "Jagas",
|
||||
"shared_by_user": "Jagas {user}",
|
||||
"shared_by_you": "Jagasid sina",
|
||||
"shared_from_partner": "Fotod partnerilt {partner}",
|
||||
"shared_link_app_bar_title": "Jagatud lingid",
|
||||
"shared_link_clipboard_copied_massage": "Kopeeritud lõikelauale",
|
||||
"shared_link_clipboard_text": "Link: {}\nParool: {}",
|
||||
"shared_link_create_error": "Viga jagatud lingi loomisel",
|
||||
"shared_link_edit_expire_after_option_day": "1 päev",
|
||||
"shared_link_edit_expire_after_option_days": "{} päeva",
|
||||
"shared_link_edit_expire_after_option_hour": "1 tund",
|
||||
"shared_link_edit_expire_after_option_hours": "{} tundi",
|
||||
"shared_link_edit_expire_after_option_minute": "1 minut",
|
||||
"shared_link_edit_expire_after_option_minutes": "{} minutit",
|
||||
"shared_link_edit_expire_after_option_months": "{} kuud",
|
||||
"shared_link_edit_expire_after_option_year": "{} aasta",
|
||||
"shared_link_expires_day": "Aegub {} päeva pärast",
|
||||
"shared_link_expires_days": "Aegub {} päeva pärast",
|
||||
"shared_link_expires_hour": "Aegub {} tunni pärast",
|
||||
"shared_link_expires_hours": "Aegub {} tunni pärast",
|
||||
"shared_link_expires_minute": "Aegub {} minuti pärast",
|
||||
"shared_link_expires_minutes": "Aegub {} minuti pärast",
|
||||
"shared_link_expires_never": "Ei aegu",
|
||||
"shared_link_expires_second": "Aegub {} sekundi pärast",
|
||||
"shared_link_expires_seconds": "Aegub {} sekundi pärast",
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Halda jagatud linke",
|
||||
"shared_link_options": "Jagatud lingi valikud",
|
||||
"shared_links": "Jagatud lingid",
|
||||
"shared_links_description": "Jaga fotosid ja videosid lingiga",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# jagatud fotot ja videot.}}",
|
||||
"shared_with_me": "Minuga jagatud",
|
||||
"shared_with_partner": "Jagatud partneriga {partner}",
|
||||
"sharing": "Jagamine",
|
||||
"sharing_enter_password": "Palun sisesta selle lehe vaatamiseks salasõna.",
|
||||
"sharing_page_album": "Jagatud albumid",
|
||||
"sharing_sidebar_description": "Kuva külgmenüüs Jagamise linki",
|
||||
"sharing_silver_appbar_create_shared_album": "Uus jagatud album",
|
||||
"sharing_silver_appbar_share_partner": "Jaga partneriga",
|
||||
"shift_to_permanent_delete": "vajuta ⇧, et üksus jäädavalt kustutada",
|
||||
"show_album_options": "Näita albumi valikuid",
|
||||
"show_albums": "Näita albumeid",
|
||||
|
@ -1261,6 +1556,7 @@
|
|||
"support_third_party_description": "Sinu Immich'i install on kolmanda osapoole pakendatud. Probleemid, mida täheldad, võivad olla põhjustatud selle pakendamise poolt, seega võta esmajärjekorras nendega ühendust, kasutades allolevaid linke.",
|
||||
"swap_merge_direction": "Muuda ühendamise suunda",
|
||||
"sync": "Sünkrooni",
|
||||
"sync_albums": "Sünkrooni albumid",
|
||||
"tag": "Silt",
|
||||
"tag_assets": "Sildista üksuseid",
|
||||
"tag_created": "Lisatud silt: {tag}",
|
||||
|
@ -1274,6 +1570,13 @@
|
|||
"theme": "Teema",
|
||||
"theme_selection": "Teema valik",
|
||||
"theme_selection_description": "Sea automaatselt hele või tume teema vastavalt veebilehitseja eelistustele",
|
||||
"theme_setting_colorful_interface_subtitle": "Rakenda taustapindadele primaarne värv.",
|
||||
"theme_setting_colorful_interface_title": "Värviline kasutajaliides",
|
||||
"theme_setting_image_viewer_quality_subtitle": "Kohanda detailvaaturi kvaliteeti",
|
||||
"theme_setting_image_viewer_quality_title": "Pildivaaturi kvaliteet",
|
||||
"theme_setting_primary_color_title": "Põhivärv",
|
||||
"theme_setting_system_primary_color_title": "Kasuta süsteemset värvi",
|
||||
"theme_setting_system_theme_switch": "Automaatne (järgi süsteemi seadet)",
|
||||
"they_will_be_merged_together": "Nad ühendatakse kokku",
|
||||
"third_party_resources": "Kolmanda osapoole ressursid",
|
||||
"time_based_memories": "Ajapõhised mälestused",
|
||||
|
@ -1293,7 +1596,11 @@
|
|||
"trash_all": "Kõik prügikasti",
|
||||
"trash_count": "Liiguta {count, number} prügikasti",
|
||||
"trash_delete_asset": "Kustuta üksus",
|
||||
"trash_emptied": "Prügikast tühjendatud",
|
||||
"trash_no_results_message": "Siia ilmuvad prügikasti liigutatud fotod ja videod.",
|
||||
"trash_page_delete_all": "Kustuta kõik",
|
||||
"trash_page_restore_all": "Taasta kõik",
|
||||
"trash_page_select_assets_btn": "Vali üksused",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Prügikasti tõstetud üksused kustutatakse jäädavalt {days, plural, one {# päeva} other {# päeva}} pärast.",
|
||||
"type": "Tüüp",
|
||||
"unarchive": "Taasta arhiivist",
|
||||
|
@ -1329,6 +1636,7 @@
|
|||
"upload_status_errors": "Vead",
|
||||
"upload_status_uploaded": "Üleslaaditud",
|
||||
"upload_success": "Üleslaadimine õnnestus, uute üksuste nägemiseks värskenda lehte.",
|
||||
"uploading": "Üleslaadimine",
|
||||
"url": "URL",
|
||||
"usage": "Kasutus",
|
||||
"use_custom_date_range": "Kasuta kohandatud kuupäevavahemikku",
|
||||
|
@ -1349,6 +1657,7 @@
|
|||
"version": "Versioon",
|
||||
"version_announcement_closing": "Sinu sõber, Alex",
|
||||
"version_announcement_message": "Hei! Saadaval on uus Immich'i versioon. Palun võta aega, et lugeda <link>väljalasketeadet</link> ning veendu, et su seadistus on ajakohane, et vältida konfiguratsiooniprobleeme, eriti kui kasutad WatchTower'it või muud mehhanismi, mis Immich'it automaatselt uuendab.",
|
||||
"version_announcement_overlay_title": "Uus serveri versioon saadaval 🎉",
|
||||
"version_history": "Versiooniajalugu",
|
||||
"version_history_item": "Versioon {version} paigaldatud {date}",
|
||||
"video": "Video",
|
||||
|
@ -1366,16 +1675,21 @@
|
|||
"view_name": "Vaade",
|
||||
"view_next_asset": "Vaata järgmist üksust",
|
||||
"view_previous_asset": "Vaata eelmist üksust",
|
||||
"view_qr_code": "Vaata QR-koodi",
|
||||
"view_stack": "Vaata virna",
|
||||
"viewer_remove_from_stack": "Eemalda virnast",
|
||||
"viewer_unstack": "Eralda",
|
||||
"visibility_changed": "{count, plural, one {# isiku} other {# isiku}} nähtavus muudetud",
|
||||
"waiting": "Ootel",
|
||||
"warning": "Hoiatus",
|
||||
"week": "Nädal",
|
||||
"welcome": "Tere tulemast",
|
||||
"welcome_to_immich": "Tere tulemast Immich'isse",
|
||||
"wifi_name": "WiFi-võrgu nimi",
|
||||
"year": "Aasta",
|
||||
"years_ago": "{years, plural, one {# aasta} other {# aastat}} tagasi",
|
||||
"yes": "Jah",
|
||||
"you_dont_have_any_shared_links": "Sul pole ühtegi jagatud linki",
|
||||
"your_wifi_name": "Sinu WiFi-võrgu nimi",
|
||||
"zoom_image": "Suumi pilti"
|
||||
}
|
||||
|
|
11
i18n/fa.json
11
i18n/fa.json
|
@ -132,7 +132,6 @@
|
|||
"no_pattern_added": "هیچ الگوی اضافه نشده",
|
||||
"note_apply_storage_label_previous_assets": "توجه: برای اعمال برچسب ذخیره سازی به دارایی هایی که قبلاً بارگذاری شده اند، دستور زیر را اجرا کنید",
|
||||
"note_cannot_be_changed_later": "توجه: این را نمی توان بعداً تغییر داد!",
|
||||
"note_unlimited_quota": "توجه: برای سهمیه نامحدود، عدد 0 را وارد کنید",
|
||||
"notification_email_from_address": "آدرس فرستنده",
|
||||
"notification_email_from_address_description": "آدرس ایمیل فرستنده، به عنوان مثال:\"Immich سرور عکس <noreply@example.com>\"",
|
||||
"notification_email_host_description": "میزبان سرور ایمیل (مثلاً smtp.immich.app)",
|
||||
|
@ -154,20 +153,13 @@
|
|||
"oauth_auto_register": "ثبت خودکار",
|
||||
"oauth_auto_register_description": "کاربران جدید را پس از ورود با OAuth به طور خودکار ثبت نام کن",
|
||||
"oauth_button_text": "متن دکمه",
|
||||
"oauth_client_id": "شناسه کاربر",
|
||||
"oauth_client_secret": "شناسه محرمانه کاربر",
|
||||
"oauth_enable_description": "ورود توسط OAuth",
|
||||
"oauth_issuer_url": "نشانی وب صادر کننده",
|
||||
"oauth_mobile_redirect_uri": "تغییر مسیر URI موبایل",
|
||||
"oauth_mobile_redirect_uri_override": "تغییر مسیر URI تلفن همراه",
|
||||
"oauth_mobile_redirect_uri_override_description": "زمانی که 'app.immich:/' یک URI پرش نامعتبر است، فعال کنید.",
|
||||
"oauth_profile_signing_algorithm": "الگوریتم امضای پروفایل",
|
||||
"oauth_profile_signing_algorithm_description": "الگوریتم مورد استفاده برای امضای پروفایل کاربر.",
|
||||
"oauth_scope": "محدوده",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "مدیریت تنظیمات ورود به سیستم OAuth",
|
||||
"oauth_settings_more_details": "برای جزئیات بیشتر در مورد این ویژگی، به <link>مستندات</link> مراجعه کنید.",
|
||||
"oauth_signing_algorithm": "الگوریتم امضا",
|
||||
"oauth_storage_label_claim": "درخواست برچسب فضای ذخیره سازی",
|
||||
"oauth_storage_label_claim_description": "تنظیم خودکار برچسب فضای ذخیرهسازی کاربر به مقدار درخواست شده.",
|
||||
"oauth_storage_quota_claim": "درخواست سهمیه فضای ذخیره سازی",
|
||||
|
@ -664,7 +656,6 @@
|
|||
"no_shared_albums_message": "",
|
||||
"not_in_any_album": "در هیچ آلبومی نیست",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "",
|
||||
"note_unlimited_quota": "",
|
||||
"notes": "یادداشتها",
|
||||
"notification_toggle_setting_description": "اعلانهای ایمیلی را فعال کنید",
|
||||
"notifications": "اعلانها",
|
||||
|
@ -926,4 +917,4 @@
|
|||
"yes": "بله",
|
||||
"you_dont_have_any_shared_links": "",
|
||||
"zoom_image": "بزرگنمایی تصویر"
|
||||
}
|
||||
}
|
||||
|
|
618
i18n/fi.json
618
i18n/fi.json
File diff suppressed because it is too large
Load diff
616
i18n/fr.json
616
i18n/fr.json
File diff suppressed because it is too large
Load diff
1893
i18n/gl.json
1893
i18n/gl.json
File diff suppressed because it is too large
Load diff
834
i18n/he.json
834
i18n/he.json
File diff suppressed because it is too large
Load diff
518
i18n/hi.json
518
i18n/hi.json
|
@ -4,6 +4,7 @@
|
|||
"account_settings": "अभिलेख व्यवस्था",
|
||||
"acknowledge": "स्वीकार करें",
|
||||
"action": "कार्रवाई",
|
||||
"action_common_update": "Update",
|
||||
"actions": "कार्यवाहियां",
|
||||
"active": "सक्रिय",
|
||||
"activity": "गतिविधि",
|
||||
|
@ -13,6 +14,7 @@
|
|||
"add_a_location": "एक स्थान जोड़ें",
|
||||
"add_a_name": "नाम जोड़ें",
|
||||
"add_a_title": "एक शीर्षक जोड़ें",
|
||||
"add_endpoint": "Add endpoint",
|
||||
"add_exclusion_pattern": "अपवाद उदाहरण जोड़ें",
|
||||
"add_import_path": "आयात पथ जोड़ें",
|
||||
"add_location": "स्थान जोड़ें",
|
||||
|
@ -22,6 +24,8 @@
|
|||
"add_photos": "फ़ोटो जोड़ें",
|
||||
"add_to": "इसमें जोड़ें…",
|
||||
"add_to_album": "एल्बम में जोड़ें",
|
||||
"add_to_album_bottom_sheet_added": "Added to {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
|
||||
"add_to_shared_album": "साझा एल्बम में जोड़ें",
|
||||
"add_url": "URL जोड़ें",
|
||||
"added_to_archive": "संग्रहीत कर दिया गया है",
|
||||
|
@ -146,7 +150,6 @@
|
|||
"no_pattern_added": "कोई पैटर्न नहीं जोड़ा गया",
|
||||
"note_apply_storage_label_previous_assets": "नोट: पहले अपलोड की गई संपत्तियों पर स्टोरेज लेबल लागू करने के लिए, चलाएँ",
|
||||
"note_cannot_be_changed_later": "नोट: इसे बाद में बदला नहीं जा सकता!",
|
||||
"note_unlimited_quota": "नोट: असीमित कोटा के लिए 0 दर्ज करें",
|
||||
"notification_email_from_address": "इस पते से",
|
||||
"notification_email_from_address_description": "प्रेषक का ईमेल पता, उदाहरण के लिए: \"इमिच फोटो सर्वर <noreply@example.com>\"",
|
||||
"notification_email_host_description": "ईमेल सर्वर का होस्ट (उदा. smtp.immitch.app)",
|
||||
|
@ -168,20 +171,13 @@
|
|||
"oauth_auto_register": "ऑटो रजिस्टर",
|
||||
"oauth_auto_register_description": "OAuth के साथ साइन इन करने के बाद स्वचालित रूप से नए उपयोगकर्ताओं को पंजीकृत करें",
|
||||
"oauth_button_text": "टेक्स्ट बटन",
|
||||
"oauth_client_id": "ग्राहक ID",
|
||||
"oauth_client_secret": "ग्राहक गुप्त",
|
||||
"oauth_enable_description": "OAuth से लॉगिन करें",
|
||||
"oauth_issuer_url": "जारीकर्ता URL",
|
||||
"oauth_mobile_redirect_uri": "मोबाइल रीडायरेक्ट यूआरआई",
|
||||
"oauth_mobile_redirect_uri_override": "मोबाइल रीडायरेक्ट यूआरआई ओवरराइड",
|
||||
"oauth_mobile_redirect_uri_override_description": "सक्षम करें जब 'app.immitch:/' एक अमान्य रीडायरेक्ट यूआरआई हो।",
|
||||
"oauth_profile_signing_algorithm": "प्रोफ़ाइल हस्ताक्षर एल्गोरिथ्म",
|
||||
"oauth_profile_signing_algorithm_description": "उपयोगकर्ता प्रोफ़ाइल पर हस्ताक्षर करने के लिए एल्गोरिदम का उपयोग किया जाता है।",
|
||||
"oauth_scope": "स्कोप",
|
||||
"oauth_settings": "ओऑथ",
|
||||
"oauth_settings_description": "OAuth लॉगिन सेटिंग प्रबंधित करें",
|
||||
"oauth_settings_more_details": "इस सुविधा के बारे में अधिक जानकारी के लिए, देखें <link>डॉक्स</link>।",
|
||||
"oauth_signing_algorithm": "हस्ताक्षर एल्गोरिथ्म",
|
||||
"oauth_storage_label_claim": "भंडारण लेबल का दावा",
|
||||
"oauth_storage_label_claim_description": "इस दावे के मूल्य पर उपयोगकर्ता के भंडारण लेबल को स्वचालित रूप से सेट करें।",
|
||||
"oauth_storage_quota_claim": "भंडारण कोटा का दावा",
|
||||
|
@ -313,17 +309,41 @@
|
|||
"admin_password": "व्यवस्थापक पासवर्ड",
|
||||
"administration": "प्रशासन",
|
||||
"advanced": "विकसित",
|
||||
"advanced_settings_log_level_title": "Log level: {}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
|
||||
"advanced_settings_prefer_remote_title": "Prefer remote images",
|
||||
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request",
|
||||
"advanced_settings_proxy_headers_title": "Proxy Headers",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
|
||||
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
|
||||
"advanced_settings_tile_subtitle": "Advanced user's settings",
|
||||
"advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting",
|
||||
"advanced_settings_troubleshooting_title": "Troubleshooting",
|
||||
"album_added": "एल्बम जोड़ा गया",
|
||||
"album_added_notification_setting_description": "जब आपको किसी साझा एल्बम में जोड़ा जाए तो एक ईमेल सूचना प्राप्त करें",
|
||||
"album_cover_updated": "एल्बम कवर अपडेट किया गया",
|
||||
"album_info_card_backup_album_excluded": "EXCLUDED",
|
||||
"album_info_card_backup_album_included": "INCLUDED",
|
||||
"album_info_updated": "एल्बम की जानकारी अपडेट की गई",
|
||||
"album_leave": "एल्बम छोड़ें?",
|
||||
"album_name": "एल्बम का नाम",
|
||||
"album_options": "एल्बम विकल्प",
|
||||
"album_remove_user": "उपयोगकर्ता हटाएं?",
|
||||
"album_share_no_users": "ऐसा लगता है कि आपने यह एल्बम सभी उपयोगकर्ताओं के साथ साझा कर दिया है या आपके पास साझा करने के लिए कोई उपयोगकर्ता नहीं है।",
|
||||
"album_thumbnail_card_item": "1 item",
|
||||
"album_thumbnail_card_items": "{} items",
|
||||
"album_thumbnail_card_shared": " · Shared",
|
||||
"album_thumbnail_shared_by": "Shared by {}",
|
||||
"album_updated": "एल्बम अपडेट किया गया",
|
||||
"album_updated_setting_description": "जब किसी साझा एल्बम में नई संपत्तियाँ हों तो एक ईमेल सूचना प्राप्त करें",
|
||||
"album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
|
||||
"album_viewer_appbar_share_err_delete": "Failed to delete album",
|
||||
"album_viewer_appbar_share_err_leave": "Failed to leave album",
|
||||
"album_viewer_appbar_share_err_remove": "There are problems in removing assets from album",
|
||||
"album_viewer_appbar_share_err_title": "Failed to change album title",
|
||||
"album_viewer_appbar_share_leave": "Leave album",
|
||||
"album_viewer_appbar_share_to": "साझा करें",
|
||||
"album_viewer_page_share_add_users": "Add users",
|
||||
"album_with_link_access": "लिंक वाले किसी भी व्यक्ति को इस एल्बम में फ़ोटो और लोगों को देखने दें।",
|
||||
"albums": "एलबम",
|
||||
"all": "सभी",
|
||||
|
@ -338,29 +358,120 @@
|
|||
"api_key_description": "यह की केवल एक बार दिखाई जाएगी। विंडो बंद करने से पहले कृपया इसे कॉपी करना सुनिश्चित करें।।",
|
||||
"api_key_empty": "आपका एपीआई कुंजी नाम खाली नहीं होना चाहिए",
|
||||
"api_keys": "एपीआई कीज",
|
||||
"app_bar_signout_dialog_content": "क्या आप सुनिश्चित हैं कि आप लॉग आउट करना चाहते हैं?",
|
||||
"app_bar_signout_dialog_ok": "हाँ",
|
||||
"app_bar_signout_dialog_title": "लॉग आउट",
|
||||
"app_settings": "एप्लिकेशन सेटिंग",
|
||||
"appears_in": "प्रकट होता है",
|
||||
"archive": "संग्रहालय",
|
||||
"archive_or_unarchive_photo": "फ़ोटो को संग्रहीत या असंग्रहीत करें",
|
||||
"archive_page_no_archived_assets": "No archived assets found",
|
||||
"archive_page_title": "Archive ({})",
|
||||
"archive_size": "पुरालेख आकार",
|
||||
"archive_size_description": "डाउनलोड के लिए संग्रह आकार कॉन्फ़िगर करें (GiB में)",
|
||||
"archived": "संग्रहित",
|
||||
"are_these_the_same_person": "क्या ये वही व्यक्ति हैं?",
|
||||
"are_you_sure_to_do_this": "क्या आप वास्तव में इसे करना चाहते हैं?",
|
||||
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
|
||||
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
|
||||
"asset_added_to_album": "एल्बम में जोड़ा गया",
|
||||
"asset_adding_to_album": "एल्बम में जोड़ा जा रहा है..।",
|
||||
"asset_description_updated": "संपत्ति विवरण अद्यतन कर दिया गया है",
|
||||
"asset_has_unassigned_faces": "एसेट में अनिर्धारित चेहरे हैं",
|
||||
"asset_hashing": "हैशिंग..।",
|
||||
"asset_list_group_by_sub_title": "Group by",
|
||||
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
|
||||
"asset_list_layout_settings_group_automatically": "Automatic",
|
||||
"asset_list_layout_settings_group_by": "Group assets by",
|
||||
"asset_list_layout_settings_group_by_month_day": "Month + day",
|
||||
"asset_list_layout_sub_title": "Layout",
|
||||
"asset_list_settings_subtitle": "Photo grid layout settings",
|
||||
"asset_list_settings_title": "Photo Grid",
|
||||
"asset_offline": "संपत्ति ऑफ़लाइन",
|
||||
"asset_offline_description": "यह संपत्ति ऑफ़लाइन है।",
|
||||
"asset_restored_successfully": "संपत्ति(याँ) सफलतापूर्वक पुनर्स्थापित की गईं",
|
||||
"asset_skipped": "छोड़ा गया",
|
||||
"asset_uploaded": "अपलोड किए गए",
|
||||
"asset_uploading": "अपलोड हो रहा है..।",
|
||||
"asset_viewer_settings_subtitle": "Manage your gallery viewer settings",
|
||||
"asset_viewer_settings_title": "Asset Viewer",
|
||||
"assets": "संपत्तियां",
|
||||
"assets_deleted_permanently": "{} संपत्ति(याँ) स्थायी रूप से हटा दी गईं",
|
||||
"assets_deleted_permanently_from_server": "{} संपत्ति(याँ) इमिच सर्वर से स्थायी रूप से हटा दी गईं",
|
||||
"assets_removed_permanently_from_device": "{} संपत्ति(याँ) आपके डिवाइस से स्थायी रूप से हटा दी गईं",
|
||||
"assets_restore_confirmation": "क्या आप वाकई अपनी सभी नष्ट की गई संपत्तियों को पुनर्स्थापित करना चाहते हैं? आप इस क्रिया को पूर्ववत नहीं कर सकते!",
|
||||
"assets_restored_successfully": "{} संपत्ति(याँ) सफलतापूर्वक पुनर्स्थापित की गईं",
|
||||
"assets_trashed": "{} संपत्ति(याँ) कचरे में डाली गईं",
|
||||
"assets_trashed_from_server": "{} संपत्ति(याँ) इमिच सर्वर से कचरे में डाली गईं",
|
||||
"authorized_devices": "अधिकृत उपकरण",
|
||||
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
|
||||
"automatic_endpoint_switching_title": "Automatic URL switching",
|
||||
"back": "वापस",
|
||||
"back_close_deselect": "वापस जाएँ, बंद करें, या अचयनित करें",
|
||||
"background_location_permission": "Background location permission",
|
||||
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
|
||||
"backup_album_selection_page_albums_device": "Albums on device ({})",
|
||||
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
|
||||
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
|
||||
"backup_album_selection_page_select_albums": "Select albums",
|
||||
"backup_album_selection_page_selection_info": "Selection Info",
|
||||
"backup_album_selection_page_total_assets": "Total unique assets",
|
||||
"backup_all": "All",
|
||||
"backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…",
|
||||
"backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…",
|
||||
"backup_background_service_current_upload_notification": "Uploading {}",
|
||||
"backup_background_service_default_notification": "Checking for new assets…",
|
||||
"backup_background_service_error_title": "Backup error",
|
||||
"backup_background_service_in_progress_notification": "Backing up your assets…",
|
||||
"backup_background_service_upload_failure_notification": "Failed to upload {}",
|
||||
"backup_controller_page_albums": "Backup Albums",
|
||||
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
|
||||
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
|
||||
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
|
||||
"backup_controller_page_background_battery_info_link": "Show me how",
|
||||
"backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.",
|
||||
"backup_controller_page_background_battery_info_ok": "OK",
|
||||
"backup_controller_page_background_battery_info_title": "Battery optimizations",
|
||||
"backup_controller_page_background_charging": "Only while charging",
|
||||
"backup_controller_page_background_configure_error": "Failed to configure the background service",
|
||||
"backup_controller_page_background_delay": "Delay new assets backup: {}",
|
||||
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
|
||||
"backup_controller_page_background_is_off": "Automatic background backup is off",
|
||||
"backup_controller_page_background_is_on": "Automatic background backup is on",
|
||||
"backup_controller_page_background_turn_off": "Turn off background service",
|
||||
"backup_controller_page_background_turn_on": "Turn on background service",
|
||||
"backup_controller_page_background_wifi": "Only on WiFi",
|
||||
"backup_controller_page_backup": "Backup",
|
||||
"backup_controller_page_backup_selected": "Selected: ",
|
||||
"backup_controller_page_backup_sub": "Backed up photos and videos",
|
||||
"backup_controller_page_created": "Created on: {}",
|
||||
"backup_controller_page_desc_backup": "Turn on foreground backup to automatically upload new assets to the server when opening the app.",
|
||||
"backup_controller_page_excluded": "Excluded: ",
|
||||
"backup_controller_page_failed": "Failed ({})",
|
||||
"backup_controller_page_filename": "File name: {} [{}]",
|
||||
"backup_controller_page_id": "ID: {}",
|
||||
"backup_controller_page_info": "Backup Information",
|
||||
"backup_controller_page_none_selected": "None selected",
|
||||
"backup_controller_page_remainder": "Remainder",
|
||||
"backup_controller_page_remainder_sub": "Remaining photos and videos to back up from selection",
|
||||
"backup_controller_page_server_storage": "Server Storage",
|
||||
"backup_controller_page_start_backup": "Start Backup",
|
||||
"backup_controller_page_status_off": "Automatic foreground backup is off",
|
||||
"backup_controller_page_status_on": "Automatic foreground backup is on",
|
||||
"backup_controller_page_storage_format": "{} of {} used",
|
||||
"backup_controller_page_to_backup": "Albums to be backed up",
|
||||
"backup_controller_page_total_sub": "All unique photos and videos from selected albums",
|
||||
"backup_controller_page_turn_off": "Turn off foreground backup",
|
||||
"backup_controller_page_turn_on": "Turn on foreground backup",
|
||||
"backup_controller_page_uploading_file_info": "Uploading file info",
|
||||
"backup_err_only_album": "Cannot remove the only album",
|
||||
"backup_info_card_assets": "assets",
|
||||
"backup_manual_cancelled": "Cancelled",
|
||||
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
|
||||
"backup_manual_success": "Success",
|
||||
"backup_manual_title": "Upload status",
|
||||
"backup_options_page_title": "Backup options",
|
||||
"backup_setting_subtitle": "Manage background and foreground upload settings",
|
||||
"backward": "पिछला",
|
||||
"birthdate_saved": "जन्मतिथि सफलतापूर्वक सहेजी गई",
|
||||
"birthdate_set_description": "जन्मतिथि का उपयोग फोटो के समय इस व्यक्ति की आयु की गणना करने के लिए किया जाता है।",
|
||||
|
@ -368,24 +479,52 @@
|
|||
"build": "निर्माण",
|
||||
"build_image": "छवि बनाएँ",
|
||||
"buy": "इम्मीच खरीदो",
|
||||
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
|
||||
"cache_settings_clear_cache_button": "Clear cache",
|
||||
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
|
||||
"cache_settings_duplicated_assets_clear_button": "CLEAR",
|
||||
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
|
||||
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
|
||||
"cache_settings_image_cache_size": "Image cache size ({} assets)",
|
||||
"cache_settings_statistics_album": "Library thumbnails",
|
||||
"cache_settings_statistics_assets": "{} assets ({})",
|
||||
"cache_settings_statistics_full": "Full images",
|
||||
"cache_settings_statistics_shared": "Shared album thumbnails",
|
||||
"cache_settings_statistics_thumbnail": "Thumbnails",
|
||||
"cache_settings_statistics_title": "Cache usage",
|
||||
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
|
||||
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
|
||||
"cache_settings_tile_subtitle": "स्थानीय संग्रहण के व्यवहार को नियंत्रित करें",
|
||||
"cache_settings_tile_title": "स्थानीय संग्रहण",
|
||||
"cache_settings_title": "Caching Settings",
|
||||
"camera": "कैमरा",
|
||||
"camera_brand": "कैमरा ब्रांड",
|
||||
"camera_model": "कैमरा मॉडल",
|
||||
"cancel": "रद्द करना",
|
||||
"cancel_search": "खोज रद्द करें",
|
||||
"canceled": "Canceled",
|
||||
"cannot_merge_people": "लोगों का विलय नहीं हो सकता",
|
||||
"cannot_undo_this_action": "आप इस क्रिया को पूर्ववत नहीं कर सकते!",
|
||||
"cannot_update_the_description": "विवरण अद्यतन नहीं किया जा सकता",
|
||||
"change_date": "बदलाव दिनांक",
|
||||
"change_display_order": "Change display order",
|
||||
"change_expiration_time": "समाप्ति समय बदलें",
|
||||
"change_location": "स्थान बदलें",
|
||||
"change_name": "नाम परिवर्तन करें",
|
||||
"change_name_successfully": "नाम सफलतापूर्वक बदलें",
|
||||
"change_password": "पासवर्ड बदलें",
|
||||
"change_password_description": "यह या तो पहली बार है जब आप सिस्टम में साइन इन कर रहे हैं या आपका पासवर्ड बदलने का अनुरोध किया गया है।",
|
||||
"change_password_form_confirm_password": "Confirm Password",
|
||||
"change_password_form_description": "Hi {name},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
|
||||
"change_password_form_new_password": "New Password",
|
||||
"change_password_form_password_mismatch": "Passwords do not match",
|
||||
"change_password_form_reenter_new_password": "Re-enter New Password",
|
||||
"change_your_password": "अपना पासवर्ड बदलें",
|
||||
"changed_visibility_successfully": "दृश्यता सफलतापूर्वक परिवर्तित",
|
||||
"check_all": "सभी चेक करें",
|
||||
"check_corrupt_asset_backup": "Check for corrupt asset backups",
|
||||
"check_corrupt_asset_backup_button": "Perform check",
|
||||
"check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.",
|
||||
"check_logs": "लॉग जांचें",
|
||||
"choose_matching_people_to_merge": "मर्ज करने के लिए मिलते-जुलते लोगों को चुनें",
|
||||
"city": "शहर",
|
||||
|
@ -394,6 +533,14 @@
|
|||
"clear_all_recent_searches": "सभी हालिया खोजें साफ़ करें",
|
||||
"clear_message": "स्पष्ट संदेश",
|
||||
"clear_value": "स्पष्ट मूल्य",
|
||||
"client_cert_dialog_msg_confirm": "OK",
|
||||
"client_cert_enter_password": "Enter Password",
|
||||
"client_cert_import": "Import",
|
||||
"client_cert_import_success_msg": "Client certificate is imported",
|
||||
"client_cert_invalid_msg": "Invalid certificate file or wrong password",
|
||||
"client_cert_remove_msg": "Client certificate is removed",
|
||||
"client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login",
|
||||
"client_cert_title": "SSL Client Certificate",
|
||||
"close": "बंद",
|
||||
"collapse": "गिर जाना",
|
||||
"collapse_all": "सभी को संकुचित करें",
|
||||
|
@ -402,6 +549,9 @@
|
|||
"comment_options": "टिप्पणी विकल्प",
|
||||
"comments_and_likes": "टिप्पणियाँ और पसंद",
|
||||
"comments_are_disabled": "टिप्पणियाँ अक्षम हैं",
|
||||
"common_create_new_album": "Create new album",
|
||||
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
|
||||
"completed": "Completed",
|
||||
"confirm": "पुष्टि",
|
||||
"confirm_admin_password": "एडमिन पासवर्ड की पुष्टि करें",
|
||||
"confirm_delete_shared_link": "क्या आप वाकई इस साझा लिंक को हटाना चाहते हैं?",
|
||||
|
@ -409,6 +559,15 @@
|
|||
"contain": "समाहित",
|
||||
"context": "संदर्भ",
|
||||
"continue": "जारी",
|
||||
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
|
||||
"control_bottom_app_bar_create_new_album": "Create new album",
|
||||
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
|
||||
"control_bottom_app_bar_delete_from_local": "Delete from device",
|
||||
"control_bottom_app_bar_edit_location": "Edit Location",
|
||||
"control_bottom_app_bar_edit_time": "Edit Date & Time",
|
||||
"control_bottom_app_bar_share_link": "Share Link",
|
||||
"control_bottom_app_bar_share_to": "Share To",
|
||||
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
|
||||
"copied_image_to_clipboard": "छवि को क्लिपबोर्ड पर कॉपी किया गया।",
|
||||
"copied_to_clipboard": "क्लिपबोर्ड पर नकल!",
|
||||
"copy_error": "प्रतिलिपि त्रुटि",
|
||||
|
@ -423,22 +582,32 @@
|
|||
"covers": "आवरण",
|
||||
"create": "तैयार करें",
|
||||
"create_album": "एल्बम बनाओ",
|
||||
"create_album_page_untitled": "Untitled",
|
||||
"create_library": "लाइब्रेरी बनाएं",
|
||||
"create_link": "लिंक बनाएं",
|
||||
"create_link_to_share": "शेयर करने के लिए लिंक बनाएं",
|
||||
"create_link_to_share_description": "लिंक वाले किसी भी व्यक्ति को चयनित फ़ोटो देखने दें",
|
||||
"create_new": "नया बनाएं",
|
||||
"create_new_person": "नया व्यक्ति बनाएं",
|
||||
"create_new_person_hint": "चयनित संपत्तियों को एक नए व्यक्ति को सौंपें",
|
||||
"create_new_user": "नया उपयोगकर्ता बनाएं",
|
||||
"create_shared_album_page_share_add_assets": "ADD ASSETS",
|
||||
"create_shared_album_page_share_select_photos": "Select Photos",
|
||||
"create_user": "उपयोगकर्ता बनाइये",
|
||||
"created": "बनाया",
|
||||
"crop": "छाँटें",
|
||||
"curated_object_page_title": "Things",
|
||||
"current_device": "वर्तमान उपकरण",
|
||||
"current_server_address": "Current server address",
|
||||
"custom_locale": "कस्टम लोकेल",
|
||||
"custom_locale_description": "भाषा और क्षेत्र के आधार पर दिनांक और संख्याएँ प्रारूपित करें",
|
||||
"daily_title_text_date": "E, MMM dd",
|
||||
"daily_title_text_date_year": "E, MMM dd, yyyy",
|
||||
"dark": "डार्क",
|
||||
"date_after": "इसके बाद की तारीख",
|
||||
"date_and_time": "तिथि और समय",
|
||||
"date_before": "पहले की तारीख",
|
||||
"date_format": "E, LLL d, y • h:mm a",
|
||||
"date_of_birth_saved": "जन्मतिथि सफलतापूर्वक सहेजी गई",
|
||||
"date_range": "तिथि सीमा",
|
||||
"day": "दिन",
|
||||
|
@ -448,14 +617,25 @@
|
|||
"delete": "हटाएँ",
|
||||
"delete_album": "एल्बम हटाएँ",
|
||||
"delete_api_key_prompt": "क्या आप वाकई इस एपीआई कुंजी को हटाना चाहते हैं?",
|
||||
"delete_dialog_alert": "These items will be permanently deleted from Immich and from your device",
|
||||
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
|
||||
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
|
||||
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
|
||||
"delete_dialog_ok_force": "Delete Anyway",
|
||||
"delete_dialog_title": "Delete Permanently",
|
||||
"delete_duplicates_confirmation": "क्या आप वाकई इन डुप्लिकेट को स्थायी रूप से हटाना चाहते हैं?",
|
||||
"delete_key": "कुंजी हटाएँ",
|
||||
"delete_library": "लाइब्रेरी हटाएँ",
|
||||
"delete_link": "लिंक हटाएँ",
|
||||
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
|
||||
"delete_local_dialog_ok_force": "Delete Anyway",
|
||||
"delete_shared_link": "साझा किए गए लिंक को हटाएं",
|
||||
"delete_shared_link_dialog_title": "साझा किए गए लिंक को हटाएं",
|
||||
"delete_user": "उपभोक्ता मिटायें",
|
||||
"deleted_shared_link": "साझा किया गया लिंक हटा दिया गया",
|
||||
"description": "वर्णन",
|
||||
"description_input_hint_text": "Add description...",
|
||||
"description_input_submit_error": "Error updating description, check the log for more details",
|
||||
"details": "विवरण",
|
||||
"direction": "दिशा",
|
||||
"disabled": "अक्षम",
|
||||
|
@ -470,9 +650,23 @@
|
|||
"do_not_show_again": "इस संदेश को दुबारा मत दिखाना",
|
||||
"done": "ठीक है",
|
||||
"download": "डाउनलोड करें",
|
||||
"download_canceled": "डाउनलोड रद्द कर दिया गया",
|
||||
"download_complete": "डाउनलोड पूरा",
|
||||
"download_enqueue": "डाउनलोड कतार में है",
|
||||
"download_error": "डाउनलोड त्रुटि",
|
||||
"download_failed": "डाउनलोड विफल",
|
||||
"download_filename": "फ़ाइल: {}",
|
||||
"download_finished": "डाउनलोड समाप्त",
|
||||
"download_notfound": "डाउनलोड नहीं मिला",
|
||||
"download_paused": "डाउनलोड स्थगित",
|
||||
"download_settings": "डाउनलोड करना",
|
||||
"download_settings_description": "संपत्ति डाउनलोड से संबंधित सेटिंग्स प्रबंधित करें",
|
||||
"download_started": "डाउनलोड प्रारंभ हुआ",
|
||||
"download_sucess": "डाउनलोड सफल",
|
||||
"download_sucess_android": "मीडिया DCIM/Immich में डाउनलोड हो गया है",
|
||||
"download_waiting_to_retry": "पुनः प्रयास करने का इंतजार कर रहा है",
|
||||
"downloading": "डाउनलोड",
|
||||
"downloading_media": "मीडिया डाउनलोड हो रहा है",
|
||||
"drop_files_to_upload": "अपलोड करने के लिए फ़ाइलें कहीं भी छोड़ें",
|
||||
"duplicates": "डुप्लिकेट",
|
||||
"duplicates_description": "प्रत्येक समूह को यह इंगित करके हल करें कि कौन सा, यदि कोई है, डुप्लिकेट है",
|
||||
|
@ -489,6 +683,7 @@
|
|||
"edit_key": "कुंजी संपादित करें",
|
||||
"edit_link": "लिंक संपादित करें",
|
||||
"edit_location": "स्थान संपादित करें",
|
||||
"edit_location_dialog_title": "Location",
|
||||
"edit_name": "नाम संपादित करें",
|
||||
"edit_people": "लोगों को संपादित करें",
|
||||
"edit_title": "शीर्षक संपादित करें",
|
||||
|
@ -496,13 +691,18 @@
|
|||
"edited": "संपादित",
|
||||
"editor": "",
|
||||
"email": "ईमेल",
|
||||
"empty_folder": "This folder is empty",
|
||||
"empty_trash": "कूड़ेदान खाली करें",
|
||||
"empty_trash_confirmation": "क्या आपको यकीन है कि आप कचरा खाली करना चाहते हैं? यह इमिच से स्थायी रूप से कचरा में सभी संपत्तियों को हटा देगा।\nआप इस कार्रवाई को नहीं रोक सकते!",
|
||||
"enable": "सक्षम",
|
||||
"enabled": "सक्रिय",
|
||||
"end_date": "अंतिम तिथि",
|
||||
"enqueued": "Enqueued",
|
||||
"enter_wifi_name": "Enter WiFi name",
|
||||
"error": "गलती",
|
||||
"error_change_sort_album": "Failed to change album sort order",
|
||||
"error_loading_image": "छवि लोड करने में त्रुटि",
|
||||
"error_saving_image": "त्रुटि: {}",
|
||||
"error_title": "त्रुटि - कुछ गलत हो गया",
|
||||
"errors": {
|
||||
"cannot_navigate_next_asset": "अगली संपत्ति पर नेविगेट नहीं किया जा सकता",
|
||||
|
@ -616,8 +816,21 @@
|
|||
"unable_to_upload_file": "फाइल अपलोड करने में असमर्थ"
|
||||
},
|
||||
"exif": "एक्सिफ",
|
||||
"exif_bottom_sheet_description": "Add Description...",
|
||||
"exif_bottom_sheet_details": "DETAILS",
|
||||
"exif_bottom_sheet_location": "LOCATION",
|
||||
"exif_bottom_sheet_people": "PEOPLE",
|
||||
"exif_bottom_sheet_person_add_person": "Add name",
|
||||
"exif_bottom_sheet_person_age": "Age {}",
|
||||
"exif_bottom_sheet_person_age_months": "Age {} months",
|
||||
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months",
|
||||
"exif_bottom_sheet_person_age_years": "Age {}",
|
||||
"exit_slideshow": "स्लाइड शो से बाहर निकलें",
|
||||
"expand_all": "सभी का विस्तार",
|
||||
"experimental_settings_new_asset_list_subtitle": "Work in progress",
|
||||
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
|
||||
"experimental_settings_subtitle": "Use at your own risk!",
|
||||
"experimental_settings_title": "Experimental",
|
||||
"expire_after": "एक्सपायर आफ्टर",
|
||||
"expired": "खत्म हो चुका",
|
||||
"explore": "अन्वेषण करना",
|
||||
|
@ -626,37 +839,77 @@
|
|||
"extension": "विस्तार",
|
||||
"external": "बाहरी",
|
||||
"external_libraries": "बाहरी पुस्तकालय",
|
||||
"external_network": "External network",
|
||||
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
|
||||
"face_unassigned": "सौंपे नहीं गए",
|
||||
"failed": "Failed",
|
||||
"failed_to_load_assets": "Failed to load assets",
|
||||
"failed_to_load_folder": "Failed to load folder",
|
||||
"favorite": "पसंदीदा",
|
||||
"favorite_or_unfavorite_photo": "पसंदीदा या नापसंद फोटो",
|
||||
"favorites": "पसंदीदा",
|
||||
"favorites_page_no_favorites": "No favorite assets found",
|
||||
"feature_photo_updated": "फ़ीचर फ़ोटो अपडेट किया गया",
|
||||
"file_name": "फ़ाइल का नाम",
|
||||
"file_name_or_extension": "फ़ाइल का नाम या एक्सटेंशन",
|
||||
"filename": "फ़ाइल का नाम",
|
||||
"filetype": "फाइल का प्रकार",
|
||||
"filter": "फ़िल्टर",
|
||||
"filter_people": "लोगों को फ़िल्टर करें",
|
||||
"find_them_fast": "खोज के साथ नाम से उन्हें तेजी से ढूंढें",
|
||||
"fix_incorrect_match": "ग़लत मिलान ठीक करें",
|
||||
"folder": "Folder",
|
||||
"folder_not_found": "Folder not found",
|
||||
"folders": "Folders",
|
||||
"forward": "आगे",
|
||||
"general": "सामान्य",
|
||||
"get_help": "मदद लें",
|
||||
"get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network",
|
||||
"getting_started": "शुरू करना",
|
||||
"go_back": "वापस जाओ",
|
||||
"go_to_search": "खोज पर जाएँ",
|
||||
"grant_permission": "Grant permission",
|
||||
"group_albums_by": "इनके द्वारा समूह एल्बम..।",
|
||||
"group_no": "कोई समूहीकरण नहीं",
|
||||
"group_owner": "स्वामी द्वारा समूह",
|
||||
"group_year": "वर्ष के अनुसार समूह",
|
||||
"haptic_feedback_switch": "Enable haptic feedback",
|
||||
"haptic_feedback_title": "Haptic Feedback",
|
||||
"has_quota": "कोटा है",
|
||||
"header_settings_add_header_tip": "Add Header",
|
||||
"header_settings_field_validator_msg": "Value cannot be empty",
|
||||
"header_settings_header_name_input": "Header name",
|
||||
"header_settings_header_value_input": "Header value",
|
||||
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request",
|
||||
"headers_settings_tile_title": "Custom proxy headers",
|
||||
"hide_all_people": "सभी लोगों को छुपाएं",
|
||||
"hide_gallery": "गैलरी छिपाएँ",
|
||||
"hide_password": "पासवर्ड छिपाएं",
|
||||
"hide_person": "व्यक्ति छिपाएँ",
|
||||
"hide_unnamed_people": "अनाम लोगों को छुपाएं",
|
||||
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
|
||||
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
|
||||
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
|
||||
"home_page_album_err_partner": "अब तक पार्टनर एसेट्स को एल्बम में जोड़ा नहीं कर सकते, स्किप कर रहे हैं",
|
||||
"home_page_archive_err_local": "Can not archive local assets yet, skipping",
|
||||
"home_page_archive_err_partner": "पार्टनर एसेट्स को आर्काइव नहीं कर सकते, स्किप कर रहे हैं",
|
||||
"home_page_building_timeline": "Building the timeline",
|
||||
"home_page_delete_err_partner": "पार्टनर एसेट्स को डिलीट नहीं कर सकते, स्किप कर रहे हैं",
|
||||
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
|
||||
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
|
||||
"home_page_favorite_err_partner": "अब तक पार्टनर एसेट्स को फेवरेट नहीं कर सकते, स्किप कर रहे हैं",
|
||||
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
|
||||
"home_page_share_err_local": "लोकल एसेट्स को लिंक के जरिए शेयर नहीं कर सकते, स्किप कर रहे हैं",
|
||||
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
|
||||
"host": "मेज़बान",
|
||||
"hour": "घंटा",
|
||||
"ignore_icloud_photos": "आइक्लाउड फ़ोटो को अनदेखा करें",
|
||||
"ignore_icloud_photos_description": "आइक्लाउड पर स्टोर की गई फ़ोटोज़ इमिच सर्वर पर अपलोड नहीं की जाएंगी",
|
||||
"image": "छवि",
|
||||
"image_saved_successfully": "इमेज सहेज दी गई",
|
||||
"image_viewer_page_state_provider_download_started": "Download Started",
|
||||
"image_viewer_page_state_provider_download_success": "Download Success",
|
||||
"image_viewer_page_state_provider_share_error": "Share Error",
|
||||
"immich_logo": "Immich लोगो",
|
||||
"immich_web_interface": "इमिच वेब इंटरफ़ेस",
|
||||
"import_from_json": "JSON से आयात करें",
|
||||
|
@ -673,6 +926,8 @@
|
|||
"night_at_midnight": "हर रात आधी रात को",
|
||||
"night_at_twoam": "हर रात 2 बजे"
|
||||
},
|
||||
"invalid_date": "अमान्य तारीख़",
|
||||
"invalid_date_format": "अमान्य तारीख़ प्रारूप",
|
||||
"invite_people": "लोगो को निमंत्रण भेजो",
|
||||
"invite_to_album": "एल्बम के लिए आमंत्रित करें",
|
||||
"jobs": "नौकरियां",
|
||||
|
@ -689,6 +944,12 @@
|
|||
"level": "स्तर",
|
||||
"library": "पुस्तकालय",
|
||||
"library_options": "पुस्तकालय विकल्प",
|
||||
"library_page_device_albums": "Albums on Device",
|
||||
"library_page_new_album": "New album",
|
||||
"library_page_sort_asset_count": "Number of assets",
|
||||
"library_page_sort_created": "Created date",
|
||||
"library_page_sort_last_modified": "Last modified",
|
||||
"library_page_sort_title": "Album title",
|
||||
"light": "रोशनी",
|
||||
"like_deleted": "जैसे हटा दिया गया",
|
||||
"link_options": "लिंक विकल्प",
|
||||
|
@ -697,12 +958,42 @@
|
|||
"list": "सूची",
|
||||
"loading": "लोड हो रहा है",
|
||||
"loading_search_results_failed": "खोज परिणाम लोड करना विफल रहा",
|
||||
"local_network": "Local network",
|
||||
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
|
||||
"location_permission": "Location permission",
|
||||
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name",
|
||||
"location_picker_choose_on_map": "Choose on map",
|
||||
"location_picker_latitude_error": "Enter a valid latitude",
|
||||
"location_picker_latitude_hint": "Enter your latitude here",
|
||||
"location_picker_longitude_error": "Enter a valid longitude",
|
||||
"location_picker_longitude_hint": "Enter your longitude here",
|
||||
"log_out": "लॉग आउट",
|
||||
"log_out_all_devices": "सभी डिवाइस लॉग आउट करें",
|
||||
"logged_out_all_devices": "सभी डिवाइस लॉग आउट कर दिए गए",
|
||||
"logged_out_device": "लॉग आउट डिवाइस",
|
||||
"login": "लॉग इन करें",
|
||||
"login_disabled": "Login has been disabled",
|
||||
"login_form_api_exception": "API exception. Please check the server URL and try again.",
|
||||
"login_form_back_button_text": "Back",
|
||||
"login_form_email_hint": "youremail@email.com",
|
||||
"login_form_endpoint_hint": "http://your-server-ip:port",
|
||||
"login_form_endpoint_url": "Server Endpoint URL",
|
||||
"login_form_err_http": "Please specify http:// or https://",
|
||||
"login_form_err_invalid_email": "Invalid Email",
|
||||
"login_form_err_invalid_url": "Invalid URL",
|
||||
"login_form_err_leading_whitespace": "Leading whitespace",
|
||||
"login_form_err_trailing_whitespace": "Trailing whitespace",
|
||||
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
|
||||
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
|
||||
"login_form_failed_login": "Error logging you in, check server URL, email and password",
|
||||
"login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
|
||||
"login_form_password_hint": "password",
|
||||
"login_form_save_login": "Stay logged in",
|
||||
"login_form_server_empty": "Enter a server URL.",
|
||||
"login_form_server_error": "Could not connect to server.",
|
||||
"login_has_been_disabled": "लॉगिन अक्षम कर दिया गया है।",
|
||||
"login_password_changed_error": "There was an error updating your password",
|
||||
"login_password_changed_success": "Password updated successfully",
|
||||
"logout_all_device_confirmation": "क्या आप वाकई सभी डिवाइस से लॉग आउट करना चाहते हैं?",
|
||||
"logout_this_device_confirmation": "क्या आप वाकई इस डिवाइस को लॉग आउट करना चाहते हैं?",
|
||||
"longitude": "देशान्तर",
|
||||
|
@ -718,12 +1009,39 @@
|
|||
"manage_your_devices": "अपने लॉग-इन डिवाइस प्रबंधित करें",
|
||||
"manage_your_oauth_connection": "अपना OAuth कनेक्शन प्रबंधित करें",
|
||||
"map": "नक्शा",
|
||||
"map_assets_in_bound": "{} photo",
|
||||
"map_assets_in_bounds": "{} photos",
|
||||
"map_cannot_get_user_location": "Cannot get user's location",
|
||||
"map_location_dialog_yes": "Yes",
|
||||
"map_location_picker_page_use_location": "Use this location",
|
||||
"map_location_service_disabled_content": "Location service needs to be enabled to display assets from your current location. Do you want to enable it now?",
|
||||
"map_location_service_disabled_title": "Location Service disabled",
|
||||
"map_marker_with_image": "छवि के साथ मानचित्र मार्कर",
|
||||
"map_no_assets_in_bounds": "No photos in this area",
|
||||
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
|
||||
"map_no_location_permission_title": "Location Permission denied",
|
||||
"map_settings": "मानचित्र सेटिंग",
|
||||
"map_settings_dark_mode": "Dark mode",
|
||||
"map_settings_date_range_option_day": "Past 24 hours",
|
||||
"map_settings_date_range_option_days": "Past {} days",
|
||||
"map_settings_date_range_option_year": "Past year",
|
||||
"map_settings_date_range_option_years": "Past {} years",
|
||||
"map_settings_dialog_title": "Map Settings",
|
||||
"map_settings_include_show_archived": "Include Archived",
|
||||
"map_settings_include_show_partners": "Include Partners",
|
||||
"map_settings_only_show_favorites": "Show Favorite Only",
|
||||
"map_settings_theme_settings": "Map Theme",
|
||||
"map_zoom_to_see_photos": "Zoom out to see photos",
|
||||
"matches": "माचिस",
|
||||
"media_type": "मीडिया प्रकार",
|
||||
"memories": "यादें",
|
||||
"memories_all_caught_up": "All caught up",
|
||||
"memories_check_back_tomorrow": "Check back tomorrow for more memories",
|
||||
"memories_setting_description": "आप अपनी यादों में जो देखते हैं उसे प्रबंधित करें",
|
||||
"memories_start_over": "Start Over",
|
||||
"memories_swipe_to_close": "Swipe up to close",
|
||||
"memories_year_ago": "A year ago",
|
||||
"memories_years_ago": "{} years ago",
|
||||
"memory": "याद",
|
||||
"menu": "मेन्यू",
|
||||
"merge": "मर्ज",
|
||||
|
@ -736,11 +1054,16 @@
|
|||
"missing": "गुम",
|
||||
"model": "मॉडल",
|
||||
"month": "महीना",
|
||||
"monthly_title_text_date_format": "MMMM y",
|
||||
"more": "अधिक",
|
||||
"moved_to_trash": "कूड़ेदान में ले जाया गया",
|
||||
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
|
||||
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
|
||||
"my_albums": "मेरे एल्बम",
|
||||
"name": "नाम",
|
||||
"name_or_nickname": "नाम या उपनाम",
|
||||
"networking_settings": "Networking",
|
||||
"networking_subtitle": "Manage the server endpoint settings",
|
||||
"never": "कभी नहीं",
|
||||
"new_album": "नयी एल्बम",
|
||||
"new_api_key": "नई एपीआई कुंजी",
|
||||
|
@ -757,6 +1080,7 @@
|
|||
"no_albums_yet": "ऐसा लगता है कि आपके पास अभी तक कोई एल्बम नहीं है।",
|
||||
"no_archived_assets_message": "फ़ोटो और वीडियो को अपने फ़ोटो दृश्य से छिपाने के लिए उन्हें संग्रहीत करें",
|
||||
"no_assets_message": "अपना पहला फोटो अपलोड करने के लिए क्लिक करें",
|
||||
"no_assets_to_show": "No assets to show",
|
||||
"no_duplicates_found": "कोई नकलची नहीं मिला।",
|
||||
"no_exif_info_available": "कोई एक्सिफ़ जानकारी उपलब्ध नहीं है",
|
||||
"no_explore_results_message": "अपने संग्रह का पता लगाने के लिए और फ़ोटो अपलोड करें।",
|
||||
|
@ -768,9 +1092,13 @@
|
|||
"no_results_description": "कोई पर्यायवाची या अधिक सामान्य कीवर्ड आज़माएँ",
|
||||
"no_shared_albums_message": "अपने नेटवर्क में लोगों के साथ फ़ोटो और वीडियो साझा करने के लिए एक एल्बम बनाएं",
|
||||
"not_in_any_album": "किसी एलबम में नहीं",
|
||||
"not_selected": "Not selected",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "नोट: पहले अपलोड की गई संपत्तियों पर स्टोरेज लेबल लागू करने के लिए, चलाएँ",
|
||||
"note_unlimited_quota": "नोट: असीमित कोटा के लिए 0 दर्ज करें",
|
||||
"notes": "टिप्पणियाँ",
|
||||
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
|
||||
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
|
||||
"notification_permission_list_tile_enable_button": "Enable Notifications",
|
||||
"notification_permission_list_tile_title": "Notification Permission",
|
||||
"notification_toggle_setting_description": "ईमेल सूचनाएं सक्षम करें",
|
||||
"notifications": "सूचनाएं",
|
||||
"notifications_setting_description": "सूचनाएं प्रबंधित करें",
|
||||
|
@ -780,6 +1108,7 @@
|
|||
"offline_paths_description": "ये परिणाम उन फ़ाइलों को मैन्युअल रूप से हटाने के कारण हो सकते हैं जो बाहरी लाइब्रेरी का हिस्सा नहीं हैं।",
|
||||
"ok": "ठीक है",
|
||||
"oldest_first": "सबसे पुराना पहले",
|
||||
"on_this_device": "इस डिवाइस पर",
|
||||
"onboarding": "ज्ञानप्राप्ति",
|
||||
"onboarding_theme_description": "अपने उदाहरण के लिए एक रंग थीम चुनें।",
|
||||
"onboarding_welcome_description": "आइए कुछ सामान्य सेटिंग्स के साथ अपना इंस्टेंस सेट अप करें।",
|
||||
|
@ -799,6 +1128,14 @@
|
|||
"partner": "साथी",
|
||||
"partner_can_access_assets": "संग्रहीत और हटाए गए को छोड़कर आपके सभी फ़ोटो और वीडियो",
|
||||
"partner_can_access_location": "वह स्थान जहां आपकी तस्वीरें ली गईं थीं",
|
||||
"partner_list_user_photos": "{user}'s photos",
|
||||
"partner_list_view_all": "View all",
|
||||
"partner_page_empty_message": "Your photos are not yet shared with any partner.",
|
||||
"partner_page_no_more_users": "No more users to add",
|
||||
"partner_page_partner_add_failed": "Failed to add partner",
|
||||
"partner_page_select_partner": "Select partner",
|
||||
"partner_page_shared_to_title": "Shared to",
|
||||
"partner_page_stop_sharing_content": "{} will no longer be able to access your photos।",
|
||||
"partner_sharing": "पार्टनर शेयरिंग",
|
||||
"partners": "भागीदारों",
|
||||
"password": "पासवर्ड",
|
||||
|
@ -822,6 +1159,14 @@
|
|||
"permanent_deletion_warning_setting_description": "संपत्तियों को स्थायी रूप से हटाते समय एक चेतावनी दिखाएं",
|
||||
"permanently_delete": "स्थायी रूप से हटाना",
|
||||
"permanently_deleted_asset": "स्थायी रूप से हटाई गई संपत्ति",
|
||||
"permission_onboarding_back": "वापस",
|
||||
"permission_onboarding_continue_anyway": "Continue anyway",
|
||||
"permission_onboarding_get_started": "Get started",
|
||||
"permission_onboarding_go_to_settings": "Go to settings",
|
||||
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
|
||||
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
|
||||
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
|
||||
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
|
||||
"person": "व्यक्ति",
|
||||
"photo_shared_all_users": "ऐसा लगता है कि आपने अपनी तस्वीरें सभी उपयोगकर्ताओं के साथ साझा कीं या आपके पास साझा करने के लिए कोई उपयोगकर्ता नहीं है।",
|
||||
"photos": "तस्वीरें",
|
||||
|
@ -835,12 +1180,21 @@
|
|||
"play_motion_photo": "मोशन फ़ोटो चलाएं",
|
||||
"play_or_pause_video": "वीडियो चलाएं या रोकें",
|
||||
"port": "पत्तन",
|
||||
"preferences_settings_subtitle": "Manage the app's preferences",
|
||||
"preferences_settings_title": "Preferences",
|
||||
"preset": "प्रीसेट",
|
||||
"preview": "पूर्व दर्शन",
|
||||
"previous": "पहले का",
|
||||
"previous_memory": "पिछली स्मृति",
|
||||
"previous_or_next_photo": "पिछला या अगला फ़ोटो",
|
||||
"primary": "प्राथमिक",
|
||||
"profile_drawer_app_logs": "Logs",
|
||||
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
|
||||
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
|
||||
"profile_drawer_client_server_up_to_date": "Client and Server are up-to-date",
|
||||
"profile_drawer_github": "गिटहब",
|
||||
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
|
||||
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
|
||||
"profile_picture_set": "प्रोफ़ाइल चित्र सेट।",
|
||||
"public_album": "सार्वजनिक एल्बम",
|
||||
"public_share": "सार्वजनिक शेयर",
|
||||
|
@ -881,6 +1235,8 @@
|
|||
"reassing_hint": "चयनित संपत्तियों को किसी मौजूदा व्यक्ति को सौंपें",
|
||||
"recent": "हाल ही का",
|
||||
"recent_searches": "हाल की खोजें",
|
||||
"recently_added": "हाल ही में जोड़ा गया",
|
||||
"recently_added_page_title": "Recently Added",
|
||||
"refresh": "ताज़ा करना",
|
||||
"refresh_encoded_videos": "एन्कोडेड वीडियो ताज़ा करें",
|
||||
"refresh_metadata": "मेटाडेटा ताज़ा करें",
|
||||
|
@ -924,10 +1280,12 @@
|
|||
"role_editor": "संपादक",
|
||||
"role_viewer": "दर्शक",
|
||||
"save": "बचाना",
|
||||
"save_to_gallery": "गैलरी में सहेजें",
|
||||
"saved_api_key": "सहेजी गई एपीआई कुंजी",
|
||||
"saved_profile": "प्रोफ़ाइल सहेजी गई",
|
||||
"saved_settings": "सहेजी गई सेटिंग्स",
|
||||
"say_something": "कुछ कहें",
|
||||
"scaffold_body_error_occurred": "Error occurred",
|
||||
"scan_all_libraries": "सभी पुस्तकालयों को स्कैन करें",
|
||||
"scan_settings": "सेटिंग्स स्कैन करें",
|
||||
"scanning_for_album": "एल्बम के लिए स्कैन किया जा रहा है..।",
|
||||
|
@ -940,11 +1298,40 @@
|
|||
"search_camera_model": "कैमरा मॉडल खोजें..।",
|
||||
"search_city": "शहर खोजें..।",
|
||||
"search_country": "देश खोजें..।",
|
||||
"search_filter_apply": "Apply filter",
|
||||
"search_filter_camera_title": "कैमरा प्रकार चुनें",
|
||||
"search_filter_date": "तारीख़",
|
||||
"search_filter_date_interval": "{start} से {end} तक",
|
||||
"search_filter_date_title": "तारीख़ की सीमा चुनें",
|
||||
"search_filter_display_option_not_in_album": "Not in album",
|
||||
"search_filter_display_options": "प्रदर्शन विकल्प",
|
||||
"search_filter_filename": "Search by file name",
|
||||
"search_filter_location": "स्थान",
|
||||
"search_filter_location_title": "स्थान चुनें",
|
||||
"search_filter_media_type": "मीडिया प्रकार",
|
||||
"search_filter_media_type_title": "मीडिया प्रकार चुनें",
|
||||
"search_filter_people_title": "लोगों का चयन करें",
|
||||
"search_for_existing_person": "मौजूदा व्यक्ति को खोजें",
|
||||
"search_no_more_result": "No more results",
|
||||
"search_no_people": "कोई लोग नहीं",
|
||||
"search_no_result": "No results found, try a different search term or combination",
|
||||
"search_page_categories": "Categories",
|
||||
"search_page_motion_photos": "Motion Photos",
|
||||
"search_page_no_objects": "No Objects Info Available",
|
||||
"search_page_no_places": "No Places Info Available",
|
||||
"search_page_screenshots": "Screenshots",
|
||||
"search_page_search_photos_videos": "Search for your photos and videos",
|
||||
"search_page_selfies": "Selfies",
|
||||
"search_page_things": "Things",
|
||||
"search_page_view_all_button": "View all",
|
||||
"search_page_your_activity": "Your activity",
|
||||
"search_page_your_map": "Your Map",
|
||||
"search_people": "लोगों को खोजें",
|
||||
"search_places": "स्थान खोजें",
|
||||
"search_result_page_new_search_hint": "New Search",
|
||||
"search_state": "स्थिति खोजें..।",
|
||||
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
|
||||
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
|
||||
"search_timezone": "समयक्षेत्र खोजें..।",
|
||||
"search_type": "तलाश की विधि",
|
||||
"search_your_photos": "अपनी फ़ोटो खोजें",
|
||||
|
@ -963,9 +1350,13 @@
|
|||
"select_new_face": "नया चेहरा चुनें",
|
||||
"select_photos": "फ़ोटो चुनें",
|
||||
"select_trash_all": "ट्रैश ऑल का चयन करें",
|
||||
"select_user_for_sharing_page_err_album": "Failed to create album",
|
||||
"selected": "चयनित",
|
||||
"send_message": "मेसेज भेजें",
|
||||
"send_welcome_email": "स्वागत ईमेल भेजें",
|
||||
"server_endpoint": "Server Endpoint",
|
||||
"server_info_box_app_version": "App Version",
|
||||
"server_info_box_server_url": "सर्वर URL",
|
||||
"server_offline": "सर्वर ऑफ़लाइन",
|
||||
"server_online": "सर्वर ऑनलाइन",
|
||||
"server_stats": "सर्वर आँकड़े",
|
||||
|
@ -976,16 +1367,85 @@
|
|||
"set_date_of_birth": "जन्मतिथि निर्धारित करें",
|
||||
"set_profile_picture": "प्रोफ़ाइल चित्र सेट करें",
|
||||
"set_slideshow_to_fullscreen": "स्लाइड शो को फ़ुलस्क्रीन पर सेट करें",
|
||||
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
|
||||
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
|
||||
"setting_image_viewer_original_title": "Load original image",
|
||||
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
|
||||
"setting_image_viewer_preview_title": "Load preview image",
|
||||
"setting_image_viewer_title": "Images",
|
||||
"setting_languages_apply": "Apply",
|
||||
"setting_languages_subtitle": "Change the app's language",
|
||||
"setting_languages_title": "Languages",
|
||||
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
|
||||
"setting_notifications_notify_hours": "{} hours",
|
||||
"setting_notifications_notify_immediately": "immediately",
|
||||
"setting_notifications_notify_minutes": "{} minutes",
|
||||
"setting_notifications_notify_never": "never",
|
||||
"setting_notifications_notify_seconds": "{} seconds",
|
||||
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
|
||||
"setting_notifications_single_progress_title": "Show background backup detail progress",
|
||||
"setting_notifications_subtitle": "Adjust your notification preferences",
|
||||
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
|
||||
"setting_notifications_total_progress_title": "Show background backup total progress",
|
||||
"setting_video_viewer_looping_title": "Looping",
|
||||
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
|
||||
"setting_video_viewer_original_video_title": "Force original video",
|
||||
"settings": "समायोजन",
|
||||
"settings_require_restart": "Please restart Immich to apply this setting",
|
||||
"settings_saved": "सेटिंग्स को सहेजा गया",
|
||||
"share": "शेयर करना",
|
||||
"share_add_photos": "Add photos",
|
||||
"share_assets_selected": "{} selected",
|
||||
"share_dialog_preparing": "Preparing...",
|
||||
"shared": "साझा",
|
||||
"shared_album_activities_input_disable": "कॉमेंट डिजेबल्ड है",
|
||||
"shared_album_activity_remove_content": "क्या आप इस गतिविधि को हटाना चाहते हैं?",
|
||||
"shared_album_activity_remove_title": "गतिविधि हटाएं",
|
||||
"shared_album_section_people_action_error": "Error leaving/removing from album",
|
||||
"shared_album_section_people_action_leave": "Remove user from album",
|
||||
"shared_album_section_people_action_remove_user": "Remove user from album",
|
||||
"shared_album_section_people_title": "PEOPLE",
|
||||
"shared_by": "द्वारा साझा",
|
||||
"shared_by_you": "आपके द्वारा साझा किया गया",
|
||||
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
|
||||
"shared_link_app_bar_title": "साझा किए गए लिंक",
|
||||
"shared_link_clipboard_copied_massage": "Copied to clipboard",
|
||||
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
|
||||
"shared_link_create_error": "Error while creating shared link",
|
||||
"shared_link_edit_description_hint": "शेयर विवरण दर्ज करें",
|
||||
"shared_link_edit_expire_after_option_day": "1 day",
|
||||
"shared_link_edit_expire_after_option_days": "{} days",
|
||||
"shared_link_edit_expire_after_option_hour": "1 hour",
|
||||
"shared_link_edit_expire_after_option_hours": "{} hours",
|
||||
"shared_link_edit_expire_after_option_minute": "1 minute",
|
||||
"shared_link_edit_expire_after_option_minutes": "{} minutes",
|
||||
"shared_link_edit_expire_after_option_months": "{} months",
|
||||
"shared_link_edit_expire_after_option_year": "{} year",
|
||||
"shared_link_edit_password_hint": "शेयर पासवर्ड दर्ज करें",
|
||||
"shared_link_edit_submit_button": "अपडेट लिंक",
|
||||
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
|
||||
"shared_link_expires_day": "Expires in {} day",
|
||||
"shared_link_expires_days": "Expires in {} days",
|
||||
"shared_link_expires_hour": "Expires in {} hour",
|
||||
"shared_link_expires_hours": "Expires in {} hours",
|
||||
"shared_link_expires_minute": "Expires in {} minute",
|
||||
"shared_link_expires_minutes": "Expires in {} minutes",
|
||||
"shared_link_expires_never": "Expires ∞",
|
||||
"shared_link_expires_second": "Expires in {} second",
|
||||
"shared_link_expires_seconds": "Expires in {} seconds",
|
||||
"shared_link_individual_shared": "Individual shared",
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "साझा किए गए लिंक का प्रबंधन करें",
|
||||
"shared_links": "साझा किए गए लिंक",
|
||||
"shared_with_me": "मेरे साथ साझा किया गया",
|
||||
"sharing": "शेयरिंग",
|
||||
"sharing_enter_password": "कृपया इस पृष्ठ को देखने के लिए पासवर्ड दर्ज करें।",
|
||||
"sharing_page_album": "Shared albums",
|
||||
"sharing_page_description": "Create shared albums to share photos and videos with people in your network.",
|
||||
"sharing_page_empty_list": "EMPTY LIST",
|
||||
"sharing_sidebar_description": "साइडबार में शेयरिंग के लिए एक लिंक प्रदर्शित करें",
|
||||
"sharing_silver_appbar_create_shared_album": "New shared album",
|
||||
"sharing_silver_appbar_share_partner": "Share with partner",
|
||||
"shift_to_permanent_delete": "संपत्ति को स्थायी रूप से हटाने के लिए ⇧ दबाएँ",
|
||||
"show_album_options": "एल्बम विकल्प दिखाएँ",
|
||||
"show_all_people": "सभी लोगों को दिखाओ",
|
||||
|
@ -1036,10 +1496,26 @@
|
|||
"sunrise_on_the_beach": "समुद्र तट पर सूर्योदय",
|
||||
"swap_merge_direction": "मर्ज दिशा स्वैप करें",
|
||||
"sync": "साथ-साथ करना",
|
||||
"sync_albums": "एल्बम्स सिंक करें",
|
||||
"sync_albums_manual_subtitle": "चुने हुए बैकअप एल्बम्स में सभी अपलोड की गई वीडियो और फ़ोटो सिंक करें",
|
||||
"sync_upload_album_setting_subtitle": "अपनी फ़ोटो और वीडियो बनाएँ और उन्हें इमिच पर चुने हुए एल्बम्स में अपलोड करें",
|
||||
"template": "खाका",
|
||||
"theme": "विषय",
|
||||
"theme_selection": "थीम चयन",
|
||||
"theme_selection_description": "आपके ब्राउज़र की सिस्टम प्राथमिकता के आधार पर थीम को स्वचालित रूप से प्रकाश या अंधेरे पर सेट करें",
|
||||
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
|
||||
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
|
||||
"theme_setting_colorful_interface_subtitle": "प्राथमिक रंग को पृष्ठभूमि सतहों पर लागू करें",
|
||||
"theme_setting_colorful_interface_title": "रंगीन इंटरफ़ेस",
|
||||
"theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer",
|
||||
"theme_setting_image_viewer_quality_title": "Image viewer quality",
|
||||
"theme_setting_primary_color_subtitle": "प्राथमिक क्रियाओं और उच्चारणों के लिए एक रंग चुनें",
|
||||
"theme_setting_primary_color_title": "प्राथमिक रंग",
|
||||
"theme_setting_system_primary_color_title": "सिस्टम रंग का उपयोग करें",
|
||||
"theme_setting_system_theme_switch": "Automatic (Follow system setting)",
|
||||
"theme_setting_theme_subtitle": "Choose the app's theme setting",
|
||||
"theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load",
|
||||
"theme_setting_three_stage_loading_title": "Enable three-stage loading",
|
||||
"they_will_be_merged_together": "इन्हें एक साथ मिला दिया जाएगा",
|
||||
"time_based_memories": "समय आधारित यादें",
|
||||
"timezone": "समय क्षेत्र",
|
||||
|
@ -1054,7 +1530,15 @@
|
|||
"trash": "कचरा",
|
||||
"trash_all": "सब कचरा",
|
||||
"trash_delete_asset": "संपत्ति को ट्रैश/डिलीट करें",
|
||||
"trash_emptied": "कचरा खाली कर दिया",
|
||||
"trash_no_results_message": "ट्रैश की गई फ़ोटो और वीडियो यहां दिखाई देंगे।",
|
||||
"trash_page_delete_all": "Delete All",
|
||||
"trash_page_empty_trash_dialog_content": "क्या आप अपनी कूड़ेदान संपत्तियों को खाली करना चाहते हैं? इन आइटमों को Immich से स्थायी रूप से हटा दिया जाएगा",
|
||||
"trash_page_info": "Trashed items will be permanently deleted after {} days",
|
||||
"trash_page_no_assets": "No trashed assets",
|
||||
"trash_page_restore_all": "सभी को पुनः स्थानांतरित करें",
|
||||
"trash_page_select_assets_btn": "संपत्तियों को चयन करें",
|
||||
"trash_page_title": "Trash ({})",
|
||||
"type": "प्रकार",
|
||||
"unarchive": "संग्रह से निकालें",
|
||||
"unfavorite": "नापसंद करें",
|
||||
|
@ -1076,12 +1560,17 @@
|
|||
"updated_password": "अद्यतन पासवर्ड",
|
||||
"upload": "डालना",
|
||||
"upload_concurrency": "समवर्ती अपलोड करें",
|
||||
"upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
|
||||
"upload_dialog_title": "Upload Asset",
|
||||
"upload_status_duplicates": "डुप्लिकेट",
|
||||
"upload_status_errors": "त्रुटियाँ",
|
||||
"upload_status_uploaded": "अपलोड किए गए",
|
||||
"upload_success": "अपलोड सफल रहा, नई अपलोड संपत्तियां देखने के लिए पेज को रीफ्रेश करें।",
|
||||
"upload_to_immich": "Upload to Immich ({})",
|
||||
"uploading": "Uploading",
|
||||
"url": "यूआरएल",
|
||||
"usage": "प्रयोग",
|
||||
"use_current_connection": "use current connection",
|
||||
"use_custom_date_range": "इसके बजाय कस्टम दिनांक सीमा का उपयोग करें",
|
||||
"user": "उपयोगकर्ता",
|
||||
"user_id": "उपयोगकर्ता पहचान",
|
||||
|
@ -1093,10 +1582,16 @@
|
|||
"users": "उपयोगकर्ताओं",
|
||||
"utilities": "उपयोगिताओं",
|
||||
"validate": "मान्य",
|
||||
"validate_endpoint_error": "Please enter a valid URL",
|
||||
"variables": "चर",
|
||||
"version": "संस्करण",
|
||||
"version_announcement_closing": "आपका मित्र, एलेक्स",
|
||||
"version_announcement_message": "नमस्कार मित्र, एप्लिकेशन का एक नया संस्करण है, कृपया अपना समय निकालकर इसे देखें <link>रिलीज नोट्स</link> और अपना सुनिश्चित करें <code>docker-compose.yml</code>, और <code>.env</code> किसी भी गलत कॉन्फ़िगरेशन को रोकने के लिए सेटअप अद्यतित है, खासकर यदि आप वॉचटावर या किसी भी तंत्र का उपयोग करते हैं जो आपके एप्लिकेशन को स्वचालित रूप से अपडेट करने का प्रबंधन करता है।",
|
||||
"version_announcement_overlay_release_notes": "release notes",
|
||||
"version_announcement_overlay_text_1": "Hi friend, there is a new release of",
|
||||
"version_announcement_overlay_text_2": "please take your time to visit the ",
|
||||
"version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.",
|
||||
"version_announcement_overlay_title": "New Server Version Available 🎉",
|
||||
"video": "वीडियो",
|
||||
"video_hover_setting": "होवर पर वीडियो थंबनेल चलाएं",
|
||||
"video_hover_setting_description": "जब माउस आइटम पर घूम रहा हो तो वीडियो थंबनेल चलाएं।",
|
||||
|
@ -1110,13 +1605,18 @@
|
|||
"view_next_asset": "अगली संपत्ति देखें",
|
||||
"view_previous_asset": "पिछली संपत्ति देखें",
|
||||
"view_stack": "ढेर देखें",
|
||||
"viewer_remove_from_stack": "स्टैक से हटाएं",
|
||||
"viewer_stack_use_as_main_asset": "मुख्य संपत्ति के रूप में उपयोग करें",
|
||||
"viewer_unstack": "स्टैक रद्द करें",
|
||||
"waiting": "इंतज़ार में",
|
||||
"warning": "चेतावनी",
|
||||
"week": "सप्ताह",
|
||||
"welcome": "स्वागत",
|
||||
"welcome_to_immich": "इमिच में आपका स्वागत है",
|
||||
"wifi_name": "WiFi Name",
|
||||
"year": "वर्ष",
|
||||
"yes": "हाँ",
|
||||
"you_dont_have_any_shared_links": "आपके पास कोई साझा लिंक नहीं है",
|
||||
"your_wifi_name": "Your WiFi name",
|
||||
"zoom_image": "छवि ज़ूम करें"
|
||||
}
|
||||
|
|
892
i18n/hr.json
892
i18n/hr.json
File diff suppressed because it is too large
Load diff
522
i18n/hu.json
522
i18n/hu.json
File diff suppressed because it is too large
Load diff
107
i18n/hy.json
107
i18n/hy.json
|
@ -1,23 +1,24 @@
|
|||
{
|
||||
"about": "Մասին",
|
||||
"account": "",
|
||||
"account_settings": "",
|
||||
"acknowledge": "",
|
||||
"action": "",
|
||||
"action": "Գործողություն",
|
||||
"actions": "",
|
||||
"active": "",
|
||||
"activity": "",
|
||||
"add": "",
|
||||
"add": "Ավելացնել",
|
||||
"add_a_description": "",
|
||||
"add_a_location": "",
|
||||
"add_a_name": "",
|
||||
"add_a_location": "Ավելացնել տեղ",
|
||||
"add_a_name": "Ավելացնել անուն",
|
||||
"add_a_title": "",
|
||||
"add_exclusion_pattern": "",
|
||||
"add_import_path": "",
|
||||
"add_location": "",
|
||||
"add_location": "Ավելացնել տեղ",
|
||||
"add_more_users": "",
|
||||
"add_partner": "",
|
||||
"add_path": "",
|
||||
"add_photos": "",
|
||||
"add_photos": "Ավելացնել նկարներ",
|
||||
"add_to": "",
|
||||
"add_to_album": "",
|
||||
"add_to_shared_album": "",
|
||||
|
@ -116,7 +117,6 @@
|
|||
"no_pattern_added": "",
|
||||
"note_apply_storage_label_previous_assets": "",
|
||||
"note_cannot_be_changed_later": "",
|
||||
"note_unlimited_quota": "",
|
||||
"notification_email_from_address": "",
|
||||
"notification_email_from_address_description": "",
|
||||
"notification_email_host_description": "",
|
||||
|
@ -137,17 +137,12 @@
|
|||
"oauth_auto_register": "",
|
||||
"oauth_auto_register_description": "",
|
||||
"oauth_button_text": "",
|
||||
"oauth_client_id": "",
|
||||
"oauth_client_secret": "",
|
||||
"oauth_enable_description": "",
|
||||
"oauth_issuer_url": "",
|
||||
"oauth_mobile_redirect_uri": "",
|
||||
"oauth_mobile_redirect_uri_override": "",
|
||||
"oauth_mobile_redirect_uri_override_description": "",
|
||||
"oauth_scope": "",
|
||||
"oauth_settings": "",
|
||||
"oauth_settings_description": "",
|
||||
"oauth_signing_algorithm": "",
|
||||
"oauth_storage_label_claim": "",
|
||||
"oauth_storage_label_claim_description": "",
|
||||
"oauth_storage_quota_claim": "",
|
||||
|
@ -296,7 +291,10 @@
|
|||
"asset_offline": "",
|
||||
"assets": "",
|
||||
"authorized_devices": "",
|
||||
"back": "",
|
||||
"back": "Հետ",
|
||||
"backup_all": "Բոլոր",
|
||||
"backup_controller_page_background_battery_info_link": "Ցույց տուր ինչպես",
|
||||
"backup_controller_page_background_battery_info_ok": "Լավ",
|
||||
"backward": "",
|
||||
"blurred_background": "",
|
||||
"camera": "",
|
||||
|
@ -308,8 +306,8 @@
|
|||
"cannot_update_the_description": "",
|
||||
"change_date": "",
|
||||
"change_expiration_time": "",
|
||||
"change_location": "",
|
||||
"change_name": "",
|
||||
"change_location": "Փոխել տեղը",
|
||||
"change_name": "Փոխել անուն",
|
||||
"change_name_successfully": "",
|
||||
"change_password": "",
|
||||
"change_your_password": "",
|
||||
|
@ -317,13 +315,15 @@
|
|||
"check_all": "",
|
||||
"check_logs": "",
|
||||
"choose_matching_people_to_merge": "",
|
||||
"city": "",
|
||||
"city": "Քաղաք",
|
||||
"clear": "",
|
||||
"clear_all": "",
|
||||
"clear_message": "",
|
||||
"clear_value": "",
|
||||
"client_cert_dialog_msg_confirm": "Լավ",
|
||||
"close": "",
|
||||
"collapse_all": "",
|
||||
"color": "Գույն",
|
||||
"color_theme": "",
|
||||
"comment_options": "",
|
||||
"comments_are_disabled": "",
|
||||
|
@ -334,6 +334,7 @@
|
|||
"contain": "",
|
||||
"context": "",
|
||||
"continue": "",
|
||||
"control_bottom_app_bar_edit_location": "Փոխել Տեղը",
|
||||
"copied_image_to_clipboard": "",
|
||||
"copied_to_clipboard": "",
|
||||
"copy_error": "",
|
||||
|
@ -343,7 +344,7 @@
|
|||
"copy_link_to_clipboard": "",
|
||||
"copy_password": "",
|
||||
"copy_to_clipboard": "",
|
||||
"country": "",
|
||||
"country": "Երկիր",
|
||||
"cover": "",
|
||||
"covers": "",
|
||||
"create": "",
|
||||
|
@ -351,19 +352,22 @@
|
|||
"create_library": "",
|
||||
"create_link": "",
|
||||
"create_link_to_share": "",
|
||||
"create_new_person": "",
|
||||
"create_new": "ՍՏԵՂԾԵԼ ՆՈՐ",
|
||||
"create_new_person": "Ստեղծել նոր անձ",
|
||||
"create_new_user": "",
|
||||
"create_shared_album_page_share_select_photos": "Ընտրե Նկարներ",
|
||||
"create_user": "",
|
||||
"created": "",
|
||||
"curated_object_page_title": "Բաներ",
|
||||
"current_device": "",
|
||||
"custom_locale": "",
|
||||
"custom_locale_description": "",
|
||||
"dark": "",
|
||||
"dark": "Մութ",
|
||||
"date_after": "",
|
||||
"date_and_time": "",
|
||||
"date_before": "",
|
||||
"date_range": "",
|
||||
"day": "",
|
||||
"day": "Օր",
|
||||
"default_locale": "",
|
||||
"default_locale_description": "",
|
||||
"delete": "",
|
||||
|
@ -402,7 +406,7 @@
|
|||
"edit_import_paths": "",
|
||||
"edit_key": "",
|
||||
"edit_link": "",
|
||||
"edit_location": "",
|
||||
"edit_location": "Փոխել տեղը",
|
||||
"edit_name": "",
|
||||
"edit_people": "",
|
||||
"edit_title": "",
|
||||
|
@ -485,6 +489,9 @@
|
|||
"unable_to_update_timeline_display_status": "",
|
||||
"unable_to_update_user": ""
|
||||
},
|
||||
"exif_bottom_sheet_person_add_person": "Ավելացնել անուն",
|
||||
"exif_bottom_sheet_person_age": "Տարիք {}",
|
||||
"exif_bottom_sheet_person_age_years": "Տարիք {}",
|
||||
"exit_slideshow": "",
|
||||
"expand_all": "",
|
||||
"expire_after": "",
|
||||
|
@ -514,6 +521,7 @@
|
|||
"go_to_search": "",
|
||||
"group_albums_by": "",
|
||||
"has_quota": "",
|
||||
"hi_user": "Բարեւ {name} ({email})",
|
||||
"hide_gallery": "",
|
||||
"hide_password": "",
|
||||
"hide_person": "",
|
||||
|
@ -571,6 +579,8 @@
|
|||
"manage_your_devices": "",
|
||||
"manage_your_oauth_connection": "",
|
||||
"map": "",
|
||||
"map_assets_in_bound": "{} նկար",
|
||||
"map_assets_in_bounds": "{} նկարներ",
|
||||
"map_marker_with_image": "",
|
||||
"map_settings": "",
|
||||
"matches": "",
|
||||
|
@ -614,7 +624,6 @@
|
|||
"no_shared_albums_message": "",
|
||||
"not_in_any_album": "",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "",
|
||||
"note_unlimited_quota": "",
|
||||
"notes": "",
|
||||
"notification_toggle_setting_description": "",
|
||||
"notifications": "",
|
||||
|
@ -638,6 +647,7 @@
|
|||
"partner_can_access": "",
|
||||
"partner_can_access_assets": "",
|
||||
"partner_can_access_location": "",
|
||||
"partner_list_user_photos": "{}-ին նկարները",
|
||||
"partner_sharing": "",
|
||||
"partners": "",
|
||||
"password": "",
|
||||
|
@ -661,7 +671,7 @@
|
|||
"permanent_deletion_warning_setting_description": "",
|
||||
"permanently_delete": "",
|
||||
"permanently_deleted_asset": "",
|
||||
"photos": "",
|
||||
"photos": "Նկարներ",
|
||||
"photos_count": "",
|
||||
"photos_from_previous_years": "",
|
||||
"pick_a_location": "",
|
||||
|
@ -709,21 +719,28 @@
|
|||
"retry_upload": "",
|
||||
"review_duplicates": "",
|
||||
"role": "",
|
||||
"save": "",
|
||||
"save": "Պահե",
|
||||
"saved_api_key": "",
|
||||
"saved_profile": "",
|
||||
"saved_settings": "",
|
||||
"say_something": "",
|
||||
"scan_all_libraries": "",
|
||||
"scan_library": "Նայե",
|
||||
"scan_settings": "",
|
||||
"search": "",
|
||||
"search": "Փնտրե",
|
||||
"search_albums": "",
|
||||
"search_by_context": "",
|
||||
"search_camera_make": "",
|
||||
"search_camera_model": "",
|
||||
"search_city": "",
|
||||
"search_city": "Որոնե քաղաք…",
|
||||
"search_country": "",
|
||||
"search_filter_date": "Ամսաթիվ",
|
||||
"search_filter_date_interval": "{start} մինչեւ {end}",
|
||||
"search_filter_location": "Տեղ",
|
||||
"search_filter_location_title": "Ընտրե տեղ",
|
||||
"search_for_existing_person": "",
|
||||
"search_no_people": "Ոչ մի անձ",
|
||||
"search_page_motion_photos": "Շարժվող Նկարներ",
|
||||
"search_people": "",
|
||||
"search_places": "",
|
||||
"search_state": "",
|
||||
|
@ -740,7 +757,7 @@
|
|||
"select_keep_all": "",
|
||||
"select_library_owner": "",
|
||||
"select_new_face": "",
|
||||
"select_photos": "",
|
||||
"select_photos": "Ընտրե նկարներ",
|
||||
"select_trash_all": "",
|
||||
"selected": "",
|
||||
"send_message": "",
|
||||
|
@ -752,13 +769,24 @@
|
|||
"set_date_of_birth": "",
|
||||
"set_profile_picture": "",
|
||||
"set_slideshow_to_fullscreen": "",
|
||||
"setting_notifications_notify_never": "երբեք",
|
||||
"setting_notifications_notify_seconds": "{} վայրկյան",
|
||||
"settings": "",
|
||||
"settings_saved": "",
|
||||
"share": "",
|
||||
"share_add_photos": "Ավելացնել նկարներ",
|
||||
"shared": "",
|
||||
"shared_by": "",
|
||||
"shared_by_you": "",
|
||||
"shared_from_partner": "",
|
||||
"shared_link_edit_expire_after_option_day": "1 օր",
|
||||
"shared_link_edit_expire_after_option_days": "{} օր",
|
||||
"shared_link_edit_expire_after_option_hour": "1 ժամ",
|
||||
"shared_link_edit_expire_after_option_hours": "{} ժամ",
|
||||
"shared_link_edit_expire_after_option_minute": "1 րոպե",
|
||||
"shared_link_edit_expire_after_option_minutes": "{} րոպե",
|
||||
"shared_link_edit_expire_after_option_months": "{} ամիս",
|
||||
"shared_link_edit_expire_after_option_year": "{} տարի",
|
||||
"shared_links": "",
|
||||
"shared_photos_and_videos_count": "",
|
||||
"shared_with_partner": "",
|
||||
|
@ -786,6 +814,8 @@
|
|||
"slideshow": "",
|
||||
"slideshow_settings": "",
|
||||
"sort_albums_by": "",
|
||||
"sort_oldest": "Ամենահին նկարը",
|
||||
"sort_recent": "Ամենանոր նկարը",
|
||||
"stack": "",
|
||||
"stack_selected_photos": "",
|
||||
"stacktrace": "",
|
||||
|
@ -810,22 +840,25 @@
|
|||
"theme_selection": "",
|
||||
"theme_selection_description": "",
|
||||
"time_based_memories": "",
|
||||
"timezone": "",
|
||||
"timezone": "Ժամային գոտի",
|
||||
"to_archive": "",
|
||||
"to_favorite": "",
|
||||
"to_trash": "Աղբ",
|
||||
"toggle_settings": "",
|
||||
"toggle_theme": "",
|
||||
"total_usage": "",
|
||||
"trash": "",
|
||||
"trash": "Աղբ",
|
||||
"trash_all": "",
|
||||
"trash_no_results_message": "",
|
||||
"trash_page_title": "Աղբ ({})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "",
|
||||
"type": "",
|
||||
"type": "Տեսակ",
|
||||
"unarchive": "",
|
||||
"unfavorite": "",
|
||||
"unhide_person": "",
|
||||
"unknown": "",
|
||||
"unknown_year": "",
|
||||
"unknown": "Անհայտ",
|
||||
"unknown_country": "Անհայտ Երկիր",
|
||||
"unknown_year": "Անհայտ Տարի",
|
||||
"unlimited": "",
|
||||
"unlink_oauth": "",
|
||||
"unlinked_oauth_account": "",
|
||||
|
@ -837,6 +870,7 @@
|
|||
"updated_password": "",
|
||||
"upload": "",
|
||||
"upload_concurrency": "",
|
||||
"upload_status_errors": "Սխալներ",
|
||||
"url": "",
|
||||
"usage": "",
|
||||
"user": "",
|
||||
|
@ -848,6 +882,7 @@
|
|||
"validate": "",
|
||||
"variables": "",
|
||||
"version": "",
|
||||
"version_announcement_closing": "Քո ընկերը՝ Ալեքսը",
|
||||
"video": "",
|
||||
"video_hover_setting": "",
|
||||
"video_hover_setting_description": "",
|
||||
|
@ -859,11 +894,11 @@
|
|||
"view_next_asset": "",
|
||||
"view_previous_asset": "",
|
||||
"waiting": "",
|
||||
"week": "",
|
||||
"welcome": "",
|
||||
"week": "Շաբաթ",
|
||||
"welcome": "Բարի գալուստ",
|
||||
"welcome_to_immich": "",
|
||||
"year": "",
|
||||
"yes": "",
|
||||
"year": "Տարի",
|
||||
"yes": "Այո",
|
||||
"you_dont_have_any_shared_links": "",
|
||||
"zoom_image": ""
|
||||
}
|
||||
|
|
542
i18n/id.json
542
i18n/id.json
File diff suppressed because it is too large
Load diff
554
i18n/it.json
554
i18n/it.json
File diff suppressed because it is too large
Load diff
565
i18n/ja.json
565
i18n/ja.json
File diff suppressed because it is too large
Load diff
165
i18n/ka.json
165
i18n/ka.json
|
@ -1 +1,164 @@
|
|||
{}
|
||||
{
|
||||
"about": "შესახებ",
|
||||
"account": "ანგარიში",
|
||||
"account_settings": "ანგარიშის პარამეტრები",
|
||||
"acknowledge": "მიღება",
|
||||
"action": "ქმედება",
|
||||
"actions": "ქმედებები",
|
||||
"active": "აქტიური",
|
||||
"activity": "აქტივობა",
|
||||
"add": "დამატება",
|
||||
"add_a_description": "დაამატე აღწერა",
|
||||
"add_a_location": "დაამატე ადგილი",
|
||||
"add_a_name": "დაამატე სახელი",
|
||||
"add_a_title": "დაასათაურე",
|
||||
"add_import_path": "დაამატე საიმპორტო მისამართი",
|
||||
"add_location": "დაამატე ადგილი",
|
||||
"add_more_users": "დაამატე მომხმარებლები",
|
||||
"add_partner": "დაამატე პარტნიორი",
|
||||
"add_path": "დაამატე მისამართი",
|
||||
"add_photos": "დაამატე ფოტოები",
|
||||
"add_to_album": "დაამატე ალბომში",
|
||||
"add_to_shared_album": "დაამატე საზიარო ალბომში",
|
||||
"add_url": "დაამატე URL",
|
||||
"added_to_archive": "დაარქივდა",
|
||||
"added_to_favorites": "დაამატე რჩეულებში",
|
||||
"added_to_favorites_count": "{count, number} დაემატა რჩეულებში",
|
||||
"admin": {
|
||||
"authentication_settings": "ავთენტიკაციის პარამეტრები",
|
||||
"authentication_settings_description": "პაროლის, OAuth-ის და სხვა ავტენთიფიკაციის პარამეტრების მართვა",
|
||||
"authentication_settings_disable_all": "ნამდვილად გინდა ავტორიზაციის ყველა მეთოდის გამორთვა? ავტორიზაციას ვეღარანაირად შეძლებ.",
|
||||
"authentication_settings_reenable": "რეაქტივაციისთვის, გამოიყენე <link>სერვერის ბრძანება</link>.",
|
||||
"background_task_job": "ფონური დავალებები",
|
||||
"backup_database": "ბაზის დამპის შექმნა",
|
||||
"backup_database_enable_description": "ბაზის დამპების ჩართვა",
|
||||
"backup_keep_last_amount": "წინა დამპების შესანარჩუნებელი რაოდენობა",
|
||||
"backup_settings": "მონაცემთა ბაზის დამპის მორგება",
|
||||
"backup_settings_description": "მონაცემთა ბაზის პარამეტრების ამრთვა. შენიშვნა: ამ დავალებების მონიტორინგი არ ხდება და თქვენ არ მოგივათ შეტყობინება, თუ ის ჩავარდება.",
|
||||
"check_all": "შეამოწმე ყველა",
|
||||
"cleanup": "გასუფთავება",
|
||||
"confirm_delete_library": "ნამდვილად გინდა {library} ბიბლიოთეკის წაშლა?",
|
||||
"confirm_email_below": "დასადასტურებლად, ქვემოთ აკრიფე \"{email}\"",
|
||||
"confirm_user_password_reset": "ნამდვილად გინდა {user}-(ი)ს პაროლის დარესეტება?",
|
||||
"disable_login": "გამორთე ავტორიზაცია",
|
||||
"external_library_management": "გარე ბიბლიოთეკების მართვა",
|
||||
"face_detection": "სახის ამოცნობა",
|
||||
"image_format": "ფორმატი",
|
||||
"image_fullsize_title": "სრული ზომის გამოსახულების პარამეტრები",
|
||||
"image_quality": "ხარისხი",
|
||||
"image_resolution": "გაფართოება",
|
||||
"image_settings": "გამოსახულების პარამეტრები",
|
||||
"image_settings_description": "გენერირებული ფოტოების ხარისხისა და რეზოლუციის მართვა",
|
||||
"image_thumbnail_description": "მინიატურა მეტაინფორმაციის გარეშე, რომელიც ფოტოები ჯგუფურად თვალიერებისას გამოიყენება(მაგ. მთავარ თაიმლაინზე)",
|
||||
"image_thumbnail_quality_description": "მინიატურის ხარისხი 1-დან 100-მდე. დიდი რიცხვი შეესაბამება უკეთეს ხარისხს, თუმცა, უფრო დიდ ფაილებს და აპლიკაციის შესაძლო შენელებას.",
|
||||
"image_thumbnail_title": "მინიატურის პარამეტრები",
|
||||
"library_created": "შეიქმნა ბიბლიოთეკა: {library}",
|
||||
"library_deleted": "ბიბლიოთეკა წაიშალა",
|
||||
"library_import_path_description": "აირჩიე დასაიმპორტებელი საქაღალდე. ფოტოები და ვიდეოები მოიძებნება ამ საქაღალდესა და მასში არსებულ საქაღალდეებში.",
|
||||
"library_settings_description": "გარე ბიბლიოთეკების პარამეტრების მართვა",
|
||||
"logging_settings": "ჟურნალი",
|
||||
"map_settings": "რუკა",
|
||||
"migration_job": "მიგრაცია",
|
||||
"oauth_settings": "OAuth",
|
||||
"template_email_preview": "მინიატურა",
|
||||
"transcoding_acceleration_vaapi": "VAAPI",
|
||||
"transcoding_threads": "ნაკადები",
|
||||
"transcoding_tone_mapping": "ტონების ასახვა"
|
||||
},
|
||||
"administration": "ადმინისტრაცია",
|
||||
"advanced": "დამატებით",
|
||||
"albums": "ალბომები",
|
||||
"all": "ყველა",
|
||||
"anti_clockwise": "საათის ისრის საწინააღმდეგო",
|
||||
"archive": "არქივი",
|
||||
"asset_hashing": "დაჰეშვა.…",
|
||||
"asset_skipped": "გამოტოვებულია",
|
||||
"asset_uploaded": "ატვირთულია",
|
||||
"asset_uploading": "მიმდინარეობს ატვირთვა…",
|
||||
"assets": "ობიექტები",
|
||||
"back": "უკან",
|
||||
"backward": "უკან გადასვლა",
|
||||
"build": "აგება",
|
||||
"camera": "კამერა",
|
||||
"cancel": "გაუქმება",
|
||||
"city": "ქალაქი",
|
||||
"clear": "გასუფთავება",
|
||||
"clockwise": "საათის ისრის მიმართულებით",
|
||||
"close": "დახურვა",
|
||||
"collapse": "აკეცვა",
|
||||
"color": "ფერი",
|
||||
"confirm": "დასტური",
|
||||
"contain": "შეიცავს",
|
||||
"context": "კონტექსტი",
|
||||
"continue": "გაგრძელება",
|
||||
"country": "ქვეყანა",
|
||||
"cover": "ყდა",
|
||||
"covers": "ყდები",
|
||||
"create": "შექმნა",
|
||||
"created": "შექმნილია",
|
||||
"dark": "მუქი",
|
||||
"day": "დღე",
|
||||
"delete": "წაშლა",
|
||||
"description": "აღწერა",
|
||||
"details": "დეტალები",
|
||||
"direction": "მიმართულება",
|
||||
"disabled": "გათიშულია",
|
||||
"discord": "Discord",
|
||||
"discover": "აღმოჩენა",
|
||||
"documentation": "დოკუმენტაცია",
|
||||
"done": "მზადაა",
|
||||
"download": "გადმოწერა",
|
||||
"download_settings": "გადმოწერა",
|
||||
"downloading": "მიმდინარეობს გადმოწერა",
|
||||
"duplicates": "დუბლიკატები",
|
||||
"duration": "ხანგრძლივობა",
|
||||
"edit": "ჩასწორება",
|
||||
"edited": "ჩასწორებულია",
|
||||
"editor": "რედაქტორი",
|
||||
"editor_crop_tool_h2_rotation": "ტრიალი",
|
||||
"email": "ელფოსტა",
|
||||
"enable": "ჩართვა",
|
||||
"enabled": "ჩართულია",
|
||||
"error": "შეცდომა",
|
||||
"exif": "Exif",
|
||||
"expired": "ვადაამოწურულია",
|
||||
"explore": "დათვალიერება",
|
||||
"explorer": "გამცილებელი",
|
||||
"export": "გატანა",
|
||||
"extension": "გაფართოება",
|
||||
"external": "გარე",
|
||||
"face_unassigned": "მიუნიჭებელი",
|
||||
"favorite": "რჩეული",
|
||||
"favorites": "რჩეულები",
|
||||
"features": "თვისებები",
|
||||
"filename": "ფაილის სახელი",
|
||||
"filetype": "ფაილის ტიპი",
|
||||
"folders": "საქაღალდეები",
|
||||
"forward": "წინ",
|
||||
"general": "ზოგადი",
|
||||
"host": "ჰოსტი",
|
||||
"hour": "საათი",
|
||||
"image": "გამოსახულება",
|
||||
"info": "ინფორმაცია",
|
||||
"jobs": "დავალებები",
|
||||
"keep": "შენარჩუნება",
|
||||
"language": "ენა",
|
||||
"latitude": "განედი",
|
||||
"leave": "გასვლა",
|
||||
"level": "დონე",
|
||||
"library": "ბიბლიოთეკა",
|
||||
"light": "ღია",
|
||||
"list": "სია",
|
||||
"loading": "ჩატვირთვა",
|
||||
"login": "შესვლა",
|
||||
"longitude": "გრძედი",
|
||||
"look": "შეხედვა",
|
||||
"make": "მწარმოებელი",
|
||||
"map": "რუკა",
|
||||
"matches": "დამთხვევები",
|
||||
"memories": "მოგონებები",
|
||||
"memory": "მეხსიერება",
|
||||
"menu": "მენიუ",
|
||||
"merge": "შერწყმა",
|
||||
"minimize": "დაპატარავება"
|
||||
}
|
||||
|
|
17
i18n/kk.json
17
i18n/kk.json
|
@ -1 +1,16 @@
|
|||
{}
|
||||
{
|
||||
"add_photos": "суреттерді қосу",
|
||||
"add_to": "қосу…",
|
||||
"add_to_album": "альбомға қосу",
|
||||
"add_to_album_bottom_sheet_added": "{album}'ға қосылған",
|
||||
"add_to_album_bottom_sheet_already_exists": "Онсыз да {album} болған",
|
||||
"add_to_shared_album": "бөліскен альбомға қосу",
|
||||
"add_url": "URL таңдау",
|
||||
"added_to_archive": "Архивке жіберілген",
|
||||
"added_to_favorites": "таңдаулыларға қосылған",
|
||||
"admin": {
|
||||
"check_all": "Бәрін тексеріп алу",
|
||||
"create_job": "Жұмысты бастау"
|
||||
},
|
||||
"zoom_image": "суретті үлкейту"
|
||||
}
|
||||
|
|
|
@ -121,7 +121,6 @@
|
|||
"no_pattern_added": "",
|
||||
"note_apply_storage_label_previous_assets": "",
|
||||
"note_cannot_be_changed_later": "",
|
||||
"note_unlimited_quota": "",
|
||||
"notification_email_from_address": "",
|
||||
"notification_email_from_address_description": "",
|
||||
"notification_email_host_description": "",
|
||||
|
@ -142,17 +141,12 @@
|
|||
"oauth_auto_register": "",
|
||||
"oauth_auto_register_description": "",
|
||||
"oauth_button_text": "",
|
||||
"oauth_client_id": "",
|
||||
"oauth_client_secret": "",
|
||||
"oauth_enable_description": "",
|
||||
"oauth_issuer_url": "",
|
||||
"oauth_mobile_redirect_uri": "",
|
||||
"oauth_mobile_redirect_uri_override": "",
|
||||
"oauth_mobile_redirect_uri_override_description": "",
|
||||
"oauth_scope": "",
|
||||
"oauth_settings": "",
|
||||
"oauth_settings_description": "",
|
||||
"oauth_signing_algorithm": "",
|
||||
"oauth_storage_label_claim": "",
|
||||
"oauth_storage_label_claim_description": "",
|
||||
"oauth_storage_quota_claim": "",
|
||||
|
@ -621,7 +615,6 @@
|
|||
"no_shared_albums_message": "",
|
||||
"not_in_any_album": "",
|
||||
"note_apply_storage_label_to_previously_uploaded assets": "",
|
||||
"note_unlimited_quota": "",
|
||||
"notes": "",
|
||||
"notification_toggle_setting_description": "",
|
||||
"notifications": "",
|
||||
|
|
27
i18n/kn.json
27
i18n/kn.json
|
@ -1 +1,26 @@
|
|||
{}
|
||||
{
|
||||
"about": "ಕುರಿತು",
|
||||
"account": "ಖಾತೆ",
|
||||
"account_settings": "ಖಾತೆ ಸೆಟ್ಟಿಂಗ್ಗಳು",
|
||||
"acknowledge": "ಅಂಗೀಕರಿಸಿ",
|
||||
"action": "ಕಾರ್ಯ",
|
||||
"action_common_update": "ನವೀಕರಿಸಿ",
|
||||
"actions": "ಕ್ರಿಯೆಗಳು",
|
||||
"active": "ಸಕ್ರಿಯ",
|
||||
"activity": "ಚಟುವಟಿಕೆ",
|
||||
"add": "ಸೇರಿಸಿ",
|
||||
"add_a_description": "ವಿವರಣೆಯನ್ನು ಸೇರಿಸಿ",
|
||||
"add_a_location": "ಸ್ಥಳವನ್ನು ಸೇರಿಸಿ",
|
||||
"add_a_name": "ಹೆಸರನ್ನು ಸೇರಿಸಿ",
|
||||
"add_a_title": "ಶೀರ್ಷಿಕೆಯನ್ನು ಸೇರಿಸಿ",
|
||||
"add_endpoint": "ಎಂಡ್ಪಾಯಿಂಟ್ ಸೇರಿಸಿ",
|
||||
"add_exclusion_pattern": "ಹೊರಗಿಡುವಿಕೆ ಮಾದರಿಯನ್ನು ಸೇರಿಸಿ",
|
||||
"add_import_path": "ಆಮದು ಮಾರ್ಗವನ್ನು ಸೇರಿಸಿ",
|
||||
"add_location": "ಸ್ಥಳ ಸೇರಿಸಿ",
|
||||
"add_more_users": "ಹೆಚ್ಚಿನ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ",
|
||||
"add_partner": "ಪಾಲುದಾರರನ್ನು ಸೇರಿಸಿ",
|
||||
"add_path": "ಹಾದಿಯನ್ನು ಸೇರಿಸಿ",
|
||||
"add_photos": "ಫೋಟೋಗಳನ್ನು ಸೇರಿಸಿ",
|
||||
"add_to": "ಸೇರಿಸಿ…",
|
||||
"add_to_album": "ಆಲ್ಬಮ್ಗೆ ಸೇರಿಸಿ"
|
||||
}
|
||||
|
|
766
i18n/ko.json
766
i18n/ko.json
File diff suppressed because it is too large
Load diff
517
i18n/lt.json
517
i18n/lt.json
|
@ -4,6 +4,7 @@
|
|||
"account_settings": "Paskyros nustatymai",
|
||||
"acknowledge": "Patvirtinti",
|
||||
"action": "Veiksmas",
|
||||
"action_common_update": "Update",
|
||||
"actions": "Veiksmai",
|
||||
"active": "Vykdoma",
|
||||
"activity": "Veikla",
|
||||
|
@ -13,6 +14,7 @@
|
|||
"add_a_location": "Pridėti vietovę",
|
||||
"add_a_name": "Pridėti vardą",
|
||||
"add_a_title": "Pridėti pavadinimą",
|
||||
"add_endpoint": "Add endpoint",
|
||||
"add_exclusion_pattern": "Pridėti išimčių šabloną",
|
||||
"add_import_path": "Pridėti importavimo kelią",
|
||||
"add_location": "Pridėti vietovę",
|
||||
|
@ -22,6 +24,8 @@
|
|||
"add_photos": "Pridėti nuotraukų",
|
||||
"add_to": "Pridėti į…",
|
||||
"add_to_album": "Pridėti į albumą",
|
||||
"add_to_album_bottom_sheet_added": "Added to {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
|
||||
"add_to_shared_album": "Pridėti į bendrinamą albumą",
|
||||
"add_url": "Pridėti URL",
|
||||
"added_to_archive": "Pridėta į archyvą",
|
||||
|
@ -157,7 +161,6 @@
|
|||
"no_pattern_added": "Šablonas nepridėtas",
|
||||
"note_apply_storage_label_previous_assets": "Pastaba: norėdami pritaikyti saugyklos etiketę seniau įkeltiems ištekliams, paleiskite",
|
||||
"note_cannot_be_changed_later": "PASTABA: Vėliau to pakeisti negalima!",
|
||||
"note_unlimited_quota": "Pastaba: įveskite 0 norint neribotos kvotos",
|
||||
"notification_email_from_address": "Iš adreso",
|
||||
"notification_email_from_address_description": "Siuntėjo elektroninis adresas, pavyzdžiui: \"Immich Photo Server <noreply@example.com>\"",
|
||||
"notification_email_host_description": "Elektroninio pašto serverio savininkas (pvz. smtp.immich.app)",
|
||||
|
@ -179,20 +182,13 @@
|
|||
"oauth_auto_register": "Automatinis registravimas",
|
||||
"oauth_auto_register_description": "Automatiškai užregistruoti naujus naudotojus po prisijungimo per OAuth",
|
||||
"oauth_button_text": "Mygtuko tekstas",
|
||||
"oauth_client_id": "Kliento ID",
|
||||
"oauth_client_secret": "Kliento paslaptis",
|
||||
"oauth_enable_description": "Prisijungti su OAuth",
|
||||
"oauth_issuer_url": "Teikėjo URL",
|
||||
"oauth_mobile_redirect_uri": "Mobiliojo peradresavimo URI",
|
||||
"oauth_mobile_redirect_uri_override": "Mobiliojo peradresavimo URI pakeitimas",
|
||||
"oauth_mobile_redirect_uri_override_description": "Įjunkite, kai OAuth teikėjas nepalaiko mobiliojo URI, tokio kaip '{callback}'",
|
||||
"oauth_profile_signing_algorithm": "Profilio registracijos algoritmas",
|
||||
"oauth_profile_signing_algorithm_description": "Algoritmas naudojamas vartotojo profilio registracijai.",
|
||||
"oauth_scope": "Apimtis",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Tvarkyti OAuth prisijungimo nustatymus",
|
||||
"oauth_settings_more_details": "Detaliau apie šią funkciją galite paskaityti <link>dokumentacijoje</link>.",
|
||||
"oauth_signing_algorithm": "",
|
||||
"oauth_storage_label_claim": "",
|
||||
"oauth_storage_label_claim_description": "",
|
||||
"oauth_storage_quota_claim": "",
|
||||
|
@ -315,10 +311,22 @@
|
|||
"admin_password": "Administratoriaus slaptažodis",
|
||||
"administration": "Administravimas",
|
||||
"advanced": "",
|
||||
"advanced_settings_log_level_title": "Log level: {}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
|
||||
"advanced_settings_prefer_remote_title": "Prefer remote images",
|
||||
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request",
|
||||
"advanced_settings_proxy_headers_title": "Proxy Headers",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
|
||||
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
|
||||
"advanced_settings_tile_subtitle": "Advanced user's settings",
|
||||
"advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting",
|
||||
"advanced_settings_troubleshooting_title": "Troubleshooting",
|
||||
"album_added": "Albumas pridėtas",
|
||||
"album_added_notification_setting_description": "Gauti el. pašto pranešimą, kai būsite pridėtas prie bendrinamo albumo",
|
||||
"album_cover_updated": "Albumo viršelis atnaujintas",
|
||||
"album_delete_confirmation": "Ar tikrai norite ištrinti albumą {album}?",
|
||||
"album_info_card_backup_album_excluded": "EXCLUDED",
|
||||
"album_info_card_backup_album_included": "INCLUDED",
|
||||
"album_info_updated": "Albumo informacija atnaujinta",
|
||||
"album_leave": "Palikti albumą?",
|
||||
"album_leave_confirmation": "Ar tikrai norite palikti albumą {album}?",
|
||||
|
@ -327,9 +335,21 @@
|
|||
"album_remove_user": "Pašalinti naudotoją?",
|
||||
"album_remove_user_confirmation": "Ar tikrai norite pašalinti naudotoją {user}?",
|
||||
"album_share_no_users": "Atrodo, kad bendrinate šį albumą su visais naudotojais, arba neturite naudotojų, su kuriais galėtumėte bendrinti.",
|
||||
"album_thumbnail_card_item": "1 item",
|
||||
"album_thumbnail_card_items": "{} items",
|
||||
"album_thumbnail_card_shared": " · Shared",
|
||||
"album_thumbnail_shared_by": "Shared by {}",
|
||||
"album_updated": "Albumas atnaujintas",
|
||||
"album_updated_setting_description": "Gauti pranešimą el. paštu, kai bendrinamas albumas turi naujų elementų",
|
||||
"album_user_removed": "Pašalintas {user}",
|
||||
"album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
|
||||
"album_viewer_appbar_share_err_delete": "Failed to delete album",
|
||||
"album_viewer_appbar_share_err_leave": "Failed to leave album",
|
||||
"album_viewer_appbar_share_err_remove": "There are problems in removing assets from album",
|
||||
"album_viewer_appbar_share_err_title": "Failed to change album title",
|
||||
"album_viewer_appbar_share_leave": "Leave album",
|
||||
"album_viewer_appbar_share_to": "Share To",
|
||||
"album_viewer_page_share_add_users": "Add users",
|
||||
"album_with_link_access": "Tegul visi, turintys nuorodą, mato šio albumo nuotraukas ir žmones.",
|
||||
"albums": "Albumai",
|
||||
"albums_count": "{count, plural, one {# albumas} few {# albumai} other {# albumų}}",
|
||||
|
@ -344,37 +364,128 @@
|
|||
"api_key": "API raktas",
|
||||
"api_key_empty": "Jūsų API rakto pavadinimas netūrėtų būti tuščias",
|
||||
"api_keys": "API raktai",
|
||||
"app_bar_signout_dialog_content": "Are you sure you want to sign out?",
|
||||
"app_bar_signout_dialog_ok": "Yes",
|
||||
"app_bar_signout_dialog_title": "Sign out",
|
||||
"app_settings": "Programos nustatymai",
|
||||
"appears_in": "",
|
||||
"archive": "Archyvas",
|
||||
"archive_or_unarchive_photo": "Archyvuoti arba išarchyvuoti nuotrauką",
|
||||
"archive_page_no_archived_assets": "No archived assets found",
|
||||
"archive_page_title": "Archive ({})",
|
||||
"archive_size": "Archyvo dydis",
|
||||
"archive_size_description": "Konfigūruoti archyvo dydį atsisiuntimams (GiB)",
|
||||
"archived": "Archived",
|
||||
"archived_count": "{count, plural, other {# suarchyvuota}}",
|
||||
"are_these_the_same_person": "Ar tai tas pats asmuo?",
|
||||
"are_you_sure_to_do_this": "Ar tikrai norite tai daryti?",
|
||||
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
|
||||
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
|
||||
"asset_added_to_album": "Pridėta į albumą",
|
||||
"asset_adding_to_album": "Pridedama į albumą...",
|
||||
"asset_description_updated": "Elemento aprašymas buvo atnaujintas",
|
||||
"asset_filename_is_offline": "Elementas {filename} nepasiekiamas",
|
||||
"asset_list_group_by_sub_title": "Group by",
|
||||
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
|
||||
"asset_list_layout_settings_group_automatically": "Automatic",
|
||||
"asset_list_layout_settings_group_by": "Group assets by",
|
||||
"asset_list_layout_settings_group_by_month_day": "Month + day",
|
||||
"asset_list_layout_sub_title": "Layout",
|
||||
"asset_list_settings_subtitle": "Photo grid layout settings",
|
||||
"asset_list_settings_title": "Photo Grid",
|
||||
"asset_offline": "Elementas nepasiekiamas",
|
||||
"asset_offline_description": "Šis išorinis elementas neberandamas diske. Dėl pagalbos susisiekite su savo Immich administratoriumi.",
|
||||
"asset_restored_successfully": "Asset restored successfully",
|
||||
"asset_uploaded": "Įkelta",
|
||||
"asset_uploading": "Įkeliama...",
|
||||
"asset_viewer_settings_subtitle": "Manage your gallery viewer settings",
|
||||
"asset_viewer_settings_title": "Asset Viewer",
|
||||
"assets": "Elementai",
|
||||
"assets_added_count": "{count, plural, one {Pridėtas # elementas} few {Pridėti # elementai} other {Pridėta # elementų}}",
|
||||
"assets_added_to_album_count": "Į albumą {count, plural, one {įtrauktas # elementas} few {įtraukti # elementai} other {įtraukta # elementų}}",
|
||||
"assets_added_to_name_count": "Į {hasName, select, true {<b>{name}</b>} other {naują}} albumą {count, plural, one {įtrauktas # elementas} few {įtraukti # elementai} other {įtraukta # elementų}}",
|
||||
"assets_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}}",
|
||||
"assets_deleted_permanently": "{} asset(s) deleted permanently",
|
||||
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server",
|
||||
"assets_moved_to_trash_count": "{count, plural, one {# elementas perkeltas} few {# elementai perkelti} other {# elementų perkelta}} į šiukšliadėžę",
|
||||
"assets_permanently_deleted_count": "{count, plural, one {# elementas ištrintas} few {# elementai ištrinti} other {# elementų ištrinta}} visam laikui",
|
||||
"assets_removed_count": "{count, plural, one {Pašalintas # elementas} few {Pašalinti # elementai} other {Pašalinta # elementų}}",
|
||||
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device",
|
||||
"assets_restore_confirmation": "Ar tikrai norite atkurti visus šiukšliadėžėje esančius perkeltus elementus? Šio veiksmo atšaukti negalėsite! Pastaba: nepasiekiami elementai tokiu būdu atkurti nebus.",
|
||||
"assets_restored_count": "{count, plural, one {Atkurtas # elementas} few {Atkurti # elementai} other {Atkurta # elementų}}",
|
||||
"assets_restored_successfully": "{} asset(s) restored successfully",
|
||||
"assets_trashed": "{} asset(s) trashed",
|
||||
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server",
|
||||
"assets_were_part_of_album_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}} jau prieš tai buvo albume",
|
||||
"authorized_devices": "Autorizuoti įrenginiai",
|
||||
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
|
||||
"automatic_endpoint_switching_title": "Automatic URL switching",
|
||||
"back": "Atgal",
|
||||
"back_close_deselect": "Atgal, uždaryti arba atžymėti",
|
||||
"background_location_permission": "Background location permission",
|
||||
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
|
||||
"backup_album_selection_page_albums_device": "Albums on device ({})",
|
||||
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
|
||||
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
|
||||
"backup_album_selection_page_select_albums": "Select albums",
|
||||
"backup_album_selection_page_selection_info": "Selection Info",
|
||||
"backup_album_selection_page_total_assets": "Total unique assets",
|
||||
"backup_all": "All",
|
||||
"backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…",
|
||||
"backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…",
|
||||
"backup_background_service_current_upload_notification": "Uploading {}",
|
||||
"backup_background_service_default_notification": "Checking for new assets…",
|
||||
"backup_background_service_error_title": "Backup error",
|
||||
"backup_background_service_in_progress_notification": "Backing up your assets…",
|
||||
"backup_background_service_upload_failure_notification": "Failed to upload {}",
|
||||
"backup_controller_page_albums": "Backup Albums",
|
||||
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
|
||||
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
|
||||
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
|
||||
"backup_controller_page_background_battery_info_link": "Show me how",
|
||||
"backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.",
|
||||
"backup_controller_page_background_battery_info_ok": "OK",
|
||||
"backup_controller_page_background_battery_info_title": "Battery optimizations",
|
||||
"backup_controller_page_background_charging": "Only while charging",
|
||||
"backup_controller_page_background_configure_error": "Failed to configure the background service",
|
||||
"backup_controller_page_background_delay": "Delay new assets backup: {}",
|
||||
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
|
||||
"backup_controller_page_background_is_off": "Automatic background backup is off",
|
||||
"backup_controller_page_background_is_on": "Automatic background backup is on",
|
||||
"backup_controller_page_background_turn_off": "Turn off background service",
|
||||
"backup_controller_page_background_turn_on": "Turn on background service",
|
||||
"backup_controller_page_background_wifi": "Only on WiFi",
|
||||
"backup_controller_page_backup": "Backup",
|
||||
"backup_controller_page_backup_selected": "Selected: ",
|
||||
"backup_controller_page_backup_sub": "Backed up photos and videos",
|
||||
"backup_controller_page_created": "Created on: {}",
|
||||
"backup_controller_page_desc_backup": "Turn on foreground backup to automatically upload new assets to the server when opening the app.",
|
||||
"backup_controller_page_excluded": "Excluded: ",
|
||||
"backup_controller_page_failed": "Failed ({})",
|
||||
"backup_controller_page_filename": "File name: {} [{}]",
|
||||
"backup_controller_page_id": "ID: {}",
|
||||
"backup_controller_page_info": "Backup Information",
|
||||
"backup_controller_page_none_selected": "None selected",
|
||||
"backup_controller_page_remainder": "Remainder",
|
||||
"backup_controller_page_remainder_sub": "Remaining photos and videos to back up from selection",
|
||||
"backup_controller_page_server_storage": "Server Storage",
|
||||
"backup_controller_page_start_backup": "Start Backup",
|
||||
"backup_controller_page_status_off": "Automatic foreground backup is off",
|
||||
"backup_controller_page_status_on": "Automatic foreground backup is on",
|
||||
"backup_controller_page_storage_format": "{} of {} used",
|
||||
"backup_controller_page_to_backup": "Albums to be backed up",
|
||||
"backup_controller_page_total_sub": "All unique photos and videos from selected albums",
|
||||
"backup_controller_page_turn_off": "Turn off foreground backup",
|
||||
"backup_controller_page_turn_on": "Turn on foreground backup",
|
||||
"backup_controller_page_uploading_file_info": "Uploading file info",
|
||||
"backup_err_only_album": "Cannot remove the only album",
|
||||
"backup_info_card_assets": "assets",
|
||||
"backup_manual_cancelled": "Cancelled",
|
||||
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
|
||||
"backup_manual_success": "Success",
|
||||
"backup_manual_title": "Upload status",
|
||||
"backup_options_page_title": "Backup options",
|
||||
"backup_setting_subtitle": "Manage background and foreground upload settings",
|
||||
"backward": "",
|
||||
"birthdate_saved": "Sėkmingai išsaugota gimimo data",
|
||||
"blurred_background": "Neryškus fonas",
|
||||
|
@ -383,29 +494,65 @@
|
|||
"bulk_keep_duplicates_confirmation": "Ar tikrai norite palikti visus {count, plural, one {# besidubliuojantį elementą} few {# besidubliuojančius elementus} other {# besidubliuojančių elementų}}? Tokiu būdu nieko netrinant bus sutvarkytos visos dublikatų grupės.",
|
||||
"bulk_trash_duplicates_confirmation": "Ar tikrai norite perkelti į šiukšliadėžę visus {count, plural, one {# besidubliuojantį elementą} few {# besidubliuojančius elementus} other {# besidubliuojančių elementų}}? Bus paliktas didžiausias kiekvienos grupės elementas ir į šiukšliadėžę perkelti kiti besidubliuojantys elementai.",
|
||||
"buy": "Įsigyti Immich",
|
||||
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
|
||||
"cache_settings_clear_cache_button": "Clear cache",
|
||||
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
|
||||
"cache_settings_duplicated_assets_clear_button": "CLEAR",
|
||||
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
|
||||
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
|
||||
"cache_settings_image_cache_size": "Image cache size ({} assets)",
|
||||
"cache_settings_statistics_album": "Library thumbnails",
|
||||
"cache_settings_statistics_assets": "{} assets ({})",
|
||||
"cache_settings_statistics_full": "Full images",
|
||||
"cache_settings_statistics_shared": "Shared album thumbnails",
|
||||
"cache_settings_statistics_thumbnail": "Thumbnails",
|
||||
"cache_settings_statistics_title": "Cache usage",
|
||||
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
|
||||
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
|
||||
"cache_settings_tile_subtitle": "Control the local storage behaviour",
|
||||
"cache_settings_tile_title": "Local Storage",
|
||||
"cache_settings_title": "Caching Settings",
|
||||
"camera": "Fotoaparatas",
|
||||
"camera_brand": "Fotoaparato prekės ženklas",
|
||||
"camera_model": "Fotoaparato modelis",
|
||||
"cancel": "Atšaukti",
|
||||
"cancel_search": "Atšaukti paiešką",
|
||||
"canceled": "Canceled",
|
||||
"cannot_merge_people": "Negalima sujungti asmenų",
|
||||
"cannot_update_the_description": "Negalima atnaujinti aprašymo",
|
||||
"change_date": "Pakeisti datą",
|
||||
"change_display_order": "Change display order",
|
||||
"change_expiration_time": "Pakeisti galiojimo trukmę",
|
||||
"change_location": "Pakeisti vietovę",
|
||||
"change_name": "Pakeisti vardą",
|
||||
"change_name_successfully": "",
|
||||
"change_password": "Pakeisti slaptažodį",
|
||||
"change_password_description": "Tai arba pirmas kartas, kai jungiatės prie sistemos, arba buvo pateikta užklausa pakeisti jūsų slaptažodį. Prašome įvesti naują slaptažodį žemiau.",
|
||||
"change_password_form_confirm_password": "Confirm Password",
|
||||
"change_password_form_description": "Hi {name},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
|
||||
"change_password_form_new_password": "New Password",
|
||||
"change_password_form_password_mismatch": "Passwords do not match",
|
||||
"change_password_form_reenter_new_password": "Re-enter New Password",
|
||||
"change_your_password": "Pakeisti slaptažodį",
|
||||
"changed_visibility_successfully": "Matomumas pakeistas sėkmingai",
|
||||
"check_all": "Žymėti viską",
|
||||
"check_corrupt_asset_backup": "Check for corrupt asset backups",
|
||||
"check_corrupt_asset_backup_button": "Perform check",
|
||||
"check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.",
|
||||
"check_logs": "Tikrinti žurnalus",
|
||||
"city": "Miestas",
|
||||
"clear": "Išvalyti",
|
||||
"clear_all": "Išvalyti viską",
|
||||
"clear_message": "Išvalyti pranešimą",
|
||||
"clear_value": "Išvalyti reikšmę",
|
||||
"client_cert_dialog_msg_confirm": "OK",
|
||||
"client_cert_enter_password": "Enter Password",
|
||||
"client_cert_import": "Import",
|
||||
"client_cert_import_success_msg": "Client certificate is imported",
|
||||
"client_cert_invalid_msg": "Invalid certificate file or wrong password",
|
||||
"client_cert_remove_msg": "Client certificate is removed",
|
||||
"client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login",
|
||||
"client_cert_title": "SSL Client Certificate",
|
||||
"close": "Uždaryti",
|
||||
"collapse": "Suskleisti",
|
||||
"collapse_all": "Suskleisti viską",
|
||||
|
@ -414,6 +561,9 @@
|
|||
"comment_options": "Komentarų parinktys",
|
||||
"comments_and_likes": "Komentarai ir patiktukai",
|
||||
"comments_are_disabled": "Komentarai yra išjungti",
|
||||
"common_create_new_album": "Create new album",
|
||||
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
|
||||
"completed": "Completed",
|
||||
"confirm": "Patvirtinti",
|
||||
"confirm_admin_password": "Patvirtinti administratoriaus slaptažodį",
|
||||
"confirm_delete_shared_link": "Ar tikrai norite ištrinti šią bendrinimo nuorodą?",
|
||||
|
@ -421,6 +571,15 @@
|
|||
"contain": "",
|
||||
"context": "Kontekstas",
|
||||
"continue": "Tęsti",
|
||||
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
|
||||
"control_bottom_app_bar_create_new_album": "Create new album",
|
||||
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
|
||||
"control_bottom_app_bar_delete_from_local": "Delete from device",
|
||||
"control_bottom_app_bar_edit_location": "Edit Location",
|
||||
"control_bottom_app_bar_edit_time": "Edit Date & Time",
|
||||
"control_bottom_app_bar_share_link": "Share Link",
|
||||
"control_bottom_app_bar_share_to": "Share To",
|
||||
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
|
||||
"copied_image_to_clipboard": "Nuotrauka nukopijuota į iškarpinę.",
|
||||
"copied_to_clipboard": "Nukopijuota į iškapinę!",
|
||||
"copy_error": "Kopijavimo klaida",
|
||||
|
@ -435,24 +594,34 @@
|
|||
"covers": "",
|
||||
"create": "Sukurti",
|
||||
"create_album": "Sukurti albumą",
|
||||
"create_album_page_untitled": "Untitled",
|
||||
"create_library": "Sukurti biblioteką",
|
||||
"create_link": "Sukurti nuorodą",
|
||||
"create_link_to_share": "Sukurti bendrinimo nuorodą",
|
||||
"create_link_to_share_description": "Leisti bet kam su nuoroda matyti pažymėtą(-as) nuotrauką(-as)",
|
||||
"create_new": "CREATE NEW",
|
||||
"create_new_person": "Sukurti naują žmogų",
|
||||
"create_new_person_hint": "Priskirti pasirinktus elementus naujam žmogui",
|
||||
"create_new_user": "Sukurti naują varotoją",
|
||||
"create_shared_album_page_share_add_assets": "ADD ASSETS",
|
||||
"create_shared_album_page_share_select_photos": "Select Photos",
|
||||
"create_tag": "Sukurti žymą",
|
||||
"create_tag_description": "Sukurti naują žymą. Įdėtinėms žymoms įveskite pilną kelią, įskaitant pasviruosius brūkšnius.",
|
||||
"create_user": "Sukurti naudotoją",
|
||||
"created": "Sukurta",
|
||||
"crop": "Crop",
|
||||
"curated_object_page_title": "Things",
|
||||
"current_device": "Dabartinis įrenginys",
|
||||
"current_server_address": "Current server address",
|
||||
"custom_locale": "",
|
||||
"custom_locale_description": "Formatuoti datas ir skaičius pagal kalbą ir regioną",
|
||||
"daily_title_text_date": "E, MMM dd",
|
||||
"daily_title_text_date_year": "E, MMM dd, yyyy",
|
||||
"dark": "",
|
||||
"date_after": "Data po",
|
||||
"date_and_time": "Data ir laikas",
|
||||
"date_before": "Data prieš",
|
||||
"date_format": "E, LLL d, y • h:mm a",
|
||||
"date_of_birth_saved": "Gimimo data sėkmingai išsaugota",
|
||||
"date_range": "",
|
||||
"day": "Diena",
|
||||
|
@ -466,16 +635,27 @@
|
|||
"delete": "Ištrinti",
|
||||
"delete_album": "Ištrinti albumą",
|
||||
"delete_api_key_prompt": "Ar tikrai norite ištrinti šį API raktą?",
|
||||
"delete_dialog_alert": "These items will be permanently deleted from Immich and from your device",
|
||||
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
|
||||
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
|
||||
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
|
||||
"delete_dialog_ok_force": "Delete Anyway",
|
||||
"delete_dialog_title": "Delete Permanently",
|
||||
"delete_duplicates_confirmation": "Ar tikrai norite visam laikui ištrinti šiuos dublikatus?",
|
||||
"delete_key": "Ištrinti raktą",
|
||||
"delete_library": "Ištrinti biblioteką",
|
||||
"delete_link": "Ištrinti nuorodą",
|
||||
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
|
||||
"delete_local_dialog_ok_force": "Delete Anyway",
|
||||
"delete_shared_link": "Ištrinti bendrinimo nuorodą",
|
||||
"delete_shared_link_dialog_title": "Delete Shared Link",
|
||||
"delete_tag": "Ištrinti žymą",
|
||||
"delete_tag_confirmation_prompt": "Ar tikrai norite ištrinti žymą {tagName}?",
|
||||
"delete_user": "Ištrinti naudotoją",
|
||||
"deleted_shared_link": "Bendrinimo nuoroda ištrinta",
|
||||
"description": "Aprašymas",
|
||||
"description_input_hint_text": "Add description...",
|
||||
"description_input_submit_error": "Error updating description, check the log for more details",
|
||||
"details": "Detalės",
|
||||
"direction": "Kryptis",
|
||||
"disabled": "Išjungta",
|
||||
|
@ -491,8 +671,22 @@
|
|||
"documentation": "Dokumentacija",
|
||||
"done": "",
|
||||
"download": "Atsisiųsti",
|
||||
"download_canceled": "Download canceled",
|
||||
"download_complete": "Download complete",
|
||||
"download_enqueue": "Download enqueued",
|
||||
"download_error": "Download Error",
|
||||
"download_failed": "Download failed",
|
||||
"download_filename": "file: {}",
|
||||
"download_finished": "Download finished",
|
||||
"download_notfound": "Download not found",
|
||||
"download_paused": "Download paused",
|
||||
"download_settings": "Atsisiųsti",
|
||||
"download_started": "Download started",
|
||||
"download_sucess": "Download success",
|
||||
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
|
||||
"download_waiting_to_retry": "Waiting to retry",
|
||||
"downloading": "Siunčiama",
|
||||
"downloading_media": "Downloading media",
|
||||
"duplicates": "Dublikatai",
|
||||
"duplicates_description": "Sutvarkykite kiekvieną elementų grupę nurodydami elementus, kurie yra dublikatai (jei tokių yra)",
|
||||
"duration": "Trukmė",
|
||||
|
@ -508,6 +702,7 @@
|
|||
"edit_key": "Redaguoti raktą",
|
||||
"edit_link": "Redaguoti nuorodą",
|
||||
"edit_location": "Redaguoti vietovę",
|
||||
"edit_location_dialog_title": "Location",
|
||||
"edit_name": "Redaguoti vardą",
|
||||
"edit_people": "Redaguoti žmones",
|
||||
"edit_tag": "Redaguoti žymą",
|
||||
|
@ -516,12 +711,17 @@
|
|||
"edited": "Redaguota",
|
||||
"editor": "",
|
||||
"email": "El. paštas",
|
||||
"empty_folder": "This folder is empty",
|
||||
"empty_trash": "Ištuštinti šiukšliadėžę",
|
||||
"enable": "Įgalinti",
|
||||
"enabled": "Įgalintas",
|
||||
"end_date": "Pabaigos data",
|
||||
"enqueued": "Enqueued",
|
||||
"enter_wifi_name": "Enter WiFi name",
|
||||
"error": "Klaida",
|
||||
"error_change_sort_album": "Failed to change album sort order",
|
||||
"error_loading_image": "Klaida įkeliant vaizdą",
|
||||
"error_saving_image": "Error: {}",
|
||||
"error_title": "Klaida - Kažkas nutiko ne taip",
|
||||
"errors": {
|
||||
"cant_apply_changes": "Negalima taikyti pakeitimų",
|
||||
|
@ -614,8 +814,21 @@
|
|||
"unable_to_upload_file": "Nepavyksta įkelti failo"
|
||||
},
|
||||
"exif": "Exif",
|
||||
"exif_bottom_sheet_description": "Add Description...",
|
||||
"exif_bottom_sheet_details": "DETAILS",
|
||||
"exif_bottom_sheet_location": "LOCATION",
|
||||
"exif_bottom_sheet_people": "PEOPLE",
|
||||
"exif_bottom_sheet_person_add_person": "Add name",
|
||||
"exif_bottom_sheet_person_age": "Age {}",
|
||||
"exif_bottom_sheet_person_age_months": "Age {} months",
|
||||
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months",
|
||||
"exif_bottom_sheet_person_age_years": "Age {}",
|
||||
"exit_slideshow": "Išeiti iš skaidrių peržiūros",
|
||||
"expand_all": "Išskleisti viską",
|
||||
"experimental_settings_new_asset_list_subtitle": "Work in progress",
|
||||
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
|
||||
"experimental_settings_subtitle": "Use at your own risk!",
|
||||
"experimental_settings_title": "Experimental",
|
||||
"expire_after": "",
|
||||
"expired": "Nebegalioja",
|
||||
"expires_date": "Nebegalios už {date}",
|
||||
|
@ -625,10 +838,16 @@
|
|||
"extension": "Plėtinys",
|
||||
"external": "Išorinis",
|
||||
"external_libraries": "Išorinės bibliotekos",
|
||||
"external_network": "External network",
|
||||
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
|
||||
"face_unassigned": "Nepriskirta",
|
||||
"failed": "Failed",
|
||||
"failed_to_load_assets": "Failed to load assets",
|
||||
"failed_to_load_folder": "Failed to load folder",
|
||||
"favorite": "Mėgstamiausias",
|
||||
"favorite_or_unfavorite_photo": "Įtraukti prie arba pašalinti iš mėgstamiausių",
|
||||
"favorites": "Mėgstamiausi",
|
||||
"favorites_page_no_favorites": "No favorite assets found",
|
||||
"feature_photo_updated": "",
|
||||
"features": "Funkcijos",
|
||||
"features_setting_description": "Valdyti aplikacijos funkcijas",
|
||||
|
@ -636,21 +855,34 @@
|
|||
"file_name_or_extension": "Failo pavadinimas arba plėtinys",
|
||||
"filename": "",
|
||||
"filetype": "Failo tipas",
|
||||
"filter": "Filter",
|
||||
"filter_people": "Filtruoti žmones",
|
||||
"fix_incorrect_match": "",
|
||||
"folder": "Folder",
|
||||
"folder_not_found": "Folder not found",
|
||||
"folders": "Aplankai",
|
||||
"folders_feature_description": "Peržiūrėkite failų sistemoje esančias nuotraukas ir vaizdo įrašus aplankų rodinyje",
|
||||
"forward": "",
|
||||
"general": "",
|
||||
"get_help": "Gauti pagalbos",
|
||||
"get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network",
|
||||
"getting_started": "",
|
||||
"go_back": "",
|
||||
"go_to_search": "",
|
||||
"grant_permission": "Grant permission",
|
||||
"group_albums_by": "Grupuoti albumus pagal...",
|
||||
"group_no": "Negrupuoti",
|
||||
"group_owner": "Grupuoti pagal savininką",
|
||||
"group_year": "Grupuoti pagal metus",
|
||||
"haptic_feedback_switch": "Enable haptic feedback",
|
||||
"haptic_feedback_title": "Haptic Feedback",
|
||||
"has_quota": "Turi kvotą",
|
||||
"header_settings_add_header_tip": "Add Header",
|
||||
"header_settings_field_validator_msg": "Value cannot be empty",
|
||||
"header_settings_header_name_input": "Header name",
|
||||
"header_settings_header_value_input": "Header value",
|
||||
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request",
|
||||
"headers_settings_tile_title": "Custom proxy headers",
|
||||
"hi_user": "Labas {name} ({email})",
|
||||
"hide_all_people": "Slėpti visus asmenis",
|
||||
"hide_gallery": "Slėpti galeriją",
|
||||
|
@ -658,9 +890,29 @@
|
|||
"hide_password": "Slėpti slaptažodį",
|
||||
"hide_person": "Slėpti asmenį",
|
||||
"hide_unnamed_people": "Slėpti neįvardintus asmenis",
|
||||
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
|
||||
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
|
||||
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
|
||||
"home_page_album_err_partner": "Can not add partner assets to an album yet, skipping",
|
||||
"home_page_archive_err_local": "Can not archive local assets yet, skipping",
|
||||
"home_page_archive_err_partner": "Can not archive partner assets, skipping",
|
||||
"home_page_building_timeline": "Building the timeline",
|
||||
"home_page_delete_err_partner": "Can not delete partner assets, skipping",
|
||||
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
|
||||
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
|
||||
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
|
||||
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
|
||||
"home_page_share_err_local": "Can not share local assets via link, skipping",
|
||||
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
|
||||
"host": "",
|
||||
"hour": "Valanda",
|
||||
"ignore_icloud_photos": "Ignore iCloud photos",
|
||||
"ignore_icloud_photos_description": "Photos that are stored on iCloud will not be uploaded to the Immich server",
|
||||
"image": "Nuotrauka",
|
||||
"image_saved_successfully": "Image saved",
|
||||
"image_viewer_page_state_provider_download_started": "Download Started",
|
||||
"image_viewer_page_state_provider_download_success": "Download Success",
|
||||
"image_viewer_page_state_provider_share_error": "Share Error",
|
||||
"immich_logo": "Immich logotipas",
|
||||
"import_from_json": "Importuoti iš JSON",
|
||||
"import_path": "Importavimo kelias",
|
||||
|
@ -676,6 +928,8 @@
|
|||
"night_at_midnight": "Kiekvieną vidurnaktį",
|
||||
"night_at_twoam": "Kiekvieną naktį 02:00"
|
||||
},
|
||||
"invalid_date": "Invalid date",
|
||||
"invalid_date_format": "Invalid date format",
|
||||
"invite_people": "Kviesti žmones",
|
||||
"invite_to_album": "Pakviesti į albumą",
|
||||
"items_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}}",
|
||||
|
@ -693,6 +947,12 @@
|
|||
"level": "Lygis",
|
||||
"library": "Biblioteka",
|
||||
"library_options": "Bibliotekos pasirinktys",
|
||||
"library_page_device_albums": "Albums on Device",
|
||||
"library_page_new_album": "New album",
|
||||
"library_page_sort_asset_count": "Number of assets",
|
||||
"library_page_sort_created": "Created date",
|
||||
"library_page_sort_last_modified": "Last modified",
|
||||
"library_page_sort_title": "Album title",
|
||||
"light": "",
|
||||
"link_options": "Nuorodų parinktys",
|
||||
"link_to_oauth": "Susieti su OAuth",
|
||||
|
@ -700,11 +960,41 @@
|
|||
"list": "Sąrašas",
|
||||
"loading": "Kraunama",
|
||||
"loading_search_results_failed": "Nepavyko užkrauti paieškos rezultatų",
|
||||
"local_network": "Local network",
|
||||
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
|
||||
"location_permission": "Location permission",
|
||||
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name",
|
||||
"location_picker_choose_on_map": "Choose on map",
|
||||
"location_picker_latitude_error": "Enter a valid latitude",
|
||||
"location_picker_latitude_hint": "Enter your latitude here",
|
||||
"location_picker_longitude_error": "Enter a valid longitude",
|
||||
"location_picker_longitude_hint": "Enter your longitude here",
|
||||
"log_out": "Atsijungti",
|
||||
"log_out_all_devices": "Atsijungti iš visų įrenginių",
|
||||
"logged_out_all_devices": "Atsijungta iš visų įrenginių",
|
||||
"login": "Prisijungti",
|
||||
"login_disabled": "Login has been disabled",
|
||||
"login_form_api_exception": "API exception. Please check the server URL and try again.",
|
||||
"login_form_back_button_text": "Back",
|
||||
"login_form_email_hint": "youremail@email.com",
|
||||
"login_form_endpoint_hint": "http://your-server-ip:port",
|
||||
"login_form_endpoint_url": "Server Endpoint URL",
|
||||
"login_form_err_http": "Please specify http:// or https://",
|
||||
"login_form_err_invalid_email": "Invalid Email",
|
||||
"login_form_err_invalid_url": "Invalid URL",
|
||||
"login_form_err_leading_whitespace": "Leading whitespace",
|
||||
"login_form_err_trailing_whitespace": "Trailing whitespace",
|
||||
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
|
||||
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
|
||||
"login_form_failed_login": "Error logging you in, check server URL, email and password",
|
||||
"login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
|
||||
"login_form_password_hint": "password",
|
||||
"login_form_save_login": "Stay logged in",
|
||||
"login_form_server_empty": "Enter a server URL.",
|
||||
"login_form_server_error": "Could not connect to server.",
|
||||
"login_has_been_disabled": "Prisijungimas išjungtas.",
|
||||
"login_password_changed_error": "There was an error updating your password",
|
||||
"login_password_changed_success": "Password updated successfully",
|
||||
"logout_all_device_confirmation": "Ar tikrai norite atsijungti iš visų įrenginių?",
|
||||
"logout_this_device_confirmation": "Ar tikrai norite atsijungti iš šio prietaiso?",
|
||||
"longitude": "Ilguma",
|
||||
|
@ -720,12 +1010,39 @@
|
|||
"manage_your_devices": "Valdyti prijungtus įrenginius",
|
||||
"manage_your_oauth_connection": "Tvarkyti OAuth prisijungimą",
|
||||
"map": "Žemėlapis",
|
||||
"map_assets_in_bound": "{} photo",
|
||||
"map_assets_in_bounds": "{} photos",
|
||||
"map_cannot_get_user_location": "Cannot get user's location",
|
||||
"map_location_dialog_yes": "Yes",
|
||||
"map_location_picker_page_use_location": "Use this location",
|
||||
"map_location_service_disabled_content": "Location service needs to be enabled to display assets from your current location. Do you want to enable it now?",
|
||||
"map_location_service_disabled_title": "Location Service disabled",
|
||||
"map_marker_with_image": "",
|
||||
"map_no_assets_in_bounds": "No photos in this area",
|
||||
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
|
||||
"map_no_location_permission_title": "Location Permission denied",
|
||||
"map_settings": "Žemėlapio nustatymai",
|
||||
"map_settings_dark_mode": "Dark mode",
|
||||
"map_settings_date_range_option_day": "Past 24 hours",
|
||||
"map_settings_date_range_option_days": "Past {} days",
|
||||
"map_settings_date_range_option_year": "Past year",
|
||||
"map_settings_date_range_option_years": "Past {} years",
|
||||
"map_settings_dialog_title": "Map Settings",
|
||||
"map_settings_include_show_archived": "Include Archived",
|
||||
"map_settings_include_show_partners": "Include Partners",
|
||||
"map_settings_only_show_favorites": "Show Favorite Only",
|
||||
"map_settings_theme_settings": "Map Theme",
|
||||
"map_zoom_to_see_photos": "Zoom out to see photos",
|
||||
"matches": "Atitikmenys",
|
||||
"media_type": "Laikmenos tipas",
|
||||
"memories": "Atsiminimai",
|
||||
"memories_all_caught_up": "All caught up",
|
||||
"memories_check_back_tomorrow": "Check back tomorrow for more memories",
|
||||
"memories_setting_description": "Valdyti tai, ką matote savo prisiminimuose",
|
||||
"memories_start_over": "Start Over",
|
||||
"memories_swipe_to_close": "Swipe up to close",
|
||||
"memories_year_ago": "A year ago",
|
||||
"memories_years_ago": "{} years ago",
|
||||
"memory": "Atmintis",
|
||||
"menu": "Meniu",
|
||||
"merge": "Sujungti",
|
||||
|
@ -739,11 +1056,16 @@
|
|||
"missing": "Trūkstami",
|
||||
"model": "Modelis",
|
||||
"month": "Mėnesis",
|
||||
"monthly_title_text_date_format": "MMMM y",
|
||||
"more": "Daugiau",
|
||||
"moved_to_trash": "Perkelta į šiukšliadėžę",
|
||||
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
|
||||
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
|
||||
"my_albums": "Mano albumai",
|
||||
"name": "Vardas",
|
||||
"name_or_nickname": "Vardas arba slapyvardis",
|
||||
"networking_settings": "Networking",
|
||||
"networking_subtitle": "Manage the server endpoint settings",
|
||||
"never": "Niekada",
|
||||
"new_album": "Naujas albumas",
|
||||
"new_api_key": "Naujas API raktas",
|
||||
|
@ -760,6 +1082,7 @@
|
|||
"no_albums_yet": "Atrodo, kad dar neturite albumų.",
|
||||
"no_archived_assets_message": "Suarchyvuokite nuotraukas ir vaizdo įrašus, kad jie nebūtų rodomi nuotraukų rodinyje",
|
||||
"no_assets_message": "SPUSTELĖKITE NORĖDAMI ĮKELTI PIRMĄJĄ NUOTRAUKĄ",
|
||||
"no_assets_to_show": "No assets to show",
|
||||
"no_duplicates_found": "Dublikatų nerasta.",
|
||||
"no_exif_info_available": "",
|
||||
"no_explore_results_message": "Įkelkite daugiau nuotraukų ir tyrinėkite savo kolekciją.",
|
||||
|
@ -771,8 +1094,12 @@
|
|||
"no_results_description": "Pabandykite sinonimą arba bendresnį raktažodį",
|
||||
"no_shared_albums_message": "",
|
||||
"not_in_any_album": "Nė viename albume",
|
||||
"note_unlimited_quota": "Pastaba: Įveskite 0, jei norite neribotos kvotos",
|
||||
"not_selected": "Not selected",
|
||||
"notes": "Pastabos",
|
||||
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
|
||||
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
|
||||
"notification_permission_list_tile_enable_button": "Enable Notifications",
|
||||
"notification_permission_list_tile_title": "Notification Permission",
|
||||
"notification_toggle_setting_description": "Įjungti el. pašto pranešimus",
|
||||
"notifications": "Pranešimai",
|
||||
"notifications_setting_description": "Tvarkyti pranešimus",
|
||||
|
@ -782,6 +1109,7 @@
|
|||
"offline_paths": "Nepasiekiami adresai",
|
||||
"ok": "Ok",
|
||||
"oldest_first": "Seniausias pirmas",
|
||||
"on_this_device": "On this device",
|
||||
"onboarding_welcome_user": "Sveiki atvykę, {user}",
|
||||
"online": "Prisijungęs",
|
||||
"only_favorites": "Tik mėgstamiausi",
|
||||
|
@ -799,6 +1127,14 @@
|
|||
"partner_can_access": "{partner} gali naudotis",
|
||||
"partner_can_access_assets": "Visos jūsų nuotraukos ir vaizdo įrašai, išskyrus archyvuotus ir ištrintus",
|
||||
"partner_can_access_location": "Vieta, kurioje darytos nuotraukos",
|
||||
"partner_list_user_photos": "{user}'s photos",
|
||||
"partner_list_view_all": "View all",
|
||||
"partner_page_empty_message": "Your photos are not yet shared with any partner.",
|
||||
"partner_page_no_more_users": "No more users to add",
|
||||
"partner_page_partner_add_failed": "Failed to add partner",
|
||||
"partner_page_select_partner": "Select partner",
|
||||
"partner_page_shared_to_title": "Shared to",
|
||||
"partner_page_stop_sharing_content": "{} will no longer be able to access your photos.",
|
||||
"partner_sharing": "",
|
||||
"partners": "Partneriai",
|
||||
"password": "Slaptažodis",
|
||||
|
@ -826,6 +1162,14 @@
|
|||
"permanently_delete_assets_count": "Visam laikui ištrinti {count, plural, one {# elementą} few {# elementus} other {# elementų}}",
|
||||
"permanently_deleted_asset": "",
|
||||
"permanently_deleted_assets_count": "Visam laikui {count, plural, one {ištrintas # elementas} few {ištrinti # elementai} other {ištrinta # elementų}}",
|
||||
"permission_onboarding_back": "Back",
|
||||
"permission_onboarding_continue_anyway": "Continue anyway",
|
||||
"permission_onboarding_get_started": "Get started",
|
||||
"permission_onboarding_go_to_settings": "Go to settings",
|
||||
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
|
||||
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
|
||||
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
|
||||
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
|
||||
"photos": "Nuotraukos",
|
||||
"photos_and_videos": "Nuotraukos ir vaizdo įrašai",
|
||||
"photos_count": "{count, plural, one {{count, number} nuotrauka} few {{count, number} nuotraukos} other {{count, number} nuotraukų}}",
|
||||
|
@ -838,12 +1182,21 @@
|
|||
"play_motion_photo": "",
|
||||
"play_or_pause_video": "",
|
||||
"port": "",
|
||||
"preferences_settings_subtitle": "Manage the app's preferences",
|
||||
"preferences_settings_title": "Preferences",
|
||||
"preset": "",
|
||||
"preview": "",
|
||||
"previous": "",
|
||||
"previous_memory": "",
|
||||
"previous_or_next_photo": "",
|
||||
"primary": "",
|
||||
"profile_drawer_app_logs": "Logs",
|
||||
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
|
||||
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
|
||||
"profile_drawer_client_server_up_to_date": "Client and Server are up-to-date",
|
||||
"profile_drawer_github": "GitHub",
|
||||
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
|
||||
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
|
||||
"profile_image_of_user": "{user} profilio nuotrauka",
|
||||
"profile_picture_set": "Profilio nuotrauka nustatyta.",
|
||||
"public_album": "Viešas albumas",
|
||||
|
@ -886,6 +1239,8 @@
|
|||
"read_changelog": "",
|
||||
"recent": "",
|
||||
"recent_searches": "",
|
||||
"recently_added": "Recently added",
|
||||
"recently_added_page_title": "Recently Added",
|
||||
"refresh": "Atnaujinti",
|
||||
"refresh_encoded_videos": "Perkrauti apdorotus vaizdo įrašus",
|
||||
"refresh_faces": "Perkrauti veidus",
|
||||
|
@ -927,10 +1282,12 @@
|
|||
"review_duplicates": "Peržiūrėti dublikatus",
|
||||
"role": "",
|
||||
"save": "Išsaugoti",
|
||||
"save_to_gallery": "Save to gallery",
|
||||
"saved_api_key": "Išsaugotas API raktas",
|
||||
"saved_profile": "Išsaugotas profilis",
|
||||
"saved_settings": "Išsaugoti nustatymai",
|
||||
"say_something": "Ką nors pasakykite",
|
||||
"scaffold_body_error_occurred": "Error occurred",
|
||||
"scan_all_libraries": "Skenuoti visas bibliotekas",
|
||||
"scan_library": "Skenuoti",
|
||||
"scan_settings": "Skenavimo nustatymai",
|
||||
|
@ -944,12 +1301,41 @@
|
|||
"search_camera_model": "",
|
||||
"search_city": "",
|
||||
"search_country": "Ieškoti šalies...",
|
||||
"search_filter_apply": "Apply filter",
|
||||
"search_filter_camera_title": "Select camera type",
|
||||
"search_filter_date": "Date",
|
||||
"search_filter_date_interval": "{start} to {end}",
|
||||
"search_filter_date_title": "Select a date range",
|
||||
"search_filter_display_option_not_in_album": "Not in album",
|
||||
"search_filter_display_options": "Display Options",
|
||||
"search_filter_filename": "Search by file name",
|
||||
"search_filter_location": "Location",
|
||||
"search_filter_location_title": "Select location",
|
||||
"search_filter_media_type": "Media Type",
|
||||
"search_filter_media_type_title": "Select media type",
|
||||
"search_filter_people_title": "Select people",
|
||||
"search_for_existing_person": "",
|
||||
"search_no_more_result": "No more results",
|
||||
"search_no_people_named": "Nėra žmonių vardu „{name}“",
|
||||
"search_no_result": "No results found, try a different search term or combination",
|
||||
"search_page_categories": "Categories",
|
||||
"search_page_motion_photos": "Motion Photos",
|
||||
"search_page_no_objects": "No Objects Info Available",
|
||||
"search_page_no_places": "No Places Info Available",
|
||||
"search_page_screenshots": "Screenshots",
|
||||
"search_page_search_photos_videos": "Search for your photos and videos",
|
||||
"search_page_selfies": "Selfies",
|
||||
"search_page_things": "Things",
|
||||
"search_page_view_all_button": "View all",
|
||||
"search_page_your_activity": "Your activity",
|
||||
"search_page_your_map": "Your Map",
|
||||
"search_people": "Ieškoti žmonių",
|
||||
"search_places": "Ieškoti vietų",
|
||||
"search_result_page_new_search_hint": "New Search",
|
||||
"search_settings": "Ieškoti nustatymų",
|
||||
"search_state": "",
|
||||
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
|
||||
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
|
||||
"search_tags": "Ieškoti žymų...",
|
||||
"search_timezone": "",
|
||||
"search_type": "Paieškos tipas",
|
||||
|
@ -967,10 +1353,14 @@
|
|||
"select_new_face": "",
|
||||
"select_photos": "",
|
||||
"select_trash_all": "Visus pažymėti \"Išmesti\"",
|
||||
"select_user_for_sharing_page_err_album": "Failed to create album",
|
||||
"selected": "Pasirinkta",
|
||||
"selected_count": "{count, plural, one {# pasirinktas} few {# pasirinkti} other {# pasirinktų}}",
|
||||
"send_message": "Siųsti žinutę",
|
||||
"send_welcome_email": "Siųsti sveikinimo el. laišką",
|
||||
"server_endpoint": "Server Endpoint",
|
||||
"server_info_box_app_version": "App Version",
|
||||
"server_info_box_server_url": "Server URL",
|
||||
"server_offline": "Serveris nepasiekiamas",
|
||||
"server_online": "Serveris pasiekiamas",
|
||||
"server_stats": "Serverio statistika",
|
||||
|
@ -981,19 +1371,88 @@
|
|||
"set_date_of_birth": "Nustatyti gimimo datą",
|
||||
"set_profile_picture": "Nustatyti profilio nuotrauką",
|
||||
"set_slideshow_to_fullscreen": "Nustatyti skaidrių peržiūrą per visą ekraną",
|
||||
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
|
||||
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
|
||||
"setting_image_viewer_original_title": "Load original image",
|
||||
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
|
||||
"setting_image_viewer_preview_title": "Load preview image",
|
||||
"setting_image_viewer_title": "Images",
|
||||
"setting_languages_apply": "Apply",
|
||||
"setting_languages_subtitle": "Change the app's language",
|
||||
"setting_languages_title": "Languages",
|
||||
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
|
||||
"setting_notifications_notify_hours": "{} hours",
|
||||
"setting_notifications_notify_immediately": "immediately",
|
||||
"setting_notifications_notify_minutes": "{} minutes",
|
||||
"setting_notifications_notify_never": "never",
|
||||
"setting_notifications_notify_seconds": "{} seconds",
|
||||
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
|
||||
"setting_notifications_single_progress_title": "Show background backup detail progress",
|
||||
"setting_notifications_subtitle": "Adjust your notification preferences",
|
||||
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
|
||||
"setting_notifications_total_progress_title": "Show background backup total progress",
|
||||
"setting_video_viewer_looping_title": "Looping",
|
||||
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
|
||||
"setting_video_viewer_original_video_title": "Force original video",
|
||||
"settings": "Nustatymai",
|
||||
"settings_require_restart": "Please restart Immich to apply this setting",
|
||||
"settings_saved": "",
|
||||
"share": "Dalintis",
|
||||
"share_add_photos": "Add photos",
|
||||
"share_assets_selected": "{} selected",
|
||||
"share_dialog_preparing": "Preparing...",
|
||||
"shared": "Bendrinami",
|
||||
"shared_album_activities_input_disable": "Comment is disabled",
|
||||
"shared_album_activity_remove_content": "Do you want to delete this activity?",
|
||||
"shared_album_activity_remove_title": "Delete Activity",
|
||||
"shared_album_section_people_action_error": "Error leaving/removing from album",
|
||||
"shared_album_section_people_action_leave": "Remove user from album",
|
||||
"shared_album_section_people_action_remove_user": "Remove user from album",
|
||||
"shared_album_section_people_title": "PEOPLE",
|
||||
"shared_by": "",
|
||||
"shared_by_you": "",
|
||||
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
|
||||
"shared_link_app_bar_title": "Shared Links",
|
||||
"shared_link_clipboard_copied_massage": "Copied to clipboard",
|
||||
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
|
||||
"shared_link_create_error": "Error while creating shared link",
|
||||
"shared_link_edit_description_hint": "Enter the share description",
|
||||
"shared_link_edit_expire_after_option_day": "1 day",
|
||||
"shared_link_edit_expire_after_option_days": "{} days",
|
||||
"shared_link_edit_expire_after_option_hour": "1 hour",
|
||||
"shared_link_edit_expire_after_option_hours": "{} hours",
|
||||
"shared_link_edit_expire_after_option_minute": "1 minute",
|
||||
"shared_link_edit_expire_after_option_minutes": "{} minutes",
|
||||
"shared_link_edit_expire_after_option_months": "{} months",
|
||||
"shared_link_edit_expire_after_option_year": "{} year",
|
||||
"shared_link_edit_password_hint": "Enter the share password",
|
||||
"shared_link_edit_submit_button": "Update link",
|
||||
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
|
||||
"shared_link_expires_day": "Expires in {} day",
|
||||
"shared_link_expires_days": "Expires in {} days",
|
||||
"shared_link_expires_hour": "Expires in {} hour",
|
||||
"shared_link_expires_hours": "Expires in {} hours",
|
||||
"shared_link_expires_minute": "Expires in {} minute",
|
||||
"shared_link_expires_minutes": "Expires in {} minutes",
|
||||
"shared_link_expires_never": "Expires ∞",
|
||||
"shared_link_expires_second": "Expires in {} second",
|
||||
"shared_link_expires_seconds": "Expires in {} seconds",
|
||||
"shared_link_individual_shared": "Individual shared",
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Manage Shared links",
|
||||
"shared_link_options": "Bendrinimo nuorodos parametrai",
|
||||
"shared_links": "Bendrinimo nuorodos",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, one {# bendrinama nuotrauka ir vaizdo įrašas} few {# bendrinamos nuotraukos ir vaizdo įrašai} other {# bendrinamų nuotraukų ir vaizdo įrašų}}",
|
||||
"shared_with_me": "Shared with me",
|
||||
"shared_with_partner": "Pasidalinta su {partner}",
|
||||
"sharing": "Dalijimasis",
|
||||
"sharing_enter_password": "Norėdami peržiūrėti šį puslapį, įveskite slaptažodį.",
|
||||
"sharing_page_album": "Shared albums",
|
||||
"sharing_page_description": "Create shared albums to share photos and videos with people in your network.",
|
||||
"sharing_page_empty_list": "EMPTY LIST",
|
||||
"sharing_sidebar_description": "Rodyti bendrinimo rodinio nuorodą šoninėje juostoje",
|
||||
"sharing_silver_appbar_create_shared_album": "New shared album",
|
||||
"sharing_silver_appbar_share_partner": "Share with partner",
|
||||
"show_album_options": "Rodyti albumo parinktis",
|
||||
"show_file_location": "Rodyti rinkmenos vietą",
|
||||
"show_gallery": "Rodyti galeriją",
|
||||
|
@ -1046,6 +1505,9 @@
|
|||
"support_and_feedback": "Palaikymas ir atsiliepimai",
|
||||
"swap_merge_direction": "",
|
||||
"sync": "Sinchronizuoti",
|
||||
"sync_albums": "Sync albums",
|
||||
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
|
||||
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
|
||||
"tag": "Žyma",
|
||||
"tag_created": "Sukurta žyma: {tag}",
|
||||
"tag_feature_description": "Peržiūrėkite nuotraukas ir vaizdo įrašus sugrupuotus pagal sužymėtas temas",
|
||||
|
@ -1057,6 +1519,19 @@
|
|||
"theme": "Tema",
|
||||
"theme_selection": "",
|
||||
"theme_selection_description": "",
|
||||
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
|
||||
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
|
||||
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.",
|
||||
"theme_setting_colorful_interface_title": "Colorful interface",
|
||||
"theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer",
|
||||
"theme_setting_image_viewer_quality_title": "Image viewer quality",
|
||||
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.",
|
||||
"theme_setting_primary_color_title": "Primary color",
|
||||
"theme_setting_system_primary_color_title": "Use system color",
|
||||
"theme_setting_system_theme_switch": "Automatic (Follow system setting)",
|
||||
"theme_setting_theme_subtitle": "Choose the app's theme setting",
|
||||
"theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load",
|
||||
"theme_setting_three_stage_loading_title": "Enable three-stage loading",
|
||||
"time_based_memories": "Atsiminimai pagal laiką",
|
||||
"timeline": "Laiko skalė",
|
||||
"timezone": "Laiko juosta",
|
||||
|
@ -1070,7 +1545,15 @@
|
|||
"trash": "Šiukšliadėžė",
|
||||
"trash_all": "Perkelti visus į šiukšliadėžę",
|
||||
"trash_count": "Perkelti {count, number} į šiukšliadėžę",
|
||||
"trash_emptied": "Emptied trash",
|
||||
"trash_no_results_message": "Į šiukšliadėžę perkeltos nuotraukos ir vaizdo įrašai bus rodomi čia.",
|
||||
"trash_page_delete_all": "Delete All",
|
||||
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
|
||||
"trash_page_info": "Trashed items will be permanently deleted after {} days",
|
||||
"trash_page_no_assets": "No trashed assets",
|
||||
"trash_page_restore_all": "Restore All",
|
||||
"trash_page_select_assets_btn": "Select assets",
|
||||
"trash_page_title": "Trash ({})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Į šiukšliadėžę perkelti elementai bus visam laikui ištrinti po {days, plural, one {# dienos} other {# dienų}}.",
|
||||
"type": "Tipas",
|
||||
"unarchive": "Išarchyvuoti",
|
||||
|
@ -1093,14 +1576,19 @@
|
|||
"updated_password": "Slaptažodis atnaujintas",
|
||||
"upload": "Įkelti",
|
||||
"upload_concurrency": "",
|
||||
"upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
|
||||
"upload_dialog_title": "Upload Asset",
|
||||
"upload_errors": "Įkėlimas įvyko su {count, plural, one {# klaida} few {# klaidomis} other {# klaidų}}, norėdami pamatyti naujai įkeltus elementus perkraukite puslapį.",
|
||||
"upload_progress": "Liko {remaining, number} - Apdorota {processed, number}/{total, number}",
|
||||
"upload_status_duplicates": "Dublikatai",
|
||||
"upload_status_errors": "Klaidos",
|
||||
"upload_status_uploaded": "Įkelta",
|
||||
"upload_success": "Įkėlimas pavyko, norėdami pamatyti naujai įkeltus elementus perkraukite puslapį.",
|
||||
"upload_to_immich": "Upload to Immich ({})",
|
||||
"uploading": "Uploading",
|
||||
"url": "URL",
|
||||
"usage": "",
|
||||
"use_current_connection": "use current connection",
|
||||
"user": "Naudotojas",
|
||||
"user_id": "Naudotojo ID",
|
||||
"user_usage_detail": "",
|
||||
|
@ -1110,9 +1598,15 @@
|
|||
"users": "Naudotojai",
|
||||
"utilities": "Įrankiai",
|
||||
"validate": "Validuoti",
|
||||
"validate_endpoint_error": "Please enter a valid URL",
|
||||
"variables": "Kintamieji",
|
||||
"version": "Versija",
|
||||
"version_announcement_closing": "Tavo draugas, Alex",
|
||||
"version_announcement_overlay_release_notes": "release notes",
|
||||
"version_announcement_overlay_text_1": "Hi friend, there is a new release of",
|
||||
"version_announcement_overlay_text_2": "please take your time to visit the ",
|
||||
"version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.",
|
||||
"version_announcement_overlay_title": "New Server Version Available 🎉",
|
||||
"version_history": "Versijų istorija",
|
||||
"version_history_item": "Versija {version} įdiegta {date}",
|
||||
"video": "Vaizdo įrašas",
|
||||
|
@ -1128,13 +1622,18 @@
|
|||
"view_next_asset": "",
|
||||
"view_previous_asset": "",
|
||||
"view_stack": "Peržiūrėti grupę",
|
||||
"viewer_remove_from_stack": "Remove from Stack",
|
||||
"viewer_stack_use_as_main_asset": "Use as Main Asset",
|
||||
"viewer_unstack": "Un-Stack",
|
||||
"waiting": "Laukiama",
|
||||
"warning": "Įspėjimas",
|
||||
"week": "Savaitė",
|
||||
"welcome_to_immich": "Sveiki atvykę į Immich",
|
||||
"wifi_name": "WiFi Name",
|
||||
"year": "Metai",
|
||||
"years_ago": "Prieš {years, plural, one {# metus} other {# metų}}",
|
||||
"yes": "Taip",
|
||||
"you_dont_have_any_shared_links": "Bendrinimo nuorodų neturite",
|
||||
"your_wifi_name": "Your WiFi name",
|
||||
"zoom_image": "Priartinti vaizdą"
|
||||
}
|
||||
|
|
527
i18n/lv.json
527
i18n/lv.json
|
@ -4,6 +4,7 @@
|
|||
"account_settings": "Konta iestatījumi",
|
||||
"acknowledge": "Pieņemt",
|
||||
"action": "Darbība",
|
||||
"action_common_update": "Atjaunināt",
|
||||
"actions": "Darbības",
|
||||
"active": "Aktīvs",
|
||||
"activity": "Aktivitāte",
|
||||
|
@ -13,6 +14,7 @@
|
|||
"add_a_location": "Pievienot atrašanās vietu",
|
||||
"add_a_name": "Pievienot vārdu",
|
||||
"add_a_title": "Pievienot virsrakstu",
|
||||
"add_endpoint": "Add endpoint",
|
||||
"add_exclusion_pattern": "Pievienot izslēgšanas šablonu",
|
||||
"add_import_path": "Pievienot importa ceļu",
|
||||
"add_location": "Pievienot lokāciju",
|
||||
|
@ -22,6 +24,8 @@
|
|||
"add_photos": "Pievienot fotoattēlus",
|
||||
"add_to": "Pievienot…",
|
||||
"add_to_album": "Pievienot albumam",
|
||||
"add_to_album_bottom_sheet_added": "Pievienots {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Jau pievienots {album}",
|
||||
"add_to_shared_album": "Pievienot koplietotam albumam",
|
||||
"add_url": "Pievienot URL",
|
||||
"added_to_archive": "Pievienots arhīvam",
|
||||
|
@ -146,19 +150,12 @@
|
|||
"oauth_auto_register": "",
|
||||
"oauth_auto_register_description": "",
|
||||
"oauth_button_text": "Pogas teksts",
|
||||
"oauth_client_id": "Klienta ID",
|
||||
"oauth_client_secret": "Klienta noslēpums",
|
||||
"oauth_enable_description": "Pieslēgties ar OAuth",
|
||||
"oauth_issuer_url": "",
|
||||
"oauth_mobile_redirect_uri": "",
|
||||
"oauth_mobile_redirect_uri_override": "",
|
||||
"oauth_mobile_redirect_uri_override_description": "",
|
||||
"oauth_profile_signing_algorithm": "Profila parakstīšanas algoritms",
|
||||
"oauth_profile_signing_algorithm_description": "Lietotāja profila parakstīšanai izmantotais algoritms.",
|
||||
"oauth_scope": "",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "OAuth pieteikšanās iestatījumu pārvaldība",
|
||||
"oauth_signing_algorithm": "Parakstīšanas algoritms",
|
||||
"oauth_storage_label_claim": "",
|
||||
"oauth_storage_label_claim_description": "",
|
||||
"oauth_storage_quota_claim": "",
|
||||
|
@ -199,8 +196,9 @@
|
|||
"theme_custom_css_settings_description": "",
|
||||
"theme_settings": "",
|
||||
"theme_settings_description": "Immich tīmekļa saskarnes pielāgojumu pārvaldība",
|
||||
"thumbnail_generation_job": "Sīktēlu ģenerēšana",
|
||||
"thumbnail_generation_job_description": "",
|
||||
"transcoding_acceleration_api": "",
|
||||
"transcoding_acceleration_api": "Paātrināšanas API",
|
||||
"transcoding_acceleration_api_description": "",
|
||||
"transcoding_acceleration_nvenc": "NVENC (nepieciešams NVIDIA GPU)",
|
||||
"transcoding_acceleration_qsv": "Quick Sync (nepieciešams 7. paaudzes vai jaunāks Intel procesors)",
|
||||
|
@ -210,10 +208,11 @@
|
|||
"transcoding_accepted_audio_codecs_description": "",
|
||||
"transcoding_accepted_video_codecs": "",
|
||||
"transcoding_accepted_video_codecs_description": "",
|
||||
"transcoding_advanced_options_description": "",
|
||||
"transcoding_advanced_options_description": "Lielākajai daļai lietotāju nevajadzētu mainīt šīs opcijas",
|
||||
"transcoding_audio_codec": "Audio kodeks",
|
||||
"transcoding_audio_codec_description": "",
|
||||
"transcoding_bitrate_description": "",
|
||||
"transcoding_codecs_learn_more": "Lai uzzinātu vairāk par šeit lietoto terminoloģiju, skatiet FFmpeg dokumentāciju par <h264-link>H.264 kodeku</h264-link>, <hevc-link>HEVC kodeku</hevc-link> un <vp9-link>VP9 kodeku</vp9-link>.",
|
||||
"transcoding_constant_quality_mode": "",
|
||||
"transcoding_constant_quality_mode_description": "",
|
||||
"transcoding_constant_rate_factor": "",
|
||||
|
@ -275,18 +274,42 @@
|
|||
"admin_password": "Administratora parole",
|
||||
"administration": "Administrēšana",
|
||||
"advanced": "Papildu",
|
||||
"advanced_settings_log_level_title": "Žurnalēšanas līmenis: {}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Dažās ierīcēs sīktēli no ierīcē esošajiem resursiem tiek ielādēti ļoti lēni. Aktivizējiet šo iestatījumu, lai tā vietā ielādētu attālus attēlus.",
|
||||
"advanced_settings_prefer_remote_title": "Dot priekšroku attāliem attēliem",
|
||||
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request",
|
||||
"advanced_settings_proxy_headers_title": "Proxy Headers",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "Izlaiž servera galapunkta SSL sertifikātu verifikāciju. Nepieciešams pašparakstītajiem sertifikātiem.",
|
||||
"advanced_settings_self_signed_ssl_title": "Atļaut pašparakstītus SSL sertifikātus",
|
||||
"advanced_settings_tile_subtitle": "Lietotāja papildu iestatījumi",
|
||||
"advanced_settings_troubleshooting_subtitle": "Iespējot papildu aktīvus problēmu novēršanai",
|
||||
"advanced_settings_troubleshooting_title": "Problēmas novēršana",
|
||||
"album_added": "Albums pievienots",
|
||||
"album_added_notification_setting_description": "",
|
||||
"album_cover_updated": "Albuma attēls atjaunināts",
|
||||
"album_info_card_backup_album_excluded": "NEIEKĻAUTS",
|
||||
"album_info_card_backup_album_included": "IEKĻAUTS",
|
||||
"album_info_updated": "Albuma informācija atjaunināta",
|
||||
"album_leave": "Pamest albumu?",
|
||||
"album_name": "Albuma nosaukums",
|
||||
"album_options": "",
|
||||
"album_remove_user": "Noņemt lietotāju?",
|
||||
"album_thumbnail_card_item": "1 vienums",
|
||||
"album_thumbnail_card_items": "{} vienumi",
|
||||
"album_thumbnail_card_shared": "· Koplietots",
|
||||
"album_thumbnail_shared_by": "Kopīgoja {}",
|
||||
"album_updated": "Albums atjaunināts",
|
||||
"album_updated_setting_description": "",
|
||||
"album_user_left": "Pameta {album}",
|
||||
"album_user_removed": "Noņēma {user}",
|
||||
"album_viewer_appbar_delete_confirm": "Vai tiešām vēlaties dzēst šo albumu no sava konta?",
|
||||
"album_viewer_appbar_share_err_delete": "Neizdevās izdzēst albumu",
|
||||
"album_viewer_appbar_share_err_leave": "Neizdevās pamest albumu",
|
||||
"album_viewer_appbar_share_err_remove": "Ir problēmas ar aktīvu noņemšanu no albuma",
|
||||
"album_viewer_appbar_share_err_title": "Neizdevās mainīt albuma nosaukumu",
|
||||
"album_viewer_appbar_share_leave": "Pamest albumu",
|
||||
"album_viewer_appbar_share_to": "Kopīgot Uz",
|
||||
"album_viewer_page_share_add_users": "Pievienot lietotājus",
|
||||
"albums": "Albumi",
|
||||
"all": "Viss",
|
||||
"all_albums": "Visi albumi",
|
||||
|
@ -300,18 +323,109 @@
|
|||
"api_key": "API atslēga",
|
||||
"api_key_description": "Šī vērtība tiks parādīta tikai vienu reizi. Nokopējiet to pirms loga aizvēršanas.",
|
||||
"api_keys": "API atslēgas",
|
||||
"app_bar_signout_dialog_content": "Vai tiešām vēlaties izrakstīties?",
|
||||
"app_bar_signout_dialog_ok": "Jā",
|
||||
"app_bar_signout_dialog_title": "Izrakstīties",
|
||||
"app_settings": "",
|
||||
"appears_in": "",
|
||||
"archive": "Arhīvs",
|
||||
"archive_or_unarchive_photo": "",
|
||||
"archive_page_no_archived_assets": "Nav atrasts neviens arhivēts aktīvs",
|
||||
"archive_page_title": "Arhīvs ({})",
|
||||
"archive_size": "Arhīva izmērs",
|
||||
"archived": "Archived",
|
||||
"are_these_the_same_person": "Vai šī ir tā pati persona?",
|
||||
"asset_action_delete_err_read_only": "Nevar dzēst read only aktīvu(-s), notiek izlaišana",
|
||||
"asset_action_share_err_offline": "Nevar iegūt bezsaistes aktīvu(-s), notiek izlaišana",
|
||||
"asset_adding_to_album": "Pievieno albumam...",
|
||||
"asset_list_group_by_sub_title": "Grupēt pēc",
|
||||
"asset_list_layout_settings_dynamic_layout_title": "Dinamiskais izkārtojums",
|
||||
"asset_list_layout_settings_group_automatically": "Automātiski",
|
||||
"asset_list_layout_settings_group_by": "Grupēt aktīvus pēc",
|
||||
"asset_list_layout_settings_group_by_month_day": "Mēnesis + diena",
|
||||
"asset_list_layout_sub_title": "Izvietojums",
|
||||
"asset_list_settings_subtitle": "Fotorežģa izkārtojuma iestatījumi",
|
||||
"asset_list_settings_title": "Fotorežģis",
|
||||
"asset_offline": "",
|
||||
"asset_restored_successfully": "Asset restored successfully",
|
||||
"asset_uploading": "Augšupielādē...",
|
||||
"asset_viewer_settings_subtitle": "Manage your gallery viewer settings",
|
||||
"asset_viewer_settings_title": "Aktīvu Skatītājs",
|
||||
"assets": "aktīvi",
|
||||
"assets_deleted_permanently": "{} asset(s) deleted permanently",
|
||||
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server",
|
||||
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device",
|
||||
"assets_restored_successfully": "{} asset(s) restored successfully",
|
||||
"assets_trashed": "{} asset(s) trashed",
|
||||
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server",
|
||||
"authorized_devices": "Autorizētās ierīces",
|
||||
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
|
||||
"automatic_endpoint_switching_title": "Automatic URL switching",
|
||||
"back": "Atpakaļ",
|
||||
"background_location_permission": "Background location permission",
|
||||
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
|
||||
"backup_album_selection_page_albums_device": "Albumi ierīcē ({})",
|
||||
"backup_album_selection_page_albums_tap": "Pieskarieties, lai iekļautu, veiciet dubultskārienu, lai izslēgtu",
|
||||
"backup_album_selection_page_assets_scatter": "Aktīvi var būt izmētāti pa vairākiem albumiem. Tādējādi dublēšanas procesā albumus var iekļaut vai neiekļaut.",
|
||||
"backup_album_selection_page_select_albums": "Atlasīt albumus",
|
||||
"backup_album_selection_page_selection_info": "Atlases informācija",
|
||||
"backup_album_selection_page_total_assets": "Kopā unikālie aktīvi",
|
||||
"backup_all": "Viss",
|
||||
"backup_background_service_backup_failed_message": "Neizdevās dublēt līdzekļus. Notiek atkārtota mēģināšana…",
|
||||
"backup_background_service_connection_failed_message": "Neizdevās izveidot savienojumu ar serveri. Notiek atkārtota mēģināšana…",
|
||||
"backup_background_service_current_upload_notification": "Notiek {} augšupielāde",
|
||||
"backup_background_service_default_notification": "Notiek jaunu aktīvu meklēšana…",
|
||||
"backup_background_service_error_title": "Dublēšanas kļūda",
|
||||
"backup_background_service_in_progress_notification": "Notiek aktīvu dublēšana…",
|
||||
"backup_background_service_upload_failure_notification": "Neizdevās augšupielādēt {}",
|
||||
"backup_controller_page_albums": "Dublējuma Albumi",
|
||||
"backup_controller_page_background_app_refresh_disabled_content": "Iespējojiet fona aplikācijas atsvaidzināšanu sadaļā Iestatījumi > Vispārīgi > Fona Aplikācijas Atsvaidzināšana, lai izmantotu fona dublēšanu.",
|
||||
"backup_controller_page_background_app_refresh_disabled_title": "Fona aplikācijas atsvaidzināšana atspējota",
|
||||
"backup_controller_page_background_app_refresh_enable_button_text": "Doties uz iestatījumiem",
|
||||
"backup_controller_page_background_battery_info_link": "Parādīt, kā",
|
||||
"backup_controller_page_background_battery_info_message": "Lai iegūtu vislabāko fona dublēšanas pieredzi, lūdzu, atspējojiet visas akumulatora optimizācijas, kas ierobežo Immich fona aktivitāti.\n\nTā kā katrai ierīcei iestatījumi ir citādāki, lūdzu, meklējiet nepieciešamo informāciju pie ierīces ražotāja.",
|
||||
"backup_controller_page_background_battery_info_ok": "OK",
|
||||
"backup_controller_page_background_battery_info_title": "Akumulatora optimizācija",
|
||||
"backup_controller_page_background_charging": "Tikai uzlādes laikā",
|
||||
"backup_controller_page_background_configure_error": "Neizdevās konfigurēt fona pakalpojumu",
|
||||
"backup_controller_page_background_delay": "Aizkavēt jaunu līdzekļu dublēšanu: {}",
|
||||
"backup_controller_page_background_description": "Ieslēdziet fona pakalpojumu, lai automātiski dublētu visus jaunos aktīvus, neatverot programmu",
|
||||
"backup_controller_page_background_is_off": "Automātiskā fona dublēšana ir izslēgta",
|
||||
"backup_controller_page_background_is_on": "Automātiskā fona dublēšana ir ieslēgta",
|
||||
"backup_controller_page_background_turn_off": "Izslēgt fona pakalpojumu",
|
||||
"backup_controller_page_background_turn_on": "Ieslēgt fona pakalpojumu",
|
||||
"backup_controller_page_background_wifi": "Tikai WiFi tīklā",
|
||||
"backup_controller_page_backup": "Dublēšana",
|
||||
"backup_controller_page_backup_selected": "Atlasīts: ",
|
||||
"backup_controller_page_backup_sub": "Dublētie Fotoattēli un videoklipi",
|
||||
"backup_controller_page_created": "Izveidots: {}",
|
||||
"backup_controller_page_desc_backup": "Ieslēdziet priekšplāna dublēšanu, lai, atverot programmu, serverī automātiski augšupielādētu jaunus aktīvus.",
|
||||
"backup_controller_page_excluded": "Izņemot: ",
|
||||
"backup_controller_page_failed": "Neizdevās ({})",
|
||||
"backup_controller_page_filename": "Faila nosaukums: {} [{}]",
|
||||
"backup_controller_page_id": "ID: {}",
|
||||
"backup_controller_page_info": "Dublējuma Informācija",
|
||||
"backup_controller_page_none_selected": "Neviens nav atlasīts",
|
||||
"backup_controller_page_remainder": "Atlikums",
|
||||
"backup_controller_page_remainder_sub": "Atlikušie fotoattēli un videoklipi, kurus dublēt no atlases",
|
||||
"backup_controller_page_server_storage": "Servera krātuve",
|
||||
"backup_controller_page_start_backup": "Sākt Dublēšanu",
|
||||
"backup_controller_page_status_off": "Automātiskā priekšplāna dublēšana ir izslēgta",
|
||||
"backup_controller_page_status_on": "Automātiskā priekšplāna dublēšana ir ieslēgta",
|
||||
"backup_controller_page_storage_format": "{} no {} tiek izmantots",
|
||||
"backup_controller_page_to_backup": "Dublējamie albumi",
|
||||
"backup_controller_page_total_sub": "Visi unikālie fotoattēli un videoklipi no izvēlētajiem albumiem",
|
||||
"backup_controller_page_turn_off": "Izslēgt priekšplāna dublēšanu",
|
||||
"backup_controller_page_turn_on": "Ieslēgt priekšplāna dublēšanu",
|
||||
"backup_controller_page_uploading_file_info": "Faila informācijas augšupielāde",
|
||||
"backup_err_only_album": "Nevar noņemt vienīgo albumu",
|
||||
"backup_info_card_assets": "aktīvi",
|
||||
"backup_manual_cancelled": "Atcelts",
|
||||
"backup_manual_in_progress": "Augšupielāde jau notiek. Mēģiniet pēc kāda laika atkārtoti",
|
||||
"backup_manual_success": "Veiksmīgi",
|
||||
"backup_manual_title": "Augšupielādes statuss",
|
||||
"backup_options_page_title": "Dublēšanas iestatījumi",
|
||||
"backup_setting_subtitle": "Manage background and foreground upload settings",
|
||||
"backward": "",
|
||||
"birthdate_saved": "Dzimšanas datums veiksmīgi saglabāts",
|
||||
"birthdate_set_description": "Dzimšanas datums tiek izmantots, lai aprēķinātu šīs personas vecumu fotogrāfijas uzņemšanas brīdī.",
|
||||
|
@ -319,21 +433,49 @@
|
|||
"bugs_and_feature_requests": "Kļūdas un funkciju pieprasījumi",
|
||||
"build": "Būvējums",
|
||||
"build_image": "Būvējuma attēls",
|
||||
"cache_settings_album_thumbnails": "Bibliotēkas lapu sīktēli ({} aktīvi)",
|
||||
"cache_settings_clear_cache_button": "Iztīrīt kešatmiņu",
|
||||
"cache_settings_clear_cache_button_title": "Iztīra aplikācijas kešatmiņu. Tas būtiski ietekmēs lietotnes veiktspēju, līdz kešatmiņa būs pārbūvēta.",
|
||||
"cache_settings_duplicated_assets_clear_button": "NOTĪRĪT",
|
||||
"cache_settings_duplicated_assets_subtitle": "Fotoattēli un videoklipi, kurus lietotne ir iekļāvusi melnajā sarakstā",
|
||||
"cache_settings_duplicated_assets_title": "Dublicētie Aktīvi ({})",
|
||||
"cache_settings_image_cache_size": "Attēlu kešatmiņas lielums ({} aktīvi)",
|
||||
"cache_settings_statistics_album": "Bibliotēkas sīktēli",
|
||||
"cache_settings_statistics_assets": "{} aktīvi ({})",
|
||||
"cache_settings_statistics_full": "Pilni attēli",
|
||||
"cache_settings_statistics_shared": "Koplietojamo albumu sīktēli",
|
||||
"cache_settings_statistics_thumbnail": "Sīktēli",
|
||||
"cache_settings_statistics_title": "Kešatmiņas lietojums",
|
||||
"cache_settings_subtitle": "Kontrolēt Immich mobilās lietotnes kešdarbi",
|
||||
"cache_settings_thumbnail_size": "Sīktēlu keša lielums ({} aktīvi)",
|
||||
"cache_settings_tile_subtitle": "Kontrolēt lokālās krātuves uzvedību",
|
||||
"cache_settings_tile_title": "Lokālā Krātuve",
|
||||
"cache_settings_title": "Kešdarbes iestatījumi",
|
||||
"camera": "",
|
||||
"camera_brand": "",
|
||||
"camera_model": "",
|
||||
"cancel": "Atcelt",
|
||||
"cancel_search": "",
|
||||
"canceled": "Canceled",
|
||||
"cannot_merge_people": "Nevar apvienot cilvēkus",
|
||||
"cannot_update_the_description": "",
|
||||
"change_date": "Mainīt datumu",
|
||||
"change_display_order": "Change display order",
|
||||
"change_expiration_time": "Izmainīt derīguma termiņu",
|
||||
"change_location": "Mainīt atrašanās vietu",
|
||||
"change_name": "Mainīt nosaukumu",
|
||||
"change_name_successfully": "Vārds veiksmīgi nomainīts",
|
||||
"change_password": "Nomainīt paroli",
|
||||
"change_password_form_confirm_password": "Apstiprināt Paroli",
|
||||
"change_password_form_description": "Sveiki {name},\n\nŠī ir pirmā reize, kad pierakstāties sistēmā, vai arī ir iesniegts pieprasījums mainīt paroli. Lūdzu, zemāk ievadiet jauno paroli.",
|
||||
"change_password_form_new_password": "Jauna Parole",
|
||||
"change_password_form_password_mismatch": "Paroles nesakrīt",
|
||||
"change_password_form_reenter_new_password": "Atkārtoti ievadīt jaunu paroli",
|
||||
"change_your_password": "",
|
||||
"changed_visibility_successfully": "",
|
||||
"check_corrupt_asset_backup": "Check for corrupt asset backups",
|
||||
"check_corrupt_asset_backup_button": "Perform check",
|
||||
"check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.",
|
||||
"check_logs": "",
|
||||
"choose_matching_people_to_merge": "Izvēlies atbilstošus cilvēkus apvienošanai",
|
||||
"city": "Pilsēta",
|
||||
|
@ -341,6 +483,14 @@
|
|||
"clear_all": "Notīrīt visu",
|
||||
"clear_message": "",
|
||||
"clear_value": "Notīrīt vērtību",
|
||||
"client_cert_dialog_msg_confirm": "OK",
|
||||
"client_cert_enter_password": "Enter Password",
|
||||
"client_cert_import": "Import",
|
||||
"client_cert_import_success_msg": "Client certificate is imported",
|
||||
"client_cert_invalid_msg": "Invalid certificate file or wrong password",
|
||||
"client_cert_remove_msg": "Client certificate is removed",
|
||||
"client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login",
|
||||
"client_cert_title": "SSL Client Certificate",
|
||||
"clockwise": "Pulksteņrādītāja virzienā",
|
||||
"close": "Aizvērt",
|
||||
"collapse": "Sakļaut",
|
||||
|
@ -350,12 +500,24 @@
|
|||
"comment_deleted": "Komentārs dzēsts",
|
||||
"comment_options": "",
|
||||
"comments_are_disabled": "",
|
||||
"common_create_new_album": "Izveidot jaunu albumu",
|
||||
"common_server_error": "Lūdzu, pārbaudiet tīkla savienojumu, pārliecinieties, vai serveris ir sasniedzams un aplikācijas/servera versijas ir saderīgas.",
|
||||
"completed": "Completed",
|
||||
"confirm": "Apstiprināt",
|
||||
"confirm_admin_password": "",
|
||||
"confirm_password": "Apstiprināt paroli",
|
||||
"contain": "",
|
||||
"context": "Konteksts",
|
||||
"continue": "Turpināt",
|
||||
"control_bottom_app_bar_album_info_shared": "{} vienumi · Koplietoti",
|
||||
"control_bottom_app_bar_create_new_album": "Izveidot jaunu albumu",
|
||||
"control_bottom_app_bar_delete_from_immich": "Dzēst no Immich",
|
||||
"control_bottom_app_bar_delete_from_local": "Dzēst no ierīces",
|
||||
"control_bottom_app_bar_edit_location": "Rediģēt Atrašanās Vietu",
|
||||
"control_bottom_app_bar_edit_time": "Rediģēt Datumu un Laiku",
|
||||
"control_bottom_app_bar_share_link": "Share Link",
|
||||
"control_bottom_app_bar_share_to": "Kopīgot Uz",
|
||||
"control_bottom_app_bar_trash_from_immich": "Pārvietot uz Atkritni",
|
||||
"copied_image_to_clipboard": "",
|
||||
"copy_error": "",
|
||||
"copy_file_path": "",
|
||||
|
@ -369,20 +531,30 @@
|
|||
"covers": "",
|
||||
"create": "Izveidot",
|
||||
"create_album": "Izveidot albumu",
|
||||
"create_album_page_untitled": "Bez nosaukuma",
|
||||
"create_library": "",
|
||||
"create_link": "Izveidot saiti",
|
||||
"create_link_to_share": "Izveidot kopīgošanas saiti",
|
||||
"create_new": "CREATE NEW",
|
||||
"create_new_person": "",
|
||||
"create_new_user": "Izveidot jaunu lietotāju",
|
||||
"create_shared_album_page_share_add_assets": "PIEVIENOT AKTĪVUS",
|
||||
"create_shared_album_page_share_select_photos": "Fotoattēlu Izvēle",
|
||||
"create_user": "Izveidot lietotāju",
|
||||
"created": "",
|
||||
"crop": "Crop",
|
||||
"curated_object_page_title": "Lietas",
|
||||
"current_device": "",
|
||||
"current_server_address": "Current server address",
|
||||
"custom_locale": "",
|
||||
"custom_locale_description": "",
|
||||
"daily_title_text_date": "E, MMM dd",
|
||||
"daily_title_text_date_year": "E, MMM dd, gggg",
|
||||
"dark": "",
|
||||
"date_after": "",
|
||||
"date_and_time": "Datums un Laiks",
|
||||
"date_before": "",
|
||||
"date_format": "E, LLL d, g • h:mm a",
|
||||
"date_of_birth_saved": "Dzimšanas datums veiksmīgi saglabāts",
|
||||
"date_range": "Datumu diapazons",
|
||||
"day": "",
|
||||
|
@ -390,13 +562,24 @@
|
|||
"default_locale_description": "",
|
||||
"delete": "Dzēst",
|
||||
"delete_album": "Dzēst albumu",
|
||||
"delete_dialog_alert": "Šie vienumi tiks neatgriezeniski dzēsti no Immich un jūsu ierīces",
|
||||
"delete_dialog_alert_local": "Šie vienumi tiks neatgriezeniski dzēsti no jūsu ierīces, bet joprojām būs pieejami Immich serverī.",
|
||||
"delete_dialog_alert_local_non_backed_up": "Daži no šiem elementiem netiek dublēti Immich un tiks neatgriezeniski dzēsti no jūsu ierīces.",
|
||||
"delete_dialog_alert_remote": "Šie vienumi tiks neatgriezeniski dzēsti no Immich servera.",
|
||||
"delete_dialog_ok_force": "Tā pat dzēst",
|
||||
"delete_dialog_title": "Neatgriezeniski Dzēst",
|
||||
"delete_key": "",
|
||||
"delete_library": "",
|
||||
"delete_link": "",
|
||||
"delete_local_dialog_ok_backed_up_only": "Dzēst tikai Dublētos",
|
||||
"delete_local_dialog_ok_force": "Tā pat dzēst",
|
||||
"delete_shared_link": "Dzēst Kopīgošanas saiti",
|
||||
"delete_shared_link_dialog_title": "Dzēst Kopīgošanas saiti",
|
||||
"delete_user": "Dzēst lietotāju",
|
||||
"deleted_shared_link": "",
|
||||
"description": "Apraksts",
|
||||
"description_input_hint_text": "Pievienot aprakstu...",
|
||||
"description_input_submit_error": "Atjauninot aprakstu, radās kļūda; papildinformāciju skatiet žurnālā",
|
||||
"details": "INFORMĀCIJA",
|
||||
"direction": "Virziens",
|
||||
"disallow_edits": "",
|
||||
|
@ -410,9 +593,23 @@
|
|||
"documentation": "Dokumentācija",
|
||||
"done": "Gatavs",
|
||||
"download": "Lejupielādēt",
|
||||
"download_canceled": "Download canceled",
|
||||
"download_complete": "Download complete",
|
||||
"download_enqueue": "Download enqueued",
|
||||
"download_error": "Download Error",
|
||||
"download_failed": "Download failed",
|
||||
"download_filename": "file: {}",
|
||||
"download_finished": "Download finished",
|
||||
"download_notfound": "Download not found",
|
||||
"download_paused": "Download paused",
|
||||
"download_settings": "Lejupielāde",
|
||||
"download_settings_description": "Ar failu lejupielādi saistīto iestatījumu pārvaldība",
|
||||
"download_started": "Download started",
|
||||
"download_sucess": "Download success",
|
||||
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
|
||||
"download_waiting_to_retry": "Waiting to retry",
|
||||
"downloading": "",
|
||||
"downloading_media": "Downloading media",
|
||||
"duplicates": "Dublikāti",
|
||||
"duration": "",
|
||||
"edit_album": "",
|
||||
|
@ -426,6 +623,7 @@
|
|||
"edit_key": "",
|
||||
"edit_link": "Rediģēt saiti",
|
||||
"edit_location": "Rediģēt Atrašanās Vietu",
|
||||
"edit_location_dialog_title": "Atrašanās vieta",
|
||||
"edit_name": "Rediģēt vārdu",
|
||||
"edit_people": "",
|
||||
"edit_title": "",
|
||||
|
@ -435,12 +633,17 @@
|
|||
"editor_close_without_save_prompt": "Izmaiņas netiks saglabātas",
|
||||
"editor_close_without_save_title": "Aizvērt redaktoru?",
|
||||
"email": "E-pasts",
|
||||
"empty_folder": "This folder is empty",
|
||||
"empty_trash": "Iztukšot atkritni",
|
||||
"enable": "",
|
||||
"enabled": "",
|
||||
"end_date": "",
|
||||
"enqueued": "Enqueued",
|
||||
"enter_wifi_name": "Enter WiFi name",
|
||||
"error": "",
|
||||
"error_change_sort_album": "Failed to change album sort order",
|
||||
"error_loading_image": "",
|
||||
"error_saving_image": "Error: {}",
|
||||
"errors": {
|
||||
"cant_get_faces": "Nevar iegūt sejas",
|
||||
"cant_search_people": "Neizdevās veikt peronu meklēšanu",
|
||||
|
@ -493,40 +696,92 @@
|
|||
"unable_to_update_settings": "",
|
||||
"unable_to_update_user": ""
|
||||
},
|
||||
"exif_bottom_sheet_description": "Pievienot Aprakstu...",
|
||||
"exif_bottom_sheet_details": "INFORMĀCIJA",
|
||||
"exif_bottom_sheet_location": "ATRAŠANĀS VIETA",
|
||||
"exif_bottom_sheet_people": "CILVĒKI",
|
||||
"exif_bottom_sheet_person_add_person": "Pievienot vārdu",
|
||||
"exif_bottom_sheet_person_age": "Age {}",
|
||||
"exif_bottom_sheet_person_age_months": "Age {} months",
|
||||
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months",
|
||||
"exif_bottom_sheet_person_age_years": "Age {}",
|
||||
"exit_slideshow": "Iziet no slīdrādes",
|
||||
"expand_all": "",
|
||||
"experimental_settings_new_asset_list_subtitle": "Izstrādes posmā",
|
||||
"experimental_settings_new_asset_list_title": "Iespējot eksperimentālo fotorežģi",
|
||||
"experimental_settings_subtitle": "Izmanto uzņemoties risku!",
|
||||
"experimental_settings_title": "Eksperimentāls",
|
||||
"expire_after": "Derīguma termiņš beidzas pēc",
|
||||
"expired": "Derīguma termiņš beidzās",
|
||||
"explore": "Izpētīt",
|
||||
"extension": "",
|
||||
"external_libraries": "",
|
||||
"external_network": "External network",
|
||||
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
|
||||
"failed": "Failed",
|
||||
"failed_to_load_assets": "Failed to load assets",
|
||||
"failed_to_load_folder": "Failed to load folder",
|
||||
"favorite": "Izlase",
|
||||
"favorite_or_unfavorite_photo": "",
|
||||
"favorites": "Izlase",
|
||||
"favorites_page_no_favorites": "Nav atrasti iecienītākie aktīvi",
|
||||
"feature_photo_updated": "",
|
||||
"features_setting_description": "Lietotnes funkciju pārvaldība",
|
||||
"file_name": "",
|
||||
"file_name_or_extension": "",
|
||||
"filename": "",
|
||||
"filetype": "",
|
||||
"filter": "Filter",
|
||||
"filter_people": "",
|
||||
"fix_incorrect_match": "",
|
||||
"folder": "Folder",
|
||||
"folder_not_found": "Folder not found",
|
||||
"folders": "Mapes",
|
||||
"forward": "",
|
||||
"general": "",
|
||||
"get_help": "",
|
||||
"get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network",
|
||||
"getting_started": "",
|
||||
"go_back": "",
|
||||
"go_to_search": "",
|
||||
"grant_permission": "Grant permission",
|
||||
"group_albums_by": "",
|
||||
"haptic_feedback_switch": "Iestatīt haptisku reakciju",
|
||||
"haptic_feedback_title": "Haptiska Reakcija",
|
||||
"has_quota": "Ir kvota",
|
||||
"header_settings_add_header_tip": "Add Header",
|
||||
"header_settings_field_validator_msg": "Value cannot be empty",
|
||||
"header_settings_header_name_input": "Header name",
|
||||
"header_settings_header_value_input": "Header value",
|
||||
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request",
|
||||
"headers_settings_tile_title": "Custom proxy headers",
|
||||
"hide_gallery": "",
|
||||
"hide_named_person": "Paslēpt personu {name}",
|
||||
"hide_password": "",
|
||||
"hide_person": "Paslēpt personu",
|
||||
"home_page_add_to_album_conflicts": "Pievienoja {added} aktīvus albumam {album}. {failed} aktīvi jau ir albumā.",
|
||||
"home_page_add_to_album_err_local": "Albumiem vēl nevar pievienot lokālos aktīvus, notiek izlaišana",
|
||||
"home_page_add_to_album_success": "Pievienoja {added} aktīvus albumam {album}.",
|
||||
"home_page_album_err_partner": "Pagaidām nevar pievienot partnera aktīvus albumam, notiek izlaišana",
|
||||
"home_page_archive_err_local": "Vēl nevar arhivēt lokālos aktīvus, notiek izlaišana",
|
||||
"home_page_archive_err_partner": "Nevarēja arhivēt partnera aktīvus, notiek izlaišana",
|
||||
"home_page_building_timeline": "Tiek izveidota laika skala",
|
||||
"home_page_delete_err_partner": "Nevarēja dzēst partnera aktīvus, notiek izlaišana",
|
||||
"home_page_delete_remote_err_local": "Lokālie aktīvi dzēšanai attālinātajā izvēlē, tiek izlaists",
|
||||
"home_page_favorite_err_local": "Vēl nevar pievienot izlaisei vietējos aktīvus, notiek izlaišana",
|
||||
"home_page_favorite_err_partner": "Pagaidām nevar ievietot izlasē partnera aktīvus, notiek izlaišana",
|
||||
"home_page_first_time_notice": "Ja šī ir pirmā reize, kad izmantojat aplikāciju, lūdzu, izvēlieties dublējuma albumu(s), lai laika skala varētu aizpildīt fotoattēlus un videoklipus albumā(os).",
|
||||
"home_page_share_err_local": "Caur saiti nevarēja kopīgot lokālos aktīvus, notiek izlaišana",
|
||||
"home_page_upload_err_limit": "Vienlaikus var augšupielādēt ne vairāk kā 30 aktīvus, notiek izlaišana",
|
||||
"host": "",
|
||||
"hour": "",
|
||||
"ignore_icloud_photos": "Ignore iCloud photos",
|
||||
"ignore_icloud_photos_description": "Photos that are stored on iCloud will not be uploaded to the Immich server",
|
||||
"image": "Attēls",
|
||||
"image_saved_successfully": "Image saved",
|
||||
"image_viewer_page_state_provider_download_started": "Lejupielāde Uzsākta",
|
||||
"image_viewer_page_state_provider_download_success": "Lejupielāde Izdevās",
|
||||
"image_viewer_page_state_provider_share_error": "Kopīgošanas Kļūda",
|
||||
"immich_logo": "Immich logo",
|
||||
"import_from_json": "Importēt no JSON",
|
||||
"import_path": "Importa ceļš",
|
||||
|
@ -543,6 +798,8 @@
|
|||
"night_at_midnight": "Katru dienu pusnaktī",
|
||||
"night_at_twoam": "Katru dienu 2.00 naktī"
|
||||
},
|
||||
"invalid_date": "Invalid date",
|
||||
"invalid_date_format": "Invalid date format",
|
||||
"invite_people": "Ielūgt cilvēkus",
|
||||
"invite_to_album": "Uzaicināt albumā",
|
||||
"jobs": "Uzdevumi",
|
||||
|
@ -559,6 +816,12 @@
|
|||
"level": "Līmenis",
|
||||
"library": "Bibliotēka",
|
||||
"library_options": "",
|
||||
"library_page_device_albums": "Albumi ierīcē",
|
||||
"library_page_new_album": "Jauns albums",
|
||||
"library_page_sort_asset_count": "Daudzums ar aktīviem",
|
||||
"library_page_sort_created": "Jaunākais izveidotais",
|
||||
"library_page_sort_last_modified": "Pēdējo reizi modificēts",
|
||||
"library_page_sort_title": "Albuma virsraksts",
|
||||
"light": "",
|
||||
"link_options": "",
|
||||
"link_to_oauth": "",
|
||||
|
@ -566,9 +829,39 @@
|
|||
"list": "Saraksts",
|
||||
"loading": "Ielādē",
|
||||
"loading_search_results_failed": "",
|
||||
"local_network": "Local network",
|
||||
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
|
||||
"location_permission": "Location permission",
|
||||
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name",
|
||||
"location_picker_choose_on_map": "Izvēlēties uz kartes",
|
||||
"location_picker_latitude_error": "Ievadiet korektu ģeogrāfisko platumu",
|
||||
"location_picker_latitude_hint": "Ievadiet savu ģeogrāfisko platumu šeit",
|
||||
"location_picker_longitude_error": "Ievadiet korektu ģeogrāfisko garumu",
|
||||
"location_picker_longitude_hint": "Ievadiet savu ģeogrāfisko garumu šeit",
|
||||
"log_out": "Izrakstīties",
|
||||
"log_out_all_devices": "",
|
||||
"login_disabled": "Pieslēgšanās ir atslēgta",
|
||||
"login_form_api_exception": "API izņēmums. Lūdzu, pārbaudiet servera URL un mēģiniet vēlreiz.",
|
||||
"login_form_back_button_text": "Atpakaļ",
|
||||
"login_form_email_hint": "jūsuepasts@email.com",
|
||||
"login_form_endpoint_hint": "http://jūsu-servera-ip:ports",
|
||||
"login_form_endpoint_url": "Servera Galapunkta URL",
|
||||
"login_form_err_http": "Lūdzu norādiet http:// vai https://",
|
||||
"login_form_err_invalid_email": "Nederīgs e-pasts",
|
||||
"login_form_err_invalid_url": "Nederīgs URL",
|
||||
"login_form_err_leading_whitespace": "Priekšējā baltstarpa",
|
||||
"login_form_err_trailing_whitespace": "Beigu baltstarpa",
|
||||
"login_form_failed_get_oauth_server_config": "Pieslēdzoties, izmantojot OAuth, radās kļūda; pārbaudiet servera URL",
|
||||
"login_form_failed_get_oauth_server_disable": "OAuth līdzeklis šajā serverī nav pieejams",
|
||||
"login_form_failed_login": "Radās kļūda, piesakoties, pārbaudiet servera URL, e-pastu un paroli",
|
||||
"login_form_handshake_exception": "Ar serveri tika konstatēta Handshake Exception kļūda. Ja izmantojat pašparakstītu sertifikātu, tad iestatījumos iespējojiet pašparakstītu sertifikātu atbalstu.",
|
||||
"login_form_password_hint": "parole",
|
||||
"login_form_save_login": "Palikt pieteiktam",
|
||||
"login_form_server_empty": "Ieraksties servera URL.",
|
||||
"login_form_server_error": "Nevarēja izveidot savienojumu ar serveri.",
|
||||
"login_has_been_disabled": "",
|
||||
"login_password_changed_error": "Atjaunojot paroli radās kļūda",
|
||||
"login_password_changed_success": "Parole veiksmīgi atjaunota",
|
||||
"longitude": "Ģeogrāfiskais garums",
|
||||
"look": "Izskats",
|
||||
"loop_videos": "",
|
||||
|
@ -582,13 +875,40 @@
|
|||
"manage_your_devices": "Pieslēgto ierīču pārvaldība",
|
||||
"manage_your_oauth_connection": "OAuth savienojumu pārvaldība",
|
||||
"map": "Karte",
|
||||
"map_assets_in_bound": "{} fotoattēls",
|
||||
"map_assets_in_bounds": "{} fotoattēli",
|
||||
"map_cannot_get_user_location": "Nevar iegūt lietotāja atrašanās vietu",
|
||||
"map_location_dialog_yes": "Jā",
|
||||
"map_location_picker_page_use_location": "Izvēlēties šo atrašanās vietu",
|
||||
"map_location_service_disabled_content": "Lai tiktu rādīti jūsu pašreizējās atrašanās vietas aktīvi, ir jāaktivizē atrašanās vietas pakalpojums. Vai vēlaties to iespējot tagad?",
|
||||
"map_location_service_disabled_title": "Atrašanās vietas Pakalpojums atslēgts",
|
||||
"map_marker_for_images": "Kartes marķieris attēliem, kas uzņemti {city}, {country}",
|
||||
"map_marker_with_image": "Kartes marķieris ar attēlu",
|
||||
"map_no_assets_in_bounds": "Šajā lokācijā nav neviena fotoattēla",
|
||||
"map_no_location_permission_content": "Atrašanās vietas atļauja ir nepieciešama, lai parādītu jūsu pašreizējās atrašanās vietas aktīvus. Vai vēlaties to atļaut tagad?",
|
||||
"map_no_location_permission_title": "Atrašanās vietas Atļaujas liegtas",
|
||||
"map_settings": "Kartes Iestatījumi",
|
||||
"map_settings_dark_mode": "Tumšais režīms",
|
||||
"map_settings_date_range_option_day": "Pēdējās 24 stundas",
|
||||
"map_settings_date_range_option_days": "Pēdējās {} dienas",
|
||||
"map_settings_date_range_option_year": "Pēdējo gadu",
|
||||
"map_settings_date_range_option_years": "Pēdējos {} gadus",
|
||||
"map_settings_dialog_title": "Kartes Iestatījumi",
|
||||
"map_settings_include_show_archived": "Iekļaut Arhivētos",
|
||||
"map_settings_include_show_partners": "Iekļaut Partnerus",
|
||||
"map_settings_only_show_favorites": "Rādīt tikai Izlasi",
|
||||
"map_settings_theme_settings": "Kartes Dizains",
|
||||
"map_zoom_to_see_photos": "Attāliniet, lai redzētu fotoattēlus",
|
||||
"matches": "Atbilstības",
|
||||
"media_type": "Multivides veids",
|
||||
"memories": "Atmiņas",
|
||||
"memories_all_caught_up": "Šobrīd, tas arī viss",
|
||||
"memories_check_back_tomorrow": "Priekš vairāk atmiņām atgriezieties rītdien.",
|
||||
"memories_setting_description": "",
|
||||
"memories_start_over": "Sākt no jauna",
|
||||
"memories_swipe_to_close": "Pavelciet uz augšu, lai aizvērtu",
|
||||
"memories_year_ago": "A year ago",
|
||||
"memories_years_ago": "{} years ago",
|
||||
"memory": "Atmiņa",
|
||||
"menu": "Izvēlne",
|
||||
"merge": "Apvienot",
|
||||
|
@ -601,11 +921,16 @@
|
|||
"missing": "Trūkstošie",
|
||||
"model": "Modelis",
|
||||
"month": "Mēnesis",
|
||||
"monthly_title_text_date_format": "MMMM g",
|
||||
"more": "Vairāk",
|
||||
"moved_to_trash": "Pārvietots uz atkritni",
|
||||
"multiselect_grid_edit_date_time_err_read_only": "Nevar rediģēt read only aktīva(-u) datumu, notiek izlaišana",
|
||||
"multiselect_grid_edit_gps_err_read_only": "Nevar rediģēt atrašanās vietu read only aktīva(-u) datumu, notiek izlaišana",
|
||||
"my_albums": "Mani albumi",
|
||||
"name": "Vārds",
|
||||
"name_or_nickname": "Vārds vai iesauka",
|
||||
"networking_settings": "Networking",
|
||||
"networking_subtitle": "Manage the server endpoint settings",
|
||||
"never": "nekad",
|
||||
"new_album": "Jauns albums",
|
||||
"new_api_key": "Jauna API atslēga",
|
||||
|
@ -620,6 +945,7 @@
|
|||
"no_albums_message": "",
|
||||
"no_archived_assets_message": "",
|
||||
"no_assets_message": "NOKLIKŠĶINIET, LAI AUGŠUPIELĀDĒTU SAVU PIRMO FOTOATTĒLU",
|
||||
"no_assets_to_show": "Nav uzrādāmo aktīvu",
|
||||
"no_duplicates_found": "Dublikāti netika atrasti.",
|
||||
"no_exif_info_available": "Nav pieejama exif informācija",
|
||||
"no_explore_results_message": "",
|
||||
|
@ -631,7 +957,12 @@
|
|||
"no_results_description": "Izmēģiniet sinonīmu vai vispārīgāku atslēgvārdu",
|
||||
"no_shared_albums_message": "",
|
||||
"not_in_any_album": "Nav nevienā albumā",
|
||||
"not_selected": "Not selected",
|
||||
"notes": "Piezīmes",
|
||||
"notification_permission_dialog_content": "Lai iespējotu paziņojumus, atveriet Iestatījumi un atlasiet Atļaut.",
|
||||
"notification_permission_list_tile_content": "Piešķirt atļauju, lai iespējotu paziņojumus.",
|
||||
"notification_permission_list_tile_enable_button": "Iespējot Paziņojumus",
|
||||
"notification_permission_list_tile_title": "Paziņojumu Atļaujas",
|
||||
"notification_toggle_setting_description": "Ieslēgt e-pasta paziņojumus",
|
||||
"notifications": "Paziņojumi",
|
||||
"notifications_setting_description": "Paziņojumu pārvaldība",
|
||||
|
@ -640,6 +971,7 @@
|
|||
"offline": "Bezsaistē",
|
||||
"ok": "Labi",
|
||||
"oldest_first": "",
|
||||
"on_this_device": "On this device",
|
||||
"online": "Tiešsaistē",
|
||||
"only_favorites": "Tikai izlase",
|
||||
"open_in_map_view": "Atvērt kartes skatā",
|
||||
|
@ -653,6 +985,14 @@
|
|||
"other_variables": "Citi mainīgie",
|
||||
"owned": "Īpašumā",
|
||||
"owner": "Īpašnieks",
|
||||
"partner_list_user_photos": "{user} fotoattēli",
|
||||
"partner_list_view_all": "Apskatīt visu",
|
||||
"partner_page_empty_message": "Jūsu fotogrāfijas pagaidām nav kopīgotas ar nevienu partneri.",
|
||||
"partner_page_no_more_users": "Nav vairs lietotāju, kurus var pievienot",
|
||||
"partner_page_partner_add_failed": "Neizdevās pievienot partneri",
|
||||
"partner_page_select_partner": "Izvēlēties partneri",
|
||||
"partner_page_shared_to_title": "Kopīgots uz",
|
||||
"partner_page_stop_sharing_content": "{} vairs nevarēs piekļūt jūsu fotoattēliem.",
|
||||
"partner_sharing": "",
|
||||
"partners": "",
|
||||
"password": "Parole",
|
||||
|
@ -676,6 +1016,14 @@
|
|||
"permanent_deletion_warning_setting_description": "",
|
||||
"permanently_delete": "",
|
||||
"permanently_deleted_asset": "",
|
||||
"permission_onboarding_back": "Atpakaļ",
|
||||
"permission_onboarding_continue_anyway": "Tomēr turpināt",
|
||||
"permission_onboarding_get_started": "Darba sākšana",
|
||||
"permission_onboarding_go_to_settings": "Doties uz iestatījumiem",
|
||||
"permission_onboarding_permission_denied": "Atļauja liegta. Lai izmantotu Immich, sadaļā Iestatījumi piešķiriet fotoattēlu un video atļaujas.",
|
||||
"permission_onboarding_permission_granted": "Atļauja piešķirta! Jūs esat gatavi darbam.",
|
||||
"permission_onboarding_permission_limited": "Atļauja ierobežota. Lai atļautu Immich dublēšanu un varētu pārvaldīt visu galeriju kolekciju, sadaļā Iestatījumi piešķiriet fotoattēlu un video atļaujas.",
|
||||
"permission_onboarding_request": "Immich nepieciešama atļauja skatīt jūsu fotoattēlus un videoklipus.",
|
||||
"photos": "Fotoattēli",
|
||||
"photos_from_previous_years": "",
|
||||
"pick_a_location": "",
|
||||
|
@ -686,12 +1034,21 @@
|
|||
"play_motion_photo": "",
|
||||
"play_or_pause_video": "",
|
||||
"port": "",
|
||||
"preferences_settings_subtitle": "Manage the app's preferences",
|
||||
"preferences_settings_title": "Iestatījumi",
|
||||
"preset": "",
|
||||
"preview": "",
|
||||
"previous": "",
|
||||
"previous_memory": "",
|
||||
"previous_or_next_photo": "",
|
||||
"primary": "",
|
||||
"profile_drawer_app_logs": "Žurnāli",
|
||||
"profile_drawer_client_out_of_date_major": "Mobilā Aplikācija ir novecojusi. Lūdzu atjaunojiet to uz jaunāko lielo versiju",
|
||||
"profile_drawer_client_out_of_date_minor": "Mobilā Aplikācija ir novecojusi. Lūdzu atjaunojiet to uz jaunāko mazo versiju",
|
||||
"profile_drawer_client_server_up_to_date": "Klients un serveris ir atjaunināti",
|
||||
"profile_drawer_github": "GitHub",
|
||||
"profile_drawer_server_out_of_date_major": "Serveris ir novecojis. Lūdzu atjaunojiet to uz jaunāko lielo versiju",
|
||||
"profile_drawer_server_out_of_date_minor": "Serveris ir novecojis. Lūdzu atjaunojiet to uz jaunāko mazo versiju",
|
||||
"profile_picture_set": "",
|
||||
"public_share": "",
|
||||
"purchase_button_never_show_again": "Nekad vairs nerādīt",
|
||||
|
@ -699,16 +1056,24 @@
|
|||
"purchase_button_remove_key": "Noņemt atslēgu",
|
||||
"purchase_button_select": "Izvēlēties",
|
||||
"purchase_individual_description_2": "Atbalstītāja statuss",
|
||||
"purchase_input_suggestion": "Vai tev ir produkta atslēga? Ievadi atslēgu zemāk",
|
||||
"purchase_license_subtitle": "Nopērc Immich licenci, lai atbalstītu turpmāku pakalpojuma attīstību",
|
||||
"purchase_lifetime_description": "Pirkums uz mūžu",
|
||||
"purchase_option_title": "IEGĀDES IESPĒJAS",
|
||||
"purchase_panel_title": "Atbalstīt projektu",
|
||||
"purchase_remove_product_key": "Noņemt produkta atslēgu",
|
||||
"purchase_remove_server_product_key": "Noņemt servera produkta atslēgu",
|
||||
"purchase_server_description_1": "Visam serverim",
|
||||
"purchase_server_description_2": "Atbalstītāja statuss",
|
||||
"purchase_server_title": "Serveris",
|
||||
"purchase_settings_server_activated": "Servera produkta atslēgu pārvalda administrators",
|
||||
"rating_clear": "Noņemt vērtējumu",
|
||||
"reaction_options": "",
|
||||
"read_changelog": "Lasīt izmaiņu sarakstu",
|
||||
"recent": "",
|
||||
"recent_searches": "",
|
||||
"recently_added": "Recently added",
|
||||
"recently_added_page_title": "Nesen Pievienotais",
|
||||
"refresh": "",
|
||||
"refreshed": "",
|
||||
"refreshes_every_file": "",
|
||||
|
@ -742,10 +1107,12 @@
|
|||
"role_editor": "Redaktors",
|
||||
"role_viewer": "Skatītājs",
|
||||
"save": "Saglabāt",
|
||||
"save_to_gallery": "Save to gallery",
|
||||
"saved_api_key": "API atslēga saglabāta",
|
||||
"saved_profile": "Profils saglabāts",
|
||||
"saved_settings": "Iestatījumi saglabāti",
|
||||
"say_something": "Teikt kaut ko",
|
||||
"scaffold_body_error_occurred": "Radās kļūda",
|
||||
"scan_all_libraries": "",
|
||||
"scan_settings": "",
|
||||
"search": "Meklēt",
|
||||
|
@ -756,12 +1123,41 @@
|
|||
"search_camera_model": "",
|
||||
"search_city": "",
|
||||
"search_country": "",
|
||||
"search_filter_apply": "Lietot filtru",
|
||||
"search_filter_camera_title": "Select camera type",
|
||||
"search_filter_date": "Date",
|
||||
"search_filter_date_interval": "{start} to {end}",
|
||||
"search_filter_date_title": "Select a date range",
|
||||
"search_filter_display_option_not_in_album": "Nav albumā",
|
||||
"search_filter_display_options": "Display Options",
|
||||
"search_filter_filename": "Search by file name",
|
||||
"search_filter_location": "Location",
|
||||
"search_filter_location_title": "Select location",
|
||||
"search_filter_media_type": "Media Type",
|
||||
"search_filter_media_type_title": "Select media type",
|
||||
"search_filter_people_title": "Select people",
|
||||
"search_for_existing_person": "",
|
||||
"search_no_more_result": "No more results",
|
||||
"search_no_people": "Nav cilvēku",
|
||||
"search_no_people_named": "Nav cilvēku ar vārdu \"{name}\"",
|
||||
"search_no_result": "No results found, try a different search term or combination",
|
||||
"search_page_categories": "Kategorijas",
|
||||
"search_page_motion_photos": "Kustību Fotoattēli",
|
||||
"search_page_no_objects": "Informācija par Objektiem nav pieejama",
|
||||
"search_page_no_places": "Nav pieejama Informācija par Vietām",
|
||||
"search_page_screenshots": "Ekrānuzņēmumi",
|
||||
"search_page_search_photos_videos": "Search for your photos and videos",
|
||||
"search_page_selfies": "Selfiji",
|
||||
"search_page_things": "Lietas",
|
||||
"search_page_view_all_button": "Apskatīt visu",
|
||||
"search_page_your_activity": "Jūsu aktivitāte",
|
||||
"search_page_your_map": "Jūsu Karte",
|
||||
"search_people": "Meklēt cilvēkus",
|
||||
"search_places": "",
|
||||
"search_result_page_new_search_hint": "Jauns Meklējums",
|
||||
"search_state": "",
|
||||
"search_suggestion_list_smart_search_hint_1": "Viedā meklēšana ir iespējota pēc noklusējuma, lai meklētu metadatus, izmantojiet sintaksi",
|
||||
"search_suggestion_list_smart_search_hint_2": "m:jūsu-meklēšanas-frāze",
|
||||
"search_timezone": "",
|
||||
"search_type": "",
|
||||
"search_your_photos": "Meklēt Jūsu fotoattēlus",
|
||||
|
@ -776,8 +1172,12 @@
|
|||
"select_library_owner": "",
|
||||
"select_new_face": "",
|
||||
"select_photos": "Fotoattēlu Izvēle",
|
||||
"select_user_for_sharing_page_err_album": "Neizdevās izveidot albumu",
|
||||
"selected": "",
|
||||
"send_message": "",
|
||||
"server_endpoint": "Server Endpoint",
|
||||
"server_info_box_app_version": "Aplikācijas Versija",
|
||||
"server_info_box_server_url": "Servera URL",
|
||||
"server_online": "Serveris tiešsaistē",
|
||||
"server_stats": "Servera statistika",
|
||||
"server_version": "Servera versija",
|
||||
|
@ -787,15 +1187,84 @@
|
|||
"set_date_of_birth": "Iestatīt dzimšanas datumu",
|
||||
"set_profile_picture": "",
|
||||
"set_slideshow_to_fullscreen": "",
|
||||
"setting_image_viewer_help": "Detaļu skatītājs vispirms ielādē mazo sīktēlu, pēc tam ielādē vidēja lieluma priekšskatījumu (ja iespējots), visbeidzot ielādē oriģinālu (ja iespējots).",
|
||||
"setting_image_viewer_original_subtitle": "Iespējojiet sākotnējā pilnas izšķirtspējas attēla (liels!) ielādi. Atspējot lai samazinātu datu lietojumu (gan tīklā, gan ierīces kešatmiņā).",
|
||||
"setting_image_viewer_original_title": "Ielādēt oriģinālo attēlu",
|
||||
"setting_image_viewer_preview_subtitle": "Iespējojiet vidējas izšķirtspējas attēla ielādēšanu. Atspējojiet vai nu tiešu oriģināla ielādi, vai izmantojiet tikai sīktēlu.",
|
||||
"setting_image_viewer_preview_title": "Ielādēt priekšskatījuma attēlu",
|
||||
"setting_image_viewer_title": "Attēli",
|
||||
"setting_languages_apply": "Lietot",
|
||||
"setting_languages_subtitle": "Change the app's language",
|
||||
"setting_languages_title": "Valodas",
|
||||
"setting_notifications_notify_failures_grace_period": "Paziņot par fona dublēšanas kļūmēm: {}",
|
||||
"setting_notifications_notify_hours": "{} stundas",
|
||||
"setting_notifications_notify_immediately": "nekavējoties",
|
||||
"setting_notifications_notify_minutes": "{} minūtes",
|
||||
"setting_notifications_notify_never": "nekad",
|
||||
"setting_notifications_notify_seconds": "{} sekundes",
|
||||
"setting_notifications_single_progress_subtitle": "Detalizēta augšupielādes progresa informācija par katru aktīvu",
|
||||
"setting_notifications_single_progress_title": "Rādīt fona dublējuma detalizēto progresu",
|
||||
"setting_notifications_subtitle": "Paziņojumu preferenču pielāgošana",
|
||||
"setting_notifications_total_progress_subtitle": "Kopējais augšupielādes progress (pabeigti/kopējie aktīvi)",
|
||||
"setting_notifications_total_progress_title": "Rādīt fona dublējuma kopējo progresu",
|
||||
"setting_video_viewer_looping_title": "Cikliski",
|
||||
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
|
||||
"setting_video_viewer_original_video_title": "Force original video",
|
||||
"settings": "Iestatījumi",
|
||||
"settings_require_restart": "Lūdzu, restartējiet Immich, lai lietotu šo iestatījumu",
|
||||
"settings_saved": "",
|
||||
"share": "Kopīgot",
|
||||
"share_add_photos": "Pievienot fotoattēlus",
|
||||
"share_assets_selected": "{} izvēlēti",
|
||||
"share_dialog_preparing": "Notiek sagatavošana...",
|
||||
"shared": "Kopīgots",
|
||||
"shared_album_activities_input_disable": "Komentāri atslēgti",
|
||||
"shared_album_activity_remove_content": "Vai vēlaties šo aktivitāti dzēst?",
|
||||
"shared_album_activity_remove_title": "Dzēst Aktivitāti",
|
||||
"shared_album_section_people_action_error": "Kļūme pametot/noņemot no albuma",
|
||||
"shared_album_section_people_action_leave": "Noņemt lietotāju no albuma",
|
||||
"shared_album_section_people_action_remove_user": "Noņemt lietotāju no albuma",
|
||||
"shared_album_section_people_title": "CILVĒKI",
|
||||
"shared_by": "",
|
||||
"shared_by_you": "",
|
||||
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
|
||||
"shared_link_app_bar_title": "Kopīgotas Saites",
|
||||
"shared_link_clipboard_copied_massage": "Ievietots starpliktuvē",
|
||||
"shared_link_clipboard_text": "Saite: {}\nParole: {}",
|
||||
"shared_link_create_error": "Kļūda izveidojot kopīgošanas saiti",
|
||||
"shared_link_edit_description_hint": "Ievadiet kopīgojuma aprakstu",
|
||||
"shared_link_edit_expire_after_option_day": "1 diena",
|
||||
"shared_link_edit_expire_after_option_days": "{} dienas",
|
||||
"shared_link_edit_expire_after_option_hour": "1 stunda",
|
||||
"shared_link_edit_expire_after_option_hours": "{} stundas",
|
||||
"shared_link_edit_expire_after_option_minute": "1 minūte",
|
||||
"shared_link_edit_expire_after_option_minutes": "{} minūtes",
|
||||
"shared_link_edit_expire_after_option_months": "{} mēneši",
|
||||
"shared_link_edit_expire_after_option_year": "{} gads",
|
||||
"shared_link_edit_password_hint": "Ierakstīt kopīgojuma paroli",
|
||||
"shared_link_edit_submit_button": "Atjaunināt saiti",
|
||||
"shared_link_error_server_url_fetch": "Nevarēja ienest servera URL",
|
||||
"shared_link_expires_day": "Derīguma termiņš beigsies pēc {} dienas",
|
||||
"shared_link_expires_days": "Derīguma termiņš beigsies pēc {} dienām",
|
||||
"shared_link_expires_hour": "Derīguma termiņš beigsies pēc {} stundas",
|
||||
"shared_link_expires_hours": "Derīguma termiņš beigsies pēc {} stundām",
|
||||
"shared_link_expires_minute": "Derīguma termiņš beigsies pēc {} minūtes",
|
||||
"shared_link_expires_minutes": "Derīguma termiņš beidzas pēc {} minūtēm",
|
||||
"shared_link_expires_never": "Derīguma termiņš beigsies ∞",
|
||||
"shared_link_expires_second": "Derīguma termiņš beigsies pēc {} sekundes",
|
||||
"shared_link_expires_seconds": "Derīguma termiņš beidzas pēc {} sekundēm",
|
||||
"shared_link_individual_shared": "Individuāli kopīgots",
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Pārvaldīt Kopīgotās saites",
|
||||
"shared_links": "Kopīgotās saites",
|
||||
"shared_with_me": "Shared with me",
|
||||
"sharing": "Kopīgošana",
|
||||
"sharing_page_album": "Kopīgotie albumi",
|
||||
"sharing_page_description": "Izveidojiet koplietojamus albumus, lai kopīgotu fotoattēlus un videoklipus ar Jūsu tīkla lietotājiem.",
|
||||
"sharing_page_empty_list": "TUKŠS SARAKSTS",
|
||||
"sharing_sidebar_description": "",
|
||||
"sharing_silver_appbar_create_shared_album": "Izveidot kopīgotu albumu",
|
||||
"sharing_silver_appbar_share_partner": "Dalīties ar partneri",
|
||||
"show_album_options": "Rādīt albuma iespējas",
|
||||
"show_albums": "Rādīt albumus",
|
||||
"show_all_people": "Rādīt visus cilvēkus",
|
||||
|
@ -846,10 +1315,26 @@
|
|||
"support_and_feedback": "Atbalsts un atsauksmes",
|
||||
"swap_merge_direction": "",
|
||||
"sync": "Sinhronizēt",
|
||||
"sync_albums": "Sync albums",
|
||||
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
|
||||
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
|
||||
"template": "",
|
||||
"theme": "Dizains",
|
||||
"theme_selection": "",
|
||||
"theme_selection_description": "",
|
||||
"theme_setting_asset_list_storage_indicator_title": "Rādīt krātuves indikatoru uz aktīvu elementiem",
|
||||
"theme_setting_asset_list_tiles_per_row_title": "Aktīvu skaits rindā ({})",
|
||||
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.",
|
||||
"theme_setting_colorful_interface_title": "Colorful interface",
|
||||
"theme_setting_image_viewer_quality_subtitle": "Attēlu skatītāja detaļu kvalitātes pielāgošana",
|
||||
"theme_setting_image_viewer_quality_title": "Attēlu skatītāja kvalitāte",
|
||||
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.",
|
||||
"theme_setting_primary_color_title": "Primary color",
|
||||
"theme_setting_system_primary_color_title": "Use system color",
|
||||
"theme_setting_system_theme_switch": "Automātisks (sekot sistēmas iestatījumiem)",
|
||||
"theme_setting_theme_subtitle": "Izvēlieties programmas dizaina iestatījumu",
|
||||
"theme_setting_three_stage_loading_subtitle": "Trīspakāpju ielāde var palielināt ielādēšanas veiktspēju, bet izraisa ievērojami lielāku tīkla noslodzi",
|
||||
"theme_setting_three_stage_loading_title": "Iespējot trīspakāpju ielādi",
|
||||
"they_will_be_merged_together": "Tās tiks apvienotas",
|
||||
"time_based_memories": "",
|
||||
"timezone": "Laika zona",
|
||||
|
@ -860,7 +1345,15 @@
|
|||
"total_usage": "Kopējais lietojums",
|
||||
"trash": "Atkritne",
|
||||
"trash_all": "Dzēst Visu",
|
||||
"trash_emptied": "Emptied trash",
|
||||
"trash_no_results_message": "",
|
||||
"trash_page_delete_all": "Dzēst Visu",
|
||||
"trash_page_empty_trash_dialog_content": "Vai vēlaties iztukšot savus izmestos aktīvus? Tie tiks neatgriezeniski izņemti no Immich",
|
||||
"trash_page_info": "Atkritnes vienumi tiks neatgriezeniski dzēsti pēc {} dienām",
|
||||
"trash_page_no_assets": "Atkritnē nav aktīvu",
|
||||
"trash_page_restore_all": "Atjaunot Visu",
|
||||
"trash_page_select_assets_btn": "Atlasīt aktīvus",
|
||||
"trash_page_title": "Atkritne ({})",
|
||||
"type": "",
|
||||
"unarchive": "Atarhivēt",
|
||||
"unfavorite": "Noņemt no izlases",
|
||||
|
@ -879,11 +1372,16 @@
|
|||
"updated_password": "Parole ir atjaunināta",
|
||||
"upload": "Augšupielādēt",
|
||||
"upload_concurrency": "",
|
||||
"upload_dialog_info": "Vai vēlaties veikt izvēlētā(-o) aktīva(-u) dublējumu uz servera?",
|
||||
"upload_dialog_title": "Augšupielādēt Aktīvu",
|
||||
"upload_status_duplicates": "Dublikāti",
|
||||
"upload_status_errors": "Kļūdas",
|
||||
"upload_status_uploaded": "Augšupielādēts",
|
||||
"upload_to_immich": "Upload to Immich ({})",
|
||||
"uploading": "Uploading",
|
||||
"url": "",
|
||||
"usage": "Lietojums",
|
||||
"use_current_connection": "use current connection",
|
||||
"user": "Lietotājs",
|
||||
"user_id": "Lietotāja ID",
|
||||
"user_purchase_settings_description": "Pirkuma pārvaldība",
|
||||
|
@ -892,9 +1390,15 @@
|
|||
"users": "Lietotāji",
|
||||
"utilities": "Rīki",
|
||||
"validate": "",
|
||||
"validate_endpoint_error": "Please enter a valid URL",
|
||||
"variables": "",
|
||||
"version": "Versija",
|
||||
"version_announcement_message": "Sveiki! Ir pieejama jauna Immich versija. Lūdzu, veltiet laiku, lai izlasītu <link>laidiena piezīmes</link> un pārliecinātos, ka jūsu iestatījumi ir atjaunināti, lai novērstu jebkādu nepareizu konfigurāciju, jo īpaši, ja izmantojat WatchTower vai citu mehānismu, kas automātiski atjaunina jūsu Immich instanci.",
|
||||
"version_announcement_overlay_release_notes": "informācija par laidienu",
|
||||
"version_announcement_overlay_text_1": "Sveiks draugs, ir jauns izlaidums no",
|
||||
"version_announcement_overlay_text_2": "lūdzu, veltiet laiku, lai apmeklētu",
|
||||
"version_announcement_overlay_text_3": " un pārliecinieties, vai docker-compose un .env iestatījumi ir atjaunināti, lai novērstu jebkādas nepareizas konfigurācijas, īpaši, ja izmantojat WatchTower vai mehānismu, kas automātiski veic servera lietojumprogrammas atjaunināšanu.",
|
||||
"version_announcement_overlay_title": "Pieejama jauna servera versija 🎉",
|
||||
"version_history": "Versiju vēsture",
|
||||
"version_history_item": "{version} uzstādīta {date}",
|
||||
"video": "Videoklips",
|
||||
|
@ -906,11 +1410,16 @@
|
|||
"view_links": "",
|
||||
"view_next_asset": "",
|
||||
"view_previous_asset": "",
|
||||
"viewer_remove_from_stack": "Noņemt no Steka",
|
||||
"viewer_stack_use_as_main_asset": "Izmantot kā Galveno Aktīvu",
|
||||
"viewer_unstack": "At-Stekot",
|
||||
"waiting": "Gaida",
|
||||
"week": "Nedēļa",
|
||||
"welcome_to_immich": "",
|
||||
"wifi_name": "WiFi Name",
|
||||
"year": "Gads",
|
||||
"years_ago": "Pirms {years, plural, one {# gada} other {# gadiem}}",
|
||||
"yes": "Jā",
|
||||
"your_wifi_name": "Your WiFi name",
|
||||
"zoom_image": "Pietuvināt attēlu"
|
||||
}
|
||||
|
|
|
@ -71,12 +71,7 @@
|
|||
"oauth_auto_launch": "Автоматско започнување",
|
||||
"oauth_auto_register": "Автоматска регистрација",
|
||||
"oauth_button_text": "Текст на копче",
|
||||
"oauth_client_id": "Клиентски ID",
|
||||
"oauth_client_secret": "Клиентска тајна",
|
||||
"oauth_issuer_url": "URL на издавач",
|
||||
"oauth_scope": "Опсег",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_signing_algorithm": "Алгоритам за потпишување",
|
||||
"offline_paths": "Офлајн патеки",
|
||||
"password_settings": "Најава со лозинка",
|
||||
"repair_all": "Поправи ги сите",
|
||||
|
|
1
i18n/ml.json
Normal file
1
i18n/ml.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
514
i18n/mn.json
514
i18n/mn.json
|
@ -4,6 +4,7 @@
|
|||
"account_settings": "Бүртгэлийн тохиргоо",
|
||||
"acknowledge": "Ойлголоо",
|
||||
"action": "Үйлдэл",
|
||||
"action_common_update": "Update",
|
||||
"actions": "Үйлдлүүд",
|
||||
"active": "Идэвхтэй",
|
||||
"activity": "Үйлдлийн бүртгэл",
|
||||
|
@ -13,6 +14,7 @@
|
|||
"add_a_location": "Байршил нэмэх",
|
||||
"add_a_name": "Нэр өгөх",
|
||||
"add_a_title": "Гарчиг оруулах",
|
||||
"add_endpoint": "Add endpoint",
|
||||
"add_exclusion_pattern": "",
|
||||
"add_import_path": "",
|
||||
"add_location": "Байршил оруулах",
|
||||
|
@ -22,6 +24,8 @@
|
|||
"add_photos": "Зураг нэмэх",
|
||||
"add_to": "",
|
||||
"add_to_album": "Цомогт оруулах",
|
||||
"add_to_album_bottom_sheet_added": "Added to {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
|
||||
"add_to_shared_album": "Нээлттэй албумд оруулах",
|
||||
"added_to_archive": "Архивд оруулах",
|
||||
"added_to_favorites": "Дуртай зурганд нэмэх",
|
||||
|
@ -115,17 +119,12 @@
|
|||
"oauth_auto_register": "",
|
||||
"oauth_auto_register_description": "",
|
||||
"oauth_button_text": "",
|
||||
"oauth_client_id": "",
|
||||
"oauth_client_secret": "",
|
||||
"oauth_enable_description": "",
|
||||
"oauth_issuer_url": "",
|
||||
"oauth_mobile_redirect_uri": "",
|
||||
"oauth_mobile_redirect_uri_override": "",
|
||||
"oauth_mobile_redirect_uri_override_description": "",
|
||||
"oauth_scope": "",
|
||||
"oauth_settings": "",
|
||||
"oauth_settings_description": "",
|
||||
"oauth_signing_algorithm": "",
|
||||
"oauth_storage_label_claim": "",
|
||||
"oauth_storage_label_claim_description": "",
|
||||
"oauth_storage_quota_claim": "",
|
||||
|
@ -229,9 +228,21 @@
|
|||
"admin_password": "",
|
||||
"administration": "Админ",
|
||||
"advanced": "",
|
||||
"advanced_settings_log_level_title": "Log level: {}",
|
||||
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
|
||||
"advanced_settings_prefer_remote_title": "Prefer remote images",
|
||||
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request",
|
||||
"advanced_settings_proxy_headers_title": "Proxy Headers",
|
||||
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
|
||||
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
|
||||
"advanced_settings_tile_subtitle": "Advanced user's settings",
|
||||
"advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting",
|
||||
"advanced_settings_troubleshooting_title": "Troubleshooting",
|
||||
"album_added": "Цомог нэмэгдлээ",
|
||||
"album_added_notification_setting_description": "",
|
||||
"album_cover_updated": "",
|
||||
"album_info_card_backup_album_excluded": "EXCLUDED",
|
||||
"album_info_card_backup_album_included": "INCLUDED",
|
||||
"album_info_updated": "Цомгийн мэлээлэл шинэчлэгдлээ",
|
||||
"album_leave": "Цомгоос гарах уу?",
|
||||
"album_leave_confirmation": "Та {album} цомгоос гарахдаа итгэлтэй байна уу?",
|
||||
|
@ -239,8 +250,20 @@
|
|||
"album_options": "Цомгийн тохиргоо",
|
||||
"album_remove_user": "Хэрэглэгч хасах уу?",
|
||||
"album_remove_user_confirmation": "{user} хэрэглэгчийг хасахдаа итгэлтэй байна уу?",
|
||||
"album_thumbnail_card_item": "1 item",
|
||||
"album_thumbnail_card_items": "{} items",
|
||||
"album_thumbnail_card_shared": " · Shared",
|
||||
"album_thumbnail_shared_by": "Shared by {}",
|
||||
"album_updated": "",
|
||||
"album_updated_setting_description": "",
|
||||
"album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
|
||||
"album_viewer_appbar_share_err_delete": "Failed to delete album",
|
||||
"album_viewer_appbar_share_err_leave": "Failed to leave album",
|
||||
"album_viewer_appbar_share_err_remove": "There are problems in removing assets from album",
|
||||
"album_viewer_appbar_share_err_title": "Failed to change album title",
|
||||
"album_viewer_appbar_share_leave": "Leave album",
|
||||
"album_viewer_appbar_share_to": "Share To",
|
||||
"album_viewer_page_share_add_users": "Add users",
|
||||
"albums": "Цомгууд",
|
||||
"all": "Бүгд",
|
||||
"all_albums": "Бүх цомог",
|
||||
|
@ -252,53 +275,192 @@
|
|||
"api_key_description": "Энэ утга зөвхөн ганц л удаа харагдана. Цонхоо хаахаас өмнө хуулж аваарай.",
|
||||
"api_key_empty": "Таны API түлхүүрийн нэр хоосон байж болохгүй",
|
||||
"api_keys": "API түлхүүрүүд",
|
||||
"app_bar_signout_dialog_content": "Are you sure you want to sign out?",
|
||||
"app_bar_signout_dialog_ok": "Yes",
|
||||
"app_bar_signout_dialog_title": "Sign out",
|
||||
"app_settings": "Апп-н тохиргоо",
|
||||
"appears_in": "",
|
||||
"archive": "Архив",
|
||||
"archive_or_unarchive_photo": "Зургийг архивт хийх эсвэл гаргах",
|
||||
"archive_page_no_archived_assets": "No archived assets found",
|
||||
"archive_page_title": "Archive ({})",
|
||||
"archive_size": "Архивын хэмжээ",
|
||||
"archive_size_description": "Татах үеийн архивын хэмжээг тохируулах (GiB-р)",
|
||||
"archived": "Archived",
|
||||
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
|
||||
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
|
||||
"asset_added_to_album": "Цомогт нэмсэн",
|
||||
"asset_adding_to_album": "Цомогт нэмж байна...",
|
||||
"asset_list_group_by_sub_title": "Group by",
|
||||
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
|
||||
"asset_list_layout_settings_group_automatically": "Automatic",
|
||||
"asset_list_layout_settings_group_by": "Group assets by",
|
||||
"asset_list_layout_settings_group_by_month_day": "Month + day",
|
||||
"asset_list_layout_sub_title": "Layout",
|
||||
"asset_list_settings_subtitle": "Photo grid layout settings",
|
||||
"asset_list_settings_title": "Photo Grid",
|
||||
"asset_offline": "",
|
||||
"asset_restored_successfully": "Asset restored successfully",
|
||||
"asset_viewer_settings_subtitle": "Manage your gallery viewer settings",
|
||||
"asset_viewer_settings_title": "Asset Viewer",
|
||||
"assets": "",
|
||||
"assets_deleted_permanently": "{} asset(s) deleted permanently",
|
||||
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server",
|
||||
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device",
|
||||
"assets_restored_successfully": "{} asset(s) restored successfully",
|
||||
"assets_trashed": "{} asset(s) trashed",
|
||||
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server",
|
||||
"authorized_devices": "",
|
||||
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
|
||||
"automatic_endpoint_switching_title": "Automatic URL switching",
|
||||
"back": "",
|
||||
"background_location_permission": "Background location permission",
|
||||
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
|
||||
"backup_album_selection_page_albums_device": "Albums on device ({})",
|
||||
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
|
||||
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
|
||||
"backup_album_selection_page_select_albums": "Select albums",
|
||||
"backup_album_selection_page_selection_info": "Selection Info",
|
||||
"backup_album_selection_page_total_assets": "Total unique assets",
|
||||
"backup_all": "All",
|
||||
"backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…",
|
||||
"backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…",
|
||||
"backup_background_service_current_upload_notification": "Uploading {}",
|
||||
"backup_background_service_default_notification": "Checking for new assets…",
|
||||
"backup_background_service_error_title": "Backup error",
|
||||
"backup_background_service_in_progress_notification": "Backing up your assets…",
|
||||
"backup_background_service_upload_failure_notification": "Failed to upload {}",
|
||||
"backup_controller_page_albums": "Backup Albums",
|
||||
"backup_controller_page_background_app_refresh_disabled_content": "Апп нээгээгүй байх үед нөөцлөлт хийх бол Settings > General > Background App Refresh хандаж идэвхижүүлнэ үү.",
|
||||
"backup_controller_page_background_app_refresh_disabled_title": "Апп нээгээгүй байх үед нөөцлөлт идэвхигүй.",
|
||||
"backup_controller_page_background_app_refresh_enable_button_text": "Тохиргоо хэсэгт очих",
|
||||
"backup_controller_page_background_battery_info_link": "Show me how",
|
||||
"backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.",
|
||||
"backup_controller_page_background_battery_info_ok": "OK",
|
||||
"backup_controller_page_background_battery_info_title": "Battery optimizations",
|
||||
"backup_controller_page_background_charging": "Only while charging",
|
||||
"backup_controller_page_background_configure_error": "Failed to configure the background service",
|
||||
"backup_controller_page_background_delay": "Delay new assets backup: {}",
|
||||
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
|
||||
"backup_controller_page_background_is_off": "Automatic background backup is off",
|
||||
"backup_controller_page_background_is_on": "Automatic background backup is on",
|
||||
"backup_controller_page_background_turn_off": "Turn off background service",
|
||||
"backup_controller_page_background_turn_on": "Turn on background service",
|
||||
"backup_controller_page_background_wifi": "Only on WiFi",
|
||||
"backup_controller_page_backup": "Backup",
|
||||
"backup_controller_page_backup_selected": "Selected: ",
|
||||
"backup_controller_page_backup_sub": "Backed up photos and videos",
|
||||
"backup_controller_page_created": "Created on: {}",
|
||||
"backup_controller_page_desc_backup": "Turn on foreground backup to automatically upload new assets to the server when opening the app.",
|
||||
"backup_controller_page_excluded": "Excluded: ",
|
||||
"backup_controller_page_failed": "Failed ({})",
|
||||
"backup_controller_page_filename": "File name: {} [{}]",
|
||||
"backup_controller_page_id": "ID: {}",
|
||||
"backup_controller_page_info": "Backup Information",
|
||||
"backup_controller_page_none_selected": "None selected",
|
||||
"backup_controller_page_remainder": "Remainder",
|
||||
"backup_controller_page_remainder_sub": "Remaining photos and videos to back up from selection",
|
||||
"backup_controller_page_server_storage": "Server Storage",
|
||||
"backup_controller_page_start_backup": "Start Backup",
|
||||
"backup_controller_page_status_off": "Automatic foreground backup is off",
|
||||
"backup_controller_page_status_on": "Automatic foreground backup is on",
|
||||
"backup_controller_page_storage_format": "{} of {} used",
|
||||
"backup_controller_page_to_backup": "Albums to be backed up",
|
||||
"backup_controller_page_total_sub": "All unique photos and videos from selected albums",
|
||||
"backup_controller_page_turn_off": "Turn off foreground backup",
|
||||
"backup_controller_page_turn_on": "Turn on foreground backup",
|
||||
"backup_controller_page_uploading_file_info": "Uploading file info",
|
||||
"backup_err_only_album": "Cannot remove the only album",
|
||||
"backup_info_card_assets": "assets",
|
||||
"backup_manual_cancelled": "Cancelled",
|
||||
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
|
||||
"backup_manual_success": "Success",
|
||||
"backup_manual_title": "Upload status",
|
||||
"backup_options_page_title": "Backup options",
|
||||
"backup_setting_subtitle": "Manage background and foreground upload settings",
|
||||
"backward": "",
|
||||
"blurred_background": "",
|
||||
"buy": "Immich худалдаж авах",
|
||||
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
|
||||
"cache_settings_clear_cache_button": "Clear cache",
|
||||
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
|
||||
"cache_settings_duplicated_assets_clear_button": "CLEAR",
|
||||
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
|
||||
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
|
||||
"cache_settings_image_cache_size": "Image cache size ({} assets)",
|
||||
"cache_settings_statistics_album": "Library thumbnails",
|
||||
"cache_settings_statistics_assets": "{} assets ({})",
|
||||
"cache_settings_statistics_full": "Full images",
|
||||
"cache_settings_statistics_shared": "Shared album thumbnails",
|
||||
"cache_settings_statistics_thumbnail": "Thumbnails",
|
||||
"cache_settings_statistics_title": "Cache usage",
|
||||
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
|
||||
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
|
||||
"cache_settings_tile_subtitle": "Control the local storage behaviour",
|
||||
"cache_settings_tile_title": "Local Storage",
|
||||
"cache_settings_title": "Caching Settings",
|
||||
"camera": "Камер",
|
||||
"camera_brand": "Камерын үйлдвэр",
|
||||
"camera_model": "Камерын загвар",
|
||||
"cancel": "Цуцлах",
|
||||
"cancel_search": "Хайлт цуцлах",
|
||||
"canceled": "Canceled",
|
||||
"cannot_merge_people": "",
|
||||
"cannot_update_the_description": "",
|
||||
"change_date": "Огноо өөрчлөх",
|
||||
"change_display_order": "Change display order",
|
||||
"change_expiration_time": "",
|
||||
"change_location": "Байршил өөрчлөх",
|
||||
"change_name": "Нэр өөрчлөх",
|
||||
"change_name_successfully": "Нэр амжилттай өөрчлөгдлөө",
|
||||
"change_password": "Нууц үг өөрчлөх",
|
||||
"change_password_form_confirm_password": "Confirm Password",
|
||||
"change_password_form_description": "Hi {name},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
|
||||
"change_password_form_new_password": "New Password",
|
||||
"change_password_form_password_mismatch": "Passwords do not match",
|
||||
"change_password_form_reenter_new_password": "Re-enter New Password",
|
||||
"change_your_password": "",
|
||||
"changed_visibility_successfully": "",
|
||||
"check_corrupt_asset_backup": "Check for corrupt asset backups",
|
||||
"check_corrupt_asset_backup_button": "Perform check",
|
||||
"check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.",
|
||||
"check_logs": "",
|
||||
"city": "Хот",
|
||||
"clear": "Цэвэрлэх",
|
||||
"clear_all": "Бүгдийг цэвэрлэх",
|
||||
"clear_message": "",
|
||||
"clear_value": "",
|
||||
"client_cert_dialog_msg_confirm": "OK",
|
||||
"client_cert_enter_password": "Enter Password",
|
||||
"client_cert_import": "Import",
|
||||
"client_cert_import_success_msg": "Client certificate is imported",
|
||||
"client_cert_invalid_msg": "Invalid certificate file or wrong password",
|
||||
"client_cert_remove_msg": "Client certificate is removed",
|
||||
"client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login",
|
||||
"client_cert_title": "SSL Client Certificate",
|
||||
"close": "",
|
||||
"collapse_all": "",
|
||||
"color_theme": "",
|
||||
"comment_options": "",
|
||||
"comments_are_disabled": "",
|
||||
"common_create_new_album": "Create new album",
|
||||
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
|
||||
"completed": "Completed",
|
||||
"confirm": "",
|
||||
"confirm_admin_password": "",
|
||||
"confirm_password": "",
|
||||
"contain": "",
|
||||
"context": "",
|
||||
"continue": "",
|
||||
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
|
||||
"control_bottom_app_bar_create_new_album": "Create new album",
|
||||
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
|
||||
"control_bottom_app_bar_delete_from_local": "Delete from device",
|
||||
"control_bottom_app_bar_edit_location": "Edit Location",
|
||||
"control_bottom_app_bar_edit_time": "Edit Date & Time",
|
||||
"control_bottom_app_bar_share_link": "Share Link",
|
||||
"control_bottom_app_bar_share_to": "Share To",
|
||||
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
|
||||
"copied_image_to_clipboard": "",
|
||||
"copy_error": "",
|
||||
"copy_file_path": "",
|
||||
|
@ -312,33 +474,54 @@
|
|||
"covers": "",
|
||||
"create": "",
|
||||
"create_album": "",
|
||||
"create_album_page_untitled": "Untitled",
|
||||
"create_library": "",
|
||||
"create_link": "",
|
||||
"create_link_to_share": "",
|
||||
"create_new": "CREATE NEW",
|
||||
"create_new_person": "",
|
||||
"create_new_user": "",
|
||||
"create_shared_album_page_share_add_assets": "ADD ASSETS",
|
||||
"create_shared_album_page_share_select_photos": "Select Photos",
|
||||
"create_user": "",
|
||||
"created": "",
|
||||
"crop": "Crop",
|
||||
"curated_object_page_title": "Things",
|
||||
"current_device": "",
|
||||
"current_server_address": "Current server address",
|
||||
"custom_locale": "",
|
||||
"custom_locale_description": "",
|
||||
"daily_title_text_date": "E, MMM dd",
|
||||
"daily_title_text_date_year": "E, MMM dd, yyyy",
|
||||
"dark": "",
|
||||
"date_after": "",
|
||||
"date_and_time": "",
|
||||
"date_before": "",
|
||||
"date_format": "E, LLL d, y • h:mm a",
|
||||
"date_range": "",
|
||||
"day": "",
|
||||
"default_locale": "",
|
||||
"default_locale_description": "",
|
||||
"delete": "",
|
||||
"delete_album": "",
|
||||
"delete_dialog_alert": "These items will be permanently deleted from Immich and from your device",
|
||||
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
|
||||
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
|
||||
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
|
||||
"delete_dialog_ok_force": "Delete Anyway",
|
||||
"delete_dialog_title": "Delete Permanently",
|
||||
"delete_key": "",
|
||||
"delete_library": "",
|
||||
"delete_link": "",
|
||||
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
|
||||
"delete_local_dialog_ok_force": "Delete Anyway",
|
||||
"delete_shared_link": "",
|
||||
"delete_shared_link_dialog_title": "Delete Shared Link",
|
||||
"delete_user": "",
|
||||
"deleted_shared_link": "",
|
||||
"description": "",
|
||||
"description_input_hint_text": "Add description...",
|
||||
"description_input_submit_error": "Error updating description, check the log for more details",
|
||||
"details": "",
|
||||
"direction": "",
|
||||
"disallow_edits": "",
|
||||
|
@ -351,7 +534,21 @@
|
|||
"display_original_photos_setting_description": "",
|
||||
"done": "",
|
||||
"download": "",
|
||||
"download_canceled": "Download canceled",
|
||||
"download_complete": "Download complete",
|
||||
"download_enqueue": "Download enqueued",
|
||||
"download_error": "Download Error",
|
||||
"download_failed": "Download failed",
|
||||
"download_filename": "file: {}",
|
||||
"download_finished": "Download finished",
|
||||
"download_notfound": "Download not found",
|
||||
"download_paused": "Download paused",
|
||||
"download_started": "Download started",
|
||||
"download_sucess": "Download success",
|
||||
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
|
||||
"download_waiting_to_retry": "Waiting to retry",
|
||||
"downloading": "",
|
||||
"downloading_media": "Downloading media",
|
||||
"duration": "",
|
||||
"edit_album": "",
|
||||
"edit_avatar": "",
|
||||
|
@ -364,6 +561,7 @@
|
|||
"edit_key": "",
|
||||
"edit_link": "",
|
||||
"edit_location": "",
|
||||
"edit_location_dialog_title": "Location",
|
||||
"edit_name": "",
|
||||
"edit_people": "",
|
||||
"edit_title": "",
|
||||
|
@ -371,12 +569,17 @@
|
|||
"edited": "",
|
||||
"editor": "",
|
||||
"email": "",
|
||||
"empty_folder": "This folder is empty",
|
||||
"empty_trash": "Хогийн сав хоослох",
|
||||
"enable": "",
|
||||
"enabled": "",
|
||||
"end_date": "",
|
||||
"enqueued": "Enqueued",
|
||||
"enter_wifi_name": "Enter WiFi name",
|
||||
"error": "",
|
||||
"error_change_sort_album": "Failed to change album sort order",
|
||||
"error_loading_image": "",
|
||||
"error_saving_image": "Error: {}",
|
||||
"errors": {
|
||||
"unable_to_add_album_users": "",
|
||||
"unable_to_add_comment": "",
|
||||
|
@ -425,37 +628,90 @@
|
|||
"unable_to_update_settings": "",
|
||||
"unable_to_update_user": ""
|
||||
},
|
||||
"exif_bottom_sheet_description": "Add Description...",
|
||||
"exif_bottom_sheet_details": "DETAILS",
|
||||
"exif_bottom_sheet_location": "LOCATION",
|
||||
"exif_bottom_sheet_people": "PEOPLE",
|
||||
"exif_bottom_sheet_person_add_person": "Add name",
|
||||
"exif_bottom_sheet_person_age": "Age {}",
|
||||
"exif_bottom_sheet_person_age_months": "Age {} months",
|
||||
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months",
|
||||
"exif_bottom_sheet_person_age_years": "Age {}",
|
||||
"exit_slideshow": "",
|
||||
"expand_all": "",
|
||||
"experimental_settings_new_asset_list_subtitle": "Work in progress",
|
||||
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
|
||||
"experimental_settings_subtitle": "Use at your own risk!",
|
||||
"experimental_settings_title": "Experimental",
|
||||
"expire_after": "",
|
||||
"expired": "",
|
||||
"explore": "Эрж олох",
|
||||
"extension": "",
|
||||
"external_libraries": "",
|
||||
"external_network": "External network",
|
||||
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
|
||||
"failed": "Failed",
|
||||
"failed_to_load_assets": "Failed to load assets",
|
||||
"failed_to_load_folder": "Failed to load folder",
|
||||
"favorite": "",
|
||||
"favorite_or_unfavorite_photo": "",
|
||||
"favorites": "Дуртай",
|
||||
"favorites_page_no_favorites": "No favorite assets found",
|
||||
"feature_photo_updated": "",
|
||||
"file_name": "",
|
||||
"file_name_or_extension": "",
|
||||
"filename": "",
|
||||
"filetype": "",
|
||||
"filter": "Filter",
|
||||
"filter_people": "",
|
||||
"fix_incorrect_match": "",
|
||||
"folder": "Folder",
|
||||
"folder_not_found": "Folder not found",
|
||||
"folders": "Folders",
|
||||
"forward": "",
|
||||
"general": "",
|
||||
"get_help": "",
|
||||
"get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network",
|
||||
"getting_started": "",
|
||||
"go_back": "",
|
||||
"go_to_search": "",
|
||||
"grant_permission": "Grant permission",
|
||||
"group_albums_by": "",
|
||||
"haptic_feedback_switch": "Enable haptic feedback",
|
||||
"haptic_feedback_title": "Haptic Feedback",
|
||||
"has_quota": "",
|
||||
"header_settings_add_header_tip": "Add Header",
|
||||
"header_settings_field_validator_msg": "Value cannot be empty",
|
||||
"header_settings_header_name_input": "Header name",
|
||||
"header_settings_header_value_input": "Header value",
|
||||
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request",
|
||||
"headers_settings_tile_title": "Custom proxy headers",
|
||||
"hide_gallery": "",
|
||||
"hide_password": "",
|
||||
"hide_person": "",
|
||||
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
|
||||
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
|
||||
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
|
||||
"home_page_album_err_partner": "Can not add partner assets to an album yet, skipping",
|
||||
"home_page_archive_err_local": "Can not archive local assets yet, skipping",
|
||||
"home_page_archive_err_partner": "Can not archive partner assets, skipping",
|
||||
"home_page_building_timeline": "Building the timeline",
|
||||
"home_page_delete_err_partner": "Can not delete partner assets, skipping",
|
||||
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
|
||||
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
|
||||
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
|
||||
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
|
||||
"home_page_share_err_local": "Can not share local assets via link, skipping",
|
||||
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
|
||||
"host": "",
|
||||
"hour": "",
|
||||
"ignore_icloud_photos": "Ignore iCloud photos",
|
||||
"ignore_icloud_photos_description": "Photos that are stored on iCloud will not be uploaded to the Immich server",
|
||||
"image": "",
|
||||
"image_saved_successfully": "Image saved",
|
||||
"image_viewer_page_state_provider_download_started": "Download Started",
|
||||
"image_viewer_page_state_provider_download_success": "Download Success",
|
||||
"image_viewer_page_state_provider_share_error": "Share Error",
|
||||
"immich_logo": "",
|
||||
"import_path": "",
|
||||
"in_archive": "",
|
||||
|
@ -470,6 +726,8 @@
|
|||
"night_at_midnight": "",
|
||||
"night_at_twoam": ""
|
||||
},
|
||||
"invalid_date": "Invalid date",
|
||||
"invalid_date_format": "Invalid date format",
|
||||
"invite_people": "Хүмүүс урих",
|
||||
"invite_to_album": "",
|
||||
"jobs": "",
|
||||
|
@ -483,6 +741,12 @@
|
|||
"level": "",
|
||||
"library": "Зургийн сан",
|
||||
"library_options": "",
|
||||
"library_page_device_albums": "Albums on Device",
|
||||
"library_page_new_album": "New album",
|
||||
"library_page_sort_asset_count": "Number of assets",
|
||||
"library_page_sort_created": "Created date",
|
||||
"library_page_sort_last_modified": "Last modified",
|
||||
"library_page_sort_title": "Album title",
|
||||
"light": "",
|
||||
"link_options": "",
|
||||
"link_to_oauth": "",
|
||||
|
@ -490,9 +754,39 @@
|
|||
"list": "",
|
||||
"loading": "",
|
||||
"loading_search_results_failed": "",
|
||||
"local_network": "Local network",
|
||||
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
|
||||
"location_permission": "Location permission",
|
||||
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name",
|
||||
"location_picker_choose_on_map": "Choose on map",
|
||||
"location_picker_latitude_error": "Enter a valid latitude",
|
||||
"location_picker_latitude_hint": "Enter your latitude here",
|
||||
"location_picker_longitude_error": "Enter a valid longitude",
|
||||
"location_picker_longitude_hint": "Enter your longitude here",
|
||||
"log_out": "",
|
||||
"log_out_all_devices": "",
|
||||
"login_disabled": "Login has been disabled",
|
||||
"login_form_api_exception": "API exception. Please check the server URL and try again.",
|
||||
"login_form_back_button_text": "Back",
|
||||
"login_form_email_hint": "youremail@email.com",
|
||||
"login_form_endpoint_hint": "http://your-server-ip:port",
|
||||
"login_form_endpoint_url": "Server Endpoint URL",
|
||||
"login_form_err_http": "Please specify http:// or https://",
|
||||
"login_form_err_invalid_email": "Invalid Email",
|
||||
"login_form_err_invalid_url": "Invalid URL",
|
||||
"login_form_err_leading_whitespace": "Leading whitespace",
|
||||
"login_form_err_trailing_whitespace": "Trailing whitespace",
|
||||
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
|
||||
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
|
||||
"login_form_failed_login": "Error logging you in, check server URL, email and password",
|
||||
"login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
|
||||
"login_form_password_hint": "password",
|
||||
"login_form_save_login": "Stay logged in",
|
||||
"login_form_server_empty": "Enter a server URL.",
|
||||
"login_form_server_error": "Could not connect to server.",
|
||||
"login_has_been_disabled": "",
|
||||
"login_password_changed_error": "There was an error updating your password",
|
||||
"login_password_changed_success": "Password updated successfully",
|
||||
"look": "",
|
||||
"loop_videos": "",
|
||||
"loop_videos_description": "",
|
||||
|
@ -505,11 +799,38 @@
|
|||
"manage_your_devices": "",
|
||||
"manage_your_oauth_connection": "",
|
||||
"map": "",
|
||||
"map_assets_in_bound": "{} photo",
|
||||
"map_assets_in_bounds": "{} photos",
|
||||
"map_cannot_get_user_location": "Cannot get user's location",
|
||||
"map_location_dialog_yes": "Yes",
|
||||
"map_location_picker_page_use_location": "Use this location",
|
||||
"map_location_service_disabled_content": "Location service needs to be enabled to display assets from your current location. Do you want to enable it now?",
|
||||
"map_location_service_disabled_title": "Location Service disabled",
|
||||
"map_marker_with_image": "",
|
||||
"map_no_assets_in_bounds": "No photos in this area",
|
||||
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
|
||||
"map_no_location_permission_title": "Location Permission denied",
|
||||
"map_settings": "",
|
||||
"map_settings_dark_mode": "Dark mode",
|
||||
"map_settings_date_range_option_day": "Past 24 hours",
|
||||
"map_settings_date_range_option_days": "Past {} days",
|
||||
"map_settings_date_range_option_year": "Past year",
|
||||
"map_settings_date_range_option_years": "Past {} years",
|
||||
"map_settings_dialog_title": "Map Settings",
|
||||
"map_settings_include_show_archived": "Include Archived",
|
||||
"map_settings_include_show_partners": "Include Partners",
|
||||
"map_settings_only_show_favorites": "Show Favorite Only",
|
||||
"map_settings_theme_settings": "Map Theme",
|
||||
"map_zoom_to_see_photos": "Zoom out to see photos",
|
||||
"media_type": "",
|
||||
"memories": "",
|
||||
"memories_all_caught_up": "All caught up",
|
||||
"memories_check_back_tomorrow": "Check back tomorrow for more memories",
|
||||
"memories_setting_description": "",
|
||||
"memories_start_over": "Start Over",
|
||||
"memories_swipe_to_close": "Swipe up to close",
|
||||
"memories_year_ago": "A year ago",
|
||||
"memories_years_ago": "{} years ago",
|
||||
"menu": "",
|
||||
"merge": "",
|
||||
"merge_people": "",
|
||||
|
@ -519,11 +840,16 @@
|
|||
"missing": "",
|
||||
"model": "",
|
||||
"month": "",
|
||||
"monthly_title_text_date_format": "MMMM y",
|
||||
"more": "",
|
||||
"moved_to_trash": "",
|
||||
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
|
||||
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
|
||||
"my_albums": "",
|
||||
"name": "",
|
||||
"name_or_nickname": "",
|
||||
"networking_settings": "Networking",
|
||||
"networking_subtitle": "Manage the server endpoint settings",
|
||||
"never": "",
|
||||
"new_api_key": "",
|
||||
"new_password": "",
|
||||
|
@ -536,6 +862,7 @@
|
|||
"no_albums_message": "",
|
||||
"no_archived_assets_message": "",
|
||||
"no_assets_message": "Энд дарж та эхний зургаа хуулж үзэх үү",
|
||||
"no_assets_to_show": "No assets to show",
|
||||
"no_exif_info_available": "",
|
||||
"no_explore_results_message": "Зураг хуулж оруулсаны дараа ашиглах боломжтой болно.",
|
||||
"no_favorites_message": "",
|
||||
|
@ -545,7 +872,12 @@
|
|||
"no_results": "",
|
||||
"no_shared_albums_message": "",
|
||||
"not_in_any_album": "",
|
||||
"not_selected": "Not selected",
|
||||
"notes": "",
|
||||
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
|
||||
"notification_permission_list_tile_content": "Мэдэгдэл нээх эрх өгнө үү.\n",
|
||||
"notification_permission_list_tile_enable_button": "Мэдэгдэл нээх",
|
||||
"notification_permission_list_tile_title": "Мэдэгдлийн эрх",
|
||||
"notification_toggle_setting_description": "",
|
||||
"notifications": "",
|
||||
"notifications_setting_description": "",
|
||||
|
@ -553,6 +885,7 @@
|
|||
"offline": "",
|
||||
"ok": "",
|
||||
"oldest_first": "",
|
||||
"on_this_device": "On this device",
|
||||
"online": "",
|
||||
"only_favorites": "Зөвхөн дуртай зурагнууд",
|
||||
"open_the_search_filters": "",
|
||||
|
@ -563,6 +896,14 @@
|
|||
"other_variables": "",
|
||||
"owned": "",
|
||||
"owner": "",
|
||||
"partner_list_user_photos": "{user}'s photos",
|
||||
"partner_list_view_all": "View all",
|
||||
"partner_page_empty_message": "Your photos are not yet shared with any partner.",
|
||||
"partner_page_no_more_users": "No more users to add",
|
||||
"partner_page_partner_add_failed": "Failed to add partner",
|
||||
"partner_page_select_partner": "Select partner",
|
||||
"partner_page_shared_to_title": "Shared to",
|
||||
"partner_page_stop_sharing_content": "{} will no longer be able to access your photos.",
|
||||
"partner_sharing": "",
|
||||
"partners": "",
|
||||
"password": "",
|
||||
|
@ -586,6 +927,14 @@
|
|||
"permanent_deletion_warning_setting_description": "",
|
||||
"permanently_delete": "",
|
||||
"permanently_deleted_asset": "",
|
||||
"permission_onboarding_back": "Back",
|
||||
"permission_onboarding_continue_anyway": "Continue anyway",
|
||||
"permission_onboarding_get_started": "Get started",
|
||||
"permission_onboarding_go_to_settings": "Go to settings",
|
||||
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
|
||||
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
|
||||
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
|
||||
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
|
||||
"photos": "",
|
||||
"photos_from_previous_years": "",
|
||||
"pick_a_location": "",
|
||||
|
@ -596,18 +945,29 @@
|
|||
"play_motion_photo": "",
|
||||
"play_or_pause_video": "",
|
||||
"port": "",
|
||||
"preferences_settings_subtitle": "Manage the app's preferences",
|
||||
"preferences_settings_title": "Preferences",
|
||||
"preset": "",
|
||||
"preview": "",
|
||||
"previous": "",
|
||||
"previous_memory": "",
|
||||
"previous_or_next_photo": "",
|
||||
"primary": "",
|
||||
"profile_drawer_app_logs": "Logs",
|
||||
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
|
||||
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
|
||||
"profile_drawer_client_server_up_to_date": "Client and Server are up-to-date",
|
||||
"profile_drawer_github": "GitHub",
|
||||
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
|
||||
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
|
||||
"profile_picture_set": "",
|
||||
"public_share": "",
|
||||
"reaction_options": "",
|
||||
"read_changelog": "",
|
||||
"recent": "",
|
||||
"recent_searches": "",
|
||||
"recently_added": "Recently added",
|
||||
"recently_added_page_title": "Recently Added",
|
||||
"refresh": "",
|
||||
"refreshed": "",
|
||||
"refreshes_every_file": "",
|
||||
|
@ -631,9 +991,11 @@
|
|||
"review_duplicates": "",
|
||||
"role": "",
|
||||
"save": "",
|
||||
"save_to_gallery": "Save to gallery",
|
||||
"saved_profile": "",
|
||||
"saved_settings": "",
|
||||
"say_something": "",
|
||||
"scaffold_body_error_occurred": "Error occurred",
|
||||
"scan_all_libraries": "",
|
||||
"scan_settings": "",
|
||||
"search": "",
|
||||
|
@ -643,10 +1005,39 @@
|
|||
"search_camera_model": "",
|
||||
"search_city": "",
|
||||
"search_country": "",
|
||||
"search_filter_apply": "Apply filter",
|
||||
"search_filter_camera_title": "Select camera type",
|
||||
"search_filter_date": "Date",
|
||||
"search_filter_date_interval": "{start} to {end}",
|
||||
"search_filter_date_title": "Select a date range",
|
||||
"search_filter_display_option_not_in_album": "Not in album",
|
||||
"search_filter_display_options": "Display Options",
|
||||
"search_filter_filename": "Search by file name",
|
||||
"search_filter_location": "Location",
|
||||
"search_filter_location_title": "Select location",
|
||||
"search_filter_media_type": "Media Type",
|
||||
"search_filter_media_type_title": "Select media type",
|
||||
"search_filter_people_title": "Select people",
|
||||
"search_for_existing_person": "",
|
||||
"search_no_more_result": "No more results",
|
||||
"search_no_result": "No results found, try a different search term or combination",
|
||||
"search_page_categories": "Categories",
|
||||
"search_page_motion_photos": "Motion Photos",
|
||||
"search_page_no_objects": "No Objects Info Available",
|
||||
"search_page_no_places": "No Places Info Available",
|
||||
"search_page_screenshots": "Screenshots",
|
||||
"search_page_search_photos_videos": "Search for your photos and videos",
|
||||
"search_page_selfies": "Selfies",
|
||||
"search_page_things": "Things",
|
||||
"search_page_view_all_button": "View all",
|
||||
"search_page_your_activity": "Your activity",
|
||||
"search_page_your_map": "Your Map",
|
||||
"search_people": "",
|
||||
"search_places": "Байршил хайх",
|
||||
"search_result_page_new_search_hint": "New Search",
|
||||
"search_state": "",
|
||||
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
|
||||
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
|
||||
"search_timezone": "",
|
||||
"search_type": "",
|
||||
"search_your_photos": "Зурагнуудаасаа хайлт хийх",
|
||||
|
@ -660,8 +1051,12 @@
|
|||
"select_library_owner": "",
|
||||
"select_new_face": "",
|
||||
"select_photos": "",
|
||||
"select_user_for_sharing_page_err_album": "Failed to create album",
|
||||
"selected": "",
|
||||
"send_message": "",
|
||||
"server_endpoint": "Server Endpoint",
|
||||
"server_info_box_app_version": "App Version",
|
||||
"server_info_box_server_url": "Server URL",
|
||||
"server_online": "Сервер Онлайн",
|
||||
"server_stats": "",
|
||||
"set": "",
|
||||
|
@ -670,15 +1065,84 @@
|
|||
"set_date_of_birth": "",
|
||||
"set_profile_picture": "",
|
||||
"set_slideshow_to_fullscreen": "",
|
||||
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
|
||||
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
|
||||
"setting_image_viewer_original_title": "Load original image",
|
||||
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
|
||||
"setting_image_viewer_preview_title": "Load preview image",
|
||||
"setting_image_viewer_title": "Images",
|
||||
"setting_languages_apply": "Apply",
|
||||
"setting_languages_subtitle": "Change the app's language",
|
||||
"setting_languages_title": "Languages",
|
||||
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
|
||||
"setting_notifications_notify_hours": "{} hours",
|
||||
"setting_notifications_notify_immediately": "immediately",
|
||||
"setting_notifications_notify_minutes": "{} minutes",
|
||||
"setting_notifications_notify_never": "never",
|
||||
"setting_notifications_notify_seconds": "{} seconds",
|
||||
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
|
||||
"setting_notifications_single_progress_title": "Show background backup detail progress",
|
||||
"setting_notifications_subtitle": "Adjust your notification preferences",
|
||||
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
|
||||
"setting_notifications_total_progress_title": "Show background backup total progress",
|
||||
"setting_video_viewer_looping_title": "Looping",
|
||||
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
|
||||
"setting_video_viewer_original_video_title": "Force original video",
|
||||
"settings": "Тохиргоо",
|
||||
"settings_require_restart": "Please restart Immich to apply this setting",
|
||||
"settings_saved": "",
|
||||
"share": "",
|
||||
"share_add_photos": "Add photos",
|
||||
"share_assets_selected": "{} selected",
|
||||
"share_dialog_preparing": "Preparing...",
|
||||
"shared": "",
|
||||
"shared_album_activities_input_disable": "Comment is disabled",
|
||||
"shared_album_activity_remove_content": "Do you want to delete this activity?",
|
||||
"shared_album_activity_remove_title": "Delete Activity",
|
||||
"shared_album_section_people_action_error": "Error leaving/removing from album",
|
||||
"shared_album_section_people_action_leave": "Remove user from album",
|
||||
"shared_album_section_people_action_remove_user": "Remove user from album",
|
||||
"shared_album_section_people_title": "PEOPLE",
|
||||
"shared_by": "",
|
||||
"shared_by_you": "",
|
||||
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
|
||||
"shared_link_app_bar_title": "Shared Links",
|
||||
"shared_link_clipboard_copied_massage": "Copied to clipboard",
|
||||
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
|
||||
"shared_link_create_error": "Error while creating shared link",
|
||||
"shared_link_edit_description_hint": "Enter the share description",
|
||||
"shared_link_edit_expire_after_option_day": "1 day",
|
||||
"shared_link_edit_expire_after_option_days": "{} days",
|
||||
"shared_link_edit_expire_after_option_hour": "1 hour",
|
||||
"shared_link_edit_expire_after_option_hours": "{} hours",
|
||||
"shared_link_edit_expire_after_option_minute": "1 minute",
|
||||
"shared_link_edit_expire_after_option_minutes": "{} minutes",
|
||||
"shared_link_edit_expire_after_option_months": "{} months",
|
||||
"shared_link_edit_expire_after_option_year": "{} year",
|
||||
"shared_link_edit_password_hint": "Enter the share password",
|
||||
"shared_link_edit_submit_button": "Update link",
|
||||
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
|
||||
"shared_link_expires_day": "Expires in {} day",
|
||||
"shared_link_expires_days": "Expires in {} days",
|
||||
"shared_link_expires_hour": "Expires in {} hour",
|
||||
"shared_link_expires_hours": "Expires in {} hours",
|
||||
"shared_link_expires_minute": "Expires in {} minute",
|
||||
"shared_link_expires_minutes": "Expires in {} minutes",
|
||||
"shared_link_expires_never": "Expires ∞",
|
||||
"shared_link_expires_second": "Expires in {} second",
|
||||
"shared_link_expires_seconds": "Expires in {} seconds",
|
||||
"shared_link_individual_shared": "Individual shared",
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Manage Shared links",
|
||||
"shared_links": "",
|
||||
"shared_with_me": "Shared with me",
|
||||
"sharing": "Хуваалцах",
|
||||
"sharing_page_album": "Shared albums",
|
||||
"sharing_page_description": "Create shared albums to share photos and videos with people in your network.",
|
||||
"sharing_page_empty_list": "EMPTY LIST",
|
||||
"sharing_sidebar_description": "",
|
||||
"sharing_silver_appbar_create_shared_album": "New shared album",
|
||||
"sharing_silver_appbar_share_partner": "Share with partner",
|
||||
"show_album_options": "",
|
||||
"show_file_location": "",
|
||||
"show_gallery": "",
|
||||
|
@ -715,10 +1179,26 @@
|
|||
"sunrise_on_the_beach": "",
|
||||
"swap_merge_direction": "",
|
||||
"sync": "",
|
||||
"sync_albums": "Sync albums",
|
||||
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
|
||||
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
|
||||
"template": "",
|
||||
"theme": "",
|
||||
"theme_selection": "",
|
||||
"theme_selection_description": "",
|
||||
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
|
||||
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
|
||||
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.",
|
||||
"theme_setting_colorful_interface_title": "Colorful interface",
|
||||
"theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer",
|
||||
"theme_setting_image_viewer_quality_title": "Image viewer quality",
|
||||
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.",
|
||||
"theme_setting_primary_color_title": "Primary color",
|
||||
"theme_setting_system_primary_color_title": "Use system color",
|
||||
"theme_setting_system_theme_switch": "Automatic (Follow system setting)",
|
||||
"theme_setting_theme_subtitle": "Choose the app's theme setting",
|
||||
"theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load",
|
||||
"theme_setting_three_stage_loading_title": "Enable three-stage loading",
|
||||
"time_based_memories": "",
|
||||
"timezone": "",
|
||||
"toggle_settings": "",
|
||||
|
@ -726,7 +1206,15 @@
|
|||
"total_usage": "",
|
||||
"trash": "Хогийн сав",
|
||||
"trash_all": "",
|
||||
"trash_emptied": "Emptied trash",
|
||||
"trash_no_results_message": "",
|
||||
"trash_page_delete_all": "Delete All",
|
||||
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
|
||||
"trash_page_info": "Trashed items will be permanently deleted after {} days",
|
||||
"trash_page_no_assets": "No trashed assets",
|
||||
"trash_page_restore_all": "Restore All",
|
||||
"trash_page_select_assets_btn": "Select assets",
|
||||
"trash_page_title": "Trash ({})",
|
||||
"type": "",
|
||||
"unarchive": "",
|
||||
"unfavorite": "",
|
||||
|
@ -741,8 +1229,13 @@
|
|||
"updated_password": "",
|
||||
"upload": "Зураг хуулах",
|
||||
"upload_concurrency": "",
|
||||
"upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
|
||||
"upload_dialog_title": "Upload Asset",
|
||||
"upload_to_immich": "Upload to Immich ({})",
|
||||
"uploading": "Uploading",
|
||||
"url": "",
|
||||
"usage": "",
|
||||
"use_current_connection": "use current connection",
|
||||
"user": "",
|
||||
"user_id": "",
|
||||
"user_usage_detail": "",
|
||||
|
@ -750,8 +1243,14 @@
|
|||
"users": "",
|
||||
"utilities": "Багаж хэрэгсэл",
|
||||
"validate": "",
|
||||
"validate_endpoint_error": "Please enter a valid URL",
|
||||
"variables": "",
|
||||
"version": "",
|
||||
"version_announcement_overlay_release_notes": "release notes",
|
||||
"version_announcement_overlay_text_1": "Hi friend, there is a new release of",
|
||||
"version_announcement_overlay_text_2": "please take your time to visit the ",
|
||||
"version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.",
|
||||
"version_announcement_overlay_title": "New Server Version Available 🎉",
|
||||
"video": "",
|
||||
"video_hover_setting_description": "",
|
||||
"videos": "",
|
||||
|
@ -760,14 +1259,19 @@
|
|||
"view_links": "",
|
||||
"view_next_asset": "",
|
||||
"view_previous_asset": "",
|
||||
"viewer_remove_from_stack": "Remove from Stack",
|
||||
"viewer_stack_use_as_main_asset": "Use as Main Asset",
|
||||
"viewer_unstack": "Un-Stack",
|
||||
"waiting": "Хүлээж байна",
|
||||
"warning": "Анхааруулга",
|
||||
"week": "Долоо хоног",
|
||||
"welcome": "Тавтай морил",
|
||||
"welcome_to_immich": "Тавтай морилно уу",
|
||||
"wifi_name": "WiFi Name",
|
||||
"year": "Он",
|
||||
"years_ago": "{years, plural, one {# year} other {# years}} өмнө",
|
||||
"yes": "Тийм",
|
||||
"you_dont_have_any_shared_links": "Танд хуваалцсан холбоос алга",
|
||||
"your_wifi_name": "Your WiFi name",
|
||||
"zoom_image": "Зургийг томруулж харах"
|
||||
}
|
||||
|
|
19
i18n/ms.json
19
i18n/ms.json
|
@ -22,6 +22,7 @@
|
|||
"add_photos": "Tambah gambar",
|
||||
"add_to": "Tambah ke…",
|
||||
"add_to_album": "Tambah ke album",
|
||||
"add_to_album_bottom_sheet_already_exists": "Sudah ada di {album}",
|
||||
"add_to_shared_album": "Tambah ke album yang dikongsi",
|
||||
"add_url": "Tambah URL",
|
||||
"added_to_archive": "Tambah ke arkib",
|
||||
|
@ -65,6 +66,11 @@
|
|||
"forcing_refresh_library_files": "Memaksa muat semula semua fail perpustakaan",
|
||||
"image_format": "Format",
|
||||
"image_format_description": "WebP menghasilkan fail yang lebih kecil daripada JPEG, tetapi lebih perlahan untuk mengekod.",
|
||||
"image_fullsize_description": "Imej bersaiz penuh dengan metadata yang dilucutkan, digunakan apabila dizum masuk",
|
||||
"image_fullsize_enabled": "Dayakan penjanaan imej bersaiz penuh",
|
||||
"image_fullsize_enabled_description": "Hasilkan imej bersaiz penuh untuk format tidak mesra web. Apabila \"Lebih suka pratonton terbenam\" didayakan, pratonton terbenam digunakan secara langsung tanpa penukaran. Tidak menjejaskan format mesra web seperti JPEG.",
|
||||
"image_fullsize_quality_description": "Kualiti imej bersaiz penuh dari 1-100. Lebih tinggi adalah lebih baik, tetapi menghasilkan fail yang lebih besar.",
|
||||
"image_fullsize_title": "Tetapan Imej bersaiz penuh",
|
||||
"image_prefer_embedded_preview": "Cadangkan pratonton terbenam",
|
||||
"image_prefer_embedded_preview_setting_description": "Gunakan pratonton terbenam dalam foto RAW sebagai input kepada pemprosesan imej apabila tersedia. Cara ini boleh menghasilkan warna yang lebih tepat untuk sesetengah imej, tetapi kualiti pratonton bergantung pada kamera dan imej mungkin mempunyai lebih banyak artifak mampatan.",
|
||||
"image_prefer_wide_gamut": "Cadangkan warna gamut yang luas",
|
||||
|
@ -159,7 +165,6 @@
|
|||
"no_pattern_added": "Tiada corak ditambah",
|
||||
"note_apply_storage_label_previous_assets": "Nota: Untuk menggunakan Label Storan pada aset yang dimuat naik sebelum ini, jalankan",
|
||||
"note_cannot_be_changed_later": "NOTA: Ini tidak boleh diubah kemudian!",
|
||||
"note_unlimited_quota": "Nota: Masukkan 0 untuk kuota tanpa had",
|
||||
"notification_email_from_address": "Dari alamat",
|
||||
"notification_email_from_address_description": "Alamat e-mel penghantar, sebagai contoh: \"Immich Photo Server <noreply@example.com>\"",
|
||||
"notification_email_host_description": "Hos e-mel pelayan (cth. smtp.immich.app)",
|
||||
|
@ -181,20 +186,13 @@
|
|||
"oauth_auto_register": "Daftar secara automatik",
|
||||
"oauth_auto_register_description": "Daftar secara automatik pengguna-pengguna baharu selepas mendaftar masuk dengan OAuth",
|
||||
"oauth_button_text": "Teks butang",
|
||||
"oauth_client_id": "ID Pelanggan",
|
||||
"oauth_client_secret": "Rahsia Pelanggan",
|
||||
"oauth_enable_description": "Log masuk dengan OAuth",
|
||||
"oauth_issuer_url": "URL Pengeluar",
|
||||
"oauth_mobile_redirect_uri": "URI ubah hala mudah alih",
|
||||
"oauth_mobile_redirect_uri_override": "Penggantian URI ubah hala mudah alih",
|
||||
"oauth_mobile_redirect_uri_override_description": "Aktifkan apabila pembekal OAuth tidak membenarkan URI mudah alih, seperti '{callback}'",
|
||||
"oauth_profile_signing_algorithm": "Algoritma tandatangan profil",
|
||||
"oauth_profile_signing_algorithm_description": "Algoritma digunakan untuk menandatangani profil pengguna.",
|
||||
"oauth_scope": "Skop",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Urus tetapan-tetapan log masuk OAuth",
|
||||
"oauth_settings_more_details": "Untuk maklumat lanjut tentang ciri ini, rujuk ke <link>dokumen</link>.",
|
||||
"oauth_signing_algorithm": "Tandatangan algoritma",
|
||||
"oauth_storage_label_claim": "Tuntutan label storan",
|
||||
"oauth_storage_label_claim_description": "Tetapkan label storan pengguna secara automatik kepada nilai tuntutan ini.",
|
||||
"oauth_storage_quota_claim": "Tuntutan kuota storan",
|
||||
|
@ -321,7 +319,8 @@
|
|||
"transcoding_threads": "Benang",
|
||||
"transcoding_threads_description": "Nilai yang lebih tinggi membawa kepada pengekodan yang lebih pantas, tetapi meninggalkan lebih sedikit ruang untuk pemproses tugas lain semasa aktif. Nilai ini tidak boleh lebih daripada bilangan teras CPU. Memaksimumkan penggunaan jika ditetapkan kepada 0.",
|
||||
"transcoding_tone_mapping": "Pemetaan nada",
|
||||
"transcoding_tone_mapping_description": "Percubaan untuk mengekalkan penampilan video HDR apabila ditukar kepada SDR. Setiap algoritma membuat pertukaran yang berbeza untuk warna, perincian dan kecerahan. Hable mengekalkan perincian, Mobius mengekalkan warna, dan Reinhard mengekalkan kecerahan."
|
||||
"transcoding_tone_mapping_description": "Percubaan untuk mengekalkan penampilan video HDR apabila ditukar kepada SDR. Setiap algoritma membuat pertukaran yang berbeza untuk warna, perincian dan kecerahan. Hable mengekalkan perincian, Mobius mengekalkan warna, dan Reinhard mengekalkan kecerahan.",
|
||||
"transcoding_transcode_policy": "Dasar transkod"
|
||||
},
|
||||
"deduplication_criteria_1": "Saiz imej dalam bait",
|
||||
"deduplication_criteria_2": "Kiraan data EXIF",
|
||||
|
@ -372,4 +371,4 @@
|
|||
"yes": "Ya",
|
||||
"you_dont_have_any_shared_links": "Anda tidak mempunyai apa-apa pautan yang dikongsi",
|
||||
"zoom_image": "Zum Gambar"
|
||||
}
|
||||
}
|
||||
|
|
549
i18n/nb_NO.json
549
i18n/nb_NO.json
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue