mirror of
https://github.com/immich-app/immich.git
synced 2025-12-07 05:11:00 -08:00
Compare commits
1 Commits
v1.130.1
...
chore/asyn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9771c8aec1 |
@@ -1,10 +1,10 @@
|
||||
ARG BASEIMAGE=mcr.microsoft.com/devcontainers/typescript-node:22@sha256:2ef23730ec68d8511ec8e6e0b82550ca728b256805d81f60ed890f3bfb21cfb9
|
||||
ARG BASEIMAGE=mcr.microsoft.com/devcontainers/typescript-node:22@sha256:9791f4aa527774bc370c6bd2f6705ce5a686f1e6f204badd8dfaacce28c631ae
|
||||
FROM ${BASEIMAGE}
|
||||
|
||||
# Flutter SDK
|
||||
# https://flutter.dev/docs/development/tools/sdk/releases?tab=linux
|
||||
ENV FLUTTER_CHANNEL="stable"
|
||||
ENV FLUTTER_VERSION="3.29.1"
|
||||
ENV FLUTTER_VERSION="3.24.5"
|
||||
ENV FLUTTER_HOME=/flutter
|
||||
ENV PATH=${PATH}:${FLUTTER_HOME}/bin
|
||||
|
||||
|
||||
1
.github/.nvmrc
vendored
1
.github/.nvmrc
vendored
@@ -1 +0,0 @@
|
||||
22.14.0
|
||||
@@ -1,5 +1,5 @@
|
||||
title: '[Feature] feature-name-goes-here'
|
||||
labels: ['feature']
|
||||
title: "[Feature] feature-name-goes-here"
|
||||
labels: ["feature"]
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
@@ -11,9 +11,9 @@ body:
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: I have searched the existing feature requests, both open and closed, to make sure this is not a duplicate request.
|
||||
label: I have searched the existing feature requests to make sure this is not a duplicate request.
|
||||
options:
|
||||
- label: 'Yes'
|
||||
- label: "Yes"
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
|
||||
14
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
14
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -1,13 +1,6 @@
|
||||
name: Report an issue with Immich
|
||||
description: Report an issue with Immich
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: I have searched the existing issues, both open and closed, to make sure this is not a duplicate report.
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: true
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
@@ -84,7 +77,7 @@ body:
|
||||
id: repro
|
||||
attributes:
|
||||
label: Reproduction steps
|
||||
description: 'How do you trigger this bug? Please walk us through it step by step.'
|
||||
description: "How do you trigger this bug? Please walk us through it step by step."
|
||||
value: |
|
||||
1.
|
||||
2.
|
||||
@@ -97,13 +90,12 @@ body:
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description:
|
||||
Please copy and paste any relevant logs below. (code formatting is
|
||||
description: Please copy and paste any relevant logs below. (code formatting is
|
||||
enabled, no need for backticks)
|
||||
render: shell
|
||||
validations:
|
||||
required: false
|
||||
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional information
|
||||
|
||||
28
.github/package-lock.json
generated
vendored
28
.github/package-lock.json
generated
vendored
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": ".github",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"devDependencies": {
|
||||
"prettier": "^3.5.3"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "3.5.3",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
|
||||
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
9
.github/package.json
vendored
9
.github/package.json
vendored
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"scripts": {
|
||||
"format": "prettier --check .",
|
||||
"format:fix": "prettier --write ."
|
||||
},
|
||||
"devDependencies": {
|
||||
"prettier": "^3.5.3"
|
||||
}
|
||||
}
|
||||
4
.github/pull_request_template.md
vendored
4
.github/pull_request_template.md
vendored
@@ -32,5 +32,5 @@ The `/api/something` endpoint is now `/api/something-else`
|
||||
- [ ] I have confirmed that any new dependencies are strictly necessary.
|
||||
- [ ] I have written tests for new code (if applicable)
|
||||
- [ ] I have followed naming conventions/patterns in the surrounding code
|
||||
- [ ] All code in `src/services/` uses repositories implementations for database calls, filesystem operations, etc.
|
||||
- [ ] All code in `src/repositories/` is pretty basic/simple and does not have any immich specific logic (that belongs in `src/services/`)
|
||||
- [ ] All code in `src/services` uses repositories implementations for database calls, filesystem operations, etc.
|
||||
- [ ] All code in `src/repositories/` is pretty basic/simple and does not have any immich specific logic (that belongs in `src/services`)
|
||||
|
||||
66
.github/release.yml
vendored
66
.github/release.yml
vendored
@@ -1,33 +1,33 @@
|
||||
changelog:
|
||||
categories:
|
||||
- title: 🚨 Breaking Changes
|
||||
labels:
|
||||
- changelog:breaking-change
|
||||
|
||||
- title: 🫥 Deprecated Changes
|
||||
labels:
|
||||
- changelog:deprecated
|
||||
|
||||
- title: 🔒 Security
|
||||
labels:
|
||||
- changelog:security
|
||||
|
||||
- title: 🚀 Features
|
||||
labels:
|
||||
- changelog:feature
|
||||
|
||||
- title: 🌟 Enhancements
|
||||
labels:
|
||||
- changelog:enhancement
|
||||
|
||||
- title: 🐛 Bug fixes
|
||||
labels:
|
||||
- changelog:bugfix
|
||||
|
||||
- title: 📚 Documentation
|
||||
labels:
|
||||
- changelog:documentation
|
||||
|
||||
- title: 🌐 Translations
|
||||
labels:
|
||||
- changelog:translation
|
||||
changelog:
|
||||
categories:
|
||||
- title: 🚨 Breaking Changes
|
||||
labels:
|
||||
- changelog:breaking-change
|
||||
|
||||
- title: 🫥 Deprecated Changes
|
||||
labels:
|
||||
- changelog:deprecated
|
||||
|
||||
- title: 🔒 Security
|
||||
labels:
|
||||
- changelog:security
|
||||
|
||||
- title: 🚀 Features
|
||||
labels:
|
||||
- changelog:feature
|
||||
|
||||
- title: 🌟 Enhancements
|
||||
labels:
|
||||
- changelog:enhancement
|
||||
|
||||
- title: 🐛 Bug fixes
|
||||
labels:
|
||||
- changelog:bugfix
|
||||
|
||||
- title: 📚 Documentation
|
||||
labels:
|
||||
- changelog:documentation
|
||||
|
||||
- title: 🌐 Translations
|
||||
labels:
|
||||
- changelog:translation
|
||||
|
||||
12
.github/workflows/build-mobile.yml
vendored
12
.github/workflows/build-mobile.yml
vendored
@@ -22,9 +22,9 @@ jobs:
|
||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
uses: dorny/paths-filter@v3
|
||||
with:
|
||||
filters: |
|
||||
mobile:
|
||||
@@ -51,18 +51,18 @@ jobs:
|
||||
ref="${input_ref:-$github_ref}"
|
||||
echo "ref=$ref" >> $GITHUB_OUTPUT
|
||||
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ steps.get-ref.outputs.ref }}
|
||||
|
||||
- uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
cache: 'gradle'
|
||||
|
||||
- name: Setup Flutter SDK
|
||||
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version-file: ./mobile/pubspec.yaml
|
||||
@@ -89,7 +89,7 @@ jobs:
|
||||
flutter build apk --release --split-per-abi --target-platform android-arm,android-arm64,android-x64
|
||||
|
||||
- name: Publish Android Artifact
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: release-apk-signed
|
||||
path: mobile/build/app/outputs/flutter-apk/*.apk
|
||||
|
||||
2
.github/workflows/cache-cleanup.yml
vendored
2
.github/workflows/cache-cleanup.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cleanup
|
||||
run: |
|
||||
|
||||
17
.github/workflows/cli.yml
vendored
17
.github/workflows/cli.yml
vendored
@@ -6,6 +6,7 @@ on:
|
||||
- 'cli/**'
|
||||
- '.github/workflows/cli.yml'
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'cli/**'
|
||||
- '.github/workflows/cli.yml'
|
||||
@@ -28,9 +29,9 @@ jobs:
|
||||
working-directory: ./cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- uses: actions/checkout@v4
|
||||
# Setup .npmrc file to publish to npm
|
||||
- uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
@@ -52,16 +53,16 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
uses: docker/setup-qemu-action@v3.4.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
|
||||
uses: docker/setup-buildx-action@v3.9.0
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
with:
|
||||
registry: ghcr.io
|
||||
@@ -76,7 +77,7 @@ jobs:
|
||||
|
||||
- name: Generate docker image tags
|
||||
id: metadata
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
flavor: |
|
||||
latest=false
|
||||
@@ -87,7 +88,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@v6.13.0
|
||||
with:
|
||||
file: cli/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
|
||||
63
.github/workflows/codeql-analysis.yml
vendored
63
.github/workflows/codeql-analysis.yml
vendored
@@ -9,14 +9,14 @@
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: 'CodeQL'
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ['main']
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: ['main']
|
||||
branches: [ "main" ]
|
||||
schedule:
|
||||
- cron: '20 13 * * 1'
|
||||
|
||||
@@ -36,42 +36,43 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: ['javascript', 'python']
|
||||
language: [ 'javascript', 'python' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
|
||||
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||
# queries: security-extended,security-and-quality
|
||||
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||
# queries: security-extended,security-and-quality
|
||||
|
||||
# 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
|
||||
|
||||
# ℹ️ 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
|
||||
# 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@v3
|
||||
|
||||
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||
# ℹ️ 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
|
||||
|
||||
# - run: |
|
||||
# echo "Run, Build Application using script"
|
||||
# ./location_of_script_within_repo/buildscript.sh
|
||||
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
|
||||
with:
|
||||
category: '/language:${{matrix.language}}'
|
||||
# - run: |
|
||||
# echo "Run, Build Application using script"
|
||||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:${{matrix.language}}"
|
||||
|
||||
121
.github/workflows/docker.yml
vendored
121
.github/workflows/docker.yml
vendored
@@ -5,6 +5,7 @@ on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
@@ -23,9 +24,9 @@ jobs:
|
||||
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
|
||||
uses: actions/checkout@v4
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
uses: dorny/paths-filter@v3
|
||||
with:
|
||||
filters: |
|
||||
server:
|
||||
@@ -49,23 +50,23 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
|
||||
suffix: ["", "-cuda", "-openvino", "-armnn"]
|
||||
steps:
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Re-tag image
|
||||
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
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Re-tag image
|
||||
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
|
||||
|
||||
retag_server:
|
||||
name: Re-Tag Server
|
||||
@@ -74,10 +75,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
suffix: ['']
|
||||
suffix: [""]
|
||||
steps:
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
@@ -120,11 +121,6 @@ jobs:
|
||||
device: cuda
|
||||
suffix: -cuda
|
||||
|
||||
- platform: linux/amd64
|
||||
runner: mich
|
||||
device: rocm
|
||||
suffix: -rocm
|
||||
|
||||
- platform: linux/amd64
|
||||
runner: ubuntu-latest
|
||||
device: openvino
|
||||
@@ -135,11 +131,6 @@ jobs:
|
||||
device: armnn
|
||||
suffix: -armnn
|
||||
|
||||
- platform: linux/arm64
|
||||
runner: ubuntu-24.04-arm
|
||||
device: rknn
|
||||
suffix: -rknn
|
||||
|
||||
steps:
|
||||
- name: Prepare
|
||||
run: |
|
||||
@@ -147,13 +138,13 @@ jobs:
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
|
||||
uses: docker/setup-buildx-action@v3.9.0
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
with:
|
||||
registry: ghcr.io
|
||||
@@ -180,7 +171,7 @@ jobs:
|
||||
|
||||
- name: Build and push image
|
||||
id: build
|
||||
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
|
||||
uses: docker/build-push-action@v6.13.0
|
||||
with:
|
||||
context: ${{ env.context }}
|
||||
file: ${{ env.file }}
|
||||
@@ -205,7 +196,7 @@ jobs:
|
||||
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
||||
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ml-digests-${{ matrix.device }}-${{ env.PLATFORM_PAIR }}
|
||||
path: ${{ runner.temp }}/digests/*
|
||||
@@ -225,19 +216,15 @@ jobs:
|
||||
- device: cpu
|
||||
- device: cuda
|
||||
suffix: -cuda
|
||||
- device: rocm
|
||||
suffix: -rocm
|
||||
- device: openvino
|
||||
suffix: -openvino
|
||||
- device: armnn
|
||||
suffix: -armnn
|
||||
- device: rknn
|
||||
suffix: -rknn
|
||||
needs:
|
||||
- build_and_push_ml
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ${{ runner.temp }}/digests
|
||||
pattern: ml-digests-${{ matrix.device }}-*
|
||||
@@ -245,44 +232,43 @@ jobs:
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ github.event_name == 'release' }}
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Login to GHCR
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Generate docker image tags
|
||||
id: meta
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
|
||||
uses: docker/metadata-action@v5
|
||||
env:
|
||||
DOCKER_METADATA_PR_HEAD_SHA: 'true'
|
||||
DOCKER_METADATA_PR_HEAD_SHA: "true"
|
||||
with:
|
||||
flavor: |
|
||||
# Disable latest tag
|
||||
latest=false
|
||||
suffix=${{ matrix.suffix }}
|
||||
images: |
|
||||
name=${{ env.GHCR_REPO }}
|
||||
name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }}
|
||||
tags: |
|
||||
# Tag with branch name
|
||||
type=ref,event=branch
|
||||
type=ref,event=branch,suffix=${{ matrix.suffix }}
|
||||
# Tag with pr-number
|
||||
type=ref,event=pr
|
||||
type=ref,event=pr,suffix=${{ matrix.suffix }}
|
||||
# Tag with long commit sha hash
|
||||
type=sha,format=long,prefix=commit-
|
||||
type=sha,format=long,prefix=commit-,suffix=${{ matrix.suffix }}
|
||||
# Tag with git tag on release
|
||||
type=ref,event=tag
|
||||
type=raw,value=release,enable=${{ github.event_name == 'release' }}
|
||||
type=ref,event=tag,suffix=${{ matrix.suffix }}
|
||||
type=raw,value=release,enable=${{ github.event_name == 'release' }},suffix=${{ matrix.suffix }}
|
||||
|
||||
- name: Create manifest list and push
|
||||
working-directory: ${{ runner.temp }}/digests
|
||||
@@ -315,13 +301,13 @@ jobs:
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
with:
|
||||
registry: ghcr.io
|
||||
@@ -348,7 +334,7 @@ jobs:
|
||||
|
||||
- name: Build and push image
|
||||
id: build
|
||||
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
|
||||
uses: docker/build-push-action@v6.13.0
|
||||
with:
|
||||
context: ${{ env.context }}
|
||||
file: ${{ env.file }}
|
||||
@@ -373,7 +359,7 @@ jobs:
|
||||
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
||||
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: server-digests-${{ env.PLATFORM_PAIR }}
|
||||
path: ${{ runner.temp }}/digests/*
|
||||
@@ -391,7 +377,7 @@ jobs:
|
||||
- build_and_push_server
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ${{ runner.temp }}/digests
|
||||
pattern: server-digests-*
|
||||
@@ -399,44 +385,43 @@ jobs:
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ github.event_name == 'release' }}
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Login to GHCR
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Generate docker image tags
|
||||
id: meta
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
|
||||
uses: docker/metadata-action@v5
|
||||
env:
|
||||
DOCKER_METADATA_PR_HEAD_SHA: 'true'
|
||||
DOCKER_METADATA_PR_HEAD_SHA: "true"
|
||||
with:
|
||||
flavor: |
|
||||
# Disable latest tag
|
||||
latest=false
|
||||
suffix=${{ matrix.suffix }}
|
||||
images: |
|
||||
name=${{ env.GHCR_REPO }}
|
||||
name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }}
|
||||
tags: |
|
||||
# Tag with branch name
|
||||
type=ref,event=branch
|
||||
type=ref,event=branch,suffix=${{ matrix.suffix }}
|
||||
# Tag with pr-number
|
||||
type=ref,event=pr
|
||||
type=ref,event=pr,suffix=${{ matrix.suffix }}
|
||||
# Tag with long commit sha hash
|
||||
type=sha,format=long,prefix=commit-
|
||||
type=sha,format=long,prefix=commit-,suffix=${{ matrix.suffix }}
|
||||
# Tag with git tag on release
|
||||
type=ref,event=tag
|
||||
type=raw,value=release,enable=${{ github.event_name == 'release' }}
|
||||
type=ref,event=tag,suffix=${{ matrix.suffix }}
|
||||
type=raw,value=release,enable=${{ github.event_name == 'release' }},suffix=${{ matrix.suffix }}
|
||||
|
||||
- name: Create manifest list and push
|
||||
working-directory: ${{ runner.temp }}/digests
|
||||
|
||||
11
.github/workflows/docs-build.yml
vendored
11
.github/workflows/docs-build.yml
vendored
@@ -3,6 +3,7 @@ on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
@@ -17,9 +18,9 @@ jobs:
|
||||
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
uses: dorny/paths-filter@v3
|
||||
with:
|
||||
filters: |
|
||||
docs:
|
||||
@@ -41,10 +42,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './docs/.nvmrc'
|
||||
|
||||
@@ -58,7 +59,7 @@ jobs:
|
||||
run: npm run build
|
||||
|
||||
- name: Upload build output
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: docs-build-output
|
||||
path: docs/build/
|
||||
|
||||
42
.github/workflows/docs-deploy.yml
vendored
42
.github/workflows/docs-deploy.yml
vendored
@@ -1,7 +1,7 @@
|
||||
name: Docs deploy
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ['Docs build']
|
||||
workflows: ["Docs build"]
|
||||
types:
|
||||
- completed
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
run: echo 'The triggering workflow did not succeed' && exit 1
|
||||
- name: Get artifact
|
||||
id: get-artifact
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
return { found: true, id: matchArtifact.id };
|
||||
- name: Determine deploy parameters
|
||||
id: parameters
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const eventType = context.payload.workflow_run.event;
|
||||
@@ -98,11 +98,11 @@ jobs:
|
||||
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Load parameters
|
||||
id: parameters
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const json = `${{ needs.checks.outputs.parameters }}`;
|
||||
@@ -115,7 +115,7 @@ jobs:
|
||||
echo "Starting docs deployment for ${{ steps.parameters.outputs.event }} ${{ steps.parameters.outputs.name }}"
|
||||
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
let artifact = ${{ needs.checks.outputs.artifact }};
|
||||
@@ -138,12 +138,12 @@ jobs:
|
||||
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
|
||||
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
|
||||
uses: gruntwork-io/terragrunt-action@v2
|
||||
with:
|
||||
tg_version: '0.58.12'
|
||||
tofu_version: '1.7.1'
|
||||
tg_dir: 'deployment/modules/cloudflare/docs'
|
||||
tg_command: 'apply'
|
||||
tg_version: "0.58.12"
|
||||
tofu_version: "1.7.1"
|
||||
tg_dir: "deployment/modules/cloudflare/docs"
|
||||
tg_command: "apply"
|
||||
|
||||
- name: Deploy Docs Subdomain Output
|
||||
id: docs-output
|
||||
@@ -153,12 +153,12 @@ jobs:
|
||||
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
|
||||
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
|
||||
uses: gruntwork-io/terragrunt-action@v2
|
||||
with:
|
||||
tg_version: '0.58.12'
|
||||
tofu_version: '1.7.1'
|
||||
tg_dir: 'deployment/modules/cloudflare/docs'
|
||||
tg_command: 'output -json'
|
||||
tg_version: "0.58.12"
|
||||
tofu_version: "1.7.1"
|
||||
tg_dir: "deployment/modules/cloudflare/docs"
|
||||
tg_command: "output -json"
|
||||
|
||||
- name: Output Cleaning
|
||||
id: clean
|
||||
@@ -167,13 +167,13 @@ jobs:
|
||||
echo "output=$TG_OUT" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Publish to Cloudflare Pages
|
||||
uses: cloudflare/pages-action@f0a1cd58cd66095dee69bfa18fa5efd1dde93bca # v1
|
||||
uses: cloudflare/pages-action@v1
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN_PAGES_UPLOAD }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
projectName: ${{ fromJson(steps.clean.outputs.output).pages_project_name.value }}
|
||||
workingDirectory: 'docs'
|
||||
directory: 'build'
|
||||
workingDirectory: "docs"
|
||||
directory: "build"
|
||||
branch: ${{ steps.parameters.outputs.name }}
|
||||
wranglerVersion: '3'
|
||||
|
||||
@@ -184,7 +184,7 @@ jobs:
|
||||
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
|
||||
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
|
||||
uses: gruntwork-io/terragrunt-action@v2
|
||||
with:
|
||||
tg_version: '0.58.12'
|
||||
tofu_version: '1.7.1'
|
||||
@@ -192,7 +192,7 @@ jobs:
|
||||
tg_command: 'apply'
|
||||
|
||||
- name: Comment
|
||||
uses: actions-cool/maintain-one-comment@4b2dbf086015f892dcb5e8c1106f5fccd6c1476b # v3
|
||||
uses: actions-cool/maintain-one-comment@v3
|
||||
if: ${{ steps.parameters.outputs.event == 'pr' }}
|
||||
with:
|
||||
number: ${{ fromJson(needs.checks.outputs.parameters).pr_number }}
|
||||
|
||||
18
.github/workflows/docs-destroy.yml
vendored
18
.github/workflows/docs-destroy.yml
vendored
@@ -9,24 +9,24 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Destroy Docs Subdomain
|
||||
env:
|
||||
TF_VAR_prefix_name: 'pr-${{ github.event.number }}'
|
||||
TF_VAR_prefix_event_type: 'pr'
|
||||
TF_VAR_prefix_name: "pr-${{ github.event.number }}"
|
||||
TF_VAR_prefix_event_type: "pr"
|
||||
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
|
||||
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
|
||||
uses: gruntwork-io/terragrunt-action@v2
|
||||
with:
|
||||
tg_version: '0.58.12'
|
||||
tofu_version: '1.7.1'
|
||||
tg_dir: 'deployment/modules/cloudflare/docs'
|
||||
tg_command: 'destroy -refresh=false'
|
||||
tg_version: "0.58.12"
|
||||
tofu_version: "1.7.1"
|
||||
tg_dir: "deployment/modules/cloudflare/docs"
|
||||
tg_command: "destroy -refresh=false"
|
||||
|
||||
- name: Comment
|
||||
uses: actions-cool/maintain-one-comment@4b2dbf086015f892dcb5e8c1106f5fccd6c1476b # v3
|
||||
uses: actions-cool/maintain-one-comment@v3
|
||||
with:
|
||||
number: ${{ github.event.number }}
|
||||
delete: true
|
||||
|
||||
11
.github/workflows/fix-format.yml
vendored
11
.github/workflows/fix-format.yml
vendored
@@ -13,19 +13,19 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@af35edadc00be37caa72ed9f3e6d5f7801bfdf09 # v1
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
||||
- name: 'Checkout'
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
@@ -33,13 +33,13 @@ jobs:
|
||||
run: make install-all && make format-all
|
||||
|
||||
- name: Commit and push
|
||||
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9
|
||||
uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
default_author: github_actions
|
||||
message: 'chore: fix formatting'
|
||||
|
||||
- name: Remove label
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
uses: actions/github-script@v7
|
||||
if: always()
|
||||
with:
|
||||
script: |
|
||||
@@ -49,3 +49,4 @@ jobs:
|
||||
repo: context.repo.repo,
|
||||
name: 'fix:formatting'
|
||||
})
|
||||
|
||||
|
||||
6
.github/workflows/pr-label-validation.yml
vendored
6
.github/workflows/pr-label-validation.yml
vendored
@@ -12,11 +12,11 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Require PR to have a changelog label
|
||||
uses: mheap/github-action-required-labels@388fd6af37b34cdfe5a23b37060e763217e58b03 # v5
|
||||
uses: mheap/github-action-required-labels@v5
|
||||
with:
|
||||
mode: exactly
|
||||
count: 1
|
||||
use_regex: true
|
||||
labels: 'changelog:.*'
|
||||
labels: "changelog:.*"
|
||||
add_comment: true
|
||||
message: 'Label error. Requires {{errorString}} {{count}} of: {{ provided }}. Found: {{ applied }}. A maintainer will add the required label.'
|
||||
message: "Label error. Requires {{errorString}} {{count}} of: {{ provided }}. Found: {{ applied }}. A maintainer will add the required label."
|
||||
|
||||
6
.github/workflows/pr-labeler.yml
vendored
6
.github/workflows/pr-labeler.yml
vendored
@@ -1,6 +1,6 @@
|
||||
name: 'Pull Request Labeler'
|
||||
name: "Pull Request Labeler"
|
||||
on:
|
||||
- pull_request_target
|
||||
- pull_request_target
|
||||
|
||||
jobs:
|
||||
labeler:
|
||||
@@ -9,4 +9,4 @@ jobs:
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5
|
||||
- uses: actions/labeler@v5
|
||||
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: PR Conventional Commit Validation
|
||||
uses: ytanikin/PRConventionalCommits@b628c5a234cc32513014b7bfdd1e47b532124d98 # 1.3.0
|
||||
uses: ytanikin/PRConventionalCommits@1.3.0
|
||||
with:
|
||||
task_types: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]'
|
||||
add_label: 'false'
|
||||
|
||||
20
.github/workflows/prepare-release.yml
vendored
20
.github/workflows/prepare-release.yml
vendored
@@ -31,25 +31,25 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@af35edadc00be37caa72ed9f3e6d5f7801bfdf09 # v1
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@22695119d769bdb6f7032ad67b9bca0ef8c4a174 # v5
|
||||
- name: Install Poetry
|
||||
run: pipx install poetry
|
||||
|
||||
- name: Bump version
|
||||
run: misc/release/pump-version.sh -s "${{ inputs.serverBump }}" -m "${{ inputs.mobileBump }}"
|
||||
|
||||
- name: Commit and tag
|
||||
id: push-tag
|
||||
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9
|
||||
uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
default_author: github_actions
|
||||
message: 'chore: version ${{ env.IMMICH_VERSION }}'
|
||||
@@ -70,23 +70,23 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@af35edadc00be37caa72ed9f3e6d5f7801bfdf09 # v1
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
|
||||
- name: Download APK
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: release-apk-signed
|
||||
|
||||
- name: Create draft release
|
||||
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
draft: true
|
||||
tag_name: ${{ env.IMMICH_VERSION }}
|
||||
|
||||
10
.github/workflows/preview-label.yaml
vendored
10
.github/workflows/preview-label.yaml
vendored
@@ -2,7 +2,7 @@ name: Preview label
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [labeled, closed]
|
||||
types: [labeled]
|
||||
|
||||
jobs:
|
||||
comment-status:
|
||||
@@ -11,10 +11,10 @@ jobs:
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2
|
||||
- uses: mshick/add-pr-comment@v2
|
||||
with:
|
||||
message-id: 'preview-status'
|
||||
message: 'Deploying preview environment to https://pr-${{ github.event.pull_request.number }}.preview.internal.immich.cloud/'
|
||||
message-id: "preview-status"
|
||||
message: "Deploying preview environment to https://pr-${{ github.event.pull_request.number }}.preview.internal.immich.cloud/"
|
||||
|
||||
remove-label:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
|
||||
- uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
github.rest.issues.removeLabel({
|
||||
|
||||
4
.github/workflows/sdk.yml
vendored
4
.github/workflows/sdk.yml
vendored
@@ -15,9 +15,9 @@ jobs:
|
||||
run:
|
||||
working-directory: ./open-api/typescript-sdk
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- uses: actions/checkout@v4
|
||||
# Setup .npmrc file to publish to npm
|
||||
- uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './open-api/typescript-sdk/.nvmrc'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
33
.github/workflows/static_analysis.yml
vendored
33
.github/workflows/static_analysis.yml
vendored
@@ -16,9 +16,9 @@ jobs:
|
||||
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
uses: dorny/paths-filter@v3
|
||||
with:
|
||||
filters: |
|
||||
mobile:
|
||||
@@ -38,10 +38,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Flutter SDK
|
||||
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version-file: ./mobile/pubspec.yaml
|
||||
@@ -50,26 +50,6 @@ jobs:
|
||||
run: dart pub get
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Run Build Runner
|
||||
run: make build
|
||||
working-directory: ./mobile
|
||||
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
|
||||
id: verify-changed-files
|
||||
with:
|
||||
files: |
|
||||
mobile/**/*.g.dart
|
||||
mobile/**/*.gr.dart
|
||||
mobile/**/*.drift.dart
|
||||
|
||||
- name: Verify files have not changed
|
||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||
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 }}"
|
||||
exit 1
|
||||
|
||||
- name: Run dart analyze
|
||||
run: dart analyze --fatal-infos
|
||||
working-directory: ./mobile
|
||||
@@ -81,3 +61,8 @@ jobs:
|
||||
- name: Run dart custom_lint
|
||||
run: dart run custom_lint
|
||||
working-directory: ./mobile
|
||||
|
||||
# Enable after riverpod generator migration is completed
|
||||
# - name: Run dart custom lint
|
||||
# run: dart run custom_lint
|
||||
# working-directory: ./mobile
|
||||
|
||||
111
.github/workflows/test.yml
vendored
111
.github/workflows/test.yml
vendored
@@ -21,12 +21,11 @@ jobs:
|
||||
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_e2e_web: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_e2e_server_cli: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.server == 'true' || steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
|
||||
should_run_.github: ${{ steps.found_paths.outputs['.github'] == 'true' || steps.should_force.outputs.should_force == 'true' }} # redundant to have should_force but if someone changes the trigger then this won't have to be changed
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
- id: found_paths
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
|
||||
uses: dorny/paths-filter@v3
|
||||
with:
|
||||
filters: |
|
||||
web:
|
||||
@@ -46,8 +45,6 @@ jobs:
|
||||
- 'machine-learning/**'
|
||||
workflow:
|
||||
- '.github/workflows/test.yml'
|
||||
.github:
|
||||
- '.github/**'
|
||||
|
||||
- name: Check if we should force jobs to run
|
||||
id: should_force
|
||||
@@ -64,10 +61,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
@@ -101,10 +98,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
|
||||
@@ -142,10 +139,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './cli/.nvmrc'
|
||||
|
||||
@@ -176,10 +173,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './web/.nvmrc'
|
||||
|
||||
@@ -221,10 +218,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
|
||||
@@ -260,10 +257,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
@@ -285,12 +282,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
|
||||
@@ -327,12 +324,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './e2e/.nvmrc'
|
||||
|
||||
@@ -363,9 +360,9 @@ jobs:
|
||||
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Flutter SDK
|
||||
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version-file: ./mobile/pubspec.yaml
|
||||
@@ -382,60 +379,34 @@ jobs:
|
||||
run:
|
||||
working-directory: ./machine-learning
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@22695119d769bdb6f7032ad67b9bca0ef8c4a174 # v5
|
||||
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5
|
||||
# TODO: add caching when supported (https://github.com/actions/setup-python/pull/818)
|
||||
# with:
|
||||
# python-version: 3.11
|
||||
# cache: 'uv'
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install poetry
|
||||
run: pipx install poetry
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.11
|
||||
cache: 'poetry'
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
uv sync --extra cpu
|
||||
poetry install --with dev --with cpu
|
||||
- name: Lint with ruff
|
||||
run: |
|
||||
uv run ruff check --output-format=github app export
|
||||
poetry run ruff check --output-format=github app export
|
||||
- name: Check black formatting
|
||||
run: |
|
||||
uv run black --check app export
|
||||
poetry run black --check app export
|
||||
- name: Run mypy type checking
|
||||
run: |
|
||||
uv run mypy --strict app/
|
||||
poetry run mypy --install-types --non-interactive --strict app/
|
||||
- name: Run tests and coverage
|
||||
run: |
|
||||
uv run pytest app --cov=app --cov-report term-missing
|
||||
|
||||
github-files-formatting:
|
||||
name: .github Files Formatting
|
||||
needs: pre-job
|
||||
if: ${{ needs.pre-job.outputs['should_run_.github'] == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./.github
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
with:
|
||||
node-version-file: './.github/.nvmrc'
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
- name: Run formatter
|
||||
run: npm run format
|
||||
if: ${{ !cancelled() }}
|
||||
poetry run pytest app --cov=app --cov-report term-missing
|
||||
|
||||
shellcheck:
|
||||
name: ShellCheck
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- uses: actions/checkout@v4
|
||||
- name: Run ShellCheck
|
||||
uses: ludeeus/action-shellcheck@master
|
||||
with:
|
||||
@@ -449,10 +420,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
@@ -466,7 +437,7 @@ jobs:
|
||||
run: make open-api
|
||||
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
|
||||
uses: tj-actions/verify-changed-files@v20
|
||||
id: verify-changed-files
|
||||
with:
|
||||
files: |
|
||||
@@ -486,7 +457,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
services:
|
||||
postgres:
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
|
||||
env:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_USER: postgres
|
||||
@@ -504,10 +475,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './server/.nvmrc'
|
||||
|
||||
@@ -528,7 +499,7 @@ jobs:
|
||||
run: npm run typeorm:migrations:generate ./src/migrations/TestMigration
|
||||
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
|
||||
uses: tj-actions/verify-changed-files@v20
|
||||
id: verify-changed-files
|
||||
with:
|
||||
files: |
|
||||
@@ -547,7 +518,7 @@ jobs:
|
||||
DB_URL: postgres://postgres:postgres@localhost:5432/immich
|
||||
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
|
||||
uses: tj-actions/verify-changed-files@v20
|
||||
id: verify-changed-sql-files
|
||||
with:
|
||||
files: |
|
||||
|
||||
57
.github/workflows/weblate-lock.yml
vendored
57
.github/workflows/weblate-lock.yml
vendored
@@ -1,57 +0,0 @@
|
||||
name: Weblate checks
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
pre-job:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
- 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
|
||||
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
|
||||
steps:
|
||||
- name: Check weblate lock
|
||||
run: |
|
||||
if [[ "false" = $(curl https://hosted.weblate.org/api/components/immich/immich/lock/ | jq .locked) ]]; then
|
||||
exit 1
|
||||
fi
|
||||
- name: Find Pull Request
|
||||
uses: juliangruber/find-pull-request-action@48b6133aa6c826f267ebd33aa2d29470f9d9e7d0 # v1
|
||||
id: find-pr
|
||||
with:
|
||||
branch: chore/translations
|
||||
- name: Fail if existing weblate PR
|
||||
if: ${{ steps.find-pr.outputs.number }}
|
||||
run: exit 1
|
||||
success-check-lock:
|
||||
name: Weblate Lock Check Success
|
||||
needs: [enforce-lock]
|
||||
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')) }}
|
||||
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"
|
||||
10
Makefile
10
Makefile
@@ -39,7 +39,7 @@ attach-server:
|
||||
renovate:
|
||||
LOG_LEVEL=debug npx renovate --platform=local --repository-cache=reset
|
||||
|
||||
MODULES = e2e server web cli sdk docs .github
|
||||
MODULES = e2e server web cli sdk docs
|
||||
|
||||
audit-%:
|
||||
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) audit fix
|
||||
@@ -77,14 +77,14 @@ test-medium:
|
||||
test-medium-dev:
|
||||
docker exec -it immich_server /bin/sh -c "npm run test:medium"
|
||||
|
||||
build-all: $(foreach M,$(filter-out e2e .github,$(MODULES)),build-$M) ;
|
||||
build-all: $(foreach M,$(filter-out e2e,$(MODULES)),build-$M) ;
|
||||
install-all: $(foreach M,$(MODULES),install-$M) ;
|
||||
check-all: $(foreach M,$(filter-out sdk cli docs .github,$(MODULES)),check-$M) ;
|
||||
lint-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),lint-$M) ;
|
||||
check-all: $(foreach M,$(filter-out sdk cli docs,$(MODULES)),check-$M) ;
|
||||
lint-all: $(foreach M,$(filter-out sdk docs,$(MODULES)),lint-$M) ;
|
||||
format-all: $(foreach M,$(filter-out sdk,$(MODULES)),format-$M) ;
|
||||
audit-all: $(foreach M,$(MODULES),audit-$M) ;
|
||||
hygiene-all: lint-all format-all check-all sql audit-all;
|
||||
test-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),test-$M) ;
|
||||
test-all: $(foreach M,$(filter-out sdk docs,$(MODULES)),test-$M) ;
|
||||
|
||||
clean:
|
||||
find . -name "node_modules" -type d -prune -exec rm -rf '{}' +
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<p align="center">
|
||||
<br/>
|
||||
<br/>
|
||||
<a href="https://opensource.org/license/agpl-v3"><img src="https://img.shields.io/badge/License-AGPL_v3-blue.svg?color=3F51B5&style=for-the-badge&label=License&logoColor=000000&labelColor=ececec" alt="License: AGPLv3"></a>
|
||||
<a href="https://discord.immich.app">
|
||||
<img src="https://img.shields.io/discord/979116623879368755.svg?label=Discord&logo=Discord&style=for-the-badge&logoColor=000000&labelColor=ececec" alt="Discord"/>
|
||||
</a>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
Access the demo [here](https://demo.immich.app). The demo is running on a Free-tier Oracle VM in Amsterdam with a 2.4Ghz quad-core ARM64 CPU and 24GB RAM.
|
||||
|
||||
For the mobile app, you can use `https://demo.immich.app` for the `Server Endpoint URL`
|
||||
For the mobile app, you can use `https://demo.immich.app/api` for the `Server Endpoint URL`
|
||||
|
||||
### Login credentials
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:22.14.0-alpine3.20@sha256:40be979442621049f40b1d51a26b55e281246b5de4e5f51a18da7beb6e17e3f9 AS core
|
||||
FROM node:22.13.1-alpine3.20@sha256:c52e20859a92b3eccbd3a36c5e1a90adc20617d8d421d65e8a622e87b5dac963 AS core
|
||||
|
||||
WORKDIR /usr/src/open-api/typescript-sdk
|
||||
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./
|
||||
|
||||
653
cli/package-lock.json
generated
653
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.55",
|
||||
"version": "2.2.51",
|
||||
"description": "Command Line Interface (CLI) for Immich",
|
||||
"type": "module",
|
||||
"exports": "./dist/index.js",
|
||||
@@ -19,9 +19,8 @@
|
||||
"@types/byte-size": "^8.1.0",
|
||||
"@types/cli-progress": "^3.11.0",
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/micromatch": "^4.0.9",
|
||||
"@types/mock-fs": "^4.13.1",
|
||||
"@types/node": "^22.13.10",
|
||||
"@types/node": "^22.13.4",
|
||||
"@typescript-eslint/eslint-plugin": "^8.15.0",
|
||||
"@typescript-eslint/parser": "^8.15.0",
|
||||
"@vitest/coverage-v8": "^3.0.0",
|
||||
@@ -32,7 +31,7 @@
|
||||
"eslint-config-prettier": "^10.0.0",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"eslint-plugin-unicorn": "^56.0.1",
|
||||
"globals": "^16.0.0",
|
||||
"globals": "^15.9.0",
|
||||
"mock-fs": "^5.2.0",
|
||||
"prettier": "^3.2.5",
|
||||
"prettier-plugin-organize-imports": "^4.0.0",
|
||||
@@ -63,11 +62,9 @@
|
||||
"node": ">=20.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"chokidar": "^4.0.3",
|
||||
"fast-glob": "^3.3.2",
|
||||
"fastq": "^1.17.1",
|
||||
"lodash-es": "^4.17.21",
|
||||
"micromatch": "^4.0.8"
|
||||
"lodash-es": "^4.17.21"
|
||||
},
|
||||
"volta": {
|
||||
"node": "22.14.0"
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import * as fs from 'node:fs';
|
||||
import * as os from 'node:os';
|
||||
import * as path from 'node:path';
|
||||
import { setTimeout as sleep } from 'node:timers/promises';
|
||||
import { describe, expect, it, MockedFunction, vi } from 'vitest';
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { Action, checkBulkUpload, defaults, getSupportedMediaTypes, Reason } from '@immich/sdk';
|
||||
import { Action, checkBulkUpload, defaults, Reason } from '@immich/sdk';
|
||||
import createFetchMock from 'vitest-fetch-mock';
|
||||
|
||||
import { checkForDuplicates, getAlbumName, startWatch, uploadFiles, UploadOptionsDto } from 'src/commands/asset';
|
||||
import { checkForDuplicates, getAlbumName, uploadFiles, UploadOptionsDto } from './asset';
|
||||
|
||||
vi.mock('@immich/sdk');
|
||||
|
||||
@@ -200,112 +199,3 @@ describe('checkForDuplicates', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('startWatch', () => {
|
||||
let testFolder: string;
|
||||
let checkBulkUploadMocked: MockedFunction<typeof checkBulkUpload>;
|
||||
|
||||
beforeEach(async () => {
|
||||
vi.restoreAllMocks();
|
||||
|
||||
vi.mocked(getSupportedMediaTypes).mockResolvedValue({
|
||||
image: ['.jpg'],
|
||||
sidecar: ['.xmp'],
|
||||
video: ['.mp4'],
|
||||
});
|
||||
|
||||
testFolder = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'test-startWatch-'));
|
||||
checkBulkUploadMocked = vi.mocked(checkBulkUpload);
|
||||
checkBulkUploadMocked.mockResolvedValue({
|
||||
results: [],
|
||||
});
|
||||
});
|
||||
|
||||
it('should start watching a directory and upload new files', async () => {
|
||||
const testFilePath = path.join(testFolder, 'test.jpg');
|
||||
|
||||
await startWatch([testFolder], { concurrency: 1 }, { batchSize: 1, debounceTimeMs: 10 });
|
||||
await sleep(100); // to debounce the watcher from considering the test file as a existing file
|
||||
await fs.promises.writeFile(testFilePath, 'testjpg');
|
||||
|
||||
await vi.waitUntil(() => checkBulkUploadMocked.mock.calls.length > 0, 3000);
|
||||
expect(checkBulkUpload).toHaveBeenCalledWith({
|
||||
assetBulkUploadCheckDto: {
|
||||
assets: [
|
||||
expect.objectContaining({
|
||||
id: testFilePath,
|
||||
}),
|
||||
],
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should filter out unsupported files', async () => {
|
||||
const testFilePath = path.join(testFolder, 'test.jpg');
|
||||
const unsupportedFilePath = path.join(testFolder, 'test.txt');
|
||||
|
||||
await startWatch([testFolder], { concurrency: 1 }, { batchSize: 1, debounceTimeMs: 10 });
|
||||
await sleep(100); // to debounce the watcher from considering the test file as a existing file
|
||||
await fs.promises.writeFile(testFilePath, 'testjpg');
|
||||
await fs.promises.writeFile(unsupportedFilePath, 'testtxt');
|
||||
|
||||
await vi.waitUntil(() => checkBulkUploadMocked.mock.calls.length > 0, 3000);
|
||||
expect(checkBulkUpload).toHaveBeenCalledWith({
|
||||
assetBulkUploadCheckDto: {
|
||||
assets: expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
id: testFilePath,
|
||||
}),
|
||||
]),
|
||||
},
|
||||
});
|
||||
|
||||
expect(checkBulkUpload).not.toHaveBeenCalledWith({
|
||||
assetBulkUploadCheckDto: {
|
||||
assets: expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
id: unsupportedFilePath,
|
||||
}),
|
||||
]),
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should filger out ignored patterns', async () => {
|
||||
const testFilePath = path.join(testFolder, 'test.jpg');
|
||||
const ignoredPattern = 'ignored';
|
||||
const ignoredFolder = path.join(testFolder, ignoredPattern);
|
||||
await fs.promises.mkdir(ignoredFolder, { recursive: true });
|
||||
const ignoredFilePath = path.join(ignoredFolder, 'ignored.jpg');
|
||||
|
||||
await startWatch([testFolder], { concurrency: 1, ignore: ignoredPattern }, { batchSize: 1, debounceTimeMs: 10 });
|
||||
await sleep(100); // to debounce the watcher from considering the test file as a existing file
|
||||
await fs.promises.writeFile(testFilePath, 'testjpg');
|
||||
await fs.promises.writeFile(ignoredFilePath, 'ignoredjpg');
|
||||
|
||||
await vi.waitUntil(() => checkBulkUploadMocked.mock.calls.length > 0, 3000);
|
||||
expect(checkBulkUpload).toHaveBeenCalledWith({
|
||||
assetBulkUploadCheckDto: {
|
||||
assets: expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
id: testFilePath,
|
||||
}),
|
||||
]),
|
||||
},
|
||||
});
|
||||
|
||||
expect(checkBulkUpload).not.toHaveBeenCalledWith({
|
||||
assetBulkUploadCheckDto: {
|
||||
assets: expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
id: ignoredFilePath,
|
||||
}),
|
||||
]),
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await fs.promises.rm(testFolder, { recursive: true, force: true });
|
||||
});
|
||||
});
|
||||
|
||||
@@ -12,18 +12,13 @@ import {
|
||||
getSupportedMediaTypes,
|
||||
} from '@immich/sdk';
|
||||
import byteSize from 'byte-size';
|
||||
import { Matcher, watch as watchFs } from 'chokidar';
|
||||
import { MultiBar, Presets, SingleBar } from 'cli-progress';
|
||||
import { chunk } from 'lodash-es';
|
||||
import micromatch from 'micromatch';
|
||||
import { Stats, createReadStream } from 'node:fs';
|
||||
import { stat, unlink } from 'node:fs/promises';
|
||||
import path, { basename } from 'node:path';
|
||||
import { Queue } from 'src/queue';
|
||||
import { BaseOptions, Batcher, authenticate, crawl, sha1 } from 'src/utils';
|
||||
|
||||
const UPLOAD_WATCH_BATCH_SIZE = 100;
|
||||
const UPLOAD_WATCH_DEBOUNCE_TIME_MS = 10_000;
|
||||
import { BaseOptions, authenticate, crawl, sha1 } from 'src/utils';
|
||||
|
||||
const s = (count: number) => (count === 1 ? '' : 's');
|
||||
|
||||
@@ -41,8 +36,6 @@ export interface UploadOptionsDto {
|
||||
albumName?: string;
|
||||
includeHidden?: boolean;
|
||||
concurrency: number;
|
||||
progress?: boolean;
|
||||
watch?: boolean;
|
||||
}
|
||||
|
||||
class UploadFile extends File {
|
||||
@@ -62,94 +55,19 @@ class UploadFile extends File {
|
||||
}
|
||||
}
|
||||
|
||||
const uploadBatch = async (files: string[], options: UploadOptionsDto) => {
|
||||
const { newFiles, duplicates } = await checkForDuplicates(files, options);
|
||||
const newAssets = await uploadFiles(newFiles, options);
|
||||
await updateAlbums([...newAssets, ...duplicates], options);
|
||||
await deleteFiles(newFiles, options);
|
||||
};
|
||||
|
||||
export const startWatch = async (
|
||||
paths: string[],
|
||||
options: UploadOptionsDto,
|
||||
{
|
||||
batchSize = UPLOAD_WATCH_BATCH_SIZE,
|
||||
debounceTimeMs = UPLOAD_WATCH_DEBOUNCE_TIME_MS,
|
||||
}: { batchSize?: number; debounceTimeMs?: number } = {},
|
||||
) => {
|
||||
const watcherIgnored: Matcher[] = [];
|
||||
const { image, video } = await getSupportedMediaTypes();
|
||||
const extensions = new Set([...image, ...video]);
|
||||
|
||||
if (options.ignore) {
|
||||
watcherIgnored.push((path) => micromatch.contains(path, `**/${options.ignore}`));
|
||||
}
|
||||
|
||||
const pathsBatcher = new Batcher<string>({
|
||||
batchSize,
|
||||
debounceTimeMs,
|
||||
onBatch: async (paths: string[]) => {
|
||||
const uniquePaths = [...new Set(paths)];
|
||||
await uploadBatch(uniquePaths, options);
|
||||
},
|
||||
});
|
||||
|
||||
const onFile = async (path: string, stats?: Stats) => {
|
||||
if (stats?.isDirectory()) {
|
||||
return;
|
||||
}
|
||||
const ext = '.' + path.split('.').pop()?.toLowerCase();
|
||||
if (!ext || !extensions.has(ext)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!options.progress) {
|
||||
// logging when progress is disabled as it can cause issues with the progress bar rendering
|
||||
console.log(`Change detected: ${path}`);
|
||||
}
|
||||
pathsBatcher.add(path);
|
||||
};
|
||||
const fsWatcher = watchFs(paths, {
|
||||
ignoreInitial: true,
|
||||
ignored: watcherIgnored,
|
||||
alwaysStat: true,
|
||||
awaitWriteFinish: true,
|
||||
depth: options.recursive ? undefined : 1,
|
||||
persistent: true,
|
||||
})
|
||||
.on('add', onFile)
|
||||
.on('change', onFile)
|
||||
.on('error', (error) => console.error(`Watcher error: ${error}`));
|
||||
|
||||
process.on('SIGINT', async () => {
|
||||
console.log('Exiting...');
|
||||
await fsWatcher.close();
|
||||
process.exit();
|
||||
});
|
||||
};
|
||||
|
||||
export const upload = async (paths: string[], baseOptions: BaseOptions, options: UploadOptionsDto) => {
|
||||
await authenticate(baseOptions);
|
||||
|
||||
const scanFiles = await scan(paths, options);
|
||||
|
||||
if (scanFiles.length === 0) {
|
||||
if (options.watch) {
|
||||
console.log('No files found initially.');
|
||||
} else {
|
||||
console.log('No files found, exiting');
|
||||
return;
|
||||
}
|
||||
console.log('No files found, exiting');
|
||||
return;
|
||||
}
|
||||
|
||||
if (options.watch) {
|
||||
console.log('Watching for changes...');
|
||||
await startWatch(paths, options);
|
||||
// watcher does not handle the initial scan
|
||||
// as the scan() is a more efficient quick start with batched results
|
||||
}
|
||||
|
||||
await uploadBatch(scanFiles, options);
|
||||
const { newFiles, duplicates } = await checkForDuplicates(scanFiles, options);
|
||||
const newAssets = await uploadFiles(newFiles, options);
|
||||
await updateAlbums([...newAssets, ...duplicates], options);
|
||||
await deleteFiles(newFiles, options);
|
||||
};
|
||||
|
||||
const scan = async (pathsToCrawl: string[], options: UploadOptionsDto) => {
|
||||
@@ -167,25 +85,19 @@ const scan = async (pathsToCrawl: string[], options: UploadOptionsDto) => {
|
||||
return files;
|
||||
};
|
||||
|
||||
export const checkForDuplicates = async (files: string[], { concurrency, skipHash, progress }: UploadOptionsDto) => {
|
||||
export const checkForDuplicates = async (files: string[], { concurrency, skipHash }: UploadOptionsDto) => {
|
||||
if (skipHash) {
|
||||
console.log('Skipping hash check, assuming all files are new');
|
||||
return { newFiles: files, duplicates: [] };
|
||||
}
|
||||
|
||||
let multiBar: MultiBar | undefined;
|
||||
const multiBar = new MultiBar(
|
||||
{ format: '{message} | {bar} | {percentage}% | ETA: {eta}s | {value}/{total} assets' },
|
||||
Presets.shades_classic,
|
||||
);
|
||||
|
||||
if (progress) {
|
||||
multiBar = new MultiBar(
|
||||
{ format: '{message} | {bar} | {percentage}% | ETA: {eta}s | {value}/{total} assets' },
|
||||
Presets.shades_classic,
|
||||
);
|
||||
} else {
|
||||
console.log(`Received ${files.length} files, hashing...`);
|
||||
}
|
||||
|
||||
const hashProgressBar = multiBar?.create(files.length, 0, { message: 'Hashing files ' });
|
||||
const checkProgressBar = multiBar?.create(files.length, 0, { message: 'Checking for duplicates' });
|
||||
const hashProgressBar = multiBar.create(files.length, 0, { message: 'Hashing files ' });
|
||||
const checkProgressBar = multiBar.create(files.length, 0, { message: 'Checking for duplicates' });
|
||||
|
||||
const newFiles: string[] = [];
|
||||
const duplicates: Asset[] = [];
|
||||
@@ -205,7 +117,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
|
||||
}
|
||||
}
|
||||
|
||||
checkProgressBar?.increment(assets.length);
|
||||
checkProgressBar.increment(assets.length);
|
||||
},
|
||||
{ concurrency, retry: 3 },
|
||||
);
|
||||
@@ -225,7 +137,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
|
||||
void checkBulkUploadQueue.push(batch);
|
||||
}
|
||||
|
||||
hashProgressBar?.increment();
|
||||
hashProgressBar.increment();
|
||||
return results;
|
||||
},
|
||||
{ concurrency, retry: 3 },
|
||||
@@ -243,7 +155,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
|
||||
|
||||
await checkBulkUploadQueue.drained();
|
||||
|
||||
multiBar?.stop();
|
||||
multiBar.stop();
|
||||
|
||||
console.log(`Found ${newFiles.length} new files and ${duplicates.length} duplicate${s(duplicates.length)}`);
|
||||
|
||||
@@ -259,10 +171,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
|
||||
return { newFiles, duplicates };
|
||||
};
|
||||
|
||||
export const uploadFiles = async (
|
||||
files: string[],
|
||||
{ dryRun, concurrency, progress }: UploadOptionsDto,
|
||||
): Promise<Asset[]> => {
|
||||
export const uploadFiles = async (files: string[], { dryRun, concurrency }: UploadOptionsDto): Promise<Asset[]> => {
|
||||
if (files.length === 0) {
|
||||
console.log('All assets were already uploaded, nothing to do.');
|
||||
return [];
|
||||
@@ -282,20 +191,12 @@ export const uploadFiles = async (
|
||||
return files.map((filepath) => ({ id: '', filepath }));
|
||||
}
|
||||
|
||||
let uploadProgress: SingleBar | undefined;
|
||||
|
||||
if (progress) {
|
||||
uploadProgress = new SingleBar(
|
||||
{
|
||||
format: 'Uploading assets | {bar} | {percentage}% | ETA: {eta_formatted} | {value_formatted}/{total_formatted}',
|
||||
},
|
||||
Presets.shades_classic,
|
||||
);
|
||||
} else {
|
||||
console.log(`Uploading ${files.length} asset${s(files.length)} (${byteSize(totalSize)})`);
|
||||
}
|
||||
uploadProgress?.start(totalSize, 0);
|
||||
uploadProgress?.update({ value_formatted: 0, total_formatted: byteSize(totalSize) });
|
||||
const uploadProgress = new SingleBar(
|
||||
{ format: 'Uploading assets | {bar} | {percentage}% | ETA: {eta_formatted} | {value_formatted}/{total_formatted}' },
|
||||
Presets.shades_classic,
|
||||
);
|
||||
uploadProgress.start(totalSize, 0);
|
||||
uploadProgress.update({ value_formatted: 0, total_formatted: byteSize(totalSize) });
|
||||
|
||||
let duplicateCount = 0;
|
||||
let duplicateSize = 0;
|
||||
@@ -321,7 +222,7 @@ export const uploadFiles = async (
|
||||
successSize += stats.size ?? 0;
|
||||
}
|
||||
|
||||
uploadProgress?.update(successSize, { value_formatted: byteSize(successSize + duplicateSize) });
|
||||
uploadProgress.update(successSize, { value_formatted: byteSize(successSize + duplicateSize) });
|
||||
|
||||
return response;
|
||||
},
|
||||
@@ -334,7 +235,7 @@ export const uploadFiles = async (
|
||||
|
||||
await queue.drained();
|
||||
|
||||
uploadProgress?.stop();
|
||||
uploadProgress.stop();
|
||||
|
||||
console.log(`Successfully uploaded ${successCount} new asset${s(successCount)} (${byteSize(successSize)})`);
|
||||
if (duplicateCount > 0) {
|
||||
|
||||
@@ -69,13 +69,6 @@ program
|
||||
.default(4),
|
||||
)
|
||||
.addOption(new Option('--delete', 'Delete local assets after upload').env('IMMICH_DELETE_ASSETS'))
|
||||
.addOption(new Option('--no-progress', 'Hide progress bars').env('IMMICH_PROGRESS_BAR').default(true))
|
||||
.addOption(
|
||||
new Option('--watch', 'Watch for changes and upload automatically')
|
||||
.env('IMMICH_WATCH_CHANGES')
|
||||
.default(false)
|
||||
.implies({ progress: false }),
|
||||
)
|
||||
.argument('[paths...]', 'One or more paths to assets to be uploaded')
|
||||
.action((paths, options) => upload(paths, program.opts(), options));
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import mockfs from 'mock-fs';
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { Batcher, CrawlOptions, crawl } from 'src/utils';
|
||||
import { Mock } from 'vitest';
|
||||
import { CrawlOptions, crawl } from 'src/utils';
|
||||
|
||||
interface Test {
|
||||
test: string;
|
||||
@@ -304,38 +303,3 @@ describe('crawl', () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('Batcher', () => {
|
||||
let batcher: Batcher;
|
||||
let onBatch: Mock;
|
||||
beforeEach(() => {
|
||||
onBatch = vi.fn();
|
||||
batcher = new Batcher({ batchSize: 2, onBatch });
|
||||
});
|
||||
|
||||
it('should trigger onBatch() when a batch limit is reached', async () => {
|
||||
batcher.add('a');
|
||||
batcher.add('b');
|
||||
batcher.add('c');
|
||||
expect(onBatch).toHaveBeenCalledOnce();
|
||||
expect(onBatch).toHaveBeenCalledWith(['a', 'b']);
|
||||
});
|
||||
|
||||
it('should trigger onBatch() when flush() is called', async () => {
|
||||
batcher.add('a');
|
||||
batcher.flush();
|
||||
expect(onBatch).toHaveBeenCalledOnce();
|
||||
expect(onBatch).toHaveBeenCalledWith(['a']);
|
||||
});
|
||||
|
||||
it('should trigger onBatch() when debounce time reached', async () => {
|
||||
vi.useFakeTimers();
|
||||
batcher = new Batcher({ batchSize: 2, debounceTimeMs: 100, onBatch });
|
||||
batcher.add('a');
|
||||
expect(onBatch).not.toHaveBeenCalled();
|
||||
vi.advanceTimersByTime(200);
|
||||
expect(onBatch).toHaveBeenCalledOnce();
|
||||
expect(onBatch).toHaveBeenCalledWith(['a']);
|
||||
vi.useRealTimers();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -172,64 +172,3 @@ export const sha1 = (filepath: string) => {
|
||||
rs.on('end', () => resolve(hash.digest('hex')));
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Batches items and calls onBatch to process them
|
||||
* when the batch size is reached or the debounce time has passed.
|
||||
*/
|
||||
export class Batcher<T = unknown> {
|
||||
private items: T[] = [];
|
||||
private readonly batchSize: number;
|
||||
private readonly debounceTimeMs?: number;
|
||||
private readonly onBatch: (items: T[]) => void;
|
||||
private debounceTimer?: NodeJS.Timeout;
|
||||
|
||||
constructor({
|
||||
batchSize,
|
||||
debounceTimeMs,
|
||||
onBatch,
|
||||
}: {
|
||||
batchSize: number;
|
||||
debounceTimeMs?: number;
|
||||
onBatch: (items: T[]) => Promise<void>;
|
||||
}) {
|
||||
this.batchSize = batchSize;
|
||||
this.debounceTimeMs = debounceTimeMs;
|
||||
this.onBatch = onBatch;
|
||||
}
|
||||
|
||||
private setDebounceTimer() {
|
||||
if (this.debounceTimer) {
|
||||
clearTimeout(this.debounceTimer);
|
||||
}
|
||||
if (this.debounceTimeMs) {
|
||||
this.debounceTimer = setTimeout(() => this.flush(), this.debounceTimeMs);
|
||||
}
|
||||
}
|
||||
|
||||
private clearDebounceTimer() {
|
||||
if (this.debounceTimer) {
|
||||
clearTimeout(this.debounceTimer);
|
||||
this.debounceTimer = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
add(item: T) {
|
||||
this.items.push(item);
|
||||
this.setDebounceTimer();
|
||||
if (this.items.length >= this.batchSize) {
|
||||
this.flush();
|
||||
}
|
||||
}
|
||||
|
||||
flush() {
|
||||
this.clearDebounceTimer();
|
||||
if (this.items.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.onBatch(this.items);
|
||||
|
||||
this.items = [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ services:
|
||||
context: ../
|
||||
dockerfile: server/Dockerfile
|
||||
target: dev
|
||||
restart: unless-stopped
|
||||
restart: always
|
||||
volumes:
|
||||
- ../server:/usr/src/app
|
||||
- ../open-api:/usr/src/open-api
|
||||
@@ -95,12 +95,12 @@ services:
|
||||
image: immich-machine-learning-dev:latest
|
||||
# extends:
|
||||
# file: hwaccel.ml.yml
|
||||
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
|
||||
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
|
||||
build:
|
||||
context: ../machine-learning
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- DEVICE=cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
|
||||
- DEVICE=cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
|
||||
ports:
|
||||
- 3003:3003
|
||||
volumes:
|
||||
@@ -122,7 +122,7 @@ services:
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
|
||||
@@ -38,12 +38,12 @@ services:
|
||||
image: immich-machine-learning:latest
|
||||
# extends:
|
||||
# file: hwaccel.ml.yml
|
||||
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
|
||||
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
|
||||
build:
|
||||
context: ../machine-learning
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- DEVICE=cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
|
||||
- DEVICE=cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
|
||||
ports:
|
||||
- 3003:3003
|
||||
volumes:
|
||||
@@ -63,7 +63,7 @@ services:
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
@@ -77,12 +77,22 @@ services:
|
||||
- 5432:5432
|
||||
healthcheck:
|
||||
test: >-
|
||||
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
|
||||
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
|
||||
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
|
||||
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
|
||||
echo "checksum failure count is $$Chksum";
|
||||
[ "$$Chksum" = '0' ] || exit 1
|
||||
interval: 5m
|
||||
start_interval: 30s
|
||||
start_period: 5m
|
||||
command: >-
|
||||
postgres -c shared_preload_libraries=vectors.so -c 'search_path="$$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on
|
||||
postgres
|
||||
-c shared_preload_libraries=vectors.so
|
||||
-c 'search_path="$$user", public, vectors'
|
||||
-c logging_collector=on
|
||||
-c max_wal_size=2GB
|
||||
-c shared_buffers=512MB
|
||||
-c wal_compression=on
|
||||
restart: always
|
||||
|
||||
# set IMMICH_TELEMETRY_INCLUDE=all in .env to enable metrics
|
||||
@@ -90,7 +100,7 @@ services:
|
||||
container_name: immich_prometheus
|
||||
ports:
|
||||
- 9090:9090
|
||||
image: prom/prometheus@sha256:502ad90314c7485892ce696cb14a99fceab9fc27af29f4b427f41bd39701a199
|
||||
image: prom/prometheus@sha256:5888c188cf09e3f7eebc97369c3b2ce713e844cdbd88ccf36f5047c958aea120
|
||||
volumes:
|
||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
@@ -99,10 +109,10 @@ services:
|
||||
# add data source for http://immich-prometheus:9090 to get started
|
||||
immich-grafana:
|
||||
container_name: immich_grafana
|
||||
command: [ './run.sh', '-disable-reporting' ]
|
||||
command: ['./run.sh', '-disable-reporting']
|
||||
ports:
|
||||
- 3000:3000
|
||||
image: grafana/grafana:11.5.2-ubuntu@sha256:8b5858c447e06fd7a89006b562ba7bba7c4d5813600c7982374c41852adefaeb
|
||||
image: grafana/grafana:11.5.1-ubuntu@sha256:9a4ab78cec1a2ec7d1ca5dfd5aacec6412706a1bc9e971fc7184e2f6696a63f5
|
||||
volumes:
|
||||
- grafana-data:/var/lib/grafana
|
||||
|
||||
|
||||
@@ -33,12 +33,12 @@ services:
|
||||
|
||||
immich-machine-learning:
|
||||
container_name: immich_machine_learning
|
||||
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
|
||||
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
|
||||
# Example tag: ${IMMICH_VERSION:-release}-cuda
|
||||
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
|
||||
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
|
||||
# file: hwaccel.ml.yml
|
||||
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
|
||||
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
|
||||
volumes:
|
||||
- model-cache:/cache
|
||||
env_file:
|
||||
@@ -56,7 +56,7 @@ services:
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
POSTGRES_USER: ${DB_USERNAME}
|
||||
@@ -67,12 +67,22 @@ services:
|
||||
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: >-
|
||||
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
|
||||
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
|
||||
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
|
||||
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
|
||||
echo "checksum failure count is $$Chksum";
|
||||
[ "$$Chksum" = '0' ] || exit 1
|
||||
interval: 5m
|
||||
start_interval: 30s
|
||||
start_period: 5m
|
||||
command: >-
|
||||
postgres -c shared_preload_libraries=vectors.so -c 'search_path="$$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on
|
||||
postgres
|
||||
-c shared_preload_libraries=vectors.so
|
||||
-c 'search_path="$$user", public, vectors'
|
||||
-c logging_collector=on
|
||||
-c max_wal_size=2GB
|
||||
-c shared_buffers=512MB
|
||||
-c wal_compression=on
|
||||
restart: always
|
||||
|
||||
volumes:
|
||||
|
||||
@@ -13,13 +13,6 @@ services:
|
||||
volumes:
|
||||
- /lib/firmware/mali_csffw.bin:/lib/firmware/mali_csffw.bin:ro # Mali firmware for your chipset (not always required depending on the driver)
|
||||
- /usr/lib/libmali.so:/usr/lib/libmali.so:ro # Mali driver for your chipset (always required)
|
||||
|
||||
rknn:
|
||||
security_opt:
|
||||
- systempaths=unconfined
|
||||
- apparmor=unconfined
|
||||
devices:
|
||||
- /dev/dri:/dev/dri
|
||||
|
||||
cpu: {}
|
||||
|
||||
@@ -33,13 +26,6 @@ services:
|
||||
capabilities:
|
||||
- gpu
|
||||
|
||||
rocm:
|
||||
group_add:
|
||||
- video
|
||||
devices:
|
||||
- /dev/dri:/dev/dri
|
||||
- /dev/kfd:/dev/kfd
|
||||
|
||||
openvino:
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
|
||||
@@ -117,7 +117,7 @@ See [Backup and Restore](/docs/administration/backup-and-restore.md).
|
||||
|
||||
### Does Immich support reading existing face tag metadata?
|
||||
|
||||
Yes, it creates new faces and persons from the imported asset metadata. For details see the [feature request #4348](https://github.com/immich-app/immich/discussions/4348) and [PR #6455](https://github.com/immich-app/immich/pull/6455).
|
||||
No, it currently does not. There is an [open feature request on GitHub](https://github.com/immich-app/immich/discussions/4348).
|
||||
|
||||
### Does Immich support the filtering of NSFW images?
|
||||
|
||||
@@ -262,7 +262,7 @@ No, this is not supported. Only models listed in the [Hugging Face][huggingface]
|
||||
|
||||
### I want to be able to search in other languages besides English. How can I do that?
|
||||
|
||||
You can change to a multilingual CLIP model. See [here](/docs/features/searching#clip-models) for instructions.
|
||||
You can change to a multilingual CLIP model. See [here](/docs/features/searching#clip-model) for instructions.
|
||||
|
||||
### Does Immich support Facial Recognition for videos?
|
||||
|
||||
|
||||
@@ -30,13 +30,6 @@ As mentioned above, you should make your own backup of these together with the a
|
||||
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.
|
||||
|
||||
#### Trigger Backup
|
||||
|
||||
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.
|
||||
|
||||
#### 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.
|
||||
@@ -60,7 +53,7 @@ docker compose create # Create Docker containers for Immich apps witho
|
||||
docker start immich_postgres # Start Postgres server
|
||||
sleep 10 # Wait for Postgres server to start up
|
||||
# Check the database user if you deviated from the default
|
||||
gunzip --stdout "/path/to/backup/dump.sql.gz" \
|
||||
gunzip < "/path/to/backup/dump.sql.gz" \
|
||||
| sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" \
|
||||
| docker exec -i immich_postgres psql --dbname=postgres --username=<DB_USERNAME> # Restore Backup
|
||||
docker compose up -d # Start remainder of Immich apps
|
||||
@@ -83,8 +76,8 @@ docker compose create # Create Docker containers for
|
||||
docker start immich_postgres # Start Postgres server
|
||||
sleep 10 # Wait for Postgres server to start up
|
||||
docker exec -it immich_postgres bash # Enter the Docker shell and run the following command
|
||||
# Check the database user if you deviated from the default. If your backup ends in `.gz`, replace `cat` with `gunzip --stdout`
|
||||
cat "/dump.sql" | sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" | psql --dbname=postgres --username=<DB_USERNAME>
|
||||
# Check the database user if you deviated from the default. If your backup ends in `.gz`, replace `cat` with `gunzip`
|
||||
cat < "/dump.sql" | sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" | psql --dbname=postgres --username=<DB_USERNAME>
|
||||
exit # Exit the Docker shell
|
||||
docker compose up -d # Start remainder of Immich apps
|
||||
```
|
||||
|
||||
@@ -11,7 +11,6 @@ The `immich-server` docker image comes preinstalled with an administrative CLI (
|
||||
| `enable-oauth-login` | Enable OAuth login |
|
||||
| `disable-oauth-login` | Disable OAuth login |
|
||||
| `list-users` | List Immich users |
|
||||
| `version` | Print Immich version |
|
||||
|
||||
## How to run a command
|
||||
|
||||
@@ -81,10 +80,3 @@ immich-admin list-users
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Print Immich Version
|
||||
|
||||
```
|
||||
immich-admin version
|
||||
v1.129.0
|
||||
```
|
||||
|
||||
@@ -69,8 +69,6 @@ Navigating to Administration > Settings > Machine Learning Settings > Facial Rec
|
||||
|
||||
:::tip
|
||||
It's better to only tweak the parameters here than to set them to something very different unless you're ready to test a variety of options. If you do need to set a parameter to a strict setting, relaxing other settings can be a good option to compensate, and vice versa.
|
||||
|
||||
You can learn how the tune the result in this [Guide](/docs/guides/better-facial-clusters)
|
||||
:::
|
||||
|
||||
### Facial recognition model
|
||||
|
||||
@@ -37,7 +37,7 @@ To validate that Immich can reach your external library, start a shell inside th
|
||||
|
||||
### Exclusion Patterns
|
||||
|
||||
By default, all files in the import paths will be added to the library. If there are files that should not be added, exclusion patterns can be used to exclude them. Exclusion patterns are glob patterns are matched against the full file path. If a file matches an exclusion pattern, it will not be added to the library. Exclusion patterns can be added in the Scan Settings page for each library.
|
||||
By default, all files in the import paths will be added to the library. If there are files that should not be added, exclusion patterns can be used to exclude them. Exclusion patterns are glob patterns are matched against the full file path. If a file matches an exclusion pattern, it will not be added to the library. Exclusion patterns can be added in the Scan Settings page for each library. Under the hood, Immich uses the [glob](https://www.npmjs.com/package/glob) package to match patterns, so please refer to [their documentation](https://github.com/isaacs/node-glob#glob-primer) to see what patterns are supported.
|
||||
|
||||
Some basic examples:
|
||||
|
||||
@@ -48,11 +48,7 @@ Some basic examples:
|
||||
|
||||
Special characters such as @ should be escaped, for instance:
|
||||
|
||||
- `**/\@eaDir/**` will exclude all files in any directory named `@eaDir`
|
||||
|
||||
:::info
|
||||
Internally, Immich uses the [glob](https://www.npmjs.com/package/glob) package to process exclusion patterns, and sometimes those patterns are translated into [Postgres LIKE patterns](https://www.postgresql.org/docs/current/functions-matching.html). The intention is to support basic folder exclusions but we recommend against advanced usage since those can't reliably be translated to the Postgres syntax. Please refer to the [glob documentation](https://github.com/isaacs/node-glob#glob-primer) for a basic overview on glob patterns.
|
||||
:::
|
||||
- `**/\@eadir/**` will exclude all files in any directory named `@eadir`
|
||||
|
||||
### Automatic watching (EXPERIMENTAL)
|
||||
|
||||
@@ -72,7 +68,7 @@ In rare cases, the library watcher can hang, preventing Immich from starting up.
|
||||
|
||||
### Nightly job
|
||||
|
||||
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library managment page.
|
||||
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -95,7 +91,7 @@ The `immich-server` container will need access to the gallery. Modify your docke
|
||||
+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
|
||||
+ - /home/user/old-pics:/mnt/media/old-pics:ro
|
||||
+ - /mnt/media/videos:/mnt/media/videos:ro
|
||||
+ - /mnt/media/videos2:/mnt/media/videos2 # WARNING: Immich will be able to delete the files in this folder, as it does not end with :ro
|
||||
+ - /mnt/media/videos2:/mnt/media/videos2 # the files in this folder can be deleted, as it does not end with :ro
|
||||
+ - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system.
|
||||
```
|
||||
|
||||
|
||||
@@ -11,9 +11,7 @@ You do not need to redo any machine learning jobs after enabling hardware accele
|
||||
|
||||
- ARM NN (Mali)
|
||||
- CUDA (NVIDIA GPUs with [compute capability](https://developer.nvidia.com/cuda-gpus) 5.2 or higher)
|
||||
- ROCm (AMD GPUs)
|
||||
- OpenVINO (Intel GPUs such as Iris Xe and Arc)
|
||||
- RKNN (Rockchip)
|
||||
|
||||
## Limitations
|
||||
|
||||
@@ -21,7 +19,6 @@ You do not need to redo any machine learning jobs after enabling hardware accele
|
||||
- Only Linux and Windows (through WSL2) servers are supported.
|
||||
- ARM NN is only supported on devices with Mali GPUs. Other Arm devices are not supported.
|
||||
- Some models may not be compatible with certain backends. CUDA is the most reliable.
|
||||
- Search latency isn't improved by ARM NN due to model compatibility issues preventing its use. However, smart search jobs do make use of ARM NN.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
@@ -36,7 +33,6 @@ You do not need to redo any machine learning jobs after enabling hardware accele
|
||||
- The `hwaccel.ml.yml` file assumes the path to it is `/usr/lib/libmali.so`, so update accordingly if it is elsewhere
|
||||
- The `hwaccel.ml.yml` file assumes an additional file `/lib/firmware/mali_csffw.bin`, so update accordingly if your device's driver does not require this file
|
||||
- Optional: Configure your `.env` file, see [environment variables](/docs/install/environment-variables) for ARM NN specific settings
|
||||
- In particular, the `MACHINE_LEARNING_ANN_FP16_TURBO` can significantly improve performance at the cost of very slightly lower accuracy
|
||||
|
||||
#### CUDA
|
||||
|
||||
@@ -45,38 +41,22 @@ You do not need to redo any machine learning jobs after enabling hardware accele
|
||||
- The installed driver must be >= 535 (it must support CUDA 12.2).
|
||||
- On Linux (except for WSL2), you also need to have [NVIDIA Container Toolkit][nvct] installed.
|
||||
|
||||
#### ROCm
|
||||
|
||||
- The GPU must be supported by ROCm. If it isn't officially supported, you can attempt to use the `HSA_OVERRIDE_GFX_VERSION` environmental variable: `HSA_OVERRIDE_GFX_VERSION=<a supported version, e.g. 10.3.0>`. If this doesn't work, you might need to also set `HSA_USE_SVM=0`.
|
||||
- The ROCm image is quite large and requires at least 35GiB of free disk space. However, pulling later updates to the service through Docker will generally only amount to a few hundred megabytes as the rest will be cached.
|
||||
- This backend is new and may experience some issues. For example, GPU power consumption can be higher than usual after running inference, even if the machine learning service is idle. In this case, it will only go back to normal after being idle for 5 minutes (configurable with the [MACHINE_LEARNING_MODEL_TTL](/docs/install/environment-variables) setting).
|
||||
|
||||
#### OpenVINO
|
||||
|
||||
- Integrated GPUs are more likely to experience issues than discrete GPUs, especially for older processors or servers with low RAM.
|
||||
- Ensure the server's kernel version is new enough to use the device for hardware accceleration.
|
||||
- Expect higher RAM usage when using OpenVINO compared to CPU processing.
|
||||
|
||||
#### RKNN
|
||||
|
||||
- You must have a supported Rockchip SoC: only RK3566, RK3568, RK3576 and RK3588 are supported at this moment.
|
||||
- Make sure you have the appropriate linux kernel driver installed
|
||||
- This is usually pre-installed on the device vendor's Linux images
|
||||
- RKNPU driver V0.9.8 or later must be available in the host server
|
||||
- You may confirm this by running `cat /sys/kernel/debug/rknpu/version` to check the version
|
||||
- Optional: Configure your `.env` file, see [environment variables](/docs/install/environment-variables) for RKNN specific settings
|
||||
- In particular, setting `MACHINE_LEARNING_RKNN_THREADS` to 2 or 3 can _dramatically_ improve performance for RK3576 and RK3588 compared to the default of 1, at the expense of multiplying the amount of RAM each model uses by that amount.
|
||||
|
||||
## Setup
|
||||
|
||||
1. If you do not already have it, download the latest [`hwaccel.ml.yml`][hw-file] file and ensure it's in the same folder as the `docker-compose.yml`.
|
||||
2. In the `docker-compose.yml` under `immich-machine-learning`, uncomment the `extends` section and change `cpu` to the appropriate backend.
|
||||
3. Still in `immich-machine-learning`, add one of -[armnn, cuda, rocm, openvino] to the `image` section's tag at the end of the line.
|
||||
3. Still in `immich-machine-learning`, add one of -[armnn, cuda, openvino] to the `image` section's tag at the end of the line.
|
||||
4. Redeploy the `immich-machine-learning` container with these updated settings.
|
||||
|
||||
### Confirming Device Usage
|
||||
|
||||
You can confirm the device is being recognized and used by checking its utilization. There are many tools to display this, such as `nvtop` for NVIDIA or Intel, `intel_gpu_top` for Intel, and `radeontop` for AMD.
|
||||
You can confirm the device is being recognized and used by checking its utilization. There are many tools to display this, such as `nvtop` for NVIDIA or Intel and `intel_gpu_top` for Intel.
|
||||
|
||||
You can also check the logs of the `immich-machine-learning` container. When a Smart Search or Face Detection job begins, or when you search with text in Immich, you should either see a log for `Available ORT providers` containing the relevant provider (e.g. `CUDAExecutionProvider` in the case of CUDA), or a `Loaded ANN model` log entry without errors in the case of ARM NN.
|
||||
|
||||
@@ -147,12 +127,3 @@ Note that you should increase job concurrencies to increase overall utilization
|
||||
- If you encounter an error when a model is running, try a different model to see if the issue is model-specific.
|
||||
- You may want to increase concurrency past the default for higher utilization. However, keep in mind that this will also increase VRAM consumption.
|
||||
- Larger models benefit more from hardware acceleration, if you have the VRAM for them.
|
||||
- Compared to ARM NN, RKNPU has:
|
||||
- Wider model support (including for search, which ARM NN does not accelerate)
|
||||
- Less heat generation
|
||||
- Very slightly lower accuracy (RKNPU always uses FP16, while ARM NN by default uses higher precision FP32 unless `MACHINE_LEARNING_ANN_FP16_TURBO` is enabled)
|
||||
- Varying speed (tested on RK3588):
|
||||
- If `MACHINE_LEARNING_RKNN_THREADS` is at the default of 1, RKNPU will have substantially lower throughput for ML jobs than ARM NN in most cases, but similar latency (such as when searching)
|
||||
- If `MACHINE_LEARNING_RKNN_THREADS` is set to 3, it will be somewhat faster than ARM NN at FP32, but somewhat slower than ARM NN if `MACHINE_LEARNING_ANN_FP16_TURBO` is enabled
|
||||
- When other tasks also use the GPU (like transcoding), RKNPU has a significant advantage over ARM NN as it uses the otherwise idle NPU instead of competing for GPU usage
|
||||
- Lower RAM usage if `MACHINE_LEARNING_RKNN_THREADS` is at the default of 1, but significantly higher if greater than 1 (which is necessary for it to fully utilize the NPU and hence be comparable in speed to ARM NN)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -18,7 +18,7 @@ For the full list, refer to the [Immich source code](https://github.com/immich-a
|
||||
| `JPEG 2000` | `.jp2` | :white_check_mark: | |
|
||||
| `JPEG` | `.webp` `.jpg` `.jpe` `.insp` | :white_check_mark: | |
|
||||
| `JPEG XL` | `.jxl` | :white_check_mark: | |
|
||||
| `PNG` | `.png` | :white_check_mark: | |
|
||||
| `PNG` | `.webp` | :white_check_mark: | |
|
||||
| `PSD` | `.psd` | :white_check_mark: | Adobe Photoshop |
|
||||
| `RAW` | `.raw` | :white_check_mark: | |
|
||||
| `RW2` | `.rw2` | :white_check_mark: | |
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
# Better Facial Recognition Clusters
|
||||
|
||||
## Purpose
|
||||
|
||||
This guide explains how to optimize facial recognition in systems with large image libraries. By following these steps, you'll achieve better clustering of faces, reducing the need for manual merging.
|
||||
|
||||
---
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **Best Suited For:** Large image libraries after importing a significant number of images.
|
||||
- **Warning:** This method deletes all previously assigned names.
|
||||
- **Tip:** **Always take a [backup](/docs/administration/backup-and-restore#database) before proceeding!**
|
||||
|
||||
---
|
||||
|
||||
## Step-by-Step Instructions
|
||||
|
||||
### Objective
|
||||
|
||||
To enhance face clustering and ensure the model effectively identifies faces using qualitative initial data.
|
||||
|
||||
---
|
||||
|
||||
### Steps
|
||||
|
||||
#### 1. Adjust Machine Learning Settings
|
||||
|
||||
Navigate to:
|
||||
**Admin → Administration → Settings → Machine Learning Settings**
|
||||
|
||||
Make the following changes:
|
||||
|
||||
- **Maximum recognition distance (Optional):**
|
||||
Lower this value, e.g., to **0.4**, if the library contains people with similar facial features.
|
||||
- **Minimum recognized faces:**
|
||||
Set this to a **high value** (e.g., 20 For libraries with a large amount of assets (~100K+), and 10 for libraries with medium amount of assets (~40K+)).
|
||||
> A high value ensures clusters only include faces that appear at least 20/`value` times in the library, improving the initial clustering process.
|
||||
|
||||
---
|
||||
|
||||
#### 2. Run Reset Jobs
|
||||
|
||||
Go to:
|
||||
**Admin → Administration → Settings → Jobs**
|
||||
|
||||
Perform the following:
|
||||
|
||||
1. **FACIAL RECOGNITION → Reset**
|
||||
|
||||
> These reset jobs rebuild the recognition model based on the new settings.
|
||||
|
||||
---
|
||||
|
||||
#### 3. Refine Recognition with Lower Thresholds
|
||||
|
||||
Once the reset jobs are complete, refine the recognition as follows:
|
||||
|
||||
- **Step 1:**
|
||||
Return to **Minimum recognized faces** in Machine Learning Settings and lower the value to **10** (In medium libraries we will lower the value from 10 to 5).
|
||||
|
||||
> Run the job: **FACIAL RECOGNITION → MISSING Mode**
|
||||
|
||||
- **Step 2:**
|
||||
Lower the value again to **3**.
|
||||
> Run the job: **FACIAL RECOGNITION → MISSING Mode**
|
||||
|
||||
:::tip try different values
|
||||
For certain libraries with a larger or smaller amount of assets, other settings will be better or worse. It is recommended to try different values **before assigning names** and see which settings work best for your library.
|
||||
:::
|
||||
|
||||
---
|
||||
@@ -31,10 +31,6 @@ SELECT * FROM "assets" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
|
||||
SELECT * FROM "assets" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
|
||||
```
|
||||
|
||||
```sql title="Find by partial ID"
|
||||
SELECT * FROM "assets" WHERE "id"::text LIKE '%ab431d3a%';
|
||||
```
|
||||
|
||||
:::note
|
||||
You can calculate the checksum for a particular file by using the command `sha1sum <filename>`.
|
||||
:::
|
||||
|
||||
@@ -23,12 +23,12 @@ name: immich_remote_ml
|
||||
services:
|
||||
immich-machine-learning:
|
||||
container_name: immich_machine_learning
|
||||
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino] to the image tag.
|
||||
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
|
||||
# Example tag: ${IMMICH_VERSION:-release}-cuda
|
||||
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
|
||||
# extends:
|
||||
# file: hwaccel.ml.yml
|
||||
# service: # set to one of [armnn, cuda, rocm, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
|
||||
# service: # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
|
||||
volumes:
|
||||
- model-cache:/cache
|
||||
restart: always
|
||||
|
||||
@@ -11,7 +11,7 @@ Just restarting the containers does not replace the environment within the conta
|
||||
|
||||
In order to recreate the container using docker compose, run `docker compose up -d`.
|
||||
In most cases docker will recognize that the `.env` file has changed and recreate the affected containers.
|
||||
If this does not work, try running `docker compose up -d --force-recreate`.
|
||||
If this should not work, try running `docker compose up -d --force-recreate`.
|
||||
|
||||
:::
|
||||
|
||||
@@ -20,8 +20,8 @@ If this does not work, try running `docker compose up -d --force-recreate`.
|
||||
| Variable | Description | Default | Containers |
|
||||
| :----------------- | :------------------------------ | :-------: | :----------------------- |
|
||||
| `IMMICH_VERSION` | Image tags | `release` | server, machine learning |
|
||||
| `UPLOAD_LOCATION` | Host path for uploads | | server |
|
||||
| `DB_DATA_LOCATION` | Host path for Postgres database | | database |
|
||||
| `UPLOAD_LOCATION` | Host Path for uploads | | server |
|
||||
| `DB_DATA_LOCATION` | Host Path for Postgres database | | database |
|
||||
|
||||
:::tip
|
||||
These environment variables are used by the `docker-compose.yml` file and do **NOT** affect the containers directly.
|
||||
@@ -33,15 +33,15 @@ These environment variables are used by the `docker-compose.yml` file and do **N
|
||||
| :---------------------------------- | :---------------------------------------------------------------------------------------- | :--------------------------: | :----------------------- | :----------------- |
|
||||
| `TZ` | Timezone | <sup>\*1</sup> | server | microservices |
|
||||
| `IMMICH_ENV` | Environment (production, development) | `production` | server, machine learning | api, microservices |
|
||||
| `IMMICH_LOG_LEVEL` | Log level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
|
||||
| `IMMICH_MEDIA_LOCATION` | Media location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `./upload`<sup>\*3</sup> | server | api, microservices |
|
||||
| `IMMICH_LOG_LEVEL` | Log Level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
|
||||
| `IMMICH_MEDIA_LOCATION` | Media Location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `./upload`<sup>\*3</sup> | server | api, microservices |
|
||||
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
|
||||
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
|
||||
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
|
||||
| `CPU_CORES` | Amount of cores available to the immich server | auto-detected cpu core count | server | |
|
||||
| `IMMICH_API_METRICS_PORT` | Port for the OTEL metrics | `8081` | server | api |
|
||||
| `IMMICH_MICROSERVICES_METRICS_PORT` | Port for the OTEL metrics | `8082` | server | microservices |
|
||||
| `IMMICH_PROCESS_INVALID_IMAGES` | When `true`, generate thumbnails for invalid images | | server | microservices |
|
||||
| `IMMICH_TRUSTED_PROXIES` | List of comma-separated IPs set as trusted proxies | | server | api |
|
||||
| `IMMICH_TRUSTED_PROXIES` | List of comma separated IPs set as trusted proxies | | server | api |
|
||||
| `IMMICH_IGNORE_MOUNT_CHECK_ERRORS` | See [System Integrity](/docs/administration/system-integrity) | | server | api, microservices |
|
||||
|
||||
\*1: `TZ` should be set to a `TZ identifier` from [this list][tz-list]. For example, `TZ="Etc/UTC"`.
|
||||
@@ -50,7 +50,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
|
||||
\*2: This path is where the Immich code looks for the files, which is internal to the docker container. Setting it to a path on your host will certainly break things, you should use the `UPLOAD_LOCATION` variable instead.
|
||||
|
||||
\*3: With the default `WORKDIR` of `/usr/src/app`, this path will resolve to `/usr/src/app/upload`.
|
||||
It only needs to be set if the Immich deployment method is changing.
|
||||
It only need to be set if the Immich deployment method is changing.
|
||||
|
||||
## Workers
|
||||
|
||||
@@ -75,12 +75,12 @@ Information on the current workers can be found [here](/docs/administration/jobs
|
||||
| Variable | Description | Default | Containers |
|
||||
| :---------------------------------- | :----------------------------------------------------------------------- | :----------: | :----------------------------- |
|
||||
| `DB_URL` | Database URL | | server |
|
||||
| `DB_HOSTNAME` | Database host | `database` | server |
|
||||
| `DB_PORT` | Database port | `5432` | server |
|
||||
| `DB_USERNAME` | Database user | `postgres` | server, database<sup>\*1</sup> |
|
||||
| `DB_PASSWORD` | Database password | `postgres` | server, database<sup>\*1</sup> |
|
||||
| `DB_DATABASE_NAME` | Database name | `immich` | server, database<sup>\*1</sup> |
|
||||
| `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database vector extension (one of [`pgvector`, `pgvecto.rs`]) | `pgvecto.rs` | server |
|
||||
| `DB_HOSTNAME` | Database Host | `database` | server |
|
||||
| `DB_PORT` | Database Port | `5432` | server |
|
||||
| `DB_USERNAME` | Database User | `postgres` | server, database<sup>\*1</sup> |
|
||||
| `DB_PASSWORD` | Database Password | `postgres` | server, database<sup>\*1</sup> |
|
||||
| `DB_DATABASE_NAME` | Database Name | `immich` | server, database<sup>\*1</sup> |
|
||||
| `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database Vector Extension (one of [`pgvector`, `pgvecto.rs`]) | `pgvecto.rs` | server |
|
||||
| `DB_SKIP_MIGRATIONS` | Whether to skip running migrations on startup (one of [`true`, `false`]) | `false` | server |
|
||||
|
||||
\*1: The values of `DB_USERNAME`, `DB_PASSWORD`, and `DB_DATABASE_NAME` are passed to the Postgres container as the variables `POSTGRES_USER`, `POSTGRES_PASSWORD`, and `POSTGRES_DB` in `docker-compose.yml`.
|
||||
@@ -103,18 +103,18 @@ When `DB_URL` is defined, the `DB_HOSTNAME`, `DB_PORT`, `DB_USERNAME`, `DB_PASSW
|
||||
| Variable | Description | Default | Containers |
|
||||
| :--------------- | :------------- | :-----: | :--------- |
|
||||
| `REDIS_URL` | Redis URL | | server |
|
||||
| `REDIS_SOCKET` | Redis socket | | server |
|
||||
| `REDIS_HOSTNAME` | Redis host | `redis` | server |
|
||||
| `REDIS_PORT` | Redis port | `6379` | server |
|
||||
| `REDIS_USERNAME` | Redis username | | server |
|
||||
| `REDIS_PASSWORD` | Redis password | | server |
|
||||
| `REDIS_DBINDEX` | Redis DB index | `0` | server |
|
||||
| `REDIS_SOCKET` | Redis Socket | | server |
|
||||
| `REDIS_HOSTNAME` | Redis Host | `redis` | server |
|
||||
| `REDIS_PORT` | Redis Port | `6379` | server |
|
||||
| `REDIS_USERNAME` | Redis Username | | server |
|
||||
| `REDIS_PASSWORD` | Redis Password | | server |
|
||||
| `REDIS_DBINDEX` | Redis DB Index | `0` | server |
|
||||
|
||||
:::info
|
||||
All `REDIS_` variables must be provided to all Immich workers, including `api` and `microservices`.
|
||||
|
||||
`REDIS_URL` must start with `ioredis://` and then include a `base64` encoded JSON string for the configuration.
|
||||
More information can be found in the upstream [ioredis] documentation.
|
||||
More info can be found in the upstream [ioredis] documentation.
|
||||
|
||||
When `REDIS_URL` or `REDIS_SOCKET` are defined, the `REDIS_HOSTNAME`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`, and `REDIS_DBINDEX` variables are ignored.
|
||||
:::
|
||||
@@ -170,8 +170,6 @@ Redis (Sentinel) URL example JSON before encoding:
|
||||
| `MACHINE_LEARNING_MAX_BATCH_SIZE__FACIAL_RECOGNITION` | Set the maximum number of faces that will be processed at once by the facial recognition model | None (`1` if using OpenVINO) | machine learning |
|
||||
| `MACHINE_LEARNING_PING_TIMEOUT` | How long (ms) to wait for a PING response when checking if an ML server is available | `2000` | server |
|
||||
| `MACHINE_LEARNING_AVAILABILITY_BACKOFF_TIME` | How long to ignore ML servers that are offline before trying again | `30000` | server |
|
||||
| `MACHINE_LEARNING_RKNN` | Enable RKNN hardware acceleration if supported | `True` | machine learning |
|
||||
| `MACHINE_LEARNING_RKNN_THREADS` | How many threads of RKNN runtime should be spinned up while inferencing. | `1` | machine learning |
|
||||
|
||||
\*1: It is recommended to begin with this parameter when changing the concurrency levels of the machine learning service and then tune the other ones.
|
||||
|
||||
@@ -183,11 +181,7 @@ Redis (Sentinel) URL example JSON before encoding:
|
||||
|
||||
:::info
|
||||
|
||||
While the `textual` model is the only one required for smart search, some users may experience slow first searches
|
||||
due to backups triggering loading of the other models into memory, which blocks other requests until completed.
|
||||
To avoid this, you can preload the other models (`visual`, `recognition`, and `detection`) if you have enough RAM to do so.
|
||||
|
||||
Additional machine learning parameters can be tuned from the admin UI.
|
||||
Other machine learning parameters can be tuned from the admin UI.
|
||||
|
||||
:::
|
||||
|
||||
@@ -218,7 +212,7 @@ the `_FILE` variable should be set to the path of a file containing the variable
|
||||
details on how to use Docker Secrets in the Postgres image.
|
||||
|
||||
\*2: See [this comment][docker-secrets-example] for an example of how
|
||||
to use a Docker secret for the password in the Redis container.
|
||||
to use use a Docker secret for the password in the Redis container.
|
||||
|
||||
[tz-list]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
|
||||
[docker-secrets-example]: https://github.com/docker-library/redis/issues/46#issuecomment-335326234
|
||||
|
||||
@@ -77,7 +77,7 @@ alt="Select Plugins > Compose.Manager > Add New Stack > Label it Immich"
|
||||
7. Paste the entire contents of the [Immich example.env](https://github.com/immich-app/immich/releases/latest/download/example.env) file into the Unraid editor, then **before saving** edit the following:
|
||||
|
||||
- `UPLOAD_LOCATION`: Create a folder in your Images Unraid share and place the **absolute** location here > For example my _"images"_ share has a folder within it called _"immich"_. If I browse to this directory in the terminal and type `pwd` the output is `/mnt/user/images/immich`. This is the exact value I need to enter as my `UPLOAD_LOCATION`
|
||||
- `DB_DATA_LOCATION`: Change this to use an Unraid share (preferably a cache pool, e.g. `/mnt/user/appdata/postgresql/data`). This uses the `appdata` share. Do also create the `postgresql` folder, by running `mkdir /mnt/user/{share_location}/postgresql/data`. If left at default it will try to use Unraid's `/boot/config/plugins/compose.manager/projects/[stack_name]/postgres` folder which it doesn't have permissions to, resulting in this container continuously restarting.
|
||||
- `DB_DATA_LOCATION`: Change this to use an Unraid share (preferably a cache pool, e.g. `/mnt/user/appdata`). If left at default it will try to use Unraid's `/boot/config/plugins/compose.manager/projects/[stack_name]/postgres` folder which it doesn't have permissions to, resulting in this container continuously restarting.
|
||||
|
||||
<img
|
||||
src={require('./img/unraid05.webp').default}
|
||||
|
||||
36
docs/package-lock.json
generated
36
docs/package-lock.json
generated
@@ -5308,9 +5308,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/autoprefixer": {
|
||||
"version": "10.4.21",
|
||||
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
|
||||
"integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
|
||||
"version": "10.4.20",
|
||||
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
|
||||
"integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -5327,11 +5327,11 @@
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.24.4",
|
||||
"caniuse-lite": "^1.0.30001702",
|
||||
"browserslist": "^4.23.3",
|
||||
"caniuse-lite": "^1.0.30001646",
|
||||
"fraction.js": "^4.3.7",
|
||||
"normalize-range": "^0.1.2",
|
||||
"picocolors": "^1.1.1",
|
||||
"picocolors": "^1.0.1",
|
||||
"postcss-value-parser": "^4.2.0"
|
||||
},
|
||||
"bin": {
|
||||
@@ -5781,9 +5781,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001706",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz",
|
||||
"integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==",
|
||||
"version": "1.0.30001695",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
|
||||
"integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -14070,9 +14070,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.3",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
|
||||
"integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
|
||||
"version": "8.5.2",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
|
||||
"integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -15734,9 +15734,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "3.5.3",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
|
||||
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
|
||||
"integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
@@ -18377,9 +18377,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.8.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
|
||||
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
|
||||
"version": "5.7.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
|
||||
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
export const discordPath =
|
||||
'M81.15,0c-1.2376,2.1973-2.3489,4.4704-3.3591,6.794-9.5975-1.4396-19.3718-1.4396-28.9945,0-.985-2.3236-2.1216-4.5967-3.3591-6.794-9.0166,1.5407-17.8059,4.2431-26.1405,8.0568C2.779,32.5304-1.6914,56.3725.5312,79.8863c9.6732,7.1476,20.5083,12.603,32.0505,16.0884,2.6014-3.4854,4.8998-7.1981,6.8698-11.0623-3.738-1.3891-7.3497-3.1318-10.8098-5.1523.9092-.6567,1.7932-1.3386,2.6519-1.9953,20.281,9.547,43.7696,9.547,64.0758,0,.8587.7072,1.7427,1.3891,2.6519,1.9953-3.4601,2.0457-7.0718,3.7632-10.835,5.1776,1.97,3.8642,4.2683,7.5769,6.8698,11.0623,11.5419-3.4854,22.3769-8.9156,32.0509-16.0631,2.626-27.2771-4.496-50.9172-18.817-71.8548C98.9811,4.2684,90.1918,1.5659,81.1752.0505l-.0252-.0505ZM42.2802,65.4144c-6.2383,0-11.4159-5.6575-11.4159-12.6535s4.9755-12.6788,11.3907-12.6788,11.5169,5.708,11.4159,12.6788c-.101,6.9708-5.026,12.6535-11.3907,12.6535ZM84.3576,65.4144c-6.2637,0-11.3907-5.6575-11.3907-12.6535s4.9755-12.6788,11.3907-12.6788,11.4917,5.708,11.3906,12.6788c-.101,6.9708-5.026,12.6535-11.3906,12.6535Z';
|
||||
export const discordViewBox = '0 0 126.644 96';
|
||||
'M 9.1367188 3.8691406 C 9.1217187 3.8691406 9.1067969 3.8700938 9.0917969 3.8710938 C 8.9647969 3.8810937 5.9534375 4.1403594 4.0234375 5.6933594 C 3.0154375 6.6253594 1 12.073203 1 16.783203 C 1 16.866203 1.0215 16.946531 1.0625 17.019531 C 2.4535 19.462531 6.2473281 20.102859 7.1113281 20.130859 L 7.1269531 20.130859 C 7.2799531 20.130859 7.4236719 20.057594 7.5136719 19.933594 L 8.3886719 18.732422 C 6.0296719 18.122422 4.8248594 17.086391 4.7558594 17.025391 C 4.5578594 16.850391 4.5378906 16.549563 4.7128906 16.351562 C 4.8068906 16.244563 4.9383125 16.189453 5.0703125 16.189453 C 5.1823125 16.189453 5.2957188 16.228594 5.3867188 16.308594 C 5.4157187 16.334594 7.6340469 18.216797 11.998047 18.216797 C 16.370047 18.216797 18.589328 16.325641 18.611328 16.306641 C 18.702328 16.227641 18.815734 16.189453 18.927734 16.189453 C 19.059734 16.189453 19.190156 16.243562 19.285156 16.351562 C 19.459156 16.549563 19.441141 16.851391 19.244141 17.025391 C 19.174141 17.087391 17.968375 18.120469 15.609375 18.730469 L 16.484375 19.933594 C 16.574375 20.057594 16.718094 20.130859 16.871094 20.130859 L 16.886719 20.130859 C 17.751719 20.103859 21.5465 19.463531 22.9375 17.019531 C 22.9785 16.947531 23 16.866203 23 16.783203 C 23 12.073203 20.984172 6.624875 19.951172 5.671875 C 18.047172 4.140875 15.036203 3.8820937 14.908203 3.8710938 C 14.895203 3.8700938 14.880188 3.8691406 14.867188 3.8691406 C 14.681188 3.8691406 14.510594 3.9793906 14.433594 4.1503906 C 14.427594 4.1623906 14.362062 4.3138281 14.289062 4.5488281 C 15.548063 4.7608281 17.094141 5.1895937 18.494141 6.0585938 C 18.718141 6.1975938 18.787437 6.4917969 18.648438 6.7167969 C 18.558438 6.8627969 18.402188 6.9433594 18.242188 6.9433594 C 18.156188 6.9433594 18.069234 6.9200937 17.990234 6.8710938 C 15.584234 5.3800938 12.578 5.3046875 12 5.3046875 C 11.422 5.3046875 8.4157187 5.3810469 6.0117188 6.8730469 C 5.9327188 6.9210469 5.8457656 6.9433594 5.7597656 6.9433594 C 5.5997656 6.9433594 5.4425625 6.86475 5.3515625 6.71875 C 5.2115625 6.49375 5.2818594 6.1985938 5.5058594 6.0585938 C 6.9058594 5.1905937 8.4528906 4.7627812 9.7128906 4.5507812 C 9.6388906 4.3147813 9.5714062 4.1643437 9.5664062 4.1523438 C 9.4894063 3.9813438 9.3217188 3.8691406 9.1367188 3.8691406 z M 12 7.3046875 C 12.296 7.3046875 14.950594 7.3403125 16.933594 8.5703125 C 17.326594 8.8143125 17.777234 8.9453125 18.240234 8.9453125 C 18.633234 8.9453125 19.010656 8.8555 19.347656 8.6875 C 19.964656 10.2405 20.690828 12.686219 20.923828 15.199219 C 20.883828 15.143219 20.840922 15.089109 20.794922 15.037109 C 20.324922 14.498109 19.644687 14.191406 18.929688 14.191406 C 18.332687 14.191406 17.754078 14.405437 17.330078 14.773438 C 17.257078 14.832437 15.505 16.21875 12 16.21875 C 8.496 16.21875 6.7450313 14.834687 6.7070312 14.804688 C 6.2540312 14.407687 5.6742656 14.189453 5.0722656 14.189453 C 4.3612656 14.189453 3.6838438 14.494391 3.2148438 15.025391 C 3.1658438 15.080391 3.1201719 15.138266 3.0761719 15.197266 C 3.3091719 12.686266 4.0344375 10.235594 4.6484375 8.6835938 C 4.9864375 8.8525938 5.3657656 8.9433594 5.7597656 8.9433594 C 6.2217656 8.9433594 6.6724531 8.8143125 7.0644531 8.5703125 C 9.0494531 7.3393125 11.704 7.3046875 12 7.3046875 z M 8.890625 10.044922 C 7.966625 10.044922 7.2167969 10.901031 7.2167969 11.957031 C 7.2167969 13.013031 7.965625 13.869141 8.890625 13.869141 C 9.815625 13.869141 10.564453 13.013031 10.564453 11.957031 C 10.564453 10.900031 9.815625 10.044922 8.890625 10.044922 z M 15.109375 10.044922 C 14.185375 10.044922 13.435547 10.901031 13.435547 11.957031 C 13.435547 13.013031 14.184375 13.869141 15.109375 13.869141 C 16.034375 13.869141 16.783203 13.013031 16.783203 11.957031 C 16.783203 10.900031 16.033375 10.044922 15.109375 10.044922 z';
|
||||
|
||||
@@ -4,7 +4,7 @@ import React, { useEffect, useState } from 'react';
|
||||
|
||||
export default function VersionSwitcher(): JSX.Element {
|
||||
const [versions, setVersions] = useState([]);
|
||||
const [activeLabel, setLabel] = useState('Versions');
|
||||
const [label, setLabel] = useState('Versions');
|
||||
|
||||
const windowSize = useWindowSize();
|
||||
|
||||
@@ -48,13 +48,12 @@ export default function VersionSwitcher(): JSX.Element {
|
||||
versions.length > 0 && (
|
||||
<DropdownNavbarItem
|
||||
className="version-switcher-34ab39"
|
||||
label={activeLabel}
|
||||
label={label}
|
||||
mobile={windowSize === 'mobile'}
|
||||
items={versions.map(({ label, url }) => ({
|
||||
label,
|
||||
to: new URL(location.pathname + location.search + location.hash, url).href,
|
||||
target: '_self',
|
||||
className: label === activeLabel ? 'dropdown__link--active menu__link--active' : '', // workaround because React Router `<NavLink>` only supports using URL path for checking if active: https://v5.reactrouter.com/web/api/NavLink/isactive-func
|
||||
}))}
|
||||
/>
|
||||
)
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import React from 'react';
|
||||
import Link from '@docusaurus/Link';
|
||||
import Layout from '@theme/Layout';
|
||||
import { discordPath, discordViewBox } from '@site/src/components/svg-paths';
|
||||
import ThemedImage from '@theme/ThemedImage';
|
||||
import { useColorMode } from '@docusaurus/theme-common';
|
||||
import { discordPath } from '@site/src/components/svg-paths';
|
||||
import Icon from '@mdi/react';
|
||||
function HomepageHeader() {
|
||||
const { isDarkTheme } = useColorMode();
|
||||
|
||||
return (
|
||||
<header>
|
||||
<div className="top-[calc(12%)] md:top-[calc(30%)] h-screen w-full absolute -z-10">
|
||||
@@ -12,8 +14,8 @@ function HomepageHeader() {
|
||||
<div className="w-full h-[120vh] absolute left-0 top-0 backdrop-blur-3xl bg-immich-bg/40 dark:bg-transparent"></div>
|
||||
</div>
|
||||
<section className="text-center pt-12 sm:pt-24 bg-immich-bg/50 dark:bg-immich-dark-bg/80">
|
||||
<ThemedImage
|
||||
sources={{ dark: 'img/logomark-dark.svg', light: 'img/logomark-light.svg' }}
|
||||
<img
|
||||
src={isDarkTheme ? 'img/logomark-dark.svg' : 'img/logomark-light.svg'}
|
||||
className="h-[115px] w-[115px] mb-2 antialiased rounded-none"
|
||||
alt="Immich logo"
|
||||
/>
|
||||
@@ -33,6 +35,7 @@ function HomepageHeader() {
|
||||
sacrificing your privacy.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-9 gap-4 ">
|
||||
<Link
|
||||
className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary dark:bg-immich-dark-primary rounded-xl no-underline hover:no-underline text-white hover:text-gray-50 dark:text-immich-dark-bg font-bold uppercase"
|
||||
@@ -55,27 +58,27 @@ function HomepageHeader() {
|
||||
Buy Merch
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="my-12 flex gap-1 font-medium place-items-center place-content-center text-immich-primary dark:text-immich-dark-primary">
|
||||
<Icon
|
||||
path={discordPath}
|
||||
viewBox={discordViewBox} /* viewBox may show an error in your IDE but it is normal. */
|
||||
size={1}
|
||||
/>
|
||||
<Icon path={discordPath} size={1} />
|
||||
<Link to="https://discord.immich.app/">Join our Discord</Link>
|
||||
</div>
|
||||
<ThemedImage
|
||||
sources={{ dark: '/img/screenshot-dark.webp', light: '/img/screenshot-light.webp' }}
|
||||
<img
|
||||
src={isDarkTheme ? '/img/screenshot-dark.webp' : '/img/screenshot-light.webp'}
|
||||
alt="screenshots"
|
||||
className="w-[95%] lg:w-[85%] xl:w-[70%] 2xl:w-[60%] "
|
||||
/>
|
||||
|
||||
<div className="mx-[25%] m-auto my-14 md:my-28">
|
||||
<hr className="border bg-gray-500 dark:bg-gray-400" />
|
||||
</div>
|
||||
<ThemedImage
|
||||
sources={{ dark: 'img/logomark-dark.svg', light: 'img/logomark-light.svg' }}
|
||||
|
||||
<img
|
||||
src={isDarkTheme ? 'img/logomark-dark.svg' : 'img/logomark-light.svg'}
|
||||
className="h-[115px] w-[115px] mb-2 antialiased rounded-none"
|
||||
alt="Immich logo"
|
||||
/>
|
||||
|
||||
<div>
|
||||
<p className="font-bold text-2xl md:text-5xl ">Download the mobile app</p>
|
||||
<p className="text-lg">
|
||||
@@ -94,8 +97,9 @@ function HomepageHeader() {
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<ThemedImage
|
||||
sources={{ dark: '/img/app-qr-code-dark.svg', light: '/img/app-qr-code-light.svg' }}
|
||||
|
||||
<img
|
||||
src={isDarkTheme ? '/img/app-qr-code-dark.svg' : '/img/app-qr-code-light.svg'}
|
||||
alt="app qr code"
|
||||
width={'150px'}
|
||||
className="shadow-lg p-3 my-8 dark:bg-immich-dark-bg "
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
import React from 'react';
|
||||
import Link from '@docusaurus/Link';
|
||||
import Layout from '@theme/Layout';
|
||||
import { useColorMode } from '@docusaurus/theme-common';
|
||||
function HomepageHeader() {
|
||||
const { isDarkTheme } = useColorMode();
|
||||
|
||||
return (
|
||||
<header>
|
||||
<section className="max-w-[900px] m-4 p-4 md:p-6 md:m-auto md:my-12 border border-red-400 rounded-2xl bg-slate-200 dark:bg-immich-dark-gray">
|
||||
|
||||
@@ -242,13 +242,6 @@ const roadmap: Item[] = [
|
||||
];
|
||||
|
||||
const milestones: Item[] = [
|
||||
{
|
||||
icon: mdiStar,
|
||||
iconColor: 'gold',
|
||||
title: '60,000 Stars',
|
||||
description: 'Reached 60K Stars on GitHub!',
|
||||
getDateLabel: withLanguage(new Date(2025, 2, 4)),
|
||||
},
|
||||
withRelease({
|
||||
icon: mdiLinkEdit,
|
||||
iconColor: 'crimson',
|
||||
|
||||
16
docs/static/archived-versions.json
vendored
16
docs/static/archived-versions.json
vendored
@@ -1,20 +1,4 @@
|
||||
[
|
||||
{
|
||||
"label": "v1.130.1",
|
||||
"url": "https://v1.130.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.130.0",
|
||||
"url": "https://v1.130.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.129.0",
|
||||
"url": "https://v1.129.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.128.0",
|
||||
"url": "https://v1.128.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v1.127.0",
|
||||
"url": "https://v1.127.0.archive.immich.app"
|
||||
|
||||
@@ -37,7 +37,7 @@ services:
|
||||
image: redis:6.2-alpine@sha256:148bb5411c184abd288d9aaed139c98123eeb8824c5d3fce03cf721db58066d8
|
||||
|
||||
database:
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
|
||||
command: -c fsync=off -c shared_preload_libraries=vectors.so
|
||||
environment:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
|
||||
841
e2e/package-lock.json
generated
841
e2e/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "immich-e2e",
|
||||
"version": "1.130.1",
|
||||
"version": "1.127.0",
|
||||
"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.10",
|
||||
"@types/node": "^22.13.4",
|
||||
"@types/oidc-provider": "^8.5.1",
|
||||
"@types/pg": "^8.11.0",
|
||||
"@types/pngjs": "^6.0.4",
|
||||
@@ -38,7 +38,7 @@
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"eslint-plugin-unicorn": "^56.0.1",
|
||||
"exiftool-vendored": "^28.3.1",
|
||||
"globals": "^16.0.0",
|
||||
"globals": "^15.9.0",
|
||||
"jose": "^5.6.3",
|
||||
"luxon": "^3.4.4",
|
||||
"oidc-provider": "^8.5.1",
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
AssetResponseDto,
|
||||
AssetTypeEnum,
|
||||
getAssetInfo,
|
||||
getConfig,
|
||||
getMyUser,
|
||||
LoginResponseDto,
|
||||
SharedLinkType,
|
||||
@@ -44,6 +45,8 @@ const locationAssetFilepath = `${testAssetDir}/metadata/gps-position/thompson-sp
|
||||
const ratingAssetFilepath = `${testAssetDir}/metadata/rating/mongolels.jpg`;
|
||||
const facesAssetFilepath = `${testAssetDir}/metadata/faces/portrait.jpg`;
|
||||
|
||||
const getSystemConfig = (accessToken: string) => getConfig({ headers: asBearerAuth(accessToken) });
|
||||
|
||||
const readTags = async (bytes: Buffer, filename: string) => {
|
||||
const filepath = join(tempDir, filename);
|
||||
await writeFile(filepath, bytes);
|
||||
@@ -225,7 +228,7 @@ describe('/asset', () => {
|
||||
});
|
||||
|
||||
it('should get the asset faces', async () => {
|
||||
const config = await utils.getSystemConfig(admin.accessToken);
|
||||
const config = await getSystemConfig(admin.accessToken);
|
||||
config.metadata.faces.import = true;
|
||||
await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) });
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { JobCommand, JobName, LoginResponseDto, updateConfig } from '@immich/sdk';
|
||||
import { cpSync, rmSync } from 'node:fs';
|
||||
import { JobCommand, JobName, LoginResponseDto } from '@immich/sdk';
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import { basename } from 'node:path';
|
||||
import { errorDto } from 'src/responses';
|
||||
import { app, asBearerAuth, testAssetDir, utils } from 'src/utils';
|
||||
import { app, testAssetDir, utils } from 'src/utils';
|
||||
import request from 'supertest';
|
||||
import { afterEach, beforeAll, describe, expect, it } from 'vitest';
|
||||
|
||||
@@ -21,33 +20,6 @@ describe('/jobs', () => {
|
||||
command: JobCommand.Resume,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
|
||||
command: JobCommand.Resume,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.FaceDetection, {
|
||||
command: JobCommand.Resume,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.SmartSearch, {
|
||||
command: JobCommand.Resume,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.DuplicateDetection, {
|
||||
command: JobCommand.Resume,
|
||||
force: false,
|
||||
});
|
||||
|
||||
const config = await utils.getSystemConfig(admin.accessToken);
|
||||
config.machineLearning.duplicateDetection.enabled = false;
|
||||
config.machineLearning.enabled = false;
|
||||
config.metadata.faces.import = false;
|
||||
config.machineLearning.clip.enabled = false;
|
||||
await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) });
|
||||
});
|
||||
|
||||
it('should require authentication', async () => {
|
||||
@@ -57,7 +29,14 @@ describe('/jobs', () => {
|
||||
});
|
||||
|
||||
it('should queue metadata extraction for missing assets', async () => {
|
||||
const path = `${testAssetDir}/formats/raw/Nikon/D700/philadelphia.nef`;
|
||||
const path1 = `${testAssetDir}/formats/raw/Nikon/D700/philadelphia.nef`;
|
||||
const path2 = `${testAssetDir}/formats/raw/Nikon/D80/glarus.nef`;
|
||||
|
||||
await utils.createAsset(admin.accessToken, {
|
||||
assetData: { bytes: await readFile(path1), filename: basename(path1) },
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.MetadataExtraction, {
|
||||
command: JobCommand.Pause,
|
||||
@@ -65,7 +44,7 @@ describe('/jobs', () => {
|
||||
});
|
||||
|
||||
const { id } = await utils.createAsset(admin.accessToken, {
|
||||
assetData: { bytes: await readFile(path), filename: basename(path) },
|
||||
assetData: { bytes: await readFile(path2), filename: basename(path2) },
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
|
||||
@@ -103,123 +82,5 @@ describe('/jobs', () => {
|
||||
expect(asset.exifInfo?.make).toBe('NIKON CORPORATION');
|
||||
}
|
||||
});
|
||||
|
||||
it('should not re-extract metadata for existing assets', async () => {
|
||||
const path = `${testAssetDir}/temp/metadata/asset.jpg`;
|
||||
|
||||
cpSync(`${testAssetDir}/formats/raw/Nikon/D700/philadelphia.nef`, path);
|
||||
|
||||
const { id } = await utils.createAsset(admin.accessToken, {
|
||||
assetData: { bytes: await readFile(path), filename: basename(path) },
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
|
||||
|
||||
{
|
||||
const asset = await utils.getAssetInfo(admin.accessToken, id);
|
||||
|
||||
expect(asset.exifInfo).toBeDefined();
|
||||
expect(asset.exifInfo?.model).toBe('NIKON D700');
|
||||
}
|
||||
|
||||
cpSync(`${testAssetDir}/formats/raw/Nikon/D80/glarus.nef`, path);
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.MetadataExtraction, {
|
||||
command: JobCommand.Start,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
|
||||
|
||||
{
|
||||
const asset = await utils.getAssetInfo(admin.accessToken, id);
|
||||
|
||||
expect(asset.exifInfo).toBeDefined();
|
||||
expect(asset.exifInfo?.model).toBe('NIKON D700');
|
||||
}
|
||||
|
||||
rmSync(path);
|
||||
});
|
||||
|
||||
it('should queue thumbnail extraction for assets missing thumbs', async () => {
|
||||
const path = `${testAssetDir}/albums/nature/tanners_ridge.jpg`;
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
|
||||
command: JobCommand.Pause,
|
||||
force: false,
|
||||
});
|
||||
|
||||
const { id } = await utils.createAsset(admin.accessToken, {
|
||||
assetData: { bytes: await readFile(path), filename: basename(path) },
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
|
||||
|
||||
const assetBefore = await utils.getAssetInfo(admin.accessToken, id);
|
||||
expect(assetBefore.thumbhash).toBeNull();
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
|
||||
command: JobCommand.Empty,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
|
||||
command: JobCommand.Resume,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
|
||||
command: JobCommand.Start,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
|
||||
|
||||
const assetAfter = await utils.getAssetInfo(admin.accessToken, id);
|
||||
expect(assetAfter.thumbhash).not.toBeNull();
|
||||
});
|
||||
|
||||
it('should not reload existing thumbnail when running thumb job for missing assets', async () => {
|
||||
const path = `${testAssetDir}/temp/thumbs/asset1.jpg`;
|
||||
|
||||
cpSync(`${testAssetDir}/albums/nature/tanners_ridge.jpg`, path);
|
||||
|
||||
const { id } = await utils.createAsset(admin.accessToken, {
|
||||
assetData: { bytes: await readFile(path), filename: basename(path) },
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
|
||||
|
||||
const assetBefore = await utils.getAssetInfo(admin.accessToken, id);
|
||||
|
||||
cpSync(`${testAssetDir}/albums/nature/notocactus_minimus.jpg`, path);
|
||||
|
||||
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
|
||||
command: JobCommand.Resume,
|
||||
force: false,
|
||||
});
|
||||
|
||||
// This runs the missing thumbnail job
|
||||
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
|
||||
command: JobCommand.Start,
|
||||
force: false,
|
||||
});
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
|
||||
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
|
||||
|
||||
const assetAfter = await utils.getAssetInfo(admin.accessToken, id);
|
||||
|
||||
// Asset 1 thumbnail should be untouched since its thumb should not have been reloaded, even though the file was changed
|
||||
expect(assetAfter.thumbhash).toEqual(assetBefore.thumbhash);
|
||||
|
||||
rmSync(path);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -490,7 +490,7 @@ describe('/libraries', () => {
|
||||
utils.removeImageFile(`${testAssetDir}/temp/reimport/asset.jpg`);
|
||||
});
|
||||
|
||||
it('should not reimport a file with unchanged timestamp', async () => {
|
||||
it('should not reimport unmodified files', async () => {
|
||||
const library = await utils.createLibrary(admin.accessToken, {
|
||||
ownerId: admin.userId,
|
||||
importPaths: [`${testAssetDirInternal}/temp/reimport`],
|
||||
@@ -933,8 +933,6 @@ describe('/libraries', () => {
|
||||
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
|
||||
expect(assets.count).toBe(1);
|
||||
|
||||
utils.renameImageFile(`${testAssetDir}/temp/offline/offline.png`, `${testAssetDir}/temp/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
@@ -965,58 +963,6 @@ describe('/libraries', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('should set a trashed offline asset to online but keep it in trash', async () => {
|
||||
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
|
||||
const library = await utils.createLibrary(admin.accessToken, {
|
||||
ownerId: admin.userId,
|
||||
importPaths: [`${testAssetDirInternal}/temp/offline`],
|
||||
});
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
|
||||
expect(assets.count).toBe(1);
|
||||
|
||||
await utils.deleteAssets(admin.accessToken, [assets.items[0].id]);
|
||||
|
||||
{
|
||||
const trashedAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
|
||||
|
||||
expect(trashedAsset.isTrashed).toBe(true);
|
||||
}
|
||||
|
||||
utils.renameImageFile(`${testAssetDir}/temp/offline/offline.png`, `${testAssetDir}/temp/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
|
||||
const offlineAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
|
||||
expect(offlineAsset.isTrashed).toBe(true);
|
||||
expect(offlineAsset.originalPath).toBe(`${testAssetDirInternal}/temp/offline/offline.png`);
|
||||
expect(offlineAsset.isOffline).toBe(true);
|
||||
|
||||
{
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
|
||||
expect(assets.count).toBe(1);
|
||||
}
|
||||
|
||||
utils.renameImageFile(`${testAssetDir}/temp/offline.png`, `${testAssetDir}/temp/offline/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
|
||||
const backOnlineAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
|
||||
|
||||
expect(backOnlineAsset.originalPath).toBe(`${testAssetDirInternal}/temp/offline/offline.png`);
|
||||
expect(backOnlineAsset.isOffline).toBe(false);
|
||||
expect(backOnlineAsset.isTrashed).toBe(true);
|
||||
|
||||
{
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
|
||||
expect(assets.count).toBe(1);
|
||||
}
|
||||
});
|
||||
|
||||
it('should not set an offline asset to online if its file exists, is not covered by an exclusion pattern, but is outside of all import paths', async () => {
|
||||
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
|
||||
@@ -1078,17 +1024,16 @@ describe('/libraries', () => {
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
|
||||
{
|
||||
const { assets: assetsBefore } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
expect(assetsBefore.count).toBe(1);
|
||||
}
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
|
||||
utils.renameImageFile(`${testAssetDir}/temp/offline/offline.png`, `${testAssetDir}/temp/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
|
||||
expect(assets.count).toBe(1);
|
||||
{
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
|
||||
expect(assets.count).toBe(1);
|
||||
}
|
||||
|
||||
const offlineAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ describe('/people', () => {
|
||||
expect(body).toMatchObject({
|
||||
id: expect.any(String),
|
||||
name: 'New Person',
|
||||
birthDate: '1990-01-01',
|
||||
birthDate: '1990-01-01T00:00:00.000Z',
|
||||
});
|
||||
});
|
||||
|
||||
@@ -262,7 +262,7 @@ describe('/people', () => {
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`)
|
||||
.send({ birthDate: '1990-01-01' });
|
||||
expect(status).toBe(200);
|
||||
expect(body).toMatchObject({ birthDate: '1990-01-01' });
|
||||
expect(body).toMatchObject({ birthDate: '1990-01-01T00:00:00.000Z' });
|
||||
});
|
||||
|
||||
it('should clear a date of birth', async () => {
|
||||
|
||||
@@ -633,6 +633,7 @@ describe('/search', () => {
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(body).toEqual([
|
||||
'Andalusia',
|
||||
'Berlin',
|
||||
'Glarus',
|
||||
'Greater Accra',
|
||||
'Havana',
|
||||
@@ -641,7 +642,6 @@ describe('/search', () => {
|
||||
'Mississippi',
|
||||
'New York',
|
||||
'Shanghai',
|
||||
'State of Berlin',
|
||||
'St.-Petersburg',
|
||||
'Tbilisi',
|
||||
'Tokyo',
|
||||
@@ -657,6 +657,7 @@ describe('/search', () => {
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
expect(body).toEqual([
|
||||
'Andalusia',
|
||||
'Berlin',
|
||||
'Glarus',
|
||||
'Greater Accra',
|
||||
'Havana',
|
||||
@@ -665,7 +666,6 @@ describe('/search', () => {
|
||||
'Mississippi',
|
||||
'New York',
|
||||
'Shanghai',
|
||||
'State of Berlin',
|
||||
'St.-Petersburg',
|
||||
'Tbilisi',
|
||||
'Tokyo',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { LoginResponseDto, getAssetInfo, getAssetStatistics } from '@immich/sdk';
|
||||
import { LoginResponseDto, getAssetInfo, getAssetStatistics, scanLibrary } from '@immich/sdk';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { Socket } from 'socket.io-client';
|
||||
import { errorDto } from 'src/responses';
|
||||
@@ -6,6 +6,8 @@ import { app, asBearerAuth, testAssetDir, testAssetDirInternal, utils } from 'sr
|
||||
import request from 'supertest';
|
||||
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
||||
|
||||
const scan = async (accessToken: string, id: string) => scanLibrary({ id }, { headers: asBearerAuth(accessToken) });
|
||||
|
||||
describe('/trash', () => {
|
||||
let admin: LoginResponseDto;
|
||||
let ws: Socket;
|
||||
@@ -79,7 +81,8 @@ describe('/trash', () => {
|
||||
|
||||
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
expect(assets.items.length).toBe(1);
|
||||
@@ -87,7 +90,8 @@ describe('/trash', () => {
|
||||
|
||||
await utils.updateLibrary(admin.accessToken, library.id, { exclusionPatterns: ['**/offline/**'] });
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const assetBefore = await utils.getAssetInfo(admin.accessToken, asset.id);
|
||||
expect(assetBefore).toMatchObject({ isTrashed: true, isOffline: true });
|
||||
@@ -112,7 +116,8 @@ describe('/trash', () => {
|
||||
|
||||
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
expect(assets.items.length).toBe(1);
|
||||
@@ -120,7 +125,8 @@ describe('/trash', () => {
|
||||
|
||||
await utils.updateLibrary(admin.accessToken, library.id, { exclusionPatterns: ['**/offline/**'] });
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const assetBefore = await utils.getAssetInfo(admin.accessToken, asset.id);
|
||||
expect(assetBefore).toMatchObject({ isTrashed: true, isOffline: true });
|
||||
@@ -174,7 +180,8 @@ describe('/trash', () => {
|
||||
|
||||
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
expect(assets.count).toBe(1);
|
||||
@@ -182,7 +189,9 @@ describe('/trash', () => {
|
||||
|
||||
await utils.updateLibrary(admin.accessToken, library.id, { exclusionPatterns: ['**/offline/**'] });
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const before = await getAssetInfo({ id: assetId }, { headers: asBearerAuth(admin.accessToken) });
|
||||
expect(before).toStrictEqual(expect.objectContaining({ id: assetId, isOffline: true }));
|
||||
@@ -192,8 +201,6 @@ describe('/trash', () => {
|
||||
|
||||
const after = await getAssetInfo({ id: assetId }, { headers: asBearerAuth(admin.accessToken) });
|
||||
expect(after).toStrictEqual(expect.objectContaining({ id: assetId, isOffline: true }));
|
||||
|
||||
utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -231,7 +238,7 @@ describe('/trash', () => {
|
||||
|
||||
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
|
||||
@@ -240,7 +247,7 @@ describe('/trash', () => {
|
||||
|
||||
await utils.updateLibrary(admin.accessToken, library.id, { exclusionPatterns: ['**/offline/**'] });
|
||||
|
||||
await utils.scan(admin.accessToken, library.id);
|
||||
await scan(admin.accessToken, library.id);
|
||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||
|
||||
const before = await utils.getAssetInfo(admin.accessToken, assetId);
|
||||
@@ -254,8 +261,6 @@ describe('/trash', () => {
|
||||
|
||||
const after = await utils.getAssetInfo(admin.accessToken, assetId);
|
||||
expect(after.isTrashed).toBe(true);
|
||||
|
||||
utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -28,7 +28,6 @@ import {
|
||||
deleteAssets,
|
||||
getAllJobsStatus,
|
||||
getAssetInfo,
|
||||
getConfig,
|
||||
getConfigDefaults,
|
||||
login,
|
||||
scanLibrary,
|
||||
@@ -122,7 +121,6 @@ const execPromise = promisify(exec);
|
||||
const onEvent = ({ event, id }: { event: EventType; id: string }) => {
|
||||
// console.log(`Received event: ${event} [id=${id}]`);
|
||||
const set = events[event];
|
||||
|
||||
set.add(id);
|
||||
|
||||
const idCallback = idCallbacks[id];
|
||||
@@ -417,8 +415,6 @@ export const utils = {
|
||||
rmSync(path, { recursive: true });
|
||||
},
|
||||
|
||||
getSystemConfig: (accessToken: string) => getConfig({ headers: asBearerAuth(accessToken) }),
|
||||
|
||||
getAssetInfo: (accessToken: string, id: string) => getAssetInfo({ id }, { headers: asBearerAuth(accessToken) }),
|
||||
|
||||
checkExistingAssets: (accessToken: string, checkExistingAssetsDto: CheckExistingAssetsDto) =>
|
||||
@@ -493,7 +489,7 @@ export const utils = {
|
||||
value: accessToken,
|
||||
domain,
|
||||
path: '/',
|
||||
expires: 2_058_028_213,
|
||||
expires: 1_742_402_728,
|
||||
httpOnly: true,
|
||||
secure: false,
|
||||
sameSite: 'Lax',
|
||||
@@ -503,7 +499,7 @@ export const utils = {
|
||||
value: 'password',
|
||||
domain,
|
||||
path: '/',
|
||||
expires: 2_058_028_213,
|
||||
expires: 1_742_402_728,
|
||||
httpOnly: true,
|
||||
secure: false,
|
||||
sameSite: 'Lax',
|
||||
@@ -513,7 +509,7 @@ export const utils = {
|
||||
value: 'true',
|
||||
domain,
|
||||
path: '/',
|
||||
expires: 2_058_028_213,
|
||||
expires: 1_742_402_728,
|
||||
httpOnly: false,
|
||||
secure: false,
|
||||
sameSite: 'Lax',
|
||||
|
||||
@@ -45,7 +45,7 @@ test.describe('Shared Links', () => {
|
||||
await page.goto(`/share/${sharedLink.key}`);
|
||||
await page.getByRole('heading', { name: 'Test Album' }).waitFor();
|
||||
await page.locator(`[data-asset-id="${asset.id}"]`).hover();
|
||||
await page.waitForSelector('[data-group] svg');
|
||||
await page.waitForSelector('#asset-group-by-date svg');
|
||||
await page.getByRole('checkbox').click();
|
||||
await page.getByRole('button', { name: 'Download' }).click();
|
||||
await page.getByText('DOWNLOADING', { exact: true }).waitFor();
|
||||
|
||||
18
i18n/af.json
18
i18n/af.json
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"about": "Oor",
|
||||
"about": "Verfris",
|
||||
"account": "Rekening",
|
||||
"account_settings": "Rekeninginstellings",
|
||||
"acknowledge": "Erken",
|
||||
@@ -56,16 +56,15 @@
|
||||
"duplicate_detection_job_description": "Begin masjienleer op bates om soortgelyke beelde op te spoor. Maak staat op Smart Search",
|
||||
"exclusion_pattern_description": "Met uitsluitingspatrone kan jy lêers en vouers ignoreer wanneer jy jou biblioteek skandeer. Dit is nuttig as jy vouers het wat lêers bevat wat jy nie wil invoer nie, soos RAW-lêers.",
|
||||
"external_library_created_at": "Eksterne biblioteek (geskep op {date})",
|
||||
"external_library_management": "Eksterne Biblioteekbestuur",
|
||||
"face_detection": "Gesig deteksie",
|
||||
"external_library_management": "Eksterne Biblioteek-opsies",
|
||||
"face_detection": "Gesigsopsporing",
|
||||
"failed_job_command": "Opdrag {command} het misluk vir werk: {job}",
|
||||
"force_delete_user_warning": "WAARSKUWING: Dit sal onmiddellik die gebruiker en alle bates verwyder. Dit kan nie ontdoen word nie en die lêers kan nie herstel word nie.",
|
||||
"forcing_refresh_library_files": "Forseer herlaai van alle biblioteeklêers",
|
||||
"image_format": "Formaat",
|
||||
"image_format_description": "WebP produseer kleiner lêers as JPEG, maar is stadiger om te enkodeer.",
|
||||
"image_prefer_embedded_preview": "Verkies ingebedde voorskou",
|
||||
"image_prefer_wide_gamut": "Verkies wide gamut",
|
||||
"image_prefer_wide_gamut_setting_description": "Gebruik Display P3 vir kleinkiekies. Dit behou die lewendheid van beelde met wye kleurruimtes beter, maar beelde kan anders verskyn op ou apparate met 'n ou blaaierweergawe. sRGB-beelde gebruik steeds sRGB om kleurverskuiwings te voorkom.",
|
||||
"image_prefer_wide_gamut": "Verkies wye spektrum",
|
||||
"image_preview_description": "Mediumgrootte prent met gestroopte metadata, wat gebruik word wanneer 'n enkele bate bekyk word en vir masjienleer",
|
||||
"image_preview_quality_description": "Voorskou kwaliteit van 1-100. Hoër is beter, maar produseer groter lêers en kan app-reaksie verminder. Die stel van 'n lae waarde kan masjienleerkwaliteit beïnvloed.",
|
||||
"image_preview_title": "Voorskou Instellings",
|
||||
@@ -73,14 +72,7 @@
|
||||
"image_resolution": "Resolusie",
|
||||
"image_resolution_description": "Hoër resolusies kan meer detail bewaar, maar neem langer om te enkodeer, het groter lêergroottes en kan app-reaksie verminder.",
|
||||
"image_settings": "Prent Instellings",
|
||||
"image_settings_description": "Bestuur die kwaliteit en resolusie van gegenereerde beelde",
|
||||
"image_thumbnail_description": "Klein kleinkiekies sonder metadata, gebruik om groepe foto's soos die tydlyn te bekyk",
|
||||
"image_thumbnail_quality_description": "Kleinkiekiekwaliteit van 1-100. Hoër is beter, maar produseer groter lêers en kan die toepassing vertraag.",
|
||||
"image_thumbnail_title": "Kleinkiekie-instellings",
|
||||
"job_concurrency": "{job} gelyktydigheid",
|
||||
"job_created": "Taak gemaak",
|
||||
"job_not_concurrency_safe": "Hierdie taak kan nie gelyktydig uitgevoer word nie.",
|
||||
"job_settings": "Agtergrondtaakinstellings"
|
||||
"image_settings_description": "Bestuur die kwaliteit en resolusie van gegenereerde beelde"
|
||||
},
|
||||
"search_by_description": "Soek by beskrywing",
|
||||
"search_by_description_example": "Stapdag in Sapa"
|
||||
|
||||
21
i18n/ar.json
21
i18n/ar.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "إعدادات النسخ الاحتياطي",
|
||||
"backup_settings_description": "إدارة إعدادات النسخ الاحتياطي لقاعدة البيانات",
|
||||
"check_all": "اختر الكل",
|
||||
"cleanup": "تنظيف",
|
||||
"cleared_jobs": "تم إخلاء مهام: {job}",
|
||||
"config_set_by_file": "الإعدادات حاليًا معينة عن طريق ملف الاعدادات",
|
||||
"confirm_delete_library": "هل أنت متأكد أنك تريد حذف مكتبة {library}؟",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "تفعيل فحص المكتبة الدوري",
|
||||
"library_settings": "المكتبة الخارجية",
|
||||
"library_settings_description": "إدارة إعدادات المكتبة الخارجية",
|
||||
"library_tasks_description": "مسح المكتبات الخارجية للعثور على الأصول الجديدة و/أو المتغيرة",
|
||||
"library_tasks_description": "قم بتنفيذ مهام المكتبة",
|
||||
"library_watching_enable_description": "راقب المكتبات الخارجية لتتبع تغييرات الملفات",
|
||||
"library_watching_settings": "مراقبة المكتبات (تجريبي)",
|
||||
"library_watching_settings_description": "راقب تلقائيًا التغييرات في الملفات",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "البحث عن الصور بشكل دلالي باستخدام تضمينات CLIP",
|
||||
"machine_learning_smart_search_enabled": "تفعيل البحث الذكي",
|
||||
"machine_learning_smart_search_enabled_description": "إذا تم تعطيله، فلن يتم ترميز الصور للبحث الذكي.",
|
||||
"machine_learning_url_description": "عنوان URL لخادم التعلم الآلي. إذا تم توفير أكثر من عنوان URL واحد، سيتم محاولة الاتصال بكل خادم على حدة حتى يستجيب أحدهم بنجاح، بدءًا من الأول إلى الأخير. سيتم تجاهل الخوادم التي لا تستجيب مؤقتًا حتى تعود للعمل.",
|
||||
"machine_learning_url_description": "عنوان URL لخادم التعلم الآلي. إذا تم توفير أكثر من عنوان URL، فسيتم محاولة الوصول إلى كل خادم على حدة حتى يستجيب أحد الخوادم بنجاح، بالترتيب من الأول إلى الأخير.",
|
||||
"manage_concurrency": "إدارة التزامن",
|
||||
"manage_log_settings": "إدارة إعدادات السجلات",
|
||||
"map_dark_style": "النمط الداكن",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "الخريطة",
|
||||
"map_settings_description": "إدارة إعدادات الخريطة",
|
||||
"map_style_description": "عنوان URL لسمة الخريطة style.json",
|
||||
"memory_cleanup_job": "تنظيف الذاكرة",
|
||||
"memory_generate_job": "توليد الذاكرة",
|
||||
"metadata_extraction_job": "استخراج البيانات الوصفية",
|
||||
"metadata_extraction_job_description": "استخراج معلومات البيانات الوصفية من كل أصل، مثل إحداثيات الموقع, الوجوه والدقة",
|
||||
"metadata_faces_import_setting": "تمكين استيراد الوجه",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "إسمح بالتعديل",
|
||||
"allow_public_user_to_download": "السماح لأي مستخدم عام بالتنزيل",
|
||||
"allow_public_user_to_upload": "السماح للمستخدم العام بالرفع",
|
||||
"alt_text_qr_code": "صورة رمز الاستجابة السريعة (QR)",
|
||||
"anti_clockwise": "عكس اتجاه عقارب الساعة",
|
||||
"api_key": "مفتاح واجهة برمجة التطبيقات",
|
||||
"api_key_description": "سيتم عرض هذه القيمة مرة واحدة فقط. يرجى التأكد من نسخها قبل إغلاق النافذة.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "التعليقات معطلة",
|
||||
"confirm": "تأكيد",
|
||||
"confirm_admin_password": "تأكيد كلمة مرور المسؤول",
|
||||
"confirm_delete_face": "هل أنت متأكد من حذف وجه {name} من الأصول؟",
|
||||
"confirm_delete_shared_link": "هل أنت متأكد أنك تريد حذف هذا الرابط المشترك؟",
|
||||
"confirm_keep_this_delete_others": "سيتم حذف جميع الأصول الأخرى في المجموعة باستثناء هذا الأصل. هل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"confirm_password": "تأكيد كلمة المرور",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "حذف الألبوم",
|
||||
"delete_api_key_prompt": "هل أنت متأكد أنك تريد حذف مفتاح API هذا؟",
|
||||
"delete_duplicates_confirmation": "هل أنت متأكد أنك تريد حذف هذه التكرارات نهائيًا؟",
|
||||
"delete_face": "حذف الوجه",
|
||||
"delete_key": "حذف المفتاح",
|
||||
"delete_library": "حذف المكتبة",
|
||||
"delete_link": "حذف الرابط",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "مفعل",
|
||||
"end_date": "تاريخ الإنتهاء",
|
||||
"error": "خطأ",
|
||||
"error_delete_face": "حدث خطأ في حذف الوجه من الأصول",
|
||||
"error_loading_image": "حدث خطأ أثناء تحميل الصورة",
|
||||
"error_title": "خطأ - حدث خللٌ ما",
|
||||
"errors": {
|
||||
@@ -776,7 +769,7 @@
|
||||
"group_country": "مجموعة البلد",
|
||||
"group_no": "بدون تجميع",
|
||||
"group_owner": "تجميع حسب المالك",
|
||||
"group_places_by": "تجميع الأماكن حسب...",
|
||||
"group_places_by": "تجميع الأماكن حسب",
|
||||
"group_year": "تجميع حسب السنة",
|
||||
"has_quota": "محدد بحصة",
|
||||
"hi_user": "مرحبا {name} ({email})",
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "شهر",
|
||||
"more": "المزيد",
|
||||
"moved_to_trash": "تم النقل إلى سلة المهملات",
|
||||
"mute_memories": "كتم الذكريات",
|
||||
"my_albums": "ألبوماتي",
|
||||
"name": "الاسم",
|
||||
"name_or_nickname": "الاسم أو اللقب",
|
||||
@@ -1084,8 +1076,6 @@
|
||||
"removed_from_archive": "تمت إزالتها من الأرشيف",
|
||||
"removed_from_favorites": "تمت الإزالة من المفضلة",
|
||||
"removed_from_favorites_count": "{count, plural, other {أُزيلت #}} من التفضيلات",
|
||||
"removed_memory": "الذاكرة المحذوفة",
|
||||
"removed_photo_from_memory": "تم إزالة الصورة من الذاكرة",
|
||||
"removed_tagged_assets": "تمت إزالة العلامة من {count, plural, one {# الأصل} other {# الأصول}}",
|
||||
"rename": "إعادة تسمية",
|
||||
"repair": "إصلاح",
|
||||
@@ -1094,7 +1084,6 @@
|
||||
"repository": "المستودع",
|
||||
"require_password": "يتطلب كلمة المرور",
|
||||
"require_user_to_change_password_on_first_login": "مطالبة المستخدم بتغيير كلمة المرور عند تسجيل الدخول لأول مرة",
|
||||
"rescan": "إعادة المسح",
|
||||
"reset": "إعادة ضبط",
|
||||
"reset_password": "إعادة تعيين كلمة المرور",
|
||||
"reset_people_visibility": "إعادة ضبط ظهور الأشخاص",
|
||||
@@ -1138,7 +1127,6 @@
|
||||
"search_options": "خيارات البحث",
|
||||
"search_people": "البحث عن الأشخاص",
|
||||
"search_places": "البحث عن الأماكن",
|
||||
"search_rating": "البحث حسب التقييم...",
|
||||
"search_settings": "إعدادات البحث",
|
||||
"search_state": "البحث حسب الولاية...",
|
||||
"search_tags": "البحث عن العلامات...",
|
||||
@@ -1262,7 +1250,6 @@
|
||||
"tag_created": "تم إنشاء العلامة: {tag}",
|
||||
"tag_feature_description": "تصفح الصور ومقاطع الفيديو المجمعة حسب مواضيع العلامات المنطقية",
|
||||
"tag_not_found_question": "لا يمكن العثور على علامة؟ <link>قم بإنشاء علامة جديدة.</link>",
|
||||
"tag_people": "علِّم الأشخاص",
|
||||
"tag_updated": "تم تحديث العلامة: {tag}",
|
||||
"tagged_assets": "تم وضع علامة {count, plural, one {# asset} other {# assets}}",
|
||||
"tags": "العلامات",
|
||||
@@ -1303,7 +1290,6 @@
|
||||
"unlink_motion_video": "إلغاء ربط فيديو الحركة",
|
||||
"unlink_oauth": "إلغاء ربط OAuth",
|
||||
"unlinked_oauth_account": "تم إلغاء ربط حساب OAuth",
|
||||
"unmute_memories": "تشغيل الصوت للذكريات",
|
||||
"unnamed_album": "ألبوم بلا إسم",
|
||||
"unnamed_album_delete_confirmation": "هل أنت متأكد أنك تريد حذف هذا الألبوم؟",
|
||||
"unnamed_share": "مشاركة بلا إسم",
|
||||
@@ -1357,7 +1343,6 @@
|
||||
"view_all": "عرض الكل",
|
||||
"view_all_users": "عرض كافة المستخدمين",
|
||||
"view_in_timeline": "عرض في الجدول الزمني",
|
||||
"view_link": "عرض الرابط",
|
||||
"view_links": "عرض الروابط",
|
||||
"view_name": "عرض",
|
||||
"view_next_asset": "عرض المحتوى التالي",
|
||||
|
||||
50
i18n/bg.json
50
i18n/bg.json
@@ -20,7 +20,7 @@
|
||||
"add_partner": "Добавете партньор",
|
||||
"add_path": "Добави път",
|
||||
"add_photos": "Добавете снимки",
|
||||
"add_to": "Добави към…",
|
||||
"add_to": "Добави към...",
|
||||
"add_to_album": "Добави към албум",
|
||||
"add_to_shared_album": "Добави към споделен албум",
|
||||
"add_url": "Добави URL",
|
||||
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Настройка на резервни копия",
|
||||
"backup_settings_description": "Управление на настройките за резервно копие на базата данни",
|
||||
"check_all": "Провери всичко",
|
||||
"cleanup": "Почистване",
|
||||
"cleared_jobs": "Изчистени задачи от тип: {job}",
|
||||
"config_set_by_file": "Конфигурацията е зададена от файл",
|
||||
"confirm_delete_library": "Сигурни ли сте че искате да изтриете библиотеката - {library} ?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Включване на периодичното сканиране на библиотеката",
|
||||
"library_settings": "Външна библиотека",
|
||||
"library_settings_description": "Управление на настройките за външна библиотека",
|
||||
"library_tasks_description": "Сканирайте външни библиотеки за нови и/или променени активи",
|
||||
"library_tasks_description": "Извършване на задачи за библиотеката",
|
||||
"library_watching_enable_description": "Наблюдаване за промяна на файловете във външната библиотека",
|
||||
"library_watching_settings": "Наблюдаване на библиотеката (ЕКСПЕРИМЕНТАЛНО)",
|
||||
"library_watching_settings_description": "Автоматично наблюдавай за променени файлове",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Семантично търсене на изображения с помощта на CLIP вграждания",
|
||||
"machine_learning_smart_search_enabled": "Включване на Интелигентно Търсене",
|
||||
"machine_learning_smart_search_enabled_description": "Ако е деактивирано, изображенията няма да бъдат кодирани за Интелигентно Търсене.",
|
||||
"machine_learning_url_description": "URL на сървъра за машинно обучение. Ако са предоставени повече от един URL, всеки сървър ще бъде опитан един по един, докато един отговори успешно, в реда от първия до последния. Сървъри, които не отговорят, ще бъдат временно игнорирани, докато не се върнат онлайн.",
|
||||
"machine_learning_url_description": "URL на сървъра за машинно обучение. Ако са предоставени повече от един URL, всеки сървър ще бъде опитан един по един, докато един не отговори успешно, в реда от първия до последния.",
|
||||
"manage_concurrency": "Управление на паралелност",
|
||||
"manage_log_settings": "Управление на настройките на записване",
|
||||
"map_dark_style": "Тъмен стил",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Карта",
|
||||
"map_settings_description": "Управление на настройките на картата",
|
||||
"map_style_description": "URL адрес към файл \"style.json\" за задаване на стил на картата",
|
||||
"memory_cleanup_job": "Почистване на паметта",
|
||||
"memory_generate_job": "Генериране на паметта",
|
||||
"metadata_extraction_job": "Извличане на метаданни",
|
||||
"metadata_extraction_job_description": "Извличане на метаданни от всеки от елемент, като GPS локация, лица и резолюция на файловете",
|
||||
"metadata_faces_import_setting": "Включи импорт на лице",
|
||||
@@ -222,7 +219,7 @@
|
||||
"reset_settings_to_default": "Възстановяване на настройките по подразбиране",
|
||||
"reset_settings_to_recent_saved": "Възстановяване на настройките до последните запазени настройки",
|
||||
"scanning_library": "Сканиране на библиотеката",
|
||||
"search_jobs": "Търсене на задачи…",
|
||||
"search_jobs": "Търсене на задачи...",
|
||||
"send_welcome_email": "Изпращане на имейл за добре дошли",
|
||||
"server_external_domain_settings": "Външен домейн",
|
||||
"server_external_domain_settings_description": "Домейн за публични споделени връзки, включително http(s)://",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Максимални B-фрейма",
|
||||
"transcoding_max_b_frames_description": "По-високите стойности подобряват ефективността на компресията, но забавят разкодирането. Може да не е съвместим с хардуерното ускорение на по-стари устройства. 0 деактивира B-фрейма, докато -1 задава тази стойност автоматично.",
|
||||
"transcoding_max_bitrate": "Максимален битрейт",
|
||||
"transcoding_max_bitrate_description": "Задаването на максимален битрейт може да направи размерите на файловете по-предвидими при незначителни разлики за качеството. При 720p типичните стойности са 2600 kbit/s за VP9 или HEVC или 4500 kbit/s за H.264. Деактивирано, ако е зададено на 0.",
|
||||
"transcoding_max_bitrate_description": "Задаването на максимален битрейт може да направи размерите на файловете по-предвидими при незначителни разлики за качеството. При 720p типичните стойности са 2600k за VP9 или HEVC или 4500k за H.264. Деактивирано, ако е зададено на 0.",
|
||||
"transcoding_max_keyframe_interval": "Максимален интервал между ключовите кадри",
|
||||
"transcoding_max_keyframe_interval_description": "Задава максималното разстояние между ключовите кадри. По-ниските стойности влошават ефективността на компресията, но подобряват времето за търсене и могат да подобрят качеството в сцени с бързо движение. 0 задава тази стойност автоматично.",
|
||||
"transcoding_optimal_description": "Видеоклипове с по-висока от целевата разделителна способност или не в приетия формат",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Позволяване на редакции",
|
||||
"allow_public_user_to_download": "Позволете на публичен потребител да може да изтегля",
|
||||
"allow_public_user_to_upload": "Позволете на публичния потребител да може да качва",
|
||||
"alt_text_qr_code": "Изображение на QR код",
|
||||
"anti_clockwise": "Обратно на часовниковата стрелка",
|
||||
"api_key": "API ключ",
|
||||
"api_key_description": "Тази стойност ще бъде показана само веднъж. Моля, не забравяйте да го копирате, преди да затворите прозореца.",
|
||||
@@ -410,17 +406,17 @@
|
||||
"are_these_the_same_person": "Това едно и също лице ли е?",
|
||||
"are_you_sure_to_do_this": "Сигурни ли сте, че искате да направите това?",
|
||||
"asset_added_to_album": "Добавено в албум",
|
||||
"asset_adding_to_album": "Добавяне в албум…",
|
||||
"asset_adding_to_album": "Добавяне в албум...",
|
||||
"asset_description_updated": "Описанието на елемента е обновено",
|
||||
"asset_filename_is_offline": "Активът {filename} е офлайн",
|
||||
"asset_has_unassigned_faces": "Елементът има незададени лица",
|
||||
"asset_hashing": "Хеширане…",
|
||||
"asset_hashing": "Хеширане...",
|
||||
"asset_offline": "Елементът е офлайн",
|
||||
"asset_offline_description": "Този външен актив вече не се намира на диска. Моля, свържете се с администратора на Immich за помощ.",
|
||||
"asset_skipped": "Пропуснато",
|
||||
"asset_skipped_in_trash": "В кошчето",
|
||||
"asset_uploaded": "Качено",
|
||||
"asset_uploading": "Качване…",
|
||||
"asset_uploading": "Качване...",
|
||||
"assets": "Елементи",
|
||||
"assets_added_count": "Добавено {count, plural, one {# asset} other {# assets}}",
|
||||
"assets_added_to_album_count": "Добавен(и) са {count, plural, one {# актив} other {# актива}} в албума",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Коментарите са деактивирани",
|
||||
"confirm": "Потвърди",
|
||||
"confirm_admin_password": "Потвърждаване на паролата на администратора",
|
||||
"confirm_delete_face": "Сигурни ли сте, че искате да изтриете лицето на {name} от актива?",
|
||||
"confirm_delete_shared_link": "Сигурни ли сте, че искате да изтриете тази споделена връзка?",
|
||||
"confirm_keep_this_delete_others": "Всички останали файлове в стека ще бъдат изтрити, с изключение на този файл. Сигурни ли сте, че искате да продължите?",
|
||||
"confirm_password": "Потвърдете паролата",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Изтрий албум",
|
||||
"delete_api_key_prompt": "Сигурни ли сте, че искате да изтриете този API ключ?",
|
||||
"delete_duplicates_confirmation": "Сигурни ли сте, че искате да изтриете окончателно тези дубликати?",
|
||||
"delete_face": "Изтрий лице",
|
||||
"delete_key": "Изтрий ключ",
|
||||
"delete_library": "Изтрий библиотека",
|
||||
"delete_link": "Изтрий линк",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Включено",
|
||||
"end_date": "Крайна дата",
|
||||
"error": "Грешка",
|
||||
"error_delete_face": "Грешка при изтриване на лице от актива",
|
||||
"error_loading_image": "Грешка при зареждане на изображението",
|
||||
"error_title": "Грешка - нещо се обърка",
|
||||
"errors": {
|
||||
@@ -773,10 +766,8 @@
|
||||
"go_to_folder": "Отиди в папката",
|
||||
"go_to_search": "Преминаване към търсене",
|
||||
"group_albums_by": "Групирай албум по...",
|
||||
"group_country": "Групирай по държава",
|
||||
"group_no": "Няма група",
|
||||
"group_owner": "Групиране по собственик",
|
||||
"group_places_by": "Групирай места по…",
|
||||
"group_year": "Групиране по година",
|
||||
"has_quota": "Лимит",
|
||||
"hi_user": "Здравей, {name} {email}",
|
||||
@@ -809,7 +800,6 @@
|
||||
"include_shared_albums": "Включване на споделени албуми",
|
||||
"include_shared_partner_assets": "Включване на споделените с партньор елементи",
|
||||
"individual_share": "Индивидуално споделяне",
|
||||
"individual_shares": "Индивидуални споделяния",
|
||||
"info": "Информация",
|
||||
"interval": {
|
||||
"day_at_onepm": "Всеки ден в 13:00",
|
||||
@@ -832,7 +822,6 @@
|
||||
"latest_version": "Последна версия",
|
||||
"latitude": "Ширина",
|
||||
"leave": "Излез",
|
||||
"lens_model": "Модел леща",
|
||||
"let_others_respond": "Позволете на другите да отговорят",
|
||||
"level": "Ниво",
|
||||
"library": "Библиотека",
|
||||
@@ -891,7 +880,6 @@
|
||||
"month": "Месец",
|
||||
"more": "Още",
|
||||
"moved_to_trash": "Преместено в кошчето",
|
||||
"mute_memories": "Изключване на звука на спомените",
|
||||
"my_albums": "Мои албуми",
|
||||
"name": "Име",
|
||||
"name_or_nickname": "Име или прякор",
|
||||
@@ -996,7 +984,6 @@
|
||||
"pick_a_location": "Избери локация",
|
||||
"place": "Местоположение",
|
||||
"places": "Местоположения",
|
||||
"places_count": "{count, plural, one {{count, number} Място} other {{count, number} Места}}",
|
||||
"play": "Възпроизвеждане",
|
||||
"play_memories": "Възпроизвеждане на спомени",
|
||||
"play_motion_photo": "Възпроизведи Motion Photo",
|
||||
@@ -1080,12 +1067,10 @@
|
||||
"remove_from_shared_link": "Премахни от споделения линк",
|
||||
"remove_url": "Премахни URL",
|
||||
"remove_user": "Премахни потребителя",
|
||||
"removed_api_key": "Премахат API ключ: {name}",
|
||||
"removed_from_archive": "Премахни от архива",
|
||||
"removed_from_favorites": "Премахнато от любими",
|
||||
"removed_api_key": "Премахни API Key: {name}",
|
||||
"removed_from_archive": "Премахни от Архива",
|
||||
"removed_from_favorites": "Премахнато от Любими",
|
||||
"removed_from_favorites_count": "{count, plural, other {Премахнати #}} от Любими",
|
||||
"removed_memory": "Премахнат спомен",
|
||||
"removed_photo_from_memory": "Премахната снимка от спомен",
|
||||
"removed_tagged_assets": "Премахнат е етикетът от {count, plural, one {# елемент} other {# елемента}}",
|
||||
"rename": "Преименувай",
|
||||
"repair": "Поправи",
|
||||
@@ -1094,7 +1079,6 @@
|
||||
"repository": "Хранилище",
|
||||
"require_password": "Изискай парола",
|
||||
"require_user_to_change_password_on_first_login": "Изисквай потребителят да промени паролата си при първото влизане",
|
||||
"rescan": "Пресканиране",
|
||||
"reset": "Нулиране",
|
||||
"reset_password": "Нулиране на паролата",
|
||||
"reset_people_visibility": "Нулиране на видимостта на хората",
|
||||
@@ -1123,22 +1107,18 @@
|
||||
"search": "Търсене",
|
||||
"search_albums": "Търси албуми",
|
||||
"search_by_context": "Търси по контекст",
|
||||
"search_by_description": "Търси по описание",
|
||||
"search_by_description_example": "Разходка в Сапа",
|
||||
"search_by_filename": "Търси по име на файла или разширение",
|
||||
"search_by_filename_example": "например IMG_1234.JPG или PNG",
|
||||
"search_camera_make": "Търси производител на камерата...",
|
||||
"search_camera_model": "Търси модел на камерата...",
|
||||
"search_city": "Търси град...",
|
||||
"search_country": "Търси държава...",
|
||||
"search_for": "Търси за",
|
||||
"search_for_existing_person": "Търси съществуващ човек",
|
||||
"search_no_people": "Няма хора",
|
||||
"search_no_people_named": "Няма хора на име \"{name}\"",
|
||||
"search_options": "Опции за търсене",
|
||||
"search_people": "Търсете на хора",
|
||||
"search_places": "Търсене на места",
|
||||
"search_rating": "Търси по рейтинг…",
|
||||
"search_settings": "Търсене на настройки",
|
||||
"search_state": "Търсене на щат...",
|
||||
"search_tags": "Търсене на етикети...",
|
||||
@@ -1185,7 +1165,6 @@
|
||||
"shared_from_partner": "Снимки от {partner}",
|
||||
"shared_link_options": "Опции за споделена връзка",
|
||||
"shared_links": "Споделени връзки",
|
||||
"shared_links_description": "Сподели снимки и видеа с линк",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# споделени снимки и видеа.}}",
|
||||
"shared_with_partner": "Споделено с {partner}",
|
||||
"sharing": "Споделени",
|
||||
@@ -1208,7 +1187,6 @@
|
||||
"show_person_options": "Показване на опции за лица",
|
||||
"show_progress_bar": "Показване на прогрес бара",
|
||||
"show_search_options": "Показване на опциите за търсене",
|
||||
"show_shared_links": "Покажи споделени линкове",
|
||||
"show_slideshow_transition": "Покажи прехода на слайдшоуто",
|
||||
"show_supporter_badge": "Значка поддръжник",
|
||||
"show_supporter_badge_description": "Покажи значка поддръжник",
|
||||
@@ -1262,7 +1240,6 @@
|
||||
"tag_created": "Създаден етикет: {tag}",
|
||||
"tag_feature_description": "Разглеждане на снимки и видеоклипове, групирани по теми с логически тагове",
|
||||
"tag_not_found_question": "Не можете да намерите етикет? Създайте такъв <link>тук</link>",
|
||||
"tag_people": "Отбележи Хора",
|
||||
"tag_updated": "Актуализиран етикет: {tag}",
|
||||
"tagged_assets": "Тагнати {count, plural, one {# елемент} other {# елементи}}",
|
||||
"tags": "Етикет",
|
||||
@@ -1297,13 +1274,11 @@
|
||||
"unfavorite": "Премахване от любимите",
|
||||
"unhide_person": "Покажи отново човека",
|
||||
"unknown": "Неизвестно",
|
||||
"unknown_country": "Непозната Държава",
|
||||
"unknown_year": "Неизвестна година",
|
||||
"unlimited": "Неограничено",
|
||||
"unlink_motion_video": "Премахни връзката с видео",
|
||||
"unlink_oauth": "Премахни OAuth",
|
||||
"unlinked_oauth_account": "Премахни OAuth акаунт",
|
||||
"unmute_memories": "Включване на звука на спомените",
|
||||
"unnamed_album": "Албум без име",
|
||||
"unnamed_album_delete_confirmation": "Сигурни ли сте, че искате да изтриете този албум?",
|
||||
"unnamed_share": "Споделяне без име",
|
||||
@@ -1357,7 +1332,6 @@
|
||||
"view_all": "Преглед на всички",
|
||||
"view_all_users": "Преглед на всички потребители",
|
||||
"view_in_timeline": "Покажи във времева линия",
|
||||
"view_link": "Преглед на връзката",
|
||||
"view_links": "Преглед на връзките",
|
||||
"view_name": "Прегледай",
|
||||
"view_next_asset": "Преглед на следващия файл",
|
||||
@@ -1374,4 +1348,4 @@
|
||||
"yes": "Да",
|
||||
"you_dont_have_any_shared_links": "Нямате споделени връзки",
|
||||
"zoom_image": "Увеличаване на изображението"
|
||||
}
|
||||
}
|
||||
|
||||
38
i18n/ca.json
38
i18n/ca.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Ajustes de les còpies de seguretat",
|
||||
"backup_settings_description": "Gestionar la configuració de la còpia de seguretat de la base de dades",
|
||||
"check_all": "Marca-ho tot",
|
||||
"cleanup": "Neteja",
|
||||
"cleared_jobs": "Tasques esborrades per a: {job}",
|
||||
"config_set_by_file": "La configuració està definida per un fitxer de configuració",
|
||||
"confirm_delete_library": "Esteu segurs que voleu eliminar la llibreria {library}?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Habilita l'escaneig periòdic de biblioteques",
|
||||
"library_settings": "Llibreria externes",
|
||||
"library_settings_description": "Gestiona la configuració de les llibreries externes",
|
||||
"library_tasks_description": "Escaneja biblioteques externes per arxius nous o canviats",
|
||||
"library_tasks_description": "Realitza tasques de la bilbioteca",
|
||||
"library_watching_enable_description": "Consultar llibreries externes per detectar canvis en fitxers",
|
||||
"library_watching_settings": "Monitoratge de la llibreria (EXPERIMENTAL)",
|
||||
"library_watching_settings_description": "Monitorització automàtica de fitxers modificats",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Cerca imatges semànticament emprant incrustacions CLIP",
|
||||
"machine_learning_smart_search_enabled": "Activa la cerca intel·ligent",
|
||||
"machine_learning_smart_search_enabled_description": "Si està deshabilitat les imatges no es codificaran per la cerca intel·ligent.",
|
||||
"machine_learning_url_description": "L'URL del servidor d'aprenentatge automàtic. Si es proporciona més d'un URL, s'intentarà accedir a cada servidor en ordre fins que un d'ells respongui correctament.",
|
||||
"machine_learning_url_description": "La URL del servidor d'aprenentatge automàtic. Si es proporciona més d'una URL, s'intentarà accedir a cada servidor en ordre fins que un d'ells respongui correctament.",
|
||||
"manage_concurrency": "Gestiona la concurrència",
|
||||
"manage_log_settings": "Gestiona la configuració del registre",
|
||||
"map_dark_style": "Tema fosc",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Mapa",
|
||||
"map_settings_description": "Gestiona la configuració del mapa",
|
||||
"map_style_description": "URL a un tema del mapa style.json",
|
||||
"memory_cleanup_job": "Neteja de memòries",
|
||||
"memory_generate_job": "Generació de memòries",
|
||||
"metadata_extraction_job": "Extreure metadades",
|
||||
"metadata_extraction_job_description": "Extreu la informació de metadades de cada element, com per exemple el GPS i la resolució",
|
||||
"metadata_faces_import_setting": "Activar la importació de cares",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Activa la verificació de hash. No la desactiveu a menys que estigueu segurs de les implicacions",
|
||||
"storage_template_migration": "Migració de plantilles d'emmagatzematge",
|
||||
"storage_template_migration_description": "Aplica la <link>{template}</link> actual als elements pujats prèviament",
|
||||
"storage_template_migration_info": "Les extensions es convertiran a minúscules. Els canvis de plantilla només s'aplicaran a nous elements. Per aplicar la plantilla rectroactivament a elements pujats prèviament, executeu la <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Els canvis de plantilla només s'aplicaran a nous elements. Per aplicar la plantilla rectroactivament a elements pujats prèviament, executeu la <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Tasca de migració de la plantilla d'emmagatzematge",
|
||||
"storage_template_more_details": "Per obtenir més detalls sobre aquesta funció, consulteu la <template-link>Storage Template</template-link> i les seves <implications-link>implications</implications-link>",
|
||||
"storage_template_onboarding_description": "Quan està activada, aquesta funció organitzarà automàticament els fitxers en funció d'una plantilla definida per l'usuari. A causa de problemes d'estabilitat, la funció s'ha desactivat de manera predeterminada. Per obtenir més informació, consulteu la <link>documentation</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Nombre màxim de B-frames",
|
||||
"transcoding_max_b_frames_description": "Els valors més alts milloren l'eficiència de la compressió, però alenteixen la codificació. És possible que no sigui compatible amb l'acceleració de maquinari en dispositius antics. 0 desactiva els B-frames, mentre que -1 estableix aquest valor automàticament.",
|
||||
"transcoding_max_bitrate": "Taxa de bits màxima",
|
||||
"transcoding_max_bitrate_description": "Establir una taxa de bits màxima pot fer que les mides dels fitxers siguin més previsibles amb un cost menor per a la qualitat. A 720p, els valors típics són 2600 kbit/s per a VP9 o HEVC, o 4500 kbit/s per a H.264. Desactivat si s'estableix a 0.",
|
||||
"transcoding_max_bitrate_description": "Establir una taxa de bits màxima pot fer que les mides dels fitxers siguin més previsibles amb un cost menor per a la qualitat. A 720p, els valors típics són 2600k per a VP9 o HEVC, o 4500k per a H.264. Desactivat si s'estableix a 0.",
|
||||
"transcoding_max_keyframe_interval": "Interval màxim de fotogrames clau",
|
||||
"transcoding_max_keyframe_interval_description": "Estableix la distància màxima entre fotogrames clau. Els valors més baixos empitjoren l'eficiència de la compressió, però milloren els temps de cerca i poden millorar la qualitat en escenes amb moviment ràpid. 0 estableix aquest valor automàticament.",
|
||||
"transcoding_optimal_description": "Vídeos superiors a la resolució objectiu o que no tenen un format acceptat",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Permet editar",
|
||||
"allow_public_user_to_download": "Permet que l'usuari públic pugui descarregar",
|
||||
"allow_public_user_to_upload": "Permet que l'usuari públic pugui carregar",
|
||||
"alt_text_qr_code": "Codi QR",
|
||||
"anti_clockwise": "En sentit antihorari",
|
||||
"api_key": "Clau API",
|
||||
"api_key_description": "Aquest valor només es mostrarà una vegada. Assegureu-vos de copiar-lo abans de tancar la finestra.",
|
||||
@@ -414,7 +410,7 @@
|
||||
"asset_description_updated": "La descripció del recurs s'ha actualitzat",
|
||||
"asset_filename_is_offline": "L'element {filename} està fora de línia",
|
||||
"asset_has_unassigned_faces": "L'element té cares no assignades",
|
||||
"asset_hashing": "Hasheant…",
|
||||
"asset_hashing": "Hashing…",
|
||||
"asset_offline": "Element fora de línia",
|
||||
"asset_offline_description": "Aquest recurs extern ja no es troba al disc. Poseu-vos en contacte amb el vostre administrador d'Immich per obtenir ajuda.",
|
||||
"asset_skipped": "Saltat",
|
||||
@@ -468,7 +464,7 @@
|
||||
"check_logs": "Comprovar els registres",
|
||||
"choose_matching_people_to_merge": "Trieu les persones que coincideixin per combinar-les",
|
||||
"city": "Ciutat",
|
||||
"clear": "Buida",
|
||||
"clear": "Neteja",
|
||||
"clear_all": "Neteja-ho tot",
|
||||
"clear_all_recent_searches": "Esborra totes les cerques recents",
|
||||
"clear_message": "Neteja el missatge",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Els comentaris estan desactivats",
|
||||
"confirm": "Confirmar",
|
||||
"confirm_admin_password": "Confirmeu la contrasenya d'administrador",
|
||||
"confirm_delete_face": "Estàs segur que vols eliminar la cara de {name} de les cares reconegudes?",
|
||||
"confirm_delete_shared_link": "Esteu segurs que voleu eliminar aquest enllaç compartit?",
|
||||
"confirm_keep_this_delete_others": "Excepte aquest element, tots els altres de la pila se suprimiran. Esteu segur que voleu continuar?",
|
||||
"confirm_password": "Confirmació de contrasenya",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Esborra l'àlbum",
|
||||
"delete_api_key_prompt": "Esteu segurs que voleu eliminar aquesta clau API?",
|
||||
"delete_duplicates_confirmation": "Esteu segurs que voleu eliminar aquests duplicats permanentment?",
|
||||
"delete_face": "Esborrar cara",
|
||||
"delete_key": "Suprimeix la clau",
|
||||
"delete_library": "Suprimeix la Llibreria",
|
||||
"delete_link": "Esborra l'enllaç",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Activat",
|
||||
"end_date": "Data final",
|
||||
"error": "Error",
|
||||
"error_delete_face": "Error esborrant cara de les cares reconegudes",
|
||||
"error_loading_image": "Error carregant la imatge",
|
||||
"error_title": "Error - Quelcom ha anat malament",
|
||||
"errors": {
|
||||
@@ -773,10 +766,8 @@
|
||||
"go_to_folder": "Anar al directori",
|
||||
"go_to_search": "Vés a cercar",
|
||||
"group_albums_by": "Agrupa àlbums per...",
|
||||
"group_country": "Agrupar per país",
|
||||
"group_no": "Cap agrupació",
|
||||
"group_owner": "Agrupar per propietari",
|
||||
"group_places_by": "Agrupar llocs per...",
|
||||
"group_year": "Agrupar per any",
|
||||
"has_quota": "Quota",
|
||||
"hi_user": "Hola {name} ({email})",
|
||||
@@ -809,7 +800,6 @@
|
||||
"include_shared_albums": "Inclou àlbums compartits",
|
||||
"include_shared_partner_assets": "Incloure elements dels companys",
|
||||
"individual_share": "Compartit individualment",
|
||||
"individual_shares": "Espais individuals",
|
||||
"info": "Informació",
|
||||
"interval": {
|
||||
"day_at_onepm": "Cada dia a les 13h",
|
||||
@@ -891,7 +881,6 @@
|
||||
"month": "Mes",
|
||||
"more": "Més",
|
||||
"moved_to_trash": "S'ha mogut a la paperera",
|
||||
"mute_memories": "Silenciar records",
|
||||
"my_albums": "Els meus àlbums",
|
||||
"name": "Nom",
|
||||
"name_or_nickname": "Nom o sobrenom",
|
||||
@@ -996,7 +985,6 @@
|
||||
"pick_a_location": "Triar una ubicació",
|
||||
"place": "Lloc",
|
||||
"places": "Llocs",
|
||||
"places_count": "{count, plural, one {{count, number} Lloc} other {{count, number} Llocs}}",
|
||||
"play": "Reprodueix",
|
||||
"play_memories": "Reproduir records",
|
||||
"play_motion_photo": "Reproduir Fotos en Moviment",
|
||||
@@ -1084,8 +1072,6 @@
|
||||
"removed_from_archive": "Eliminat de l'arxiu",
|
||||
"removed_from_favorites": "Eliminat dels preferits",
|
||||
"removed_from_favorites_count": "{count, plural, other {# eliminats}} dels preferits",
|
||||
"removed_memory": "Eliminat memòria",
|
||||
"removed_photo_from_memory": "Eliminat foto de memòria",
|
||||
"removed_tagged_assets": "Etiqueta eliminada de {count, plural, one {# actiu} other {# actius}}",
|
||||
"rename": "Canviar nom",
|
||||
"repair": "Reparació",
|
||||
@@ -1094,7 +1080,6 @@
|
||||
"repository": "Repositori",
|
||||
"require_password": "Requereix contrasenya",
|
||||
"require_user_to_change_password_on_first_login": "Requerir que l'usuari canviï la contrasenya en el primer inici de sessió",
|
||||
"rescan": "Tornar a escanejar",
|
||||
"reset": "Restablir",
|
||||
"reset_password": "Restablir contrasenya",
|
||||
"reset_people_visibility": "Restablir la visibilitat de les persones",
|
||||
@@ -1123,8 +1108,6 @@
|
||||
"search": "Cerca",
|
||||
"search_albums": "Buscar àlbums",
|
||||
"search_by_context": "Buscar per context",
|
||||
"search_by_description": "Cercar per descripció",
|
||||
"search_by_description_example": "Jornada de senderisme a Sapa",
|
||||
"search_by_filename": "Cerca per nom de fitxer o extensió",
|
||||
"search_by_filename_example": "per exemple IMG_1234.JPG o PNG",
|
||||
"search_camera_make": "Buscar per fabricant de càmara...",
|
||||
@@ -1138,7 +1121,6 @@
|
||||
"search_options": "Opcions de cerca",
|
||||
"search_people": "Buscar persones",
|
||||
"search_places": "Buscar llocs",
|
||||
"search_rating": "Buscar per qualificació...",
|
||||
"search_settings": "Configuració de cerca",
|
||||
"search_state": "Buscar per regió...",
|
||||
"search_tags": "Cercant etiquetes...",
|
||||
@@ -1185,7 +1167,6 @@
|
||||
"shared_from_partner": "Fotos de {partner}",
|
||||
"shared_link_options": "Opcions d'enllaços compartits",
|
||||
"shared_links": "Enllaços compartits",
|
||||
"shared_links_description": "Comparteix fotos i vídeos amb un enllaç",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# fotos i vídeos compartits.}}",
|
||||
"shared_with_partner": "Compartit amb {partner}",
|
||||
"sharing": "Compartit",
|
||||
@@ -1208,7 +1189,6 @@
|
||||
"show_person_options": "Mostra opcions de la persona",
|
||||
"show_progress_bar": "Mostra barra de progrés",
|
||||
"show_search_options": "Mostra opcions de cerca",
|
||||
"show_shared_links": "Mostra els enllaços compartits",
|
||||
"show_slideshow_transition": "Mostra la transició de la presentació de diapositives",
|
||||
"show_supporter_badge": "Insígnia de contribuent",
|
||||
"show_supporter_badge_description": "Mostra una insígnia de contributor",
|
||||
@@ -1262,7 +1242,6 @@
|
||||
"tag_created": "Etiqueta creada: {tag}",
|
||||
"tag_feature_description": "Exploreu fotos i vídeos agrupats per temes d'etiquetes lògiques",
|
||||
"tag_not_found_question": "No trobeu una etiqueta? <link>Crear una nova etiqueta</link>",
|
||||
"tag_people": "Etiquetar personas",
|
||||
"tag_updated": "Etiqueta actualizada: {tag}",
|
||||
"tagged_assets": "{count, plural, one {#Etiquetat} other {#Etiquetats}} {count, plural, one {# actiu} other {# actius}}",
|
||||
"tags": "Etiquetes",
|
||||
@@ -1297,13 +1276,11 @@
|
||||
"unfavorite": "Reverteix preferit",
|
||||
"unhide_person": "Mostra persona",
|
||||
"unknown": "Desconegut",
|
||||
"unknown_country": "País Desconegut",
|
||||
"unknown_year": "Any desconegut",
|
||||
"unlimited": "Il·limitat",
|
||||
"unlink_motion_video": "Desvincular vídeo en moviment",
|
||||
"unlink_oauth": "Desvincula OAuth",
|
||||
"unlinked_oauth_account": "Compte Oauth desvinculat",
|
||||
"unmute_memories": "Activar el so dels records",
|
||||
"unnamed_album": "Àlbum sense nom",
|
||||
"unnamed_album_delete_confirmation": "Segur que voleu esborrar aquest àlbum?",
|
||||
"unnamed_share": "Compartit sense nom",
|
||||
@@ -1357,7 +1334,6 @@
|
||||
"view_all": "Veure tot",
|
||||
"view_all_users": "Mostra tot els usuaris",
|
||||
"view_in_timeline": "Mostrar a la línia de temps",
|
||||
"view_link": "Veure enllaç",
|
||||
"view_links": "Mostra enllaços",
|
||||
"view_name": "Veure",
|
||||
"view_next_asset": "Mostra el següent element",
|
||||
@@ -1374,4 +1350,4 @@
|
||||
"yes": "Sí",
|
||||
"you_dont_have_any_shared_links": "No tens cap enllaç compartit",
|
||||
"zoom_image": "Ampliar Imatge"
|
||||
}
|
||||
}
|
||||
|
||||
41
i18n/cs.json
41
i18n/cs.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Nastavení zálohování",
|
||||
"backup_settings_description": "Správa nastavení zálohování databáze",
|
||||
"check_all": "Vše zkontrolovat",
|
||||
"cleanup": "Vyčištění",
|
||||
"cleared_jobs": "Hotové úlohy pro: {job}",
|
||||
"config_set_by_file": "Konfigurace je aktuálně prováděna konfiguračním souborem",
|
||||
"confirm_delete_library": "Opravdu chcete odstranit knihovnu {library}?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Povolit pravidelné prohledávání knihovny",
|
||||
"library_settings": "Externí knihovna",
|
||||
"library_settings_description": "Správa nastavení externí knihovny",
|
||||
"library_tasks_description": "Vyhledávání nových nebo změněných položek v externích knihovnách",
|
||||
"library_tasks_description": "Provádění úkolů v knihovně",
|
||||
"library_watching_enable_description": "Sledovat změny souborů v externích knihovnách",
|
||||
"library_watching_settings": "Sledování knihovny (EXPERIMENTÁLNÍ)",
|
||||
"library_watching_settings_description": "Automatické sledování změněných souborů",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Sémantické vyhledávání obrázků pomocí CLIP embeddings",
|
||||
"machine_learning_smart_search_enabled": "Povolit chytré vyhledávání",
|
||||
"machine_learning_smart_search_enabled_description": "Pokud je vypnuto, obrázky nebudou kódovány pro inteligentní vyhledávání.",
|
||||
"machine_learning_url_description": "URL serveru strojového učení. Pokud je zadáno více URL adres, budou jednotlivé servery zkoušeny postupně, dokud jeden z nich neodpoví úspěšně, a to v pořadí od prvního k poslednímu. Servery, které neodpoví, budou dočasně ignorovány, dokud nebudou opět online.",
|
||||
"machine_learning_url_description": "URL serveru strojového učení. Pokud je zadáno více URL adres, budou jednotlivé servery zkoušeny postupně, dokud jeden z nich neodpoví úspěšně, a to v pořadí od prvního k poslednímu.",
|
||||
"manage_concurrency": "Správa souběžnosti",
|
||||
"manage_log_settings": "Správa nastavení protokolu",
|
||||
"map_dark_style": "Tmavý motiv",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Mapa",
|
||||
"map_settings_description": "Správa nastavení mapy",
|
||||
"map_style_description": "URL na style.json motivu",
|
||||
"memory_cleanup_job": "Promazání vzpomínek",
|
||||
"memory_generate_job": "Vytvoření vzpomínek",
|
||||
"metadata_extraction_job": "Extrakce metadat",
|
||||
"metadata_extraction_job_description": "Získání informací o metadatech z každého snímku, jako je GPS, obličeje a rozlišení",
|
||||
"metadata_faces_import_setting": "Povolit import obličeje",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Povolí ověřování hashe, nevypínejte ji, pokud si nejste jisti důsledky",
|
||||
"storage_template_migration": "Migrace šablony úložiště",
|
||||
"storage_template_migration_description": "Použít aktuální <link>{template}</link> na dříve nahrané položky",
|
||||
"storage_template_migration_info": "Šablona úložiště převede všechny přípony na malá písmena. Změny šablon se uplatní pouze u nových položek. Chcete-li šablonu zpětně použít na dříve nahrané položky, spusťte <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Změny šablon se uplatní pouze u nových položek. Chcete-li šablonu zpětně použít na dříve nahrané položky, spusťte <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Úloha migrace šablony úložiště",
|
||||
"storage_template_more_details": "Další podrobnosti o této funkci naleznete v sekci <template-link>Šablona úložiště</template-link> včetně jejích <implications-link>důsledků</implications-link>",
|
||||
"storage_template_onboarding_description": "Je-li tato funkce povolena, automaticky uspořádá soubory na základě uživatelem definované šablony. Z důvodu problémů se stabilitou byla tato funkce ve výchozím nastavení vypnuta. Další informace naleznete v <link>dokumentaci</link>.",
|
||||
@@ -291,7 +288,7 @@
|
||||
"transcoding_constant_quality_mode_description": "ICQ je lepší než CQP, ale některá zařízení pro hardwarovou akceleraci tento režim nepodporují. Nastavením této volby se při použití kódování založeného na kvalitě upřednostní zadaný režim. Ignorováno NVENC, protože nepodporuje ICQ.",
|
||||
"transcoding_constant_rate_factor": "Faktor konstantní rychlosti (-crf)",
|
||||
"transcoding_constant_rate_factor_description": "Úroveň kvality videa. Typické hodnoty jsou 23 pro H.264, 28 pro HEVC, 31 pro VP9 a 35 pro AV1. Nižší je lepší, ale vytváří větší soubory.",
|
||||
"transcoding_disabled_description": "Nepřekódovávat žádná videa, u některých klientů může dojít k znemožnění přehrávání",
|
||||
"transcoding_disabled_description": "Nepřekódovávejte žádná videa, u některých klientů může dojít k znemožnění přehrávání",
|
||||
"transcoding_encoding_options": "Možnosti kódování",
|
||||
"transcoding_encoding_options_description": "Nastavte kodeky, rozlišení, kvalitu a další možnosti pro kódovaná videa",
|
||||
"transcoding_hardware_acceleration": "Hardwarová akcelerace",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maximální počet B-snímků",
|
||||
"transcoding_max_b_frames_description": "Vyšší hodnoty zvyšují účinnost komprese, ale zpomalují kódování. Nemusí být kompatibilní s hardwarovou akcelerací na starších zařízeních. Hodnota 0 zakáže B-snímky, zatímco -1 tuto hodnotu nastaví automaticky.",
|
||||
"transcoding_max_bitrate": "Maximální datový tok",
|
||||
"transcoding_max_bitrate_description": "Nastavení maximálního datového toku může zvýšit předvídatelnost velikosti souborů za cenu menší újmy na kvalitě. Při rozlišení 720p jsou typické hodnoty 2600 kbit/s pro VP9 nebo HEVC nebo 4500 kbit/s pro H.264. Je zakázáno, pokud je nastavena hodnota 0.",
|
||||
"transcoding_max_bitrate_description": "Nastavení maximálního datového toku může zvýšit předvídatelnost velikosti souborů za cenu menší újmy na kvalitě. Při rozlišení 720p jsou typické hodnoty 2600k pro VP9 nebo HEVC nebo 4500k pro H.264. Je zakázáno, pokud je nastavena hodnota 0.",
|
||||
"transcoding_max_keyframe_interval": "Maximální interval klíčových snímků",
|
||||
"transcoding_max_keyframe_interval_description": "Nastavuje maximální vzdálenost mezi klíčovými snímky. Nižší hodnoty zhoršují účinnost komprese, ale zlepšují rychlost při přeskakování a mohou zlepšit kvalitu ve scénách s rychlým pohybem. Hodnota 0 nastavuje tuto hodnotu automaticky.",
|
||||
"transcoding_optimal_description": "Videa s vyšším než cílovým rozlišením nebo videa, která nejsou v akceptovaném formátu",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Povolit úpravy",
|
||||
"allow_public_user_to_download": "Povolit veřejnosti stahovat",
|
||||
"allow_public_user_to_upload": "Povolit veřejnosti nahrávat",
|
||||
"alt_text_qr_code": "Obrázek QR kódu",
|
||||
"anti_clockwise": "Proti směru hodinových ručiček",
|
||||
"api_key": "API klíč",
|
||||
"api_key_description": "Tato hodnota se zobrazí pouze jednou. Před zavřením okna ji nezapomeňte zkopírovat.",
|
||||
@@ -468,11 +464,11 @@
|
||||
"check_logs": "Zkontrolujte protokoly",
|
||||
"choose_matching_people_to_merge": "Zvolte odpovídající osoby ke sloučení",
|
||||
"city": "Město",
|
||||
"clear": "Vymazat",
|
||||
"clear": "Vyčistit",
|
||||
"clear_all": "Vymazat vše",
|
||||
"clear_all_recent_searches": "Vymazat všechna nedávná vyhledávání",
|
||||
"clear_message": "Vymazat zprávu",
|
||||
"clear_value": "Vymazat hodnotu",
|
||||
"clear_message": "Vyčistit zprávu",
|
||||
"clear_value": "Vyčistit hodnotu",
|
||||
"clockwise": "Po směru hodinových ručiček",
|
||||
"close": "Zavřít",
|
||||
"collapse": "Sbalit",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Komentáře jsou vypnuty",
|
||||
"confirm": "Potvrdit",
|
||||
"confirm_admin_password": "Potvrzení hesla správce",
|
||||
"confirm_delete_face": "Opravdu chcete z položky odstranit obličej osoby {name}?",
|
||||
"confirm_delete_shared_link": "Opravdu chcete odstranit tento sdílený odkaz?",
|
||||
"confirm_keep_this_delete_others": "Všechny ostatní položky v tomto uskupení mimo této budou odstraněny. Opravdu chcete pokračovat?",
|
||||
"confirm_password": "Potvrzení hesla",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Smazat album",
|
||||
"delete_api_key_prompt": "Opravdu chcete tento API klíč odstranit?",
|
||||
"delete_duplicates_confirmation": "Opravdu chcete tyto duplicity trvale odstranit?",
|
||||
"delete_face": "Odstranit obličej",
|
||||
"delete_key": "Smazat klíč",
|
||||
"delete_library": "Smazat knihovnu",
|
||||
"delete_link": "Smazat odkaz",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Povoleno",
|
||||
"end_date": "Konečné datum",
|
||||
"error": "Chyba",
|
||||
"error_delete_face": "Chyba při odstraňování obličeje z položky",
|
||||
"error_loading_image": "Chyba při načítání obrázku",
|
||||
"error_title": "Chyba - Něco se pokazilo",
|
||||
"errors": {
|
||||
@@ -758,8 +751,8 @@
|
||||
"features_setting_description": "Správa funkcí aplikace",
|
||||
"file_name": "Název souboru",
|
||||
"file_name_or_extension": "Název nebo přípona souboru",
|
||||
"filename": "Název souboru",
|
||||
"filetype": "Typ souboru",
|
||||
"filename": "Filename",
|
||||
"filetype": "Filetype",
|
||||
"filter_people": "Filtrovat lidi",
|
||||
"find_them_fast": "Najděte je rychle vyhledáním jejich jména",
|
||||
"fix_incorrect_match": "Opravit nesprávnou shodu",
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "Měsíc",
|
||||
"more": "Více",
|
||||
"moved_to_trash": "Přesunuto do koše",
|
||||
"mute_memories": "Ztlumit vzpomínky",
|
||||
"my_albums": "Moje alba",
|
||||
"name": "Jméno",
|
||||
"name_or_nickname": "Jméno nebo přezdívka",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Položka trvale odstraněna",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {Položka trvale vymazána} other {Položky trvale vymazány}}",
|
||||
"person": "Osoba",
|
||||
"person_birthdate": "Narozen/a {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (skryto)} other {}}",
|
||||
"photo_shared_all_users": "Vypadá to, že jste fotky sdíleli se všemi uživateli, nebo nemáte žádného uživatele, se kterým byste je mohli sdílet.",
|
||||
"photos": "Fotky",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Odstranit z alba",
|
||||
"remove_from_favorites": "Odstranit z oblíbených",
|
||||
"remove_from_shared_link": "Odstranit ze sdíleného odkazu",
|
||||
"remove_memory": "Odstranit vzpomínku",
|
||||
"remove_photo_from_memory": "Odstranit fotografii z této vzpomínky",
|
||||
"remove_url": "Odstranit URL",
|
||||
"remove_user": "Odebrat uživatele",
|
||||
"removed_api_key": "Odstraněn API klíč: {name}",
|
||||
"removed_from_archive": "Odstraněno z archivu",
|
||||
"removed_from_favorites": "Odstraněno z oblíbených",
|
||||
"removed_from_favorites_count": "{count, plural, one {Odstraněn #} few {Odstraněny #} other {Odstraněno #}} z oblíbených",
|
||||
"removed_memory": "Vzpomínka odstraněna",
|
||||
"removed_photo_from_memory": "Fotografie odstraněna ze vzpomínky",
|
||||
"removed_tagged_assets": "Odstraněná značka z {count, plural, one {# položky} other {# položek}}",
|
||||
"rename": "Přejmenovat",
|
||||
"repair": "Opravy",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Repozitář",
|
||||
"require_password": "Požadovat heslo",
|
||||
"require_user_to_change_password_on_first_login": "Požadovat, aby si uživatel při prvním přihlášení změnil heslo",
|
||||
"rescan": "Znovu prohledat",
|
||||
"reset": "Výchozí",
|
||||
"reset_password": "Obnovit heslo",
|
||||
"reset_people_visibility": "Obnovit viditelnost lidí",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Možnosti vyhledávání",
|
||||
"search_people": "Vyhledat lidi",
|
||||
"search_places": "Vyhledat místa",
|
||||
"search_rating": "Vyhledávání podle hodnocení...",
|
||||
"search_settings": "Hledat nastavení",
|
||||
"search_state": "Vyhledat stát...",
|
||||
"search_tags": "Vyhledávat značky...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Vyhledávání jazyků...",
|
||||
"second": "Sekunda",
|
||||
"see_all_people": "Zobrazit všechny lidi",
|
||||
"select": "Vybrat",
|
||||
"select_album_cover": "Vybrat obal alba",
|
||||
"select_all": "Vybrat vše",
|
||||
"select_all_duplicates": "Vybrat všechny duplicity",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Vytvořena značka: {tag}",
|
||||
"tag_feature_description": "Procházení fotografií a videí seskupených podle témat logických značek",
|
||||
"tag_not_found_question": "Nemůžete najít značku? <link>Vytvořte novou.</link>",
|
||||
"tag_people": "Označit lidi",
|
||||
"tag_updated": "Aktualizována značka: {tag}",
|
||||
"tagged_assets": "Přiřazena značka {count, plural, one {# položce} other {# položkám}}",
|
||||
"tags": "Značky",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Odpojit pohyblivé video",
|
||||
"unlink_oauth": "Zrušit OAuth propojení",
|
||||
"unlinked_oauth_account": "OAuth účet odpojen",
|
||||
"unmute_memories": "Zrušit ztlumení vzpomínek",
|
||||
"unnamed_album": "Nepojmenované album",
|
||||
"unnamed_album_delete_confirmation": "Opravdu chcete toto album smazat?",
|
||||
"unnamed_share": "Nepojmenované sdílení",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Zobrazit vše",
|
||||
"view_all_users": "Zobrazit všechny uživatele",
|
||||
"view_in_timeline": "Zobrazit na časové ose",
|
||||
"view_link": "Zobrazit odkaz",
|
||||
"view_links": "Zobrazit odkazy",
|
||||
"view_name": "Zobrazit",
|
||||
"view_next_asset": "Zobrazit další položku",
|
||||
@@ -1374,7 +1355,7 @@
|
||||
"welcome": "Vítejte",
|
||||
"welcome_to_immich": "Vítejte v Immichi",
|
||||
"year": "Rok",
|
||||
"years_ago": "Před {years, plural, one {rokem} other {# lety}}",
|
||||
"years_ago": "Před {years, plural, one {# rokem} other {# lety}}",
|
||||
"yes": "Ano",
|
||||
"you_dont_have_any_shared_links": "Nemáte žádné sdílené odkazy",
|
||||
"zoom_image": "Zvětšit obrázek"
|
||||
|
||||
125
i18n/da.json
125
i18n/da.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Backup-indstillinger",
|
||||
"backup_settings_description": "Administrer backupindstillinger for database",
|
||||
"check_all": "Tjek Alle",
|
||||
"cleanup": "Ryd op",
|
||||
"cleared_jobs": "Ryddet jobs til: {job}",
|
||||
"config_set_by_file": "konfigurationen er i øjeblikket indstillet af en konfigurations fil",
|
||||
"confirm_delete_library": "Er du sikker på, at du vil slette {library} bibliotek?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Aktiver periodisk biblioteksscanning",
|
||||
"library_settings": "Eksternt bibliotek",
|
||||
"library_settings_description": "Administrer eksterne biblioteksindstillinger",
|
||||
"library_tasks_description": "Scan eksterne biblioteker for nye og/eller ændrede mediefiler",
|
||||
"library_tasks_description": "Udfør biblioteksopgaver",
|
||||
"library_watching_enable_description": "Overvåg eksterne biblioteker for filændringer",
|
||||
"library_watching_settings": "Biblioteks overvågning (EKSPERIMENTEL)",
|
||||
"library_watching_settings_description": "Tjek automatisk for ændrede filer",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Søg semantisk efter billeder ved hjælp af CLIP-indlejringer",
|
||||
"machine_learning_smart_search_enabled": "Aktiver smart søgning",
|
||||
"machine_learning_smart_search_enabled_description": "Hvis deaktiveret, vil billeder ikke blive kodet til smart søgning.",
|
||||
"machine_learning_url_description": "URL’en for maskinlæringsserveren. Hvis mere end én URL angives, vil hver server blive forsøgt én ad gangen, indtil en svarer succesfuldt, i rækkefølge fra første til sidste. Servere, der ikke svarer, vil midlertidigt blive ignoreret, indtil de kommer online igen.",
|
||||
"machine_learning_url_description": "URL på maskinlæringsserveren. Hvis der er angivet mere end én URL, hver server vil blive forsøgt en ad gangen, indtil en reagerer med succes, i rækkefølge fra første til sidste.",
|
||||
"manage_concurrency": "Administrer antallet af samtidige opgaver",
|
||||
"manage_log_settings": "Administrer logindstillinger",
|
||||
"map_dark_style": "Mørk tema",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Kort",
|
||||
"map_settings_description": "Administrer kortindstillinger",
|
||||
"map_style_description": "URL til en style.json for et korttema",
|
||||
"memory_cleanup_job": "Mindeoprydning",
|
||||
"memory_generate_job": "Mindegeneration",
|
||||
"metadata_extraction_job": "Udtræk metadata",
|
||||
"metadata_extraction_job_description": "Udtræk metadataoplysninger fra hvert Billede/Video, såsom GPS og opløsning",
|
||||
"metadata_faces_import_setting": "Aktivér for at importere ansigter",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Slår hash-verifikation til, slå ikke dette fra med mindre du er sikker på dets konsekvenser",
|
||||
"storage_template_migration": "Lagringsskabelonmigration",
|
||||
"storage_template_migration_description": "Anvend den nuværende <link>{template}</link> på tidligere uploadede mediefiler",
|
||||
"storage_template_migration_info": "Lager-skabelonen vil konvertere alle filendelser til små bogstaver. Skabelonændringer vil kun gælde for nye mediefiler. For at anvende skabelonen retroaktivt på tidligere uploadede mediefiler skal du køre <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Skabelonændringer vil kun gælde for nye mediefiler. For at anvende skabelonen retroaktivt på tidligere uploadede mediefiler skal du køre <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Lager Skabelon Migreringsjob",
|
||||
"storage_template_more_details": "For flere detaljer om denne funktion, referer til <template-link>Lager Skabelonen</template-link> og dens <implications-link>implikationer</implications-link>",
|
||||
"storage_template_onboarding_description": "Når denne funktion er aktiveret, vil den automatisk organisere filer baseret på en brugerdefineret skabelon. På grund af stabilitetsproblemer er funktionen som standard slået fra. For mere information, se <link>dokumentation</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maksimum B-frames",
|
||||
"transcoding_max_b_frames_description": "Højere værdier forbedrer kompressionseffektivitet, men kan gøre indkodning langsommere. Er måske ikke kompatibelt med hardware-acceleration på ældre enheder. 0 slår B-frames fra, mens -1 sætter denne værdi automatisk.",
|
||||
"transcoding_max_bitrate": "Maksimal bitrate",
|
||||
"transcoding_max_bitrate_description": "At sætte en maksmimal bitrate kan gøre filstørrelserne mere forudsigelige med et lille tab i kvalitet. Ved 720p er almindelige værdier 2600 kbit/s for VP9 eller HEVC, eller 4500 kbit/s for H.264. Slået fra hvis sat til 0.",
|
||||
"transcoding_max_bitrate_description": "At sætte en maksmimal bitrate kan gøre filstørrelserne mere forudsigelige med et lille tab i kvalitet. Ved 720p er almindelige værdier 2600k for VP9 eller HEVC, eller 4500K for H.264. Slået fra hvis sat til 0.",
|
||||
"transcoding_max_keyframe_interval": "Maksimal keyframe-interval",
|
||||
"transcoding_max_keyframe_interval_description": "Sætter den maksimale frameafstand mellem keyframes. Lavere værdier forringer kompressionseffektiviteten, men forbedrer søgetider og kan forbedre kvaliteten i scener med hurtig bevægelse. 0 sætter denne værdi automatisk.",
|
||||
"transcoding_optimal_description": "Videoer højere end målopløsningen eller ikke i et godkendt format",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Tillad redigeringer",
|
||||
"allow_public_user_to_download": "Tillad offentlige brugere til at hente",
|
||||
"allow_public_user_to_upload": "Tillad offentlige brugere til at uploade",
|
||||
"alt_text_qr_code": "QR-kode billede",
|
||||
"anti_clockwise": "Mod uret",
|
||||
"api_key": "API-nøgle",
|
||||
"api_key_description": "Denne værdi vises kun én gang. Venligst kopiér den før du lukker vinduet.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Kommentarer er slået fra",
|
||||
"confirm": "Bekræft",
|
||||
"confirm_admin_password": "Bekræft administratoradgangskode",
|
||||
"confirm_delete_face": "Er du sikker på, du vil slette {name}s ansigt fra denne mediefil?",
|
||||
"confirm_delete_shared_link": "Er du sikker på, at du vil slette dette delte link?",
|
||||
"confirm_keep_this_delete_others": "Alle andre aktiver i stakken vil blive slettet undtagen dette aktiv. Er du sikker på, at du vil fortsætte?",
|
||||
"confirm_password": "Bekræft adgangskode",
|
||||
@@ -509,7 +504,7 @@
|
||||
"create_library": "Opret bibliotek",
|
||||
"create_link": "Opret link",
|
||||
"create_link_to_share": "Opret link for at dele",
|
||||
"create_link_to_share_description": "Tillad alle med linket at se de(t) valgte billede(r)",
|
||||
"create_link_to_share_description": "Lad alle med linket se de(t) valgte billede(r)",
|
||||
"create_new_person": "Opret ny person",
|
||||
"create_new_person_hint": "Tildel valgte aktiver til en ny person",
|
||||
"create_new_user": "Opret ny bruger",
|
||||
@@ -524,21 +519,20 @@
|
||||
"date_after": "Dato efter",
|
||||
"date_and_time": "Dato og klokkeslæt",
|
||||
"date_before": "Dato før",
|
||||
"date_of_birth_saved": "Fødselsdatoen blev gemt korrekt",
|
||||
"date_of_birth_saved": "Fødselsdatoen blev gemt",
|
||||
"date_range": "Datointerval",
|
||||
"day": "Dag",
|
||||
"deduplicate_all": "Kopier alle",
|
||||
"deduplicate_all": "Dedupliker alle",
|
||||
"deduplication_criteria_1": "Billedstørrelse i bytes",
|
||||
"deduplication_criteria_2": "Antal EXIF-data",
|
||||
"deduplication_info": "Deduplikerings info",
|
||||
"deduplication_info_description": "For automatisk at forudvælge emner og fjerne dubletter i bulk ser vi på:",
|
||||
"default_locale": "Standardlokalitet",
|
||||
"default_locale_description": "Formatér datoer og tal baseret på din browsers regions indstillinger",
|
||||
"default_locale_description": "Formatér datoer og tal",
|
||||
"delete": "Slet",
|
||||
"delete_album": "Slet album",
|
||||
"delete_api_key_prompt": "Er du sikker på, at du vil slette denne API-nøgle?",
|
||||
"delete_duplicates_confirmation": "Er du sikker på, at du vil slette disse dubletter permanent?",
|
||||
"delete_face": "Slet ansigt",
|
||||
"delete_key": "Slet nøgle",
|
||||
"delete_library": "Slet bibliotek",
|
||||
"delete_link": "Slet link",
|
||||
@@ -571,7 +565,7 @@
|
||||
"download_settings": "Download",
|
||||
"download_settings_description": "Administrer indstillinger relateret til mediefil-downloads",
|
||||
"downloading": "Downloader",
|
||||
"downloading_asset_filename": "Downloader mediefil {filename}",
|
||||
"downloading_asset_filename": "Downloader aktiv {filename}",
|
||||
"drop_files_to_upload": "Slip filer hvor som helst for at uploade dem",
|
||||
"duplicates": "Duplikater",
|
||||
"duplicates_description": "Løs hver gruppe ved at angive, hvilke, hvis nogen, er dubletter",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Aktiveret",
|
||||
"end_date": "Slutdato",
|
||||
"error": "Fejl",
|
||||
"error_delete_face": "Fejl ved sletning af ansigt fra mediefil",
|
||||
"error_loading_image": "Fejl ved indlæsning af billede",
|
||||
"error_title": "Fejl - Noget gik galt",
|
||||
"errors": {
|
||||
@@ -614,11 +607,11 @@
|
||||
"cannot_navigate_previous_asset": "Kan ikke navigere til forrige mediefil",
|
||||
"cant_apply_changes": "Ændringerne kan ikke anvendes",
|
||||
"cant_change_activity": "Kan ikke {enabled, select, true {disable} other {enable}} aktivitet",
|
||||
"cant_change_asset_favorite": "Kan ikke ændre favorit til mediefil",
|
||||
"cant_change_asset_favorite": "Kan ikke ændre favorit til aktiv",
|
||||
"cant_change_metadata_assets_count": "Kan ikke ændre metadata for {count, plural, one {# objekt} other {# objekter}}",
|
||||
"cant_get_faces": "Kan ikke hente ansigter",
|
||||
"cant_get_number_of_comments": "Kan ikke få antallet af kommentarer",
|
||||
"cant_search_people": "Kan ikke søge efter personer",
|
||||
"cant_search_people": "Kan ikke søge efter folk",
|
||||
"cant_search_places": "Kan ikke søge efter steder",
|
||||
"cleared_jobs": "Ryddede opgaver for: {job}",
|
||||
"error_adding_assets_to_album": "Fejl i tilføjelse af mediefiler til album",
|
||||
@@ -627,20 +620,20 @@
|
||||
"error_downloading": "Fejl i download af {filename}",
|
||||
"error_hiding_buy_button": "Fejl i skjulning af køb-knap",
|
||||
"error_removing_assets_from_album": "Fejl i fjernelse af mediefiler fra album. Tjek konsol for flere detaljer",
|
||||
"error_selecting_all_assets": "Fejl ved valg af alle mediefiler",
|
||||
"error_selecting_all_assets": "Fejl ved valg af alle aktiver",
|
||||
"exclusion_pattern_already_exists": "Denne udelukkelsesmønster findes allerede.",
|
||||
"failed_job_command": "Kommando {command} slog fejl for opgave: {job}",
|
||||
"failed_to_create_album": "Oprettelse af album mislykkedes",
|
||||
"failed_to_create_shared_link": "Oprettelse af delt link mislykkedes",
|
||||
"failed_to_edit_shared_link": "Redigering af delt link mislykkedes",
|
||||
"failed_to_get_people": "Det lykkedes ikke at hente personer",
|
||||
"failed_to_keep_this_delete_others": "Kunne ikke beholde denne mediefil og slette de andre mediefiler",
|
||||
"failed_to_get_people": "Det lykkedes ikke at hente folk",
|
||||
"failed_to_keep_this_delete_others": "Kunne ikke beholde dette aktiv og slette de andre aktiver",
|
||||
"failed_to_load_asset": "Indlæsning af mediefil mislykkedes",
|
||||
"failed_to_load_assets": "Indlæsning af mediefiler mislykkedes",
|
||||
"failed_to_load_people": "Indlæsning af personer mislykkedes",
|
||||
"failed_to_remove_product_key": "Fjernelse af produktnøgle mislykkedes",
|
||||
"failed_to_stack_assets": "Det lykkedes ikke at stable mediefiler",
|
||||
"failed_to_unstack_assets": "Det lykkedes ikke at fjerne gruperingen af mediefiler",
|
||||
"failed_to_stack_assets": "Det lykkedes ikke at stable aktiver",
|
||||
"failed_to_unstack_assets": "Det lykkedes ikke at fjerne stablen af aktiver",
|
||||
"import_path_already_exists": "Denne importsti findes allerede.",
|
||||
"incorrect_email_or_password": "Forkert email eller kodeord",
|
||||
"paths_validation_failed": "{paths, plural, one {# sti} other {# stier}} slog fejl ved validering",
|
||||
@@ -648,7 +641,7 @@
|
||||
"quota_higher_than_disk_size": "Du har sat en kvote der er større end disken",
|
||||
"repair_unable_to_check_items": "Kunne ikke tjekke {count, select, one {element} other {elementer}}",
|
||||
"unable_to_add_album_users": "Ikke i stand til at tilføje brugere til album",
|
||||
"unable_to_add_assets_to_shared_link": "Kan ikke tilføje mediefiler til det delte link",
|
||||
"unable_to_add_assets_to_shared_link": "Kan ikke tilføje aktiver til delt link",
|
||||
"unable_to_add_comment": "Ikke i stand til at tilføje kommentar",
|
||||
"unable_to_add_exclusion_pattern": "Kunne ikke tilføje udelukkelsesmønster",
|
||||
"unable_to_add_import_path": "Kunne ikke tilføje importsti",
|
||||
@@ -658,7 +651,7 @@
|
||||
"unable_to_archive_unarchive": "Ude af stand til at {archived, select, true {arkivere} other {fjerne fra arkiv}}",
|
||||
"unable_to_change_album_user_role": "Ikke i stand til at ændre albumbrugerens rolle",
|
||||
"unable_to_change_date": "Ikke i stand til at ændre dato",
|
||||
"unable_to_change_favorite": "Kan ikke ændre favorit for mediefil",
|
||||
"unable_to_change_favorite": "Kan ikke ændre favorit for aktiv",
|
||||
"unable_to_change_location": "Ikke i stand til at ændre sted",
|
||||
"unable_to_change_password": "Kunne ikke ændre adgangskode",
|
||||
"unable_to_change_visibility": "Kan ikke ændre synligheden for {count, plural, one {# person} other {# personer}}",
|
||||
@@ -705,16 +698,16 @@
|
||||
"unable_to_remove_deleted_assets": "Kunne ikke fjerne offlinefiler",
|
||||
"unable_to_remove_library": "Ikke i stand til at fjerne bibliotek",
|
||||
"unable_to_remove_partner": "Ikke i stand til at fjerne partner",
|
||||
"unable_to_remove_reaction": "Ikke i stand til at fjerne reaktion",
|
||||
"unable_to_remove_reaction": "Ikke i stand til at reaktion",
|
||||
"unable_to_repair_items": "Ikke i stand til at reparere ting",
|
||||
"unable_to_reset_password": "Ikke i stand til at nulstille adgangskode",
|
||||
"unable_to_resolve_duplicate": "Kunne ikke opklare duplikat",
|
||||
"unable_to_restore_assets": "Kunne ikke gendanne medierfil",
|
||||
"unable_to_restore_trash": "Ikke i stand til at gendanne fra skraldespanden",
|
||||
"unable_to_restore_user": "Ikke i stand til at gendanne bruger",
|
||||
"unable_to_restore_assets": "Kunne ikke genoprette medier",
|
||||
"unable_to_restore_trash": "Ikke i stand til at genoprette skrald",
|
||||
"unable_to_restore_user": "Ikke i stand til at genoprette bruger",
|
||||
"unable_to_save_album": "Ikke i stand til at gemme album",
|
||||
"unable_to_save_api_key": "Kunne ikke gemme API-nøgle",
|
||||
"unable_to_save_date_of_birth": "Kunne ikke gemme fødselsdatoen",
|
||||
"unable_to_save_date_of_birth": "Kan ikke gemme fødselsdatoen",
|
||||
"unable_to_save_name": "Ikke i stand til at gemme navn",
|
||||
"unable_to_save_profile": "Ikke i stand til at gemme profil",
|
||||
"unable_to_save_settings": "Ikke i stand til at gemme indstillinger",
|
||||
@@ -736,7 +729,7 @@
|
||||
"unable_to_upload_file": "Filen kunne ikke uploades"
|
||||
},
|
||||
"exif": "Exif",
|
||||
"exit_slideshow": "Afslut slideshow",
|
||||
"exit_slideshow": "Forlad slideshow",
|
||||
"expand_all": "Udvid alle",
|
||||
"expire_after": "Udløb efter",
|
||||
"expired": "Udløbet",
|
||||
@@ -749,7 +742,7 @@
|
||||
"external": "Ekstern",
|
||||
"external_libraries": "Eksterne biblioteker",
|
||||
"face_unassigned": "Ikke tildelt",
|
||||
"failed_to_load_assets": "Kunne ikke indlæse mediefiler",
|
||||
"failed_to_load_assets": "Kunne ikke indlæse aktiver",
|
||||
"favorite": "Favorit",
|
||||
"favorite_or_unfavorite_photo": "Tilføj eller fjern fra yndlingsbilleder",
|
||||
"favorites": "Favoritter",
|
||||
@@ -781,10 +774,10 @@
|
||||
"has_quota": "Har kvote",
|
||||
"hi_user": "Hej {name} ({email})",
|
||||
"hide_all_people": "Skjul alle personer",
|
||||
"hide_gallery": "Skjul galleri",
|
||||
"hide_gallery": "Gem galleri",
|
||||
"hide_named_person": "Skjul person {name}",
|
||||
"hide_password": "Skjul adgangskode",
|
||||
"hide_person": "Skjul person",
|
||||
"hide_password": "Gem adgangskode",
|
||||
"hide_person": "Gem person",
|
||||
"hide_unnamed_people": "Skjul unavngivne personer",
|
||||
"host": "Host",
|
||||
"hour": "Time",
|
||||
@@ -824,7 +817,7 @@
|
||||
"keep": "Behold",
|
||||
"keep_all": "Behold alle",
|
||||
"keep_this_delete_others": "Behold dette, slet andre",
|
||||
"kept_this_deleted_others": "Beholdt denne mediefil og slettede {count, plural, one {# aktiv} other {# aktiver}}",
|
||||
"kept_this_deleted_others": "Beholdt dette aktiv og slettede {count, plural, one {# aktiv} other {# aktiver}}",
|
||||
"keyboard_shortcuts": "Tastaturgenveje",
|
||||
"language": "Sprog",
|
||||
"language_setting_description": "Vælg dit foretrukne sprog",
|
||||
@@ -844,8 +837,8 @@
|
||||
"link_to_oauth": "Link til OAuth",
|
||||
"linked_oauth_account": "Tilsluttet OAuth-konto",
|
||||
"list": "Liste",
|
||||
"loading": "Indlæser",
|
||||
"loading_search_results_failed": "Indlæsning af søgeresultater fejlede",
|
||||
"loading": "Loader",
|
||||
"loading_search_results_failed": "At loade søgeresultater slog fejl",
|
||||
"log_out": "Log ud",
|
||||
"log_out_all_devices": "Log ud af alle enheder",
|
||||
"logged_out_all_devices": "Logget ud af alle enheder",
|
||||
@@ -881,7 +874,7 @@
|
||||
"merge": "Sammenflet",
|
||||
"merge_people": "Sammenflet personer",
|
||||
"merge_people_limit": "Du kan kun flette op til 5 ansigter ad gangen",
|
||||
"merge_people_prompt": "Vil du flette disse mennesker sammen? Denne handling er uigenkaldelig.",
|
||||
"merge_people_prompt": "Vil du slå disse mennesker sammen? Denne handling er uigenkaldelig.",
|
||||
"merge_people_successfully": "Personer sammenflettet med succes",
|
||||
"merged_people_count": "{count, plural, one {# person} other {# personer}} lagt sammen",
|
||||
"minimize": "Minimér",
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "Måned",
|
||||
"more": "Mere",
|
||||
"moved_to_trash": "Flyttet til skraldespand",
|
||||
"mute_memories": "Dæmp minder",
|
||||
"my_albums": "Mine albummer",
|
||||
"name": "Navn",
|
||||
"name_or_nickname": "Navn eller kælenavn",
|
||||
@@ -909,7 +901,7 @@
|
||||
"no_albums_message": "Opret et album for at organisere dine billeder og videoer",
|
||||
"no_albums_with_name_yet": "Det ser ud til, at du ikke har noget album med dette navn endnu.",
|
||||
"no_albums_yet": "Det ser ud til, at du ikke har nogen album endnu.",
|
||||
"no_archived_assets_message": "Arkivér billeder og videoer for at gemme dem væk fra din Billede oversigt",
|
||||
"no_archived_assets_message": "Arkivér billeder og fotos for at gemme dem væk fra dit Billed-view",
|
||||
"no_assets_message": "KLIK FOR AT UPLOADE DIT FØRSTE BILLEDE",
|
||||
"no_duplicates_found": "Ingen duplikater fundet.",
|
||||
"no_exif_info_available": "Ingen tilgængelig exif information",
|
||||
@@ -956,7 +948,7 @@
|
||||
"owner": "Ejer",
|
||||
"partner": "Partner",
|
||||
"partner_can_access": "{partner} kan tilgå",
|
||||
"partner_can_access_assets": "Alle dine billeder og videoer, bortset fra dem i Arkivet og Slettet",
|
||||
"partner_can_access_assets": "Alle dine billeder og videoer, bortset fra dem i Arkiveret og Slettet",
|
||||
"partner_can_access_location": "Stedet, hvor dine billeder blev taget",
|
||||
"partner_sharing": "Partnerdeling",
|
||||
"partners": "Partnere",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Permanent slettet medie",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {# aktiv} other {# aktiver}} permanent slettet",
|
||||
"person": "Person",
|
||||
"person_birthdate": "Født den {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (skjult)} other {}}",
|
||||
"photo_shared_all_users": "Det ser ud til, at du har delt dine billeder med alle brugere, eller også har du ikke nogen bruger at dele med.",
|
||||
"photos": "Billeder",
|
||||
@@ -1001,7 +992,7 @@
|
||||
"play": "Afspil",
|
||||
"play_memories": "Afspil minder",
|
||||
"play_motion_photo": "Afspil bevægelsesbillede",
|
||||
"play_or_pause_video": "Afspil eller pause video",
|
||||
"play_or_pause_video": "Afspil eller paus video",
|
||||
"port": "Port",
|
||||
"preset": "Forudindstilling",
|
||||
"preview": "Forhåndsvisning",
|
||||
@@ -1055,7 +1046,7 @@
|
||||
"reassign": "Gentildel",
|
||||
"reassigned_assets_to_existing_person": "{count, plural, one {# mediefil} other {# mediefiler}} er blevet gentildelt til {name, select, null {en eksisterende person} other {{name}}}",
|
||||
"reassigned_assets_to_new_person": "Gentildelt {count, plural, one {# aktiv} other {# aktiver}} til en ny person",
|
||||
"reassing_hint": "Tildel valgte mediefiler til en eksisterende person",
|
||||
"reassing_hint": "Tildel valgte aktiver til en eksisterende person",
|
||||
"recent": "For nylig",
|
||||
"recent-albums": "Seneste albums",
|
||||
"recent_searches": "Seneste søgninger",
|
||||
@@ -1073,31 +1064,26 @@
|
||||
"remove": "Fjern",
|
||||
"remove_assets_album_confirmation": "Er du sikker på, at du vil fjerne {count, plural, one {# aktiv} other {# aktiver}} fra albummet?",
|
||||
"remove_assets_shared_link_confirmation": "Er du sikker på, at du vil fjerne {count, plural, one {# aktiv} other {# aktiver}} fra dette delte link?",
|
||||
"remove_assets_title": "Fjern mediefiler?",
|
||||
"remove_assets_title": "Fjern aktiver?",
|
||||
"remove_custom_date_range": "Fjern tilpasset datointerval",
|
||||
"remove_deleted_assets": "Fjern slettede mediefiler",
|
||||
"remove_deleted_assets": "Fjern fra offlinefiler",
|
||||
"remove_from_album": "Fjern fra album",
|
||||
"remove_from_favorites": "Fjern fra favoritter",
|
||||
"remove_from_shared_link": "Fjern fra delt link",
|
||||
"remove_memory": "Fjern minde",
|
||||
"remove_photo_from_memory": "Fjern foto fra dette minde",
|
||||
"remove_url": "Fjern URL",
|
||||
"remove_user": "Fjern bruger",
|
||||
"removed_api_key": "Fjernede API-nøgle: {name}",
|
||||
"removed_from_archive": "Fjernet fra arkiv",
|
||||
"removed_from_favorites": "Fjernet fra favoritter",
|
||||
"removed_from_favorites_count": "{count, plural, other {Fjernede #}} fra favoritter",
|
||||
"removed_memory": "Fjernede minde",
|
||||
"removed_photo_from_memory": "Fjernede foto fra minde",
|
||||
"removed_tagged_assets": "Fjernede tag fra {count, plural, one {# aktiv} other {# aktiver}}",
|
||||
"rename": "Omdøb",
|
||||
"repair": "Reparér",
|
||||
"repair_no_results_message": "Usporede og manglende filer vil blive vist her",
|
||||
"repair_no_results_message": "Utrackede og manglende filer vil blive vist her",
|
||||
"replace_with_upload": "Erstat med upload",
|
||||
"repository": "Depot",
|
||||
"require_password": "Kræv adgangskode",
|
||||
"require_user_to_change_password_on_first_login": "Kræv at bruger skifter adgangskode ved første login",
|
||||
"rescan": "Genopfrisk",
|
||||
"reset": "Nulstil",
|
||||
"reset_password": "Nulstil adgangskode",
|
||||
"reset_people_visibility": "Nulstil personsynlighed",
|
||||
@@ -1107,19 +1093,19 @@
|
||||
"restore": "Gendan",
|
||||
"restore_all": "Gendan alle",
|
||||
"restore_user": "Gendan bruger",
|
||||
"restored_asset": "Gendannet mediefilen",
|
||||
"restored_asset": "Gendannet aktiv",
|
||||
"resume": "Genoptag",
|
||||
"retry_upload": "Forsøg upload igen",
|
||||
"review_duplicates": "Gennemgå dubletter",
|
||||
"role": "Rolle",
|
||||
"role_editor": "Redaktør",
|
||||
"role_editor": "Editor",
|
||||
"role_viewer": "Seer",
|
||||
"save": "Gem",
|
||||
"saved_api_key": "Gemt API-nøgle",
|
||||
"saved_profile": "Gemte profil",
|
||||
"saved_settings": "Gemte indstillinger",
|
||||
"say_something": "Skriv noget",
|
||||
"scan_all_libraries": "Skan alle biblioteker",
|
||||
"scan_all_libraries": "Skan gennem alle biblioteker",
|
||||
"scan_library": "Skan",
|
||||
"scan_settings": "Skanningsindstillinger",
|
||||
"scanning_for_album": "Skanner efter albummer...",
|
||||
@@ -1141,9 +1127,8 @@
|
||||
"search_options": "Søgemuligheder",
|
||||
"search_people": "Søg i personer",
|
||||
"search_places": "Søg i steder",
|
||||
"search_rating": "Søg efter vurdering...",
|
||||
"search_settings": "søgeindstillinger",
|
||||
"search_state": "Søg efter lansdel...",
|
||||
"search_state": "Søg efter stat...",
|
||||
"search_tags": "Søg tags...",
|
||||
"search_timezone": "Søg i tidszone...",
|
||||
"search_type": "Søg efter type",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Søger lokaler...",
|
||||
"second": "Sekund",
|
||||
"see_all_people": "Se alle personer",
|
||||
"select": "Vælg",
|
||||
"select_album_cover": "Vælg albumcover",
|
||||
"select_all": "Vælg alle",
|
||||
"select_all_duplicates": "Vælg alle dubletter",
|
||||
@@ -1199,15 +1183,15 @@
|
||||
"show_album_options": "Vis albumindstillinger",
|
||||
"show_albums": "Vis albummer",
|
||||
"show_all_people": "Vis alle personer",
|
||||
"show_and_hide_people": "Vis & skjul personer",
|
||||
"show_and_hide_people": "Vis & gem personer",
|
||||
"show_file_location": "Vis filplacering",
|
||||
"show_gallery": "Vis galleri",
|
||||
"show_hidden_people": "Vis skjulte personer",
|
||||
"show_hidden_people": "Vis gemte personer",
|
||||
"show_in_timeline": "Vis på tidslinje",
|
||||
"show_in_timeline_setting_description": "Vis billeder og videoer fra denne bruger på din tidslinje",
|
||||
"show_keyboard_shortcuts": "Vis tastaturgenveje",
|
||||
"show_metadata": "Vis metadata",
|
||||
"show_or_hide_info": "Vis eller skjul info",
|
||||
"show_or_hide_info": "Vis eller gem info",
|
||||
"show_password": "Vis adgangskode",
|
||||
"show_person_options": "Vis personindstillinger",
|
||||
"show_progress_bar": "Vis statuslinje",
|
||||
@@ -1232,7 +1216,7 @@
|
||||
"sort_items": "Antal genstande",
|
||||
"sort_modified": "Ændret dato",
|
||||
"sort_oldest": "Ældste foto",
|
||||
"sort_people_by_similarity": "Sorter efter personer der ligner hinanden",
|
||||
"sort_people_by_similarity": "Sorter folk efter lighed",
|
||||
"sort_recent": "Seneste foto",
|
||||
"sort_title": "Titel",
|
||||
"source": "Kilde",
|
||||
@@ -1258,15 +1242,14 @@
|
||||
"sunrise_on_the_beach": "Solopgang på stranden",
|
||||
"support": "Support",
|
||||
"support_and_feedback": "Support & Feedback",
|
||||
"support_third_party_description": "Din Immich-installation blev sammensat af en tredjepart. Problemer, du oplever, kan være forårsaget af denne udvikler, så rejs venligst problemer med dem i første omgang ved at bruge nedenstående links.",
|
||||
"support_third_party_description": "Din Immich-installation blev pakket af en tredjepart. Problemer, du oplever, kan være forårsaget af denne pakke, så rejs venligst problemer med dem i første omgang ved at bruge nedenstående links.",
|
||||
"swap_merge_direction": "Byt retning for sammenfletning",
|
||||
"sync": "Synkronisér",
|
||||
"tag": "Tag",
|
||||
"tag_assets": "Tag mediefiler",
|
||||
"tag_assets": "Tag aktiver",
|
||||
"tag_created": "Oprettet tag: {tag}",
|
||||
"tag_feature_description": "Gennemse billeder og videoer grupperet efter logiske tag-emner",
|
||||
"tag_not_found_question": "Kan du ikke finde et tag? <link>Opret et nyt tag.</link>",
|
||||
"tag_people": "Tag personer",
|
||||
"tag_updated": "Opdateret tag: {tag}",
|
||||
"tagged_assets": "Tagget {count, plural, one {# aktiv} other {# aktiver}}",
|
||||
"tags": "Tags",
|
||||
@@ -1292,14 +1275,14 @@
|
||||
"trash": "Papirkurv",
|
||||
"trash_all": "Smid alle ud",
|
||||
"trash_count": "Slet {count, number}",
|
||||
"trash_delete_asset": "Flyt mediefil til Papirkurv",
|
||||
"trash_delete_asset": "Papirkurv/slet aktiv",
|
||||
"trash_no_results_message": "Billeder og videoer markeret til sletning vil blive vist her.",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Mediefiler i skraldespanden vil blive slettet permanent efter {days, plural, one {# dag} other {# dage}}.",
|
||||
"type": "Type",
|
||||
"unarchive": "Afakivér",
|
||||
"unarchived_count": "{count, plural, other {Uarkiveret #}}",
|
||||
"unfavorite": "Fjern favorit",
|
||||
"unhide_person": "Stop med at skjule person",
|
||||
"unhide_person": "Hold op med at gemme person væk",
|
||||
"unknown": "Ukendt",
|
||||
"unknown_country": "Ukendt land",
|
||||
"unknown_year": "Ukendt år",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Fjern link til bevægelsesvideo",
|
||||
"unlink_oauth": "Frakobl OAuth",
|
||||
"unlinked_oauth_account": "Frakoblede OAuth-konto",
|
||||
"unmute_memories": "Ophæv dæmpning af minder",
|
||||
"unnamed_album": "Unavngivet album",
|
||||
"unnamed_album_delete_confirmation": "Er du sikker på, at du vil slette dette album?",
|
||||
"unnamed_share": "Unavngivet deling",
|
||||
@@ -1321,7 +1303,7 @@
|
||||
"up_next": "Næste",
|
||||
"updated_password": "Opdaterede adgangskode",
|
||||
"upload": "Upload",
|
||||
"upload_concurrency": "Upload samtidighed",
|
||||
"upload_concurrency": "Uploadsamtidighed",
|
||||
"upload_errors": "Upload afsluttet med {count, plural, one {# fejl} other {# fejl}}. Opdater siden for at se nye uploadaktiver.",
|
||||
"upload_progress": "Resterende {remaining, number} - Behandlet {processed, number}/{total, number}",
|
||||
"upload_skipped_duplicates": "Sprang over {count, plural, one {# duplet aktiv} other {# duplikerede aktiver}}",
|
||||
@@ -1339,7 +1321,7 @@
|
||||
"user_purchase_settings_description": "Administrer dit køb",
|
||||
"user_role_set": "Indstil {user} som {role}",
|
||||
"user_usage_detail": "Detaljer om brugers forbrug",
|
||||
"user_usage_stats": "Kontoens anvendelsesstatistik",
|
||||
"user_usage_stats": "Konto anvendelsesstatistik",
|
||||
"user_usage_stats_description": "Vis konto anvendelsesstatistik",
|
||||
"username": "Brugernavn",
|
||||
"users": "Brugere",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Se alle",
|
||||
"view_all_users": "Se alle brugere",
|
||||
"view_in_timeline": "Se på tidslinjen",
|
||||
"view_link": "Vis Link",
|
||||
"view_links": "Vis links",
|
||||
"view_name": "Se",
|
||||
"view_next_asset": "Se næste medie",
|
||||
|
||||
27
i18n/de.json
27
i18n/de.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Datensicherungs-Einstellungen",
|
||||
"backup_settings_description": "Datensicherungs-Einstellungen verwalten",
|
||||
"check_all": "Alle überprüfen",
|
||||
"cleanup": "Aufräumen",
|
||||
"cleared_jobs": "Folgende Aufgaben zurückgesetzt: {job}",
|
||||
"config_set_by_file": "Ist derzeit in einer Konfigurationsdatei festgelegt",
|
||||
"confirm_delete_library": "Bist du sicher, dass du die Bibliothek {library} löschen willst?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Regelmäßiges Scannen der Bibliothek aktivieren",
|
||||
"library_settings": "Externe Bibliothek",
|
||||
"library_settings_description": "Einstellungen externer Bibliotheken verwalten",
|
||||
"library_tasks_description": "Überprüfe externe Bibliotheken auf neue oder veränderte Medien",
|
||||
"library_tasks_description": "Diese Aufgabe aktualisiert und überprüft die Bibliotheken",
|
||||
"library_watching_enable_description": "Überwache externe Bibliotheken auf Dateiänderungen",
|
||||
"library_watching_settings": "Bibliotheksüberwachung (EXPERIMENTELL)",
|
||||
"library_watching_settings_description": "Automatisch auf geänderte Dateien prüfen",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Semantische Bildsuche mittels CLIP-Einbettungen",
|
||||
"machine_learning_smart_search_enabled": "Intelligente Suche aktivieren",
|
||||
"machine_learning_smart_search_enabled_description": "Ist diese Option deaktiviert, werden die Bilder nicht für die intelligente Suche verwendet.",
|
||||
"machine_learning_url_description": "Die URL des Servers für maschinelles Lernen. Wenn mehr als eine URL angegeben wird, wird jeder Server einzeln ausprobiert, bis einer erfolgreich antwortet, und zwar in der Reihenfolge vom ersten bis zum letzten. Server die nicht antworten werden temporär ignoriert, bis sie wieder verfügbar sind.",
|
||||
"machine_learning_url_description": "Die URL des Servers für maschinelles Lernen. Wenn mehr als eine URL angegeben wird, wird jeder Server einzeln ausprobiert, bis einer erfolgreich antwortet, und zwar in der Reihenfolge vom ersten bis zum letzten.",
|
||||
"manage_concurrency": "Gleichzeitige Ausführungen verwalten",
|
||||
"manage_log_settings": "Log-Einstellungen verwalten",
|
||||
"map_dark_style": "Dunkler Stil",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Karte",
|
||||
"map_settings_description": "Karten- und GPS-Einstellungen verwalten",
|
||||
"map_style_description": "URL zu einem style.json Karten-Theme",
|
||||
"memory_cleanup_job": "Erinnerungen aufräumen",
|
||||
"memory_generate_job": "Erinnerungen Generierung",
|
||||
"metadata_extraction_job": "Metadaten extrahieren",
|
||||
"metadata_extraction_job_description": "Extrahieren von Metadaten, wie zum Beispiel GPS, Gesichtern und Auflösung aus jeder Datei",
|
||||
"metadata_faces_import_setting": "Import von Gesichtern aktivieren",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Aktiviert die Hash-Verifizierung. Deaktiviere diese Option nur, wenn du dir über die damit verbundenen Auswirkungen im Klaren bist",
|
||||
"storage_template_migration": "Migration von Speichervorlagen",
|
||||
"storage_template_migration_description": "Diese Aufgabe wendet die aktuelle <link>{template}</link> auf zuvor hochgeladene Dateien an",
|
||||
"storage_template_migration_info": "Die Vorlage wird alle Dateierweiterungen in Kleinbuchstaben umwandeln. Vorlagenänderungen gelten nur für neue Dateien. Um die Vorlage rückwirkend auf bereits hochgeladene Assets anzuwenden, führe den <link>{job}</link> aus.",
|
||||
"storage_template_migration_info": "Vorlagenänderungen gelten nur für neue Dateien. Um die Vorlage rückwirkend auf bereits hochgeladene Assets anzuwenden, führe den <link>{job}</link> aus.",
|
||||
"storage_template_migration_job": "Speichervorlagenmigrations-Aufgabe",
|
||||
"storage_template_more_details": "Weitere Details zu dieser Funktion findest du unter <template-link>Speichervorlage</template-link> und dessen <implications-link>Implikationen</implications-link>",
|
||||
"storage_template_onboarding_description": "Wenn aktiviert, sortiert diese Funktion Dateien automatisch basierend auf einer benutzerdefinierten Vorlage. Aufgrund von Stabilitätsproblemen ist die Funktion standardmäßig deaktiviert. Weitere Informationen findest du in der <link>Dokumentation</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maximale B-Frames",
|
||||
"transcoding_max_b_frames_description": "Höhere Werte verbessern die Komprimierungseffizienz, verlangsamen aber die Kodierung. Ist möglicherweise nicht mit der Hardware-Beschleunigung älterer Geräte kompatibel. 0 deaktiviert die B-Frames, während -1 diesen Wert automatisch setzt.",
|
||||
"transcoding_max_bitrate": "Maximale Bitrate",
|
||||
"transcoding_max_bitrate_description": "Die Festlegung einer maximalen Bitrate kann die Dateigrößen vorhersagbarer machen, ohne dass die Qualität darunter leidet. Bei 720p sind typische Werte 2600 kbit/s für VP9 oder HEVC oder 4500 kbit/s für H.264. Deaktiviert, wenn der Wert auf 0 gesetzt ist.",
|
||||
"transcoding_max_bitrate_description": "Die Festlegung einer maximalen Bitrate kann die Dateigrößen vorhersagbarer machen, ohne dass die Qualität darunter leidet. Bei 720p sind typische Werte 2600k für VP9 oder HEVC oder 4500k für H.264. Deaktiviert, wenn der Wert auf 0 gesetzt ist.",
|
||||
"transcoding_max_keyframe_interval": "Maximales Keyframe-Intervall",
|
||||
"transcoding_max_keyframe_interval_description": "Legt den maximalen Frame-Abstand zwischen Keyframes fest. Niedrigere Werte verschlechtern die Komprimierungseffizienz, verbessern aber die Suchzeiten und können die Qualität in Szenen mit schnellen Bewegungen verbessern. Bei 0 wird dieser Wert automatisch eingestellt.",
|
||||
"transcoding_optimal_description": "Videos mit einer höheren Auflösung als der Zielauflösung oder in einem nicht akzeptierten Format",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Bearbeiten erlauben",
|
||||
"allow_public_user_to_download": "Erlaube öffentlichen Benutzern, herunterzuladen",
|
||||
"allow_public_user_to_upload": "Erlaube öffentlichen Benutzern, hochzuladen",
|
||||
"alt_text_qr_code": "QR-Code Bild",
|
||||
"anti_clockwise": "Gegen den Uhrzeigersinn",
|
||||
"api_key": "API-Schlüssel",
|
||||
"api_key_description": "Dieser Wert wird nur einmal angezeigt. Bitte kopiere ihn, bevor du das Fenster schließt.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Kommentare sind deaktiviert",
|
||||
"confirm": "Bestätigen",
|
||||
"confirm_admin_password": "Administrator Passwort bestätigen",
|
||||
"confirm_delete_face": "Bist du sicher dass du das Gesicht von {name} aus der Datei entfernen willst?",
|
||||
"confirm_delete_shared_link": "Bist du sicher, dass du diesen geteilten Link löschen willst?",
|
||||
"confirm_keep_this_delete_others": "Alle anderen Dateien im Stapel bis auf diese werden gelöscht. Bist du sicher, dass du fortfahren möchten?",
|
||||
"confirm_password": "Passwort bestätigen",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Album löschen",
|
||||
"delete_api_key_prompt": "Bist du sicher, dass du diesen API-Schlüssel löschen willst?",
|
||||
"delete_duplicates_confirmation": "Bist du sicher, dass du diese Duplikate endgültig löschen willst?",
|
||||
"delete_face": "Gesicht löschen",
|
||||
"delete_key": "Schlüssel löschen",
|
||||
"delete_library": "Bibliothek löschen",
|
||||
"delete_link": "Link löschen",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Aktiviert",
|
||||
"end_date": "Enddatum",
|
||||
"error": "Fehler",
|
||||
"error_delete_face": "Fehler beim Löschen des Gesichts",
|
||||
"error_loading_image": "Fehler beim Laden des Bildes",
|
||||
"error_title": "Fehler - Etwas ist schief gelaufen",
|
||||
"errors": {
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "Monat",
|
||||
"more": "Mehr",
|
||||
"moved_to_trash": "In den Papierkorb verschoben",
|
||||
"mute_memories": "Erinnerungen stumm schalten",
|
||||
"my_albums": "Meine Alben",
|
||||
"name": "Name",
|
||||
"name_or_nickname": "Name oder Nickname",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Endgültig gelöschtes Objekt",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {# Datei} other {# Dateien}} endgültig gelöscht",
|
||||
"person": "Person",
|
||||
"person_birthdate": "Geboren am {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (verborgen)} other {}}",
|
||||
"photo_shared_all_users": "Es sieht so aus, als hättest du deine Fotos mit allen Benutzern geteilt oder du hast keine Benutzer, mit denen du teilen kannst.",
|
||||
"photos": "Fotos",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Aus Album entfernen",
|
||||
"remove_from_favorites": "Aus Favoriten entfernen",
|
||||
"remove_from_shared_link": "Aus geteiltem Link entfernen",
|
||||
"remove_memory": "Erinnerung entfernen",
|
||||
"remove_photo_from_memory": "Foto aus dieser Erinnerung entfernen",
|
||||
"remove_url": "URL entfernen",
|
||||
"remove_user": "Nutzer entfernen",
|
||||
"removed_api_key": "API-Schlüssel {name} wurde entfernt",
|
||||
"removed_from_archive": "Aus dem Archiv entfernt",
|
||||
"removed_from_favorites": "Aus den Favoriten entfernt",
|
||||
"removed_from_favorites_count": "{count, plural, other {#}} aus den Favoriten entfernt",
|
||||
"removed_memory": "Erinnerung entfernt",
|
||||
"removed_photo_from_memory": "Foto aus Erinnerung entfernt",
|
||||
"removed_tagged_assets": "Tag von {count, plural, one {# Datei} other {# Dateien}} entfernt",
|
||||
"rename": "Umbenennen",
|
||||
"repair": "Reparatur",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Repository",
|
||||
"require_password": "Passwort erforderlich",
|
||||
"require_user_to_change_password_on_first_login": "Benutzer muss das Passwort beim ersten Login ändern",
|
||||
"rescan": "Erneut scannen",
|
||||
"reset": "Zurücksetzen",
|
||||
"reset_password": "Passwort zurücksetzen",
|
||||
"reset_people_visibility": "Sichtbarkeit von Personen zurücksetzen",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Suchoptionen",
|
||||
"search_people": "Suche nach Personen",
|
||||
"search_places": "Suche nach Orten",
|
||||
"search_rating": "Suche nach Bewertung...",
|
||||
"search_settings": "Suche nach Einstellungen",
|
||||
"search_state": "Suche nach Bundesland / Provinz...",
|
||||
"search_tags": "Sache nach Tags...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Suche nach Orten...",
|
||||
"second": "Sekunde",
|
||||
"see_all_people": "Alle Personen anzeigen",
|
||||
"select": "Auswählen",
|
||||
"select_album_cover": "Album-Cover auswählen",
|
||||
"select_all": "Alles auswählen",
|
||||
"select_all_duplicates": "Alle Duplikate auswählen",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Tag erstellt: {tag}",
|
||||
"tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen",
|
||||
"tag_not_found_question": "Kein Tag zu finden? <link>Erstelle einen neuen Tag.</link>",
|
||||
"tag_people": "Personen taggen",
|
||||
"tag_updated": "Tag aktualisiert: {tag}",
|
||||
"tagged_assets": "{count, plural, one {# Datei} other {# Dateien}} getagged",
|
||||
"tags": "Tags",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Verknüpfung zum Bewegungsvideo aufheben",
|
||||
"unlink_oauth": "OAuth entfernen",
|
||||
"unlinked_oauth_account": "OAuth-Konto entfernt",
|
||||
"unmute_memories": "Stummschaltung für Erinnerungen aufheben",
|
||||
"unnamed_album": "Unbenanntes Album",
|
||||
"unnamed_album_delete_confirmation": "Bist du sicher, dass du dieses Album löschen willst?",
|
||||
"unnamed_share": "Unbenannte Freigabe",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Alles anzeigen",
|
||||
"view_all_users": "Alle Nutzer anzeigen",
|
||||
"view_in_timeline": "In Zeitleiste anzeigen",
|
||||
"view_link": "Link anzeigen",
|
||||
"view_links": "Links anzeigen",
|
||||
"view_name": "Ansicht",
|
||||
"view_next_asset": "Nächste Datei anzeigen",
|
||||
|
||||
22
i18n/el.json
22
i18n/el.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Ρυθμίσεις Αντιγράφων Ασφαλείας",
|
||||
"backup_settings_description": "Διαχείρηση ρυθμίσεων των αντιγράφων ασφαλείας της βάσης δεδομένων",
|
||||
"check_all": "Έλεγχος Όλων",
|
||||
"cleanup": "Εκκαθάριση",
|
||||
"cleared_jobs": "Εκκαθαρίστηκαν οι εργασίες για: {job}",
|
||||
"config_set_by_file": "Η παραμετροποίηση γίνεται, προς το παρόν, μέσω ενός αρχείου παραμέτρων",
|
||||
"confirm_delete_library": "Είστε βέβαιοι ότι θέλετε να διαγράψετε τη βιβλιοθήκη {library};",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Αναζητήστε εικόνες σημασιολογικά χρησιμοποιώντας ενσωματώσεις CLIP",
|
||||
"machine_learning_smart_search_enabled": "Ενεργοποίηση έξυπνης αναζήτησης",
|
||||
"machine_learning_smart_search_enabled_description": "Αν απενεργοποιηθεί, οι εικόνες δεν θα κωδικοποιούνται για έξυπνη αναζήτηση.",
|
||||
"machine_learning_url_description": "Η διεύθυνση URL του διακομιστή μηχανικής μάθησης. Αν δοθούν περισσότερες από μία διευθύνσεις URL, κάθε διακομιστής θα δοκιμάζεται διαδοχικά μέχρι να ανταποκριθεί ένας με επιτυχία, με τη σειρά από την πρώτη έως την τελευταία. Οι διακομιστές που δεν ανταποκρίνονται θα αγνοούνται προσωρινά μέχρι να επανέλθουν σε λειτουργία.",
|
||||
"machine_learning_url_description": "Η διεύθυνση URL του διακομιστή μηχανικής μάθησης. Αν παρέχονται περισσότερες από μία διευθύνσεις, τότε θα γίνει προσπάθεια σύνδεσης σε κάθε μια διαδοχικά από την πρώτη μέχρι την τελευταία, έως ότου κάποια να είναι επιτυχής.",
|
||||
"manage_concurrency": "Διαχείριση ταυτόχρονη εκτέλεσης",
|
||||
"manage_log_settings": "Διαχείριση ρυθμίσεων αρχείου καταγραφής",
|
||||
"map_dark_style": "Σκούρο Θέμα",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Χάρτης",
|
||||
"map_settings_description": "Διαχείριση ρυθμίσεων χάρτη",
|
||||
"map_style_description": "URL προς αρχείο θέματος του χάρτη style.json",
|
||||
"memory_cleanup_job": "Καθαρισμός μνήμης",
|
||||
"memory_generate_job": "Δημιουργία μνήμης",
|
||||
"metadata_extraction_job": "Εξαγωγή μεταδεδομένων",
|
||||
"metadata_extraction_job_description": "Εξαγωγή μεταδεδομένων από κάθε αρχείο, όπως τοποθεσία, πρόσωπα και ανάλυση",
|
||||
"metadata_faces_import_setting": "Ενεργοποίηση εισαγωγής προσώπων",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Μέγιστος αριθμός B-frames(Bidirectional Predictive Frames)",
|
||||
"transcoding_max_b_frames_description": "Οι υψηλότερες τιμές βελτιώνουν την αποδοτικότητα της συμπίεσης, αλλά επιβραδύνουν την κωδικοποίηση. Ενδέχεται να μην είναι συμβατές με την επιτάχυνση υλικού σε παλαιότερες συσκευές. Η τιμή 0 απενεργοποιεί τα B-frames, ενώ η -1, τη ρυθμίζει αυτόματα.",
|
||||
"transcoding_max_bitrate": "Μέγιστος ρυθμός μετάδοσης (bitrate)",
|
||||
"transcoding_max_bitrate_description": "Η ρύθμιση ενός μέγιστου ρυθμού μετάδοσης(bitrate) μπορεί να κάνει το μέγεθος των αρχείων πιο προβλέψιμο, αλλά με ένα μικρό κόστος στην ποιότητα. Στην ανάλυση των 720p, οι τυπικές τιμές είναι 2600 kbit/s για VP9 ή HEVC, ή 4500 kbit/s για H.264. Απενεργοποιείται εάν οριστεί σε 0.",
|
||||
"transcoding_max_bitrate_description": "Η ρύθμιση ενός μέγιστου ρυθμού μετάδοσης(bitrate) μπορεί να κάνει το μέγεθος των αρχείων πιο προβλέψιμο, αλλά με ένα μικρό κόστος στην ποιότητα. Στην ανάλυση των 720p, οι τυπικές τιμές είναι 2600k για VP9 ή HEVC, ή 4500k για H.264. Απενεργοποιείται εάν οριστεί σε 0.",
|
||||
"transcoding_max_keyframe_interval": "Μέγιστο χρονικό διάστημα μεταξύ των καρέ αναφοράς (keyframe)",
|
||||
"transcoding_max_keyframe_interval_description": "Ορίζει το μέγιστο διάστημα μεταξύ των καρέ αναφοράς. Χαμηλότερες τιμές μειώνουν την αποδοτικότητα συμπίεσης, αλλά βελτιώνουν τον χρόνο αναζήτησης και μπορεί να βελτιώσουν την ποιότητα σε σκηνές με γρήγορη κίνηση. Η τιμή 0 ρυθμίζει αυτό το διάστημα αυτόματα.",
|
||||
"transcoding_optimal_description": "Βίντεο με ανώτερη ανάλυση από την επιθυμητή ή σε μη αποδεκτή μορφή",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Επιτρέψτε τις τροποποιήσεις",
|
||||
"allow_public_user_to_download": "Επιτρέψτε σε δημόσιο χρήστη να κατεβάσει",
|
||||
"allow_public_user_to_upload": "Επιτρέψτε στον δημόσιο χρήστη να ανεβάσει",
|
||||
"alt_text_qr_code": "Εικόνα κωδικού QR",
|
||||
"anti_clockwise": "Αντίθετα με τη φορά του ρολογιού",
|
||||
"api_key": "Κλειδί API",
|
||||
"api_key_description": "Αυτή η τιμή θα εμφανιστεί μόνο μία φορά. Παρακαλώ βεβαιωθείτε ότι την έχετε αντιγράψει πριν κλείσετε το παράθυρο.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Τα σχόλια είναι απενεργοποιημένα",
|
||||
"confirm": "Επιβεβαίωση",
|
||||
"confirm_admin_password": "Επιβεβαίωση κωδικού Διαχειριστή",
|
||||
"confirm_delete_face": "Είστε σίγουροι ότι θέλετε να διαγράψετε το πρόσωπο του/της {name} από το στοιχείο;",
|
||||
"confirm_delete_shared_link": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτόν τον κοινόχρηστο σύνδεσμο;",
|
||||
"confirm_keep_this_delete_others": "Όλα τα άλλα στοιχεία της στοίβας θα διαγραφούν, εκτός από αυτό το στοιχείο. Είστε σίγουροι ότι θέλετε να συνεχίσετε;",
|
||||
"confirm_password": "Επιβεβαίωση κωδικού",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Διαγραφή άλμπουμ",
|
||||
"delete_api_key_prompt": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό κλειδί API;",
|
||||
"delete_duplicates_confirmation": "Είστε σίγουροι ότι επιθυμείτε τη μόνιμη διαγραφή αυτών των διπλότυπων;",
|
||||
"delete_face": "Διαγραφή προσώπου",
|
||||
"delete_key": "Διαγραφή κλειδιού",
|
||||
"delete_library": "Διαγραφή Βιβλιοθήκης",
|
||||
"delete_link": "Διαγραφή συνδέσμου",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Ενεργοποιημένο",
|
||||
"end_date": "Τελική ημερομηνία",
|
||||
"error": "Σφάλμα",
|
||||
"error_delete_face": "Σφάλμα διαγραφής προσώπου από το στοιχείο",
|
||||
"error_loading_image": "Σφάλμα κατά τη φόρτωση της εικόνας",
|
||||
"error_title": "Σφάλμα - Κάτι πήγε στραβά",
|
||||
"errors": {
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "Μήνας",
|
||||
"more": "Περισσότερα",
|
||||
"moved_to_trash": "Μετακινήθηκε στον κάδο απορριμμάτων",
|
||||
"mute_memories": "Σίγαση Αναμνήσεων",
|
||||
"my_albums": "Τα άλμπουμ μου",
|
||||
"name": "Όνομα",
|
||||
"name_or_nickname": "Όνομα ή ψευδώνυμο",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Οριστικά διαγραμμένο στοιχείο",
|
||||
"permanently_deleted_assets_count": "Οριστική διαγραφή {count, plural, one {# στοιχείου} other {# στοιχείων}}",
|
||||
"person": "Άτομο",
|
||||
"person_birthdate": "Γεννηθείς στις {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (κρυφό)} other {}}",
|
||||
"photo_shared_all_users": "Φαίνεται ότι μοιραστήκατε τις φωτογραφίες σας με όλους τους χρήστες ή δεν έχετε κανέναν χρήστη για κοινή χρήση.",
|
||||
"photos": "Φωτογραφίες",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Αφαίρεση από το άλμπουμ",
|
||||
"remove_from_favorites": "Αφαίρεση από τα αγαπημένα",
|
||||
"remove_from_shared_link": "Αφαίρεση από τον κοινόχρηστο σύνδεσμο",
|
||||
"remove_memory": "Αφαίρεση ανάμνησης",
|
||||
"remove_photo_from_memory": "Αφαίρεση φωτογραφίας από την ανάμνηση",
|
||||
"remove_url": "Αφαίρεση Συνδέσμου",
|
||||
"remove_user": "Αφαίρεση χρήστη",
|
||||
"removed_api_key": "Αφαιρέθηκε το API Key: {name}",
|
||||
"removed_from_archive": "Αφαιρέθηκε/καν από το Αρχείο",
|
||||
"removed_from_favorites": "Αφαιρέθηκε από τα αγαπημένα",
|
||||
"removed_from_favorites_count": "Αφαιρέθηκαν {count, plural, other {#}} από τα αγαπημένα",
|
||||
"removed_memory": "Διαγραμμένη μνήμη",
|
||||
"removed_photo_from_memory": "Διαγραμμένη φωτογραφία από τη μνήμη",
|
||||
"removed_tagged_assets": "Αφαιρέθηκε η ετικέτα από {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
||||
"rename": "Μετονομασία",
|
||||
"repair": "Επισκευή",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Αποθετήριο",
|
||||
"require_password": "Απαιτείται κωδικός πρόσβασης",
|
||||
"require_user_to_change_password_on_first_login": "Ο χρήστης απαιτείται να αλλάξει τον κωδικό πρόσβασής του κατά την πρώτη σύνδεση",
|
||||
"rescan": "Εκ νέου σάρωση",
|
||||
"reset": "Επαναφορά",
|
||||
"reset_password": "Επαναφορά κωδικού πρόσβασης",
|
||||
"reset_people_visibility": "Επαναφορά προβολής ατόμων",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Επιλογές αναζήτησης",
|
||||
"search_people": "Αναζήτηση ατόμων",
|
||||
"search_places": "Αναζήτηση τοποθεσιών",
|
||||
"search_rating": "Αναζήτηση κατά βαθμολογία...",
|
||||
"search_settings": "Ρυθμίσεις αναζήτησης",
|
||||
"search_state": "Αναζήτηση νομού...",
|
||||
"search_tags": "Αναζήτηση ετικετών...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Αναζήτηση τοποθεσιών...",
|
||||
"second": "Δευτερόλεπτο",
|
||||
"see_all_people": "Προβολή όλων των ατόμων",
|
||||
"select": "Επιλογή",
|
||||
"select_album_cover": "Επιλέξτε εξώφυλλο άλμπουμ",
|
||||
"select_all": "Επιλογή όλων",
|
||||
"select_all_duplicates": "Επιλογή όλων των διπλότυπων",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Δημιουργήθηκε ετικέτα: {tag}",
|
||||
"tag_feature_description": "Περιήγηση σε φωτογραφίες και βίντεο που είναι οργανωμένα σύμφωνα με λογικά θέματα ετικετών",
|
||||
"tag_not_found_question": "Δεν μπορείτε να βρείτε μια ετικέτα; <link>Δημιουργήστε μια νέα ετικέτα.</link>",
|
||||
"tag_people": "Επισήμανση ατόμων",
|
||||
"tag_updated": "Ενημερώθηκε η ετικέτα: {tag}",
|
||||
"tagged_assets": "Ετικετοποιημένο/α {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
||||
"tags": "Ετικέτες",
|
||||
@@ -1360,7 +1343,6 @@
|
||||
"view_all": "Προβολή Όλων",
|
||||
"view_all_users": "Προβολή όλων των χρηστών",
|
||||
"view_in_timeline": "Προβολή στο χρονοδιάγραμμα",
|
||||
"view_link": "Προβολή σύνδεσμου",
|
||||
"view_links": "Προβολή συνδέσμων",
|
||||
"view_name": "Προβολή",
|
||||
"view_next_asset": "Προβολή επόμενου στοιχείου",
|
||||
|
||||
18
i18n/en.json
18
i18n/en.json
@@ -96,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Enable periodic library scanning",
|
||||
"library_settings": "External Library",
|
||||
"library_settings_description": "Manage external library settings",
|
||||
"library_tasks_description": "Scan external libraries for new and/or changed assets",
|
||||
"library_tasks_description": "Perform library tasks",
|
||||
"library_watching_enable_description": "Watch external libraries for file changes",
|
||||
"library_watching_settings": "Library watching (EXPERIMENTAL)",
|
||||
"library_watching_settings_description": "Automatically watch for changed files",
|
||||
@@ -240,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Enables hash verification, don't disable this unless you're certain of the implications",
|
||||
"storage_template_migration": "Storage template migration",
|
||||
"storage_template_migration_description": "Apply the current <link>{template}</link> to previously uploaded assets",
|
||||
"storage_template_migration_info": "The storage template will convert all extensions to lowercase. Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Storage Template Migration Job",
|
||||
"storage_template_more_details": "For more details about this feature, refer to the <template-link>Storage Template</template-link> and its <implications-link>implications</implications-link>",
|
||||
"storage_template_onboarding_description": "When enabled, this feature will auto-organize files based on a user-defined template. Due to stability issues the feature has been turned off by default. For more information, please see the <link>documentation</link>.",
|
||||
@@ -299,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maximum B-frames",
|
||||
"transcoding_max_b_frames_description": "Higher values improve compression efficiency, but slow down encoding. May not be compatible with hardware acceleration on older devices. 0 disables B-frames, while -1 sets this value automatically.",
|
||||
"transcoding_max_bitrate": "Maximum bitrate",
|
||||
"transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600 kbit/s for VP9 or HEVC, or 4500 kbit/s for H.264. Disabled if set to 0.",
|
||||
"transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600k for VP9 or HEVC, or 4500k for H.264. Disabled if set to 0.",
|
||||
"transcoding_max_keyframe_interval": "Maximum keyframe interval",
|
||||
"transcoding_max_keyframe_interval_description": "Sets the maximum frame distance between keyframes. Lower values worsen compression efficiency, but improve seek times and may improve quality in scenes with fast movement. 0 sets this value automatically.",
|
||||
"transcoding_optimal_description": "Videos higher than target resolution or not in an accepted format",
|
||||
@@ -336,7 +336,6 @@
|
||||
"untracked_files": "Untracked Files",
|
||||
"untracked_files_description": "These files are not tracked by the application. They can be the results of failed moves, interrupted uploads, or left behind due to a bug",
|
||||
"user_cleanup_job": "User cleanup",
|
||||
"cleanup": "Cleanup",
|
||||
"user_delete_delay": "<b>{user}</b>'s account and assets will be scheduled for permanent deletion in {delay, plural, one {# day} other {# days}}.",
|
||||
"user_delete_delay_settings": "Delete delay",
|
||||
"user_delete_delay_settings_description": "Number of days after removal to permanently delete a user's account and assets. The user deletion job runs at midnight to check for users that are ready for deletion. Changes to this setting will be evaluated at the next execution.",
|
||||
@@ -394,7 +393,6 @@
|
||||
"allow_edits": "Allow edits",
|
||||
"allow_public_user_to_download": "Allow public user to download",
|
||||
"allow_public_user_to_upload": "Allow public user to upload",
|
||||
"alt_text_qr_code": "QR code image",
|
||||
"anti_clockwise": "Anti-clockwise",
|
||||
"api_key": "API Key",
|
||||
"api_key_description": "This value will only be shown once. Please be sure to copy it before closing the window.",
|
||||
@@ -891,7 +889,6 @@
|
||||
"month": "Month",
|
||||
"more": "More",
|
||||
"moved_to_trash": "Moved to trash",
|
||||
"mute_memories": "Mute Memories",
|
||||
"my_albums": "My albums",
|
||||
"name": "Name",
|
||||
"name_or_nickname": "Name or nickname",
|
||||
@@ -987,7 +984,6 @@
|
||||
"permanently_deleted_asset": "Permanently deleted asset",
|
||||
"permanently_deleted_assets_count": "Permanently deleted {count, plural, one {# asset} other {# assets}}",
|
||||
"person": "Person",
|
||||
"person_birthdate": "Born on {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (hidden)} other {}}",
|
||||
"photo_shared_all_users": "Looks like you shared your photos with all users or you don't have any user to share with.",
|
||||
"photos": "Photos",
|
||||
@@ -1082,9 +1078,7 @@
|
||||
"remove_url": "Remove URL",
|
||||
"remove_user": "Remove user",
|
||||
"removed_api_key": "Removed API Key: {name}",
|
||||
"remove_memory": "Remove memory",
|
||||
"removed_memory": "Removed memory",
|
||||
"remove_photo_from_memory": "Remove photo from this memory",
|
||||
"removed_photo_from_memory": "Removed photo from memory",
|
||||
"removed_from_archive": "Removed from archive",
|
||||
"removed_from_favorites": "Removed from favorites",
|
||||
@@ -1120,7 +1114,6 @@
|
||||
"say_something": "Say something",
|
||||
"scan_all_libraries": "Scan All Libraries",
|
||||
"scan_library": "Scan",
|
||||
"rescan": "Rescan",
|
||||
"scan_settings": "Scan Settings",
|
||||
"scanning_for_album": "Scanning for album...",
|
||||
"search": "Search",
|
||||
@@ -1152,7 +1145,6 @@
|
||||
"second": "Second",
|
||||
"see_all_people": "See all people",
|
||||
"select_album_cover": "Select album cover",
|
||||
"select": "Select",
|
||||
"select_all": "Select all",
|
||||
"select_all_duplicates": "Select all duplicates",
|
||||
"select_avatar_color": "Select avatar color",
|
||||
@@ -1310,7 +1302,6 @@
|
||||
"unnamed_album": "Unnamed Album",
|
||||
"unnamed_album_delete_confirmation": "Are you sure you want to delete this album?",
|
||||
"unnamed_share": "Unnamed Share",
|
||||
"unmute_memories": "Unmute Memories",
|
||||
"unsaved_change": "Unsaved change",
|
||||
"unselect_all": "Unselect all",
|
||||
"unselect_all_duplicates": "Unselect all duplicates",
|
||||
@@ -1361,7 +1352,6 @@
|
||||
"view_all": "View All",
|
||||
"view_all_users": "View all users",
|
||||
"view_in_timeline": "View in timeline",
|
||||
"view_link": "View link",
|
||||
"view_links": "View links",
|
||||
"view_name": "View",
|
||||
"view_next_asset": "View next asset",
|
||||
@@ -1378,4 +1368,4 @@
|
||||
"yes": "Yes",
|
||||
"you_dont_have_any_shared_links": "You don't have any shared links",
|
||||
"zoom_image": "Zoom Image"
|
||||
}
|
||||
}
|
||||
|
||||
33
i18n/es.json
33
i18n/es.json
@@ -7,7 +7,7 @@
|
||||
"actions": "Acciones",
|
||||
"active": "Activo",
|
||||
"activity": "Actividad",
|
||||
"activity_changed": "La actividad está {enabled, select, true {habilitada} other {deshabilitada}}",
|
||||
"activity_changed": "La actividad está {enabled, select, true {activada} other {desactivada}}",
|
||||
"add": "Agregar",
|
||||
"add_a_description": "Agregar descripción",
|
||||
"add_a_location": "Agregar ubicación",
|
||||
@@ -24,7 +24,7 @@
|
||||
"add_to_album": "Incluir en álbum",
|
||||
"add_to_shared_album": "Incluir en álbum compartido",
|
||||
"add_url": "Añadir URL",
|
||||
"added_to_archive": "Agregado al Archivado",
|
||||
"added_to_archive": "Archivado",
|
||||
"added_to_favorites": "Agregado a favoritos",
|
||||
"added_to_favorites_count": "Agregado {count, number} a favoritos",
|
||||
"admin": {
|
||||
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Ajustes de respaldo",
|
||||
"backup_settings_description": "Administrar configuración de respaldo de base de datos",
|
||||
"check_all": "Verificar todo",
|
||||
"cleanup": "Limpieza",
|
||||
"cleared_jobs": "Trabajos borrados para: {job}",
|
||||
"config_set_by_file": "La configuración está definida por un archivo de configuración",
|
||||
"confirm_delete_library": "¿Estás seguro de que quieres eliminar la biblioteca {library}?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Activar el escaneo periódico de la biblioteca",
|
||||
"library_settings": "Biblioteca externa",
|
||||
"library_settings_description": "Administrar configuración biblioteca externa",
|
||||
"library_tasks_description": "Buscar archivos nuevos o modificados en bibliotecas externas",
|
||||
"library_tasks_description": "Realizar tareas de biblioteca",
|
||||
"library_watching_enable_description": "Vigilar las bibliotecas externas para detectar cambios en los archivos",
|
||||
"library_watching_settings": "Vigilancia de la biblioteca (EXPERIMENTAL)",
|
||||
"library_watching_settings_description": "Vigilar automaticamente en busca de archivos modificados",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Busque imágenes semánticamente utilizando incrustaciones CLIP (Contrastive Language-Image Pre-Training)",
|
||||
"machine_learning_smart_search_enabled": "Habilitar búsqueda inteligente",
|
||||
"machine_learning_smart_search_enabled_description": "Al desactivarlo las imágenes no se procesarán para usar la búsqueda inteligente.",
|
||||
"machine_learning_url_description": "La URL del servidor de aprendizaje automático. Si se proporciona más de una URL se intentará acceder a cada servidor sucesivamente hasta que uno responda correctamente en el orden especificado. Los servidores que no respondan serán ignorados temporalmente hasta que vuelvan a estar en línea.",
|
||||
"machine_learning_url_description": "La URL del servidor de aprendizaje automático. Si se proporciona más de una URL se intentará acceder a cada servidor sucesivamente hasta que uno responda correctamente en el orden especificado.",
|
||||
"manage_concurrency": "Ajustes de concurrencia",
|
||||
"manage_log_settings": "Administrar la configuración de los registros",
|
||||
"map_dark_style": "Estilo oscuro",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Mapa",
|
||||
"map_settings_description": "Administrar la configuración del mapa",
|
||||
"map_style_description": "Dirección URL a un tema de mapa (style.json)",
|
||||
"memory_cleanup_job": "Limpieza de memoria",
|
||||
"memory_generate_job": "Generación de memoria",
|
||||
"metadata_extraction_job": "Extracción de metadatos",
|
||||
"metadata_extraction_job_description": "Extraer información de metadatos de cada activo, como GPS, caras y resolución",
|
||||
"metadata_faces_import_setting": "Activar importación de caras",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Habilita la verificación de hash, no la desactive a menos que esté seguro de las implicaciones",
|
||||
"storage_template_migration": "Migración de plantillas de almacenamiento",
|
||||
"storage_template_migration_description": "Aplicar la <link>{template}</link> actual a los elementos subidos previamente",
|
||||
"storage_template_migration_info": "La plantilla de almacenamiento convertirá todas las extensiones a minúscula. Los cambios en las plantillas solo se aplican a los elementos nuevos. Para aplicarlos retroactivamente a los elementos subidos previamente ejecute la <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Los cambios en las plantillas solo se aplican a los elementos nuevos. Para aplicarlos retroactivamente a los elementos subidos previamente ejecute la <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Migración de la plantilla de almacenamiento",
|
||||
"storage_template_more_details": "Para obtener más detalles sobre esta función, consulte la <template-link>Plantilla de almacenamiento</template-link> y sus <implications-link>implicaciones</implications-link>",
|
||||
"storage_template_onboarding_description": "Cuando está habilitada, esta función organizará automáticamente los archivos según una plantilla definida por el usuario. Debido a problemas de estabilidad, la función se ha desactivado de forma predeterminada. Para obtener más información, consulte la <link>documentación</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maximos B-frames",
|
||||
"transcoding_max_b_frames_description": "Los valores más altos mejoran la eficiencia de la compresión, pero ralentizan la codificación. Puede que no sea compatible con la aceleración de hardware en dispositivos más antiguos. 0 desactiva los fotogramas B, mientras que -1 establece este valor automáticamente.",
|
||||
"transcoding_max_bitrate": "Máxima tasa de bits",
|
||||
"transcoding_max_bitrate_description": "Establecer una tasa de bits máxima puede hacer que los tamaños de archivos sean más predecibles con un costo menor para la calidad. A 720p, los valores típicos son 2600 kbit/s para VP9 o HEVC, o 4500 kbit/s para H.264. Deshabilitado si se establece en 0.",
|
||||
"transcoding_max_bitrate_description": "Establecer una tasa de bits máxima puede hacer que los tamaños de archivos sean más predecibles con un costo menor para la calidad. A 720p, los valores típicos son 2600k para VP9 o HEVC, o 4500k para H.264. Deshabilitado si se establece en 0.",
|
||||
"transcoding_max_keyframe_interval": "Intervalo máximo de fotogramas clave",
|
||||
"transcoding_max_keyframe_interval_description": "Establece la distancia máxima de fotograma entre fotogramas clave. Los valores más bajos empeoran la eficiencia de la compresión, pero mejoran los tiempos de búsqueda y pueden mejorar la calidad en escenas con movimientos rápidos. 0 establece este valor automáticamente.",
|
||||
"transcoding_optimal_description": "Vídeos con una resolución superior a la fijada o que no están en un formato aceptado",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Permitir edición",
|
||||
"allow_public_user_to_download": "Permitir descargar al usuario público",
|
||||
"allow_public_user_to_upload": "Permitir cargar al usuario publico",
|
||||
"alt_text_qr_code": "Código QR",
|
||||
"anti_clockwise": "En sentido antihorario",
|
||||
"api_key": "Clave API",
|
||||
"api_key_description": "Este valor sólo se mostrará una vez. Asegúrese de copiarlo antes de cerrar la ventana.",
|
||||
@@ -442,7 +438,7 @@
|
||||
"blurred_background": "Fondo borroso",
|
||||
"bugs_and_feature_requests": "Errores y solicitudes de funciones",
|
||||
"build": "Compilación",
|
||||
"build_image": "Crear imagen",
|
||||
"build_image": "Construir imagen",
|
||||
"bulk_delete_duplicates_confirmation": "¿Estás seguro de que deseas eliminar de forma masiva {count, plural, one {# elemento duplicado} other {# elementos duplicados}}? Esto mantendrá el activo más grande de cada grupo y eliminará permanentemente todos los demás duplicados. ¡Esta acción no se puede deshacer!",
|
||||
"bulk_keep_duplicates_confirmation": "¿Estas seguro de que desea mantener {count, plural, one {# duplicate asset} other {# duplicate assets}} archivos duplicados? Esto resolverá todos los grupos duplicados sin borrar nada.",
|
||||
"bulk_trash_duplicates_confirmation": "¿Estas seguro de que desea eliminar masivamente {count, plural, one {# duplicate asset} other {# duplicate assets}} archivos duplicados? Esto mantendrá el archivo más grande de cada grupo y eliminará todos los demás duplicados.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Los comentarios están deshabilitados",
|
||||
"confirm": "Confirmar",
|
||||
"confirm_admin_password": "Confirmar Contraseña de Administrador",
|
||||
"confirm_delete_face": "¿Estás seguro que deseas eliminar la cara de {name} del archivo?",
|
||||
"confirm_delete_shared_link": "¿Estás seguro de que deseas eliminar este enlace compartido?",
|
||||
"confirm_keep_this_delete_others": "Todos los demás activos de la pila se eliminarán excepto este activo. ¿Está seguro de que quiere continuar?",
|
||||
"confirm_password": "Confirmar contraseña",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Eliminar álbum",
|
||||
"delete_api_key_prompt": "¿Está seguro de que desea eliminar esta clave API?",
|
||||
"delete_duplicates_confirmation": "¿Está seguro de que desea eliminar permanentemente estos duplicados?",
|
||||
"delete_face": "Eliminar cara",
|
||||
"delete_key": "Eliminar clave",
|
||||
"delete_library": "Eliminar biblioteca",
|
||||
"delete_link": "Eliminar enlace",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Habilitado",
|
||||
"end_date": "Fecha final",
|
||||
"error": "Error",
|
||||
"error_delete_face": "Error al eliminar la cara del archivo",
|
||||
"error_loading_image": "Error al cargar la imagen",
|
||||
"error_title": "Error: algo salió mal",
|
||||
"errors": {
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "Mes",
|
||||
"more": "Mas",
|
||||
"moved_to_trash": "Movido a la papelera",
|
||||
"mute_memories": "Silenciar Recuerdos",
|
||||
"my_albums": "Mis albums",
|
||||
"name": "Nombre",
|
||||
"name_or_nickname": "Nombre o apodo",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Archivo eliminado permanentemente",
|
||||
"permanently_deleted_assets_count": "Eliminado permanentemente {count, plural, one {# elemento} other {# elementos}}",
|
||||
"person": "Persona",
|
||||
"person_birthdate": "Nacido el {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (oculto)} other {}}",
|
||||
"photo_shared_all_users": "Parece que compartiste tus fotos con todos los usuarios o no tienes ningún usuario con quien compartirlas.",
|
||||
"photos": "Fotos",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Eliminar del álbum",
|
||||
"remove_from_favorites": "Quitar de favoritos",
|
||||
"remove_from_shared_link": "Eliminar desde enlace compartido",
|
||||
"remove_memory": "Quitar memoria",
|
||||
"remove_photo_from_memory": "Quitar foto de esta memoria",
|
||||
"remove_url": "Eliminar URL",
|
||||
"remove_user": "Eliminar usuario",
|
||||
"removed_api_key": "Clave API eliminada: {name}",
|
||||
"removed_from_archive": "Eliminado del archivo",
|
||||
"removed_from_favorites": "Eliminado de favoritos",
|
||||
"removed_from_favorites_count": "{count, plural, other {Eliminados #}} de favoritos",
|
||||
"removed_memory": "Memoria eliminada",
|
||||
"removed_photo_from_memory": "Se ha eliminado la foto de la memoria",
|
||||
"removed_tagged_assets": "Etiqueta eliminada de {count, plural, one {# activo} other {# activos}}",
|
||||
"rename": "Renombrar",
|
||||
"repair": "Reparar",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Repositorio",
|
||||
"require_password": "Contraseña requerida",
|
||||
"require_user_to_change_password_on_first_login": "Requerir que el usuario cambie la contraseña en el primer inicio de sesión",
|
||||
"rescan": "Volver a escanear",
|
||||
"reset": "Reiniciar",
|
||||
"reset_password": "Restablecer la contraseña",
|
||||
"reset_people_visibility": "Restablecer la visibilidad de las personas",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Opciones de búsqueda",
|
||||
"search_people": "Buscar personas",
|
||||
"search_places": "Buscar lugar",
|
||||
"search_rating": "Buscar por calificación...",
|
||||
"search_settings": "Ajustes de la búsqueda",
|
||||
"search_state": "Buscar región/estado...",
|
||||
"search_tags": "Buscando etiquetas...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Buscando sitios...",
|
||||
"second": "Segundo",
|
||||
"see_all_people": "Ver todas las personas",
|
||||
"select": "Selecciona",
|
||||
"select_album_cover": "Seleccionar portada del álbum",
|
||||
"select_all": "Seleccionar todo",
|
||||
"select_all_duplicates": "Seleccionar todos los duplicados",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Etiqueta creada: {tag}",
|
||||
"tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas lógicas",
|
||||
"tag_not_found_question": "¿No encuentra una etiqueta? <link>Crea una nueva etiqueta.</link>",
|
||||
"tag_people": "Etiquetar personas",
|
||||
"tag_updated": "Etiqueta actualizada: {tag}",
|
||||
"tagged_assets": "Etiquetado(s) {count, plural, one {# activo} other {# activos}}",
|
||||
"tags": "Etiquetas",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Desvincular vídeo en movimiento",
|
||||
"unlink_oauth": "Desvincular OAuth",
|
||||
"unlinked_oauth_account": "Cuenta OAuth desconectada",
|
||||
"unmute_memories": "Habilitar sonido recuerdos",
|
||||
"unnamed_album": "Album sin nombre",
|
||||
"unnamed_album_delete_confirmation": "¿Seguro que quieres borrar este álbum?",
|
||||
"unnamed_share": "Compartido sin nombre",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Ver todas",
|
||||
"view_all_users": "Mostrar todos los usuarios",
|
||||
"view_in_timeline": "Mostrar en la línea de tiempo",
|
||||
"view_link": "Ver enlace",
|
||||
"view_links": "Mostrar enlaces",
|
||||
"view_name": "Ver",
|
||||
"view_next_asset": "Mostrar siguiente elemento",
|
||||
|
||||
38
i18n/et.json
38
i18n/et.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Varundamise seaded",
|
||||
"backup_settings_description": "Halda andmebaasi varundamise seadeid",
|
||||
"check_all": "Märgi kõik",
|
||||
"cleanup": "Koristus",
|
||||
"cleared_jobs": "Tööted eemaldatud: {job}",
|
||||
"config_set_by_file": "Konfiguratsioon on määratud konfifaili abil",
|
||||
"confirm_delete_library": "Kas oled kindel, et soovid kustutada {library} kogu?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Luba kogu perioodiline skaneerimine",
|
||||
"library_settings": "Väline kogu",
|
||||
"library_settings_description": "Halda välise kogu seadeid",
|
||||
"library_tasks_description": "Otsi välistest kogudest uusi ja muutunud üksuseid",
|
||||
"library_tasks_description": "Soorita kogu toiminguid",
|
||||
"library_watching_enable_description": "Jälgi välises kogus failide muudatusi",
|
||||
"library_watching_settings": "Kogu jälgimine (EKSPERIMENTAALNE)",
|
||||
"library_watching_settings_description": "Jälgi automaatselt muutunud faile",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Otsi pilte semantiliselt CLIP-manuste abil",
|
||||
"machine_learning_smart_search_enabled": "Luba nutiotsing",
|
||||
"machine_learning_smart_search_enabled_description": "Kui keelatud, siis ei kodeerita pilte nutiotsingu jaoks.",
|
||||
"machine_learning_url_description": "Masinõppe serveri URL. Kui ette on antud rohkem kui üks URL, proovitakse neid järjest ükshaaval, kuni üks edukalt vastab. Servereid, mis ei vasta, ignoreeritakse ajutiselt, kuni ühendus taastub.",
|
||||
"machine_learning_url_description": "Masinõppe serveri URL. Kui ette on antud rohkem kui üks URL, proovitakse neid järjest ükshaaval, kuni üks edukalt vastab.",
|
||||
"manage_concurrency": "Halda samaaegsust",
|
||||
"manage_log_settings": "Halda logi seadeid",
|
||||
"map_dark_style": "Tume stiil",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Kaart",
|
||||
"map_settings_description": "Halda kaardi seadeid",
|
||||
"map_style_description": "Kaarditeema style.json URL",
|
||||
"memory_cleanup_job": "Mälestuste korrastamine",
|
||||
"memory_generate_job": "Mälestuste genereerimine",
|
||||
"metadata_extraction_job": "Metaandmete eraldamine",
|
||||
"metadata_extraction_job_description": "Eralda igast üksusest metaandmed, nagu GPS-koordinaadid, näod ja resolutsioon",
|
||||
"metadata_faces_import_setting": "Luba nägude import",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Lülitab sisse räsi kontrolli; ära lülita seda välja, kui sa ei ole tagajärgedest teadlik",
|
||||
"storage_template_migration": "Talletusmalli migreerimine",
|
||||
"storage_template_migration_description": "Rakenda praegune <link>{template}</link> varem üleslaaditud üksustele",
|
||||
"storage_template_migration_info": "Talletusmall teeb kõik faililaiendid väiketähtedeks. Malli muudatused rakenduvad ainult uutele üksustele. Et rakendada malli tagasiulatuvalt varem üleslaaditud üksustele, käivita <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Malli muudatused rakenduvad ainult uutele üksustele. Et rakendada malli tagasiulatuvalt varem üleslaaditud üksustele, käivita <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Talletusmallide migreerimise tööde",
|
||||
"storage_template_more_details": "Et selle funktsiooni kohta rohkem teada saada, loe <template-link>talletusmallide</template-link> ja nende <implications-link>tagajärgede</implications-link> kohta",
|
||||
"storage_template_onboarding_description": "Kui sisse lülitatud, võimaldab see faile kasutaja määratud malli alusel automaatselt organiseerida. Stabiilsusprobleemide tõttu on see funktsioon vaikimisi välja lülitatud. Rohkem infot leiad <link>dokumentatsioonist</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maksimaalne B-kaadrite arv",
|
||||
"transcoding_max_b_frames_description": "Kõrgemad väärtused parandavad pakkimise efektiivsust, aga aeglustavad kodeerimist. See valik ei pruugi olla ühilduv riistvaralise kiirendusega vanematel seadmetel. 0 lülitab B-kaadrid välja, -1 määrab väärtuse automaatselt.",
|
||||
"transcoding_max_bitrate": "Maksimaalne bitisagedus",
|
||||
"transcoding_max_bitrate_description": "Maksimaalse bitisageduse määramine teeb failisuurused ennustatavamaks, väikese kvaliteedikao hinnaga. 720p resolutsiooni puhul on tüüpilised väärtused 2600 kbit/s (VP9 ja HEVC) või 4500 kbit/s (H.264). Väärtus 0 eemaldab piirangu.",
|
||||
"transcoding_max_bitrate_description": "Maksimaalse bitisageduse määramine teeb failisuurused ennustatavamaks, väikese kvaliteedikao hinnaga. 720p resolutsiooni puhul on tüüpilised väärtused 2600k (VP9 ja HEVC) või 4500k (H.264). Väärtus 0 eemaldab piirangu.",
|
||||
"transcoding_max_keyframe_interval": "Maksimaalne võtmekaadri intervall",
|
||||
"transcoding_max_keyframe_interval_description": "Määrab maksimaalse kauguse võtmekaadrite vahel. Madalamad väärtused vähendavad pakkimise efektiivsust, aga parandavad otsimiskiirust ning võivad tõsta kiire liikumisega stseenide kvaliteeti. 0 määrab väärtuse automaatselt.",
|
||||
"transcoding_optimal_description": "Kõrgema kui lubatud resolutsiooniga või mittelubatud formaadis videod",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Luba muutmine",
|
||||
"allow_public_user_to_download": "Luba avalikul kasutajal alla laadida",
|
||||
"allow_public_user_to_upload": "Luba avalikul kasutajal üles laadida",
|
||||
"alt_text_qr_code": "QR kood",
|
||||
"anti_clockwise": "Vastupäeva",
|
||||
"api_key": "API võti",
|
||||
"api_key_description": "Seda väärtust kuvatakse ainult üks kord. Kopeeri see enne akna sulgemist.",
|
||||
@@ -435,7 +431,7 @@
|
||||
"assets_were_part_of_album_count": "{count, plural, one {Üksus oli} other {Üksused olid}} juba osa albumist",
|
||||
"authorized_devices": "Autoriseeritud seadmed",
|
||||
"back": "Tagasi",
|
||||
"back_close_deselect": "Tagasi, sulge või tühista valik",
|
||||
"back_close_deselect": "Tagasi, sulge, või tühista valik",
|
||||
"backward": "Tagasi",
|
||||
"birthdate_saved": "Sünnikuupäev salvestatud",
|
||||
"birthdate_set_description": "Sünnikuupäeva kasutatakse isiku vanuse arvutamiseks foto tegemise hetkel.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Kommentaarid on keelatud",
|
||||
"confirm": "Kinnita",
|
||||
"confirm_admin_password": "Kinnita administraatori parool",
|
||||
"confirm_delete_face": "Kas oled kindel, et soovid isiku {name} näo üksuselt kustutada?",
|
||||
"confirm_delete_shared_link": "Kas oled kindel, et soovid selle jagatud lingi kustutada?",
|
||||
"confirm_keep_this_delete_others": "Kõik muud üksused selles virnas kustutatakse. Kas oled kindel, et soovid jätkata?",
|
||||
"confirm_password": "Kinnita parool",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Kustuta album",
|
||||
"delete_api_key_prompt": "Kas oled kindel, et soovid selle API võtme kustutada?",
|
||||
"delete_duplicates_confirmation": "Kas oled kindel, et soovid need duplikaadid jäädavalt kustutada?",
|
||||
"delete_face": "Kustuta nägu",
|
||||
"delete_key": "Kustuta võti",
|
||||
"delete_library": "Kustuta kogu",
|
||||
"delete_link": "Kustuta link",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Lubatud",
|
||||
"end_date": "Lõppkuupäev",
|
||||
"error": "Viga",
|
||||
"error_delete_face": "Viga näo kustutamisel",
|
||||
"error_loading_image": "Viga pildi laadimisel",
|
||||
"error_title": "Viga - midagi läks valesti",
|
||||
"errors": {
|
||||
@@ -725,7 +718,6 @@
|
||||
"unable_to_submit_job": "Tööte edastamine ebaõnnestus",
|
||||
"unable_to_trash_asset": "Üksuse prügikasti liigutamine ebaõnnestus",
|
||||
"unable_to_unlink_account": "Konto lahtiühendamine ebaõnnestus",
|
||||
"unable_to_unlink_motion_video": "Liikuva video linkimise tühistamine ebaõnnestus",
|
||||
"unable_to_update_album_cover": "Albumi kaanepildi muutmine ebaõnnestus",
|
||||
"unable_to_update_album_info": "Albumi info muutmine ebaõnnestus",
|
||||
"unable_to_update_library": "Kogu uuendamine ebaõnnestus",
|
||||
@@ -742,7 +734,6 @@
|
||||
"expired": "Aegunud",
|
||||
"expires_date": "Aegub {date}",
|
||||
"explore": "Avasta",
|
||||
"explorer": "Brauser",
|
||||
"export": "Ekspordi",
|
||||
"export_as_json": "Ekspordi JSON-formaati",
|
||||
"extension": "Laiend",
|
||||
@@ -751,7 +742,6 @@
|
||||
"face_unassigned": "Seostamata",
|
||||
"failed_to_load_assets": "Üksuste laadimine ebaõnnestus",
|
||||
"favorite": "Lemmik",
|
||||
"favorite_or_unfavorite_photo": "Lisa foto lemmikutesse või eemalda lemmikutest",
|
||||
"favorites": "Lemmikud",
|
||||
"feature_photo_updated": "Esiletõstetud foto muudetud",
|
||||
"features": "Funktsioonid",
|
||||
@@ -809,7 +799,6 @@
|
||||
"include_shared_albums": "Kaasa jagatud albumid",
|
||||
"include_shared_partner_assets": "Kaasa partneri jagatud üksused",
|
||||
"individual_share": "Jagatud üksus",
|
||||
"individual_shares": "Jagatud üksused",
|
||||
"info": "Info",
|
||||
"interval": {
|
||||
"day_at_onepm": "Iga päev kell 13",
|
||||
@@ -839,7 +828,6 @@
|
||||
"library_options": "Kogu seaded",
|
||||
"light": "Hele",
|
||||
"like_deleted": "Meeldimine kustutatud",
|
||||
"link_motion_video": "Lingi liikuv video",
|
||||
"link_options": "Lingi valikud",
|
||||
"link_to_oauth": "Ühenda OAuth",
|
||||
"linked_oauth_account": "OAuth konto ühendatud",
|
||||
@@ -891,7 +879,6 @@
|
||||
"month": "Kuu",
|
||||
"more": "Rohkem",
|
||||
"moved_to_trash": "Liigutatud prügikasti",
|
||||
"mute_memories": "Vaigista mälestused",
|
||||
"my_albums": "Minu albumid",
|
||||
"name": "Nimi",
|
||||
"name_or_nickname": "Nimi või hüüdnimi",
|
||||
@@ -987,7 +974,6 @@
|
||||
"permanently_deleted_asset": "Üksus jäädavalt kustutatud",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {# üksus} other {# üksust}} jäädavalt kustutatud",
|
||||
"person": "Isik",
|
||||
"person_birthdate": "Sündinud {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (peidetud)} other {}}",
|
||||
"photo_shared_all_users": "Paistab, et oled oma fotosid kõigi kasutajatega jaganud, või pole ühtegi kasutajat, kellega jagada.",
|
||||
"photos": "Fotod",
|
||||
@@ -1079,16 +1065,12 @@
|
||||
"remove_from_album": "Eemalda albumist",
|
||||
"remove_from_favorites": "Eemalda lemmikutest",
|
||||
"remove_from_shared_link": "Eemalda jagatud lingist",
|
||||
"remove_memory": "Eemalda mälestus",
|
||||
"remove_photo_from_memory": "Eemalda foto sellest mälestusest",
|
||||
"remove_url": "Eemalda URL",
|
||||
"remove_user": "Eemalda kasutaja",
|
||||
"removed_api_key": "API võti eemaldatud: {name}",
|
||||
"removed_from_archive": "Arhiivist eemaldatud",
|
||||
"removed_from_favorites": "Lemmikutest eemaldatud",
|
||||
"removed_from_favorites_count": "{count, plural, other {# eemaldatud}} lemmikutest",
|
||||
"removed_memory": "Mäletus eemaldatud",
|
||||
"removed_photo_from_memory": "Foto mälestustest eemaldatud",
|
||||
"removed_tagged_assets": "Silt eemaldatud {count, plural, one {# üksuselt} other {# üksuselt}}",
|
||||
"rename": "Nimeta ümber",
|
||||
"repair": "Parandus",
|
||||
@@ -1097,7 +1079,6 @@
|
||||
"repository": "Koodihoidla",
|
||||
"require_password": "Nõua parooli",
|
||||
"require_user_to_change_password_on_first_login": "Nõua kasutajalt esmakordsel sisenemisel parooli muutmist",
|
||||
"rescan": "Skaneeri uuesti",
|
||||
"reset": "Lähtesta",
|
||||
"reset_password": "Lähtesta parool",
|
||||
"reset_people_visibility": "Lähtesta isikute nähtavus",
|
||||
@@ -1141,7 +1122,6 @@
|
||||
"search_options": "Otsingu valikud",
|
||||
"search_people": "Otsi inimesi",
|
||||
"search_places": "Otsi kohti",
|
||||
"search_rating": "Otsi hinnangu järgi...",
|
||||
"search_settings": "Otsi seadeid",
|
||||
"search_state": "Otsi osariiki...",
|
||||
"search_tags": "Otsi silte...",
|
||||
@@ -1151,7 +1131,6 @@
|
||||
"searching_locales": "Lokaatide otsimine...",
|
||||
"second": "Sekund",
|
||||
"see_all_people": "Vaata kõiki isikuid",
|
||||
"select": "Vali",
|
||||
"select_album_cover": "Vali albumi kaanepilt",
|
||||
"select_all": "Vali kõik",
|
||||
"select_all_duplicates": "Vali kõik duplikaadid",
|
||||
@@ -1246,7 +1225,7 @@
|
||||
"start_date": "Alguskuupäev",
|
||||
"state": "Osariik",
|
||||
"status": "Staatus",
|
||||
"stop_motion_photo": "Peata liikuv foto",
|
||||
"stop_motion_photo": "Peata liikuv pilt",
|
||||
"stop_photo_sharing": "Lõpeta oma fotode jagamine?",
|
||||
"stop_photo_sharing_description": "{partner} ei pääse rohkem su fotodele ligi.",
|
||||
"stop_sharing_photos_with_user": "Lõpeta oma fotode selle kasutajaga jagamine",
|
||||
@@ -1266,7 +1245,6 @@
|
||||
"tag_created": "Lisatud silt: {tag}",
|
||||
"tag_feature_description": "Fotode ja videote lehitsemine siltide kaupa grupeeritult",
|
||||
"tag_not_found_question": "Ei leia silti? <link>Lisa uus silt.</link>",
|
||||
"tag_people": "Sildista inimesi",
|
||||
"tag_updated": "Muudetud silt: {tag}",
|
||||
"tagged_assets": "{count, plural, one {# üksus} other {# üksust}} sildistatud",
|
||||
"tags": "Sildid",
|
||||
@@ -1304,13 +1282,10 @@
|
||||
"unknown_country": "Tundmatu riik",
|
||||
"unknown_year": "Teadmata aasta",
|
||||
"unlimited": "Piiramatu",
|
||||
"unlink_motion_video": "Tühista liikuva video linkimine",
|
||||
"unlink_oauth": "Eemalda OAuth ühendus",
|
||||
"unlinked_oauth_account": "OAuth ühendus eemaldatud",
|
||||
"unmute_memories": "Tühista mälestuste vaigistamine",
|
||||
"unnamed_album": "Nimetu album",
|
||||
"unnamed_album_delete_confirmation": "Kas oled kindel, et soovid selle albumi kustutada?",
|
||||
"unnamed_share": "Nimetu jagamine",
|
||||
"unsaved_change": "Salvestamata muudatus",
|
||||
"unselect_all": "Ära vali ühtegi",
|
||||
"unselect_all_duplicates": "Ära vali duplikaate",
|
||||
@@ -1361,7 +1336,6 @@
|
||||
"view_all": "Vaata kõiki",
|
||||
"view_all_users": "Vaata kõiki kasutajaid",
|
||||
"view_in_timeline": "Vaata ajajoonel",
|
||||
"view_link": "Vaata linki",
|
||||
"view_links": "Vaata linke",
|
||||
"view_name": "Vaade",
|
||||
"view_next_asset": "Vaata järgmist üksust",
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
"transcoding_max_b_frames": "بیشترین B-frames",
|
||||
"transcoding_max_b_frames_description": "مقادیر بالاتر کارایی فشرده سازی را بهبود میبخشند، اما کدگذاری را کند میکنند. ممکن است با شتاب دهی سختافزاری در دستگاههای قدیمی سازگار نباشد. مقدار( 0 ) B-frames را غیرفعال میکند، در حالی که مقدار ( 1 ) این مقدار را به صورت خودکار تنظیم میکند.",
|
||||
"transcoding_max_bitrate": "بیشترین بیت ریت",
|
||||
"transcoding_max_bitrate_description": "تنظیم حداکثر بیتریت میتواند اندازه فایلها را در حدی قابل پیشبینیتر کند، هرچند که هزینه کمی برای کیفیت دارد. در وضوح 720p، مقادیر معمول 2600 kbit/s برای VP9 یا HEVC و 4500 kbit/s برای H.264 است. اگر به 0 تنظیم شود، غیرفعال میشود.",
|
||||
"transcoding_max_bitrate_description": "تنظیم حداکثر بیتریت میتواند اندازه فایلها را در حدی قابل پیشبینیتر کند، هرچند که هزینه کمی برای کیفیت دارد. در وضوح 720p، مقادیر معمول 2600k برای VP9 یا HEVC و 4500k برای H.264 است. اگر به 0 تنظیم شود، غیرفعال میشود.",
|
||||
"transcoding_max_keyframe_interval": "حداکثر فاصله کلید فریم",
|
||||
"transcoding_max_keyframe_interval_description": "حداکثر فاصله فریم بین کلیدفریمها را تنظیم میکند. مقادیر پایینتر کارایی فشردهسازی را کاهش میدهند، اما زمان جستجو را بهبود میبخشند و ممکن است کیفیت را در صحنههای با حرکت سریع بهبود دهند. مقدار 0 این مقدار را بهطور خودکار تنظیم میکند.",
|
||||
"transcoding_optimal_description": "ویدیوهایی که از رزولوشن هدف بالاتر هستند یا در قالب پذیرفته شده نیستند",
|
||||
@@ -926,4 +926,4 @@
|
||||
"yes": "بله",
|
||||
"you_dont_have_any_shared_links": "",
|
||||
"zoom_image": "بزرگنمایی تصویر"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "B-kehysten enimmäismäärä",
|
||||
"transcoding_max_b_frames_description": "Korkeampi arvo parantaa pakkausta, mutta hidastaa enkoodausta. Ei välttämättä ole yhteensopiva vanhempien laitteiden kanssa. 0 poistaa B-kehykset käytöstä, -1 määrittää arvon automaattisesti.",
|
||||
"transcoding_max_bitrate": "Suurin bittinopeus",
|
||||
"transcoding_max_bitrate_description": "Suurimman sallitun bittinopeuden asettaminen tekee tiedostojen koosta ennustettavampaa vaikka laatu voi hieman heiketä. 720p videossa tyypilliset arvot ovat 2600 kbit/s VP9:lle ja HEVC:lle, tai 4500 kbit/s H.254:lle. Jos 0, ei käytössä.",
|
||||
"transcoding_max_bitrate_description": "Suurimman sallitun bittinopeuden asettaminen tekee tiedostojen koosta ennustettavampaa vaikka laatu voi hieman heiketä. 720p videossa tyypilliset arvot ovat 2600k VP9:lle ja HEVC:lle, tai 4500k H.254:lle. Jos 0, ei käytössä.",
|
||||
"transcoding_max_keyframe_interval": "Suurin avainkehysten väli",
|
||||
"transcoding_max_keyframe_interval_description": "Asettaa avainkehysten välin maksimiarvon. Alempi arvo huonontaa pakkauksen tehoa, mutta parantaa hakuaikoja ja voi parantaa laatua nopealiikkeisissä kohtauksissa. 0 asettaa arvon automaattisesti.",
|
||||
"transcoding_optimal_description": "Videot, joiden resoluutio on korkeampi kuin kohteen, tai ei hyväksytyssä formaatissa",
|
||||
@@ -766,10 +766,8 @@
|
||||
"go_to_folder": "Mene kansioon",
|
||||
"go_to_search": "Siirry hakuun",
|
||||
"group_albums_by": "Ryhmitä albumi...",
|
||||
"group_country": "Ryhmitä maan mukaan",
|
||||
"group_no": "Ei ryhmitystä",
|
||||
"group_owner": "Ryhmitä omistajan mukaan",
|
||||
"group_places_by": "Ryhmitä paikat...",
|
||||
"group_year": "Ryhmitä vuoden mukaan",
|
||||
"has_quota": "On kiintiö",
|
||||
"hi_user": "Hei {name} ({email})",
|
||||
@@ -802,7 +800,6 @@
|
||||
"include_shared_albums": "Sisällytä jaetut albumit",
|
||||
"include_shared_partner_assets": "Sisällytä jaetut kumppanikohteet",
|
||||
"individual_share": "Yksittäinen jako",
|
||||
"individual_shares": "Yksittäiset jaot",
|
||||
"info": "Lisätietoja",
|
||||
"interval": {
|
||||
"day_at_onepm": "Joka päivä klo 13:00",
|
||||
@@ -1110,7 +1107,6 @@
|
||||
"search": "Haku",
|
||||
"search_albums": "Etsi albumeita",
|
||||
"search_by_context": "Etsi kontekstin perusteella",
|
||||
"search_by_description": "Etsi kuvauksen perusteella",
|
||||
"search_by_filename": "Hae tiedostonimen tai -päätteen mukaan",
|
||||
"search_by_filename_example": "esim. IMG_1234.JPG tai PNG",
|
||||
"search_camera_make": "Etsi kameramerkkiä...",
|
||||
@@ -1352,4 +1348,4 @@
|
||||
"yes": "Kyllä",
|
||||
"you_dont_have_any_shared_links": "Sinulla ei ole jaettuja linkkejä",
|
||||
"zoom_image": "Zoomaa kuvaa"
|
||||
}
|
||||
}
|
||||
|
||||
27
i18n/fr.json
27
i18n/fr.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Paramètres de la sauvegarde",
|
||||
"backup_settings_description": "Gérer les paramètres de la sauvegarde",
|
||||
"check_all": "Tout cocher",
|
||||
"cleanup": "Nettoyage",
|
||||
"cleared_jobs": "Tâches supprimées pour : {job}",
|
||||
"config_set_by_file": "La configuration est actuellement définie par un fichier de configuration",
|
||||
"confirm_delete_library": "Êtes-vous sûr de vouloir supprimer la bibliothèque {library} ?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Activer l'analyse périodique de la bibliothèque",
|
||||
"library_settings": "Bibliothèque externe",
|
||||
"library_settings_description": "Gestion des paramètres des bibliothèques externes",
|
||||
"library_tasks_description": "Scanner les bibliothèques externes pour les nouveaux et/ou les éléments modifiés",
|
||||
"library_tasks_description": "Exécution d'actions sur la bibliothèque",
|
||||
"library_watching_enable_description": "Surveiller les modifications de fichiers dans les bibliothèques externes",
|
||||
"library_watching_settings": "Surveillance de bibliothèque (EXPÉRIMENTAL)",
|
||||
"library_watching_settings_description": "Surveiller automatiquement les fichiers modifiés",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Rechercher des images de manière sémantique en utilisant les intégrations CLIP",
|
||||
"machine_learning_smart_search_enabled": "Activer la recherche intelligente",
|
||||
"machine_learning_smart_search_enabled_description": "Si cette option est désactivée, les images ne seront pas encodées pour la recherche intelligente.",
|
||||
"machine_learning_url_description": "L’URL du serveur d'apprentissage automatique. Si plusieurs URL sont fournies, chaque serveur sera essayé un par un jusqu’à ce que l’un d’eux réponde avec succès, dans l’ordre de la première à la dernière. Les serveurs ne répondant pas seront temporairement ignorés jusqu'à ce qu'ils soient de nouveau opérationnels.",
|
||||
"machine_learning_url_description": "L’URL du serveur d'apprentissage automatique. Si plusieurs URL sont fournies, chaque serveur sera essayé un par un jusqu’à ce que l’un d’eux réponde avec succès, dans l’ordre de la première à la dernière.",
|
||||
"manage_concurrency": "Gérer du multitâche",
|
||||
"manage_log_settings": "Gérer les paramètres de journalisation",
|
||||
"map_dark_style": "Thème sombre",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Carte",
|
||||
"map_settings_description": "Gérer les paramètres de la carte",
|
||||
"map_style_description": "URL vers un thème de carte au format style.json",
|
||||
"memory_cleanup_job": "Nettoyage des souvenirs",
|
||||
"memory_generate_job": "Génération des souvenirs",
|
||||
"metadata_extraction_job": "Extraction des métadonnées",
|
||||
"metadata_extraction_job_description": "Extraction des informations des métadonnées de chaque média, telles que la position GPS, les visages et la résolution",
|
||||
"metadata_faces_import_setting": "Active l'importation des visages",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Active la vérification du hachage, ne désactivez pas cette option à moins d'être sûr de ce que vous faites",
|
||||
"storage_template_migration": "Migration du modèle de stockage",
|
||||
"storage_template_migration_description": "Appliquer le modèle courant <link>{template}</link> aux médias précédemment envoyés",
|
||||
"storage_template_migration_info": "L'enregistrement des modèles convertit toutes les extensions en minuscule. Les changements de modèle ne s'appliqueront qu'aux nouveaux médias. Pour appliquer rétroactivement le modèle aux médias précédemment envoyés, exécutez la tâche <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Les changements de modèle ne s'appliqueront qu'aux nouveaux médias. Pour appliquer rétroactivement le modèle aux médias précédemment envoyés, exécutez la tâche <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Tâche de migration du modèle de stockage",
|
||||
"storage_template_more_details": "Pour plus de détails sur cette fonctionnalité, reportez-vous au <template-link>Modèle de stockage</template-link> et à ses <implications-link>implications</implications-link>",
|
||||
"storage_template_onboarding_description": "Lorsqu'elle est activée, cette fonctionnalité réorganise les fichiers basés sur un modèle défini par l'utilisateur. En raison de problèmes de stabilité, la fonction a été désactivée par défaut. Pour plus d'informations, veuillez consulter la <link>documentation</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Nombre maximum de trames B",
|
||||
"transcoding_max_b_frames_description": "Des valeurs plus élevées améliorent l'efficacité de la compression, mais ralentissent l'encodage. Elles peuvent ne pas être compatibles avec l'accélération matérielle sur les anciens appareils. Une valeur de 0 désactive les trames B, tandis qu'une valeur de -1 définit automatiquement ce paramètre.",
|
||||
"transcoding_max_bitrate": "Débit binaire maximal",
|
||||
"transcoding_max_bitrate_description": "Définir un débit binaire maximal peut résulter en des fichiers de taille plus prédictible, au prix d'une légère perte en qualité. En 720p, les valeurs sont 2600 kbit/s pour du VP9 ou du HEVC ou 4500 kbit/s pour du H.264. Désactivé si le débit binaire est à 0.",
|
||||
"transcoding_max_bitrate_description": "Définir un débit binaire maximal peut résulter en des fichiers de taille plus prédictible, au prix d'une légère perte en qualité. En 720p, les valeurs sont 2600k pour du VP9 ou du HEVC ou 4500k pour du H.264. Désactivé si le débit binaire est à 0.",
|
||||
"transcoding_max_keyframe_interval": "Intervalle maximal entre les images clés",
|
||||
"transcoding_max_keyframe_interval_description": "Définit la distance maximale de trames entre les images clés. Les valeurs plus basses diminuent l'efficacité de la compression, mais améliorent les temps de recherche et peuvent améliorer la qualité dans les scènes avec des mouvements rapides. Une valeur de 0 définit automatiquement ce paramètre.",
|
||||
"transcoding_optimal_description": "Les vidéos dont la résolution est supérieure à celle attendue ou celles qui ne sont pas dans un format accepté",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Autoriser les modifications",
|
||||
"allow_public_user_to_download": "Permettre aux utilisateurs non connectés de télécharger",
|
||||
"allow_public_user_to_upload": "Permettre l'envoi aux utilisateurs non connectés",
|
||||
"alt_text_qr_code": "Image du code QR",
|
||||
"anti_clockwise": "Sens anti-horaire",
|
||||
"api_key": "Clé API",
|
||||
"api_key_description": "Cette valeur ne sera affichée qu'une seule fois. Assurez-vous de la copier avant de fermer la fenêtre.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Les commentaires sont désactivés",
|
||||
"confirm": "Confirmer",
|
||||
"confirm_admin_password": "Confirmer le mot de passe Admin",
|
||||
"confirm_delete_face": "Êtes-vous sûr de vouloir supprimer le visage de {name} du média ?",
|
||||
"confirm_delete_shared_link": "Voulez-vous vraiment supprimer ce lien partagé ?",
|
||||
"confirm_keep_this_delete_others": "Tous les autres médias dans la pile seront supprimés sauf celui-ci. Êtes-vous sûr de vouloir continuer ?",
|
||||
"confirm_password": "Confirmer le mot de passe",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Supprimer l'album",
|
||||
"delete_api_key_prompt": "Voulez-vous vraiment supprimer cette clé API ?",
|
||||
"delete_duplicates_confirmation": "Êtes-vous certain de vouloir supprimer définitivement ces doublons ?",
|
||||
"delete_face": "Supprimer le visage",
|
||||
"delete_key": "Supprimer la clé",
|
||||
"delete_library": "Supprimer la bibliothèque",
|
||||
"delete_link": "Supprimer le lien",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Activé",
|
||||
"end_date": "Date de fin",
|
||||
"error": "Erreur",
|
||||
"error_delete_face": "Erreur lors de la suppression du visage pour le média",
|
||||
"error_loading_image": "Erreur de chargement de l'image",
|
||||
"error_title": "Erreur - Quelque chose s'est mal passé",
|
||||
"errors": {
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "Mois",
|
||||
"more": "Plus",
|
||||
"moved_to_trash": "Déplacé dans la corbeille",
|
||||
"mute_memories": "Mettre en sourdine les souvenirs",
|
||||
"my_albums": "Mes albums",
|
||||
"name": "Nom",
|
||||
"name_or_nickname": "Nom ou surnom",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Média supprimé définitivement",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {# média définitivement supprimé} other {# médias définitivement supprimés}}",
|
||||
"person": "Personne",
|
||||
"person_birthdate": "Né(e) le {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (caché)} other {}}",
|
||||
"photo_shared_all_users": "Il semble que vous ayez partagé vos photos avec tous les utilisateurs ou que vous n'ayez aucun utilisateur avec qui les partager.",
|
||||
"photos": "Photos",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Supprimer de l'album",
|
||||
"remove_from_favorites": "Supprimer des favoris",
|
||||
"remove_from_shared_link": "Supprimer des liens partagés",
|
||||
"remove_memory": "Supprimer le souvenir",
|
||||
"remove_photo_from_memory": "Supprimer la photo de ce souvenir",
|
||||
"remove_url": "Supprimer l'URL",
|
||||
"remove_user": "Supprimer l'utilisateur",
|
||||
"removed_api_key": "Clé API supprimée : {name}",
|
||||
"removed_from_archive": "Supprimé de l'archive",
|
||||
"removed_from_favorites": "Supprimé des favoris",
|
||||
"removed_from_favorites_count": "{count, plural, one {# supprimé} other {# supprimés}} des favoris",
|
||||
"removed_memory": "Souvenir supprimé",
|
||||
"removed_photo_from_memory": "Photo supprimée du souvenir",
|
||||
"removed_tagged_assets": "Tag supprimé de {count, plural, one {# média} other {# médias}}",
|
||||
"rename": "Renommer",
|
||||
"repair": "Réparer",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Dépôt",
|
||||
"require_password": "Demander le mot de passe",
|
||||
"require_user_to_change_password_on_first_login": "Demander à l'utilisateur de changer son mot de passe lors de sa première connexion",
|
||||
"rescan": "Rescanner",
|
||||
"reset": "Réinitialiser",
|
||||
"reset_password": "Réinitialiser le mot de passe",
|
||||
"reset_people_visibility": "Réinitialiser la visibilité des personnes",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Rechercher une option",
|
||||
"search_people": "Rechercher une personne",
|
||||
"search_places": "Rechercher un lieu",
|
||||
"search_rating": "Chercher par évaluation...",
|
||||
"search_settings": "Paramètres de recherche",
|
||||
"search_state": "Rechercher par état/région...",
|
||||
"search_tags": "Recherche d'étiquettes...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Recherche des paramètres régionaux...",
|
||||
"second": "Seconde",
|
||||
"see_all_people": "Voir toutes les personnes",
|
||||
"select": "Sélectionner",
|
||||
"select_album_cover": "Sélectionner la couverture d'album",
|
||||
"select_all": "Tout sélectionner",
|
||||
"select_all_duplicates": "Sélectionner tous les doublons",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Étiquette créée : {tag}",
|
||||
"tag_feature_description": "Parcourir les photos et vidéos groupées par thèmes logiques",
|
||||
"tag_not_found_question": "Vous ne trouvez pas une étiquette ? <link>Créer une nouvelle étiquette.</link>",
|
||||
"tag_people": "Étiqueter les personnes",
|
||||
"tag_updated": "Étiquette mise à jour : {tag}",
|
||||
"tagged_assets": "Étiquette ajoutée à {count, plural, one {# média} other {# médias}}",
|
||||
"tags": "Étiquettes",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Détacher la photo animée",
|
||||
"unlink_oauth": "Déconnecter OAuth",
|
||||
"unlinked_oauth_account": "Compte OAuth non connecté",
|
||||
"unmute_memories": "Réactiver les souvenirs",
|
||||
"unnamed_album": "Album sans nom",
|
||||
"unnamed_album_delete_confirmation": "Êtes-vous sûr de vouloir supprimer cet album ?",
|
||||
"unnamed_share": "Partage sans nom",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Voir tout",
|
||||
"view_all_users": "Voir tous les utilisateurs",
|
||||
"view_in_timeline": "Voir dans la vue chronologique",
|
||||
"view_link": "Voir le lien",
|
||||
"view_links": "Voir les liens",
|
||||
"view_name": "Vue",
|
||||
"view_next_asset": "Voir le média suivant",
|
||||
|
||||
29
i18n/he.json
29
i18n/he.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "הגדרות גיבוי",
|
||||
"backup_settings_description": "ניהול הגדרות גיבוי מסד נתונים",
|
||||
"check_all": "סימון הכל",
|
||||
"cleanup": "ניקוי",
|
||||
"cleared_jobs": "נוקו משימות עבור: {job}",
|
||||
"config_set_by_file": "התצורה מוגדרת כעת על ידי קובץ תצורה",
|
||||
"confirm_delete_library": "האם את/ה בטוח/ה שברצונך למחוק את הספרייה {library}?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "אפשר סריקת ספרייה תקופתית",
|
||||
"library_settings": "ספרייה חיצונית",
|
||||
"library_settings_description": "ניהול הגדרות ספרייה חיצונית",
|
||||
"library_tasks_description": "סרוק ספריות חיצוניות עבור נכסים חדשים ו/או שהשתנו",
|
||||
"library_tasks_description": "ביצוע משימות ספרייה",
|
||||
"library_watching_enable_description": "עקוב אחר שינויי קבצים בספריות חיצוניות",
|
||||
"library_watching_settings": "צפיית ספרייה (ניסיוני)",
|
||||
"library_watching_settings_description": "עקוב אוטומטית אחר שינויי קבצים",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "חיפוש תמונות באופן סמנטי באמצעות הטמעות של CLIP",
|
||||
"machine_learning_smart_search_enabled": "אפשר חיפוש חכם",
|
||||
"machine_learning_smart_search_enabled_description": "אם מושבת, תמונות לא יקודדו לחיפוש חכם.",
|
||||
"machine_learning_url_description": "כתובת ה-URL של שרת למידת המכונה. אם ניתנת יותר מכתובת URL אחת, כל שרת ינוסה ניסיון אחד בכל פעם עד שאחד מהם יגיב בהצלחה, לפי הסדר מהראשון עד האחרון. שרתים שלא מגיבים יוזנחו זמנית עד שיחזרו להיות מקוונים.",
|
||||
"machine_learning_url_description": "כתובת האתר של שרת למידת המכונה. אם ניתנת יותר מכתובת אחת, כל שרת ינסה בתורו עד אשר יענה בחיוב, בסדר התחלתי.",
|
||||
"manage_concurrency": "ניהול בו-זמניות",
|
||||
"manage_log_settings": "ניהול הגדרות רישום ביומן",
|
||||
"map_dark_style": "עיצוב כהה",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "מפה",
|
||||
"map_settings_description": "ניהול הגדרות מפה",
|
||||
"map_style_description": "כתובת אתר לערכת נושא של מפה style.json",
|
||||
"memory_cleanup_job": "ניקוי זיכרון",
|
||||
"memory_generate_job": "יצירת זיכרון",
|
||||
"metadata_extraction_job": "חלץ מטא-נתונים",
|
||||
"metadata_extraction_job_description": "חלץ מידע מטא-נתונים מכל נכס, כגון GPS, פנים ורזולוציה",
|
||||
"metadata_faces_import_setting": "אפשר יבוא פנים",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "מאפשר אימות גיבוב, אל תשבית/י זאת אלא אם כן את/ה בטוח/ה בהשלכות",
|
||||
"storage_template_migration": "העברת תבנית אחסון",
|
||||
"storage_template_migration_description": "החל את ה<link>{template}</link> הנוכחית על נכסים שהועלו בעבר",
|
||||
"storage_template_migration_info": "תבנית האחסון תמיר את כל ההרחבות לאותיות קטנות. שינויים בתבנית יחולו רק על נכסים חדשים. כדי להחיל באופן רטרואקטיבי את התבנית על נכסים שהועלו בעבר, הפעל את <link>{job}</link>.",
|
||||
"storage_template_migration_info": "שינויים בתבנית יחולו רק על נכסים חדשים. כדי להחיל באופן רטרואקטיבי את התבנית על נכסים שהועלו בעבר, הפעל את <link>{job}</link>.",
|
||||
"storage_template_migration_job": "משימת העברת תבנית אחסון",
|
||||
"storage_template_more_details": "לפרטים נוספים אודות תכונה זו, עיין ב<template-link>תבנית האחסון</template-link> וב<implications-link>השלכותיה</implications-link>",
|
||||
"storage_template_onboarding_description": "כאשר מופעלת, תכונה זו תארגן אוטומטית קבצים בהתבסס על תבנית שהמשתמש הגדיר. עקב בעיות יציבות התכונה כבויה כברירת מחדל. למידע נוסף, נא לראות את ה<link>תיעוד</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "B-פריימים מרביים",
|
||||
"transcoding_max_b_frames_description": "ערכים גבוהים יותר משפרים את יעילות הדחיסה, אך מאטים את הקידוד. ייתכן שלא יהיה תואם עם האצת חומרה במכשירים ישנים יותר. 0 משבית את B-פריימים, בעוד ש1- מגדיר את הערך זה באופן אוטומטי.",
|
||||
"transcoding_max_bitrate": "קצב סיביות מרבי",
|
||||
"transcoding_max_bitrate_description": "קביעת קצב סיביות מרבי יכולה להפוך את גדלי הקבצים לצפויים יותר בעלות קלה לאיכות. ב-720p, ערכים טיפוסיים הם 2600 kbit/s עבור VP9 או HEVC, או 4500 kbit/s עבור H.264. מושבת אם מוגדר ל-0.",
|
||||
"transcoding_max_bitrate_description": "קביעת קצב סיביות מרבי יכולה להפוך את גדלי הקבצים לצפויים יותר בעלות קלה לאיכות. ב-720p, ערכים טיפוסיים הם 2600k עבור VP9 או HEVC, או 4500k עבור H.264. מושבת אם מוגדר ל-0.",
|
||||
"transcoding_max_keyframe_interval": "מרווח תמונת מפתח מרבי",
|
||||
"transcoding_max_keyframe_interval_description": "מגדיר את מרחק הפריימים המרבי בין תמונות מפתח. ערכים נמוכים גורעים את יעילות הדחיסה, אך משפרים את זמני החיפוש ועשויים לשפר את האיכות בסצנות עם תנועה מהירה. 0 מגדיר ערך זה באופן אוטומטי.",
|
||||
"transcoding_optimal_description": "סרטונים גבוהים מרזולוציית היעד או לא בפורמט מקובל",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "אפשר עריכות",
|
||||
"allow_public_user_to_download": "אפשר למשתמש ציבורי להוריד",
|
||||
"allow_public_user_to_upload": "אפשר למשתמש ציבורי להעלות",
|
||||
"alt_text_qr_code": "תמונת קוד QR",
|
||||
"anti_clockwise": "נגד כיוון השעון",
|
||||
"api_key": "מפתח API",
|
||||
"api_key_description": "הערך הזה יוצג רק פעם אחת. נא לוודא שהעתקת אותו לפני סגירת החלון.",
|
||||
@@ -441,7 +437,7 @@
|
||||
"birthdate_set_description": "תאריך לידה משמש לחישוב הגיל של האדם הזה בזמן תצלום.",
|
||||
"blurred_background": "רקע מטושטש",
|
||||
"bugs_and_feature_requests": "באגים & בקשות לתכונות",
|
||||
"build": "גרסת בנייה",
|
||||
"build": "גרסאת בנייה",
|
||||
"build_image": "גרסת תוכנה",
|
||||
"bulk_delete_duplicates_confirmation": "האם את/ה בטוח/ה שברצונך למחוק בכמות גדולה {count, plural, one {נכס # כפול} other {# נכסים כפולים}}? זה ישמור על הנכס הכי גדול של כל קבוצה וימחק לצמיתות את כל שאר הכפילויות. את/ה לא יכול/ה לבטל את הפעולה הזו!",
|
||||
"bulk_keep_duplicates_confirmation": "האם את/ה בטוח/ה שברצונך להשאיר {count, plural, one {נכס # כפול} other {# נכסים כפולים}}? זה יפתור את כל הקבוצות הכפולות מבלי למחוק דבר.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "תגובות מושבתות",
|
||||
"confirm": "אישור",
|
||||
"confirm_admin_password": "אישור סיסמת מנהל",
|
||||
"confirm_delete_face": "האם את/ה בטוח/ה שברצונך למחוק את הפנים של {name} מהנכס?",
|
||||
"confirm_delete_shared_link": "האם את/ה בטוח/ה שברצונך למחוק את הקישור המשותף הזה?",
|
||||
"confirm_keep_this_delete_others": "כל שאר הנכסים בערימה יימחקו למעט נכס זה. האם את/ה בטוח/ה שברצונך להמשיך?",
|
||||
"confirm_password": "אשר סיסמה",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "מחק אלבום",
|
||||
"delete_api_key_prompt": "האם את/ה בטוח/ה שברצונך למחוק מפתח ה-API הזה?",
|
||||
"delete_duplicates_confirmation": "האם את/ה בטוח/ה שברצונך למחוק לצמיתות את הכפילויות האלה?",
|
||||
"delete_face": "מחק פנים",
|
||||
"delete_key": "מחק מפתח",
|
||||
"delete_library": "מחק ספרייה",
|
||||
"delete_link": "מחק קישור",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "מופעל",
|
||||
"end_date": "תאריך סיום",
|
||||
"error": "שגיאה",
|
||||
"error_delete_face": "שגיאה במחיקת פנים מנכס",
|
||||
"error_loading_image": "שגיאה בטעינת התמונה",
|
||||
"error_title": "שגיאה - משהו השתבש",
|
||||
"errors": {
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "חודש",
|
||||
"more": "עוד",
|
||||
"moved_to_trash": "הועבר לאשפה",
|
||||
"mute_memories": "השתקת זיכרונות",
|
||||
"my_albums": "האלבומים שלי",
|
||||
"name": "שם",
|
||||
"name_or_nickname": "שם או כינוי",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "נכס נמחק לצמיתות",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {נכס # נמחק} other {# נכסים נמחקו}} לצמיתות",
|
||||
"person": "אדם",
|
||||
"person_birthdate": "נולד בתאריך {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (מוסתר)} other {}}",
|
||||
"photo_shared_all_users": "נראה שאת/ה שיתפת את התמונות שלך עם כל המשתמשים או שאין לך אף משתמש לשתף איתו.",
|
||||
"photos": "תמונות",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "הסר מאלבום",
|
||||
"remove_from_favorites": "הסר מהמועדפים",
|
||||
"remove_from_shared_link": "הסר מקישור משותף",
|
||||
"remove_memory": "הסר זיכרון",
|
||||
"remove_photo_from_memory": "הסר תמונה מזיכרון זה",
|
||||
"remove_url": "הסר URL",
|
||||
"remove_user": "הסר משתמש",
|
||||
"removed_api_key": "מפתח API הוסר: {name}",
|
||||
"removed_from_archive": "הוסר מארכיון",
|
||||
"removed_from_favorites": "הוסר ממועדפים",
|
||||
"removed_from_favorites_count": "{count, plural, other {הוסרו #}} מהמועדפים",
|
||||
"removed_memory": "זיכרון הוסר",
|
||||
"removed_photo_from_memory": "התמונה הוסרה מהזיכרון",
|
||||
"removed_tagged_assets": "תג הוסר מ{count, plural, one {נכס #} other {# נכסים}}",
|
||||
"rename": "שנה שם",
|
||||
"repair": "תיקון",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "מאגר",
|
||||
"require_password": "דרוש סיסמה",
|
||||
"require_user_to_change_password_on_first_login": "דרוש מהמשתמש לשנות סיסמה בכניסה הראשונה",
|
||||
"rescan": "סרוק מחדש",
|
||||
"reset": "איפוס",
|
||||
"reset_password": "איפוס סיסמה",
|
||||
"reset_people_visibility": "אפס את נראות האנשים",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "אפשרויות חיפוש",
|
||||
"search_people": "חיפוש אנשים",
|
||||
"search_places": "חיפוש מקומות",
|
||||
"search_rating": "חיפוש לפי דירוג...",
|
||||
"search_settings": "הגדרות חיפוש",
|
||||
"search_state": "חיפוש מדינה...",
|
||||
"search_tags": "חיפוש תגים...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "מחפש אזורי שפה...",
|
||||
"second": "שנייה",
|
||||
"see_all_people": "ראה את כל האנשים",
|
||||
"select": "בחר",
|
||||
"select_album_cover": "בחר עטיפת אלבום",
|
||||
"select_all": "בחר הכל",
|
||||
"select_all_duplicates": "בחר את כל הכפילויות",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "נוצר תג: {tag}",
|
||||
"tag_feature_description": "עיון בתמונות וסרטונים שקובצו על ידי נושאי תג לוגיים",
|
||||
"tag_not_found_question": "לא מצליח למצוא תג? <link>צור תג חדש</link>",
|
||||
"tag_people": "תייג אנשים",
|
||||
"tag_updated": "תג מעודכן: {tag}",
|
||||
"tagged_assets": "תויגו {count, plural, one {נכס #} other {# נכסים}}",
|
||||
"tags": "תגים",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "בטל קישור סרטון תנועה",
|
||||
"unlink_oauth": "בטל קישור OAuth",
|
||||
"unlinked_oauth_account": "בוטל קישור חשבון OAuth",
|
||||
"unmute_memories": "בטל השתקת זיכרונות",
|
||||
"unnamed_album": "אלבום ללא שם",
|
||||
"unnamed_album_delete_confirmation": "את/ה בטוח/ה שברצונך למחוק את האלבום הזה?",
|
||||
"unnamed_share": "שיתוף ללא שם",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "הצג הכל",
|
||||
"view_all_users": "הצג את כל המשתמשים",
|
||||
"view_in_timeline": "ראה בציר הזמן",
|
||||
"view_link": "הצג קישור",
|
||||
"view_links": "הצג קישורים",
|
||||
"view_name": "הצג",
|
||||
"view_next_asset": "הצג את הנכס הבא",
|
||||
|
||||
15
i18n/hi.json
15
i18n/hi.json
@@ -13,14 +13,14 @@
|
||||
"add_a_location": "एक स्थान जोड़ें",
|
||||
"add_a_name": "नाम जोड़ें",
|
||||
"add_a_title": "एक शीर्षक जोड़ें",
|
||||
"add_exclusion_pattern": "अपवाद उदाहरण जोड़ें",
|
||||
"add_exclusion_pattern": "निषेध उदाहरण जोड़ें",
|
||||
"add_import_path": "आयात पथ जोड़ें",
|
||||
"add_location": "स्थान जोड़ें",
|
||||
"add_more_users": "अधिक उपयोगकर्ता जोड़ें",
|
||||
"add_partner": "जोड़ीदार जोड़ें",
|
||||
"add_path": "पथ जोड़ें",
|
||||
"add_photos": "फ़ोटो जोड़ें",
|
||||
"add_to": "इसमें जोड़ें…",
|
||||
"add_to": "इसमें जोड़ें..।",
|
||||
"add_to_album": "एल्बम में जोड़ें",
|
||||
"add_to_shared_album": "साझा एल्बम में जोड़ें",
|
||||
"add_url": "URL जोड़ें",
|
||||
@@ -29,17 +29,11 @@
|
||||
"added_to_favorites_count": "पसंदीदा में {count, number} जोड़ा गया",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "बहिष्करण पैटर्न जोड़ें. *, **, और ? का उपयोग करके ग्लोबिंग करना समर्थित है। \"Raw\" नामक किसी भी निर्देशिका की सभी फ़ाइलों को अनदेखा करने के लिए, \"**/Raw/**\" का उपयोग करें। \".tif\" से समाप्त होने वाली सभी फ़ाइलों को अनदेखा करने के लिए, \"**/*.tif\" का उपयोग करें। किसी पूर्ण पथ को अनदेखा करने के लिए, \"/path/to/ignore/**\" का उपयोग करें।",
|
||||
"asset_offline_description": "यह बाहरी लाइब्रेरी एसेट अब डिस्क पर मौजूद नहीं है और इसे ट्रैश में डाल दिया गया है। यदि फ़ाइल को लाइब्रेरी के भीतर कहीं ले जाया गया था, तो नई संबंधित एसेट के लिए अपनी टाइमलाइन देखें। इस एसेट को वापस पाने के लिए, कृपया सुनिश्चित करें कि नीचे दिए गए फ़ाइल पथ को इम्मिच द्वारा एक्सेस किया जा सकता है और फिर लाइब्रेरी को स्कैन करें।",
|
||||
"authentication_settings": "प्रमाणीकरण सेटिंग्स",
|
||||
"authentication_settings_description": "पासवर्ड, OAuth और अन्य प्रमाणीकरण सेटिंग्स प्रबंधित करें",
|
||||
"authentication_settings_disable_all": "क्या आप वाकई सभी लॉगिन विधियों को अक्षम करना चाहते हैं? लॉगिन पूरी तरह से अक्षम कर दिया जाएगा।",
|
||||
"authentication_settings_reenable": "पुनः सक्षम करने के लिए, <link>Server Command</link> का प्रयोग करे।",
|
||||
"background_task_job": "पृष्ठभूमि कार्य",
|
||||
"backup_database": "बैकअप डाटाबेस",
|
||||
"backup_database_enable_description": "बैकअप डेटाबेस सक्रिय करें",
|
||||
"backup_keep_last_amount": "पूर्व बैकअप क्षमता",
|
||||
"backup_settings": "बैकअप सेटिंग्स",
|
||||
"backup_settings_description": "डेटाबेस बैकअप सेटिंग्स प्रबंधन",
|
||||
"check_all": "सभी चेक करें",
|
||||
"cleared_jobs": "{job}: के लिए कार्य साफ़ कर दिए गए",
|
||||
"config_set_by_file": "Config वर्तमान में एक config फ़ाइल द्वारा सेट किया गया है",
|
||||
@@ -48,14 +42,12 @@
|
||||
"confirm_email_below": "पुष्टि करने के लिए नीचे \"{email}\" टाइप करें",
|
||||
"confirm_reprocess_all_faces": "क्या आप वाकई सभी चेहरों को दोबारा संसाधित करना चाहते हैं? इससे नामित लोग भी साफ हो जायेंगे।",
|
||||
"confirm_user_password_reset": "क्या आप वाकई {user} का पासवर्ड रीसेट करना चाहते हैं?",
|
||||
"create_job": "जॉब बनाएँ",
|
||||
"cron_expression": "क्रॉन अभिव्यक्ति",
|
||||
"disable_login": "लॉगिन अक्षम करें",
|
||||
"duplicate_detection_job_description": "समान छवियों का पता लगाने के लिए संपत्तियों पर मशीन लर्निंग चलाएं। यह कार्यक्षमता स्मार्ट खोज पर निर्भर करती है",
|
||||
"exclusion_pattern_description": "Exclusion पैटर्न आपको अपनी लाइब्रेरी को स्कैन करते समय फ़ाइलों और फ़ोल्डरों को अनदेखा करने देता है। यह उपयोगी है यदि आपके पास ऐसे फ़ोल्डर हैं जिनमें ऐसी फ़ाइलें हैं जिन्हें आप आयात नहीं करना चाहते हैं, जैसे RAW फ़ाइलें।",
|
||||
"external_library_created_at": "बाहरी लाइब्रेरी ({date} को बनाई गई)",
|
||||
"external_library_management": "बाहरी लाइब्रेरी प्रबंधन",
|
||||
"face_detection": "मुख संशोधन",
|
||||
"face_detection": "चेहरे का पहचान",
|
||||
"face_detection_description": "मशीन लर्निंग का उपयोग करके संपत्तियों में चेहरों का पता लगाएं। वीडियो के लिए, केवल थंबनेल पर विचार किया जाता है। \"सभी\" परिसंपत्तियों को (पुनः) संसाधित करता है। \"लापता\" उन परिसंपत्तियों को कतारबद्ध करता है जिन्हें अभी तक संसाधित नहीं किया गया है। फेस डिटेक्शन पूरा होने के बाद पहचाने गए चेहरों को चेहरे की पहचान के लिए कतारबद्ध किया जाएगा, उन्हें मौजूदा या नए लोगों में समूहित किया जाएगा।",
|
||||
"facial_recognition_job_description": "समूह ने लोगों में चेहरों का पता लगाया। यह चरण फेस डिटेक्शन पूरा होने के बाद चलता है। \"सभी\" चेहरों को (पुनः) समूहित करता है। \"लापता\" कतार में वे चेहरे हैं जिनके लिए कोई व्यक्ति नियुक्त नहीं है।",
|
||||
"failed_job_command": "कार्य {job} के लिए आदेश {command} विफल",
|
||||
@@ -1101,7 +1093,6 @@
|
||||
"view_album": "एल्बम देखें",
|
||||
"view_all": "सभी को देखें",
|
||||
"view_all_users": "सभी उपयोगकर्ताओं को देखें",
|
||||
"view_in_timeline": "टाइमलाइन में देखें",
|
||||
"view_links": "लिंक देखें",
|
||||
"view_next_asset": "अगली संपत्ति देखें",
|
||||
"view_previous_asset": "पिछली संपत्ति देखें",
|
||||
|
||||
@@ -288,7 +288,7 @@
|
||||
"transcoding_max_b_frames": "Maksimalni B-frameovi",
|
||||
"transcoding_max_b_frames_description": "Više vrijednosti poboljšavaju učinkovitost kompresije, ali usporavaju kodiranje. Možda nije kompatibilan s hardverskim ubrzanjem na starijim uređajima. 0 onemogućuje B-frameove, dok -1 automatski postavlja ovu vrijednost.",
|
||||
"transcoding_max_bitrate": "Maksimalne brzina prijenosa (bitrate)",
|
||||
"transcoding_max_bitrate_description": "Postavljanje maksimalne brzine prijenosa može učiniti veličine datoteka predvidljivijima uz manji trošak za kvalitetu. Pri 720p, tipične vrijednosti su 2600 kbit/s za VP9 ili HEVC ili 4500 kbit/s za H.264. Onemogućeno ako je postavljeno na 0.",
|
||||
"transcoding_max_bitrate_description": "Postavljanje maksimalne brzine prijenosa može učiniti veličine datoteka predvidljivijima uz manji trošak za kvalitetu. Pri 720p, tipične vrijednosti su 2600k za VP9 ili HEVC ili 4500k za H.264. Onemogućeno ako je postavljeno na 0.",
|
||||
"transcoding_max_keyframe_interval": "Maksimalni interval ključnih sličica",
|
||||
"transcoding_max_keyframe_interval_description": "Postavlja maksimalnu udaljenost slika između ključnih kadrova. Niže vrijednosti pogoršavaju učinkovitost kompresije, ali poboljšavaju vrijeme traženja i mogu poboljšati kvalitetu u scenama s brzim kretanjem. 0 automatski postavlja ovu vrijednost.",
|
||||
"transcoding_optimal_description": "Videozapisi koji su veći od ciljne rezolucije ili nisu u prihvatljivom formatu",
|
||||
@@ -468,7 +468,6 @@
|
||||
"comments_are_disabled": "Komentari onemogućeni",
|
||||
"confirm": "Potvrdi",
|
||||
"confirm_admin_password": "Potvrdite lozinku administratora",
|
||||
"confirm_delete_face": "Jeste li sigurni da želite izbrisati lice {name} iz knjižnice materijala.",
|
||||
"confirm_delete_shared_link": "Jeste li sigurni da želite izbrisati ovu zajedničku vezu?",
|
||||
"confirm_keep_this_delete_others": "Sva druga sredstva u nizu bit će izbrisana osim ovog sredstva. Jeste li sigurni da želite nastaviti?",
|
||||
"confirm_password": "Potvrdite lozinku",
|
||||
@@ -1253,4 +1252,4 @@
|
||||
"yes": "",
|
||||
"you_dont_have_any_shared_links": "",
|
||||
"zoom_image": ""
|
||||
}
|
||||
}
|
||||
|
||||
30
i18n/hu.json
30
i18n/hu.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Biztonsági mentés beállításai",
|
||||
"backup_settings_description": "Adatbázis mentési beállításainak kezelése",
|
||||
"check_all": "Összes Kipiálása",
|
||||
"cleanup": "Takarítás",
|
||||
"cleared_jobs": "{job}: feladatai törölve",
|
||||
"config_set_by_file": "A konfigurációt jelenleg egy konfigurációs fájl állítja be",
|
||||
"confirm_delete_library": "Biztosan ki szeretnéd törölni a {library} képtárat?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Képtár időszakos átfésülésének engedélyezése",
|
||||
"library_settings": "Külső Képtár",
|
||||
"library_settings_description": "Külső képtár beállításainak kezelése",
|
||||
"library_tasks_description": "Külső könyvtárak szkennelése új és/vagy módosított elemek után",
|
||||
"library_tasks_description": "Képtár feladatok elvégzése",
|
||||
"library_watching_enable_description": "Külső képtár változásainak figyelése",
|
||||
"library_watching_settings": "Képtár figyelése (KÍSÉRLETI)",
|
||||
"library_watching_settings_description": "Megváltozott fájlok automatikus észlelése",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Képek szemantikai keresése CLIP beágyazások segítségével",
|
||||
"machine_learning_smart_search_enabled": "Okos keresés engedélyezése",
|
||||
"machine_learning_smart_search_enabled_description": "Ha ki van kapcsolva, a képek nem lesznek átalakítva okos kereséshez.",
|
||||
"machine_learning_url_description": "Gépi tanulás szerver URL címe. Ha többi, mint egy URL van megadva, mindegyik szervert egyenként próbálja meg, amíg az egyik sikeresen nem válaszol, sorrendben az elsőtől az utólsóig. A nem válaszoló szervereket átmenetileg figyelmen kívül hagyja, amíg újra online nem lesznek.",
|
||||
"machine_learning_url_description": "Gépi tanulás szerver URL címe. Ha többi, mint egy URL van megadva, mindegyik szervert egyenként próbálja meg, amíg az egyik sikeresen nem válaszol, sorrendben az elsőtől az utólsóig.",
|
||||
"manage_concurrency": "Párhuzamos Feladatok Kezelése",
|
||||
"manage_log_settings": "Naplózási beállítások kezelése",
|
||||
"map_dark_style": "Sötét stílus",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Térkép",
|
||||
"map_settings_description": "Térkép beállítások kezelése",
|
||||
"map_style_description": "Egy style.json térképtémára mutató URL cím",
|
||||
"memory_cleanup_job": "Memória takarítás",
|
||||
"memory_generate_job": "Emlék generálálsa",
|
||||
"metadata_extraction_job": "Metaadatok kinyerése",
|
||||
"metadata_extraction_job_description": "Metaadat információk (pl. GPS, arcok és felbontás) kinyerése minden elemből",
|
||||
"metadata_faces_import_setting": "Arc importálás engedélyezése",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Engedélyezi a hash-érték ellenőrzést - csak akkor kapcsold ki, ha tisztában vagy a következményekkel",
|
||||
"storage_template_migration": "Tárhely sablon migrálása",
|
||||
"storage_template_migration_description": "A jelenlegi <link>{template}</link> alkalmazása a már feltöltött elemekre",
|
||||
"storage_template_migration_info": "A sablon az összes kiterjesztést kisbetűssé alakítja át. A megváltozott sablon csak az újonnan feltöltött elemekre vonatkozik. A korábbi elemek visszamenőleges áthelyezéséhez ezt futtasd: <link>{job}</link>.",
|
||||
"storage_template_migration_info": "A megváltozott sablon csak az újonnan feltöltött elemekre vonatkozik. A korábbi elemek visszamenőleges áthelyezéséhez ezt futtasd: <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Tárhely Sablon Migrációja",
|
||||
"storage_template_more_details": "További részletekért erről a funkcióról lásd a <template-link>Tárhely Sablon</template-link> és annak <implications-link>következményeit</implications-link> a dokumentációban",
|
||||
"storage_template_onboarding_description": "Ha ez a funkció engedélyezve van, akkor a fájlokat automatikusan az egyéni sablon alapján rendszerezi el. Stabilitási problémák miatt a funkció alapértelmezés szerint ki van kapcsolva. További információkért lásd a <link>dokumentációt</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "B-képkockák maximum száma",
|
||||
"transcoding_max_b_frames_description": "Nagyobb értékek megnövelik a tömörítés hatékonyságát, de lelassítják a kódolást. Nem minden hardvereszköz támogatja. A 0 érték kikapcsolja a B-képkockákat, míg -1 esetén a szoftver magának választ értéket.",
|
||||
"transcoding_max_bitrate": "Maximum bitráta",
|
||||
"transcoding_max_bitrate_description": "Maximum bitráta beállítása konzisztensebb fájlméretet eredményez egy kevés minőségi romlás árán. 720p esetén jellemző érték lehet 2600 kbit/s a VP9 vagy HEVC kódoláshoz, 4500 kbit/s a H.264 kódoláshoz. A 0 érték esetén nincs maximum bitráta.",
|
||||
"transcoding_max_bitrate_description": "Maximum bitráta beállítása konzisztensebb fájlméretet eredményez egy kevés minőségi romlás árán. 720p esetén jellemző érték lehet 2600k a VP9 vagy HEVC kódoláshoz, 4500k a H.264 kódoláshoz. A 0 érték esetén nincs maximum bitráta.",
|
||||
"transcoding_max_keyframe_interval": "Maximum kulcskocka intervallum",
|
||||
"transcoding_max_keyframe_interval_description": "Beállítja a kulcskockák közötti legnagyobb lehetséges távolságot. Alacsony érték csökkenti a tömörítési hatékonyságot, de lejátszás közben az előre- és hátratekerés gyorsabb, valamint javíthatja a gyorsan mozgó jelenetek képminőségét. 0 esetén a szoftver magának állítja be az értéket.",
|
||||
"transcoding_optimal_description": "A célfelbontásnál nagyobb vagy a nem elfogadott formátumú videókat",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Módosítások engedélyezése",
|
||||
"allow_public_user_to_download": "Engedélyezi a letöltést publikus felhasználó számára",
|
||||
"allow_public_user_to_upload": "Engedélyezi a feltöltést publikus felhasználó számára",
|
||||
"alt_text_qr_code": "QR kód kép",
|
||||
"anti_clockwise": "Óramutató járásával ellentétes irány",
|
||||
"api_key": "API Kulcs",
|
||||
"api_key_description": "Ez csak most az egyszer jelenik meg. Az ablak bezárása előtt feltétlenül másold.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "A megjegyzések le vannak tiltva",
|
||||
"confirm": "Jóváhagy",
|
||||
"confirm_admin_password": "Admin Jelszó Újból",
|
||||
"confirm_delete_face": "Biztos, hogy törölni szeretnéd a(z) {name} arcát az elemről?",
|
||||
"confirm_delete_shared_link": "Biztosan törölni szeretnéd ezt a megosztott linket?",
|
||||
"confirm_keep_this_delete_others": "Minden más elem a készletben törlésre kerül, kivéve ezt az elemet. Biztosan folytatni szeretnéd?",
|
||||
"confirm_password": "Jelszó megerősítése",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Album törlése",
|
||||
"delete_api_key_prompt": "Biztosan törölni szeretnéd ezt az API kulcsot?",
|
||||
"delete_duplicates_confirmation": "Biztosan véglegesen törölni szeretnéd ezeket a duplikátumokat?",
|
||||
"delete_face": "Arc törlése",
|
||||
"delete_key": "Kulcs törlése",
|
||||
"delete_library": "Képtár Törlése",
|
||||
"delete_link": "Link törlése",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Engedélyezve",
|
||||
"end_date": "Vég dátum",
|
||||
"error": "Hiba",
|
||||
"error_delete_face": "Hiba az arc törlése során",
|
||||
"error_loading_image": "Hiba a kép betöltése közben",
|
||||
"error_title": "Hiba - valami félresikerült",
|
||||
"errors": {
|
||||
@@ -809,7 +802,6 @@
|
||||
"include_shared_albums": "Megosztott albumokkal együtt",
|
||||
"include_shared_partner_assets": "Partner által megosztott elemekkel együtt",
|
||||
"individual_share": "Egymagában megosztott elem",
|
||||
"individual_shares": "Egyéni megosztások",
|
||||
"info": "Infó",
|
||||
"interval": {
|
||||
"day_at_onepm": "Minden nap 13 órakor",
|
||||
@@ -891,7 +883,6 @@
|
||||
"month": "Hónap",
|
||||
"more": "Továbbiak",
|
||||
"moved_to_trash": "Áthelyezve a lomtárba",
|
||||
"mute_memories": "Emlékek elnémítása",
|
||||
"my_albums": "Saját albumaim",
|
||||
"name": "Név",
|
||||
"name_or_nickname": "Név vagy becenév",
|
||||
@@ -987,7 +978,6 @@
|
||||
"permanently_deleted_asset": "Elem véglegesen törölve",
|
||||
"permanently_deleted_assets_count": "{count, plural, other {# elem}} véglegesen törölve",
|
||||
"person": "Személy",
|
||||
"person_birthdate": "Született: {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (rejtett)} other {}}",
|
||||
"photo_shared_all_users": "Úgy tűnik, hogy már mindenkivel megosztottad a fényképeidet, vagy nincs senki, akivel meg tudnád osztani.",
|
||||
"photos": "Fényképek",
|
||||
@@ -997,7 +987,6 @@
|
||||
"pick_a_location": "Hely választása",
|
||||
"place": "Hely",
|
||||
"places": "Helyek",
|
||||
"places_count": "{count, plural, one {{count, number} Helyszín} other {{count, number} Helyszín}}",
|
||||
"play": "Lejátszás",
|
||||
"play_memories": "Emlékek lejátszása",
|
||||
"play_motion_photo": "Mozgókép lejátszása",
|
||||
@@ -1079,16 +1068,12 @@
|
||||
"remove_from_album": "Eltávolítás az albumból",
|
||||
"remove_from_favorites": "Eltávolítás a kedvencekből",
|
||||
"remove_from_shared_link": "Eltávolítás a megosztott linkből",
|
||||
"remove_memory": "Emlék eltávolítása",
|
||||
"remove_photo_from_memory": "Kép eltávolítása az emlékből",
|
||||
"remove_url": "URL eltávolítása",
|
||||
"remove_user": "Felhasználó eltávolítása",
|
||||
"removed_api_key": "API Kulcs eltávolítva: {name}",
|
||||
"removed_from_archive": "Archívumból eltávolítva",
|
||||
"removed_from_favorites": "Kedvencekből eltávolítva",
|
||||
"removed_from_favorites_count": "A kedvencekből {count, plural, other {# elem}} eltávolítva",
|
||||
"removed_memory": "Eltávolított emlék",
|
||||
"removed_photo_from_memory": "Fotó törölve az emlékből",
|
||||
"removed_tagged_assets": "Címke eltávolítva {count, plural, one {# elemről} other {# elemről}}",
|
||||
"rename": "Átnevezés",
|
||||
"repair": "Javítás",
|
||||
@@ -1097,7 +1082,6 @@
|
||||
"repository": "Tároló",
|
||||
"require_password": "Jelszó megadása szükséges",
|
||||
"require_user_to_change_password_on_first_login": "A felhasználónak kötelező megváltoztatnia a jelszavát az első bejelentkezéskor",
|
||||
"rescan": "Újraszkennelés",
|
||||
"reset": "Visszaállítás",
|
||||
"reset_password": "Jelszó visszaállítása",
|
||||
"reset_people_visibility": "Személyek láthatóságának visszaállítása",
|
||||
@@ -1141,7 +1125,6 @@
|
||||
"search_options": "Keresési lehetőségek",
|
||||
"search_people": "Személyek keresése",
|
||||
"search_places": "Helyek keresése",
|
||||
"search_rating": "Keresés értékelés szerint...",
|
||||
"search_settings": "Keresési beállítások",
|
||||
"search_state": "Megye/Állam keresése...",
|
||||
"search_tags": "Címkék keresése...",
|
||||
@@ -1151,7 +1134,6 @@
|
||||
"searching_locales": "Helyszín keresése...",
|
||||
"second": "Másodperc",
|
||||
"see_all_people": "Minden személy megtekintése",
|
||||
"select": "Kiválsztás",
|
||||
"select_album_cover": "Albumborító kiválasztása",
|
||||
"select_all": "Összes kijelölése",
|
||||
"select_all_duplicates": "Minden duplikátum kijelölése",
|
||||
@@ -1189,7 +1171,6 @@
|
||||
"shared_from_partner": "{partner} fényképei",
|
||||
"shared_link_options": "Megosztott link beállításai",
|
||||
"shared_links": "Megosztott linkek",
|
||||
"shared_links_description": "Fényképek és videók megosztása linkkel",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# megosztott kép és videó.}}",
|
||||
"shared_with_partner": "Megosztva {partner} partnereddel",
|
||||
"sharing": "Megosztás",
|
||||
@@ -1266,7 +1247,6 @@
|
||||
"tag_created": "Létrehozott címke: {tag}",
|
||||
"tag_feature_description": "Fényképek és videók böngészése a címkék témája szerint csoportosítva",
|
||||
"tag_not_found_question": "Nem találod a címkét? Hozz létre egy <link>új címkét</link>",
|
||||
"tag_people": "Emberek címkézése",
|
||||
"tag_updated": "Frissített címke: {tag}",
|
||||
"tagged_assets": "{count, plural, one {# elem} other {# elem}} felcímkézve",
|
||||
"tags": "Címkék",
|
||||
@@ -1307,7 +1287,6 @@
|
||||
"unlink_motion_video": "Mozgókép leválasztása",
|
||||
"unlink_oauth": "OAuth leválasztása",
|
||||
"unlinked_oauth_account": "Leválasztott OAuth fiók",
|
||||
"unmute_memories": "Emlékek mutatása",
|
||||
"unnamed_album": "Névtelen Album",
|
||||
"unnamed_album_delete_confirmation": "Biztosan törölni szeretnéd ezt az albumot?",
|
||||
"unnamed_share": "Névtelen Megosztás",
|
||||
@@ -1361,7 +1340,6 @@
|
||||
"view_all": "Összes Megtekintése",
|
||||
"view_all_users": "Minden Felhasználó Megtekintése",
|
||||
"view_in_timeline": "Megtekintés az idővonalon",
|
||||
"view_link": "Link megtekintése",
|
||||
"view_links": "Linkek megtekintése",
|
||||
"view_name": "Megtekintés",
|
||||
"view_next_asset": "Következő elem megtekintése",
|
||||
|
||||
27
i18n/id.json
27
i18n/id.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Pengaturan Pencadangan",
|
||||
"backup_settings_description": "Kelola pengaturan pencadangan basis data",
|
||||
"check_all": "Periksa Semua",
|
||||
"cleanup": "Pembersihan",
|
||||
"cleared_jobs": "Tugas terselesaikan untuk: {job}",
|
||||
"config_set_by_file": "Konfigurasi saat ini ditetapkan oleh berkas konfigurasi",
|
||||
"confirm_delete_library": "Apakah Anda yakin ingin menghapus pustaka {library}?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Aktifkan pemindaian pustaka berkala",
|
||||
"library_settings": "Pustaka Eksternal",
|
||||
"library_settings_description": "Kelola pengaturan pustaka eksternal",
|
||||
"library_tasks_description": "Pindai pustaka eksternal untuk aset baru dan/atau berubah",
|
||||
"library_tasks_description": "Lakukan tugas pustaka",
|
||||
"library_watching_enable_description": "Pantau perubahan berkas dalam pustaka eksternal",
|
||||
"library_watching_settings": "Pemantauan pustaka (UJI COBA)",
|
||||
"library_watching_settings_description": "Pantau berkas yang telah diubah secara otomatis",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Cari gambar secara semantik menggunakan penyematan CLIP",
|
||||
"machine_learning_smart_search_enabled": "Aktifkan pencarian pintar",
|
||||
"machine_learning_smart_search_enabled_description": "Jika dinonaktifkan, gambar tidak akan dienkode untuk pencarian pintar.",
|
||||
"machine_learning_url_description": "URL server pembelajaran mesin. Jika lebih dari satu URL disediakan, setiap server akan dicoba satu per satu sampai salah satu berhasil merespons, dari urutan pertama sampai terakhir. Server yang tidak merespons akan diabaikan sementara sampai kembali daring.",
|
||||
"machine_learning_url_description": "URL server pembelajaran mesin. Jika lebih dari satu URL disediakan, setiap server akan dicoba satu per satu sampai salah satu berhasil merespons, dari urutan pertama sampai terakhir.",
|
||||
"manage_concurrency": "Kelola Konkurensi",
|
||||
"manage_log_settings": "Kelola pengaturan log",
|
||||
"map_dark_style": "Gaya gelap",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Peta",
|
||||
"map_settings_description": "Kelola pengaturan peta",
|
||||
"map_style_description": "URL ke tema peta style.json",
|
||||
"memory_cleanup_job": "Pembersihan memori",
|
||||
"memory_generate_job": "Pembuatan memori",
|
||||
"metadata_extraction_job": "Ekstrak metadata",
|
||||
"metadata_extraction_job_description": "Ekstrak informasi metadata dari setiap aset, seperti GPS, wajah dan resolusi",
|
||||
"metadata_faces_import_setting": "Aktifkan impor wajah",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Mengaktifkan verifikasi hash, jangan mengaktifkan ini kecuali Anda sudah tahu kekurangannya",
|
||||
"storage_template_migration": "Migrasi templat penyimpanan",
|
||||
"storage_template_migration_description": "Tetapkan <link>{template}</link> saat ini pada aset yang sebelumnya diunggah",
|
||||
"storage_template_migration_info": "Templat penyimpanan akan mengubah semua ekstensi ke huruf kecil. Perubahan templat hanya akan diterapkan pada aset baru. Untuk menerapkan templat pada setiap aset yang sebelumnya telah diunggah, jalankan <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Perubahan templat hanya akan diterapkan pada aset baru. Untuk menerapkan templat pada setiap aset yang sebelumnya telah diunggah, jalankan <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Tugas Migrasi Templat Ruang Penyimpanan",
|
||||
"storage_template_more_details": "Untuk detail lebih lanjut tentang fitur ini, pergi ke <template-link>Templat Penyimpanan</template-link> dan <implications-link>kekurangannya</implications-link>",
|
||||
"storage_template_onboarding_description": "Ketika diaktifkan, fitur ini akan mengelola berkas secara otomatis berdasarkan templat pengguna. Karena masalah stabilitas, fitur ini telah dimatikan secara bawaan. Untuk informasi lebih lanjut, silakan lihat <link>dokumentasi</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Bingkai B maksimum",
|
||||
"transcoding_max_b_frames_description": "Nilai yang lebih tinggi meningkatkan efisiensi kompresi, tetapi membuat pengodean lebih lambat. Mungkin tidak kompatibel dengan akselerasi perangkat keras pada perangkat lawas. 0 menonaktifkan bingkai B, sedangkan -1 mengatur nilai ini secara otomatis.",
|
||||
"transcoding_max_bitrate": "Kecepatan bit maksimum",
|
||||
"transcoding_max_bitrate_description": "Menetapkan kecepatan bit maksimum dapat membuat ukuran berkas lebih dapat diprediksi dengan kekurangan minor pada kualitas. Pada 720p, nilai umum adalah 2600 kbit/s untuk VP9 atau HEVC, atau 4500 kbit/s untuk H.264. Dinonaktifkan jika ditetapkan ke 0.",
|
||||
"transcoding_max_bitrate_description": "Menetapkan kecepatan bit maksimum dapat membuat ukuran berkas lebih dapat diprediksi dengan kekurangan minor pada kualitas. Pada 720p, nilai umum adalah 2600k untuk VP9 atau HEVC, atau 4500k untuk H.264. Dinonaktifkan jika ditetapkan ke 0.",
|
||||
"transcoding_max_keyframe_interval": "Interval bingkai kunci maksimum",
|
||||
"transcoding_max_keyframe_interval_description": "Menetapkan jarak bingkai maksimum antara bingkai kunci. Nilai yang lebih rendah membuat efisiensi kompresi lebih buruk, tetapi meningkatkan waktu pencarian dan dapat meningkatkan kualitas dalam adegan dengan gerakan cepat. 0 menetapkan nilai ini secara otomatis.",
|
||||
"transcoding_optimal_description": "Video lebih tinggi dari resolusi sasaran atau tidak dalam format yang diterima",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Perbolehkan penyuntingan",
|
||||
"allow_public_user_to_download": "Perbolehkan pengguna publik untuk mengunduh",
|
||||
"allow_public_user_to_upload": "Perbolehkan pengguna publik untuk mengunggah",
|
||||
"alt_text_qr_code": "Gambar kode QR",
|
||||
"anti_clockwise": "Berlawanan arah jarum jam",
|
||||
"api_key": "Kunci API",
|
||||
"api_key_description": "Nilai ini hanya akan ditampilkan sekali. Pastikan untuk menyalin sebelum menutup jendela ini.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Komentar dinonaktifkan",
|
||||
"confirm": "Konfirmasi",
|
||||
"confirm_admin_password": "Konfirmasi Kata Sandi Admin",
|
||||
"confirm_delete_face": "Apakah Anda yakin ingin menghapus wajah {name} dari aset?",
|
||||
"confirm_delete_shared_link": "Apakah Anda yakin ingin menghapus tautan terbagi ini?",
|
||||
"confirm_keep_this_delete_others": "Semua aset lain di dalam stack akan dihapus kecuali aset ini. Anda yakin untuk melanjutkan?",
|
||||
"confirm_password": "Konfirmasi kata sandi",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Hapus album",
|
||||
"delete_api_key_prompt": "Apakah Anda yakin ingin menghapus kunci API ini?",
|
||||
"delete_duplicates_confirmation": "Apakah Anda yakin ingin menghapus duplikat ini secara permanen?",
|
||||
"delete_face": "Hapus wajah",
|
||||
"delete_key": "Hapus kunci",
|
||||
"delete_library": "Hapus Pustaka",
|
||||
"delete_link": "Hapus tautan",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Diaktifkan",
|
||||
"end_date": "Tanggal akhir",
|
||||
"error": "Eror",
|
||||
"error_delete_face": "Terjadi kesalahan menghapus wajah dari aset",
|
||||
"error_loading_image": "Terjadi eror memuat gambar",
|
||||
"error_title": "Eror - Ada yang salah",
|
||||
"errors": {
|
||||
@@ -891,7 +884,6 @@
|
||||
"month": "Bulan",
|
||||
"more": "Lainnya",
|
||||
"moved_to_trash": "Dipindahkan ke sampah",
|
||||
"mute_memories": "Nonaktifkan Kenangan",
|
||||
"my_albums": "Album saya",
|
||||
"name": "Nama",
|
||||
"name_or_nickname": "Nama atau nama panggilan",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Aset dihapus secara permanen",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {# aset} other {# aset}} dihapus secara permanen",
|
||||
"person": "Orang",
|
||||
"person_birthdate": "Lahir pada {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (tersembunyi)} other {}}",
|
||||
"photo_shared_all_users": "Sepertinya Anda membagikan foto Anda dengan semua pengguna atau Anda tidak memiliki pengguna siapa pun untuk dibagikan.",
|
||||
"photos": "Foto",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Hapus dari album",
|
||||
"remove_from_favorites": "Hapus dari favorit",
|
||||
"remove_from_shared_link": "Hapus dari tautan terbagi",
|
||||
"remove_memory": "Hapus kenangan",
|
||||
"remove_photo_from_memory": "Hapus foto dari kenangan ini",
|
||||
"remove_url": "Hapus URL",
|
||||
"remove_user": "Keluarkan pengguna",
|
||||
"removed_api_key": "Kunci API Dihapus: {name}",
|
||||
"removed_from_archive": "Dihapus dari arsip",
|
||||
"removed_from_favorites": "Dihapus dari favorit",
|
||||
"removed_from_favorites_count": "{count, plural, other {Menghapus #}} dari favorit",
|
||||
"removed_memory": "Memori dihapus",
|
||||
"removed_photo_from_memory": "Foto dihapus dari memori",
|
||||
"removed_tagged_assets": "Hapus tag dari {count, plural, one {# aset} other {# aset}}",
|
||||
"rename": "Ubah nama",
|
||||
"repair": "Perbaiki",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Repositori",
|
||||
"require_password": "Memerlukan kata sandi",
|
||||
"require_user_to_change_password_on_first_login": "Memerlukan pengguna untuk mengubah kata sandi pada log masuk pertama",
|
||||
"rescan": "Pindai ulang",
|
||||
"reset": "Atur ulang",
|
||||
"reset_password": "Atur ulang kata sandi",
|
||||
"reset_people_visibility": "Atur ulang keterlihatan orang",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Pilihan pencarian",
|
||||
"search_people": "Cari orang",
|
||||
"search_places": "Cari tempat",
|
||||
"search_rating": "Cari berdasarkan penilaian...",
|
||||
"search_settings": "Pengaturan pencarian",
|
||||
"search_state": "Cari negara bagian...",
|
||||
"search_tags": "Cari tag...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Mencari lokal...",
|
||||
"second": "Detik",
|
||||
"see_all_people": "Lihat semua orang",
|
||||
"select": "Pilih",
|
||||
"select_album_cover": "Pilih kover album",
|
||||
"select_all": "Pilih semua",
|
||||
"select_all_duplicates": "Pilih semua duplikat",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Tag yang di buat: {tag}",
|
||||
"tag_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan topik tag logis",
|
||||
"tag_not_found_question": "Tidak dapat menemukan tag? <link>Buat tag baru.</link>",
|
||||
"tag_people": "Tandai Orang",
|
||||
"tag_updated": "Tag yang diperbarui: {tag}",
|
||||
"tagged_assets": "Ditandai {count, plural, one {# aset} other {# aset}}",
|
||||
"tags": "Tag",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Membatalkan tautan video gerak",
|
||||
"unlink_oauth": "Putuskan OAuth",
|
||||
"unlinked_oauth_account": "Akun OAuth terputus",
|
||||
"unmute_memories": "Aktifkan Kenangan",
|
||||
"unnamed_album": "Album Tanpa Nama",
|
||||
"unnamed_album_delete_confirmation": "Apakah kamu yakin akan menghapus album ini?",
|
||||
"unnamed_share": "Pembagian Tanpa Nama",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Tampilkan Semua",
|
||||
"view_all_users": "Tampilkan semua pengguna",
|
||||
"view_in_timeline": "Lihat di timeline",
|
||||
"view_link": "Tampilkan tautan",
|
||||
"view_links": "Tampilkan tautan",
|
||||
"view_name": "Tampilkan",
|
||||
"view_next_asset": "Tampilkan aset berikutnya",
|
||||
|
||||
59
i18n/it.json
59
i18n/it.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Impostazioni di backup",
|
||||
"backup_settings_description": "Gestisci le impostazioni dei backup",
|
||||
"check_all": "Controlla Tutto",
|
||||
"cleanup": "Pulisci",
|
||||
"cleared_jobs": "Cancellati i processi per: {job}",
|
||||
"config_set_by_file": "La configurazione è attualmente impostata da un file di configurazione",
|
||||
"confirm_delete_library": "Sei sicuro di voler cancellare la libreria {library}?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Attiva la scansione periodica della libreria",
|
||||
"library_settings": "Libreria Esterna",
|
||||
"library_settings_description": "Gestisci le impostazioni della libreria esterna",
|
||||
"library_tasks_description": "Scansiona le librerie esterne per i nuovi aggiornamenti",
|
||||
"library_tasks_description": "Esegui processi della libreria",
|
||||
"library_watching_enable_description": "Osserva le librerie esterne per cambiamenti",
|
||||
"library_watching_settings": "Osserva librerie (SPERIMENTALE)",
|
||||
"library_watching_settings_description": "Osserva automaticamente i cambiamenti dei file",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Cerca immagini semanticamente utilizzato gli embedding CLIP",
|
||||
"machine_learning_smart_search_enabled": "Attiva ricerca intelligente",
|
||||
"machine_learning_smart_search_enabled_description": "Se disabilitato le immagini non saranno codificate per la ricerca intelligente.",
|
||||
"machine_learning_url_description": "URL del server machine learning. Se sono stati forniti più di un URL, verrà testato un server alla volta finché uno non risponderà, in ordine dal primo all'ultimo. I server che non rispondono saranno temporaneamente ignorati finché non torneranno online.",
|
||||
"machine_learning_url_description": "URL del server machine learning. Se sono stati forniti più di un URL, verrà testato un server alla volta finché uno non risponderà, in ordine dal primo all'ultimo.",
|
||||
"manage_concurrency": "Gestisci Concorrenza",
|
||||
"manage_log_settings": "Gestisci le impostazioni dei log",
|
||||
"map_dark_style": "Tema scuro",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Impostazioni Mappa e Posizione",
|
||||
"map_settings_description": "Gestisci impostazioni mappa",
|
||||
"map_style_description": "URL per un tema della mappa style.json",
|
||||
"memory_cleanup_job": "pulizia memoria",
|
||||
"memory_generate_job": "Generazione della memoria",
|
||||
"metadata_extraction_job": "Estrazione Metadata",
|
||||
"metadata_extraction_job_description": "Estrai informazioni dai metadati di ciascun asset, ad esempio coordinate GPS, volti e risoluzione",
|
||||
"metadata_faces_import_setting": "Abilita l'importazione dei volti",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "B-frames Massimi",
|
||||
"transcoding_max_b_frames_description": "Valori più alti migliorano l'efficienza di compressione, ma rallentano l'encoding. Potrebbero non essere compatibili con l'accelerazione hardware su dispositivi più vecchi. 0 disabilita i B-frames, mentre -1 imposta questo valore automaticamente.",
|
||||
"transcoding_max_bitrate": "Bitrate massimo",
|
||||
"transcoding_max_bitrate_description": "Impostare un bitrate massimo può rendere le dimensioni dei file più prevedibili a un costo minore per la qualità. A 720p, i valori tipici sono 2600 kbit/s per VP9 o HEVC, o 4500 kbit/s per H.264. Disabilitato se impostato su 0.",
|
||||
"transcoding_max_bitrate_description": "Impostare un bitrate massimo può rendere le dimensioni dei file più prevedibili a un costo minore per la qualità. A 720p, i valori tipici sono 2600k per VP9 o HEVC, o 4500k per H.264. Disabilitato se impostato su 0.",
|
||||
"transcoding_max_keyframe_interval": "Intervallo massimo dei keyframe",
|
||||
"transcoding_max_keyframe_interval_description": "Imposta la distanza massima tra i keyframe. Valori più bassi peggiorano l'efficienza di compressione, però migliorano i tempi di ricerca e possono migliorare la qualità nelle scene con movimenti rapidi. 0 imposta questo valore automaticamente.",
|
||||
"transcoding_optimal_description": "Video con risoluzione più alta rispetto alla risoluzione desiderata o in formato non accettato",
|
||||
@@ -394,7 +391,6 @@
|
||||
"allow_edits": "Permetti Modifiche",
|
||||
"allow_public_user_to_download": "Permetti agli utenti pubblici di scaricare",
|
||||
"allow_public_user_to_upload": "Permetti agli utenti pubblici di caricare",
|
||||
"alt_text_qr_code": "Immagine QR",
|
||||
"anti_clockwise": "Senso anti-orario",
|
||||
"api_key": "Chiave API",
|
||||
"api_key_description": "Il valore verrà mostrato solo una volta. Assicurati di copiarlo prima di chiudere la finestra.",
|
||||
@@ -410,7 +406,7 @@
|
||||
"are_these_the_same_person": "Sono la stessa persona?",
|
||||
"are_you_sure_to_do_this": "Sei sicuro di voler procedere?",
|
||||
"asset_added_to_album": "Aggiunto all'album",
|
||||
"asset_adding_to_album": "Aggiungendo all'album…",
|
||||
"asset_adding_to_album": "In aggiunta all'album...",
|
||||
"asset_description_updated": "La descrizione del media è stata aggiornata",
|
||||
"asset_filename_is_offline": "Il media {filename} è offline",
|
||||
"asset_has_unassigned_faces": "Il media ha dei volti non categorizzati",
|
||||
@@ -484,12 +480,11 @@
|
||||
"comments_and_likes": "Commenti & mi piace",
|
||||
"comments_are_disabled": "I commenti sono disabilitati",
|
||||
"confirm": "Conferma",
|
||||
"confirm_admin_password": "Conferma password dell'amministratore",
|
||||
"confirm_delete_face": "Sei sicuro di voler cancellare il volto di {name} dall'asset?",
|
||||
"confirm_admin_password": "Conferma password amministratore",
|
||||
"confirm_delete_shared_link": "Sei sicuro di voler eliminare questo link condiviso?",
|
||||
"confirm_keep_this_delete_others": "Tutti gli altri asset nello stack saranno eliminati, eccetto questo asset. Sei sicuro di voler continuare?",
|
||||
"confirm_keep_this_delete_others": "Tutti gli altri asset nello stack saranno eliminati, eccetto questo asset. Vuoi continuare?",
|
||||
"confirm_password": "Conferma password",
|
||||
"contain": "Adatta alla finestra",
|
||||
"contain": "Adatta",
|
||||
"context": "Contesto",
|
||||
"continue": "Continua",
|
||||
"copied_image_to_clipboard": "Immagine copiata negli appunti.",
|
||||
@@ -502,8 +497,8 @@
|
||||
"copy_password": "Copia password",
|
||||
"copy_to_clipboard": "Copia negli appunti",
|
||||
"country": "Nazione",
|
||||
"cover": "Riempi la finestra",
|
||||
"covers": "Copre",
|
||||
"cover": "Riempi",
|
||||
"covers": "Miniature",
|
||||
"create": "Crea",
|
||||
"create_album": "Crea album",
|
||||
"create_library": "Crea libreria",
|
||||
@@ -514,21 +509,21 @@
|
||||
"create_new_person_hint": "Assegna gli asset selezionati a una nuova persona",
|
||||
"create_new_user": "Crea nuovo utente",
|
||||
"create_tag": "Crea tag",
|
||||
"create_tag_description": "Crea un nuovo tag. Per i tag annidati, si prega di inserire il percorso completo del tag tra cui barre oblique.",
|
||||
"create_tag_description": "Crea un nuova tag. Per i tag annidati, si prega di inserire il percorso completo del tag tra cui slash in avanti.",
|
||||
"create_user": "Crea utente",
|
||||
"created": "Creato",
|
||||
"current_device": "Dispositivo attuale",
|
||||
"current_device": "Dispositivo corrente",
|
||||
"custom_locale": "Localizzazione personalizzata",
|
||||
"custom_locale_description": "Formatta data e numeri in base alla lingua e al paese",
|
||||
"dark": "Scuro",
|
||||
"date_after": "Data dopo",
|
||||
"date_and_time": "Data e ora",
|
||||
"date_and_time": "Data e tempo",
|
||||
"date_before": "Data prima",
|
||||
"date_of_birth_saved": "Data di nascita salvata con successo",
|
||||
"date_range": "Intervallo di date",
|
||||
"day": "Giorno",
|
||||
"deduplicate_all": "Duplica Tutti",
|
||||
"deduplication_criteria_1": "Dimensione immagine in bytes",
|
||||
"deduplicate_all": "De-duplica Tutti",
|
||||
"deduplication_criteria_1": "Dimensione immagine in byte",
|
||||
"deduplication_criteria_2": "Numero di dati EXIF",
|
||||
"deduplication_info": "Informazioni di deduplicazione",
|
||||
"deduplication_info_description": "Per preselezionare automaticamente gli asset e rimuovere i duplicati in massa, verifichiamo:",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Elimina album",
|
||||
"delete_api_key_prompt": "Sei sicuro di voler eliminare questa chiave API?",
|
||||
"delete_duplicates_confirmation": "Sei sicuro di voler eliminare questi duplicati per sempre?",
|
||||
"delete_face": "cancella faccia",
|
||||
"delete_key": "Elimina chiave",
|
||||
"delete_library": "Elimina libreria",
|
||||
"delete_link": "Elimina link",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Abilitato",
|
||||
"end_date": "Data Fine",
|
||||
"error": "Errore",
|
||||
"error_delete_face": "Errore nel cancellare la faccia dalla foto",
|
||||
"error_loading_image": "Errore nel caricamento dell'immagine",
|
||||
"error_title": "Errore - Qualcosa è andato storto",
|
||||
"errors": {
|
||||
@@ -776,7 +769,7 @@
|
||||
"group_country": "Raggruppa per paese",
|
||||
"group_no": "Nessun raggruppamento",
|
||||
"group_owner": "Raggruppa in base al proprietario",
|
||||
"group_places_by": "Raggruppa posti per...",
|
||||
"group_places_by": "Raggruppa posti per",
|
||||
"group_year": "Raggruppa per anno",
|
||||
"has_quota": "Ha limite",
|
||||
"hi_user": "Ciao {name} ({email})",
|
||||
@@ -886,12 +879,11 @@
|
||||
"merged_people_count": "{count, plural, one {Unita # persona} other {Unite # persone}}",
|
||||
"minimize": "Minimizza",
|
||||
"minute": "Minuto",
|
||||
"missing": "Mancanti",
|
||||
"missing": "Mancante",
|
||||
"model": "Modello",
|
||||
"month": "Mese",
|
||||
"more": "Di più",
|
||||
"moved_to_trash": "Spostato nel cestino",
|
||||
"mute_memories": "Silenzia ricordi",
|
||||
"my_albums": "I miei album",
|
||||
"name": "Nome",
|
||||
"name_or_nickname": "Nome o soprannome",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Asset eliminato definitivamente",
|
||||
"permanently_deleted_assets_count": "Cancellati {count, plural, one {# asset} other {# assets}} definitivamente",
|
||||
"person": "Persona",
|
||||
"person_birthdate": "Nato il {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (nascosto)} other {}}",
|
||||
"photo_shared_all_users": "Sembra che tu abbia condiviso le foto con tutti gli utenti, oppure che non ci siano utenti con i quali condividerle.",
|
||||
"photos": "Foto",
|
||||
@@ -997,8 +988,8 @@
|
||||
"pick_a_location": "Scegli una posizione",
|
||||
"place": "Posizione",
|
||||
"places": "Luoghi",
|
||||
"places_count": "{count, plural, one {{count, number} Luogo} other {{count, number} Places}}",
|
||||
"play": "Riproduci",
|
||||
"places_count": "{count, plural, one {{count, number} Luogo} altro {{count, number} Luoghi}}",
|
||||
"play": "Avvia",
|
||||
"play_memories": "Avvia ricordi",
|
||||
"play_motion_photo": "Avvia Foto in movimento",
|
||||
"play_or_pause_video": "Avvia o metti in pausa il video",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Rimuovere dall'album",
|
||||
"remove_from_favorites": "Rimuovi dai preferiti",
|
||||
"remove_from_shared_link": "Rimuovi dal link condiviso",
|
||||
"remove_memory": "Rimuovi ricordo",
|
||||
"remove_photo_from_memory": "Rimuovi foto da questo ricordo",
|
||||
"remove_url": "Rimuovi URL",
|
||||
"remove_user": "Rimuovi utente",
|
||||
"removed_api_key": "Rimossa chiave API: {name}",
|
||||
"removed_from_archive": "Rimosso dall'archivio",
|
||||
"removed_from_favorites": "Rimosso dai preferiti",
|
||||
"removed_from_favorites_count": "{count, plural, one {Rimosso } other {Rimossi #}} dai preferiti",
|
||||
"removed_memory": "Memoria rimossa",
|
||||
"removed_photo_from_memory": "Foto rimossa dalla memoria",
|
||||
"removed_tagged_assets": "Rimossa etichetta {count, plural, one {# dall'asset} other {# dagli asset}}",
|
||||
"rename": "Rinomina",
|
||||
"repair": "Ripara",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Repository",
|
||||
"require_password": "Richiedi password",
|
||||
"require_user_to_change_password_on_first_login": "Richiedi all'utente di cambiare password al primo accesso",
|
||||
"rescan": "Scansiona nuovamente",
|
||||
"reset": "Ripristina",
|
||||
"reset_password": "Ripristina password",
|
||||
"reset_people_visibility": "Ripristina visibilità persone",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Opzioni Ricerca",
|
||||
"search_people": "Cerca persone",
|
||||
"search_places": "Cerca luoghi",
|
||||
"search_rating": "Cerca per valutazione...",
|
||||
"search_settings": "Cerca Impostazioni",
|
||||
"search_state": "Cerca stato...",
|
||||
"search_tags": "Cerca tag...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Cerca localizzazioni...",
|
||||
"second": "Secondo",
|
||||
"see_all_people": "Vedi tutte le persone",
|
||||
"select": "Seleziona",
|
||||
"select_album_cover": "Seleziona copertina album",
|
||||
"select_all": "Seleziona tutto",
|
||||
"select_all_duplicates": "Seleziona tutti i duplicati",
|
||||
@@ -1242,7 +1226,7 @@
|
||||
"stack_selected_photos": "Impila foto selezionate",
|
||||
"stacked_assets_count": "{count, plural, one {Raggruppato # asset} other {Raggruppati # asset}}",
|
||||
"stacktrace": "Traccia dell'errore",
|
||||
"start": "Avvia",
|
||||
"start": "Inizio",
|
||||
"start_date": "Data di inizio",
|
||||
"state": "Provincia",
|
||||
"status": "Stato",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Tag creata: {tag}",
|
||||
"tag_feature_description": "Navigazione foto e video raggruppati per argomenti tag logici",
|
||||
"tag_not_found_question": "Non riesci a trovare un tag? <link>Creane uno nuovo.</link>",
|
||||
"tag_people": "Tagga persone",
|
||||
"tag_updated": "Tag {tag} aggiornata",
|
||||
"tagged_assets": "{count, plural, one {# asset etichettato} other {# asset etichettati}}",
|
||||
"tags": "Tag",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Scollega video in movimento",
|
||||
"unlink_oauth": "Scollega OAuth",
|
||||
"unlinked_oauth_account": "Scollega account OAuth",
|
||||
"unmute_memories": "Disattiva l'audio dei ricordi",
|
||||
"unnamed_album": "Album senza nome",
|
||||
"unnamed_album_delete_confirmation": "Sei sicuro di voler eliminare questo album?",
|
||||
"unnamed_share": "Condivisione senza nome",
|
||||
@@ -1348,7 +1330,7 @@
|
||||
"variables": "Variabili",
|
||||
"version": "Versione",
|
||||
"version_announcement_closing": "Il tuo amico, Alex",
|
||||
"version_announcement_message": "Ehilà! È stata rilasciata una nuova versione di Immich. Leggi le <link>release notes</link> e assicurati che i tuoi file di configurazione siano aggiornati per evitare problemi e incongruenze, soprattutto se utilizzi WatchTower o altri strumenti per aggiornare Immich in automatico.",
|
||||
"version_announcement_message": "Ehilà! È stata rilasciata una nuova versione di Immich. Leggi le <link>note di rilascio</link> e assicurati che i tuoi file <code>docker-compose.yml</code>/<code>.env</code> siano aggiornati per evitare problemi e incongruenze, soprattutto se utilizzi WatchTower o altri strumenti per aggiornare Immich in automatico.",
|
||||
"version_history": "Storico delle Versioni",
|
||||
"version_history_item": "Versione installata {version} il {date}",
|
||||
"video": "Video",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Vedi tutto",
|
||||
"view_all_users": "Visualizza tutti gli utenti",
|
||||
"view_in_timeline": "Visualizza in timeline",
|
||||
"view_link": "Visualizza link",
|
||||
"view_links": "Visualizza i link",
|
||||
"view_name": "Visualizza",
|
||||
"view_next_asset": "Visualizza risorsa successiva",
|
||||
|
||||
@@ -256,7 +256,7 @@
|
||||
"transcoding_max_b_frames": "最大Bフレーム",
|
||||
"transcoding_max_b_frames_description": "値を高くすると圧縮効率が向上しますが、エンコード速度が遅くなります。古いデバイスのハードウェアアクセラレーションでは対応していない場合があります。\"0\" はBフレームを無効にし、\"-1\" はこの値を自動的に設定します。",
|
||||
"transcoding_max_bitrate": "最大ビットレート",
|
||||
"transcoding_max_bitrate_description": "最大ビットレートを設定すると、品質にわずかな影響を与えながらも、ファイルサイズを予測しやすくなります。720pの場合、一般的な値は VP9 や HEVC で \"2600 kbit/s\"、H.264 で \"4500 kbit/s\" です。\"0\" に設定すると無効になります。",
|
||||
"transcoding_max_bitrate_description": "最大ビットレートを設定すると、品質にわずかな影響を与えながらも、ファイルサイズを予測しやすくなります。720pの場合、一般的な値は VP9 や HEVC で \"2600k\"、H.264 で \"4500k\" です。\"0\" に設定すると無効になります。",
|
||||
"transcoding_max_keyframe_interval": "最大キーフレーム間隔",
|
||||
"transcoding_max_keyframe_interval_description": "キーフレーム間の最大フレーム間隔を設定します。値を低くすると圧縮効率が悪化しますが、シーク時間が改善され、動きの速いシーンの品質が向上する場合があります。\"0\" に設定すると、この値が自動的に設定されます。",
|
||||
"transcoding_optimal_description": "設定解像度を超える動画、または容認されていない形式の動画",
|
||||
@@ -1257,4 +1257,4 @@
|
||||
"yes": "はい",
|
||||
"you_dont_have_any_shared_links": "共有リンクはありません",
|
||||
"zoom_image": "画像を拡大"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
"image_prefer_embedded_preview": "포함된 미리 보기 선호",
|
||||
"image_prefer_embedded_preview_setting_description": "가능한 경우 이미지 처리 시 RAW 사진에 포함된 미리 보기를 사용합니다. 포함된 미리 보기는 카메라에서 생성된 것으로 카메라마다 품질이 다릅니다. 일부 이미지의 경우 더 정확한 색상이 표현될 수 있지만 반대로 더 많은 아티팩트가 있을 수도 있습니다.",
|
||||
"image_prefer_wide_gamut": "넓은 색 영역 선호",
|
||||
"image_prefer_wide_gamut_setting_description": "섬네일 이미지에 Display P3를 사용합니다. 많은 색상을 표현할 수 있어 더 정확한 표현이 가능하지만, 오래된 브라우저를 사용하는 경우 이미지가 다르게 보일 수 있습니다. 색상 왜곡을 방지하기 위해 sRGB 이미지는 이 설정이 적용되지 않습니다.",
|
||||
"image_prefer_wide_gamut_setting_description": "섬네일 이미지에 Display P3을 사용합니다. 많은 색상을 표현할 수 있어 더 정확한 표현이 가능하지만, 오래된 브라우저를 사용하는 경우 이미지가 다르게 보일 수 있습니다. 색상 왜곡을 방지하기 위해 sRGB 이미지는 이 설정이 적용되지 않습니다.",
|
||||
"image_preview_description": "메타데이터를 제거한 중간 크기의 이미지, 단일 항목을 보는 경우 및 기계 학습에 사용됨",
|
||||
"image_preview_quality_description": "1부터 100 사이의 미리보기 품질. 값이 높을수록 좋지만 파일 크기가 커져 앱의 반응성이 떨어질 수 있으며, 값이 낮으면 기계 학습의 품질이 떨어질 수 있습니다.",
|
||||
"image_preview_title": "미리보기 설정",
|
||||
@@ -131,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "CLIP 임베딩으로 자연어를 사용하여 이미지 검색",
|
||||
"machine_learning_smart_search_enabled": "스마트 검색 활성화",
|
||||
"machine_learning_smart_search_enabled_description": "비활성화된 경우 스마트 검색을 위한 이미지 처리를 진행하지 않습니다.",
|
||||
"machine_learning_url_description": "기계 학습 서버의 URL을 입력합니다. URL이 여러 개인 경우 첫 번째 서버부터 마지막까지 성공적으로 응답할 때까지 한 번에 하나씩 순서대로 요청을 시도합니다. 응답하지 않는 서버는 다시 사용 가능할 때까지 일시적으로 제외됩니다.",
|
||||
"machine_learning_url_description": "기계 학습 서버의 URL을 입럭합니다. 여러 개의 URL이 입력된 경우 모든 서버에 응답을 보낸 뒤 응답에 성공한 서버가 사용됩니다.",
|
||||
"manage_concurrency": "동시성 관리",
|
||||
"manage_log_settings": "로그 설정 관리",
|
||||
"map_dark_style": "다크 스타일",
|
||||
@@ -291,7 +291,7 @@
|
||||
"transcoding_max_b_frames": "최대 B 프레임",
|
||||
"transcoding_max_b_frames_description": "값이 높으면 압축 효율이 향상되지만 인코딩 속도가 저하됩니다. 오래된 기기의 하드웨어 가속과 호환되지 않을 수 있습니다. 0을 입력한 경우 B 프레임을 비활성화하며, -1을 입력한 경우 자동으로 설정합니다.",
|
||||
"transcoding_max_bitrate": "최대 비트레이트",
|
||||
"transcoding_max_bitrate_description": "최대 비트레이트를 지정하면 품질이 일부 저하되지만 파일 크기가 예측 가능한 수준으로 일정하게 유지됩니다. 일반적으로 720p 기준 VP9 및 HEVC는 2600 kbit/s, H.264는 4500 kbit/s를 사용합니다. 0을 입력한 경우 비활성화됩니다.",
|
||||
"transcoding_max_bitrate_description": "최대 비트레이트를 지정하면 품질이 일부 저하되지만 파일 크기가 예측 가능한 수준으로 일정하게 유지됩니다. 일반적으로 720p 기준 VP9 및 HEVC는 2600k, H.264는 4500k를 사용합니다. 0을 입력한 경우 비활성화됩니다.",
|
||||
"transcoding_max_keyframe_interval": "최대 키프레임 간격",
|
||||
"transcoding_max_keyframe_interval_description": "키프레임 사이 최대 프레임 거리를 설정합니다. 값이 낮으면 압축 효율이 저하되지만 검색 시간이 개선되고 빠른 움직임이 있는 장면에서 품질이 향상됩니다. 0을 입력한 경우 자동으로 설정합니다.",
|
||||
"transcoding_optimal_description": "목표 해상도보다 높은 동영상 또는 허용되지 않는 형식의 동영상",
|
||||
@@ -1323,4 +1323,4 @@
|
||||
"yes": "네",
|
||||
"you_dont_have_any_shared_links": "생성한 공유 링크가 없습니다.",
|
||||
"zoom_image": "이미지 확대"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"add_partner": "Pridėti partnerį",
|
||||
"add_path": "Pridėti kelią",
|
||||
"add_photos": "Pridėti nuotraukų",
|
||||
"add_to": "Pridėti į…",
|
||||
"add_to": "Pridėti į ...",
|
||||
"add_to_album": "Pridėti į albumą",
|
||||
"add_to_shared_album": "Pridėti į bendrinamą albumą",
|
||||
"add_url": "Pridėti URL",
|
||||
@@ -50,7 +50,6 @@
|
||||
"create_job": "Sukurti darbą",
|
||||
"cron_expression": "Cron išraiška",
|
||||
"cron_expression_description": "Nustatyti skanavimo intervalą naudojant cron formatą. Norėdami gauti daugiau informacijos žiūrėkite <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Išankstiniai Cron nustatymai",
|
||||
"disable_login": "Išjungti prisijungimą",
|
||||
"duplicate_detection_job_description": "Vykdykite mašininį mokymąsi panašių vaizdų aptikimui. Priklauso nuo išmaniosios paieškos",
|
||||
"exclusion_pattern_description": "Išimčių šablonai leidžia nepaisyti failų ir aplankų skenuojant jūsų biblioteką. Tai yra naudinga, jei turite aplankų su failais, kurių nenorite importuoti, pavyzdžiui, RAW failai.",
|
||||
@@ -143,8 +142,6 @@
|
||||
"map_settings": "Žemėlapis",
|
||||
"map_settings_description": "Tvarkyti žemėlapio parametrus",
|
||||
"map_style_description": "URL į style.json žemėlapio temą",
|
||||
"memory_cleanup_job": "Atsiminimų valymas",
|
||||
"memory_generate_job": "Atsiminimų generavimas",
|
||||
"metadata_extraction_job": "Metaduomenų nuskaitymas",
|
||||
"metadata_extraction_job_description": "Kiekvieno bibliotekos elemento metaduomenų nuskaitymas, tokių kaip GPS koordinatės, veidai ar rezoliucija",
|
||||
"metadata_faces_import_setting": "Įjungti veidų importą",
|
||||
@@ -907,8 +904,6 @@
|
||||
"removed_from_archive": "Pašalinta iš archyvo",
|
||||
"removed_from_favorites": "Pašalinta iš mėgstamiausių",
|
||||
"removed_from_favorites_count": "{count, plural, one {# pašalintas} few {# pašalinti} other {# pašalinta}} iš mėgstamiausių",
|
||||
"removed_memory": "Atsiminimas pašalintas",
|
||||
"removed_photo_from_memory": "Nuotrauka ištrinta iš atsiminimų",
|
||||
"removed_tagged_assets": "Žyma pašalinta iš {count, plural, one {# elemento} other {# elementų}}",
|
||||
"rename": "Pervadinti",
|
||||
"repair": "Pataisyti",
|
||||
|
||||
80
i18n/lv.json
80
i18n/lv.json
@@ -13,14 +13,14 @@
|
||||
"add_a_location": "Pievienot atrašanās vietu",
|
||||
"add_a_name": "Pievienot vārdu",
|
||||
"add_a_title": "Pievienot virsrakstu",
|
||||
"add_exclusion_pattern": "Pievienot izslēgšanas šablonu",
|
||||
"add_exclusion_pattern": "Pievienot izņēmuma šablonu",
|
||||
"add_import_path": "Pievienot importa ceļu",
|
||||
"add_location": "Pievienot lokāciju",
|
||||
"add_more_users": "Pievienot vēl lietotājus",
|
||||
"add_partner": "Pievienot partneri",
|
||||
"add_path": "Pievienot ceļu",
|
||||
"add_photos": "Pievienot fotoattēlus",
|
||||
"add_to": "Pievienot…",
|
||||
"add_to": "Pievienot ..",
|
||||
"add_to_album": "Pievienot albumam",
|
||||
"add_to_shared_album": "Pievienot koplietotam albumam",
|
||||
"add_url": "Pievienot URL",
|
||||
@@ -30,11 +30,10 @@
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "Pievienojiet izlaišanas shēmas. Aizstājējzīmju izmantoša *, **, un ? tiek atbalstīta. Lai ignorētu visus failus jebkurā direktorijā ar nosaukumu “RAW”, izmantojiet “**/RAW/**”. Lai ignorētu visus failus, kas beidzas ar “. tif”, izmantojiet “**/*. tif”. Lai ignorētu absolūto ceļu, izmantojiet “/path/to/ignore/**”.",
|
||||
"authentication_settings": "Autentifikācijas iestatījumi",
|
||||
"authentication_settings_description": "Paroļu, OAuth un citu autentifikācijas iestatījumu pārvaldība",
|
||||
"authentication_settings_description": "Pārvaldīt paroles, OAuth un citus autentifikācijas iestatījumus",
|
||||
"authentication_settings_disable_all": "Vai tiešām vēlaties atspējot visas pieteikšanās metodes? Pieteikšanās tiks pilnībā atspējota.",
|
||||
"authentication_settings_reenable": "Lai atkārtoti iespējotu, izmantojiet <link>Servera Komandu</link>.",
|
||||
"background_task_job": "Fona Uzdevumi",
|
||||
"backup_settings_description": "Datubāzes dublēšanas iestatījumu pārvaldība",
|
||||
"check_all": "Pārbaudīt Visu",
|
||||
"cleared_jobs": "Notīrīti uzdevumi priekš: {job}",
|
||||
"config_set_by_file": "Konfigurāciju pašlaik iestata konfigurācijas fails",
|
||||
@@ -50,7 +49,7 @@
|
||||
"external_library_management": "Ārējo bibliotēku pārvaldība",
|
||||
"face_detection": "Seju noteikšana",
|
||||
"image_format": "Formāts",
|
||||
"image_format_description": "WebP veido mazākus failus nekā JPEG, taču to kodēšana ir lēnāka.",
|
||||
"image_format_description": "",
|
||||
"image_prefer_embedded_preview": "",
|
||||
"image_prefer_embedded_preview_setting_description": "",
|
||||
"image_prefer_wide_gamut": "",
|
||||
@@ -62,14 +61,14 @@
|
||||
"image_thumbnail_title": "Sīktēlu iestatījumi",
|
||||
"job_created": "Uzdevums izveidots",
|
||||
"job_settings": "Uzdevumu iestatījumi",
|
||||
"job_settings_description": "Uzdevumu izpildes vienlaicīguma pārvaldība",
|
||||
"job_settings_description": "Pārvaldīt uzdevumu izpildes vienlaicīgumu",
|
||||
"job_status": "Uzdevumu statuss",
|
||||
"library_deleted": "Bibliotēka dzēsta",
|
||||
"library_scanning": "",
|
||||
"library_scanning_description": "",
|
||||
"library_scanning_enable_description": "",
|
||||
"library_settings": "",
|
||||
"library_settings_description": "Ārējo bibliotēku iestatījumu pārvaldība",
|
||||
"library_settings_description": "",
|
||||
"library_tasks_description": "",
|
||||
"library_watching_enable_description": "",
|
||||
"library_watching_settings": "",
|
||||
@@ -96,33 +95,28 @@
|
||||
"machine_learning_min_recognized_faces": "",
|
||||
"machine_learning_min_recognized_faces_description": "",
|
||||
"machine_learning_settings": "Mašīnmācīšanās iestatījumi",
|
||||
"machine_learning_settings_description": "Mašīnmācīšanās funkciju un iestatījumu pārvaldība",
|
||||
"machine_learning_settings_description": "",
|
||||
"machine_learning_smart_search": "Viedā meklēšana",
|
||||
"machine_learning_smart_search_description": "",
|
||||
"machine_learning_smart_search_enabled_description": "",
|
||||
"machine_learning_url_description": "Mašīnmācīšanās servera URL",
|
||||
"manage_concurrency": "Vienlaicīgas darbības pārvaldība",
|
||||
"manage_log_settings": "Žurnāla iestatījumu pārvaldība",
|
||||
"manage_log_settings": "",
|
||||
"map_dark_style": "",
|
||||
"map_enable_description": "",
|
||||
"map_gps_settings": "Kartes un GPS iestatījumi",
|
||||
"map_gps_settings_description": "Karšu un GPS (apgrieztās ģeokodēšanas) iestatījumu pārvaldība",
|
||||
"map_gps_settings_description": "Pārvaldīt karšu un GPS (apgrieztās ģeokodēšanas) iestatījumus",
|
||||
"map_light_style": "",
|
||||
"map_manage_reverse_geocoding_settings": "<link>Reversās ģeokodēšanas</link> iestatījumu pārvaldība",
|
||||
"map_reverse_geocoding": "",
|
||||
"map_reverse_geocoding_enable_description": "",
|
||||
"map_reverse_geocoding_settings": "",
|
||||
"map_settings": "Karte",
|
||||
"map_settings_description": "Kartes iestatījumu pārvaldība",
|
||||
"map_settings_description": "",
|
||||
"map_style_description": "",
|
||||
"metadata_extraction_job": "Metadatu iegūšana",
|
||||
"metadata_extraction_job_description": "",
|
||||
"metadata_settings": "Metadatu iestatījumi",
|
||||
"metadata_settings_description": "Metadatu iestatījumu pārvaldība",
|
||||
"migration_job": "Migrācija",
|
||||
"migration_job_description": "",
|
||||
"no_paths_added": "Nav pievienots neviens ceļš",
|
||||
"no_pattern_added": "Nav pievienots neviens izslēgšanas šablons",
|
||||
"note_cannot_be_changed_later": "PIEZĪME: Vēlāk to vairs nevar mainīt!",
|
||||
"notification_email_from_address": "No adreses",
|
||||
"notification_email_from_address_description": "Sūtītāja e-pasta adrese, piemēram: “Immich foto serveris <noreply@example.com>”",
|
||||
@@ -139,7 +133,7 @@
|
||||
"notification_email_username_description": "",
|
||||
"notification_enable_email_notifications": "",
|
||||
"notification_settings": "Paziņojumu iestatījumi",
|
||||
"notification_settings_description": "Paziņojumu iestatījumu, tostarp e-pasta, pārvaldība",
|
||||
"notification_settings_description": "",
|
||||
"oauth_auto_launch": "",
|
||||
"oauth_auto_launch_description": "",
|
||||
"oauth_auto_register": "",
|
||||
@@ -156,17 +150,17 @@
|
||||
"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_settings_description": "",
|
||||
"oauth_signing_algorithm": "Parakstīšanas algoritms",
|
||||
"oauth_storage_label_claim": "",
|
||||
"oauth_storage_label_claim_description": "",
|
||||
"oauth_storage_quota_claim": "",
|
||||
"oauth_storage_quota_claim_description": "",
|
||||
"oauth_storage_quota_default": "Noklusējuma krātuves kvota (GiB)",
|
||||
"oauth_storage_quota_default": "",
|
||||
"oauth_storage_quota_default_description": "",
|
||||
"password_enable_description": "Pieteikšanās ar e-pasta adresi un paroli",
|
||||
"password_settings": "Pieteikšanās ar paroli",
|
||||
"password_settings_description": "Pieteikšanās ar paroli iestatījumu pārvaldība",
|
||||
"password_settings_description": "Pārvaldīt pieteikšanās ar paroli iestatījumus",
|
||||
"person_cleanup_job": "Personu tīrīšana",
|
||||
"quota_size_gib": "Kvotas izmērs (GiB)",
|
||||
"registration": "Administratora reģistrācija",
|
||||
@@ -177,27 +171,23 @@
|
||||
"server_external_domain_settings": "",
|
||||
"server_external_domain_settings_description": "",
|
||||
"server_settings": "Servera iestatījumi",
|
||||
"server_settings_description": "Servera iestatījumu pārvaldība",
|
||||
"server_settings_description": "Pārvaldīt servera iestatījumus",
|
||||
"server_welcome_message": "",
|
||||
"server_welcome_message_description": "",
|
||||
"sidecar_job_description": "",
|
||||
"slideshow_duration_description": "",
|
||||
"smart_search_job_description": "",
|
||||
"storage_template_date_time_sample": "Laika paraugs {date}",
|
||||
"storage_template_enable_description": "",
|
||||
"storage_template_hash_verification_enabled": "",
|
||||
"storage_template_hash_verification_enabled_description": "",
|
||||
"storage_template_migration": "Krātuves veidņu migrācija",
|
||||
"storage_template_migration_job": "Krātuves veidņu migrācijas uzdevums",
|
||||
"storage_template_settings": "Krātuves veidne",
|
||||
"storage_template_migration_job": "",
|
||||
"storage_template_settings": "",
|
||||
"storage_template_settings_description": "",
|
||||
"system_settings": "Sistēmas iestatījumi",
|
||||
"template_email_settings_description": "Pielāgotu e-pasta paziņojumu veidņu pārvaldība",
|
||||
"template_settings_description": "Pielāgotu paziņojumu veidņu pārvaldība",
|
||||
"theme_custom_css_settings": "Pielāgots CSS",
|
||||
"theme_custom_css_settings_description": "",
|
||||
"theme_settings": "",
|
||||
"theme_settings_description": "Immich tīmekļa saskarnes pielāgojumu pārvaldība",
|
||||
"theme_settings_description": "",
|
||||
"thumbnail_generation_job_description": "",
|
||||
"transcoding_acceleration_api": "",
|
||||
"transcoding_acceleration_api_description": "",
|
||||
@@ -256,14 +246,14 @@
|
||||
"trash_number_of_days": "Dienu skaits",
|
||||
"trash_number_of_days_description": "",
|
||||
"trash_settings": "",
|
||||
"trash_settings_description": "Atkritnes iestatījumu pārvaldība",
|
||||
"trash_settings_description": "",
|
||||
"user_delete_delay_settings": "",
|
||||
"user_delete_delay_settings_description": "",
|
||||
"user_management": "Lietotāju pārvaldība",
|
||||
"user_password_has_been_reset": "Lietotāja parole ir atiestatīta:",
|
||||
"user_restore_description": "<b>{user}</b> konts tiks atjaunots.",
|
||||
"user_settings": "",
|
||||
"user_settings_description": "Lietotāju iestatījumu pārvaldība",
|
||||
"user_settings_description": "",
|
||||
"version_check_enabled_description": "Ieslēgt versijas pārbaudi",
|
||||
"version_check_implications": "Versiju pārbaudes funkcija ir atkarīga no periodiskas saziņas ar github.com",
|
||||
"version_check_settings": "Versijas pārbaude",
|
||||
@@ -309,13 +299,12 @@
|
||||
"asset_offline": "",
|
||||
"asset_uploading": "Augšupielādē...",
|
||||
"assets": "aktīvi",
|
||||
"authorized_devices": "Autorizētās ierīces",
|
||||
"authorized_devices": "",
|
||||
"back": "Atpakaļ",
|
||||
"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ī.",
|
||||
"blurred_background": "",
|
||||
"bugs_and_feature_requests": "Kļūdas un funkciju pieprasījumi",
|
||||
"camera": "",
|
||||
"camera_brand": "",
|
||||
"camera_model": "",
|
||||
@@ -337,13 +326,12 @@
|
||||
"clear": "Notīrīt",
|
||||
"clear_all": "Notīrīt visu",
|
||||
"clear_message": "",
|
||||
"clear_value": "Notīrīt vērtību",
|
||||
"clockwise": "Pulksteņrādītāja virzienā",
|
||||
"clear_value": "",
|
||||
"close": "Aizvērt",
|
||||
"collapse": "Sakļaut",
|
||||
"collapse_all": "Sakļaut visu",
|
||||
"color": "Krāsa",
|
||||
"color_theme": "Krāsu tēma",
|
||||
"color_theme": "",
|
||||
"comment_deleted": "Komentārs dzēsts",
|
||||
"comment_options": "",
|
||||
"comments_are_disabled": "",
|
||||
@@ -408,7 +396,6 @@
|
||||
"done": "Gatavs",
|
||||
"download": "Lejupielādēt",
|
||||
"download_settings": "Lejupielāde",
|
||||
"download_settings_description": "Ar failu lejupielādi saistīto iestatījumu pārvaldība",
|
||||
"downloading": "",
|
||||
"duplicates": "Dublikāti",
|
||||
"duration": "",
|
||||
@@ -501,7 +488,6 @@
|
||||
"favorite_or_unfavorite_photo": "",
|
||||
"favorites": "Izlase",
|
||||
"feature_photo_updated": "",
|
||||
"features_setting_description": "Lietotnes funkciju pārvaldība",
|
||||
"file_name": "",
|
||||
"file_name_or_extension": "",
|
||||
"filename": "",
|
||||
@@ -571,13 +557,13 @@
|
||||
"loop_videos": "",
|
||||
"loop_videos_description": "Iespējot, lai automātiski videoklips tiktu cikliski palaists detaļu skatītājā.",
|
||||
"make": "Firma",
|
||||
"manage_shared_links": "Kopīgoto saišu pārvaldība",
|
||||
"manage_sharing_with_partners": "Koplietošanas ar partneriem pārvaldība",
|
||||
"manage_the_app_settings": "Lietotnes iestatījumu pārvaldība",
|
||||
"manage_your_account": "Sava konta pārvaldība",
|
||||
"manage_your_api_keys": "API atslēgu pārvaldība",
|
||||
"manage_your_devices": "Pieslēgto ierīču pārvaldība",
|
||||
"manage_your_oauth_connection": "OAuth savienojumu pārvaldība",
|
||||
"manage_shared_links": "Pārvaldīt Kopīgotās saites",
|
||||
"manage_sharing_with_partners": "",
|
||||
"manage_the_app_settings": "",
|
||||
"manage_your_account": "",
|
||||
"manage_your_api_keys": "",
|
||||
"manage_your_devices": "",
|
||||
"manage_your_oauth_connection": "",
|
||||
"map": "Karte",
|
||||
"map_marker_for_images": "Kartes marķieris attēliem, kas uzņemti {city}, {country}",
|
||||
"map_marker_with_image": "Kartes marķieris ar attēlu",
|
||||
@@ -631,7 +617,7 @@
|
||||
"notes": "Piezīmes",
|
||||
"notification_toggle_setting_description": "Ieslēgt e-pasta paziņojumus",
|
||||
"notifications": "Paziņojumi",
|
||||
"notifications_setting_description": "Paziņojumu pārvaldība",
|
||||
"notifications_setting_description": "",
|
||||
"oauth": "OAuth",
|
||||
"official_immich_resources": "Oficiālie Immich resursi",
|
||||
"offline": "Bezsaistē",
|
||||
@@ -701,7 +687,6 @@
|
||||
"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",
|
||||
"reaction_options": "",
|
||||
"read_changelog": "Lasīt izmaiņu sarakstu",
|
||||
"recent": "",
|
||||
@@ -833,7 +818,7 @@
|
||||
"status": "Statuss",
|
||||
"stop_motion_photo": "",
|
||||
"stop_photo_sharing": "Beigt kopīgot jūsu fotogrāfijas?",
|
||||
"storage": "Vieta krātuvē",
|
||||
"storage": "Uzglabāšanas vieta",
|
||||
"storage_label": "",
|
||||
"storage_usage": "{used} no {available} izmantoti",
|
||||
"submit": "Iesniegt",
|
||||
@@ -883,7 +868,6 @@
|
||||
"usage": "Lietojums",
|
||||
"user": "Lietotājs",
|
||||
"user_id": "Lietotāja ID",
|
||||
"user_purchase_settings_description": "Pirkuma pārvaldība",
|
||||
"user_usage_detail": "Informācija par lietotāju lietojumu",
|
||||
"username": "Lietotājvārds",
|
||||
"users": "Lietotāji",
|
||||
|
||||
63
i18n/mr.json
63
i18n/mr.json
@@ -1,62 +1 @@
|
||||
{
|
||||
"about": "विषयी",
|
||||
"account": "खाते",
|
||||
"account_settings": "खाते व्यवस्था",
|
||||
"acknowledge": "मान्यता",
|
||||
"action": "कृती",
|
||||
"actions": "कृत्ये",
|
||||
"active": "सक्रिय",
|
||||
"activity": "गतिविधि",
|
||||
"activity_changed": "गतिविधि {enabled, select, true {enabled} other {disabled}}",
|
||||
"add": "जोडा",
|
||||
"add_a_description": "वर्णन करा",
|
||||
"add_a_location": "एक स्थळ टाका",
|
||||
"add_a_name": "नाव टाका",
|
||||
"add_a_title": "शीर्षक टाका",
|
||||
"add_exclusion_pattern": "अपवाद नमुना जोडा",
|
||||
"add_import_path": "आयात मार्ग टाका",
|
||||
"add_location": "स्थळ टाका",
|
||||
"add_more_users": "अधिक वापरकर्ते जोडा",
|
||||
"add_partner": "भागीदार जोडा",
|
||||
"add_path": "मार्ग टाका",
|
||||
"add_photos": "छायाचित्रे जोडा",
|
||||
"add_to": "त्या मध्ये जोडा…",
|
||||
"add_to_album": "संग्रहात टाका",
|
||||
"add_to_shared_album": "सामायिक संग्रहात टाका",
|
||||
"add_url": "URL जोडा",
|
||||
"added_to_archive": "संग्रहालयात जोडले",
|
||||
"added_to_favorites": "आवडत्यात टाकले",
|
||||
"added_to_favorites_count": "आवडत्यात {count, number} टाकले",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "अपवाद अनुकूलन जोडा. ** आणि ? या उपयोगात ग्लोबिंग समर्थित आहे. कोणत्याही \"Raw\" नावाच्या निर्देशिकेमधील सर्व खतावण्या दुर्लक्षीत करण्यासाठी \"/Raw/\" वापरा. \".tif\" या सामान्य पथावर समाप्त असलेल्या सर्व खतावण्या दुर्लक्षीत करण्यासाठी \"**/.tif\" वापरा. विशिष्ट पथ दुर्लक्ष करण्यासाठी \"/path/to/ignore/**\" वापरा.",
|
||||
"asset_offline_description": "ही बाह्य संग्रहालय संसाधने डिस्कवर नाहीत आणि ट्रॅशमध्ये विस्थापित केली गेली आहेत. जर फाइल संग्रहालयामध्ये विस्थापित केली गेली आहे, तर नवीन संगत संसाधन किंव्हा रोजीनिशी मध्ये तपासा. हा संसाधन वापर करण्यासाठी कृपया निम्नलिखित खतावणी पथाला इम्मीच द्वारा वापरू शकतो याची तपासणी करा आणि तो संग्रहालय चाळा.",
|
||||
"authentication_settings": "प्रमाणीकरण साधक",
|
||||
"authentication_settings_description": "परवलीचा शब्द, OAuth आणि अन्य प्रमाणीकरण प्रबंधन करा",
|
||||
"authentication_settings_disable_all": "तुम्हाला खात्री आहे की तुम्ही सर्व प्रवेश पद्धती बंद करू इच्छिता? प्रवेश पूर्णपणे बंद होइल!.",
|
||||
"authentication_settings_reenable": "परत चालू करण्यासाठी <link> Server Command</link> वापरा.",
|
||||
"background_task_job": "पृष्ठभूमि कार्य",
|
||||
"backup_database": "माहिती संचयाची सुरक्षित प्रत करा",
|
||||
"backup_database_enable_description": "माहिती संचयाच्या प्रतिलिपी चालू करा",
|
||||
"backup_keep_last_amount": "पूर्वीच्या किती प्रतिलिपी ठेवायच्या",
|
||||
"backup_settings": "प्रतिलिपी व्यवस्था",
|
||||
"backup_settings_description": "माहिती संचय प्रतिलिपी व्यवस्थापन",
|
||||
"check_all": "सर्व तपासा",
|
||||
"cleared_jobs": "{job}: च्या कार्यवाह्या काढल्या",
|
||||
"config_set_by_file": "संरचना सध्या संरचना खतावणीद्वारे निश्चित केली आहे",
|
||||
"confirm_delete_library": "तुम्हाला नक्की हे {library} संग्रहालय हटवायचे आहे का?",
|
||||
"confirm_delete_library_assets": "तुम्हाला नक्की हे संग्रहालय हटवायचे आहे का? इम्मीच मधून {count, plural, one {# contained asset} other {all # contained assets}} काढले जातील, आणि पूर्ववत करता येणार नाहीत. छायाचित्रे डिस्क वर राहतील.",
|
||||
"confirm_email_below": "पुष्टी करण्या साठी, खाली \"{email}\" टंकलिखित करा",
|
||||
"confirm_reprocess_all_faces": "तुम्हाला खात्री आहे का की तुम्हाला सर्व चेहऱ्यांवर पुन्हा प्रक्रिया करायची आहे? यामुळे नाव दिलेले लोकही साफ होतील.",
|
||||
"confirm_user_password_reset": "तुम्हाला नक्की {user} चा परवलीचा शब्द बदलायचा आहे का?",
|
||||
"create_job": "कार्य बनवा",
|
||||
"cron_expression": "वेळापत्रक सूत्र",
|
||||
"cron_expression_description": "चाळन्याचे वेळापत्रक क्रॉन पद्धती ने करा. अधिक माहिती साठी पहा: <link> क्रॉन गुरु</link>",
|
||||
"cron_expression_presets": "पूर्वनिर्धारित वेळापत्रक सूत्रे",
|
||||
"disable_login": "प्रवेशाधिकर वर्ज्य करा",
|
||||
"duplicate_detection_job_description": "सारख्या छायाचित्रांचा शोध घेण्यासाठी यांत्रिकी प्रशिक्षण द्या. ही कार्यक्षमता चतुर शोधप्रणालीवर अवलंबून आहे",
|
||||
"exclusion_pattern_description": "आपले संग्रहालय चाळताना अपवाद नमुने आपल्याला खतावण्या आणि र्निर्देशिकेला दुर्लक्षीत करू देतात. आपल्याकडे कच्च्या खतावण्या सारख्या आयात करू इच्छित नसलेल्या असंपादित (RAW) खतावण्या असलेल्या निर्देशिका असल्यास हे उपयुक्त आहे.",
|
||||
"external_library_created_at": "बाह्य संग्रहालय ({date} रोजी बनवले गेले)",
|
||||
"external_library_management": "बाह्य संग्रहालय व्यवस्थापन",
|
||||
"face_detection": "मुख संशोधन"
|
||||
}
|
||||
}
|
||||
{}
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Bingkai-B maksimum",
|
||||
"transcoding_max_b_frames_description": "Nilai yang lebih tinggi meningkatkan kecekapan mampatan, tetapi memperlahankan pengekodan. Mungkin tidak serasi dengan pecutan perkakasan pada peranti lama. 0 melumpuhkan bingkai B, manakala -1 menetapkan nilai ini secara automatik.",
|
||||
"transcoding_max_bitrate": "Kadar bit maksimum",
|
||||
"transcoding_max_bitrate_description": "Menetapkan kadar bit maksima boleh menjadikan saiz fail lebih boleh diramal dengan kekurangan yang kecil kepada kualiti. Pada 720p, nilai biasa ialah 2600 kbit/s untuk VP9 atau HEVC, atau 4500 kbit/s untuk H.264. Dilumpuhkan jika ditetapkan kepada 0.",
|
||||
"transcoding_max_bitrate_description": "Menetapkan kadar bit maksima boleh menjadikan saiz fail lebih boleh diramal dengan kekurangan yang kecil kepada kualiti. Pada 720p, nilai biasa ialah 2600k untuk VP9 atau HEVC, atau 4500k untuk H.264. Dilumpuhkan jika ditetapkan kepada 0.",
|
||||
"transcoding_max_keyframe_interval": "Selangan keyframe maksimum",
|
||||
"transcoding_max_keyframe_interval_description": "Menetapkan jarak bingkai maksimum antara keyframes. Nilai yang lebih rendah memburukkan kecekapan mampatan, tetapi menambah baik masa carian dan mungkin meningkatkan kualiti dalam adegan dengan pergerakan pantas. 0 menetapkan nilai ini secara automatik.",
|
||||
"transcoding_optimal_description": "Video yang lebih tinggi daripada resolusi sasaran atau tidak dalam format yang diterima",
|
||||
@@ -372,4 +372,4 @@
|
||||
"yes": "Ya",
|
||||
"you_dont_have_any_shared_links": "Anda tidak mempunyai apa-apa pautan yang dikongsi",
|
||||
"zoom_image": "Zum Gambar"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Backupinnstillinger",
|
||||
"backup_settings_description": "Håndter innstillinger for databasebackup",
|
||||
"check_all": "Merk Alle",
|
||||
"cleanup": "Opprydding",
|
||||
"cleared_jobs": "Ryddet opp jobber for: {job}",
|
||||
"config_set_by_file": "Konfigurasjonen er for øyeblikket satt av en konfigurasjonsfil",
|
||||
"confirm_delete_library": "Er du sikker på at du vil slette biblioteket {library}?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Aktiver periodisk skanning av bibliotek",
|
||||
"library_settings": "Eksternt bibliotek",
|
||||
"library_settings_description": "Administrer innstillinger for eksterne bibliotek",
|
||||
"library_tasks_description": "Skann eksterne biblioteker for nye og/eller endrede ressurser",
|
||||
"library_tasks_description": "Utfør bibliotekoppgaver",
|
||||
"library_watching_enable_description": "Overvåk eksterne bibliotek for filendringer",
|
||||
"library_watching_settings": "Overvåkning av bibliotek (EKSPERIMENTELL)",
|
||||
"library_watching_settings_description": "Se automatisk etter endrede filer",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Søk etter bilder semantisk ved å bruke CLIP-embeddings",
|
||||
"machine_learning_smart_search_enabled": "Aktiver smart søk",
|
||||
"machine_learning_smart_search_enabled_description": "Hvis deaktivert, vil bilder ikke bli enkodet for smart søk.",
|
||||
"machine_learning_url_description": "URL til maskinlærings-serveren. Hvis mer enn en URL er lagt inn, hver server vill bli forsøkt en om gangen frem til en svarer suksessfullt, i rekkefølge fra først til sist. Servere som ikke svarer vil midlertidig bli oversett frem til dem svarer igjen.",
|
||||
"machine_learning_url_description": "URL til maskinlærings-serveren. Hvis mer enn en URL er lagt inn, hver server vill bli forsøkt en om gangen frem til en svarer suksessfullt, i rekkefølge fra først til sist.",
|
||||
"manage_concurrency": "Administrer samtidighet",
|
||||
"manage_log_settings": "Administrer logginnstillinger",
|
||||
"map_dark_style": "Mørk stil",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Innstillinger for kart og GPS",
|
||||
"map_settings_description": "Administrer kartinnstillinger",
|
||||
"map_style_description": "URL til et style.json-karttema",
|
||||
"memory_cleanup_job": "Minneopprydding",
|
||||
"memory_generate_job": "Minnegenerering",
|
||||
"metadata_extraction_job": "Hent metadata",
|
||||
"metadata_extraction_job_description": "Hent metadatainformasjon fra hver fil, for eksempel GPS-posisjon og oppløsning",
|
||||
"metadata_faces_import_setting": "Aktiver ansikts importering",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Aktiver hasjverifisering. Ikke deaktiver dette med mindre du er sikker på konsekvensene",
|
||||
"storage_template_migration": "Lagringsmal migrering",
|
||||
"storage_template_migration_description": "Bruk gjeldende <link>{template}</link> på tidligere opplastede bilder",
|
||||
"storage_template_migration_info": "Lagringsmalen vil endre filtypen til små bokstaver. Malendringer vil kun gjelde nye ressurser. For å anvende malen på tidligere opplastede ressurser, kjør <link>{job}</link>.",
|
||||
"storage_template_migration_info": "Malendringer vil kun gjelde nye ressurser. For å anvende malen på tidligere opplastede ressurser, kjør <link>{job}</link>.",
|
||||
"storage_template_migration_job": "Migreringsjobb for lagringsmal",
|
||||
"storage_template_more_details": "For mer informasjon om denne funksjonen, se <template-link>lagringsmalen</template-link> og dens <implications-link>konsekvenser</implications-link>",
|
||||
"storage_template_onboarding_description": "Når aktivert, vil denne funksjonen automatisk organisere filer basert på en brukerdefinert mal. På grunn av stabilitetsproblemer er funksjonen deaktivert som standard. For mer informasjon, se <link>documentation</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maksimalt antall B-frames",
|
||||
"transcoding_max_b_frames_description": "Høyere verdier forbedrer komprimeringseffektiviteten, men senker ned kodingen. Kan være inkompatibelt med maskinvareakselerasjon på eldre enheter. 0 deaktiverer B-rammer, mens -1 setter verdien automatisk.",
|
||||
"transcoding_max_bitrate": "Maksimal bithastighet",
|
||||
"transcoding_max_bitrate_description": "Å sette en maksimal bithastighet kan gjøre filstørrelsene mer forutsigbare med en liten kostnad for kvaliteten. For 720p er typiske verdier 2600 kbit/s for VP9 eller HEVC, eller 4500 kbit/s for H.264. Deaktivert hvis satt til 0.",
|
||||
"transcoding_max_bitrate_description": "Å sette en maksimal bithastighet kan gjøre filstørrelsene mer forutsigbare med en liten kostnad for kvaliteten. For 720p er typiske verdier 2600k for VP9 eller HEVC, eller 4500k for H.264. Deaktivert hvis satt til 0.",
|
||||
"transcoding_max_keyframe_interval": "Maksimal referansebilde intervall",
|
||||
"transcoding_max_keyframe_interval_description": "Setter maksimalt antall bilder mellom referansebilder. Lavere verdier reduserer kompresjonseffektiviteten, men forbedrer søketider og kan forbedre kvaliteten i scener med rask bevegelse. 0 setter verdien automatisk.",
|
||||
"transcoding_optimal_description": "Videoer som har høyere oppløsning enn målopppløsningen eller som ikke er i et akseptert format",
|
||||
@@ -394,12 +391,11 @@
|
||||
"allow_edits": "Tillat redigering",
|
||||
"allow_public_user_to_download": "Tillat uautentiserte brukere å laste ned",
|
||||
"allow_public_user_to_upload": "Tillat uautentiserte brukere å laste opp",
|
||||
"alt_text_qr_code": "QR-kodebilde",
|
||||
"anti_clockwise": "Mot klokken",
|
||||
"api_key": "API Nøkkel",
|
||||
"api_key_description": "Denne verdien vil vises kun én gang. Pass på å kopiere den før du lukker vinduet.",
|
||||
"api_key_empty": "API-nøkkelnavnet bør ikke være tomt",
|
||||
"api_keys": "API-nøkler",
|
||||
"api_key_empty": "API Key-navnet bør ikke være tomt",
|
||||
"api_keys": "API Nøkkler",
|
||||
"app_settings": "Appinstillinger",
|
||||
"appears_in": "Vises i",
|
||||
"archive": "Arkiver",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Kommentarer er deaktivert",
|
||||
"confirm": "Bekreft",
|
||||
"confirm_admin_password": "Bekreft administratorpassord",
|
||||
"confirm_delete_face": "Er du sikker på at du vil slette {name} sitt ansikt fra ativia?",
|
||||
"confirm_delete_shared_link": "Er du sikker på at du vil slette denne delte lenken?",
|
||||
"confirm_keep_this_delete_others": "Alle andre ressurser i denne stabelen vil bli slettet bortsett fra denne ressursen. Er du sikker på at du vil fortsette?",
|
||||
"confirm_password": "Bekreft passord",
|
||||
@@ -538,7 +533,6 @@
|
||||
"delete_album": "Slett album",
|
||||
"delete_api_key_prompt": "Er du sikker på at du vil slette denne API-nøkkelen?",
|
||||
"delete_duplicates_confirmation": "Er du sikker på at du vil slette disse duplikatene permanent?",
|
||||
"delete_face": "Slett ansik",
|
||||
"delete_key": "Slett nøkkel",
|
||||
"delete_library": "Slett bibliotek",
|
||||
"delete_link": "Slett lenke",
|
||||
@@ -601,12 +595,11 @@
|
||||
"editor_crop_tool_h2_rotation": "Rotasjon",
|
||||
"email": "E-postadresse",
|
||||
"empty_trash": "Tøm papirkurv",
|
||||
"empty_trash_confirmation": "Er du sikker på at du vil tømme søppelbøtta? Dette vil slette alle filene i søppelbøtta permanent fra Immich.\nDu kan ikke angre denne handlingen!",
|
||||
"empty_trash_confirmation": "Er du sikker på at du vil tømme søppelbøtte ? Dette vil slette alle filene i søppelbøtta permanent fra Immich.\nDu kan ikke angre denne handlingen!",
|
||||
"enable": "Aktivere",
|
||||
"enabled": "Aktivert",
|
||||
"end_date": "Slutt dato",
|
||||
"error": "Feil",
|
||||
"error_delete_face": "Feil ved sletting av ansikt fra aktivia",
|
||||
"error_loading_image": "Feil ved lasting av bilde",
|
||||
"error_title": "Feil - Noe gikk galt",
|
||||
"errors": {
|
||||
@@ -773,10 +766,8 @@
|
||||
"go_to_folder": "Gå til mappe",
|
||||
"go_to_search": "Gå til søk",
|
||||
"group_albums_by": "Grupper album etter...",
|
||||
"group_country": "Grupper etter land",
|
||||
"group_no": "Ingen gruppering",
|
||||
"group_owner": "Grupper etter eiere",
|
||||
"group_places_by": "Grupper plasser etter...",
|
||||
"group_year": "Grupper etter år",
|
||||
"has_quota": "Har kvote",
|
||||
"hi_user": "Hei {name} ({email})",
|
||||
@@ -809,7 +800,6 @@
|
||||
"include_shared_albums": "Inkluder delte album",
|
||||
"include_shared_partner_assets": "Inkluder delte partnerfiler",
|
||||
"individual_share": "Individuell deling",
|
||||
"individual_shares": "Individuelle delinger",
|
||||
"info": "Info",
|
||||
"interval": {
|
||||
"day_at_onepm": "Hver dag klokken 13:00",
|
||||
@@ -891,7 +881,6 @@
|
||||
"month": "Måned",
|
||||
"more": "Mer",
|
||||
"moved_to_trash": "Flyttet til papirkurven",
|
||||
"mute_memories": "Demp minner",
|
||||
"my_albums": "Mine album",
|
||||
"name": "Navn",
|
||||
"name_or_nickname": "Navn eller kallenavn",
|
||||
@@ -987,7 +976,6 @@
|
||||
"permanently_deleted_asset": "Filen har blitt permanent slettet",
|
||||
"permanently_deleted_assets_count": "Permanent slett {count, plural, one {# asset} other {# assets}}",
|
||||
"person": "Person",
|
||||
"person_birthdate": "Født den {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (skjult)} other {}}",
|
||||
"photo_shared_all_users": "Det ser ut som om du deler bildene med alle brukere eller det er ingen brukere å dele med.",
|
||||
"photos": "Bilder",
|
||||
@@ -997,7 +985,6 @@
|
||||
"pick_a_location": "Velg et sted",
|
||||
"place": "Sted",
|
||||
"places": "Plasseringer",
|
||||
"places_count": "{count, plural, one {{count, number} Place} other {{count, number} Places}}",
|
||||
"play": "Spill av",
|
||||
"play_memories": "Spill av minner",
|
||||
"play_motion_photo": "Spill av bevegelsesbilde",
|
||||
@@ -1079,16 +1066,12 @@
|
||||
"remove_from_album": "Fjern fra album",
|
||||
"remove_from_favorites": "Fjern fra favoritter",
|
||||
"remove_from_shared_link": "Fjern fra delt lenke",
|
||||
"remove_memory": "Slett minne",
|
||||
"remove_photo_from_memory": "Slett bilde fra dette minne",
|
||||
"remove_url": "Fjern URL",
|
||||
"remove_user": "Fjern bruker",
|
||||
"removed_api_key": "Fjernet API-nøkkel: {name}",
|
||||
"removed_from_archive": "Fjernet fra arkivet",
|
||||
"removed_from_favorites": "Fjernet fra favoritter",
|
||||
"removed_from_favorites_count": "{count, plural, other {Removed #}} fra favoritter",
|
||||
"removed_memory": "Slettet minne",
|
||||
"removed_photo_from_memory": "Slettet bilde fra minne",
|
||||
"removed_tagged_assets": "Fjern tag fra {count, plural, one {# asset} other {# assets}}",
|
||||
"rename": "Gi nytt navn",
|
||||
"repair": "Reparer",
|
||||
@@ -1097,7 +1080,6 @@
|
||||
"repository": "Depot",
|
||||
"require_password": "Krev passord",
|
||||
"require_user_to_change_password_on_first_login": "Krev at brukeren endrer passord ved første pålogging",
|
||||
"rescan": "Skann på nytt",
|
||||
"reset": "Tilbakestill",
|
||||
"reset_password": "Tilbakestill passord",
|
||||
"reset_people_visibility": "Tilbakestill personsynlighet",
|
||||
@@ -1126,8 +1108,6 @@
|
||||
"search": "Søk",
|
||||
"search_albums": "Søk i album",
|
||||
"search_by_context": "Søk etter kontekst",
|
||||
"search_by_description": "Søk etter beskrivelse",
|
||||
"search_by_description_example": "Turdag i Sapa",
|
||||
"search_by_filename": "Søk etter filnavn og filtype",
|
||||
"search_by_filename_example": "f.eks. IMG_1234.JPG eller PNG",
|
||||
"search_camera_make": "Søk etter kameramerke...",
|
||||
@@ -1141,7 +1121,6 @@
|
||||
"search_options": "Søke alternativer",
|
||||
"search_people": "Søk personer",
|
||||
"search_places": "Søk steder",
|
||||
"search_rating": "Søk etter vurdering...",
|
||||
"search_settings": "Søke instillinger",
|
||||
"search_state": "Søk etter stat...",
|
||||
"search_tags": "Søk tags...",
|
||||
@@ -1151,7 +1130,6 @@
|
||||
"searching_locales": "Søker lokaler...",
|
||||
"second": "Sekund",
|
||||
"see_all_people": "Vis alle mennesker",
|
||||
"select": "Velg",
|
||||
"select_album_cover": "Velg albumomslag",
|
||||
"select_all": "Velg alle",
|
||||
"select_all_duplicates": "Velg alle duplikater",
|
||||
@@ -1189,7 +1167,6 @@
|
||||
"shared_from_partner": "Bilder fra {partner}",
|
||||
"shared_link_options": "Alternativer for delte lenke",
|
||||
"shared_links": "Delte linker",
|
||||
"shared_links_description": "Del bilder og videoer med lenke",
|
||||
"shared_photos_and_videos_count": "{assetCount, plural, other {# delte bilder og videoer.}}",
|
||||
"shared_with_partner": "Delt med {partner}",
|
||||
"sharing": "Deling",
|
||||
@@ -1212,7 +1189,6 @@
|
||||
"show_person_options": "Vis personalternativer",
|
||||
"show_progress_bar": "Vis fremdriftslinje",
|
||||
"show_search_options": "Vis søkealternativer",
|
||||
"show_shared_links": "Vis delte lenker",
|
||||
"show_slideshow_transition": "Vis overgang til lysbildefremvisning",
|
||||
"show_supporter_badge": "Supportermerke",
|
||||
"show_supporter_badge_description": "Vis et supportermerke",
|
||||
@@ -1266,7 +1242,6 @@
|
||||
"tag_created": "Lag merke: {tag}",
|
||||
"tag_feature_description": "Bla gjennom bilder og videoer gruppert etter logiske merke-emner",
|
||||
"tag_not_found_question": "Finner du ikke en merke? <link>Opprett en nytt merke.</link>",
|
||||
"tag_people": "Tag Folk",
|
||||
"tag_updated": "Oppdater merke: {tag}",
|
||||
"tagged_assets": "Merket {count, plural, one {# asset} other {# assets}}",
|
||||
"tags": "Merker",
|
||||
@@ -1301,13 +1276,11 @@
|
||||
"unfavorite": "Fjern favoritt",
|
||||
"unhide_person": "Vis person",
|
||||
"unknown": "Ukjent",
|
||||
"unknown_country": "Ukjent Land",
|
||||
"unknown_year": "Ukjent År",
|
||||
"unlimited": "Ubegrenset",
|
||||
"unlink_motion_video": "Koble fra bevegelsesvideo",
|
||||
"unlink_oauth": "Fjern kobling til OAuth",
|
||||
"unlinked_oauth_account": "Koblet fra OAuth-konto",
|
||||
"unmute_memories": "Opphev demping av minner",
|
||||
"unnamed_album": "Navnløst album",
|
||||
"unnamed_album_delete_confirmation": "Er du sikker på at du vil slette dette albumet?",
|
||||
"unnamed_share": "Deling uten navn",
|
||||
@@ -1361,7 +1334,6 @@
|
||||
"view_all": "Vis alle",
|
||||
"view_all_users": "Vis alle brukere",
|
||||
"view_in_timeline": "Vis i tidslinje",
|
||||
"view_link": "Vis lenke",
|
||||
"view_links": "Vis lenker",
|
||||
"view_name": "Vis",
|
||||
"view_next_asset": "Vis neste fil",
|
||||
|
||||
77
i18n/nl.json
77
i18n/nl.json
@@ -41,7 +41,6 @@
|
||||
"backup_settings": "Back-up instellingen",
|
||||
"backup_settings_description": "Database back-up instellingen beheren",
|
||||
"check_all": "Controleer het logboek",
|
||||
"cleanup": "Opruimen",
|
||||
"cleared_jobs": "Taken gewist voor: {job}",
|
||||
"config_set_by_file": "Instellingen worden momenteel beheerd door een configuratiebestand",
|
||||
"confirm_delete_library": "Weet je zeker dat je de bibliotheek {library} wilt verwijderen?",
|
||||
@@ -97,7 +96,7 @@
|
||||
"library_scanning_enable_description": "Periodieke bibliotheekscan aanzetten",
|
||||
"library_settings": "Externe bibliotheek",
|
||||
"library_settings_description": "Externe bibliotheekinstellingen beheren",
|
||||
"library_tasks_description": "Scan externe bibliotheken op nieuwe en/of gewijzigde media",
|
||||
"library_tasks_description": "Voer bibliotheek taken uit",
|
||||
"library_watching_enable_description": "Externe bibliotheken monitoren op bestandswijzigingen",
|
||||
"library_watching_settings": "Bibliotheek monitoren (EXPERIMENTEEL)",
|
||||
"library_watching_settings_description": "Automatisch gewijzigde bestanden bijhouden",
|
||||
@@ -132,7 +131,7 @@
|
||||
"machine_learning_smart_search_description": "Semantisch zoeken naar afbeeldingen met CLIP-embeddings",
|
||||
"machine_learning_smart_search_enabled": "Slim zoeken inschakelen",
|
||||
"machine_learning_smart_search_enabled_description": "Indien uitgeschakeld, worden afbeeldingen niet verwerkt voor slim zoeken.",
|
||||
"machine_learning_url_description": "De URL van de machine learning server. Als er meer dan één URL is opgegeven, wordt elke server geprobeerd totdat er een succesvol reageert, op volgorde van eerste tot laatste. Servers die geen reactie geven zullen tijdelijk genegeerd worden tot zij terug online komen.",
|
||||
"machine_learning_url_description": "De URL van de machine learning server. Als er meer dan één URL is opgegeven, wordt elke server geprobeerd totdat er een succesvol reageert, op volgorde van eerste tot laatste.",
|
||||
"manage_concurrency": "Beheer gelijktijdigheid",
|
||||
"manage_log_settings": "Beheer logboekinstellingen",
|
||||
"map_dark_style": "Donkere stijl",
|
||||
@@ -148,8 +147,6 @@
|
||||
"map_settings": "Kaart",
|
||||
"map_settings_description": "Beheer kaartinstellingen",
|
||||
"map_style_description": "URL naar een style.json kaartthema",
|
||||
"memory_cleanup_job": "Geheugen opschonen",
|
||||
"memory_generate_job": "Geheugen genereren",
|
||||
"metadata_extraction_job": "Metadata ophalen",
|
||||
"metadata_extraction_job_description": "Metadata ophalen van iedere asset, zoals GPS, gezichten en resolutie",
|
||||
"metadata_faces_import_setting": "Gezichten importeren inschakelen",
|
||||
@@ -243,7 +240,7 @@
|
||||
"storage_template_hash_verification_enabled_description": "Zet hashverificatie aan, schakel dit niet uit tenzij je zeker bent van de implicaties",
|
||||
"storage_template_migration": "Opslagtemplate migratie",
|
||||
"storage_template_migration_description": "Pas de huidige <link>{template}</link> toe op eerder geüploade assets",
|
||||
"storage_template_migration_info": "Wijzigingen in het opslag template worden alleen toegepast op nieuwe assets. Om de template met terugwerkende kracht toe te passen op eerder geüploade assets, voer je de <link>{job}</link> uit.",
|
||||
"storage_template_migration_info": "Wijzigingen in de template worden alleen toegepast op nieuwe assets. Om de template met terugwerkende kracht toe te passen op eerder geüploade assets, voer de <link>{job}</link> uit.",
|
||||
"storage_template_migration_job": "Opslagtemplate migratietaak",
|
||||
"storage_template_more_details": "Voor meer details over deze functie, bekijk de <template-link>Opslagstemplate</template-link> en de <implications-link>implicaties</implications-link> daarvan",
|
||||
"storage_template_onboarding_description": "Wanneer ingeschakeld, zal deze functie bestanden automatisch organiseren gebaseerd op een gebruiker-definieerd template. Gezien de stabiliteitsproblemen is de functie standaard uitgeschakeld. Voor meer informatie, bekijk de <link>documentatie</link>.",
|
||||
@@ -302,7 +299,7 @@
|
||||
"transcoding_max_b_frames": "Maximum B-Frames",
|
||||
"transcoding_max_b_frames_description": "Hogere waarden verbeteren de compressie efficiëntie, maar vertragen de codering. Is mogelijk niet compatibel met hardwareversnelling op oudere apparaten. 0 schakelt B-frames uit, terwijl -1 deze waarde automatisch instelt.",
|
||||
"transcoding_max_bitrate": "Maximum bitrate",
|
||||
"transcoding_max_bitrate_description": "Het instellen van een maximale bitrate kan de bestandsgrootte voorspelbaarder maken, tegen geringe kosten voor de kwaliteit. Bij 720p zijn de typische waarden 2600 kbit/s voor VP9 of HEVC, of 4500 kbit/s voor H.264. Uitgeschakeld indien ingesteld op 0.",
|
||||
"transcoding_max_bitrate_description": "Het instellen van een maximale bitrate kan de bestandsgrootte voorspelbaarder maken, tegen geringe kosten voor de kwaliteit. Bij 720p zijn de typische waarden 2600k voor VP9 of HEVC, of 4500k voor H.264. Uitgeschakeld indien ingesteld op 0.",
|
||||
"transcoding_max_keyframe_interval": "Maximum keyframe interval",
|
||||
"transcoding_max_keyframe_interval_description": "Stelt de maximale frameafstand tussen keyframes in. Lagere waarden verslechteren de compressie efficiëntie, maar verbeteren de zoektijden en kunnen de kwaliteit verbeteren in scènes met snelle bewegingen. 0 stelt deze waarde automatisch in.",
|
||||
"transcoding_optimal_description": "Video's met een hogere resolutie dan de doelresolutie of niet in een geaccepteerd formaat",
|
||||
@@ -394,12 +391,11 @@
|
||||
"allow_edits": "Bewerkingen toestaan",
|
||||
"allow_public_user_to_download": "Sta openbare gebruiker toe om te downloaden",
|
||||
"allow_public_user_to_upload": "Sta openbare gebruiker toe om te uploaden",
|
||||
"alt_text_qr_code": "QR-codeafbeelding",
|
||||
"anti_clockwise": "Linksom",
|
||||
"api_key": "API key",
|
||||
"api_key": "API sleutel",
|
||||
"api_key_description": "Deze waarde wordt slechts één keer getoond. Zorg ervoor dat je deze kopieert voordat je het venster sluit.",
|
||||
"api_key_empty": "De naam van uw API key mag niet leeg zijn",
|
||||
"api_keys": "API keys",
|
||||
"api_key_empty": "De naam van uw API sleutel mag niet leeg zijn",
|
||||
"api_keys": "API sleutels",
|
||||
"app_settings": "App instellingen",
|
||||
"appears_in": "Komt voor in",
|
||||
"archive": "Archief",
|
||||
@@ -446,7 +442,7 @@
|
||||
"bulk_delete_duplicates_confirmation": "Weet je zeker dat je {count, plural, one {# duplicate asset} other {# duplicate assets}} in bulk wilt verwijderen? Dit zal de grootste asset van elke groep behouden en alle andere duplicaten permanent verwijderen. Je kunt deze actie niet ongedaan maken!",
|
||||
"bulk_keep_duplicates_confirmation": "Weet je zeker dat je {count, plural, one {# duplicate asset} other {# duplicate assets}} wilt behouden? Dit zal alle groepen met duplicaten oplossen zonder iets te verwijderen.",
|
||||
"bulk_trash_duplicates_confirmation": "Weet je zeker dat je {count, plural, one {# duplicate asset} other {# duplicate assets}} in bulk naar de prullenbak wilt verplaatsen? Dit zal de grootste asset van elke groep behouden en alle andere duplicaten naar de prullenbak verplaatsen.",
|
||||
"buy": "Immich kopen",
|
||||
"buy": "Koop Immich",
|
||||
"camera": "Camera",
|
||||
"camera_brand": "Cameramerk",
|
||||
"camera_model": "Cameramodel",
|
||||
@@ -456,9 +452,9 @@
|
||||
"cannot_undo_this_action": "Je kunt deze actie niet ongedaan maken!",
|
||||
"cannot_update_the_description": "Kan de beschrijving niet bijwerken",
|
||||
"change_date": "Wijzig datum",
|
||||
"change_expiration_time": "Verlooptijd wijzigen",
|
||||
"change_location": "Locatie wijzigen",
|
||||
"change_name": "Naam wijzigen",
|
||||
"change_expiration_time": "Wijzig verlooptijd",
|
||||
"change_location": "Wijzig locatie",
|
||||
"change_name": "Wijzig naam",
|
||||
"change_name_successfully": "Naam succesvol gewijzigd",
|
||||
"change_password": "Wijzig wachtwoord",
|
||||
"change_password_description": "Dit is de eerste keer dat je inlogt op het systeem of er is een verzoek gedaan om je wachtwoord te wijzigen. Voer hieronder het nieuwe wachtwoord in.",
|
||||
@@ -485,7 +481,6 @@
|
||||
"comments_are_disabled": "Opmerkingen zijn uitgeschakeld",
|
||||
"confirm": "Bevestigen",
|
||||
"confirm_admin_password": "Bevestig beheerder wachtwoord",
|
||||
"confirm_delete_face": "Weet je zeker dat je {name} gezicht wilt verwijderen uit de asset?",
|
||||
"confirm_delete_shared_link": "Weet je zeker dat je deze gedeelde link wilt verwijderen?",
|
||||
"confirm_keep_this_delete_others": "Alle andere assets in de stack worden verwijderd, behalve deze. Weet je zeker dat je wilt doorgaan?",
|
||||
"confirm_password": "Bevestig wachtwoord",
|
||||
@@ -536,10 +531,9 @@
|
||||
"default_locale_description": "Formatteer datums en getallen op basis van de landinstellingen van je browser",
|
||||
"delete": "Verwijderen",
|
||||
"delete_album": "Album verwijderen",
|
||||
"delete_api_key_prompt": "Weet je zeker dat je deze API key wilt verwijderen?",
|
||||
"delete_api_key_prompt": "Weet je zeker dat je deze API sleutel wilt verwijderen?",
|
||||
"delete_duplicates_confirmation": "Weet je zeker dat je deze duplicaten permanent wilt verwijderen?",
|
||||
"delete_face": "Gezicht verwijderen",
|
||||
"delete_key": "Verwijder key",
|
||||
"delete_key": "Verwijder sleutel",
|
||||
"delete_library": "Verwijder bibliotheek",
|
||||
"delete_link": "Verwijder link",
|
||||
"delete_others": "Andere verwijderen",
|
||||
@@ -585,7 +579,7 @@
|
||||
"edit_faces": "Gezichten bewerken",
|
||||
"edit_import_path": "Import-pad bewerken",
|
||||
"edit_import_paths": "Import-paden bewerken",
|
||||
"edit_key": "Key bewerken",
|
||||
"edit_key": "Sleutel bewerken",
|
||||
"edit_link": "Link bewerken",
|
||||
"edit_location": "Locatie bewerken",
|
||||
"edit_name": "Naam bewerken",
|
||||
@@ -606,7 +600,6 @@
|
||||
"enabled": "Ingeschakeld",
|
||||
"end_date": "Einddatum",
|
||||
"error": "Fout",
|
||||
"error_delete_face": "Fout bij verwijderen gezicht uit asset",
|
||||
"error_loading_image": "Fout bij laden afbeelding",
|
||||
"error_title": "Fout - Er is iets misgegaan",
|
||||
"errors": {
|
||||
@@ -638,7 +631,7 @@
|
||||
"failed_to_load_asset": "Kan asset niet laden",
|
||||
"failed_to_load_assets": "Kan assets niet laden",
|
||||
"failed_to_load_people": "Kan mensen niet laden",
|
||||
"failed_to_remove_product_key": "Er is een fout opgetreden bij het verwijderen van de licentiesleutel",
|
||||
"failed_to_remove_product_key": "Er is een fout opgetreden bij het verwijderen van de product sleutel",
|
||||
"failed_to_stack_assets": "Fout bij stapelen van assets",
|
||||
"failed_to_unstack_assets": "Fout bij ontstapelen van assets",
|
||||
"import_path_already_exists": "Dit import-pad bestaat al.",
|
||||
@@ -667,7 +660,7 @@
|
||||
"unable_to_connect_to_server": "Kan geen verbinding maken met server",
|
||||
"unable_to_copy_to_clipboard": "Kan niet naar klembord kopiëren, zorg ervoor dat je de pagina via https opent",
|
||||
"unable_to_create_admin_account": "Kan beheerdersaccount niet aanmaken",
|
||||
"unable_to_create_api_key": "Kan geen nieuwe API key aanmaken",
|
||||
"unable_to_create_api_key": "Kan geen nieuwe API sleutel aanmaken",
|
||||
"unable_to_create_library": "Kan bibliotheek niet aanmaken",
|
||||
"unable_to_create_user": "Kan geen gebruiker aanmaken",
|
||||
"unable_to_delete_album": "Kan album niet verwijderen",
|
||||
@@ -700,7 +693,7 @@
|
||||
"unable_to_reassign_assets_new_person": "Kan assets niet opnieuw toewijzen aan een nieuw persoon",
|
||||
"unable_to_refresh_user": "Kan gebruiker niet vernieuwen",
|
||||
"unable_to_remove_album_users": "Kan gebruiker niet van album verwijderen",
|
||||
"unable_to_remove_api_key": "Kan API key niet verwijderen",
|
||||
"unable_to_remove_api_key": "Kan API sleutel niet verwijderen",
|
||||
"unable_to_remove_assets_from_shared_link": "Kan assets niet verwijderen uit gedeelde link",
|
||||
"unable_to_remove_deleted_assets": "Kan offline bestanden niet verwijderen",
|
||||
"unable_to_remove_library": "Kan bibliotheek niet verwijderen",
|
||||
@@ -713,7 +706,7 @@
|
||||
"unable_to_restore_trash": "Kan niet herstellen uit prullenbak",
|
||||
"unable_to_restore_user": "Kan gebruiker niet herstellen",
|
||||
"unable_to_save_album": "Kan album niet opslaan",
|
||||
"unable_to_save_api_key": "Kan API key niet opslaan",
|
||||
"unable_to_save_api_key": "Kan API sleutel niet opslaan",
|
||||
"unable_to_save_date_of_birth": "Kan geboortedatum niet opslaan",
|
||||
"unable_to_save_name": "Kan naam niet opslaan",
|
||||
"unable_to_save_profile": "Kan profiel niet opslaan",
|
||||
@@ -864,7 +857,7 @@
|
||||
"manage_sharing_with_partners": "Beheer delen met partners",
|
||||
"manage_the_app_settings": "Beheer de appinstellingen",
|
||||
"manage_your_account": "Beheer je account",
|
||||
"manage_your_api_keys": "Beheer je API keys",
|
||||
"manage_your_api_keys": "Beheer je API sleutels",
|
||||
"manage_your_devices": "Beheer je ingelogde apparaten",
|
||||
"manage_your_oauth_connection": "Beheer je OAuth koppeling",
|
||||
"map": "Kaart",
|
||||
@@ -891,13 +884,12 @@
|
||||
"month": "Maand",
|
||||
"more": "Meer",
|
||||
"moved_to_trash": "Naar de prullenbak verplaatst",
|
||||
"mute_memories": "Herrinneringen dempen",
|
||||
"my_albums": "Mijn albums",
|
||||
"name": "Naam",
|
||||
"name_or_nickname": "Naam of gebruikersnaam",
|
||||
"never": "Nooit",
|
||||
"new_album": "Nieuw album",
|
||||
"new_api_key": "Nieuwe API key",
|
||||
"new_api_key": "Nieuwe API sleutel",
|
||||
"new_password": "Nieuw wachtwoord",
|
||||
"new_person": "Nieuw persoon",
|
||||
"new_user_created": "Nieuwe gebruiker aangemaakt",
|
||||
@@ -987,7 +979,6 @@
|
||||
"permanently_deleted_asset": "Asset permanent verwijderd",
|
||||
"permanently_deleted_assets_count": "{count, plural, one {# asset} other {# assets}} permanent verwijderd",
|
||||
"person": "Persoon",
|
||||
"person_birthdate": "Geboren op {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (verborgen)} other {}}",
|
||||
"photo_shared_all_users": "Het lijkt erop dat je foto's met alle gebruikers zijn gedeeld, of dat je geen gebruikers hebt om mee te delen.",
|
||||
"photos": "Foto's",
|
||||
@@ -1017,19 +1008,19 @@
|
||||
"purchase_account_info": "Supporter",
|
||||
"purchase_activated_subtitle": "Bedankt voor het ondersteunen van Immich en open-source software",
|
||||
"purchase_activated_time": "Geactiveerd op {date, date}",
|
||||
"purchase_activated_title": "Je licentiesleutel is succesvol geactiveerd",
|
||||
"purchase_activated_title": "Je sleutel is succesvol geactiveerd",
|
||||
"purchase_button_activate": "Activeren",
|
||||
"purchase_button_buy": "Kopen",
|
||||
"purchase_button_buy_immich": "Koop Immich",
|
||||
"purchase_button_never_show_again": "Nooit meer tonen",
|
||||
"purchase_button_reminder": "Herinner mij over 30 dagen",
|
||||
"purchase_button_remove_key": "Licentiesleutel verwijderen",
|
||||
"purchase_button_remove_key": "Sleutel verwijderen",
|
||||
"purchase_button_select": "Selecteren",
|
||||
"purchase_failed_activation": "Activeren mislukt! Controleer je e-mail voor de juiste licentiesleutel!",
|
||||
"purchase_failed_activation": "Activeren mislukt! Controleer je e-mail voor de juiste productsleutel!",
|
||||
"purchase_individual_description_1": "Voor een gebruiker",
|
||||
"purchase_individual_description_2": "Supporter badge",
|
||||
"purchase_individual_title": "Gebruiker",
|
||||
"purchase_input_suggestion": "Heb je een licentiesleutel? Voer deze hieronder in",
|
||||
"purchase_input_suggestion": "Heb je een productsleutel? Voer de sleutel hieronder in",
|
||||
"purchase_license_subtitle": "Koop Immich om de verdere ontwikkeling van de service te ondersteunen",
|
||||
"purchase_lifetime_description": "Levenslange aankoop",
|
||||
"purchase_option_title": "AANKOOP MOGELIJKHEDEN",
|
||||
@@ -1038,14 +1029,14 @@
|
||||
"purchase_panel_title": "Steun het project",
|
||||
"purchase_per_server": "Per server",
|
||||
"purchase_per_user": "Per gebruiker",
|
||||
"purchase_remove_product_key": "Verwijder licentiesleutel",
|
||||
"purchase_remove_product_key_prompt": "Weet je zeker dat je de licentiesleutel wilt verwijderen?",
|
||||
"purchase_remove_server_product_key": "Verwijder server licentiesleutel",
|
||||
"purchase_remove_server_product_key_prompt": "Weet je zeker dat je de server licentiesleutel wilt verwijderen?",
|
||||
"purchase_remove_product_key": "Verwijder product sleutel",
|
||||
"purchase_remove_product_key_prompt": "Weet je zeker dat je de product sleutel wilt verwijderen?",
|
||||
"purchase_remove_server_product_key": "Verwijder server product sleutel",
|
||||
"purchase_remove_server_product_key_prompt": "Weet je zeker dat je de server product sleutel wilt verwijderen?",
|
||||
"purchase_server_description_1": "Voor de volledige server",
|
||||
"purchase_server_description_2": "Supporter badge",
|
||||
"purchase_server_title": "Server",
|
||||
"purchase_settings_server_activated": "De licentiesleutel van de server wordt beheerd door de beheerder",
|
||||
"purchase_settings_server_activated": "De productcode van de server wordt beheerd door de beheerder",
|
||||
"rating": "Ster waardering",
|
||||
"rating_clear": "Waardering verwijderen",
|
||||
"rating_count": "{count, plural, one {# ster} other {# sterren}}",
|
||||
@@ -1079,16 +1070,12 @@
|
||||
"remove_from_album": "Verwijder uit album",
|
||||
"remove_from_favorites": "Verwijderen uit favorieten",
|
||||
"remove_from_shared_link": "Verwijderen uit gedeelde link",
|
||||
"remove_memory": "Herinnering verwijderen",
|
||||
"remove_photo_from_memory": "Foto uit deze herinnering verwijderen",
|
||||
"remove_url": "Verwijder URL",
|
||||
"remove_user": "Gebruiker verwijderen",
|
||||
"removed_api_key": "API sleutel verwijderd: {name}",
|
||||
"removed_from_archive": "Verwijderd uit archief",
|
||||
"removed_from_favorites": "Verwijderd uit favorieten",
|
||||
"removed_from_favorites_count": "{count, plural, other {# verwijderd}} uit favorieten",
|
||||
"removed_memory": "Herinnering verwijderd",
|
||||
"removed_photo_from_memory": "Foto verwijderd uit herinnering",
|
||||
"removed_tagged_assets": "Tag verwijderd van {count, plural, one {# asset} other {# assets}}",
|
||||
"rename": "Hernoemen",
|
||||
"repair": "Repareren",
|
||||
@@ -1097,7 +1084,6 @@
|
||||
"repository": "Repository",
|
||||
"require_password": "Wachtwoord vereisen",
|
||||
"require_user_to_change_password_on_first_login": "Vereisen dat de gebruiker het wachtwoord wijzigt bij de eerste keer inloggen",
|
||||
"rescan": "Herscannen",
|
||||
"reset": "Resetten",
|
||||
"reset_password": "Wachtwoord resetten",
|
||||
"reset_people_visibility": "Zichtbaarheid mensen resetten",
|
||||
@@ -1141,7 +1127,6 @@
|
||||
"search_options": "Zoekopties",
|
||||
"search_people": "Zoek mensen",
|
||||
"search_places": "Zoek plaatsen",
|
||||
"search_rating": "Zoeken op beoordeling...",
|
||||
"search_settings": "Zoek instellingen",
|
||||
"search_state": "Zoek staat...",
|
||||
"search_tags": "Tags zoeken...",
|
||||
@@ -1151,7 +1136,6 @@
|
||||
"searching_locales": "Zoeken naar landinstellingen...",
|
||||
"second": "Seconde",
|
||||
"see_all_people": "Bekijk alle mensen",
|
||||
"select": "Selecteer",
|
||||
"select_album_cover": "Selecteer album cover",
|
||||
"select_all": "Alles selecteren",
|
||||
"select_all_duplicates": "Selecteer alle duplicaten",
|
||||
@@ -1266,7 +1250,6 @@
|
||||
"tag_created": "Tag aangemaakt: {tag}",
|
||||
"tag_feature_description": "Bladeren door foto's en video's gegroepeerd op tags",
|
||||
"tag_not_found_question": "Kun je een tag niet vinden? <link>Maak een nieuwe tag.</link>",
|
||||
"tag_people": "Mensen taggen",
|
||||
"tag_updated": "Tag bijgewerkt: {tag}",
|
||||
"tagged_assets": "{count, plural, one {# asset} other {# assets}} getagd",
|
||||
"tags": "Tags",
|
||||
@@ -1307,7 +1290,6 @@
|
||||
"unlink_motion_video": "Maak bewegende video los",
|
||||
"unlink_oauth": "Ontkoppel OAuth",
|
||||
"unlinked_oauth_account": "OAuth account ontkoppeld",
|
||||
"unmute_memories": "Dempen van herrinneringen opheffen",
|
||||
"unnamed_album": "Naamloos album",
|
||||
"unnamed_album_delete_confirmation": "Weet je zeker dat je dit album wilt verwijderen?",
|
||||
"unnamed_share": "Naamloze deellink",
|
||||
@@ -1361,7 +1343,6 @@
|
||||
"view_all": "Bekijk alle",
|
||||
"view_all_users": "Bekijk alle gebruikers",
|
||||
"view_in_timeline": "Bekijk in tijdlijn",
|
||||
"view_link": "Bekijk link",
|
||||
"view_links": "Links bekijken",
|
||||
"view_name": "Bekijken",
|
||||
"view_next_asset": "Bekijk volgende asset",
|
||||
|
||||
31
i18n/nn.json
31
i18n/nn.json
@@ -120,20 +120,8 @@
|
||||
"machine_learning_max_detection_distance": "Maksimal oppdagingsverdi",
|
||||
"machine_learning_max_detection_distance_description": "Den største skilnaden mellom to bilete for å rekne dei som duplikat, frå 0.001-0.1. Større verdiar finn fleire duplikat, men kan gje falske treff.",
|
||||
"machine_learning_max_recognition_distance": "Maksimal attkjenningsverdi",
|
||||
"machine_learning_min_detection_score": "Minimum deteksjonsresultat",
|
||||
"machine_learning_min_detection_score_description": "Minimum tillitspoeng for at eit ansikt skal bli oppdaga, på ein skala frå 0-1. Lågare verdiar vil oppdaga fleire ansikt, men kan føre til falske positive",
|
||||
"machine_learning_min_recognized_faces": "Minimum gjenkjende ansikt",
|
||||
"machine_learning_settings": "Innstillingar for maskinlæring",
|
||||
"machine_learning_settings_description": "Administrer maskinlæringsfunksjonar og innstillingar",
|
||||
"machine_learning_smart_search": "Smart Søk",
|
||||
"machine_learning_smart_search_enabled": "Aktiver smart søk",
|
||||
"machine_learning_smart_search_enabled_description": "Hvis deaktivert, vil bilete ikkje bli enkoda for smart søk.",
|
||||
"manage_concurrency": "Administrer samtidigheit",
|
||||
"manage_log_settings": "Administrer logginnstillingar",
|
||||
"map_dark_style": "Mørk modus",
|
||||
"map_enable_description": "Aktiver kartfunksjonar",
|
||||
"map_gps_settings": "Kart og GPS innstillingar",
|
||||
"map_gps_settings_description": "Administrer innstillingar for kart og GPS (Reversert geokoding)",
|
||||
"map_light_style": "Lys modus",
|
||||
"map_settings": "Kart",
|
||||
"metadata_extraction_job": "Hent ut metadata",
|
||||
@@ -377,38 +365,19 @@
|
||||
"usage": "Bruk",
|
||||
"user": "Brukar",
|
||||
"user_purchase_settings": "Kjøp",
|
||||
"user_usage_detail": "Detaljar av brukars forbruk",
|
||||
"user_usage_stats": "Vis kontobruksstatistikk",
|
||||
"user_usage_stats_description": "Vis kontobruksstatistikk",
|
||||
"username": "Brukarnamn",
|
||||
"users": "Brukarar",
|
||||
"utilities": "Verktøy",
|
||||
"validate": "Validere",
|
||||
"variables": "Variablar",
|
||||
"version": "Versjon",
|
||||
"version_announcement_closing": "Din ven, Alex",
|
||||
"version_history": "Versjonshistorie",
|
||||
"version_history_item": "Installert {version} den {date}",
|
||||
"video": "Video",
|
||||
"video_hover_setting": "Spel av førehandsvisining medan du held over musepeikaren",
|
||||
"videos": "Videoar",
|
||||
"videos_count": "{count, plural, one {# Video} other {# Videoar}}",
|
||||
"view": "Vis",
|
||||
"view_album": "Sjå Album",
|
||||
"view_all": "Sjå alle",
|
||||
"view_all_users": "Sjå alle brukarar",
|
||||
"view_in_timeline": "Sjå på tidslinja",
|
||||
"view_links": "Vis lenkjer",
|
||||
"view_name": "Vis",
|
||||
"view_next_asset": "Vis neste fil",
|
||||
"view_previous_asset": "Vis forrige fil",
|
||||
"view_stack": "Syn stabel",
|
||||
"visibility_changed": "Synlegheit forandra for {count, plural, one {# person} other {# personar}}",
|
||||
"waiting": "Ventar",
|
||||
"warning": "Advarsel",
|
||||
"week": "Veke",
|
||||
"welcome": "Velkomen",
|
||||
"welcome_to_immich": "Velkomen til Immich",
|
||||
"year": "År",
|
||||
"years_ago": "{years, plural, one {# År} other {# År}} sidan",
|
||||
"yes": "Ja",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user