diff --git a/.github/.nvmrc b/.github/.nvmrc index 32f8c50de0..8e35034890 100644 --- a/.github/.nvmrc +++ b/.github/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.1 diff --git a/.github/workflows/auto-close.yml b/.github/workflows/auto-close.yml new file mode 100644 index 0000000000..348c0785bb --- /dev/null +++ b/.github/workflows/auto-close.yml @@ -0,0 +1,148 @@ +name: Auto-close PRs + +on: + pull_request_target: # zizmor: ignore[dangerous-triggers] + types: [opened, edited, labeled] + +permissions: {} + +jobs: + parse_template: + runs-on: ubuntu-latest + if: ${{ github.event.action != 'labeled' && github.event.pull_request.head.repo.fork == true }} + permissions: + contents: read + outputs: + uses_template: ${{ steps.check.outputs.uses_template }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + sparse-checkout: .github/pull_request_template.md + sparse-checkout-cone-mode: false + persist-credentials: false + + - name: Check required sections + id: check + env: + BODY: ${{ github.event.pull_request.body }} + run: | + OK=true + while IFS= read -r header; do + printf '%s\n' "$BODY" | grep -qF "$header" || OK=false + done < <(sed '//d' .github/pull_request_template.md | grep "^## ") + echo "uses_template=$OK" >> "$GITHUB_OUTPUT" + + close_template: + runs-on: ubuntu-latest + needs: parse_template + if: >- + ${{ + needs.parse_template.outputs.uses_template == 'false' + && github.event.pull_request.state != 'closed' + && !contains(github.event.pull_request.labels.*.name, 'auto-closed:template') + }} + permissions: + pull-requests: write + steps: + - name: Comment and close + env: + GH_TOKEN: ${{ github.token }} + NODE_ID: ${{ github.event.pull_request.node_id }} + run: | + gh api graphql \ + -f prId="$NODE_ID" \ + -f body="This PR has been automatically closed as the description doesn't follow our template. After you edit it to match the template, the PR will automatically be reopened." \ + -f query=' + mutation CommentAndClosePR($prId: ID!, $body: String!) { + addComment(input: { + subjectId: $prId, + body: $body + }) { + __typename + } + closePullRequest(input: { + pullRequestId: $prId + }) { + __typename + } + }' + + - name: Add label + env: + GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: gh pr edit "$PR_NUMBER" --repo "${{ github.repository }}" --add-label "auto-closed:template" + + close_llm: + runs-on: ubuntu-latest + if: ${{ github.event.action == 'labeled' && github.event.label.name == 'auto-closed:llm' }} + permissions: + pull-requests: write + steps: + - name: Comment and close + env: + GH_TOKEN: ${{ github.token }} + NODE_ID: ${{ github.event.pull_request.node_id }} + run: | + gh api graphql \ + -f prId="$NODE_ID" \ + -f body="Thank you for your interest in contributing to Immich! Unfortunately this PR looks like it was generated using an LLM. As noted in our [CONTRIBUTING.md](https://github.com/immich-app/immich/blob/main/CONTRIBUTING.md#use-of-generative-ai), we request that you don't use LLMs to generate PRs as those are not a good use of maintainer time." \ + -f query=' + mutation CommentAndClosePR($prId: ID!, $body: String!) { + addComment(input: { + subjectId: $prId, + body: $body + }) { + __typename + } + closePullRequest(input: { + pullRequestId: $prId + }) { + __typename + } + }' + + reopen: + runs-on: ubuntu-latest + needs: parse_template + if: >- + ${{ + needs.parse_template.outputs.uses_template == 'true' + && github.event.pull_request.state == 'closed' + && contains(github.event.pull_request.labels.*.name, 'auto-closed:template') + }} + permissions: + pull-requests: write + steps: + - name: Remove template label + env: + GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: gh pr edit "$PR_NUMBER" --repo "${{ github.repository }}" --remove-label "auto-closed:template" || true + + - name: Check for remaining auto-closed labels + id: check_labels + env: + GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + REMAINING=$(gh pr view "$PR_NUMBER" --repo "${{ github.repository }}" --json labels \ + --jq '[.labels[].name | select(startswith("auto-closed:"))] | length') + echo "remaining=$REMAINING" >> "$GITHUB_OUTPUT" + + - name: Reopen PR + if: ${{ steps.check_labels.outputs.remaining == '0' }} + env: + GH_TOKEN: ${{ github.token }} + NODE_ID: ${{ github.event.pull_request.node_id }} + run: | + gh api graphql \ + -f prId="$NODE_ID" \ + -f query=' + mutation ReopenPR($prId: ID!) { + reopenPullRequest(input: { + pullRequestId: $prId + }) { + __typename + } + }' diff --git a/.github/workflows/build-mobile.yml b/.github/workflows/build-mobile.yml index 44645c1e1b..7c106415d8 100644 --- a/.github/workflows/build-mobile.yml +++ b/.github/workflows/build-mobile.yml @@ -51,14 +51,14 @@ jobs: should_run: ${{ steps.check.outputs.should_run }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Check what should run id: check - uses: immich-app/devtools/actions/pre-job@eed0f8b8165ffcb951f2ba854b2dd031935e1d73 # pre-job-action-v2.0.2 + uses: immich-app/devtools/actions/pre-job@f50e3b600b6ac1763ddb8f3dfc69093512b967a1 # pre-job-action-v2.0.3 with: github-token: ${{ steps.token.outputs.token }} filters: | @@ -79,7 +79,7 @@ jobs: steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -103,7 +103,7 @@ jobs: - name: Restore Gradle Cache id: cache-gradle-restore - uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: | ~/.gradle/caches @@ -114,7 +114,7 @@ jobs: key: build-mobile-gradle-${{ runner.os }}-main - name: Setup Flutter SDK - uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0 + uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0 with: channel: 'stable' flutter-version-file: ./mobile/pubspec.yaml @@ -153,14 +153,14 @@ jobs: fi - name: Publish Android Artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: release-apk-signed path: mobile/build/app/outputs/flutter-apk/*.apk - name: Save Gradle Cache id: cache-gradle-save - uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 if: github.ref == 'refs/heads/main' with: path: | @@ -185,13 +185,13 @@ jobs: run: sudo xcode-select -s /Applications/Xcode_26.2.app/Contents/Developer - name: Checkout code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ inputs.ref || github.sha }} persist-credentials: false - name: Setup Flutter SDK - uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2 + uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0 with: channel: 'stable' flutter-version-file: ./mobile/pubspec.yaml @@ -210,7 +210,7 @@ jobs: working-directory: ./mobile - name: Setup Ruby - uses: ruby/setup-ruby@v1 + uses: ruby/setup-ruby@c515ec17f69368147deb311832da000dd229d338 # v1.297.0 with: ruby-version: '3.3' bundler-cache: true @@ -291,7 +291,7 @@ jobs: security delete-keychain build.keychain || true - name: Upload IPA artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: ios-release-ipa path: mobile/ios/Runner.ipa diff --git a/.github/workflows/cache-cleanup.yml b/.github/workflows/cache-cleanup.yml index 3de4676622..e093cf9bf0 100644 --- a/.github/workflows/cache-cleanup.yml +++ b/.github/workflows/cache-cleanup.yml @@ -19,7 +19,7 @@ jobs: actions: write steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} diff --git a/.github/workflows/check-openapi.yml b/.github/workflows/check-openapi.yml index ca9f91bbe8..cd05f320c6 100644 --- a/.github/workflows/check-openapi.yml +++ b/.github/workflows/check-openapi.yml @@ -24,7 +24,7 @@ jobs: persist-credentials: false - name: Check for breaking API changes - uses: oasdiff/oasdiff-action/breaking@65fef71494258f00f911d7a71edb0482c5378899 # v0.0.30 + uses: oasdiff/oasdiff-action/breaking@1f38ea5ea0b4a2e4e49901c3bcdf4386a05e9ea1 # v0.0.37 with: base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json revision: open-api/immich-openapi-specs.json diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index a2c763a0f6..9d08d3f816 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -31,7 +31,7 @@ jobs: working-directory: ./cli steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -42,10 +42,10 @@ jobs: token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './cli/.nvmrc' registry-url: 'https://registry.npmjs.org' @@ -71,7 +71,7 @@ jobs: steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -83,13 +83,13 @@ jobs: token: ${{ steps.token.outputs.token }} - name: Set up QEMU - uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 + uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Login to GitHub Container Registry - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 if: ${{ !github.event.pull_request.head.repo.fork }} with: registry: ghcr.io @@ -104,7 +104,7 @@ jobs: - name: Generate docker image tags id: metadata - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: flavor: | latest=false @@ -115,7 +115,7 @@ jobs: type=raw,value=latest,enable=${{ github.event_name == 'release' }} - name: Build and push image - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2 + uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 with: file: cli/Dockerfile platforms: linux/amd64,linux/arm64 diff --git a/.github/workflows/close-duplicates.yml b/.github/workflows/close-duplicates.yml index 1b18c0c5e1..b73ba5e634 100644 --- a/.github/workflows/close-duplicates.yml +++ b/.github/workflows/close-duplicates.yml @@ -35,7 +35,7 @@ jobs: needs: [get_body, should_run] if: ${{ needs.should_run.outputs.should_run == 'true' }} container: - image: ghcr.io/immich-app/mdq:main@sha256:4f9860d04c88f7f87861f8ee84bfeedaec15ed7ca5ca87bc7db44b036f81645f + image: ghcr.io/immich-app/mdq:main@sha256:df7188ba88abb0800d73cc97d3633280f0c0c3d4c441d678225067bf154150fb outputs: checked: ${{ steps.get_checkbox.outputs.checked }} steps: diff --git a/.github/workflows/close-llm-pr.yml b/.github/workflows/close-llm-pr.yml deleted file mode 100644 index 511d5c7f55..0000000000 --- a/.github/workflows/close-llm-pr.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Close LLM-generated PRs - -on: - pull_request_target: - types: [labeled] - -permissions: {} - -jobs: - comment_and_close: - runs-on: ubuntu-latest - if: ${{ github.event.label.name == 'llm-generated' }} - permissions: - pull-requests: write - steps: - - name: Comment and close - env: - GH_TOKEN: ${{ github.token }} - NODE_ID: ${{ github.event.pull_request.node_id }} - run: | - gh api graphql \ - -f prId="$NODE_ID" \ - -f body="Thank you for your interest in contributing to Immich! Unfortunately this PR looks like it was generated using an LLM. As noted in our [CONTRIBUTING.md](https://github.com/immich-app/immich/blob/main/CONTRIBUTING.md#use-of-generative-ai), we request that you don't use LLMs to generate PRs as those are not a good use of maintainer time." \ - -f query=' - mutation CommentAndClosePR($prId: ID!, $body: String!) { - addComment(input: { - subjectId: $prId, - body: $body - }) { - __typename - } - - closePullRequest(input: { - pullRequestId: $prId - }) { - __typename - } - }' diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4f093a170e..adeacbf271 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -44,7 +44,7 @@ jobs: steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -57,7 +57,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4 + uses: github/codeql-action/init@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -70,7 +70,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4 + uses: github/codeql-action/autobuild@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1 # â„šī¸ 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 @@ -83,6 +83,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4 + uses: github/codeql-action/analyze@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 2573ba8123..d5c327b9e7 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -23,14 +23,14 @@ jobs: should_run: ${{ steps.check.outputs.should_run }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Check what should run id: check - uses: immich-app/devtools/actions/pre-job@eed0f8b8165ffcb951f2ba854b2dd031935e1d73 # pre-job-action-v2.0.2 + uses: immich-app/devtools/actions/pre-job@f50e3b600b6ac1763ddb8f3dfc69093512b967a1 # pre-job-action-v2.0.3 with: github-token: ${{ steps.token.outputs.token }} filters: | @@ -60,7 +60,7 @@ jobs: suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn'] steps: - name: Login to GitHub Container Registry - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -90,7 +90,7 @@ jobs: suffix: [''] steps: - name: Login to GitHub Container Registry - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -132,7 +132,7 @@ jobs: suffixes: '-rocm' platforms: linux/amd64 runner-mapping: '{"linux/amd64": "pokedex-large"}' - uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@bd49ed7a5a6022149f79b6564df48177476a822b # multi-runner-build-workflow-v2.2.1 + uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@61a0fc2b41524edcc7c9fffb8bb178e6b0ccf21d # multi-runner-build-workflow-v2.3.0 permissions: contents: read actions: read @@ -155,7 +155,7 @@ jobs: name: Build and Push Server needs: pre-job if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }} - uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@bd49ed7a5a6022149f79b6564df48177476a822b # multi-runner-build-workflow-v2.2.1 + uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@61a0fc2b41524edcc7c9fffb8bb178e6b0ccf21d # multi-runner-build-workflow-v2.3.0 permissions: contents: read actions: read @@ -178,7 +178,7 @@ jobs: runs-on: ubuntu-latest if: always() steps: - - uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4 + - uses: immich-app/devtools/actions/success-check@53bb77345ee9f953f93bd6fd9980f07a2f24965e # success-check-action-v0.0.5 with: needs: ${{ toJSON(needs) }} @@ -189,6 +189,6 @@ jobs: runs-on: ubuntu-latest if: always() steps: - - uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4 + - uses: immich-app/devtools/actions/success-check@53bb77345ee9f953f93bd6fd9980f07a2f24965e # success-check-action-v0.0.5 with: needs: ${{ toJSON(needs) }} diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml index 28828f22c6..2055bfce65 100644 --- a/.github/workflows/docs-build.yml +++ b/.github/workflows/docs-build.yml @@ -21,14 +21,14 @@ jobs: should_run: ${{ steps.check.outputs.should_run }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Check what should run id: check - uses: immich-app/devtools/actions/pre-job@eed0f8b8165ffcb951f2ba854b2dd031935e1d73 # pre-job-action-v2.0.2 + uses: immich-app/devtools/actions/pre-job@f50e3b600b6ac1763ddb8f3dfc69093512b967a1 # pre-job-action-v2.0.3 with: github-token: ${{ steps.token.outputs.token }} filters: | @@ -54,7 +54,7 @@ jobs: steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -67,10 +67,10 @@ jobs: fetch-depth: 0 - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './docs/.nvmrc' cache: 'pnpm' @@ -86,7 +86,7 @@ jobs: run: pnpm build - name: Upload build output - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: docs-build-output path: docs/build/ diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index babda72c33..05c845ccd1 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -20,7 +20,7 @@ jobs: artifact: ${{ steps.get-artifact.outputs.result }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -119,7 +119,7 @@ jobs: if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -131,7 +131,7 @@ jobs: token: ${{ steps.token.outputs.token }} - name: Setup Mise - uses: immich-app/devtools/actions/use-mise@dab18118da6476e8237ac94080fd937983fecd42 # use-mise-action-v1.1.2 + uses: immich-app/devtools/actions/use-mise@035e80a7d4355d5f087ffb95db9e4a0944c04e56 # use-mise-action-v1.1.3 - name: Load parameters id: parameters diff --git a/.github/workflows/docs-destroy.yml b/.github/workflows/docs-destroy.yml index 05842889cc..bb24a017fe 100644 --- a/.github/workflows/docs-destroy.yml +++ b/.github/workflows/docs-destroy.yml @@ -17,7 +17,7 @@ jobs: pull-requests: write steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -29,7 +29,7 @@ jobs: token: ${{ steps.token.outputs.token }} - name: Setup Mise - uses: immich-app/devtools/actions/use-mise@dab18118da6476e8237ac94080fd937983fecd42 # use-mise-action-v1.1.2 + uses: immich-app/devtools/actions/use-mise@035e80a7d4355d5f087ffb95db9e4a0944c04e56 # use-mise-action-v1.1.3 - name: Destroy Docs Subdomain env: diff --git a/.github/workflows/fix-format.yml b/.github/workflows/fix-format.yml index 1daa279cd2..ae8e0b29ca 100644 --- a/.github/workflows/fix-format.yml +++ b/.github/workflows/fix-format.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 + uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -29,10 +29,10 @@ jobs: persist-credentials: true - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' diff --git a/.github/workflows/merge-translations.yml b/.github/workflows/merge-translations.yml index 392dec5e37..fcda857eda 100644 --- a/.github/workflows/merge-translations.yml +++ b/.github/workflows/merge-translations.yml @@ -31,7 +31,7 @@ jobs: - name: Generate a token id: generate_token if: ${{ inputs.skip != true }} - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 + uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} diff --git a/.github/workflows/pr-label-validation.yml b/.github/workflows/pr-label-validation.yml index e04b32d74f..416e40df0d 100644 --- a/.github/workflows/pr-label-validation.yml +++ b/.github/workflows/pr-label-validation.yml @@ -14,13 +14,13 @@ jobs: pull-requests: write steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Require PR to have a changelog label - uses: mheap/github-action-required-labels@8afbe8ae6ab7647d0c9f0cfa7c2f939650d22509 # v5.5.1 + uses: mheap/github-action-required-labels@0ac283b4e65c1fb28ce6079dea5546ceca98ccbe # v5.5.2 with: token: ${{ steps.token.outputs.token }} mode: exactly diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml index 24f3f8faf1..75ee750e9f 100644 --- a/.github/workflows/pr-labeler.yml +++ b/.github/workflows/pr-labeler.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index a1d31a61ea..dec9b06d67 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -50,7 +50,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 + uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -63,13 +63,13 @@ jobs: ref: main - name: Install uv - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0 + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -124,7 +124,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 + uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -136,13 +136,13 @@ jobs: persist-credentials: false - name: Download APK - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: release-apk-signed github-token: ${{ steps.generate-token.outputs.token }} - name: Create draft release - uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 + uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 with: draft: true tag_name: ${{ needs.bump_version.outputs.version }} @@ -151,6 +151,7 @@ jobs: body_path: misc/release/notes.tmpl files: | docker/docker-compose.yml + docker/docker-compose.rootless.yml docker/example.env docker/hwaccel.ml.yml docker/hwaccel.transcoding.yml diff --git a/.github/workflows/preview-label.yaml b/.github/workflows/preview-label.yaml index dc6f0eff0a..43c971c31b 100644 --- a/.github/workflows/preview-label.yaml +++ b/.github/workflows/preview-label.yaml @@ -14,12 +14,12 @@ jobs: pull-requests: write steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - - uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2 + - uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0 with: github-token: ${{ steps.token.outputs.token }} message-id: 'preview-status' @@ -32,7 +32,7 @@ jobs: pull-requests: write steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -48,14 +48,14 @@ jobs: name: 'preview' }) - - uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2 + - uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0 if: ${{ github.event.pull_request.head.repo.fork }} with: github-token: ${{ steps.token.outputs.token }} message-id: 'preview-status' message: 'PRs from forks cannot have preview environments.' - - uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2 + - uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0 if: ${{ !github.event.pull_request.head.repo.fork }} with: github-token: ${{ steps.token.outputs.token }} diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index 1bcdec4747..d9b6ffb7f5 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -19,7 +19,7 @@ jobs: working-directory: ./open-api/typescript-sdk steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -30,10 +30,10 @@ jobs: token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 # Setup .npmrc file to publish to npm - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './open-api/typescript-sdk/.nvmrc' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index d100dd281f..21e5e25bc6 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -20,14 +20,14 @@ jobs: should_run: ${{ steps.check.outputs.should_run }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Check what should run id: check - uses: immich-app/devtools/actions/pre-job@eed0f8b8165ffcb951f2ba854b2dd031935e1d73 # pre-job-action-v2.0.2 + uses: immich-app/devtools/actions/pre-job@f50e3b600b6ac1763ddb8f3dfc69093512b967a1 # pre-job-action-v2.0.3 with: github-token: ${{ steps.token.outputs.token }} filters: | @@ -49,7 +49,7 @@ jobs: working-directory: ./mobile steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -61,7 +61,7 @@ jobs: token: ${{ steps.token.outputs.token }} - name: Setup Flutter SDK - uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0 + uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0 with: channel: 'stable' flutter-version-file: ./mobile/pubspec.yaml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1cad2b0023..a606aba124 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,14 +17,14 @@ jobs: should_run: ${{ steps.check.outputs.should_run }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Check what should run id: check - uses: immich-app/devtools/actions/pre-job@eed0f8b8165ffcb951f2ba854b2dd031935e1d73 # pre-job-action-v2.0.2 + uses: immich-app/devtools/actions/pre-job@f50e3b600b6ac1763ddb8f3dfc69093512b967a1 # pre-job-action-v2.0.3 with: github-token: ${{ steps.token.outputs.token }} filters: | @@ -63,7 +63,7 @@ jobs: working-directory: ./server steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -75,9 +75,9 @@ jobs: token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -108,7 +108,7 @@ jobs: working-directory: ./cli steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -119,9 +119,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './cli/.nvmrc' cache: 'pnpm' @@ -155,7 +155,7 @@ jobs: working-directory: ./cli steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -166,9 +166,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './cli/.nvmrc' cache: 'pnpm' @@ -197,7 +197,7 @@ jobs: working-directory: ./web steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -208,9 +208,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './web/.nvmrc' cache: 'pnpm' @@ -241,7 +241,7 @@ jobs: working-directory: ./web steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -252,9 +252,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './web/.nvmrc' cache: 'pnpm' @@ -279,7 +279,7 @@ jobs: contents: read steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -290,9 +290,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './web/.nvmrc' cache: 'pnpm' @@ -327,7 +327,7 @@ jobs: working-directory: ./e2e steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -338,9 +338,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './e2e/.nvmrc' cache: 'pnpm' @@ -373,7 +373,7 @@ jobs: working-directory: ./server steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -385,9 +385,9 @@ jobs: submodules: 'recursive' token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -412,7 +412,7 @@ jobs: runner: [ubuntu-latest, ubuntu-24.04-arm] steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -424,9 +424,9 @@ jobs: submodules: 'recursive' token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './e2e/.nvmrc' cache: 'pnpm' @@ -464,7 +464,7 @@ jobs: run: docker compose logs --no-color > docker-compose-logs.txt working-directory: ./e2e - name: Archive Docker logs - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 if: always() with: name: e2e-server-docker-logs-${{ matrix.runner }} @@ -484,7 +484,7 @@ jobs: runner: [ubuntu-latest, ubuntu-24.04-arm] steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -496,9 +496,9 @@ jobs: submodules: 'recursive' token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './e2e/.nvmrc' cache: 'pnpm' @@ -522,7 +522,7 @@ jobs: run: pnpm test:web if: ${{ !cancelled() }} - name: Archive e2e test (web) results - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 if: success() || failure() with: name: e2e-web-test-results-${{ matrix.runner }} @@ -533,7 +533,7 @@ jobs: run: pnpm test:web:ui if: ${{ !cancelled() }} - name: Archive ui test (web) results - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 if: success() || failure() with: name: e2e-ui-test-results-${{ matrix.runner }} @@ -544,7 +544,7 @@ jobs: run: pnpm test:web:maintenance if: ${{ !cancelled() }} - name: Archive maintenance tests (web) results - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 if: success() || failure() with: name: e2e-maintenance-isolated-test-results-${{ matrix.runner }} @@ -554,7 +554,7 @@ jobs: run: docker compose logs --no-color > docker-compose-logs.txt working-directory: ./e2e - name: Archive Docker logs - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 if: always() with: name: e2e-web-docker-logs-${{ matrix.runner }} @@ -566,7 +566,7 @@ jobs: runs-on: ubuntu-latest if: always() steps: - - uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4 + - uses: immich-app/devtools/actions/success-check@53bb77345ee9f953f93bd6fd9980f07a2f24965e # success-check-action-v0.0.5 with: needs: ${{ toJSON(needs) }} mobile-unit-tests: @@ -578,7 +578,7 @@ jobs: contents: read steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -588,7 +588,7 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup Flutter SDK - uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0 + uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0 with: channel: 'stable' flutter-version-file: ./mobile/pubspec.yaml @@ -610,7 +610,7 @@ jobs: working-directory: ./machine-learning steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -620,7 +620,7 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Install uv - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0 + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 with: python-version: 3.11 - name: Install dependencies @@ -650,7 +650,7 @@ jobs: working-directory: ./.github steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -661,9 +661,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './.github/.nvmrc' cache: 'pnpm' @@ -680,7 +680,7 @@ jobs: contents: read steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -701,7 +701,7 @@ jobs: contents: read steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -712,9 +712,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -763,7 +763,7 @@ jobs: working-directory: ./server steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -774,9 +774,9 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - name: Setup Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' diff --git a/.github/workflows/weblate-lock.yml b/.github/workflows/weblate-lock.yml index 6e997ad76a..09024063c0 100644 --- a/.github/workflows/weblate-lock.yml +++ b/.github/workflows/weblate-lock.yml @@ -24,14 +24,14 @@ jobs: should_run: ${{ steps.check.outputs.should_run }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Check what should run id: check - uses: immich-app/devtools/actions/pre-job@eed0f8b8165ffcb951f2ba854b2dd031935e1d73 # pre-job-action-v2.0.2 + uses: immich-app/devtools/actions/pre-job@f50e3b600b6ac1763ddb8f3dfc69093512b967a1 # pre-job-action-v2.0.3 with: github-token: ${{ steps.token.outputs.token }} filters: | @@ -47,7 +47,7 @@ jobs: if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }} steps: - id: token - uses: immich-app/devtools/actions/create-workflow-token@05e16407c0a5492138bb38139c9d9bf067b40886 # create-workflow-token-action-v1.0.1 + uses: immich-app/devtools/actions/create-workflow-token@57ff6ebfd507b045514442683ff06ff1b2f6efbd # create-workflow-token-action-v1.0.2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -68,6 +68,6 @@ jobs: permissions: {} if: always() steps: - - uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4 + - uses: immich-app/devtools/actions/success-check@53bb77345ee9f953f93bd6fd9980f07a2f24965e # success-check-action-v0.0.5 with: needs: ${{ toJSON(needs) }} diff --git a/cli/.nvmrc b/cli/.nvmrc index 32f8c50de0..8e35034890 100644 --- a/cli/.nvmrc +++ b/cli/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.1 diff --git a/cli/package.json b/cli/package.json index d6202e6a1a..4b7da12ebc 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@immich/cli", - "version": "2.5.6", + "version": "2.6.3", "description": "Command Line Interface (CLI) for Immich", "type": "module", "exports": "./dist/index.js", @@ -20,7 +20,7 @@ "@types/lodash-es": "^4.17.12", "@types/micromatch": "^4.0.9", "@types/mock-fs": "^4.13.1", - "@types/node": "^24.11.0", + "@types/node": "^24.12.0", "@vitest/coverage-v8": "^4.0.0", "byte-size": "^9.0.0", "cli-progress": "^3.12.0", @@ -35,8 +35,7 @@ "prettier-plugin-organize-imports": "^4.0.0", "typescript": "^5.3.3", "typescript-eslint": "^8.28.0", - "vite": "^7.0.0", - "vite-tsconfig-paths": "^6.0.0", + "vite": "^8.0.0", "vitest": "^4.0.0", "vitest-fetch-mock": "^0.4.0", "yaml": "^2.3.1" @@ -69,6 +68,6 @@ "micromatch": "^4.0.8" }, "volta": { - "node": "24.13.1" + "node": "24.14.1" } } diff --git a/cli/src/utils.ts b/cli/src/utils.ts index 38bd119459..b60f5e3715 100644 --- a/cli/src/utils.ts +++ b/cli/src/utils.ts @@ -81,7 +81,7 @@ export const connect = async (url: string, key: string) => { const [error] = await withError(getMyUser()); if (isHttpError(error)) { - logError(error, 'Failed to connect to server'); + logError(error, `Failed to connect to server ${url}`); process.exit(1); } diff --git a/cli/vite.config.ts b/cli/vite.config.ts index c69b467011..fc57b9c796 100644 --- a/cli/vite.config.ts +++ b/cli/vite.config.ts @@ -1,10 +1,12 @@ import { defineConfig, UserConfig } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - resolve: { alias: { src: '/src' } }, + resolve: { + alias: { src: '/src' }, + tsconfigPaths: true, + }, build: { - rollupOptions: { + rolldownOptions: { input: 'src/index.ts', output: { dir: 'dist', @@ -16,7 +18,6 @@ export default defineConfig({ // bundle everything except for Node built-ins noExternal: /^(?!node:).*$/, }, - plugins: [tsconfigPaths()], test: { name: 'cli:unit', globals: true, diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 6e435b3c6b..1dac8f2c50 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -90,6 +90,7 @@ services: IMMICH_THIRD_PARTY_BUG_FEATURE_URL: https://github.com/immich-app/immich/issues IMMICH_THIRD_PARTY_DOCUMENTATION_URL: https://docs.immich.app IMMICH_THIRD_PARTY_SUPPORT_URL: https://docs.immich.app/community-guides + IMMICH_HELMET_FILE: 'true' ports: - 9230:9230 - 9231:9231 diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index 4d07794fea..2d185a8487 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -97,7 +97,7 @@ services: command: ['./run.sh', '-disable-reporting'] ports: - 3000:3000 - image: grafana/grafana:12.3.2-ubuntu@sha256:6cca4b429a1dc0d37d401dee54825c12d40056c3c6f3f56e3f0d6318ce77749b + image: grafana/grafana:12.4.2-ubuntu@sha256:78839fe49e1425c02416fa8072591533a72bd9598e563b54a07d78f9e27fb5d3 volumes: - grafana-data:/var/lib/grafana diff --git a/docs/.nvmrc b/docs/.nvmrc index 32f8c50de0..8e35034890 100644 --- a/docs/.nvmrc +++ b/docs/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.1 diff --git a/docs/docs/features/duplicates-utility.md b/docs/docs/features/duplicates-utility.md new file mode 100644 index 0000000000..f790c42708 --- /dev/null +++ b/docs/docs/features/duplicates-utility.md @@ -0,0 +1,28 @@ +# Duplicates Utility + +Immich comes with a duplicates utility to help you detect assets that look visually similar. The duplicate detection feature relies on machine learning and is enabled by default. For more information about when the duplicate detection job runs, see [Jobs and Workers](/administration/jobs-workers). Once an asset has been processed and added to a duplicate group, it becomes available to review in the "Review duplicates" utility, which can be found [here](https://my.immich.app/utilities/duplicates). + +## Reviewing duplicates + +The review duplicates page allows the user to individually select which assets should be kept and which ones should be trashed. When more than one asset is kept, there is an option to automatically put the kept assets into a stack. + +### Automatic preselection + +When using "Deduplicate All" or viewing suggestions, Immich automatically preselects which assets to keep based on: + +1. **Image size in bytes** — larger files are preferred as they typically have higher quality. +2. **Count of EXIF data** — assets with more metadata are preferred. + +### Synchronizing metadata + +When resolving duplicates, metadata from trashed assets is automatically synchronized to the kept assets. The following metadata is synchronized: + +| Name | Description | +| ----------- | ------------------------------------------------------------------------------------------------------------------------------- | +| Album | The kept assets will be added to _every_ album that the other assets in the group belong to. | +| Favorite | If any of the assets in the group have been added to favorites, every kept asset will also be added to favorites. | +| Rating | If one or more assets in the duplicate group have a rating, the highest rating is selected and synchronized to the kept assets. | +| Description | Descriptions from each asset are combined together and synchronized to all the kept assets. | +| Visibility | The most restrictive visibility is applied to the kept assets. | +| Location | Latitude and longitude are copied if all assets with geolocation data in the group share the same coordinates. | +| Tag | Tags from all assets in the group are merged and applied to every kept asset. | diff --git a/docs/docs/guides/custom-map-styles.md b/docs/docs/guides/custom-map-styles.md index 1a61afc324..ac693c16ba 100644 --- a/docs/docs/guides/custom-map-styles.md +++ b/docs/docs/guides/custom-map-styles.md @@ -3,8 +3,8 @@ You may decide that you'd like to modify the style document which is used to draw the maps in Immich. In addition to visual customization, this also allows you to pick your own map tile provider instead of the default one. The default -`style.json` for [light theme](https://github.com/immich-app/immich/tree/main/server/resources/style-light.json) -and [dark theme](https://github.com/immich-app/immich/blob/main/server/resources/style-dark.json) +`style.json` for [light theme](https://tiles.immich.cloud/v1/style/light.json) +and [dark theme](https://tiles.immich.cloud/v1/style/dark.json) can be used as a basis for creating your own style. There are several sources for already-made `style.json` map themes, as well as diff --git a/docs/docs/install/environment-variables.md b/docs/docs/install/environment-variables.md index e9e3bb032c..41068dee97 100644 --- a/docs/docs/install/environment-variables.md +++ b/docs/docs/install/environment-variables.md @@ -29,22 +29,23 @@ These environment variables are used by the `docker-compose.yml` file and do **N ## General -| Variable | Description | Default | Containers | Workers | -| :---------------------------------- | :---------------------------------------------------------------------------------------- | :--------------------------: | :----------------------- | :----------------- | -| `TZ` | Timezone | \*1 | 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_LOG_FORMAT` | Log output format (`console`, `json`) | `console` | server | api, microservices | -| `IMMICH_MEDIA_LOCATION` | Media location inside the container âš ī¸**You probably shouldn't set this**\*2âš ī¸ | `/data` | server | api, microservices | -| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices | -| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | | -| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | | -| `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_IGNORE_MOUNT_CHECK_ERRORS` | See [System Integrity](/administration/system-integrity) | | server | api, microservices | -| `IMMICH_ALLOW_SETUP` | When `false` disables the `/auth/admin-sign-up` endpoint | `true` | server | api | +| Variable | Description | Default | Containers | Workers | +| :---------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------: | :----------------------- | :----------------- | +| `TZ` | Timezone | \*1 | 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_LOG_FORMAT` | Log output format (`console`, `json`) | `console` | server | api, microservices | +| `IMMICH_MEDIA_LOCATION` | Media location inside the container âš ī¸**You probably shouldn't set this**\*2âš ī¸ | `/data` | server | api, microservices | +| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices | +| `IMMICH_HELMET_FILE` | Path to a json file with [helmet](https://www.npmjs.com/package/helmet) options. Set to `false` to disable. Set to `true` to use `server/helmet.json`. | `false` | 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 | | +| `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_IGNORE_MOUNT_CHECK_ERRORS` | See [System Integrity](/administration/system-integrity) | | server | api, microservices | +| `IMMICH_ALLOW_SETUP` | When `false` disables the `/auth/admin-sign-up` endpoint | `true` | server | api | \*1: `TZ` should be set to a `TZ identifier` from [this list][tz-list]. For example, `TZ="Etc/UTC"`. `TZ` is used by `exiftool` as a fallback in case the timezone cannot be determined from the image metadata. It is also used for logfile timestamps and cron job execution. diff --git a/docs/docs/install/requirements.md b/docs/docs/install/requirements.md index ee5db45c9a..178cf45388 100644 --- a/docs/docs/install/requirements.md +++ b/docs/docs/install/requirements.md @@ -8,7 +8,7 @@ Hardware and software requirements for Immich: ## Hardware -- **OS**: Recommended Linux or \*nix operating system (Ubuntu, Debian, etc). +- **OS**: Recommended Linux or \*nix 64-bit operating system (Ubuntu, Debian, etc). - Non-Linux OSes tend to provide a poor Docker experience and are strongly discouraged. Our ability to assist with setup or troubleshooting on non-Linux OSes will be severely reduced. If you still want to try to use a non-Linux OS, you can set it up as follows: @@ -19,6 +19,10 @@ Hardware and software requirements for Immich: If you have issues, we recommend that you switch to a supported VM deployment. - **RAM**: Minimum 6GB, recommended 8GB. - **CPU**: Minimum 2 cores, recommended 4 cores. + - Immich runs on the `amd64` and `arm64` platforms. + Since `v2.6`, the machine learning container on `amd64` requires the `>= x86-64-v2` [microarchitecture level](https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels). + Most CPUs released since ~2012 support this microarchitecture. + If you are using a virtual machine, ensure you have selected a [supported microarchitecture](https://pve.proxmox.com/pve-docs/chapter-qm.html#_qemu_cpu_types). - **Storage**: Recommended Unix-compatible filesystem (EXT4, ZFS, APFS, etc.) with support for user/group ownership and permissions. - The generation of thumbnails and transcoded video can increase the size of the photo library by 10-20% on average. diff --git a/docs/package.json b/docs/package.json index 60a6dccf87..03dae60b33 100644 --- a/docs/package.json +++ b/docs/package.json @@ -58,6 +58,6 @@ "node": ">=20" }, "volta": { - "node": "24.13.1" + "node": "24.14.1" } } diff --git a/docs/static/archived-versions.json b/docs/static/archived-versions.json index 564eeafa94..afaa584882 100644 --- a/docs/static/archived-versions.json +++ b/docs/static/archived-versions.json @@ -1,4 +1,8 @@ [ + { + "label": "v2.6.3", + "url": "https://docs.v2.6.3.archive.immich.app" + }, { "label": "v2.5.6", "url": "https://docs.v2.5.6.archive.immich.app" diff --git a/e2e-auth-server/auth-server.ts b/e2e-auth-server/auth-server.ts index a190ecd023..9aef56510d 100644 --- a/e2e-auth-server/auth-server.ts +++ b/e2e-auth-server/auth-server.ts @@ -10,6 +10,7 @@ export enum OAuthClient { export enum OAuthUser { NO_EMAIL = 'no-email', NO_NAME = 'no-name', + ID_TOKEN_CLAIMS = 'id-token-claims', WITH_QUOTA = 'with-quota', WITH_USERNAME = 'with-username', WITH_ROLE = 'with-role', @@ -52,12 +53,25 @@ const withDefaultClaims = (sub: string) => ({ email_verified: true, }); -const getClaims = (sub: string) => claims.find((user) => user.sub === sub) || withDefaultClaims(sub); +const getClaims = (sub: string, use?: string) => { + if (sub === OAuthUser.ID_TOKEN_CLAIMS) { + return { + sub, + email: `oauth-${sub}@immich.app`, + email_verified: true, + name: use === 'id_token' ? 'ID Token User' : 'Userinfo User', + }; + } + return claims.find((user) => user.sub === sub) || withDefaultClaims(sub); +}; const setup = async () => { const { privateKey, publicKey } = await generateKeyPair('RS256'); - const redirectUris = ['http://127.0.0.1:2285/auth/login', 'https://photos.immich.app/oauth/mobile-redirect']; + const redirectUris = [ + 'http://127.0.0.1:2285/auth/login', + 'https://photos.immich.app/oauth/mobile-redirect', + ]; const port = 2286; const host = '0.0.0.0'; const oidc = new Provider(`http://${host}:${port}`, { @@ -66,7 +80,10 @@ const setup = async () => { console.error(error); ctx.body = 'Internal Server Error'; }, - findAccount: (ctx, sub) => ({ accountId: sub, claims: () => getClaims(sub) }), + findAccount: (ctx, sub) => ({ + accountId: sub, + claims: (use) => getClaims(sub, use), + }), scopes: ['openid', 'email', 'profile'], claims: { openid: ['sub'], @@ -94,6 +111,7 @@ const setup = async () => { state: 'oidc.state', }, }, + conformIdTokenClaims: false, pkce: { required: () => false, }, @@ -125,7 +143,10 @@ const setup = async () => { ], }); - const onStart = () => console.log(`[e2e-auth-server] http://${host}:${port}/.well-known/openid-configuration`); + const onStart = () => + console.log( + `[e2e-auth-server] http://${host}:${port}/.well-known/openid-configuration`, + ); const app = oidc.listen(port, host, onStart); return () => app.close(); }; diff --git a/e2e/.nvmrc b/e2e/.nvmrc index 32f8c50de0..8e35034890 100644 --- a/e2e/.nvmrc +++ b/e2e/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.1 diff --git a/e2e/package.json b/e2e/package.json index 34aedf3c46..d545fa1b86 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,6 +1,6 @@ { "name": "immich-e2e", - "version": "2.5.6", + "version": "2.6.3", "description": "", "main": "index.js", "type": "module", @@ -32,7 +32,7 @@ "@playwright/test": "^1.44.1", "@socket.io/component-emitter": "^3.1.2", "@types/luxon": "^3.4.2", - "@types/node": "^24.11.0", + "@types/node": "^24.12.0", "@types/pg": "^8.15.1", "@types/pngjs": "^6.0.4", "@types/supertest": "^6.0.2", @@ -58,6 +58,6 @@ "vitest": "^4.0.0" }, "volta": { - "node": "24.13.1" + "node": "24.14.1" } } diff --git a/e2e/src/api/specs/duplicate.e2e-spec.ts b/e2e/src/api/specs/duplicate.e2e-spec.ts new file mode 100644 index 0000000000..d6d0ec1394 --- /dev/null +++ b/e2e/src/api/specs/duplicate.e2e-spec.ts @@ -0,0 +1,651 @@ +import { LoginResponseDto } from '@immich/sdk'; +import { createUserDto, uuidDto } from 'src/fixtures'; +import { errorDto } from 'src/responses'; +import { app, utils } from 'src/utils'; +import request from 'supertest'; +import { beforeAll, beforeEach, describe, expect, it } from 'vitest'; + +describe('/duplicates', () => { + let admin: LoginResponseDto; + let user1: LoginResponseDto; + let user2: LoginResponseDto; + + beforeAll(async () => { + await utils.resetDatabase(); + + admin = await utils.adminSetup(); + + [user1, user2] = await Promise.all([ + utils.userSetup(admin.accessToken, createUserDto.user1), + utils.userSetup(admin.accessToken, createUserDto.user2), + ]); + }); + + beforeEach(async () => { + // Reset assets, albums, tags, and stacks between tests to ensure clean state for repeated test runs + // Note: We don't reset users since they're set up once in beforeAll + // Stack must be reset before asset due to foreign key constraint + await utils.resetDatabase(['stack', 'asset', 'album', 'tag']); + }); + + describe('GET /duplicates', () => { + it('should return empty array when no duplicates', async () => { + const { status, body } = await request(app) + .get('/duplicates') + .set('Authorization', `Bearer ${user1.accessToken}`); + + expect(status).toBe(200); + expect(body).toEqual([]); + }); + + it('should return duplicate groups with suggestedKeepAssetIds', async () => { + // Create assets with different file sizes for duplicate detection + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Manually set duplicateId on both assets to create a duplicate group + const duplicateId = '00000000-0000-4000-8000-000000000001'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .get('/duplicates') + .set('Authorization', `Bearer ${user1.accessToken}`); + + expect(status).toBe(200); + expect(body).toEqual([ + { + duplicateId, + assets: expect.arrayContaining([ + expect.objectContaining({ id: asset1.id }), + expect.objectContaining({ id: asset2.id }), + ]), + suggestedKeepAssetIds: expect.any(Array), + }, + ]); + expect(body[0].suggestedKeepAssetIds.length).toBe(1); + }); + }); + + describe('POST /duplicates/resolve', () => { + it('should require authentication', async () => { + const { status, body } = await request(app) + .post('/duplicates/resolve') + .send({ + groups: [{ duplicateId: uuidDto.dummy, keepAssetIds: [], trashAssetIds: [] }], + }); + + expect(status).toBe(401); + expect(body).toEqual(errorDto.unauthorized); + }); + + it('should return failure for non-existent duplicate group', async () => { + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId: uuidDto.dummy, keepAssetIds: [], trashAssetIds: [] }], + }); + + expect(status).toBe(200); + expect(body).toEqual({ + status: 'COMPLETED', + results: [ + { + duplicateId: uuidDto.dummy, + status: 'FAILED', + reason: expect.stringContaining('not found or access denied'), + }, + ], + }); + }); + + it('should resolve duplicate group with keepers', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000002'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body).toEqual({ + status: 'COMPLETED', + results: [ + { + duplicateId, + status: 'SUCCESS', + }, + ], + }); + + // Verify side effects: duplicateId cleared on kept asset + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.duplicateId).toBeNull(); + + // Verify side effects: trashed asset is trashed and duplicateId cleared + const trashedAsset = await utils.getAssetInfo(user1.accessToken, asset2.id); + expect(trashedAsset.isTrashed).toBe(true); + expect(trashedAsset.duplicateId).toBeNull(); + }); + + it('should reject when keepAssetIds and trashAssetIds overlap', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000003'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset1.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('FAILED'); + expect(body.results[0].reason).toContain('disjoint'); + }); + + it('should require keepAssetIds when partially trashing', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000004'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [], trashAssetIds: [asset1.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('FAILED'); + expect(body.results[0].reason).toContain('must cover all assets'); + }); + + it('should reject partial resolution (not all assets covered)', async () => { + const [asset1, asset2, asset3] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000010'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset3.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('FAILED'); + expect(body.results[0].reason).toContain('must cover all assets'); + }); + + it('should reject asset not in duplicate group', async () => { + const [asset1, asset2, outsideAsset] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000011'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [outsideAsset.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('FAILED'); + expect(body.results[0].reason).toContain('not a member of duplicate group'); + }); + + it('should allow trash-all without keepers', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000012'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [], trashAssetIds: [asset1.id, asset2.id] }], + }); + + expect(status).toBe(200); + expect(body).toEqual({ + status: 'COMPLETED', + results: [ + { + duplicateId, + status: 'SUCCESS', + }, + ], + }); + + // Verify both assets are trashed + const [asset1Info, asset2Info] = await Promise.all([ + utils.getAssetInfo(user1.accessToken, asset1.id), + utils.getAssetInfo(user1.accessToken, asset2.id), + ]); + + expect(asset1Info.isTrashed).toBe(true); + expect(asset1Info.duplicateId).toBeNull(); + expect(asset2Info.isTrashed).toBe(true); + expect(asset2Info.duplicateId).toBeNull(); + }); + + it('should reject cross-user duplicate group access', async () => { + const asset1 = await utils.createAsset(user1.accessToken); + const asset2 = await utils.createAsset(user2.accessToken); + + const duplicateId = '00000000-0000-4000-8000-000000000013'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user2.accessToken, asset2.id, duplicateId); + + // User1 tries to resolve a group containing user2's asset + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('FAILED'); + expect(body.results[0].reason).toContain('not a member of duplicate group'); + }); + + it('should synchronize favorites when enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Mark one asset as favorite + await request(app) + .put('/assets') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ ids: [asset2.id], isFavorite: true }); + + const duplicateId = '00000000-0000-4000-8000-000000000020'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify favorite was synchronized to keeper + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.isFavorite).toBe(true); + expect(keptAsset.duplicateId).toBeNull(); + }); + + it('should synchronize visibility when enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Archive one asset + await utils.archiveAssets(user1.accessToken, [asset2.id]); + + const duplicateId = '00000000-0000-4000-8000-000000000021'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify visibility was synchronized to keeper + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.visibility).toBe('archive'); + expect(keptAsset.duplicateId).toBeNull(); + }); + + it('should synchronize rating when enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Set rating on one asset + await request(app) + .put('/assets') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ ids: [asset2.id], rating: 5 }); + + const duplicateId = '00000000-0000-4000-8000-000000000022'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify rating was synchronized to keeper + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.exifInfo?.rating).toBe(5); + expect(keptAsset.duplicateId).toBeNull(); + }); + + it('should synchronize description when enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Set description on one asset + await request(app) + .put('/assets') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ ids: [asset2.id], description: 'Test description for duplicate' }); + + const duplicateId = '00000000-0000-4000-8000-000000000023'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify description was synchronized to keeper + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.exifInfo?.description).toBe('Test description for duplicate'); + expect(keptAsset.duplicateId).toBeNull(); + }); + + it('should synchronize location when enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Set location on one asset + await request(app) + .put('/assets') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ ids: [asset2.id], latitude: 40.7128, longitude: -74.006 }); + + const duplicateId = '00000000-0000-4000-8000-000000000024'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify location was synchronized to keeper + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.exifInfo?.latitude).toBe(40.7128); + expect(keptAsset.exifInfo?.longitude).toBe(-74.006); + expect(keptAsset.duplicateId).toBeNull(); + }); + + it('should synchronize albums when enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Create albums and add assets to different albums + const album1 = await utils.createAlbum(user1.accessToken, { + albumName: 'Album 1', + assetIds: [asset1.id], + }); + const album2 = await utils.createAlbum(user1.accessToken, { + albumName: 'Album 2', + assetIds: [asset2.id], + }); + + const duplicateId = '00000000-0000-4000-8000-000000000025'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify keeper is now in both albums + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.duplicateId).toBeNull(); + + // Check albums directly + const { status: album1Status, body: album1Body } = await request(app) + .get(`/albums/${album1.id}`) + .set('Authorization', `Bearer ${user1.accessToken}`); + const { status: album2Status, body: album2Body } = await request(app) + .get(`/albums/${album2.id}`) + .set('Authorization', `Bearer ${user1.accessToken}`); + + expect(album1Status).toBe(200); + expect(album2Status).toBe(200); + expect(album1Body.assets.map((a: any) => a.id)).toContain(asset1.id); + expect(album2Body.assets.map((a: any) => a.id)).toContain(asset1.id); + }); + + it('should synchronize tags when enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + // Wait for metadata extraction to complete before adding tags + // Otherwise, metadata jobs will race and overwrite our tags + await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction'); + + // Create tags and tag assets differently + const tags = await utils.upsertTags(user1.accessToken, ['tag1', 'tag2']); + await utils.tagAssets(user1.accessToken, tags[0].id, [asset1.id]); + await utils.tagAssets(user1.accessToken, tags[1].id, [asset2.id]); + + const duplicateId = '00000000-0000-4000-8000-000000000026'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify keeper has both tags + const keptAsset = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(keptAsset.duplicateId).toBeNull(); + expect(keptAsset.tags).toBeDefined(); + const tagIds = keptAsset.tags?.map((t) => t.id) || []; + expect(tagIds).toContain(tags[0].id); + expect(tagIds).toContain(tags[1].id); + }); + + it('should handle batch resolve with mixed success and failure', async () => { + // Create first group that will succeed + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + const duplicateId1 = '00000000-0000-4000-8000-000000000027'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId1); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId1); + + // Create second group with non-existent duplicate ID (will fail) + const fakeId = '00000000-0000-4000-8000-000000000099'; + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [ + { duplicateId: duplicateId1, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }, + { duplicateId: fakeId, keepAssetIds: [], trashAssetIds: [] }, + ], + }); + + expect(status).toBe(200); + expect(body.status).toBe('COMPLETED'); + expect(body.results).toHaveLength(2); + + // First group should succeed + expect(body.results[0].duplicateId).toBe(duplicateId1); + expect(body.results[0].status).toBe('SUCCESS'); + + // Second group should fail + expect(body.results[1].duplicateId).toBe(fakeId); + expect(body.results[1].status).toBe('FAILED'); + expect(body.results[1].reason).toContain('not found or access denied'); + + // Verify first group was actually resolved despite second failure + const asset1Info = await utils.getAssetInfo(user1.accessToken, asset1.id); + expect(asset1Info.duplicateId).toBeNull(); + const asset2Info = await utils.getAssetInfo(user1.accessToken, asset2.id); + expect(asset2Info.isTrashed).toBe(true); + }); + + it('should trash assets when trash is enabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000028'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + // Ensure trash is enabled (default) + const config = await utils.getSystemConfig(admin.accessToken); + expect(config.trash.enabled).toBe(true); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Verify asset is trashed (not deleted) + const trashedAsset = await utils.getAssetInfo(user1.accessToken, asset2.id); + expect(trashedAsset.isTrashed).toBe(true); + }); + + it('should delete assets when trash is disabled', async () => { + const [asset1, asset2] = await Promise.all([ + utils.createAsset(user1.accessToken), + utils.createAsset(user1.accessToken), + ]); + + const duplicateId = '00000000-0000-4000-8000-000000000029'; + await utils.setAssetDuplicateId(user1.accessToken, asset1.id, duplicateId); + await utils.setAssetDuplicateId(user1.accessToken, asset2.id, duplicateId); + + // Disable trash + await request(app) + .put('/system-config') + .set('Authorization', `Bearer ${admin.accessToken}`) + .send({ + trash: { enabled: false, days: 30 }, + }); + + const { status, body } = await request(app) + .post('/duplicates/resolve') + .set('Authorization', `Bearer ${user1.accessToken}`) + .send({ + groups: [{ duplicateId, keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(status).toBe(200); + expect(body.results[0].status).toBe('SUCCESS'); + + // Asset should be marked as deleted (force delete) + const { status: getStatus } = await request(app) + .get(`/assets/${asset2.id}`) + .set('Authorization', `Bearer ${user1.accessToken}`); + + // Asset should still be accessible (soft deleted) but marked as deleted + expect(getStatus).toBe(200); + + // Re-enable trash for other tests + await utils.resetAdminConfig(admin.accessToken); + }); + }); +}); diff --git a/e2e/src/fixtures.ts b/e2e/src/fixtures.ts index 9e311c896d..1e03ad6d24 100644 --- a/e2e/src/fixtures.ts +++ b/e2e/src/fixtures.ts @@ -2,6 +2,8 @@ export const uuidDto = { invalid: 'invalid-uuid', // valid uuid v4 notFound: '00000000-0000-4000-a000-000000000000', + dummy: '00000000-0000-4000-a000-000000000001', + dummy2: '00000000-0000-4000-a000-000000000002', }; const adminLoginDto = { diff --git a/e2e/src/specs/maintenance/server/database-backups.e2e-spec.ts b/e2e/src/specs/maintenance/server/database-backups.e2e-spec.ts index 2b0f6ae61a..b69bd099ed 100644 --- a/e2e/src/specs/maintenance/server/database-backups.e2e-spec.ts +++ b/e2e/src/specs/maintenance/server/database-backups.e2e-spec.ts @@ -10,7 +10,9 @@ describe('/admin/database-backups', () => { beforeAll(async () => { await utils.resetDatabase(); - admin = await utils.adminSetup(); + admin = await utils.adminSetup({ + onboarding: false, + }); await utils.resetBackups(admin.accessToken); }); @@ -94,7 +96,9 @@ describe('/admin/database-backups', () => { ({ status, body }) => status === 200 && !body.maintenanceMode, ); - admin = await utils.adminSetup(); + admin = await utils.adminSetup({ + onboarding: false, + }); }); it.sequential('should not work when the server is configured', async () => { diff --git a/e2e/src/specs/server/api/album.e2e-spec.ts b/e2e/src/specs/server/api/album.e2e-spec.ts index c4f06edd93..a9e90940ab 100644 --- a/e2e/src/specs/server/api/album.e2e-spec.ts +++ b/e2e/src/specs/server/api/album.e2e-spec.ts @@ -524,14 +524,19 @@ describe('/albums', () => { expect(body).toEqual(errorDto.badRequest('Not found or no album.update access')); }); - it('should not be able to update as an editor', async () => { + it('should be able to update as an editor', async () => { const { status, body } = await request(app) .patch(`/albums/${user1Albums[0].id}`) .set('Authorization', `Bearer ${user2.accessToken}`) .send({ albumName: 'New album name' }); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest('Not found or no album.update access')); + expect(status).toBe(200); + expect(body).toEqual( + expect.objectContaining({ + id: user1Albums[0].id, + albumName: 'New album name', + }), + ); }); }); diff --git a/e2e/src/specs/server/api/oauth.e2e-spec.ts b/e2e/src/specs/server/api/oauth.e2e-spec.ts index cbd68c003a..ae9064375f 100644 --- a/e2e/src/specs/server/api/oauth.e2e-spec.ts +++ b/e2e/src/specs/server/api/oauth.e2e-spec.ts @@ -380,4 +380,23 @@ describe(`/oauth`, () => { }); }); }); + + describe('idTokenClaims', () => { + it('should use claims from the ID token if IDP includes them', async () => { + await setupOAuth(admin.accessToken, { + enabled: true, + clientId: OAuthClient.DEFAULT, + clientSecret: OAuthClient.DEFAULT, + }); + const callbackParams = await loginWithOAuth(OAuthUser.ID_TOKEN_CLAIMS); + const { status, body } = await request(app).post('/oauth/callback').send(callbackParams); + expect(status).toBe(201); + expect(body).toMatchObject({ + accessToken: expect.any(String), + name: 'ID Token User', + userEmail: 'oauth-id-token-claims@immich.app', + userId: expect.any(String), + }); + }); + }); }); diff --git a/e2e/src/specs/server/api/shared-link.e2e-spec.ts b/e2e/src/specs/server/api/shared-link.e2e-spec.ts index 80232beb75..00c455d6cb 100644 --- a/e2e/src/specs/server/api/shared-link.e2e-spec.ts +++ b/e2e/src/specs/server/api/shared-link.e2e-spec.ts @@ -438,6 +438,16 @@ describe('/shared-links', () => { expect(body).toEqual(errorDto.badRequest('Invalid shared link type')); }); + it('should reject guests removing assets from an individual shared link', async () => { + const { status, body } = await request(app) + .delete(`/shared-links/${linkWithAssets.id}/assets`) + .query({ key: linkWithAssets.key }) + .send({ assetIds: [asset1.id] }); + + expect(status).toBe(403); + expect(body).toEqual(errorDto.forbidden); + }); + it('should remove assets from a shared link (individual)', async () => { const { status, body } = await request(app) .delete(`/shared-links/${linkWithAssets.id}/assets`) diff --git a/e2e/src/specs/web/album.e2e-spec.ts b/e2e/src/specs/web/album.e2e-spec.ts index 953c7d00ae..cd8bb87582 100644 --- a/e2e/src/specs/web/album.e2e-spec.ts +++ b/e2e/src/specs/web/album.e2e-spec.ts @@ -1,6 +1,7 @@ import { LoginResponseDto } from '@immich/sdk'; -import { test } from '@playwright/test'; -import { utils } from 'src/utils'; +import { expect, test } from '@playwright/test'; +import { readFileSync } from 'node:fs'; +import { testAssetDir, utils } from 'src/utils'; test.describe('Album', () => { let admin: LoginResponseDto; @@ -22,4 +23,41 @@ test.describe('Album', () => { await page.reload(); await page.getByRole('button', { name: 'Select photos' }).waitFor(); }); + + test('should keep map view open after viewing an asset from the map and going back', async ({ context, page }) => { + await utils.setAuthCookies(context, admin.accessToken); + + const imagePath = `${testAssetDir}/metadata/gps-position/thompson-springs.jpg`; + const mapAsset = await utils.createAsset(admin.accessToken, { + assetData: { + bytes: readFileSync(imagePath), + filename: 'thompson-springs.jpg', + }, + }); + + await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction'); + + const mapAlbum = await utils.createAlbum(admin.accessToken, { + albumName: 'Map Test Album', + assetIds: [mapAsset.id], + }); + + await page.goto(`/albums/${mapAlbum.id}`); + const mapButton = page.getByRole('button', { name: 'Map' }); + await expect(mapButton).toBeVisible(); + await mapButton.click(); + + const mapModal = page.getByRole('dialog'); + await expect(mapModal).toBeVisible(); + + const mapMarker = mapModal.getByRole('img', { name: /Map marker/i }).first(); + await expect(mapMarker).toBeVisible(); + await mapMarker.click(); + + await page.waitForSelector('#immich-asset-viewer'); + await page.getByRole('button', { name: 'Go back' }).click(); + + await expect(page.locator('#immich-asset-viewer')).not.toBeVisible(); + await expect(mapModal).toBeVisible(); + }); }); diff --git a/e2e/src/specs/web/duplicates.e2e-spec.ts b/e2e/src/specs/web/duplicates.e2e-spec.ts new file mode 100644 index 0000000000..34f11cdf78 --- /dev/null +++ b/e2e/src/specs/web/duplicates.e2e-spec.ts @@ -0,0 +1,51 @@ +import { AssetMediaResponseDto, LoginResponseDto, updateAssets } from '@immich/sdk'; +import { expect, test } from '@playwright/test'; +import crypto from 'node:crypto'; +import { asBearerAuth, utils } from 'src/utils'; + +test.describe('Duplicates Utility', () => { + let admin: LoginResponseDto; + let firstAsset: AssetMediaResponseDto; + let secondAsset: AssetMediaResponseDto; + + test.beforeAll(async () => { + utils.initSdk(); + await utils.resetDatabase(); + admin = await utils.adminSetup(); + }); + + test.beforeEach(async ({ context }) => { + [firstAsset, secondAsset] = await Promise.all([ + utils.createAsset(admin.accessToken, { deviceAssetId: 'duplicate-a' }), + utils.createAsset(admin.accessToken, { deviceAssetId: 'duplicate-b' }), + ]); + + await updateAssets( + { + assetBulkUpdateDto: { + ids: [firstAsset.id, secondAsset.id], + duplicateId: crypto.randomUUID(), + }, + }, + { headers: asBearerAuth(admin.accessToken) }, + ); + + await utils.setAuthCookies(context, admin.accessToken); + }); + + test('navigates with arrow keys between duplicate preview assets', async ({ page }) => { + await page.goto('/utilities/duplicates'); + await page.getByRole('button', { name: 'View' }).first().click(); + await page.waitForSelector('#immich-asset-viewer'); + + const getViewedAssetId = () => new URL(page.url()).pathname.split('/').at(-1) ?? ''; + const initialAssetId = getViewedAssetId(); + expect([firstAsset.id, secondAsset.id]).toContain(initialAssetId); + + await page.keyboard.press('ArrowRight'); + await expect.poll(getViewedAssetId).not.toBe(initialAssetId); + + await page.keyboard.press('ArrowLeft'); + await expect.poll(getViewedAssetId).toBe(initialAssetId); + }); +}); diff --git a/e2e/src/specs/web/photo-viewer.e2e-spec.ts b/e2e/src/specs/web/photo-viewer.e2e-spec.ts index 88b61278bc..76d9d61ed6 100644 --- a/e2e/src/specs/web/photo-viewer.e2e-spec.ts +++ b/e2e/src/specs/web/photo-viewer.e2e-spec.ts @@ -64,6 +64,20 @@ test.describe('Photo Viewer', () => { await expect(original).toHaveAttribute('src', /fullsize/); }); + test('right-click targets the img element', async ({ page }) => { + await page.goto(`/photos/${asset.id}`); + + const preview = page.getByTestId('preview').filter({ visible: true }); + await expect(preview).toHaveAttribute('src', /.+/); + + const box = await preview.boundingBox(); + const tagAtCenter = await page.evaluate(({ x, y }) => document.elementFromPoint(x, y)?.tagName, { + x: box!.x + box!.width / 2, + y: box!.y + box!.height / 2, + }); + expect(tagAtCenter).toBe('IMG'); + }); + test('reloads photo when checksum changes', async ({ page }) => { await page.goto(`/photos/${asset.id}`); diff --git a/e2e/src/specs/web/shared-link.e2e-spec.ts b/e2e/src/specs/web/shared-link.e2e-spec.ts index f6d1ec98d4..8380840935 100644 --- a/e2e/src/specs/web/shared-link.e2e-spec.ts +++ b/e2e/src/specs/web/shared-link.e2e-spec.ts @@ -12,15 +12,18 @@ import { asBearerAuth, utils } from 'src/utils'; test.describe('Shared Links', () => { let admin: LoginResponseDto; let asset: AssetMediaResponseDto; + let asset2: AssetMediaResponseDto; let album: AlbumResponseDto; let sharedLink: SharedLinkResponseDto; let sharedLinkPassword: SharedLinkResponseDto; + let individualSharedLink: SharedLinkResponseDto; test.beforeAll(async () => { utils.initSdk(); await utils.resetDatabase(); admin = await utils.adminSetup(); asset = await utils.createAsset(admin.accessToken); + asset2 = await utils.createAsset(admin.accessToken); album = await createAlbum( { createAlbumDto: { @@ -39,6 +42,10 @@ test.describe('Shared Links', () => { albumId: album.id, password: 'test-password', }); + individualSharedLink = await utils.createSharedLink(admin.accessToken, { + type: SharedLinkType.Individual, + assetIds: [asset.id, asset2.id], + }); }); test('download from a shared link', async ({ page }) => { @@ -109,4 +116,21 @@ test.describe('Shared Links', () => { await page.waitForURL('/photos'); await page.locator(`[data-asset-id="${asset.id}"]`).waitFor(); }); + + test('owner can remove assets from an individual shared link', async ({ context, page }) => { + await utils.setAuthCookies(context, admin.accessToken); + + await page.goto(`/share/${individualSharedLink.key}`); + await page.locator(`[data-asset="${asset.id}"]`).waitFor(); + await expect(page.locator(`[data-asset]`)).toHaveCount(2); + + await page.locator(`[data-asset="${asset.id}"]`).hover(); + await page.locator(`[data-asset="${asset.id}"] [role="checkbox"]`).click(); + + await page.getByRole('button', { name: 'Remove from shared link' }).click(); + await page.getByRole('button', { name: 'Remove', exact: true }).click(); + + await expect(page.locator(`[data-asset="${asset.id}"]`)).toHaveCount(0); + await expect(page.locator(`[data-asset="${asset2.id}"]`)).toHaveCount(1); + }); }); diff --git a/e2e/src/ui/mock-network/ocr-network.ts b/e2e/src/ui/mock-network/ocr-network.ts new file mode 100644 index 0000000000..3b1a2fe62e --- /dev/null +++ b/e2e/src/ui/mock-network/ocr-network.ts @@ -0,0 +1,55 @@ +import { faker } from '@faker-js/faker'; +import type { AssetOcrResponseDto } from '@immich/sdk'; +import { BrowserContext } from '@playwright/test'; + +export type MockOcrBox = { + text: string; + x1: number; + y1: number; + x2: number; + y2: number; + x3: number; + y3: number; + x4: number; + y4: number; +}; + +export const createMockOcrData = (assetId: string, boxes: MockOcrBox[]): AssetOcrResponseDto[] => { + return boxes.map((box) => ({ + id: faker.string.uuid(), + assetId, + x1: box.x1, + y1: box.y1, + x2: box.x2, + y2: box.y2, + x3: box.x3, + y3: box.y3, + x4: box.x4, + y4: box.y4, + boxScore: 0.95, + textScore: 0.9, + text: box.text, + })); +}; + +export const setupOcrMockApiRoutes = async ( + context: BrowserContext, + ocrDataByAssetId: Map, +) => { + await context.route('**/assets/*/ocr', async (route, request) => { + if (request.method() !== 'GET') { + return route.fallback(); + } + const url = new URL(request.url()); + const segments = url.pathname.split('/'); + const assetIdIndex = segments.indexOf('assets') + 1; + const assetId = segments[assetIdIndex]; + + const ocrData = ocrDataByAssetId.get(assetId) ?? []; + return route.fulfill({ + status: 200, + contentType: 'application/json', + json: ocrData, + }); + }); +}; diff --git a/e2e/src/ui/specs/asset-viewer/ocr.e2e-spec.ts b/e2e/src/ui/specs/asset-viewer/ocr.e2e-spec.ts new file mode 100644 index 0000000000..5a442a6081 --- /dev/null +++ b/e2e/src/ui/specs/asset-viewer/ocr.e2e-spec.ts @@ -0,0 +1,300 @@ +import type { AssetOcrResponseDto, AssetResponseDto } from '@immich/sdk'; +import { expect, test } from '@playwright/test'; +import { toAssetResponseDto } from 'src/ui/generators/timeline'; +import { + createMockStack, + createMockStackAsset, + MockStack, + setupBrokenAssetMockApiRoutes, +} from 'src/ui/mock-network/broken-asset-network'; +import { createMockOcrData, setupOcrMockApiRoutes } from 'src/ui/mock-network/ocr-network'; +import { assetViewerUtils } from '../timeline/utils'; +import { setupAssetViewerFixture } from './utils'; + +test.describe.configure({ mode: 'parallel' }); + +const PRIMARY_OCR_BOXES = [ + { text: 'Hello World', x1: 0.1, y1: 0.1, x2: 0.4, y2: 0.1, x3: 0.4, y3: 0.15, x4: 0.1, y4: 0.15 }, + { text: 'Immich Photo', x1: 0.2, y1: 0.3, x2: 0.6, y2: 0.3, x3: 0.6, y3: 0.36, x4: 0.2, y4: 0.36 }, +]; + +const SECONDARY_OCR_BOXES = [ + { text: 'Second Asset Text', x1: 0.15, y1: 0.2, x2: 0.55, y2: 0.2, x3: 0.55, y3: 0.26, x4: 0.15, y4: 0.26 }, +]; + +test.describe('OCR bounding boxes', () => { + const fixture = setupAssetViewerFixture(920); + + test.beforeEach(async ({ context }) => { + const primaryAssetDto = toAssetResponseDto(fixture.primaryAsset); + const ocrDataByAssetId = new Map([ + [primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)], + ]); + + await setupOcrMockApiRoutes(context, ocrDataByAssetId); + }); + + test('OCR bounding boxes appear when clicking OCR button', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + const ocrButton = page.getByLabel('Text recognition'); + await expect(ocrButton).toBeVisible(); + await ocrButton.click(); + + const ocrBoxes = page.locator('[data-viewer-content] [data-testid="ocr-box"]'); + await expect(ocrBoxes).toHaveCount(2); + + await expect(ocrBoxes.nth(0)).toContainText('Hello World'); + await expect(ocrBoxes.nth(1)).toContainText('Immich Photo'); + }); + + test('OCR bounding boxes toggle off on second click', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + const ocrButton = page.getByLabel('Text recognition'); + await ocrButton.click(); + await expect(page.locator('[data-viewer-content] [data-testid="ocr-box"]').first()).toBeVisible(); + + await ocrButton.click(); + await expect(page.locator('[data-viewer-content] [data-testid="ocr-box"]')).toHaveCount(0); + }); +}); + +test.describe('OCR with stacked assets', () => { + const fixture = setupAssetViewerFixture(921); + let mockStack: MockStack; + let primaryAssetDto: AssetResponseDto; + let secondAssetDto: AssetResponseDto; + + test.beforeAll(async () => { + primaryAssetDto = toAssetResponseDto(fixture.primaryAsset); + secondAssetDto = createMockStackAsset(fixture.adminUserId); + secondAssetDto.originalFileName = 'second-ocr-asset.jpg'; + mockStack = createMockStack(primaryAssetDto, [secondAssetDto], new Set()); + }); + + test.beforeEach(async ({ context }) => { + await setupBrokenAssetMockApiRoutes(context, mockStack); + + const ocrDataByAssetId = new Map([ + [primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)], + [secondAssetDto.id, createMockOcrData(secondAssetDto.id, SECONDARY_OCR_BOXES)], + ]); + + await setupOcrMockApiRoutes(context, ocrDataByAssetId); + }); + + test('different OCR boxes shown for different stacked assets', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + const ocrButton = page.getByLabel('Text recognition'); + await expect(ocrButton).toBeVisible(); + await ocrButton.click(); + + const ocrBoxes = page.locator('[data-viewer-content] [data-testid="ocr-box"]'); + await expect(ocrBoxes).toHaveCount(2); + await expect(ocrBoxes.nth(0)).toContainText('Hello World'); + + const stackThumbnails = page.locator('#stack-slideshow [data-asset]'); + await expect(stackThumbnails).toHaveCount(2); + await stackThumbnails.nth(1).click(); + + // refreshOcr() clears showOverlay when switching assets, so re-enable it + await expect(ocrBoxes).toHaveCount(0); + await expect(ocrButton).toBeVisible(); + await ocrButton.click(); + + await expect(ocrBoxes).toHaveCount(1); + await expect(ocrBoxes.first()).toContainText('Second Asset Text'); + }); +}); + +test.describe('OCR boxes and zoom', () => { + const fixture = setupAssetViewerFixture(922); + + test.beforeEach(async ({ context }) => { + const primaryAssetDto = toAssetResponseDto(fixture.primaryAsset); + const ocrDataByAssetId = new Map([ + [primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)], + ]); + + await setupOcrMockApiRoutes(context, ocrDataByAssetId); + }); + + test('OCR boxes scale with zoom', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + const ocrButton = page.getByLabel('Text recognition'); + await expect(ocrButton).toBeVisible(); + await ocrButton.click(); + + const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first(); + await expect(ocrBox).toBeVisible(); + + const initialBox = await ocrBox.boundingBox(); + expect(initialBox).toBeTruthy(); + + const { width, height } = page.viewportSize()!; + await page.mouse.move(width / 2, height / 2); + await page.mouse.wheel(0, -3); + + await expect(async () => { + const zoomedBox = await ocrBox.boundingBox(); + expect(zoomedBox).toBeTruthy(); + expect(zoomedBox!.width).toBeGreaterThan(initialBox!.width); + expect(zoomedBox!.height).toBeGreaterThan(initialBox!.height); + }).toPass({ timeout: 2000 }); + }); +}); + +test.describe('OCR text interaction', () => { + const fixture = setupAssetViewerFixture(923); + + test.beforeEach(async ({ context }) => { + const primaryAssetDto = toAssetResponseDto(fixture.primaryAsset); + const ocrDataByAssetId = new Map([ + [primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)], + ]); + + await setupOcrMockApiRoutes(context, ocrDataByAssetId); + }); + + test('OCR text box has data-overlay-interactive attribute', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + await page.getByLabel('Text recognition').click(); + + const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first(); + await expect(ocrBox).toBeVisible(); + await expect(ocrBox).toHaveAttribute('data-overlay-interactive'); + }); + + test('OCR text box receives focus on click', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + await page.getByLabel('Text recognition').click(); + + const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first(); + await expect(ocrBox).toBeVisible(); + + await ocrBox.click(); + await expect(ocrBox).toBeFocused(); + }); + + test('dragging on OCR text box does not trigger image pan', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + await page.getByLabel('Text recognition').click(); + + const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first(); + await expect(ocrBox).toBeVisible(); + + const imgLocator = page.locator('[data-viewer-content] img[draggable="false"]'); + const initialTransform = await imgLocator.evaluate((element) => { + return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform; + }); + + const box = await ocrBox.boundingBox(); + expect(box).toBeTruthy(); + const centerX = box!.x + box!.width / 2; + const centerY = box!.y + box!.height / 2; + + await page.mouse.move(centerX, centerY); + await page.mouse.down(); + await page.mouse.move(centerX + 50, centerY + 30, { steps: 5 }); + await page.mouse.up(); + + const afterTransform = await imgLocator.evaluate((element) => { + return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform; + }); + expect(afterTransform).toBe(initialTransform); + }); + + test('split touch gesture across zoom container does not trigger zoom', async ({ page }) => { + await page.goto(`/photos/${fixture.primaryAsset.id}`); + await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset); + + await page.getByLabel('Text recognition').click(); + const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first(); + await expect(ocrBox).toBeVisible(); + + const imgLocator = page.locator('[data-viewer-content] img[draggable="false"]'); + const initialTransform = await imgLocator.evaluate((element) => { + return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform; + }); + + const viewerContent = page.locator('[data-viewer-content]'); + const viewerBox = await viewerContent.boundingBox(); + expect(viewerBox).toBeTruthy(); + + // Dispatch a synthetic split gesture: one touch inside the viewer, one outside + await page.evaluate( + ({ viewerCenterX, viewerCenterY, outsideY }) => { + const viewer = document.querySelector('[data-viewer-content]'); + if (!viewer) { + return; + } + + const createTouch = (id: number, x: number, y: number) => { + return new Touch({ + identifier: id, + target: viewer, + clientX: x, + clientY: y, + }); + }; + + const insideTouch = createTouch(0, viewerCenterX, viewerCenterY); + const outsideTouch = createTouch(1, viewerCenterX, outsideY); + + const touchStartEvent = new TouchEvent('touchstart', { + touches: [insideTouch, outsideTouch], + targetTouches: [insideTouch], + changedTouches: [insideTouch, outsideTouch], + bubbles: true, + cancelable: true, + }); + + const touchMoveEvent = new TouchEvent('touchmove', { + touches: [createTouch(0, viewerCenterX, viewerCenterY - 30), createTouch(1, viewerCenterX, outsideY + 30)], + targetTouches: [createTouch(0, viewerCenterX, viewerCenterY - 30)], + changedTouches: [ + createTouch(0, viewerCenterX, viewerCenterY - 30), + createTouch(1, viewerCenterX, outsideY + 30), + ], + bubbles: true, + cancelable: true, + }); + + const touchEndEvent = new TouchEvent('touchend', { + touches: [], + targetTouches: [], + changedTouches: [insideTouch, outsideTouch], + bubbles: true, + cancelable: true, + }); + + viewer.dispatchEvent(touchStartEvent); + viewer.dispatchEvent(touchMoveEvent); + viewer.dispatchEvent(touchEndEvent); + }, + { + viewerCenterX: viewerBox!.x + viewerBox!.width / 2, + viewerCenterY: viewerBox!.y + viewerBox!.height / 2, + outsideY: 10, // near the top of the page, outside the viewer + }, + ); + + const afterTransform = await imgLocator.evaluate((element) => { + return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform; + }); + expect(afterTransform).toBe(initialTransform); + }); +}); diff --git a/e2e/src/utils.ts b/e2e/src/utils.ts index a5567f0778..4d44d99e2f 100644 --- a/e2e/src/utils.ts +++ b/e2e/src/utils.ts @@ -510,6 +510,9 @@ export const utils = { createStack: (accessToken: string, assetIds: string[]) => createStack({ stackCreateDto: { assetIds } }, { headers: asBearerAuth(accessToken) }), + setAssetDuplicateId: (accessToken: string, assetId: string, duplicateId: string | null) => + updateAssets({ assetBulkUpdateDto: { ids: [assetId], duplicateId } }, { headers: asBearerAuth(accessToken) }), + upsertTags: (accessToken: string, tags: string[]) => upsertTags({ tagUpsertDto: { tags } }, { headers: asBearerAuth(accessToken) }), diff --git a/i18n/af.json b/i18n/af.json index 9e2bad48ab..e641c07b21 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -2,147 +2,147 @@ "about": "Oor", "account": "Rekening", "account_settings": "Rekeninginstellings", - "acknowledge": "Erken", + "acknowledge": "Neem kennis", "action": "Aksie", - "action_common_update": "Opdateur", + "action_common_update": "Werk by", "actions": "Aksies", "active": "Aktief", "activity": "Aktiwiteite", - "activity_changed": "Aktiwiteit is {enabled, select, true {aangeskakel} other {afgeskakel}}", - "add": "Voegby", - "add_a_description": "Voeg 'n beskrywing by", - "add_a_location": "Voeg 'n ligging by", - "add_a_name": "Voeg 'n naam by", - "add_a_title": "Voeg 'n titel by", - "add_birthday": "Voeg 'n verjaarsdag by", - "add_endpoint": "Voeg Koppelvlakpunt by", - "add_exclusion_pattern": "Voeg uitsgluitingspatrone by", - "add_location": "Voeg ligging by", - "add_more_users": "Voeg meer gebruikers by", - "add_partner": "Voeg vennoot by", - "add_path": "Voeg pad by", - "add_photos": "Voeg foto's by", - "add_tag": "Voeg tag by", - "add_to": "Voeg byâ€Ļ", - "add_to_album": "Voeg na album", - "add_to_album_bottom_sheet_added": "By {album} bygevoeg", + "activity_changed": "Aktiwiteit is {enabled, select, true {geaktiveer} other {gedeaktiveer}}", + "add": "Voeg toe", + "add_a_description": "Voeg ’n beskrywing toe", + "add_a_location": "Voeg ’n ligging toe", + "add_a_name": "Voeg ’n naam toe", + "add_a_title": "Voeg ’n titel toe", + "add_birthday": "Voeg ’n verjaarsdag toe", + "add_endpoint": "Voeg eindpunt toe", + "add_exclusion_pattern": "Voeg uitsluitingspatroon toe", + "add_location": "Voeg ligging toe", + "add_more_users": "Voeg meer gebruikers toe", + "add_partner": "Voeg vennoot toe", + "add_path": "Voeg pad toe", + "add_photos": "Voeg foto’s toe", + "add_tag": "Voeg etiket toe", + "add_to": "Voeg toe totâ€Ļ", + "add_to_album": "Voeg toe tot album", + "add_to_album_bottom_sheet_added": "Tot {album} toegevoeg", "add_to_album_bottom_sheet_already_exists": "Reeds in {album}", - "add_to_albums": "Voeg by albums", - "add_to_albums_count": "Voeg by ({count}) albums", - "add_to_shared_album": "Voeg toe aan gedeelde album", - "add_url": "Voeg URL by", - "added_to_archive": "By argief toegevoegd", - "added_to_favorites": "By gunstelinge toegevoegd", - "added_to_favorites_count": "Het {count, number} by gunstelinge toegevoegd", + "add_to_albums": "Voeg toe tot albums", + "add_to_albums_count": "Voeg toe tot albums ({count})", + "add_to_shared_album": "Voeg toe tot gedeelde album", + "add_url": "Voeg bronadres toe", + "added_to_archive": "Tot argief toegevoeg", + "added_to_favorites": "Tot gunstelinge toegevoeg", + "added_to_favorites_count": "{count, number} tot gunstelinge toegevoeg", "admin": { - "add_exclusion_pattern_description": "Voeg uitsluitingspatrone by. Globbing met *, ** en ? word ondersteun. Om alle lÃĒers in enige lÃĒergids genaamd \"Raw\" te ignoreer, gebruik \"**/Raw/**\". Om alle lÃĒers wat op \".tif\" eindig, te ignoreer, gebruik \"**/*.tif\". Om 'n absolute pad te ignoreer, gebruik \"/path/to/ignore/**\".", - "admin_user": "Admin gebruiker", - "asset_offline_description": "Hierdie eksterne biblioteekbate word nie meer op skyf gevind nie en is na die asblik geskuif. As die lÃĒer binne die biblioteek geskuif is, gaan jou tydlyn na vir die nuwe ooreenstemmende bate. Om hierdie bate te herstel, maak asseblief seker dat die lÃĒerpad hieronder deur Immich verkry kan word en skandeer die biblioteek.", - "authentication_settings": "Verifikasie instellings", - "authentication_settings_description": "Bestuur wagwoord, OAuth en ander verifikasie instellings", - "authentication_settings_disable_all": "Is jy seker jy wil alle aanmeldmetodes deaktiveer? Aanmelding sal heeltemal gedeaktiveer word.", - "authentication_settings_reenable": "Om te heraktiveer, gebruik 'n Server Command.", + "add_exclusion_pattern_description": "Voeg uitsluitingspatrone toe. Plekhouers met *, ** en ? word ondersteun. Om alle lÃĒers in enige vouer genaamd “Raw” te ignoreer, gebruik “**/Raw/**”. Om alle lÃĒers wat op “.tif” eindig, te ignoreer, gebruik “**/*.tif”. Om ’n absolute pad te ignoreer, gebruik “/path/to/ignore/**”.", + "admin_user": "Admingebruiker", + "asset_offline_description": "Hierdie eksterne biblioteekitem word nie meer op skyf gevind nie en is na die asblik geskuif. As die lÃĒer binne die biblioteek geskuif is, gaan u tydlyn na vir die nuwe ooreenstemmende item. Om hierdie item te herstel, maak asseblief seker dat die lÃĒerpad hieronder deur Immich verkry kan word en skandeer die biblioteek.", + "authentication_settings": "Waarmerkinstellings", + "authentication_settings_description": "Bestuur wagwoord, OAuth en ander waarmerkinstellings", + "authentication_settings_disable_all": "Is u seker u wil alle aantekenmetodes deaktiveer? Aantekening sal heeltemal gedeaktiveer word.", + "authentication_settings_reenable": "Gebruik ’n bedienerbevel om te heraktiveer.", "background_task_job": "Agtergrondtake", - "backup_database": "Skep DatastortlÃĒer", - "backup_database_enable_description": "Aktiveer databasisrugsteun", - "backup_keep_last_amount": "Aantal vorige rugsteune om te hou", - "backup_onboarding_3_description": "totale kopieÃĢ van jou data, insluitende die oorspronklikke lÃĒers. Dit sluit in 1 kopie op 'n ander perseel en 2 kopieÃĢ om die huidige rekenaar.", - "backup_onboarding_description": "'N 3-2-1 rugsteun strategie word sterk aanbeveel om jou data veilig te hou. Hou kopieÃĢ van jou fotos/videos so wel as die Immich databasis vir 'n volledige rugsteun oplossing.", - "backup_onboarding_footer": "Vir meer inligting oor hoe om 'n rugsteun kopie van Immich te maak, gaan lees asseblief hierdie dokument.", - "backup_onboarding_parts_title": "'N 3-2-1 rugsteun sluit in:", - "backup_onboarding_title": "Rugsteun kopieÃĢ", - "backup_settings": "Rugsteun instellings", - "backup_settings_description": "Bestuur databasis rugsteun instellings.", - "cleared_jobs": "Poste gevee vir: {job}", - "config_set_by_file": "Config word tans deur 'n konfigurasielÃĒer gestel", - "confirm_delete_library": "Is jy seker jy wil {library}-biblioteek uitvee?", - "confirm_delete_library_assets": "Is jy seker jy wil hierdie biblioteek uitvee? Dit sal {count, plural, one {# bevatte base} other {# bevatte bates}} uit Immich uitvee en kan nie ongedaan gemaak word nie. LÃĒers sal op skyf bly.", - "confirm_email_below": "Om te bevestig, tik \"{email}\" hieronder", - "confirm_reprocess_all_faces": "Is jy seker jy wil alle gesigte herverwerk? Dit sal ook genoemde mense skoonmaak.", - "confirm_user_password_reset": "Is jy seker jy wil {user} se wagwoord terugstel?", - "confirm_user_pin_code_reset": "Is jy seker jy wil {user} se PIN kode herstel?", - "create_job": "Skep werk", - "cron_expression": "Cron uitdrukking", - "cron_expression_description": "Stel die skanderingsinterval in met die cron-formaat. Vir meer inligting verwys asseblief na bv. Crontab Guru", - "cron_expression_presets": "Cron uitdrukking voorafinstellings", - "disable_login": "Deaktiveer aanmelding", - "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.", - "face_detection": "Gesig herkenning", - "face_detection_description": "Identifiseer die gesigte in media deur middel van masjienleer. Vir videos word slegs die duimnaelskets oorweeg. “Herlaai” (ver)werk al die media weer. “Stel terug” verwyder alle huidige gesigdata. “Onverwerk” plaas bates in die tou wat nog nie verwerk is nie. Geidentifiseerde gesigte sal nÃĄ voltooiing van Gesigidentifikasie vir Gesigherkenning in die tou geplaas word, om hulle in bestaande of nuwe persone te groepeer.", - "facial_recognition_job_description": "Groepeer gesigte in mense in. Die stap is vinniger nadat Gesig Deteksie klaar is. \"Herstel\" (her-)groepeer alle gesigte. \"Vermiste\" plaas gesigte in ry wat nie 'n persoon gekoppel het nie.", - "failed_job_command": "Opdrag {command} het misluk vir werk: {job}", - "force_delete_user_warning": "WAARSKUWING: Dit sal onmiddellik die gebruiker en alle bates verwyder. Dit kan nie ontdoen word nie en die lÃĒers kan nie herstel word nie.", + "backup_database": "Skep DatabasisstortlÃĒer", + "backup_database_enable_description": "Aktiveer databasisstortlÃĒers", + "backup_keep_last_amount": "Aantal vorige stortlÃĒers om te hou", + "backup_onboarding_3_description": "totale kopieÃĢ van u data, insluitend die oorspronklike lÃĒers. Dit sluit 1 kopie op ’n ander perseel en 2 lokale kopieÃĢ in.", + "backup_onboarding_description": "’n 3-2-1-rugsteunstrategie word sterk aanbeveel om u data veilig te hou. Hou kopieÃĢ van u foto’s/video’s sowel as die Immich-databasis vir ’n volledige rugsteunoplossing.", + "backup_onboarding_footer": "Lees hierdie dokument vir meer inligting oor hoe om ’n rugsteunkopie van Immich te maak.", + "backup_onboarding_parts_title": "’n 3-2-1-rugsteun sluit in:", + "backup_onboarding_title": "RugsteunkopieÃĢ", + "backup_settings": "Databasisstortinstellings", + "backup_settings_description": "Bestuur databasisrugsteuninstellings.", + "cleared_jobs": "Take gewis vir: {job}", + "config_set_by_file": "Config word tans deur ’n konfigurasielÃĒer gestel", + "confirm_delete_library": "Is u seker u wil {library}-biblioteek skrap?", + "confirm_delete_library_assets": "Is u seker u wil hierdie biblioteek skrap? Dit sal {count, plural, one {# bevatte item} other {# bevatte items}} uit Immich skrap en kan nie ongedaan gemaak word nie. LÃĒers sal op skyf bly.", + "confirm_email_below": "Tik “{email}” hieronder ter bevestiging", + "confirm_reprocess_all_faces": "Is u seker u wil alle gesigte herverwerk? Dit sal ook genoemde mense skoonmaak.", + "confirm_user_password_reset": "Is u seker u wil {user} se wagwoord terugstel?", + "confirm_user_pin_code_reset": "Is u seker u wil {user} se PIN-kode herstel?", + "create_job": "Skep taak", + "cron_expression": "Cron-uitdrukking", + "cron_expression_description": "Stel die skanderingsinterval in met die cron-formaat. Kyk gerus na bv. Crontab Guru vir meer inligting", + "cron_expression_presets": "Cron-uitdrukking voorafinstellings", + "disable_login": "Deaktiveer aantekening", + "duplicate_detection_job_description": "Begin masjienleer op items om soortgelyke beelde op te spoor. Maak staat op Slimsoek", + "exclusion_pattern_description": "Met uitsluitingspatrone kan u lÃĒers en vouers ignoreer wanneer u u biblioteek skandeer. Dit is nuttig as u vouers het wat lÃĒers bevat wat u nie wil invoer nie, soos RAW-lÃĒers.", + "face_detection": "Gesigherkenning", + "face_detection_description": "Identifiseer die gesigte in media d.m.v. masjienleer. Vir video’s word slegs die duimnael oorweeg. “Herlaai” (ver)werk al die media weer. “Stel terug” verwyder alle huidige gesigdata. “Onverwerk” plaas items in die ry wat nog nie verwerk is nie. Geïdentifiseerde gesigte sal nÃĄ voltooiing van Gesigidentifikasie vir Gesigherkenning in die ry geplaas word om hulle in bestaande of nuwe persone te groepeer.", + "facial_recognition_job_description": "Groepeer gesigte in mense. Die stap is vinniger nadat Gesigherkenning klaar is. “Herstel” (her-)groepeer alle gesigte. “Vermiste” plaas gesigte in ry wat nie ’n persoon gekoppel het nie.", + "failed_job_command": "Bevel {command} het misluk vir taak: {job}", + "force_delete_user_warning": "WAARSKUWING: Dit sal onmiddellik die gebruiker en alle items verwyder. Dit kan nie ontdaan word nie en die lÃĒers kan nie herstel word nie.", "image_format": "Formaat", - "image_format_description": "WebP produseer kleiner lÃĒers as JPEG, maar is stadiger om te enkodeer.", - "image_fullsize_description": "Vol grote prent met geen metadata, gebruik wanner ingezoem", - "image_fullsize_enabled": "Skakel aan vol grote prent generasie", + "image_format_description": "WebP lewer kleiner lÃĒers as JPEG, maar is stadiger om te enkodeer.", + "image_fullsize_description": "Volgrootte prent met geen metadata, gebruik wanner ingezoem", + "image_fullsize_enabled": "Aktiveer spek van volgrootte prent", "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_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", + "image_prefer_wide_gamut": "Verkies breÃĢspektrum", + "image_prefer_wide_gamut_setting_description": "Gebruik Display P3 vir duimnaels. Dit behou die lewendheid van beelde met wye kleurruimtes beter, maar beelde kan anders verskyn op ou toestelle met ’n ou blaaierweergawe. sRGB-beelde gebruik steeds sRGB om kleurverskuiwings te voorkom.", + "image_preview_description": "Mediumgrootte prent met gestroopte metadata, wat gebruik word wanneer ’n enkele item bekyk word en vir masjienleer", + "image_preview_quality_description": "Voorskoukwaliteit van 1-100. HoÃĢr is beter, maar lewer groter lÃĒers en kan die toep vertraag. Die stel van ’n lae waarde kan masjienleerkwaliteit beïnvloed.", + "image_preview_title": "Voorskou-instellings", "image_quality": "Kwaliteit", "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_resolution_description": "HoÃĢr resolusies kan meer detail bewaar, maar neem langer om te enkodeer, het groter lÃĒergroottes en kan die toep vertraag.", + "image_settings": "Prentinstellings", "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", + "image_thumbnail_description": "Klein duimnaels sonder metadata, gebruik om groepe foto’s soos die tydlyn te bekyk", + "image_thumbnail_quality_description": "Duinmaelkwaliteit van 1-100. HoÃĢr is beter, maar lewer groter lÃĒers en kan die toep vertraag.", + "image_thumbnail_title": "Duimnaelinstellings", "job_concurrency": "{job} gelyktydigheid", - "job_created": "Taak gemaak", + "job_created": "Taak geskep", "job_not_concurrency_safe": "Hierdie taak kan nie gelyktydig uitgevoer word nie.", - "job_settings": "Agtergrondtaakinstellings", - "job_settings_description": "Bestuur werkgelyktydigheid", + "job_settings": "Taakinstellings", + "job_settings_description": "Bestuur taakgelyktydigheid", "library_created": "Biblioteek geskep: {library}", - "library_deleted": "Biblioteek verwyder", - "library_scanning": "Periodieke Soek", - "library_scanning_description": "Stel periodieke deursoek van biblioteek in", + "library_deleted": "Biblioteek geskrap", + "library_scanning": "Periodieke skandering", + "library_scanning_description": "Stel periodieke skandering van biblioteek in", "library_scanning_enable_description": "Aktiveer periodieke biblioteekskandering", - "library_settings": "Eksterne Biblioteek", - "library_settings_description": "Eksterne biblioteek verstellings", - "library_tasks_description": "Deursoek eksterne biblioteke vir nuwe of veranderde bates", - "library_watching_enable_description": "Hou eksterne biblioteke dop vir leer veranderinge", - "library_watching_settings": "Biblioteek dop hou (EKSPERIMENTEEL)", + "library_settings": "Eksterne biblioteek", + "library_settings_description": "Eksternebiblioteekinstellings", + "library_tasks_description": "Skandeer eksterne biblioteke vir nuwe of veranderde items", + "library_watching_enable_description": "Hou eksterne biblioteke dop vir lÃĒerveranderinge", + "library_watching_settings": "Biblioteekdophou [EKSPERIMENTEEL]", "library_watching_settings_description": "Hou automaties dop vir veranderinge", - "logging_enable_description": "Aktifeer \"logging\"", - "logging_level_description": "Wanneer aktief, watter vlak van \"logs\" om te skep.", - "logging_settings": "\"Logs\"", - "machine_learning_clip_model": "CLIP model", - "machine_learning_duplicate_detection": "Duplikaat herkenning", - "machine_learning_duplicate_detection_enabled": "Aktifeer duplikaat herkenning", - "machine_learning_enabled": "Aktifeer masjienleer", - "machine_learning_facial_recognition": "Gesigsherkenning", - "machine_learning_facial_recognition_description": "Herken, identifiseer en groepeer gesigte in fotos", - "machine_learning_facial_recognition_model": "Gesigsherkennings model", - "machine_learning_facial_recognition_setting": "Aktifeer gesigsherkenning", - "machine_learning_max_detection_distance": "Maksimum herkennings afstand", + "logging_enable_description": "Aktiveer logboekbyhouding", + "logging_level_description": "Wanneer aktief, welke logboekvlak om te gebruik.", + "logging_settings": "Logboek", + "machine_learning_clip_model": "CLIP-model", + "machine_learning_duplicate_detection": "Duplikaatbespeuring", + "machine_learning_duplicate_detection_enabled": "Aktiveer duplikaatbespeuring", + "machine_learning_enabled": "Aktiveer masjienleer", + "machine_learning_facial_recognition": "Gesigherkenning", + "machine_learning_facial_recognition_description": "Bespeur, identifiseer en groepeer gesigte in foto’s", + "machine_learning_facial_recognition_model": "Gesigherkenningsmodel", + "machine_learning_facial_recognition_setting": "Aktiveer gesigherkenning", + "machine_learning_max_detection_distance": "Maksimum herkenningsafstand", "map_settings": "Kaart", "migration_job": "Migrasie", "oauth_settings": "OAuth", "transcoding_acceleration_vaapi": "VAAPI", - "transcoding_preferred_hardware_device": "Verkiesde hardeware" + "transcoding_preferred_hardware_device": "Voorkeurapparatuur" }, "administration": "Administrasie", - "advanced": "Gevorderde", + "advanced": "Gevorderd", "albums": "Albums", "all": "Alle", - "anti_clockwise": "Anti-kloksgewys", + "anti_clockwise": "Linksom", "archive": "Argief", "asset_skipped": "Oorgeslaan", "asset_uploaded": "Opgelaai", - "asset_uploading": "Oplaaiâ€Ļ", - "assets": "Bates", + "asset_uploading": "Laai tans opâ€Ļ", + "assets": "Items", "back": "Terug", "backward": "Agteruit", "build": "Bou", "camera": "Kamera", "cancel": "Kanselleer", "city": "Stad", - "clockwise": "Kloksgewys", - "close": "Maak toe", + "clockwise": "Regsom", + "close": "Sluit", "color": "Kleur", "confirm": "Bevestig", "contain": "Bevat", @@ -154,54 +154,140 @@ "created": "Geskep", "dark": "Donker", "day": "Dag", - "delete": "Verwyder", + "delete": "Skrap", "description": "Beskrywing", "details": "Besonderhede", "direction": "Rigting", "discover": "Ontdek", "documentation": "Dokumentasie", - "done": "Klaar", - "download": "Aflaai", - "download_settings": "Aflaai", + "done": "Gereed", + "download": "Laai af", + "download_settings": "Laai af", "duplicates": "Duplikate", "duration": "Duur", "edit": "Wysig", - "search_by_description": "Soek by beskrywing", + "search_by_description": "Soek op beskrywing", "search_by_description_example": "Stapdag in Sapa", + "stacktrace": "Stapelnasporing", + "start": "Begin", + "start_date": "Begindatum", + "start_date_before_end_date": "Begindatum moet voor einddatum wees", + "state": "Staat", + "status": "Status", + "stop_casting": "Stop sending", + "stop_motion_photo": "Stop bewegingsfoto", + "stop_photo_sharing": "Staak die deel van u foto’s?", + "stop_photo_sharing_description": "{partner} sal nie meer toegang tot u foto’s hÃĒ nie.", + "untitled_workflow": "Naamlose werkvloei", + "up_next": "Volgende", + "update_location_action_prompt": "Werk die ligging van {count} gekose items by met:", + "updated_at": "Bygewerk", + "updated_password": "Wagwoord bygewerk", + "upload": "Laai op", + "upload_concurrency": "Aantal gelyktydige oplaaie", + "upload_details": "Oplaaidetails", + "upload_dialog_info": "Wil u ’n rugsteun maak van die gekose item(s) op die bediener?", + "upload_error_with_count": "Oplaaifout vir {count, plural, one {# item} other {# items}}", + "upload_errors": "Oplaai voltooi met {count, plural, one {# fout} other {# foute}}, verfris die blad om die nuwe items te sien.", + "upload_finished": "Klaar opgelaai", + "upload_progress": "Oorblywend {remaining, number} - Verwerk {processed, number}/{total, number}", + "upload_skipped_duplicates": "{count, plural, one {# duplikaat item} other {# duplikaat items}} oorgeslaan", + "upload_status_duplicates": "Duplikate", + "upload_status_errors": "Foute", + "upload_status_uploaded": "Opgelaai", + "upload_success": "Oplaai suksesvol, verfris die blad om nuut opgelaaide items te sien.", + "upload_to_immich": "Laai op na Immich ({count})", + "uploading": "Word opgelaai", + "uploading_media": "Media word opgelaai", + "url": "URL", + "usage": "Gebruik", + "use_biometric": "Gebruik biometrie", + "use_browser_locale": "Gebruik blaaier se landinstelling", + "use_browser_locale_description": "Formatteer datums, tye en getalle gebaseer op u blaaier se landinstelling", + "use_current_connection": "Gebruik huidige verbinding", + "use_custom_date_range": "Gebruik eerder pasgemaakte datumomvang", + "user": "Gebruiker", + "user_has_been_deleted": "Hierdie gebruiker is geskrap.", + "user_id": "Gebruiker ID", + "user_liked": "{user} het van {type, select, photo {hierdie foto} video {hierdie video} asset {} other {hierdie item}} gehou", + "user_pin_code_settings": "PIN-kode", + "user_pin_code_settings_description": "Bestuur u PIN-kode", + "user_privacy": "Gebruikersprivaatheid", + "user_purchase_settings": "Koop", + "user_purchase_settings_description": "Bestuur u aankoop", + "user_role_set": "Stel {user} in as {role}", + "user_usage_detail": "Gedetailleerde gebruik van gebruikers", + "user_usage_stats": "Statistieke vir rekeninggebruik", + "user_usage_stats_description": "Bekyk statistieke van rekeninggebruik", + "username": "Gebruikersnaam", + "users": "Gebruikers", + "users_added_to_album_count": "{count, plural, one {# Gebruiker} other {# Gebruikers}} tot album toegevoeg", + "utilities": "Gereedskap", + "validate": "Valideer", + "validate_endpoint_error": "Voer asb. ’n geldige bronadres in", + "validation_error": "Valideerfout", + "variables": "Veranderlikes", "version": "Weergawe", "version_announcement_closing": "Jou friend, Alex", + "version_announcement_message": "Hallo! Daar is ’n nuwe weergawe van Immich beskikbaar. Neem gerus bietjie tyd om die vrystellingsnotas te lees en maak seker u opstelling is op datum om wanopstellings te voorkom, veral as u WatchTower of ’n ander bywerkmeganisme gebruik.", "version_history": "Weergawegeskiedenis", - "version_history_item": "{version} geinstaleerd op {date}", + "version_history_item": "{version} geïnstaleer op {date}", "video": "Video", - "videos": "Video's", + "video_hover_setting": "Speel videoduimnael by muishang", + "video_hover_setting_description": "Speel videoduimnael wanneer muis oor item hang. Selfs indien gedeaktiveer kan afspeel begin deur oor die afspeelknop te hang.", + "videos": "Video’s", + "videos_count": "{count, plural, one {# video} other {# video’s}}", + "videos_only": "Slegs video’s", "view": "Bekyk", - "view_album": "Bekyk Album", + "view_album": "Bekyk album", "view_all": "Bekyk alle", "view_all_users": "Bekyk alle gebruikers", + "view_asset_owners": "Bekyk itemeienaars", + "view_details": "Bekyk detail", "view_in_timeline": "Bekyk in tydlyn", "view_link": "Bekyk skakel", "view_links": "Bekyk skakels", "view_name": "Bekyk", - "view_next_asset": "Bekyk volgende bate", - "view_previous_asset": "Bekyk vorige bate", + "view_next_asset": "Bekyk volgende item", + "view_previous_asset": "Bekyk vorige item", "view_qr_code": "Bekyk QR-kode", + "view_similar_photos": "Bekyk soortgelyke foto’s", "view_stack": "Bekyk stapel", "view_user": "Bekyk gebruiker", "viewer_remove_from_stack": "Verwyder van stapel", - "viewer_stack_use_as_main_asset": "Gebruik as hoofbate", + "viewer_stack_use_as_main_asset": "Gebruik as hoofitem", "viewer_unstack": "Ontstapel", - "visibility_changed": "Sigbaarheid verander voor {count, plural, one {# person} other {# people}}", + "visibility_changed": "Sigbaarheid verander vir {count, plural, one {# mens} other {# mense}}", + "visual": "Visueel", + "visual_builder": "Visuele bouer", "waiting": "Wag", - "warning": "Waaskuwing", + "waiting_count": "Wagtend: {count}", + "warning": "Waarskuwing", "week": "Week", "welcome": "Welkom", "welcome_to_immich": "Welkom by Immich", - "wifi_name": "Wi-Fi Naam", + "width": "Breedte", + "wifi_name": "Wi-Fi-naam", + "workflow_delete_prompt": "Is u seker u wil hierdie werkvloei skrap?", + "workflow_deleted": "Werkvloei geskrap", + "workflow_description": "Werkvloeibeskrywing", + "workflow_info": "Werkvloei-inligting", + "workflow_json": "Werkvloei-JSON", + "workflow_json_help": "Wysig die werkvloei-opstelling in JSON-formaat. Veranderinge sal na die visuele bouer sinchroniseer.", + "workflow_name": "Werkvloeinaam", + "workflow_navigation_prompt": "Is u seker u wil verlaat sonder om u veranderinge te bewaar?", + "workflow_summary": "Werkvloei-opsomming", + "workflow_update_success": "Werkvloei suksesvol bygewerk", + "workflow_updated": "Werkvloei bygewerk", + "workflows": "Werkvloeie", + "workflows_help_text": "Werkvloeie outomatiseer aksies op u items gebaseer op snellers en filters", "wrong_pin_code": "Verkeerde PIN-kode", "year": "Jaar", - "years_ago": "{years, plural, one {# year} other {# years}} gelede", + "years_ago": "{years, plural, one {# jaar} other {# jaar}} gelede", "yes": "Ja", - "you_dont_have_any_shared_links": "Jy het geen gedeelde skakels", - "your_wifi_name": "Jou Wi-Fi naam", - "zoom_image": "Vergroot Prent" + "you_dont_have_any_shared_links": "U het geen gedeelde skakels nie", + "your_wifi_name": "U Wi-Fi-naam", + "zero_to_clear_rating": "druk 0 om itemgradering te wis", + "zoom_image": "Zoem in", + "zoom_to_bounds": "Zoem na rande" } diff --git a/i18n/ar.json b/i18n/ar.json index a1c29402c2..3834d76a5f 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -311,7 +311,7 @@ "search_jobs": "Ø§Ų„Ø¨Ø­ØĢ ØšŲ† ŲˆØ¸Ø§ØĻ؁â€Ļ", "send_welcome_email": "ØĨØąØŗØ§Ų„ Ø¨ØąŲŠØ¯ ØĒØąØ­ŲŠØ¨ŲŠ", "server_external_domain_settings": "ØĨØŗŲ… Ø§Ų„Ų†ØˇØ§Ų‚ Ø§Ų„ØŽØ§ØąØŦ؊", - "server_external_domain_settings_description": "ØĨØŗŲ… Ø§Ų„Ų†ØˇØ§Ų‚ Ų„ØąŲˆØ§Ø¨Øˇ Ø§Ų„Ų…Ø´Ø§ØąŲƒØŠ Ø§Ų„ØšØ§Ų…ØŠØŒ Ø¨Ų…Ø§ ؁؊ Ø°Ų„Ųƒ http(s)://", + "server_external_domain_settings_description": "Ø§Ų„Ų†ØˇØ§Ų‚ Ų…ØŗØĒØŽØ¯Ų… Ų„ØąŲˆØ§Ø¨Øˇ ØŽØ§ØąØŦŲŠØŠ", "server_public_users": "Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲˆŲ† Ø§Ų„ØšØ§Ų…ŲˆŲ†", "server_public_users_description": "؊ØĒŲ… ØĨØ¯ØąØ§ØŦ ØŦŲ…ŲŠØš Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ† (Ø§Ų„Ø§ØŗŲ… ŲˆØ§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ) ØšŲ†Ø¯ ØĨØļØ§ŲØŠ Ų…ØŗØĒØŽØ¯Ų… ØĨŲ„Ų‰ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…Ø§ØĒ Ø§Ų„Ų…Ø´ØĒØąŲƒØŠ. ØšŲ†Ø¯ ØĒØšØˇŲŠŲ„ Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠØŒ ØŗØĒŲƒŲˆŲ† Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ† Ų…ØĒاح؊ ŲŲ‚Øˇ Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠ Ø§Ų„ØĨØ¯Ø§ØąØŠ.", "server_settings": "ØĨؚداداØĒ Ø§Ų„ØŽØ§Ø¯Ų…", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "ØąØŗŲ… Ø§Ų„ØŽØąØ§ØĻØˇ Ø§Ų„Ų†ØēŲ…ŲŠØŠ", "transcoding_tone_mapping_description": "ØĒØ­Ø§ŲˆŲ„ Ø§Ų„Ø­ŲØ§Ø¸ ØšŲ„Ų‰ Ų…Ø¸Ų‡Øą Ų…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ HDR ØšŲ†Ø¯ ØĒØ­ŲˆŲŠŲ„Ų‡Ø§ ØĨŲ„Ų‰ SDR. ŲŠŲ‚Ø¯Ų… ŲƒŲ„ ØŽŲˆØ§ØąØ˛Ų…ŲŠØŠ ØĒŲ†Ø§Ø˛Ų„Ø§ØĒ Ų…ØŽØĒŲ„ŲØŠ Ø¨ŲŠŲ† Ø§Ų„Ų„ŲˆŲ† ŲˆØ§Ų„ØĒŲØ§ØĩŲŠŲ„ ŲˆØ§Ų„ØŗØˇŲˆØš. Hable ØĒØ­Ø§ŲØ¸ ØšŲ„Ų‰ Ø§Ų„ØĒŲØ§ØĩŲŠŲ„ØŒ Mobius ØĒØ­Ø§ŲØ¸ ØšŲ„Ų‰ Ø§Ų„ØŖŲ„ŲˆØ§Ų†ØŒ ؈ Reinhard ØĒØ­Ø§ŲØ¸ ØšŲ„Ų‰ Ø§Ų„ØŗØˇŲˆØš.", "transcoding_transcode_policy": "ØŗŲŠØ§ØŗØŠ Ø§Ų„ØĒØąŲ…ŲŠØ˛", - "transcoding_transcode_policy_description": "ØŗŲŠØ§ØŗØŠ ØĒØ­Ø¯ŲŠØ¯ Ų…ØĒŲ‰ ؊ØŦب ØĒØąŲ…ŲŠØ˛ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ. ØŗŲŠØĒŲ… داØĻŲ…Ų‹Ø§ ØĒØąŲ…ŲŠØ˛ Ų…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ HDR (Ų…Ø§ Ų„Ų… ؊ØĒŲ… ØĒØšØˇŲŠŲ„ Ø§Ų„ØĒØąŲ…ŲŠØ˛).", + "transcoding_transcode_policy_description": "ØŗŲŠØ§ØŗØŠ ØĒØ­Ø¯ŲŠØ¯ Ų…ØĒŲ‰ ؊ØŦب ØĒØąŲ…ŲŠØ˛ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ. ØŗŲŠØĒŲ… داØĻŲ…Ų‹Ø§ ØĒØąŲ…ŲŠØ˛ Ų…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ HDR ؈ Ų…Ų‚Ø§ØˇØš Ø§Ų„ŲØ¯ŲŠŲˆ Ø§Ų„Ų„ØĒ؊ ØĒØŗØĒØ¯ØŽŲ… ØĒŲ†ØŗŲŠŲ‚ ØēŲŠØą YUV 4:2:0. (Ų…Ø§ Ų„Ų… ؊ØĒŲ… ØĒØšØˇŲŠŲ„ Ø§Ų„ØĒØąŲ…ŲŠØ˛).", "transcoding_two_pass_encoding": "Ø§Ų„ØĒØąŲ…ŲŠØ˛ Ø¨Ų…ØąŲˆØąŲŠŲ†", "transcoding_two_pass_encoding_setting_description": "ØĒØąŲ…ŲŠØ˛ Ø¨Ų…ØąŲˆØąŲŠŲ† Ų„ØĨŲ†ØĒاØŦ Ų…Ų‚Ø§ØˇØš ŲŲŠØ¯ŲŠŲˆ بØĒØąŲ…ŲŠØ˛ ØŖŲØļŲ„. ØšŲ†Ø¯ ØĒŲ…ŲƒŲŠŲ† Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖŲ‚ØĩŲ‰ Ų„Ų…ØšØ¯Ų„ Ø§Ų„Ø¨ØĒ (Ų…ØˇŲ„ŲˆØ¨ Ų„ŲƒŲŠ ŲŠØšŲ…Ų„ Ų…Øš H.264 ؈ HEVC)، ŲŠØŗØĒØŽØ¯Ų… Ų‡Ø°Ø§ Ø§Ų„ŲˆØļØš Ų†ØˇØ§Ų‚ Ų…ØšØ¯Ų„ Ø§Ų„Ø¨ØĒ Ø§ØŗØĒŲ†Ø§Ø¯Ų‹Ø§ ØĨŲ„Ų‰ Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖŲ‚ØĩŲ‰ Ų„Ų…ØšØ¯Ų„ Ø§Ų„Ø¨ØĒ ؈؊ØĒØŦØ§Ų‡Ų„ CRF. Ø¨Ø§Ų„Ų†ØŗØ¨ØŠ Ų„Ų€ VP9، ŲŠŲ…ŲƒŲ† Ø§ØŗØĒØŽØ¯Ø§Ų… CRF ØĨذا ØĒŲ… ØĒØšØˇŲŠŲ„ Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖŲ‚ØĩŲ‰ Ų„Ų…ØšØ¯Ų„ Ø§Ų„Ø¨ØĒ.", "transcoding_video_codec": "ØĒØąŲ…ŲŠØ˛ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ", @@ -794,6 +794,11 @@ "color": "Ø§Ų„Ų„ŲˆŲ†", "color_theme": "Ų†Ų…Øˇ Ø§Ų„ØŖŲ„ŲˆØ§Ų†", "command": "Ø§Ų…Øą", + "command_palette_prompt": "اؚØĢØą Ø¨ØŗØąØšØŠ ØšŲ„Ų‰ Ø§Ų„ØĩŲØ­Ø§ØĒ ØŖŲˆ Ø§Ų„ØĨØŦØąØ§ØĄØ§ØĒ ØŖŲˆ Ø§Ų„ØŖŲˆØ§Ų…Øą", + "command_palette_to_close": "Ų„Ų„Ø§ØēŲ„Ø§Ų‚", + "command_palette_to_navigate": "Ų„Ų„Ø¯ØŽŲˆŲ„", + "command_palette_to_select": "Ų„Ų„Ø§ØŽØĒŲŠØ§Øą", + "command_palette_to_show_all": "Ų„ØšØąØļ Ø§Ų„ŲƒŲ„", "comment_deleted": "ØĒŲ… Ø­Ø°Ų Ø§Ų„ØĒØšŲ„ŲŠŲ‚", "comment_options": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„ØĒØšŲ„ŲŠŲ‚", "comments_and_likes": "Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ ŲˆØ§Ų„ØĨØšØŦاباØĒ", @@ -867,7 +872,7 @@ "current_server_address": "ØšŲ†ŲˆØ§Ų† Ø§Ų„ØŽØ§Ø¯Ų… Ø§Ų„Ø­Ø§Ų„ŲŠ", "custom_date": "ØĒØ§ØąŲŠØŽ Ų…ØŽØĩØĩ", "custom_locale": "Ų„ØēØŠ Ų…ØŽØĩØĩØŠ", - "custom_locale_description": "ØĒŲ†ØŗŲŠŲ‚ Ø§Ų„ØĒŲˆØ§ØąŲŠØŽ ŲˆØ§Ų„ØŖØąŲ‚Ø§Ų… Ø¨Ų†Ø§ØĄŲ‹ ØšŲ„Ų‰ Ø§Ų„Ų„ØēØŠ ŲˆØ§Ų„Ų…Ų†ØˇŲ‚ØŠ", + "custom_locale_description": "ØĒŲ†ØŗŲŠŲ‚ Ø§Ų„ØĒŲˆØ§ØąŲŠØŽ, Ø§Ų„ØŖŲˆŲ‚Ø§ØĒ ŲˆØ§Ų„ØŖØąŲ‚Ø§Ų… Ø¨Ų†Ø§ØĄŲ‹ ØšŲ„Ų‰ Ø§Ų„Ų„ØēØŠ ŲˆØ§Ų„Ų…Ų†ØˇŲ‚ØŠ Ø§Ų„Ų…ØŽØĒØ§ØąŲ‡", "custom_url": "ØąØ§Ø¨Øˇ Ų…ØŽØĩØĩ", "cutoff_date_description": "احØĒŲØ¸ Ø¨Ø§Ų„ØĩŲˆØą Ų…Ų† ØĸØŽØąâ€Ļ", "cutoff_day": "{count, plural, one {ŲŠŲˆŲ…} other {Ø§ŲŠØ§Ų…}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "ؚدد Ø¨ŲŠØ§Ų†Ø§ØĒ EXIF", "deduplication_info": "Ų…ØšŲ„ŲˆŲ…Ø§ØĒ ØĨŲ„ØēØ§ØĄ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų…ŲƒØąØąØŠ", "deduplication_info_description": "Ų„ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„ØŖØĩŲˆŲ„ Ų…ØŗØ¨Ų‚Ø§ ØĒŲ„Ų‚Ø§ØĻŲŠØ§ ؈ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĒŲƒØąØ§ØąØ§ØĒ Ø¨ŲƒŲ…ŲŠØ§ØĒ ŲƒØ¨ŲŠØąØŠØŒ Ų†Ų†Ø¸Øą ØĨŲ„Ų‰:", - "default_locale": "Ø§Ų„Ų„ØēØŠ Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ", - "default_locale_description": "ØĒŲ†ØŗŲŠŲ‚ Ø§Ų„ØĒŲˆØ§ØąŲŠØŽ ŲˆØ§Ų„ØŖØąŲ‚Ø§Ų… Ø¨Ų†Ø§ØĄŲ‹ ØšŲ„Ų‰ Ų„ØēØŠ Ø§Ų„Ų…ØĒØĩŲØ­ Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ", "delete": "Ø­Ø°Ų", "delete_action_confirmation_message": "Ų‡Ų„ Ø§Ų†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† Ø­Ø°Ų Ų‡Ø°Ø§ Ø§Ų„Ų…Ų„ŲØŸ Ų‡Ø°Ø§ ØŗØ¤Ø¯ŲŠ Ø§Ų„Ų‰ Ų†Ų‚Ų„ Ø§Ų„Ų…Ų„Ų Ø§Ų„Ų‰ ØŗŲ„ØŠ Ų…Ų‡Ų…Ų„Ø§ØĒ Ø§Ų„ØŽØ§Ø¯Ų… ŲˆØŗŲŠØĒŲ… Ø§Ø´ØšØ§ØąŲƒ Ø§Ų† ŲƒŲ†ØĒ ØĒØąŲŠØ¯ Ø­Ø°ŲŲ‡ ØšŲ„Ų‰ Ø§Ų„ØŦŲ‡Ø§Ø˛", "delete_action_prompt": "ØĒŲ… Ø­Ø°Ų {count}", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "ØĒŲ… ØĒØˇØ¨ŲŠŲ‚ Ø§Ų„ØĒØšØ¯ŲŠŲ„Ø§ØĒ Ø¨Ų†ØŦاح", "editor_flip_horizontal": "Ø§Ų‚Ų„Ø¨ ØŖŲŲ‚ŲŠŲ‹Ø§", "editor_flip_vertical": "Ø§Ų‚Ų„Ø¨ ØšŲ…ŲˆØ¯ŲŠŲ‹Ø§", + "editor_handle_corner": "{corner, select, top_left {ØŖØšŲ„Ų‰ Ø§Ų„ŲŠØŗØ§Øą} top_right {ØŖØšŲ„Ų‰ Ø§Ų„ŲŠŲ…ŲŠŲ†} bottom_left {ØŖØŗŲŲ„ Ø§Ų„ŲŠØŗØ§Øą} bottom_right {ØŖØŗŲŲ„ Ø§Ų„ŲŠŲ…ŲŠŲ†} other {ØŖØŽØąŲŠ}} corner handle", + "editor_handle_edge": "{edge, select, top {ØŖØšŲ„ŲŠ} bottom {ØŖØŗŲŲ„} left {ŲŠØŗØ§Øą} right {ŲŠŲ…ŲŠŲ†} other {ØŖØŽØąŲŠ}} edge handle", "editor_orientation": "اØĒØŦØ§Ų‡", "editor_reset_all_changes": "اؚاد؊ Ø¸Ø¨Øˇ Ø§Ų„ØĒØēŲŠŲŠØąØ§ØĒ", "editor_rotate_left": "ØŖØ¯Øą 90° ØšŲƒØŗ اØĒØŦØ§Ų‡ ØšŲ‚Ø§ØąØ¨ Ø§Ų„ØŗØ§ØšØŠ", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "ŲØ´Ų„ ؁؊ ØĒØ­Ø¯ŲŠØĢ Ø­Ø§Ų„ØŠ Ø§Ų„ØĨØ´ØšØ§Øą", "incorrect_email_or_password": "Ø¨ØąŲŠØ¯ ØŖŲˆ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØēŲŠØą ØĩØ­ŲŠØ­ØŠ", "library_folder_already_exists": "Ų…ØŗØ§Øą Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯ Ų…ŲˆØŦŲˆØ¯ Ø¨Ø§Ų„ŲØšŲ„.", + "page_not_found": "Ø§Ų„ØĩŲØ­ØŠ ØēŲŠØą Ų…ŲˆØŦŲˆØ¯ØŠ", "paths_validation_failed": "ŲØ´Ų„ ؁؊ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† {paths, plural, one {# Ų…ØŗØ§Øą} other {# Ų…ØŗØ§ØąØ§ØĒ}}", "profile_picture_transparent_pixels": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØŖŲ† ØĒØ­ØĒ؈؊ ØĩŲˆØą Ø§Ų„Ų…Ų„Ų Ø§Ų„Ø´ØŽØĩ؊ ØšŲ„Ų‰ ØŖØŦØ˛Ø§ØĄ/Ø¨ŲƒØŗŲ„Ø§ØĒ Ø´ŲØ§ŲØŠ. ŲŠØąØŦŲ‰ Ø§Ų„ØĒŲƒØ¨ŲŠØą ؈/ØŖŲˆ ØĒØ­ØąŲŠŲƒ Ø§Ų„ØĩŲˆØąØŠ.", "quota_higher_than_disk_size": "Ų„Ų‚Ø¯ Ų‚Ų…ØĒ بØĒØšŲŠŲŠŲ† Ø­ØĩØŠ Ų†ØŗØ¨ŲŠØŠ ØŖØšŲ„Ų‰ Ų…Ų† Ø­ØŦŲ… Ø§Ų„Ų‚ØąØĩ", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "Ø§Ų„Ų†Ø§Øŗ", "exif_bottom_sheet_person_add_person": "اØļ؁ Ø§ØŗŲ…Ø§", "exit_slideshow": "ØŽØąŲˆØŦ Ų…Ų† Ø§Ų„ØšØąØļ Ø§Ų„ØĒŲ‚Ø¯ŲŠŲ…ŲŠ", + "expand": "ØĒŲˆØŗØšØŠ", "expand_all": "ØĒŲˆØŗŲŠØš Ø§Ų„ŲƒŲ„", "experimental_settings_new_asset_list_subtitle": "ØŖØšŲ…Ø§Ų„ ØŦØ§ØąŲŠØŠ", "experimental_settings_new_asset_list_title": "ØĒŲ…ŲƒŲŠŲ† Ø´Ø¨ŲƒØŠ Ø§Ų„ØĩŲˆØą Ø§Ų„ØĒØŦØąŲŠØ¨ŲŠØŠ", @@ -1212,6 +1219,7 @@ "filter_description": "Ø´ØąŲˆØˇ ØĒØĩŲŲŠØŠ Ø§Ų„ØŖØĩŲˆŲ„ Ø§Ų„Ų…ØŗØĒŲ‡Ø¯ŲØŠ", "filter_people": "ØĒØĩŲŲŠØŠ Ø§Ų„Ø§Ø´ØŽØ§Øĩ", "filter_places": "ØĒØĩŲŲŠØŠ Ø§Ų„Ø§Ų…Ø§ŲƒŲ†", + "filter_tags": "ØĒØĩŲŲŠØŠ Ø§Ų„ØšŲ„Ø§Ų…Ø§ØĒ", "filters": "Ø§Ų„ØĒØĩŲŲŠØ§ØĒ", "find_them_fast": "ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØšØĢŲˆØą ØšŲ„ŲŠŲ‡Ø§ Ø¨ØŗØąØšØŠ Ø¨Ø§Ų„Ø§ØŗŲ… Ų…Ų† ØŽŲ„Ø§Ų„ Ø§Ų„Ø¨Ø­ØĢ", "first": "Ø§Ų„Ø§ŲˆŲ„", @@ -1642,6 +1650,7 @@ "online": "Ų…ØĒØĩŲ„", "only_favorites": "Ø§Ų„Ų…ŲØļŲ„ØŠ ŲŲ‚Øˇ", "open": "؁ØĒØ­", + "open_calendar": "Ø§ŲØĒØ­ Ø§Ų„ØąØ˛Ų†Ø§Ų…ØŠ", "open_in_map_view": "؁ØĒØ­ ؁؊ ØšØąØļ Ø§Ų„ØŽØąŲŠØˇØŠ", "open_in_openstreetmap": "؁ØĒØ­ ؁؊ OpenStreetMap", "open_the_search_filters": "Ø§ŲØĒØ­ Ų…ØąØ´Ø­Ø§ØĒ Ø§Ų„Ø¨Ø­ØĢ", @@ -1801,9 +1810,8 @@ "rate_asset": "ØĒŲ‚ŲŠŲŠŲ… Ø§Ų„Ø§ØĩŲ„", "rating": "ØĒŲ‚ŲŠŲŠŲ… Ų†ØŦŲ…ŲŠ", "rating_clear": "Ų…ØŗØ­ Ø§Ų„ØĒŲ‚ŲŠŲŠŲ…", - "rating_count": "{count, plural, one {# Ų†ØŦŲ…ØŠ} other {# Ų†ØŦŲˆŲ…}}", + "rating_count": "{count, plural, =0 {Unrated} one {# Ų†ØŦŲ…ØŠ} other {# Ų†ØŦŲˆŲ…}}", "rating_description": "â€Ģâ€ŒØ§ØšØąØļ ØĒŲ‚ŲŠŲŠŲ… EXIF ؁؊ Ų„ŲˆØ­ØŠ Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ", - "rating_set": "ØĒŲ… ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„ØĒØĩŲ†ŲŠŲ {rating, plural, one {# Ų†ØŦŲ…ØŠ} other {# Ų†ØŦŲˆŲ…}}", "reaction_options": "ØŽŲŠØ§ØąØ§ØĒ ØąØ¯ Ø§Ų„ŲØšŲ„", "read_changelog": "Ų‚ØąØ§ØĄØŠ ØŗØŦŲ„ Ø§Ų„ØĒØēŲŠŲŠØą", "readonly_mode_disabled": "ØĒŲ… ØĒØšØˇŲŠŲ„ ؈ØļØš Ø§Ų„Ų‚ØąØ§ØĄØŠ ŲŲ‚Øˇ", @@ -1875,7 +1883,10 @@ "reset_pin_code_success": "ØĒŲ… اؚاد؊ ØĒØšŲŠŲŠŲ† ØąŲ…Ø˛ Ø§Ų„PIN Ø¨Ų†ØŦاح", "reset_pin_code_with_password": "ŲŠŲ…ŲƒŲ†Ųƒ داØĻŲ…Ø§ اؚاد؊ ØĒØšŲŠŲŠŲ† ØąŲ…Ø˛ Ø§Ų„PIN Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ ØšŲ† ØˇØąŲŠŲ‚ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ", "reset_sqlite": "ØĨؚاد؊ ØĒØšŲŠŲŠŲ† Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ SQLite", - "reset_sqlite_confirmation": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØąØēبØĒ؃ ؁؊ ØĨؚاد؊ ØļØ¨Øˇ Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ SQLite؟ ØŗØĒØ­ØĒاØŦ ØĨŲ„Ų‰ ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ ØĢŲ… ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰ Ų„ØĨؚاد؊ Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ", + "reset_sqlite_clear_app_data": "Ų…ØŗØ­ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ", + "reset_sqlite_confirmation": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØąØēبØĒ؃ ؁؊ Ø­Ø°Ų ØļØ¨Øˇ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ØŸ ØŗŲŠØ¤Ø¯ŲŠ Ų‡Ø°Ø§ ØĨŲ„Ų‰ ØĨØ˛Ø§Ų„ØŠ ØŦŲ…ŲŠØš Ø§Ų„ØĨؚداداØĒ ؈ØĒØŗØŦŲŠŲ„ ØŽØąŲˆØŦ؃.", + "reset_sqlite_confirmation_note": "Ų…Ų„Ø§Ø­Ø¸ØŠ: ØŗŲŠØĒØšŲŠŲ† ØšŲ„ŲŠŲƒ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ بؚد Ø§Ų„Ų…ØŗØ­.", + "reset_sqlite_done": "ØĒŲ… Ų…ØŗØ­ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚. ŲŠØąØŦŲ‰ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ ØĒØˇØ¨ŲŠŲ‚ Immich ؈ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰.", "reset_sqlite_success": "ØĒŲ… ØĨؚاد؊ ØĒØšŲŠŲŠŲ† Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ SQLite Ø¨Ų†ØŦاح", "reset_to_default": "ØĨؚاد؊ Ø§Ų„ØĒØšŲŠŲŠŲ† ØĨŲ„Ų‰ Ø§Ų„Ø§ŲØĒØąØ§Øļ؊", "resolution": "Ø¯Ų‚ØŠ", @@ -1903,6 +1914,7 @@ "saved_settings": "ØĒŲ… Ø­ŲØ¸ Ø§Ų„ØĨؚداداØĒ", "say_something": "Ų‚Ų„ Ø´ŲŠØĻŲ‹Ø§", "scaffold_body_error_occurred": "حدØĢ ØŽØˇØŖ", + "scaffold_body_error_unrecoverable": "حدØĢ ØŽØˇØŖ Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĨØĩŲ„Ø§Ø­Ų‡. ŲŠØąØŦŲ‰ Ų…Ø´Ø§ØąŲƒØŠ ØĒŲØ§ØĩŲŠŲ„ Ø§Ų„ØŽØˇØŖ ؈ØĒØŗŲ„ØŗŲ„ Ø§Ų„ØŖØŽØˇØ§ØĄ ØšŲ„Ų‰ Discord ØŖŲˆ GitHub Ø­ØĒŲ‰ Ų†ØĒŲ…ŲƒŲ† Ų…Ų† Ų…ØŗØ§ØšØ¯ØĒ؃. ØĨذا ØˇŲŲ„Ø¨ Ų…Ų†Ųƒ Ø°Ų„ŲƒØŒ ŲŠŲ…ŲƒŲ†Ųƒ Ų…ØŗØ­ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ ØŖØ¯Ų†Ø§Ų‡.", "scan": "بحØĢ", "scan_all_libraries": "ŲØ­Øĩ ŲƒŲ„ Ø§Ų„Ų…ŲƒØĒباØĒ", "scan_library": "Ų…ØŗØ­", @@ -1938,6 +1950,7 @@ "search_filter_ocr": "Ø§Ų„Ø¨Ø­ØĢ ØšŲ† ØˇØąŲŠŲ‚ Ø§Ų„ØĒØšØąŲ Ø§Ų„Ø¨ØĩØąŲŠ ØšŲ„Ų‰ Ø§Ų„Ø­ØąŲˆŲ", "search_filter_people_title": "ا؎ØĒØą Ø§Ų„Ø§Ø´ØŽØ§Øĩ", "search_filter_star_rating": "ØĒŲ‚ŲŠŲŠŲ… Ø§Ų„Ų†ØŦŲˆŲ…", + "search_filter_tags_title": "â€ĒØĒØ­Ø¯ŲŠØ¯ Ø§Ų„ØšŲ„Ø§Ų…Ø§ØĒ", "search_for": "Ø§Ų„Ø¨Ø­ØĢ ØšŲ†", "search_for_existing_person": "Ø§Ų„Ø¨Ø­ØĢ ØšŲ† Ø´ØŽØĩ Ų…ŲˆØŦŲˆØ¯", "search_no_more_result": "Ų„Ø§ ØĒ؈ØŦد Ų†ØĒاØĻØŦ اØļØ§ŲŲŠØŠ", @@ -2017,6 +2030,9 @@ "set_profile_picture": "ØĒØ­Ø¯ŲŠØ¯ ØĩŲˆØąØŠ Ø§Ų„Ų…Ų„Ų Ø§Ų„Ø´ØŽØĩ؊", "set_slideshow_to_fullscreen": "ØĒØ­Ø¯ŲŠØ¯ ØšØąØļ Ø§Ų„Ø´ØąØ§ØĻØ­ ØšŲ„Ų‰ ؈ØļØš Ų…Ų„ØĄ Ø§Ų„Ø´Ø§Ø´ØŠ", "set_stack_primary_asset": "ØĒØšŲŠŲŠŲ† ŲƒØŖØĩŲ„ Ø§ØŗØ§ØŗŲŠ", + "setting_image_navigation_enable_subtitle": "؁؊ Ø­Ø§Ų„ ØĒŲ… Ø§Ų„ØĒŲØšŲŠŲ„ØŒ ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„Ø§Ų†ØĒŲ‚Ø§Ų„ ØĨŲ„Ų‰ Ø§Ų„ØĩŲˆØąØŠ Ø§Ų„ØŗØ§Ø¨Ų‚ØŠ ØŖŲˆ Ø§Ų„ØĒØ§Ų„ŲŠØŠ ØšŲ† ØˇØąŲŠŲ‚ Ø§Ų„Ų†Ų‚Øą ØšŲ„Ų‰ Ø§Ų„ØąØ¨Øš Ø§Ų„ØŖŲŠØŗØą ØŖŲˆ Ø§Ų„ØąØ¨Øš Ø§Ų„ØŖŲŠŲ…Ų† Ų…Ų† Ø§Ų„Ø´Ø§Ø´ØŠ.", + "setting_image_navigation_enable_title": "Ø§Ų„Ų†Ų‚Øą Ų„Ų„ØĒŲ†Ų‚Ų„", + "setting_image_navigation_title": "Ø§Ų„ØĒŲ†Ų‚Ų„ Ø¨ŲŠŲ† Ø§Ų„ØĩŲˆØą", "setting_image_viewer_help": "ŲŠŲ‚ŲˆŲ… ØšØ§ØąØļ Ø§Ų„ØĒŲØ§ØĩŲŠŲ„ بØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲˆØąØŠ Ø§Ų„Ų…ØĩØēØąØŠ Ø§Ų„ØĩØēŲŠØąØŠ ØŖŲˆŲ„Ø§Ų‹ ، ØĢŲ… ŲŠŲ‚ŲˆŲ… بØĒØ­Ų…ŲŠŲ„ Ø§Ų„Ų…ØšØ§ŲŠŲ†ØŠ Ų…ØĒŲˆØŗØˇØŠ Ø§Ų„Ø­ØŦŲ… (ØĨذا ØĒŲ… ØĒŲ…ŲƒŲŠŲ†Ų‡Ø§) ، ŲˆŲŠŲ‚ŲˆŲ… ØŖØŽŲŠØąŲ‹Ø§ بØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØŖØĩŲ„ (ØĨذا ØĒŲ… ØĒŲ…ŲƒŲŠŲ†Ų‡).", "setting_image_viewer_original_subtitle": "ØĒŲ…ŲƒŲŠŲ† ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲˆØąØŠ Ø§Ų„ŲƒØ§Ų…Ų„ØŠ Ø§Ų„Ø¯Ų‚ØŠ Ø§Ų„ØŖØĩŲ„ŲŠØŠ (ŲƒØ¨ŲŠØąØŠ!).ØĒØšØˇŲŠŲ„ Ų„ØĒŲ‚Ų„ŲŠŲ„ Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ (ŲƒŲ„ Ų…Ų† Ø§Ų„Ø´Ø¨ŲƒØŠ ŲˆØšŲ„Ų‰ Ø°Ø§ŲƒØąØŠ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ Ų„Ų„ØŦŲ‡Ø§Ø˛).", "setting_image_viewer_original_title": "ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲˆØąØŠ Ø§Ų„ØŖØĩŲ„ŲŠØŠ", @@ -2183,6 +2199,7 @@ "support": "Ø§Ų„Ø¯ØšŲ…", "support_and_feedback": "Ø§Ų„Ø¯ØšŲ… ŲˆØ§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ", "support_third_party_description": "ØĒŲ… Ø­Ø˛Ų… ØĒØĢØ¨ŲŠØĒ immich Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ Ø¨ŲˆØ§ØŗØˇØŠ ØŦŲ‡ØŠ ØŽØ§ØąØŦŲŠØŠ. Ų‚Ø¯ ØĒŲƒŲˆŲ† Ø§Ų„Ų…Ø´ŲƒŲ„Ø§ØĒ Ø§Ų„ØĒ؊ ØĒŲˆØ§ØŦŲ‡Ų‡Ø§ Ų†Ø§ØŦŲ…ØŠ ØšŲ† Ų‡Ø°Ų‡ Ø§Ų„Ø­Ø˛Ų…ØŠØŒ Ų„Ø°Ø§ ŲŠØąØŦŲ‰ ØˇØąØ­ Ø§Ų„Ų…Ø´ŲƒŲ„Ø§ØĒ Ų…ØšŲ‡Ų… ؁؊ Ø§Ų„Ų…Ų‚Ø§Ų… Ø§Ų„ØŖŲˆŲ„ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„ØąŲˆØ§Ø¨Øˇ ØŖØ¯Ų†Ø§Ų‡.", + "supporter": "Ø¯Ø§ØšŲ…", "swap_merge_direction": "ØĒØ¨Ø¯ŲŠŲ„ اØĒØŦØ§Ų‡ Ø§Ų„Ø¯Ų…ØŦ", "sync": "Ų…Ø˛Ø§Ų…Ų†ØŠ", "sync_albums": "Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ", @@ -2294,6 +2311,7 @@ "unstack_action_prompt": "ØĒŲ… Ø§Ø˛Ø§Ų„ØŠ ØĒŲƒØ¯ŲŠØŗ {count}", "unstacked_assets_count": "ØĒŲ… ØĨØŽØąØ§ØŦ {count, plural, one {# Ø§Ų„ØŖØĩŲ„} other {# Ø§Ų„ØŖØĩŲˆŲ„}} Ų…Ų† Ø§Ų„ØĒŲƒØ¯ŲŠØŗ", "unsupported_field_type": "Ų†ŲˆØš Ø­Ų‚Ų„ ØēŲŠØą Ų…Ø¯ØšŲˆŲ…", + "unsupported_file_type": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØąŲØš Ø§Ų„Ų…Ų„Ų {file} Ų„ØŖŲ† Ų†ŲˆØš Ø§Ų„Ų…Ų„Ų {type} ØēŲŠØą Ų…Ø¯ØšŲˆŲ….", "untagged": "ØēŲŠØą Ų…ŲØšŲŽŲ„ŲŽŲ‘Ų…", "untitled_workflow": "ØŽØˇØŠ ØŗŲŠØą ØšŲ…Ų„ Ø¨Ø¯ŲˆŲ† ØšŲ†ŲˆØ§Ų†", "up_next": "Ø§Ų„ØĒØ§Ų„ŲŠ", @@ -2320,6 +2338,8 @@ "url": "ØšŲ†ŲˆØ§Ų† URL", "usage": "Ø§Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…", "use_biometric": "Ø§ØŗØĒØŽØ¯Ų… Ø§Ų„Ø¨Ø§ŲŠŲˆŲ…ØĒØąŲŠ", + "use_browser_locale": "Ø§ØŗØĒØŽØ¯Ų… Ų„ØēŲ‡ Ų„Ų„Ų…ØĒØĩŲØ­", + "use_browser_locale_description": "ØĒŲ†ØŗŲŠŲ‚ Ø§Ų„ØĒŲˆØ§ØąŲŠØŽ ŲˆØ§Ų„ØŖŲˆŲ‚Ø§ØĒ ŲˆØ§Ų„ØŖØąŲ‚Ø§Ų… ŲˆŲŲ‚Ų‹Ø§ Ų„ØĨؚداداØĒ Ø§Ų„Ų„ØēØŠ ؁؊ Ų…ØĒØĩŲØ­Ųƒ", "use_current_connection": "Ø§ØŗØĒØŽØ¯Ų… Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø§Ų„Ø­Ø§Ų„ŲŠ", "use_custom_date_range": "Ø§ØŗØĒØŽØ¯Ų… Ø§Ų„Ų†ØˇØ§Ų‚ Ø§Ų„Ø˛Ų…Ų†ŲŠ Ø§Ų„Ų…ØŽØĩØĩ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† Ø°Ų„Ųƒ", "user": "Ų…ØŗØĒØŽØ¯Ų…", diff --git a/i18n/be.json b/i18n/be.json index 1c446c0cbd..2605a382b1 100644 --- a/i18n/be.json +++ b/i18n/be.json @@ -104,6 +104,8 @@ "image_preview_description": "Đ’Ņ–Đ´Đ°Ņ€Ņ‹Ņ ŅŅŅ€ŅĐ´ĐŊŅĐŗĐ° ĐŋаĐŧĐĩŅ€Ņƒ С Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊŅ‹ĐŧŅ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ‹ĐŧŅ–, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐĩŅ†Ņ†Đ° ĐŋҀҋ ĐŋŅ€Đ°ĐŗĐģŅĐ´ĐˇĐĩ Đ°ŅĐžĐąĐŊĐ°ĐŗĐ° Ņ€ŅŅŅƒŅ€ŅŅƒ Ņ– Đ´ĐģŅ ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ", "image_preview_quality_description": "Đ¯ĐēĐ°ŅŅ†ŅŒ ĐŋŅ€Đ°ŅĐ˛Ņ‹ ад 1 да 100. Đ§Ņ‹Đŧ Đ˛Ņ‹ŅˆŅĐš, ҂ҋĐŧ ĐģĐĩĐŋ҈, аĐģĐĩ ĐŋҀҋ ĐŗŅŅ‚Ņ‹Đŧ ŅŅ‚Đ˛Đ°Ņ€Đ°ŅŽŅ†Ņ†Đ° Ņ„Đ°ĐšĐģŅ‹ йОĐģŅŒŅˆĐ°ĐŗĐ° ĐŋаĐŧĐĩŅ€Ņƒ Ņ– ĐŧĐžĐļа СĐŊŅ–ĐˇŅ–Ņ†Ņ†Đ° Ņ…ŅƒŅ‚ĐēĐ°ŅŅ†ŅŒ Đ˛ĐžĐ´ĐŗŅƒĐē҃ ĐŋҀҋĐēĐģадаĐŊĐŊŅ. ĐŽŅŅ‚Đ°ĐŊĐžŅžĐēа ĐŊŅ–ĐˇĐēĐ°ĐŗĐ° СĐŊĐ°Ņ‡ŅĐŊĐŊŅ ĐŧĐžĐļа ĐŋĐ°ŅžĐŋĐģŅ‹Đ˛Đ°Ņ†ŅŒ ĐŊа ŅĐēĐ°ŅŅ†ŅŒ ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ.", "image_preview_title": "НаĐģĐ°Đ´Ņ‹ ĐŋаĐŋŅŅ€ŅĐ´ĐŊŅĐŗĐ° ĐŋŅ€Đ°ĐŗĐģŅĐ´Ņƒ", + "image_progressive": "ĐŸŅ€Đ°ĐŗŅ€ŅŅŅ–ŅžĐŊŅ‹", + "image_progressive_description": "Đ’Ņ‹ŅĐ˛Ņ‹ С ĐŋŅ€Đ°ĐŗŅ€ŅŅŅ–ŅžĐŊŅ‹Đŧ ĐēОдаваĐŊĐŊĐĩĐŧ ĐˇĐ°ĐŗŅ€ŅƒĐļĐ°ŅŽŅ†Ņ†Đ° Ņ…ŅƒŅ‚Ņ‡ŅĐš, ĐŋĐ°ŅŅ‚ŅƒĐŋОва ĐŋаĐģŅĐŋŅˆĐ°ĐĩŅ†Ņ†Đ° ŅĐēĐ°ŅŅ†ŅŒ. НаĐģада ĐŊĐĩ ŅžĐŋĐģŅ‹Đ˛Đ°Đĩ ĐŊа Đ˛Ņ‹ŅĐ˛Ņƒ Ņž Ņ„Đ°Ņ€ĐŧĐ°Ņ†Đĩ WebP.", "image_quality": "Đ¯ĐēĐ°ŅŅ†ŅŒ", "image_resolution": "Đ Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŒ", "image_resolution_description": "БоĐģҌ҈ Đ˛Ņ‹ŅĐžĐēĐ°Ņ Ņ€Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŒ даСваĐģŅĐĩ ĐˇĐ°Ņ…Đ°Đ˛Đ°Ņ†ŅŒ йОĐģҌ҈ Đ´ŅŅ‚Đ°ĐģŅŅž, аĐģĐĩ ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩ йОĐģҌ҈ Ņ‡Đ°ŅŅƒ Đ´ĐģŅ ĐēадаваĐŊĐŊŅ, ĐŋŅ€Ņ‹Đ˛ĐžĐ´ĐˇŅ–Ņ†ŅŒ да ĐŋĐ°Đ˛ŅĐģŅ–Ņ‡Đ˛Đ°ĐŊĐŊŅ ĐŋаĐŧĐĩŅ€Ņƒ Ņ„Đ°ĐšĐģĐ°Ņž Ņ– ĐŧĐžĐļа СĐŊŅ–ĐˇŅ–Ņ†ŅŒ Ņ…ŅƒŅ‚ĐēĐ°ŅŅ†ŅŒ Đ˛ĐžĐ´ĐŗŅƒĐē҃ Đ´Đ°Đ´Đ°Ņ‚Đē҃.", @@ -120,6 +122,7 @@ "job_settings_description": "ĐšŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ĐŊаĐģадаĐŧŅ– ĐŋĐ°Ņ€Đ°ĐģĐĩĐģҌĐŊĐ°ĐŗĐ° Đ˛Ņ‹ĐēаĐŊаĐŊĐŊŅ СадаĐŊĐŊŅŅž", "jobs_delayed": "{jobCount, plural, other {# адĐēĐģадСĐĩĐŊа}}", "jobs_failed": "{jobCount, plural, other {# ĐŊĐĩ Đ˛Ņ‹ĐēаĐŊаĐģĐ°ŅŅ}}", + "jobs_over_time": "Đ“Ņ€Đ°Ņ„Ņ–Đē аĐŋŅ€Đ°Ņ†ĐžŅžĐēŅ–", "library_created": "ĐĄŅ‚Đ˛ĐžŅ€Đ°ĐŊа ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēа: {library}", "library_deleted": "Đ‘Ņ–ĐąĐģŅ–ŅŅ‚ŅĐēа Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊа", "library_details": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēŅ–", @@ -160,8 +163,27 @@ "machine_learning_facial_recognition_model_description": "ĐœĐ°Đ´ŅĐģŅ– ĐŋĐĩŅ€Đ°ĐģŅ–Ņ‡Đ°ĐŊŅ‹ Ņž ĐŋĐ°Ņ€Đ°Đ´Đē҃ ŅžĐąŅ‹Đ˛Đ°ĐŊĐŊŅ Ņ–Ņ… ĐŋаĐŧĐĩŅ€Ņƒ. БоĐģŅŒŅˆŅ‹Ņ ĐŧĐ°Đ´ŅĐģŅ– ĐŋавОĐģҌĐŊĐĩĐš Ņ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ†ŅŒ йОĐģҌ҈ ĐŋаĐŧŅŅ†Ņ–, аĐģĐĩ Đ´Đ°ŅŽŅ†ŅŒ ĐģĐĩĐŋŅˆŅ‹Ņ Đ˛Ņ‹ĐŊŅ–ĐēŅ–. Đ—Đ˛ŅŅ€ĐŊҖ҆Đĩ ŅƒĐ˛Đ°ĐŗŅƒ, ŅˆŅ‚Đž ĐŋĐ°ŅĐģŅ СĐŧĐĩĐŊŅ‹ ĐŧĐ°Đ´ŅĐģŅ– Ņ‚Ņ€ŅĐąĐ° СĐŊĐžŅž СаĐŋŅƒŅŅ†Ņ–Ņ†ŅŒ СадаĐŊĐŊĐĩ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž Đ´ĐģŅ ŅžŅŅ–Ņ… Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°Ņž.", "machine_learning_facial_recognition_setting": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊĐĩ Ņ‚Đ˛Đ°Ņ€Đ°Ņž", "machine_learning_facial_recognition_setting_description": "КаĐģŅ– адĐēĐģŅŽŅ‡Đ°ĐŊа, Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ†ŅŒ ĐēĐ°Đ´Đ°Đ˛Đ°Ņ†Ņ†Đ° Đ´ĐģŅ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž, Ņ– ĐŊĐĩ ĐąŅƒĐ´ĐˇĐĩ СаĐŋĐ°ŅžĐŊŅŅ†Ņ†Đ° Ņ€Đ°ĐˇĐ´ĐˇĐĩĐģ \"Đ›ŅŽĐ´ĐˇŅ–\" ĐŊа ŅŅ‚Đ°Ņ€ĐžĐŊ҆ҋ \"ĐĐŗĐģŅĐ´\".", + "machine_learning_max_detection_distance": "МаĐēҁҖĐŧаĐģҌĐŊĐ°Ņ адĐģĐĩĐŗĐģĐ°ŅŅ†ŅŒ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ", + "machine_learning_max_detection_distance_description": "МаĐēҁҖĐŧаĐģҌĐŊĐ°Ņ Ņ€ĐžĐˇĐŊŅ–Ņ†Đ° ĐŋаĐŧŅ–Đļ Đ´Đ˛ŅƒĐŧа Đ˛Ņ‹ŅĐ˛Đ°ĐŧŅ–, ŅĐēŅ–Ņ ĐģŅ–Ņ‡Đ°Ņ†Ņ†Đ° Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ°ĐŧŅ–, ҁĐēĐģадаĐĩ ад 0,001 да 0,1. БоĐģҌ҈ Đ˛Ņ‹ŅĐžĐēŅ–Ņ СĐŊĐ°Ņ‡ŅĐŊĐŊŅ– даСвОĐģŅŅ†ŅŒ Đ˛Ņ‹ŅĐ˛Ņ–Ņ†ŅŒ йОĐģҌ҈ Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ°Ņž, аĐģĐĩ ĐŧĐžĐŗŅƒŅ†ŅŒ ĐŋŅ€Ņ‹Đ˛Đĩҁ҆Җ да ĐŊŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊҋ҅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅŅž.", + "machine_learning_max_recognition_distance": "ĐŸĐ°Ņ€ĐžĐŗ Ņ€Đ°ĐˇĐŋаСĐŊаваĐŊĐŊŅ", + "machine_learning_max_recognition_distance_description": "МаĐēҁҖĐŧаĐģҌĐŊаĐĩ Đ°Đ´Ņ€ĐžĐˇĐŊĐĩĐŊĐŊĐĩ ĐŋаĐŧŅ–Đļ Đ´Đ˛ŅƒĐŧа Đ°ŅĐžĐąĐ°ĐŧŅ–, ŅĐēŅ–Ņ ĐŧĐžĐļĐŊа ĐģŅ–Ņ‡Ņ‹Ņ†ŅŒ адĐŊŅ‹Đŧ Ņ‡Đ°ĐģавĐĩĐēаĐŧ (҃ Đ´Ņ‹ŅĐŋаСОĐŊĐĩ ад 0 да 2).ЗĐŊŅ–ĐļŅĐŊĐŊĐĩ ĐŗŅŅ‚Đ°ĐŗĐ° ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņƒ ĐŧĐžĐļа ĐŋŅ€Đ°Đ´ŅƒŅ…Ņ–ĐģŅ–Ņ†ŅŒ Ņ€Đ°ŅĐŋаСĐŊаĐŊĐŊĐĩ Đ´Đ˛ŅƒŅ… ĐģŅŽĐ´ĐˇĐĩĐš ŅĐē адĐŊĐ°ĐŗĐž Ņ– Ņ‚Đ°ĐŗĐž Đļ Ņ‡Đ°ĐģавĐĩĐēа, а ĐŋĐ°Đ˛Ņ‹ŅˆŅĐŊĐŊĐĩ - ŅĐē Đ´Đ˛ŅƒŅ… Ņ€ĐžĐˇĐŊҋ҅ ĐģŅŽĐ´ĐˇĐĩĐš. ĐœĐ°ĐšŅ†Đĩ ĐŊа ŅžĐ˛Đ°ĐˇĐĩ, ŅˆŅ‚Đž ĐŋŅ€Đ°ŅŅ†ĐĩĐš ай'ŅĐ´ĐŊĐ°Ņ†ŅŒ Đ´Đ˛ŅƒŅ… ĐģŅŽĐ´ĐˇĐĩĐš, ҇ҋĐŧ ĐŋĐ°Đ´ĐˇŅĐģŅ–Ņ†ŅŒ адĐŊĐ°ĐŗĐž Ņ‡Đ°ĐģавĐĩĐēа ĐŊа Đ´Đ˛Đ°Ņ–Ņ…, Ņ‚Đ°Đŧ҃ Đŋа ĐŧĐ°ĐŗŅ‡Ņ‹ĐŧĐ°ŅŅ†Ņ– Đ˛Ņ‹ĐąŅ–Ņ€Đ°ĐšŅ†Đĩ ĐŧĐĩĐŊŅˆŅ‹ ĐŋĐ°Ņ€ĐžĐŗ.", + "machine_learning_min_detection_score": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐŗ Ņ€Đ°ĐˇĐŋаСĐŊаваĐŊĐŊŅ", + "machine_learning_min_detection_score_description": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐŗ Đ´ĐģŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ Đ°ŅĐžĐąŅ‹ (ад 0 да 1). ĐŅ–ĐļŅĐšŅˆĐ°Đĩ СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ даСвОĐģŅ–Ņ†ŅŒ СĐŊĐ°Ņ…ĐžĐ´ĐˇŅ–Ņ†ŅŒ йОĐģҌ҈ Đ°ŅĐžĐą, аĐģĐĩ ĐŧĐžĐļа ĐŋŅ€Ņ‹Đ˛Đĩҁ҆Җ да Ņ–ĐģĐļŅ‹Đ˛Ņ‹Ņ… ҁĐŋŅ€Đ°Ņ†ĐžŅžĐ˛Đ°ĐŊĐŊŅŅž.", + "machine_learning_min_recognized_faces": "ĐœŅ–ĐŊŅ–Đŧ҃Đŧ Ņ€Đ°ĐˇĐŋаСĐŊаĐŊҋ҅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž", + "machine_learning_min_recognized_faces_description": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊĐ°Ņ ĐēĐžĐģҌĐēĐ°ŅŅ†ŅŒ Ņ€Đ°ŅĐŋаСĐŊаĐŊҋ҅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž Đ´ĐģŅ ŅŅ‚Đ˛Đ°Ņ€ŅĐŊĐŊŅ Đ°ŅĐžĐąŅ‹. ĐŸĐ°Đ˛ŅĐģŅ–Ņ‡ŅĐŊĐŊĐĩ ĐŗŅŅ‚Đ°ĐŗĐ° ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° Ņ€ĐžĐąŅ–Ņ†ŅŒ Ņ€Đ°ŅĐŋаСĐŊаĐŊĐŊĐĩ Đ°ŅĐžĐą йОĐģҌ҈ даĐēĐģадĐŊŅ‹Đŧ, аĐģĐĩ ĐŋҀҋ ĐŗŅŅ‚Ņ‹Đŧ ĐŋĐ°Đ˛ŅĐģŅ–Ņ‡Đ˛Đ°ĐĩŅ†Ņ†Đ° вĐĩŅ€Đ°ĐŗĐžĐ´ĐŊĐ°ŅŅ†ŅŒ Ņ‚Đ°ĐŗĐž, ŅˆŅ‚Đž Ņ‚Đ˛Đ°Ņ€ ĐŊĐĩ ĐąŅƒĐ´ĐˇĐĩ ĐŋŅ€Ņ‹ŅĐ˛ĐžĐĩĐŊŅ‹ Đ°ŅĐžĐąĐĩ.", + "machine_learning_ocr": "РаСĐŋаСĐŊаваĐŊĐŊĐĩ Ņ‚ŅĐēŅŅ‚Ņƒ (OCR)", + "machine_learning_ocr_description": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐšŅ†Đĩ ĐŧĐ°ŅˆŅ‹ĐŊĐŊаĐĩ ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊĐĩ Đ´ĐģŅ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ Ņ‚ŅĐēŅŅ‚Ņƒ ĐŊа ĐŧаĐģŅŽĐŊĐēĐ°Ņ…", + "machine_learning_ocr_enabled": "Đ”Đ°Đ´Đ°Ņ†ŅŒ OCR", + "machine_learning_ocr_enabled_description": "КаĐģŅ– адĐēĐģŅŽŅ‡Đ°ĐŊа, Đ˛Ņ‹ŅĐ˛Ņ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ†ŅŒ Ņ€Đ°ŅĐŋаСĐŊĐ°Đ˛Đ°Ņ†Ņ†Đ° С Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊĐŊĐĩĐŧ Ņ‚ŅĐēŅŅ‚Ņƒ.", "machine_learning_ocr_max_resolution": "МаĐēҁҖĐŧаĐģҌĐŊĐ°Ņ Ņ€Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŒ", "machine_learning_ocr_max_resolution_description": "Đ’Ņ–Đ´Đ°Ņ€Ņ‹ŅŅ‹ С Ņ€Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŽ йОĐģҌ҈ ĐŗŅŅ‚Đ°Đš ĐąŅƒĐ´ŅƒŅ†ŅŒ ĐŋаĐŧĐĩĐŊŅˆĐ°ĐŊŅ‹ С ĐˇĐ°Ņ…Đ°Đ˛Đ°ĐŊĐŊĐĩĐŧ ŅŅƒĐ°Đ´ĐŊĐžŅŅ–ĐŊŅ‹ йаĐēĐžŅž. БоĐģҌ҈ Đ˛Ņ‹ŅĐžĐēŅ–Ņ СĐŊĐ°Ņ‡ŅĐŊĐŊŅ– ĐŋĐ°Đ˛Ņ‹ŅˆĐ°ŅŽŅ†ŅŒ даĐēĐģадĐŊĐ°ŅŅ†ŅŒ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ, аĐģĐĩ ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒŅŽŅ†ŅŒ йОĐģҌ҈ Ņ‡Đ°ŅŅƒ ĐŊа аĐŋŅ€Đ°Ņ†ĐžŅžĐē҃ Ņ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ†ŅŒ йОĐģҌ҈ ĐŋаĐŧŅŅ†Ņ–.", + "machine_learning_ocr_min_detection_score": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊŅ‹ йаĐģ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ", + "machine_learning_ocr_min_detection_score_description": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊŅ‹ йаĐģ давĐĩŅ€Ņƒ Đ´ĐģŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ Ņ‚ŅĐēŅŅ‚Ņƒ ҁĐēĐģадаĐĩ ад 0 да 1. БоĐģҌ҈ ĐŊŅ–ĐˇĐēŅ–Ņ СĐŊĐ°Ņ‡ŅĐŊĐŊŅ– даСвОĐģŅŅ†ŅŒ Đ˛Ņ‹ŅĐ˛Ņ–Ņ†ŅŒ йОĐģҌ҈ Ņ‚ŅĐēŅŅ‚Ņƒ, аĐģĐĩ ĐŧĐžĐŗŅƒŅ†ŅŒ ĐŋŅ€Ņ‹Đ˛Đĩҁ҆Җ да Ņ…Ņ–ĐąĐŊҋ҅ ҁĐŋŅ€Đ°Ņ†ĐžŅžĐ˛Đ°ĐŊĐŊŅŅž.", + "machine_learning_ocr_min_recognition_score": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊŅ‹ йаĐģ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ", + "machine_learning_ocr_min_score_recognition_description": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊŅ‹ йаĐģ давĐĩŅ€Ņƒ Đ´ĐģŅ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐ°ĐŗĐ° Ņ‚ŅĐēŅŅ‚Ņƒ ҁĐēĐģадаĐĩ ад 0 да 1. БоĐģҌ҈ ĐŊŅ–ĐˇĐēŅ–Ņ СĐŊĐ°Ņ‡ŅĐŊĐŊŅ– Ņ€Đ°ŅĐŋаСĐŊĐ°ŅŽŅ†ŅŒ йОĐģҌ҈ Ņ‚ŅĐēŅŅ‚Ņƒ, аĐģĐĩ ĐŧĐžĐŗŅƒŅ†ŅŒ ĐŋŅ€Ņ‹Đ˛Đĩҁ҆Җ да Ņ…Ņ–ĐąĐŊҋ҅ ҁĐŋŅ€Đ°Ņ†ĐžŅžĐ˛Đ°ĐŊĐŊŅŅž.", + "machine_learning_ocr_model": "ĐœĐ°Đ´ŅĐģҌ ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ (OCR)", + "machine_learning_ocr_model_description": "ĐĄĐĩŅ€Đ˛ĐĩŅ€ĐŊŅ‹Ņ ĐŧĐ°Đ´ŅĐģŅ– йОĐģҌ҈ даĐēĐģадĐŊŅ‹Ņ, ҇ҋĐŧ ĐŧĐ°ĐąŅ–ĐģҌĐŊŅ‹Ņ, аĐģĐĩ аĐŋŅ€Đ°Ņ†ĐžŅžĐ˛Đ°ŅŽŅ†ŅŒ дадСĐĩĐŊŅ‹Ņ Đ´Đ°ŅžĐļŅĐš Ņ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ†ŅŒ йОĐģҌ҈ ĐŋаĐŧŅŅ†Ņ–.", + "machine_learning_settings": "НаĐģĐ°Đ´Ņ‹ ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ", "map_dark_style": "ĐĻŅ‘ĐŧĐŊŅ‹ ҁ҂ҋĐģҌ", "map_enable_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ Ņ„ŅƒĐŊĐē҆ҋҖ ĐēĐ°Ņ€Ņ‚Ņ‹", "map_gps_settings": "НаĐģĐ°Đ´Ņ‹ ĐēĐ°Ņ€Ņ‚Ņ‹ Ņ– GPS", @@ -171,6 +193,7 @@ "map_style_description": "URL-Đ°Đ´Ņ€Đ°Ņ style.json Ņ‚ŅĐŧŅ‹ ĐēĐ°Ņ€Ņ‚Ņ‹", "metadata_extraction_job_description": "Đ’Ņ‹ĐŊŅŅ†ŅŒ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ‹Ņ С Ņ„Đ°ĐšĐģĐ°Ņž, Ņ‚Đ°ĐēŅ–Ņ ŅĐē ĐŧĐĩŅŅ†Đ°ĐˇĐŊĐ°Ņ…ĐžĐ´ĐļаĐŊĐŊĐĩ, Ņ‚Đ˛Đ°Ņ€Ņ‹ Ņ– Ņ€Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŒ", "metadata_settings": "НаĐģĐ°Đ´Ņ‹ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊҋ҅", + "notification_email_port_description": "ĐŸĐžŅ€Ņ‚ ĐŋĐ°ŅˆŅ‚ĐžĐ˛Đ°ĐŗĐ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ° (ĐŊаĐŋҀҋĐēĐģад, 25, 465 айО 587)", "oauth_button_text": "ĐĸŅĐēҁ҂ ĐēĐŊĐžĐŋĐēŅ–", "oauth_settings": "OAuth", "refreshing_all_libraries": "АйĐŊĐ°ŅžĐģĐĩĐŊĐŊĐĩ ŅžŅŅ–Ņ… ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐē", diff --git a/i18n/bg.json b/i18n/bg.json index 0d39878cad..4e64363267 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "ĐēĐžĐŋиĐĩ ĐŊа ОйĐģаĐēа иĐģи Đ´Ņ€ŅƒĐŗĐž Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐž ĐŧŅŅŅ‚Đž.", "backup_onboarding_2_description": "ĐģĐžĐēаĐģĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°. ĐĸОва вĐēĐģŅŽŅ‡Đ˛Đ° ĐžŅĐŊОвĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģОвĐĩ и ĐģĐžĐēаĐģĐŊи Đ°Ņ€Ņ…Đ¸Đ˛Đ¸ ĐŊа Ņ‚ĐĩСи Ņ„Đ°ĐšĐģОвĐĩ.", "backup_onboarding_3_description": "ĐžĐąŅ‰Đž ĐēĐžĐŋĐ¸Ņ ĐŊа Đ˛Đ°ŅˆĐ¸Ņ‚Đĩ даĐŊĐŊи, вĐēĐģŅŽŅ‡Đ¸Ņ‚ĐĩĐŊĐž ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģОвĐĩ. ĐĸОва вĐēĐģŅŽŅ‡Đ˛Đ° 1 ĐēĐžĐŋиĐĩ Đ¸ĐˇĐ˛ŅŠĐŊ ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° и 2 ĐģĐžĐēаĐģĐŊи ĐēĐžĐŋĐ¸Ņ.", - "backup_onboarding_description": "За ĐŊадĐĩĐļĐ´ĐŊа ĐˇĐ°Ņ‰Đ¸Ņ‚Đ° ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ°ĐŧĐĩ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸ŅŅ‚Đ° 3-2-1. ĐŸŅ€Đ°Đ˛ĐĩŅ‚Đĩ Đ°Ņ€Ņ…Đ¸Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ ĐēаĐēŅ‚Đž ĐŊа ĐēĐ°Ņ‡ĐĩĐŊĐ¸Ņ‚Đĩ ҁĐŊиĐŧĐēи/видĐĩа, Ņ‚Đ°Đēа и ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи ĐŊа Immich.", + "backup_onboarding_description": "За ĐŊадĐĩĐļĐ´ĐŊа ĐˇĐ°Ņ‰Đ¸Ņ‚Đ° ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ°ĐŧĐĩ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸ŅŅ‚Đ° 3-2-1. ĐŸŅ€Đ°Đ˛ĐĩŅ‚Đĩ Đ°Ņ€Ņ…Đ¸Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ ĐēаĐēŅ‚Đž ĐŊа ĐēĐ°Ņ‡ĐĩĐŊĐ¸Ņ‚Đĩ ҁĐŊиĐŧĐēи/видĐĩа, Ņ‚Đ°Đēа и ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи ĐŊа Immich.", "backup_onboarding_footer": "За ĐŋĐžĐ´Ņ€ĐžĐąĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ĐŊĐžŅĐŊĐž Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž в Immich, ĐŧĐžĐģŅ виĐļŅ‚Đĩ в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŅ‚Đ°.", "backup_onboarding_parts_title": "ĐĄŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸ŅŅ‚Đ° 3-2-1 вĐēĐģŅŽŅ‡Đ˛Đ°:", "backup_onboarding_title": "Đ ĐĩСĐĩŅ€Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ", @@ -104,7 +104,7 @@ "image_preview_description": "ĐĄŅ€ĐĩĐ´ĐĩĐŊ Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž ҁ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи, иСĐŋĐžĐģСваĐŊĐž ĐŋŅ€Đ¸ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ĐĩдиĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ и Са ĐŧĐ°ŅˆĐ¸ĐŊĐŊĐž ĐžĐąŅƒŅ‡ĐĩĐŊиĐĩ", "image_preview_quality_description": "ĐšĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŊа ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģĐŊĐ¸Ņ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´ ĐžŅ‚ 1 Đ´Đž 100. По-Đ˛Đ¸ŅĐžĐēĐ°Ņ‚Đ° ŅŅ‚ĐžĐšĐŊĐžŅŅ‚ Đĩ ĐŋĐž-Đ´ĐžĐąŅ€Đ°, ĐŊĐž вОди Đ´Đž ĐŋĐž-ĐŗĐžĐģĐĩĐŧи Ņ„Đ°ĐšĐģОвĐĩ и ĐŧĐžĐļĐĩ да ĐŊаĐŧаĐģи ĐąŅŠŅ€ĐˇĐžĐ´ĐĩĐšŅŅ‚Đ˛Đ¸ĐĩŅ‚Đž ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž. ЗадаваĐŊĐĩŅ‚Đž ĐŊа ĐŊĐ¸ŅĐēа ŅŅ‚ĐžĐšĐŊĐžŅŅ‚ ĐŧĐžĐļĐĩ да ĐŋОвĐģĐ¸ŅĐĩ ĐŊа ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐžŅ‚Đž ĐŊа ĐŧĐ°ŅˆĐ¸ĐŊĐŊĐžŅ‚Đž ĐžĐąŅƒŅ‡ĐĩĐŊиĐĩ.", "image_preview_title": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа ĐŋŅ€ĐĩĐŗĐģĐĩда", - "image_progressive": "ĐŸŅ€ĐžĐŗŅ€ĐĩŅĐ¸Đ˛ĐĩĐŊ JPEG", + "image_progressive": "ĐŸŅ€ĐžĐŗŅ€ĐĩŅĐ¸Đ˛ĐŊĐž", "image_progressive_description": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸ŅŅ‚Đ°, ĐēĐžĐ´Đ¸Ņ€Đ°ĐŊи в ĐŋŅ€ĐžĐŗŅ€ĐĩŅĐ¸Đ˛ĐĩĐŊ JPEG Ņ„ĐžŅ€ĐŧĐ°Ņ‚, ҁĐĩ ĐˇĐ°Ņ€ĐĩĐļĐ´Đ°Ņ‚ ĐŋĐž-ĐąŅŠŅ€ĐˇĐž, ҁ ĐŋĐžŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž ĐŋĐžĐ´ĐžĐąŅ€ŅĐ˛Đ°Ņ‰Đž ҁĐĩ ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž. ĐĸОва ĐŊŅĐŧа вĐģĐ¸ŅĐŊиĐĩ ĐŊа ĐēĐžĐ´Đ¸Ņ€Đ°ĐŊĐ¸Ņ‚Đĩ ĐēĐ°Ņ‚Đž WebP Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ.", "image_quality": "ĐšĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž", "image_resolution": "Đ ĐĩСОĐģŅŽŅ†Đ¸Ņ", @@ -311,7 +311,7 @@ "search_jobs": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ ĐŊа ĐˇĐ°Đ´Đ°Ņ‡Đ¸â€Ļ", "send_welcome_email": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ ĐŊа иĐŧĐĩĐšĐģ Са Đ´ĐžĐąŅ€Đĩ Đ´ĐžŅˆĐģи", "server_external_domain_settings": "Đ’ŅŠĐŊ҈ĐĩĐŊ Đ´ĐžĐŧĐĩĐšĐŊ", - "server_external_domain_settings_description": "ДоĐŧĐĩĐšĐŊ Са ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊи ҁĐŋОдĐĩĐģĐĩĐŊи Đ˛Ņ€ŅŠĐˇĐēи, вĐēĐģŅŽŅ‡Đ¸Ņ‚ĐĩĐģĐŊĐž http(s)://", + "server_external_domain_settings_description": "ДоĐŧĐĩĐšĐŊ Са Đ˛ŅŠĐŊ҈ĐŊи Đ˛Ņ€ŅŠĐˇĐēи", "server_public_users": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи", "server_public_users_description": "Đ’ŅĐ¸Ņ‡Đēи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи (иĐŧĐĩ и иĐŧĐĩĐšĐģ) ŅĐ° Đ¸ĐˇĐąŅ€ĐžĐĩĐŊи ĐŋŅ€Đ¸ Đ´ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ в ҁĐŋОдĐĩĐģĐĩĐŊи аĐģĐąŅƒĐŧи. ĐšĐžĐŗĐ°Ņ‚Đž Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž, ҁĐŋĐ¸ŅŅŠĐēŅŠŅ‚ ҁ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи ҉Đĩ ĐąŅŠĐ´Đĩ Đ´ĐžŅŅ‚ŅŠĐŋĐĩĐŊ ŅĐ°ĐŧĐž Са адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ¸Ņ‚Đĩ.", "server_settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°", @@ -372,7 +372,7 @@ "transcoding_audio_codec": "ĐŅƒĐ´Đ¸Đž ĐēОдĐĩĐē", "transcoding_audio_codec_description": "Opus Đĩ ĐžĐŋŅ†Đ¸ŅŅ‚Đ° ҁ ĐŊаК-Đ˛Đ¸ŅĐžĐēĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž, ĐŊĐž иĐŧа ĐŋĐž-ĐŊĐ¸ŅĐēа ŅŅŠĐ˛ĐŧĐĩŅŅ‚Đ¸ĐŧĐžŅŅ‚ ҁҊҁ ŅŅ‚Đ°Ņ€Đ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° иĐģи ŅĐžŅ„Ņ‚ŅƒĐĩŅ€.", "transcoding_bitrate_description": "ВидĐĩĐžĐēĐģиĐŋОвĐĩ ҁ ĐŋĐž-Đ˛Đ¸ŅĐžĐē ĐžŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģĐŊĐ¸Ņ ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚ иĐģи ĐŊĐĩ в ĐŋŅ€Đ¸ĐĩŅ‚ Ņ„ĐžŅ€ĐŧĐ°Ņ‚", - "transcoding_codecs_learn_more": "За да ĐŊĐ°ŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋОвĐĩ҇Đĩ Са иСĐŋĐžĐģСваĐŊĐ°Ņ‚Đ° Ņ‚ĐĩŅ€ĐŧиĐŊĐžĐģĐžĐŗĐ¸Ņ, виĐļŅ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŅ‚Đ° ĐŊа FFmpeg Са ĐēОдĐĩĐē H.264, ĐēОдĐĩĐē HEVC и VP9 ĐēОдĐĩĐē.", + "transcoding_codecs_learn_more": "За да ĐŊĐ°ŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋОвĐĩ҇Đĩ Са иСĐŋĐžĐģСваĐŊĐ°Ņ‚Đ° Ņ‚ĐĩŅ€ĐŧиĐŊĐžĐģĐžĐŗĐ¸Ņ, виĐļŅ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŅ‚Đ° ĐŊа FFmpeg Са ĐēОдĐĩĐē H.264, ĐēОдĐĩĐē HEVC и ĐēОдĐĩĐē VP9.", "transcoding_constant_quality_mode": "Đ ĐĩĐļиĐŧ ĐŊа ĐŋĐžŅŅ‚ĐžŅĐŊĐŊĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž", "transcoding_constant_quality_mode_description": "ICQ Đĩ ĐŋĐž-Đ´ĐžĐąŅŠŅ€ ĐžŅ‚ CQP, ĐŊĐž ĐŊŅĐēОи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° Са Ņ…Đ°Ņ€Đ´ŅƒĐĩŅ€ĐŊĐž ҃ҁĐēĐžŅ€ŅĐ˛Đ°ĐŊĐĩ ĐŊĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€ĐļĐ°Ņ‚ Ņ‚ĐžĐˇĐ¸ Ņ€ĐĩĐļиĐŧ. ĐĄ СадаваĐŊĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ ĐžĐŋŅ†Đ¸Ņ ҉Đĩ ĐŋŅ€ĐĩĐ´ĐŋĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐžŅĐžŅ‡ĐĩĐŊĐ¸Ņ Ņ€ĐĩĐļиĐŧ ĐŋŅ€Đ¸ иСĐŋĐžĐģСваĐŊĐĩ ĐŊа ĐąĐ°ĐˇĐ¸Ņ€Đ°ĐŊĐž ĐŊа ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐēĐžĐ´Đ¸Ņ€Đ°ĐŊĐĩ. Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€Đ°ĐŊĐž ĐžŅ‚ NVENC, Ņ‚ŅŠĐš ĐēĐ°Ņ‚Đž ĐŊĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа ICQ.", "transcoding_constant_rate_factor": "КоĐĩŅ„Đ¸Ņ†Đ¸ĐĩĐŊŅ‚ ĐŊа ĐŋĐžŅŅ‚ĐžŅĐŊĐŊа ҁĐēĐžŅ€ĐžŅŅ‚ (-crf)", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "ĐĸĐžĐŊаĐģĐŊĐž ĐēĐ°Ņ€Ņ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Ņ€Đ°ĐŊĐĩ", "transcoding_tone_mapping_description": "ОĐŋĐ¸Ņ‚Đ˛Đ° ҁĐĩ да СаĐŋаСи Đ˛ŅŠĐŊ҈ĐŊĐ¸Ņ вид ĐŊа HDR видĐĩĐžĐēĐģиĐŋОвĐĩ, ĐēĐžĐŗĐ°Ņ‚Đž ҁĐĩ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ° в SDR. Đ’ŅĐĩĐēи аĐģĐŗĐžŅ€Đ¸Ņ‚ŅŠĐŧ ĐŋŅ€Đ°Đ˛Đ¸ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊи ĐēĐžĐŧĐŋŅ€ĐžĐŧĐ¸ŅĐ¸ Са Ņ†Đ˛ŅŅ‚, Đ´ĐĩŅ‚Đ°ĐšĐģĐŊĐžŅŅ‚ и ŅŅ€ĐēĐžŅŅ‚. Hable СаĐŋаСва Đ´ĐĩŅ‚Đ°ĐšĐģĐ¸Ņ‚Đĩ, Mobius СаĐŋаСва Ņ†Đ˛ĐĩŅ‚Đ°, а Reinhard СаĐŋаСва ŅŅ€ĐēĐžŅŅ‚Ņ‚Đ°.", "transcoding_transcode_policy": "ĐŸŅ€Đ°Đ˛Đ¸Đģа Са Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊĐĩ", - "transcoding_transcode_policy_description": "ĐŸŅ€Đ°Đ˛Đ¸Đģа Са Ņ‚ĐžĐ˛Đ° ĐēĐžĐŗĐ° видĐĩĐžĐēĐģиĐŋŅŠŅ‚ Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊ. HDR видĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ виĐŊĐ°ĐŗĐ¸ ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊи (ĐžŅĐ˛ĐĩĐŊ аĐēĐž Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž).", + "transcoding_transcode_policy_description": "ĐŸŅ€Đ°Đ˛Đ¸Đģа Са Ņ‚ĐžĐ˛Đ° ĐēĐžĐŗĐ° видĐĩĐžĐēĐģиĐŋŅŠŅ‚ Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊ. HDR видĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ и Ņ‚ĐĩСи ҁ Ņ„ĐžŅ€ĐŧĐ°Ņ‚, Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐĩĐŊ ĐžŅ‚ YUV 4:2:0, ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ виĐŊĐ°ĐŗĐ¸ Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊи (ĐžŅĐ˛ĐĩĐŊ аĐēĐž Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž).", "transcoding_two_pass_encoding": "ĐšĐžĐ´Đ¸Ņ€Đ°ĐŊĐĩ ҁ двОКĐŊĐž ĐŧиĐŊаваĐŊĐĩ", "transcoding_two_pass_encoding_setting_description": "ĐĸŅ€Đ°ĐŊҁĐēĐžĐ´Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ҁ двĐĩ ĐŧиĐŊаваĐŊĐ¸Ņ ŅŅŠĐˇĐ´Đ°Đ˛Đ° ĐŋĐž-Đ´ĐžĐąŅ€Đĩ ĐēĐžĐ´Đ¸Ņ€Đ°ĐŊĐĩ видĐĩа. ĐšĐžĐŗĐ°Ņ‚Đž ĐŧаĐēŅĐ¸ĐŧаĐģĐŊĐ¸Ņ ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚ Đĩ вĐēĐģŅŽŅ‡ĐĩĐŊ (ĐˇĐ°Đ´ŅŠĐģĐļĐ¸Ņ‚ĐĩĐģĐŊĐž Đĩ да ҁĐĩ Ņ€Đ°ĐąĐžŅ‚Đ¸ ҁ H.264 и HEVC), Ņ‚Đ°ĐˇĐ¸ ĐžĐŋŅ†Đ¸Ņ иСĐŋĐžĐģСва диаĐŋаСОĐŊ ĐŊа ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚Đ° ĐąĐ°ĐˇĐ¸Ņ€Đ°ĐŊ ĐŊа ĐŧаĐēŅĐ¸ĐŧаĐģĐŊĐ¸Ņ ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚ и Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€Đ° CRF. За VP9, CRF ĐŧĐžĐļĐĩ да ҁĐĩ иСĐŋĐžĐģСва аĐēĐž ĐŧаĐēŅĐ¸ĐŧаĐģĐŊĐ¸ŅŅ‚ ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚ Đĩ иСĐēĐģŅŽŅ‡ĐĩĐŊ.", "transcoding_video_codec": "ВидĐĩĐžĐēОдĐĩĐē", @@ -794,6 +794,11 @@ "color": "ĐĻĐ˛ŅŅ‚", "color_theme": "ĐĻвĐĩŅ‚ĐžĐ˛Đ° Ņ‚ĐĩĐŧа", "command": "КоĐŧаĐŊда", + "command_palette_prompt": "Đ‘ŅŠŅ€ĐˇĐž ĐŊаĐŧĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸, Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ иĐģи ĐēĐžĐŧаĐŊди", + "command_palette_to_close": "ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸", + "command_palette_to_navigate": "вĐģĐĩС", + "command_palette_to_select": "иСйĐĩŅ€Đ¸", + "command_palette_to_show_all": "ĐŋĐžĐēаĐļи Đ˛ŅĐ¸Ņ‡ĐēĐž", "comment_deleted": "КоĐŧĐĩĐŊŅ‚Đ°Ņ€ŅŠŅ‚ Đĩ Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚", "comment_options": "ОĐŋŅ†Đ¸Đ¸ Са ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€", "comments_and_likes": "КоĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ и Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸Ņ", @@ -866,8 +871,8 @@ "current_pin_code": "ĐĄĐĩĐŗĐ°ŅˆĐĩĐŊ PIN ĐēОд", "current_server_address": "ĐĐ°ŅŅ‚ĐžŅŅ‰ Đ°Đ´Ņ€Đĩҁ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°", "custom_date": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊа Đ´Đ°Ņ‚Đ°", - "custom_locale": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ ĐģĐžĐēаĐģ", - "custom_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ´Đ°Ņ‚Đ¸ и Ņ‡Đ¸ŅĐģа в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ ĐžŅ‚ ĐĩСиĐēа и Ņ€ĐĩĐŗĐ¸ĐžĐŊа", + "custom_locale": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊи ĐĩСиĐēОви ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи", + "custom_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ´Đ°Ņ‚Đ°, Đ˛Ņ€ĐĩĐŧĐĩ и Ņ‡Đ¸ŅĐģа в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ ĐžŅ‚ Đ¸ĐˇĐąŅ€Đ°ĐŊĐ¸Ņ ĐĩСиĐē и Ņ€ĐĩĐŗĐ¸ĐžĐŊ", "custom_url": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ URL Đ°Đ´Ņ€Đĩҁ", "cutoff_date_description": "ЗаĐŋаСваĐŊĐĩ ĐŊа ҁĐŊиĐŧĐēи ĐžŅ‚ ĐŋĐžŅĐģĐĩĐ´ĐŊĐ¸Ņ‚Đĩâ€Ļ", "cutoff_day": "{count, plural, one {Đ´ĐĩĐŊ} other {Đ´ĐŊи}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Đ‘Ņ€ĐžĐš EXIF даĐŊĐŊи", "deduplication_info": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Са Đ´ĐĩĐ´ŅƒĐŋĐģиĐēĐ°Ņ†Đ¸ŅŅ‚Đ°", "deduplication_info_description": "За Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģĐŊĐž Đ¸ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩŅŅƒŅ€ŅĐ¸ и ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Đ¸ ĐŊа ĐĩĐ´Ņ€Đž, Ņ€Đ°ĐˇĐŗĐģĐĩĐļдаĐŧĐĩ:", - "default_locale": "ЛоĐēаĐģĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ", - "default_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ´Đ°Ņ‚Đ¸ и Ņ‡Đ¸ŅĐģа в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ ĐžŅ‚ ĐĩСиĐēĐžĐ˛Đ°Ņ‚Đ° ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°", "delete": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš", "delete_action_confirmation_message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ Ņ‚ĐžĐˇĐ¸ ОйĐĩĐēŅ‚? ĐĄĐģĐĩдва ĐŋŅ€ĐĩĐŧĐĩŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа ОйĐĩĐēŅ‚Đ° в ĐēĐžŅˆĐ° Са ĐžŅ‚ĐŋĐ°Đ´ŅŠŅ†Đ¸ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° и ҉Đĩ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ ОйĐĩĐēŅ‚Đ° да ĐąŅŠĐ´Đĩ Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚ ĐģĐžĐēаĐģĐŊĐž", "delete_action_prompt": "{count} ŅĐ° Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŋŅ€Đ¸ĐģĐ°ĐŗĐ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ", "editor_flip_horizontal": "ĐžĐąŅŠŅ€ĐŊи Ņ…ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊĐž", "editor_flip_vertical": "ĐžĐąŅŠŅ€ĐŊи вĐĩŅ€Ņ‚Đ¸ĐēаĐģĐŊĐž", + "editor_handle_corner": "МаĐŊиĐŋ҃ĐģĐ°Ņ‚ĐžŅ€ {corner, select, top_left {ĐŗĐžŅ€ĐĩĐŊ ĐģŅĐ˛} top_right {ĐŗĐžŅ€ĐĩĐŊ Đ´ĐĩҁĐĩĐŊ} bottom_left {Đ´ĐžĐģĐĩĐŊ ĐģŅĐ˛} bottom_right {Đ´ĐžĐģĐĩĐŊ Đ´ĐĩҁĐĩĐŊ} other {в}} ŅŠĐŗŅŠĐģ", + "editor_handle_edge": "МаĐŊиĐŋ҃ĐģĐ°Ņ‚ĐžŅ€ {edge, select, top {ĐŗĐžŅ€ĐĩĐŊ} bottom {Đ´ĐžĐģĐĩĐŊ} left {ĐģŅĐ˛} right {Đ´ĐĩҁĐĩĐŊ} other {ĐŋĐž}} Ņ€ŅŠĐą", "editor_orientation": "ĐžŅ€Đ¸ĐĩĐŊŅ‚Đ°Ņ†Đ¸Ņ", "editor_reset_all_changes": "Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОви Đ˛ŅĐ¸Ņ‡Đēи ĐŋŅ€ĐžĐŧĐĩĐŊи", "editor_rotate_left": "Đ—Đ°Đ˛ŅŠŅ€Ņ‚Đ¸ 90° ĐžĐąŅ€Đ°Ņ‚ĐŊĐž ĐŊа Ņ‡Đ°ŅĐžĐ˛ĐŊиĐēĐžĐ˛Đ°Ņ‚Đ° ҁ҂ҀĐĩĐģĐēа", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅŅŠŅŅ‚ĐžŅĐŊиĐĩŅ‚Đž ĐŊа иСвĐĩŅŅ‚Đ¸ŅŅ‚Đ°", "incorrect_email_or_password": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ иĐŧĐĩĐšĐģ иĐģи ĐŋĐ°Ņ€ĐžĐģа", "library_folder_already_exists": "ĐĸаСи ĐŋаĐŋĐēа вĐĩ҇Đĩ ŅŅŠŅ‰ĐĩŅŅ‚Đ˛ŅƒĐ˛Đ°.", + "page_not_found": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° ĐŊĐĩ Đĩ ĐŊаĐŧĐĩŅ€ĐĩĐŊа", "paths_validation_failed": "{paths, plural, one {# ĐŋŅŠŅ‚} other {# ĐŋŅŠŅ‚Đ¸Ņ‰Đ°}} ĐŊĐĩ ĐŋŅ€ĐĩĐŧиĐŊĐ°Ņ…Đ° ваĐģĐ¸Đ´Đ°Ņ†Đ¸Ņ", "profile_picture_transparent_pixels": "ĐŸŅ€ĐžŅ„Đ¸ĐģĐŊĐ¸Ņ‚Đĩ ҁĐŊиĐŧĐēи ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ‚ да иĐŧĐ°Ņ‚ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊи ĐŋиĐēҁĐĩĐģи. МоĐģŅ, ŅƒĐ˛ĐĩĐģĐ¸Ņ‡ĐĩŅ‚Đĩ и/иĐģи ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩŅ‚Đĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž.", "quota_higher_than_disk_size": "ЗададĐĩĐŊа Đĩ ĐēĐ˛ĐžŅ‚Đ°, ĐŋĐž-ĐŗĐžĐģŅĐŧа ĐžŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Đ´Đ¸ŅĐēа", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "ĐĨОРА", "exif_bottom_sheet_person_add_person": "Добави иĐŧĐĩ", "exit_slideshow": "Đ˜ĐˇŅ…ĐžĐ´ ĐžŅ‚ ҁĐģĐ°ĐšĐ´ŅˆĐžŅƒŅ‚Đž", + "expand": "Đ Đ°ĐˇĐŗŅŠĐŊи", "expand_all": "Đ Đ°ĐˇŅˆĐ¸Ņ€Đ¸ Đ˛ŅĐ¸Ņ‡Đēи", "experimental_settings_new_asset_list_subtitle": "В Ņ€Đ°ĐˇĐ˛Đ¸Ņ‚Đ¸Đĩ", "experimental_settings_new_asset_list_title": "ВĐēĐģŅŽŅ‡Đ¸ ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģĐŊа ĐŋĐžĐ´Ņ€Đĩдйа ĐŊа ҁĐŊиĐŧĐēи", @@ -1212,6 +1219,7 @@ "filter_description": "ĐŖŅĐģĐžĐ˛Đ¸Ņ Са Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ОйĐĩĐēŅ‚Đ¸", "filter_people": "ФиĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ…ĐžŅ€Đ°", "filter_places": "ФиĐģŅ‚ŅŠŅ€ ĐŋĐž ĐŧŅŅŅ‚Đž", + "filter_tags": "ФиĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŋĐž ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸", "filters": "ФиĐģŅ‚Ņ€Đ¸", "find_them_fast": "НаĐŧĐĩŅ€ĐĩŅ‚Đĩ ĐŗĐ¸ ĐąŅŠŅ€ĐˇĐž ĐŋĐž иĐŧĐĩ ҁ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ", "first": "ĐŸŅŠŅ€Đ˛Đ¸", @@ -1311,7 +1319,7 @@ "import_path": "ĐŸŅŠŅ‚ Са иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ", "in_albums": "В {count, plural, one {# аĐģĐąŅƒĐŧ} other {# аĐģĐąŅƒĐŧа}}", "in_archive": "В Đ°Ņ€Ņ…Đ¸Đ˛", - "in_year": "{year} Đŗ.", + "in_year": "ĐŸŅ€ĐĩС {year}", "in_year_selector": "ĐŸŅ€ĐĩС", "include_archived": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊи", "include_shared_albums": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊи аĐģĐąŅƒĐŧи", @@ -1642,6 +1650,7 @@ "online": "ОĐŊĐģаКĐŊ", "only_favorites": "ХаĐŧĐž ĐģŅŽĐąĐ¸Đŧи", "open": "ĐžŅ‚Đ˛ĐžŅ€Đ¸", + "open_calendar": "ĐžŅ‚Đ˛ĐžŅ€Đ¸ ĐēаĐģĐĩĐŊĐ´Đ°Ņ€", "open_in_map_view": "ĐžŅ‚Đ˛ĐžŅ€Đ¸ Đ¸ĐˇĐŗĐģĐĩĐ´ ĐŊа ĐēĐ°Ņ€Ņ‚Đ°", "open_in_openstreetmap": "ĐžŅ‚Đ˛ĐžŅ€Đ¸ в OpenStreetMap", "open_the_search_filters": "ĐžŅ‚Đ˛Đ°Ņ€Đ¸ Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ‚Đĩ Са Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ", @@ -1801,9 +1810,8 @@ "rate_asset": "ЗадаваĐŊĐĩ ĐŊа Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ", "rating": "ĐžŅ†ĐĩĐŊĐēа ҁҊҁ СвĐĩСди", "rating_clear": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸ ĐžŅ†ĐĩĐŊĐēĐ°Ņ‚Đ°", - "rating_count": "{count, plural, one {# СвĐĩСда} other {# СвĐĩСди}}", + "rating_count": "{count, plural, =0 {БĐĩС Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ} one {# СвĐĩСда} other {# СвĐĩСди}}", "rating_description": "ПоĐēаĐļи EXIF ĐžŅ†ĐĩĐŊĐēĐ°Ņ‚Đ° в ĐŋаĐŊĐĩĐģа ҁ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ", - "rating_set": "ЗададĐĩĐŊ Đĩ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ {rating, plural, one {# СвĐĩСда} other {# СвĐĩСди}}", "reaction_options": "Đ˜ĐˇĐąĐžŅ€ ĐŊа Ņ€ĐĩаĐēŅ†Đ¸Ņ", "read_changelog": "ĐŸŅ€ĐžŅ‡ĐĩŅ‚Đ¸ ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ", "readonly_mode_disabled": "Đ ĐĩĐļиĐŧа ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ", @@ -1875,7 +1883,10 @@ "reset_pin_code_success": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊ ПИН ĐēОд", "reset_pin_code_with_password": "ĐĄ Đ˛Đ°ŅˆĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа ĐŧĐžĐļĐĩŅ‚Đĩ виĐŊĐ°ĐŗĐ¸ да ĐŊ҃ĐģĐ¸Ņ€Đ°Ņ‚Đĩ ŅĐ˛ĐžŅ ПИН ĐēОд", "reset_sqlite": "ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи SQLite", - "reset_sqlite_confirmation": "ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŊ҃ĐģĐ¸Ņ€Đ°Ņ‚Đĩ ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи SQLite? ĐŠĐĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да иСĐģĐĩСĐĩŅ‚Đĩ ĐžŅ‚ ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° и да ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ ĐžŅ‚ĐŊОвО Са ĐŊОва ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ", + "reset_sqlite_clear_app_data": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊи даĐŊĐŊĐ¸Ņ‚Đĩ", + "reset_sqlite_confirmation": "ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŊ҃ĐģĐ¸Ņ€Đ°Ņ‚Đĩ даĐŊĐŊĐ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž? ĐĸОва ҉Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊи Đ˛ŅĐ¸Ņ‡Đēи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи и ҉Đĩ Ви ĐžŅ‚ĐŋĐ¸ŅˆĐĩ ĐžŅ‚ ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ°.", + "reset_sqlite_confirmation_note": "БĐĩĐģĐĩĐļĐēа: ĐĄĐģĐĩĐ´ ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ ҉Đĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да Ņ€ĐĩŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°Ņ‚Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž.", + "reset_sqlite_done": "ДаĐŊĐŊĐ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ŅĐ° ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚Đ¸. МоĐģŅ, Ņ€ĐĩŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ Immich и ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ ĐžŅ‚ĐŊОвО.", "reset_sqlite_success": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи SQLite", "reset_to_default": "Đ’Ņ€ŅŠŅ‰Đ°ĐŊĐĩ ĐŊа Ņ„Đ°ĐąŅ€Đ¸Ņ‡ĐŊи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи", "resolution": "Đ ĐĩСОĐģŅŽŅ†Đ¸Ņ", @@ -1903,6 +1914,7 @@ "saved_settings": "ЗаĐŋаСĐĩĐŊи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи", "say_something": "КаĐļи ĐŊĐĩŅ‰Đž", "scaffold_body_error_occurred": "Đ’ŅŠĐˇĐŊиĐēĐŊа ĐŗŅ€Đĩ҈Đēа", + "scaffold_body_error_unrecoverable": "Đ’ŅŠĐˇĐŊиĐēĐŊа ĐŊĐĩĐŋĐžĐŋŅ€Đ°Đ˛Đ¸Đŧа ĐŗŅ€Đĩ҈Đēа. МоĐģŅ, ҁĐŋОдĐĩĐģĐĩŅ‚Đĩ ĐŗŅ€Đĩ҈ĐēĐ°Ņ‚Đ° и Ņ‚Ņ€Đ°ŅĐ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа ҁ҂ĐĩĐēа в Discord иĐģи GitHub, Са да ĐŧĐžĐļĐĩĐŧ да Ви ĐŋĐžĐŧĐžĐŗĐŊĐĩĐŧ. АĐēĐž ĐąŅŠĐ´ĐĩŅ‚Đĩ ĐŋĐžŅŅŠĐ˛ĐĩŅ‚Đ˛Đ°ĐŊи, ĐŧĐžĐļĐĩ да Đ¸ĐˇŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đĩ даĐŊĐŊĐ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž.", "scan": "ĐĄĐēаĐŊĐ¸Ņ€Đ°ĐŊe", "scan_all_libraries": "ĐĄĐēаĐŊĐ¸Ņ€Đ°Đš Đ˛ŅĐ¸Ņ‡Đēи йийĐģĐ¸ĐžŅ‚ĐĩĐēи", "scan_library": "ĐĄĐēаĐŊĐ¸Ņ€Đ°Đš", @@ -1938,6 +1950,7 @@ "search_filter_ocr": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ ĐŊa Ņ‚ĐĩĐēҁ҂", "search_filter_people_title": "ИСйĐĩŅ€Đ¸ Ņ…ĐžŅ€Đ°", "search_filter_star_rating": "КĐģĐ°ŅĐ°Ņ†Đ¸Ņ ҁҊҁ СвĐĩСди", + "search_filter_tags_title": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸", "search_for": "ĐĸŅŠŅ€ŅĐ¸ Са", "search_for_existing_person": "ĐĸŅŠŅ€ŅĐ¸ ŅŅŠŅ‰ĐĩŅŅ‚Đ˛ŅƒĐ˛Đ°Ņ‰ Ņ‡ĐžĐ˛ĐĩĐē", "search_no_more_result": "ĐŅĐŧа Đ´Ņ€ŅƒĐŗĐ¸ Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸", @@ -2017,6 +2030,9 @@ "set_profile_picture": "Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ĐŋŅ€ĐžŅ„Đ¸ĐģĐŊа ҁĐŊиĐŧĐēа", "set_slideshow_to_fullscreen": "Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ĐĄĐģĐ°ĐšĐ´ŅˆĐžŅƒ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ", "set_stack_primary_asset": "Задай ĐēĐ°Ņ‚Đž ĐžŅĐŊОвĐŊи ОйĐĩĐēŅ‚Đ¸", + "setting_image_navigation_enable_subtitle": "АĐēĐž Đĩ Đ¸ĐˇĐąŅ€Đ°ĐŊĐž, ĐŧĐžĐļĐĩŅ‚Đĩ да ĐŊĐ°Đ˛Đ¸ĐŗĐ¸Ņ€Đ°Ņ‚Đĩ ĐēҊĐŧ ĐŋŅ€ĐĩĐ´Đ¸ŅˆĐŊа/ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ° ҁĐŊиĐŧĐēа ĐēĐ°Ņ‚Đž ĐŊĐ°Ņ‚Đ¸ŅĐŊĐĩŅ‚Đĩ Đ˛ŅŠŅ€Ņ…Ņƒ ĐģŅĐ˛Đ°Ņ‚Đ°/Đ´ŅŅĐŊĐ°Ņ‚Đ° ŅŅ‚Ņ€Đ°ĐŊа ĐŊа ĐĩĐēŅ€Đ°ĐŊа.", + "setting_image_navigation_enable_title": "ĐĐ°Ņ‚Đ¸ŅĐŊи Са ĐŊĐ°Đ˛Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ", + "setting_image_navigation_title": "ĐĐ°Đ˛Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ҁĐŊиĐŧĐēа", "setting_image_viewer_help": "ĐŸŅ€Đ¸ ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ОйĐĩĐēŅ‚ ĐŋŅŠŅ€Đ˛Đž ҁĐĩ ĐˇĐ°Ņ€ĐĩĐļда ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ°, ĐŋĐžŅĐģĐĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ ҁҊҁ ҁҀĐĩĐ´ĐŊĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž (аĐēĐž Đĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž) и ĐŊаĐēŅ€Đ°Ņ ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģа (аĐēĐž Đĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž).", "setting_image_viewer_original_subtitle": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸ Са да ҁĐĩ ĐˇĐ°Ņ€ĐĩĐļда ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐŊĐžŅ‚Đž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ в ĐŋҊĐģĐĩĐŊ Ņ€Đ°ĐˇĐŧĐĩŅ€ (ĐŗĐžĐģŅĐŧ!). Đ—Đ°ĐąŅ€Đ°ĐŊи Са да ҁĐĩ ĐŊаĐŧаĐģи ОйĐĩĐŧа ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ (ĐŋĐž ĐŧŅ€ĐĩĐļĐ°Ņ‚Đ° и в ĐēĐĩŅˆĐ° ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž).", "setting_image_viewer_original_title": "Đ—Đ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐŊĐž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", @@ -2183,6 +2199,7 @@ "support": "ĐŸĐžĐ´Đ´Ņ€ŅŠĐļĐēа", "support_and_feedback": "ĐŸĐžĐ´Đ´Ņ€ŅŠĐļĐēа и ĐžĐąŅ€Đ°Ņ‚ĐŊа Đ˛Ņ€ŅŠĐˇĐēа", "support_third_party_description": "Đ’Đ°ŅˆĐ°Ņ‚Đ° иĐŊŅŅ‚Đ°ĐģĐ°Ņ†Đ¸Ņ ĐŊа Immich Đĩ ĐŋаĐēĐĩŅ‚Đ¸Ņ€Đ°ĐŊа ĐžŅ‚ ҂ҀĐĩŅ‚Đ° ŅŅ‚Ņ€Đ°ĐŊа. ĐŸŅ€ĐžĐąĐģĐĩĐŧĐ¸Ņ‚Đĩ, ĐēĐžĐ¸Ņ‚Đž иСĐŋĐ¸Ņ‚Đ˛Đ°Ņ‚Đĩ, ĐŧĐžĐļĐĩ да ŅĐ° ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊи ĐžŅ‚ Ņ‚ĐžĐˇĐ¸ ĐŋаĐēĐĩŅ‚, ĐˇĐ°Ņ‚ĐžĐ˛Đ° ĐŧĐžĐģŅ, ĐŋŅŠŅ€Đ˛Đž ĐŋĐžĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧĐ¸Ņ‚Đĩ ŅĐ¸ ĐēҊĐŧ Ņ‚ŅŅ… ҇ҀĐĩС ĐģиĐŊĐēОвĐĩŅ‚Đĩ ĐŋĐž-Đ´ĐžĐģ҃.", + "supporter": "ĐŸĐžĐ´Đ´Ņ€ŅŠĐļĐŊиĐē", "swap_merge_direction": "РаСĐŧŅĐŊа ĐŋĐžŅĐžĐēĐ°Ņ‚Đ° ĐŊа ҁĐģиваĐŊĐĩ", "sync": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", "sync_albums": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа аĐģĐąŅƒĐŧи", @@ -2196,7 +2213,7 @@ "tag_assets": "ĐĸĐ°ĐŗĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸", "tag_created": "ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊ ĐĩŅ‚Đ¸ĐēĐĩŅ‚: {tag}", "tag_feature_description": "Đ Đ°ĐˇĐŗĐģĐĩĐļдаĐŊĐĩ ĐŊа ҁĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ, ĐŗŅ€ŅƒĐŋĐ¸Ņ€Đ°ĐŊи ĐŋĐž Ņ‚ĐĩĐŧи ҁ ĐģĐžĐŗĐ¸Ņ‡ĐĩҁĐēи Ņ‚Đ°ĐŗĐžĐ˛Đĩ", - "tag_not_found_question": "НĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да ĐŊаĐŧĐĩŅ€Đ¸Ņ‚Đĩ ĐĩŅ‚Đ¸ĐēĐĩŅ‚? ĐĄŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ Ņ‚Đ°ĐēŅŠĐ˛ Ņ‚ŅƒĐē", + "tag_not_found_question": "НĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да ĐŊаĐŧĐĩŅ€Đ¸Ņ‚Đĩ ĐĩŅ‚Đ¸ĐēĐĩŅ‚? ĐĄŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ ĐŊОв ĐĩŅ‚Đ¸ĐēĐĩŅ‚.", "tag_people": "ĐžŅ‚ĐąĐĩĐģĐĩĐļи ĐĨĐžŅ€Đ°", "tag_updated": "ОбĐŊОвĐĩĐŊ ĐĩŅ‚Đ¸ĐēĐĩŅ‚: {tag}", "tagged_assets": "ĐĸĐ°ĐŗĐŊĐ°Ņ‚Đ¸ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸}}", @@ -2294,6 +2311,7 @@ "unstack_action_prompt": "{count} ŅĐ° Ņ€Đ°ĐˇĐŗŅ€ŅƒĐŋĐ¸Ņ€Đ°ĐŊи", "unstacked_assets_count": "РаСĐēĐ°Ņ‡ĐĩĐŊи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸}}", "unsupported_field_type": "ĐĸиĐŋа ĐŊа ĐŋĐžĐģĐĩŅ‚Đž ĐŊĐĩ ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа", + "unsupported_file_type": "ФаКĐģŅŠŅ‚ {file} ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐˇĐ°Ņ€ĐĩĐ´ĐĩĐŊ, ĐˇĐ°Ņ‰ĐžŅ‚Đž ĐŊĐĩĐŗĐžĐ˛Đ¸ŅŅ‚ Ņ‚Đ¸Đŋ {type} ĐŊĐĩ ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа.", "untagged": "НĐĩĐŧĐ°Ņ€ĐēĐ¸Ņ€Đ°ĐŊи", "untitled_workflow": "Đ Đ°ĐąĐžŅ‚ĐĩĐŊ ĐŋŅ€ĐžŅ†Đĩҁ ĐąĐĩС иĐŧĐĩ", "up_next": "ĐĄĐģĐĩĐ´Đ˛Đ°Ņ‰", @@ -2320,6 +2338,8 @@ "url": "URL", "usage": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊиĐĩ", "use_biometric": "ИСĐŋĐžĐģСваК йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ", + "use_browser_locale": "ИСĐŋĐžĐģСваК ĐĩСиĐēĐžĐ˛Đ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°", + "use_browser_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ ĐŊа Đ´Đ°Ņ‚Đ°, Đ˛Ņ€ĐĩĐŧĐĩ и Ņ‡Đ¸ŅĐģа ҁĐŋĐžŅ€ĐĩĐ´ ĐĩСиĐēĐžĐ˛Đ°Ņ‚Đ° ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°", "use_current_connection": "ИСĐŋĐžĐģСваК Ņ‚ĐĩĐēŅƒŅ‰Đ°Ņ‚Đ° Đ˛Ņ€ŅŠĐˇĐēа", "use_custom_date_range": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊ диаĐŋаСОĐŊ ĐžŅ‚ Đ´Đ°Ņ‚Đ¸ вĐŧĐĩŅŅ‚Đž Ņ‚ĐžĐ˛Đ°", "user": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ", diff --git a/i18n/bn.json b/i18n/bn.json index 7ba6c0a467..4580ca5551 100644 --- a/i18n/bn.json +++ b/i18n/bn.json @@ -70,23 +70,23 @@ "cleared_jobs": "{job} āĻāϰ āϜāĻ¨ā§āϝ jobs āĻ–āĻžāϞāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇", "config_set_by_file": "āĻ•āύāĻĢāĻŋāĻ— āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻ•āύāĻĢāĻŋāĻ— āĻĢāĻžāχāϞ āĻĻā§āĻŦāĻžāϰāĻž āϏ⧇āϟ āĻ•āϰāĻž āφāϛ⧇", "confirm_delete_library": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ {library} āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āϚāĻžāύ?", - "confirm_delete_library_assets": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ āĻāχ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϟāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āϚāĻžāύ? āĻāϟāĻŋ Immich āĻĨ⧇āϕ⧇ {count, plural, one {# contained asset} other {all # contained asset}} āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻŦ⧇ āĻāĻŦāĻ‚ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢ⧇āϰāĻžāύ⧋ āϝāĻžāĻŦ⧇ āύāĻžāĨ¤ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻĄāĻŋāĻ¸ā§āϕ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤", - "confirm_email_below": "āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇, āύāĻŋāĻšā§‡ \"{email}\" āϟāĻžāχāĻĒ āĻ•āϰ⧁āύ", - "confirm_reprocess_all_faces": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ āϏāĻŽāĻ¸ā§āϤ āĻŽā§āĻ– āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāϤ⧇ āϚāĻžāύ? āĻāϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻĻ⧇āϰāĻ“ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻŦ⧇āĨ¤", - "confirm_user_password_reset": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ {user} āĻāϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϰāĻŋāϏ⧇āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ?", - "confirm_user_pin_code_reset": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ {user} āĻāϰ āĻĒāĻŋāύ āϕ⧋āĻĄ āϰāĻŋāϏ⧇āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ?", - "copy_config_to_clipboard_description": "āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•ā§āϞāĻŋāĻĒāĻŦā§‹āĻ°ā§āĻĄā§‡ āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ", - "create_job": "job āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ", - "cron_expression": "āĻ•ā§āϰ⧋āύ āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ", - "cron_expression_description": "āĻ•ā§āϰ⧋āύ āĻĢāĻ°ā§āĻŽā§āϝāĻžāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ¸ā§āĻ•ā§āϝāĻžāύāĻŋāĻ‚ āĻŦā§āϝāĻŦāϧāĻžāύ āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ āĻĻāϝāĻŧāĻž āĻ•āϰ⧇ āĻĻ⧇āϖ⧁āύ āϝ⧇āĻŽāύ Crontab Guru", - "cron_expression_presets": "āĻ•ā§āϰ⧋āύ āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ āĻĒā§āϰāĻŋāϏ⧇āϟ", + "confirm_delete_library_assets": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤāĻ­āĻžāĻŦ⧇ āĻāχ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϟāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āϚāĻžāύ? āĻāϤ⧇ Immich āĻĨ⧇āϕ⧇ {count, plural, one {#āϟāĻŋ āĻ…ā§āϝāĻžāϏ⧇āϟ} other {#āϟāĻŋ āĻ…ā§āϝāĻžāϏ⧇āϟ}} āĻŽā§āϛ⧇ āϝāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āĻāχ āĻ•āĻžāϜāϟāĻŋ āĻĒāϰ⧇ āφāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢ⧇āϰāĻžāύ⧋ āϝāĻžāĻŦ⧇ āύāĻžāĨ¤ āϤāĻŦ⧇ āĻĢāĻžāχāϞāϗ⧁āϞ⧋ āĻĄāĻŋāĻ¸ā§āϕ⧇ āĻĨ⧇āϕ⧇ āϝāĻžāĻŦ⧇āĨ¤", + "confirm_email_below": "āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻšā§‡ \"{email}\" āϟāĻžāχāĻĒ āĻ•āϰ⧁āύ", + "confirm_reprocess_all_faces": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ āϏāĻŽāĻ¸ā§āϤ āĻŽā§āĻ– āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒāϰāĻŋāĻļā§‹āϧāύ āĻ•āϰāϤ⧇ āϚāĻžāύ? āĻāϤ⧇ āύāĻžāĻŽ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻŦā§āϝāĻ•ā§āϤāĻŋāĻĻ⧇āϰ āϤāĻĨā§āϝāĻ“ āĻŽā§āϛ⧇ āϝāĻžāĻŦ⧇āĨ¤", + "confirm_user_password_reset": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ {user}-āĻāϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϰāĻŋāϏ⧇āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ?", + "confirm_user_pin_code_reset": "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ {user}-āĻāϰ āĻĒāĻŋāύ āϕ⧋āĻĄ āϰāĻŋāϏ⧇āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ?", + "copy_config_to_clipboard_description": "āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•ā§āϞāĻŋāĻĒāĻŦā§‹āĻ°ā§āĻĄā§‡ āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ", + "create_job": "Job āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ", + "cron_expression": "Cron āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ", + "cron_expression_description": "Cron āĻĢāϰāĻŽā§āϝāĻžāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ¸ā§āĻ•ā§āϝāĻžāύāĻŋāĻ‚ āχāĻ¨ā§āϟāĻžāϰāĻ­ā§āϝāĻžāϞ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύāĨ¤ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ āĻĻ⧟āĻž āĻ•āϰ⧇ Crontab Guru āĻĻ⧇āϖ⧁āύ", + "cron_expression_presets": "Cron āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ āĻĒā§āϰāĻŋāϏ⧇āϟ", "disable_login": "āϞāĻ—āχāύ āĻ…āĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ", - "duplicate_detection_job_description": "āĻ…āύ⧁āϰ⧂āĻĒ āĻ›āĻŦāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āϏāĻŽā§āĻĒāĻĻāϗ⧁āϞāĻŋāϤ⧇ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϚāĻžāϞāĻžāύāĨ¤ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇", - "exclusion_pattern_description": "āĻāĻ•ā§āϏāĻ•ā§āϞ⧁āĻļāύ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻĢāĻžāχāϞ āĻāĻŦāĻ‚ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϗ⧁āϞāĻŋāϕ⧇ āωāĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻāĻŽāύ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻĨāĻžāϕ⧇ āϝ⧇āĻ–āĻžāύ⧇ āĻāĻŽāύ āĻĢāĻžāχāϞ āĻĨāĻžāϕ⧇ āϝāĻž āφāĻĒāύāĻŋ āφāĻŽāĻĻāĻžāύāĻŋ āĻ•āϰāϤ⧇ āϚāĻžāύ āύāĻž, āϝ⧇āĻŽāύ RAW āĻĢāĻžāχāϞāĨ¤", - "export_config_as_json_description": "āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻāĻ•āϟāĻŋ JSON āĻĢāĻžāχāϞ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧁āύ", - "external_libraries_page_description": "āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ external āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻĒ⧇āϜ", - "face_detection": "āĻŽā§āĻ– āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ", - "face_detection_description": "āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāϏ⧇āĻŸā§‡ āĻĨāĻžāĻ•āĻž āĻŽā§āĻ–/āĻšā§‡āĻšāĻžāϰāĻž āϗ⧁āϞāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤ āĻ­āĻŋāĻĄāĻŋāĻ“ āϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ \"āϰāĻŋāĻĢā§āϰ⧇āĻļ\" (āĻĒ⧁āύāϰāĻžāϝāĻŧ) āϏāĻŽāĻ¸ā§āϤ āĻ…ā§āϝāĻžāϏ⧇āϟ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰ⧇āĨ¤ \"āϰāĻŋāϏ⧇āϟ\" āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤāĻ­āĻžāĻŦ⧇ āϏāĻŽāĻ¸ā§āϤ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŽā§āϖ⧇āϰ āĻĄā§‡āϟāĻž āϏāĻžāĻĢ āĻ•āϰ⧇āĨ¤ \"āĻ…āύ⧁āĻĒāĻ¸ā§āĻĨāĻŋāϤ\" āĻ…ā§āϝāĻžāϏ⧇āϟāϗ⧁āϞāĻŋāϕ⧇ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻ•āϰ⧇ āϝāĻž āĻāĻ–āύāĻ“ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āĻĢ⧇āϏāĻŋāϝāĻŧāĻžāϞ āϰāĻŋāĻ•āĻ—āύāĻŋāĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻ•āϰāĻž āĻšāĻŦ⧇, āĻĢ⧇āϏāĻŋāϝāĻŧāĻžāϞ āĻĄāĻŋāĻŸā§‡āĻ•āĻļāύ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇, āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦāĻž āύāϤ⧁āύ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ—ā§‹āĻˇā§āĻ ā§€āĻŦāĻĻā§āϧ āĻ•āϰ⧇āĨ¤", + "duplicate_detection_job_description": "āϏāĻĻ⧃āĻļ āĻ›āĻŦāĻŋ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻ…ā§āϝāĻžāϏ⧇āϟāϗ⧁āϞ⧋āϰ āωāĻĒāϰ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϚāĻžāϞāĻžāύāĨ¤ āĻāϟāĻŋ Smart Search-āĻāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇", + "exclusion_pattern_description": "āĻāĻ•ā§āϏāĻ•ā§āϞ⧁āĻļāύ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĢāĻžāχāϞ āĻ“ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āωāĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāϟāĻŋ āϤāĻ–āύāχ āωāĻĒāĻ•āĻžāϰ⧀ āϝāĻ–āύ āĻ•āĻŋāϛ⧁ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āĻāĻŽāύ āĻĢāĻžāχāϞ āĻĨāĻžāϕ⧇ āϝāĻž āφāĻĒāύāĻŋ āχāĻŽāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ āύāĻž, āϝ⧇āĻŽāύ RAW āĻĢāĻžāχāϞāĨ¤", + "export_config_as_json_description": "āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ JSON āĻĢāĻžāχāϞ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧁āύ", + "external_libraries_page_description": "āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ āĻāĻ•ā§āϏāϟāĻžāĻ°ā§āύāĻžāϞ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻĒ⧇āϜ", + "face_detection": "āĻŽā§āĻ– āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ", + "face_detection_description": "āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāϏ⧇āĻŸā§‡ āĻĨāĻžāĻ•āĻž āĻŽā§āĻ–/āĻšā§‡āĻšāĻžāϰāĻž āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤ āĻ­āĻŋāĻĄāĻŋāĻ“āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ \"āϰāĻŋāĻĢā§āϰ⧇āĻļ\" āϏāĻŦ āĻ…ā§āϝāĻžāϏ⧇āϟ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰ⧇āĨ¤ \"āϰāĻŋāϏ⧇āϟ\" āĻ•āϰāϞ⧇ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āϏāĻŦ āĻŽā§āϖ⧇āϰ āĻĄā§‡āϟāĻž āĻŽā§āϛ⧇ āϝāĻžāϝāĻŧāĨ¤ \"āĻŽāĻŋāϏāĻŋāĻ‚\" āĻ“āχ āĻ…ā§āϝāĻžāϏ⧇āϟāϗ⧁āϞ⧋āϕ⧇ āϏāĻžāϰāĻŋāϤ⧇ āϝ⧋āĻ— āĻ•āϰ⧇ āϝāĻžāĻĻ⧇āϰāϕ⧇ āĻāĻ–āύ⧋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤ āĻĢ⧇āϏ āĻĄāĻŋāĻŸā§‡āĻ•āĻļāύ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāϞ⧇ āĻļāύāĻžāĻ•ā§āϤ āĻšāĻ“āϝāĻŧāĻž āĻŽā§āĻ–āϗ⧁āϞ⧋ āĻĢ⧇āϏāĻŋāϝāĻŧāĻžāϞ āϰāĻŋāĻ•āĻ—āύāĻŋāĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻžāϰāĻŋāϤ⧇ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞ⧋āϕ⧇ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦāĻž āύāϤ⧁āύ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āĻ—ā§āϰ⧁āĻĒ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤", "facial_recognition_job_description": "āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āĻŽāĻžāύ⧁āώ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ—ā§‹āĻˇā§āĻ ā§€āϭ⧁āĻ•ā§āϤ/āĻ—ā§āϰ⧁āĻĒ āĻ•āϰ⧁āύāĨ¤ āĻŽā§āĻ– āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āĻāχ āϧāĻžāĻĒāϟāĻŋ āϚāϞ⧇āĨ¤ \"āϰāĻŋāϏ⧇āϟ\" (āĻĒ⧁āύāϰāĻžāϝāĻŧ) āϏāĻŽāĻ¸ā§āϤ āĻŽā§āĻ–āϕ⧇ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻ•āϰ⧇āĨ¤ \"āĻ…āύ⧁āĻĒāĻ¸ā§āĻĨāĻŋāϤ/āĻŽāĻŋāϏāĻŋāĻ‚\" āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āϏāĻžāϰāĻŋāϤ⧇ āϰāĻžāϖ⧇ āϝ⧇āϗ⧁āϞ⧋ āϕ⧋āύāĻ“ āĻŦā§āϝāĻ•ā§āϤāĻŋāϕ⧇ āĻāϏāĻžāχāύ/āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤", "failed_job_command": "āĻ•āĻŽāĻžāĻ¨ā§āĻĄ {command} āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ⧇āϛ⧇: {job}", "force_delete_user_warning": "āϏāϤāĻ°ā§āĻ•āϤāĻž: āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻāĻŦāĻ‚ āϏāĻŽāĻ¸ā§āϤ āϏāĻŽā§āĻĒāĻĻ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āϏāϰāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞāĻŦ⧇āĨ¤ āĻāϟāĻŋ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢ⧇āϰāĻžāύ⧋ āϝāĻžāĻŦ⧇ āύāĻž āĻāĻŦāĻ‚ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ āύāĻžāĨ¤", @@ -98,9 +98,9 @@ "image_fullsize_quality_description": "āĻĒā§‚āĻ°ā§āĻŖ-āφāĻ•āĻžāϰ⧇āϰ āĻ›āĻŦāĻŋāϰ āĻŽāĻžāύ ā§§-ā§§ā§Ļā§ĻāĨ¤ āωāĻšā§āϚāϤāϰ āĻšāϞ⧇ āĻ­āĻžāϞ⧋, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāϰāĻ“ āĻŦāĻĄāĻŧ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻšāϝāĻŧāĨ¤", "image_fullsize_title": "āĻĒā§‚āĻ°ā§āĻŖ-āφāĻ•āĻžāϰ⧇āϰ āϚāĻŋāĻ¤ā§āϰ āϏ⧇āϟāĻŋāĻ‚āϏ", "image_prefer_embedded_preview": "āĻāĻŽā§āĻŦ⧇āĻĄ āĻ•āϰāĻž āĻĒā§āϰāĻŋāĻ­āĻŋāω āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧁āύ", - "image_prefer_embedded_preview_setting_description": "āϝāĻĻāĻŋ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ, RAW āĻ›āĻŦāĻŋāϰ āϭ⧇āϤāϰ⧇ āĻĨāĻžāĻ•āĻž āĻĒā§āϰāĻŋāĻ­āĻŋāω āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϤ⧇ āĻ•āĻŋāϛ⧁ āĻ›āĻŦāĻŋāϰ āϰāĻ™ āφāϰāĻ“ āϏāĻ āĻŋāĻ• āĻĻ⧇āĻ–āĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻŦ⧇ āĻŽāĻžāύ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāϰ āĻ“āĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ›āĻŦāĻŋāϤ⧇ āĻŦāĻžā§œāϤāĻŋ āĻ•āĻŽāĻĒā§āϰ⧇āĻļāύ āφāĻ°ā§āϟāĻŋāĻĢā§āϝāĻžāĻ•ā§āϟ āĻĻ⧇āĻ–āĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤", + "image_prefer_embedded_preview_setting_description": "RAW āĻ›āĻŦāĻŋāϤ⧇ āĻĨāĻžāĻ•āĻž āĻāĻŽāĻŦ⧇āĻĄā§‡āĻĄ āĻĒā§āϰāĻŋāĻ­āĻŋāωāϗ⧁āϞ⧋āϕ⧇ āχāĻŽā§‡āϜ āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚āϝāĻŧ⧇āϰ āχāύāĻĒ⧁āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻĻāĻŋ āϤāĻž āωāĻĒāϞāĻ­ā§āϝ āĻĨāĻžāϕ⧇āĨ¤ āĻāϤ⧇ āĻ•āĻŋāϛ⧁ āĻ›āĻŦāĻŋāϰ āϰāĻ™ āφāϰāĻ“ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻŦ⧇ āĻĒā§āϰāĻŋāĻ­āĻŋāωāϝāĻŧ⧇āϰ āĻŽāĻžāύ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ›āĻŦāĻŋāϤ⧇ āĻŦ⧇āĻļāĻŋ āĻ•āĻŽāĻĒā§āϰ⧇āĻļāύ āφāĻ°ā§āϟāĻŋāĻĢā§āϝāĻžāĻ•ā§āϟ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤", "image_prefer_wide_gamut": "āĻĒā§āϰāĻļāĻ¸ā§āϤ āĻĒāϰāĻŋāϏāϰ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧁āύ", - "image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ⧇āϰ āϜāĻ¨ā§āϝ Display P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āĻ“ā§ŸāĻžāχāĻĄ āĻ•āĻžāϞāĻžāϰāĻ¸ā§āĻĒ⧇āϏ āĻ›āĻŦāĻŋāϰ āωāĻœā§āĻœā§āĻŦāϞāϤāĻž āĻ“ āĻĒā§āϰāĻžāĻŖāĻŦāĻ¨ā§āϤ āϰāĻ™ āĻ­āĻžāϞ⧋āĻ­āĻžāĻŦ⧇ āϧāϰ⧇ āϰāĻžāϖ⧇, āϤāĻŦ⧇ āĻĒ⧁āϰāύ⧋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻŦāĻž āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇ āĻ›āĻŦāĻŋāϗ⧁āϞ⧋ āĻ­āĻŋāĻ¨ā§āύāĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ sRGB āĻ›āĻŦāĻŋāϗ⧁āϞ⧋ āϰāϙ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻā§œāĻžāϤ⧇ sRGB āĻšāĻŋāϏ⧇āĻŦ⧇āχ āϰāĻžāĻ–āĻž āĻšāĻŦ⧇āĨ¤", + "image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ⧇āϰ āϜāĻ¨ā§āϝ Display P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϤ⧇ āĻŦāĻŋāĻ¸ā§āϤ⧀āĻ°ā§āĻŖ āĻ•āĻžāϞāĻžāϰāĻ¸ā§āĻĒ⧇āϏ⧇āϰ āĻ›āĻŦāĻŋāϤ⧇ āĻ›āĻŦāĻŋāϰ āωāĻœā§āĻœā§āĻŦāϞāϤāĻž āĻ“ āĻĒā§āϰāĻžāĻŖāĻŦāĻ¨ā§āϤāϤāĻž āφāϰāĻ“ āĻ­āĻžāϞ⧋āĻ­āĻžāĻŦ⧇ āĻŦāϜāĻžāϝāĻŧ āĻĨāĻžāϕ⧇āĨ¤ āϤāĻŦ⧇ āĻĒ⧁āϰ⧋āύ⧋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻŦāĻž āĻĒ⧁āϰ⧋āύ⧋ āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇āϰ āĻĻā§‹āώ⧇ āĻ›āĻŦāĻŋāϗ⧁āϞ⧋ āĻ•āĻŋāϛ⧁āϟāĻž āĻ­āĻŋāĻ¨ā§āύāĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻž āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ sRGB āĻ›āĻŦāĻŋāϗ⧁āϞ⧋āϤ⧇ āϰāϙ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻāĻĄāĻŧāĻžāϤ⧇ sRGB āĻšāĻŋāϏ⧇āĻŦ⧇āχ āϰāĻžāĻ–āĻž āĻšāϝāĻŧāĨ¤", "image_preview_description": "āĻ¸ā§āĻŸā§āϰāĻŋāĻĒāĻĄ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āϏāĻš āĻŽāĻžāĻāĻžāϰāĻŋ āφāĻ•āĻžāϰ⧇āϰ āĻ›āĻŦāĻŋ, āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āϏāĻŽā§āĻĒāĻĻ āĻĻ⧇āĻ–āĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŦāĻ‚ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ", "image_preview_quality_description": "ā§§-ā§§ā§Ļā§Ļ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒā§āϰāĻŋāĻ­āĻŋāω āϕ⧋āϝāĻŧāĻžāϞāĻŋāϟāĻŋāĨ¤ āĻŦ⧇āĻļāĻŋ āĻšāϞ⧇ āĻ­āĻžāϞ⧋, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŦāĻĄāĻŧ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻļā§€āϞāϤāĻž āĻ•āĻŽāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ•āĻŽ āĻŽāĻžāύ āϏ⧇āϟ āĻ•āϰāϞ⧇ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϕ⧋āϝāĻŧāĻžāϞāĻŋāϟāĻŋāϰ āωāĻĒāϰ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤", "image_preview_title": "āĻĒā§āϰāĻŋāĻ­āĻŋāω āϏ⧇āϟāĻŋāĻ‚āϏ", @@ -117,7 +117,7 @@ "import_config_from_json_description": "āĻāĻ•āϟāĻŋ JSON āĻ•āύāĻĢāĻŋāĻ— āĻĢāĻžāχāϞ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āχāĻŽāĻĒā§‹āĻ°ā§āϟ āĻ•āϰ⧁āύāĨ¤", "job_concurrency": "{job} āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ", "job_created": "Job āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āϛ⧇", - "job_not_concurrency_safe": "āĻāχ āĻ•āĻžāϜāϟāĻŋ āϏāĻŽāĻžāĻ¨ā§āϤāϰāĻžāϞāĻ­āĻžāĻŦ⧇ āϚāĻžāϞāĻžāύ⧋ āύāĻŋāϰāĻžāĻĒāĻĻ āύ⧟", + "job_not_concurrency_safe": "āĻāχ āĻ•āĻžāϜāϟāĻŋ āϏāĻŽāĻžāĻ¨ā§āϤāϰāĻžāϞāĻ­āĻžāĻŦ⧇ āϚāĻžāϞāĻžāύ⧋ āύāĻŋāϰāĻžāĻĒāĻĻ āύ⧟āĨ¤", "job_settings": "āĻ•āĻžāĻœā§‡āϰ āϏ⧇āϟāĻŋāĻ‚āϏ", "job_settings_description": "āĻ•āĻžāĻœā§‡āϰ āϏāĻŽāĻžāĻ¨ā§āϤāϰāĻžāϞāϤāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ", "jobs_delayed": "{jobCount, plural, other {# āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ}}", @@ -137,20 +137,20 @@ "library_tasks_description": "āύāϤ⧁āύ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰ⧁āύ", "library_updated": "āφāĻĒāĻĄā§‡āϟāĻ•ā§ƒāϤ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāĨ¤", "library_watching_enable_description": "āĻĢāĻžāχāϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϗ⧁āϞāĻŋ āĻĻ⧇āϖ⧁āύ", - "library_watching_settings": "āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻĻ⧇āĻ–āĻž (āĻĒāϰ⧀āĻ•ā§āώāĻžāĻŽā§‚āϞāĻ•)", + "library_watching_settings": "āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ [āĻĒāϰ⧀āĻ•ā§āώāĻžāĻŽā§‚āϞāĻ•]", "library_watching_settings_description": "āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āύāϜāϰ āϰāĻžāϖ⧁āύ", "logging_enable_description": "āϞāĻ—āĻŋāĻ‚ āĻāύāĻžāĻŦāϞ/āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ", "logging_level_description": "āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻĨāĻžāĻ•āĻžāĻ•āĻžāϞ⧀āύ, āϕ⧋āύ āϞāĻ— āĻ¸ā§āϤāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤", "logging_settings": "āϞāĻ—āĻŋāĻ‚", "machine_learning_availability_checks": "āĻĒā§āϰāĻžāĻĒā§āϝāϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž", - "machine_learning_availability_checks_description": "āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āωāĻĒāϞāĻŦā§āϧ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϗ⧁āϞāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧁āύ", + "machine_learning_availability_checks_description": "āωāĻĒāϞāĻ­ā§āϝ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϗ⧁āϞ⧋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰ⧇ āϏ⧇āϗ⧁āϞ⧋āϕ⧇ āĻ…āĻ—ā§āϰāĻžāϧāĻŋāĻ•āĻžāϰ āĻĻāĻŋāύ", "machine_learning_availability_checks_enabled": "āĻĒā§āϰāĻžāĻĒā§āϝāϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ", "machine_learning_availability_checks_interval": "āĻšā§‡āĻ• āĻŦā§āϝāĻŦāϧāĻžāύ", "machine_learning_availability_checks_interval_description": "āĻĒā§āϰāĻžāĻĒā§āϝāϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻžāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻŦā§āϝāĻŦāϧāĻžāύ āĻŽāĻŋāϞāĻŋāϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡", "machine_learning_availability_checks_timeout": "āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻŽā§ŸāϏ⧀āĻŽāĻž āĻļ⧇āώ", "machine_learning_availability_checks_timeout_description": "āĻĒā§āϰāĻžāĻĒā§āϝāϤāĻžāϰ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻŽāĻŋāϞāĻŋāϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āϏāĻŽā§ŸāϏ⧀āĻŽāĻžāĨ¤", "machine_learning_clip_model": "CLIP āĻŽāĻĄā§‡āϞ", - "machine_learning_clip_model_description": "āĻāĻ–āĻžāύ⧇ āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻāĻ•āϟāĻŋ CLIP āĻŽāĻĄā§‡āϞ⧇āϰ āύāĻžāĻŽāĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ, āĻŽāĻĄā§‡āϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻĒāϰ āϏāĻŦ āĻ›āĻŦāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āĻŦāĻļā§āϝāχ ‘Smart Search’ āĻ•āĻžāϜāϟāĻŋ āφāĻŦāĻžāϰ āϚāĻžāϞāĻžāϤ⧇ āĻšāĻŦ⧇āĨ¤", + "machine_learning_clip_model_description": "āĻāĻ–āĻžāύ⧇ āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻāĻ•āϟāĻŋ CLIP āĻŽāĻĄā§‡āϞ⧇āϰ āύāĻžāĻŽāĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ, āĻŽāĻĄā§‡āϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϞ⧇ āϏāĻŦ āĻ›āĻŦāĻŋāϰ āϜāĻ¨ā§āϝ 'Smart Search' āϜāĻŦāϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞāĻžāϤ⧇ āĻšāĻŦ⧇āĨ¤", "machine_learning_duplicate_detection": "āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ", "machine_learning_duplicate_detection_enabled": "āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ", "machine_learning_duplicate_detection_enabled_description": "āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋ⧟ āĻĨāĻžāĻ•āϞ⧇āĻ“ āĻšā§āĻŦāĻšā§ āĻāĻ•āχ āϏāĻŽā§āĻĒāĻĻāϗ⧁āϞ⧋āϰ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϏāϰāĻŋā§Ÿā§‡ āĻĢ⧇āϞāĻž āĻšāĻŦ⧇āĨ¤", @@ -192,7 +192,7 @@ "machine_learning_url_description": "āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ URLāĨ¤ āϝāĻĻāĻŋ āĻāϕ⧇āϰ āĻŦ⧇āĻļāĻŋ URL āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻž āĻšā§Ÿ, āϤāĻŦ⧇ āĻāĻ•āϟāĻŋ āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ āϏāĻžā§œāĻž āύāĻž āĻĻ⧇āĻ“ā§ŸāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāĻ• āĻāĻ• āĻ•āϰ⧇ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻž āĻšāĻŦ⧇ (āĻĒā§āϰāĻĨāĻŽ āĻĨ⧇āϕ⧇ āĻļ⧇āώ āĻ•ā§āϰāĻŽāĻžāύ⧁āϏāĻžāϰ⧇)āĨ¤ āϝ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϗ⧁āϞ⧋ āϏāĻžā§œāĻž āĻĻ⧇āĻŦ⧇ āύāĻž, āϏ⧇āϗ⧁āϞ⧋ āĻĒ⧁āύāϰāĻžā§Ÿ āϏāϚāϞ āĻšāĻ“ā§ŸāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϏāĻžāĻŽā§ŸāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āωāĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤", "maintenance_delete_backup": "āĻŦā§āϝāĻžāĻ•āφāĻĒ (Backup)āĻŽā§āϛ⧁āύ", "maintenance_delete_backup_description": "āĻāχ āĻĢāĻžāχāϞāϟāĻŋ āϚāĻŋāϰāϤāϰ⧇ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻŦ⧇āĨ¤", - "maintenance_delete_error": "āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻŽā§āĻ›āϤ⧇ āĻŦā§āϝāĻ°ā§āĻĨ āĻšā§Ÿā§‡āϛ⧇āĨ¤", + "maintenance_delete_error": "āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āĻŦā§āϝāĻ°ā§āĻĨ āĻšā§Ÿā§‡āϛ⧇āĨ¤", "maintenance_restore_backup": "āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ(Restore) āĻ•āϰ⧁āύ", "maintenance_restore_backup_description": "Immich āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻŦāĻžāϚāĻŋāϤ āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻĨ⧇āϕ⧇ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ āĻ•āĻžāĻ°ā§āϝāĻ•ā§āϰāĻŽ āϚāĻžāϞāĻŋā§Ÿā§‡ āϝāĻžāĻ“ā§ŸāĻžāϰ āφāϗ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻ•āφāĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤", "maintenance_restore_backup_different_version": "āĻāχ āĻŦā§āϝāĻžāĻ•āφāĻĒāϟāĻŋ Immich-āĻāϰ āĻāĻ•āϟāĻŋ āĻ­āĻŋāĻ¨ā§āύ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšā§Ÿā§‡āĻ›āĻŋāϞ!", @@ -220,7 +220,7 @@ "map_reverse_geocoding_settings": "āϰāĻŋāĻ­āĻžāĻ°ā§āϏ āϜāĻŋāĻ“āϕ⧋āĻĄāĻŋāĻ‚ āϏ⧇āϟāĻŋāĻ‚āϏ (Reverse Geocoding Settings)", "map_settings": "āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ (Map)", "map_settings_description": "āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ⧇āϰ āϏ⧇āϟāĻŋāĻ‚āϏ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ (Manage map settings)", - "map_style_description": "āĻāĻ•āϟāĻŋ style.json āĻŽā§āϝāĻžāĻĒ āĻĨāĻŋāĻŽā§‡āϰ URL (URL to a style.json map theme)", + "map_style_description": "style.json āĻŽā§āϝāĻžāĻĒ āĻĨāĻŋāĻŽā§‡āϰ URL āĻ āĻŋāĻ•āĻžāύāĻž", "memory_cleanup_job": "āĻŽā§‡āĻŽāϰāĻŋ āĻ•ā§āϞāĻŋāύāφāĻĒ (Memory cleanup)", "memory_generate_job": "āĻ¸ā§āĻŽā§ƒāϤāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻž(Memory generation)", "metadata_extraction_job": "āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āĻāĻ•ā§āϏāĻŸā§āĻ°ā§āϝāĻžāĻ•ā§āϟ āĻ•āϰ⧁āύ (Extract metadata)", @@ -295,7 +295,7 @@ "search_jobs": "āϜāĻŦ āϏāĻžāĻ°ā§āϚ āĻ•āϰ⧁āύâ€Ļ", "send_welcome_email": "āĻ¸ā§āĻŦāĻžāĻ—āϤ āχāĻŽā§‡āϞ āĻĒāĻžāĻ āĻžāύ", "server_external_domain_settings": "āĻāĻ•ā§āϏāϟāĻžāĻ°ā§āύāĻžāϞ āĻĄā§‹āĻŽā§‡āχāύ (External Domain)", - "server_external_domain_settings_description": "āĻĒāĻžāĻŦāϞāĻŋāĻ• āĻļ⧇āϝāĻŧāĻžāϰāĻŋāĻ‚ āϞāĻŋāĻ™ā§āϕ⧇āϰ āϜāĻ¨ā§āϝ āĻĄā§‹āĻŽā§‡āχāύ (http(s):// āϏāĻš)", + "server_external_domain_settings_description": "āĻŦāĻžāχāϰ⧇āϰ āϞāĻŋāĻ™ā§āϕ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻĄā§‹āĻŽā§‡āχāύ", "server_public_users": "āĻĒāĻžāĻŦāϞāĻŋāĻ• āχāωāϜāĻžāϰ (Public Users)", "server_public_users_description": "āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰāĻž āĻ…ā§āϝāĻžāϞāĻŦāĻžāĻŽā§‡ āϕ⧋āύ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϝ⧋āĻ— āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϏāĻŽāĻ¸ā§āϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ (āύāĻžāĻŽ āĻāĻŦāĻ‚ āχāĻŽā§‡āϞ) āϤāĻžāϞāĻŋāĻ•āĻž āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāϝāĻŧāĨ¤ āĻāϟāĻŋ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ (Disabled) āĻ•āϰāĻž āĻšāϞ⧇, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϤāĻžāϞāĻŋāĻ•āĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āωāĻĒāϞāĻŦā§āϧ āĻšāĻŦ⧇āĨ¤", "server_settings": "āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏ⧇āϟāĻŋāĻ‚āϏ (Server Settings)", @@ -317,9 +317,9 @@ "storage_template_migration_description": "āĻĒā§‚āĻ°ā§āĻŦ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻ…ā§āϝāĻžāϏ⧇āϟāϗ⧁āϞ⧋āϤ⧇ āĻŦāĻ°ā§āϤāĻŽāĻžāύ {template} āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧁āύ", "storage_template_migration_info": "āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟāϟāĻŋ āϏāĻŽāĻ¸ā§āϤ āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύāϕ⧇ āϛ⧋āϟ āĻšāĻžāϤ⧇āϰ āĻ…āĻ•ā§āώāϰ⧇ (lowercase) āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āĻ•āϰāĻŦ⧇āĨ¤ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āĻŸā§‡āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞ⧋ āϕ⧇āĻŦāϞ āύāϤ⧁āύ āĻ…ā§āϝāĻžāϏ⧇āϟāϗ⧁āϞ⧋āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻĒā§āϰāϝ⧋āĻœā§āϝ āĻšāĻŦ⧇āĨ¤ āĻĒā§‚āĻ°ā§āĻŦ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻ…ā§āϝāĻžāϏ⧇āϟāϗ⧁āϞ⧋āϤ⧇ āĻāχ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟāϟāĻŋ āĻ­ā§‚āϤāĻžāĻĒ⧇āĻ•ā§āώāĻ­āĻžāĻŦ⧇ (retroactively) āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāϤ⧇ {job} āϰāĻžāύ āĻ•āϰ⧁āύāĨ¤", "storage_template_migration_job": "āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āϜāĻŦ", - "storage_template_more_details": "āĻāχ āĻĢāĻŋāϚāĻžāϰāϟāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāϤ⧇, Storage Template āĻāĻŦāĻ‚ āĻāϰ āĻĒā§āϰāĻ­āĻžāĻŦāϗ⧁āϞ⧋ (implications) āĻĻ⧇āϖ⧁āύāĨ¤", + "storage_template_more_details": "āĻāχ āĻĢāĻŋāϚāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇ āϜāĻžāύāϤ⧇ Storage Template āĻāĻŦāĻ‚ āĻāϰ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĻ⧇āϖ⧁āύ", "storage_template_onboarding_description_v2": "āĻāϟāĻŋ āϏāĻ•ā§āϰāĻŋ⧟ āĻĨāĻžāĻ•āϞ⧇, āĻĢāĻŋāϚāĻžāϰāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻ…āύ⧁āϝāĻžā§Ÿā§€ āĻĢāĻžāχāϞāϗ⧁āϞ⧋āϕ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻ…āĻ°ā§āĻ—āĻžāύāĻžāχāϜ (Auto-organize) āĻ•āϰāĻŦ⧇āĨ¤ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āĻ—ā§āϰāĻš āĻ•āϰ⧇ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻĻ⧇āϖ⧁āύāĨ¤", - "storage_template_path_length": "āφāύ⧁āĻŽāĻžāύāĻŋāĻ• āĻĒāĻžāĻĨ āϞ⧇āĻ¨ā§āĻĨ āϞāĻŋāĻŽāĻŋāϟ (Path length limit): {length, number}/{limit, number}", + "storage_template_path_length": "āφāύ⧁āĻŽāĻžāύāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻĒāĻĨ⧇āϰ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ⧇āϰ āϏ⧀āĻŽāĻž: {length, number}/{limit, number}", "storage_template_settings": "āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ (Storage Template)", "storage_template_settings_description": "āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻ…ā§āϝāĻžāϏ⧇āĻŸā§‡āϰ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻ¸ā§āĻŸā§āϰāĻžāĻ•āϚāĻžāϰ āĻāĻŦāĻ‚ āĻĢāĻžāχāϞ āύ⧇āĻŽ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰ⧁āύ", "storage_template_user_label": "{label} āĻšāϞ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āϞ⧇āĻŦ⧇āϞ (Storage Label)", @@ -336,6 +336,8 @@ "transcoding_accepted_audio_codecs_description": "āϕ⧋āύ āĻ…āĻĄāĻŋāĻ“ āϕ⧋āĻĄā§‡āĻ•āϗ⧁āϞ⧋ āĻŸā§āϰāĻžāύāϏāϕ⧋āĻĄ āĻ•āϰāĻžāϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āύ⧇āχ āϤāĻž āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŸā§āϰāĻžāύāϏāϕ⧋āĻĄ āĻĒāϞāĻŋāϏāĻŋāϰ (transcode policies) āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§ŸāĨ¤", "transcoding_accepted_containers": "āĻ—ā§āϰāĻšāĻŖāϝ⧋āĻ—ā§āϝ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϏāĻŽā§‚āĻš (Accepted containers)" }, + "user_usage_stats": "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻĒāϰāĻŋāϏāĻ‚āĻ–ā§āϝāĻžāύ", + "user_usage_stats_description": "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻĒāϰāĻŋāϏāĻ‚āĻ–ā§āϝāĻžāύ āĻĻ⧇āϖ⧁āύ", "yes": "āĻšā§āϝāĻžāρ", "you_dont_have_any_shared_links": "āφāĻĒāύāĻžāϰ āϕ⧋āύ⧋ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāĻž āϞāĻŋāĻ™ā§āĻ• āύ⧇āχ (You don't have any shared links)", "your_wifi_name": "āφāĻĒāύāĻžāϰ āĻ“āϝāĻŧāĻžāχ-āĻĢāĻžāχ āĻāϰ āύāĻžāĻŽ (Your Wi-Fi name)", diff --git a/i18n/ca.json b/i18n/ca.json index 563d5f15c5..fbd6c5840f 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapeig de to", "transcoding_tone_mapping_description": "Intenta preservar l'aspecte dels vídeos HDR quan es converteixen a SDR. Cada algorisme fa diferents compensacions pel color, el detall i la brillantor. Hable conserva els detalls, Mobius conserva el color i Reinhard conserva la brillantor.", "transcoding_transcode_policy": "Política de transcodificaciÃŗ", - "transcoding_transcode_policy_description": "Política sobre quan s'ha de transcodificar un vídeo. Els vídeos HDR sempre es transcodificaran (excepte si la transcodificaciÃŗ està desactivada).", + "transcoding_transcode_policy_description": "Política sobre quan s'ha de transcodificar un vídeo. Els vídeos HDR i els vídeos amb un format de píxel diferent a YUV 4:2:0 sempre es transcodificaran (excepte si la transcodificaciÃŗ està desactivada).", "transcoding_two_pass_encoding": "CodificaciÃŗ de dues passades", "transcoding_two_pass_encoding_setting_description": "Transcodifica en dos passos per produir vídeos millor codificats. Quan la taxa de bits màxima està habilitada (necessari perquè funcioni amb H.264 i HEVC), aquest mode utilitza un interval de velocitat de bits basat en la taxa de bits màxima i ignora CRF. Per a VP9, es pot utilitzar CRF si la taxa de bits màxima està desactivada.", "transcoding_video_codec": "CÃ˛dec de video", @@ -872,7 +872,7 @@ "current_server_address": "Adreça actual del servidor", "custom_date": "Data personalitzada", "custom_locale": "LocalitzaciÃŗ personalitzada", - "custom_locale_description": "Format de dates i nÃēmeros segons la llengua i regiÃŗ", + "custom_locale_description": "Format de dates i nÃēmeros segons la llengua i regiÃŗ seleccionades", "custom_url": "URL personalitzada", "cutoff_date_description": "MantÊ fotos des de l'Ãēltimâ€Ļ", "cutoff_day": "{count, plural, one {dia} other {dies}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Quantitat de dades EXIF", "deduplication_info": "InformaciÃŗ de deduplicaciÃŗ", "deduplication_info_description": "Per preseleccionar recursos automàticament i eliminar els duplicats de manera massiva, ens fixem en:", - "default_locale": "LocalitzaciÃŗ predeterminada", - "default_locale_description": "Format de dates i nÃēmeros segons la configuraciÃŗ del navegador", "delete": "Esborrar", "delete_action_confirmation_message": "Segur que vols eliminar aquest recurs? Aquesta acciÃŗ el mourà a la paperera del servidor, i et preguntarà si el vols eliminar localment", "delete_action_prompt": "{count} eliminats", @@ -1074,6 +1072,7 @@ "failed_to_update_notification_status": "Error en actualitzar l'estat de les notificacions", "incorrect_email_or_password": "Correu electrÃ˛nic o contrasenya incorrectes", "library_folder_already_exists": "Aquesta ruta d'importaciÃŗ ja existeix.", + "page_not_found": "Pàgina no trobada", "paths_validation_failed": "{paths, plural, one {# ruta} other {# rutes}} no ha pogut validar", "profile_picture_transparent_pixels": "Les fotos de perfil no poden tenir píxels transparents. Per favor, feu zoom in, mogueu la imatge o ambdues.", "quota_higher_than_disk_size": "Heu establert una quota mÊs gran que la mida de disc", @@ -1218,6 +1217,7 @@ "filter_description": "Condicions per filtrar els actius de destinaciÃŗ", "filter_people": "Filtra persones", "filter_places": "Filtrar per llocs", + "filter_tags": "Filtrar etiquetes", "filters": "Filtres", "find_them_fast": "Trobeu-los ràpidament pel nom amb la cerca", "first": "Primer", @@ -1808,9 +1808,8 @@ "rate_asset": "Valorar Recurs", "rating": "ValoraciÃŗ", "rating_clear": "Esborrar valoraciÃŗ", - "rating_count": "{count, plural, one {# estrella} other {# estrelles}}", + "rating_count": "{count, plural, =0 {Unrated} one {# estrella} other {# estrelles}}", "rating_description": "Mostrar la valoraciÃŗ EXIF al panell d'informaciÃŗ", - "rating_set": "ValoraciÃŗ establerta a {rating, plural, one {# estrella} other {# estrelles}}", "reaction_options": "Opcions de reacciÃŗ", "read_changelog": "Llegeix el registre de canvis", "readonly_mode_disabled": "Mode de nomÊs lectura desactivat", @@ -1882,7 +1881,10 @@ "reset_pin_code_success": "Codi PIN reiniciat correctament", "reset_pin_code_with_password": "Sempre pots reiniciar el codi PIN amb la teva contrasenya", "reset_sqlite": "Reiniciar base de dades SQLite", - "reset_sqlite_confirmation": "Segur que vols reiniciar la base de dades SQLite? Hauràs de tancar la sessiÃŗ i tornar a accedir per a resincronitzar les dades", + "reset_sqlite_clear_app_data": "Netejar dada", + "reset_sqlite_confirmation": "Segur que vols esborrar les dades de l'aplicaciÃŗ? AixÃ˛ eliminarà tota la configuraciÃŗ i tancarà la sessiÃŗ.", + "reset_sqlite_confirmation_note": "Nota: Hauràs de reiniciar l'app desprÊs d'eliminar.", + "reset_sqlite_done": "Les dades de l'app s'han netejat. Si us plau, reinicia l'app Immich i inicia sessiÃŗ de nou.", "reset_sqlite_success": "S'ha reiniciat la base de dades correctament", "reset_to_default": "Restableix els valors predeterminats", "resolution": "ResoluciÃŗ", @@ -1910,6 +1912,7 @@ "saved_settings": "ConfiguraciÃŗ guardada", "say_something": "Digues quelcom", "scaffold_body_error_occurred": "S'ha produït un error", + "scaffold_body_error_unrecoverable": "S'ha produït un error irrecuperable. Comparteix l'error i el rastre de la pila a Discord o GitHub perquè puguem ajudar-te. Si us ho aconsella, podeu esborrar les dades de l'aplicaciÃŗ a continuaciÃŗ.", "scan": "Escaneja", "scan_all_libraries": "Escanejar totes les llibreries", "scan_library": "Escaneja", @@ -1945,6 +1948,7 @@ "search_filter_ocr": "Buscar per OCR", "search_filter_people_title": "Selecciona persones", "search_filter_star_rating": "ClassificaciÃŗ per estrelles", + "search_filter_tags_title": "Seleccionar etiquetes", "search_for": "Cercar", "search_for_existing_person": "Busca una persona existent", "search_no_more_result": "No mÊs resultats", @@ -2024,6 +2028,9 @@ "set_profile_picture": "Establir imatge de perfil", "set_slideshow_to_fullscreen": "Mostra Diapositives en pantalla completa", "set_stack_primary_asset": "Estableix com a actiu principal", + "setting_image_navigation_enable_subtitle": "Si està activat, pots navegar a la imatge anterior/segÃŧent tocant la quarta part mÊs esquerra/dreta de la pantalla.", + "setting_image_navigation_enable_title": "Toca per navegar", + "setting_image_navigation_title": "NavegaciÃŗ d'imatges", "setting_image_viewer_help": "El visor de detalls carrega primer la miniatura petita, desprÊs carrega la vista prèvia de mida mitjana (si està habilitada), finalment carrega l'original (si està habilitada).", "setting_image_viewer_original_subtitle": "Activa per carregar la imatge en resoluciÃŗ original (molt gran!). Desactiva per reduir el consum de dades (tant de xarxa com de memÃ˛ria cau).", "setting_image_viewer_original_title": "Carrega la imatge original", @@ -2191,20 +2198,20 @@ "support_and_feedback": "Suport i comentaris", "support_third_party_description": "La vostra instal¡laciÃŗ immich la va empaquetar un tercer. Els problemes que experimenteu poden ser causats per aquest paquet així que, si us plau, plantegeu els poblemes amb ells en primer lloc mitjançant els enllaços segÃŧents.", "supporter": "Contribuïdor", - "swap_merge_direction": "Canvia la direcciÃŗ d'uniÃŗ", + "swap_merge_direction": "Intercanvia la direcciÃŗ d'uniÃŗ", "sync": "Sincronitza", - "sync_albums": "Sincronitzar àlbums", + "sync_albums": "Sincronitza àlbums", "sync_albums_manual_subtitle": "Sincronitza tots els vídeos i fotos penjats amb els àlbums de cÃ˛pia de seguretat seleccionats", - "sync_local": "Sincronitza Local", - "sync_remote": "Sincronitza Remot", - "sync_status": "Estat de sincronitzaciÃŗ", + "sync_local": "Sincronitza localment", + "sync_remote": "Sincronitza remotament", + "sync_status": "Estat de la incronitzaciÃŗ", "sync_status_subtitle": "Observa i administra el sistema de sincronitzaciÃŗ", "sync_upload_album_setting_subtitle": "Creeu i pugeu les seves fotos i vídeos als àlbums seleccionats a Immich", "tag": "Etiqueta", "tag_assets": "Etiquetar actius", "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? Crear una nova etiqueta", + "tag_not_found_question": "No trobeu una etiqueta? Crear una nova etiqueta.", "tag_people": "Etiquetar personas", "tag_updated": "Etiqueta actualizada: {tag}", "tagged_assets": "{count, plural, one {#Etiquetat} other {#Etiquetats}} {count, plural, one {# actiu} other {# actius}}", @@ -2302,6 +2309,7 @@ "unstack_action_prompt": "{count} sense apilar", "unstacked_assets_count": "No apilat {count, plural, one {# recurs} other {# recursos}}", "unsupported_field_type": "Tipus de camp no suportat", + "unsupported_file_type": "No es pot carregar el fitxer {file} perquè el seu tipus de fitxer {type} no Ês compatible.", "untagged": "Sense etiqueta", "untitled_workflow": "AutomatitzaciÃŗ sense títol", "up_next": "PrÃ˛xim", @@ -2328,6 +2336,8 @@ "url": "URL", "usage": "Ús", "use_biometric": "Empra biometria", + "use_browser_locale": "Fer servir la localitzaciÃŗ del navegador", + "use_browser_locale_description": "Formatejar dates, hores i nÃēmeros segons la llengua i regiÃŗ del navegador", "use_current_connection": "Utilitza la connexiÃŗ actual", "use_custom_date_range": "Fes servir un rang de dates personalitzat", "user": "Usuari", diff --git a/i18n/cs.json b/i18n/cs.json index 77da129f83..363e568331 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -40,7 +40,7 @@ "add_to_albums_count": "Přidat do alb ({count})", "add_to_bottom_bar": "Přidat do", "add_to_shared_album": "Přidat do sdílenÊho alba", - "add_upload_to_stack": "Přidat nahranÊ do zÃĄsobníku", + "add_upload_to_stack": "Přidat nahranÊ do seskupení", "add_url": "Přidat URL", "add_workflow_step": "Přidat krok pracovního postupu", "added_to_archive": "PřidÃĄno do archivu", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "MapovÃĄní tÃŗnů", "transcoding_tone_mapping_description": "SnaŞí se zachovat vzhled videí HDR při převodu na SDR. KaÅždÃŊ algoritmus dělÃĄ různÊ kompromisy v oblasti barev, detailů a jasu. Hable zachovÃĄvÃĄ detaily, Mobius zachovÃĄvÃĄ barvy a Reinhard zachovÃĄvÃĄ jas.", "transcoding_transcode_policy": "ZÃĄsady překÃŗdovÃĄní", - "transcoding_transcode_policy_description": "ZÃĄsady, kdy mÃĄ bÃŊt video překÃŗdovÃĄno. Videa HDR budou překÃŗdovÃĄna vÅždy (kromě případů, kdy je překÃŗdovÃĄní zakÃĄzÃĄno).", + "transcoding_transcode_policy_description": "ZÃĄsady, kdy mÃĄ bÃŊt video překÃŗdovÃĄno. HDR videa a videa s jinÃŊm formÃĄtem pixelů neÅž YUV 4:2:0 budou překÃŗdovÃĄna vÅždy (kromě případů, kdy je překÃŗdovÃĄní zakÃĄzÃĄno).", "transcoding_two_pass_encoding": "DvouprůchodovÊ kÃŗdovÃĄní", "transcoding_two_pass_encoding_setting_description": "PřekÃŗdovÃĄním ve dvou průchodech získÃĄte lÊpe zakÃŗdovanÃĄ videa. Pokud je povolen maximÃĄlní datovÃŊ tok (nutnÃŊ pro prÃĄci s H.264 a HEVC), tento reÅžim pouŞívÃĄ rozsah datovÊho toku zaloÅženÃŊ na maximÃĄlním datovÊm toku a ignoruje CRF. U VP9 lze CRF pouŞít, pokud je max. datovÃŊ tok zakÃĄzÃĄn.", "transcoding_video_codec": "Video kodek", @@ -872,7 +872,7 @@ "current_server_address": "AktuÃĄlní adresa serveru", "custom_date": "Vlastní datum", "custom_locale": "Vlastní lokalizace", - "custom_locale_description": "FormÃĄtovat datumy a čísla podle jazyka a oblasti", + "custom_locale_description": "FormÃĄtovat datumy, časy a čísla podle vybranÊho jazyka a oblasti", "custom_url": "Vlastní URL", "cutoff_date_description": "Zanechat fotografie a videa z posledníchâ€Ļ", "cutoff_day": "{count, plural, one {den} few {dny} other {dnů}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Počet EXIF dat", "deduplication_info": "Informace o deduplikaci", "deduplication_info_description": "Pro automatickÃŊ předvÃŊběr poloÅžek a hromadnÊ odstranění duplicit se zohledňuje:", - "default_locale": "VÃŊchozí jazyk", - "default_locale_description": "FormÃĄtovat datumy a čísla podle místního prostředí prohlíŞeče", "delete": "Smazat", "delete_action_confirmation_message": "Opravdu chcete odstranit tuto poloÅžku? Tato akce přesune poloÅžku do serverovÊho koÅĄe a zeptÃĄ se vÃĄs, zda ji chcete odstranit lokÃĄlně", "delete_action_prompt": "{count} smazÃĄno", @@ -1003,12 +1001,14 @@ "editor_close_without_save_title": "Zavřít editor?", "editor_confirm_reset_all_changes": "Opravdu chcete zruÅĄit vÅĄechny změny?", "editor_discard_edits_confirm": "ZruÅĄit Ãēpravy", - "editor_discard_edits_prompt": "MÃĄte neuloÅženÊ Ãēpravy. Opravdu je chcete smazat?", + "editor_discard_edits_prompt": "MÃĄte neuloÅženÊ Ãēpravy. Opravdu je chcete zahodit?", "editor_discard_edits_title": "ZruÅĄit Ãēpravy?", "editor_edits_applied_error": "Nepodařilo se pouŞít Ãēpravy", "editor_edits_applied_success": "Úpravy byly ÃēspÄ›ÅĄně provedeny", "editor_flip_horizontal": "Otočit vodorovně", "editor_flip_vertical": "Otočit svisle", + "editor_handle_corner": "{corner, select, top_left {Vlevo nahoře} top_right {Vpravo nahoře} bottom_left {Vlevo dole} bottom_right {Vpravo dole} other {A}} rohovÃĄ Ãēchytka", + "editor_handle_edge": "{edge, select, top {Nahoře} bottom {Dole} left {Vlevo} right {Vpravo} other {An}}Ãēchyt hrany", "editor_orientation": "Orientace", "editor_reset_all_changes": "ZruÅĄit změny", "editor_rotate_left": "Otočit o 90° doleva", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "Nepodařilo se aktualizovat stav oznÃĄmení", "incorrect_email_or_password": "NesprÃĄvnÃŊ e-mail nebo heslo", "library_folder_already_exists": "Tato importní cesta jiÅž existuje.", + "page_not_found": "StrÃĄnka nebyla nalezena", "paths_validation_failed": "{paths, plural, one {# cesta neproÅĄla} few {# cesty neproÅĄly} other {# cest neproÅĄlo}} kontrolou", "profile_picture_transparent_pixels": "ProfilovÊ obrÃĄzky nemohou mít průhlednÊ pixely. ObrÃĄzek si prosím zvětÅĄete nebo posuňte.", "quota_higher_than_disk_size": "Nastavili jste kvÃŗtu vyÅĄÅĄÃ­, neÅž je velikost disku", @@ -1218,6 +1219,7 @@ "filter_description": "Podmínky pro filtrovÃĄní cílovÃŊch poloÅžek", "filter_people": "Filtrovat lidi", "filter_places": "Filtrovat místa", + "filter_tags": "Filtrovat značky", "filters": "Filtry", "find_them_fast": "Najděte je rychle vyhledÃĄním jejich jmÊna", "first": "První", @@ -1649,6 +1651,7 @@ "only_favorites": "Pouze oblíbenÊ", "open": "Otevřít", "open_calendar": "Otevřít kalendÃĄÅ™", + "open_in_browser": "Otevřít v prohlíŞeči", "open_in_map_view": "Otevřít v zobrazení mapy", "open_in_openstreetmap": "Otevřít v OpenStreetMap", "open_the_search_filters": "Otevřít vyhledÃĄvací filtry", @@ -1808,9 +1811,8 @@ "rate_asset": "Hodnotit poloÅžku", "rating": "Hodnocení hvězdičkami", "rating_clear": "Vyčistit hodnocení", - "rating_count": "{count, plural, one {# hvězdička} few {# hvězdičky} other {# hvězdček}}", + "rating_count": "{count, plural, =0 {Nehodnoceno} one {# hvězdička} few {# hvězdičky} other {# hvězdček}}", "rating_description": "Zobrazit EXIF hodnocení v informačním panelu", - "rating_set": "Hodnocení nastaveno na {rating, plural, one {# hvězdičku} few {# hvězdičky} other {# hvězdiček}}", "reaction_options": "MoÅžnosti reakce", "read_changelog": "Přečtěte si seznam změn", "readonly_mode_disabled": "ReÅžim pouze pro čtení je deaktivovÃĄn", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "PIN kÃŗd ÃēspÄ›ÅĄně resetovÃĄn", "reset_pin_code_with_password": "Svůj PIN kÃŗd můŞete vÅždy resetovat pomocí hesla", "reset_sqlite": "Obnovit databÃĄzi SQLite", - "reset_sqlite_confirmation": "Jste si jisti, Åže chcete obnovit databÃĄzi SQLite? Pro opětovnou synchronizaci dat se budete muset odhlÃĄsit a znovu přihlÃĄsit", + "reset_sqlite_clear_app_data": "Vymazat data", + "reset_sqlite_confirmation": "Opravdu chcete vymazat data aplikace? Tím se odstraní vÅĄechna nastavení a odhlÃĄsíte se.", + "reset_sqlite_confirmation_note": "PoznÃĄmka: Po vymazÃĄní budete muset aplikaci restartovat.", + "reset_sqlite_done": "Data aplikace byla vymazÃĄna. Restartujte Immich a znovu se přihlaste.", "reset_sqlite_success": "Obnovení SQLite databÃĄze proběhlo ÃēspÄ›ÅĄně", "reset_to_default": "Obnovit vÃŊchozí nastavení", "resolution": "RozliÅĄení", @@ -1910,6 +1915,7 @@ "saved_settings": "Nastavení uloÅženo", "say_something": "NapiÅĄte něco", "scaffold_body_error_occurred": "DoÅĄlo k chybě", + "scaffold_body_error_unrecoverable": "DoÅĄlo k neopravitelnÊ chybě. Abychom vÃĄm mohli pomoci, sdělte nÃĄm prosím chybu a vÃŊpis zÃĄsobníku na Discordu nebo GitHubu. Pokud vÃĄm bylo doporučeno, můŞete vymazat data aplikace níŞe.", "scan": "Prohledat", "scan_all_libraries": "Prohledat vÅĄechny knihovny", "scan_library": "Prohledat", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "Hledat pomocí OCR", "search_filter_people_title": "VÃŊběr lidí", "search_filter_star_rating": "Hodnocení hvězdičkami", + "search_filter_tags_title": "Vybrat značky", "search_for": "Vyhledat", "search_for_existing_person": "Vyhledat existující osobu", "search_no_more_result": "ÅŊÃĄdnÊ dalÅĄÃ­ vÃŊsledky", @@ -2024,6 +2031,9 @@ "set_profile_picture": "Nastavit profilovÃŊ obrÃĄzek", "set_slideshow_to_fullscreen": "Nastavit prezentaci na celou obrazovku", "set_stack_primary_asset": "Nastavit jako hlavní poloÅžku", + "setting_image_navigation_enable_subtitle": "Pokud je zapnuto, budete moci přejít na předchozí/dalÅĄÃ­ obrÃĄzek klepnutím do levÊ/pravÊ čtvrtiny obrazovky.", + "setting_image_navigation_enable_title": "Klepněte pro navigaci", + "setting_image_navigation_title": "Navigace mezi obrÃĄzky", "setting_image_viewer_help": "V prohlíŞeči detailů se nejprve načte malÃĄ miniatura, potÊ se načte nÃĄhled střední velikosti (je-li povolen) a nakonec se načte originÃĄl (je-li povolen).", "setting_image_viewer_original_subtitle": "UmoŞňuje načíst původní obrÃĄzek v plnÊm rozliÅĄení (velkÃŊ!). ZakaÅžte pro sníŞení vyuÅžití dat (v síti i v mezipaměti zařízení).", "setting_image_viewer_original_title": "Načíst původní obrÃĄzek", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} seskupenÃŊch zruÅĄeno", "unstacked_assets_count": "{count, plural, one {RozloÅženÃĄ # poloÅžka} few {RozloÅženÊ # poloÅžky} other {RozloÅženÃŊch # poloÅžek}}", "unsupported_field_type": "NepodporovanÃŊ typ pole", + "unsupported_file_type": "Soubor {file} nelze nahrÃĄt, protoÅže jeho typ {type} není podporovÃĄn.", "untagged": "Neoznačeno", "untitled_workflow": "Pracovní postup bez nÃĄzvu", "up_next": "To je prozatím vÅĄe", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "VyuÅžití", "use_biometric": "PouŞít biometrickÊ Ãēdaje", + "use_browser_locale": "PouŞít jazyk prohlíŞeče", + "use_browser_locale_description": "FormÃĄtujte data, časy a čísla podle nastavení místního formÃĄtu vaÅĄeho prohlíŞeče", "use_current_connection": "PouŞít aktuÃĄlní připojení", "use_custom_date_range": "PouŞít vlastní rozsah dat", "user": "UÅživatel", @@ -2378,9 +2391,9 @@ "view_similar_photos": "Zobrazit podobnÊ fotky", "view_stack": "Zobrazit seskupení", "view_user": "Zobrazit uÅživatele", - "viewer_remove_from_stack": "Odstranit ze zÃĄsobníku", + "viewer_remove_from_stack": "Odstranit ze seskupení", "viewer_stack_use_as_main_asset": "PouŞít jako hlavní poloÅžku", - "viewer_unstack": "ZruÅĄit zÃĄsobník", + "viewer_unstack": "ZruÅĄit seskupení", "visibility_changed": "Viditelnost změněna u {count, plural, one {# osoby} few {# osob} other {# lidí}}", "visual": "VizuÃĄlní", "visual_builder": "VizuÃĄlní nÃĄvrhÃĄÅ™", diff --git a/i18n/da.json b/i18n/da.json index 6981d6dae3..1eafb3d827 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -311,7 +311,7 @@ "search_jobs": "Søg opgaverâ€Ļ", "send_welcome_email": "Send velkomst-email", "server_external_domain_settings": "Eksternt domÃĻne", - "server_external_domain_settings_description": "DomÃĻne til offentligt delte links, inklusiv http(s)://", + "server_external_domain_settings_description": "DomÃĻne brugt til eksterne links", "server_public_users": "Offentlige brugere", "server_public_users_description": "Alle brugere (navn og e-mail) vises, nÃĨr en bruger tilføjes til delte album. NÃĨr den er deaktiveret, vil brugerlisten kun vÃĻre tilgÃĻngelig for administratorbrugere.", "server_settings": "Serverindstillinger", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Tone-kortlÃĻgning", "transcoding_tone_mapping_description": "Forsøger at bevare HDR-videoers udseende nÃĨr konverteret til SDR. Hver algoritme har forskellige afvejninger af farve, detalje og lysstyrke. Hable bevarer farve og Reinhard bevarer lysstyrke.", "transcoding_transcode_policy": "Transkodningspolitik", - "transcoding_transcode_policy_description": "Politik for hvornÃĨr en video skal transkodes. HDR videoer vil altid blive transkodet (bortset fra, hvis transkodning er slÃĨet fra).", + "transcoding_transcode_policy_description": "Politik for hvornÃĨr en video skal transkodes. HDR videoer og videoer med en anden pixelformat end YUV 4:2:0 vil altid blive transkodet (bortset fra, hvis transkodning er slÃĨet fra).", "transcoding_two_pass_encoding": "To-omgangsindkodning", "transcoding_two_pass_encoding_setting_description": "Transkoder af to omgange for at producere bedre indkodede videoer. NÃĨr den maksimale bitrate er slÃĨet til (som det krÃĻver for at det fungerer med H.264 og HEVC), bruger denne tilstand en bitrateinterval baseret pÃĨ den maksimale birate og ignorerer CRF. For VP9, kan CRF bruges hvis den maksimale bitrate er slÃĨet fra.", "transcoding_video_codec": "Videocodec", @@ -794,6 +794,11 @@ "color": "Farve", "color_theme": "Farvetema", "command": "Kommando", + "command_palette_prompt": "Find hurtigt sider, handlinger eller kommandoer", + "command_palette_to_close": "for at lukke", + "command_palette_to_navigate": "for at indtaste", + "command_palette_to_select": "for at vÃĻlge", + "command_palette_to_show_all": "for at vise alle", "comment_deleted": "Kommentar slettet", "comment_options": "Kommentarindstillinger", "comments_and_likes": "Kommentarer og likes", @@ -867,7 +872,7 @@ "current_server_address": "NuvÃĻrende serveraddresse", "custom_date": "Brugerdefineret dato", "custom_locale": "Brugerdefineret lokale", - "custom_locale_description": "FormatÊr datoer og tal baseret pÃĨ sproget og regionen", + "custom_locale_description": "FormatÊr datoer, klokkeslÃĻt og tal baseret pÃĨ det valgte sprog og den valgte region", "custom_url": "Tilpasset URL", "cutoff_date_description": "Behold fotos fra den sidsteâ€Ļ", "cutoff_day": "{count, plural, one {dag} other {dage}}", @@ -890,8 +895,6 @@ "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", "delete": "Slet", "delete_action_confirmation_message": "Er du sikker pÃĨ, at du vil slette dette objekt? Denne handling vil flytte objektet til serverens papirkurv, og vil spørge dig, om du vil slette den lokalt", "delete_action_prompt": "{count} slettet", @@ -1069,6 +1072,7 @@ "failed_to_update_notification_status": "Kunne ikke uploade notifikations status", "incorrect_email_or_password": "Forkert email eller kodeord", "library_folder_already_exists": "Denne import sti findes allerede.", + "page_not_found": "Siden blev ikke fundet :/", "paths_validation_failed": "{paths, plural, one {# sti} other {# stier}} slog fejl ved validering", "profile_picture_transparent_pixels": "Profilbilleder kan ikke have gennemsigtige pixels. Zoom venligst ind og/eller flyt billedet.", "quota_higher_than_disk_size": "Du har sat en kvote der er større end disken", @@ -1168,6 +1172,7 @@ "exif_bottom_sheet_people": "PERSONER", "exif_bottom_sheet_person_add_person": "Tilføj navn", "exit_slideshow": "Afslut slideshow", + "expand": "Udvid", "expand_all": "Udvid alle", "experimental_settings_new_asset_list_subtitle": "Under udarbejdelse", "experimental_settings_new_asset_list_title": "Aktiver eksperimentelt fotogitter", @@ -1212,6 +1217,7 @@ "filter_description": "Betingelser for filtrering af valgte mediefiler", "filter_people": "FiltrÊr personer", "filter_places": "Filtrer steder", + "filter_tags": "Filtrer tags", "filters": "Filtre", "find_them_fast": "Find dem hurtigt med søgning via navn", "first": "Første", @@ -1642,6 +1648,7 @@ "online": "Online", "only_favorites": "Kun favoritter", "open": "Åben", + "open_calendar": "Åbn kalender", "open_in_map_view": "Åben i kortvisning", "open_in_openstreetmap": "Åben i OpenStreetMap", "open_the_search_filters": "Åbn søgefiltre", @@ -1801,9 +1808,8 @@ "rate_asset": "Vurder filer", "rating": "Stjernebedømmelse", "rating_clear": "Nulstil vurdering", - "rating_count": "{count, plural, one {# stjerne} other {# stjerner}}", + "rating_count": "{count, plural, =0 {Unrated} one {# stjerne} other {# stjerner}}", "rating_description": "Vis EXIF-klassificeringen i infopanelet", - "rating_set": "Vurdering sat til {rating, plural, one {# stjerne} other {# stjerner}}", "reaction_options": "Reaktionsindstillinger", "read_changelog": "LÃĻs ÃĻndringslog", "readonly_mode_disabled": "Skrivebeskyttet tilstand deaktiveret", @@ -1875,7 +1881,10 @@ "reset_pin_code_success": "PIN-koden er Nulstillet", "reset_pin_code_with_password": "Du kan altid nulstille din PIN-kode med dit password", "reset_sqlite": "Reset SQLite Databasen", - "reset_sqlite_confirmation": "Er du sikker pÃĨ, at du vil nulstille SQLite databasen? Du er nødt til at logge ud og ind igen for at gensynkronisere dine data", + "reset_sqlite_clear_app_data": "Ryd data", + "reset_sqlite_confirmation": "Er du sikker pÃĨ, at du vil ryde app dataen? Dette vil fjerne alle settings og logge dig ud.", + "reset_sqlite_confirmation_note": "BemÃĻrk: Du skal genstarte appen efter rydning.", + "reset_sqlite_done": "Appdata er blevet slettet. Genstart Immich og log ind igen.", "reset_sqlite_success": "Vellykket reset af SQLite databasen", "reset_to_default": "Nulstil til standard", "resolution": "Opløsning", @@ -1903,6 +1912,7 @@ "saved_settings": "Gemte indstillinger", "say_something": "Skriv noget", "scaffold_body_error_occurred": "Der opstod en fejl", + "scaffold_body_error_unrecoverable": "Der er opstÃĨet en uoprettelig fejl. Del venligst fejlen og stack trace pÃĨ Discord eller GitHub, sÃĨ vi kan hjÃĻlpe. Hvis du bliver bedt om det, kan du rydde appdataene nedenfor.", "scan": "Skan", "scan_all_libraries": "Skan alle biblioteker", "scan_library": "Skan", @@ -1938,6 +1948,7 @@ "search_filter_ocr": "Søg via OCR", "search_filter_people_title": "VÃĻlg personer", "search_filter_star_rating": "Stjerne Vurdering", + "search_filter_tags_title": "VÃĻlg tags", "search_for": "Søg efter", "search_for_existing_person": "Søg efter eksisterende person", "search_no_more_result": "Ikke flere resultater", @@ -2017,6 +2028,9 @@ "set_profile_picture": "Indstil profilbillede", "set_slideshow_to_fullscreen": "SÃĻt diasshow til fuldskÃĻrmsvisning", "set_stack_primary_asset": "Angiv som primÃĻrt billede", + "setting_image_navigation_enable_subtitle": "Hvis aktiveret, kan du navigere til det forrige/nÃĻste billede ved at trykke pÃĨ den yderste venstre/højre fjerdedel af skÃĻrmen.", + "setting_image_navigation_enable_title": "Tryk for at navigere", + "setting_image_navigation_title": "Billednavigation", "setting_image_viewer_help": "Detaljeret visning indlÃĻser miniaturebilleder først. Herefter indlÃĻses mediumstørrelse forhÃĨndsvisning af billedet (hvis dette er slÃĨet til), for til sidst at vise originalen (hvis dette er slÃĨet til).", "setting_image_viewer_original_subtitle": "SlÃĨ indlÃĻsning af originalbillede i fuld størrelse til (stort!). Deaktiver for at reducere dataforbruget (bÃĨde pÃĨ netvÃĻrket og for enhedscache).", "setting_image_viewer_original_title": "IndlÃĻs originalbillede", @@ -2183,6 +2197,7 @@ "support": "Support", "support_and_feedback": "Support og 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.", + "supporter": "Supporter", "swap_merge_direction": "Byt retning for sammenfletning", "sync": "SynkronisÊr", "sync_albums": "Synkroniser albummer", @@ -2294,6 +2309,7 @@ "unstack_action_prompt": "{count} ustakket", "unstacked_assets_count": "Ikke-stablet {count, plural, one {# aktiv} other {# aktiver}}", "unsupported_field_type": "Ikke-understøttet felttype", + "unsupported_file_type": "Filen {file} kan ikke uploades, fordi filtypen {type} ikke understøttes.", "untagged": "UmÃĻrket", "untitled_workflow": "Unavngivet arbejdsgang", "up_next": "NÃĻste", @@ -2320,6 +2336,8 @@ "url": "URL", "usage": "Forbrug", "use_biometric": "Brug biometrisk", + "use_browser_locale": "Brug browserens lokalitet", + "use_browser_locale_description": "FormatÊr datoer, klokkeslÃĻt og tal baseret pÃĨ din browsers lokalitet", "use_current_connection": "Brug nuvÃĻrende forbindelse", "use_custom_date_range": "Brug tilpasset datointerval i stedet", "user": "Bruger", diff --git a/i18n/de.json b/i18n/de.json index b32ac57aba..a6b2a844c4 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -77,7 +77,7 @@ "confirm_user_pin_code_reset": "Bist du sicher, dass du den PIN-Code von {user} zurÃŧcksetzen mÃļchtest?", "copy_config_to_clipboard_description": "Kopieren Sie die aktuelle Systemkonfiguration als JSON-Objekt in die Zwischenablage", "create_job": "Aufgabe erstellen", - "cron_expression": "Cron-Zeitangabe", + "cron_expression": "Cron-Ausdruck", "cron_expression_description": "Setze das Scanintervall im Cron-Format. Hilfe mit dem Format bietet dir dabei z. B. der Crontab Guru", "cron_expression_presets": "Vorlagen fÃŧr Cron-Zeitangabe", "disable_login": "Login deaktivieren", @@ -311,7 +311,7 @@ "search_jobs": "Suchaufgabenâ€Ļ", "send_welcome_email": "BegrÃŧssungsmail senden", "server_external_domain_settings": "Externe Domain", - "server_external_domain_settings_description": "Domäne fÃŧr Ãļffentlich freigegebene Links, einschließlich http(s)://", + "server_external_domain_settings_description": "FÃŧr externe Links verwendete Domäne", "server_public_users": "Öffentliche Benutzer", "server_public_users_description": "Beim HinzufÃŧgen eines Benutzers zu freigegebenen Alben werden alle Benutzer (Name und E-Mail) aufgelistet. Wenn diese Option deaktiviert ist, steht die Benutzerliste nur Administratoren zur VerfÃŧgung.", "server_settings": "Servereinstellungen", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Farbton-Mapping", "transcoding_tone_mapping_description": "Versucht, das Aussehen von HDR-Videos bei der Konvertierung in SDR beizubehalten. Jeder Algorithmus geht unterschiedliche Kompromisse bei Farbe, Details und Helligkeit ein. Hable bewahrt Details, Mobius bewahrt die Farbe und Reinhard bewahrt die Helligkeit.", "transcoding_transcode_policy": "Transcodierungsrichtlinie", - "transcoding_transcode_policy_description": "Richtlinie, wann ein Video transkodiert werden soll. HDR-Videos werden immer transkodiert (außer wenn die Transkodierung deaktiviert ist).", + "transcoding_transcode_policy_description": "Richtlinie, wann ein Video transkodiert werden soll. HDR-Videos und Videos ohne das Format YUV 4:2:0 werden immer transkodiert (außer wenn die Transkodierung deaktiviert ist).", "transcoding_two_pass_encoding": "Two-Pass Codierung", "transcoding_two_pass_encoding_setting_description": "FÃŧhrt eine Transkodierung in zwei Durchgängen durch, um besser kodierte Videos zu erzeugen. Wenn die maximale Bitrate aktiviert ist (erforderlich fÃŧr die Verwendung mit H.264 und HEVC), verwendet dieser Modus einen Bitratenbereich, der auf der maximalen Bitrate basiert, und ignoriert CRF. FÃŧr VP9 kann CRF verwendet werden, wenn die maximale Bitrate deaktiviert ist.", "transcoding_video_codec": "Video-Codec", @@ -697,8 +697,8 @@ "birthdate_set_description": "Das Geburtsdatum wird verwendet, um das Alter dieser Person zum Zeitpunkt eines Fotos zu berechnen.", "blurred_background": "Unscharfer Hintergrund", "bugs_and_feature_requests": "Fehler & Verbesserungsvorschläge", - "build": "Build", - "build_image": "Build Abbild", + "build": "Erstelle", + "build_image": "Bild erstellen", "bulk_delete_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien gemeinsam}} lÃļschen mÃļchtest? Dabei wird die grÃļßte Datei jeder Gruppe behalten und alle anderen Duplikate endgÃŧltig gelÃļscht. Diese Aktion kann nicht rÃŧckgängig gemacht werden!", "bulk_keep_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien}} behalten mÃļchtest? Dies wird alle Duplikat-Gruppen auflÃļsen ohne etwas zu lÃļschen.", "bulk_trash_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien gemeinsam}} in den Papierkorb verschieben mÃļchtest? Dies wird die grÃļßte Datei jeder Gruppe behalten und alle anderen Duplikate in den Papierkorb verschieben.", @@ -794,6 +794,11 @@ "color": "Farbe", "color_theme": "Farb-Theme", "command": "Befehl", + "command_palette_prompt": "Finde schnell Seiten, Aktionen oder Befehle", + "command_palette_to_close": "Schließen", + "command_palette_to_navigate": "eingeben", + "command_palette_to_select": "Auswählen", + "command_palette_to_show_all": "Alle anzeigen", "comment_deleted": "Kommentar gelÃļscht", "comment_options": "Kommentaroptionen", "comments_and_likes": "Kommentare & Likes", @@ -866,8 +871,8 @@ "current_pin_code": "Aktueller PIN-Code", "current_server_address": "Aktuelle Serveradresse", "custom_date": "Benutzerdefiniertes Datum", - "custom_locale": "Benutzerdefinierte Sprache", - "custom_locale_description": "Datumsangaben und Zahlen je nach Sprache und Land formatieren", + "custom_locale": "Benutzerdefiniertes Gebietsschema", + "custom_locale_description": "Datumsangaben, Uhrzeiten und Zahlen je nach Sprache und Land formatieren", "custom_url": "Benutzerdefinierte URL", "cutoff_date_description": "Behalte Fotos der letztenâ€Ļ", "cutoff_day": "{count, plural, one {Tag} other {Tage}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Anzahl der EXIF-Daten", "deduplication_info": "Deduplizierungsinformationen", "deduplication_info_description": "FÃŧr die automatische Datei-Vorauswahl und das Deduplizieren aller Dateien berÃŧcksichtigen wir:", - "default_locale": "Standard-Sprache", - "default_locale_description": "Datumsangaben und Zahlen basierend auf dem Gebietsschema des Browsers formatieren", "delete": "LÃļschen", "delete_action_confirmation_message": "Bist du sicher, dass du dieses Objekt lÃļschen willst? Diese Aktion wird das Objekt in den Papierkorb des Servers verschieben und fragen, ob du es lokal lÃļschen willst", "delete_action_prompt": "{count} gelÃļscht", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "Änderungen erfolgreich angewendet", "editor_flip_horizontal": "Horizontal spiegeln", "editor_flip_vertical": "Vertikal spiegeln", + "editor_handle_corner": "{corner, select, top_left {Oben links} top_right {Oben rechts} bottom_left {Unten links} bottom_right {Unten rechts} other {A}} Eckgriff", + "editor_handle_edge": "{edge, select, top {Oben} bottom {Unten} left {Links} right {Rechts} other {Ein}} Kantenanfasser", "editor_orientation": "Ausrichtung", "editor_reset_all_changes": "Änderungen zurÃŧcksetzen", "editor_rotate_left": "Um 90° gegen den Uhrzeigersinn drehen", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "Benachrichtigungsstatus aktualisieren fehlgeschlagen", "incorrect_email_or_password": "UngÃŧltige E-Mail oder Passwort", "library_folder_already_exists": "Dieser Importpfad existiert bereits.", + "page_not_found": "Seite nicht gefunden", "paths_validation_failed": "{paths, plural, one {# Pfad konnte} other {# Pfade konnten}} nicht validiert werden", "profile_picture_transparent_pixels": "Profilbilder dÃŧrfen keine transparenten Pixel haben. Bitte zoome heran und/oder verschiebe das Bild.", "quota_higher_than_disk_size": "Dein festgelegtes Kontingent ist grÃļßer als der verfÃŧgbare Speicher", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "PERSONEN", "exif_bottom_sheet_person_add_person": "Namen hinzufÃŧgen", "exit_slideshow": "Diashow beenden", + "expand": "Erweitern", "expand_all": "Alle aufklappen", "experimental_settings_new_asset_list_subtitle": "In Arbeit", "experimental_settings_new_asset_list_title": "Experimentelles Fotogitter aktivieren", @@ -1212,6 +1219,7 @@ "filter_description": "Bedingungen zur Filterung der betreffenden Dateien", "filter_people": "Personen filtern", "filter_places": "Orte filtern", + "filter_tags": "Tags filtern", "filters": "Filter", "find_them_fast": "Finde sie schneller mit der Suche nach Namen", "first": "Erste", @@ -1613,7 +1621,7 @@ "not_available": "N/A", "not_in_any_album": "In keinem Album", "not_selected": "Nicht ausgewählt", - "notes": "Notizen", + "notes": "Hinweise", "nothing_here_yet": "Noch nichts hier", "notification_permission_dialog_content": "Um Benachrichtigungen zu aktivieren, navigiere zu Einstellungen und klicke \"Erlauben\".", "notification_permission_list_tile_content": "Erlaube Berechtigung fÃŧr Benachrichtigungen.", @@ -1642,6 +1650,8 @@ "online": "Online", "only_favorites": "Nur Favoriten", "open": "Öffnen", + "open_calendar": "Kalender Ãļffnen", + "open_in_browser": "Im Browser Ãļffnen", "open_in_map_view": "In Kartenansicht Ãļffnen", "open_in_openstreetmap": "In OpenStreetMap Ãļffnen", "open_the_search_filters": "Die Suchfilter Ãļffnen", @@ -1710,8 +1720,8 @@ "permission_onboarding_permission_limited": "Berechtigungen unzureichend. Um Immich das Sichern von ganzen Sammlungen zu ermÃļglichen, muss der Zugriff auf alle Fotos und Videos in den Einstellungen erlaubt werden.", "permission_onboarding_request": "Immich benÃļtigt Berechtigung um auf deine Fotos und Videos zuzugreifen.", "person": "Person", - "person_age_months": "{months, plural, one {# month} other {# months}} alt", - "person_age_year_months": "1 Jahr, {months, plural, one {# month} other {# months}} alt", + "person_age_months": "{months, plural, one {# Monat} other {# Monate}} alt", + "person_age_year_months": "1 Jahr, {months, plural, one {# Monat} other {# Monate}} alt", "person_age_years": "{years, plural, one {# Jahr} other {# Jahre}} alt", "person_birthdate": "Geboren am {date}", "person_hidden": "{name}{hidden, select, true { (verborgen)} other {}}", @@ -1801,9 +1811,8 @@ "rate_asset": "Datei bewerten", "rating": "Bewertung", "rating_clear": "Bewertung lÃļschen", - "rating_count": "{count, plural, one {# Stern} other {# Sterne}}", + "rating_count": "{count, plural, =0 {Unbewertet} one {# Stern} other {# Sterne}}", "rating_description": "Stellt die EXIF-Bewertung im Informationsbereich dar", - "rating_set": "Mit {rating, plural, one {# Stern} other {# Sternen}} bewertet", "reaction_options": "ReaktionsmÃļglichkeiten", "read_changelog": "Changelog lesen", "readonly_mode_disabled": "SchreibgeschÃŧtzter Modus deaktiviert", @@ -1875,7 +1884,10 @@ "reset_pin_code_success": "PIN-Code erfolgreich zurÃŧckgesetzt", "reset_pin_code_with_password": "Mit deinem Passwort kannst du jederzeit deinen PIN-Code zurÃŧcksetzen", "reset_sqlite": "SQLite Datenbank zurÃŧcksetzen", - "reset_sqlite_confirmation": "Bist du sicher, dass du die SQLite-Datenbank zurÃŧcksetzen willst? Du musst dich ab- und wieder anmelden, um die Daten neu zu synchronisieren", + "reset_sqlite_clear_app_data": "Daten lÃļschen", + "reset_sqlite_confirmation": "Bist du sicher, dass du die SQLite-Datenbank zurÃŧcksetzen willst? Es werden alle Einstellungen zurÃŧckgesetzt und du wirst abgemeldet.", + "reset_sqlite_confirmation_note": "Warnung: Du musst nach dem ZurÃŧcksetzten die App neu starten.", + "reset_sqlite_done": "Die Anwendungsdaten wurden gelÃļscht. Bitte starte Immich neu um dich erneut anzumelden.", "reset_sqlite_success": "SQLite Datenbank erfolgreich zurÃŧckgesetzt", "reset_to_default": "Auf Standard zurÃŧcksetzen", "resolution": "AuflÃļsung", @@ -1903,6 +1915,7 @@ "saved_settings": "Einstellungen gespeichert", "say_something": "Etwas sagen", "scaffold_body_error_occurred": "Ein Fehler ist aufgetreten", + "scaffold_body_error_unrecoverable": "Es ist ein nicht behebbarer Fehler aufgetreten. Bitte teilen Sie uns den Fehler und den Stacktrace auf Discord oder GitHub mit, damit wir Ihnen helfen kÃļnnen. Falls nÃļtig, kÃļnnen Sie unten die App-Daten lÃļschen.", "scan": "Scannen", "scan_all_libraries": "Alle Bibliotheken scannen", "scan_library": "Scannen", @@ -1938,6 +1951,7 @@ "search_filter_ocr": "Suche per OCR", "search_filter_people_title": "Personen auswählen", "search_filter_star_rating": "Sternebewertung", + "search_filter_tags_title": "Tags auswählen", "search_for": "Suche nach", "search_for_existing_person": "Suche nach vorhandener Person", "search_no_more_result": "Keine weiteren Ergebnisse", @@ -2017,6 +2031,9 @@ "set_profile_picture": "Profilbild einstellen", "set_slideshow_to_fullscreen": "Diashow auf Vollbild einstellen", "set_stack_primary_asset": "Als primäre Datei festlegen", + "setting_image_navigation_enable_subtitle": "Aktivieren, um durch Tippen auf den linksäußeren/rechtsäußeren Bildschirmrand zum vorherigen/nächsten Bild zu navigieren.", + "setting_image_navigation_enable_title": "Tippen zum Navigieren", + "setting_image_navigation_title": "Bild Navigation", "setting_image_viewer_help": "Der Detailbildbetrachter lädt zuerst ein (kleines) Vorschaubild, dann ein Vorschaubild in mittlerer GrÃļße (falls aktiviert) und schließlich das Original (falls aktiviert).", "setting_image_viewer_original_subtitle": "Aktivieren, um das Originalbild in voller AuflÃļsung (groß!) zu laden. Deaktivieren, um den Datenverbrauch zu reduzieren (sowohl im Netzwerk als auch im Gerätespeicher).", "setting_image_viewer_original_title": "Original laden", @@ -2183,6 +2200,7 @@ "support": "UnterstÃŧtzung", "support_and_feedback": "UnterstÃŧtzung & Feedback", "support_third_party_description": "Deine Immich-Installation wurde von einem Drittanbieter zusammengestellt. Probleme, die bei dir auftreten, kÃļnnen durch dieses Paket verursacht werden. Bitte wende dich daher in erster Linie an diesen Anbieter, indem du die unten stehenden Links verwendest.", + "supporter": "UnterstÃŧtzer", "swap_merge_direction": "Vertauschen der ZusammenfÃŧhrungsrichtung", "sync": "Synchronisieren", "sync_albums": "Alben synchronisieren", @@ -2294,6 +2312,7 @@ "unstack_action_prompt": "{count} entstapelt", "unstacked_assets_count": "{count, plural, one {# Datei} other {# Dateien}} entstapelt", "unsupported_field_type": "Nicht unterstÃŧtzter Feldtyp", + "unsupported_file_type": "Die Datei {file} kann nicht hochgeladen werden, da der Dateityp {type} nicht unterstÃŧtzt wird.", "untagged": "Ohne Tag", "untitled_workflow": "Unbenannter Workflow", "up_next": "Weiter", @@ -2320,6 +2339,8 @@ "url": "URL", "usage": "Verwendung", "use_biometric": "Biometrie verwenden", + "use_browser_locale": "Benutze lokalen Browser", + "use_browser_locale_description": "Datum, Uhrzeit und Zahlen werden entsprechend den Einstellungen Ihres Browsers formatiert", "use_current_connection": "Aktuelle Verbindung verwenden", "use_custom_date_range": "Stattdessen einen benutzerdefinierten Datumsbereich verwenden", "user": "Nutzer", diff --git a/i18n/de_CH.json b/i18n/de_CH.json index 1925b4b8a4..5d25d2a142 100644 --- a/i18n/de_CH.json +++ b/i18n/de_CH.json @@ -75,30 +75,58 @@ "confirm_reprocess_all_faces": "Bisch sicher, dass du alli Gsichter neu verarbeite wotsch? Däbii werde au benannti Persone glÃļscht.", "confirm_user_password_reset": "Bisch sicher, dass du s Passwort fÃŧr {user} mÃļchtisch zruggsetze?", "confirm_user_pin_code_reset": "Bisch sicher, dass du de PIN-Code vo {user} mÃļchtisch zruggsetze?", - "copy_config_to_clipboard_description": "Kopiere die aktuelle Systemkonfiguration als JSON-Objekt in die Zwischenablage", + "copy_config_to_clipboard_description": "Kopier die aktuelli Systemkonfiguration als JSON-Objekt i d'ZwÃŧschenablage", "create_job": "Uufgabe erstelle", "cron_expression": "Cron-Ziitagabe", "cron_expression_description": "Setz s Scanintervall im Cron-Format. Hilf mit däm Format bÃŧtet z. B. der Crontab Guru", "cron_expression_presets": "Vorlage fÃŧr Cron-Uusdruck", "disable_login": "Login deaktiviere", "duplicate_detection_job_description": "Die Uufgab fÃŧehrt s maschinelle Lärne fÃŧr jedi Datei us, zum Duplikat finde. Die Uufgabe berueht uf de intelligente Suechi", - "exclusion_pattern_description": "Mit Ausschlussmustern kÃļnnen Dateien und Ordner beim Scannen Ihrer Bibliothek ignoriert werden. Dies ist nÃŧtzlich, wenn du Ordner hast, die Dateien enthalten, die du nicht importieren mÃļchtest, wie z. B. RAW-Dateien.", - "export_config_as_json_description": "Lade die aktuelle Systemkonfiguration als JSON-Datei herunter", - "external_libraries_page_description": "Externe Bibliotheksseite fÃŧr Administratoren", + "exclusion_pattern_description": "Mit Uusschlussmuster chÃļnnd Dateie und Ordner bim Scanne vo dinere Bibliothek ignoriert wärde. Das isch nÃŧtzlich, wenn du Ordner häsch, wo Dateien drin händ, wo d nÃļd wotsch importiere, wie z. B. RAW-Dateie.", + "export_config_as_json_description": "Lad die aktuelli Systemkonfiguration als JSON-Datei abe", + "external_libraries_page_description": "Externi Bibliothekssiite fÃŧr Administratore", "face_detection": "Gsichtserkennig", - "face_detection_description": "Diese Aufgabe erfasst Gesichter in Dateien mittels maschinellen Lernens. Bei Videos wird nur die Miniaturansicht verwendet. „Aktualisieren“ verarbeitet alle Dateien neu. „ZurÃŧcksetzen“ setzt zusätzlich alle Gesichter zurÃŧck. „Fehlende“ stellt nur nicht verarbeitete Dateien in die Warteschlange. Erfasste Gesichter werden zur Gesichtsidentifizierung in die Warteschlange gestellt, um sie in bestehende oder neue Personen zu gruppieren.", - "facial_recognition_job_description": "Diese Aufgabe gruppiert im Anschluss an die Gesichtserfassung die erfassten Gesichter zu Personen. „ZurÃŧcksetzen“ gruppiert alle Gesichter neu, während „Fehlende“ Gesichter ohne Zuordnung in die Warteschlange stellt.", - "failed_job_command": "Befehl {command} ist fÃŧr Aufgabe {job} fehlgeschlagen", - "force_delete_user_warning": "WARNUNG: Diese Aktion lÃļscht sofort den Benutzer und all seine Dateien. Dies kann nicht rÃŧckgängig gemacht werden und die Dateien kÃļnnen nicht wiederhergestellt werden.", + "face_detection_description": "Die Uufgab erfasst Gsichter in Dateien dur maschinells Lerne. Bi Video wird nur d'Miniaturasicht brucht. „Aktualisiere“ verarbeitet all Dateie neu. „Zruggsetze“ setzt au no all Gsichter zrugg. „Fehlendi“ stellt nur nÃļd verarbeiteti Dateie in d'Warteschlange. Erfassti Gsichter wärdet zur Gsichtsidentifizierig in diWarteschlange gstellt, damit sie i bestehendi oder neui Persone z'gruppiere.", + "facial_recognition_job_description": "Die Uufgabe gruppiert im Anschluss an d'Gsichtserfassig die erfasste Gsichter zu Persone. „Zruggsetze“ gruppiert alli Gsichter neu und mit „Fehlendi“ werdet Gsichter ohni Zuordnig i d'Warteschlange gstellt.", + "failed_job_command": "Befehl {command} hät fÃŧr d'Uufgabe {job} nÃļd funktioniert", + "force_delete_user_warning": "WARNIG: Die Aktion lÃļscht dä Benutzer und all sini Dateie. Das chann nÃļd rÃŧckgängig gmacht wärde und d'Dateie chÃļnnd nÃļd wiederhergstellt wärde.", "image_format": "Format", - "image_format_description": "WebP erzeugt kleinere Dateien als JPEG, ist aber etwas langsamer in der Erstellung.", - "image_fullsize_description": "HochauflÃļsendes Bild mit entfernten Metadaten, das beim Zoomen verwendet wird", - "image_fullsize_enabled": "HochauflÃļsende Vorschaubilder aktivieren", + "image_format_description": "WebP erzeugt chlineri Dateie we JPEG, isch aber es bitz langsamer i de Erstellig.", + "image_fullsize_description": "HochuflÃļsends Bild mit glÃļschte Metadate, wo bim Zoome brucht wird", + "image_fullsize_enabled": "HochuflÃļsendi Vorschaubilder aktiviere", "image_fullsize_enabled_description": "Generiere hochauflÃļsende Vorschaubilder in OriginalauflÃļsung fÃŧr nicht web-kompatibel Formate. Wenn \"Eingebettete Vorschau bevorzugen\" aktiviert ist, werden eingebettete Vorschaubilder direkt verwendet. Hat keinen Einfluss auf web-kompatible Formate wie JPEG.", "image_fullsize_quality_description": "Qualität der hochauflÃļsenden Vorschaubilder von 1-100. HÃļher ist besser, erzeugt aber grÃļssere Dateien.", "image_fullsize_title": "HochauflÃļsende Vorschaueinstellungen", "image_prefer_embedded_preview": "Eingebettete Vorschau bevorzugen", "image_prefer_embedded_preview_setting_description": "Verwende eingebettete Vorschaubilder in RAW-Fotos als Grundlage fÃŧr die Bildverarbeitung, sofern diese zur VerfÃŧgung stehen. Dies kann bei einigen Bildern genauere Farben erzeugen, allerdings ist die Qualität der Vorschau kameraabhängig und das Bild kann mehr Kompressionsartefakte aufweisen.", - "image_prefer_wide_gamut": "Breites Spektrum bevorzugen" + "image_prefer_wide_gamut": "Breites Spektrum bevorzugen", + "image_prefer_wide_gamut_setting_description": "Bruuch Display P3 fÃŧr Vorschaubildli. Das erhaltet d'Vitalität von Bildli mit grossem Farbruum besser. Uf alte Grät mit alte Browser chann das aber andersch uusgseh. sRGB-Bildli wärdet als sRGB bhalte zum Farbänderige vermiide.", + "image_preview_description": "Mittelgrossi Bildli ohni Metadate, bruuchts fÃŧr Einzelaasichte und fÃŧrs maschinelle Lärne", + "image_preview_quality_description": "Vorschauqualität vo 1-100. HÃļcher isch besser, git aber grÃļsseri Dateie und chan d'App Schwuppdizität reduziere. Z tÃŧffi Wert chÃļnnd s maschinelle Lärne beiträchtige.", + "image_preview_title": "Vorschauiistellige", + "image_progressive": "Fortlaufend", + "image_progressive_description": "Codier fortlaufendi JPEG-Bildi: Sie wärdet bim Lade aufbauend aazeiget. Das hät kei WÃŧrkig uf WebP-Bildi.", + "image_quality": "Qualität", + "image_resolution": "UuflÃļsig", + "image_resolution_description": "HÃļcheri UuflÃļsig erhaltet meh Detail, gaht aber länger zum codiere, macht grÃļsseri Dateie und chan d'App Schuppdizität reduziere.", + "image_settings": "Bild-Iistellige", + "image_settings_description": "Qualität und UuflÃļsig von erstellte Bildli verwalte", + "image_thumbnail_description": "Chlini Vorschaubildli ohni Metadate, bruuchts fÃŧr Aasichte mit Gruppe vo FÃļteli wie i de Hauptziitachse", + "image_thumbnail_quality_description": "Vorschauqualität vo 1-100. HÃļcher isch besser, git aber grÃļsseri Dateie und chan d'App Schwuppdizität reduziere.", + "image_thumbnail_title": "Iistellige fÃŧr Vorschaubildli", + "import_config_from_json_description": "Systemkonfiguration importiere durs Ufelade vonere JSON-Datei", + "job_concurrency": "{job} Näbeläufigkeit", + "job_created": "Uufgab erstellt", + "job_not_concurrency_safe": "Die Uufgabe ist nÃļd fÃŧr ParalleluusfÃŧhrig gmacht.", + "job_settings": "Uufgabe-Iistellige", + "job_settings_description": "Uufgabe-Näbeläufigkeit verwalte", + "jobs_over_time": "Uufgabe in ziitliche Verlauf", + "library_created": "Bibliothek erstellt: {library}", + "library_deleted": "Bibliothek glÃļscht", + "library_details": "Bibliotheks-Details", + "library_folder_description": "Gib en Order zum Importiere a. Dä Order mit sine Underordner wird nach Bildli und Videos durchsucht.", + "library_remove_exclusion_pattern_prompt": "Bisch sicher, dass das Uuschluss-Muster wotsch lÃļsche?", + "library_remove_folder_prompt": "Bisch sicher, dass dä Import-Ordner wotsch lÃļsche?", + "library_scanning": "Regelmässigi ÜberprÃŧefig" } } diff --git a/i18n/el.json b/i18n/el.json index b1a868023e..851a4edb27 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îŋ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ÎĩÎēĪ„ĪŒĪ‚ ÎĩÎŗÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚, ÎĩÎ¯Ī„Îĩ ĪƒĪ„Îŋ cloud ÎĩÎ¯Ī„Îĩ ΃Îĩ ÎŦÎģÎģΡ Ī†Ī…ĪƒÎšÎēÎŽ Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą.", "backup_onboarding_2_description": "Ī„ÎŋĪ€ÎšÎēÎŦ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ΃Îĩ Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎ­Ī‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚. Î‘Ī…Ī„ĪŒ Ī€ÎĩĪÎšÎģÎąÎŧβÎŦÎŊÎĩΚ Ī„Îą ÎēĪĪÎšÎą ÎąĪĪ‡ÎĩÎ¯Îą ÎēιΚ έÎŊÎą Ī„ÎŋĪ€ÎšÎēΌ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îŋ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ÎąĪ…Ī„ĪŽÎŊ ΄ΉÎŊ ÎąĪĪ‡ÎĩÎ¯Ī‰ÎŊ.", "backup_onboarding_3_description": "ĪƒĪ…ÎŊÎŋÎģΚÎēÎŦ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ΄ΉÎŊ δÎĩδÎŋÎŧέÎŊΉÎŊ ĪƒÎąĪ‚, ĪƒĪ…ÎŧĪ€ÎĩĪÎšÎģÎąÎŧβιÎŊÎŋÎŧέÎŊΉÎŊ ΄ΉÎŊ ÎąĪĪ‡ÎšÎēĪŽÎŊ ÎąĪĪ‡ÎĩÎ¯Ī‰ÎŊ. Î‘Ī…Ī„ĪŒ Ī€ÎĩĪÎšÎģÎąÎŧβÎŦÎŊÎĩΚ 1 ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îŋ ÎĩÎēĪ„ĪŒĪ‚ ÎĩÎŗÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ (offsite) ÎēιΚ 2 Ī„ÎŋĪ€ÎšÎēÎŦ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą.", - "backup_onboarding_description": "ÎŖĪ…ÎŊÎšĪƒĪ„ÎŦĪ„ÎąÎš Ρ ĪƒĪ„ĪÎąĪ„ÎˇÎŗÎšÎēÎŽ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ 3-2-1 ÎŗÎšÎą Ī„ÎˇÎŊ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯Îą ΄ΉÎŊ δÎĩδÎŋÎŧέÎŊΉÎŊ ĪƒÎąĪ‚. Θι Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Î´ÎšÎąĪ„ÎˇĪÎĩÎ¯Ī„Îĩ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ΄ΉÎŊ ÎąÎŊÎĩÎ˛ÎąĪƒÎŧέÎŊΉÎŊ ΆΉ΄ÎŋÎŗĪÎąĪ†ÎšĪŽÎŊ/Î˛Î¯ÎŊĪ„ÎĩΌ ĪƒÎąĪ‚, ÎēÎąÎ¸ĪŽĪ‚ ÎēιΚ Ī„ÎˇĪ‚ βÎŦĪƒÎˇĪ‚ δÎĩδÎŋÎŧέÎŊΉÎŊ Ī„ÎŋĪ… Immich, ÎŗÎšÎą ÎŧΚι ÎŋÎģÎŋÎēÎģÎˇĪĪ‰ÎŧέÎŊΡ ÎģĪĪƒÎˇ backup.", + "backup_onboarding_description": "ÎŖĪ…ÎŊÎšĪƒĪ„ÎŦĪ„ÎąÎš Ρ 3-2-1 ĪƒĪ„ĪÎąĪ„ÎˇÎŗÎšÎēÎŽ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ÎŗÎšÎą Ī„ÎˇÎŊ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯Îą ΄ΉÎŊ δÎĩδÎŋÎŧέÎŊΉÎŊ ĪƒÎąĪ‚. Θι Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Î´ÎšÎąĪ„ÎˇĪÎĩÎ¯Ī„Îĩ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ΄ΉÎŊ ÎąÎŊÎĩÎ˛ÎąĪƒÎŧέÎŊΉÎŊ ΆΉ΄ÎŋÎŗĪÎąĪ†ÎšĪŽÎŊ/Î˛Î¯ÎŊĪ„ÎĩΌ ĪƒÎąĪ‚, ÎēÎąÎ¸ĪŽĪ‚ ÎēιΚ Ī„ÎˇĪ‚ βÎŦĪƒÎˇĪ‚ δÎĩδÎŋÎŧέÎŊΉÎŊ Ī„ÎŋĪ… Immich, ÎŗÎšÎą ÎŧΚι ÎŋÎģÎŋÎēÎģÎˇĪĪ‰ÎŧέÎŊΡ ÎģĪĪƒÎˇ backup.", "backup_onboarding_footer": "Για Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ĪƒĪ‡ÎĩĪ„ÎšÎēÎŦ ÎŧÎĩ Ī„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ Ī„ÎŋĪ… Immich, ÎąÎŊÎąĪ„ĪÎ­ÎžÎĩ ĪƒĪ„ÎŋÎŊ ÎŋÎ´ÎˇÎŗĪŒ Ī„ÎĩÎēÎŧÎˇĪÎ¯Ī‰ĪƒÎˇĪ‚.", "backup_onboarding_parts_title": "ΈÎŊÎą ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îŋ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ Ī„ĪĪ€ÎŋĪ… 3-2-1 Ī€ÎĩĪÎšÎģÎąÎŧβÎŦÎŊÎĩΚ:", "backup_onboarding_title": "ΑÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚", @@ -311,7 +311,7 @@ "search_jobs": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎĩĪÎŗÎąĪƒÎšĪŽÎŊâ€Ļ", "send_welcome_email": "Î‘Ī€ÎŋĪƒĪ„ÎŋÎģÎŽ email ÎēÎąÎģĪ‰ĪƒÎŋĪÎ¯ĪƒÎŧÎąĪ„ÎŋĪ‚", "server_external_domain_settings": "Î•ÎžĪ‰Ī„ÎĩĪÎšÎēÎŽ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ Ī„ÎŋÎŧέι", - "server_external_domain_settings_description": "ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇ Ī„ÎŋÎŧέι ÎŗÎšÎą δΡÎŧĪŒĪƒÎšÎŋĪ…Ī‚ ÎēÎŋΚÎŊÎŋĪĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎŧÎŋĪ…Ī‚, Ī€ÎĩĪÎšÎģÎąÎŧβιÎŊÎŋÎŧέÎŊÎŋĪ… Ī„ÎŋĪ… http(s)://", + "server_external_domain_settings_description": "Η δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą ÎĩÎžĪ‰Ī„ÎĩĪÎšÎēÎŋĪĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎŧÎŋĪ…Ī‚", "server_public_users": "ΔηÎŧĪŒĪƒÎšÎŋΚ Î§ĪÎŽĪƒĪ„ÎĩĪ‚", "server_public_users_description": "ΌÎģÎŋΚ ÎŋΚ Ī‡ĪÎŽĪƒĪ„ÎĩĪ‚ (ΌÎŊÎŋÎŧÎą ÎēιΚ email) ÎĩÎŧĪ†ÎąÎŊίÎļÎŋÎŊĪ„ÎąÎš ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ΀΁ÎŋĪƒÎ¸ÎŽÎēΡ ÎĩÎŊĪŒĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ ΃Îĩ ÎēÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„Îą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ. ÎŒĪ„ÎąÎŊ ÎąĪ…Ī„ÎŽ Ρ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ, Ρ ÎģÎ¯ĪƒĪ„Îą Ī‡ĪÎˇĪƒĪ„ĪŽÎŊ θι ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧΡ ÎŧΌÎŊÎŋ ĪƒĪ„ÎŋĪ…Ī‚ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„Î­Ī‚.", "server_settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", @@ -372,7 +372,7 @@ "transcoding_audio_codec": "ÎšĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽĪ‚ ÎŽĪ‡ÎŋĪ…", "transcoding_audio_codec_description": "ΤÎŋ Opus ÎĩίÎŊιΚ Ρ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ ÎŗÎšÎą Ī„ÎˇÎŊ Ī…ĪˆÎˇÎģĪŒĪ„ÎĩĪÎˇ Ī€ÎŋÎšĪŒĪ„ÎˇĪ„Îą, ÎąÎģÎģÎŦ Î­Ī‡ÎĩΚ Ī‡ÎąÎŧΡÎģĪŒĪ„ÎĩĪÎˇ ĪƒĪ…ÎŧÎ˛ÎąĪ„ĪŒĪ„ÎˇĪ„Îą ÎŧÎĩ Ī€ÎąÎģÎšÎ­Ī‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ ÎŽ ÎģÎŋÎŗÎšĪƒÎŧΚÎēΌ.", "transcoding_bitrate_description": "ΒίÎŊĪ„ÎĩÎŋ ÎŧÎĩ ĪĪ…Î¸ÎŧΌ ÎŧÎĩĪ„ÎŦδÎŋĪƒÎˇĪ‚ ÎŧÎĩÎŗÎąÎģĪĪ„Îĩ΁Îŋ ÎąĪ€ĪŒ Ī„Îŋ ÎŧÎ­ÎŗÎšĪƒĪ„Îŋ ÎŽ Ī€ÎŋĪ… δÎĩÎŊ ÎĩίÎŊιΚ ΃Îĩ ÎąĪ€ÎŋδÎĩÎēĪ„ÎŽ ÎŧÎŋĪĪ†ÎŽ", - "transcoding_codecs_learn_more": "Για ÎŊÎą ÎŧÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ÎŗÎšÎą Ī„ÎˇÎŊ Îŋ΁ÎŋÎģÎŋÎŗÎ¯Îą Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎĩÎ´ĪŽ, ÎąÎŊÎąĪ„ĪÎ­ÎžĪ„Îĩ ĪƒĪ„ÎˇÎŊ Ī„ÎĩÎēÎŧÎˇĪÎ¯Ī‰ĪƒÎˇ Ī„ÎŋĪ… FFmpeg ÎŗÎšÎą Ī„ÎŋĪ…Ī‚ ÎēĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„Î­Ī‚ H.264, HEVC ÎēιΚ VP9.", + "transcoding_codecs_learn_more": "Για ÎŊÎą ÎŧÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ÎŗÎšÎą Ī„ÎˇÎŊ Îŋ΁ÎŋÎģÎŋÎŗÎ¯Îą Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎĩÎ´ĪŽ, ÎąÎŊÎąĪ„ĪÎ­ÎžĪ„Îĩ ĪƒĪ„ÎˇÎŊ Ī„ÎĩÎēÎŧÎˇĪÎ¯Ī‰ĪƒÎˇ Ī„ÎŋĪ… FFmpeg ÎŗÎšÎą Ī„ÎŋĪ…Ī‚ ÎēĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„Î­Ī‚ H.264 codec, HEVC codec ÎēιΚ VP9 codec.", "transcoding_constant_quality_mode": "ΛÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą ĪƒĪ„ÎąÎ¸ÎĩĪÎŽĪ‚ Ī€ÎŋÎšĪŒĪ„ÎˇĪ„ÎąĪ‚", "transcoding_constant_quality_mode_description": "ΤÎŋ ICQ ÎĩίÎŊιΚ ÎēÎąÎģĪĪ„Îĩ΁Îŋ ÎąĪ€ĪŒ Ī„Îŋ CQP, ÎąÎģÎģÎŦ ÎŋĪÎšĪƒÎŧέÎŊÎĩĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ ÎĩĪ€ÎšĪ„ÎŦ·΅ÎŊĪƒÎˇĪ‚ Ī…ÎģΚÎēÎŋĪ δÎĩÎŊ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎŋĪ…ÎŊ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą. Η ĪĪÎ¸ÎŧÎšĪƒÎˇ ÎąĪ…Ī„ÎŽĪ‚ Ī„ÎˇĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎŽĪ‚ θι ΀΁ÎŋĪ„ÎšÎŧÎŽĪƒÎĩΚ Ī„ÎˇÎŊ ÎēιθÎŋĪÎšĪƒÎŧέÎŊΡ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą ÎēÎąĪ„ÎŦ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ βÎŦ΃ÎĩΚ Ī€ÎŋÎšĪŒĪ„ÎˇĪ„ÎąĪ‚. Î‘ÎŗÎŊÎŋÎĩÎ¯Ī„ÎąÎš ÎąĪ€ĪŒ Ī„Îŋ NVENC, ÎēÎąÎ¸ĪŽĪ‚ δÎĩÎŊ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩΚ Ī„Îŋ ICQ.", "transcoding_constant_rate_factor": "ÎŖĪ„ÎąÎ¸ÎĩĪĪŒĪ‚ Ī€ÎąĪÎŦÎŗÎŋÎŊĪ„ÎąĪ‚ ĪĪ…Î¸ÎŧÎŋĪ (-crf)", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Î§ÎąĪĪ„ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ ·΁ΉÎŧÎąĪ„ÎšÎēĪŽÎŊ Ī„ĪŒÎŊΉÎŊ", "transcoding_tone_mapping_description": "Î ĪÎŋĪƒĪ€ÎąÎ¸Îĩί ÎŊÎą Î´ÎšÎąĪ„ÎˇĪÎŽĪƒÎĩΚ Ī„ÎˇÎŊ ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇ ΄ΉÎŊ HDR Î˛Î¯ÎŊĪ„ÎĩÎŋ ĪŒĪ„ÎąÎŊ ÎŧÎĩĪ„ÎąĪ„ĪÎ­Ī€ÎŋÎŊĪ„ÎąÎš ΃Îĩ SDR. ΚÎŦθÎĩ ÎąÎģÎŗĪŒĪÎšÎ¸ÎŧÎŋĪ‚ ÎēÎŦÎŊÎĩΚ Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎ­Ī‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ĪƒĪ‡ÎĩĪ„ÎšÎēÎŦ ÎŧÎĩ Ī„Îą Ī‡ĪĪŽÎŧÎąĪ„Îą, Ī„ÎšĪ‚ ÎģÎĩ΀΄ÎŋÎŧÎ­ĪÎĩΚÎĩĪ‚ ÎēιΚ Ī„Îˇ ΆΉ΄ÎĩΚÎŊĪŒĪ„ÎˇĪ„Îą. Ο ÎąÎģÎŗĪŒĪÎšÎ¸ÎŧÎŋĪ‚ Hable Î´ÎšÎąĪ„ÎˇĪÎĩί Ī„ÎšĪ‚ ÎģÎĩ΀΄ÎŋÎŧÎ­ĪÎĩΚÎĩĪ‚, Îŋ Mobius Î´ÎšÎąĪ„ÎˇĪÎĩί Ī„Îą Ī‡ĪĪŽÎŧÎąĪ„Îą ÎēιΚ Îŋ Reinhard Î´ÎšÎąĪ„ÎˇĪÎĩί Ī„Îˇ ΆΉ΄ÎĩΚÎŊĪŒĪ„ÎˇĪ„Îą.", "transcoding_transcode_policy": "ΠÎŋÎģÎšĪ„ÎšÎēÎŽ ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽĪ‚ (Î˛Î¯ÎŊĪ„ÎĩÎŋ / ÎŽĪ‡ÎŋĪ…)", - "transcoding_transcode_policy_description": "ΠÎŋÎģÎšĪ„ÎšÎēÎŽ ÎŗÎšÎą Ī„Îŋ Ī€ĪŒĪ„Îĩ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎŧÎĩĪ„ÎąĪ„ĪÎąĪ€Îĩί έÎŊÎą Î˛Î¯ÎŊĪ„ÎĩÎŋ. Τι Î˛Î¯ÎŊĪ„ÎĩÎŋ HDR θι ÎŧÎĩĪ„ÎąĪ„ĪÎ­Ī€ÎŋÎŊĪ„ÎąÎš Ī€ÎŦÎŊĪ„Îą (ÎĩÎēĪ„ĪŒĪ‚ ÎąÎŊ Ρ ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ).", + "transcoding_transcode_policy_description": "ΠÎŋÎģÎšĪ„ÎšÎēÎŽ ÎŗÎšÎą Ī„Îŋ Ī€ĪŒĪ„Îĩ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎŗÎ¯ÎŊÎĩΚ ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ÎĩÎŊĪŒĪ‚ Î˛Î¯ÎŊĪ„ÎĩÎŋ. Τι HDR Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎēιΚ Ī„Îą Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎŧÎĩ pixel format Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēΌ ÎąĪ€ĪŒ YUV 4:2:0 θι ÎŧÎĩĪ„ÎąĪ„ĪÎ­Ī€ÎŋÎŊĪ„ÎąÎš Ī€ÎŦÎŊĪ„Îą (ÎĩÎēĪ„ĪŒĪ‚ ÎąÎŊ Ρ ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ).", "transcoding_two_pass_encoding": "ÎšĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ Î´ĪÎŋ Ī€ÎĩĪÎąĪƒÎŧÎŦ΄ΉÎŊ", "transcoding_two_pass_encoding_setting_description": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ΃Îĩ Î´ĪÎŋ Ī€Îĩ΁ÎŦ΃ÎŧÎąĪ„Îą ÎŗÎšÎą Ī„ÎˇÎŊ Ī€ÎąĪÎąÎŗĪ‰ÎŗÎŽ Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎŧÎĩ ÎēÎąÎģĪĪ„ÎĩĪÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ. ÎŒĪ„ÎąÎŊ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋĪ‚ Îŋ ÎŧÎ­ÎŗÎšĪƒĪ„ÎŋĪ‚ ĪĪ…Î¸ÎŧĪŒĪ‚ ÎŧÎĩĪ„ÎŦδÎŋĪƒÎˇĪ‚ (ÎąĪ€ÎąĪÎąÎ¯Ī„ÎˇĪ„ÎŋĪ‚ ÎŗÎšÎą ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą ÎŧÎĩ H.264 ÎēιΚ HEVC), ÎąĪ…Ī„ÎŽ Ρ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩί έÎŊÎą ÎĩĪĪÎŋĪ‚ ĪĪ…Î¸ÎŧÎŋĪ ÎŧÎĩĪ„ÎŦδÎŋĪƒÎˇĪ‚ βÎŦ΃ÎĩΚ Ī„ÎŋĪ… ÎŧÎ­ÎŗÎšĪƒĪ„ÎŋĪ… ĪĪ…Î¸ÎŧÎŋĪ ÎŧÎĩĪ„ÎŦδÎŋĪƒÎˇĪ‚ ÎēιΚ ÎąÎŗÎŊÎŋÎĩί Ī„Îŋ CRF. ÎŖĪ„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽ VP9, Ī„Îŋ CRF ÎŧĪ€Îŋ΁Îĩί ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚΡθÎĩί ÎĩÎŦÎŊ Îŋ ÎŧÎ­ÎŗÎšĪƒĪ„ÎŋĪ‚ ĪĪ…Î¸ÎŧĪŒĪ‚ ÎŧÎĩĪ„ÎŦδÎŋĪƒÎˇĪ‚ ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋĪ‚.", "transcoding_video_codec": "ÎšĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽĪ‚ Î˛Î¯ÎŊĪ„ÎĩÎŋ", @@ -794,6 +794,11 @@ "color": "Î§ĪĪŽÎŧÎą", "color_theme": "Î§ĪĪŽÎŧÎą θέÎŧÎąĪ„ÎŋĪ‚", "command": "ΕÎŊĪ„ÎŋÎģÎŽ", + "command_palette_prompt": "Î“ĪÎŽÎŗÎŋĪÎˇ ÎĩĪĪÎĩĪƒÎˇ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ, ÎĩÎŊÎĩĪÎŗÎĩÎšĪŽÎŊ ÎŽ ÎĩÎŊĪ„ÎŋÎģĪŽÎŊ", + "command_palette_to_close": "ÎŗÎšÎą ÎēÎģÎĩÎ¯ĪƒÎšÎŧÎŋ", + "command_palette_to_navigate": "ÎŗÎšÎą ÎĩÎ¯ĪƒÎŋδÎŋ", + "command_palette_to_select": "ÎŗÎšÎą ÎĩĪ€ÎšÎģÎŋÎŗÎŽ", + "command_palette_to_show_all": "ÎŗÎšÎą ΀΁ÎŋβÎŋÎģÎŽ ΌÎģΉÎŊ", "comment_deleted": "ΤÎŋ ĪƒĪ‡ĪŒÎģΚÎŋ Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ", "comment_options": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ĪƒĪ‡ÎŋÎģίÎŋĪ…", "comments_and_likes": "ÎŖĪ‡ĪŒÎģΚι & ÎąÎŊĪ„ÎšÎ´ĪÎŦ΃ÎĩÎšĪ‚ (likes)", @@ -866,8 +871,8 @@ "current_pin_code": "Î¤ĪÎ­Ī‡Ī‰ÎŊ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ PIN", "current_server_address": "Î¤ĪÎ­Ī‡ÎŋĪ…ĪƒÎą δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "custom_date": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą", - "custom_locale": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ ΤÎŋĪ€ÎšÎēÎŽ ÎĄĪÎ¸ÎŧÎšĪƒÎˇ", - "custom_locale_description": "ΜÎŋ΁ΆÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊίÎĩĪ‚ ÎēιΚ Ī„ÎŋĪ…Ī‚ ÎąĪÎšÎ¸ÎŧÎŋĪĪ‚, ĪƒĪÎŧΆΉÎŊÎą ÎŧÎĩ Ī„Îˇ ÎŗÎģĪŽĪƒĪƒÎą ÎēιΚ Ī„ÎˇÎŊ Ī€ÎĩĪÎšÎŋĪ‡ÎŽ", + "custom_locale": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ Ī„ÎŋĪ€ÎšÎēÎŽ ĪĪÎ¸ÎŧÎšĪƒÎˇ", + "custom_locale_description": "ΜÎŋ΁ΆÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊίÎĩĪ‚, Ī„ÎŋĪ…Ī‚ Ī‡ĪĪŒÎŊÎŋĪ…Ī‚ ÎēιΚ Ī„ÎŋĪ…Ī‚ ÎąĪÎšÎ¸ÎŧÎŋĪĪ‚, ĪƒĪÎŧΆΉÎŊÎą ÎŧÎĩ Ī„ÎˇÎŊ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΡ ÎŗÎģĪŽĪƒĪƒÎą ÎēιΚ Ī€ÎĩĪÎšÎŋĪ‡ÎŽ", "custom_url": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ URL", "cutoff_date_description": "Î”ÎšÎąĪ„ÎŽĪÎˇĪƒÎˇ ΆΉ΄ÎŋÎŗĪÎąĪ†ÎšĪŽÎŊ ÎąĪ€ĪŒ Ī„ÎšĪ‚ Ī„ÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎĩĪ‚â€Ļ", "cutoff_day": "{count, plural, one {ΡÎŧÎ­ĪÎą} other {ΡÎŧÎ­ĪÎĩĪ‚}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ δÎĩδÎŋÎŧέÎŊΉÎŊ EXIF", "deduplication_info": "ΠÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇĪ‚ Î”ÎšĪ€ÎģÎŋĪ„ĪĪ€Ī‰ÎŊ", "deduplication_info_description": "Για ÎŊÎą ΀΁ÎŋÎĩĪ€ÎšÎģέΞÎŋĪ…ÎŧÎĩ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą Ī„Îą ÎąĪĪ‡ÎĩÎ¯Îą ÎēιΚ ÎŊÎą ÎąĪ†ÎąÎšĪÎ­ĪƒÎŋĪ…ÎŧÎĩ Ī„Îą Î´ÎšĪ€ÎģĪŒĪ„Ī…Ī€Îą ΃Îĩ ÎŧÎąÎļΚÎēÎŽ ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą, ÎĩΞÎĩĪ„ÎŦÎļÎŋĪ…ÎŧÎĩ ΃Îĩ:", - "default_locale": "Î ĪÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΡ ΤÎŋĪ€ÎšÎēÎŽ ÎĄĪÎ¸ÎŧÎšĪƒÎˇ", - "default_locale_description": "ΜÎŋ΁ΆÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊίÎĩĪ‚ ÎēιΚ Ī„ÎŋĪ…Ī‚ ÎąĪÎšÎ¸ÎŧÎŋĪĪ‚ ÎŧÎĩ βÎŦĪƒÎˇ Ī„ÎˇÎŊ Ī„ÎŋĪ€ÎšÎēÎŽ ĪĪÎ¸ÎŧÎšĪƒÎˇ Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎŽĪ‚ ĪƒÎąĪ‚", "delete": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ", "delete_action_confirmation_message": "Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ; Î‘Ī…Ī„ÎŽ Ρ ÎĩÎŊÎ­ĪÎŗÎĩΚι θι Ī„Îŋ ÎŧÎĩĪ„ÎąÎēΚÎŊÎŽĪƒÎĩΚ ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ Ī„ÎŋĪ… δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎēιΚ θι ÎĩÎŧĪ†ÎąÎŊÎšĪƒĪ„Îĩί ÎŧÎŽÎŊĪ…ÎŧÎą ÎŗÎšÎą Ī„Îŋ ÎąÎŊ θέÎģÎĩĪ„Îĩ ÎŊÎą Ī„Îŋ Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎēιΚ Ī„ÎŋĪ€ÎšÎēÎŦ", "delete_action_prompt": "{count} Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎąÎŊ", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "Οι ÎąÎģÎģÎąÎŗÎ­Ī‚ ÎĩĪ†ÎąĪÎŧĪŒĪƒĪ„ÎˇÎēÎąÎŊ ÎŧÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡Î¯Îą", "editor_flip_horizontal": "ÎŸĪÎšÎļΌÎŊĪ„ÎšÎą ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ", "editor_flip_vertical": "ΚÎŦθÎĩĪ„Îˇ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ", + "editor_handle_corner": "{corner, select, top_left {ΠÎŦÎŊΉ ÎąĪÎšĪƒĪ„Îĩ΁ÎŦ} top_right {ΠÎŦÎŊΉ δÎĩΞΚÎŦ} bottom_left {ΚÎŦ΄Ή ÎąĪÎšĪƒĪ„Îĩ΁ÎŦ} bottom_right {ΚÎŦ΄Ή δÎĩΞΚÎŦ} other {A}} ÎģιβΎ ÎŗĪ‰ÎŊÎ¯ÎąĪ‚", + "editor_handle_edge": "{edge, select, top {ΠÎŦÎŊΉ} bottom {ΚÎŦ΄Ή} left {Î‘ĪÎšĪƒĪ„Îĩ΁ÎŦ} right {ΔÎĩΞΚÎŦ} other {Μια}} ÎģιβΎ Ī€ÎģÎĩ΅΁ÎŦĪ‚", "editor_orientation": "Î ĪÎŋĪƒÎąÎŊÎąĪ„ÎŋÎģÎšĪƒÎŧĪŒĪ‚", "editor_reset_all_changes": "Î•Ī€ÎąÎŊÎąĪ†Îŋ΁ÎŦ ÎąÎģÎģÎąÎŗĪŽÎŊ", "editor_rotate_left": "ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ 90° ÎąĪÎšĪƒĪ„ÎĩĪĪŒĪƒĪ„ĪÎŋĪ†Îą", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ÎĩÎŊΡÎŧÎ­ĪĪ‰ĪƒÎˇĪ‚ Ī„ÎˇĪ‚ ÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ ÎĩΚδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚", "incorrect_email_or_password": "ΛαÎŊÎ¸ÎąĪƒÎŧέÎŊÎŋ email ÎŽ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", "library_folder_already_exists": "Η Î´ÎšÎąÎ´ĪÎŋÎŧÎŽ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚ Ī…Ī€ÎŦ΁·ÎĩΚ ΎδΡ.", + "page_not_found": "Η ΃ÎĩÎģÎ¯Î´Îą δÎĩÎŊ Î˛ĪÎ­Î¸ÎˇÎēÎĩ", "paths_validation_failed": "{paths, plural, one {# Î´ÎšÎąÎ´ĪÎŋÎŧÎŽ} other {# Î´ÎšÎąÎ´ĪÎŋÎŧÎ­Ī‚}} ÎąĪ€Î­Ī„Ī…Ī‡ÎąÎŊ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎĩĪ€ÎšÎēĪĪĪ‰ĪƒÎˇ", "profile_picture_transparent_pixels": "Οι ÎĩΚÎēΌÎŊÎĩĪ‚ ΀΁ÎŋĪ†Î¯Îģ δÎĩÎŊ ÎŧĪ€Îŋ΁ÎŋĪÎŊ ÎŊÎą Î­Ī‡ÎŋĪ…ÎŊ Î´ÎšÎąĪ†ÎąÎŊÎŽ ÎĩΚÎēÎŋÎŊÎŋĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą. Î ÎąĪÎąÎēÎąÎģĪŽ ÎŧÎĩÎŗÎĩÎ¸ĪÎŊÎĩĪ„Îĩ ÎŽ/ÎēιΚ ÎŧÎĩĪ„ÎąÎēΚÎŊÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ ÎĩΚÎēΌÎŊÎą.", "quota_higher_than_disk_size": "ÎˆĪ‡ÎĩĪ„Îĩ ÎŋĪÎ¯ĪƒÎĩΚ έÎŊÎą ĪŒĪÎšÎŋ, ÎŧÎĩÎŗÎąÎģĪĪ„Îĩ΁Îŋ ÎąĪ€ĪŒ Ī„Îŋ ÎŧÎ­ÎŗÎĩθÎŋĪ‚ Ī„ÎŋĪ… Î´Î¯ĪƒÎēÎŋĪ…", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "ΑΤΟΜΑ", "exif_bottom_sheet_person_add_person": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚", "exit_slideshow": "ΈΞÎŋδÎŋĪ‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ Ī€ÎąĪÎŋĪ…ĪƒÎ¯ÎąĪƒÎˇ", + "expand": "ΑÎŊÎŦĪ€Ī„Ī…ÎžÎˇ", "expand_all": "ΑÎŊÎŦĪ€Ī„Ī…ÎžÎˇ ΌÎģΉÎŊ", "experimental_settings_new_asset_list_subtitle": "ÎŖÎĩ ÎĩΞέÎģΚΞΡ", "experimental_settings_new_asset_list_title": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ Ī€ÎĩÎšĪÎąÎŧÎąĪ„ÎšÎēÎŋĪ Ī€ÎģÎ­ÎŗÎŧÎąĪ„ÎŋĪ‚ ΆΉ΄ÎŋÎŗĪÎąĪ†ÎšĪŽÎŊ", @@ -1212,6 +1219,7 @@ "filter_description": "ÎŖĪ…ÎŊθΎÎēÎĩĪ‚ ÎŗÎšÎą Ī†ÎšÎģ΄΁ÎŦĪÎšĪƒÎŧÎą ΄ΉÎŊ ĪƒĪ„Îŋ·ÎĩĪ…ÎŧέÎŊΉÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ", "filter_people": "ÎĻΚÎģ΄΁ÎŦĪÎšĪƒÎŧÎą ÎąĪ„ĪŒÎŧΉÎŊ", "filter_places": "ÎĻΚÎģ΄΁ÎŦĪÎšĪƒÎŧÎą Ī„ÎŋĪ€ÎŋθÎĩĪƒÎšĪŽÎŊ", + "filter_tags": "ÎĻΚÎģ΄΁ÎŦĪÎšĪƒÎŧÎą ÎĩĪ„ÎšÎēÎĩĪ„ĪŽÎŊ", "filters": "ÎĻίÎģĪ„ĪÎą", "find_them_fast": "Î’ĪÎĩÎ¯Ī„Îĩ Ī„ÎŋĪ…Ī‚ ÎŗĪÎŽÎŗÎŋĪÎą ÎŧÎĩ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎēÎąĪ„ÎŦ ΌÎŊÎŋÎŧÎą", "first": "Î‘ĪĪ‡ÎšÎēÎŦ", @@ -1642,6 +1650,8 @@ "online": "ÎŖÎĩ ĪƒĪÎŊδÎĩĪƒÎˇ", "only_favorites": "ÎœĪŒÎŊÎŋ ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą", "open": "ΆÎŊÎŋÎšÎŗÎŧÎą", + "open_calendar": "ΆÎŊÎŋÎšÎŗÎŧÎą ΡÎŧÎĩ΁ÎŋÎģÎŋÎŗÎ¯ÎŋĪ…", + "open_in_browser": "ΆÎŊÎŋÎšÎŗÎŧÎą ĪƒĪ„Îŋ Ī€ĪĪŒÎŗĪÎąÎŧÎŧÎą Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚", "open_in_map_view": "ΆÎŊÎŋÎšÎŗÎŧÎą ΃Îĩ ΀΁ÎŋβÎŋÎģÎŽ ·ÎŦĪĪ„Îˇ", "open_in_openstreetmap": "ΆÎŊÎŋÎšÎŗÎŧÎą ĪƒĪ„Îŋ OpenStreetMap", "open_the_search_filters": "ΑÎŊÎŋÎ¯ÎžĪ„Îĩ Ī„Îą Ī†Î¯ÎģĪ„ĪÎą ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚", @@ -1801,9 +1811,8 @@ "rate_asset": "ΒαθÎŧÎŋÎģÎŋÎŗÎŽĪƒĪ„Îĩ Ī„Îŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ", "rating": "ΑξιÎŋÎģĪŒÎŗÎˇĪƒÎˇ ÎŧÎĩ ÎąĪƒĪ„Î­ĪÎšÎą", "rating_clear": "ΕÎēÎēιθÎŦĪÎšĪƒÎˇ ιΞΚÎŋÎģĪŒÎŗÎˇĪƒÎˇĪ‚", - "rating_count": "{count, plural, one {# ÎąĪƒĪ„Î­ĪÎš} other {# ÎąĪƒĪ„Î­ĪÎšÎą}}", + "rating_count": "{count, plural, =0 {Î§Ī‰ĪÎ¯Ī‚ ιΞΚÎŋÎģĪŒÎŗÎˇĪƒÎˇ} one {# ÎąĪƒĪ„Î­ĪÎš} other {# ÎąĪƒĪ„Î­ĪÎšÎą}}", "rating_description": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ Ī„ÎˇĪ‚ ιΞΚÎŋÎģĪŒÎŗÎˇĪƒÎˇĪ‚ EXIF ĪƒĪ„ÎŋÎŊ Ī€Î¯ÎŊÎąÎēÎą Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ", - "rating_set": "Η βιθÎŧÎŋÎģÎŋÎŗÎ¯Îą ÎŋĪÎ¯ĪƒĪ„ÎˇÎēÎĩ ΃Îĩ {rating, plural, one {# ÎąĪƒĪ„Î­ĪÎš} other {# ÎąĪƒĪ„Î­ĪÎšÎą}}", "reaction_options": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎąÎŊĪ„Î¯Î´ĪÎąĪƒÎˇĪ‚", "read_changelog": "ΔιαβÎŦĪƒĪ„Îĩ Ī„Îŋ Î‘ĪĪ‡ÎĩίÎŋ ÎšÎąĪ„ÎąÎŗĪÎąĪ†ÎŽĪ‚ ΑÎģÎģÎąÎŗĪŽÎŊ", "readonly_mode_disabled": "Η ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą ÎŧΌÎŊÎŋ-ÎŗÎšÎą-ÎąÎŊÎŦÎŗÎŊĪ‰ĪƒÎˇ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΎθΡÎēÎĩ", @@ -1875,7 +1884,10 @@ "reset_pin_code_success": "Ο ÎēĪ‰Î´ÎšÎēĪŒĪ‚ PIN ÎĩĪ€ÎąÎŊÎąĪ†Î­ĪÎ¸ÎˇÎēÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡ĪŽĪ‚", "reset_pin_code_with_password": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ Ī€ÎŦÎŊĪ„Îą ÎŊÎą ÎĩĪ€ÎąÎŊÎąĪ†Î­ĪÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ PIN Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎŽĪ‚ ĪƒÎąĪ‚", "reset_sqlite": "Î•Ī€ÎąÎŊÎąĪ†Îŋ΁ÎŦ SQLite βÎŦĪƒÎˇĪ‚ δÎĩδÎŋÎŧέÎŊΉÎŊ", - "reset_sqlite_confirmation": "Î•Î¯ĪƒÎąÎš ĪƒÎ¯ÎŗÎŋ΅΁ÎŋĪ‚ ĪŒĪ„Îš θέÎģÎĩÎšĪ‚ ÎŊÎą ÎĩĪ€ÎąÎŊÎąĪ†Î­ĪÎĩÎšĪ‚ Ī„Îˇ βÎŦĪƒÎˇ δÎĩδÎŋÎŧέÎŊΉÎŊ SQLite; Θι ·΁ÎĩÎšÎąĪƒĪ„Îĩί ÎŊÎą ÎēÎŦÎŊÎĩÎšĪ‚ ÎąĪ€ÎŋĪƒĪÎŊδÎĩĪƒÎˇ ÎēιΚ ÎĩĪ€ÎąÎŊÎąĪƒĪÎŊδÎĩĪƒÎˇ ÎŗÎšÎą ÎŊÎą ÎĩĪ€ÎąÎŊÎąĪƒĪ…ÎŗĪ‡ĪÎŋÎŊÎ¯ĪƒÎĩÎšĪ‚ Ī„Îą δÎĩδÎŋÎŧέÎŊÎą", + "reset_sqlite_clear_app_data": "ΕÎēÎēιθÎŦĪÎšĪƒÎˇ δÎĩδÎŋÎŧέÎŊΉÎŊ", + "reset_sqlite_confirmation": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ Ī„Îą δÎĩδÎŋÎŧέÎŊÎą Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚; Î‘Ī…Ī„ĪŒ θι Î´ÎšÎąÎŗĪÎŦΈÎĩΚ ΌÎģÎĩĪ‚ Ī„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎēιΚ θι ĪƒÎąĪ‚ ÎąĪ€ÎŋĪƒĪ…ÎŊÎ´Î­ĪƒÎĩΚ.", + "reset_sqlite_confirmation_note": "ÎŖÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇ: Θι ·΁ÎĩÎšÎąĪƒĪ„Îĩί ÎŊÎą ÎĩĪ€ÎąÎŊÎĩÎēÎēΚÎŊÎŽĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎŧÎĩĪ„ÎŦ Ī„ÎˇÎŊ ÎĩÎēÎēιθÎŦĪÎšĪƒÎˇ.", + "reset_sqlite_done": "Τι δÎĩδÎŋÎŧέÎŊÎą Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎąÎŊ. Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎąÎŊÎĩÎēÎēΚÎŊÎŽĪƒĪ„Îĩ Ī„Îŋ Immich ÎēιΚ ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ΞιÎŊÎŦ.", "reset_sqlite_success": "Η ÎĩĪ€ÎąÎŊÎąĪ†Îŋ΁ÎŦ Ī„ÎˇĪ‚ SQLite βÎŦĪƒÎˇĪ‚ δÎĩδÎŋÎŧέÎŊΉÎŊ ÎŋÎģÎŋÎēÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ ÎŧÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡Î¯Îą", "reset_to_default": "Î•Ī€ÎąÎŊÎąĪ†Îŋ΁ÎŦ ĪƒĪ„ÎšĪ‚ ΀΁ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚", "resolution": "ΑÎŊÎŦÎģĪ…ĪƒÎˇ", @@ -1903,6 +1915,7 @@ "saved_settings": "Î‘Ī€ÎŋθΡÎēÎĩĪ…ÎŧέÎŊÎĩĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚", "say_something": "ΠÎĩÎ¯Ī„Îĩ ÎēÎŦĪ„Îš", "scaffold_body_error_occurred": "Î ÎąĪÎŋĪ…ĪƒÎšÎŦĪƒĪ„ÎˇÎēÎĩ ĪƒĪ†ÎŦÎģÎŧÎą", + "scaffold_body_error_unrecoverable": "Î ÎąĪÎŋĪ…ĪƒÎšÎŦĪƒĪ„ÎˇÎēÎĩ έÎŊÎą ÎŧΡ ÎąÎŊÎąÎēĪ„ÎŽĪƒÎšÎŧÎŋ ĪƒĪ†ÎŦÎģÎŧÎą. Î ÎąĪÎąÎēÎąÎģĪŽ ÎēÎŋΚÎŊÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îŋ ĪƒĪ†ÎŦÎģÎŧÎą ÎēιΚ Ī„Îŋ stack trace ΃Îĩ Discord ÎŽ GitHub ÎŗÎšÎą ÎŊÎą ÎŧĪ€ÎŋĪÎ­ĪƒÎŋĪ…ÎŧÎĩ ÎŊÎą βÎŋÎˇÎ¸ÎŽĪƒÎŋĪ…ÎŧÎĩ. ΑÎŊ ĪƒÎąĪ‚ ÎļÎˇĪ„ÎˇÎ¸Îĩί, ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ Ī„Îą δÎĩδÎŋÎŧέÎŊÎą Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ Ī€ÎąĪÎąÎēÎŦ΄Ή.", "scan": "ÎŖÎŦĪĪ‰ĪƒÎˇ", "scan_all_libraries": "ÎŖÎŦĪĪ‰ĪƒÎˇ ΌÎģΉÎŊ ΄ΉÎŊ ΒιβÎģΚÎŋθΡÎēĪŽÎŊ", "scan_library": "ÎŖÎŦĪĪ‰ĪƒÎˇ", @@ -1938,6 +1951,7 @@ "search_filter_ocr": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎēÎąĪ„ÎŦ OCR", "search_filter_people_title": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŦĪ„ÎŋÎŧÎą", "search_filter_star_rating": "ΒαθÎŧÎŋÎģÎŋÎŗÎ¯Îą ÎŧÎĩ ÎąĪƒĪ„Î­ĪÎšÎą", + "search_filter_tags_title": "Î•Ī€ÎšÎģÎŋÎŗÎŽ ÎĩĪ„ÎšÎēÎĩĪ„ĪŽÎŊ", "search_for": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŗÎšÎą", "search_for_existing_person": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ Ī…Ī€ÎŦ΁·ÎŋÎŊĪ„ÎŋĪ‚ ÎąĪ„ĪŒÎŧÎŋĪ…", "search_no_more_result": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ÎŦÎģÎģÎą ÎąĪ€ÎŋĪ„ÎĩÎģÎ­ĪƒÎŧÎąĪ„Îą", @@ -2017,6 +2031,9 @@ "set_profile_picture": "ÎŸĪÎšĪƒÎŧĪŒĪ‚ ÎĩΚÎēΌÎŊÎąĪ‚ ΀΁ÎŋĪ†Î¯Îģ", "set_slideshow_to_fullscreen": "ÎŸĪÎ¯ĪƒĪ„Îĩ Ī„ÎˇÎŊ Ī€ÎąĪÎŋĪ…ĪƒÎ¯ÎąĪƒÎˇ ΃Îĩ Ī€ÎģÎŽĪÎˇ ÎŋÎ¸ĪŒÎŊΡ", "set_stack_primary_asset": "ÎŸĪÎšĪƒÎŧĪŒĪ‚ Ή΂ ÎēĪĪÎšÎŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ", + "setting_image_navigation_enable_subtitle": "ΑÎŊ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋ, ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎŧÎĩĪ„ÎąÎ˛ÎĩÎ¯Ī„Îĩ ĪƒĪ„ÎˇÎŊ ΀΁ÎŋÎˇÎŗÎŋĪÎŧÎĩÎŊΡ/ÎĩĪ€ĪŒÎŧÎĩÎŊΡ ÎĩΚÎēΌÎŊÎą Ī€ÎąĪ„ĪŽÎŊĪ„ÎąĪ‚ ĪƒĪ„Îŋ ÎąĪÎšĪƒĪ„ÎĩĪĪŒĪ„Îĩ΁Îŋ/δÎĩÎžÎšĪŒĪ„Îĩ΁Îŋ Ī„Î­Ī„ÎąĪĪ„Îŋ Ī„ÎˇĪ‚ ÎŋÎ¸ĪŒÎŊÎˇĪ‚.", + "setting_image_navigation_enable_title": "Î ÎąĪ„ÎŽĪƒĪ„Îĩ ÎŗÎšÎą ΠÎĩĪÎšÎŽÎŗÎˇĪƒÎˇ", + "setting_image_navigation_title": "ΠÎĩĪÎšÎŽÎŗÎˇĪƒÎˇ ÎĩΚÎēΌÎŊΉÎŊ", "setting_image_viewer_help": "ΤÎŋ Ī€ĪĪŒÎŗĪÎąÎŧÎŧÎą ΀΁ÎŋβÎŋÎģÎŽĪ‚ ÎģÎĩ΀΄ÎŋÎŧÎĩ΁ÎĩÎšĪŽÎŊ ΆÎŋĪĪ„ĪŽÎŊÎĩΚ Ī€ĪĪŽĪ„Îą Ī„Îˇ ÎŧΚÎē΁ÎŋÎŗĪÎąĪ†Î¯Îą, ĪƒĪ„Îˇ ĪƒĪ…ÎŊÎ­Ī‡ÎĩΚι ΆÎŋĪĪ„ĪŽÎŊÎĩΚ Ī„ÎˇÎŊ ΀΁ÎŋÎĩĪ€ÎšĪƒÎēĪŒĪ€ÎˇĪƒÎˇ ÎŧÎĩĪƒÎąÎ¯ÎŋĪ… ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ (ÎąÎŊ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ), Ī„Î­ÎģÎŋĪ‚ ΆÎŋĪĪ„ĪŽÎŊÎĩΚ Ī„Îŋ Ī€ĪĪ‰Ī„ĪŒĪ„Ī…Ī€Îŋ (ÎąÎŊ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋ).", "setting_image_viewer_original_subtitle": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ Ī€ĪĪ‰Ī„ĪŒĪ„Ī…Ī€ÎˇĪ‚ ÎĩΚÎēΌÎŊÎąĪ‚ Ī€ÎģÎŽĪÎŋĪ…Ī‚ ÎąÎŊÎŦÎģĪ…ĪƒÎˇĪ‚ (ÎŧÎĩÎŗÎŦÎģΡ!). Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ ÎŗÎšÎą ÎŊÎą ÎŧÎĩÎšĪŽĪƒÎĩĪ„Îĩ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ δÎĩδÎŋÎŧέÎŊΉÎŊ (Ī„ĪŒĪƒÎŋ ĪƒĪ„Îŋ δίÎē΄΅Îŋ Ό΃Îŋ ÎēιΚ ĪƒĪ„ÎˇÎŊ ÎēĪĪ…Ī†ÎŽ ÎŧÎŊÎŽÎŧΡ Ī„ÎˇĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚).", "setting_image_viewer_original_title": "ÎĻĪŒĪĪ„Ī‰ĪƒÎˇ Ī€ĪĪ‰Ī„ĪŒĪ„Ī…Ī€ÎˇĪ‚ ÎĩΚÎēΌÎŊÎąĪ‚", @@ -2183,6 +2200,7 @@ "support": "ÎĨĪ€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇ", "support_and_feedback": "ÎĨĪ€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇ & ÎŖĪ‡ĪŒÎģΚι", "support_third_party_description": "Η ÎĩÎŗÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ Ī„ÎŋĪ… Immich Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„Îĩ, Î­Ī‡ÎĩΚ Ī€ÎąÎēÎĩĪ„ÎąĪÎšĪƒĪ„Îĩί ÎąĪ€ĪŒ Ī„ĪÎ¯Ī„ÎŋĪ…Ī‚. Τι ΀΁ÎŋβÎģÎŽÎŧÎąĪ„Îą Ī€ÎŋĪ… ÎąÎŊĪ„ÎšÎŧÎĩĪ„Ī‰Ī€Î¯ÎļÎĩĪ„Îĩ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎŋΆÎĩίÎģÎŋÎŊĪ„ÎąÎš ΃Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Ī€ÎąÎēÎ­Ī„Îŋ, ÎŋĪ€ĪŒĪ„Îĩ Ī€ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ÎŊÎą ÎąÎŊÎąĪ†Î­ĪÎĩĪ„Îĩ Ī„Îą ΀΁ÎŋβÎģÎŽÎŧÎąĪ„Îą Ī€ĪĪŽĪ„Îą ΃Îĩ ÎĩÎēÎĩίÎŊÎŋĪ…Ī‚, Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ Ī„ÎŋĪ…Ī‚ Ī€ÎąĪÎąÎēÎŦ΄Ή ĪƒĪ…ÎŊÎ´Î­ĪƒÎŧÎŋĪ…Ī‚.", + "supporter": "ÎĨĪ€ÎŋĪƒĪ„ÎˇĪÎšÎēĪ„ÎŽĪ‚", "swap_merge_direction": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ ÎēÎąĪ„ÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ĪƒĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇĪ‚", "sync": "ÎŖĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧĪŒĪ‚", "sync_albums": "ÎŖĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧĪŒĪ‚ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", @@ -2294,6 +2312,7 @@ "unstack_action_prompt": "{count} ÎąĪ€ÎŋĪƒĪ…ĪƒĪƒĪ‰ĪÎĩĪĪ„ÎˇÎēÎąÎŊ", "unstacked_assets_count": "Î‘Ī€ÎŋĪƒĪ„ÎŋΚβÎŦÎžÎąĪ„Îĩ {count, plural, one {# ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ} other {# ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą}}", "unsupported_field_type": "Μη Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎšÎļΌÎŧÎĩÎŊÎŋĪ‚ Ī„ĪĪ€ÎŋĪ‚ Ī€ÎĩδίÎŋĪ…", + "unsupported_file_type": "ΤÎŋ ÎąĪĪ‡ÎĩίÎŋ {file} δÎĩÎŊ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎŧÎĩĪ„ÎąĪ†ÎŋĪĪ„Ī‰Î¸Îĩί ÎĩĪ€ÎĩΚδΎ Îŋ Ī„ĪĪ€ÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ… {type} δÎĩÎŊ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩĪ„ÎąÎš.", "untagged": "Î§Ī‰ĪÎ¯Ī‚ ÎĩĪ„ÎšÎēÎ­Ī„Îą", "untitled_workflow": "Νέα ΁ÎŋÎŽ ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚", "up_next": "ΑÎēÎŋÎģÎŋĪ…Î¸Îĩί", @@ -2320,6 +2339,8 @@ "url": "URL", "usage": "Î§ĪÎŽĪƒÎˇ", "use_biometric": "Î§ĪÎŽĪƒÎˇ βΚÎŋÎŧÎĩĪ„ĪÎšÎēĪŽÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ", + "use_browser_locale": "Î§ĪÎŽĪƒÎˇ ÎŗÎģĪŽĪƒĪƒÎąĪ‚ ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚", + "use_browser_locale_description": "ΜÎŋ΁ΆÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊίÎĩĪ‚, Ī„ÎŋĪ…Ī‚ Ī‡ĪĪŒÎŊÎŋĪ…Ī‚ ÎēιΚ Ī„ÎŋĪ…Ī‚ ÎąĪÎšÎ¸ÎŧÎŋĪĪ‚ ĪƒĪÎŧΆΉÎŊÎą ÎŧÎĩ Ī„Îˇ ÎŗÎģĪŽĪƒĪƒÎą Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎŽĪ‚ ĪƒÎąĪ‚", "use_current_connection": "Î§ĪÎŽĪƒÎˇ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎąĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚", "use_custom_date_range": "Î§ĪÎŽĪƒÎˇ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋĪ… ÎĩĪĪÎŋĪ…Ī‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎšĪŽÎŊ", "user": "Î§ĪÎŽĪƒĪ„ÎˇĪ‚", diff --git a/i18n/en.json b/i18n/en.json index f29dc45106..1025548cf5 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -866,6 +866,7 @@ "crop_aspect_ratio_fixed": "Fixed", "crop_aspect_ratio_free": "Free", "crop_aspect_ratio_original": "Original", + "crop_aspect_ratio_square": "Square", "curated_object_page_title": "Things", "current_device": "Current device", "current_pin_code": "Current PIN code", @@ -880,7 +881,7 @@ "daily_title_text_date": "E, MMM dd", "daily_title_text_date_year": "E, MMM dd, yyyy", "dark": "Dark", - "dark_theme": "Toggle dark theme", + "dark_theme": "Switch to dark theme", "date": "Date", "date_after": "Date after", "date_and_time": "Date and Time", @@ -891,10 +892,8 @@ "day": "Day", "days": "Days", "deduplicate_all": "Deduplicate All", - "deduplication_criteria_1": "Image size in bytes", - "deduplication_criteria_2": "Count of EXIF data", - "deduplication_info": "Deduplication Info", - "deduplication_info_description": "To automatically preselect assets and remove duplicates in bulk, we look at:", + "default_locale": "Default Locale", + "default_locale_description": "Format dates and numbers based on your browser locale", "delete": "Delete", "delete_action_confirmation_message": "Are you sure you want to delete this asset? This action will move the asset to the server's trash and will prompt if you want to delete it locally", "delete_action_prompt": "{count} deleted", @@ -970,7 +969,7 @@ "downloading_media": "Downloading media", "drop_files_to_upload": "Drop files anywhere to upload", "duplicates": "Duplicates", - "duplicates_description": "Resolve each group by indicating which, if any, are duplicates", + "duplicates_description": "Resolve each group by indicating which, if any, are duplicates.", "duration": "Duration", "edit": "Edit", "edit_album": "Edit album", @@ -1387,9 +1386,11 @@ "library_page_sort_title": "Album title", "licenses": "Licenses", "light": "Light", + "light_theme": "Switch to light theme", "like": "Like", "like_deleted": "Like deleted", "link_motion_video": "Link motion video", + "link_to_docs": "For more information, refer to the documentation.", "link_to_oauth": "Link to OAuth", "linked_oauth_account": "Linked OAuth account", "list": "List", @@ -1651,6 +1652,7 @@ "only_favorites": "Only favorites", "open": "Open", "open_calendar": "Open calendar", + "open_in_browser": "Open in browser", "open_in_map_view": "Open in map view", "open_in_openstreetmap": "Open in OpenStreetMap", "open_the_search_filters": "Open the search filters", @@ -1743,13 +1745,13 @@ "places": "Places", "places_count": "{count, plural, one {{count, number} Place} other {{count, number} Places}}", "play": "Play", - "playback_speed": "Playback speed", "play_memories": "Play memories", "play_motion_photo": "Play Motion Photo", "play_or_pause_video": "Play or pause video", "play_original_video": "Play original video", "play_original_video_setting_description": "Prefer playback of original videos rather than transcoded videos. If original asset is not compatible it may not playback correctly.", "play_transcoded_video": "Play transcoded video", + "playback_speed": "Playback speed", "please_auth_to_access": "Please authenticate to access", "port": "Port", "preferences_settings_subtitle": "Manage the app's preferences", @@ -2394,6 +2396,7 @@ "viewer_remove_from_stack": "Remove from Stack", "viewer_stack_use_as_main_asset": "Use as Main Asset", "viewer_unstack": "Un-Stack", + "visibility": "Visibility", "visibility_changed": "Visibility changed for {count, plural, one {# person} other {# people}}", "visual": "Visual", "visual_builder": "Visual builder", diff --git a/i18n/eo.json b/i18n/eo.json index 6b1ebaacdf..8e89e960c4 100644 --- a/i18n/eo.json +++ b/i18n/eo.json @@ -1,7 +1,7 @@ { "about": "Pri", "account": "Konto", - "account_settings": "AgordaÄĩoj de konto", + "account_settings": "Agordoj pri konto", "acknowledge": "Komprenite", "action": "Ago", "action_common_update": "Ĝisdatigi", @@ -311,7 +311,7 @@ "search_jobs": "Serĉi taskojnâ€Ļ", "send_welcome_email": "Sendi bonvenan retmesaĝon", "server_external_domain_settings": "Ekstera domajno", - "server_external_domain_settings_description": "Domajno por publike dividitaj ligiloj, inkl. http(s)://", + "server_external_domain_settings_description": "Domajno por eksteraj ligiloj", "server_public_users": "Publikaj uzantoj", "server_public_users_description": "Nomo kaj retadreso de ĉiuj uzantoj estas listigitaj kiam oni aldonas uzanton al dividita albumo. Kiam malŝaltita, la listo de uzantoj estos videbla nur por administrantoj.", "server_settings": "Agordoj de servilo", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapado de tonoj", "transcoding_tone_mapping_description": "Klopodas konservi aspekton de HDR-videoj dum transkodigo al SDR. Ĉiu algoritmo faras proprajn kompromisojn pri koloroj, detaloj kaj heleco. Hable konservas detalojn, Mobius konservas kolorojn, kaj Reinhard konservas helecon.", "transcoding_transcode_policy": "Politiko de transkodado", - "transcoding_transcode_policy_description": "Politiko pri kiam video estos transkodita. HDR-videoj ĉiam estas transkoditaj (krom se transkodado estas malŝaltita).", + "transcoding_transcode_policy_description": "Politiko pri kiam video estos transkodita. HDR-videoj, kune kun videoj kun ciuj bilderaj formatoj krom YUV 4:2:0, ĉiam estas transkoditaj (krom se transkodado estas malŝaltita).", "transcoding_two_pass_encoding": "Dupasa kodigo", "transcoding_two_pass_encoding_setting_description": "Transkodigo per du pasoj por krei pli bone kodigitajn videojn. Kiam eblas uzi maksimuman bitrapidon (bezonate por funkcii kun H.264 kaj kun HEVC), tiu ĉi modo uzas gamon de bitrapidoj surbaze de tiu maksimumo, kaj ignoras CRF. Por VP9, eblas uzi CRF se maksimuma bitrapido estas malŝaltita.", "transcoding_video_codec": "Videa kodeko", @@ -433,9 +433,248 @@ "user_details": "Detaloj pri uzanto", "user_management": "Administrado de uzantoj", "user_password_has_been_reset": "Pasvorto de tiu ĉi uzanto estas restarigita:", - "user_settings_description": "Administri agordojn pri uzantoj" + "user_password_reset_description": "Bonvolu sendi la dumtempan pasvorton al la uzanto, kaj informu ke ĝi devos esti ŝanĝita je la sekva ensaluto.", + "user_restore_description": "La konto de {user} estos restaÅ­rita.", + "user_restore_scheduled_removal": "RestaÅ­ri uzanton - forviŝo planita je {date, date, long}", + "user_settings": "Agordoj de uzanto", + "user_settings_description": "Administri agordojn pri uzantoj", + "user_successfully_removed": "La uzanto {email} estas forigita.", + "users_page_description": "Paĝo por administri uzantojn", + "version_check_enabled_description": "Ebligi kontrolon de versio", + "version_check_implications": "La funkcio de kontrolado de versio bezonas de temp' al tempan komunikadon kun github.com", + "version_check_settings": "Kontrolo de versio", + "version_check_settings_description": "Ŝalti/malŝalti atentigilon pri novaj versioj", + "video_conversion_job": "Transkodado de videoj", + "video_conversion_job_description": "Transkodi videojn por pli vasta kongruo kun retumiloj kaj aparatoj" }, + "admin_email": "Retadreso de administranto", + "admin_password": "Pasvorto de administranto", + "administration": "Administrado", + "advanced": "Altnivelaj agordoj", + "advanced_settings_clear_image_cache": "Malplenigi kaŝmemoron de bildoj", + "advanced_settings_clear_image_cache_error": "Malsukcesis malplenigi kaŝmemoron", + "advanced_settings_clear_image_cache_success": "Sukcesis liberigi {size}", + "advanced_settings_enable_alternate_media_filter_subtitle": "Uzu tiun ĉi agordon por filtri elementojn dum sinkronigo laÅ­ alternativaj kriterioj. Uzu tion ĉi nur se vi vidas, ke la apo ne sukcesas trovi ĉiujn albumojn.", + "advanced_settings_enable_alternate_media_filter_title": "[TESTATA] Uzi alternativan filtrilon por sinkronigi albumojn", + "advanced_settings_log_level_title": "Nivelo de protokolado: {level}", + "advanced_settings_prefer_remote_subtitle": "Kelkaj aparatoj ege malrapide ŝargas bildetojn el lokaj elementoj. Ŝaltu tiun ĉi agordon por anstataÅ­e ŝargi bildetojn de la servilo.", + "advanced_settings_prefer_remote_title": "Preferi bildojn el servilo", + "advanced_settings_proxy_headers_subtitle": "Aldoni paĝokapoj pri prokurilo, kiujn immich sendu kun ĉiu reta peto", + "advanced_settings_proxy_headers_title": "Tajloritaj paĝokapoj pri prokurilo [EKSPERIMENTA]", + "advanced_settings_readonly_mode_subtitle": "Ŝaltas nurlegan reĝimon, kie oni povas nur rigardi fotojn. Funkcioj kiel elekti plurajn bildojn, dividi kun aliaj, forigi k.a. estas ĉiuj neeblaj. Vi povas ŝalti/malŝalti tiun reĝimon per la profilbildo de uzanto ĉe la hejmpaĝo", + "advanced_settings_readonly_mode_title": "Nurlega reĝimo", + "advanced_settings_self_signed_ssl_subtitle": "Ignoras kontrolon de SSL-atestilo ĉe la servilo. Bezonata por memsubskribita atestilo.", + "advanced_settings_self_signed_ssl_title": "Permesi memsubskribitajn SSL-atestilojn [EKSPERIMENTA]", + "advanced_settings_sync_remote_deletions_subtitle": "AÅ­tomate forigi aÅ­ malforigi elementojn en tiu ĉi aparato kiam oni faras tiun agon per retumilo", + "advanced_settings_sync_remote_deletions_title": "Sinkronigi forigojn [EKSPERIMENTA]", + "advanced_settings_tile_subtitle": "Altnivelaj agordaÄĩoj", + "advanced_settings_troubleshooting_subtitle": "Ŝalti pliajn funkciojn por problemsolvi", + "advanced_settings_troubleshooting_title": "Problemsolvi", + "age_months": "Aĝo {months, plural, one {# monato} other {# monatoj}}", + "age_year_months": "Aĝo 1 jaro, {months, plural, one {# monato} other {# monatoj}}", + "age_years": "Aĝo {years, plural, one {# jaro} other {# jaroj}}", + "album": "Albumo", + "album_added": "Albumo aldonita", + "album_added_notification_setting_description": "Ricevi retmesaĝon kiam iu aldonas vin al dividita albumo", + "album_cover_updated": "Kovrilo de albumo ĝisdatigita", + "album_delete_confirmation": "Ĉu vi certas, ke vi volas forigi la albumon {album}?", + "album_delete_confirmation_description": "Se temas pri dividita albumo, aliaj uzantoj ne plu povos vidi ĝin.", + "album_deleted": "Albumo forigita", + "album_info_card_backup_album_excluded": "EKSKLUDITA", + "album_info_card_backup_album_included": "INKLUZIVITA", + "album_info_updated": "Informoj pri albumo ĝisdatigitaj", + "album_leave": "Foriri de albumo?", + "album_leave_confirmation": "Ĉu vi certas, ke vi volas forlasi la albumon {album}?", + "album_name": "Nomo de albumo", + "album_options": "Agordoj de albumo", + "album_remove_user": "Ĉu forigi uzanton?", + "album_remove_user_confirmation": "Ĉu vi certas, ke vi volas forigi la uzanton {user}?", + "album_search_not_found": "Neniu albumo kongruas kun via serĉo", + "album_selected": "Albumo elektita", + "album_share_no_users": "Ŝajne vi jam dividis tiun albumon kun ĉiuj uzantoj AÅŦ ne ekzistas uzantoj kun kiuj vi povus dividi ĝin.", + "album_summary": "Resumo de albumo", + "album_updated": "Albumo ĝisdatigita", + "album_updated_setting_description": "Ricevi retmesaĝon kiam dividita albumo havas novajn elementojn", + "album_upload_assets": "Alŝuti elementojn el via komputilo kaj aldoni ilin al albumo", + "album_user_left": "Foriris de {album}", + "album_user_removed": "Uzanto {user} forigita", + "album_viewer_appbar_delete_confirm": "Ĉu vi certas, ke vi volas forigi tiun ĉi albumon de via konto?", + "album_viewer_appbar_share_err_delete": "Malsukcesis forigi albumon", + "album_viewer_appbar_share_err_leave": "Malsukcesis foriri de albumo", + "album_viewer_appbar_share_err_remove": "Okazis problemo dum forigo de elementoj el albumo", + "album_viewer_appbar_share_err_title": "Malsukcesis ŝanĝi titolon de albumo", + "album_viewer_appbar_share_leave": "Foriri de albumo", + "album_viewer_appbar_share_to": "Dividi al", + "album_viewer_page_share_add_users": "Aldoni uzantojn", + "album_with_link_access": "Permesi, ke iu ajn kun la ligilo povu vidi la fotojn kaj homojn en la albumo.", + "albums": "Albumoj", + "albums_count": "{count, plural, one {{count, number} Albumo} other {{count, number} Albumoj}}", + "albums_default_sort_order": "DefaÅ­lta vicordigo en albumoj", + "albums_default_sort_order_description": "Metodo por vicordigi elementojn defaÅ­lte uzata en nova albumo.", + "albums_feature_description": "Kolektoj de elementoj, kiujn vi povas dividi kun aliaj uzantoj.", + "albums_on_device_count": "Albumoj ĉe la aparato ({count})", + "albums_selected": "{count, plural, one {# albumo elektita} other {# albumoj elektitaj}}", + "all": "Ĉiuj", + "all_albums": "Ĉiuj albumoj", + "all_people": "Ĉiuj homoj", + "all_photos": "Ĉiuj fotoj", + "all_videos": "Ĉiuj videoj", + "allow_dark_mode": "Permesi malhelan reĝimon", + "allow_edits": "Permesi redaktojn", + "allow_public_user_to_download": "Permesu, ke publikano elŝutu el la albumo", + "allow_public_user_to_upload": "Permesu, ke publikano alŝutu al la albumo", + "allowed": "Permesita", + "alt_text_qr_code": "Bildo de QR-kodo", + "always_keep": "Ĉiam konservi", + "always_keep_photos_hint": "La funkcio 'Liberigi spacon' konservos ĉiujn fotojn en tiu ĉi aparato.", + "always_keep_videos_hint": "La funkcio 'Liberigi spacon\" konservos ĉiujn videojn en tiu ĉi aparato.", + "anti_clockwise": "KontraÅ­-horloĝdirekte", + "api_key": "API-ŝlosilo", + "api_key_description": "Tio ĉi montriĝos nur unufoje. Certiĝu, ke vi kopiis ĝin antaÅ­ ol fermi la fenestron.", + "api_key_empty": "La nomo de via API-ŝlosilo ne devus esti malplena", + "api_keys": "API-ŝlosiloj", + "app_architecture_variant": "Varianto (arkitekturo)", + "app_bar_signout_dialog_content": "Ĉu vi certas, ke vi volas elsaluti?", + "app_bar_signout_dialog_ok": "Jes", + "app_bar_signout_dialog_title": "Elsaluti", + "app_download_links": "Ligiloj por elŝuti la apon", + "app_settings": "Agordoj pri apo", + "app_stores": "Ap-vendejoj", + "app_update_available": "Ĝisdatigo de apo disponeblas", + "appears_in": "Aperas en", + "apply_count": "Apliki ({count, number})", + "archive": "ArÄĨivo", + "archive_action_prompt": "{count} aldonita(j) al arÄĨivo", + "archive_or_unarchive_photo": "EnarÄĨivigi aÅ­ elarÄĨivigi foton", + "archive_page_no_archived_assets": "Neniuj elementoj trovitaj en arÄĨivo", + "archive_page_title": "ArÄĨivo ({count})", + "archive_size": "Grandeco de arÄĨivo", + "archive_size_description": "Agordu la grandecon de arÄĨivaj dosieroj por elŝuti (en GiB)", + "archived": "EnarÄĨivigita(j)", + "archived_count": "{count, plural, one {# enarÄĨivigita} other {# enarÄĨivigitaj}}", + "are_these_the_same_person": "Ĉu la sama homo?", + "are_you_sure_to_do_this": "Ĉu vi certas, ke vi volas fari tion?", + "array_field_not_fully_supported": "Tablaj kampoj postulas permanan redakton de JSON", + "asset_action_delete_err_read_only": "Ne eblas forigi nurlegajn elementojn, ili estos lasitaj senŝanĝaj", + "asset_action_share_err_offline": "Ne eblis repreni nekonektitajn elementojn, ili estos ignoritaj", + "asset_added_to_album": "Aldonita al albumo", + "asset_adding_to_album": "Aldonas al albumoâ€Ļ", + "asset_created": "Elemento kreita", + "asset_description_updated": "Priskribo de elemento ĝisdatigita", + "asset_filename_is_offline": "Elemento {filename} estas nedisponebla", + "asset_has_unassigned_faces": "Elemento enhavas nekonatajn vizaĝojn", + "asset_hashing": "Haketadoâ€Ļ", + "asset_list_group_by_sub_title": "Grupigi laÅ­", + "asset_list_layout_settings_dynamic_layout_title": "Dinamika enpaĝigo", + "asset_list_layout_settings_group_automatically": "AÅ­tomata", + "asset_list_layout_settings_group_by": "Ĝrupigi elementojn laÅ­", + "asset_list_layout_settings_group_by_month_day": "Monato + tago", + "asset_list_layout_sub_title": "Enpaĝigo", + "asset_list_settings_subtitle": "Agordoj pri enpaĝigo", + "asset_list_settings_title": "Krado de fotoj", + "asset_not_found_on_device_android": "Elemento ne trovita en aparato", + "asset_not_found_on_device_ios": "Elemento ne trovita en aparato. Se vi uzas iCloud, povus esti ke la kopio ĉe iCloud estas rompita", + "asset_not_found_on_icloud": "Elemento ne trovita en iCloud. Povus esti, ke la kopio ĉe iCloud estas rompita", + "asset_offline": "Elemento nedisponebla", + "asset_offline_description": "Ne eblis trovi tiun eksteran elementon. Kontaktu la administranton de via Immich por helpo pri tio.", + "asset_restored_successfully": "Elemento sukcese riparita", + "asset_skipped": "Preterlasita(j)", + "asset_skipped_in_trash": "En rubujo", + "asset_trashed": "Elemento enrubujigita", + "asset_troubleshoot": "Problemsolvi pri elemento", + "asset_uploaded": "Alŝutita(j)", + "asset_uploading": "Alŝutadoâ€Ļ", "asset_viewer_settings_subtitle": "Administri agordojn pri vidilo de galerioj", + "asset_viewer_settings_title": "Montrilo de elemento", + "assets": "Elementoj", + "assets_added_count": "Sukcese aldonis {count, plural, one {# elementon} other {# elementojn}}", + "assets_added_to_album_count": "Sukcese aldonis {count, plural, one {# elementon} other {# elementojn}} al la albumo", + "assets_added_to_albums_count": "Sukcese aldonis {assetTotal, plural, one {# elementon} other {# elementojn}} al {albumTotal, plural, one {# albumo} other {# albumoj}}", + "assets_cannot_be_added_to_album_count": "Ne eblis aldoni {count, plural, one {tiun elementon} other {tiujn elementojn}} al la albumo", + "assets_cannot_be_added_to_albums": "Ne eblis aldoni {count, plural, one {tiun elementon} other {tiujn elementojn}} al iu ajn el la albumoj", + "assets_count": "{count, plural, one {# elemento} other {# elementoj}}", + "assets_deleted_permanently": "{count} elemento(j) porĉiam forigita(j)", + "assets_deleted_permanently_from_server": "{count} elemento(j) porĉiam forigita(j) de la Immich-servilo", + "assets_downloaded_failed": "{count, plural, one {Elŝutis # dosieron - dosiero {error} malsukcesis} other {Elŝutis # dosierojn - dosieroj {error} malsukcesis}}", + "assets_downloaded_successfully": "{count, plural, one {Sukcese elŝutis # dosieron} other {Sukcese elŝutis # dosierojn}}", + "assets_moved_to_trash_count": "Movis {count, plural, one {# elementon} other {# elementojn}} al la rubujo", + "assets_permanently_deleted_count": "Porĉiam forigis {count, plural, one {# elementon} other {# elementojn}}", + "assets_removed_count": "Forigis {count, plural, one {# elementon} other {# elementojn}}", + "assets_removed_permanently_from_device": "{count} elemento(j) porĉiam forigita(j) de via aparato", + "assets_restore_confirmation": "Ĉu vi certas, ke vi volas restaÅ­ri ĉion el la rubujo? Ne eblos poste malfari tion. Notu, ke ne eblas tiel restaÅ­ri eksterretajn elementojn.", + "assets_restored_count": "Sukcese restaÅ­ris {count, plural, one {# elementon} other {# elementojn}}", + "assets_restored_successfully": "{count} elemento(j) sukcese restaÅ­rita(j)", + "assets_trashed": "{count} elemento(j) enrubujigita(j)", + "assets_trashed_count": "Sukcese enrubujigis {count, plural, one {# elementon} other {# elementojn}}", + "assets_trashed_from_server": "{count} elemento(j) forigitaj de la immich-servilo", + "assets_were_part_of_album_count": "{count, plural, one {# Tiu elemento} other {# Tiuj elementoj}} jam estis en la albumo", + "assets_were_part_of_albums_count": "{count, plural, one {# Tiu elemento} other {# Tiuj elementoj}} jam estis en la albumoj", + "authorized_devices": "Aprobitaj aparatoj", + "automatic_endpoint_switching_subtitle": "Konekti per elektita vifio kiam eblas, kaj alikaze uzi aliajn alirojn", + "automatic_endpoint_switching_title": "AÅ­tomata ŝanĝo de URL", + "autoplay_slideshow": "AÅ­tomate vidigi bildserion", + "back": "MalantaÅ­en", + "back_close_deselect": "MalantaÅ­en, fermi, aÅ­ malelekti", + "background_backup_running_error": "Sekurkopiado jam estas fone okazanta, do ne eblas nun lanĉi alian sekurkopiadon", + "background_location_permission": "Rajtigo fone uzi geografian lokon", + "background_location_permission_content": "Por ŝanĝi retaliron dum fona funkciado, Immich devas *ĉiam* havi atingorajton al lokiga informo, por povi legi nomojn de vifiaj retoj", + "background_options": "Agordoj pri fonaj funkcioj", + "backup": "Sekurkopio", + "backup_album_selection_page_albums_device": "Albumoj en la aparato ({count})", + "backup_album_selection_page_albums_tap": "Tuŝeti por inkluzivi, duoble tuŝeti por ekskludi", + "backup_album_selection_page_assets_scatter": "Foje elementoj troviĝas disÄĩetitaj al pluraj albumoj, do albumoj povas esti inkluzivitaj aÅ­ ekskluzivitaj de la savkopiado.", + "backup_album_selection_page_select_albums": "Elekti albumojn", + "backup_album_selection_page_selection_info": "Info pri la elektitaÄĩoj", + "backup_album_selection_page_total_assets": "Nombro da unikaj elementoj", + "backup_albums_sync": "Sinkronigo de la savkopioj de albumoj", + "backup_all": "Ĉiuj", + "backup_background_service_backup_failed_message": "Malsukcesis krei savkopion de tiuj elementoj. Reprovanteâ€Ļ", + "backup_background_service_complete_notification": "Savkopiado finita", + "backup_background_service_connection_failed_message": "Malsukcesis konektiĝi al la servilo. Reprovanteâ€Ļ", + "backup_background_service_current_upload_notification": "Alŝutiĝas {filename}", + "backup_background_service_default_notification": "Serĉas novajn elementojnâ€Ļ", + "backup_background_service_error_title": "Eraro de savkopiado", + "backup_background_service_in_progress_notification": "Kreado de savkopio de viaj elementojâ€Ļ", + "backup_background_service_upload_failure_notification": "Malsukcesis alŝuti {filename}", + "backup_controller_page_albums": "Savkopiado de albumoj", + "backup_controller_page_background_app_refresh_disabled_content": "Por aktivigi la fonan savkopiadon, ŝaltu fonan aktualigon de la apo en Agordoj > Ĝeneralaj > Fona aktualigo de apo.", + "backup_controller_page_background_app_refresh_disabled_title": "Fona aktualigo de apo malŝaltita", + "backup_controller_page_background_app_refresh_enable_button_text": "Iri al Agordoj", + "backup_controller_page_background_battery_info_link": "Montri al mi", + "backup_controller_page_background_battery_info_message": "Por bona funkciado de la fona savkopiado, bonvolu malŝalti optimumigon de bateria uzo por Immich.\n\nTiu funkcio dependas de via aparato, do vi devos mem serĉi helpon pri kiel atingi tion.", + "backup_controller_page_background_battery_info_ok": "Okej", + "backup_controller_page_background_battery_info_title": "Optimumigo de bateria uzo", + "backup_controller_page_background_charging": "Nur dum ŝargado", + "backup_controller_page_background_configure_error": "Malsukcesis agordi la fonan servon", + "backup_controller_page_background_delay": "Prokrasti savkopiadon de novaj elementoj: {duration}", + "backup_controller_page_background_description": "Ŝaltu la fonan servon por aÅ­tomate krei savkopion de novaj elementoj sen malfermi la apon", + "backup_controller_page_background_is_off": "AÅ­tomata fona savkopiado estas malŝaltita", + "backup_controller_page_background_is_on": "AÅ­tomata fona savkopiado estas ŝaltita", + "backup_controller_page_background_turn_off": "Malŝalti fonan servon", + "backup_controller_page_background_turn_on": "Ŝalti fonan servon", + "backup_controller_page_background_wifi": "Nur per vifio", + "backup_controller_page_backup": "Savkopiado", + "backup_controller_page_backup_selected": "Elektita(j): ", + "backup_controller_page_backup_sub": "Fotoj kaj videoj kun jama savkopio", + "backup_controller_page_created": "Kreita(j) je: {date}", + "backup_controller_page_desc_backup": "Ŝaltu malfonan savkopiadon por aÅ­tomate alŝuti novajn elementojn al la servilo kiam la apo estas malfermita.", + "backup_controller_page_excluded": "Ekskluzivita(j): ", + "backup_controller_page_failed": "Malsukcesis ({count})", + "backup_controller_page_filename": "Dosiernomo: {filename} [{size}]", + "backup_controller_page_id": "ID: {id}", + "backup_controller_page_info": "Informoj pri savkopio", + "backup_controller_page_none_selected": "Neniuj elektitaj", + "backup_controller_page_remainder": "Restas", + "backup_controller_page_remainder_sub": "Fotoj kaj videoj ankoraÅ­ ne savkopiitaj el la elektitaj", + "backup_controller_page_server_storage": "Stokado ĉe servilo", + "backup_controller_page_start_backup": "Komenci savkopiadon", + "backup_controller_page_status_off": "AÅ­tomata malfona savkopiado estas malŝaltita", + "backup_controller_page_status_on": "AÅ­tomata malfona savkopiado estas ŝaltita", + "backup_controller_page_storage_format": "{used} el {total} uzita", + "backup_controller_page_to_backup": "Albumoj savkopiotaj", + "backup_controller_page_total_sub": "Ĉiuj unikaj fotoj kaj videoj el elektitaj albumoj", + "backup_controller_page_turn_off": "Malŝalti malfonan savkopiadon", + "backup_controller_page_turn_on": "Ŝalti malfonan savkopiadon", "backup_setting_subtitle": "Administri agordojn pri fona kaj malfona alŝutado", "backup_settings_subtitle": "Administri agordojn pri alŝutado", "cleanup_icloud_shared_albums_excluded": "Dividitaj albumoj ĉe iCloud estas ekskluditaj de la analizado", @@ -453,11 +692,14 @@ "exclusion_pattern": "Skemo de ekskludo", "explore": "Esplori", "explorer": "Foliumilo", + "general": "Ĝeneralaj", "manage_media_access_settings": "Malfermi agordaÄĩaron", "manage_the_app_settings": "Agordi la apon", "missing": "Netraktitaj", "networking_subtitle": "Administri agordojn pri finpunktoj de la servilo", + "no_devices": "Neniuj aprobitaj aparatoj", "no_explore_results_message": "Alŝutu pli da fotoj por esplori vian kolekton.", + "no_results_description": "Provu sinonimon aÅ­ pli ĝeneralan ŝlosilvorton", "preferences_settings_subtitle": "Administri agordojn pri la apo", "purchase_settings_server_activated": "La administranto respondecas pri la ŝlosilo de aÅ­tentikeco por la servilo", "refresh": "Denove", diff --git a/i18n/es.json b/i18n/es.json index 49e58e3beb..fe82e3a093 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "Copia en un lugar externo, en la nube u otra ubicaciÃŗn física.", "backup_onboarding_2_description": "copias locales en diferentes dispositivos. Incluye los archivos principales y una copia de seguridad local de dichos archivos.", "backup_onboarding_3_description": "copias totales de tu data, incluyendo los archivos originales. Incluye 1 copia fuera de sitio y 2 copias locales.", - "backup_onboarding_description": "Una estrategia de copia de seguridad 3-2-1 es recomendada para proteger tu data. Deberías mantener tanto copias de tus fotos/videos subidos como de la base de datos de Immich para tener una soluciÃŗn de copia de seguridad integral.", + "backup_onboarding_description": "Se recomienda una estrategia de copia de seguridad 3-2-1 para proteger tus datos. Deberías mantener copias de las fotos y vídeos que subas, así como de la base de datos de Immich, para contar con una soluciÃŗn de copia de seguridad completa.", "backup_onboarding_footer": "Para obtener mÃĄs informaciÃŗn sobre cÃŗmo hacer una copia de seguridad de Immich, consulta la documentaciÃŗn.", "backup_onboarding_parts_title": "Una copia de seguridad 3-2-1 incluye:", "backup_onboarding_title": "Copias de seguridad", @@ -351,7 +351,7 @@ "template_settings": "Plantillas de notificaciÃŗn", "template_settings_description": "Gestione plantillas personalizadas para las notificaciones", "theme_custom_css_settings": "CSS personalizado", - "theme_custom_css_settings_description": "El CSS permite personalizar el diseÃąo de Immich.", + "theme_custom_css_settings_description": "Las Hojas de Estilo permiten personalizar el diseÃąo de Immich.", "theme_settings": "Ajustes del tema", "theme_settings_description": "Gestionar la personalizaciÃŗn de la interfaz web de Immich", "thumbnail_generation_job": "Generar miniaturas", @@ -372,7 +372,7 @@ "transcoding_audio_codec": "Codec de audio", "transcoding_audio_codec_description": "Opus es la opciÃŗn de mayor calidad, pero tiene menor compatibilidad con dispositivos o software antiguos.", "transcoding_bitrate_description": "Vídeos con una tasa de bits superior a la mÃĄxima o que no estÃĄn en un formato aceptado", - "transcoding_codecs_learn_more": "Para obtener mÃĄs informaciÃŗn sobre la terminología utilizada aquí, consulte la documentaciÃŗn de FFmpeg sobre los codecs H.264, HEVC y VP9.", + "transcoding_codecs_learn_more": "Para obtener mÃĄs informaciÃŗn sobre la terminología utilizada aquí, consulte la documentaciÃŗn de FFmpeg sobre el cÃŗdec H.264, el cÃŗdec HEVC y el cÃŗdec VP9.", "transcoding_constant_quality_mode": "Modo de calidad constante", "transcoding_constant_quality_mode_description": "ICQ es mejor que CQP, pero algunos dispositivos de aceleraciÃŗn de hardware no admiten este modo. Al configurar esta opciÃŗn, se preferirÃĄ el modo especificado cuando se utilice codificaciÃŗn basada en calidad. NVENC lo ignora porque no es compatible con ICQ.", "transcoding_constant_rate_factor": "Factor de tasa constante (-crf)", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapeo de tonos", "transcoding_tone_mapping_description": "Intenta preservar la apariencia de los videos HDR cuando se convierten a SDR. Cada algoritmo realiza diferentes compensaciones en cuanto a color, detalle y brillo. Hable conserva los detalles, Mobius conserva el color y Reinhard conserva el brillo.", "transcoding_transcode_policy": "Políticas de transcodificaciÃŗn", - "transcoding_transcode_policy_description": "Política sobre cuÃĄndo se debe transcodificar un vídeo. Los vídeos HDR siempre se transcodificarÃĄn (excepto si la transcodificaciÃŗn estÃĄ desactivada).", + "transcoding_transcode_policy_description": "Política sobre cuÃĄndo se debe transcodificar un vídeo. Los vídeos HDR y vídeos con un formato de píxel diferente a YUV 4:2:0 siempre se transcodificarÃĄn (excepto si la transcodificaciÃŗn estÃĄ desactivada).", "transcoding_two_pass_encoding": "CodificaciÃŗn en dos pasadas", "transcoding_two_pass_encoding_setting_description": "Transcodifica en dos pasadas para producir vídeos mejor codificados. Cuando la velocidad de bits mÃĄxima estÃĄ habilitada (es necesaria para que funcione con H.264 y HEVC), este modo utiliza un rango de velocidad de bits basado en la velocidad de bits mÃĄxima e ignora CRF. Para VP9, se puede utilizar CRF si la tasa de bits mÃĄxima estÃĄ deshabilitada.", "transcoding_video_codec": "CÃŗdecs de video", @@ -459,7 +459,7 @@ "advanced_settings_log_level_title": "Nivel de registro: {level}", "advanced_settings_prefer_remote_subtitle": "Algunos dispositivos tardan mucho en cargar las miniaturas desde los recursos locales. Activa esta opciÃŗn para cargar imÃĄgenes remotas en su lugar.", "advanced_settings_prefer_remote_title": "Preferir imÃĄgenes remotas", - "advanced_settings_proxy_headers_subtitle": "Configura encabezados HTTP que Immich incluirÃĄ en cada peticiÃŗn de red", + "advanced_settings_proxy_headers_subtitle": "Configura encabezados de proxy que Immich incluirÃĄ en cada peticiÃŗn de red", "advanced_settings_proxy_headers_title": "Cabeceras proxy personalizadas [EXPERIMENTAL]", "advanced_settings_readonly_mode_subtitle": "Habilita el modo de solo lectura donde las fotografías sÃŗlo pueden ser vistas, funciones como seleccionar mÃēltiples imÃĄgenes, compartir, transmitir, eliminar son deshabilitadas. Habilita/Deshabilita solo lectura vía el avatar del usuario en la pantalla principal", "advanced_settings_readonly_mode_title": "Modo solo lectura", @@ -872,7 +872,7 @@ "current_server_address": "DirecciÃŗn actual del servidor", "custom_date": "Fecha personalizada", "custom_locale": "ConfiguraciÃŗn regional personalizada", - "custom_locale_description": "Formatear fechas y nÃēmeros segÃēn el idioma y la regiÃŗn", + "custom_locale_description": "Dar formato a fechas, horas y nÃēmeros segÃēn el idioma y regiÃŗn seleccionados", "custom_url": "URL personalizada", "cutoff_date_description": "Conserva fotos del Ãēltimoâ€Ļ", "cutoff_day": "{count, plural, one {día} other {días}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Conteo de datos EXIF", "deduplication_info": "InformaciÃŗn de DeduplicaciÃŗn", "deduplication_info_description": "Para automÃĄticamente preseleccionar recursos y eliminar duplicados en conjunto, nosotros consideramos lo siguiente:", - "default_locale": "ConfiguraciÃŗn regional predeterminada", - "default_locale_description": "Formatee fechas y nÃēmeros segÃēn la configuraciÃŗn regional de su navegador", "delete": "Eliminar", "delete_action_confirmation_message": "ÂŋEstÃĄ seguro que desea eliminar este recurso? Esta acciÃŗn lo moverÃĄ a la papelera del servidor y le preguntarÃĄ si desea eliminarlo localmente", "delete_action_prompt": "{count} eliminados", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "EdiciÃŗn aplicada con Êxito", "editor_flip_horizontal": "Girar horizontalmente", "editor_flip_vertical": "Girar verticalmente", + "editor_handle_corner": "{corner, select, top_left {Superior izquierda} top_right {Superior derecha} bottom_left {Inferior izquierda} bottom_right {Inferior derecha} other {Un}} controlador de esquina", + "editor_handle_edge": "{edge, select, top {Superior} bottom {Inferior} left {Izquierdo} right {Derecho} other {Un}} controlador de borde", "editor_orientation": "OrientaciÃŗn", "editor_reset_all_changes": "Restablecer cambios", "editor_rotate_left": "Rotar 90Âē sentido antihorario", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "Error al actualizar el estado de la notificaciÃŗn", "incorrect_email_or_password": "ContraseÃąa o email incorrecto", "library_folder_already_exists": "Esta ruta de importaciÃŗn ya existe.", + "page_not_found": "PÃĄgina no encontrada", "paths_validation_failed": "FallÃŗ la validaciÃŗn en {paths, plural, one {# carpeta} other {# carpetas}}", "profile_picture_transparent_pixels": "Las imÃĄgenes de perfil no pueden tener píxeles transparentes. Por favor amplíe y/o mueva la imagen.", "quota_higher_than_disk_size": "Se ha establecido una cuota superior al tamaÃąo del disco", @@ -1218,6 +1219,7 @@ "filter_description": "Condiciones para filtrar los recursos objetivo", "filter_people": "Filtrar personas", "filter_places": "Filtrar lugares", + "filter_tags": "Filtrar etiquetas", "filters": "Filtros", "find_them_fast": "EncuÊntrelos rÃĄpidamente por nombre con la bÃēsqueda", "first": "Primero", @@ -1649,6 +1651,7 @@ "only_favorites": "Solo favoritos", "open": "Abierto", "open_calendar": "Abrir calendario", + "open_in_browser": "Abrir en el navegador", "open_in_map_view": "Abrir en la vista del mapa", "open_in_openstreetmap": "Abrir en OpenStreetMap", "open_the_search_filters": "Abre los filtros de bÃēsqueda", @@ -1808,9 +1811,8 @@ "rate_asset": "Valorar recurso", "rating": "ValoraciÃŗn", "rating_clear": "Borrar calificaciÃŗn", - "rating_count": "{count, plural, one {# estrella} other {# estrellas}}", + "rating_count": "{count, plural, =0 {# estrella} one {# estrella} other {# estrellas}}", "rating_description": "Mostrar la clasificaciÃŗn exif en el panel de informaciÃŗn", - "rating_set": "CalificaciÃŗn establecida en {rating, plural, one {# estrella} other {# estrellas}}", "reaction_options": "Opciones de reacciÃŗn", "read_changelog": "Leer registro de cambios", "readonly_mode_disabled": "Modo solo lectura deshabilitado", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "CÃŗdigo PIN restablecido correctamente", "reset_pin_code_with_password": "Siempre puedes restablecer tu cÃŗdigo PIN usando tu contraseÃąa", "reset_sqlite": "Restablecer la base de datos SQLite", - "reset_sqlite_confirmation": "ÂŋEstÃĄs seguro que deseas restablecer la base de datos SQLite? DeberÃĄs cerrar sesiÃŗn y volver a iniciarla para resincronizar los datos", + "reset_sqlite_clear_app_data": "Limpiar datos", + "reset_sqlite_confirmation": "ÂŋSeguro que quieres borrar los datos de la aplicaciÃŗn? Esto eliminarÃĄ toda la configuraciÃŗn y cerrarÃĄ tu sesiÃŗn.", + "reset_sqlite_confirmation_note": "Nota: DeberÃĄs reiniciar la aplicaciÃŗn despuÊs de borrarla.", + "reset_sqlite_done": "Se han borrado los datos de la aplicaciÃŗn. Reinicie Immich y vuelva a iniciar sesiÃŗn.", "reset_sqlite_success": "Restablecer exitosamente la base de datos SQLite", "reset_to_default": "Restablecer los valores predeterminados", "resolution": "ResoluciÃŗn", @@ -1910,6 +1915,7 @@ "saved_settings": "Configuraciones guardadas", "say_something": "Comenta algo", "scaffold_body_error_occurred": "Ha ocurrido un error", + "scaffold_body_error_unrecoverable": "Se ha producido un error irrecuperable. Comparte el error y el seguimiento de la pila en Discord o GitHub para que podamos ayudarte. Si se indica, puedes borrar los datos de la aplicaciÃŗn a continuaciÃŗn.", "scan": "Escanear", "scan_all_libraries": "Escanear todas las bibliotecas", "scan_library": "Escanear", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "Buscar por OCR", "search_filter_people_title": "Seleccionar personas", "search_filter_star_rating": "ClasificaciÃŗn de estrellas", + "search_filter_tags_title": "Seleccionar etiquetas", "search_for": "Buscar", "search_for_existing_person": "Buscar persona existente", "search_no_more_result": "No hay mÃĄs resultados", @@ -2024,6 +2031,9 @@ "set_profile_picture": "Establecer foto de perfil", "set_slideshow_to_fullscreen": "Mostrar diapositivas en pantalla completa", "set_stack_primary_asset": "Establecer como recurso principal", + "setting_image_navigation_enable_subtitle": "Si estÃĄ habilitado, puedes navegar a la imagen anterior/siguiente tocando una cuarta parte mÃĄs a la izquierda/derecha de la pantalla.", + "setting_image_navigation_enable_title": "Toca para navegar", + "setting_image_navigation_title": "NavegaciÃŗn de imÃĄgenes", "setting_image_viewer_help": "El visor de detalles carga primero la miniatura pequeÃąa, luego carga la vista previa de tamaÃąo mediano (si estÃĄ habilitada), finalmente carga la original (si estÃĄ habilitada).", "setting_image_viewer_original_subtitle": "Activar para cargar la imagen en resoluciÃŗn original (ÂĄmuy grande!). Deshabilitar para reducir el consumo de datos (de red y cachÊ).", "setting_image_viewer_original_title": "Cargar imagen original", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} desapilado(s)", "unstacked_assets_count": "Desapilado(s) {count, plural, one {# recurso} other {# recursos}}", "unsupported_field_type": "Tipo de campo no soportado", + "unsupported_file_type": "El archivo {file} no puede ser cargado porque su tipo de archivo {type} no es soportado.", "untagged": "Sin etiqueta", "untitled_workflow": "Flujo de trabajo sin título", "up_next": "A continuaciÃŗn", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "Uso", "use_biometric": "Uso biomÊtrico", + "use_browser_locale": "Utilizar la localizaciÃŗn del navegador", + "use_browser_locale_description": "Dar formato a fechas, horas y nÃēmeros segÃēn la localizaciÃŗn de su navegador", "use_current_connection": "Utilice la conexiÃŗn actual", "use_custom_date_range": "Usa un intervalo de fechas personalizado", "user": "Usuario", @@ -2353,7 +2366,7 @@ "variables": "Variables", "version": "VersiÃŗn", "version_announcement_closing": "Tu amigo, Alex", - "version_announcement_message": "ÂĄHola! Hay una nueva versiÃŗn de Immich disponible. TÃŗmese un tiempo para leer las notas de la versiÃŗn para asegurarse de que su configuraciÃŗn estÊ actualizada y evitar errores de configuraciÃŗn, especialmente si utiliza WatchTower o cualquier mecanismo que se encargue de actualizar su instancia de Immich automÃĄticamente.", + "version_announcement_message": "ÂĄHola! Hay una nueva versiÃŗn de Immich disponible. TÃŗmese un tiempo para leer las notas de la versiÃŗn para asegurarse de que su configuraciÃŗn estÊ actualizada y evitar errores de configuraciÃŗn, especialmente si utiliza WatchTower o cualquier mecanismo que se encargue de actualizar su instancia de Immich automÃĄticamente.", "version_history": "Historial de versiones", "version_history_item": "Instalada {version} el {date}", "video": "Vídeo", diff --git a/i18n/et.json b/i18n/et.json index 7b85dcfda6..f2726add15 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -5,7 +5,7 @@ "acknowledge": "Sain aru", "action": "Tegevus", "action_common_update": "Uuenda", - "action_description": "Komplekt tegevusi, mida teostada filtreeritud Ãŧksustega", + "action_description": "Tegevused, mida teostada filtreeritud Ãŧksustega", "actions": "Tegevused", "active": "Aktiivne", "active_count": "Aktiivsed: {count}", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Toonivastendus", "transcoding_tone_mapping_description": "Üritab säilitada HDR videote kvaliteeti SDR-iks teisendamisel. Iga algoritm teeb värvi, detailide ja ereduse osas erinevaid kompromisse. Hable säilitab detaile, Mobius säilitab värve ning Reinhard säilitab eredust.", "transcoding_transcode_policy": "Transkodeerimise reegel", - "transcoding_transcode_policy_description": "Reegel, millal tuleks videot transkodeerida. HDR-videosid transkodeeritakse alati (v.a. kui transkodeerimine on keelatud).", + "transcoding_transcode_policy_description": "Reegel, millal tuleks videot transkodeerida. HDR-videod ja muu piksliformaadiga kui YUV 4:2:0 videod transkodeeritakse alati (v.a. kui transkodeerimine on keelatud).", "transcoding_two_pass_encoding": "Kahekäiguline kodeerimine", "transcoding_two_pass_encoding_setting_description": "Transkodeeri kahes osas, et parandada kodeeritud videote kvaliteeti. Maksimaalse bitisageduse puhul (mis on vajalik H.264 ja HEVC jaoks) kasutab see reÅžiim bitisageduse vahemikku ja ignoreerib CRF-i. VP9 puhul saab kasutada CRF-i, kui maksimaalset bitisagedust pole määratud.", "transcoding_video_codec": "Videokoodek", @@ -872,7 +872,7 @@ "current_server_address": "Praegune serveri aadress", "custom_date": "Muu kuupäev", "custom_locale": "Kohandatud lokaat", - "custom_locale_description": "Vorminda kuupäevad ja arvud vastavalt keelele ja regioonile", + "custom_locale_description": "Vorminda kuupäevad, kellaajad ja arvud vastavalt valitud keelele ja regioonile", "custom_url": "Kohandatud URL", "cutoff_date_description": "Jäta alles fotod ja videod viimasestâ€Ļ", "cutoff_day": "{count, plural, one {päev} other {päeva}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "EXIF andmete hulk", "deduplication_info": "Dedubleerimise info", "deduplication_info_description": "Üksuste automaatsel eelvalimisel ja duplikaatide eemaldamisel vÃĩetakse arvesse:", - "default_locale": "Vaikimisi lokaat", - "default_locale_description": "Vorminda kuupäevad ja numbrid vastavalt brauseri lokaadile", "delete": "Kustuta", "delete_action_confirmation_message": "Kas oled kindel, et soovid selle Ãŧksuse kustutada? See toiming liigutab Ãŧksuse serveri prÃŧgikasti ja kÃŧsib, kas soovid selle lokaalselt kustutada", "delete_action_prompt": "{count} kustutatud", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "Muudatused edukalt rakendatud", "editor_flip_horizontal": "Peegelda horisontaalselt", "editor_flip_vertical": "Peegelda vertikaalselt", + "editor_handle_corner": "{corner, select, top_left {Vasak Ãŧlemine nurk} top_right {Parem Ãŧlemine nurk} bottom_left {Vasak alumine nurk} bottom_right {Parem alumine nurk} other {Nurk}}", + "editor_handle_edge": "{edge, select, top {Ülemine serv} bottom {Alumine serv} left {Vasak serv} right {Parem serv} other {Serv}}", "editor_orientation": "Orientatsioon", "editor_reset_all_changes": "TÃŧhista muudatused", "editor_rotate_left": "PÃļÃļra 90° vastupäeva", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "Teavituste seisundi uuendamine ebaÃĩnnestus", "incorrect_email_or_password": "Vale e-posti aadress vÃĩi parool", "library_folder_already_exists": "See imporditee on juba olemas.", + "page_not_found": "LehekÃŧlge ei leitud", "paths_validation_failed": "{paths, plural, one {# tee} other {# teed}} ei valideerunud", "profile_picture_transparent_pixels": "Profiilipildis ei tohi olla läbipaistvaid piksleid. Palun suumi sisse ja/vÃĩi liiguta pilti.", "quota_higher_than_disk_size": "Määratud kvoot on suurem kui kettamaht", @@ -1218,6 +1219,7 @@ "filter_description": "Tingimused, mille alusel Ãŧksuseid filtreerida", "filter_people": "Filtreeri isikuid", "filter_places": "Filtreeri kohti", + "filter_tags": "Filtreeri silte", "filters": "Filtrid", "find_them_fast": "Leia teda kiiresti nime järgi otsides", "first": "Esimene", @@ -1649,6 +1651,7 @@ "only_favorites": "Ainult lemmikud", "open": "Ava", "open_calendar": "Ava kalender", + "open_in_browser": "Ava brauseris", "open_in_map_view": "Ava kaardi vaates", "open_in_openstreetmap": "Ava OpenStreetMap", "open_the_search_filters": "Ava otsingufiltrid", @@ -1808,9 +1811,8 @@ "rate_asset": "Hinda Ãŧksust", "rating": "Hinnang", "rating_clear": "TÃŧhjenda hinnang", - "rating_count": "{count, plural, one {# tärn} other {# tärni}}", + "rating_count": "{count, plural, =0 {Hindamata} one {# tärn} other {# tärni}}", "rating_description": "Kuva infopaneelis EXIF hinnangut", - "rating_set": "Hinnanguks seatud {rating, plural, one {# tärn} other {# tärni}}", "reaction_options": "Reaktsiooni valikud", "read_changelog": "Vaata muudatuste Ãŧlevaadet", "readonly_mode_disabled": "KirjutuskaitsereÅžiim välja lÃŧlitatud", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "PIN-kood edukalt lähtestatud", "reset_pin_code_with_password": "Saad oma PIN-koodi alati oma parooli abil lähtestada", "reset_sqlite": "Lähtesta SQLite andmebaas", - "reset_sqlite_confirmation": "Kas oled kindel, et soovid SQLite andmebaasi lähtestada? Andmete uuesti sÃŧnkroonimiseks pead välja ja jälle sisse logima", + "reset_sqlite_clear_app_data": "Kustuta andmed", + "reset_sqlite_confirmation": "Kas oled kindel, et soovid rakenduse andmed kustutada? See eemaldab kÃĩik seaded ja logib su välja.", + "reset_sqlite_confirmation_note": "Märkus: Pärast kustutamist pead rakenduse taasavama.", + "reset_sqlite_done": "Rakenduse andmed kustutatud. Taaskäivita Immich ja logi uuesti sisse.", "reset_sqlite_success": "SQLite andmebaas edukalt lähtestatud", "reset_to_default": "Lähtesta", "resolution": "Resolutsioon", @@ -1910,6 +1915,7 @@ "saved_settings": "Seaded salvestatud", "say_something": "Ütle midagi", "scaffold_body_error_occurred": "Tekkis viga", + "scaffold_body_error_unrecoverable": "Esines parandumatu viga. Palun jaga viga ja pinujälge Discord'is vÃĩi GitHub'is, et saaksime aidata. Kui seda soovitatakse, saad allpool rakenduse andmed kustutada.", "scan": "Otsi", "scan_all_libraries": "Skaneeri kÃĩik kogud", "scan_library": "Skaneeri", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "Otsi OCR-i abil", "search_filter_people_title": "Vali isikud", "search_filter_star_rating": "Hinnang", + "search_filter_tags_title": "Vali sildid", "search_for": "Otsi", "search_for_existing_person": "Otsi olemasolevat isikut", "search_no_more_result": "Rohkem vasteid pole", @@ -2024,6 +2031,9 @@ "set_profile_picture": "Sea profiilipilt", "set_slideshow_to_fullscreen": "Kuva slaidiesitlus täisekraanil", "set_stack_primary_asset": "Sea peamiseks Ãŧksuseks", + "setting_image_navigation_enable_subtitle": "Kui lubatud, saad liikuda eelmise/järgmise pildi juurde ekraani vasakut/paremat serva puudutades.", + "setting_image_navigation_enable_title": "Puudutusega navigeerimine", + "setting_image_navigation_title": "Piltide navigeerimine", "setting_image_viewer_help": "Detailivaatur laadib kÃĩigepealt väikese pisipildi, seejärel keskmises mÃĩÃĩdus eelvaate (kui lubatud) ja lÃĩpuks originaalpildi (kui lubatud).", "setting_image_viewer_original_subtitle": "LÃŧlita sisse, et laadida algne täisresolutsiooniga pilt (suur!). LÃŧlita välja, et vähendada andmekasutust (nii vÃĩrgu kui seadme puhvri).", "setting_image_viewer_original_title": "Laadi algne pilt", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} eraldatud", "unstacked_assets_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} eraldatud", "unsupported_field_type": "Mittetoetatud välja tÃŧÃŧp", + "unsupported_file_type": "Faili {file} ei saa Ãŧles laadida, kuna selle tÃŧÃŧp {type} ei ole toetatud.", "untagged": "Sildistamata", "untitled_workflow": "Pealkirjata tÃļÃļvoog", "up_next": "Järgmine", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "Kasutus", "use_biometric": "Kasuta biomeetriat", + "use_browser_locale": "Kasuta brauseri lokaati", + "use_browser_locale_description": "Vorminda kuupäevad, kellaajad ja arvud vastavalt brauseri lokaadile", "use_current_connection": "Kasuta praegust Ãŧhendust", "use_custom_date_range": "Kasuta kohandatud kuupäevavahemikku", "user": "Kasutaja", diff --git a/i18n/eu.json b/i18n/eu.json index b335f837ca..04443a14f8 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -14,6 +14,9 @@ "add_a_location": "Kokapena gehitu", "add_a_name": "Izena gehitu", "add_a_title": "Izenburua gehitu", + "add_action": "Ekintza gehitu", + "add_action_description": "Egin klik gauzatu beharreko ekintza bat gehitzeko", + "add_assets": "Aktiboak gehitu", "add_birthday": "Urtebetetzea gehitu", "add_endpoint": "Endpoint-a gehitu", "add_exclusion_pattern": "Bazterketa eredua gehitu", diff --git a/i18n/fi.json b/i18n/fi.json index 425e7a719e..084540324a 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -3,9 +3,10 @@ "account": "Tili", "account_settings": "Tilin asetukset", "acknowledge": "Hyväksy", - "action": "Toiminta", + "action": "Toiminto", "action_common_update": "Päivitä", - "actions": "Toimintoja", + "action_description": "Lista toimista, jotka toteutetaan suodatettuun sisältÃļÃļn", + "actions": "Toiminnot", "active": "Aktiivinen", "active_count": "Aktiivisia: {count}", "activity": "Tapahtumat", @@ -17,6 +18,7 @@ "add_a_title": "Lisää otsikko", "add_action": "Lisää toiminto", "add_action_description": "Klikkaa lisätäksesi suoritettava toiminto", + "add_assets": "Lisää sisältÃļä", "add_birthday": "Lisää syntymäpäivä", "add_endpoint": "Lisää päätepiste", "add_exclusion_pattern": "Lisää poissulkemismalli", @@ -47,7 +49,7 @@ "admin": { "add_exclusion_pattern_description": "Lisää mallit, jonka mukaan jätetään tiedostoja pois. Jokerimerkit *, ** ja ? ovat tuettuna. Jättääksesi pois kaikki tiedostot mistä tahansa lÃļytyvästä kansiosta \"Raw\" käytä \"**/Raw/**\". Jättääksesi pois kaikki \". tif\" päätteiset tiedot, käytä \"**/*.tif\". Jättääksesi pois tarkan tiedostopolun, käytä \"/path/to/ignore/**\".", "admin_user": "Ylläpitäjä", - "asset_offline_description": "Ulkoista kirjaston resurssia ei enää lÃļydy levyltä, ja se on siirretty roskakoriin. Jos tiedosto siirrettiin kirjaston sisällä, tarkista aikajanaltasi uusi vastaava resurssi. Palauttaaksesi tämän resurssin, varmista, että alla oleva tiedostopolku on Immichin käytettävissä ja skannaa kirjasto uudelleen.", + "asset_offline_description": "Ulkoista kirjaston kohdetta ei enää lÃļydy levyltä, ja se on siirretty roskakoriin. Jos tiedosto siirrettiin kirjaston sisällä, tarkista aikajanaltasi uusi vastaava kohde. Palauttaaksesi tämän kohteen, varmista, että alla oleva tiedostopolku on Immichin käytettävissä ja skannaa kirjasto uudelleen.", "authentication_settings": "Autentikointiasetukset", "authentication_settings_description": "Hallitse salasana-, OAuth- ja muut autentikoinnin asetukset", "authentication_settings_disable_all": "Haluatko varmasti poistaa kaikki kirjautumistavat käytÃļstä? Kirjautuminen on tämän jälkeen mahdotonta.", @@ -99,10 +101,11 @@ "image_prefer_embedded_preview_setting_description": "Käytä RAW-kuviin upotettuja esikatseluja kuvankäsittelyn syÃļtteenä ja aina kun mahdollista. Tämä voi tarjota tarkempia värejä joillekin kuville, mutta esikatselun laatu riippuu kamerasta ja kuvassa voi olla enemmän pakkausartefakteja.", "image_prefer_wide_gamut": "Suosi laajaa väriskaalaa", "image_prefer_wide_gamut_setting_description": "Käytä Display P3 -nimiavaruutta pikkukuville. Tämä säilÃļÃļ värien vivahteet paremmin, mutta kuvat saattavat näyttää erilaisilta vanhemmissa laitteissa. sRGB-kuvat pidetään muuttumattomina, jottei värit muuttuisi.", - "image_preview_description": "Keskikokoinen kuva, josta metatiedot on poistettu, käytetään yksittäisen resurssin katseluun ja koneoppimiseen", + "image_preview_description": "Keskikokoinen kuva, josta metatiedot on poistettu, käytetään yksittäisen kohteen katseluun ja koneoppimiseen", "image_preview_quality_description": "Esikatselulaatu 1-100. Korkeampi arvo on parempi, mutta tuottaa suurempia tiedostoja ja voi heikentää sovelluksen reagointikykyä. Matalan arvon asettaminen voi vaikuttaa koneoppimisen laatuun.", "image_preview_title": "Esikatselun asetukset", "image_progressive": "Progressiivinen", + "image_progressive_description": "Prosessoi JPEG-kuvat progressiivisesti asteittaista näyttämistä varten. Tällä ei ole vaikutusta WebP-kuviin.", "image_quality": "Laatu", "image_resolution": "Resoluutio", "image_resolution_description": "Korkeammat resoluutiot voivat säilyttää enemmän yksityiskohtia, mutta niiden koodaus kestää kauemmin, tiedostokoot ovat suurempia ja ne voivat heikentää sovelluksen reagointikykyä.", @@ -269,7 +272,7 @@ "oauth_auto_register": "Automaattinen rekisterÃļinti", "oauth_auto_register_description": "RekisterÃļi uudet OAuth:lla kirjautuvat käyttäjät automaattisesti", "oauth_button_text": "Painikkeen teksti", - "oauth_client_secret_description": "Vaaditaan, jos OAuth-palveluntarjoaja ei tue PKCE:tä (Proof Key for Code Exchange)", + "oauth_client_secret_description": "Vaaditaan luottamukselliselle asiakasohjelmalle, tai jos julkinen asiakasohjelma ei tue PKCE:tä (Proof Key for Code Exchange).", "oauth_enable_description": "Kirjaudu käyttäen OAuthia", "oauth_mobile_redirect_uri": "Mobiilin uudelleenohjaus-URI", "oauth_mobile_redirect_uri_override": "Ohita mobiilin uudelleenohjaus-URI", @@ -308,7 +311,7 @@ "search_jobs": "Etsi tehtäviäâ€Ļ", "send_welcome_email": "Lähetä tervetuloviesti", "server_external_domain_settings": "Ulkoinen osoite", - "server_external_domain_settings_description": "Osoite julkisille linkeille, http(s):// mukaan lukien", + "server_external_domain_settings_description": "Osoite ulkopuolisille linkeille", "server_public_users": "Julkiset käyttäjät", "server_public_users_description": "Kaikki käyttäjät (nimi ja sähkÃļpostiosoite) luetellaan, kun käyttäjä lisätään jaettuihin albumeihin. Kun toiminto on poistettu käytÃļstä, käyttäjäluettelo on vain pääkäyttäjien käytettävissä.", "server_settings": "Palvelimen asetukset", @@ -327,8 +330,8 @@ "storage_template_hash_verification_enabled": "Tarkistussumman varmennus käytÃļssä", "storage_template_hash_verification_enabled_description": "Ottaa käyttÃļÃļn tarkistussummien laskennan. Älä poista käytÃļstä, ellet ole aivan varma seurauksista", "storage_template_migration": "Tallennustilan mallien migraatio", - "storage_template_migration_description": "Käytä nykyistä {template}a aikaisemmin lähetettyihin kohteisiin", - "storage_template_migration_info": "Tallennusmalli muuntaa kaikki tiedostopäätteet pieniksi kirjaimiksi. Mallipohjan muutokset koskevat vain uusia resursseja. Jos haluat käyttää mallipohjaa takautuvasti aiemmin ladattuihin resursseihin, suorita {job}.", + "storage_template_migration_description": "Käytä nykyistä {template} aikaisemmin lähetettyihin kohteisiin", + "storage_template_migration_info": "Tallennusmalli muuntaa kaikki tiedostopäätteet pieniksi kirjaimiksi. Mallipohjan muutokset koskevat vain uusia kohteita. Jos haluat käyttää mallipohjaa takautuvasti aiemmin ladattuihin kohteisiin, suorita {job}.", "storage_template_migration_job": "Tallennustilan mallin muutostyÃļ", "storage_template_more_details": "Saadaksesi lisätietoa tästä ominaisuudesta, katso Tallennustilan Mallit sekä mihin se vaikuttaa", "storage_template_onboarding_description_v2": "Päälle kytkettynä toiminto järjestelee tiedostot automaattisesti käyttäjän määrittämän mallin mukaisesti. Lisätietoja dokumentaatiosta..", @@ -348,7 +351,7 @@ "template_settings": "Ilmoitusmallit", "template_settings_description": "Hallitse yksilÃļllisten ilmoitusten malleja", "theme_custom_css_settings": "Mukautettu CSS", - "theme_custom_css_settings_description": "Mukauta Immichin ulkoasua CSS:llä.", + "theme_custom_css_settings_description": "Cascading Style Sheets mahdollistaa Immichin ulkoasun mukauttamisen.", "theme_settings": "Teeman asetukset", "theme_settings_description": "Kustomoi Immichin web-käyttÃļliittymää", "thumbnail_generation_job": "Luo pikkukuvat", @@ -408,7 +411,7 @@ "transcoding_tone_mapping": "Sävykartoitus", "transcoding_tone_mapping_description": "Pyrkii säilÃļmään HDR-kuvien ulkonäÃļn, kun muunnetaan peruskuvaksi. Jokaisella algoritmilla on omat heikkoutensa värien, yksityiskohtien tai kirkkauksien kesken. Hable säilÃļÃļ yksityiskohdat, Mobius värit ja Reinhard kirkkaudet.", "transcoding_transcode_policy": "TranskoodauskäytäntÃļ", - "transcoding_transcode_policy_description": "KäytäntÃļ, miten video tulisi transkoodata. HDR-videot transkoodataan aina, paitsi jos transkoodaus on poistettu käytÃļstä.", + "transcoding_transcode_policy_description": "KäytäntÃļ, miten video tulisi transkoodata. HDR-videot ja videot, joissa pikselimuoto on jokin muu kuin YUV 4:2:0, transkoodataan aina, paitsi jos transkoodaus on poistettu käytÃļstä.", "transcoding_two_pass_encoding": "Two-pass enkoodaus", "transcoding_two_pass_encoding_setting_description": "Transkoodaa kahdessa vaiheessa tuottaaksesi paremmin koodattuja videoita. Kun maksimibittinopeus on käytÃļssä (vaaditaan H.264- ja HEVC-koodaukselle), tämä tila käyttää bittinopeusaluetta, joka perustuu maksimibittinopeuteen ja ohittaa CRF. VP9 osalta CRF:ää voidaan käyttää, jos maksimibittinopeus on poistettu käytÃļstä.", "transcoding_video_codec": "Videokoodekki", @@ -492,6 +495,7 @@ "album_summary": "Albumi tiivistelmä", "album_updated": "Albumi päivitetty", "album_updated_setting_description": "Saa sähkÃļpostia kun jaetussa albumissa on uutta sisältÃļä", + "album_upload_assets": "Lataa kohteet tietokoneelta ja lisää ne albumiin", "album_user_left": "Poistuttiin albumista {album}", "album_user_removed": "{user} poistettu", "album_viewer_appbar_delete_confirm": "Haluatko varmasti poistaa tämän albumin tililtäsi?", @@ -568,8 +572,11 @@ "asset_list_layout_sub_title": "Asettelu", "asset_list_settings_subtitle": "Kuvaruudukon asettelu", "asset_list_settings_title": "Kuvaruudukko", + "asset_not_found_on_device_android": "Kohdetta ei lÃļytynyt laitteelta", + "asset_not_found_on_device_ios": "Kohdetta ei lÃļytynyt laitteelta. Jos käytät iCloudia, voi kohde olla käyttämättÃļmissä iCloudiin tallennetun viallisen tiedoston vuoksi", + "asset_not_found_on_icloud": "Kohdetta ei lÃļytynyt iCloudista. Kohde voi olla käyttämättÃļmissä iCloudiin tallennetun viallisen tiedoston vuoksi", "asset_offline": "Aineisto offline-tilassa", - "asset_offline_description": "Tätä ulkoista resurssia ei enää lÃļydy levyltä. Ole hyvä ja ota yhteyttä Immich-järjestelmänvalvojaan saadaksesi apua.", + "asset_offline_description": "Tätä ulkoista kohdetta ei enää lÃļydy levyltä. Ole hyvä ja ota yhteyttä Immich-järjestelmänvalvojaan saadaksesi apua.", "asset_restored_successfully": "Kohde palautettu onnistuneesti", "asset_skipped": "Ohitettu", "asset_skipped_in_trash": "Roskakorissa", @@ -656,7 +663,7 @@ "backup_controller_page_filename": "Tiedostonimi: {filename} [{size}]", "backup_controller_page_id": "ID: {id}", "backup_controller_page_info": "Varmuuskopioinnin tiedot", - "backup_controller_page_none_selected": "Ei mitään", + "backup_controller_page_none_selected": "Ei mitään valittuna", "backup_controller_page_remainder": "Jäljellä", "backup_controller_page_remainder_sub": "Varmuuskopiointia odottavat kuvat ja videot", "backup_controller_page_server_storage": "Palvelimen tallennustila", @@ -757,9 +764,13 @@ "cleanup_deleted_assets": "Siirretty {count} kohdetta laitteen roskakoriin", "cleanup_deleting": "Siirretään roskakoriin...", "cleanup_found_assets": "LÃļytyi {count} varmuuskopioitua kohdetta", + "cleanup_found_assets_with_size": "LÃļytyi {count} varmuuskopioitua kohdetta ({size})", "cleanup_icloud_shared_albums_excluded": "Jaettuja iCloud-albumeja ei skannata", - "cleanup_no_assets_found": "Ehtojasi vastaavia varmuuskopioituja kohteita ei lÃļytynyt", + "cleanup_no_assets_found": "Kriteerejä vastaavia kohteita ei lÃļytynyt. Levytilan vapautus voi poistaa vain kohteita, jotka on varmuuskopioitu palvelimelle", "cleanup_preview_title": "Poistettavia kohteita {count}", + "cleanup_step3_description": "Etsi tallennettua sisältÃļä joka vastaa valittua päivämäärää ja pidä asetukset.", + "cleanup_step4_summary": "{count} kohdetta (luotu ennen {date}) poistetaan paikalliselta laitteeltasi. Kuvat pysyvät saatavilla Immich-sovelluksessa.", + "cleanup_trash_hint": "Vapauttaaksesi tallennustilan kokonaan, avaa järjestelmän galleria-sovellus ja tyhjennä roskakori", "clear": "Tyhjennä", "clear_all": "Tyhjennä kaikki", "clear_all_recent_searches": "Tyhjennä viimeisimmät haut", @@ -771,6 +782,8 @@ "client_cert_import": "Tuo", "client_cert_import_success_msg": "Asiakasvarmenne tuotu", "client_cert_invalid_msg": "Virheellinen varmennetiedosto tai väärä salasana", + "client_cert_password_message": "SyÃļtä salasana tälle sertifikaatille", + "client_cert_password_title": "Sertifikaatin salasana", "client_cert_remove_msg": "Asiakassertifikaatti on poistettu", "client_cert_subtitle": "Vain PKCS12 (.p12, .pfx) -muotoa tuetaan. Varmenteen tuonti/poisto on käytettävissä vain ennen sisäänkirjautumista", "client_cert_title": "SSL-asiakassertifikaatti [KOKEELLINEN]", @@ -781,6 +794,11 @@ "color": "Väri", "color_theme": "Väriteema", "command": "Komento", + "command_palette_prompt": "LÃļydä nopeasti sivuja, toimintoja tai komentoja", + "command_palette_to_close": "sulkea", + "command_palette_to_navigate": "syÃļttää", + "command_palette_to_select": "valita", + "command_palette_to_show_all": "näyttää kaikki", "comment_deleted": "Kommentti poistettu", "comment_options": "Kommentin valinnat", "comments_and_likes": "Kommentit ja tykkäykset", @@ -846,15 +864,19 @@ "creating_linked_albums": "Luodaan linkattuja albumeita...", "crop": "Rajaa", "crop_aspect_ratio_fixed": "Kiinteä", + "crop_aspect_ratio_free": "Vapaa", "crop_aspect_ratio_original": "Alkuperäinen", "curated_object_page_title": "Asiat", "current_device": "Nykyinen laite", "current_pin_code": "Nykyinen PIN-koodi", "current_server_address": "Nykyinen palvelinosoite", "custom_date": "Mukautettu päivä", - "custom_locale": "Muokatut maa-asetukset", - "custom_locale_description": "Muotoile päivämäärät ja numerot perustuen alueen kieleen", + "custom_locale": "Mukautettu alueasetus", + "custom_locale_description": "Muotoile päivämäärät, kellonajat ja numerot valitun kielen ja alueen mukaan", "custom_url": "Mukautettu URL", + "cutoff_date_description": "Säilytä kuvat viimeisimmältäâ€Ļ", + "cutoff_day": "{count, plural, one {päivä} other {päivää}}", + "cutoff_year": "{count, plural, one {vuosi} other {vuotta}}", "daily_title_text_date": "E, dd MMM", "daily_title_text_date_year": "E, dd MMM, yyyy", "dark": "Tumma", @@ -873,8 +895,6 @@ "deduplication_criteria_2": "EXIF-datan määrä", "deduplication_info": "Deduplikaatiotieto", "deduplication_info_description": "Jotta voimme automaattisesti esivalita aineistot ja poistaa kaksoiskappaleet suurina erinä, tarkastelemme:", - "default_locale": "Oletuskieliasetus", - "default_locale_description": "Muotoile päivämäärät ja numerot selaimesi kielen mukaan", "delete": "Poista", "delete_action_confirmation_message": "Haluatko varmasti poistaa tämän aineiston? Tämä toiminto siirtää aineiston palvelimen roskakoriin ja kysyy, haluatko poistaa sen myÃļs paikallisesti", "delete_action_prompt": "{count} poistettu", @@ -980,6 +1000,11 @@ "editor_close_without_save_prompt": "Muutoksia ei tallenneta", "editor_close_without_save_title": "Suljetaanko editori?", "editor_confirm_reset_all_changes": "Haluatko varmasti nollata kaikki muutokset?", + "editor_discard_edits_confirm": "Hylkää muutokset", + "editor_discard_edits_prompt": "Sinulla on tallentamattomia muutoksia. Haluatko varmasti hylätä ne?", + "editor_discard_edits_title": "Hylkää muutokset?", + "editor_edits_applied_error": "Muutosten käyttÃļÃļnotto epäonnistui", + "editor_edits_applied_success": "Muutokset otettu käyttÃļÃļn", "editor_flip_horizontal": "Käännä vaakatasossa", "editor_flip_vertical": "Käännä pystytasossa", "editor_orientation": "Suunta", @@ -1007,9 +1032,11 @@ "error_loading_albums": "Virhe albumeita ladatessa", "error_loading_image": "Kuvan lataus ei onnistunut", "error_loading_partners": "Ongelma partnerin haussa: {error}", + "error_retrieving_asset_information": "Virhe kohdetietojen hakemisessa", "error_saving_image": "Virhe: {error}", "error_tag_face_bounding_box": "Kasvojen merkitseminen epäonnistui – rajausruudun koordinaatteja ei lÃļydy", "error_title": "Virhe - Jotain meni pieleen", + "error_while_navigating": "Virhe siirryttäessä kohteeseen", "errors": { "cannot_navigate_next_asset": "Seuraavaan mediaan ei voi siirtyä", "cannot_navigate_previous_asset": "Edelliseen mediaan ei voi siirtyä", @@ -1045,6 +1072,7 @@ "failed_to_update_notification_status": "Ilmoituksen tilan päivittäminen epäonnistui", "incorrect_email_or_password": "Väärä sähkÃļpostiosoite tai salasana", "library_folder_already_exists": "Tämä tuonnin polku on jo olemassa.", + "page_not_found": "Sivua ei lÃļytynyt", "paths_validation_failed": "{paths, plural, one {# polun} other {# polun}} validointi epäonnistui", "profile_picture_transparent_pixels": "Profiilikuvassa ei voi olla läpinäkyviä pikseleitä. Zoomaa lähemmäs ja/tai siirrä kuvaa.", "quota_higher_than_disk_size": "Asettamasi kiintiÃļ on suurempi kuin levyn koko", @@ -1118,6 +1146,7 @@ "unable_to_scan_library": "Kirjaston skannaaminen epäonnistui", "unable_to_set_feature_photo": "Ei voida asettaa ominaiskuvaa", "unable_to_set_profile_picture": "Profiilikuvan asetus epäonnistui", + "unable_to_set_rating": "Luokitusta ei voida asettaa", "unable_to_submit_job": "TyÃļtä ei voitu lähettää", "unable_to_trash_asset": "Median siirto roskakoriin epäonnistui", "unable_to_unlink_account": "Tunnuksen irroitus epäonnistui", @@ -1143,6 +1172,7 @@ "exif_bottom_sheet_people": "IHMISET", "exif_bottom_sheet_person_add_person": "Lisää nimi", "exit_slideshow": "Poistu diaesityksestä", + "expand": "Laajenna", "expand_all": "Laajenna kaikki", "experimental_settings_new_asset_list_subtitle": "TyÃļn alla", "experimental_settings_new_asset_list_title": "Ota käyttÃļÃļn kokeellinen kuvaruudukko", @@ -1178,12 +1208,16 @@ "features_in_development": "Kehityksessä olevat ominaisuudet", "features_setting_description": "Hallitse sovelluksen ominaisuuksia", "file_name_or_extension": "Tiedostonimi tai tiedostopääte", + "file_name_text": "Tiedoston nimi", + "file_name_with_value": "Tiedoston nimi: {file_name}", "file_size": "Tiedostokoko", "filename": "Tiedostonimi", "filetype": "Tiedostotyyppi", "filter": "Suodatin", + "filter_description": "Tavoitekohteiden suodatusehdot", "filter_people": "Suodata henkilÃļt", "filter_places": "Suodata paikkoja", + "filter_tags": "Suodatintunnisteet", "filters": "Suodattimet", "find_them_fast": "LÃļydä nopeasti hakemalla nimellä", "first": "Ensimmäinen", @@ -1194,12 +1228,16 @@ "folders_feature_description": "Käytetään kansionäkymää valokuvien ja videoiden selaamiseen järjestelmässä", "forgot_pin_code_question": "Unohditko PIN-koodisi?", "forward": "Eteenpäin", + "free_up_space": "Vapauta tilaa", + "free_up_space_description": "Siirrä varmuuskopioidut valokuvat ja videot laitteen roskakoriin vapauttaaksesi tilaa. Palvelimella olevat kopiosi säilyvät turvassa.", + "free_up_space_settings_subtitle": "Vapauta laitteen tilaa", "full_path": "Koko polku: {path}", "gcast_enabled": "Google Cast", - "gcast_enabled_description": "Ominaisuus lataa ulkoisia resursseja Googlelta toimiakseen.", + "gcast_enabled_description": "Ominaisuus lataa ulkoisia kohteita Googlelta toimiakseen.", "general": "Yleinen", "geolocation_instruction_location": "Napsauta kuvaa, jossa on GPS-koordinaatit, käyttääksesi sen sijaintia, tai valitse sijainti suoraan kartalta", "get_help": "Hae apua", + "get_people_error": "Virhe haettaessa henkilÃļitä", "get_wifiname_error": "Wi-Fi-verkon nimen hakeminen epäonnistui. Varmista, että olet myÃļntänyt tarvittavat käyttÃļoikeudet ja että olet yhteydessä Wi-Fi-verkkoon", "getting_started": "Aloittaminen", "go_back": "Palaa", @@ -1309,6 +1347,7 @@ "json_error": "JSON-virhe", "keep": "Säilytä", "keep_albums": "Säilytä albumit", + "keep_albums_count": "Säilytetään {count} {count, plural, one {albumi} other {albumia}}", "keep_all": "Säilytä kaikki", "keep_description": "Valitse, mitä laitteella säilytetään tilan vapautuksen yhteydessä.", "keep_favorites": "Säilytä suosikit", @@ -1357,6 +1396,7 @@ "local": "Paikallinen", "local_asset_cast_failed": "Kohdetta, joka ei ole ladattuna palvelimelle, ei voida striimata", "local_assets": "Paikalliset kohteet", + "local_id": "Paikallinen ID", "local_media_summary": "Paikallisen median yhteenveto", "local_network": "Lähiverkko", "local_network_sheet_info": "Sovellus muodostaa yhteyden palvelimeen tämän URL-osoitteen kautta, kun käytetään määritettyä Wi-Fi-verkkoa", @@ -1416,11 +1456,15 @@ "maintenance_restore_from_backup": "Palauta varmuuskopiosta", "maintenance_restore_library": "Palauta kirjastosta", "maintenance_restore_library_confirm": "Jos tämä vaikuttaa oikealta, jatka varmuuskopion palauttamista!", + "maintenance_restore_library_description": "Tietokannan palauttaminen", + "maintenance_restore_library_folder_has_files": "{folder} sisältää {count, plural, one {kansion} other {kansiota}}", + "maintenance_restore_library_folder_no_files": "Kansiosta {folder} puuttuu tiedostoja!", "maintenance_restore_library_folder_pass": "luettavissa ja kirjoitettavissa", "maintenance_restore_library_folder_read_fail": "ei luettavissa", "maintenance_restore_library_folder_write_fail": "ei kirjoitettavissa", "maintenance_restore_library_hint_missing_files": "Sinulta saattaa puuttua tärkeitä tiedostoja", "maintenance_restore_library_hint_regenerate_later": "Voit luoda ne uudelleen myÃļhemmin asetuksissa", + "maintenance_restore_library_hint_storage_template_missing_files": "KäytätkÃļ tallennusmallia? Sinulta saattaa puuttua tiedostoja", "maintenance_restore_library_loading": "Ladataan eheystarkistuksia ja heurestiikkaaâ€Ļ", "maintenance_task_backup": "Luodaan varmuuskopiota olemassa olevasta tietokannastaâ€Ļ", "maintenance_task_migrations": "Suoritetaan tietokantamigraatioitaâ€Ļ", @@ -1487,6 +1531,8 @@ "minimize": "Pienennä", "minute": "Minuutti", "minutes": "Minuutit", + "mirror_horizontal": "Vaakasuora", + "mirror_vertical": "Pystysuora", "missing": "Puuttuvat", "mobile_app": "Mobiilisovellus", "mobile_app_download_onboarding_note": "Lataa mobiilisovellus käyttämällä seuraavia vaihtoehtoja", @@ -1495,11 +1541,14 @@ "monthly_title_text_date_format": "MMMM y", "more": "Enemmän", "move": "Siirrä", + "move_down": "Siirrä alas", "move_off_locked_folder": "Siirrä pois lukitusta kansiosta", "move_to": "Siirrä kohteeseen", + "move_to_device_trash": "Siirrä laitteen roskakoriin", "move_to_lock_folder_action_prompt": "{count} lisätty lukittuun kansioon", "move_to_locked_folder": "Siirrä lukittuun kansioon", "move_to_locked_folder_confirmation": "Nämä kuvat ja videot poistetaan kaikista albumeista, ja ne ovat nähtävissä vain lukitussa kansiossa", + "move_up": "Siirrä ylÃļs", "moved_to_archive": "Siirretty {count, plural, one {# kohde} other {# kohdetta}} arkistoon", "moved_to_library": "Siirretty {count, plural, one {# kohde} other {# kohdetta}} kirjastoon", "moved_to_trash": "Siirretty roskakoriin", @@ -1545,9 +1594,10 @@ "no_cast_devices_found": "Cast-laitteita ei lÃļytynyt", "no_checksum_local": "Ei tarkistussummaa - paikallista sisältÃļä ei voida hakea", "no_checksum_remote": "Ei tarkistussummaa - etänä olevaa sisältÃļä ei voida hakea", + "no_configuration_needed": "Konfiguraatiota ei tarvita", "no_devices": "Ei valtuutettuja laitteita", "no_duplicates_found": "Kaksoiskappaleita ei lÃļytynyt.", - "no_exif_info_available": "EXIF-tietoa ei saatavilla", + "no_exif_info_available": "Exif-tietoja ei ole saatavilla", "no_explore_results_message": "Lataa lisää kuvia tutkiaksesi kokoelmaasi.", "no_favorites_message": "Lisää suosikkeja lÃļytääksesi nopeasti parhaat kuvasi ja videosi", "no_filters_added": "Suodattimia ei ole vielä lisätty", @@ -1564,6 +1614,7 @@ "no_results_description": "Kokeile synonyymiä tai yleisempää avainsanaa", "no_shared_albums_message": "Luo albumi, jotta voit jakaa kuvia ja videoita toisille", "no_uploads_in_progress": "Ei käynnissä olevia latauksia", + "none": "Ei mitään", "not_allowed": "Ei sallittu", "not_available": "N/A", "not_in_any_album": "Ei yhdessäkään albumissa", @@ -1597,6 +1648,8 @@ "online": "Online", "only_favorites": "Vain suosikit", "open": "Avaa", + "open_calendar": "Avaa kalenteri", + "open_in_browser": "Avaa selaimessa", "open_in_map_view": "Avaa karttanäkymässä", "open_in_openstreetmap": "Avaa OpenStreetMapissa", "open_the_search_filters": "Avaa hakusuodattimet", @@ -1645,6 +1698,7 @@ "people": "Ihmiset", "people_edits_count": "Muokattu {count, plural, one {# henkilÃļ} other {# henkilÃļä}}", "people_feature_description": "Selataan valokuvia ja videoita, jotka on ryhmitelty henkilÃļiden mukaan", + "people_selected": "{count, plural, one {# henkilÃļ valittu} other {# henkilÃļä valittu}}", "people_sidebar_description": "Näytä linkki HenkilÃļihin sivupalkissa", "permanent_deletion_warning": "Pysyvän poiston varoitus", "permanent_deletion_warning_setting_description": "Näytä varoitus, kun poistat kohteita pysyvästi", @@ -1752,10 +1806,11 @@ "purchase_settings_server_activated": "Palvelimen tuoteavainta hallinnoi ylläpitäjä", "query_asset_id": "Kysy sisällÃļn ID:tä", "queue_status": "Jonossa {count}/{total}", - "rating": "Tähtiarvostelu", - "rating_clear": "Tyhjennä arvostelu", - "rating_count": "{count, plural, one {# tähti} other {# tähteä}}", - "rating_description": "Näytä EXIF-arvosana lisätietopaneelissa", + "rate_asset": "Luokittele kohde", + "rating": "Tähtiluokitus", + "rating_clear": "Tyhjennä luokitus", + "rating_count": "{count, plural, =0 {Ei arvioitu} one {# tähti} other {# tähteä}}", + "rating_description": "Näytä EXIF-luokitus tietopaneelissa", "reaction_options": "Reaktioasetukset", "read_changelog": "Lue muutosloki", "readonly_mode_disabled": "Muokkaustila päällä", @@ -1827,7 +1882,10 @@ "reset_pin_code_success": "PIN-koodi nollattu onnistuneesti", "reset_pin_code_with_password": "Voit aina nollata PIN-koodisi salasanan avulla", "reset_sqlite": "Nollaa SQLite Tietokanta", - "reset_sqlite_confirmation": "Haluatko varmasti nollata SQLite tietokannan? Sinun tulee kirjautua sovelluksesta ulos ja takaisin sisään uudelleensynkronoidaksesi datan", + "reset_sqlite_clear_app_data": "Tyhjennä tiedot", + "reset_sqlite_confirmation": "Haluatko varmasti poistaa sovelluksen tiedot? Tämä poistaa kaikki asetukset ja kirjaa sinut ulos.", + "reset_sqlite_confirmation_note": "Huomaa: Sinun on käynnistettävä sovellus uudelleen tyhjentämisen jälkeen.", + "reset_sqlite_done": "Sovelluksen tiedot on tyhjennetty. Käynnistä Immich uudelleen ja kirjaudu sisään uudelleen.", "reset_sqlite_success": "SQLite Tietokanta nollattu onnistuneesti", "reset_to_default": "Palauta oletusasetukset", "resolution": "Resoluutio", @@ -1855,9 +1913,12 @@ "saved_settings": "Asetukset tallennettu", "say_something": "Sano jotain", "scaffold_body_error_occurred": "Tapahtui virhe", + "scaffold_body_error_unrecoverable": "Korjaamaton virhe on tapahtunut. Jaa virhe ja pinojälki Discordissa tai GitHubissa, jotta voimme auttaa. Pyydettäessä voit tyhjentää sovelluksen tiedot alla.", + "scan": "Skannaa", "scan_all_libraries": "Skannaa kaikki kirjastot", "scan_library": "Skannaa", "scan_settings": "Skannausasetukset", + "scanning": "Skannataan", "scanning_for_album": "Etsitään albumia...", "search": "Haku", "search_albums": "Etsi albumeita", @@ -1887,6 +1948,8 @@ "search_filter_media_type_title": "Valitse mediatyyppi", "search_filter_ocr": "Hae tekstintunnistuksella (OCR)", "search_filter_people_title": "Valitse ihmiset", + "search_filter_star_rating": "Tähtiluokitus", + "search_filter_tags_title": "Valitse tunnisteita", "search_for": "Hae", "search_for_existing_person": "Etsi olemassa olevaa henkilÃļä", "search_no_more_result": "Ei enää tuloksia", @@ -1928,12 +1991,15 @@ "select_all_duplicates": "Valitse kaikki kaksoiskappaleet", "select_all_in": "Valitse kaikki {group}", "select_avatar_color": "Valitse avatarin väri", + "select_count": "{count, plural, one {Valitse #} other {Valitse #}}", + "select_cutoff_date": "Valitse katkaisuajankohta", "select_face": "Valitse kasvo", "select_featured_photo": "Valitse esittelykuva", "select_from_computer": "Valitse koneeltasi", "select_keep_all": "Valitse pidä kaikki", "select_library_owner": "Valitse kirjaston omistaja", "select_new_face": "Valitse uudet kasvot", + "select_people": "Valitse henkilÃļitä", "select_person": "Valitse henkilÃļ", "select_person_to_tag": "Valitse henkilÃļ, jonka haluat merkitä", "select_photos": "Valitse kuvat", @@ -1963,6 +2029,9 @@ "set_profile_picture": "Aseta profiilikuva", "set_slideshow_to_fullscreen": "Näytä diaesitys koko ruudulla", "set_stack_primary_asset": "Aseta pääkohteeksi", + "setting_image_navigation_enable_subtitle": "Jos tämä toiminto on käytÃļssä, voit siirtyä edelliseen/seuraavaan kuvaan napauttamalla näytÃļn vasenta/oikeaa reunaa.", + "setting_image_navigation_enable_title": "Napauta navigoidaksesi", + "setting_image_navigation_title": "Kuvien selaus", "setting_image_viewer_help": "Kuvaa katseltaessa ensin ladataan pikkukuva, sitten keskilaatuinen pikkukuva (jos käytÃļssä) ja lopuksi alkuperäinen (jos käytÃļssä).", "setting_image_viewer_original_subtitle": "Ota käyttÃļÃļn ladataksesi alkuperäinen täysitarkkuuksinen kuva (suuri!). Poista käytÃļstä vähentääksesi datan käyttÃļä (sekä verkossa että laitteen välimuistissa).", "setting_image_viewer_original_title": "Lataa alkuperäinen kuva", @@ -2026,7 +2095,7 @@ "shared_link_edit_expire_after_option_year": "{count} vuosi", "shared_link_edit_password_hint": "SyÃļtä jaon salasana", "shared_link_edit_submit_button": "Päivitä linkki", - "shared_link_error_server_url_fetch": "Palvelimen URL-osoitetta ei voitu hakea", + "shared_link_error_server_url_fetch": "Palvelimen url-osoitetta ei voitu hakea", "shared_link_expires_day": "Vanhenee {count} päivässä", "shared_link_expires_days": "Vanhenee {count} päivässä", "shared_link_expires_hour": "Vanhenee {count} tunnissa", @@ -2129,6 +2198,7 @@ "support": "Tuki", "support_and_feedback": "Tuki ja palaute", "support_third_party_description": "Immich-asennuksesi on pakattu kolmannen osapuolen toimesta. Kohtaamasi ongelmat saattavat johtua tästä paketista, joten ilmoita niistä ensisijaisesti heille alla olevien linkkien kautta.", + "supporter": "Tukija", "swap_merge_direction": "Käännä yhdistämissuunta", "sync": "Synkronoi", "sync_albums": "Synkronoi albumit", @@ -2142,7 +2212,7 @@ "tag_assets": "Lisää tunnisteita", "tag_created": "Luotu tunniste: {tag}", "tag_feature_description": "Selaa valokuvia ja videoita, jotka on ryhmitelty loogisten tunnisteotsikoiden mukaan", - "tag_not_found_question": "EtkÃļ lÃļydä tunnistetta? Luo uusi tunniste ", + "tag_not_found_question": "EtkÃļ lÃļydä tunnistetta? Luo uusi tunniste.", "tag_people": "Merkitse henkilÃļ tunnisteella", "tag_updated": "Päivitetty tunniste: {tag}", "tagged_assets": "Tunnistettu {count, plural, one {# kohde} other {# kohdetta}}", @@ -2166,6 +2236,7 @@ "theme_setting_theme_subtitle": "Valitse sovelluksen teema-asetukset", "theme_setting_three_stage_loading_subtitle": "Kolmivaiheinen lataus saattaa parantaa lataustehoa, mutta aiheuttaa huomattavasti suuremman verkon kuormituksen", "theme_setting_three_stage_loading_title": "Ota kolmivaiheinen lataus käyttÃļÃļn", + "then": "Sitten", "they_will_be_merged_together": "Nämä tullaan yhdistämään", "third_party_resources": "Kolmannen osapuolen resurssit", "time": "Aika", @@ -2201,6 +2272,8 @@ "trash_page_title": "Roskakori ({count})", "trashed_items_will_be_permanently_deleted_after": "Roskakorin kohteet poistetaan pysyvästi {days, plural, one {# päivän} other {# päivän}} päästä.", "trigger": "Laukaisin", + "trigger_asset_uploaded": "Kohde ladattu", + "trigger_asset_uploaded_description": "Käynnistyy, kun uusi kohde ladataan", "trigger_description": "TyÃļnkulun aloittava tapahtuma", "trigger_person_recognized": "HenkilÃļ tunnistettu", "trigger_person_recognized_description": "Laukaistaan kun henkilÃļ tunnistetaan", @@ -2237,6 +2310,7 @@ "unstack_action_prompt": "{count} purettu pinosta", "unstacked_assets_count": "Poistettu pinosta {count, plural, one {# kohde} other {# kohdetta}}", "unsupported_field_type": "Ei-tuettu kentän tyyppi", + "unsupported_file_type": "Tiedostoa {file} ei voi ladata, koska sen tiedostotyyppi {type} ei ole tuettu.", "untagged": "Ilman tunnistetta", "untitled_workflow": "NimetÃļn tyÃļnkulku", "up_next": "Seuraavaksi", @@ -2248,6 +2322,7 @@ "upload_details": "Lähetyksen tiedot", "upload_dialog_info": "Haluatko varmuuskopioida valitut kohteet palvelimelle?", "upload_dialog_title": "Lähetä kohde", + "upload_error_with_count": "Latausvirhe {count} kohteelle", "upload_errors": "Lataus valmistui {count, plural, one {# virheen} other {# virheen}} kanssa. Päivitä sivu nähdäksesi ladatut tiedot.", "upload_finished": "Lähetys valmistui", "upload_progress": "Jäljellä {remaining, number} - Käsitelty {processed, number}/{total, number}", @@ -2262,6 +2337,8 @@ "url": "URL", "usage": "KäyttÃļ", "use_biometric": "Käytä biometriikkaa", + "use_browser_locale": "Käytä selaimen kieliasetuksia", + "use_browser_locale_description": "Muotoile päivämäärät, kellonajat ja numerot selaimesi kieliasetusten mukaan", "use_current_connection": "Käytä nykyistä yhteyttä", "use_custom_date_range": "Käytä omaa aikaväliä", "user": "Käyttäjä", @@ -2338,12 +2415,14 @@ "workflow_update_success": "TyÃļnkulku päivitetty onnistuneesti", "workflow_updated": "TyÃļnkulku päivitetty", "workflows": "TyÃļnkulut", + "workflows_help_text": "TyÃļnkulut automatisoivat toimintoja kohteillesi laukaisimien ja suodattimien perusteella", "wrong_pin_code": "Väärä PIN-koodi", "year": "Vuosi", "years_ago": "{years, plural, one {# vuosi} other {# vuotta}} sitten", "yes": "Kyllä", "you_dont_have_any_shared_links": "Sinulla ei ole jaettuja linkkejä", "your_wifi_name": "Wi-Fi-verkkosi nimi", + "zero_to_clear_rating": "paina 0 poistaaksesi kohteen luokituksen", "zoom_image": "Zoomaa kuvaa", "zoom_to_bounds": "Zoomaa reunoihin" } diff --git a/i18n/fr.json b/i18n/fr.json index 7dc9e80e21..ddbbe1dd13 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "copie hors site dans le cloud ou sur un site distant.", "backup_onboarding_2_description": "copies locales sur diffÊrents appareils. Cela inclut les fichiers principaux ainsi qu'une sauvegarde locale de ces fichiers.", "backup_onboarding_3_description": "copies total de vos donnÊes, incluant les fichiers originaux. Cela inclut 1 copie hors site ainsi que 2 copies locales.", - "backup_onboarding_description": "Une stratÊgie de sauvegarde 3-2-1 est recommandÊ pour protÊger vos donnÊes. Vous devriez conserver des copies de vos photos/vidÊos tÊlÊversÊs ainsi que de la base de donnÊes d'Immich pour une solution de sauvegarde cohÊrente.", + "backup_onboarding_description": "Une stratÊgie de sauvegarde 3-2-1 est recommandÊe pour protÊger vos donnÊes. Vous devriez conserver des copies de vos photos/vidÊos tÊlÊversÊs ainsi que de la base de donnÊes d'Immich pour une solution de sauvegarde cohÊrente.", "backup_onboarding_footer": "Pour plus d'information sur la sauvegarde d'Immich, merci de vous rÊfÊrer à la documentation.", "backup_onboarding_parts_title": "Une sauvegarde 3-2-1 inclut :", "backup_onboarding_title": "Sauvegardes", @@ -173,7 +173,7 @@ "machine_learning_min_recognized_faces_description": "Nombre minimal de visages reconnus pour qu'une personne soit crÊÊe. Augmenter cette valeur rend la reconnaissance faciale plus prÊcise au dÊtriment d'augmenter la chance qu'un visage ne soit pas attribuÊ à une personne.", "machine_learning_ocr": "OCR", "machine_learning_ocr_description": "Utiliser l'apprentissage automatique pour reconnaÃŽtre le texte dans les images", - "machine_learning_ocr_enabled": "Activer la reconnaissance de caractères", + "machine_learning_ocr_enabled": "Activer la reconnaissance de caractères OCR", "machine_learning_ocr_enabled_description": "Si dÊsactivÊ, la reconnaissance de texte ne s'appliquera pas aux images.", "machine_learning_ocr_max_resolution": "RÊsolution maximale", "machine_learning_ocr_max_resolution_description": "Les prÊvisualisations au-dessus de cette rÊsolution seront retaillÊes en conservant leur ratio. Des valeurs plus grandes sont plus prÊcises, mais sont plus lentes et utilisent plus de mÊmoire.", @@ -181,7 +181,7 @@ "machine_learning_ocr_min_detection_score_description": "Score de confiance minimum pour la dÊtection du textew entre 0 et 1. Des valeurs faibles permettront de reconnaÃŽtre davantage de texte mais peuvent entraÃŽner des faux positifs.", "machine_learning_ocr_min_recognition_score": "Score de reconnaissance minimum", "machine_learning_ocr_min_score_recognition_description": "Score de confiance minimum pour la reconnaissance du texte, entre 0 et 1. Des valeurs faible permettront de reconnaÃŽtre davantage de texte, mais peuvent entraÃŽner des faux positifs.", - "machine_learning_ocr_model": "Modèle de Reconnaissance Optique de Caractères", + "machine_learning_ocr_model": "Modèle de Reconnaissance Optique de Caractères OCR", "machine_learning_ocr_model_description": "Les modèles du serveur sont plus prÊcis que les modèles mobiles, mais ils sont plus lents et utilisent plus de mÊmoire.", "machine_learning_settings": "Paramètres d'apprentissage automatique", "machine_learning_settings_description": "GÊrer les fonctionnalitÊs et les paramètres d'apprentissage automatique", @@ -214,7 +214,7 @@ "map_gps_settings_description": "GÊrer les paramètres de la Carte & GPS", "map_implications": "La carte repose sur un service de tuiles externe (tiles.immich.cloud)", "map_light_style": "Thème clair", - "map_manage_reverse_geocoding_settings": "GÊrer les paramètres de gÊocodage inversÊ", + "map_manage_reverse_geocoding_settings": "GÊrer les paramètres de gÊocodage inversÊ", "map_reverse_geocoding": "GÊocodage inversÊ", "map_reverse_geocoding_enable_description": "Activer le gÊocodage inversÊ", "map_reverse_geocoding_settings": "Paramètres de gÊocodage inversÊ", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mappage tonal", "transcoding_tone_mapping_description": "Tente de prÊserver l'apparence des vidÊos HDR lorsqu'elles sont converties en SDR. Chaque algorithme effectue diffÊrents compromis pour la couleur, les dÊtails et la luminositÊ. Hable prÊserve les dÊtails, Mobius prÊserve la couleur, et Reinhard prÊserve la luminositÊ.", "transcoding_transcode_policy": "Politique de transcodage", - "transcoding_transcode_policy_description": "Politique indiquant quand une vidÊo doit ÃĒtre transcodÊe. Les vidÊos HDR seront toujours transcodÊes (sauf si le transcodage est dÊsactivÊ).", + "transcoding_transcode_policy_description": "Politique indiquant quand une vidÊo doit ÃĒtre transcodÊe. Les vidÊos HDR et les vidÊos dans un format de pixel diffÊrent de YUV 4:2:0 seront toujours transcodÊes (sauf si le transcodage est dÊsactivÊ).", "transcoding_two_pass_encoding": "Encodage en deux passes", "transcoding_two_pass_encoding_setting_description": "Transcoder en deux passes pour produire des vidÊos mieux encodÊes. Lorsque le dÊbit binaire maximum est activÊ (obligatoire pour qu'il fonctionne avec H.264 et HEVC), ce mode utilise une plage de dÊbit binaire basÊe sur le dÊbit binaire maximum et ignore le CRF. Pour VP9, CRF peut ÃĒtre utilisÊ si le dÊbit binaire maximum est dÊsactivÊ.", "transcoding_video_codec": "Codec vidÊo", @@ -872,7 +872,7 @@ "current_server_address": "Adresse actuelle du serveur", "custom_date": "Date personnalisÊe", "custom_locale": "Paramètres rÊgionaux personnalisÊs", - "custom_locale_description": "Afficher les dates et nombres en fonction des paramètres rÊgionaux", + "custom_locale_description": "Formater les dates, heures et nombres en fonction de la langue sÊlectionnÊe et de la rÊgion", "custom_url": "URL personnalisÊe", "cutoff_date_description": "Conservez les photos depuis les derniersâ€Ļ", "cutoff_day": "{count, plural, one {jour} other {jours}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Nombre de donnÊes EXIF", "deduplication_info": "Info de dÊduplication", "deduplication_info_description": "Pour prÊsÊlectionner automatiquement les mÊdias et supprimer les doublons en masse, nous examinons :", - "default_locale": "RÊgion par dÊfaut", - "default_locale_description": "Afficher les dates et nombres en fonction des paramètres de votre navigateur", "delete": "Supprimer", "delete_action_confirmation_message": "Êtes-vous sÃģr de vouloir supprimer ce mÊdia ? Cela dÊplacera le mÊdia dans la poubelle du serveur et vous demandera si vous voulez le supprimer localement", "delete_action_prompt": "{count} supprimÊ(s)", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "Editions appliquÊes avec succès", "editor_flip_horizontal": "Retourner horizontalement", "editor_flip_vertical": "Retourner verticalement", + "editor_handle_corner": "Saisie du coin {corner, select, top_left {en haut à gauche} top_right {en haut à droite} bottom_left {en bas à gauche} bottom_right {en bas à droite} other {A}}", + "editor_handle_edge": "Saisie du bord {edge, select, top {haut} bottom {bas} left {gauche} right {droit} other {An}}", "editor_orientation": "Orientation", "editor_reset_all_changes": "RÊinitialiser les modifications", "editor_rotate_left": "Rotation de 90° dans le sens inverse des aiguilles d'une montre", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "Erreur de mise à jour du statut des notifications", "incorrect_email_or_password": "Courriel ou mot de passe incorrect", "library_folder_already_exists": "Ce chemin d'import existe dÊjà.", + "page_not_found": "Page non trouvÊe", "paths_validation_failed": "Validation ÊchouÊe pour {paths, plural, one {# un chemin} other {# plusieurs chemins}}", "profile_picture_transparent_pixels": "Les images de profil ne peuvent pas avoir de pixels transparents. Veuillez agrandir et/ou dÊplacer l'image.", "quota_higher_than_disk_size": "Le quota saisi est supÊrieur à l'espace disponible", @@ -1147,7 +1148,7 @@ "unable_to_scan_library": "Impossible de scanner la bibliothèque", "unable_to_set_feature_photo": "Impossible de dÊfinir la photo de la personne", "unable_to_set_profile_picture": "Impossible d'enregistrer la photo de profil", - "unable_to_set_rating": "Impossible de dÊfinir une note", + "unable_to_set_rating": "Impossible de dÊfinir l'Êvaluation", "unable_to_submit_job": "Impossible d'exÊcuter la tÃĸche", "unable_to_trash_asset": "Impossible de mettre le mÊdia à la corbeille", "unable_to_unlink_account": "Impossible de dÊtacher le compte", @@ -1218,6 +1219,7 @@ "filter_description": "Conditions pour filtrer les mÊdias ciblÊs", "filter_people": "Filtrer les personnes", "filter_places": "Filtrer par lieu", + "filter_tags": "Filtrer par Êtiquettes", "filters": "Filtres", "find_them_fast": "Pour les retrouver rapidement par leur nom", "first": "Premier", @@ -1631,7 +1633,7 @@ "oauth": "OAuth", "obtainium_configurator": "Configuration pour Obtainium", "obtainium_configurator_instructions": "Utilisez Obtainium pour installer et mettre à jour l'application Android directement depuis la version d'Immich sur Github. CrÊer une clÊ d'API et sÊlectionner une variante pour crÊer votre lien de configuration pour Obtainium", - "ocr": "Reconnaissance Optique de Caractères", + "ocr": "Reconnaissance Optique de Caractères OCR", "official_immich_resources": "Ressources Immich officielles", "offline": "Hors ligne", "offset": "DÊcalage", @@ -1649,6 +1651,7 @@ "only_favorites": "Uniquement les favoris", "open": "Ouvrir", "open_calendar": "Ouvrir le calendrier", + "open_in_browser": "Ouvrir dans le navigateur", "open_in_map_view": "Montrer sur la carte", "open_in_openstreetmap": "Ouvrir dans OpenStreetMap", "open_the_search_filters": "Ouvrir les filtres de recherche", @@ -1808,9 +1811,8 @@ "rate_asset": "Évaluer un mÊdia", "rating": "Étoile d'Êvaluation", "rating_clear": "Effacer l'Êvaluation", - "rating_count": "{count, plural, one {# Êtoile} other {# Êtoiles}}", + "rating_count": "{count, plural, =0 {Non ÊvaluÊ} one {# Êtoile} other {# Êtoiles}}", "rating_description": "Afficher l'Êvaluation EXIF dans le panneau d'information", - "rating_set": "Note dÊfinie sur {rating, plural, one {# Êtoile} other {# Êtoiles}}", "reaction_options": "Options de rÊaction", "read_changelog": "Lire les changements", "readonly_mode_disabled": "Mode lecture seule dÊsactivÊ", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "Code PIN rÊinitialisÊ avec succès", "reset_pin_code_with_password": "Vous pouvez toujours rÊinitialiser le code PIN avec votre mot de passe", "reset_sqlite": "RÊinitialiser la base de donnÊes SQLite", - "reset_sqlite_confirmation": "Êtes-vous certain de vouloir rÊinitialiser la base de donnÊes SQLite ? Vous devrez vous dÊconnecter puis vous reconnecter à nouveau pour resynchroniser les donnÊes", + "reset_sqlite_clear_app_data": "Supprimer les donnÊes", + "reset_sqlite_confirmation": "Êtes-vous certain de vouloir supprimer les donnÊes de l'application ? Cela va supprimer tous les paramètres et vous dÊconnecter.", + "reset_sqlite_confirmation_note": "Remarque : vous devrez redÊmarrer l'application après cette suppression.", + "reset_sqlite_done": "Les donnÊes de l'application ont ÊtÊ supprimÊes. Veuillez redÊmarrer Immich et vous reconnecter.", "reset_sqlite_success": "La base de donnÊes SQLite à ÊtÊ rÊinitialisÊ avec succès", "reset_to_default": "RÊtablir les valeurs par dÊfaut", "resolution": "RÊsolution", @@ -1910,6 +1915,7 @@ "saved_settings": "Paramètres enregistrÊs", "say_something": "RÊagir", "scaffold_body_error_occurred": "Une erreur s'est produite", + "scaffold_body_error_unrecoverable": "Une erreur irrÊcupÊrable s'est produite. Veuillez partager l'erreur et la trace de pile sur Discord ou GitHub afin que nous puissions vous aider. Si nÊcessaire, vous pouvez effacer les donnÊes de l'appli ci-dessous.", "scan": "Analyse", "scan_all_libraries": "Analyser toutes les bibliothèques", "scan_library": "Analyser", @@ -1923,7 +1929,7 @@ "search_by_description_example": "RandonnÊe à Sapa", "search_by_filename": "Rechercher par nom du fichier ou extension", "search_by_filename_example": "Exemple : IMG_1234.JPG ou PNG", - "search_by_ocr": "Recherche par OCR", + "search_by_ocr": "Recherche par Reconnaissance Optique de Caractères OCR", "search_by_ocr_example": "cafÊ latte", "search_camera_lens_model": "Chercher par modèle d'objectif...", "search_camera_make": "Rechercher par marque d'appareil photo...", @@ -1942,9 +1948,10 @@ "search_filter_location_title": "SÊlectionner une localisation", "search_filter_media_type": "Type de mÊdia", "search_filter_media_type_title": "SÊlectionner type de mÊdia", - "search_filter_ocr": "Recherche par OCR", + "search_filter_ocr": "Recherche par Reconnaissance Optique de Caractères OCR", "search_filter_people_title": "SÊlectionner une personne", "search_filter_star_rating": "Note par Êtoiles", + "search_filter_tags_title": "SÊlectionner des Êtiquettes", "search_for": "Chercher", "search_for_existing_person": "Rechercher une personne existante", "search_no_more_result": "Plus de rÊsultats", @@ -2024,6 +2031,9 @@ "set_profile_picture": "DÊfinir la photo de profil", "set_slideshow_to_fullscreen": "Afficher le diaporama en plein Êcran", "set_stack_primary_asset": "Marquer comme mÊdia principal", + "setting_image_navigation_enable_subtitle": "Si activÊ, vous pouvez naviguer vers l'image prÊcÊdente / suivante en appuyant sur le quart le plus à gauche / à droite de l'Êcran.", + "setting_image_navigation_enable_title": "Appuyer pour naviguer", + "setting_image_navigation_title": "Navigation dans les images", "setting_image_viewer_help": "Le visualiseur de dÊtails charge d'abord la petite miniature, puis l'aperçu de taille moyenne (s'il est activÊ), enfin l'original (s'il est activÊ).", "setting_image_viewer_original_subtitle": "Activez cette option pour charger l'image en rÊsolution originale (fichier volumineux !). DÊsactiver pour rÊduire l'utilisation des donnÊes (rÊseau et cache de l'appareil).", "setting_image_viewer_original_title": "Charger l'image originale", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} dÊpilÊ(s)", "unstacked_assets_count": "{count, plural, one {# mÊdia dÊpilÊ} other {# mÊdias dÊpilÊs}}", "unsupported_field_type": "Type de champ non supportÊ", + "unsupported_file_type": "Le fichier {file} ne peut pas ÃĒtre tÊlÊversÊ car son type {type} n'est pas supportÊ.", "untagged": "Sans Êtiquette", "untitled_workflow": "Flux de traitement sans titre", "up_next": "Suite", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "Utilisation", "use_biometric": "Utiliser l'authentification biomÊtrique", + "use_browser_locale": "Utiliser les paramètres rÊgionaux du navigateur", + "use_browser_locale_description": "Formate les dates, heures et nombres en fonction des paramètres rÊgionaux de votre navigateur", "use_current_connection": "Utiliser le rÊseau actuel", "use_custom_date_range": "Utilisez une plage de date personnalisÊe à la place", "user": "Utilisateur", diff --git a/i18n/ga.json b/i18n/ga.json index 409cc293d6..8cdcf03fbe 100644 --- a/i18n/ga.json +++ b/i18n/ga.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "cÃŗip lasmuigh den lÃĄthair sa scamall nÃŗ in ÃĄit fhisiciÃēil eile.", "backup_onboarding_2_description": "cÃŗipeanna ÃĄitiÃēla ar ghlÊasanna ÊagsÃēla. Áirítear leis seo na príomhchomhaid agus cÃēltaca de na comhaid sin go hÃĄitiÃēil.", "backup_onboarding_3_description": "cÃŗipeanna iomlÃĄna de do shonraí, lena n-ÃĄirítear na comhaid bhunaidh. Áirítear leis seo cÃŗip amhÃĄin lasmuigh den lÃĄthair agus dhÃĄ chÃŗip ÃĄitiÃēla.", - "backup_onboarding_description": "Moltar straitÊis chÃēltaca 3-2-1 chun do shonraí a chosaint. Ba chÃŗir duit cÃŗipeanna de do ghrianghraif/fhíseÃĄin uaslÃŗdÃĄilte a choinneÃĄil chomh maith le bunachar sonraí Immich le haghaidh rÊiteach cÃēltaca cuimsitheach.", + "backup_onboarding_description": "Moltar straitÊis chÃēltaca 3-2-1 chun do shonraí a chosaint. Ba chÃŗir duit cÃŗipeanna de do ghrianghraif/fhíseÃĄin uaslÃŗdÃĄilte chomh maith le bunachar sonraí Immich a choinneÃĄil le haghaidh rÊiteach cÃēltaca cuimsitheach.", "backup_onboarding_footer": "Le haghaidh tuilleadh eolais faoi chÃēltaca d'Immich, fÊach ar an doicimÊadÃē.", "backup_onboarding_parts_title": "Áirítear le cÃēltaca 3-2-1:", "backup_onboarding_title": "CÃēltacaí", @@ -372,7 +372,7 @@ "transcoding_audio_codec": "CÃŗdac fuaime", "transcoding_audio_codec_description": "Is Ê Opus an rogha is airde cÃĄilíochta, ach tÃĄ comhoiriÃēnacht níos ísle aige le seanghlÊasanna nÃŗ bogearraí.", "transcoding_bitrate_description": "FíseÃĄin níos airde nÃĄ an uasrÃĄta giotÃĄn nÃŗ nach bhfuil i bhformÃĄid inghlactha", - "transcoding_codecs_learn_more": "Chun tuilleadh eolais a fhÃĄil faoin tÊarmaíocht a ÃēsÃĄidtear anseo, fÊach ar dhoicimÊid FFmpeg le haghaidh cÃŗdÊc H.264, cÃŗdÊc HEVC agus cÃŗdÊc VP9.", + "transcoding_codecs_learn_more": "Chun tuilleadh eolais a fhÃĄil faoin tÊarmaíocht a ÃēsÃĄidtear anseo, fÊach ar dhoicimÊid FFmpeg le haghaidh cÃŗideic H.264, cÃŗideic HEVC agus cÃŗideic VP9.", "transcoding_constant_quality_mode": "MÃŗd cÃĄilíochta tairiseach", "transcoding_constant_quality_mode_description": "TÃĄ ICQ níos fearr nÃĄ CQP, ach ní thacaíonn roinnt glÊasanna luasghÊaraithe crua-earraí leis an modh seo. Trí an rogha seo a shocrÃē, tabharfar tÃēs ÃĄite don mhodh sonraithe agus ionchÃŗdÃē bunaithe ar chÃĄilíocht ÃĄ ÃēsÃĄid. Ní thacaíonn NVENC leis mar nach dtacaíonn sÊ le ICQ.", "transcoding_constant_rate_factor": "FachtÃŗir rÃĄta tairiseach (-crf)", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "MapÃĄil toin", "transcoding_tone_mapping_description": "DÊanann iarracht cuma físeÃĄin HDR a chaomhnÃē nuair a dhÊantar iad a thiontÃē go SDR. DÊanann gach algartam comhbhabhtÃĄlacha difriÃēla maidir le dath, mionsonraí agus gile. Coinníonn Hable mionsonraí, coinníonn Mobius dath, agus coinníonn Reinhard gile.", "transcoding_transcode_policy": "Polasaí traschÃŗdÃĄla", - "transcoding_transcode_policy_description": "Polasaí maidir le cathain ba chÃŗir físeÃĄn a thraschÃŗdÃē. DÊanfar físeÃĄin HDR a thraschÃŗdÃē i gcÃŗnaí (ach amhÃĄin mÃĄ tÃĄ traschÃŗdÃē díchumasaithe).", + "transcoding_transcode_policy_description": "Polasaí maidir le cathain ba chÃŗir físeÃĄn a thraschÃŗdÃē. DÊanfar físeÃĄin HDR agus físeÃĄin le formÃĄid picteilín seachas YUV 4:2:0 a thraschÃŗdÃē i gcÃŗnaí (ach amhÃĄin mÃĄ tÃĄ an traschÃŗdÃē díchumasaithe).", "transcoding_two_pass_encoding": "IonchÃŗdÃē dhÃĄ phas", "transcoding_two_pass_encoding_setting_description": "TraschÃŗdaigh i ndÃĄ phas chun físeÃĄin ionchÃŗdaithe níos fearr a thÃĄirgeadh. Nuair a bhíonn an rÃĄta giotÃĄn uasta cumasaithe (riachtanach chun go n-oibreoidh sÊ le H.264 agus HEVC), ÃēsÃĄideann an mÃŗd seo raon rÃĄta giotÃĄn bunaithe ar an rÃĄta giotÃĄn uasta agus ní thugann sÊ aird ar CRF. I gcÃĄs VP9, is fÊidir CRF a ÃēsÃĄid mÃĄ tÃĄ an rÃĄta giotÃĄn uasta díchumasaithe.", "transcoding_video_codec": "CÃŗdac físe", @@ -871,8 +871,8 @@ "current_pin_code": "CÃŗd PIN reatha", "current_server_address": "Seoladh reatha an fhreastalaí", "custom_date": "DÃĄta saincheaptha", - "custom_locale": "LogÃĄn Saincheaptha", - "custom_locale_description": "FormÃĄidigh dÃĄtaí agus uimhreacha bunaithe ar an teanga agus ar an rÊigiÃēn", + "custom_locale": "LogÃĄn saincheaptha", + "custom_locale_description": "FormÃĄidigh dÃĄtaí, amanna agus uimhreacha bunaithe ar an teanga agus an rÊigiÃēn roghnaithe", "custom_url": "URL Saincheaptha", "cutoff_date_description": "Coinnigh grianghraif Ãŗn uair dheireanachâ€Ļ", "cutoff_day": "{count, plural, one {lÃĄ} other {laethanta}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Líon sonraí EXIF", "deduplication_info": "Eolas DídhÃēblÃĄla", "deduplication_info_description": "Chun sÃŗcmhainní a rÊamhroghnÃē go huathoibríoch agus dÃēblaigh a bhaint i mÃŗrchÃŗir, fÊachaimid ar:", - "default_locale": "LogÃĄn RÊamhshocraithe", - "default_locale_description": "FormÃĄidigh dÃĄtaí agus uimhreacha bunaithe ar shuíomh do bhrabhsÃĄlaí", "delete": "Scrios", "delete_action_confirmation_message": "An bhfuil tÃē cinnte gur mian leat an tsÃŗcmhainn seo a scriosadh? Bogfaidh an gníomh seo an tsÃŗcmhainn go dtí bruscar an fhreastalaí agus fiafrÃŗidh sÊ díot an mian leat í a scriosadh go hÃĄitiÃēil", "delete_action_prompt": "{count} scriosta", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "Cuireadh na heagarthÃŗireachtaí i bhfeidhm go rathÃēil", "editor_flip_horizontal": "Fillte go cothromÃĄnach", "editor_flip_vertical": "Smeach ingearach", + "editor_handle_corner": "{corner, select, top_left {Top-left} top_right {Barr-deas} bottom_left {Bun-chlÊ} bottom_right {Bun-deas} other {A}} lÃĄimhseÃĄil cÃēinne", + "editor_handle_edge": "{edge, select, top {Barr} bottom {Bun} left {ClÊ} right {Deas} other {An}} lÃĄimhseÃĄil imeall", "editor_orientation": "Treoshuíomh", "editor_reset_all_changes": "Athshocraigh athruithe", "editor_rotate_left": "Rothlaigh 90° tuathalach", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "Theip ar stÃĄdas an fhÃŗgra a nuashonrÃē", "incorrect_email_or_password": "Ríomhphost nÃŗ pasfhocal mícheart", "library_folder_already_exists": "TÃĄ an cosÃĄn allmhairithe seo ann cheana fÊin.", + "page_not_found": "Leathanach gan aimsiÃē", "paths_validation_failed": "Theip ar bhailíochtÃē {paths, plural, one {# cosÃĄn} other {# cosÃĄin}}", "profile_picture_transparent_pixels": "Ní fÊidir picteilíní trÊdhearcacha a bheith i bpictiÃēir phrÃŗifíle. ZÃēmÃĄil isteach agus/nÃŗ bog an íomhÃĄ le do thoil.", "quota_higher_than_disk_size": "Shocraigh tÃē cuÃŗta níos airde nÃĄ mÊid an diosca", @@ -1218,6 +1219,7 @@ "filter_description": "Coinníollacha chun na sÃŗcmhainní sprice a scagadh", "filter_people": "Scag daoine", "filter_places": "Scag ÃĄiteanna", + "filter_tags": "Scagairí clibeanna", "filters": "Scagairí", "find_them_fast": "Aimsigh iad go tapa de rÊir ainm le cuardach", "first": "Ar dtÃēs", @@ -1649,6 +1651,7 @@ "only_favorites": "Is fearr leat amhÃĄin", "open": "Oscail", "open_calendar": "Oscail an fÊilire", + "open_in_browser": "Oscail sa bhrabhsÃĄlaí", "open_in_map_view": "Oscail i radharc lÊarscÃĄile", "open_in_openstreetmap": "Oscail in OpenStreetMap", "open_the_search_filters": "Oscail na scagairí cuardaigh", @@ -1808,9 +1811,8 @@ "rate_asset": "RÃĄtÃĄil SÃŗcmhainn", "rating": "RÃĄtÃĄil rÊalta", "rating_clear": "Glan rÃĄtÃĄil", - "rating_count": "{count, plural, one {# rÊalta} other {# rÊaltaí}}", + "rating_count": "{count, plural, =0 {Gan rÃĄtÃĄil} one {# rÊalta} other {# rÊaltaí}}", "rating_description": "TaispeÃĄin an rÃĄtÃĄil EXIF sa phainÊal eolais", - "rating_set": "Socraithe go {rating, plural, one {# rÊalta} other {# rÊalta}}", "reaction_options": "Roghanna imoibrithe", "read_changelog": "LÊigh an Log Athraithe", "readonly_mode_disabled": "MÃŗd lÊite amhÃĄin díchumasaithe", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "Athshocraíodh an cÃŗd PIN go rathÃēil", "reset_pin_code_with_password": "Is fÊidir leat do chÃŗd PIN a athshocrÃē i gcÃŗnaí le do phasfhocal", "reset_sqlite": "Athshocraigh Bunachar Sonraí SQLite", - "reset_sqlite_confirmation": "An bhfuil tÃē cinnte gur mian leat bunachar sonraí SQLite a athshocrÃē? Beidh ort logÃĄil amach agus logÃĄil isteach arís chun na sonraí a athshioncronÃē", + "reset_sqlite_clear_app_data": "Glan Sonraí", + "reset_sqlite_confirmation": "An bhfuil tÃē cinnte gur mian leat sonraí an aip a ghlanadh? Bainfear na socruithe go lÊir leis seo agus síneofar amach thÃē.", + "reset_sqlite_confirmation_note": "NÃŗta: Beidh ort an aip a atosÃē tar Êis duit Ê a ghlanadh.", + "reset_sqlite_done": "TÃĄ sonraí an aip glanta. Atosaigh Immich agus logÃĄil isteach arís.", "reset_sqlite_success": "Athshocraíodh bunachar sonraí SQLite go rathÃēil", "reset_to_default": "Athshocraigh go rÊamhshocraithe", "resolution": "Taifeach", @@ -1910,6 +1915,7 @@ "saved_settings": "Socruithe sÃĄbhÃĄilte", "say_something": "Abair rud Êigin", "scaffold_body_error_occurred": "Tharla earrÃĄid", + "scaffold_body_error_unrecoverable": "Tharla earrÃĄid nach fÊidir a aisghabhÃĄil. Roinn an earrÃĄid agus an rian cruachta ar Discord nÃŗ GitHub le do thoil ionas gur fÊidir linn cabhrÃē leat. MÃĄs fÊidir leat comhairle a thabhairt duit, is fÊidir leat sonraí an aip thíos a ghlanadh.", "scan": "Scanadh", "scan_all_libraries": "ScanÃĄil Gach Leabharlann", "scan_library": "Scanadh", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "Cuardaigh de rÊir OCR", "search_filter_people_title": "Roghnaigh daoine", "search_filter_star_rating": "RÃĄtÃĄil RÊalta", + "search_filter_tags_title": "Roghnaigh clibeanna", "search_for": "Cuardaigh le haghaidh", "search_for_existing_person": "Cuardaigh duine atÃĄ ann cheana fÊin", "search_no_more_result": "Gan aon torthaí eile", @@ -2024,6 +2031,9 @@ "set_profile_picture": "Socraigh pictiÃēr prÃŗifíle", "set_slideshow_to_fullscreen": "Socraigh SleamhnÃĄn go lÃĄnscÃĄileÃĄn", "set_stack_primary_asset": "Socraigh mar phríomhshÃŗcmhainn", + "setting_image_navigation_enable_subtitle": "MÃĄs cumasaithe Ê, is fÊidir leat nascleanÃēint a dhÊanamh chuig an íomhÃĄ roimhe seo/chÊad íomhÃĄ eile trí thapÃĄil ar an gceathrÃē is faide ar chlÊ/ar dheis den scÃĄileÃĄn.", + "setting_image_navigation_enable_title": "TapÃĄil chun nascleanÃēint a dhÊanamh", + "setting_image_navigation_title": "NascleanÃēint ÍomhÃĄ", "setting_image_viewer_help": "LÃŗdÃĄlann an breathnÃŗir sonraí an mionsamhail bheag ar dtÃēs, ansin luchtaíonn sÊ an rÊamhamharc meÃĄnmhÊide (mÃĄs cumasaithe), agus ar deireadh luchtaíonn sÊ an bunleagan (mÃĄs cumasaithe).", "setting_image_viewer_original_subtitle": "Cumasaigh chun an íomhÃĄ lÃĄntaifigh bhunaidh (mÃŗr!) a luchtÃē. Díchumasaigh chun ÃēsÃĄid sonraí a laghdÃē (ar an líonra agus ar an taisce ar an nglÊas araon).", "setting_image_viewer_original_title": "Luchtaigh an íomhÃĄ bhunaidh", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} gan chruachadh", "unstacked_assets_count": "Gan chruachadh {count, plural, one {# sÃŗcmhainn} other {# sÃŗcmhainní}}", "unsupported_field_type": "CineÃĄl rÊimse nach dtacaítear leis", + "unsupported_file_type": "Ní fÊidir an comhad {file} a uaslÃŗdÃĄil mar nach dtacaítear lena chineÃĄl comhaid {type}.", "untagged": "Gan Chlib", "untitled_workflow": "Sreabhadh oibre gan teideal", "up_next": "Ar aghaidh", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "ÚsÃĄid", "use_biometric": "ÚsÃĄid bithmhÊadrach", + "use_browser_locale": "ÚsÃĄid logÃĄn brabhsÃĄlaí", + "use_browser_locale_description": "FormÃĄidigh dÃĄtaí, amanna agus uimhreacha bunaithe ar shuíomh do bhrabhsÃĄlaí", "use_current_connection": "ÚsÃĄid an nasc reatha", "use_custom_date_range": "ÚsÃĄid raon dÃĄta saincheaptha ina ionad", "user": "ÚsÃĄideoir", diff --git a/i18n/gl.json b/i18n/gl.json index 135e3f64cd..63faaec9a8 100644 --- a/i18n/gl.json +++ b/i18n/gl.json @@ -311,7 +311,7 @@ "search_jobs": "Buscar traballosâ€Ļ", "send_welcome_email": "Enviar correo electrÃŗnico de benvida", "server_external_domain_settings": "Dominio externo", - "server_external_domain_settings_description": "Dominio para ligazÃŗns pÃēblicas compartidas, incluíndo http(s)://", + "server_external_domain_settings_description": "Dominio empregado para links externos", "server_public_users": "Usuarios pÃēblicos", "server_public_users_description": "Todos os usuarios (nome e correo electrÃŗnico) lístanse ao engadir un usuario a ÃĄlbums compartidos. Cando estÃĄ desactivado, a lista de usuarios sÃŗ estarÃĄ dispoÃąible para os usuarios administradores.", "server_settings": "ConfiguraciÃŗn do servidor", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapeo de tons", "transcoding_tone_mapping_description": "Intenta preservar a aparencia dos vídeos HDR cando se converten a SDR. Cada algoritmo fai diferentes compromisos para cor, detalle e brillo. Hable preserva o detalle, Mobius preserva a cor e Reinhard preserva o brillo.", "transcoding_transcode_policy": "Política de transcodificaciÃŗn", - "transcoding_transcode_policy_description": "Política para cando un vídeo debe ser transcodificado. Os vídeos HDR sempre serÃĄn transcodificados (excepto se a transcodificaciÃŗn estÃĄ desactivada).", + "transcoding_transcode_policy_description": "Política para cando un vídeo debe ser transcodificado. Os vídeos HDR e vídeos con formato de Pixel disintos de YUV 4:2:0 sempre serÃĄn transcodificados (excepto se a transcodificaciÃŗn estÃĄ desactivada).", "transcoding_two_pass_encoding": "CodificaciÃŗn en dous pasos", "transcoding_two_pass_encoding_setting_description": "Transcodificar en dous pasos para producir vídeos codificados de mellor calidade. Cando o bitrate mÃĄximo estÃĄ activado (requirido para que funcione con H.264 e HEVC), este modo usa un rango de bitrate baseado no bitrate mÃĄximo e ignora CRF. Para VP9, pÃŗdese usar CRF se o bitrate mÃĄximo estÃĄ desactivado.", "transcoding_video_codec": "CÃŗdec de vídeo", @@ -794,6 +794,11 @@ "color": "Cor", "color_theme": "Tema de cor", "command": "Comando", + "command_palette_prompt": "Atopa rapidamente pÃĄxinas, acciÃŗns ou comandos", + "command_palette_to_close": "para pechar", + "command_palette_to_navigate": "para entrar", + "command_palette_to_select": "para seleccionar", + "command_palette_to_show_all": "para amosar todo", "comment_deleted": "Comentario eliminado", "comment_options": "OpciÃŗns de comentario", "comments_and_likes": "Comentarios e GÃēstames", @@ -867,7 +872,7 @@ "current_server_address": "Enderezo do servidor actual", "custom_date": "Data personalizada", "custom_locale": "ConfiguraciÃŗn Rexional Personalizada", - "custom_locale_description": "Formatar datas e nÃēmeros baseÃĄndose na lingua e a rexiÃŗn", + "custom_locale_description": "Formatar datas, tempos e nÃēmeros baseÃĄndose na lingua e a rexiÃŗn", "custom_url": "URL personalizada", "cutoff_date_description": "Manter fotos dos Ãēltimosâ€Ļ", "cutoff_day": "{count, plural, one {day} other {days}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Reconto de datos EXIF", "deduplication_info": "InformaciÃŗn de DeduplicaciÃŗn", "deduplication_info_description": "Para preseleccionar automaticamente activos e eliminar duplicados masivamente, miramos:", - "default_locale": "ConfiguraciÃŗn Rexional Predeterminada", - "default_locale_description": "Formatar datas e nÃēmeros baseÃĄndose na configuraciÃŗn rexional do seu navegador", "delete": "Eliminar", "delete_action_confirmation_message": "EstÃĄ seguro de que quere eliminar este ficheiro? Esta acciÃŗn moverÃĄ o ficheiro ao lixo do servidor e preguntaralle se tamÊn quere eliminalo localmente", "delete_action_prompt": "{count} eliminado(s)", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "As ediciÃŗns aplicÃĄronse correctamente", "editor_flip_horizontal": "Xirar horizontalmente", "editor_flip_vertical": "Xirar verticalmente", + "editor_handle_corner": "{corner, select, top_left {Top-left} top_right {Top-right} bottom_left {Bottom-left} bottom_right {Bottom-right} other {A}} tirador de esquina", + "editor_handle_edge": "{edge, select, top {Top} bottom {Bottom} left {Left} right {Right} other {An}} tirador de borde", "editor_orientation": "OrientaciÃŗn", "editor_reset_all_changes": "Restablecer os cambios", "editor_rotate_left": "Xirar 90° en sentido antihorario", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "Erro ao actualizar o estado das notificaciÃŗns", "incorrect_email_or_password": "Correo electrÃŗnico ou contrasinal incorrectos", "library_folder_already_exists": "Esta ruta de importaciÃŗn xa existe.", + "page_not_found": "PÃĄxina non atopada", "paths_validation_failed": "{paths, plural, one {# ruta fallou} other {# rutas fallaron}} na validaciÃŗn", "profile_picture_transparent_pixels": "As imaxes de perfil non poden ter píxeles transparentes. Por favor, faga zoom e/ou mova a imaxe.", "quota_higher_than_disk_size": "Estableceu unha cota superior ao tamaÃąo do disco", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "PERSOAS", "exif_bottom_sheet_person_add_person": "Engadir nome", "exit_slideshow": "Saír da PresentaciÃŗn", + "expand": "Expandir", "expand_all": "Expandir todo", "experimental_settings_new_asset_list_subtitle": "Traballo en progreso", "experimental_settings_new_asset_list_title": "Activar grella de fotos experimental", @@ -1212,6 +1219,7 @@ "filter_description": "CondiciÃŗns para filtrar os activos obxectivo", "filter_people": "Filtrar persoas", "filter_places": "Filtrar lugares", + "filter_tags": "Filtrar etiquetas", "filters": "Filtros", "find_them_fast": "AtÃŗpeos rÃĄpido por nome coa busca", "first": "Primeiro/a", @@ -1642,6 +1650,8 @@ "online": "En liÃąa", "only_favorites": "SÃŗ favoritos", "open": "Abrir", + "open_calendar": "Abrir calendario", + "open_in_browser": "Abrir no navegador", "open_in_map_view": "Abrir na vista de mapa", "open_in_openstreetmap": "Abrir en OpenStreetMap", "open_the_search_filters": "Abrir os filtros de busca", @@ -1801,9 +1811,8 @@ "rate_asset": "Clasificar activo", "rating": "ValoraciÃŗn", "rating_clear": "Borrar clasificaciÃŗn", - "rating_count": "{count, plural, one {# estrela} other {# estrelas}}", + "rating_count": "{count, plural, =0 {Sen ClasificaciÃŗn} one {# estrela} other {# estrelas}}", "rating_description": "Mostrar a clasificaciÃŗn EXIF no panel de informaciÃŗn", - "rating_set": "ClasificaciÃŗn definida en {rating, plural, one {# star} other {# stars}}", "reaction_options": "OpciÃŗns de reacciÃŗn", "read_changelog": "Ler Rexistro de Cambios", "readonly_mode_disabled": "Modo sÃŗ lectura desactivado", @@ -1875,7 +1884,10 @@ "reset_pin_code_success": "CÃŗdigo PIN restablecido correctamente", "reset_pin_code_with_password": "Sempre podes restablecer o teu cÃŗdigo PIN coa tÃēa contrasinal", "reset_sqlite": "Restablecer a Base de Datos SQLite", - "reset_sqlite_confirmation": "EstÃĄs seguro de que queres restablecer a base de datos SQLite? TerÃĄs que pechar a sesiÃŗn e iniciar sesiÃŗn de novo para sincronizar os datos outra vez", + "reset_sqlite_clear_app_data": "Limpar Datos", + "reset_sqlite_confirmation": "EstÃĄs seguro de que queres borrar os datos da aplicaciÃŗn? Isto eliminarÃĄ toda a configuraciÃŗn e pecharÃĄ a tÃēa sesiÃŗn.", + "reset_sqlite_confirmation_note": "Nota: DeberÃĄs reiniciar a aplicaciÃŗn despois de borrala.", + "reset_sqlite_done": "BorrÃĄronse os datos da aplicaciÃŗn. Por favor reiniciei Immich e inicie sesiÃŗn de novo.", "reset_sqlite_success": "Base de datos SQLite restablecida correctamente", "reset_to_default": "Restablecer ao predeterminado", "resolution": "ResoluciÃŗn", @@ -1903,6 +1915,7 @@ "saved_settings": "ConfiguraciÃŗn gardada", "say_something": "Dicir algo", "scaffold_body_error_occurred": "Ocorreu un erro", + "scaffold_body_error_unrecoverable": "Produciuse un error irrecuperable. Comparte o erro e a \"stack trace\" no Discord ou no GitHub para poder axudarche. No caso de indicarse, pode borrar os datos da aplicaciÃŗn a continuaciÃŗn.", "scan": "Escanear", "scan_all_libraries": "Escanear Todas as Bibliotecas", "scan_library": "Escanear", @@ -1938,6 +1951,7 @@ "search_filter_ocr": "Buscar por OCR", "search_filter_people_title": "Seleccionar persoas", "search_filter_star_rating": "ClasificaciÃŗn por estrelas", + "search_filter_tags_title": "Seleccionar etiquetas", "search_for": "Buscar por", "search_for_existing_person": "Buscar persoa existente", "search_no_more_result": "Non hai mÃĄis resultados", @@ -2017,6 +2031,9 @@ "set_profile_picture": "Establecer imaxe de perfil", "set_slideshow_to_fullscreen": "PoÃąer PresentaciÃŗn a pantalla completa", "set_stack_primary_asset": "Establecer como activo principal", + "setting_image_navigation_enable_subtitle": "Se estÃĄ activado, podes navegar entre as imÃĄxenes seguintes e anteriores ao tocar na parte esquerda e dereita da pantalla.", + "setting_image_navigation_enable_title": "Toca para navegar", + "setting_image_navigation_title": "NavegaciÃŗn de Imaxes", "setting_image_viewer_help": "O visor de detalles carga primeiro a miniatura pequena, despois carga a vista previa de tamaÃąo medio (se estÃĄ activada), e finalmente carga o orixinal (se estÃĄ activado).", "setting_image_viewer_original_subtitle": "Activar para cargar a imaxe orixinal a resoluciÃŗn completa (grande!). Desactivar para reducir o uso de datos (tanto na rede como na cachÊ do dispositivo).", "setting_image_viewer_original_title": "Cargar imaxe orixinal", @@ -2183,6 +2200,7 @@ "support": "Soporte", "support_and_feedback": "Soporte e Comentarios", "support_third_party_description": "A sÃēa instalaciÃŗn de Immich foi empaquetada por un terceiro. Os problemas que experimente poden ser causados por ese paquete, así que por favor, comunique os problemas con eles en primeira instancia usando as ligazÃŗns a continuaciÃŗn.", + "supporter": "Colaborador", "swap_merge_direction": "Intercambiar direcciÃŗn de fusiÃŗn", "sync": "Sincronizar", "sync_albums": "Sincronizar ÃĄlbums", @@ -2294,6 +2312,7 @@ "unstack_action_prompt": "{count} desapilados", "unstacked_assets_count": "Desapilados {count, plural, one {# activo} other {# activos}}", "unsupported_field_type": "Tipo de campo non soportado", + "unsupported_file_type": "O arquivo {file} non puido cargarse porque o seu tipo de arquivo {type} non se soporta.", "untagged": "Sen etiquetar", "untitled_workflow": "Fluxo de traballo sen título", "up_next": "A continuaciÃŗn", @@ -2320,6 +2339,8 @@ "url": "URL", "usage": "Uso", "use_biometric": "Usar biometría", + "use_browser_locale": "Usar navegador local", + "use_browser_locale_description": "Formatear datas, tempos e nÃēmeros basado na configuraciÃŗn do teu navegador local", "use_current_connection": "Empregar conexiÃŗn actual", "use_custom_date_range": "Usar rango de datas personalizado no seu lugar", "user": "Usuario", diff --git a/i18n/gsw.json b/i18n/gsw.json index 17f8171c60..bad2816ad9 100644 --- a/i18n/gsw.json +++ b/i18n/gsw.json @@ -15,6 +15,7 @@ "add_a_location": "Standort hiifÃŧege", "add_a_name": "Name hiifÃŧege", "add_a_title": "Titel hiifÃŧege", + "add_action": "Aktion hiifÃŧege", "add_birthday": "Geburtsdatum hiifÃŧege", "add_endpoint": "Endpunkt hiifÃŧege", "add_exclusion_pattern": "Ausschlussmuster hiifÃŧege", @@ -838,8 +839,6 @@ "deduplication_criteria_2": "Anzahl vo de EXIF Date", "deduplication_info": "Deduplizierungsinformatione", "deduplication_info_description": "FÃŧr d’automatischi Datei-Voruswahl und s’Dedupliziere vo allne Dateie berÃŧcksichtige mir:", - "default_locale": "Standard Sproch", - "default_locale_description": "Datumsangabe und Zahle basierend uf em Gebietsschema vom Browser formatiere", "delete": "LÃļsche", "delete_action_confirmation_message": "Bisch du sicher, dass du dies Objekt lÃļsche wotsch? Die Aktion verschiebt s’Objekt i de Papirkorb vom Server und fragt dich, ob du’s lokal lÃļÃļsche wotsch", "delete_action_prompt": "{count} glÃļscht", diff --git a/i18n/gu.json b/i18n/gu.json index e942301430..d0dde2eec9 100644 --- a/i18n/gu.json +++ b/i18n/gu.json @@ -2,16 +2,93 @@ "about": "āĒĩāĒŋāĒļā̇", "account": "āĒ–āĒžāǤā́āĒ‚", "account_settings": "āĒ–āĒžāǤāĒžāǍāĒžāĒ‚ āǏā̇āǟāĒŋāĒ‚āĒ—āĢāǏ", + "acknowledge": "āǜāĒžāĒŖāĒ•āĒžāǰāĢ€ āĒŽāĒŗāĢ€", + "action": "āĒ•āĢāǰāĒŋāǝāĒž", + "action_common_update": "āǏā́āǧāĒžāǰāĢ‹", + "action_description": "āĒ›āĒžāĒ‚āǟā̇āǞāĢ€ āĒĩāǏāĢāǤā́āĒ“ āĒĒāǰ āĒ•āǰāĢ€ āĒļāĒ•āĒžāǝ āǤā̇āĒĩāĢ€ āĒ•āĢāǰāĒŋāǝāĒžāĒ“", + "actions": "āĒ•āĢāǰāĒŋāǝāĒžāĒ“", "active": "āǏāĒ•āĢāǰāĒŋāǝ", "active_count": "āǏāĒ•āĢāǰāĒŋāǝ: {count}", "activity": "āĒĒāĢāǰāĒĩā̃āǤāĢāǤāĒŋ", + "activity_changed": "āĒĒāĢāǰāĒĩā̃āǤāĢāǤāĒŋ {enabled, select, true {āǏāĒ•āĢāǰāĒŋāǝ} other {āǍāĒŋāǎāĢāĒ•āĢāǰāĒŋāǝ}} āĒ›ā̇", "add": "āljāĒŽā̇āǰāĢ‹", "add_a_description": "āĒāĒ• āĒĩāǰāĢāĒŖāǍ āljāĒŽā̇āǰāĢ‹", "add_a_location": "āĒāĒ• āǏāĢāĒĨāĒžāǍ āljāĒŽā̇āǰāĢ‹", "add_a_name": "āĒāĒ• āǍāĒžāĒŽ āljāĒŽā̇āǰāĢ‹", "add_a_title": "āĒāĒ• āĒļāĢ€āǰāĢāǎāĒ• āljāĒŽā̇āǰāĢ‹", - "add_birthday": "āĒāĒ• āǜāǍāĢāĒŽāĒĻāĒŋāĒĩāǏ āljāĒŽā̇āǰāĢ‹", + "add_action": "āĒ•āĢāǰāĒŋāǝāĒž āljāĒŽā̇āǰāĢ‹", + "add_action_description": "āĒ•āĢāǰāĒŋāǝāĒž āljāĒŽā̇āǰāĒĩāĒž āĒŽāĒžāǟā̇ āĒ•āĢāǞāĒŋāĒ• āĒ•āǰāĢ‹", + "add_assets": "āǏāĒ‚āǏāĒžāǧāǍāĢ‹ āljāĒŽā̇āǰāĢ‹", + "add_birthday": "āǜāǍāĢāĒŽāĒĻāĒŋāĒĩāǏ āljāĒŽā̇āǰāĢ‹", "add_endpoint": "āĒāǍāĢāĒĄāĒĒāĢ‹āLJāǍāĢāǟ āljāĒŽā̇āǰāĢ‹", + "add_exclusion_pattern": "āĒŦāĒžāĒ•āĒžāǤ āǰāĒžāĒ–āĒĩāĒžāǍāĢ€ āĒĒāĒĻāĢāǧāǤāĒŋ āljāĒŽā̇āǰāĢ‹", + "add_filter": "āĒĢāĒŋāǞāĢāǟāǰ āljāĒŽā̇āǰāĢ‹", + "add_filter_description": "āĒĢāĒŋāǞāĢāǟāǰ āĒļāǰāǤ āljāĒŽā̇āǰāĒĩāĒž āĒŽāĒžāǟā̇ āĒ•āĢāǞāĒŋāĒ• āĒ•āǰāĢ‹", "add_location": "āǏāĢāĒĨāĒžāǍ āljāĒŽā̇āǰāĢ‹", - "add_partner": "āǏāĒžāĒĨāĢ€ āljāĒŽā̇āǰāĢ‹" + "add_more_users": "āĒĩāǧāĒžāǰā̇ āǝā́āĒāǰ āljāĒŽā̇āǰāĢ‹", + "add_partner": "āǏāĒžāĒĨāĢ€ āljāĒŽā̇āǰāĢ‹", + "add_path": "āĒĒāĒžāĒĨ āljāĒŽā̇āǰāĢ‹", + "add_photos": "āĒĢāĢ‹āǟāĢ‹ āljāĒŽā̇āǰāĢ‹", + "add_tag": "āǟā̇āĒ— āljāĒŽā̇āǰāĢ‹", + "add_to": "āĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĢ‹", + "add_to_album": "ādžāǞāĢāĒŦāĒŽāĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĢ‹", + "add_to_album_bottom_sheet_added": "{album} āĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĢ‹", + "add_to_album_bottom_sheet_already_exists": "āĒĒāĒšā̇āǞā̇āĒĨāĢ€ āǜ {album} āĒŽāĒžāĒ‚ āĒ›ā̇", + "add_to_album_bottom_sheet_some_local_assets": "āĒ•ā̇āǟāǞāĒžāĒ• āǞāĢ‹āĒ•āǞ āĒāǏā̇āǟāĢāǏāǍā̇ āĒāǞāĢāĒŦāĒŽāĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĢ€ āĒļāĒ•āĢāǝāĒž āǍāĒĨāĢ€", + "add_to_album_toggle": "{album} āĒŽāĒžāǟā̇ āĒĒāǏāĒ‚āĒĻāĒ—āĢ€ āǟā̉āĒ—āǞ āĒ•āǰāĢ‹", + "add_to_albums": "ādžāǞāĢāĒŦāĒŽāĢ‹ āljāĒŽā̇āǰāĢ‹", + "add_to_albums_count": "ādžāǞāĢāĒŦāĒŽāĢ‹ āĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĢ‹ {count}", + "add_to_bottom_bar": "āĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĢ‹", + "add_to_shared_album": "āĒļā̇āǰ āĒ•āǰā̇āǞ ādžāǞāĢāĒŦāĒŽāĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĢ‹", + "add_upload_to_stack": "āĒ…āĒĒāǞāĢ‹āĒĄāǍā̇ āǏāĢāǟā̇āĒ•āĒŽāĒžāĒ‚ āljāĒŽā̇āǰāĢ‹", + "add_url": "URL āljāĒŽā̇āǰāĢ‹", + "add_workflow_step": "āĒĩāǰāĢāĒ•āĒĢāĢāǞāĢ‹ āĒĒāĒ—āǞā́ āljāĒŽā̇āǰāĢ‹", + "added_to_archive": "ādžāǰāĢāĒ•āĒžāLJāĒĩāĒŽāĒžāĒ‚ āǏāĒ‚āĒ—āĢāǰāĒšāĒŋāǤ āĒ•āǰāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĢ€ āĒ›ā̇", + "added_to_favorites": "āĒŽāǍāĒĒāǏāĒ‚āĒĻ āǤāǰāĢ€āĒ•ā̇ āǚāĒŋāǍāĢāĒšāĢ€āǤ āĒ•āǰā̇āǞ āĒ›ā̇", + "added_to_favorites_count": "āĒŽāǍāĒĒāǏāĒ‚āĒĻ āǤāǰāĢ€āĒ•ā̇ {count, number} āǍā̇ āǚāĒŋāĒšāĢāǍāĒŋāǤ āĒ•āǰāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩā̇āǞ āĒ›ā̇", + "admin": { + "add_exclusion_pattern_description": "āĒāĒ•āĢāǏāĒ•āĢāǞā́āĒāǍ āĒĒā̇āǟāǰāĢāǍ āljāĒŽā̇āǰāĢ‹. ‘*’, ‘**’, ‘?’ āĒĨāĢ€ āĒ—āĢāǞāĢ‹āĒŦāĒŋāĒ‚āĒ— āǏāĒĒāĢ‹āǰāĢāǟā̇āĒĄ āĒ›ā̇. \"Raw\" āĒĄāĒŋāǰā̇āĒ•āĢāǟāǰāĢ€ āLJāĒ—āĢāǍāĢ‹āǰ āĒ•āǰāĒĩāĒž \"/Raw/\", \".tif\" āĒĢāĒžāLjāǞāĢ‹ āĒŽāĒžāǟā̇ \"/*.tif\" āĒ…āǍā̇ āĒāĒŦāĢāǏāĢ‹āǞāĢāǝā́āǟ āĒĒāĒžāĒĨ āĒŽāĒžāǟā̇ \"/path/to/ignore/\" āǍāĢ‹ āljāĒĒāǝāĢ‹āĒ— āĒ•āǰāĢ‹.", + "admin_user": "āĒĩāǝāĒĩāǏāĢāĒĨāĒžāĒĒāĒ• āĒĩāĒĒāǰāĒžāĒļāĒ•āǰāĢāǤāĒž", + "asset_offline_description": "ādž āĒŦāĒžāĒšāĢāǝ āǞāĒžāLJāĒŦāĢāǰā̇āǰāĢ€ āĒāǏā̇āǟ āĒšāĒĩā̇ āĒĄāĒŋāǏāĢāĒ• āĒĒāǰ āĒŽāĒŗāǤāĢ‹ āǍāĒĨāĢ€ āĒ…āǍā̇ āǤā̇āǍā̇ āǟāĢāǰā̇āĒļāĒŽāĒžāĒ‚ āĒ–āǏā̇āĒĄāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĢāǝāĢ‹ āĒ›ā̇. āǜāĢ‹ āĒĢāĒžāLJāǞ āǞāĒžāLJāĒŦāĢāǰā̇āǰāĢ€āǍāĢ€ āĒ…āĒ‚āĒĻāǰ āǜ āĒ–āǏā̇āĒĄāĒžāLj āĒšāĢ‹āǝ, āǤāĢ‹ āǍāĒĩāĒž āǏāĒ‚āĒŦāĒ‚āǧāĒŋāǤ āĒāǏā̇āǟ āĒŽāĒžāǟā̇ āǤāĒŽāĒžāǰāĢ€ āǟāĒžāLjāĒŽāǞāĒžāLJāǍ āǤāĒĒāĒžāǏāĢ‹. ādž āĒāǏā̇āǟāǍā̇ āĒĒā́āǍāǃāǏāĢāĒĨāĒžāĒĒāĒŋāǤ āĒ•āǰāĒĩāĒž āĒŽāĒžāǟā̇, āĒ•ā̃āĒĒāĒž āĒ•āǰāĢ€āǍā̇ āĒ–āĒžāǤāǰāĢ€ āĒ•āǰāĢ‹ āĒ•ā̇ āǍāĢ€āǚā̇ āĒĻāǰāĢāĒļāĒžāĒĩā̇āǞ āĒĢāĒžāLJāǞ āĒĒāĒĨ Immich āĒĻāĢāĒĩāĒžāǰāĒž āĒāĒ•āĢāǏā̇āǏ āĒ•āǰāĢ€ āĒļāĒ•āĒžāǝ āĒ›ā̇ āĒ…āǍā̇ āǤāĢāǝāĒžāǰāĒŦāĒžāĒĻ āǞāĒžāLJāĒŦāĢāǰā̇āǰāĢ€ āǏāĢāĒ•ā̇āǍ āĒ•āǰāĢ‹.", + "authentication_settings": "āĒĒāĢāǰāĒŽāĒžāĒŖāĒŋāĒ•āǰāĒŖ āǏā̇āǟāĒŋāĒ‚āĒ—āĢāǏ", + "authentication_settings_description": "āĒĒāĒžāǏāĒĩāǰāĢāĒĄ, OAuth āĒ…āǍā̇ āĒ…āǍāĢāǝ āĒĒāĢāǰāĒŽāĒžāĒŖāĒŋāĒ•āǰāĒŖ āǏā̇āǟāĒŋāĒ‚āĒ—āĢāǏ āĒŽā̇āǍā̇āǜ āĒ•āǰāĢ‹", + "authentication_settings_disable_all": "āĒļā́āĒ‚ āǤāĒŽā̇ āĒ–āĒžāǤāǰāĢ€ āĒ•āǰāĢ‹ āĒ›āĢ‹ āĒ•ā̇ āǤāĒŽā̇ āǤāĒŽāĒžāĒŽ āǞā̉āĒ—āĒŋāǍ āĒĒāĒĻāĢāǧāǤāĒŋāĒ“ āǍāĒŋāǎāĢāĒ•āĢāǰāĒŋāǝ āĒ•āǰāĒĩāĒž āĒŽāĒžāĒ‚āĒ—āĢ‹ āĒ›āĢ‹? āǞā̉āĒ—āĒŋāǍ āǏāĒ‚āĒĒāĢ‚āǰāĢāĒŖ āǰāĢ€āǤā̇ āĒŦāĒ‚āǧ āĒĨāLj āǜāĒļā̇.", + "authentication_settings_reenable": "āĒĢāǰāĢ€āĒĨāĢ€ āǏāĒ•āĢāǰāĒŋāǝ āĒ•āǰāĒĩāĒž āĒŽāĒžāǟā̇, āǏāǰāĢāĒĩāǰ āĒ•āĒŽāĒžāǍāĢāĒĄ āǍāĢ‹ āljāĒĒāǝāĢ‹āĒ— āĒ•āǰāĢ‹.", + "background_task_job": "āĒĒā̃āǎāĢāĒ āĒ­āĢ‚āĒŽāĒŋ āĒ•āĒžāǰāĢāǝāĢ‹", + "backup_database": "āĒĄā̇āǟāĒžāĒŦā̇āĒ āĒĄāĒŽāĢāĒĒ āĒŦāǍāĒžāĒĩāĢ‹", + "backup_database_enable_description": "āĒĄā̇āǟāĒžāĒŦā̇āĒ āĒĄāĒŽāĢāĒĒ āǏāĒ•āĢāǰāĒŋāǝ āĒ•āǰāĢ‹", + "backup_keep_last_amount": "āĒ…āĒ—āĒžāljāǍāĒž āĒĄāĒŽāĢāĒĒāĢāǏāǍāĢ€ āǏāĒ‚āĒ–āĢāǝāĒž āǜāĒžāĒŗāĒĩāĢ€ āǰāĒžāĒ–āĒĩāĒž āĒŽāĒžāǟā̇", + "backup_onboarding_1_description": "āĒ•āĢāǞāĒžāljāĒĄāĒŽāĒžāĒ‚ āĒ…āĒĨāĒĩāĒž āĒ…āǍāĢāǝ āĒ­ā̌āǤāĒŋāĒ• āǏāĢāĒĨāĒŗā̇ āĒ‘āĒĢāǏāĒžāLJāǟ āǍāĒ•āǞ.", + "backup_onboarding_2_description": "āĒĩāĒŋāĒĩāĒŋāǧ āljāĒĒāĒ•āǰāĒŖāĢ‹āĒŽāĒžāĒ‚ āǏāĢāĒĨāĒžāǍāĒŋāĒ• āǍāĒ•āǞāĢ‹. āǤā̇āĒŽāĒžāĒ‚ āĒŽā́āĒ–āĢāǝ āĒĢāĒžāLJāǞāĢ‹ āǤā̇āĒŽāǜ āǤā̇āĒŽāǍāĢ€ āǏāĢāĒĨāĒžāǍāĒŋāĒ• āĒŦā̇āĒ•āĒ…āĒĒ āǍāĒ•āǞ āĒŦāĒ‚āǍā̇ āǏāĒžāĒŽā̇āǞ āĒ›ā̇.", + "backup_onboarding_3_description": "āǤāĒŽāĒžāǰāĒž āĒĄā̇āǟāĒžāǍāĢ€ āĒ•ā́āǞ āǍāĒ•āǞāĢ‹, āǜā̇āĒŽāĒžāĒ‚ āĒŽāĢ‚āĒŗ āĒĢāĒžāLJāǞāĢ‹āǍāĢ‹ āǏāĒŽāĒžāĒĩā̇āĒļ āĒĨāĒžāǝ āĒ›ā̇. āǤā̇āĒŽāĒžāĒ‚ 1 āĒ‘āĒĢāǏāĒžāLJāǟ āǍāĒ•āǞ āĒ…āǍā̇ 2 āǏāĢāĒĨāĒžāǍāĒŋāĒ• āǍāĒ•āǞāĢ‹ āǏāĒžāĒŽā̇āǞ āĒ›ā̇.", + "backup_onboarding_description": "āǤāĒŽāĒžāǰāĒž āĒĄā̇āǟāĒžāǍā̇ āǏā́āǰāĒ•āĢāǎāĒŋāǤ āǰāĒžāĒ–āĒĩāĒž āĒŽāĒžāǟā̇ 3-2-1 āĒŦā̇āĒ•āĒ…āĒĒ āĒĩāĢāǝāĢ‚āĒšāǰāǚāǍāĒž āĒ­āǞāĒžāĒŽāĒŖ āĒ•āǰāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩā̇ āĒ›ā̇. āǏāĒ‚āĒĒāĢ‚āǰāĢāĒŖ āĒŦā̇āĒ•āĒ…āĒĒ āǏāĢ‹āǞāĢāǝā́āĒļāǍ āĒŽāĒžāǟā̇ āǤāĒŽā̇ āǤāĒŽāĒžāǰāĒž āĒ…āĒĒāǞāĢ‹āĒĄ āĒ•āǰā̇āǞāĒž āĒĢāĢ‹āǟāĒž/āĒĩāĒŋāĒĄāĒŋāĒ“ āǤā̇āĒŽāǜ Immich āĒĄā̇āǟāĒžāĒŦā̇āĒāǍāĢ€ āǍāĒ•āǞāĢ‹ āǜāĒžāĒŗāĒĩāĢ€ āǰāĒžāĒ–āĒĩāĢ€ āǜāĢ‹āLjāĒ.", + "backup_onboarding_footer": "Immich āǍā́āĒ‚ āĒŦā̇āĒ•āĒ…āĒĒ āǞā̇āĒĩāĒž āĒ…āĒ‚āĒ—ā̇ āĒĩāǧā́ āĒŽāĒžāĒšāĒŋāǤāĢ€ āĒŽāĒžāǟā̇, āĒ•ā̃āĒĒāĒž āĒ•āǰāĢ€āǍā̇ documentation āǜā́āĒ“.", + "backup_onboarding_parts_title": "3-2-1 āĒŦā̇āĒ•āĒ…āĒĒāĒŽāĒžāĒ‚ āǏāĒžāĒŽā̇āǞ āĒ›ā̇:", + "backup_onboarding_title": "āĒŦā̇āĒ•āĒ…āĒĒāĢāǏ", + "backup_settings": "āĒĄā̇āǟāĒžāĒŦā̇āĒ āĒĄāĒŽāĢāĒĒ āǏā̇āǟāĒŋāĒ‚āĒ—āĢāǏ", + "backup_settings_description": "āĒĄā̇āǟāĒžāĒŦā̇āĒ āĒĄāĒŽāĢāĒĒ āǏā̇āǟāĒŋāĒ‚āĒ—āĢāǏāǍāĒž āĒĒāĢāǰāĒŦāĒ‚āǧ āĒ•āǰāĢ‹.", + "cleared_jobs": "{job} āĒŽāĒžāǟā̇ āĒ•āĒžāǰāĢāǝāĢ‹ āǏāĒžāĒĢ āĒ•āǰāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĢāǝāĒž", + "config_set_by_file": "āǰāĢ‚āĒĒāǰā̇āĒ–āĒž āĒšāĒžāǞāĒŽāĒžāĒ‚ āǰāĢ‚āĒĒāǰā̇āĒ–āĒž āĒĢāĒžāLJāǞ āĒĻāĢāĒĩāĒžāǰāĒž āǏā̇āǟ āĒ•āǰāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĢ€ āĒ›ā̇", + "confirm_delete_library": "āĒļā́āĒ‚ āǤāĒŽā̇ āĒ–āĒžāǤāǰāĢ€ āĒ•āǰāĢ‹ āĒ›āĢ‹ āĒ•ā̇ āǤāĒŽā̇ {library} āǞāĒžāLJāĒŦāĢāǰā̇āǰāĢ€ āĒ•āĒžāĒĸāĢ€ āǍāĒžāĒ–āĒĩāĒž āĒŽāĒžāĒ‚āĒ—āĢ‹ āĒ›āĢ‹?", + "confirm_delete_library_assets": "āĒļā́āĒ‚ āǤāĒŽā̇ āĒ–āĒžāǤāǰāĢ€ āĒ•āǰāĢ‹ āĒ›āĢ‹ āĒ•ā̇ āǤāĒŽā̇ ādž āǞāĒžāLJāĒŦāĢāǰā̇āǰāĢ€ āĒ•āĒžāĒĸāĢ€ āǍāĒžāĒ–āĒĩāĒž āĒŽāĒžāĒ‚āĒ—āĢ‹ āĒ›āĢ‹? ādž Immich āĒŽāĒžāĒ‚āĒĨāĢ€ {count, plural, one {# āǏāĒŽāĒžāĒĩāĒžāǝā̇āǞ āĒāǏā̇āǟ} other {āĒŦāǧāĒž # āǏāĒŽāĒžāĒĩāĒžāǝā̇āǞ āĒāǏā̇āǟāĢāǏ}} āĒ•āĒžāĒĸāĢ€ āǍāĒžāĒ–āĒļā̇ āĒ…āǍā̇ āǤā̇āǍā̇ āĒĒāĒžāĒ›ā́āĒ‚ āǞāĒžāĒĩāĢ€ āĒļāĒ•āĒžāĒļā̇ āǍāĒšāĢ€āĒ‚. āĒĢāĒžāLJāǞāĢ‹ āĒĄāĒŋāǏāĢāĒ• āĒĒāǰ āǜ āǰāĒšā̇āĒļā̇.", + "confirm_email_below": "āĒĒā́āǎāĢāǟāĒŋ āĒ•āǰāĒĩāĒž āĒŽāĒžāǟā̇, āǍāĢ€āǚā̇ \"{email}\" āǞāĒ–āĢ‹", + "confirm_reprocess_all_faces": "āĒļā́āĒ‚ āǤāĒŽā̇ āĒ–āĒžāǤāǰāĢ€ āĒ•āǰāĢ‹ āĒ›āĢ‹ āĒ•ā̇ āǤāĒŽā̇ āǤāĒŽāĒžāĒŽ āǚāĒšā̇āǰāĒžāĒ“āǍā̇ āĒĢāǰāĢ€āĒĨāĢ€ āĒĒāĢāǰāĢ‹āǏā̇āǏ āĒ•āǰāĒĩāĒž āĒŽāĒžāĒ‚āĒ—āĢ‹ āĒ›āĢ‹? ādž āǍāĒžāĒŽ ādžāĒĒāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩā̇āǞāĒž āǞāĢ‹āĒ•āĢ‹āǍāĢ€ āĒŽāĒžāĒšāĒŋāǤāĢ€ āĒĒāĒŖ āǏāĒžāĒĢ āĒ•āǰāĒļā̇.", + "confirm_user_password_reset": "āĒļā́āĒ‚ āǤāĒŽā̇ āĒ–āĒžāǤāǰāĢ€ āĒ•āǰāĢ‹ āĒ›āĢ‹ āĒ•ā̇ āǤāĒŽā̇ {user} āǍāĢ‹ āĒĒāĒžāǏāĒĩāǰāĢāĒĄ āǰāĢ€āǏā̇āǟ āĒ•āǰāĒĩāĒž āĒŽāĒžāĒ‚āĒ—āĢ‹ āĒ›āĢ‹?", + "confirm_user_pin_code_reset": "āĒļā́āĒ‚ āǤāĒŽā̇ āĒ–āĒžāǤāǰāĢ€ āĒ•āǰāĢ‹ āĒ›āĢ‹ āĒ•ā̇ āǤāĒŽā̇ {user} āǍāĢ‹ PIN āĒ•āĢ‹āĒĄ āǰāĢ€āǏā̇āǟ āĒ•āǰāĒĩāĒž āĒŽāĒžāĒ‚āĒ—āĢ‹ āĒ›āĢ‹?", + "copy_config_to_clipboard_description": "āĒĩāǰāĢāǤāĒŽāĒžāǍ āǏāĒŋāǏāĢāǟāĒŽ āĒ•āǍāĢāĒĢāĒŋāĒ—āǍā̇ JSON āĒ“āĒŦāĢāǜā̇āĒ•āĢāǟ āǤāǰāĢ€āĒ•ā̇ āĒ•āĢāǞāĒŋāĒĒāĒŦāĢ‹āǰāĢāĒĄāĒŽāĒžāĒ‚ āĒ•ā̉āĒĒāĢ€ āĒ•āǰāĢ‹", + "create_job": "āĒ•āĒžāǰāĢāǝ āĒŦāǍāĒžāĒĩāĢ‹", + "cron_expression": "āĒ•āĢāǰāĢ‹āǍ āĒāĒ•āĢāǏāĒĒāĢāǰā̇āĒļāǍ", + "cron_expression_description": "āĒ•āĢāǰāĢ‹āǍ āĒĢāĢ‹āǰāĢāĒŽā̇āǟāǍāĢ‹ āljāĒĒāǝāĢ‹āĒ— āĒ•āǰāĢ€āǍā̇ āǏāĢāĒ•ā̇āǍāĒŋāĒ‚āĒ— āLJāǍāĢāǟāǰāĒĩāǞ āǏā̇āǟ āĒ•āǰāĢ‹. āĒĩāǧā́ āĒŽāĒžāĒšāĒŋāǤāĢ€ āĒŽāĒžāǟā̇ āĒ•ā̃āĒĒāĒž āĒ•āǰāĢ€āǍā̇ Crontab Guru āǜā́āĒ“.", + "cron_expression_presets": "āĒ•āĢāǰāĢ‹āǍ āĒāĒ•āĢāǏāĒĒāĢāǰā̇āĒļāǍ āĒĒāĢāǰāĢ€āǏā̇āǟāĢāǏ", + "disable_login": "āǞāĢ‹āĒ—āĒŋāǍ āĒĄāĒŋāǏā̇āĒŦāǞ āĒ•āǰāĢ‹", + "duplicate_detection_job_description": "āǏāǰāĒ–āĢ€ āLjāĒŽā̇āǜāĢ‹ āĒļāĢ‹āǧāĒĩāĒž āĒŽāĒžāǟā̇ āǤāĒŽāĒžāǰāĒž āǏāĒ‚āǏāĒžāǧāǍāĢ‹ āĒĒāǰ āĒŽāĒļāĢ€āǍ āǞāǰāĢāǍāĒŋāĒ‚āĒ—āǍāĢ‹ āljāĒĒāǝāĢ‹āĒ— āĒ•āǰāĢ‹. ādž āǏā́āĒĩāĒŋāǧāĒž āǏāĢāĒŽāĒžāǰāĢāǟ āǏāǰāĢāǚ āĒĒāǰ ādžāǧāĒžāǰāĒŋāǤ āĒ›ā̇", + "exclusion_pattern_description": "āǤāĒŽāĒžāǰāĒž āǏāĒ‚āĒ—āĢāǰāĒšāǍā̇ āǏāĢāĒ•ā̇āǍ āĒ•āǰāǤāĢ€ āĒĩāĒ–āǤā̇ āĒāĒ•āĢāǏāĒ•āĢāǞā́āĒāǍ āĒĒā̇āǟāǰāĢāǍ āǤāĒŽāǍā̇ āĒĢāĒžāLJāǞāĢ‹ āĒ…āǍā̇ āĒĢāĢ‹āǞāĢāĒĄāǰāĢāǏāǍā̇ āĒ…āĒĩāĒ—āĒŖāĒĩāĒžāĒŽāĒžāĒ‚ āĒŽāĒĻāĒĻ āĒ•āǰā̇ āĒ›ā̇. āǜāĢ‹ āǤāĒŽāĒžāǰāĢ€ āĒĒāĒžāǏā̇ āĒāĒĩāĢ€ āĒĢāĒžāLJāǞāĢ‹ āǧāǰāĒžāĒĩāǤāĒž āĒĢāĢ‹āǞāĢāĒĄāǰāĢāǏ āĒšāĢ‹āǝ āǜā̇āǍā̇ āǤāĒŽā̇ āLjāĒŽāĢāĒĒāĢ‹āǰāĢāǟ āĒ•āǰāĒĩāĒž āǍāĒĨāĢ€ āĒŽāĒžāĒ‚āĒ—āǤāĒž, āǜā̇āĒŽ āĒ•ā̇ RAW āĒĢāĒžāLJāǞāĢ‹, āǤāĢ‹ ādž āǏā́āĒĩāĒŋāǧāĒž āljāĒĒāǝāĢ‹āĒ—āĢ€ āĒ›ā̇.", + "export_config_as_json_description": "āĒĩāǰāĢāǤāĒŽāĒžāǍ āǏāĒŋāǏāĢāǟāĒŽ āĒ•āĢ‹āǍāĢāĒĢāĒŋāĒ—āǍā̇ JSON āĒĢāĒžāLJāǞ āǤāǰāĢ€āĒ•ā̇ āĒĄāĒžāljāǍāǞāĢ‹āĒĄ āĒ•āǰāĢ‹", + "external_libraries_page_description": "āĒāĒĄāĒŽāĒŋāǍ āĒāĒ•āĢāǏāǟāǰāĢāǍāǞ āǞāĒžāLjāĒŦāĢāǰā̇āǰāĢ€ āĒĒā̇āǜ", + "face_detection": "āǚāĒšā̇āǰāĒžāǍāĢ€ āĒĒāǰāĒ–", + "face_detection_description": "āĒŽāĒļāĢ€āǍ āǞāǰāĢāǍāĒŋāĒ‚āĒ—āǍāĢ‹ āljāĒĒāǝāĢ‹āĒ— āĒ•āǰāĢ€āǍā̇ āǏāĒ‚āǏāĒžāǧāǍāĢ‹āĒŽāĒžāĒ‚ āǚāĒšā̇āǰāĒžāǍāĢ€ āĒĒāǰāĒ– āĒ•āǰāĢ‹. āĒĩāĢ€āĒĄāĒŋāǝāĢ‹ āĒŽāĒžāǟā̇, āĒĢāĒ•āĢāǤ āĒĨāĒ‚āĒŦāǍā̇āǞ āǜ āǧāĢāǝāĒžāǍāĒŽāĒžāĒ‚ āǞā̇āĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩā̇ āĒ›ā̇. \"āǰāĒŋāĒĢāĢāǰā̇āĒļ\" āĒŦāǧāĒž āǏāĒ‚āǏāĒžāǧāǍāĢ‹ āĒĒāǰ āĒĢāǰāĢ€āĒĨāĢ€ āĒĒāĢāǰāĒ•āĢāǰāĒŋāǝāĒž āĒ•āǰā̇ āĒ›ā̇. \"āǰāĢ€āǏā̇āǟ\" āĒĩāǧāĒžāǰāĒžāĒŽāĒžāĒ‚ āǚāĒšā̇āǰāĒžāǍāĒž āǤāĒŽāĒžāĒŽ āĒĩāǰāĢāǤāĒŽāĒžāǍ āĒĄā̇āǟāĒžāǍā̇ āǏāĒžāĒĢ āĒ•āǰā̇ āĒ›ā̇. \"āĒ–āĢ‚āǟāǤāĒž\" āǤā̇āĒĩāĒž āǏāĒ‚āǏāĒžāǧāǍāĢ‹āǍā̇ āĒ•āǤāĒžāǰāĒŽāĒžāĒ‚ āĒŽāĢ‚āĒ•ā̇ āĒ›ā̇ āǜā̇āǍāĒž āĒĒāǰ āĒšāǜā́ āǏā́āǧāĢ€ āĒĒāĢāǰāĒ•āĢāǰāĒŋāǝāĒž āĒ•āǰāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĢ€ āǍāĒĨāĢ€. āǚāĒšā̇āǰāĒžāǍāĢ€ āĒĒāǰāĒ– āĒĒāĢ‚āǰāĢāĒŖ āĒĨāǝāĒž āĒĒāĒ›āĢ€, āĒļāĢ‹āǧāĒžāǝā̇āǞāĒž āǚāĒšā̇āǰāĒžāĒ“āǍā̇ 'āǚāĒšā̇āǰāĒžāǍāĢ€ āĒ“āĒŗāĒ–' āĒŽāĒžāǟā̇ āĒ•āǤāĒžāǰāĒŽāĒžāĒ‚ āĒŽāĢ‚āĒ•āĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĒļā̇, āǜā̇ āǤā̇āĒŽāǍā̇ āĒšāĒžāǞāǍāĢ€ āĒ…āĒĨāĒĩāĒž āǍāĒĩāĢ€ āĒĩāĢāǝāĒ•āĢāǤāĒŋāĒ“āǍāĒž āǜāĢ‚āĒĨāĒŽāĒžāĒ‚ āĒĩāĒŋāĒ­āĒžāǜāĒŋāǤ āĒ•āǰāĒļā̇.", + "facial_recognition_job_description": "āĒļāĢ‹āǧāĒžāǝā̇āǞāĒž āǚāĒšā̇āǰāĒžāĒ“āǍā̇ āĒĩāĢāǝāĒ•āĢāǤāĒŋāĒ“āǍāĒž āǜāĢ‚āĒĨāĒŽāĒžāĒ‚ āĒĩāĒŋāĒ­āĒžāǜāĒŋāǤ āĒ•āǰāĢ‹. ādž āĒĒāĒ—āǞā́āĒ‚ 'āǚāĒšā̇āǰāĒžāǍāĢ€ āĒĒāǰāĒ–' āĒĒāĢ‚āǰāĢāĒŖ āĒĨāǝāĒž āĒĒāĒ›āĢ€ āĒļāǰāĢ‚ āĒĨāĒžāǝ āĒ›ā̇. \"āǰāĢ€āǏā̇āǟ\" āĒŦāǧāĒž āǚāĒšā̇āǰāĒžāĒ“āǍā́āĒ‚ āĒĢāǰāĢ€āĒĨāĢ€ āǜāĢ‚āĒĨāĢ€āĒ•āǰāĒŖ āĒ•āǰā̇ āĒ›ā̇. \"āĒ–āĢ‚āǟāǤāĒž\" āǤā̇āĒĩāĒž āǚāĒšā̇āǰāĒžāĒ“āǍā̇ āĒ•āǤāĒžāǰāĒŽāĒžāĒ‚ āĒŽāĢ‚āĒ•ā̇ āĒ›ā̇ āǜā̇āĒŽāǍā̇ āĒšāǜā́ āǏā́āǧāĢ€ āĒ•āĢ‹āLj āĒĩāĢāǝāĒ•āĢāǤāĒŋ āĒĢāĒžāĒŗāĒĩāĒĩāĒžāĒŽāĒžāĒ‚ ādžāĒĩāĢ€ āǍāĒĨāĢ€.", + "failed_job_command": "ādž āĒ•āĒžāǰāĢāǝ āĒŽāĒžāǟā̇ ādžāĒĻā̇āĒļ {command} āǍāĒŋāǎāĢāĒĢāĒŗ āǰāĒšāĢāǝāĢ‹: {job}", + "force_delete_user_warning": "āǚā̇āǤāĒĩāĒŖāĢ€: ādž āĒĒāĢāǰāĒ•āĢāǰāĒŋāǝāĒž āǤāǰāǤ āǜ āĒĩāĒĒāǰāĒžāĒļāĒ•āǰāĢāǤāĒž āĒ…āǍā̇ āǤāĒŽāĒžāĒŽ āǏāĒ‚āǏāĒžāǧāǍāĢ‹āǍā̇ āĒĻāĢ‚āǰ āĒ•āǰāĢ€ āĒĻā̇āĒļā̇. ādž āǍāĒŋāǰāĢāĒŖāǝ āĒŦāĒĻāǞāĢ€ āĒļāĒ•āĒžāĒļā̇ āǍāĒšāĢ€āĒ‚ āĒ…āǍā̇ āĒĢāĒžāLJāǞāĢ‹āǍā̇ āĒĢāǰāĢ€āĒĨāĢ€ āĒŽā̇āĒŗāĒĩāĢ€ āĒļāĒ•āĒžāĒļā̇ āǍāĒšāĢ€āĒ‚." + } } diff --git a/i18n/he.json b/i18n/he.json index e4d534693b..629f8166cb 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -18,6 +18,7 @@ "add_a_title": "הוספ×Ē ×›×•×Ēר×Ē", "add_action": "×”×•×Ą×Ŗ פ×ĸולה", "add_action_description": "לח×Ĩ כדי ×œ×”×•×Ą×™×Ŗ פ×ĸולה לבי×Ļו×ĸ", + "add_assets": "×”×•×Ą×Ŗ ×Ēמונו×Ē", "add_birthday": "הוספ×Ē ×™×•× הולד×Ē", "add_endpoint": "×”×•×Ą×Ŗ כ×Ēוב×Ē URL", "add_exclusion_pattern": "הוספ×Ē ×“×¤×•×Ą החרגה", @@ -41,7 +42,7 @@ "add_to_shared_album": "הוספה לאלבום משו×Ē×Ŗ", "add_upload_to_stack": "×”×•×Ą×Ŗ א×Ē ×”×”×ĸלאה ל×ĸרימה", "add_url": "הוספ×Ē ×§×™×Š×•×¨", - "add_workflow_step": "×”×•×Ą×Ŗ שלב בסדר פ×ĸולו×Ē", + "add_workflow_step": "הוספ×Ē ×Š×œ×‘ זרימ×Ē ×ĸבודה", "added_to_archive": "× ×•×Ą×Ŗ לארכיון", "added_to_favorites": "× ×•×Ą×Ŗ למו×ĸדפים", "added_to_favorites_count": "{count, number} נוספו למו×ĸדפים", @@ -52,7 +53,7 @@ "authentication_settings": "הגדרו×Ē ×”×Ēחברו×Ē", "authentication_settings_description": "ניהול סיסמה, OAuth, והגדרו×Ē ×”×Ēחברו×Ē ××—×¨×•×Ē", "authentication_settings_disable_all": "האם בר×Ļונך להשבי×Ē ××Ē ×›×œ שיטו×Ē ×”×”×Ēחברו×Ē? כניסה למ×ĸרכ×Ē ×Ēהיה מושב×Ē×Ē ×œ×—×œ×•×˜×™×Ÿ.", - "authentication_settings_reenable": "כדי לאפשר מחדש, נא להש×Ēמ׊ בפקוד×Ē ×Š×¨×Ē.", + "authentication_settings_reenable": "כדי לאפשר מחדש, יש להש×Ēמ׊ בפקוד×Ē ×Š×¨×Ē.", "background_task_job": "משימו×Ē ×¨×§×ĸ", "backup_database": "גיבוי מסד × ×Ēונים", "backup_database_enable_description": "אפ׊ר גיבויי מסד × ×Ēונים", @@ -103,6 +104,8 @@ "image_preview_description": "×Ēמונה בגודל בינוני ×ĸם מטא-× ×Ēונים שהוסרו, מ׊מ׊×Ē ×‘×ĸ×Ē ×Ļפייה ב×Ēמונה בודד×Ē ×•×ĸבור למיד×Ē ×ž×›×•× ×”", "image_preview_quality_description": "איכו×Ē ×Ē×Ļוגה מקדימה מ-1 ×ĸד 100. איכו×Ē ×’×‘×•×”×” יו×Ēר היא טובה יו×Ēר, אבל מיי×Ļר×Ē ×§×‘×Ļים גדולים יו×Ēר ויכולה להפחי×Ē ××Ē ×Ēגוב×Ēיו×Ē ×”×™×™×Š×•×. הגדר×Ē ×ĸרך נמוך ×ĸשויה להשפי×ĸ ×ĸל איכו×Ē ×Ēו×Ļאו×Ē ×Š×œ למיד×Ē ×ž×›×•× ×”.", "image_preview_title": "הגדרו×Ē ×Ē×Ļוגה מקדימה", + "image_progressive": "הדרג×Ēיו×Ē", + "image_progressive_description": "קידוד ×Ēמונו×Ē JPEG באופן הדרג×Ēי ל×Ē×Ļוג×Ē ×˜×ĸינה הדרג×Ēי×Ē. אין לכך השפ×ĸה ×ĸל ×Ēמונו×Ē WebP.", "image_quality": "איכו×Ē", "image_resolution": "רזולו×Ļיה", "image_resolution_description": "רזולו×Ļיו×Ē ×’×‘×•×”×•×Ē ×™×•×Ēר יכולו×Ē ×œ×Š×ž×¨ פרטים רבים יו×Ēר אך לוקחו×Ē ×–×ž×Ÿ רב יו×Ēר לקידוד, יש להן גדלי קב×Ļים גדולים יו×Ēר ויכולו×Ē ×œ×”×¤×—×™×Ē ××Ē ×Ēגוב×Ēיו×Ē ×”×™×™×Š×•×.", @@ -187,10 +190,21 @@ "machine_learning_smart_search_enabled": "אפ׊ר חיפוש חכם", "machine_learning_smart_search_enabled_description": "אם מושב×Ē, ×Ēמונו×Ē ×œ× יקודדו לחיפוש חכם.", "machine_learning_url_description": "כ×Ēוב×Ē ×”-URL של ׊ר×Ē ×œ×ž×™×“×Ē ×”×ž×›×•× ×”. אם ני×Ē× ×Ē ×™×•×Ēר מכ×Ēוב×Ē URL אח×Ē, כל ׊ר×Ē ×™× ×•×Ą×” ניסיון אחד בכל פ×ĸם ×ĸד שאחד מהם יגיב בה×Ļלחה, לפי הסדר מהראשון ×ĸד האחרון. ׊ר×Ēים שלא מגיבים יוזנחו זמני×Ē ×ĸד שיחזרו להיו×Ē ×ž×§×•×•× ×™×.", + "maintenance_delete_backup": "מחק גיבוי", + "maintenance_delete_backup_description": "קוב×Ĩ זה ימחק ל×Ļמי×Ēו×Ē.", + "maintenance_delete_error": "מחיק×Ē ×”×’×™×‘×•×™ נכשלה.", + "maintenance_restore_backup": "שחזור מגיבוי", + "maintenance_restore_backup_description": "Immich יימחק וישוחזר מהגיבוי שנבחר. גיבוי ייוו×Ļר לפני ׊×Ēמשיך.", + "maintenance_restore_backup_different_version": "גיבוי זה נו×Ļר ×ĸם גרסה שונה של Immich!", + "maintenance_restore_backup_unknown_version": "לא ני×Ēן היה לקבו×ĸ א×Ē ×’×¨×Ą×Ē ×”×’×™×‘×•×™.", + "maintenance_restore_database_backup": "שחזור גיבוי מסד הנ×Ēונים", + "maintenance_restore_database_backup_description": "חזרה למ×Ļב קודם של מסד × ×Ēונים באמ×Ļ×ĸו×Ē ×§×•×‘×Ĩ גיבוי", "maintenance_settings": "×Ēחזוקה", "maintenance_settings_description": "ה×ĸבר א×Ē Immich למ×Ļב ×Ēחזוקה.", - "maintenance_start": "ה×Ēחל×Ē ×ž×Ļב ×Ēחזוקה", + "maintenance_start": "הפ×ĸל×Ē ×ž×Ļב ×Ēחזוקה", "maintenance_start_error": "ה×Ēחל×Ē ×ž×Ļב ×Ēחזוקה נכשלה.", + "maintenance_upload_backup": "ה×ĸלא×Ē ×§×•×‘×Ĩ גיבוי של מסד הנ×Ēונים", + "maintenance_upload_backup_error": "לא ני×Ēן היה לה×ĸלו×Ē ××Ē ×”×’×™×‘×•×™, האם זהו קוב×Ĩ .sql/.sql.gz?", "manage_concurrency": "ניהול מקביליו×Ē", "manage_concurrency_description": "×ĸבור ×œ×“×Ŗ ה×ĸבודו×Ē ×›×“×™ לנהל הר×Ļ×Ē ×ĸבודו×Ē ×‘×ž×§×‘×™×œ", "manage_log_settings": "ניהול הגדרו×Ē ×¨×™×Š×•× ביומן", @@ -258,7 +272,7 @@ "oauth_auto_register": "רישום אוטומטי", "oauth_auto_register_description": "רשום אוטומטי×Ē ×ž×Š×Ēמשים חדשים לאחר כניסה ×ĸם OAuth", "oauth_button_text": "טקץט לח×Ļן", - "oauth_client_secret_description": "נדרש כאשר ץפק ה־OAuth אינו ×Ēומך ב־PKCE (מפ×Ēח הוכחה להחלפ×Ē ×§×•×“)", + "oauth_client_secret_description": "נדרש ×ĸבור לקוח סודי, או אם PKCE (מפ×Ēח הוכחה להחלפ×Ē ×§×•×“) אינו × ×Ēמך ×ĸבור לקוח ×Ļיבורי.", "oauth_enable_description": "ה×Ēחבר ×ĸם OAuth", "oauth_mobile_redirect_uri": "URI להפניה מחדש בנייד", "oauth_mobile_redirect_uri_override": "×ĸקיפ×Ē URI להפניה מחדש בנייד", @@ -297,7 +311,7 @@ "search_jobs": "חיפוש ×ĸבודו×Ēâ€Ļ", "send_welcome_email": "שלח דוא\"ל ברוכים הבאים", "server_external_domain_settings": "דומיין חי×Ļוני", - "server_external_domain_settings_description": "דומיין ×ĸבור קישורים משו×Ēפים ×Ļיבוריים, כולל //:http(s)", + "server_external_domain_settings_description": "דומיין המשמש ×ĸבור קישורים חי×Ļוניים", "server_public_users": "מ׊×Ēמשים ×Ļיבוריים", "server_public_users_description": "כל המש×Ēמשים (׊ם ודוא\"ל) מופי×ĸים ב×ĸ×Ē ×”×•×Ą×¤×Ē ×ž×Š×Ēמ׊ לאלבומים משו×Ēפים. כאשר ה×Ēכונה מושב×Ē×Ē, רשימ×Ē ×”×ž×Š×Ēמשים ×Ēהיה זמינה רק למש×Ēמשים ב×ĸלי הרשאו×Ē × ×™×”×•×œ.", "server_settings": "הגדרו×Ē ×Š×¨×Ē", @@ -397,7 +411,7 @@ "transcoding_tone_mapping": "מיפוי גוונים", "transcoding_tone_mapping_description": "מנסה לשמר א×Ē ×”×ž×¨××” של סרטוני HDR כשהם מומרים ל-SDR. כל אלגורי×Ēם ×ĸושה פשרו×Ē ×Š×•× ×•×Ē ×ĸבור ×Ļב×ĸ, פירוט ובהירו×Ē. Hable מ׊מר פרטים, Mobius מ׊מר ×Ļב×ĸ, ו-Reinhard מ׊מר בהירו×Ē.", "transcoding_transcode_policy": "מדיניו×Ē ×”×ž×¨×Ē ×§×™×“×•×“", - "transcoding_transcode_policy_description": "מדיניו×Ē ×œ×’×‘×™ מ×Ēי יש להמיר קידוד של סרטון. ×Ēמיד יומר הקידוד של סרטוני HDR (למ×ĸט אם המר×Ē ×§×™×“×•×“ מושב×Ē×Ē).", + "transcoding_transcode_policy_description": "מדיניו×Ē ×œ×’×‘×™ מ×Ēי יש להמיר קידוד של סרטון. ×Ēמיד יומר הקידוד של סרטוני HDR וסרטונים ×ĸם פורמט פיקסל השונה מ־YUV 4:2:0 (למ×ĸט אם המר×Ē ×§×™×“×•×“ מושב×Ē×Ē).", "transcoding_two_pass_encoding": "קידוד בשני מ×ĸברים", "transcoding_two_pass_encoding_setting_description": "המר קידוד בשני מ×ĸברים כדי ליי×Ļר סרטונים מקודדים טוב יו×Ēר. כאשר ×§×Ļב סיביו×Ē ×ž×¨×‘×™ מופ×ĸל (נדרש כדי שזה י×ĸבוד ×ĸם H.264 ו-HEVC), מ×Ļב זה מ׊×Ēמ׊ בטווח ×§×Ļב סיביו×Ē ×”×ž×‘×•×Ą×Ą ×ĸל ×§×Ļב הסיביו×Ē ×”×ž×¨×‘×™ ומ×Ē×ĸלם מ-CRF. ×ĸבור VP9, ני×Ēן להש×Ēמ׊ ב-CRF אם ×§×Ļב סיביו×Ē ×ž×¨×‘×™ מושב×Ē.", "transcoding_video_codec": "מקודד סרטון", @@ -437,6 +451,9 @@ "admin_password": "סיסמ×Ē ×ž× ×”×œ", "administration": "ניהול", "advanced": "מ×Ēקדם", + "advanced_settings_clear_image_cache": "נקה קב×Ļי מטמון", + "advanced_settings_clear_image_cache_error": "לא ני×Ēן היה לנקו×Ē ××Ē ×§×‘×Ļי המטמון", + "advanced_settings_clear_image_cache_success": "נוקה בה×Ļלחה {size}", "advanced_settings_enable_alternate_media_filter_subtitle": "הש×Ēמ׊ באפשרו×Ē ×–×• כדי לסנן מדיה במהלך הסנכרון לפי קריטריונים חלופיים. מומל×Ĩ להש×Ēמ׊ בזה רק אם יש ב×ĸיה בזיהוי כל האלבומים באפליק×Ļיה.", "advanced_settings_enable_alternate_media_filter_title": "[ניסיוני] הש×Ēמ׊ במסנן סנכרון אלבום חלופי שמבכשיר", "advanced_settings_log_level_title": "רמ×Ē ×¨×™×Š×•× ביומן: {level}", @@ -478,6 +495,7 @@ "album_summary": "×Ē×§×Ļיר אלבום", "album_updated": "אלבום ×ĸודכן", "album_updated_setting_description": "קבל הוד×ĸ×Ē ×“×•×\"ל כאשר לאלבום משו×Ē×Ŗ יש ×Ēמונו×Ē ×—×“×Š×•×Ē", + "album_upload_assets": "ה×ĸלה ×Ēמונו×Ē ×ž×”×ž×—×Š×‘ שלך ×•×”×•×Ą×Ŗ לאלבום", "album_user_left": "×ĸזב א×Ē {album}", "album_user_removed": "{user} הוסר", "album_viewer_appbar_delete_confirm": "האם א×Ē/ה בטוח/ה שבר×Ļונך למחוק א×Ē ×”××œ×‘×•× הזה מהחשבון שלך?", @@ -495,9 +513,11 @@ "albums_default_sort_order_description": "סדר מיון ×Ēמונו×Ē ×¨××Š×•× ×™ ב×ĸ×Ē ×™×Ļיר×Ē ××œ×‘×•×ž×™× חדשים.", "albums_feature_description": "אוספים של ×Ēמונו×Ē ××Š×¨ ני×Ēנים לשי×Ēות ×ĸם מ׊×Ēמשים אחרים.", "albums_on_device_count": "אלבומים במכשיר ({count})", + "albums_selected": "{count, plural, one {אלבום אחד נבחר} other {# אלבומים נבחרו}}", "all": "הכל", "all_albums": "כל האלבומים", "all_people": "כל האנשים", + "all_photos": "כל ה×Ēמונו×Ē", "all_videos": "כל הסרטונים", "allow_dark_mode": "אפ׊ר מ×Ļב כהה", "allow_edits": "אפ׊ר ×ĸריכו×Ē", @@ -505,6 +525,9 @@ "allow_public_user_to_upload": "אפ׊ר למש×Ēמ׊ ×Ļיבורי לה×ĸלו×Ē", "allowed": "מורשה", "alt_text_qr_code": "×Ēמונ×Ē ×§×•×“ QR", + "always_keep": "שמור ×Ēמיד", + "always_keep_photos_hint": "פינוי מקום ישמור א×Ē ×›×œ ה×Ēמונו×Ē ×‘×ž×›×Š×™×¨ זה.", + "always_keep_videos_hint": "פינוי מקום ישמור א×Ē ×›×œ הסרטונים במכשיר זה.", "anti_clockwise": "נגד כיוון הש×ĸון", "api_key": "מפ×Ēח API", "api_key_description": "ה×ĸרך הזה יו×Ļג רק פ×ĸם אח×Ē. נא לוודא שה×ĸ×Ē×§×Ē ××•×Ēו לפני סגיר×Ē ×”×—×œ×•×Ÿ.", @@ -549,6 +572,9 @@ "asset_list_layout_sub_title": "פריסה", "asset_list_settings_subtitle": "הגדרו×Ē ×Ēבני×Ē ×¨×Š×Ē ×Ēמונו×Ē", "asset_list_settings_title": "ר׊×Ē ×Ēמונו×Ē", + "asset_not_found_on_device_android": "מדיה לא נמ×Ļאה במכשיר", + "asset_not_found_on_device_ios": "המדיה לא נמ×Ļאה במכשיר. אם א×Ēה מ׊×Ēמ׊ ב-iCloud, יי×Ēכן שהמדיה אינה נגישה ×ĸקב קוב×Ĩ פגום המאוחסן ב-iCloud", + "asset_not_found_on_icloud": "המדיה לא נמ×Ļאה ב-iCloud. יי×Ēכן שהמדיה אינה נגישה ×ĸקב קוב×Ĩ פגום המאוחסן ב-iCloud", "asset_offline": "×Ēמונה לא מקוונ×Ē", "asset_offline_description": "ה×Ēמונה החי×Ļוני×Ē ×”×–××Ē ×›×‘×¨ לא נמ×Ļא×Ē ×‘×“×™×Ą×§. נא לי×Ļור ק׊ר ×ĸם מנהל Immich שלך לקבל×Ē ×ĸזרה.", "asset_restored_successfully": "×Ēמונה שוחזרה בה×Ļלחה", @@ -720,6 +746,8 @@ "change_password_form_password_mismatch": "סיסמאו×Ē ×œ× ×Ēואמו×Ē", "change_password_form_reenter_new_password": "הכנס שוב סיסמה חדשה", "change_pin_code": "שנה קוד PIN", + "change_trigger": "שנה טריגר", + "change_trigger_prompt": "האם א×Ēה בטוח שבר×Ļונך לשנו×Ē ××Ē ×”×˜×¨×™×’×¨? פ×ĸולה זו ×Ēסיר א×Ē ×›×œ הפ×ĸולו×Ē ×•×”×ž×Ą× × ×™× הקיימים.", "change_your_password": "×”×—×œ×Ŗ א×Ē ×”×Ą×™×Ą×ž×” שלך", "changed_visibility_successfully": "הנראו×Ē ×Š×•× ×Ēה בה×Ļלחה", "charging": "טו×ĸן", @@ -728,9 +756,21 @@ "check_corrupt_asset_backup_button": "ב×Ļ×ĸ בדיקה", "check_corrupt_asset_backup_description": "הר×Ĩ בדיקה זו רק ×ĸל Wi-Fi ולאחר שכל ה×Ēמונו×Ē ×’×•×‘×•. ההליך ×ĸשוי לקח×Ē ×›×ž×” דקו×Ē.", "check_logs": "בדוק יומני רישום", - "checksum": "Checksum", + "checksum": "סיכום ביקור×Ē", "choose_matching_people_to_merge": "בחר אנשים ×Ēואמים למיזוג", "city": "×ĸיר", + "cleanup_confirm_description": "Immich מ×Ļא {count} ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× (שנו×Ļרו לפני {date}) מגובים בבטחה לשר×Ē. להסיר א×Ē ×”×ĸו×Ēקים המקומיים ממכשיר זה?", + "cleanup_confirm_prompt_title": "להסיר ממכשיר זה?", + "cleanup_deleted_assets": "{count} ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× הו×ĸברו לאשפה של המכשיר", + "cleanup_deleting": "מ×ĸביר לאשפה...", + "cleanup_found_assets": "נמ×Ļאו {count} ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× מגובים", + "cleanup_found_assets_with_size": "נמ×Ļאו {count} ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× מגובים ({size})", + "cleanup_icloud_shared_albums_excluded": "אלבומי iCloud משו×Ēפים אינם כלולים בסריקה", + "cleanup_no_assets_found": "לא נמ×Ļאו ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× ה×Ēואמים א×Ē ×”×§×¨×™×˜×¨×™×•× ×™× ל×ĸיל. פינוי שטח יכול להסיר רק נכסים שגובו לשר×Ē", + "cleanup_preview_title": "×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× להסרה ({count})", + "cleanup_step3_description": "סרוק אחר ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× מגובים ה×Ēואמים א×Ē ×”×Ēאריך שבחר×Ē ×•×Š×ž×•×¨ א×Ē ×”×”×’×“×¨×•×Ē.", + "cleanup_step4_summary": "{count} ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× (שנו×Ļרו לפני {date}) להסרה מהמכשיר המקומי שלך. ה×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× יישארו נגישים מאפליק×Ļיי×Ē Immich.", + "cleanup_trash_hint": "כדי לפנו×Ē ×Š×˜×— אחסון במכשיר, פ×Ēחו א×Ē ××¤×œ×™×§×Ļיי×Ē ×”×’×œ×¨×™×” במכשיר ורוקנו א×Ē ×”××Š×¤×”", "clear": "נקה", "clear_all": "נקה הכל", "clear_all_recent_searches": "נקה א×Ē ×›×œ החיפושים האחרונים", @@ -742,6 +782,8 @@ "client_cert_import": "ייבוא", "client_cert_import_success_msg": "×Ē×ĸוד×Ē ×œ×§×•×— מיובא×Ē", "client_cert_invalid_msg": "קוב×Ĩ ×Ē×ĸודה לא ×Ēקין או סיסמה שגויה", + "client_cert_password_message": "הזן א×Ē ×”×Ą×™×Ą×ž×” ×ĸבור ×Ē×ĸודה זו", + "client_cert_password_title": "סיסמ×Ē ×”×Ē×ĸודה", "client_cert_remove_msg": "×Ē×ĸוד×Ē ×œ×§×•×— הוסרה", "client_cert_subtitle": "×Ēומך בפורמט PKCS12 (.p12, .pfx) בלבד. ייבוא/הסרה של ×Ē×ĸודה זמינה רק לפני ה×Ēחברו×Ē", "client_cert_title": "×Ē×ĸוד×Ē ×œ×§×•×— SSL [ניסיוני]", @@ -752,6 +794,11 @@ "color": "×Ļב×ĸ", "color_theme": "×Ļב×ĸ ×ĸרכ×Ē × ×•×Š×", "command": "פקודה", + "command_palette_prompt": "מ×Ļא במהירו×Ē ×“×¤×™×, פ×ĸולו×Ē ××• פקודו×Ē", + "command_palette_to_close": "לסגור", + "command_palette_to_navigate": "להיכנס", + "command_palette_to_select": "לבחור", + "command_palette_to_show_all": "לה×Ļיג הכל", "comment_deleted": "×Ēגובה נמחקה", "comment_options": "אפשרויו×Ē ×Ēגובה", "comments_and_likes": "×Ēגובו×Ē & לייקים", @@ -796,6 +843,7 @@ "create_album": "×Ļור אלבום", "create_album_page_untitled": "ללא כו×Ēר×Ē", "create_api_key": "י×Ļיר×Ē ×ž×¤×Ēח API", + "create_first_workflow": "×Ļור זרימ×Ē ×ĸבודה ראשוני×Ē", "create_library": "×Ļור ספרייה", "create_link": "×Ļור קישור", "create_link_to_share": "×Ļור קישור לשי×Ēות", @@ -810,17 +858,25 @@ "create_tag": "×Ļור ×Ēג", "create_tag_description": "×Ļור ×Ēג חדש. ×ĸבור ×Ēגים מקוננים, נא להזין א×Ē ×”× ×Ēיב המלא של ה×Ēג כולל קווים נטויים.", "create_user": "×Ļור מ׊×Ēמ׊", + "create_workflow": "×Ļור זרימ×Ē ×ĸבודה", "created": "נו×Ļר", "created_at": "נו×Ļר", "creating_linked_albums": "יו×Ļר אלבומים מקושרים...", "crop": "ח×Ēוך", + "crop_aspect_ratio_fixed": "×Ēוקן", + "crop_aspect_ratio_free": "חינם", + "crop_aspect_ratio_original": "מקורי", "curated_object_page_title": "דברים", "current_device": "מכשיר נוכחי", "current_pin_code": "קוד PIN הנוכחי", "current_server_address": "כ×Ēוב×Ē ×Š×¨×Ē × ×•×›×—×™×Ē", + "custom_date": "×Ēאריך מו×Ēאם אישי×Ē", "custom_locale": "אזור שפה מו×Ēאם אישי×Ē", - "custom_locale_description": "×ĸ×Ļב ×Ēאריכים ומספרים ×ĸל סמך השפה והאזור", + "custom_locale_description": "×ĸ×Ļב ×Ēאריכים, זמנים, ומספרים ×ĸל סמך השפה והאזור שנבחרו", "custom_url": "קישור מו×Ēאם אישי×Ē", + "cutoff_date_description": "שמור ×Ēמונו×Ē ×žâ€Ļ", + "cutoff_day": "{count, plural, one {יום} other {ימים}}", + "cutoff_year": "{count, plural, one {שנה} other {שנים}}", "daily_title_text_date": "E, MMM dd", "daily_title_text_date_year": "E, MMM dd, yyyy", "dark": "כהה", @@ -839,8 +895,6 @@ "deduplication_criteria_2": "כמו×Ē × ×Ēוני EXIF", "deduplication_info": "מיד×ĸ ×ĸל ביטול כפילויו×Ē", "deduplication_info_description": "כדי לבחור מרא׊ ×Ēמונו×Ē ×‘××•×¤×Ÿ אוטומטי ולהסיר כפילויו×Ē ×‘×›×ž×•×Ē ×’×“×•×œ×”, אנו מס×Ēכלים ×ĸל:", - "default_locale": "׊פ×Ē ×‘×¨×™×¨×Ē ×ž×—×“×œ", - "default_locale_description": "פורמט ×Ēאריכים ומספרים מבוסס ׊פ×Ē ×”×“×¤×“×¤×Ÿ שלך", "delete": "מחק", "delete_action_confirmation_message": "האם א×Ēה בטוח שבר×Ļונך למחוק א×Ē ×”×Ēמונה הזא×Ē? פ×ĸולה זו ×Ē×ĸביר או×Ēו לאשפה של השר×Ē, ו×Ēשאל אם בר×Ļונך למחוק או×Ēו גם מהמכשיר המקומי", "delete_action_prompt": "{count} נמחקו", @@ -876,6 +930,7 @@ "deselect_all": "בטל הכל", "details": "פרטים", "direction": "כיוון", + "disable": "השב×Ē", "disabled": "מושב×Ē", "disallow_edits": "אל ×Ēאפ׊ר ×ĸריכו×Ē", "discord": "דיסקורד", @@ -901,6 +956,7 @@ "download_include_embedded_motion_videos": "סרטונים מוטמ×ĸים", "download_include_embedded_motion_videos_description": "כלול סרטונים מוט×ĸמים ב×Ēמונו×Ē ×ĸם ×Ēנו×ĸה כקוב×Ĩ נפרד", "download_notfound": "הורדה לא נמ×Ļא", + "download_original": "הורד א×Ē ×”×ž×§×•×¨", "download_paused": "הורדה הופסקה", "download_settings": "הורדה", "download_settings_description": "ניהול הגדרו×Ē ×”×§×Š×•×¨×•×Ē ×œ×”×•×¨×“×Ē ×Ēמונו×Ē", @@ -910,6 +966,7 @@ "download_waiting_to_retry": "מחכה כדי לנסו×Ē ×Š×•×‘", "downloading": "מוריד", "downloading_asset_filename": "מוריד ×Ēמונה {filename}", + "downloading_from_icloud": "מוריד מ-iCloud", "downloading_media": "מוריד מדיה", "drop_files_to_upload": "שחרר קב×Ļים בכל מקום כדי לה×ĸלו×Ē", "duplicates": "כפילויו×Ē", @@ -938,9 +995,22 @@ "edit_tag": "×ĸרוך ×Ēג", "edit_title": "×ĸרוך כו×Ēר×Ē", "edit_user": "×ĸרוך מ׊×Ēמ׊", + "edit_workflow": "×ĸרוך זרימ×Ē ×ĸבודה", "editor": "×ĸורך", "editor_close_without_save_prompt": "השינויים לא יישמרו", "editor_close_without_save_title": "לסגור א×Ē ×”×ĸורך?", + "editor_confirm_reset_all_changes": "האם א×Ēה בטוח שבר×Ļונך לאפס א×Ē ×›×œ השינויים?", + "editor_discard_edits_confirm": "בטל ×ĸריכו×Ē", + "editor_discard_edits_prompt": "יש לך ×ĸריכו×Ē ×Š×œ× נשמרו. האם א×Ēה בטוח שבר×Ļונך למחוק או×Ēן?", + "editor_discard_edits_title": "למחוק א×Ē ×”×ĸריכו×Ē?", + "editor_edits_applied_error": "החל×Ē ×”×ĸריכו×Ē × ×›×Š×œ×”", + "editor_edits_applied_success": "×ĸריכו×Ē ×™×•×Š×ž×• בה×Ļלחה", + "editor_flip_horizontal": "הפוך אופקי×Ē", + "editor_flip_vertical": "הפוך אנכי×Ē", + "editor_orientation": "כיוון", + "editor_reset_all_changes": "איפוס שינויים", + "editor_rotate_left": "סיבוב 90° נגד כיוון הש×ĸון", + "editor_rotate_right": "סיבוב 90° ×ĸם כיוון הש×ĸון", "email": "דוא\"ל", "email_notifications": "ה×Ēראו×Ē ×‘××™×ž×™×™×œ", "empty_folder": "×Ēיקיה זו ריקה", @@ -959,11 +1029,14 @@ "error_change_sort_album": "שינוי סדר מיון אלבום נכשל", "error_delete_face": "שגיאה במחיק×Ē ×¤× ×™× מ×Ēמונה", "error_getting_places": "שגיאה בקבל×Ē ×ž×§×•×ž×•×Ē", + "error_loading_albums": "שגיאה בט×ĸינ×Ē ××œ×‘×•×ž×™×", "error_loading_image": "שגיאה בט×ĸינ×Ē ×”×Ēמונה", "error_loading_partners": "שגיאה בט×ĸינ×Ē ×Š×•×Ēפים: {error}", + "error_retrieving_asset_information": "שגיאה באחזור פרטי המדיה", "error_saving_image": "שגיאה: {error}", "error_tag_face_bounding_box": "שגיאה ב×Ēיוג הפנים – לא ני×Ēן לקבל א×Ē ×§×•××•×¨×“×™× ×˜×•×Ē ×”×ž×Ą×’×¨×Ē", "error_title": "שגיאה - משהו הש×Ēבש", + "error_while_navigating": "שגיאה בניווט ל×Ēמונה", "errors": { "cannot_navigate_next_asset": "לא ני×Ēן לנווט ל×Ēמונה הבאה", "cannot_navigate_previous_asset": "לא ני×Ēן לנווט ל×Ēמונה הקודמ×Ē", @@ -999,6 +1072,7 @@ "failed_to_update_notification_status": "שגיאה ב×ĸדכון הה×Ēראה", "incorrect_email_or_password": "דוא\"ל או סיסמה שגויים", "library_folder_already_exists": "× ×Ēיב הייבוא כבר מוגדר.", + "page_not_found": "ה×ĸמוד לא נמ×Ļא â€Ē:/â€Ŧ", "paths_validation_failed": "{paths, plural, one {× ×Ēיב # נכשל} other {# × ×Ēיבים נכשלו}} אימו×Ē", "profile_picture_transparent_pixels": "×Ēמונו×Ē ×¤×¨×•×¤×™×œ אינן יכולו×Ē ×œ×›×œ×•×œ פיקסלים שקופים. נא להגדיל ו/או להזיז א×Ē ×”×Ēמונה.", "quota_higher_than_disk_size": "הגדר×Ē ×ž×›×Ą×” גבוהה יו×Ēר מגודל הדיסק", @@ -1021,6 +1095,7 @@ "unable_to_complete_oauth_login": "לא ני×Ēן להשלים ה×Ēחברו×Ē OAuth", "unable_to_connect": "לא ני×Ēן לה×Ēחבר", "unable_to_copy_to_clipboard": "לא ני×Ēן לה×ĸ×Ēיק ללוח, יש לודא שניגש×Ē ×œ×“×Ŗ דרך https", + "unable_to_create": "לא ני×Ēן לי×Ļור זרימ×Ē ×ĸבודה", "unable_to_create_admin_account": "לא ני×Ēן לי×Ļור חשבון מנהל", "unable_to_create_api_key": "לא ני×Ēן לי×Ļור מפ×Ēח API חדש", "unable_to_create_library": "לא ני×Ēן לי×Ļור ספרייה", @@ -1031,6 +1106,7 @@ "unable_to_delete_exclusion_pattern": "לא ני×Ēן למחוק דפוס החרגה", "unable_to_delete_shared_link": "לא ני×Ēן למחוק קישור משו×Ē×Ŗ", "unable_to_delete_user": "לא ני×Ēן למחוק מ׊×Ēמ׊", + "unable_to_delete_workflow": "לא ני×Ēן למחוק א×Ē ×–×¨×™×ž×Ē ×”×ĸבודה", "unable_to_download_files": "לא ני×Ēן להוריד קב×Ļים", "unable_to_edit_exclusion_pattern": "לא ני×Ēן ל×ĸרוך דפוס החרגה", "unable_to_empty_trash": "לא ני×Ēן לרוקן אשפה", @@ -1070,6 +1146,7 @@ "unable_to_scan_library": "לא ני×Ēן לסרוק ספרייה", "unable_to_set_feature_photo": "לא ני×Ēן להגדיר ×Ēמונה מיי×Ļג×Ē", "unable_to_set_profile_picture": "לא ני×Ēן להגדיר ×Ēמונ×Ē ×¤×¨×•×¤×™×œ", + "unable_to_set_rating": "לא ני×Ēן להגדיר דירוג", "unable_to_submit_job": "לא ני×Ēן לשלוח משימה", "unable_to_trash_asset": "לא ני×Ēן לה×ĸביר ×Ēמונה לאשפה", "unable_to_unlink_account": "לא ני×Ēן לבטל קישור חשבון", @@ -1081,8 +1158,10 @@ "unable_to_update_settings": "לא ני×Ēן ל×ĸדכן הגדרו×Ē", "unable_to_update_timeline_display_status": "לא ני×Ēן ל×ĸדכן א×Ē ×ž×Ļב ×Ē×Ļוג×Ē ×Ļיר הזמן", "unable_to_update_user": "לא ני×Ēן ל×ĸדכן מ׊×Ēמ׊", + "unable_to_update_workflow": "לא ני×Ēן ל×ĸדכן א×Ē ×–×¨×™×ž×Ē ×”×ĸבודה", "unable_to_upload_file": "לא ני×Ēן לה×ĸלו×Ē ×§×•×‘×Ĩ" }, + "errors_text": "שגיאו×Ē", "exclusion_pattern": "דפוס אי הכללה", "exif": "Exif", "exif_bottom_sheet_description": "×”×•×Ą×Ŗ ×Ēיאור...", @@ -1093,6 +1172,7 @@ "exif_bottom_sheet_people": "אנשים", "exif_bottom_sheet_person_add_person": "×”×•×Ą×Ŗ ׊ם", "exit_slideshow": "×Ļא ממ×Ļג×Ē ×Š×§×•×¤×™×•×Ē", + "expand": "הרחב", "expand_all": "הרחב הכל", "experimental_settings_new_asset_list_subtitle": "×ĸבודה ב×Ēהליך", "experimental_settings_new_asset_list_title": "אפ׊ר ר׊×Ē ×Ēמונו×Ē × ×™×Ą×™×•× ×™×Ē", @@ -1128,12 +1208,17 @@ "features_in_development": "×Ēכונו×Ē ×‘×¤×™×Ēוח", "features_setting_description": "ניהול ×Ēכונו×Ē ×”×™×™×Š×•×", "file_name_or_extension": "׊ם קוב×Ĩ או סיומ×Ē", + "file_name_text": "׊ם הקוב×Ĩ", + "file_name_with_value": "׊ם הקוב×Ĩ: {file_name}", "file_size": "גודל קוב×Ĩ", "filename": "׊ם קוב×Ĩ", "filetype": "סוג קוב×Ĩ", "filter": "סנן", + "filter_description": "×Ēנאים לסינון ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× ר×Ļויים", "filter_people": "סנן אנשים", "filter_places": "סינון מקומו×Ē", + "filter_tags": "×Ēגי סינון", + "filters": "מסננים", "find_them_fast": "מ×Ļא או×Ēם מהר לפי ׊ם ×ĸם חיפוש", "first": "ראשון", "fix_incorrect_match": "×Ēקן ה×Ēאמה שגויה", @@ -1143,12 +1228,16 @@ "folders_feature_description": "×ĸיון ב×Ē×Ļוג×Ē ×”×Ēיקייה ×ĸבור ה×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× שבמ×ĸרכ×Ē ×”×§×‘×Ļים", "forgot_pin_code_question": "שחכ×Ē ××Ē ×”-PIN שלך?", "forward": "קדימה", + "free_up_space": "פינוי מקום", + "free_up_space_description": "ה×ĸבר ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× מגובים לאשפה של המכשיר שלך כדי לפנו×Ē ×ž×§×•×. ה×ĸו×Ēקים בשר×Ē × ×Š××¨×™× בטוחים.", + "free_up_space_settings_subtitle": "פינוי אחסון במכשיר", "full_path": "× ×Ēיב מלא: {path}", "gcast_enabled": "Google Cast", "gcast_enabled_description": "×Ēכונה זא×Ē ×˜×•×ĸ× ×Ē ×ž×Š××‘×™× חי×Ļוניים מגוגל בכדי לפ×ĸול.", "general": "כללי", "geolocation_instruction_location": "לח×Ĩ ×ĸל פריט ×ĸם קואורדינטו×Ē GPS כדי להש×Ēמ׊ במיקומו, או בחר מיקום ישירו×Ē ×ž×”×ž×¤×”", "get_help": "קבל ×ĸזרה", + "get_people_error": "שגיאה בקבל×Ē ×× ×Š×™×", "get_wifiname_error": "לא היה ני×Ēן לקבל א×Ē ×Š× האינטרנט האלחוטי שלך. יש לודא שה×ĸ× ×§×Ē ××Ē ×”×”×¨×Š××•×Ē ×”×“×¨×•×Š×•×Ē ×•×Š××Ē/ה מחובר/×Ē ×œ×¨×Š×Ē ××™× ×˜×¨× ×˜ אלחוטי", "getting_started": "×Ēחיל×Ē ×”×ĸבודה", "go_back": "חזור", @@ -1181,6 +1270,7 @@ "hide_named_person": "הס×Ēר אדם {name}", "hide_password": "הס×Ēר סיסמה", "hide_person": "הס×Ēר אדם", + "hide_schema": "הס×Ēר א×Ē ×”×Ą×›×™×ž×”", "hide_text_recognition": "הס×Ēר×Ē ×–×™×”×•×™ טקץט", "hide_unnamed_people": "הס×Ēר אנשים ללא ׊ם", "home_page_add_to_album_conflicts": "{added} ×Ēמונו×Ē × ×•×Ą×¤×• לאלבום {album}. {failed} ×Ēמונו×Ē ×›×‘×¨ נמ×Ļאו×Ē ×‘××œ×‘×•×.", @@ -1253,9 +1343,18 @@ "ios_debug_info_processing_ran_at": "ה×ĸיבוד ה×Ēב×Ļ×ĸ ב־{dateTime}", "items_count": "{count, plural, one {פריט #} other {# פריטים}}", "jobs": "משימו×Ē", + "json_editor": "×ĸורך JSON", + "json_error": "שגיא×Ē JSON", "keep": "שמור", + "keep_albums": "שמור אלבומים", + "keep_albums_count": "השאר×Ē {count, plural, one {אלבום אחד} other {{count} אלבומים}}", "keep_all": "שמור הכל", + "keep_description": "בחר מה נ׊אר במכשיר שלך כשא×Ēה מפנה מקום.", + "keep_favorites": "שמור מו×ĸדפים", + "keep_on_device": "שמור במכשיר", + "keep_on_device_hint": "בחר פריטים לשמירה במכשיר זה", "keep_this_delete_others": "שמור ×ĸל זה, מחק אחרים", + "keeping": "שומר: {items}", "kept_this_deleted_others": "×Ēמונה זו נשמרה ונמחקו {count, plural, one {×Ēמונה #} other {# ×Ēמונו×Ē}}", "keyboard_shortcuts": "קי×Ļורי מקלד×Ē", "language": "שפה", @@ -1349,10 +1448,28 @@ "loop_videos_description": "אפ׊ר הפ×ĸלה חוזר×Ē ××•×˜×•×ž×˜×™×Ē ×Š×œ סרטון במ×Ļיג הפרטים.", "main_branch_warning": "הגרסה המו×Ē×§× ×Ē ×”×™× גרס×Ē ×¤×™×Ēוח; אנחנו ממלי×Ļים בחום להש×Ēמ׊ בגרסה י×Ļיבה!", "main_menu": "×Ēפריט ראשי", + "maintenance_action_restore": "שחזור מסד × ×Ēונים", "maintenance_description": "Immich הו×ĸבר למ×Ļב ×Ēחזוקה.", "maintenance_end": "סיום מ×Ļב ×Ēחזוקה", "maintenance_end_error": "כשל בסיום מ×Ļב ×Ēחזוקה.", "maintenance_logged_in_as": "מחובר כרג×ĸ ב×Ēור {user}", + "maintenance_restore_from_backup": "שחזור מגיבוי", + "maintenance_restore_library": "שחזר א×Ē ×”×Ą×¤×¨×™×™×” שלך", + "maintenance_restore_library_confirm": "אם זה נראה נכון, המשך לשחזר גיבוי!", + "maintenance_restore_library_description": "משחזר א×Ē ×ž×Ą×“ הנ×Ēונים", + "maintenance_restore_library_folder_has_files": "ל-{folder} יש {count} ×Ēיקיו×Ē", + "maintenance_restore_library_folder_no_files": "ל־{folder} חסרים קב×Ļים!", + "maintenance_restore_library_folder_pass": "ני×Ē× ×Ē ×œ×§×¨×™××” וכ×Ēיבה", + "maintenance_restore_library_folder_read_fail": "אינה ני×Ē× ×Ē ×œ×§×¨×™××”", + "maintenance_restore_library_folder_write_fail": "אינה ני×Ē× ×Ē ×œ×›×Ēיבה", + "maintenance_restore_library_hint_missing_files": "יי×Ēכן שחסרים לך קב×Ļים חשובים", + "maintenance_restore_library_hint_regenerate_later": "ני×Ēן ליי×Ļר מחדש א×Ē ××œ×” מאוחר יו×Ēר בהגדרו×Ē", + "maintenance_restore_library_hint_storage_template_missing_files": "מ׊×Ēמ׊/×Ē ×‘×Ēבני×Ē ××—×Ą×•×Ÿ? יי×Ēכן שחסרים לך קב×Ļים", + "maintenance_restore_library_loading": "ב×Ēהליך ט×ĸינ×Ē ×‘×“×™×§×•×Ē ×Š×œ×ž×•×Ē ×•×”×™×•×¨×™×Ą×˜×™×§×•×Ēâ€Ļ", + "maintenance_task_backup": "י×Ļיר×Ē ×’×™×‘×•×™ של מסד הנ×Ēונים הנוכחיâ€Ļ", + "maintenance_task_migrations": "ב×Ēהליך הר×Ļ×Ē ×”×’×™×¨×•×Ē ×Š×œ מסד × ×Ēוניםâ€Ļ", + "maintenance_task_restore": "ב×Ēהליך שחזור של הגיבוי שנבחרâ€Ļ", + "maintenance_task_rollback": "השחזור כשל, ב×Ēהליך גלגול חזרה לנקוד×Ē ×Š×—×–×•×¨â€Ļ", "maintenance_title": "לא זמין באופן זמני", "make": "×Ēו×Ļר×Ē", "manage_geolocation": "נהל מיקום", @@ -1414,6 +1531,8 @@ "minimize": "מז×ĸר", "minute": "דקה", "minutes": "דקו×Ē", + "mirror_horizontal": "אופקי", + "mirror_vertical": "אנכי", "missing": "חסרים", "mobile_app": "אפליק×Ļיה לטלפון", "mobile_app_download_onboarding_note": "הורד א×Ē ×”××¤×œ×™×§×Ļיה המלווה באח×Ē ×ž×”××¤×Š×¨×•×™×•×Ē ×”×‘××•×Ē", @@ -1422,11 +1541,14 @@ "monthly_title_text_date_format": "MMMM y", "more": "×ĸוד", "move": "ה×ĸבר", + "move_down": "הזזה למטה", "move_off_locked_folder": "הו×Ļאה מה×Ēיקייה הנ×ĸולה", "move_to": "ה×ĸבר ל", + "move_to_device_trash": "ה×ĸברה לפח האשפה של המכשיר", "move_to_lock_folder_action_prompt": "{count} נוספו ל×Ēיקייה הנ×ĸולה", "move_to_locked_folder": "ה×ĸבר ל×Ēיקיה הנ×ĸולה", "move_to_locked_folder_confirmation": "ה×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× האלו יוסרו מכל האלבומים, ויהיו מו×Ļגים רק ב×Ēיקיה הנ×ĸולה", + "move_up": "הזזה למ×ĸלה", "moved_to_archive": "{count, plural, one {הו×ĸברה ×Ēמונה # } other {# ×Ēמונו×Ē ×”×•×ĸברו}} לארכיון", "moved_to_library": "{count, plural, one {הו×ĸברה ×Ēמונה # } other {# ×Ēמונו×Ē ×”×•×ĸברו}} לספריה", "moved_to_trash": "הו×ĸבר לאשפה", @@ -1436,6 +1558,7 @@ "my_albums": "האלבומים שלי", "name": "׊ם", "name_or_nickname": "׊ם או כינוי", + "name_required": "נדרש ׊ם", "navigate": "נווט", "navigate_to_time": "נווט אל זמן", "network_requirement_photos_upload": "הש×Ēמ׊ בנ×Ēונים ניידים לגיבוי ×Ēמונו×Ē", @@ -1460,20 +1583,24 @@ "next": "הבא", "next_memory": "הזיכרון הבא", "no": "לא", + "no_actions_added": "×ĸדיין לא נוספו פ×ĸולו×Ē", + "no_albums_found": "לא נמ×Ļאו אלבומים", "no_albums_message": "×Ļור אלבום כדי לארגן א×Ē ×”×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× שלך", "no_albums_with_name_yet": "זה נראה שאין לך ×ĸדיין את אלבום ×ĸם השם הזה.", "no_albums_yet": "זה נראה שאין לך ×ĸדיין אלבומים.", "no_archived_assets_message": "ה×ĸבר ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× לארכיון כדי להס×Ēיר או×Ēם מ×Ē×Ļוג×Ē ×”×Ēמונו×Ē ×Š×œ×š", - "no_assets_message": "לח×Ĩ כדי לה×ĸלו×Ē ××Ē ×”×Ēמונה הראשונה שלך", + "no_assets_message": "יש ללחו×Ĩ כדי לה×ĸלו×Ē ××Ē ×”×Ēמונה הראשונה שלך", "no_assets_to_show": "אין ×Ēמונו×Ē ×œ×”×Ļגה", "no_cast_devices_found": "לא נמ×Ļאו מכשירי שידור", "no_checksum_local": "אין Checksum זמין - לא ני×Ēן לאחזר ×Ēמונו×Ē ×ž×§×•×ž×™×•×Ē", "no_checksum_remote": "אין Checksum זמין - לא ני×Ēן לאחזר ×Ēמונו×Ē ×ž×”×Š×¨×Ē", + "no_configuration_needed": "לא נדרש×Ē ×Ē×Ļורה", "no_devices": "אין מכשירים מורשים", "no_duplicates_found": "לא נמ×Ļאו כפילויו×Ē.", "no_exif_info_available": "אין מיד×ĸ זמין ×ĸל מטא-× ×Ēונים (exif)", "no_explore_results_message": "ה×ĸלה ×Ēמונו×Ē × ×•×Ą×¤×•×Ē ×›×“×™ לחקור א×Ē ×”××•×Ą×Ŗ שלך.", "no_favorites_message": "×”×•×Ą×Ŗ מו×ĸדפים כדי למ×Ļוא במהירו×Ē ××Ē ×”×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× הכי טובים שלך", + "no_filters_added": "×ĸדיין לא נוספו מסננים", "no_libraries_message": "×Ļור ספרייה חי×Ļוני×Ē ×›×“×™ לראו×Ē ××Ē ×”×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× שלך", "no_local_assets_found": "לא נמ×Ļאו ×Ēמונו×Ē ×ĸם Checksum זהה", "no_location_set": "לא הוגדר מיקום", @@ -1487,6 +1614,7 @@ "no_results_description": "נסה להש×Ēמ׊ במילה נרדפ×Ē ××• במיל×Ē ×ž×¤×Ēח יו×Ēר כללי×Ē", "no_shared_albums_message": "×Ļור אלבום כדי לש×Ē×Ŗ ×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× ×ĸם אנשים ברש×Ē ×Š×œ×š", "no_uploads_in_progress": "אין ה×ĸלאו×Ē ×‘×Ēהליך", + "none": "את אחד", "not_allowed": "לא מורשה", "not_available": "לא רלוונטי", "not_in_any_album": "לא בשום אלבום", @@ -1520,6 +1648,7 @@ "online": "מקוון", "only_favorites": "רק מו×ĸדפים", "open": "פ×Ēח", + "open_calendar": "פ×Ēיח×Ē ×œ×•×— שנה", "open_in_map_view": "פ×Ēח ב×Ē×Ļוג×Ē ×ž×¤×”", "open_in_openstreetmap": "פ×Ēח ב-OpenStreetMap", "open_the_search_filters": "פ×Ēח א×Ē ×ž×Ą× × ×™ החיפוש", @@ -1568,6 +1697,7 @@ "people": "אנשים", "people_edits_count": "{count, plural, one {אדם # × ×ĸרך} other {# אנשים × ×ĸרכו}}", "people_feature_description": "×ĸיון ב×Ēמונו×Ē ×•×Ą×¨×˜×•× ×™× שקוב×Ļו ×ĸל ידי אנשים", + "people_selected": "{count, plural, one {אדם אחד נבחר} other {# אנשים נבחרו}}", "people_sidebar_description": "ה×Ļג קישור אל אנשים בסרגל ה×Ļד", "permanent_deletion_warning": "אזהר×Ē ×ž×—×™×§×” ל×Ļמי×Ēו×Ē", "permanent_deletion_warning_setting_description": "ה×Ļג אזהרה ב×ĸ×Ē ×ž×—×™×§×Ē ×Ēמונו×Ē ×œ×Ļמי×Ēו×Ē", @@ -1592,11 +1722,14 @@ "person_age_years": "בגיל {years, plural, other {# שנים}}", "person_birthdate": "נולד ב×Ēאריך {date}", "person_hidden": "{name}{hidden, select, true { (מוס×Ēר)} other {}}", + "person_recognized": "זוהה אדם", + "person_selected": "נבחר אדם", "photo_shared_all_users": "נראה ששי×Ēפ×Ē ××Ē ×”×Ēמונו×Ē ×Š×œ×š ×ĸם כל המש×Ēמשים או שאין לך את מ׊×Ēמ׊ לש×Ē×Ŗ אי×Ēו.", "photos": "×Ēמונו×Ē", "photos_and_videos": "×Ēמונו×Ē & סרטונים", "photos_count": "{count, plural, one {×Ēמונה {count, number}} other {{count, number} ×Ēמונו×Ē}}", "photos_from_previous_years": "×Ēמונו×Ē ×ž×Š× ×™× קודמו×Ē", + "photos_only": "רק ×Ēמונו×Ē", "pick_a_location": "בחר מיקום", "pick_custom_range": "טווח מו×Ēאם אישי×Ē", "pick_date_range": "בחר טווח ×Ēאריכים", @@ -1672,9 +1805,10 @@ "purchase_settings_server_activated": "מפ×Ēח המו×Ļר של השר×Ē ×ž× ×•×”×œ ×ĸל ידי מנהל המ×ĸרכ×Ē", "query_asset_id": "שאיל×Ēה ×ĸל מזהה הפריט", "queue_status": "{count} מ×Ēוך {total} ×ĸומדים ב×Ēור", + "rate_asset": "דירוג ×Ēמונה", "rating": "דירוג כוכב", "rating_clear": "נקה דירוג", - "rating_count": "{count, plural, one {כוכב #} other {# כוכבים}}", + "rating_count": "{count, plural, =0 {ללא דירוג} one {כוכב אחד} other {# כוכבים}}", "rating_description": "ה×Ļג א×Ē ×“×™×¨×•×’ ה-EXIF בלוח המיד×ĸ", "reaction_options": "אפשרויו×Ē ×”×’×‘×”", "read_changelog": "קרא א×Ē ×™×•×ž×Ÿ השינויים", @@ -1747,7 +1881,10 @@ "reset_pin_code_success": "קוד ה-PIN אופס בה×Ļלחה", "reset_pin_code_with_password": "באפשרו×Ēך ×Ēמיד לאפס א×Ē ×§×•×“ ה-PIN שלך ×ĸם הסיסמה שלך", "reset_sqlite": "אפץ א×Ē ×ž×Ą×“ הנ×Ēונים SQLite", - "reset_sqlite_confirmation": "האם א×Ēה בטוח שבר×Ļונך לאפס א×Ē ×ž×Ą×“ הנ×Ēונים SQLite? יהיה ×ĸליך לה×Ē× ×Ē×§ ולה×Ēחבר מחדש כדי לסנכרן א×Ē ×”× ×Ēונים מחדש", + "reset_sqlite_clear_app_data": "ניקוי × ×Ēונים", + "reset_sqlite_confirmation": "האם בר×Ļונך לנקו×Ē ××Ē × ×Ēוני היישום? פ×ĸולה זו ×Ēסיר א×Ē ×›×œ ההגדרו×Ē ×•×Ē× ×Ē×§ או×Ēך.", + "reset_sqlite_confirmation_note": "ה×ĸרה: יהיה ×Ļורך לה×Ēחיל מחדש א×Ē ×”×™×™×Š×•× לאחר הניקוי.", + "reset_sqlite_done": "× ×Ēונים היישום נוקו. נא לה×Ēחיל מחדש א×Ē Immich ולהיכנס שוב.", "reset_sqlite_success": "איפוס מסד הנ×Ēונים SQLite בו×Ļ×ĸ בה×Ļלחה", "reset_to_default": "אפץ לבריר×Ē ×ž×—×“×œ", "resolution": "רזולו×Ļיה", @@ -1775,9 +1912,12 @@ "saved_settings": "הגדרו×Ē ×Š×ž×•×¨×•×Ē", "say_something": "להגיד משהו", "scaffold_body_error_occurred": "איר×ĸה שגיאה", + "scaffold_body_error_unrecoverable": "איר×ĸה שגיאה שאי אפ׊ר לה×Ēאושש ממנה. נא לש×Ē×Ŗ א×Ē ×”×Š×’×™××” ו×ĸקבו×Ē ×”×ž×—×Ą× ×™×Ē ×‘ÖžDiscord או GitHub כך שנוכל ל×ĸזור. אם ני×Ēנה המל×Ļה, ני×Ēן לנקו×Ē ××Ē × ×Ēוני היישום למטה.", + "scan": "סריקה", "scan_all_libraries": "סרוק א×Ē ×›×œ הספריו×Ē", "scan_library": "סרוק", "scan_settings": "הגדרו×Ē ×Ą×¨×™×§×”", + "scanning": "ב×Ēהליך סריקה", "scanning_for_album": "סורק אחר אלבום...", "search": "חיפוש", "search_albums": "חיפוש אלבומים", @@ -1807,6 +1947,8 @@ "search_filter_media_type_title": "בחר סוג מדיה", "search_filter_ocr": "חיפוש לפי OCR", "search_filter_people_title": "בחר אנשים", + "search_filter_star_rating": "דירוג כוכבים", + "search_filter_tags_title": "בחיר×Ē ×Ēגים", "search_for": "חיפוש", "search_for_existing_person": "חיפוש אדם קיים", "search_no_more_result": "אין ×ĸוד ×Ēו×Ļאו×Ē", @@ -1841,17 +1983,23 @@ "second": "שנייה", "see_all_people": "ראה א×Ē ×›×œ האנשים", "select": "בחר", + "select_album": "בחיר×Ē ××œ×‘×•×", "select_album_cover": "בחר ×ĸטיפ×Ē ××œ×‘×•×", + "select_albums": "בחיר×Ē ××œ×‘×•×ž×™×", "select_all": "בחר הכל", "select_all_duplicates": "בחר א×Ē ×›×œ הכפילויו×Ē", "select_all_in": "בחר הכול ב×Ēוך {group}", "select_avatar_color": "בחר ×Ļב×ĸ י×Ļגן", + "select_count": "{count, plural, one {בחיר×Ē #} other {בחיר×Ē #}}", + "select_cutoff_date": "בחיר×Ē ×Ēאריך חי×Ēוך", "select_face": "בחר פנים", "select_featured_photo": "בחר ×Ēמונה מיי×Ļג×Ē", "select_from_computer": "בחר מהמחשב", "select_keep_all": "בחר שמור הכל", "select_library_owner": "בחר א×Ē ×”×‘×ĸלים של הספרייה", "select_new_face": "בחר פנים חדשו×Ē", + "select_people": "בחיר×Ē ×× ×Š×™×", + "select_person": "בחיר×Ē ××“×", "select_person_to_tag": "בחר אדם ל×Ēיוג", "select_photos": "בחר ×Ēמונו×Ē", "select_trash_all": "בחר ה×ĸבר הכל לאשפה", @@ -1880,6 +2028,9 @@ "set_profile_picture": "הגדר ×Ēמונ×Ē ×¤×¨×•×¤×™×œ", "set_slideshow_to_fullscreen": "הגדר מ×Ļג×Ē ×Š×§×•×¤×™×•×Ē ×œ×ž×Ą×š מלא", "set_stack_primary_asset": "הגדרה כ×Ēמונה ראשי×Ē", + "setting_image_navigation_enable_subtitle": "אם הגדרה זו מופ×ĸל×Ē, ני×Ēן לנווט ל×Ēמונה הקודמ×Ē/הבאה ×ĸל ידי הקשה ×ĸל הרב×ĸ הימני/השמאלי ביו×Ēר של המסך.", + "setting_image_navigation_enable_title": "הקשה לניווט", + "setting_image_navigation_title": "ניווט ×Ēמונה", "setting_image_viewer_help": "מ×Ļיג הפרטים טו×ĸן א×Ē ×”×Ēמונה הממוז×ĸר×Ē ×”×§×˜× ×” קודם, לאחר מכן טו×ĸן א×Ē ×”×Ē×Ļוגה המקדימה בגודל בינוני (אם מופ×ĸל), ×œ×‘×Ą×•×Ŗ טו×ĸן א×Ē ×”×ž×§×•×¨×™×Ē (אם מופ×ĸל).", "setting_image_viewer_original_subtitle": "אפ׊ר לט×ĸון א×Ē ×”×Ēמונה המקורי×Ē ×‘×¨×–×œ×•×Ļיה מלאה (גדולה!). השב×Ē ×›×“×™ להקטין שימוש בנ×Ēונים (גם בשר×Ē ×•×’× בזיכרון המטמון שבמכשיר).", "setting_image_viewer_original_title": "ט×ĸן ×Ēמונה מקורי×Ē", @@ -1987,6 +2138,7 @@ "show_password": "הראה סיסמה", "show_person_options": "ה×Ļג אפשרויו×Ē ××“×", "show_progress_bar": "ה×Ļג סרגל ה×Ēקדמו×Ē", + "show_schema": "ה×Ļג×Ē ×Ēרשים", "show_search_options": "ה×Ļג אפשרויו×Ē ×—×™×¤×•×Š", "show_shared_links": "ה×Ļג קישורים משו×Ēפים", "show_slideshow_transition": "ה×Ļג מ×ĸבר מ×Ļג×Ē", @@ -2004,6 +2156,8 @@ "skip_to_folders": "דלג ל×Ēיקיו×Ē", "skip_to_tags": "דלג ל×Ēגים", "slideshow": "מ×Ļג×Ē ×Š×§×•×¤×™×•×Ē", + "slideshow_repeat": "חזרה ×ĸל מ×Ļג×Ē", + "slideshow_repeat_description": "חזרה לה×Ēחלה כאשר המ×Ļג×Ē × ×’×ž×¨×Ē", "slideshow_settings": "הגדרו×Ē ×ž×Ļג×Ē ×Š×§×•×¤×™×•×Ē", "sort_albums_by": "מיין אלבומים לפי...", "sort_created": "×Ēאריך י×Ļירה", @@ -2043,6 +2197,7 @@ "support": "×Ēמיכה", "support_and_feedback": "×Ēמיכה & משוב", "support_third_party_description": "ה×Ē×§× ×Ē ×”-Immich שלך נארזה ×ĸל ידי ×Ļד שלישי. ב×ĸיו×Ē ×Š××Ēה חווה ×ĸשויו×Ē ×œ×”×™×’×¨× ×ĸל ידי חבילה זו, אז בבקשה ×Ē×ĸלה ב×ĸיו×Ē ××™×Ēם ראשי×Ē ×›×œ באמ×Ļ×ĸו×Ē ×”×§×™×Š×•×¨×™× למטה.", + "supporter": "×Ēומך", "swap_merge_direction": "×”×—×œ×Ŗ כיוון מיזוג", "sync": "סנכרן", "sync_albums": "סנכרן אלבומים", @@ -2080,6 +2235,7 @@ "theme_setting_theme_subtitle": "בחר א×Ē ×”×’×“×¨×Ē ×ĸרכ×Ē ×”× ×•×Š× של היישום", "theme_setting_three_stage_loading_subtitle": "ט×ĸינה בשלושה שלבים ×ĸשויה לשפר א×Ē ×‘×™×Ļו×ĸי הט×ĸינה אבל גורמ×Ē ×‘××•×¤×Ÿ מ׊מ×ĸו×Ēי ל×ĸומס ר׊×Ē ×’×‘×•×” יו×Ēר", "theme_setting_three_stage_loading_title": "אפ׊ר ט×ĸינה בשלושה שלבים", + "then": "אז", "they_will_be_merged_together": "הם י×Ēמזגו יחד", "third_party_resources": "משאבי ×Ļד שלישי", "time": "זמן", @@ -2114,6 +2270,13 @@ "trash_page_select_assets_btn": "בחר ×Ēמונו×Ē", "trash_page_title": "אשפה ({count})", "trashed_items_will_be_permanently_deleted_after": "פריטים באשפה ימחקו ל×Ļמי×Ēו×Ē ×œ××—×¨ {days, plural, one {יום #} other {# ימים}}.", + "trigger": "טריגר", + "trigger_asset_uploaded": "נכס הו×ĸלה", + "trigger_asset_uploaded_description": "מ×Ē×ĸורר כאשר נכס חדש הו×ĸלה", + "trigger_description": "אירו×ĸ ׊מ×Ēחיל א×Ē ×–×¨×™×ž×Ē ×”×ĸבודה", + "trigger_person_recognized": "זוהה אדם", + "trigger_person_recognized_description": "מ×Ē×ĸורר כאשר זוהה אדם", + "trigger_type": "סוג הטריגר", "troubleshoot": "פ×Ēור ב×ĸיו×Ē", "type": "סוג", "unable_to_change_pin_code": "לא ני×Ēן לשנו×Ē ××Ē ×§×•×“ ה PIN", @@ -2128,6 +2291,7 @@ "unhide_person": "בטל הס×Ēר×Ē ××“×", "unknown": "לא ידו×ĸ", "unknown_country": "מדינה לא ידו×ĸה", + "unknown_date": "×Ēאריך לא ידו×ĸ", "unknown_year": "שנה לא ידו×ĸה", "unlimited": "בל×Ēי מוגבל", "unlink_motion_video": "בטל קישור סרטון ×Ēנו×ĸה", @@ -2144,7 +2308,10 @@ "unstack": "בטל ×ĸרימה", "unstack_action_prompt": "{count} הופרדו", "unstacked_assets_count": "{count, plural, one {×Ēמונה # הוסרה} other {# ×Ēמונו×Ē ×”×•×Ą×¨×•}} מה×ĸרימה", + "unsupported_field_type": "סוג שדה לא ידו×ĸ", + "unsupported_file_type": "הקוב×Ĩ {file} אינו ני×Ēן לה×ĸלאה בגלל שסוג הקוב×Ĩ שלו {type} אינו × ×Ēמך.", "untagged": "לא מ×Ēיוגים", + "untitled_workflow": "זרימ×Ē ×ĸבודה ללא כו×Ēר×Ē", "up_next": "הבא ב×Ēור", "update_location_action_prompt": "×ĸדכן א×Ē ×”×ž×™×§×•× של {count} פריטים שנבחרו ×ĸם:", "updated_at": "×ĸודכן", @@ -2154,6 +2321,7 @@ "upload_details": "פרטי ה×ĸלאה", "upload_dialog_info": "האם בר×Ļונך לגבו×Ē ××Ē ×”×Ēמונו×Ē ×Š× ×‘×—×¨×• לשר×Ē?", "upload_dialog_title": "ה×ĸלא×Ē ×Ēמונה", + "upload_error_with_count": "שגיא×Ē ×”×ĸלאה ×ĸבור {count, plural, one {נכס אחד} other {# נכסים}}", "upload_errors": "ה×ĸלאה הושלמה ×ĸם {count, plural, one {שגיאה #} other {# שגיאו×Ē}}, ר×ĸנן א×Ē ×”×“×Ŗ כדי לראו×Ē ×Ēמונו×Ē ×Š×”×•×ĸלו.", "upload_finished": "ה×ĸלאה הס×Ēיימה", "upload_progress": "נו×Ēרו {remaining, number} - טופלו {processed, number}/{total, number}", @@ -2168,7 +2336,9 @@ "url": "URL", "usage": "שימוש", "use_biometric": "הש×Ēמ׊ באימו×Ē ×‘×™×•×ž×˜×¨×™", - "use_current_connection": "הש×Ēמ׊ בחיבור נוכחי", + "use_browser_locale": "שימוש באזור השפה של הדפדפן", + "use_browser_locale_description": "×ĸי×Ļוב ×Ēאריכים, זמנים, ומספרים בה×Ēבסס ×ĸל אזור השפה של הדפדפן שלך", + "use_current_connection": "שימוש בחיבור הנוכחי", "use_custom_date_range": "הש×Ēמ׊ בטווח ×Ēאריכים מו×Ēאם במקום", "user": "מ׊×Ēמ׊", "user_has_been_deleted": "מ׊×Ēמ׊ זה נמחק.", @@ -2189,6 +2359,7 @@ "utilities": "כלים", "validate": "לאמ×Ē", "validate_endpoint_error": "נא להזין כ×Ēוב×Ē URL ×Ēקני×Ē", + "validation_error": "שגיא×Ē ×Ēיקות", "variables": "מ׊×Ēנים", "version": "גרסה", "version_announcement_closing": "החבר שלך, אלכס", @@ -2200,6 +2371,7 @@ "video_hover_setting_description": "הפ×ĸל ×Ē×Ļוג×Ē ×Ą×¨×˜×•×Ÿ מקדימה כאשר ה×ĸכבר ×ž×¨×—×Ŗ מ×ĸל פריט. אפילו כשהגדרה זו מושב×Ē×Ē, ני×Ēן לה×Ēחיל א×Ē ×”× ×™×’×•×Ÿ ×ĸל ידי ׍יחות מ×ĸל סמל ההפ×ĸלה.", "videos": "סרטונים", "videos_count": "{count, plural, one {סרטון #} other {# סרטונים}}", + "videos_only": "רק סרטונים", "view": "ה×Ļג", "view_album": "ה×Ļג אלבום", "view_all": "ה×Ļג הכל", @@ -2220,6 +2392,8 @@ "viewer_stack_use_as_main_asset": "הש×Ēמ׊ כ×Ēמונה ראשי×Ē", "viewer_unstack": "ביטול ×ĸרימה", "visibility_changed": "הנראו×Ē ×”×Š×Ē× ×Ēה ×ĸבור {count, plural, one {אדם #} other {# אנשים}}", + "visual": "חזו×Ēי", + "visual_builder": "בונה חזו×Ēי", "waiting": "ממ×Ēין", "waiting_count": "ממ×Ēין: {count}", "warning": "אזהרה", @@ -2228,12 +2402,26 @@ "welcome_to_immich": "ברוכים הבאים אל immich", "width": "רוחב", "wifi_name": "׊ם הרש×Ē ×”××œ×—×•×˜×™×Ē", + "workflow_delete_prompt": "האם בר×Ļונך למחוק א×Ē ×–×¨×™×ž×Ē ×”×ĸבודה הזו?", + "workflow_deleted": "זרימ×Ē ×”×ĸבודה נמחקה", + "workflow_description": "×Ēיאור זרימ×Ē ×”×ĸבודה", + "workflow_info": "מיד×ĸ ×ĸל זרימ×Ē ×”×ĸבודה", + "workflow_json": "JSON של זרימ×Ē ×”×ĸבודה", + "workflow_json_help": "×ĸריכ×Ē ×Ē×Ļור×Ē ×–×¨×™×ž×Ē ×”×ĸבודה בפורמט JSON. השינויים יס×Ēנכרנו ×ĸם הבונה החזו×Ēי.", + "workflow_name": "׊ם זרימ×Ē ×”×ĸבודה", + "workflow_navigation_prompt": "האם בר×Ļונך ל×ĸזוב מבלי לשמור א×Ē ×”×Š×™× ×•×™×™× שלך?", + "workflow_summary": "סיכום זרימ×Ē ×”×ĸבודה", + "workflow_update_success": "זרימ×Ē ×”×ĸבודה ×ĸודכנה בה×Ļלחה", + "workflow_updated": "זרימ×Ē ×”×ĸבודה ×ĸודכנה", + "workflows": "זרימו×Ē ×ĸבודה", + "workflows_help_text": "זרימו×Ē ×ĸבודה מאטמטו×Ē ×¤×ĸולו×Ē ×ĸל הנכסים שלך בה×Ēבסס ×ĸל טריגרים ומסננים", "wrong_pin_code": "קוד PIN שגוי", "year": "שנה", "years_ago": "לפני {years, plural, one {שנה #} other {# שנים}}", "yes": "כן", "you_dont_have_any_shared_links": "אין לך קישורים משו×Ēפים", "your_wifi_name": "׊ם אינטרנט אלחוטי שלך", + "zero_to_clear_rating": "יש ללחו×Ĩ ×ĸל 0 כדי לנקו×Ē ××Ē ×“×™×¨×•×’ ה×Ēמונה", "zoom_image": "זום ל×Ēמונה", "zoom_to_bounds": "ה×Ēמקד באזור" } diff --git a/i18n/hi.json b/i18n/hi.json index ff05291cef..c7d439e5a0 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -311,7 +311,7 @@ "search_jobs": "⤍āĨŒā¤•⤰āĨ€ ⤖āĨ‹ā¤œāĨ‡ā¤‚â€Ļ", "send_welcome_email": "⤏āĨā¤ĩā¤žā¤—ā¤¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ⤭āĨ‡ā¤œāĨ‡ā¤‚", "server_external_domain_settings": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", - "server_external_domain_settings_description": "ā¤¸ā¤žā¤°āĨā¤ĩ⤜⤍ā¤ŋ⤕ ā¤¸ā¤žā¤ā¤ž ⤞ā¤ŋ⤂⤕ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨, ⤜ā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ http(s):// ā¤ļā¤žā¤Žā¤ŋ⤞ ā¤šāĨˆ", + "server_external_domain_settings_description": "ā¤Ŧā¤žā¤šā¤°āĨ€ ⤞ā¤ŋ⤂⤕ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", "server_public_users": "ā¤¸ā¤žā¤°āĨā¤ĩ⤜⤍ā¤ŋ⤕ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž", "server_public_users_description": "ā¤¸ā¤žā¤ā¤ž ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤ŽāĨ‡ā¤‚ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ⤜āĨ‹ā¤Ąā¤ŧ⤤āĨ‡ ā¤¸ā¤Žā¤¯ ⤏⤭āĨ€ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤žā¤“⤂ (ā¤¨ā¤žā¤Ž ⤔⤰ ā¤ˆā¤ŽāĨ‡ā¤˛) ⤕āĨ€ ⤏āĨ‚ā¤šāĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤ ⤝ā¤Ļā¤ŋ ā¤¯ā¤š ā¤ĩā¤ŋ⤕⤞āĨā¤Ē ⤅⤕āĨā¤ˇā¤Ž ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ⤤āĨ‹ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ⤏āĨ‚ā¤šāĨ€ ⤕āĨ‡ā¤ĩ⤞ ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤žā¤Ē⤕ (ā¤ā¤Ąā¤Žā¤ŋ⤍) ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤žā¤“⤂ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤šāĨ‹ā¤—āĨ€āĨ¤", "server_settings": "⤏⤰āĨā¤ĩ⤰ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸", @@ -472,7 +472,7 @@ "advanced_settings_troubleshooting_title": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ⤍ā¤ŋā¤ĩā¤žā¤°ā¤Ŗ", "age_months": "⤆⤝āĨ {months, plural, one {# month} other {# months}}", "age_year_months": "⤆⤝āĨ 1 ā¤ĩ⤰āĨā¤ˇ, {months, plural, one {# month} other {# months}}", - "age_years": "{years, plural, other {Age #}}", + "age_years": "{years, plural, other {⤆⤝āĨ # ā¤ĩ⤰āĨā¤ˇ}}", "album": "ā¤ā¤˛āĨā¤Ŧā¤Ž", "album_added": "ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤Ąā¤žā¤˛ā¤ž ā¤—ā¤¯ā¤ž", "album_added_notification_setting_description": "⤜ā¤Ŧ ⤆ā¤Ē⤕āĨ‹ ⤕ā¤ŋ⤏āĨ€ ā¤¸ā¤žā¤ā¤ž ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤ŽāĨ‡ā¤‚ ⤜āĨ‹ā¤Ąā¤ŧā¤ž ā¤œā¤žā¤ ⤤āĨ‹ ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ⤏āĨ‚ā¤šā¤¨ā¤ž ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰āĨ‡ā¤‚", @@ -595,7 +595,7 @@ "assets_count": "{count, plural, one {# ā¤†ā¤‡ā¤Ÿā¤Ž} other {# ā¤†ā¤‡ā¤Ÿā¤ŽāĨā¤¸}}", "assets_deleted_permanently": "{count} ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ(ā¤¯ā¤žā¤) ⤏āĨā¤Ĩā¤žā¤¯āĨ€ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆā¤‚", "assets_deleted_permanently_from_server": "{count} ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ(ā¤¯ā¤žā¤) ā¤‡ā¤Žā¤ŋ⤚ ⤏⤰āĨā¤ĩ⤰ ⤏āĨ‡ ⤏āĨā¤Ĩā¤žā¤¯āĨ€ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆā¤‚", - "assets_downloaded_failed": "{count, plural, one {Downloaded # file - {error} file failed} other {Downloaded # files - {error} files failed}}", + "assets_downloaded_failed": "{count, plural, one {# ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨā¤ˆ - {error} ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ⤏⤕āĨ€} other {# ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨā¤ˆā¤‚ - {error} ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ⤏⤕āĨ€ā¤‚}}", "assets_downloaded_successfully": "{count, plural, one {# ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤏ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚⤰āĨā¤ĩ⤕ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕āĨ€ ā¤—ā¤ˆ} other {# ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ⤏ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚⤰āĨā¤ĩ⤕ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕āĨ€ ā¤—ā¤ˆā¤‚}}", "assets_moved_to_trash_count": "{count, plural, one {# asset} other {# assets}} ⤕āĨ‹ ⤟āĨā¤°āĨˆā¤ļ ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "assets_permanently_deleted_count": "⤏āĨā¤Ĩā¤žā¤¯āĨ€ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž {count, plural, one {# asset} other {# assets}}", @@ -788,12 +788,17 @@ "client_cert_subtitle": "⤕āĨ‡ā¤ĩ⤞ PKCS12 (.p12, .pfx) ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩ⤍ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤†ā¤¯ā¤žā¤¤/⤍ā¤ŋā¤•ā¤žā¤˛ā¤¨ā¤ž ⤕āĨ‡ā¤ĩ⤞ ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤏āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤šāĨˆ", "client_cert_title": "SSL ⤕āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° [ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤—ā¤ŋ⤕]", "clockwise": "ā¤Ļ⤕āĨā¤ˇā¤ŋā¤Ŗā¤žā¤ĩ⤰āĨā¤¤", - "close": "ā¤Ŧ⤂ā¤Ļ ⤕⤰āĨ‡ā¤‚", + "close": "ā¤Ŧ⤂ā¤Ļ", "collapse": "⤗ā¤ŋ⤰ ā¤œā¤žā¤¨ā¤ž", "collapse_all": "⤏⤭āĨ€ ⤕āĨ‹ ⤏⤂⤕āĨā¤šā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "color": "⤰⤂⤗", "color_theme": "⤰⤂⤗ ā¤ĨāĨ€ā¤Ž", "command": "⤆ā¤ĻāĨ‡ā¤ļ", + "command_palette_prompt": "⤜⤞āĨā¤ĻāĨ€ ⤏āĨ‡ ā¤ĒāĨ‡ā¤œ, ā¤•ā¤žā¤°āĨā¤¯ ā¤¯ā¤ž ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤ĸāĨ‚⤂ā¤ĸāĨ‡ā¤‚", + "command_palette_to_close": "ā¤Ŧ⤂ā¤Ļ ⤕⤰āĨ‡ā¤‚", + "command_palette_to_navigate": "ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚", + "command_palette_to_select": "⤚āĨā¤¨āĨ‡ā¤‚", + "command_palette_to_show_all": "⤏⤭āĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", "comment_deleted": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪āĨ€ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", "comment_options": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪āĨ€ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē", "comments_and_likes": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤ ⤔⤰ ā¤Ē⤏⤂ā¤Ļ", @@ -858,6 +863,7 @@ "created_at": "ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤Ĩā¤ž", "creating_linked_albums": "⤜āĨāĨœāĨ‡ ā¤šāĨā¤ ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤Ŧā¤¨ā¤žā¤ ā¤œā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚..āĨ¤", "crop": "ā¤›ā¤žā¤ā¤ŸāĨ‡ā¤‚", + "crop_aspect_ratio_fixed": "⤍ā¤ŋā¤ļāĨā¤šā¤ŋ⤤", "crop_aspect_ratio_free": "⤏āĨā¤ĩ⤤⤂⤤āĨā¤°", "crop_aspect_ratio_original": "ā¤ŽāĨ‚⤞ ⤅⤍āĨā¤Ēā¤žā¤¤", "curated_object_page_title": "⤚āĨ€ā¤œā¤ŧāĨ‡ā¤‚", @@ -868,6 +874,9 @@ "custom_locale": "⤕⤏āĨā¤Ÿā¤Ž ⤞āĨ‹ā¤•āĨ‡ā¤˛", "custom_locale_description": "ā¤­ā¤žā¤ˇā¤ž ⤔⤰ ⤕āĨā¤ˇāĨ‡ā¤¤āĨā¤° ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ⤔⤰ ⤏⤂⤖āĨā¤¯ā¤žā¤ā¤ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "custom_url": "⤕⤏āĨā¤Ÿā¤Ž URL", + "cutoff_date_description": "ā¤Ēā¤ŋ⤛⤞āĨ‡ ⤕ā¤ŋ⤤⤍āĨ‡ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤰⤖āĨ‡ā¤‚â€Ļ", + "cutoff_day": "{count, plural, one {ā¤Ļā¤ŋ⤍} other {ā¤Ļā¤ŋ⤍}}", + "cutoff_year": "{count, plural, one {ā¤ĩ⤰āĨā¤ˇ} other {ā¤ĩ⤰āĨā¤ˇ}}", "daily_title_text_date": "⤈, ā¤ā¤Žā¤ā¤Žā¤ā¤Ž ā¤ĄāĨ€ā¤ĄāĨ€", "daily_title_text_date_year": "⤈, ā¤ā¤Žā¤ā¤Žā¤ā¤Ž ā¤Ļā¤ŋ⤍, ā¤ĩ⤰āĨā¤ˇ", "dark": "ā¤Ąā¤žā¤°āĨā¤•", @@ -886,8 +895,6 @@ "deduplication_criteria_2": "EXIF ā¤ĄāĨ‡ā¤Ÿā¤ž ⤕āĨ€ ⤏⤂⤖āĨā¤¯ā¤ž", "deduplication_info": "ā¤ĄāĨā¤ĒāĨā¤˛āĨ€ā¤•āĨ‡ā¤ļ⤍ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ⤕āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", "deduplication_info_description": "ā¤Ē⤰ā¤ŋ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ⤝āĨ‹ā¤‚ ā¤•ā¤ž ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤ĒāĨ‚⤰āĨā¤ĩ-⤚⤝⤍ ⤕⤰⤍āĨ‡ ⤔⤰ ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤Ÿ ⤕āĨ‹ ā¤ĨāĨ‹ā¤• ā¤ŽāĨ‡ā¤‚ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤, ā¤šā¤Ž ⤍ā¤ŋā¤ŽāĨā¤¨ ā¤Ē⤰ ⤧āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚:", - "default_locale": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ⤏āĨā¤Ĩā¤žā¤¨", - "default_locale_description": "⤅ā¤Ē⤍āĨ‡ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ⤰ ⤏āĨā¤Ĩā¤žā¤¨ ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ⤔⤰ ⤏⤂⤖āĨā¤¯ā¤žā¤ā¤ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "delete": "ā¤šā¤Ÿā¤žā¤ā¤", "delete_action_confirmation_message": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ⤇⤏ ā¤†ā¤‡ā¤Ÿā¤Ž ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚? ā¤¯ā¤š ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤†ā¤‡ā¤Ÿā¤Ž ⤕āĨ‹ ⤏⤰āĨā¤ĩ⤰ ⤕āĨ€ ⤟āĨā¤°āĨˆā¤ļ ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤ā¤—āĨ€ ⤔⤰ ⤏āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤Žā¤žā¤‚ā¤—āĨ‡ā¤—āĨ€", "delete_action_prompt": "{count} ā¤šā¤Ÿā¤žā¤ ā¤—ā¤", @@ -923,6 +930,7 @@ "deselect_all": "⤏ā¤Ŧ⤕āĨ‹ ā¤…ā¤šā¤¯ā¤¨ā¤ŋ⤤ ⤕⤰āĨ‹", "details": "ā¤ĩā¤ŋā¤ĩ⤰⤪", "direction": "ā¤Ļā¤ŋā¤ļā¤ž", + "disable": "⤍ā¤ŋ⤎āĨā¤•āĨā¤°ā¤ŋ⤝ ⤕⤰āĨ‡ā¤‚", "disabled": "⤅⤕āĨā¤ˇā¤Ž", "disallow_edits": "⤏⤂ā¤Ēā¤žā¤Ļ⤍āĨ‹ā¤‚ ⤕āĨ€ ⤅⤍āĨā¤Žā¤¤ā¤ŋ ⤍ ā¤ĻāĨ‡ā¤‚", "discord": "ā¤Ąā¤ŋ⤏⤕āĨ‰ā¤°āĨā¤Ą", @@ -948,6 +956,7 @@ "download_include_embedded_motion_videos": "ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤ĄāĨ‡ā¤Ą ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹", "download_include_embedded_motion_videos_description": "ā¤ŽāĨ‹ā¤ļ⤍ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ā¤ŽāĨ‡ā¤‚ ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤Ą ⤕ā¤ŋā¤ ā¤—ā¤ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤕āĨ‹ ā¤ā¤• ⤅⤞⤗ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤕āĨ‡ ⤰āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋ⤞ ⤕⤰āĨ‡ā¤‚", "download_notfound": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "download_original": "ā¤ŽāĨ‚⤞ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", "download_paused": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤏āĨā¤Ĩ⤗ā¤ŋ⤤", "download_settings": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨ā¤ž", "download_settings_description": "⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤏āĨ‡ ⤏⤂ā¤Ŧ⤂⤧ā¤ŋ⤤ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧ⤂⤧ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", @@ -957,6 +966,7 @@ "download_waiting_to_retry": "ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ⤕⤰⤍āĨ‡ ā¤•ā¤ž ā¤‡ā¤‚ā¤¤ā¤œā¤žā¤° ⤕⤰ ā¤°ā¤šā¤ž ā¤šāĨˆ", "downloading": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą", "downloading_asset_filename": "⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ {filename} ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "downloading_from_icloud": "iCloud ⤏āĨ‡ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ", "downloading_media": "ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ", "drop_files_to_upload": "⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤•ā¤šāĨ€ā¤‚ ⤭āĨ€ ⤛āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", "duplicates": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤Ÿ", @@ -985,9 +995,22 @@ "edit_tag": "⤟āĨˆā¤— ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", "edit_title": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "edit_user": "⤝āĨ‚ā¤œā¤° ⤕āĨ‹ ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‹", + "edit_workflow": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "editor": "⤏⤂ā¤Ēā¤žā¤Ļ⤕", "editor_close_without_save_prompt": "ā¤Ē⤰ā¤ŋā¤ĩ⤰āĨā¤¤ā¤¨ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤žā¤ā¤ā¤—āĨ‡", "editor_close_without_save_title": "⤏⤂ā¤Ēā¤žā¤Ļ⤕ ā¤Ŧ⤂ā¤Ļ ⤕⤰āĨ‡ā¤‚?", + "editor_confirm_reset_all_changes": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ⤏⤭āĨ€ ā¤Ŧā¤Ļā¤˛ā¤žā¤ĩ ⤰āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "editor_discard_edits_confirm": "⤏⤂ā¤Ēā¤žā¤Ļ⤍ ⤤āĨā¤¯ā¤žā¤—āĨ‡ā¤‚", + "editor_discard_edits_prompt": "⤆ā¤Ē⤕āĨ‡ ā¤Ēā¤žā¤¸ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ ⤍ ā¤—ā¤ ⤏⤂ā¤Ēā¤žā¤Ļ⤍ ā¤šāĨˆā¤‚āĨ¤ ⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ⤉⤍āĨā¤šāĨ‡ā¤‚ ⤤āĨā¤¯ā¤žā¤—ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "editor_discard_edits_title": "⤏⤂ā¤Ēā¤žā¤Ļ⤍ ⤤āĨā¤¯ā¤žā¤—āĨ‡ā¤‚?", + "editor_edits_applied_error": "⤏⤂ā¤Ēā¤žā¤Ļ⤍ ā¤˛ā¤žā¤—āĨ‚ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģ⤞", + "editor_edits_applied_success": "⤏⤂ā¤Ēā¤žā¤Ļ⤍ ⤏ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚⤰āĨā¤ĩ⤕ ā¤˛ā¤žā¤—āĨ‚ ⤕ā¤ŋā¤ ā¤—ā¤", + "editor_flip_horizontal": "⤕āĨā¤ˇāĨˆā¤¤ā¤ŋ⤜ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤Ē⤞⤟āĨ‡ā¤‚", + "editor_flip_vertical": "⤊ā¤Ē⤰-⤍āĨ€ā¤šāĨ‡ ā¤Ē⤞⤟āĨ‡ā¤‚", + "editor_orientation": "ā¤Ļā¤ŋā¤ļā¤ž ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗", + "editor_reset_all_changes": "ā¤Ē⤰ā¤ŋā¤ĩ⤰āĨā¤¤ā¤¨ ⤰āĨ€ā¤¸āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚", + "editor_rotate_left": "90° ā¤Ŧā¤žā¤ˆā¤‚ ⤓⤰ ⤘āĨā¤Žā¤žā¤ā¤", + "editor_rotate_right": "90° ā¤Ļā¤žā¤ˆā¤‚ ⤓⤰ ⤘āĨā¤Žā¤žā¤ā¤", "email": "ā¤ˆā¤ŽāĨ‡ā¤˛", "email_notifications": "ā¤ˆā¤ŽāĨ‡ā¤˛ ⤏āĨ‚ā¤šā¤¨ā¤žā¤ā¤", "empty_folder": "ā¤¯ā¤š ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤–ā¤žā¤˛āĨ€ ā¤šāĨˆ", @@ -1002,15 +1025,18 @@ "enter_wifi_name": "Wi-Fi ā¤•ā¤ž ā¤¨ā¤žā¤Ž ⤞ā¤ŋ⤖āĨ‡ā¤‚", "enter_your_pin_code": "⤅ā¤Ēā¤¨ā¤ž ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤Ą ā¤Ąā¤žā¤˛āĨ‡ā¤‚", "enter_your_pin_code_subtitle": "⤞āĨ‰ā¤• ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ⤖āĨ‹ā¤˛ā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤Ą ā¤Ąā¤žā¤˛āĨ‡ā¤‚", - "error": "⤗⤞⤤āĨ€", + "error": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "error_change_sort_album": "ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤•ā¤ž ⤕āĨā¤°ā¤Ž ā¤Ŧā¤Ļ⤞⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤅⤏ā¤Ģ⤞ ā¤°ā¤šā¤ž", "error_delete_face": "ā¤ā¤¸āĨ‡ā¤Ÿ ⤏āĨ‡ ⤚āĨ‡ā¤šā¤°āĨ‡ ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨā¤ˆ", "error_getting_places": "⤏āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨā¤ˆ", + "error_loading_albums": "ā¤ā¤˛āĨā¤Ŧā¤Ž ⤞āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "error_loading_image": "⤛ā¤ĩā¤ŋ ⤞āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤤āĨā¤°āĨā¤Ÿā¤ŋ", "error_loading_partners": "⤜āĨ‹āĨœāĨ€ā¤Ļā¤žā¤° ⤞āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨā¤ˆ: {error}", + "error_retrieving_asset_information": "ā¤ā¤¸āĨ‡ā¤Ÿ ⤕āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "error_saving_image": "⤤āĨā¤°āĨā¤Ÿā¤ŋ: {error}", "error_tag_face_bounding_box": "⤚āĨ‡ā¤šā¤°āĨ‡ ⤕āĨ‹ ⤟āĨˆā¤— ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤤āĨā¤°āĨā¤Ÿā¤ŋ – ā¤Ŧā¤žā¤‰ā¤‚ā¤Ąā¤ŋ⤂⤗ ā¤ŦāĨ‰ā¤•āĨā¤¸ ⤍ā¤ŋ⤰āĨā¤ĻāĨ‡ā¤ļā¤žā¤‚ā¤• ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ⤕⤰ ⤏⤕āĨ‡", "error_title": "⤤āĨā¤°āĨā¤Ÿā¤ŋ - ⤕āĨā¤› ⤗⤞⤤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "error_while_navigating": "ā¤ā¤¸āĨ‡ā¤Ÿ ā¤Ē⤰ ā¤œā¤žā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "errors": { "cannot_navigate_next_asset": "⤅⤗⤞āĨ€ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ā¤Ē⤰ ⤍āĨ‡ā¤ĩā¤ŋ⤗āĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", "cannot_navigate_previous_asset": "ā¤Ēā¤ŋ⤛⤞āĨ€ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ā¤Ē⤰ ⤍āĨ‡ā¤ĩā¤ŋ⤗āĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", @@ -1068,6 +1094,7 @@ "unable_to_complete_oauth_login": "OAuth ⤞āĨ‰ā¤—ā¤ŋ⤍ ā¤ĒāĨ‚⤰āĨā¤Ŗ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_connect": "⤕⤍āĨ‡ā¤•āĨā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_copy_to_clipboard": "⤕āĨā¤˛ā¤ŋā¤Ēā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤Ē⤰ ⤕āĨ‰ā¤ĒāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž, ⤏āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚ ⤕ā¤ŋ ⤆ā¤Ē https ⤕āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ⤏āĨ‡ ā¤ĒāĨ‡ā¤œ ⤤⤕ ā¤Ēā¤šāĨā¤‚ā¤š ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "unable_to_create": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_create_admin_account": "ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤žā¤Ē⤕ ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_create_api_key": "⤍⤈ API ⤕āĨā¤‚ā¤œāĨ€ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_create_library": "ā¤˛ā¤žā¤‡ā¤ŦāĨā¤°āĨ‡ā¤°āĨ€ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", @@ -1078,6 +1105,7 @@ "unable_to_delete_exclusion_pattern": "ā¤Ŧā¤šā¤ŋ⤎āĨā¤•⤰⤪ ā¤ĒāĨˆā¤Ÿā¤°āĨā¤¨ ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_delete_shared_link": "ā¤¸ā¤žā¤ā¤ž ⤞ā¤ŋ⤂⤕ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_delete_user": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", + "unable_to_delete_workflow": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤Žā¤ŋā¤Ÿā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_download_files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_edit_exclusion_pattern": "ā¤Ŧā¤šā¤ŋ⤎āĨā¤•⤰⤪ ā¤ĒāĨˆā¤Ÿā¤°āĨā¤¨ ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_empty_trash": "ā¤•ā¤šā¤°ā¤ž ā¤–ā¤žā¤˛āĨ€ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", @@ -1117,6 +1145,7 @@ "unable_to_scan_library": "ā¤˛ā¤žā¤‡ā¤ŦāĨā¤°āĨ‡ā¤°āĨ€ ⤏āĨā¤•āĨˆā¤¨ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_set_feature_photo": "ā¤Ģā¤ŧāĨ€ā¤šā¤° ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤏āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_set_profile_picture": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚ā¤ŋ⤤āĨā¤° ⤏āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", + "unable_to_set_rating": "⤰āĨ‡ā¤Ÿā¤ŋ⤂⤗ ⤏āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_submit_job": "ā¤•ā¤žā¤°āĨā¤¯ ā¤ĒāĨā¤°ā¤¸āĨā¤¤āĨā¤¤ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_trash_asset": "⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ⤕āĨ‹ ⤟āĨā¤°āĨˆā¤ļ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_unlink_account": "ā¤–ā¤žā¤¤ā¤ž ⤅⤍⤞ā¤ŋ⤂⤕ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", @@ -1128,8 +1157,10 @@ "unable_to_update_settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_update_timeline_display_status": "ā¤¸ā¤Žā¤¯ā¤°āĨ‡ā¤–ā¤ž ā¤ĒāĨā¤°ā¤Ļ⤰āĨā¤ļ⤍ ⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋ ⤅ā¤ĻāĨā¤¯ā¤¤ā¤¨ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_update_user": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ⤕āĨ‹ ⤅ā¤ĻāĨā¤¯ā¤¤ā¤¨ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", + "unable_to_update_workflow": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unable_to_upload_file": "ā¤Ģā¤žā¤‡ā¤˛ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ" }, + "errors_text": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤ā¤", "exclusion_pattern": "ā¤Ŧā¤šā¤ŋ⤎āĨā¤•⤰⤪ ā¤ĒāĨˆā¤Ÿā¤°āĨā¤¨", "exif": "ā¤ā¤•āĨā¤¸ā¤ŋā¤Ģ", "exif_bottom_sheet_description": "ā¤ĩā¤ŋā¤ĩ⤰⤪ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚..āĨ¤", @@ -1140,6 +1171,7 @@ "exif_bottom_sheet_people": "⤞āĨ‹ā¤—", "exif_bottom_sheet_person_add_person": "ā¤¨ā¤žā¤Ž ā¤Ąā¤žā¤˛āĨ‡ā¤‚", "exit_slideshow": "⤏āĨā¤˛ā¤žā¤‡ā¤Ą ā¤ļāĨ‹ ⤏āĨ‡ ā¤Ŧā¤žā¤šā¤° ⤍ā¤ŋ⤕⤞āĨ‡ā¤‚", + "expand": "ā¤ĩā¤ŋ⤏āĨā¤¤ā¤žā¤° ⤕⤰āĨ‡ā¤‚", "expand_all": "⤏⤭āĨ€ ā¤•ā¤ž ā¤ĩā¤ŋ⤏āĨā¤¤ā¤žā¤°", "experimental_settings_new_asset_list_subtitle": "ā¤•ā¤žā¤°āĨā¤¯ ā¤ĒāĨā¤°ā¤—⤤ā¤ŋ ā¤Ē⤰ ā¤šāĨˆ", "experimental_settings_new_asset_list_title": "ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤—ā¤žā¤¤āĨā¤Žā¤• ā¤ĢāĨ‹ā¤ŸāĨ‹ ⤗āĨā¤°ā¤ŋā¤Ą ⤏⤕āĨā¤ˇā¤Ž ⤕⤰āĨ‡ā¤‚", @@ -1161,6 +1193,7 @@ "external_network_sheet_info": "⤜ā¤Ŧ ā¤Ē⤏⤂ā¤ĻāĨ€ā¤Ļā¤ž ā¤ĩā¤žā¤ˆ-ā¤Ģā¤žā¤ˆ ⤍āĨ‡ā¤Ÿā¤ĩ⤰āĨā¤• ā¤Ē⤰ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž, ⤤āĨ‹ ⤐ā¤Ē ⤍āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤ ā¤—ā¤ ⤝āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤ŽāĨ‡ā¤‚ ⤏āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ⤕āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ⤏āĨ‡ ⤏⤰āĨā¤ĩ⤰ ⤏āĨ‡ ⤕⤍āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ā¤—ā¤ž, ⤊ā¤Ē⤰ ⤏āĨ‡ ⤍āĨ€ā¤šāĨ‡ ⤤⤕ ā¤ļāĨā¤°āĨ‚ ⤕⤰⤤āĨ‡ ā¤šāĨā¤", "face_unassigned": "⤏āĨŒā¤‚ā¤ĒāĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤—ā¤", "failed": "ā¤ĩā¤ŋā¤Ģ⤞ ā¤šāĨā¤†", + "failed_count": "ā¤ĩā¤ŋā¤Ģ⤞: {count}", "failed_to_authenticate": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤ŋ⤤ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģ⤞", "failed_to_load_assets": "ā¤ā¤¸āĨ‡ā¤Ÿ ⤞āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģ⤞", "failed_to_load_folder": "ā¤ĢāĨ‹ā¤˛āĨā¤Ąā¤° ⤞āĨ‹ā¤Ą ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģ⤞", @@ -1174,12 +1207,17 @@ "features_in_development": "ā¤ĩā¤ŋā¤•ā¤žā¤¸ ā¤ŽāĨ‡ā¤‚ ⤏āĨā¤ĩā¤ŋā¤§ā¤žā¤ā¤", "features_setting_description": "⤐ā¤Ē ⤏āĨā¤ĩā¤ŋā¤§ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧ⤂⤧⤍ ⤕⤰āĨ‡ā¤‚", "file_name_or_extension": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļ⤍", + "file_name_text": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤žā¤Ž", + "file_name_with_value": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤žā¤Ž: {file_name}", "file_size": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤¸ā¤žā¤‡ā¤œā¤ŧ", "filename": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", "filetype": "ā¤Ģā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", "filter": "ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤°", + "filter_description": "⤚āĨā¤¨āĨ‡ ā¤—ā¤ ā¤ā¤¸āĨ‡ā¤Ÿ ⤕āĨ‹ ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤° ⤕⤰⤍āĨ‡ ⤕āĨ€ ā¤ļ⤰āĨā¤¤āĨ‡ā¤‚", "filter_people": "⤞āĨ‹ā¤—āĨ‹ā¤‚ ⤕āĨ‹ ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤° ⤕⤰āĨ‡ā¤‚", "filter_places": "⤏āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ⤕āĨ‹ ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤° ⤕⤰āĨ‡ā¤‚", + "filter_tags": "⤟āĨˆā¤— ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤° ⤕⤰āĨ‡ā¤‚", + "filters": "āĨžā¤ŋ⤞⤟⤰āĨā¤¸", "find_them_fast": "⤖āĨ‹ā¤œ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¨ā¤žā¤Ž ⤏āĨ‡ ⤉⤍āĨā¤šāĨ‡ā¤‚ ⤤āĨ‡ā¤œāĨ€ ⤏āĨ‡ ā¤ĸāĨ‚⤂ā¤ĸāĨ‡ā¤‚", "first": "ā¤Ēā¤šā¤˛ā¤ž", "fix_incorrect_match": "⤗ā¤ŧ⤞⤤ ā¤Žā¤ŋā¤˛ā¤žā¤¨ ⤠āĨ€ā¤• ⤕⤰āĨ‡ā¤‚", @@ -1189,12 +1227,16 @@ "folders_feature_description": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤏ā¤ŋ⤏āĨā¤Ÿā¤Ž ā¤Ē⤰ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ ā¤•ā¤°ā¤¨ā¤ž", "forgot_pin_code_question": "⤅ā¤Ēā¤¨ā¤ž ā¤Ēā¤ŋ⤍ ⤭āĨ‚⤞ ā¤—ā¤?", "forward": "⤆⤗āĨ‡", + "free_up_space": "ā¤œā¤—ā¤š ā¤–ā¤žā¤˛āĨ€ ⤕⤰āĨ‡ā¤‚", + "free_up_space_description": "ā¤œā¤—ā¤š ā¤–ā¤žā¤˛āĨ€ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ŦāĨˆā¤•⤅ā¤Ē ⤞āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤕āĨ‹ ⤅ā¤Ē⤍āĨ‡ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ⤕āĨ‡ ⤟āĨā¤°āĨˆā¤ļ ā¤ŽāĨ‡ā¤‚ ⤭āĨ‡ā¤œāĨ‡ā¤‚āĨ¤ ⤏⤰āĨā¤ĩ⤰ ā¤Ē⤰ ⤆ā¤Ē⤕āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤¯ā¤žā¤ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ā¤°ā¤šāĨ‡ā¤‚⤗āĨ€āĨ¤", + "free_up_space_settings_subtitle": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ⤏āĨā¤ŸāĨ‹ā¤°āĨ‡ā¤œ ā¤–ā¤žā¤˛āĨ€ ⤕⤰āĨ‡ā¤‚", "full_path": "ā¤ĒāĨ‚ā¤°ā¤ž ā¤Ēā¤Ĩ: {path}", "gcast_enabled": "⤗āĨ‚⤗⤞ ā¤•ā¤žā¤¸āĨā¤Ÿ", "gcast_enabled_description": "ā¤¯ā¤š ⤏āĨā¤ĩā¤ŋā¤§ā¤ž ā¤•ā¤žā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤗āĨ‚⤗⤞ ⤏āĨ‡ ā¤Ŧā¤žā¤šāĨā¤¯ ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤¨ ⤞āĨ‹ā¤Ą ⤕⤰⤤āĨ€ ā¤šāĨˆāĨ¤", "general": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯", "geolocation_instruction_location": "⤕ā¤ŋ⤏āĨ€ ā¤Ē⤰ā¤ŋ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ⤕āĨ‡ ⤏āĨā¤Ĩā¤žā¤¨ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ GPS ⤍ā¤ŋ⤰āĨā¤ĻāĨ‡ā¤ļā¤žā¤‚ā¤• ā¤ĩā¤žā¤˛āĨ€ ā¤Ē⤰ā¤ŋ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ā¤Ē⤰ ⤕āĨā¤˛ā¤ŋ⤕ ⤕⤰āĨ‡ā¤‚, ā¤¯ā¤ž ⤏āĨ€ā¤§āĨ‡ ā¤Žā¤žā¤¨ā¤šā¤ŋ⤤āĨā¤° ⤏āĨ‡ ⤕āĨ‹ā¤ˆ ⤏āĨā¤Ĩā¤žā¤¨ ⤚āĨā¤¨āĨ‡ā¤‚", "get_help": "ā¤Žā¤Ļā¤Ļ ⤞āĨ‡ā¤‚", + "get_people_error": "⤞āĨ‹ā¤—āĨ‹ā¤‚ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "get_wifiname_error": "ā¤ĩā¤žā¤ˆ-ā¤Ģā¤ŧā¤žā¤ˆ ā¤¨ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋ⤞ ā¤¸ā¤•ā¤žāĨ¤ ⤏āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚ ⤕ā¤ŋ ⤆ā¤Ē⤍āĨ‡ ⤆ā¤ĩā¤ļāĨā¤¯ā¤• ⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤ĻāĨ‡ ā¤ĻāĨ€ ā¤šāĨˆā¤‚ ⤔⤰ ā¤ĩā¤žā¤ˆ-ā¤Ģā¤ŧā¤žā¤ˆ ⤍āĨ‡ā¤Ÿā¤ĩ⤰āĨā¤• ⤏āĨ‡ ⤕⤍āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨˆā¤‚", "getting_started": "ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨ā¤ž", "go_back": "ā¤ĩā¤žā¤Ē⤏ ā¤œā¤žā¤“", @@ -1220,12 +1262,14 @@ "header_settings_header_name_input": "ā¤šāĨ‡ā¤Ąā¤° ā¤•ā¤ž ā¤¨ā¤žā¤Ž", "header_settings_header_value_input": "ā¤šāĨ‡ā¤Ąā¤° ā¤Žā¤žā¤¨", "headers_settings_tile_title": "⤕⤏āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤šāĨ‡ā¤Ąā¤°", + "height": "ā¤Šā¤ā¤šā¤žā¤ˆ", "hi_user": "ā¤¨ā¤Žā¤¸āĨā¤¤āĨ‡ {name} ({email})", "hide_all_people": "⤏⤭āĨ€ ⤞āĨ‹ā¤—āĨ‹ā¤‚ ⤕āĨ‹ ⤛āĨā¤Ēā¤žā¤ā¤‚", "hide_gallery": "⤗āĨˆā¤˛ā¤°āĨ€ ⤛ā¤ŋā¤Ēā¤žā¤ā¤", "hide_named_person": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ⤕āĨ‹ ⤛ā¤ŋā¤Ēā¤žā¤ā¤ {name}", "hide_password": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤛ā¤ŋā¤Ēā¤žā¤ā¤‚", "hide_person": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ⤛ā¤ŋā¤Ēā¤žā¤ā¤", + "hide_schema": "⤏āĨā¤•āĨ€ā¤Žā¤ž ⤛ā¤ŋā¤Ēā¤žā¤ā¤", "hide_text_recognition": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤Ēā¤šā¤šā¤žā¤¨ ⤛ā¤ŋā¤Ēā¤žā¤ā¤", "hide_unnamed_people": "ā¤…ā¤¨ā¤žā¤Ž ⤞āĨ‹ā¤—āĨ‹ā¤‚ ⤕āĨ‹ ⤛āĨā¤Ēā¤žā¤ā¤‚", "home_page_add_to_album_conflicts": "{added} ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤ā¤˛āĨā¤Ŧā¤Ž {album} ā¤ŽāĨ‡ā¤‚ ⤜āĨ‹ā¤Ąā¤ŧāĨ€ ā¤—ā¤ˆā¤‚. {failed} ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ēā¤šā¤˛āĨ‡ ⤏āĨ‡ ā¤šāĨ€ ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤‚āĨ¤", @@ -1294,13 +1338,22 @@ "ios_debug_info_last_sync_at": "⤅⤂⤤ā¤ŋā¤Ž ⤏ā¤ŋ⤂⤕ {dateTime}", "ios_debug_info_no_processes_queued": "⤕āĨ‹ā¤ˆ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤¤ā¤žā¤°ā¤Ŧā¤ĻāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", "ios_debug_info_no_sync_yet": "⤅⤭āĨ€ ⤤⤕ ⤕āĨ‹ā¤ˆ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤¸ā¤Žā¤¨āĨā¤ĩ⤝⤍ ā¤•ā¤žā¤°āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šā¤˛ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", - "ios_debug_info_processes_queued": "{count, plural, one {{count} background process queued} other {{count} background processes queued}}", + "ios_debug_info_processes_queued": "{count, plural, one {{count} ā¤ŦāĨˆā¤•⤗āĨā¤°ā¤žā¤‰ā¤‚ā¤Ą ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ⤜āĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž} other {{count} ā¤ŦāĨˆā¤•⤗āĨā¤°ā¤žā¤‰ā¤‚ā¤Ą ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ ā¤—ā¤}}", "ios_debug_info_processing_ran_at": "ā¤ĒāĨā¤°ā¤¸ā¤‚⤏āĨā¤•⤰⤪ {dateTime} ā¤Ē⤰ ā¤šā¤˛ā¤ž", - "items_count": "{count, plural, one {# item} other {# items}}", + "items_count": "{count, plural, one {# ā¤†ā¤‡ā¤Ÿā¤Ž} other {# ā¤†ā¤‡ā¤Ÿā¤Ž}}", "jobs": "⤍āĨŒā¤•⤰ā¤ŋā¤¯ā¤žā¤‚", + "json_editor": "JSON ⤏⤂ā¤Ēā¤žā¤Ļ⤕", + "json_error": "JSON ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "keep": "ā¤°ā¤–ā¤¨ā¤ž", + "keep_albums": "ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤Ŧā¤¨ā¤žā¤ ⤰⤖āĨ‡ā¤‚", + "keep_albums_count": "⤰⤖āĨ‡ ā¤œā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚ {count} {count, plural, one {ā¤ā¤˛āĨā¤Ŧā¤Ž} other {ā¤ā¤˛āĨā¤Ŧā¤Ž}}", "keep_all": "⤏⤭āĨ€ ā¤°ā¤–ā¤¨ā¤ž", + "keep_description": "ā¤œā¤—ā¤š ā¤–ā¤žā¤˛āĨ€ ⤕⤰⤤āĨ‡ ā¤¸ā¤Žā¤¯ ⤤⤝ ⤕⤰āĨ‡ā¤‚ ⤕ā¤ŋ ⤆ā¤Ē⤕āĨ‡ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ē⤰ ⤕āĨā¤¯ā¤ž ā¤°ā¤–ā¤ž ā¤œā¤žā¤āĨ¤", + "keep_favorites": "ā¤Ē⤏⤂ā¤ĻāĨ€ā¤Ļā¤ž ā¤Ŧā¤¨ā¤žā¤ ⤰⤖āĨ‡ā¤‚", + "keep_on_device": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ē⤰ ā¤Ŧā¤¨ā¤žā¤ ⤰⤖āĨ‡ā¤‚", + "keep_on_device_hint": "⤇⤏ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ē⤰ ⤰⤖⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤†ā¤‡ā¤Ÿā¤Ž ⤚āĨā¤¨āĨ‡ā¤‚", "keep_this_delete_others": "⤇⤏āĨ‡ ⤰⤖āĨ‡ā¤‚, ⤅⤍āĨā¤¯ ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤", + "keeping": "⤰⤖āĨ‡ ā¤œā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚: {items}", "kept_this_deleted_others": "⤇⤏ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ⤕āĨ‹ ā¤°ā¤–ā¤ž ā¤—ā¤¯ā¤ž ⤔⤰ {count, plural, one {# asset} other {# assets}} ⤕āĨ‹ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "keyboard_shortcuts": "⤕āĨā¤‚ā¤œāĨ€ā¤Ē⤟⤞ ⤅⤞āĨā¤Ē ā¤Žā¤žā¤°āĨā¤—", "language": "ā¤­ā¤žā¤ˇā¤ž", @@ -1310,7 +1363,7 @@ "language_setting_description": "⤅ā¤Ē⤍āĨ€ ā¤Ē⤏⤂ā¤ĻāĨ€ā¤Ļā¤ž ā¤­ā¤žā¤ˇā¤ž ⤚āĨā¤¨āĨ‡ā¤‚", "large_files": "ā¤Ŧā¤Ąā¤ŧāĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚", "last": "⤅⤂⤤ā¤ŋā¤Ž", - "last_months": "{count, plural, one {Last month} other {Last # months}}", + "last_months": "{count, plural, one {ā¤Ēā¤ŋ⤛⤞āĨ‡ ā¤Žā¤šāĨ€ā¤¨āĨ‡} other {ā¤Ēā¤ŋ⤛⤞āĨ‡ # ā¤Žā¤šāĨ€ā¤¨āĨ‡}}", "last_seen": "⤅⤂⤤ā¤ŋā¤Ž ā¤Ŧā¤žā¤° ā¤ĻāĨ‡ā¤–ā¤ž ā¤—ā¤¯ā¤ž", "latest_version": "⤍ā¤ĩāĨ€ā¤¨ā¤¤ā¤Ž ⤏⤂⤏āĨā¤•⤰⤪", "latitude": "⤅⤕āĨā¤ˇā¤žā¤‚ā¤ļ", @@ -1342,6 +1395,7 @@ "local": "⤏āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯", "local_asset_cast_failed": "⤏⤰āĨā¤ĩ⤰ ā¤Ē⤰ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤍ ⤕āĨ€ ā¤—ā¤ˆ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ⤕āĨ‹ ā¤•ā¤žā¤¸āĨā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "local_assets": "⤏āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋā¤¯ā¤žā¤", + "local_id": "⤞āĨ‹ā¤•⤞ ā¤†ā¤ˆā¤ĄāĨ€", "local_media_summary": "⤏āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤¸ā¤žā¤°ā¤žā¤‚ā¤ļ", "local_network": "⤏āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ⤍āĨ‡ā¤Ÿā¤ĩ⤰āĨā¤•", "local_network_sheet_info": "⤍ā¤ŋ⤰āĨā¤Ļā¤ŋ⤎āĨā¤Ÿ ā¤ĩā¤žā¤ˆ-ā¤Ģā¤žā¤ˆ ⤍āĨ‡ā¤Ÿā¤ĩ⤰āĨā¤• ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤤āĨ‡ ā¤¸ā¤Žā¤¯ ⤐ā¤Ē ⤇⤏ URL ⤕āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ⤏āĨ‡ ⤏⤰āĨā¤ĩ⤰ ⤏āĨ‡ ⤕⤍āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ā¤—ā¤ž", @@ -1393,10 +1447,28 @@ "loop_videos_description": "ā¤ĩā¤ŋā¤ĩ⤰⤪ ā¤ĩāĨā¤¯āĨ‚⤅⤰ ā¤ŽāĨ‡ā¤‚ ⤕ā¤ŋ⤏āĨ€ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤕āĨ‹ ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ⤞āĨ‚ā¤Ē ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤏⤕āĨā¤ˇā¤Ž ⤕⤰āĨ‡ā¤‚āĨ¤", "main_branch_warning": "⤆ā¤Ē ā¤ĩā¤ŋā¤•ā¤žā¤¸ ⤏⤂⤏āĨā¤•⤰⤪ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚; ā¤šā¤Ž ā¤ĻāĨƒā¤ĸā¤ŧā¤¤ā¤ž ⤏āĨ‡ ⤰ā¤ŋ⤞āĨ€ā¤œā¤ŧ ⤏⤂⤏āĨā¤•⤰⤪ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤍āĨ‡ ⤕āĨ€ ⤅⤍āĨā¤ļā¤‚ā¤¸ā¤ž ⤕⤰⤤āĨ‡ ā¤šāĨˆā¤‚!", "main_menu": "ā¤ŽāĨ‡ā¤¨āĨ‚ ā¤šā¤˛ā¤žā¤ā¤", + "maintenance_action_restore": "ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", "maintenance_description": "Immich ⤕āĨ‹ ā¤ŽāĨ‡ā¤‚ā¤ŸāĨ‡ā¤¨āĨ‡ā¤‚⤏ ā¤ŽāĨ‹ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤Ąā¤žā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", "maintenance_end": "ā¤°ā¤–ā¤°ā¤–ā¤žā¤ĩ ā¤ŽāĨ‹ā¤Ą ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ⤕⤰āĨ‡ā¤‚", "maintenance_end_error": "ā¤ŽāĨ‡ā¤‚ā¤ŸāĨ‡ā¤¨āĨ‡ā¤‚⤏ ā¤ŽāĨ‹ā¤Ą ⤖⤤āĨā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤žāĨ¤", "maintenance_logged_in_as": "⤅⤭āĨ€ {user} ⤕āĨ‡ ⤤āĨŒā¤° ā¤Ē⤰ ⤞āĨ‰ā¤— ⤇⤍ ā¤šāĨˆā¤‚", + "maintenance_restore_from_backup": "ā¤ŦāĨˆā¤•⤅ā¤Ē ⤏āĨ‡ ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "maintenance_restore_library": "⤅ā¤Ē⤍āĨ€ ā¤˛ā¤žā¤‡ā¤ŦāĨā¤°āĨ‡ā¤°āĨ€ ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "maintenance_restore_library_confirm": "⤝ā¤Ļā¤ŋ ā¤¯ā¤š ā¤¸ā¤šāĨ€ ā¤˛ā¤—ā¤¤ā¤ž ā¤šāĨˆ, ⤤āĨ‹ ā¤ŦāĨˆā¤•⤅ā¤Ē ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ā¤•ā¤°ā¤¨ā¤ž ā¤œā¤žā¤°āĨ€ ⤰⤖āĨ‡ā¤‚!", + "maintenance_restore_library_description": "ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "maintenance_restore_library_folder_has_files": "{folder} ā¤ŽāĨ‡ā¤‚ {count} ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤šāĨˆā¤‚", + "maintenance_restore_library_folder_no_files": "{folder} ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚!", + "maintenance_restore_library_folder_pass": "ā¤Ēā¤ĸā¤ŧ⤍āĨ‡ ⤔⤰ ⤞ā¤ŋ⤖⤍āĨ‡ ⤝āĨ‹ā¤—āĨā¤¯", + "maintenance_restore_library_folder_read_fail": "ā¤Ēā¤ĸā¤ŧ⤍āĨ‡ ⤝āĨ‹ā¤—āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚", + "maintenance_restore_library_folder_write_fail": "⤞ā¤ŋ⤖⤍āĨ‡ ⤝āĨ‹ā¤—āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚", + "maintenance_restore_library_hint_missing_files": "⤏⤂⤭ā¤ĩ ā¤šāĨˆ ⤕ā¤ŋ ⤕āĨā¤› ā¤Žā¤šā¤¤āĨā¤ĩā¤ĒāĨ‚⤰āĨā¤Ŗ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "maintenance_restore_library_hint_regenerate_later": "⤆ā¤Ē ⤇⤍āĨā¤šāĨ‡ā¤‚ ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤Ŧā¤¨ā¤ž ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚", + "maintenance_restore_library_hint_storage_template_missing_files": "⤏āĨā¤ŸāĨ‹ā¤°āĨ‡ā¤œ ⤟āĨ‡ā¤ŽāĨā¤Ē⤞āĨ‡ā¤Ÿ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚? ⤏⤂⤭ā¤ĩ ā¤šāĨˆ ⤕ā¤ŋ ⤕āĨā¤› ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "maintenance_restore_library_loading": "ā¤‡ā¤‚ā¤ŸāĨ€ā¤—āĨā¤°ā¤ŋ⤟āĨ€ ā¤œā¤žā¤ā¤š ⤔⤰ ā¤šāĨ€ā¤¯āĨ‚⤰ā¤ŋ⤏āĨā¤Ÿā¤ŋ⤕āĨā¤¸ ⤞āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚â€Ļ", + "maintenance_task_backup": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤•ā¤ž ā¤ŦāĨˆā¤•⤅ā¤Ē ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆâ€Ļ", + "maintenance_task_migrations": "ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤Žā¤žā¤‡ā¤—āĨā¤°āĨ‡ā¤ļ⤍ ⤚⤞ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚â€Ļ", + "maintenance_task_restore": "⤚āĨā¤¨āĨ‡ ā¤—ā¤ ā¤ŦāĨˆā¤•⤅ā¤Ē ⤕āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆâ€Ļ", + "maintenance_task_rollback": "ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ā¤ž ā¤ĩā¤ŋā¤Ģ⤞ ā¤šāĨā¤ˆ, ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ā¤ž ā¤Ŧā¤ŋ⤂ā¤ĻāĨ ā¤Ē⤰ ā¤ĩā¤žā¤Ē⤏ ⤞āĨŒā¤Ÿ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚â€Ļ", "maintenance_title": "⤅⤏āĨā¤Ĩā¤žā¤ˆ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ⤅⤍āĨā¤Ē⤞ā¤ŦāĨā¤§", "make": "ā¤Ŧā¤¨ā¤žā¤¨ā¤ž", "manage_geolocation": "⤏āĨā¤Ĩā¤žā¤¨ ā¤ĒāĨā¤°ā¤Ŧ⤂⤧ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", @@ -1412,7 +1484,7 @@ "manage_your_devices": "⤅ā¤Ē⤍āĨ‡ ⤞āĨ‰ā¤—-⤇⤍ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧ⤂⤧ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "manage_your_oauth_connection": "⤅ā¤Ēā¤¨ā¤ž OAuth ⤕⤍āĨ‡ā¤•āĨā¤ļ⤍ ā¤ĒāĨā¤°ā¤Ŧ⤂⤧ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "map": "⤍⤕āĨā¤ļā¤ž", - "map_assets_in_bounds": "{count, plural, =0 {No photos in this area} one {# photo} other {# photos}}", + "map_assets_in_bounds": "{count, plural, =0 {ā¤¯ā¤šā¤žā¤ ⤕āĨ‹ā¤ˆ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ} one {# ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹} other {# ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹}}", "map_cannot_get_user_location": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤•ā¤ž ⤏āĨā¤Ĩā¤žā¤¨ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", "map_location_dialog_yes": "ā¤šā¤žā¤", "map_location_picker_page_use_location": "⤇⤏ ⤏āĨā¤Ĩā¤žā¤¨ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚", @@ -1458,6 +1530,8 @@ "minimize": "⤛āĨ‹ā¤Ÿā¤ž ā¤•ā¤°ā¤¨ā¤ž", "minute": "ā¤Žā¤ŋ⤍⤟", "minutes": "ā¤Žā¤ŋ⤍⤟", + "mirror_horizontal": "⤕āĨā¤ˇāĨˆā¤¤ā¤ŋ⤜", + "mirror_vertical": "⤊⤰āĨā¤§āĨā¤ĩā¤žā¤§ā¤°", "missing": "⤗āĨā¤Ž", "mobile_app": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤ļ⤍", "mobile_app_download_onboarding_note": "⤍ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋ⤖ā¤ŋ⤤ ā¤ĩā¤ŋ⤕⤞āĨā¤ĒāĨ‹ā¤‚ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤕āĨ‡ ā¤¸ā¤žā¤ĨāĨ€ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ⤐ā¤Ē ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", @@ -1466,11 +1540,14 @@ "monthly_title_text_date_format": "ā¤ā¤Žā¤ā¤Žā¤ā¤Žā¤ā¤Ž ā¤ĩā¤žā¤ˆ", "more": "⤅⤧ā¤ŋ⤕", "move": "⤏āĨā¤Ĩā¤žā¤¨ ā¤Ē⤰ā¤ŋā¤ĩ⤰āĨā¤¤ā¤¨", + "move_down": "⤍āĨ€ā¤šāĨ‡ ⤞āĨ‡ ā¤œā¤žā¤ā¤", "move_off_locked_folder": "⤞āĨ‰ā¤• ⤕ā¤ŋā¤ ā¤—ā¤ ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ⤏āĨ‡ ā¤Ŧā¤žā¤šā¤° ⤞āĨ‡ ā¤œā¤žā¤ā¤‚", "move_to": "⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤕ā¤Ļā¤Ž", + "move_to_device_trash": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ⤕āĨ‡ ⤟āĨā¤°āĨˆā¤ļ ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤ā¤", "move_to_lock_folder_action_prompt": "{count} ⤞āĨ‰ā¤• ⤕ā¤ŋā¤ ā¤—ā¤ ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤ŽāĨ‡ā¤‚ ⤜āĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", "move_to_locked_folder": "⤞āĨ‰ā¤• ⤕ā¤ŋā¤ ā¤—ā¤ ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤ā¤‚", "move_to_locked_folder_confirmation": "⤝āĨ‡ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤏⤭āĨ€ ā¤ā¤˛āĨā¤Ŧā¤ŽāĨ‹ā¤‚ ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤ā¤ā¤—āĨ‡ ⤔⤰ ⤕āĨ‡ā¤ĩ⤞ ⤞āĨ‰ā¤• ⤕ā¤ŋā¤ ā¤—ā¤ ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ⤏āĨ‡ ā¤šāĨ€ ā¤ĻāĨ‡ā¤–āĨ‡ ā¤œā¤ž ⤏⤕āĨ‡ā¤‚⤗āĨ‡", + "move_up": "⤊ā¤Ē⤰ ⤞āĨ‡ ā¤œā¤žā¤ā¤", "moved_to_archive": "{count, plural, one {# asset} other {# assets}} ⤕āĨ‹ ⤏⤂⤗āĨā¤°ā¤š ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "moved_to_library": "{count, plural, one {# asset} other {# assets}} ⤕āĨ‹ ā¤˛ā¤žā¤‡ā¤ŦāĨā¤°āĨ‡ā¤°āĨ€ ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "moved_to_trash": "⤕āĨ‚ā¤Ąā¤ŧāĨ‡ā¤Ļā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", @@ -1480,6 +1557,7 @@ "my_albums": "ā¤ŽāĨ‡ā¤°āĨ‡ ā¤ā¤˛āĨā¤Ŧā¤Ž", "name": "ā¤¨ā¤žā¤Ž", "name_or_nickname": "ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ⤉ā¤Ēā¤¨ā¤žā¤Ž", + "name_required": "ā¤¨ā¤žā¤Ž ⤆ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", "navigate": "⤍āĨ‡ā¤ĩā¤ŋ⤗āĨ‡ā¤Ÿ", "navigate_to_time": "ā¤¸ā¤Žā¤¯ ā¤Ē⤰ ⤍āĨ‡ā¤ĩā¤ŋ⤗āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚", "network_requirement_photos_upload": "ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ā¤•ā¤ž ā¤ŦāĨˆā¤•⤅ā¤Ē ⤞āĨ‡ā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤏āĨ‡ā¤˛āĨā¤˛ā¤° ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚", @@ -1504,6 +1582,8 @@ "next": "ā¤…ā¤—ā¤˛ā¤ž", "next_memory": "⤅⤗⤞āĨ€ ⤏āĨā¤ŽāĨƒā¤¤ā¤ŋ", "no": "ā¤¨ā¤šāĨ€ā¤‚", + "no_actions_added": "⤅⤭āĨ€ ⤤⤕ ⤕āĨ‹ā¤ˆ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ⤜āĨ‹ā¤Ąā¤ŧāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤—ā¤ˆ ā¤šāĨˆ", + "no_albums_found": "⤕āĨ‹ā¤ˆ ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", "no_albums_message": "⤅ā¤Ē⤍āĨ€ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤕āĨ‹ ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ā¤• ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", "no_albums_with_name_yet": "ā¤ā¤¸ā¤ž ā¤˛ā¤—ā¤¤ā¤ž ā¤šāĨˆ ⤕ā¤ŋ ⤆ā¤Ē⤕āĨ‡ ā¤Ēā¤žā¤¸ ⤅⤭āĨ€ ⤤⤕ ⤇⤏ ā¤¨ā¤žā¤Ž ā¤•ā¤ž ⤕āĨ‹ā¤ˆ ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", "no_albums_yet": "ā¤ā¤¸ā¤ž ā¤˛ā¤—ā¤¤ā¤ž ā¤šāĨˆ ⤕ā¤ŋ ⤆ā¤Ē⤕āĨ‡ ā¤Ēā¤žā¤¸ ⤅⤭āĨ€ ⤤⤕ ⤕āĨ‹ā¤ˆ ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", @@ -1513,11 +1593,13 @@ "no_cast_devices_found": "⤕āĨ‹ā¤ˆ ā¤•ā¤žā¤¸āĨā¤Ÿ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", "no_checksum_local": "⤕āĨ‹ā¤ˆ ⤚āĨ‡ā¤•ā¤¸ā¤Ž ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ - ⤏āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ⤕āĨ€ ā¤œā¤ž ⤏⤕⤤āĨ€ā¤‚", "no_checksum_remote": "⤕āĨ‹ā¤ˆ ⤚āĨ‡ā¤•ā¤¸ā¤Ž ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ - ā¤ĻāĨ‚⤰⤏āĨā¤Ĩ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ⤕āĨ€ ā¤œā¤ž ⤏⤕⤤āĨ€", + "no_configuration_needed": "⤕ā¤ŋ⤏āĨ€ ⤕āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋ⤗⤰āĨ‡ā¤ļ⤍ ⤕āĨ€ ⤆ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", "no_devices": "⤕āĨ‹ā¤ˆ ⤅⤧ā¤ŋ⤕āĨƒā¤¤ ⤉ā¤Ē⤕⤰⤪ ā¤¨ā¤šāĨ€ā¤‚", "no_duplicates_found": "⤕āĨ‹ā¤ˆ ā¤¨ā¤•ā¤˛ā¤šāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤žāĨ¤", "no_exif_info_available": "⤕āĨ‹ā¤ˆ ā¤ā¤•āĨā¤¸ā¤ŋā¤Ģā¤ŧ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", "no_explore_results_message": "⤅ā¤Ē⤍āĨ‡ ⤏⤂⤗āĨā¤°ā¤š ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤔⤰ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚āĨ¤", "no_favorites_message": "⤅ā¤Ē⤍āĨ€ ⤏⤰āĨā¤ĩā¤ļāĨā¤°āĨ‡ā¤ˇāĨā¤  ⤤⤏āĨā¤ĩāĨ€ā¤°āĨ‡ā¤‚ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤤āĨā¤°ā¤‚⤤ ā¤ĸāĨ‚⤂ā¤ĸ⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ē⤏⤂ā¤ĻāĨ€ā¤Ļā¤ž ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "no_filters_added": "⤅⤭āĨ€ ⤤⤕ ⤕āĨ‹ā¤ˆ ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤° ⤜āĨ‹ā¤Ąā¤ŧā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤—ā¤¯ā¤ž ā¤šāĨˆ", "no_libraries_message": "⤅ā¤Ē⤍āĨ€ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ā¤ĻāĨ‡ā¤–⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ā¤• ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤˛ā¤žā¤‡ā¤ŦāĨā¤°āĨ‡ā¤°āĨ€ ā¤Ŧā¤¨ā¤žā¤ā¤‚", "no_local_assets_found": "⤇⤏ ⤚āĨ‡ā¤•ā¤¸ā¤Ž ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤕āĨ‹ā¤ˆ ⤏āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋ⤞āĨ€", "no_location_set": "⤕āĨ‹ā¤ˆ ⤏āĨā¤Ĩā¤žā¤¨ ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ā¤¨ā¤šāĨ€ā¤‚", @@ -1531,6 +1613,7 @@ "no_results_description": "⤕āĨ‹ā¤ˆ ā¤Ē⤰āĨā¤¯ā¤žā¤¯ā¤ĩā¤žā¤šāĨ€ ā¤¯ā¤ž ⤅⤧ā¤ŋ⤕ ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ⤕āĨ€ā¤ĩ⤰āĨā¤Ą ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤", "no_shared_albums_message": "⤅ā¤Ē⤍āĨ‡ ⤍āĨ‡ā¤Ÿā¤ĩ⤰āĨā¤• ā¤ŽāĨ‡ā¤‚ ⤞āĨ‹ā¤—āĨ‹ā¤‚ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ā¤¸ā¤žā¤ā¤ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ā¤• ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", "no_uploads_in_progress": "⤕āĨ‹ā¤ˆ ⤅ā¤Ē⤞āĨ‹ā¤Ą ā¤ĒāĨā¤°ā¤—⤤ā¤ŋ ā¤Ē⤰ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "none": "⤕āĨ‹ā¤ˆ ā¤¨ā¤šāĨ€ā¤‚", "not_allowed": "⤅⤍āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚", "not_available": "ā¤˛ā¤žā¤—āĨ‚ ā¤¨ā¤šāĨ€ā¤‚", "not_in_any_album": "⤕ā¤ŋ⤏āĨ€ ā¤ā¤˛ā¤Ŧā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚", @@ -1564,6 +1647,7 @@ "online": "ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨", "only_favorites": "⤕āĨ‡ā¤ĩ⤞ ā¤Ē⤏⤂ā¤ĻāĨ€ā¤Ļā¤ž", "open": "⤖āĨā¤˛ā¤ž", + "open_calendar": "⤕āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤° ⤖āĨ‹ā¤˛āĨ‡ā¤‚", "open_in_map_view": "ā¤Žā¤žā¤¨ā¤šā¤ŋ⤤āĨā¤° ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤ŽāĨ‡ā¤‚ ⤖āĨ‹ā¤˛āĨ‡ā¤‚", "open_in_openstreetmap": "OpenStreetMap ā¤ŽāĨ‡ā¤‚ ⤖āĨ‹ā¤˛āĨ‡ā¤‚", "open_the_search_filters": "⤖āĨ‹ā¤œ ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤° ⤖āĨ‹ā¤˛āĨ‡ā¤‚", @@ -1579,6 +1663,7 @@ "other_variables": "⤅⤍āĨā¤¯ ⤚⤰", "owned": "⤏āĨā¤ĩā¤žā¤Žā¤ŋ⤤āĨā¤ĩ", "owner": "ā¤Žā¤žā¤˛ā¤ŋ⤕", + "page": "ā¤ĒāĨ‡ā¤œ", "partner": "ā¤¸ā¤žā¤ĨāĨ€", "partner_can_access": "{partner} ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ⤕⤰ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚", "partner_can_access_assets": "⤏⤂⤗āĨā¤°ā¤šāĨ€ā¤¤ ⤔⤰ ā¤šā¤Ÿā¤žā¤ ā¤—ā¤ ⤕āĨ‹ ⤛āĨ‹ā¤Ąā¤ŧ⤕⤰ ⤆ā¤Ē⤕āĨ‡ ⤏⤭āĨ€ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹", @@ -1611,6 +1696,7 @@ "people": "⤞āĨ‹ā¤—", "people_edits_count": "⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ {count, plural, one {# person} other {# people}}", "people_feature_description": "⤞āĨ‹ā¤—āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤ŽāĨ‚ā¤šāĨ€ā¤•āĨƒā¤¤ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ ā¤•ā¤°ā¤¨ā¤ž", + "people_selected": "{count, plural, one {# ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ⤚āĨā¤¨ā¤ž ā¤—ā¤¯ā¤ž} other {# ⤞āĨ‹ā¤— ⤚āĨā¤¨āĨ‡ ā¤—ā¤}}", "people_sidebar_description": "ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° ā¤ŽāĨ‡ā¤‚ ⤞āĨ‹ā¤—āĨ‹ā¤‚ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ā¤• ⤞ā¤ŋ⤂⤕ ā¤ĒāĨā¤°ā¤Ļ⤰āĨā¤ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "permanent_deletion_warning": "⤏āĨā¤Ĩā¤žā¤¯āĨ€ ā¤ĩā¤ŋ⤞āĨ‹ā¤Ē⤍ ⤚āĨ‡ā¤¤ā¤žā¤ĩ⤍āĨ€", "permanent_deletion_warning_setting_description": "⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ⤝āĨ‹ā¤‚ ⤕āĨ‹ ⤏āĨā¤Ĩā¤žā¤¯āĨ€ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤žā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ā¤• ⤚āĨ‡ā¤¤ā¤žā¤ĩ⤍āĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", @@ -1634,12 +1720,15 @@ "person_age_year_months": "1 ā¤ĩ⤰āĨā¤ˇ, {months, plural, one {# month} other {# months}} ā¤ĒāĨā¤°ā¤žā¤¨ā¤ž", "person_age_years": "{years, plural, other {# years}} ā¤ĒāĨā¤°ā¤žā¤¨ā¤ž", "person_birthdate": "{date} ⤕āĨ‹ ⤜⤍āĨā¤ŽāĨ‡", - "person_hidden": "{name}{hidden, select, true { (hidden)} other {}}", + "person_hidden": "{name}{hidden, select, true { (⤛ā¤ŋā¤Ēā¤ž ā¤šāĨā¤†)} other {}}", + "person_recognized": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤Ēā¤šā¤šā¤žā¤¨ā¤ž ā¤—ā¤¯ā¤ž", + "person_selected": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ⤚āĨā¤¨ā¤ž ā¤—ā¤¯ā¤ž", "photo_shared_all_users": "ā¤ā¤¸ā¤ž ā¤˛ā¤—ā¤¤ā¤ž ā¤šāĨˆ ⤕ā¤ŋ ⤆ā¤Ē⤍āĨ‡ ⤅ā¤Ē⤍āĨ€ ⤤⤏āĨā¤ĩāĨ€ā¤°āĨ‡ā¤‚ ⤏⤭āĨ€ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤žā¤“⤂ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤ā¤ž ⤕āĨ€ā¤‚ ā¤¯ā¤ž ⤆ā¤Ē⤕āĨ‡ ā¤Ēā¤žā¤¸ ā¤¸ā¤žā¤ā¤ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤕āĨ‹ā¤ˆ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", "photos": "⤤⤏āĨā¤ĩāĨ€ā¤°āĨ‡ā¤‚", "photos_and_videos": "⤤⤏āĨā¤ĩāĨ€ā¤°āĨ‡ā¤‚ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹", - "photos_count": "{count, plural, one {{count, number} Photo} other {{count, number} Photos}}", + "photos_count": "{count, plural, one {{count, number} ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹} other {{count, number} ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹}}", "photos_from_previous_years": "ā¤Ēā¤ŋ⤛⤞āĨ‡ ā¤ĩ⤰āĨā¤ˇāĨ‹ā¤‚ ⤕āĨ€ ⤤⤏āĨā¤ĩāĨ€ā¤°āĨ‡ā¤‚", + "photos_only": "⤕āĨ‡ā¤ĩ⤞ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹", "pick_a_location": "ā¤ā¤• ⤏āĨā¤Ĩā¤žā¤¨ ⤚āĨā¤¨āĨ‡ā¤‚", "pick_custom_range": "⤕⤏āĨā¤Ÿā¤Ž ⤰āĨ‡ā¤‚ā¤œ", "pick_date_range": "ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ⤏āĨ€ā¤Žā¤ž ⤚āĨā¤¨āĨ‡ā¤‚", @@ -1649,7 +1738,7 @@ "pin_verification": "ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤Ą ⤏⤤āĨā¤¯ā¤žā¤Ē⤍", "place": "ā¤œā¤—ā¤š", "places": "⤏āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚", - "places_count": "{count, plural, one {{count, number} Place} other {{count, number} Places}}", + "places_count": "{count, plural, one {{count, number} ⤏āĨā¤Ĩā¤žā¤¨} other {{count, number} ⤏āĨā¤Ĩā¤žā¤¨}}", "play": "⤖āĨ‡ā¤˛", "play_memories": "ā¤¯ā¤žā¤ĻāĨ‡ā¤‚ ⤖āĨ‡ā¤˛āĨ‡ā¤‚", "play_motion_photo": "ā¤ŽāĨ‹ā¤ļ⤍ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ā¤šā¤˛ā¤žā¤ā¤‚", @@ -1715,9 +1804,10 @@ "purchase_settings_server_activated": "⤏⤰āĨā¤ĩ⤰ ⤉⤤āĨā¤Ēā¤žā¤Ļ ⤕āĨā¤‚ā¤œāĨ€ ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤žā¤Ē⤕ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ĒāĨā¤°ā¤Ŧ⤂⤧ā¤ŋ⤤ ⤕āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ", "query_asset_id": "⤕āĨā¤ĩāĨ‡ā¤°āĨ€ ā¤ā¤¸āĨ‡ā¤Ÿ ā¤†ā¤ˆā¤ĄāĨ€", "queue_status": "ā¤•ā¤¤ā¤žā¤°ā¤Ŧā¤ĻāĨā¤§ {count}/{total}", + "rate_asset": "ā¤ā¤¸āĨ‡ā¤Ÿ ⤕āĨ‹ ⤰āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚", "rating": "⤏āĨā¤Ÿā¤žā¤° ⤰āĨ‡ā¤Ÿā¤ŋ⤂⤗", "rating_clear": "⤏āĨā¤Ē⤎āĨā¤Ÿ ⤰āĨ‡ā¤Ÿā¤ŋ⤂⤗", - "rating_count": "{count, plural, one {# star} other {# stars}}", + "rating_count": "{count, plural, one {# ⤏āĨā¤Ÿā¤žā¤°} other {# ⤏āĨā¤Ÿā¤žā¤°}}", "rating_description": "ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ EXIF ⤰āĨ‡ā¤Ÿā¤ŋ⤂⤗ ā¤ĒāĨā¤°ā¤Ļ⤰āĨā¤ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "reaction_options": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ⤕āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩā¤ŋ⤕⤞āĨā¤Ē", "read_changelog": "⤚āĨ‡ā¤‚ā¤œā¤˛āĨ‰ā¤— ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚", @@ -1818,9 +1908,11 @@ "saved_settings": "ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤—ā¤ˆ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸", "say_something": "⤕āĨā¤› ā¤•ā¤šāĨ‡ā¤‚", "scaffold_body_error_occurred": "⤤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨā¤ˆ", + "scan": "⤏āĨā¤•āĨˆā¤¨", "scan_all_libraries": "⤏⤭āĨ€ ā¤ĒāĨā¤¸āĨā¤¤ā¤•ā¤žā¤˛ā¤¯āĨ‹ā¤‚ ⤕āĨ‹ ⤏āĨā¤•āĨˆā¤¨ ⤕⤰āĨ‡ā¤‚", "scan_library": "⤏āĨā¤•āĨˆā¤¨", "scan_settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ⤏āĨā¤•āĨˆā¤¨ ⤕⤰āĨ‡ā¤‚", + "scanning": "⤏āĨā¤•āĨˆā¤¨ ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ", "scanning_for_album": "ā¤ā¤˛āĨā¤Ŧā¤Ž ⤕āĨ‡ ⤞ā¤ŋā¤ ⤏āĨā¤•āĨˆā¤¨ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ..āĨ¤", "search": "⤖āĨ‹ā¤œ", "search_albums": "ā¤ā¤˛āĨā¤Ŧā¤Ž ⤖āĨ‹ā¤œāĨ‡ā¤‚", @@ -1850,6 +1942,8 @@ "search_filter_media_type_title": "ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ⤚āĨā¤¨āĨ‡ā¤‚", "search_filter_ocr": "OCR ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ⤖āĨ‹ā¤œāĨ‡ā¤‚", "search_filter_people_title": "⤞āĨ‹ā¤—āĨ‹ā¤‚ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", + "search_filter_star_rating": "⤏āĨā¤Ÿā¤žā¤° ⤰āĨ‡ā¤Ÿā¤ŋ⤂⤗", + "search_filter_tags_title": "⤟āĨˆā¤— ⤚āĨā¤¨āĨ‡ā¤‚", "search_for": "⤍ā¤ŋā¤ŽāĨā¤¨ ⤕āĨ‹ ⤖āĨ‹ā¤œāĨ‡ā¤‚", "search_for_existing_person": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ⤕āĨ‹ ⤖āĨ‹ā¤œāĨ‡ā¤‚", "search_no_more_result": "⤕āĨ‹ā¤ˆ ⤔⤰ ā¤Ē⤰ā¤ŋā¤Ŗā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚", @@ -1884,23 +1978,29 @@ "second": "ā¤ĻāĨ‚ā¤¸ā¤°ā¤ž", "see_all_people": "⤏⤭āĨ€ ⤞āĨ‹ā¤—āĨ‹ā¤‚ ⤕āĨ‹ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", "select": "⤚āĨā¤¨ā¤¨ā¤ž", + "select_album": "ā¤ā¤˛āĨā¤Ŧā¤Ž ⤚āĨā¤¨āĨ‡", "select_album_cover": "ā¤ā¤˛āĨā¤Ŧā¤Ž ⤕ā¤ĩ⤰ ⤚āĨā¤¨āĨ‡ā¤‚", + "select_albums": "⤅⤞ā¤ŦāĨā¤Žā¤¸ ⤚āĨā¤¨āĨ‡ā¤‚", "select_all": "⤏ā¤Ŧā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_all_duplicates": "⤏⤭āĨ€ ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤Ÿ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_all_in": "{group} ā¤ŽāĨ‡ā¤‚ ⤏⤭āĨ€ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_avatar_color": "⤅ā¤ĩā¤¤ā¤žā¤° ⤰⤂⤗ ⤚āĨā¤¨āĨ‡ā¤‚", + "select_count": "{count, plural, one {# ⤚āĨā¤¨āĨ‡ā¤‚} other {# ⤚āĨā¤¨āĨ‡ā¤‚}}", + "select_cutoff_date": "ā¤•ā¤Ÿā¤‘ā¤Ģā¤ŧ ⤤ā¤ŋā¤Ĩā¤ŋ ⤚āĨā¤¨āĨ‡ā¤‚", "select_face": "⤚āĨ‡ā¤šā¤°ā¤ž ⤚āĨā¤¨āĨ‡ā¤‚", "select_featured_photo": "⤚āĨā¤¨ā¤ŋ⤂ā¤Ļā¤ž ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤚āĨā¤¨āĨ‡ā¤‚", "select_from_computer": "⤕⤂ā¤ĒāĨā¤¯āĨ‚ā¤Ÿā¤° ⤏āĨ‡ ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_keep_all": "⤏⤭āĨ€ ⤰⤖āĨ‡ā¤‚ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_library_owner": "ā¤˛ā¤žā¤‡ā¤ŦāĨā¤°āĨ‡ā¤°āĨ€ ⤏āĨā¤ĩā¤žā¤ŽāĨ€ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_new_face": "ā¤¨ā¤¯ā¤ž ⤚āĨ‡ā¤šā¤°ā¤ž ⤚āĨā¤¨āĨ‡ā¤‚", + "select_people": "⤞āĨ‹ā¤— ⤚āĨā¤¨āĨ‡ā¤‚", + "select_person": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ⤚āĨā¤¨āĨ‡ā¤‚", "select_person_to_tag": "⤟āĨˆā¤— ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤕ā¤ŋ⤏āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_photos": "ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤚āĨā¤¨āĨ‡ā¤‚", "select_trash_all": "⤟āĨā¤°āĨˆā¤ļ ⤑⤞ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "select_user_for_sharing_page_err_album": "ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģ⤞", "selected": "⤚⤝⤍ā¤ŋ⤤", - "selected_count": "{count, plural, other {# selected}}", + "selected_count": "{count, plural, other {# ⤚⤝⤍ā¤ŋ⤤}}", "selected_gps_coordinates": "⤚⤝⤍ā¤ŋ⤤ GPS ⤍ā¤ŋ⤰āĨā¤ĻāĨ‡ā¤ļā¤žā¤‚ā¤•", "send_message": "ā¤ŽāĨ‡ā¤¸āĨ‡ā¤œ ⤭āĨ‡ā¤œāĨ‡ā¤‚", "send_welcome_email": "⤏āĨā¤ĩā¤žā¤—ā¤¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ⤭āĨ‡ā¤œāĨ‡ā¤‚", @@ -1986,7 +2086,7 @@ "shared_link_edit_expire_after_option_year": "{count} ā¤ĩ⤰āĨā¤ˇ", "shared_link_edit_password_hint": "ā¤ļāĨ‡ā¤¯ā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚", "shared_link_edit_submit_button": "⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤞ā¤ŋ⤂⤕", - "shared_link_error_server_url_fetch": "⤏⤰āĨā¤ĩ⤰ URL ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", + "shared_link_error_server_url_fetch": "⤏⤰āĨā¤ĩ⤰ url ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", "shared_link_expires_day": "{count} ā¤Ļā¤ŋ⤍ ā¤ŽāĨ‡ā¤‚ ⤇⤏⤕āĨ€ ā¤ĩāĨˆā¤§ā¤¤ā¤ž ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—āĨ€", "shared_link_expires_days": "{count} ā¤Ļā¤ŋ⤍āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤ž", "shared_link_expires_hour": "{count} ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤ž", @@ -2003,7 +2103,7 @@ "shared_link_password_description": "⤇⤏ ā¤ļāĨ‡ā¤¯ā¤° ⤕ā¤ŋā¤ ā¤—ā¤ ⤞ā¤ŋ⤂⤕ ⤕āĨ‹ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜ā¤ŧ⤰āĨ‚⤰āĨ€ ā¤šāĨˆ", "shared_links": "ā¤¸ā¤žā¤ā¤ž ⤕ā¤ŋā¤ ā¤—ā¤ ⤞ā¤ŋ⤂⤕", "shared_links_description": "⤞ā¤ŋ⤂⤕ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ā¤ļāĨ‡ā¤¯ā¤° ⤕⤰āĨ‡ā¤‚", - "shared_photos_and_videos_count": "{assetCount, plural, other {# shared photos & videos.}}", + "shared_photos_and_videos_count": "{assetCount, plural, other {# ā¤¸ā¤žā¤ā¤ž ā¤Ģā¤ŧāĨ‹ā¤ŸāĨ‹ ⤔⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹}}", "shared_with_me": "ā¤ŽāĨ‡ā¤°āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤ā¤ž ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "shared_with_partner": "{partner} ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ļāĨ‡ā¤¯ā¤° ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "sharing": "ā¤ļāĨ‡ā¤¯ā¤°ā¤ŋ⤂⤗", @@ -2030,6 +2130,7 @@ "show_password": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤Ļā¤ŋā¤–ā¤žā¤", "show_person_options": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", "show_progress_bar": "ā¤ĒāĨā¤°ā¤—⤤ā¤ŋ ā¤Ē⤟āĨā¤ŸāĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "show_schema": "⤏āĨā¤•āĨ€ā¤Žā¤ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", "show_search_options": "⤖āĨ‹ā¤œ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", "show_shared_links": "ā¤¸ā¤žā¤ā¤ž ⤞ā¤ŋ⤂⤕ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", "show_slideshow_transition": "⤏āĨā¤˛ā¤žā¤‡ā¤Ą ā¤ļāĨ‹ ⤟āĨā¤°ā¤žā¤‚ā¤œā¤ŧā¤ŋā¤ļ⤍ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", @@ -2047,6 +2148,8 @@ "skip_to_folders": "ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤°āĨ‹ā¤‚ ā¤Ē⤰ ā¤œā¤žā¤ā¤‚", "skip_to_tags": "⤟āĨˆā¤— ā¤Ē⤰ ā¤œā¤žā¤ā¤‚", "slideshow": "⤏āĨā¤˛ā¤žā¤‡ā¤Ą ā¤ļāĨ‹", + "slideshow_repeat": "⤏āĨā¤˛ā¤žā¤‡ā¤Ą ā¤ļāĨ‹ ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ā¤", + "slideshow_repeat_description": "⤏āĨā¤˛ā¤žā¤‡ā¤Ą ā¤ļāĨ‹ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ē⤰ ā¤ļāĨā¤°āĨā¤†ā¤¤ ⤏āĨ‡ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤šā¤˛ā¤žā¤ā¤", "slideshow_settings": "⤏āĨā¤˛ā¤žā¤‡ā¤Ą ā¤ļāĨ‹ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸", "sort_albums_by": "ā¤ā¤˛āĨā¤Ŧā¤Ž ⤕āĨ‹ ⤕āĨā¤°ā¤Žā¤Ŧā¤ĻāĨā¤§ ⤕⤰āĨ‡ā¤‚..āĨ¤", "sort_created": "ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤•", @@ -2086,6 +2189,7 @@ "support": "ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž", "support_and_feedback": "ā¤¸ā¤Žā¤°āĨā¤Ĩ⤍ ⤔⤰ ā¤ĒāĨā¤°ā¤¤ā¤ŋ⤕āĨā¤°ā¤ŋā¤¯ā¤ž", "support_third_party_description": "⤆ā¤Ēā¤•ā¤ž Immich ⤇⤂⤏āĨā¤ŸāĨ‰ā¤˛āĨ‡ā¤ļ⤍ ⤕ā¤ŋ⤏āĨ€ ā¤Ĩ⤰āĨā¤Ą-ā¤Ēā¤žā¤°āĨā¤ŸāĨ€ ⤍āĨ‡ ā¤ĒāĨˆā¤•āĨ‡ā¤œ ⤕ā¤ŋā¤¯ā¤ž ā¤Ĩā¤žāĨ¤ ⤆ā¤Ē⤕āĨ‹ ⤜āĨ‹ ā¤Ļā¤ŋ⤕āĨā¤•⤤āĨ‡ā¤‚ ⤆ ā¤°ā¤šāĨ€ ā¤šāĨˆā¤‚, ā¤ĩāĨ‡ ⤉⤏ ā¤ĒāĨˆā¤•āĨ‡ā¤œ ⤕āĨ€ ā¤ĩā¤œā¤š ⤏āĨ‡ ā¤šāĨ‹ ⤏⤕⤤āĨ€ ā¤šāĨˆā¤‚, ⤇⤏⤞ā¤ŋā¤ ⤕āĨƒā¤Ēā¤¯ā¤ž ⤍āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤ ā¤—ā¤ ⤞ā¤ŋ⤂⤕ ā¤•ā¤ž ⤇⤏āĨā¤¤āĨ‡ā¤Žā¤žā¤˛ ⤕⤰⤕āĨ‡ ⤏ā¤Ŧ⤏āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ⤉⤍⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤅ā¤Ē⤍āĨ€ ā¤Ļā¤ŋ⤕āĨā¤•⤤āĨ‡ā¤‚ ā¤Ŧā¤¤ā¤žā¤ā¤‚āĨ¤", + "supporter": "ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕", "swap_merge_direction": "ā¤Žā¤°āĨā¤œ ā¤Ļā¤ŋā¤ļā¤ž ⤏āĨā¤ĩāĨˆā¤Ē ⤕⤰āĨ‡ā¤‚", "sync": "ā¤¸ā¤žā¤Ĩ-ā¤¸ā¤žā¤Ĩ ā¤•ā¤°ā¤¨ā¤ž", "sync_albums": "ā¤ā¤˛āĨā¤Ŧā¤ŽāĨā¤¸ ⤏ā¤ŋ⤂⤕ ⤕⤰āĨ‡ā¤‚", @@ -2123,6 +2227,7 @@ "theme_setting_theme_subtitle": "⤐ā¤Ē ⤕āĨ€ ā¤ĨāĨ€ā¤Ž ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗ ⤚āĨā¤¨āĨ‡ā¤‚", "theme_setting_three_stage_loading_subtitle": "ā¤ĨāĨā¤°āĨ€-⤏āĨā¤ŸāĨ‡ā¤œ ⤞āĨ‹ā¤Ąā¤ŋ⤂⤗ ⤏āĨ‡ ⤞āĨ‹ā¤Ąā¤ŋ⤂⤗ ā¤Ē⤰ā¤ĢāĨ‰ā¤°āĨā¤ŽāĨ‡ā¤‚⤏ ā¤Ŧā¤ĸā¤ŧ ⤏⤕⤤āĨ€ ā¤šāĨˆ ⤞āĨ‡ā¤•ā¤ŋ⤍ ⤇⤏⤏āĨ‡ ⤍āĨ‡ā¤Ÿā¤ĩ⤰āĨā¤• ⤞āĨ‹ā¤Ą ā¤•ā¤žā¤ĢāĨ€ ā¤Ŧā¤ĸā¤ŧ ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ", "theme_setting_three_stage_loading_title": "⤤āĨ€ā¤¨-⤚⤰⤪ ⤞āĨ‹ā¤Ąā¤ŋ⤂⤗ ⤏⤕āĨā¤ˇā¤Ž ⤕⤰āĨ‡ā¤‚", + "then": "ā¤Ģā¤ŋ⤰", "they_will_be_merged_together": "⤇⤍āĨā¤šāĨ‡ā¤‚ ā¤ā¤• ā¤¸ā¤žā¤Ĩ ā¤Žā¤ŋā¤˛ā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", "third_party_resources": "⤤āĨƒā¤¤āĨ€ā¤¯-ā¤Ē⤕āĨā¤ˇ ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤¨", "time": "ā¤¸ā¤Žā¤¯", @@ -2139,6 +2244,7 @@ "to_select": "⤚⤝⤍ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤", "to_trash": "ā¤•ā¤šā¤°ā¤ž", "toggle_settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ⤟āĨ‰ā¤—⤞ ⤕⤰āĨ‡ā¤‚", + "toggle_theme_description": "ā¤ĨāĨ€ā¤Ž ⤟āĨ‰ā¤—⤞ ⤕⤰āĨ‡ā¤‚", "total": "⤕āĨā¤˛", "total_usage": "⤕āĨā¤˛ ⤉ā¤Ē⤝āĨ‹ā¤—", "trash": "ā¤•ā¤šā¤°ā¤ž", @@ -2156,6 +2262,13 @@ "trash_page_select_assets_btn": "⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ⤝āĨ‹ā¤‚ ⤕āĨ‹ ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚", "trash_page_title": "ā¤•ā¤šā¤°ā¤ž ({count})", "trashed_items_will_be_permanently_deleted_after": "⤟āĨā¤°āĨˆā¤ļ ⤕ā¤ŋā¤ ā¤—ā¤ ā¤†ā¤‡ā¤Ÿā¤Ž {days, plural, one {# day} other {# days}} ⤕āĨ‡ ā¤Ŧā¤žā¤Ļ ⤏āĨā¤Ĩā¤žā¤¯āĨ€ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "trigger": "⤟āĨā¤°ā¤ŋ⤗⤰", + "trigger_asset_uploaded": "ā¤ā¤¸āĨ‡ā¤Ÿ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "trigger_asset_uploaded_description": "⤜ā¤Ŧ ā¤¨ā¤¯ā¤ž ā¤ā¤¸āĨ‡ā¤Ÿ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ, ⤤ā¤Ŧ ⤟āĨā¤°ā¤ŋ⤗⤰ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ", + "trigger_description": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤ļāĨā¤°āĨ‚ ⤕⤰⤍āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ⤕āĨā¤°ā¤ŋā¤¯ā¤ž", + "trigger_person_recognized": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤Ēā¤šā¤šā¤žā¤¨ā¤ž ā¤—ā¤¯ā¤ž", + "trigger_person_recognized_description": "⤜ā¤Ŧ ⤕ā¤ŋ⤏āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤¤ā¤ž ā¤šāĨˆ, ⤤ā¤Ŧ ⤟āĨā¤°ā¤ŋ⤗⤰ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ", + "trigger_type": "⤟āĨā¤°ā¤ŋ⤗⤰ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", "troubleshoot": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤“⤂ ā¤•ā¤ž ⤍ā¤ŋā¤ĩā¤žā¤°ā¤Ŗ", "type": "ā¤ĒāĨā¤°ā¤•ā¤žā¤°", "unable_to_change_pin_code": "ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤Ą ā¤Ŧā¤Ļ⤞⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", @@ -2163,13 +2276,14 @@ "unable_to_setup_pin_code": "ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤Ą ⤏āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", "unarchive": "⤏⤂⤗āĨā¤°ā¤š ⤏āĨ‡ ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", "unarchive_action_prompt": "{count} ⤆⤰āĨā¤•ā¤žā¤‡ā¤ĩ ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", - "unarchived_count": "{count, plural, other {Unarchived #}}", + "unarchived_count": "{count, plural, other {# ⤆⤰āĨā¤•ā¤žā¤‡ā¤ĩ ⤏āĨ‡ ā¤šā¤Ÿā¤žā¤ ā¤—ā¤}}", "undo": "ā¤ĒāĨ‚⤰āĨā¤ĩā¤ĩ⤤", "unfavorite": "ā¤¨ā¤žā¤Ē⤏⤂ā¤Ļ ⤕⤰āĨ‡ā¤‚", "unfavorite_action_prompt": "{count} ⤕āĨ‹ ā¤Ē⤏⤂ā¤ĻāĨ€ā¤Ļā¤ž ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "unhide_person": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ⤕āĨ‹ ā¤‰ā¤œā¤žā¤—ā¤° ⤕⤰āĨ‡ā¤‚", "unknown": "ā¤…ā¤œāĨā¤žā¤žā¤¤", "unknown_country": "ā¤…ā¤œāĨā¤žā¤žā¤¤ ā¤ĻāĨ‡ā¤ļ", + "unknown_date": "ā¤…ā¤œāĨā¤žā¤žā¤¤ ⤤ā¤ŋā¤Ĩā¤ŋ", "unknown_year": "ā¤…ā¤œāĨā¤žā¤žā¤¤ ā¤ĩ⤰āĨā¤ˇ", "unlimited": "⤅⤏āĨ€ā¤Žā¤ŋ⤤", "unlink_motion_video": "ā¤ŽāĨ‹ā¤ļ⤍ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ⤕āĨ‹ ⤅⤍⤞ā¤ŋ⤂⤕ ⤕⤰āĨ‡ā¤‚", @@ -2186,7 +2300,9 @@ "unstack": "⤏āĨā¤ŸāĨˆā¤• ⤰ā¤ĻāĨā¤Ļ ⤕⤰āĨ‡ā¤‚", "unstack_action_prompt": "{count} ⤅⤍⤏āĨā¤ŸāĨˆā¤•āĨā¤Ą", "unstacked_assets_count": "⤅⤍-⤏āĨā¤ŸāĨˆā¤•āĨā¤Ą {count, plural, one {# asset} other {# assets}}", + "unsupported_field_type": "ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋ⤤ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ĒāĨā¤°ā¤•ā¤žā¤°", "untagged": "⤟āĨˆā¤— ā¤¨ā¤šāĨ€ā¤‚ ⤕ā¤ŋā¤ ā¤—ā¤", + "untitled_workflow": "ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤•ā¤ž ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹", "up_next": "⤅ā¤Ŧ ā¤…ā¤—ā¤˛ā¤ž", "update_location_action_prompt": "{count} ⤚āĨā¤¨āĨ‡ ā¤—ā¤ ā¤ā¤¸āĨ‡ā¤Ÿ ⤕āĨ€ ⤞āĨ‹ā¤•āĨ‡ā¤ļ⤍ ⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚:", "updated_at": "⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", @@ -2196,6 +2312,7 @@ "upload_details": "ā¤ĩā¤ŋā¤ĩ⤰⤪ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", "upload_dialog_info": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ⤚āĨā¤¨āĨ‡ ā¤šāĨā¤ ā¤ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ž ⤏⤰āĨā¤ĩ⤰ ā¤Ē⤰ ā¤ŦāĨˆā¤•⤅ā¤Ē ⤞āĨ‡ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", "upload_dialog_title": "⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", + "upload_error_with_count": "{count, plural, one {# ā¤ā¤¸āĨ‡ā¤Ÿ} other {# ā¤ā¤¸āĨ‡ā¤Ÿ}} ⤅ā¤Ē⤞āĨ‹ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "upload_errors": "⤅ā¤Ē⤞āĨ‹ā¤Ą {count, plural, one {# error} other {# errors}} ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨ‚ā¤°ā¤ž ā¤šāĨā¤†, ā¤¨ā¤ ⤅ā¤Ē⤞āĨ‹ā¤Ą ā¤ā¤¸āĨ‡ā¤Ÿ ā¤ĻāĨ‡ā¤–⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨ‡ā¤œ ⤕āĨ‹ ⤰ā¤ŋā¤ĢāĨā¤°āĨ‡ā¤ļ ⤕⤰āĨ‡ā¤‚āĨ¤", "upload_finished": "⤅ā¤Ē⤞āĨ‹ā¤Ą ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤", "upload_progress": "ā¤ļāĨ‡ā¤ˇ {remaining, number} - ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋ⤤ {processed, number}/{total, number}", @@ -2231,6 +2348,7 @@ "utilities": "⤉ā¤Ē⤝āĨ‹ā¤—ā¤ŋā¤¤ā¤žā¤“ā¤‚", "validate": "ā¤Žā¤žā¤¨āĨā¤¯", "validate_endpoint_error": "⤕āĨā¤°āĨā¤Ēā¤¯ā¤ž ā¤Žā¤žā¤¨āĨā¤¯ ⤝āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚", + "validation_error": "ā¤Žā¤žā¤¨āĨā¤¯ā¤•⤰⤪ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž", "variables": "⤚⤰", "version": "⤏⤂⤏āĨā¤•⤰⤪", "version_announcement_closing": "⤆ā¤Ēā¤•ā¤ž ā¤Žā¤ŋ⤤āĨā¤°, ā¤ā¤˛āĨ‡ā¤•āĨā¤¸", @@ -2241,11 +2359,13 @@ "video_hover_setting": "ā¤šāĨ‹ā¤ĩ⤰ ā¤Ē⤰ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ā¤Ĩ⤂ā¤Ŧ⤍āĨ‡ā¤˛ ā¤šā¤˛ā¤žā¤ā¤‚", "video_hover_setting_description": "⤜ā¤Ŧ ā¤Žā¤žā¤‰ā¤¸ ā¤†ā¤‡ā¤Ÿā¤Ž ā¤Ē⤰ ⤘āĨ‚ā¤Ž ā¤°ā¤šā¤ž ā¤šāĨ‹ ⤤āĨ‹ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹ ā¤Ĩ⤂ā¤Ŧ⤍āĨ‡ā¤˛ ā¤šā¤˛ā¤žā¤ā¤‚āĨ¤", "videos": "ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹", - "videos_count": "{count, plural, one {# Video} other {# Videos}}", + "videos_count": "{count, plural, one {# ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹} other {# ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹}}", + "videos_only": "⤕āĨ‡ā¤ĩ⤞ ā¤ĩāĨ€ā¤Ąā¤ŋ⤝āĨ‹", "view": "ā¤ĻāĨ‡ā¤–ā¤¨ā¤ž", "view_album": "ā¤ā¤˛āĨā¤Ŧā¤Ž ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", "view_all": "⤏⤭āĨ€ ⤕āĨ‹ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", "view_all_users": "⤏⤭āĨ€ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤žā¤“⤂ ⤕āĨ‹ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view_asset_owners": "ā¤ā¤¸āĨ‡ā¤Ÿ ⤕āĨ‡ ā¤Žā¤žā¤˛ā¤ŋ⤕ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", "view_details": "ā¤ĩā¤ŋā¤ĩ⤰⤪ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", "view_in_timeline": "ā¤Ÿā¤žā¤‡ā¤Žā¤˛ā¤žā¤‡ā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", "view_link": "⤞ā¤ŋ⤂⤕ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", @@ -2261,18 +2381,36 @@ "viewer_stack_use_as_main_asset": "ā¤ŽāĨā¤–āĨā¤¯ ⤏⤂ā¤Ē⤤āĨā¤¤ā¤ŋ ⤕āĨ‡ ⤰āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚", "viewer_unstack": "⤏āĨā¤ŸāĨˆā¤• ⤰ā¤ĻāĨā¤Ļ ⤕⤰āĨ‡ā¤‚", "visibility_changed": "{count, plural, one {# person} other {# people}} ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĩā¤ŋ⤜ā¤ŧā¤ŋā¤Ŧā¤ŋ⤞ā¤ŋ⤟āĨ€ ā¤Ŧā¤Ļ⤞āĨ€ ā¤—ā¤ˆ", + "visual": "ā¤ĩā¤ŋāĨ›āĨ‚⤅⤞", + "visual_builder": "ā¤ĩā¤ŋāĨ›āĨ‚⤅⤞ ā¤Ŧā¤ŋ⤞āĨā¤Ąā¤°", "waiting": "ā¤‡ā¤‚ā¤¤ā¤œā¤ŧā¤žā¤° ā¤ŽāĨ‡ā¤‚", + "waiting_count": "ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ⤕⤰ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚: {count}", "warning": "⤚āĨ‡ā¤¤ā¤žā¤ĩ⤍āĨ€", "week": "⤏ā¤ĒāĨā¤¤ā¤žā¤š", "welcome": "⤏āĨā¤ĩā¤žā¤—ā¤¤", "welcome_to_immich": "Immich ā¤ŽāĨ‡ā¤‚ ⤆ā¤Ēā¤•ā¤ž ⤏āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ", + "width": "⤚āĨŒā¤Ąā¤ŧā¤žā¤ˆ", "wifi_name": "ā¤ĩā¤žā¤ˆ-ā¤Ģā¤žā¤ˆ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "workflow_delete_prompt": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ⤇⤏ ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ⤕āĨ‹ ā¤Žā¤ŋā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "workflow_deleted": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤Žā¤ŋā¤Ÿā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "workflow_description": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤ĩā¤ŋā¤ĩ⤰⤪", + "workflow_info": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "workflow_json": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ JSON", + "workflow_json_help": "JSON ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤ŽāĨ‡ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ⤕āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋ⤗⤰āĨ‡ā¤ļ⤍ ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚āĨ¤ ā¤Ŧā¤Ļā¤˛ā¤žā¤ĩ ā¤ĩā¤ŋ⤜ā¤ŧāĨā¤…⤞ ā¤Ŧā¤ŋ⤞āĨā¤Ąā¤° ā¤ŽāĨ‡ā¤‚ ⤏ā¤ŋ⤂⤕ ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "workflow_name": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤¨ā¤žā¤Ž", + "workflow_navigation_prompt": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤Ŧā¤ŋā¤¨ā¤ž ⤅ā¤Ē⤍āĨ‡ ā¤Ŧā¤Ļā¤˛ā¤žā¤ĩ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ ā¤¯ā¤šā¤žā¤ ⤏āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "workflow_summary": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤¸ā¤žā¤°ā¤žā¤‚ā¤ļ", + "workflow_update_success": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ⤏ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚⤰āĨā¤ĩ⤕ ⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "workflow_updated": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "workflows": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ā¤‚", + "workflows_help_text": "ā¤ĩ⤰āĨā¤•ā¤Ģā¤ŧāĨā¤˛āĨ‹ ⤆ā¤Ē⤕āĨ‡ ā¤ā¤¸āĨ‡ā¤Ÿ ⤕āĨ‡ ⤟āĨā¤°ā¤ŋ⤗⤰āĨ‹ā¤‚ ⤔⤰ ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤°āĨ‹ā¤‚ ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ⤕āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ⤕āĨ‹ ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤕⤰⤤āĨ‡ ā¤šāĨˆā¤‚", "wrong_pin_code": "⤗⤞⤤ ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤Ą", "year": "ā¤ĩ⤰āĨā¤ˇ", "years_ago": "{years, plural, one {# year} other {# years}} ā¤Ēā¤šā¤˛āĨ‡", "yes": "ā¤šā¤žā¤", "you_dont_have_any_shared_links": "⤆ā¤Ē⤕āĨ‡ ā¤Ēā¤žā¤¸ ⤕āĨ‹ā¤ˆ ā¤¸ā¤žā¤ā¤ž ⤞ā¤ŋ⤂⤕ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", "your_wifi_name": "⤆ā¤Ē⤕āĨ‡ ā¤ĩā¤žā¤ˆā¤Ģā¤žā¤ˆ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "zero_to_clear_rating": "ā¤ā¤¸āĨ‡ā¤Ÿ ⤰āĨ‡ā¤Ÿā¤ŋ⤂⤗ ⤰āĨ€ā¤¸āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ 0 ā¤Ļā¤Ŧā¤žā¤ā¤", "zoom_image": "⤛ā¤ĩā¤ŋ ⤜ā¤ŧāĨ‚ā¤Ž ⤕⤰āĨ‡ā¤‚", "zoom_to_bounds": "⤏āĨ€ā¤Žā¤ž ⤤⤕ āĨ›āĨ‚ā¤Ž ⤕⤰āĨ‡ā¤‚" } diff --git a/i18n/hr.json b/i18n/hr.json index 88fa57e230..3337235102 100644 --- a/i18n/hr.json +++ b/i18n/hr.json @@ -833,8 +833,6 @@ "deduplication_criteria_2": "Broj EXIF podataka", "deduplication_info": "Informacije o uklanjanju duplikata", "deduplication_info_description": "Za automatski odabir stavki i masovno uklanjanje duplikata, uzimamo u obzir:", - "default_locale": "Zadana lokalizacija", - "default_locale_description": "Oblikujte datume i brojeve na temelju jezika preglednika", "delete": "IzbriÅĄi", "delete_action_confirmation_message": "Jeste li sigurni da Åželite izbrisati ovu stavku? Ova radnja će premjestiti stavku u smeće posluÅžitelja i pitati vas Åželite li ju izbrisati lokalno", "delete_action_prompt": "{count} izbrisano", diff --git a/i18n/hu.json b/i18n/hu.json index c2f3362e18..2521d21922 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -12,15 +12,15 @@ "activity": "TevÊkenysÊg", "activity_changed": "A tevÊkenysÊg {enabled, select, true {bekapcsolva} other {kikapcsolva}}", "add": "HozzÃĄadÃĄs", - "add_a_description": "LeírÃĄs hozzÃĄadÃĄsa", + "add_a_description": "LeírÃĄs megadÃĄsa", "add_a_location": "Helyszín hozzÃĄadÃĄsa", "add_a_name": "NÊv megadÃĄsa", "add_a_title": "Cím megadÃĄsa", "add_action": "MÅąvelet hozzÃĄadÃĄsa", "add_action_description": "Kattints ide egy vÊgrehajtandÃŗ mÅąvelet hozzÃĄadÃĄsÃĄhoz", "add_assets": "Elemek hozzÃĄadÃĄsa", - "add_birthday": "SzÃŧletÊsnap hozzÃĄadÃĄsa", - "add_endpoint": "VÊgpont megadÃĄsa", + "add_birthday": "SzÃŧletÊsnap megadÃĄsa", + "add_endpoint": "VÊgpont hozzÃĄadÃĄsa", "add_exclusion_pattern": "KihagyÃĄsi minta (pattern) hozzÃĄadÃĄsa", "add_filter": "SzÅąrő hozzÃĄadÃĄsa", "add_filter_description": "Kattints ide egy szÅąrÊsi feltÊtel hozzÃĄadÃĄsÃĄhoz", @@ -311,7 +311,7 @@ "search_jobs": "Feladatok keresÊseâ€Ļ", "send_welcome_email": "ÜdvÃļzlő email kÃŧldÊse", "server_external_domain_settings": "KÃŧlső domain", - "server_external_domain_settings_description": "NyilvÃĄnosan megosztott linkek domainje (http(s)://-sel)", + "server_external_domain_settings_description": "KÃŧlső linkekhez haszÃĄlt domain", "server_public_users": "NyilvÃĄnos felhasznÃĄlÃŗk", "server_public_users_description": "Az Ãļsszes felhasznÃĄlÃŗ (nÊv Ês email) ki van írva, amikor egy felhasznÃĄlÃŗt adsz hozzÃĄ egy megosztott albumhoz. Amikor le van tiltva, a felhasznÃĄlÃŗlista csak adminok szÃĄmÃĄra lesz elÊrhető.", "server_settings": "Szerver beÃĄllítÃĄsok", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "TÃŗnuslekÊpezÊs (tone-mapping)", "transcoding_tone_mapping_description": "MegprÃŗbÃĄlja megőrizni a HDR videÃŗk kinÊzetÊt SDR-re valÃŗ konvertÃĄlÃĄs sorÃĄn. Minden algoritmus kÃŧlÃļnbÃļző mÃŗdon tesz kompromisszumot a színek, rÊszletek, Ês a fÊnyerő megőrzÊsÊben. A Hable inkÃĄbb a rÊszleteket őrzi meg, a Mobius a színeket, a Reinhard pedig a fÊnyerőt.", "transcoding_transcode_policy": "ÁtkÃŗdolÃĄsi szabÃĄlyzat", - "transcoding_transcode_policy_description": "VideÃŗ ÃĄtkÃŗdolÃĄsi szabÃĄlyzat . HDR videÃŗk mindig ÃĄtkÃŗdolÃĄsra kerÃŧlnek (kivÊve, ha az ÃĄtkÃŗdolÃĄs ki van kapcsolva).", + "transcoding_transcode_policy_description": "VideÃŗ ÃĄtkÃŗdolÃĄsi szabÃĄlyzat . HDR videÃŗk Ês YUV 4:2:0-tÃŗl eltÊrő pixelformÃĄtummal rendelkező videÃŗk mindig ÃĄtkÃŗdolÃĄsra kerÃŧlnek (kivÊve, ha az ÃĄtkÃŗdolÃĄs ki van kapcsolva).", "transcoding_two_pass_encoding": "ÁtkÃŗdolÃĄs kÊt menetben", "transcoding_two_pass_encoding_setting_description": "A kÊt menetben ÃĄtkÃŗdolt videÃŗk jobb minősÊgÅąek lesznek. Ha engedÊlyezve van a bitrÃĄta maximalizÃĄlÃĄsa (amely szÃŧksÊges a H.264 Ês a HEVC hasznÃĄlatakor), ez a funkciÃŗ figyelmen kívÃŧl hagyja a CRF-et. VP9 hasznÃĄlata esetÊn a CRF hasznÃĄlhatÃŗ, ha a bitrÃĄta nincs maximalizÃĄlva (azaz ki van kapcsolva).", "transcoding_video_codec": "VideÃŗ kodek", @@ -782,6 +782,8 @@ "client_cert_import": "ImportÃĄlÃĄs", "client_cert_import_success_msg": "Kliens tanÃēsítvÃĄny importÃĄlva", "client_cert_invalid_msg": "ÉrvÊnytelen tanÃēsítvÃĄny fÃĄjl vagy hibÃĄs jelszÃŗ", + "client_cert_password_message": "Add meg a tanÃēsítvÃĄny jelszavÃĄt", + "client_cert_password_title": "TanÃēsítvÃĄny jelszÃŗ", "client_cert_remove_msg": "Kliens tanÃēsítvÃĄny eltÃĄvolítva", "client_cert_subtitle": "Csak a PKCS12 (.p12, .pfx) formÃĄtum tÃĄmogatott. TanÃēsítvÃĄny importÃĄlÃĄsa/eltÃĄvolítÃĄsa csak a bejelentkezÊs előtt lehetsÊges", "client_cert_title": "SSL kliens tanÃēsítvÃĄny [KÍSÉRLETI]", @@ -792,6 +794,11 @@ "color": "Szín", "color_theme": "SzíntÊma", "command": "Parancs", + "command_palette_prompt": "Gyors keresÊs oldalak, mÅąveletek Ês parancsok kÃļzÃļtt", + "command_palette_to_close": "bezÃĄrÃĄs", + "command_palette_to_navigate": "BelÊpÊs", + "command_palette_to_select": "kivÃĄlaszt", + "command_palette_to_show_all": "Ãļsszes megjelenítÊse", "comment_deleted": "MegjegyzÊs tÃļrÃļlve", "comment_options": "MegjegyzÊs beÃĄllítÃĄsok", "comments_and_likes": "MegjegyzÊsek Ês reakciÃŗk", @@ -865,7 +872,7 @@ "current_server_address": "Jelenlegi szerver cím", "custom_date": "EgyÊni dÃĄtum", "custom_locale": "EgyÊni terÃŧleti beÃĄllítÃĄs", - "custom_locale_description": "DÃĄtumok Ês szÃĄmok formÃĄzÃĄsa a nyelv Ês terÃŧlet szerint", + "custom_locale_description": "DÃĄtumok, idők Ês szÃĄmok formÃĄzÃĄsa a kivÃĄlasztott nyelv Ês a terÃŧlet szerint", "custom_url": "EgyÊni URL", "cutoff_date_description": "FotÃŗk megtartÃĄsa az elmÃēltâ€Ļ", "cutoff_day": "{count, plural, one {nap} other {nap}}", @@ -888,8 +895,6 @@ "deduplication_criteria_2": "EXIF adatok mennyisÊge", "deduplication_info": "DeduplikÃĄciÃŗs infÃŗ", "deduplication_info_description": "Az automatikus elővÃĄlogatÃĄshoz Ês a duplikÃĄtumok tÃļmeges eltÃĄvolítÃĄsÃĄhoz a kÃļvetkezőket vizsgÃĄljuk:", - "default_locale": "AlapÊrtelmezett terÃŧleti beÃĄllítÃĄs", - "default_locale_description": "DÃĄtumok Ês szÃĄmok formÃĄzÃĄsa a bÃļngÊsződ terÃŧleti beÃĄllítÃĄsa alapjÃĄn", "delete": "TÃļrlÊs", "delete_action_confirmation_message": "Biztosan tÃļrÃļlni szeretnÊd ezt az elemet? Így az elem a szerver lomtÃĄrÃĄba kerÃŧl, Ês megkÊrdezi, hogy tÃļrÃļlni szeretnÊd-e a az eszkÃļzÃļn is", "delete_action_prompt": "{count} tÃļrÃļlve", @@ -995,8 +1000,15 @@ "editor_close_without_save_prompt": "A vÃĄltoztatÃĄsok nem lesznek elmentve", "editor_close_without_save_title": "Szerkesztő bezÃĄrÃĄsa?", "editor_confirm_reset_all_changes": "Biztosan vissza szeretnÊd ÃĄllítani az Ãļsszes mÃŗdosítÃĄst?", + "editor_discard_edits_confirm": "MÃŗdosítÃĄsok elvetÊse", + "editor_discard_edits_prompt": "A mÃŗdosítÃĄsokat nem mentetted. Biztos vagy benne, hogy mindet elveted?", + "editor_discard_edits_title": "Elveted a mÃŗdosítÃĄsokat?", + "editor_edits_applied_error": "Sikertelen mÃŗdosítÃĄs", + "editor_edits_applied_success": "Sikeres mÃŗdosítÃĄs", "editor_flip_horizontal": "Vízszintes tÃŧkrÃļzÊs", "editor_flip_vertical": "FÃŧggőleges tÃŧkrÃļzÊs", + "editor_handle_corner": "{corner, select, top_left {Bal fent} top_right {Jobb fent} bottom_left {Bal lent} bottom_right {Jobb lent} other {A}} corner handle", + "editor_handle_edge": "{edge, select, top {Fent} bottom {Lent} left {Bal} right {Jobb} other {An}} edge handle", "editor_orientation": "OrientÃĄciÃŗ", "editor_reset_all_changes": "MÃŗdosítÃĄsok visszaÃĄllítÃĄsa", "editor_rotate_left": "ForgatÃĄs balra 90°-kal", @@ -1062,6 +1074,7 @@ "failed_to_update_notification_status": "ÉrtesítÊs stÃĄtusz frissítÊse sikertelen", "incorrect_email_or_password": "Helytelen email vagy jelszÃŗ", "library_folder_already_exists": "Az import mappa elÊrÊsi Ãētja mÃĄr lÊtezik.", + "page_not_found": "Oldal nem talÃĄlhatÃŗ", "paths_validation_failed": "A(z) {paths, plural, one {# elÊrÊsi Ãētvonal} other {# elÊrÊsi Ãētvonal}} ÊrvÊnyesítÊse sikertelen", "profile_picture_transparent_pixels": "ProfilkÊpek nem tartalmazhatnak ÃĄtlÃĄtszÃŗ pixeleket. KÃļzelíts rÃĄ Ês/vagy mozgasd a kÊpet.", "quota_higher_than_disk_size": "Az elÊrhető lemezmÊretnÊl nagyobb kvÃŗtÃĄt ÃĄllítottÃĄl be", @@ -1161,6 +1174,7 @@ "exif_bottom_sheet_people": "EMBEREK", "exif_bottom_sheet_person_add_person": "Elnevez", "exit_slideshow": "KilÊpÊs a diavetítÊsből", + "expand": "Kinyit", "expand_all": "Összes kinyitÃĄsa", "experimental_settings_new_asset_list_subtitle": "FejlesztÊs alatt", "experimental_settings_new_asset_list_title": "KisÊrleti kÊprÃĄcs engedÊlyezÊse", @@ -1196,6 +1210,8 @@ "features_in_development": "Folyamatban lÊvő fejlesztÊsek", "features_setting_description": "Az alkalmazÃĄs jellemzőinek kezelÊse", "file_name_or_extension": "FÃĄjlnÊv vagy kiterjesztÊs", + "file_name_text": "FÃĄjl neve", + "file_name_with_value": "FÃĄjlnÊv:{file_name}", "file_size": "FÃĄjlmÊret", "filename": "FÃĄjlnÊv", "filetype": "FÃĄjltípus", @@ -1203,6 +1219,7 @@ "filter_description": "Az elemek szÅąrÊsi feltÊtelei", "filter_people": "SzemÊlyek szÅąrÊse", "filter_places": "Helyszínek szÅąrÊse", + "filter_tags": "címkÊk szÅąrÊse", "filters": "SzÅąrők", "find_them_fast": "NÊv alapjÃĄn keresÊssel gyorsan megtalÃĄlhatÃŗak", "first": "Első", @@ -1633,6 +1650,7 @@ "online": "Online (elÊrhető)", "only_favorites": "Csak kedvencek", "open": "Nyitva", + "open_calendar": "NaptÃĄr megnyitÃĄsa", "open_in_map_view": "MegnyitÃĄs tÊrkÊp nÊzetben", "open_in_openstreetmap": "MegnyitÃĄs OpenStreetMap-ben", "open_the_search_filters": "KeresÊsi szÅąrők megnyitÃĄsa", @@ -1770,7 +1788,7 @@ "purchase_individual_description_1": "Egy magÃĄnszemÊlynek", "purchase_individual_description_2": "TÃĄmogatÃŗ ÃĄllapot", "purchase_individual_title": "MagÃĄnszemÊly", - "purchase_input_suggestion": "Van egy termÊkkulcsod? Add meg a kulcsot alÃĄbb", + "purchase_input_suggestion": "Van mÃĄr termÊkkulcsod? Add meg itt", "purchase_license_subtitle": "Az Immich megvÃĄsÃĄrlÃĄsÃĄval tÃĄmogasd a szolgÃĄltatÃĄs folyamatos fejlesztÊsÊt", "purchase_lifetime_description": "Élettartamra szÃŗlÃŗ vÃĄsÃĄrlÃĄs", "purchase_option_title": "VÁSÁRLÁSI LEHETŐSÉGEK", @@ -1792,9 +1810,8 @@ "rate_asset": "Elem ÊrtÊkelÊse", "rating": "ÉrtÊkelÊs csillagokkal", "rating_clear": "ÉrtÊkelÊs tÃļrlÊse", - "rating_count": "{count, plural, one {# csillag} other {# csillag}}", + "rating_count": "{count, plural, =0 {Nem ÊrtÊkelt} one {# csillag} other {# csillag}}", "rating_description": "Exif ÊrtÊkelÊs megjelenítÊse az infÃŗpanelen", - "rating_set": "ÉrtÊkelÊs beÃĄllítva: {rating, plural, one {# csillag} other {# csillag}}", "reaction_options": "ReakciÃŗ lehetősÊgek", "read_changelog": "VÃĄltozÃĄsnaplÃŗ elolvasÃĄsa", "readonly_mode_disabled": "Csak olvashatÃŗ mÃŗd kikapcsolva", @@ -1866,7 +1883,10 @@ "reset_pin_code_success": "PIN kÃŗd sikeresen visszaÃĄllítva", "reset_pin_code_with_password": "A PIN kÃŗdod mindig visszaÃĄllíthatod a jelszavaddal", "reset_sqlite": "SQLite adatbÃĄzis visszaÃĄllítÃĄsa", - "reset_sqlite_confirmation": "Biztosan vissza szeretnÊd ÃĄllítani az SQLite adatbÃĄzist? Az adatok ÃējraszinkronizÃĄlÃĄsÃĄhoz ki kell jelentkezed, majd Ãējra be kell lÊpned", + "reset_sqlite_clear_app_data": "Adat kiÃŧrítÊs", + "reset_sqlite_confirmation": "Biztos benne, hogy tÃļrÃļlni szeretnÊ az alkalmazÃĄsadatokat? Ez tÃļrli az Ãļsszes beÃĄllítÃĄst, Ês kijelentkezteti Ãļnt.", + "reset_sqlite_confirmation_note": "MegjegyzÊs: A kiÃŧrítÊs utÃĄn Ãējra kell indítani az alkalmazÃĄst.", + "reset_sqlite_done": "Az alkalmazÃĄsadatokat tÃļrÃļltÃŧk. Indítsd Ãējra Immich-et Ês jelentkezz be Ãējra.", "reset_sqlite_success": "SQLite adatbÃĄzis sikeresen visszaÃĄllítva", "reset_to_default": "VisszaÃĄllítÃĄs alapÃĄllapotba", "resolution": "FelbontÃĄs", @@ -1894,6 +1914,7 @@ "saved_settings": "Elmentett beÃĄllítÃĄsok", "say_something": "SzÃŗlj hozzÃĄ", "scaffold_body_error_occurred": "Hiba tÃļrtÊnt", + "scaffold_body_error_unrecoverable": "Visszafordíthatatlan hiba tÃļrtÊnt. KÊrlek oszd meg a hiba Ês nyomkÃļvetÊs Ãŧzeneteket Discordon vagy a GitHubon, hogy segíthessÃŧnk. Ha szÃŧksÊges tÃļrÃļlheted az alkalmazÃĄs adatait alul.", "scan": "ÁtfÊsÃŧl", "scan_all_libraries": "Minden kÊptÃĄr ÃĄtfÊsÃŧlÊse", "scan_library": "BeolvasÃĄs", @@ -1929,6 +1950,7 @@ "search_filter_ocr": "KeresÊs szÃļvegfelismerÊssel (OCR)", "search_filter_people_title": "VÃĄlassz embereket", "search_filter_star_rating": "ÉrtÊkelÊs", + "search_filter_tags_title": "VÃĄlasszon címkÊket", "search_for": "KeresÊs", "search_for_existing_person": "MÃĄr meglÊvő szemÊly keresÊse", "search_no_more_result": "Nincs tÃļbb talÃĄlat", @@ -2008,6 +2030,9 @@ "set_profile_picture": "ProfilkÊp beÃĄllítÃĄsa", "set_slideshow_to_fullscreen": "DiavetítÊs teljes kÊpernyőre ÃĄllítÃĄsa", "set_stack_primary_asset": "BeÃĄllítÃĄs elsődleges elemkÊnt", + "setting_image_navigation_enable_subtitle": "Ha engedÊlyezett, akkor navigÃĄlhat az előző/kÃļvetkező kÊphez a kÊpernyő bal/jobb szÊllÊnek ÊrintÊsÊvel.", + "setting_image_navigation_enable_title": "Koppints a navigÃĄciÃŗhoz", + "setting_image_navigation_title": "KÊp navigÃĄciÃŗ", "setting_image_viewer_help": "Az Elem Megjelenítő előszÃļr a kis bÊlyegkÊpet tÃļlti be, aztÃĄn a kÃļzepes mÊretÅą előnÊzetet (ha elÊrhető), vÊgÃŧl az eredetit (ha elÊrhető).", "setting_image_viewer_original_subtitle": "EngedÊlyezi az eredeti teljes felbontÃĄsÃē kÊp betÃļltÊsÊt (nagy!). Kikapcsolva csÃļkkenti az adathasznÃĄlatot (a neten Ês az eszkÃļz gyorsítÃŗtÃĄrÃĄn is).", "setting_image_viewer_original_title": "Eredeti kÊp betÃļltÊse", @@ -2174,6 +2199,7 @@ "support": "TÃĄmogatÃĄs", "support_and_feedback": "TÃĄmogatÃĄs Ês visszajelzÊs", "support_third_party_description": "Az Immich telepítÊsedet egy harmadik fÊl csomagolta. Mivel elkÊpzelhető, hogy az esetlegesen felmerÃŧlő problÊmÃĄkat ez a csomag okozza, ezÊrt kÊrjÃŧk, előszÃļr velÃŧk kÃļzÃļld a problÊmÃĄkat az alÃĄbbi linkek segítsÊgÊvel.", + "supporter": "TÃĄmogatÃŗ", "swap_merge_direction": "EgyesítÊs irÃĄnyÃĄnak megfordítÃĄsa", "sync": "SzinkronizÃĄlÃĄs", "sync_albums": "Albumok szinkronizÃĄlÃĄsa", @@ -2187,7 +2213,7 @@ "tag_assets": "Elemek címkÊzÊse", "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 Ãēj címkÊt", + "tag_not_found_question": "Nem talÃĄlod a címkÊt? Hozz lÊtre egy Ãējat.", "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", @@ -2285,6 +2311,7 @@ "unstack_action_prompt": "{count} egymÃĄsra helyezÊs megszÃŧntetÊse", "unstacked_assets_count": "{count, plural, other {# elemből}} ÃĄllÃŗ csoport szÊtszedve", "unsupported_field_type": "Nem tÃĄmogatott mezőtípus", + "unsupported_file_type": "A fÃĄjl {file} nem feltÃļlthető mert a típusa {type} nem tÃĄmogatott.", "untagged": "Címke eltÃĄvolítva", "untitled_workflow": "NÊvtelen folyamat", "up_next": "KÃļvetkezik", @@ -2311,6 +2338,8 @@ "url": "URL", "usage": "HasznÃĄlat", "use_biometric": "Biometrikus azonosítÃĄs hasznÃĄlata", + "use_browser_locale": "BÃļngÊsző helyÊnek hasznÃĄlata", + "use_browser_locale_description": "DÃĄtumok, idők Ês szÃĄmok meghatÃĄrozÃĄsa a bÃļngÊsző helye alapjÃĄn", "use_current_connection": "Jelenlegi kapcsolat hasznÃĄlata", "use_custom_date_range": "Szabadon megadott időintervallum hasznÃĄlata", "user": "FelhasznÃĄlÃŗ", diff --git a/i18n/id.json b/i18n/id.json index acde13c7d8..cae842d1c6 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -2,22 +2,22 @@ "about": "Tentang", "account": "Akun", "account_settings": "Pengaturan Akun", - "acknowledge": "Mengerti", + "acknowledge": "Paham", "action": "Tindakan", "action_common_update": "Perbarui", - "action_description": "Tindakan yang perlu dijalankan pada aset yang terfilter", + "action_description": "Sekumpulan tindakan yang perlu dijalankan pada aset yang terfilter", "actions": "Tindakan", "active": "Aktif", "active_count": "Aktif: {count}", "activity": "Aktivitas", - "activity_changed": "Aktivitas {enabled, select, true {aktif} other {nonaktif}}", + "activity_changed": "Fitur Aktivitas sedang {enabled, select, true {aktif} other {nonaktif}}", "add": "Tambahkan", - "add_a_description": "Tambah keterangan", + "add_a_description": "Tambahkan keterangan", "add_a_location": "Tambahkan lokasi", "add_a_name": "Tambahkan nama", "add_a_title": "Tambahkan judul", "add_action": "Tambah tindakan", - "add_action_description": "Klik untuk menambahkan tindakan yang perlu dijalankan", + "add_action_description": "Klik untuk menambahkan tindakan untuk dijalankan", "add_assets": "Tambahkan aset", "add_birthday": "Tambahkan tanggal lahir", "add_endpoint": "Tambahkan titik akhir", @@ -35,86 +35,86 @@ "add_to_album_bottom_sheet_added": "Ditambahkan ke {album}", "add_to_album_bottom_sheet_already_exists": "Sudah ada di {album}", "add_to_album_bottom_sheet_some_local_assets": "Beberapa aset lokal tidak dapat ditambahkan ke album", - "add_to_album_toggle": "Masukkan ke {album} / Batalkan dari {album}", + "add_to_album_toggle": "Masukkan ke {album}/Batalkan dari {album}", "add_to_albums": "Tambahkan ke album", "add_to_albums_count": "Tambahkan ke album ({count})", "add_to_bottom_bar": "Tambahkan ke", - "add_to_shared_album": "Tambahkan ke album terbagi", + "add_to_shared_album": "Tambahkan ke album bersama", "add_upload_to_stack": "Tambahkan unggahan ke tumpukan", "add_url": "Tambahkan URL", "add_workflow_step": "Tambahkan langkah alur kerja", "added_to_archive": "Ditambahkan ke arsip", "added_to_favorites": "Ditambahkan ke favorit", - "added_to_favorites_count": "Ditambahkan {count, number} ke favorit", + "added_to_favorites_count": "{count, number} ditambahkan ke favorit", "admin": { - "add_exclusion_pattern_description": "Tambahkan pola pengecualian. Glob menggunakan *, **, dan ? didukung. Untuk mengabaikan semua berkas dalam direktori apa pun bernama \"Raw\", gunakan \"**/Raw/**\". Untuk mengabaikan semua berkas berakhiran dengan \".tif\", gunakan \"**/*.tif\". Untuk mengabaikan jalur absolut, gunakan \"/jalur/untuk/diabaikan/**\".", + "add_exclusion_pattern_description": "Tambahkan pola pengecualian. Glob menggunakan *, **, dan ? didukung. Untuk mengabaikan semua file dalam direktori apa pun yang bernama \"Raw\", gunakan \"**/Raw/**\". Untuk mengabaikan semua file berakhiran dengan \".tif\", gunakan \"**/*.tif\". Untuk mengabaikan jalur absolut, gunakan \"/jalur/untuk/diabaikan/**\".", "admin_user": "Pengguna Admin", - "asset_offline_description": "Aset pustaka eksternal ini tidak ada di diska dan telah dipindahkan ke tempat sampah. Jika berkasnya dipindah dalam pustaka, periksa lini masa Anda untuk aset baru yang cocok. Untuk memulihkan aset ini, pastikan jalur berkas di bawah dapat diakses oleh Immich dan pindai pustaka.", + "asset_offline_description": "Aset pustaka eksternal ini tidak ada di diska dan telah dipindahkan ke tempat sampah. Jika filenya telah dipindah ke dalam pustaka, periksa lini masa Anda untuk aset baru yang sesuai. Untuk memulihkan aset ini, pastikan jalur file di bawah dapat diakses oleh Immich dan pindai pustaka.", "authentication_settings": "Pengaturan Autentikasi", - "authentication_settings_description": "Kelola kata sandi, OAuth, dan pengaturan autentikasi lainnya", - "authentication_settings_disable_all": "Anda yakin untuk menonaktifkan semua cara login? Login akan dinonaktikan secara menyeluruh.", + "authentication_settings_description": "Kelola sandi, OAuth, dan pengaturan autentikasi lainnya", + "authentication_settings_disable_all": "Yakin ingin menonaktifkan semua cara untuk log masuk? Log masuk akan dinonaktikan secara menyeluruh.", "authentication_settings_reenable": "Untuk mengaktifkan ulang, gunakan Perintah Server.", "background_task_job": "Tugas Latar Belakang", "backup_database": "Buat Cadangan Basis Data", "backup_database_enable_description": "Aktifkan pencadangan basis data", "backup_keep_last_amount": "Jumlah cadangan untuk disimpan", "backup_onboarding_1_description": "Simpan salinan cadangan di awan atau di lokasi fisik terpisah.", - "backup_onboarding_2_description": "Salinan lokal diperangkat yang berbeda. Termasuk berkas utama dan cadangannya disimpan secara lokal.", - "backup_onboarding_3_description": "jumlah salinan data, termasuk berkas asli yang termasuk 1 salinan diluar dan 2 salinan lokal.", - "backup_onboarding_description": "Disarankan menggunakan metode pencadangan 3-2-1untuk melindungi data anda. Anda disarankan untuk menyimpan salinan foto/video serta basis data Immich untuk memastikan solusi pencadangan secara menyeluruh.", - "backup_onboarding_footer": "Untuk informasi lebih lanjut terkait pencadangan Immich, silahkan mengunjungi dokumentasi.", + "backup_onboarding_2_description": "Salinan lokal di perangkat yang berbeda. Termasuk file utama dan cadangannya disimpan secara lokal.", + "backup_onboarding_3_description": "Jumlah salinan data, termasuk file asli yang termasuk 1 salinan diluar dan 2 salinan lokal.", + "backup_onboarding_description": "Disarankan menggunakan metode pencadangan 3-2-1 untuk melindungi data. Anda disarankan untuk menyimpan salinan foto/video serta basis data Immich untuk memastikan solusi pencadangan secara menyeluruh.", + "backup_onboarding_footer": "Untuk informasi lebih lanjut terkait pencadangan Immich, kunjungi dokumentasi.", "backup_onboarding_parts_title": "Metode pencadangan 3-2-1 meliputi:", "backup_onboarding_title": "Cadangkan", "backup_settings": "Pengaturan Pencadangan Basis Data", "backup_settings_description": "Kelola pengaturan pencadangan basis data.", "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}?", - "confirm_delete_library_assets": "Apakah Anda yakin ingin menghapus pustaka ini? Ini akan menghapus {count, plural, one {# aset berisi} other {semua # aset berisi}} dari Immich dan tidak dapat diurungkan. Berkas akan tetap tersedia di diska.", + "config_set_by_file": "Konfigurasi saat ini ditetapkan oleh file konfigurasi", + "confirm_delete_library": "Yakin ingin menghapus pustaka {library}?", + "confirm_delete_library_assets": "Yakin ingin menghapus pustaka ini? Ini akan menghapus {count, plural, one {# aset} other {semua # aset}} yang ada di Immich dan tidak dapat diurungkan. File akan tetap tersedia di diska.", "confirm_email_below": "Untuk mengonfirmasi, ketik \"{email}\" di bawah", - "confirm_reprocess_all_faces": "Apakah Anda yakin ingin memproses semua wajah? Ini juga akan menghapus nama orang.", - "confirm_user_password_reset": "Apakah Anda yakin ingin mengatur ulang kata sandi {user}?", - "confirm_user_pin_code_reset": "Apakah Anda yakin ingin mereset kode PIN milik {user}?", + "confirm_reprocess_all_faces": "Yakin ingin memproses semua wajah? Ini juga akan menghapus nama orang.", + "confirm_user_password_reset": "Yakin ingin mengatur ulang sandi {user}?", + "confirm_user_pin_code_reset": "Yakin ingin mereset kode PIN milik {user}?", "copy_config_to_clipboard_description": "Salin konfigurasi sistem saat ini sebagai objek JSON ke papan klip", "create_job": "Buat tugas", "cron_expression": "Ekspresi cron", "cron_expression_description": "Tetapkan interval pemindaian menggunakan format cron. Untuk informasi lebih lanjut, silakan merujuk misalnya ke Crontab Guru", "cron_expression_presets": "Prasetel ekspresi cron", "disable_login": "Nonaktifkan log masuk", - "duplicate_detection_job_description": "Jalankan pembelajaran mesin pada aset untuk mendeteksi gambar yang serupa. Bergantung pada Pencarian Pintar", - "exclusion_pattern_description": "Pola pengecualian memungkinkan Anda mengabaikan berkas dan folder ketika memindai pustaka Anda. Ini berguna jika Anda memiliki folder yang berisi berkas yang tidak ingin diimpor, seperti berkas RAW.", - "export_config_as_json_description": "Unduh konfigurasi sistem saat ini sebagai berkas JSON", + "duplicate_detection_job_description": "Jalankan pembelajaran mesin pada aset untuk mendeteksi gambar yang serupa. Bergantung pada Pencarian Cerdas", + "exclusion_pattern_description": "Pola pengecualian dapat digunakan untuk mengabaikan file dan folder ketika memindai pustaka Anda. Ini berguna jika Anda memiliki folder yang berisi file yang tidak ingin diimpor, seperti file RAW.", + "export_config_as_json_description": "Unduh konfigurasi sistem saat ini sebagai file JSON", "external_libraries_page_description": "Halaman pustaka eksternal admin", "face_detection": "Deteksi wajah", - "face_detection_description": "Deteksikan wajah dalam aset menggunakan pembelajaran mesin. Untuk video, hanya gambar kecilnya yang disertakan. \"Segarkan\" memproses (ulang) semua aset. \"Segarkan\" juga menghapus data wajah terkini. \"Hilang\" mengantrekan aset yang belum diproses. Wajah yang dideteksi akan diantrekan untuk Pengenalan Wajah setelah Pendeteksian Wajah selesai, mengelompokkan mereka dalam orang yang sudah ada atau yang baru.", - "facial_recognition_job_description": "Kelompokkan wajah yang telah dideteksi menjadi orang. Langkah ini berjalan setelah Deteksi Wajah selesai. \"Segarkan\" mengelompokkan (ulang) semua wajah. \"Hilang\" mengantrekan wajah yang belum ditetapkan dengan seseorang.", + "face_detection_description": "Deteksi wajah dalam aset menggunakan pembelajaran mesin. Untuk video, hanya gambar kecilnya yang disertakan. Pilihan \"Segarkan\" akan memproses (ulang) semua aset. Pilihan \"Segarkan\" juga akan menghapus data wajah terkini. Pilihan \"Hilang\" akan mengantrekan aset yang belum diproses. Wajah yang dideteksi akan diantrekan untuk Pengenalan Wajah setelah Pendeteksian Wajah selesai, mengelompokkannya ke dalam orang yang sudah ada atau yang baru.", + "facial_recognition_job_description": "Kelompokkan wajah yang telah dideteksi ke dalam orang. Langkah ini berjalan setelah Deteksi Wajah selesai. Pilihan \"Segarkan\" akan mengelompokkan (ulang) semua wajah. Pilihan \"Hilang\" akan mengantrekan wajah yang belum ditetapkan dengan seseorang.", "failed_job_command": "Perintah {command} gagal untuk tugas: {job}", - "force_delete_user_warning": "PERINGATAN: Ini akan segera menghapus pengguna dan semua asetnya. Ini tidak dapat diurungkan dan semua berkasnya tidak dapat dipulihkan.", + "force_delete_user_warning": "PERINGATAN: Ini akan segera menghapus pengguna dan semua asetnya. Ini tidak dapat diurungkan dan semua filenya tidak dapat dipulihkan.", "image_format": "Format", - "image_format_description": "WebP menghasilkan ukuran berkas yang lebih kecil daripada JPEG, tetapi lebih lambat untuk dienkode.", + "image_format_description": "WebP menghasilkan ukuran file yang lebih kecil daripada JPEG, tetapi lebih lambat untuk dienkode.", "image_fullsize_description": "Gambar berukuran penuh tanpa metadata, digunakan ketika diperbesar", "image_fullsize_enabled": "Aktifkan pembuatan gambar berukuran penuh", - "image_fullsize_enabled_description": "Buat gambar berukuran penuh untuk format yang tidak ramah web. Ketika \"Utamakan pratinjau tersemat\" diaktifkan, pratinjau tersema digunakan secara langsung tanpa konversi. Tidak memengaruhi format ramah web seperti JPEG.", - "image_fullsize_quality_description": "Kualitas gambar berukuran penuh dari 1-100. Lebih tinggi lebih baik, tetapi menghasilkan berkas lebih besar.", + "image_fullsize_enabled_description": "Buat gambar berukuran penuh untuk format yang tidak ramah web. Ketika \"Utamakan pratinjau tersemat\" diaktifkan, pratinjau tersemat digunakan secara langsung tanpa konversi. Tidak memengaruhi format ramah web seperti JPEG.", + "image_fullsize_quality_description": "Nilai kualitas gambar berukuran penuh dari 1-100. Lebih tinggi lebih baik, tetapi menghasilkan file lebih besar.", "image_fullsize_title": "Pengaturan Gambar Berukuran Penuh", "image_prefer_embedded_preview": "Utamakan pratinjau tersemat", "image_prefer_embedded_preview_setting_description": "Gunakan pratinjau tersemat dalam foto RAW sebagai masukan dalam pemrosesan gambar dan ketika tersedia. Ini dapat menghasilkan warna yang lebih akurat untuk beberapa gambar, tetapi kualitas pratinjau bergantung pada kamera dan gambarnya dapat memiliki lebih banyak artefak kompresi.", "image_prefer_wide_gamut": "Utamakan gamut luas", - "image_prefer_wide_gamut_setting_description": "Gunakan Display P3 untuk gambar kecil. Ini menjaga kecerahan gambar dengan ruang warna yang luas, tetapi gambar dapat terlihat beda pada perangkat lawas dengan versi peramban yang lawas. Gambar sRGB tetap dalam sRGB untuk menghindari perubahan warna.", + "image_prefer_wide_gamut_setting_description": "Gunakan Display P3 untuk gambar kecil. Ini menjaga kecerahan gambar dengan ruang warna yang luas, tetapi gambar dapat terlihat berbeda pada perangkat lawas dengan versi peramban yang lawas. Gambar sRGB tetap dalam sRGB untuk menghindari perubahan warna.", "image_preview_description": "Gambar berukuran sedang tanpa metadata, digunakan ketika melihat aset satuan dan untuk pembelajaran mesin", - "image_preview_quality_description": "Kualitas pratinjau dari 1-100. Lebih tinggi lebih baik, tetapi menghasilkan berkas lebih besar dan respons aplikasi. Menetapkan nilai rendah dapat memengaruhi kualitas pembelajaran mesin.", + "image_preview_quality_description": "Kualitas pratinjau dari 1-100. Lebih tinggi lebih baik, tetapi menghasilkan file lebih besar dan mengurangi respons aplikasi. Menetapkan nilai rendah dapat memengaruhi kualitas pembelajaran mesin.", "image_preview_title": "Pengaturan Pratinjau", "image_progressive": "Progresif", - "image_progressive_description": "Enkode gambar-gambar JPEG secara progresif untuk memuat tampilan secara bertahap. Ini tidak berpengaruh pada gambar-gambar WebP.", + "image_progressive_description": "Enkode gambar JPEG secara progresif untuk memuat tampilan secara bertahap. Ini tidak berpengaruh pada gambar WebP.", "image_quality": "Kualitas", "image_resolution": "Resolusi", - "image_resolution_description": "Resolusi yang lebih tinggi dapat menyimpan lebih banyak detail tetapi memerlukan waktu yang lebih lama untuk di-enkode, memiliki ukuran berkas yang lebih besar, dan dapat mengurangi respons aplikasi.", + "image_resolution_description": "Resolusi yang lebih tinggi dapat menyimpan lebih banyak detail tetapi memerlukan waktu yang lebih lama untuk dienkode, memiliki ukuran file yang lebih besar, dan dapat mengurangi respons aplikasi.", "image_settings": "Pengaturan Gambar", "image_settings_description": "Kelola kualitas dan resolusi gambar yang dibuat", "image_thumbnail_description": "Gambar kecil tanpa metadata, digunakan ketika melihat kelompok foto seperti lini masa utama", - "image_thumbnail_quality_description": "Kualitas gambar kecil dari 1-100. Lebih tinggi lebih baik, tetapi menghasilkan berkas lebih besar dan dapat mengurangi respons aplikasi.", + "image_thumbnail_quality_description": "Nilai kualitas gambar kecil dari 1-100. Lebih tinggi lebih baik, tetapi menghasilkan file lebih besar dan dapat mengurangi respons aplikasi.", "image_thumbnail_title": "Pengaturan Gambar Kecil", - "import_config_from_json_description": "Impor konfigurasi sistem dengan mengunggah berkas konfigurasi JSON", + "import_config_from_json_description": "Impor konfigurasi sistem dengan mengunggah file konfigurasi JSON", "job_concurrency": "Konkurensi {job}", "job_created": "Tugas telah dibuat", "job_not_concurrency_safe": "Tugas ini tidak aman untuk konkurensi.", @@ -136,45 +136,45 @@ "library_settings_description": "Kelola pengaturan pustaka eksternal", "library_tasks_description": "Pindai pustaka eksternal untuk aset baru dan/atau berubah", "library_updated": "Pustaka yang diperbarui", - "library_watching_enable_description": "Pantau perubahan berkas dalam pustaka eksternal", + "library_watching_enable_description": "Pantau perubahan file dalam pustaka eksternal", "library_watching_settings": "Pemantauan pustaka [UJI COBA]", - "library_watching_settings_description": "Pantau berkas yang telah diubah secara otomatis", + "library_watching_settings_description": "Pantau file yang telah diubah secara otomatis", "logging_enable_description": "Aktifkan log", - "logging_level_description": "Ketika diaktifkan, tingkat log apa yang digunakan.", + "logging_level_description": "Ketika diaktifkan, tingkat log mana yang digunakan.", "logging_settings": "Penulisan log", "machine_learning_availability_checks": "Pemeriksaan ketersediaan", - "machine_learning_availability_checks_description": "Secara otomatis mendeteksi dan memprioritaskan server machine learning yang tersedia", + "machine_learning_availability_checks_description": "Secara otomatis mendeteksi dan memprioritaskan server pembelajaran mesin yang tersedia", "machine_learning_availability_checks_enabled": "Aktifkan pemeriksaan ketersediaan", "machine_learning_availability_checks_interval": "Interval pemeriksaan", "machine_learning_availability_checks_interval_description": "Interval dalam milidetik antar pemeriksaan ketersediaan", - "machine_learning_availability_checks_timeout": "Batas waktu permintaan", - "machine_learning_availability_checks_timeout_description": "Batas waktu dalam milidetik untuk pemeriksaan ketersediaan", + "machine_learning_availability_checks_timeout": "Tenggang waktu permintaan", + "machine_learning_availability_checks_timeout_description": "Tenggang waktu dalam milidetik untuk pemeriksaan ketersediaan", "machine_learning_clip_model": "Model CLIP", - "machine_learning_clip_model_description": "Nama model CLIP yang didaftarkan di sini. Anda harus menjalankan ulang tugas 'Pencarian Otomatis' untuk semua gambar ketika mengganti model.", + "machine_learning_clip_model_description": "Nama model CLIP yang didaftarkan di sini. Anda harus menjalankan ulang tugas 'Pencarian Cerdas' untuk semua gambar ketika mengganti model.", "machine_learning_duplicate_detection": "Deteksi Duplikat", "machine_learning_duplicate_detection_enabled": "Aktifkan deteksi duplikat", - "machine_learning_duplicate_detection_enabled_description": "Jika diaktifkan, aset yang mirip akan tetap dideduplikasikan.", + "machine_learning_duplicate_detection_enabled_description": "Jika dinonaktifkan, aset yang mirip masih akan tetap dideduplikasikan.", "machine_learning_duplicate_detection_setting_description": "Gunakan penyematan CLIP untuk mencari kemungkinan duplikat", "machine_learning_enabled": "Aktifkan pembelajaran mesin", "machine_learning_enabled_description": "Jika dinonaktifkan, semua fitur pembelajaran mesin akan dinonaktifkan terlepas dari pengaturan di bawah.", "machine_learning_facial_recognition": "Pengenalan Wajah", "machine_learning_facial_recognition_description": "Deteksi, kenali, dan kelompokkan wajah dalam gambar", "machine_learning_facial_recognition_model": "Model pengenalan wajah", - "machine_learning_facial_recognition_model_description": "Model didaftarkan berdasarkan urutan ukuran menurun. Model yang lebih besar lebih lambat dan menggunakan lebih banyak memori, tetapi akan menghasilkan dengan baik. Anda harus menjalankan ulang tugas Pengenalan Wajah untuk semua gambar setelah mengganti model.", + "machine_learning_facial_recognition_model_description": "Model dicantumkan berdasarkan urutan ukuran menurun. Model yang lebih besar akan lebih lambat dan menggunakan lebih banyak memori, tetapi akan menghasilkan dengan baik. Anda harus menjalankan ulang tugas Pengenalan Wajah untuk semua gambar setelah mengganti model.", "machine_learning_facial_recognition_setting": "Aktifkan pengenalan wajah", - "machine_learning_facial_recognition_setting_description": "Jika dinonaktifkan, gambar tidak akan dienkode untuk pengenalan wajah dan tidak akan mengisi bagian Orang dalam laman Jelajahi.", + "machine_learning_facial_recognition_setting_description": "Jika dinonaktifkan, gambar tidak akan dienkode untuk pengenalan wajah dan tidak akan mengisi bagian Orang dalam halaman Jelajahi.", "machine_learning_max_detection_distance": "Jarak deteksi maksimum", - "machine_learning_max_detection_distance_description": "Jarak maksimum antara dua gambar untuk dianggap sebagai duplikat, dari 0,001 sampai 0,1. Nilai lebih tinggi akan mendeteksi lebih banyak duplikat, tetapi dapat mengakibatkan positif palsu.", + "machine_learning_max_detection_distance_description": "Jarak maksimum antara dua gambar untuk dianggap sebagai duplikat, dari 0,001 hingga 0,1. Nilai lebih tinggi akan mendeteksi lebih banyak duplikat, tetapi dapat mengakibatkan positif palsu.", "machine_learning_max_recognition_distance": "Jarak pengenalan maksimum", - "machine_learning_max_recognition_distance_description": "Jarak maksimum antara dua wajah untuk dianggap sebagai orang yang sama, dari 0 sampai 2. Menurunkan ini dapat mencegah pelabelan dua orang sebagai orang yang sama, sedangkan meninggikan ini dapat mencegah pelabelan orang yang sama sebagai dua orang berbeda. Menggabungkan dua orang lebih mudah daripada memisahkan satu orang menjadi dua, jadi usahakan menetapkan ambang yang lebih rendah ketika memungkinkan.", + "machine_learning_max_recognition_distance_description": "Jarak maksimum antara dua wajah agar dianggap sebagai orang yang sama, bernilai dari 0 hingga 2. Menurunkan nilai ini dapat mencegah pelabelan dua orang sebagai orang yang sama, sedangkan menaikkannya dapat mencegah pelabelan orang yang sama sebagai dua orang berbeda. Menggabungkan dua orang lebih mudah daripada memisahkan satu orang menjadi dua, jadi usahakan menetapkan ambang yang lebih rendah ketika memungkinkan.", "machine_learning_min_detection_score": "Nilai deteksi minimum", "machine_learning_min_detection_score_description": "Nilai keyakinan minimum untuk sebuah wajah untuk dideteksi dari 0 sampai 1. Nilai yang lebih rendah akan mendeteksi lebih banyak wajah tetapi dapat mengakibatkan positif palsu.", "machine_learning_min_recognized_faces": "Wajah terkenal minimum", - "machine_learning_min_recognized_faces_description": "Jumlah minimum wajah yang dikenal untuk seseorang untuk dibuat. Meningkatkan ini membuat Pengenalan Wajah lebih tepat dengan kemungkinan bahwa sebuah wajah tidak dikaitkan dengan seseorang.", + "machine_learning_min_recognized_faces_description": "Jumlah minimum wajah yang dikenal untuk seseorang untuk dibuat. Menaikkan nilai ini membuat Pengenalan Wajah lebih tepat dengan kemungkinan bahwa sebuah wajah tidak dikaitkan dengan seseorang.", "machine_learning_ocr": "OCR", "machine_learning_ocr_description": "Gunakan pembelajaran mesin untuk mengenali teks di dalam gambar", "machine_learning_ocr_enabled": "Aktfikan OCR", - "machine_learning_ocr_enabled_description": "Jika dinonaktifkan, gambar-gambar tidak akan mengalami pengenalan teks.", + "machine_learning_ocr_enabled_description": "Jika dinonaktifkan, gambar tidak akan diproses untuk pengenalan teks.", "machine_learning_ocr_max_resolution": "Resolusi maksimum", "machine_learning_ocr_max_resolution_description": "Pratinjau di atas resolusi ini akan disesuaikan ukurannya sambil mempertahankan aspek rasio. Nilai yang lebih tinggi lebih akurat, tetapi membutuhkan waktu yang lama untuk memproses dan membutuhkan memori lebih banyak.", "machine_learning_ocr_min_detection_score": "Skor deteksi minimum", @@ -182,28 +182,28 @@ "machine_learning_ocr_min_recognition_score": "Skor pengenalan minimum", "machine_learning_ocr_min_score_recognition_description": "Skor kepercayaan minimum untuk teks yang akan dideteksi berkisar antara 0-1. Nilai yang lebih rendah akan mendeteksi teks yang lebih banyak, tetapi dapat menyebabkan hasil yang positif palsu.", "machine_learning_ocr_model": "Model OCR", - "machine_learning_ocr_model_description": "Model server lebih akurat daripada model mobile, tetapi membutuhkan waktu yang lebih lama untuk memproses dan menggunakan memori yang lebih banyak.", - "machine_learning_settings": "Pengaturan Mesin Pembelajaran", - "machine_learning_settings_description": "Kelola fitur dan pengaturan mesin pembelajaran", - "machine_learning_smart_search": "Pencarian Pintar", + "machine_learning_ocr_model_description": "Model server lebih akurat daripada model seluler, tetapi membutuhkan waktu yang lebih lama untuk memproses dan menggunakan memori yang lebih banyak.", + "machine_learning_settings": "Pengaturan Pembelajaran Mesin", + "machine_learning_settings_description": "Kelola fitur dan pengaturan pembelajaran mesin", + "machine_learning_smart_search": "Pencarian Cerdas", "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_smart_search_enabled": "Aktifkan pencarian cerdas", + "machine_learning_smart_search_enabled_description": "Jika dinonaktifkan, gambar tidak akan dienkode untuk pencarian cerdas.", + "machine_learning_url_description": "URL server pembelajaran mesin. Jika lebih dari satu URL disediakan, setiap server akan dicoba satu per satu hingga salah satu berhasil merespons, dari urutan pertama sampai terakhir. Server yang tidak merespons akan diabaikan sementara hingga kembali online.", "maintenance_delete_backup": "Hapus Cadangan", "maintenance_delete_backup_description": "File ini akan dihapus secara permanen.", "maintenance_delete_error": "Gagal menghapus cadangan.", - "maintenance_restore_backup": "Mengembalikan Cadangan", - "maintenance_restore_backup_description": "Immich akan dihapus dan dikembalikan dari candangan yang dipilih. Sebuah candangan akan dibuat sebelum dilanjutkan.", + "maintenance_restore_backup": "Memulihkan Cadangan", + "maintenance_restore_backup_description": "Immich akan dihapus dan dipulihkan dari cadangan yang dipilih. Sebuah cadangan akan dibuat sebelum dilanjutkan.", "maintenance_restore_backup_different_version": "Cadangan ini dibuat dengan versi Immich yang berbeda!", - "maintenance_restore_backup_unknown_version": "Tidak dapat menentukan versi candangan.", - "maintenance_restore_database_backup": "Mengembalikan cadangan database", - "maintenance_restore_database_backup_description": "Kembalikan ke status basis data yang lebih awal menggunakan berkas cadangan", + "maintenance_restore_backup_unknown_version": "Tidak dapat menentukan versi cadangan.", + "maintenance_restore_database_backup": "Pulihkan cadangan basis data", + "maintenance_restore_database_backup_description": "Kembalikan ke status basis data yang lebih awal menggunakan file cadangan", "maintenance_settings": "Pemeliharaan", "maintenance_settings_description": "Setel mode pemeliharaan Immich.", - "maintenance_start": "Pindah ke mode pemeliharaan", + "maintenance_start": "Alihkan ke mode pemeliharaan", "maintenance_start_error": "Gagal memulai mode pemeliharaan.", - "maintenance_upload_backup": "Unggah berkas cadangan basis data", + "maintenance_upload_backup": "Unggah file cadangan basis data", "maintenance_upload_backup_error": "Tidak dapat mengunggah cadangan, apakah ini sebuah file .sql/.sql.gz?", "manage_concurrency": "Kelola Konkurensi", "manage_concurrency_description": "Pindah ke halaman tugas untuk mengelola konkurensi tugas", @@ -212,21 +212,21 @@ "map_enable_description": "Aktifkan fitur peta", "map_gps_settings": "Pengaturan Peta & GPS", "map_gps_settings_description": "Kelola Pengaturan Peta & GPS (Pengodean Geografis Terbalik)", - "map_implications": "Fitur peta mengandalkan layanan tile eksternal", + "map_implications": "Fitur peta mengandalkan layanan ubin peta eksternal", "map_light_style": "Gaya terang", - "map_manage_reverse_geocoding_settings": "Kelola settingan Pengodean Geografis Terbalik", + "map_manage_reverse_geocoding_settings": "Kelola pengaturan Pengodean Geografis Terbalik", "map_reverse_geocoding": "Pengodean Geografis Terbalik", "map_reverse_geocoding_enable_description": "Aktifkan pengodean geografis terbalik", "map_reverse_geocoding_settings": "Pengaturan Pengodean Geografis Terbalik", "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", + "memory_cleanup_job": "Pembersihan kenangan", + "memory_generate_job": "Pembuatan kenangan", "metadata_extraction_job": "Ekstrak metadata", - "metadata_extraction_job_description": "Ekstrak informasi metadata dari setiap aset, seperti GPS, wajah dan resolusi", + "metadata_extraction_job_description": "Ekstrak informasi metadata dari setiap aset, seperti GPS, wajah, dan resolusi", "metadata_faces_import_setting": "Aktifkan impor wajah", - "metadata_faces_import_setting_description": "Impor wajah dari data gambar EXIF dan berkas sidecar", + "metadata_faces_import_setting_description": "Impor wajah dari data gambar EXIF dan file sespan", "metadata_settings": "Pengaturan Metadata", "metadata_settings_description": "Kelola pengaturan metadata", "migration_job": "Migrasi", @@ -234,130 +234,130 @@ "nightly_tasks_cluster_faces_setting_description": "Mulai pengenalan wajah pada semua wajah yang baru saja terdeteksi", "nightly_tasks_cluster_new_faces_setting": "Kelompokkan semua wajah baru", "nightly_tasks_database_cleanup_setting": "Tugas pembersihan basis data", - "nightly_tasks_database_cleanup_setting_description": "Membersihkan data lama, kadaluarsa dari database", - "nightly_tasks_generate_memories_setting": "Buat kenang-kenangan", - "nightly_tasks_generate_memories_setting_description": "Buat kenang-kenangan baru dari berbagai aset", - "nightly_tasks_missing_thumbnails_setting": "Membuat thumbnail yang hilang", - "nightly_tasks_missing_thumbnails_setting_description": "Mengantrikan aset tanpa thumbnail untuk pembuatan thumbnail", + "nightly_tasks_database_cleanup_setting_description": "Membersihkan data lama yang kedaluwarsa dari basis data", + "nightly_tasks_generate_memories_setting": "Buat kenangan", + "nightly_tasks_generate_memories_setting_description": "Buat kenangan baru dari aset", + "nightly_tasks_missing_thumbnails_setting": "Membuat gambar kecil yang hilang", + "nightly_tasks_missing_thumbnails_setting_description": "Mengantrekan aset tanpa gambar kecil untuk proses pembuatan gambar kecil", "nightly_tasks_settings": "Pengaturan Tugas Malam", "nightly_tasks_settings_description": "Atur tugas malam", "nightly_tasks_start_time_setting": "Waktu mulai", "nightly_tasks_start_time_setting_description": "Waktu saat server mulai menjalankan tugas malam", "nightly_tasks_sync_quota_usage_setting": "Sinkronisasi penggunaan kuota", - "nightly_tasks_sync_quota_usage_setting_description": "Pembaruan kuota penyimpanan pengguna, berdasarkan penggunaan sekarang", + "nightly_tasks_sync_quota_usage_setting_description": "Perbarui kuota penyimpanan pengguna, berdasarkan penggunaan sekarang", "no_paths_added": "Tidak ada jalur yang ditambahkan", "no_pattern_added": "Tidak ada pola yang ditambahkan", "note_apply_storage_label_previous_assets": "Catatan: Untuk menerapkan Label Penyimpanan untuk aset yang telah diunggah sebelumnya, jalankan", "note_cannot_be_changed_later": "CATATAN: Ini tidak akan dapat diubah lagi!", "notification_email_from_address": "Dari alamat", - "notification_email_from_address_description": "Alamat surel pengirim, misalnya: \"Server Foto Immich \". Pastikan untuk menggunakan alamat yang diizinkan untuk mengirim email.", - "notification_email_host_description": "Hos server surel (mis. smtp.immich.app)", - "notification_email_ignore_certificate_errors": "Abaikan eror sertifikat", - "notification_email_ignore_certificate_errors_description": "Abaikan eror validasi sertifikat TLS (tidak disarankan)", - "notification_email_password_description": "Kata sandi yang digunakan ketika mengautentikasi dengan server surel", - "notification_email_port_description": "Porta server surel (mis. 25, 465, atau 587)", + "notification_email_from_address_description": "Alamat email pengirim, misalnya: \"Server Foto Immich \". Pastikan untuk menggunakan alamat yang diizinkan untuk mengirim email.", + "notification_email_host_description": "Host server email (mis. smtp.immich.app)", + "notification_email_ignore_certificate_errors": "Abaikan kesalahan sertifikat", + "notification_email_ignore_certificate_errors_description": "Abaikan kesalahan validasi sertifikat TLS (tidak disarankan)", + "notification_email_password_description": "Sandi yang digunakan ketika mengautentikasi dengan server email", + "notification_email_port_description": "Port server email (mis. 25, 465, atau 587)", "notification_email_secure": "SMTPS", "notification_email_secure_description": "Gunakan SMTPS (SMTP melalui TLS)", - "notification_email_sent_test_email_button": "Kirim surel uji coba dan simpan", - "notification_email_setting_description": "Pengaturan pengiriman notifikasi surel", - "notification_email_test_email": "Kirim surel uji coba", - "notification_email_test_email_failed": "Gagal mengirim surel uji coba, periksa kembali nilai Anda", - "notification_email_test_email_sent": "Surel uji coba telah dikirim ke {email}. Silakan periksa kotak masuk Anda.", - "notification_email_username_description": "Nama pengguna yang digunakan ketika mengautentikasi ke server surel", - "notification_enable_email_notifications": "Aktifkan notifikasi surel", + "notification_email_sent_test_email_button": "Kirim email uji coba dan simpan", + "notification_email_setting_description": "Pengaturan pengiriman notifikasi email", + "notification_email_test_email": "Kirim email uji coba", + "notification_email_test_email_failed": "Gagal mengirim email uji coba, periksa kembali nilai pengaturannya", + "notification_email_test_email_sent": "Email uji coba telah dikirim ke {email}. Silakan periksa kotak masuk Anda.", + "notification_email_username_description": "Nama pengguna yang digunakan ketika mengautentikasi ke server email", + "notification_enable_email_notifications": "Aktifkan notifikasi email", "notification_settings": "Pengaturan Notifikasi", - "notification_settings_description": "Kelola pengaturan notifikasi, termasuk surel", + "notification_settings_description": "Kelola pengaturan notifikasi, termasuk email", "oauth_auto_launch": "Peluncuran otomatis", - "oauth_auto_launch_description": "Mulai alur log masuk OAuth secara otomatis setelah menuju ke laman log masuk", + "oauth_auto_launch_description": "Mulai alur log masuk OAuth secara otomatis setelah menuju ke halaman log masuk", "oauth_auto_register": "Pendaftaran otomatis", - "oauth_auto_register_description": "Daftar pengguna baru secara otomatis setelah log masuk dengan OAuth", + "oauth_auto_register_description": "Daftarkan pengguna baru secara otomatis setelah log masuk dengan OAuth", "oauth_button_text": "Teks tombol", "oauth_client_secret_description": "Diperlukan untuk klien yang konfidensial, atau jika PKCE (Proof Key for Code Exchange) tidak didukung untuk klien umum.", "oauth_enable_description": "Log masuk dengan OAuth", "oauth_mobile_redirect_uri": "URI pengalihan ponsel", "oauth_mobile_redirect_uri_override": "Penimpaan URI penerusan ponsel", - "oauth_mobile_redirect_uri_override_description": "Aktifkan ketika provider OAuth tidak mengizinkan tautan mobile, seperti ''{callback}''", + "oauth_mobile_redirect_uri_override_description": "Aktifkan ketika penyedia OAuth tidak mengizinkan tautan ponsel, seperti ''{callback}''", "oauth_role_claim": "Klaim Peran", "oauth_role_claim_description": "Secara otomatis memberikan akses admin berdasarkan keberadaan klaim ini. Klaim dapat berupa \"user\" atau \"admin\".", "oauth_settings": "OAuth", "oauth_settings_description": "Kelola pengaturan log masuk OAuth", - "oauth_settings_more_details": "Untuk detail lanjut tentang fitur ini, lihat docs.", + "oauth_settings_more_details": "Untuk detail lanjut tentang fitur ini, lihat dokumentasi.", "oauth_storage_label_claim": "Klaim label penyimpanan", "oauth_storage_label_claim_description": "Atur label penyimpanan pengguna menjadi nilai klaim ini secara otomatis.", "oauth_storage_quota_claim": "Klaim kuota penyimpanan", "oauth_storage_quota_claim_description": "Atur kuota penyimpanan pengguna menjadi nilai klaim ini secara otomatis.", "oauth_storage_quota_default": "Kuota penyimpanan bawaan (GiB)", "oauth_storage_quota_default_description": "Kuota dalam GiB akan digunakan jika tidak ada klaim yang diberikan.", - "oauth_timeout": "Waktu Permintaan Habis", - "oauth_timeout_description": "Waktu habis untuk permintaan dalam milidetik", - "ocr_job_description": "Gunakan mesin pembelajaran untuk mengenali teks di dalam gambar", - "password_enable_description": "Masuk dengan surel dan kata sandi", - "password_settings": "Log Masuk Kata Sandi", - "password_settings_description": "Kelola pengaturan log masuk kata sandi", + "oauth_timeout": "Tenggang Waktu Permintaan", + "oauth_timeout_description": "Tenggang waktu untuk permintaan dalam milidetik", + "ocr_job_description": "Gunakan pembelajaran mesin untuk mengenali teks di dalam gambar", + "password_enable_description": "Masuk dengan email dan sandi", + "password_settings": "Masuk dengan Sandi", + "password_settings_description": "Kelola pengaturan log masuk dengan sandi", "paths_validated_successfully": "Semua jalur berhasil divalidasi", - "person_cleanup_job": "Pembersihan data pribadi", - "queue_details": "Detail Antrian", - "queues": "Antrian Tugas", - "queues_page_description": "Halaman antrian tugas Admin", + "person_cleanup_job": "Pembersihan orang", + "queue_details": "Detail Antrean", + "queues": "Antrean Tugas", + "queues_page_description": "Halaman antrean tugas admin", "quota_size_gib": "Ukuran Kuota (GiB)", "refreshing_all_libraries": "Menyegarkan semua pustaka", "registration": "Pendaftaran Admin", - "registration_description": "Karena Anda merupakan pengguna pertama dalam sistem, Anda akan ditetapkan sebagai Admin dan bertanggung jawab atas tugas administratif dan pengguna tambahan akan dibuat oleh Anda.", - "remove_failed_jobs": "Hapus tugas-tugas gagal", - "require_password_change_on_login": "Memerlukan pengguna untuk mengubah kata sandi pada log masuk pertama", + "registration_description": "Karena Anda merupakan pengguna pertama dalam sistem, Anda akan ditetapkan sebagai Admin, yang bertanggung jawab atas tugas administratif dan membuat pengguna baru lainnya.", + "remove_failed_jobs": "Hapus tugas gagal", + "require_password_change_on_login": "Wajibkan pengguna untuk mengubah sandi pada saat log masuk pertama", "reset_settings_to_default": "Atur ulang pengaturan ke bawaan", "reset_settings_to_recent_saved": "Atur ulang pengaturan ke pengaturan tersimpan terkini", "scanning_library": "Memindai pustaka", "search_jobs": "Mencari tugasâ€Ļ", - "send_welcome_email": "Kirim surel selamat datang", + "send_welcome_email": "Kirim email selamat datang", "server_external_domain_settings": "Domain eksternal", - "server_external_domain_settings_description": "Domain untuk tautan terbagi publik, termasuk http(s)://", + "server_external_domain_settings_description": "Domain yang digunakan untuk tautan eksternal", "server_public_users": "Pengguna Publik", - "server_public_users_description": "Semua pengguna (nama dan email) didaftarkan ketika menambahkan pengguna ke album terbagi. Ketika dinonaktifkan, daftar pengguna hanya akan tersedia kepada pengguna admin.", + "server_public_users_description": "Semua pengguna (nama dan email) didaftarkan ketika menambahkan pengguna ke album bersama. Ketika dinonaktifkan, daftar pengguna hanya akan tersedia kepada pengguna admin.", "server_settings": "Pengaturan Server", "server_settings_description": "Kelola pengaturan server", - "server_stats_page_description": "Halaman statistik server Admin", + "server_stats_page_description": "Halaman statistik server admin", "server_welcome_message": "Pesan selamat datang", - "server_welcome_message_description": "Pesan yang ditampilkan di laman log masuk.", - "settings_page_description": "Laman pengaturan admin", + "server_welcome_message_description": "Pesan yang ditampilkan di halaman log masuk.", + "settings_page_description": "Halaman pengaturan admin", "sidecar_job": "Metadata sespan", - "sidecar_job_description": "Jelajahi atau sinkronisasikan metadata sespan dari sistem berkas", + "sidecar_job_description": "Jelajahi atau sinkronisasikan metadata sespan dari sistem file", "slideshow_duration_description": "Jumlah detik untuk menampilkan setiap gambar", - "smart_search_job_description": "Jalankan pembelajaran mesin pada aset untuk mendukung pencarian pintar", + "smart_search_job_description": "Jalankan pembelajaran mesin pada aset untuk mendukung pencarian cerdas", "storage_template_date_time_description": "Waktu pembuatan aset digunakan sebagai informasi waktu dan tanggal", "storage_template_date_time_sample": "Waktu sampel {date}", "storage_template_enable_description": "Aktifkan mesin templat penyimpanan", "storage_template_hash_verification_enabled": "Verifikasi hash diaktifkan", - "storage_template_hash_verification_enabled_description": "Mengaktifkan verifikasi hash, jangan mengaktifkan ini kecuali Anda sudah tahu kekurangannya", + "storage_template_hash_verification_enabled_description": "Mengaktifkan verifikasi hash, jangan menonaktifkan ini kecuali Anda paham dampaknya", "storage_template_migration": "Migrasi templat penyimpanan", - "storage_template_migration_description": "Tetapkan {template} saat ini pada aset yang sebelumnya diunggah", + "storage_template_migration_description": "Terapkan {template} 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 {job}.", "storage_template_migration_job": "Tugas Migrasi Templat Ruang Penyimpanan", - "storage_template_more_details": "Untuk detail lebih lanjut tentang fitur ini, pergi ke Templat Penyimpanan dan kekurangannya", - "storage_template_onboarding_description_v2": "Saat diaktifkan, fitur ini akan mengatur file secara otomatis berdasarkan templat yang ditentukan pengguna. Untuk informasi selengkapnya, silakan lihat dokumentasi.", - "storage_template_path_length": "Batas panjang jalur: {length, number}{limit, number}", + "storage_template_more_details": "Untuk detail lebih lanjut tentang fitur ini, kunjungi Templat Penyimpanan beserta dampaknya", + "storage_template_onboarding_description_v2": "Saat diaktifkan, fitur ini akan mengatur file secara otomatis berdasarkan templat yang ditentukan pengguna. Untuk informasi selengkapnya, lihat dokumentasi.", + "storage_template_path_length": "Perkiraan batas maksimal panjang jalur: {length, number}/{limit, number}", "storage_template_settings": "Templat Penyimpanan", - "storage_template_settings_description": "Kelola struktur folder dan nama berkas dari aset yang diunggah", + "storage_template_settings_description": "Kelola struktur folder dan nama file dari aset yang diunggah", "storage_template_user_label": "{label} adalah Label Penyimpanan pengguna", "system_settings": "Pengaturan Sistem", "tag_cleanup_job": "Pembersihan tag", - "template_email_available_tags": "Anda dapat menggunakan variabel berikut dalam templat Anda: {tags}", - "template_email_if_empty": "Jika templat kosong, surel bawaan akan digunakan.", + "template_email_available_tags": "Variabel berikut dapat digunakan dalam templat Anda: {tags}", + "template_email_if_empty": "Jika templat kosong, email bawaan akan digunakan.", "template_email_invite_album": "Templat Undangan Album", "template_email_preview": "Pratinjau", - "template_email_settings": "Templat Surel", + "template_email_settings": "Templat Email", "template_email_update_album": "Perbarui Templat Album", - "template_email_welcome": "Templat surel selamat datang", + "template_email_welcome": "Templat email selamat datang", "template_settings": "Templat Notifikasi", - "template_settings_description": "Kelola templat kustom untuk notifikasi", - "theme_custom_css_settings": "CSS Kustom", - "theme_custom_css_settings_description": "CSS memungkinkan desain Immich untuk diubah.", + "template_settings_description": "Kelola templat khusus untuk notifikasi", + "theme_custom_css_settings": "CSS Khusus", + "theme_custom_css_settings_description": "CSS dapat digunakan untuk menyesuaikan desain Immich.", "theme_settings": "Pengaturan Tema", "theme_settings_description": "Kelola kustomisasi antarmuka web Immich", "thumbnail_generation_job": "Buat Gambar Kecil", - "thumbnail_generation_job_description": "Buat aset besar, kecil, dan buram untuk setiap aset, termasuk gambar kecil untuk setiap orang", + "thumbnail_generation_job_description": "Buat gambar kecil dalam jenis besar, kecil, dan buram untuk setiap aset, termasuk gambar kecil untuk setiap orang", "transcoding_acceleration_api": "API Akselerasi", - "transcoding_acceleration_api_description": "API yang akan berinteraksi dengan perangkat Anda untuk mengakselerasi transkode. Pengaturan ini merupakan 'upaya terbaik': ini akan menggunakan transkode perangkat lunak jika gagal.", + "transcoding_acceleration_api_description": "API yang akan berinteraksi dengan perangkat Anda untuk mengakselerasi transkode. Pengaturan ini bersifat 'upaya terbaik': ini akan menggunakan transkode perangkat lunak jika gagal.", "transcoding_acceleration_nvenc": "NVENC (memerlukan GPU NVIDIA)", "transcoding_acceleration_qsv": "Quick Sync (memerlukan CPU Intel generasi ke-7 atau lebih baru)", "transcoding_acceleration_rkmpp": "RKMPP (hanya pada SOC Rockchip)", @@ -374,36 +374,36 @@ "transcoding_bitrate_description": "Video yang lebih tinggi dari kecepatan bit maksimum atau tidak dalam format yang diterima", "transcoding_codecs_learn_more": "Untuk mempelajari lebih lanjut tentang istilah yang digunakan, baca dokumentasi FFmpeg untuk kodek H.264, kodek HEVC, dan kodek VP9.", "transcoding_constant_quality_mode": "Mode kualitas konstan", - "transcoding_constant_quality_mode_description": "ICQ lebih baik daripada CQP, tetapi beberapa perangkat akselerasi tidak mendukung mode ini. Mengatur opsi ini akan lebih menyukai mode yang ditentukan ketika menggunakan pengodean berbasis kualitas. Diabaikan oleh NVENC karena tidak mendukung ICQ.", + "transcoding_constant_quality_mode_description": "ICQ lebih baik daripada CQP, tetapi beberapa perangkat akselerasi tidak mendukung mode ini. Mengatur opsi ini akan lebih memilih mode yang ditentukan ketika menggunakan pengodean berbasis kualitas. Diabaikan oleh NVENC karena tidak mendukung ICQ.", "transcoding_constant_rate_factor": "Faktor kecepatan konstan (-crf)", - "transcoding_constant_rate_factor_description": "Tingkat kualitas video. Nilai umum adalah 23 untuk H.264, 28 untuk HEVC, 31 untuk VP9, dan 35 untuk AV1. Lebih rendah lebih baik, tetapi menghasilkan berkas yang lebih besar.", - "transcoding_disabled_description": "Jangan transkode video apa pun, dapat merusak pemutaran pada beberapa klien", - "transcoding_encoding_options": "Opsi Pengodean", + "transcoding_constant_rate_factor_description": "Tingkat kualitas video. Nilai umum adalah 23 untuk H.264, 28 untuk HEVC, 31 untuk VP9, dan 35 untuk AV1. Lebih rendah lebih baik, tetapi menghasilkan file yang lebih besar.", + "transcoding_disabled_description": "Jangan transkode video apa pun, dapat mengganggu pemutaran pada beberapa klien", + "transcoding_encoding_options": "Opsi Pengenkodean", "transcoding_encoding_options_description": "Atur kodek, resolusi, kualitas dan opsi lainnya untuk video terenkode", "transcoding_hardware_acceleration": "Akselerasi Perangkat Keras", - "transcoding_hardware_acceleration_description": "Eksperimental: transcoding lebih cepat tetapi dapat menurunkan kualitas pada bitrate yang sama", + "transcoding_hardware_acceleration_description": "Eksperimental: proses transkode lebih cepat tetapi dapat menurunkan kualitas pada bitrate yang sama", "transcoding_hardware_decoding": "Dekode perangkat keras", "transcoding_hardware_decoding_setting_description": "Mengaktifkan akselerasi ujung ke ujung daripada hanya mengakselerasi pengodean. Mungkin tidak berfungsi pada semua video.", "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. Ketika tidak ada unit yang dipilih, k (untuk kbit/s) akan diasumsikan; oleh karena itu 5000, 5000k, dan 5M (untuk Mbit/s) terhitung setara.", + "transcoding_max_bitrate_description": "Menetapkan kecepatan bit maksimum dapat membuat ukuran file 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. Ketika tidak ada unit yang dipilih, k (untuk kbit/s) akan diasumsikan; oleh karena itu 5000, 5000k, dan 5M (untuk Mbit/s) terhitung setara.", "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", "transcoding_policy": "Kebijakan Transkode", - "transcoding_policy_description": "Atur kapan video ditranskode", + "transcoding_policy_description": "Tentukan kapan video ditranskode", "transcoding_preferred_hardware_device": "Perangkat keras yang lebih disukai", "transcoding_preferred_hardware_device_description": "Hanya diterapkan pada VAAPI dan QSV. Menetapkan node dri yang digunakan untuk transkode perangkat keras.", "transcoding_preset_preset": "Prasetel (-preset)", - "transcoding_preset_preset_description": "Kecepatan kompresi. Pra setel yang lebih lambat membuat berkas lebih kecil dan meningkatkan kualitas ketika menargetkan kecepatan bit tertentu. VP9 mengabaikan kecepatan di atas `faster`.", + "transcoding_preset_preset_description": "Kecepatan kompresi. Prasetel yang lebih lambat membuat file lebih kecil dan meningkatkan kualitas ketika menargetkan kecepatan bit tertentu. VP9 mengabaikan kecepatan di atas `faster`.", "transcoding_reference_frames": "Bingkai referensi", "transcoding_reference_frames_description": "Jumlah bingkai untuk direferensikan ketika mengompres bingkai tertentu. Nilai lebih tinggi meningkatkan efisiensi kompresi, tetapi membuat pengodean lambat. 0 menetapkan nilai ini secara otomatis.", "transcoding_required_description": "Hanya video dalam format yang tidak diterima", "transcoding_settings": "Pengaturan Transkode Video", "transcoding_settings_description": "Kelola video mana saja untuk dienkode dan cara memprosesnya", "transcoding_target_resolution": "Resolusi sasaran", - "transcoding_target_resolution_description": "Resolusi yang lebih tinggi dapat menjaga lebih banyak detail tetapi memerlukan waktu lebih lama untuk dienkode, memiliki ukuran berkas yang lebih besar, dan dapat mengurangi respons aplikasi.", + "transcoding_target_resolution_description": "Resolusi yang lebih tinggi dapat menjaga lebih banyak detail tetapi memerlukan waktu lebih lama untuk dienkode, memiliki ukuran file yang lebih besar, dan dapat mengurangi respons aplikasi.", "transcoding_temporal_aq": "AQ Temporal", "transcoding_temporal_aq_description": "Hanya diterapkan pada NVENC. Kuantisasi Adaptif Temporal meningkatkan kualitas adegan berdetail tinggi dan rendah gerakan. Mungkin tidak kompatibel dengan perangkat lawas.", "transcoding_threads": "Utas", @@ -411,11 +411,11 @@ "transcoding_tone_mapping": "Pemetaan nada", "transcoding_tone_mapping_description": "Mencoba menjaga tampilan video HDR ketika dikonversikan ke SDR. Setiap algoritma memiliki kekurangan pada warna, detail, dan kecerahan. Hable menjaga detail, Mobius menjaga warna, dan Reinhard menjada kecerahan.", "transcoding_transcode_policy": "Kebijakan transkode", - "transcoding_transcode_policy_description": "Kebijakan untuk kapan sebuah video harus ditranskode. Video HDR akan selalu ditranskode (kecuali jika transkode dinonaktifkan).", - "transcoding_two_pass_encoding": "Pengodean dua arah", - "transcoding_two_pass_encoding_setting_description": "Transkode dalam dua arah untuk menghasilkan video yang ditranskode dengan lebih baik. Ketika kecepatan bit maksimum diaktifkan (diperlukan supaya bekerja dengan H.264 dan HEVC), mode ini menggunakan jangka kecepatan bit berdasarkan kecepatan bit maksimum dan mengabaikan CRF. Untuk VP9, CRF dapat digunakan jika kecepatan bit maksimum dinonaktifkan.", + "transcoding_transcode_policy_description": "Kebijakan kapan video harus ditranskode. Video HDR dan video dengan format piksel selain YUV 4:2:0 akan selalu ditranskode (kecuali jika transkode dinonaktifkan).", + "transcoding_two_pass_encoding": "Pengodean dua-tahap", + "transcoding_two_pass_encoding_setting_description": "Transkode dalam dua kali proses untuk menghasilkan video yang ditranskode dengan lebih baik. Ketika kecepatan bit maksimum diaktifkan (diperlukan supaya bekerja dengan H.264 dan HEVC), mode ini menggunakan rentang kecepatan bit berdasarkan kecepatan bit maksimum dan mengabaikan CRF. Untuk VP9, CRF dapat digunakan jika kecepatan bit maksimum dinonaktifkan.", "transcoding_video_codec": "Kodek video", - "transcoding_video_codec_description": "VP9 memiliki efisiensi dan kompatibilitas web tinggi, tetapi memerlukan waktu yang lebih lama untuk ditranskode. HEVC berkinerja serupa, tetapi memiliki kompatibilitas web yang lebih rendah. H.264 sangat kompatibel dan cepat untuk ditranskode, tetapi menghasilkan berkas yang lebih besar. AV1 adalah kodek yang paling efisien tetapi tidak didukung pada perangkat lawas.", + "transcoding_video_codec_description": "VP9 memiliki efisiensi dan kompatibilitas web tinggi, tetapi memerlukan waktu yang lebih lama untuk ditranskode. HEVC berkinerja serupa, tetapi memiliki kompatibilitas web yang lebih rendah. H.264 sangat kompatibel dan cepat untuk ditranskode, tetapi menghasilkan file yang lebih besar. AV1 adalah kodek yang paling efisien tetapi tidak didukung pada perangkat lawas.", "trash_enabled_description": "Aktifkan fitur Sampah", "trash_number_of_days": "Jumlah hari", "trash_number_of_days_description": "Jumlah hari untuk menyimpan aset dalam sampah sebelum dihapus secara permanen", @@ -423,90 +423,90 @@ "trash_settings_description": "Kelola pengaturan sampah", "unlink_all_oauth_accounts": "Putuskan tautan semua akun OAuth", "unlink_all_oauth_accounts_description": "Pastikan untuk memutus tautan semua akun OAuth sebelum melakukan migrasi ke penyedia baru.", - "unlink_all_oauth_accounts_prompt": "Apakah Anda yakin ingin memutus tautan semua akun OAuth? Tindakan ini akan mengatur ulang ID OAuth untuk setiap pengguna dan tidak dapat dibatalkan.", + "unlink_all_oauth_accounts_prompt": "Yakin ingin memutus tautan semua akun OAuth? Tindakan ini akan mengatur ulang ID OAuth untuk setiap pengguna dan tidak dapat diurungkan.", "user_cleanup_job": "Pembersihan data pengguna", - "user_delete_delay": "Akun dan aset {user} akan dijadwalkan untuk penghapusan permanen dalam {delay, plural, one {# hari} other {# hari}}.", + "user_delete_delay": "Akun dan aset {user} akan dijadwalkan untuk dihapus secara permanen dalam {delay, plural, one {# hari} other {# hari}}.", "user_delete_delay_settings": "Jeda penghapusan", "user_delete_delay_settings_description": "Jumlah hari setelah penghapusan untuk menghapus akun dan aset pengguna secara permanen. Tugas penghapusan pengguna berjalan pada tengah malam untuk memeriksa pengguna yang siap untuk dihapus. Perubahan pengaturan ini akan dievaluasi pada eksekusi berikutnya.", "user_delete_immediately": "Akun dan aset {user} akan diantrekan untuk penghapusan permanen segera.", "user_delete_immediately_checkbox": "Masukkan pengguna dan aset dalam antrean untuk penghapusan segera", "user_details": "Detail Pengguna", "user_management": "Pengelolaan Pengguna", - "user_password_has_been_reset": "Kata sandi pengguna telah diatur ulang:", - "user_password_reset_description": "Silakan sediakan kata sandi sementara untuk pengguna dan beri tahu bahwa pengguna tersebut harus mengubah kata sandinya pada log masuk berikutnya.", + "user_password_has_been_reset": "Sandi pengguna telah diatur ulang:", + "user_password_reset_description": "Masukkan sandi sementara untuk pengguna dan beri tahu bahwa pengguna tersebut harus mengubah sandinya pada log masuk berikutnya.", "user_restore_description": "Akun {user} akan dipulihkan.", - "user_restore_scheduled_removal": "Pulihkan pengguna - jadwalkan pelepasan pada {date, date, long}", + "user_restore_scheduled_removal": "Pulihkan pengguna - yang dijadwalkan untuk dihapus pada {date, date, long}", "user_settings": "Pengaturan Pengguna", "user_settings_description": "Kelola pengaturan pengguna", "user_successfully_removed": "Pengguna {email} berhasil dihapus.", - "users_page_description": "Laman pengguna admin", + "users_page_description": "Halaman pengguna admin", "version_check_enabled_description": "Aktifkan pemeriksaan versi", - "version_check_implications": "Fitur pemeriksaan versi tergantung komunikasi berkala dengan github.com", + "version_check_implications": "Fitur pemeriksaan versi tergantung pada komunikasi berkala dengan github.com", "version_check_settings": "Pemeriksaan Versi", "version_check_settings_description": "Aktifkan/nonaktifkan notifikasi versi baru", "video_conversion_job": "Transkode video", "video_conversion_job_description": "Transkode video untuk kompatibilitas lebih luas dengan peramban dan perangkat" }, - "admin_email": "Surel Admin", - "admin_password": "Kata Sandi Admin", + "admin_email": "Email Admin", + "admin_password": "Sandi Admin", "administration": "Administrasi", "advanced": "Tingkat lanjut", "advanced_settings_clear_image_cache": "Bersihkan Cache Gambar", "advanced_settings_clear_image_cache_error": "Gagal untuk membersihkan cache gambar", - "advanced_settings_clear_image_cache_success": "Sukses menghapus {size}", - "advanced_settings_enable_alternate_media_filter_subtitle": "Gunakan opsi ini untuk menyaring media saat sinkronisasi berdasarkan kriteria alternatif. Hanya coba ini dengan aplikasi mendeteksi semua album.", - "advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAL] Gunakan saringan sinkronisasi album perangkat alternatif", + "advanced_settings_clear_image_cache_success": "Sukses membersihkan {size}", + "advanced_settings_enable_alternate_media_filter_subtitle": "Gunakan opsi ini untuk memfilter media saat sinkronisasi berdasarkan kriteria alternatif. Hanya coba ini dengan aplikasi mendeteksi semua album.", + "advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAL] Gunakan filter sinkronisasi album perangkat alternatif", "advanced_settings_log_level_title": "Tingkat log: {level}", - "advanced_settings_prefer_remote_subtitle": "Beberapa perangkat akan lambat memuat gambar kecil dari lokal. Menyalakan ini akan memuat gambar kecil dari peladen.", + "advanced_settings_prefer_remote_subtitle": "Beberapa perangkat akan lambat memuat gambar kecil dari aset lokal. Mengaktifkan opsi ini akan memuat gambar kecil dari server.", "advanced_settings_prefer_remote_title": "Prioritaskan gambar dari server", "advanced_settings_proxy_headers_subtitle": "Tentukan header proxy yang harus dikirim Immich dengan setiap permintaan jaringan", - "advanced_settings_proxy_headers_title": "Header proxy kustom [EKSPERIMENTAL]", - "advanced_settings_readonly_mode_subtitle": "Mengaktifkan mode baca-saja, di mana foto hanya bisa dilihat. Fitur seperti memilih banyak foto, berbagi, cast, dan hapus akan dinonaktifkan. Mode baca-saja bisa diaktifkan/nonaktifkan lewat avatar pengguna di layar utama", - "advanced_settings_readonly_mode_title": "Mode Hanya-Baca", - "advanced_settings_self_signed_ssl_subtitle": "Melewati verifikasi sertifikat SSL untuk titik akhir server. Diperlukan untuk sertifikat yang ditandatangani sendiri.", + "advanced_settings_proxy_headers_title": "Header proxy khusus [EKSPERIMENTAL]", + "advanced_settings_readonly_mode_subtitle": "Mengaktifkan mode hanya-baca, agar foto hanya bisa dilihat. Fitur seperti memilih banyak foto, berbagi, cast, dan penghapusan akan dinonaktifkan. Mode hanya-baca bisa diaktifkan/dinonaktifkan lewat avatar pengguna di layar utama", + "advanced_settings_readonly_mode_title": "Mode hanya-baca", + "advanced_settings_self_signed_ssl_subtitle": "Lewati verifikasi sertifikat SSL untuk titik akhir server. Diperlukan untuk sertifikat yang ditandatangani sendiri.", "advanced_settings_self_signed_ssl_title": "Izinkan sertifikat SSL yang ditandatangani sendiri [EKSPERIMENTAL]", "advanced_settings_sync_remote_deletions_subtitle": "Hapus atau pulihkan aset pada perangkat ini secara otomatis ketika tindakan dilakukan di web", "advanced_settings_sync_remote_deletions_title": "Sinkronisasi penghapusan jarak jauh [EKSPERIMENTAL]", "advanced_settings_tile_subtitle": "Pengaturan pengguna tingkat lanjut", "advanced_settings_troubleshooting_subtitle": "Aktifkan fitur tambahan untuk pemecahan masalah", "advanced_settings_troubleshooting_title": "Penelusuran masalah", - "age_months": "Umur {months, plural, one {# bulan} other {# bulan}}", - "age_year_months": "Umur 1 tahun, {months, plural, one {# bulan} other {# bulan}}", - "age_years": "{years, plural, other {Umur #}}", + "age_months": "Usia {months, plural, one {# bulan} other {# bulan}}", + "age_year_months": "Usia 1 tahun, {months, plural, one {# bulan} other {# bulan}}", + "age_years": "{years, plural, other {Usia #}}", "album": "Album", "album_added": "Album ditambahkan", - "album_added_notification_setting_description": "Terima notifikasi surel ketika Anda ditambahkan ke album terbagi", - "album_cover_updated": "Kover album diperbarui", - "album_delete_confirmation": "Apakah Anda yakin ingin menghapus album {album}?", + "album_added_notification_setting_description": "Dapatkan notifikasi email ketika Anda ditambahkan ke album bersama", + "album_cover_updated": "Sampul album diperbarui", + "album_delete_confirmation": "Yakin ingin menghapus album {album}?", "album_delete_confirmation_description": "Jika album ini dibagikan, pengguna lain tidak akan dapat mengaksesnya lagi.", "album_deleted": "Album dihapus", "album_info_card_backup_album_excluded": "Dikecualikan", - "album_info_card_backup_album_included": "Terpilih", + "album_info_card_backup_album_included": "Disertakan", "album_info_updated": "Info album diperbarui", "album_leave": "Tinggalkan album?", - "album_leave_confirmation": "Apakah Anda yakin ingin keluar dari {album}?", + "album_leave_confirmation": "Yakin ingin keluar dari {album}?", "album_name": "Nama Album", - "album_options": "Opsi Album", + "album_options": "Opsi album", "album_remove_user": "Keluarkan pengguna?", - "album_remove_user_confirmation": "Apakah Anda yakin ingin mengeluarkan {user}?", + "album_remove_user_confirmation": "Yakin ingin mengeluarkan {user}?", "album_search_not_found": "Tidak ada album yang ditemukan sesuai pencarian Anda", "album_selected": "Album yang dipilih", - "album_share_no_users": "Sepertinya Anda telah membagikan album ini dengan semua pengguna atau tidak memiliki pengguna siapa pun untuk dibagikan.", + "album_share_no_users": "Sepertinya Anda telah membagikan album ini dengan semua pengguna atau tidak ada pengguna yang bisa menjadi tujuan berbagi.", "album_summary": "Ringkasan album", "album_updated": "Album diperbarui", - "album_updated_setting_description": "Terima notifikasi surel ketika album terbagi memiliki aset baru", - "album_upload_assets": "Unggah aset dari komputer mu dan tambahkan ke album", + "album_updated_setting_description": "Terima notifikasi email ketika album bersama memiliki aset baru", + "album_upload_assets": "Unggah aset dari komputer Anda dan tambahkan ke album", "album_user_left": "Keluar dari {album}", "album_user_removed": "{user} dikeluarkan", - "album_viewer_appbar_delete_confirm": "Hapus album ini dari akun anda?", + "album_viewer_appbar_delete_confirm": "Yakin ingin menghapus album ini dari akun Anda?", "album_viewer_appbar_share_err_delete": "Gagal menghapus album", - "album_viewer_appbar_share_err_leave": "Gagal keluar album", - "album_viewer_appbar_share_err_remove": "Gagal menghapus aset dari album", + "album_viewer_appbar_share_err_leave": "Gagal keluar dari album", + "album_viewer_appbar_share_err_remove": "Ada masalah saat menghapus aset dari album", "album_viewer_appbar_share_err_title": "Gagal mengubah judul album", "album_viewer_appbar_share_leave": "Keluar dari album", "album_viewer_appbar_share_to": "Bagikan Ke", "album_viewer_page_share_add_users": "Tambah pengguna", - "album_with_link_access": "Perbolehkan siapa pun dengan tautan melihat foto dan orang dalam album ini.", + "album_with_link_access": "Izinkan siapa pun dengan tautan untuk melihat foto dan orang dalam album ini.", "albums": "Album", "albums_count": "{count, plural, one {{count, number} Album}other {{count, number} Album}}", "albums_default_sort_order": "Urutan album bawaan", @@ -519,27 +519,27 @@ "all_people": "Semua orang", "all_photos": "Semua foto", "all_videos": "Semua video", - "allow_dark_mode": "Perbolehkan mode gelap", - "allow_edits": "Perbolehkan penyuntingan", - "allow_public_user_to_download": "Perbolehkan pengguna publik untuk mengunduh", - "allow_public_user_to_upload": "Perbolehkan pengguna publik untuk mengunggah", - "allowed": "Diijinkan", + "allow_dark_mode": "Izinkan mode gelap", + "allow_edits": "Izinkan pengeditan", + "allow_public_user_to_download": "Izinkan pengguna publik untuk mengunduh", + "allow_public_user_to_upload": "Izinkan pengguna publik untuk mengunggah", + "allowed": "Diizinkan", "alt_text_qr_code": "Gambar kode QR", "always_keep": "Selalu simpan", - "always_keep_photos_hint": "Fitur Bebaskan Ruang ruang akan menyimpan semua foto di perangkat ini.", - "always_keep_videos_hint": "Fitur Bebaskan Ruang ruang akan menyimpan semua video di perangkat ini.", + "always_keep_photos_hint": "Fitur Bebaskan Ruang akan menyimpan semua foto di perangkat ini.", + "always_keep_videos_hint": "Fitur Bebaskan Ruang akan menyimpan semua video di perangkat ini.", "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.", - "api_key_empty": "Nama Kunci API Anda seharusnya jangan kosong", + "api_key_empty": "Nama Kunci API Anda tidak boleh kosong", "api_keys": "Kunci API", "app_architecture_variant": "Varian (Arsitektur)", - "app_bar_signout_dialog_content": "Apakah kamu yakin ingin keluar akun?", + "app_bar_signout_dialog_content": "Yakin ingin keluar?", "app_bar_signout_dialog_ok": "Ya", - "app_bar_signout_dialog_title": "Keluar akun", - "app_download_links": "Link Download Aplikasi", + "app_bar_signout_dialog_title": "Keluar", + "app_download_links": "Tautan Unduh Aplikasi", "app_settings": "Pengaturan Aplikasi", - "app_stores": "App Stores", + "app_stores": "App Store", "app_update_available": "Pembaruan aplikasi tersedia", "appears_in": "Muncul dalam", "apply_count": "Terapkan ({count, number})", @@ -551,80 +551,80 @@ "archive_size": "Ukuran arsip", "archive_size_description": "Atur ukuran arsip untuk unduhan (dalam GiB)", "archived": "Diarsipkan", - "archived_count": "{count, plural, other {# terarsip}}", + "archived_count": "{count, plural, other {# diarsipkan}}", "are_these_the_same_person": "Apakah ini adalah orang yang sama?", - "are_you_sure_to_do_this": "Apakah Anda yakin ingin melakukan ini?", - "array_field_not_fully_supported": "Bidang-bidang pada array membutuhkan suntingan JSON secara manual", + "are_you_sure_to_do_this": "Yakin ingin melakukan ini?", + "array_field_not_fully_supported": "Bidang array membutuhkan pengeditan JSON secara manual", "asset_action_delete_err_read_only": "Tidak dapat menghapus aset yang bersifat hanya-baca, proses dilewati", - "asset_action_share_err_offline": "Tidak dapat mengambil aset luring, dilewati", - "asset_added_to_album": "Telah ditambahkan ke album", + "asset_action_share_err_offline": "Tidak dapat mengambil aset offline, proses dilewati", + "asset_added_to_album": "Ditambahkan ke album", "asset_adding_to_album": "Menambahkan ke albumâ€Ļ", - "asset_created": "Aset berhasil dibuat", + "asset_created": "Aset dibuat", "asset_description_updated": "Deskripsi aset telah diperbarui", - "asset_filename_is_offline": "Aset {filename} sedang luring", + "asset_filename_is_offline": "Aset {filename} sedang offline", "asset_has_unassigned_faces": "Aset memiliki wajah yang belum ditetapkan", - "asset_hashing": "Memilahâ€Ļ", + "asset_hashing": "Membuat hashâ€Ļ", "asset_list_group_by_sub_title": "Kelompokkan berdasarkan", - "asset_list_layout_settings_dynamic_layout_title": "Tata dinamis", + "asset_list_layout_settings_dynamic_layout_title": "Tata letak dinamis", "asset_list_layout_settings_group_automatically": "Otomatis", "asset_list_layout_settings_group_by": "Kelompokkan aset berdasarkan", "asset_list_layout_settings_group_by_month_day": "Bulan + tanggal", "asset_list_layout_sub_title": "Penataan", - "asset_list_settings_subtitle": "Setelan grid foto", + "asset_list_settings_subtitle": "Pengaturan grid foto", "asset_list_settings_title": "Grid Foto", "asset_not_found_on_device_android": "Aset tidak ditemukan di perangkat", - "asset_not_found_on_device_ios": "Aset tidak ditemukan di perangkat. Jika kamu menggunakan iCloud, aset mungkin tidak dapat diakses karena berkas rusak di iCloud", - "asset_not_found_on_icloud": "Aset tidak ditemukan di iCloud. Aset mungkin tidak dapat diakses karena berkas rusak di iCloud", - "asset_offline": "Aset Luring", - "asset_offline_description": "Aset eksternal ini tidak ada lagi di diska. Silakan hubungi administrator Immich Anda untuk bantuan.", - "asset_restored_successfully": "Aset telah berhasil dipulihkan", + "asset_not_found_on_device_ios": "Aset tidak ditemukan di perangkat. Jika menggunakan iCloud, aset mungkin tidak dapat diakses karena file rusak di iCloud", + "asset_not_found_on_icloud": "Aset tidak ditemukan di iCloud. Aset mungkin tidak dapat diakses karena file rusak di iCloud", + "asset_offline": "Aset Offline", + "asset_offline_description": "Aset eksternal ini tidak ada lagi di disk. Hubungi administrator Immich Anda untuk mendapatkan bantuan.", + "asset_restored_successfully": "Aset berhasil dipulihkan", "asset_skipped": "Dilewati", "asset_skipped_in_trash": "Dalam sampah", "asset_trashed": "Aset dibuang", - "asset_troubleshoot": "Troubleshoot Aset", - "asset_uploaded": "Sudah diunggah", + "asset_troubleshoot": "Mengatasi Masalah Aset", + "asset_uploaded": "Diunggah", "asset_uploading": "Mengunggahâ€Ļ", "asset_viewer_settings_subtitle": "Kelola pengaturan penampil galeri Anda", "asset_viewer_settings_title": "Penampil Aset", "assets": "Aset", "assets_added_count": "{count, plural, one {# aset} other {# aset}} ditambahkan", - "assets_added_to_album_count": "Ditambahkan {count, plural, one {# aset} other {# aset}} ke album", - "assets_added_to_albums_count": "Ditambahkan {assetTotal, plural, one {# aset} other {# aset}} ke {albumTotal, plural, one {# album} other {# album}}", - "assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} tidak dapat ditambahkan ke album", + "assets_added_to_album_count": "{count, plural, one {# aset} other {# aset}} ditambahkan ke album", + "assets_added_to_albums_count": "{assetTotal, plural, one {# aset} other {# aset}} ditambahkan ke {albumTotal, plural, one {# album} other {# album}}", + "assets_cannot_be_added_to_album_count": "{count, plural, one {Aset} other {Aset}} tidak dapat ditambahkan ke album", "assets_cannot_be_added_to_albums": "{count, plural, one {Aset} other {Aset}} tidak dapat ditambahkan ke album mana pun", "assets_count": "{count, plural, one {# aset} other {# aset}}", "assets_deleted_permanently": "{count} aset dihapus secara permanen", "assets_deleted_permanently_from_server": "{count} aset dihapus secara permanen dari server Immich", - "assets_downloaded_failed": "{count, plural, one {# berkas diunduh - {error} berkas gagal} other {# berkas diunduh - {error} berkas gagal}}", - "assets_downloaded_successfully": "{count, plural, one {# berkas berhasil diunduh} other {# berkas berhasil diunduh}}", - "assets_moved_to_trash_count": "Dipindahkan {count, plural, one {# aset} other {# aset}} ke sampah", + "assets_downloaded_failed": "{count, plural, one {# file diunduh - {error} file gagal} other {# file diunduh - {error} file gagal}}", + "assets_downloaded_successfully": "{count, plural, one {# file berhasil diunduh} other {# file berhasil diunduh}}", + "assets_moved_to_trash_count": "{count, plural, one {# aset} other {# aset}} dipindahkan ke sampah", "assets_permanently_deleted_count": "{count, plural, one {# aset} other {# aset}} dihapus secara permanen", "assets_removed_count": "{count, plural, one {# aset} other {# aset}} dihapus", "assets_removed_permanently_from_device": "{count} aset dihapus secara permanen dari perangkat Anda", - "assets_restore_confirmation": "Apakah Anda yakin ingin memulihkan semua aset yang dibuang? Anda tidak dapat mengurungkan tindakan ini! Perlu diingat bahwa aset luring tidak dapat dipulihkan.", + "assets_restore_confirmation": "Yakin ingin memulihkan semua aset yang dibuang? Anda tidak dapat mengurungkan tindakan ini! Perlu diingat bahwa aset offline tidak dapat dipulihkan.", "assets_restored_count": "{count, plural, one {# aset} other {# aset}} dipulihkan", "assets_restored_successfully": "{count} aset berhasil dipulihkan", "assets_trashed": "{count} aset dipindahkan ke sampah", "assets_trashed_count": "{count, plural, one {# aset} other {# aset}} dibuang ke sampah", "assets_trashed_from_server": "{count} aset dipindahkan ke sampah dari server Immich", - "assets_were_part_of_album_count": "{count, plural, one {Aset telah} other {Aset telah}} menjadi bagian dari album", - "assets_were_part_of_albums_count": "{count, plural, one {Aset sudah} other {Aset sudah}} ada di album", - "authorized_devices": "Perangkat Terautentikasi", - "automatic_endpoint_switching_subtitle": "Sambungkan secara lokal melalui Wi-Fi yang telah ditetapkan saat tersedia, dan gunakan koneksi alternatif lain", + "assets_were_part_of_album_count": "{count, plural, one {Aset} other {Aset}} telah menjadi bagian dari album sebelumnya", + "assets_were_part_of_albums_count": "{count, plural, one {Aset} other {Aset}} sudah ada di album", + "authorized_devices": "Perangkat Terotorisasi", + "automatic_endpoint_switching_subtitle": "Sambungkan secara lokal melalui Wi-Fi yang telah ditetapkan saat tersedia, dan gunakan koneksi alternatif jika tidak", "automatic_endpoint_switching_title": "Peralihan URL otomatis", "autoplay_slideshow": "Putar otomatis tayangan slide", "back": "Kembali", "back_close_deselect": "Kembali, tutup, atau batalkan pemilihan", - "background_backup_running_error": "Cadangan latar belakang sedang berjalan, tidak dapat memulai cadangan manual", + "background_backup_running_error": "Pencadangan latar belakang sedang berjalan, tidak dapat memulai pencadangan manual", "background_location_permission": "Izin lokasi latar belakang", "background_location_permission_content": "Untuk beralih jaringan saat berjalan di latar belakang, Immich harus selalu memiliki akses lokasi akurat agar aplikasi dapat membaca nama jaringan Wi-Fi", "background_options": "Opsi Latar Belakang", - "backup": "Cadangkan", + "backup": "Cadangan", "backup_album_selection_page_albums_device": "Album di perangkat ({count})", - "backup_album_selection_page_albums_tap": "Sentuh untuk memilih, sentuh 2x untuk mengecualikan", - "backup_album_selection_page_assets_scatter": "Aset dapat tersebar dalam banyak album. Sehingga album dapat dipilih atau dikecualikan saat proses pencadangan.", + "backup_album_selection_page_albums_tap": "Ketuk untuk menyertakan, ketuk ganda untuk mengecualikan", + "backup_album_selection_page_assets_scatter": "Aset dapat tersebar dalam banyak album, sehingga album dapat dipilih atau dikecualikan saat proses pencadangan.", "backup_album_selection_page_select_albums": "Pilih album", - "backup_album_selection_page_selection_info": "Info Pilihan", + "backup_album_selection_page_selection_info": "Info dari Pilihan", "backup_album_selection_page_total_assets": "Total aset unik", "backup_albums_sync": "Sinkronisasi Cadangan Album", "backup_all": "Semua", @@ -633,23 +633,23 @@ "backup_background_service_connection_failed_message": "Koneksi ke server gagal. Mencoba ulangâ€Ļ", "backup_background_service_current_upload_notification": "Mengunggah {filename}", "backup_background_service_default_notification": "Memeriksa aset baruâ€Ļ", - "backup_background_service_error_title": "Galat cadangan", - "backup_background_service_in_progress_notification": "Mencadangkan asetmuâ€Ļ", + "backup_background_service_error_title": "Kesalahan pencadangan", + "backup_background_service_in_progress_notification": "Mencadangkan aset Andaâ€Ļ", "backup_background_service_upload_failure_notification": "Gagal mengunggah {filename}", - "backup_controller_page_albums": "Cadangkan album", + "backup_controller_page_albums": "Cadangkan Album", "backup_controller_page_background_app_refresh_disabled_content": "Aktifkan penyegaran aplikasi di latar belakang di Pengaturan > Umum > Penyegaran Aplikasi Latar Belakang untuk menggunakan pencadangan latar belakang.", "backup_controller_page_background_app_refresh_disabled_title": "Penyegaran aplikasi latar belakang dinonaktifkan", - "backup_controller_page_background_app_refresh_enable_button_text": "Ke setelan", + "backup_controller_page_background_app_refresh_enable_button_text": "Buka pengaturan", "backup_controller_page_background_battery_info_link": "Tunjukkan caranya", "backup_controller_page_background_battery_info_message": "Untuk mendapatkan pengalaman pencadangan latar belakang yang optimal, nonaktifkan setiap pengaturan pengoptimalan baterai yang membatasi aktivitas latar belakang pada aplikasi Immich.\n\nKarena pengaturan ini bergantung pada jenis perangkat, silakan cari informasi yang relevan sesuai dengan produsen perangkat Anda.", - "backup_controller_page_background_battery_info_ok": "Ok", + "backup_controller_page_background_battery_info_ok": "Oke", "backup_controller_page_background_battery_info_title": "Optimisasi baterai", "backup_controller_page_background_charging": "Hanya saat mengisi daya", "backup_controller_page_background_configure_error": "Gagal mengatur layanan latar belakang", "backup_controller_page_background_delay": "Tunda pencadangan aset baru: {duration}", "backup_controller_page_background_description": "Aktifkan layanan latar belakang untuk mencadangkan aset baru secara otomatis tanpa perlu membuka app", - "backup_controller_page_background_is_off": "Pencadangan otomatis di latar belakang nonaktif", - "backup_controller_page_background_is_on": "Pencadangan otomatis di latar belakang aktif", + "backup_controller_page_background_is_off": "Pencadangan otomatis di latar belakang sedang nonaktif", + "backup_controller_page_background_is_on": "Pencadangan otomatis di latar belakang sedang aktif", "backup_controller_page_background_turn_off": "Matikan layanan latar belakang", "backup_controller_page_background_turn_on": "Nyalakan layanan latar belakang", "backup_controller_page_background_wifi": "Hanya melalui Wi-Fi", @@ -657,38 +657,38 @@ "backup_controller_page_backup_selected": "Terpilih: ", "backup_controller_page_backup_sub": "Foto dan video yang dicadangkan", "backup_controller_page_created": "Dibuat pada: {date}", - "backup_controller_page_desc_backup": "Aktifkan pencadangan di latar depan untuk mengunggah otomatis aset baru ke server secara otomatis saat aplikasi terbuka.", + "backup_controller_page_desc_backup": "Aktifkan pencadangan di latar depan untuk mengunggah aset baru ke server secara otomatis saat aplikasi terbuka.", "backup_controller_page_excluded": "Dikecualikan: ", "backup_controller_page_failed": "Gagal ({count})", "backup_controller_page_filename": "Nama file: {filename} [{size}]", "backup_controller_page_id": "ID: {id}", "backup_controller_page_info": "Informasi Cadangan", - "backup_controller_page_none_selected": "Tidak ada dipilih", + "backup_controller_page_none_selected": "Tidak ada yang dipilih", "backup_controller_page_remainder": "Sisa", - "backup_controller_page_remainder_sub": "Sisa foto dan video untuk dicadangkan", + "backup_controller_page_remainder_sub": "Sisa foto dan video untuk dicadangkan dari yang terpilih", "backup_controller_page_server_storage": "Penyimpanan Server", "backup_controller_page_start_backup": "Mulai Cadangkan", - "backup_controller_page_status_off": "Pencadangan otomatis di latar depan nonaktif", - "backup_controller_page_status_on": "Pencadangan otomatis di latar depan aktif", + "backup_controller_page_status_off": "Pencadangan otomatis di latar depan sedang nonaktif", + "backup_controller_page_status_on": "Pencadangan otomatis di latar depan sedang aktif", "backup_controller_page_storage_format": "{used} dari {total} digunakan", "backup_controller_page_to_backup": "Album untuk dicadangkan", "backup_controller_page_total_sub": "Semua foto dan video unik dari album terpilih", "backup_controller_page_turn_off": "Nonaktifkan pencadangan latar depan", "backup_controller_page_turn_on": "Aktifkan pencadangan latar depan", "backup_controller_page_uploading_file_info": "Mengunggah info file", - "backup_err_only_album": "Tidak dapat menghapus album", + "backup_err_only_album": "Tidak dapat menghapus satu-satunya album", "backup_error_sync_failed": "Sinkronisasi gagal. Tidak dapat memproses cadangan.", "backup_info_card_assets": "aset", "backup_manual_cancelled": "Dibatalkan", "backup_manual_in_progress": "Dalam proses unggah. Coba lagi nanti", "backup_manual_success": "Sukses", "backup_manual_title": "Status unggah", - "backup_options": "Pilihan pengaturan pencadangan", - "backup_options_page_title": "Setelan cadangan", + "backup_options": "Opsi Cadangan", + "backup_options_page_title": "Opsi cadangan", "backup_setting_subtitle": "Kelola pengaturan unggahan latar belakang dan latar depan", "backup_settings_subtitle": "Kelola pengaturan unggahan", - "backup_upload_details_page_more_details": "Ketuk untuk detail lebih", - "backward": "Maju", + "backup_upload_details_page_more_details": "Ketuk untuk detail lebih lanjut", + "backward": "Mundur", "biometric_auth_enabled": "Autentikasi biometrik diaktifkan", "biometric_locked_out": "Anda terkunci oleh autentikasi biometrik", "biometric_no_options": "Opsi biometrik tidak tersedia", @@ -696,50 +696,50 @@ "birthdate_saved": "Tanggal lahir berhasil disimpan", "birthdate_set_description": "Tanggal lahir digunakan untuk menghitung umur orang ini pada saat foto diambil.", "blurred_background": "Latar belakang buram", - "bugs_and_feature_requests": "Permintaan Kutu dan Fitur", - "build": "Versi", - "build_image": "Versi Citra", - "bulk_delete_duplicates_confirmation": "Apakah Anda yakin ingin menghapus {count, plural, one {# aset duplikat} other {# aset duplikat}} secara bersamaan? Ini akan menjaga aset terbesar dari setiap kelompok dan menghapus semua duplikat lain secara permanen. Anda tidak dapat mengurungkan tindakan ini!", - "bulk_keep_duplicates_confirmation": "Apakah Anda yakin ingin menyimpan {count, plural, one {# aset duplikat} other {# aset duplikat}}? Ini akan menyelesaikan semua kelompok duplikat tanpa menghapus apa pun.", - "bulk_trash_duplicates_confirmation": "Apakah Anda yakin ingin membuang {count, plural, one {# aset duplikat} other {# aset duplikat}} secara bersamaan? Ini akan menyimpan aset terbesar dari setiap kelompok dan membuang semua duplikat lainnya.", + "bugs_and_feature_requests": "Bug dan Permintaan Fitur", + "build": "Build", + "build_image": "Versi Build", + "bulk_delete_duplicates_confirmation": "Yakin ingin menghapus massal {count, plural, one {# aset duplikat} other {# aset duplikat}}? Ini akan menyimpan aset terbesar dari setiap kelompok dan menghapus semua duplikat lainnya secara permanen. Anda tidak dapat mengurungkan tindakan ini!", + "bulk_keep_duplicates_confirmation": "Yakin ingin menyimpan {count, plural, one {# aset duplikat} other {# aset duplikat}}? Ini akan menyelesaikan semua kelompok duplikat tanpa menghapus apa pun.", + "bulk_trash_duplicates_confirmation": "Yakin ingin membuang massal {count, plural, one {# aset duplikat} other {# aset duplikat}}? Ini akan menyimpan aset terbesar dari setiap kelompok dan membuang semua duplikat lainnya.", "buy": "Beli Immich", "cache_settings_clear_cache_button": "Hapus cache", - "cache_settings_clear_cache_button_title": "Membersihkan cache aplikasi. Performa aplikasi akan terpengaruh hingga cache dibuat kembali.", + "cache_settings_clear_cache_button_title": "Menghapus cache aplikasi. Performa aplikasi akan terpengaruh hingga cache dibuat kembali.", "cache_settings_duplicated_assets_clear_button": "BERSIHKAN", "cache_settings_duplicated_assets_subtitle": "Foto dan video yang masuk dalam daftar abaikan oleh aplikasi", "cache_settings_duplicated_assets_title": "Aset Duplikat ({count})", - "cache_settings_statistics_album": "Pustaka thumbnail", + "cache_settings_statistics_album": "Pustaka gambar kecil", "cache_settings_statistics_full": "Gambar penuh", - "cache_settings_statistics_shared": "Thumbnail album berbagi", - "cache_settings_statistics_thumbnail": "Thumbnail", + "cache_settings_statistics_shared": "Gambar kecil dari album bersama", + "cache_settings_statistics_thumbnail": "Gambar kecil", "cache_settings_statistics_title": "Penggunaan cache", - "cache_settings_subtitle": "Menyetel proses cache aplikasi Immich", + "cache_settings_subtitle": "Mengontrol perilaku cache aplikasi ponsel Immich", "cache_settings_tile_subtitle": "Mengatur perilaku penyimpanan lokal", "cache_settings_tile_title": "Penyimpanan Lokal", - "cache_settings_title": "Setelan Cache", + "cache_settings_title": "Pengaturan Cache", "camera": "Kamera", "camera_brand": "Merek kamera", "camera_model": "Model kamera", - "cancel": "Batal", + "cancel": "Batalkan", "cancel_search": "Batalkan pencarian", "canceled": "Dibatalkan", "canceling": "Membatalkan", "cannot_merge_people": "Tidak dapat menggabungkan orang", "cannot_undo_this_action": "Anda tidak dapat mengurungkan tindakan ini!", "cannot_update_the_description": "Tidak dapat memperbarui deskripsi", - "cast": "Pencerminan", + "cast": "Cast", "cast_description": "Mengonfigurasi tujuan cast yang tersedia", "change_date": "Ubah tanggal", - "change_description": "Ganti deskripsi", - "change_display_order": "Mengubah urutan tampilan", + "change_description": "Ubah deskripsi", + "change_display_order": "Ubah urutan tampilan", "change_expiration_time": "Ubah waktu kedaluwarsa", "change_location": "Ubah lokasi", "change_name": "Ubah nama", "change_name_successfully": "Nama berhasil diubah", - "change_password": "Ubah Kata Sandi", - "change_password_description": "Ini merupakan pertama kali Anda masuk ke sistem atau ada permintaan untuk mengubah kata sandi Anda. Silakan masukkan kata sandi baru di bawah.", + "change_password": "Ubah Sandi", + "change_password_description": "Ini merupakan saat pertama Anda masuk ke sistem atau ada permintaan untuk mengubah sandi Anda. Silakan masukkan sandi baru di bawah.", "change_password_form_confirm_password": "Konfirmasi Sandi", - "change_password_form_description": "Halo {name},\n\nIni pertama kali anda masuk ke dalam sistem atau terdapat permintaan penggantian kata sandi. Harap masukkan password baru.", + "change_password_form_description": "Halo {name},\n\nIni pertama kali Anda masuk ke dalam sistem atau ada permintaan penggantian sandi. Harap masukkan sandi baru.", "change_password_form_log_out": "Keluar dari semua perangkat lain", "change_password_form_log_out_description": "Disarankan untuk keluar dari semua perangkat lain", "change_password_form_new_password": "Sandi Baru", @@ -747,8 +747,8 @@ "change_password_form_reenter_new_password": "Masukkan Ulang Sandi Baru", "change_pin_code": "Ubah kode PIN", "change_trigger": "Ubah pemicu", - "change_trigger_prompt": "Apakah anda yakin ingin mengubah pemicunya? Tindakan ini akan menghapus seluruh aksi dan filter yang sudah ada.", - "change_your_password": "Ubah kata sandi Anda", + "change_trigger_prompt": "Yakin ingin mengubah pemicunya? Tindakan ini akan menghapus seluruh aksi dan filter yang sudah ada.", + "change_your_password": "Ubah sandi Anda", "changed_visibility_successfully": "Keterlihatan berhasil diubah", "charging": "Mengisi daya", "charging_requirement_mobile_backup": "Cadangan latar belakang memerlukan perangkat dalam keadaan mengisi daya", @@ -756,7 +756,7 @@ "check_corrupt_asset_backup_button": "Lakukan pemeriksaan", "check_corrupt_asset_backup_description": "Jalankan pemeriksaan ini hanya melalui Wi-Fi dan setelah semua aset dicadangkan. Prosedur ini mungkin memerlukan waktu beberapa menit.", "check_logs": "Periksa Log", - "checksum": "Jumlah kontrol", + "checksum": "Checksum", "choose_matching_people_to_merge": "Pilih orang yang cocok untuk digabungkan", "city": "Kota", "cleanup_confirm_description": "Immich menemukan {count} aset (dibuat sebelum {date}) telah aman dicadangkan di server. Hapus salinan lokal dari perangkat ini?", @@ -766,34 +766,39 @@ "cleanup_found_assets": "Menemukan {count} aset cadangan", "cleanup_found_assets_with_size": "Menemukan {count} aset cadangan ({size})", "cleanup_icloud_shared_albums_excluded": "Album Bersama iCloud dikecualikan dari pemindaian", - "cleanup_no_assets_found": "Tidak ada aset yang ditemukan dengan kriteria diatas. Fitur membebaskan ruang hanya dapat menghapus aset yang dicadangkan ke server", + "cleanup_no_assets_found": "Tidak ada aset yang ditemukan dengan kriteria di atas. Fitur membebaskan ruang hanya dapat menghapus aset yang dicadangkan ke server", "cleanup_preview_title": "Aset yang akan dihapus ({count})", - "cleanup_step3_description": "Pindah untuk cadangan aset yang sesuai dengan tanggal mu dan simpan pengaturan.", + "cleanup_step3_description": "Pindai untuk cadangan aset yang sesuai dengan tanggal dan simpan pengaturan.", "cleanup_step4_summary": "{count} aset (dibuat sebelum {date}) untuk dihapus dari perangkat lokal. Foto akan tetap dapat diakses dari aplikasi Immich.", "cleanup_trash_hint": "Untuk dapat mengambil semua ruang penyimpanan, buka aplikasi galeri pada sistem dan kosongkan tempat sampah", "clear": "Hapus", "clear_all": "Hapus semua", "clear_all_recent_searches": "Hapus semua pencarian terakhir", - "clear_file_cache": "Hapus tembolok berkas", + "clear_file_cache": "Hapus Cache File", "clear_message": "Hapus pesan", "clear_value": "Hapus nilai", - "client_cert_dialog_msg_confirm": "OK", - "client_cert_enter_password": "Masukkan kata Sandi", + "client_cert_dialog_msg_confirm": "Oke", + "client_cert_enter_password": "Masukkan Sandi", "client_cert_import": "Impor", "client_cert_import_success_msg": "Sertifikat klien telah diimpor", - "client_cert_invalid_msg": "File sertifikat tidak valid atau kata sandi salah", - "client_cert_password_message": "Masukkan kata sandi untuk sertifikat ini", - "client_cert_password_title": "Kata Sandi Sertifikat", + "client_cert_invalid_msg": "File sertifikat tidak valid atau sandinya salah", + "client_cert_password_message": "Masukkan sandi untuk sertifikat ini", + "client_cert_password_title": "Sandi Sertifikat", "client_cert_remove_msg": "Sertifikat klien dihapus", - "client_cert_subtitle": "Hanya mendukung format PKCS12 (.p12, .pfx). Impor/hapus sertifikat hanya tersedia sebelum login", + "client_cert_subtitle": "Hanya mendukung format PKCS12 (.p12, .pfx). Impor/hapus sertifikat hanya tersedia sebelum masuk", "client_cert_title": "Sertifikat SSL klien [EKSPERIMENTAL]", "clockwise": "Searah jarum jam", "close": "Tutup", - "collapse": "Tutup", - "collapse_all": "Tutup Semua", + "collapse": "Ciutkan", + "collapse_all": "Ciutkan aemua", "color": "Warna", "color_theme": "Tema warna", "command": "Perintah", + "command_palette_prompt": "Temukan halaman, tindakan, atau perintah dengan cepat", + "command_palette_to_close": "untuk menutup", + "command_palette_to_navigate": "untuk masuk", + "command_palette_to_select": "untuk memilih", + "command_palette_to_show_all": "untuk menampilkan semua", "comment_deleted": "Komentar dihapus", "comment_options": "Opsi komentar", "comments_and_likes": "Komentar & suka", @@ -801,17 +806,17 @@ "common_create_new_album": "Buat album baru", "completed": "Selesai", "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_admin_password": "Konfirmasi Sandi Admin", + "confirm_delete_face": "Yakin ingin menghapus wajah {name} dari aset?", + "confirm_delete_shared_link": "Yakin ingin menghapus tautan bersama ini?", + "confirm_keep_this_delete_others": "Semua aset lain di dalam stack akan dihapus kecuali aset ini. Yakin ingin melanjutkan?", "confirm_new_pin_code": "Konfirmasi kode PIN baru", - "confirm_password": "Konfirmasi kata sandi", - "confirm_tag_face": "Apakah Anda ingin menandai wajah ini sebagai {name}?", - "confirm_tag_face_unnamed": "Apakah Anda ingin menandai wajah ini?", + "confirm_password": "Konfirmasi sandi", + "confirm_tag_face": "Ingin memberi tag wajah ini sebagai {name}?", + "confirm_tag_face_unnamed": "Ingin memberi tag wajah ini?", "connected_device": "Perangkat terhubung", "connected_to": "Tersambung ke", - "contain": "Berisi", + "contain": "Pas Di Dalam", "context": "Konteks", "continue": "Lanjutkan", "control_bottom_app_bar_create_new_album": "Buat album baru", @@ -819,21 +824,21 @@ "control_bottom_app_bar_delete_from_local": "Hapus dari perangkat", "control_bottom_app_bar_edit_location": "Edit Lokasi", "control_bottom_app_bar_edit_time": "Edit Tanggal & Waktu", - "control_bottom_app_bar_share_link": "Bagikan tautan", + "control_bottom_app_bar_share_link": "Bagikan Tautan", "control_bottom_app_bar_share_to": "Bagikan Ke", - "control_bottom_app_bar_trash_from_immich": "Pindah ke Sampah", + "control_bottom_app_bar_trash_from_immich": "Pindahkan ke Sampah", "copied_image_to_clipboard": "Gambar disalin ke papan klip.", "copied_to_clipboard": "Disalin ke papan klip!", - "copy_error": "Salin eror", - "copy_file_path": "Salin jalur berkas", + "copy_error": "Salin kesalahan", + "copy_file_path": "Salin jalur file", "copy_image": "Salin Gambar", "copy_link": "Salin tautan", "copy_link_to_clipboard": "Salin tautan ke papan klip", - "copy_password": "Salin kata sandi", + "copy_password": "Salin sandi", "copy_to_clipboard": "Salin ke Papan Klip", "country": "Negara", - "cover": "Penutup", - "covers": "Penutup", + "cover": "Menutupi", + "covers": "Sampul", "create": "Buat", "create_album": "Buat album", "create_album_page_untitled": "Tak berjudul", @@ -849,9 +854,9 @@ "create_new_user": "Buat pengguna baru", "create_shared_album_page_share_add_assets": "TAMBAHKAN ASET", "create_shared_album_page_share_select_photos": "Pilih Foto", - "create_shared_link": "Membuat tautan yang dapat dibagikan", + "create_shared_link": "Buat tautan bersama", "create_tag": "Buat tag", - "create_tag_description": "Buat tag baru. Untuk tag bersarang, harap input jalur tag secara lengkap termasuk tanda garis miring ke depan.", + "create_tag_description": "Buat tag baru. Untuk tag bersarang, masukkan jalur tag secara lengkap termasuk tanda garis miring ke depan.", "create_user": "Buat pengguna", "create_workflow": "Buat alur kerja", "created": "Dibuat", @@ -865,10 +870,10 @@ "current_device": "Perangkat saat ini", "current_pin_code": "Kode PIN saat ini", "current_server_address": "Alamat server saat ini", - "custom_date": "Tanggal kustom", - "custom_locale": "Lokal Khusus", - "custom_locale_description": "Format tanggal dan angka berdasarkan bahasa dan wilayah", - "custom_url": "URL Kustom", + "custom_date": "Tanggal khusus", + "custom_locale": "Pelokalan khusus", + "custom_locale_description": "Format tanggal, waktu, dan angka berdasarkan bahasa dan wilayah yang dipilih", + "custom_url": "URL Khusus", "cutoff_date_description": "Simpan foto dari â€Ļ terakhir", "cutoff_day": "{count, plural, one {hari} other {hari}}", "cutoff_year": "{count, plural, one {tahun} other {tahun}}", @@ -882,7 +887,7 @@ "date_before": "Tanggal sebelum", "date_format": "E, d LLL y â€ĸ HH:mm", "date_of_birth_saved": "Tanggal lahir berhasil disimpan", - "date_range": "Jangka tanggal", + "date_range": "Rentang tanggal", "day": "Hari", "days": "Hari", "deduplicate_all": "Hapus semua duplikat", @@ -890,36 +895,34 @@ "deduplication_criteria_2": "Hitungan data EXIF", "deduplication_info": "Info deduplikasi", "deduplication_info_description": "Untuk memilih aset secara otomatis dan menghapus duplikat secara massal, kami melihat:", - "default_locale": "Lokal Bawaan", - "default_locale_description": "Format tanggal dan angka berdasarkan peramban lokal Anda", "delete": "Hapus", - "delete_action_confirmation_message": "Apakah Anda yakin ingin menghapus aset ini? Tindakan ini akan memindahkan aset ke tempat sampah pada server dan akan mengkonfirmasi apakah Anda ingin menghapusnya juga secara lokal", - "delete_action_prompt": "Sebanyak {count} item telah dihapus", + "delete_action_confirmation_message": "Yakin ingin menghapus aset ini? Tindakan ini akan memindahkan aset ke tempat sampah pada server dan akan mengkonfirmasi apakah Anda ingin menghapusnya juga secara lokal", + "delete_action_prompt": "{count} item telah dihapus", "delete_album": "Hapus album", - "delete_api_key_prompt": "Apakah Anda yakin ingin menghapus kunci API ini?", + "delete_api_key_prompt": "Yakin ingin menghapus kunci API ini?", "delete_dialog_alert": "Item ini akan dihapus permanen dari Immich dan perangkat", "delete_dialog_alert_local": "Item ini akan dihapus secara permanen dari perangkat Anda, tapi masih akan tetap tersedia di server Immich", "delete_dialog_alert_local_non_backed_up": "Beberapa item belum dicadangkan ke Immich dan akan dihapus secara permanen dari perangkat Anda", "delete_dialog_alert_remote": "Item ini akan dihapus secara permanen dari server Immich", "delete_dialog_ok_force": "Lanjutkan Hapus", "delete_dialog_title": "Hapus Permanen", - "delete_duplicates_confirmation": "Apakah Anda yakin ingin menghapus duplikat ini secara permanen?", + "delete_duplicates_confirmation": "Yakin ingin menghapus duplikat ini secara permanen?", "delete_face": "Hapus wajah", "delete_key": "Hapus kunci", "delete_library": "Hapus Pustaka", "delete_link": "Hapus tautan", - "delete_local_action_prompt": "Sebanyak {count} item telah dihapus secara lokal", - "delete_local_dialog_ok_backed_up_only": "Hapus hanya yang telah dicadangkan", + "delete_local_action_prompt": "{count} item telah dihapus secara lokal", + "delete_local_dialog_ok_backed_up_only": "Hapus untuk Hanya yang Telah Dicadangkan", "delete_local_dialog_ok_force": "Lanjutkan Hapus", "delete_others": "Hapus lainnya", "delete_permanently": "Hapus permanen", - "delete_permanently_action_prompt": "Sebanyak {count} item telah dihapus secara permanen", - "delete_shared_link": "Hapus tautan terbagi", - "delete_shared_link_dialog_title": "Hapus Link Berbagi", + "delete_permanently_action_prompt": "{count} item telah dihapus secara permanen", + "delete_shared_link": "Hapus tautan bersama", + "delete_shared_link_dialog_title": "Hapus Tautan Bersama", "delete_tag": "Hapus tag", - "delete_tag_confirmation_prompt": "Apakah Anda yakin ingin menghapus label tag {tagName}?", + "delete_tag_confirmation_prompt": "Yakin ingin menghapus tag {tagName}?", "delete_user": "Hapus pengguna", - "deleted_shared_link": "Tautan terbagi dihapus", + "deleted_shared_link": "Tautan bersama dihapus", "deletes_missing_assets": "Menghapus aset yang hilang dari disk", "description": "Deskripsi", "description_input_hint_text": "Tambah deskripsi...", @@ -929,7 +932,7 @@ "direction": "Arah", "disable": "Nonaktifkan", "disabled": "Dinonaktifkan", - "disallow_edits": "Jangan izinkan penyuntingan", + "disallow_edits": "Jangan izinkan pengeditan", "discord": "Discord", "discover": "Jelajahi", "discovered_devices": "Perangkat yang ditemukan", @@ -943,20 +946,20 @@ "documentation": "Dokumentasi", "done": "Selesai", "download": "Unduh", - "download_action_prompt": "Sedang mengunduh {count} aset", + "download_action_prompt": "Mengunduh {count} aset", "download_canceled": "Unduhan dibatalkan", "download_complete": "Unduhan selesai", - "download_enqueue": "Unduhan diantrikan", - "download_error": "Kesalahan unduh", + "download_enqueue": "Unduhan diantrekan", + "download_error": "Kesalahan Unduh", "download_failed": "Unduhan gagal", "download_finished": "Unduhan selesai", - "download_include_embedded_motion_videos": "Video tertanam", - "download_include_embedded_motion_videos_description": "Sertakan video yang di sematkan dalam foto bergerak sebagai file terpisah", + "download_include_embedded_motion_videos": "Video tersemat", + "download_include_embedded_motion_videos_description": "Sertakan video yang tersemat dalam foto bergerak sebagai file terpisah", "download_notfound": "Unduhan tidak ditemukan", - "download_original": "Unduh berkas asli", + "download_original": "Unduh file asli", "download_paused": "Unduhan dijeda", "download_settings": "Unduhan", - "download_settings_description": "Kelola pengaturan berkaitan dengan pengunduhan aset", + "download_settings_description": "Kelola pengaturan terkait dengan pengunduhan aset", "download_started": "Unduhan dimulai", "download_sucess": "Unduhan sukses", "download_sucess_android": "Media ini telah diunduh ke DCIM/Immich", @@ -965,75 +968,77 @@ "downloading_asset_filename": "Mengunduh aset {filename}", "downloading_from_icloud": "Mengunduh dari iCloud", "downloading_media": "Mengunduh media", - "drop_files_to_upload": "Lepaskan berkas di mana saja untuk mengunggah", + "drop_files_to_upload": "Lepaskan file di mana saja untuk mengunggah", "duplicates": "Duplikat", "duplicates_description": "Selesaikan setiap kelompok dengan menunjukkan mana, jika ada, yang merupakan duplikat", "duration": "Durasi", - "edit": "Sunting", - "edit_album": "Sunting album", - "edit_avatar": "Sunting avatar", - "edit_birthday": "Sunting tanggal lahir", - "edit_date": "Tanggal penyuntingan", - "edit_date_and_time": "Sunting tanggal dan waktu", - "edit_date_and_time_action_prompt": "Sebanyak {count} tanggal dan waktu disunting", + "edit": "Edit", + "edit_album": "Edit album", + "edit_avatar": "Edit avatar", + "edit_birthday": "Edit tanggal lahir", + "edit_date": "Tanggal edit", + "edit_date_and_time": "Edit tanggal dan waktu", + "edit_date_and_time_action_prompt": "{count} tanggal dan waktu diedit", "edit_date_and_time_by_offset": "Ubah tanggal berdasarkan selisih", "edit_date_and_time_by_offset_interval": "Rentang tanggal baru: {from} - {to}", - "edit_description": "Sunting deskripsi", + "edit_description": "Edit deskripsi", "edit_description_prompt": "Silakan pilih deskripsi baru:", - "edit_exclusion_pattern": "Sunting pola pengecualian", - "edit_faces": "Sunting wajah", - "edit_key": "Sunting kunci", - "edit_link": "Sunting tautan", - "edit_location": "Sunting lokasi", - "edit_location_action_prompt": "Sebanyak {count} lokasi telah disunting", + "edit_exclusion_pattern": "Edit pola pengecualian", + "edit_faces": "Edit wajah", + "edit_key": "Edit kunci", + "edit_link": "Edit tautan", + "edit_location": "Edit lokasi", + "edit_location_action_prompt": "{count} lokasi telah diedit", "edit_location_dialog_title": "Lokasi", - "edit_name": "Sunting nama", - "edit_people": "Sunting orang", - "edit_tag": "Ubah tag", - "edit_title": "Sunting Judul", - "edit_user": "Sunting pengguna", - "edit_workflow": "Sunting alur kerja", - "editor": "Penyunting", - "editor_close_without_save_prompt": "Perubahan tidak akan di simpan", + "edit_name": "Edit nama", + "edit_people": "Edit orang", + "edit_tag": "Edit tag", + "edit_title": "Edit Judul", + "edit_user": "Edit pengguna", + "edit_workflow": "Edit alur kerja", + "editor": "Editor", + "editor_close_without_save_prompt": "Perubahan tidak akan disimpan", "editor_close_without_save_title": "Tutup editor?", - "editor_confirm_reset_all_changes": "Apakah anda yakin mau mengatur ulang semua perubahan?", - "editor_discard_edits_confirm": "Buang suntingan", - "editor_discard_edits_prompt": "Anda memiliki suntingan yang belum disimpan. Apakah Anda yakin ingin membuangnya?", - "editor_discard_edits_title": "Buang suntingan?", - "editor_edits_applied_error": "Gagal menerapkan suntingan", - "editor_edits_applied_success": "Suntingan berhasil diterapkan", + "editor_confirm_reset_all_changes": "Yakin ingin mengatur ulang semua perubahan?", + "editor_discard_edits_confirm": "Buang hasil edit", + "editor_discard_edits_prompt": "Anda memiliki hasil edit yang belum disimpan. Yakin ingin membuangnya?", + "editor_discard_edits_title": "Buang hasil edit?", + "editor_edits_applied_error": "Gagal menerapkan hasil edit", + "editor_edits_applied_success": "Hasil edit berhasil diterapkan", "editor_flip_horizontal": "Balik horizontal", "editor_flip_vertical": "Balik vertikal", + "editor_handle_corner": "Pegangan di {corner, select, top_left {pojok kiri atas} top_right {pojok kanan atas} bottom_left {pojok kiri bawah} bottom_right {pojok kanan bawah} other {semua pojokan}}", + "editor_handle_edge": "Pegangan di {edge, select, top {sisi atas} bottom {sisi bawah} left {sisi kiri} right {sisi kanan} other {satu sisi}}", "editor_orientation": "Orientasi", - "editor_reset_all_changes": "Mengatur ulang perubahan", + "editor_reset_all_changes": "Atur ulang perubahan", "editor_rotate_left": "Putar 90° berlawanan arah jarum jam", "editor_rotate_right": "Putar 90° searah jarum jam", - "email": "Surel", - "email_notifications": "Notifikasi surel", + "email": "Email", + "email_notifications": "Notifikasi email", "empty_folder": "Folder ini kosong", "empty_trash": "Kosongkan sampah", - "empty_trash_confirmation": "Apakah Anda yakin ingin mengosongkan sampah? Ini akan menghapus semua aset dalam sampah secara permanen dari Immich.\nAnda tidak dapat mengurungkan tindakan ini!", + "empty_trash_confirmation": "Yakin ingin mengosongkan sampah? Ini akan menghapus semua aset dalam sampah secara permanen dari Immich.\nAnda tidak dapat mengurungkan tindakan ini!", "enable": "Aktifkan", "enable_backup": "Aktifkan Pencadangan", "enable_biometric_auth_description": "Masukkan kode PIN Anda untuk mengaktifkan autentikasi biometrik", "enabled": "Diaktifkan", "end_date": "Tanggal akhir", - "enqueued": "Diantrikan", + "enqueued": "Diantrekan", "enter_wifi_name": "Masukkan nama Wi-Fi", "enter_your_pin_code": "Masukkan kode PIN Anda", "enter_your_pin_code_subtitle": "Masukkan kode PIN Anda untuk mengakses folder terkunci", - "error": "Eror", + "error": "Kesalahan", "error_change_sort_album": "Gagal mengubah urutan album", - "error_delete_face": "Terjadi kesalahan menghapus wajah dari aset", - "error_getting_places": "Kesalahan saat mengambil lokasi", - "error_loading_albums": "Gagal memuat album", - "error_loading_image": "Terjadi eror memuat gambar", - "error_loading_partners": "Kesalahan saat memuat partner: {error}", - "error_retrieving_asset_information": "Gagal mendapatkan informasi aset", + "error_delete_face": "Terjadi kesalahan saat menghapus wajah dari aset", + "error_getting_places": "Terjadi kesalahan saat mengambil lokasi", + "error_loading_albums": "Terjadi kesalahan saat memuat album", + "error_loading_image": "Terjadi kesalahan saat memuat gambar", + "error_loading_partners": "Terjadi kesalahan saat memuat partner: {error}", + "error_retrieving_asset_information": "Terjadi kesalahan saat mendapatkan informasi aset", "error_saving_image": "Kesalahan: {error}", - "error_tag_face_bounding_box": "Galat saat memberi tag wajah – tidak dapat memperoleh koordinat kotak pembatas", - "error_title": "Eror - Ada yang salah", - "error_while_navigating": "Gagal saat berpindah ke aset", + "error_tag_face_bounding_box": "Terjadi kesalahan saat memberi tag wajah – tidak dapat memperoleh koordinat kotak pembatas", + "error_title": "Kesalahan - Ada yang salah", + "error_while_navigating": "Terjadi kesalahan saat berpindah ke aset", "errors": { "cannot_navigate_next_asset": "Tidak dapat menuju ke aset berikutnya", "cannot_navigate_previous_asset": "Tidak dapat menuju ke aset sebelumnya", @@ -1041,43 +1046,44 @@ "cant_change_activity": "Tidak dapat {enabled, select, true {menonaktifkan} other {mengaktifkan}} aktivitas", "cant_change_asset_favorite": "Tidak dapat mengubah favorit untuk aset", "cant_change_metadata_assets_count": "Tidak dapat mengubah metadata {count, plural, one {# aset} other {# aset}}", - "cant_get_faces": "Tidak bisa mendapatkan wajah", - "cant_get_number_of_comments": "Tidak bisa mendapatkan jumlah komentar", + "cant_get_faces": "Tidak dapat mengambil wajah", + "cant_get_number_of_comments": "Tidak dapat mengambil jumlah komentar", "cant_search_people": "Tidak dapat mencari orang", "cant_search_places": "Tidak dapat mencari tempat", - "error_adding_assets_to_album": "Terjadi eror menambahkan aset ke album", - "error_adding_users_to_album": "Terjadi kesalahan menambahkan pengguna ke album", - "error_deleting_shared_user": "Terjadi eror menghapus pengguna terbagi", - "error_downloading": "Terjadi eror mengunduh {filename}", - "error_hiding_buy_button": "Kesalahan menyembunyikan tombol beli", - "error_removing_assets_from_album": "Terjadi eror menghapus aset dari album, lihat konsol untuk detail lebih lanjut", - "error_selecting_all_assets": "Terjadi eror memilih semua aset", + "error_adding_assets_to_album": "Terjadi kesalahan saat menambahkan aset ke album", + "error_adding_users_to_album": "Terjadi kesalahan saat menambahkan pengguna ke album", + "error_deleting_shared_user": "Terjadi kesalahan saat menghapus pengguna berbagi", + "error_downloading": "Terjadi kesalahan saat mengunduh {filename}", + "error_hiding_buy_button": "Terjadi kesalahan saat menyembunyikan tombol beli", + "error_removing_assets_from_album": "Terjadi kesalahan saat menghapus aset dari album, lihat konsol untuk detail lebih lanjut", + "error_selecting_all_assets": "Terjadi kesalahan saat memilih semua aset", "exclusion_pattern_already_exists": "Pola pengecualian ini sudah ada.", "failed_to_create_album": "Gagal membuat album", - "failed_to_create_shared_link": "Gagal membuat tautan terbagi", - "failed_to_edit_shared_link": "Gagal menyunting tautan terbagi", - "failed_to_get_people": "Gagal menangkap orang", + "failed_to_create_shared_link": "Gagal membuat tautan bersama", + "failed_to_edit_shared_link": "Gagal mengedit tautan bersama", + "failed_to_get_people": "Gagal mengambil orang", "failed_to_keep_this_delete_others": "Gagal menyimpan aset ini dan menghapus aset-aset lainnya", - "failed_to_load_asset": "Gagal membuka aset", - "failed_to_load_assets": "Gagal membuka aset-aset", + "failed_to_load_asset": "Gagal memuat aset", + "failed_to_load_assets": "Gagal memuat aset", "failed_to_load_notifications": "Gagal memuat notifikasi", - "failed_to_load_people": "Gagal mengunggah orang", + "failed_to_load_people": "Gagal memuat orang", "failed_to_remove_product_key": "Gagal menghapus kunci produk", - "failed_to_reset_pin_code": "Gagal atur ulang kode PIN", + "failed_to_reset_pin_code": "Gagal mengatur ulang kode PIN", "failed_to_stack_assets": "Gagal menumpuk aset", "failed_to_unstack_assets": "Gagal membatalkan penumpukan aset", - "failed_to_update_notification_status": "Gagal membarui status notifikasi", - "incorrect_email_or_password": "Surel atau kata sandi tidak benar", + "failed_to_update_notification_status": "Gagal memperbarui status notifikasi", + "incorrect_email_or_password": "Email atau sandi salah", "library_folder_already_exists": "Jalur impor ini sudah ada.", - "paths_validation_failed": "{paths, plural, one {# jalur} other {# jalur}} gagal validasi", - "profile_picture_transparent_pixels": "Foto profil tidak dapat memiliki piksel transparan. Silakan perbesar dan/atau pindah posisi gambar.", + "page_not_found": "Halaman tidak ditemukan", + "paths_validation_failed": "{paths, plural, one {# jalur} other {# jalur}} gagal divalidasi", + "profile_picture_transparent_pixels": "Foto profil tidak dapat memiliki piksel transparan. Perbesar dan/atau pindahkan posisi gambar.", "quota_higher_than_disk_size": "Anda menetapkan kuota lebih tinggi dari ukuran disk", "something_went_wrong": "Terjadi kesalahan", "unable_to_add_album_users": "Tidak dapat menambahkan pengguna ke album", - "unable_to_add_assets_to_shared_link": "Tidak dapat menambahkan aset ke tautan terbagi", + "unable_to_add_assets_to_shared_link": "Tidak dapat menambahkan aset ke tautan bersama", "unable_to_add_comment": "Tidak dapat menambahkan komentar", "unable_to_add_exclusion_pattern": "Tidak dapat menambahkan pola pengecualian", - "unable_to_add_partners": "Tidak dapat menambahkan rekan", + "unable_to_add_partners": "Tidak dapat menambahkan partner", "unable_to_add_remove_archive": "Tidak dapat {archived, select, true {menghapus aset dari} other {menambahkan aset ke}} arsip", "unable_to_add_remove_favorites": "Tidak dapat {favorite, select, true {menambahkan aset ke} other {menghapus aset dari}} favorit", "unable_to_archive_unarchive": "Tidak dapat {archived, select, true {mengarsipkan} other {membatalkan pengarsipan}}", @@ -1086,11 +1092,11 @@ "unable_to_change_description": "Tidak dapat mengubah deskripsi", "unable_to_change_favorite": "Tidak dapat mengubah favorit untuk aset", "unable_to_change_location": "Tidak dapat mengubah lokasi", - "unable_to_change_password": "Tidak dapat mengubah kata sandi", + "unable_to_change_password": "Tidak dapat mengubah sandi", "unable_to_change_visibility": "Tidak dapat mengubah keterlihatan untuk {count, plural, one {# orang} other {# orang}}", "unable_to_complete_oauth_login": "Tidak dapat menyelesaikan log masuk OAuth", "unable_to_connect": "Tidak dapat menghubungkan", - "unable_to_copy_to_clipboard": "Tidak dapat menyalin ke papan klip, pastikan Anda mengakses laman ini melalui HTTPS", + "unable_to_copy_to_clipboard": "Tidak dapat menyalin ke papan klip, pastikan Anda mengakses halaman ini melalui HTTPS", "unable_to_create": "Tidak dapat membuat alur kerja", "unable_to_create_admin_account": "Tidak dapat membuat akun admin", "unable_to_create_api_key": "Tidak dapat membuat Kunci API baru", @@ -1098,18 +1104,18 @@ "unable_to_create_user": "Tidak dapat membuat pengguna", "unable_to_delete_album": "Tidak dapat menghapus album", "unable_to_delete_asset": "Tidak dapat menghapus aset", - "unable_to_delete_assets": "Terjadi eror menghapus aset", + "unable_to_delete_assets": "Terjadi kesalahan saat menghapus aset", "unable_to_delete_exclusion_pattern": "Tidak dapat menghapus pola pengecualian", - "unable_to_delete_shared_link": "Tidak dapat menghapus tautan terbagi", + "unable_to_delete_shared_link": "Tidak dapat menghapus tautan bersama", "unable_to_delete_user": "Tidak dapat menghapus pengguna", "unable_to_delete_workflow": "Tidak dapat menghapus alur kerja", - "unable_to_download_files": "Tidak dapat mengunduh berkas", - "unable_to_edit_exclusion_pattern": "Tidak dapat menyunting pola pengecualian", + "unable_to_download_files": "Tidak dapat mengunduh file", + "unable_to_edit_exclusion_pattern": "Tidak dapat mengedit pola pengecualian", "unable_to_empty_trash": "Tidak dapat menghapus sampah", "unable_to_enter_fullscreen": "Tidak dapat memasuki layar penuh", "unable_to_exit_fullscreen": "Tidak dapat keluar dari layar penuh", - "unable_to_get_comments_number": "Tidak bisa mendapatkan jumlah komentar", - "unable_to_get_shared_link": "Gagal mendapatkan tautan berbagi", + "unable_to_get_comments_number": "Tidak dapat mengambil jumlah komentar", + "unable_to_get_shared_link": "Gagal mendapatkan tautan bersama", "unable_to_hide_person": "Tidak dapat menyembunyikan orang", "unable_to_link_motion_video": "Tidak dapat menautkan video gerak", "unable_to_link_oauth_account": "Tidak dapat menautkan akun OAuth", @@ -1122,12 +1128,12 @@ "unable_to_refresh_user": "Tidak dapat menyegarkan pengguna", "unable_to_remove_album_users": "Tidak dapat mengeluarkan pengguna dari album", "unable_to_remove_api_key": "Tidak dapat menghapus Kunci API", - "unable_to_remove_assets_from_shared_link": "Tidak dapat menghapus aset dari tautan terbagi", + "unable_to_remove_assets_from_shared_link": "Tidak dapat menghapus aset dari tautan bersama", "unable_to_remove_library": "Tidak dapat menghapus pustaka", "unable_to_remove_partner": "Tidak dapat menghapus partner", "unable_to_remove_reaction": "Tidak dapat menghapus reaksi", - "unable_to_reset_password": "Tidak dapat mengatur ulang kata sandi", - "unable_to_reset_pin_code": "Tidak dapat mereset kode PIN", + "unable_to_reset_password": "Tidak dapat mengatur ulang sandi", + "unable_to_reset_pin_code": "Tidak dapat mengatur ulang kode PIN", "unable_to_resolve_duplicate": "Tidak dapat menyelesaikan duplikat", "unable_to_restore_assets": "Tidak dapat memulihkan aset", "unable_to_restore_trash": "Tidak dapat memulihkan sampah", @@ -1140,14 +1146,14 @@ "unable_to_save_settings": "Tidak dapat menyimpan pengaturan", "unable_to_scan_libraries": "Tidak dapat memindai pustaka", "unable_to_scan_library": "Tidak dapat memindai pustaka", - "unable_to_set_feature_photo": "Tidak dapat menyeting foto unggulan", + "unable_to_set_feature_photo": "Tidak dapat mengatur foto unggulan", "unable_to_set_profile_picture": "Tidak dapat mengatur foto profil", - "unable_to_set_rating": "Tidak dapat mengatur penilaian", + "unable_to_set_rating": "Tidak dapat mengatur peringkat", "unable_to_submit_job": "Tidak dapat mengirim tugas", "unable_to_trash_asset": "Tidak dapat membuang aset", "unable_to_unlink_account": "Tidak dapat memutuskan akun", "unable_to_unlink_motion_video": "Tidak dapat membatalkan tautan video gerak", - "unable_to_update_album_cover": "Tidak dapat memperbarui kover album", + "unable_to_update_album_cover": "Tidak dapat memperbarui sampul album", "unable_to_update_album_info": "Tidak dapat memperbarui info album", "unable_to_update_library": "Tidak dapat memperbarui pustaka", "unable_to_update_location": "Tidak dapat memperbarui lokasi", @@ -1155,23 +1161,24 @@ "unable_to_update_timeline_display_status": "Tidak dapat memperbarui status penampilan lini masa", "unable_to_update_user": "Tidak dapat memperbarui pengguna", "unable_to_update_workflow": "Tidak dapat memperbarui alur kerja", - "unable_to_upload_file": "Tidak dapat mengunggah berkas" + "unable_to_upload_file": "Tidak dapat mengunggah file" }, - "errors_text": "Gagal", + "errors_text": "Kesalahan", "exclusion_pattern": "Pola pengecualian", "exif": "EXIF", "exif_bottom_sheet_description": "Tambahkan Deskripsi...", - "exif_bottom_sheet_description_error": "Galat saat memperbaharui deskripsi", - "exif_bottom_sheet_details": "RINCIAN", + "exif_bottom_sheet_description_error": "Terjadi kesalahan saat memperbarui deskripsi", + "exif_bottom_sheet_details": "DETAIL", "exif_bottom_sheet_location": "LOKASI", "exif_bottom_sheet_no_description": "Tidak ada deskripsi", "exif_bottom_sheet_people": "ORANG", "exif_bottom_sheet_person_add_person": "Tambah nama", "exit_slideshow": "Keluar dari Salindia", - "expand_all": "Buka semua", - "experimental_settings_new_asset_list_subtitle": "Memproses", - "experimental_settings_new_asset_list_title": "Nyalakan grid foto eksperimental", - "experimental_settings_subtitle": "Gunakan atas risiko anda sendiri!", + "expand": "Bentangkan", + "expand_all": "Bentangkan semua", + "experimental_settings_new_asset_list_subtitle": "Dalam proses", + "experimental_settings_new_asset_list_title": "Aktifkan grid foto eksperimental", + "experimental_settings_subtitle": "Risiko ditanggung pengguna!", "experimental_settings_title": "Eksperimental", "expire_after": "Kedaluwarsa setelah", "expired": "Kedaluwarsa", @@ -1180,49 +1187,50 @@ "explorer": "Jelajah", "export": "Ekspor", "export_as_json": "Ekspor sebagai JSON", - "export_database": "Ekspor Database", - "export_database_description": "Ekspor Database SQLite", + "export_database": "Ekspor Basis Data", + "export_database_description": "Ekspor Basis Data SQLite", "extension": "Ekstensi", "external": "Eksternal", "external_libraries": "Pustaka Eksternal", "external_network": "Jaringan Eksternal", - "external_network_sheet_info": "Ketika tidak berada di jaringan Wi-Fi yang disukai, aplikasi akan terhubung ke server melalui URL pertama di bawah ini yang dapat dijangkaunya, mulai dari atas ke bawah", - "face_unassigned": "Tidak ada nama", + "external_network_sheet_info": "Ketika tidak berada di jaringan Wi-Fi yang dipilih, aplikasi akan terhubung ke server melalui URL pertama di bawah ini yang dapat dijangkaunya, mulai dari atas ke bawah", + "face_unassigned": "Tidak ditetapkan", "failed": "Gagal", "failed_count": "Gagal: {count}", "failed_to_authenticate": "Autentikasi gagal", "failed_to_load_assets": "Gagal memuat aset", - "failed_to_load_folder": "Gagal memuat berkas", + "failed_to_load_folder": "Gagal memuat folder", "favorite": "Favorit", - "favorite_action_prompt": "{count} sudah ditambahkan kedalam Favorites", + "favorite_action_prompt": "{count} telah ditambahkan ke Favorit", "favorite_or_unfavorite_photo": "Favorit atau batalkan pemfavoritan foto", "favorites": "Favorit", "favorites_page_no_favorites": "Tidak ada aset favorit", - "feature_photo_updated": "Foto terfitur diperbarui", + "feature_photo_updated": "Foto unggulan diperbarui", "features": "Fitur", "features_in_development": "Fitur dalam Pengembangan", "features_setting_description": "Kelola fitur aplikasi", - "file_name_or_extension": "Nama berkas atau ekstensi", - "file_name_text": "Nama berkas", - "file_name_with_value": "Nama berkas: {file_name}", - "file_size": "Ukuran berkas", - "filename": "Nama berkas", - "filetype": "Jenis berkas", + "file_name_or_extension": "Nama file atau ekstensi", + "file_name_text": "Nama file", + "file_name_with_value": "Nama file: {file_name}", + "file_size": "Ukuran file", + "filename": "Nama file", + "filetype": "Jenis file", "filter": "Filter", - "filter_description": "Kondisi untuk memfilter aset-aset target", - "filter_people": "Saring orang", - "filter_places": "Saring tempat", - "filters": "Filter-filter", + "filter_description": "Kondisi untuk memfilter aset target", + "filter_people": "Filter orang", + "filter_places": "Filter tempat", + "filter_tags": "Filter tag", + "filters": "Filter", "find_them_fast": "Temukan dengan cepat berdasarkan nama dengan pencarian", "first": "Pertama", - "fix_incorrect_match": "Perbaiki pencocokan salah", - "folder": "Berkas", - "folder_not_found": "Berkas tidak ditemukan", - "folders": "Berkas", + "fix_incorrect_match": "Perbaiki kecocokan yang salah", + "folder": "Folder", + "folder_not_found": "Folder tidak ditemukan", + "folders": "Folder", "folders_feature_description": "Menjelajahi tampilan folder untuk foto dan video pada sistem file", "forgot_pin_code_question": "Lupa PIN?", "forward": "Maju", - "free_up_space": "Bebaskan ruang", + "free_up_space": "Bebaskan Ruang", "free_up_space_description": "Pindahkan foto dan video yang dicadangkan ke tempat sampah perangkat Anda untuk mengosongkan ruang. Salinan Anda di server tetap aman.", "free_up_space_settings_subtitle": "Kosongkan penyimpanan perangkat", "full_path": "Jalur lengkap: {path}", @@ -1231,12 +1239,12 @@ "general": "Umum", "geolocation_instruction_location": "Klik aset yang memiliki koordinat GPS untuk menggunakan lokasinya, atau pilih lokasi langsung dari peta", "get_help": "Dapatkan Bantuan", - "get_people_error": "Kesalahan dalam mendapatkan orang-orang", + "get_people_error": "Terjadi kesalahan saat mengambil orang", "get_wifiname_error": "Tidak dapat mendapatkan nama Wi-Fi. Pastikan Anda telah memberikan izin yang diperlukan dan terhubung ke jaringan Wi-Fi", "getting_started": "Memulai", "go_back": "Kembali", - "go_to_folder": "Pergi ke folder", - "go_to_search": "Pergi ke pencarian", + "go_to_folder": "Buka folder", + "go_to_search": "Buka pencarian", "gps": "GPS", "gps_missing": "Tidak ada GPS", "grant_permission": "Izinkan", @@ -1249,41 +1257,41 @@ "haptic_feedback_switch": "Nyalakan getar", "haptic_feedback_title": "Getar", "has_quota": "Memiliki kuota", - "hash_asset": "Aset Hash", - "hashed_assets": "Aset yang di-hash", + "hash_asset": "Aset hash", + "hashed_assets": "Aset yang dihash", "hashing": "Proses Hash", "header_settings_add_header_tip": "Tambahkan header", "header_settings_field_validator_msg": "Nilai tidak boleh kosong", "header_settings_header_name_input": "Nama header", "header_settings_header_value_input": "Nilai header", - "headers_settings_tile_title": "Header proksi kustom", + "headers_settings_tile_title": "Header proksi khusus", "height": "Tinggi", "hi_user": "Hai {name} ({email})", "hide_all_people": "Sembunyikan semua orang", "hide_gallery": "Sembunyikan galeri", "hide_named_person": "Sembunyikan orang {name}", - "hide_password": "Sembunyikan kata sandi", + "hide_password": "Sembunyikan sandi", "hide_person": "Sembunyikan orang", "hide_schema": "Sembunyikan skema", - "hide_text_recognition": "Sembunyikan teks rekognisi", + "hide_text_recognition": "Sembunyikan pengenalan teks", "hide_unnamed_people": "Sembunyikan orang tanpa nama", - "home_page_add_to_album_conflicts": "Aset {added} telah ditambahkan ke album {album}. Aset {failed} sudah ada dalam album.", - "home_page_add_to_album_err_local": "Belum dapat menambahkan aset lokal ke album, dilewati", + "home_page_add_to_album_conflicts": "{added} aset telah ditambahkan ke album {album}. {failed} aset sudah ada dalam album.", + "home_page_add_to_album_err_local": "Tidak dapat menambahkan aset lokal ke album, dilewati", "home_page_add_to_album_success": "Aset {added} telah ditambahkan ke {album}.", - "home_page_album_err_partner": "Belum dapat menambahkan aset pasangan ke album, dilewati", - "home_page_archive_err_local": "Belum dapat mengarsipkan aset lokal, dilewati", + "home_page_album_err_partner": "Tidak dapat menambahkan aset pasangan ke album, dilewati", + "home_page_archive_err_local": "Tidak dapat mengarsipkan aset lokal, dilewati", "home_page_archive_err_partner": "Tidak dapat mengarsipkan aset pasangan, dilewati", "home_page_building_timeline": "Memuat linimasa", "home_page_delete_err_partner": "Tidak dapat menghapus aset pasangan, dilewati", - "home_page_delete_remote_err_local": "Aset lokal ada dalam pilihan hapus jarak jauh, dilewat", + "home_page_delete_remote_err_local": "Aset lokal ada dalam pilihan hapus jarak jauh, dilewati", "home_page_favorite_err_local": "Belum dapat menandai aset lokal sebagai favorit, dilewati", "home_page_favorite_err_partner": "Belum dapat menandai aset pasangan sebagai favorit, dilewati", - "home_page_first_time_notice": "Jika ini pertama kali Anda menggunakan aplikasi, pastikan untuk memiliki album untuk dicadangkan agar lini masa anda terisi oleh foto dan video dalam album", + "home_page_first_time_notice": "Jika ini pertama kali Anda menggunakan aplikasi, pastikan untuk memiliki album untuk dicadangkan agar lini masa Anda terisi oleh foto dan video dalam album", "home_page_locked_error_local": "Tidak dapat memindahkan aset lokal ke folder terkunci, lewati", "home_page_locked_error_partner": "Tidak dapat memindahkan aset partner ke folder terkunci, lewati", - "home_page_share_err_local": "Tidak bisa membagikan lokal aset melalui tautan, dilewati", - "home_page_upload_err_limit": "Hanya dapat mengunggah maksimal 30 aset dalam satu waktu, melewatkan", - "host": "Hos", + "home_page_share_err_local": "Tidak dapat membagikan aset lokal melalui tautan, dilewati", + "home_page_upload_err_limit": "Hanya dapat mengunggah maksimal 30 aset dalam satu waktu, dilewati", + "host": "Host", "hour": "Jam", "hours": "Jam", "id": "ID", @@ -1291,20 +1299,20 @@ "ignore_icloud_photos": "Abaikan foto iCloud", "ignore_icloud_photos_description": "Foto yang disimpan di iCloud tidak akan diunggah ke server Immich", "image": "Gambar", - "image_alt_text_date": "{isVideo, select, true {Video} other {Image}} pada tanggal {date}", - "image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Image}} diambil oleh {person1} pada {date}", - "image_alt_text_date_2_people": "{isVideo, select, true {Video} other {Image}} diambil oleh {person1} dan {person2} pada {date}", - "image_alt_text_date_3_people": "{isVideo, select, true {Video} other {Image}} diambil oleh {person1}, {person2}, dan {person3} pada {date}", - "image_alt_text_date_4_or_more_people": "{isVideo, select, true {Video} other {Image}} diambil oleh {person1}, {person2}, dan {additionalCount, number} lainnya pada {date}", - "image_alt_text_date_place": "{isVideo, select, true {Video} other {Image}} diambil di {city}, {country} pada {date}", - "image_alt_text_date_place_1_person": "{isVideo, select, true {Video} other {Image}} diambil di {city}, {country} oleh {person1} pada {date}", - "image_alt_text_date_place_2_people": "{isVideo, select, true {Video} other {Image}} diambil di {city}, {country} oleh {person1} dan {person2} pada {date}", - "image_alt_text_date_place_3_people": "{isVideo, select, true {Video} other {Image}} diambil di {city}, {country} oleh {person1}, {person2}, dan {person3} pada {date}", - "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Image}} diambil di {city}, {country} oleh {person1}, {person2}, dan {additionalCount, number} lainnya pada {date}", + "image_alt_text_date": "{isVideo, select, true {Video} other {Gambar}} diambil pada {date}", + "image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Gambar}} diambil dengan {person1} pada {date}", + "image_alt_text_date_2_people": "{isVideo, select, true {Video} other {Gambar}} diambil dengan {person1} dan {person2} pada {date}", + "image_alt_text_date_3_people": "{isVideo, select, true {Video} other {Gambar}} diambil dengan {person1}, {person2}, dan {person3} pada {date}", + "image_alt_text_date_4_or_more_people": "{isVideo, select, true {Video} other {Gambar}} diambil dengan {person1}, {person2}, dan {additionalCount, number} lainnya pada {date}", + "image_alt_text_date_place": "{isVideo, select, true {Video} other {Gambar}} diambil di {city}, {country} pada {date}", + "image_alt_text_date_place_1_person": "{isVideo, select, true {Video} other {Gambar}} diambil di {city}, {country} dengan {person1} pada {date}", + "image_alt_text_date_place_2_people": "{isVideo, select, true {Video} other {Gambar}} diambil di {city}, {country} dengan {person1} dan {person2} pada {date}", + "image_alt_text_date_place_3_people": "{isVideo, select, true {Video} other {Gambar}} diambil di {city}, {country} dengan {person1}, {person2}, dan {person3} pada {date}", + "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Gambar}} diambil di {city}, {country} berisi {person1}, {person2}, dan {additionalCount, number} lainnya pada {date}", "image_saved_successfully": "Gambar disimpan", - "image_viewer_page_state_provider_download_started": "Unduh dimulai", - "image_viewer_page_state_provider_download_success": "Unduh Sukses", - "image_viewer_page_state_provider_share_error": "Galat membagikan", + "image_viewer_page_state_provider_download_started": "Unduhan Dimulai", + "image_viewer_page_state_provider_download_success": "Unduhan Sukses", + "image_viewer_page_state_provider_share_error": "Kesalahan Saat Berbagi", "immich_logo": "Logo Immich", "immich_web_interface": "Antarmuka Web Immich", "import_from_json": "Impor dari JSON", @@ -1313,28 +1321,28 @@ "in_archive": "Dalam arsip", "in_year": "Dalam {year}", "in_year_selector": "Dalam", - "include_archived": "Termasuk terarsip", - "include_shared_albums": "Termasuk album terbagi", - "include_shared_partner_assets": "Termasuk aset terbagi dengan partner", + "include_archived": "Termasuk yang diarsipkan", + "include_shared_albums": "Termasuk album bersama", + "include_shared_partner_assets": "Termasuk aset bersama dengan partner", "individual_share": "Bagikan individu", "individual_shares": "Pembagian individu", "info": "Info", "interval": { "day_at_onepm": "Setiap hari pada 13.00", "hours": "Setiap {hours, plural, one {jam} other {{hours, number} jam}}", - "night_at_midnight": "Setiap malam pada 00.00", + "night_at_midnight": "Setiap tengah malam", "night_at_twoam": "Setiap malam pada 02.00" }, "invalid_date": "Tanggal tidak valid", - "invalid_date_format": "Format Tanggal tidak valid", + "invalid_date_format": "Format tanggal tidak valid", "invite_people": "Undang Orang", "invite_to_album": "Undang ke album", - "ios_debug_info_fetch_ran_at": "Pengambilan dijalankan {dateTime}", - "ios_debug_info_last_sync_at": "Sinkronisasi terakhir {dateTime}", + "ios_debug_info_fetch_ran_at": "Pengambilan dijalankan pada {dateTime}", + "ios_debug_info_last_sync_at": "Sinkronisasi terakhir pada {dateTime}", "ios_debug_info_no_processes_queued": "Tidak ada proses latar belakang dalam antrean", "ios_debug_info_no_sync_yet": "Belum ada pekerjaan sinkronisasi latar belakang yang dijalankan", "ios_debug_info_processes_queued": "{count, plural, one {{count} proses latar belakang dalam antrean} other {{count} proses latar belakang dalam antrean}}", - "ios_debug_info_processing_ran_at": "Pemrosesan dijalankan {dateTime}", + "ios_debug_info_processing_ran_at": "Pemrosesan dijalankan pada {dateTime}", "items_count": "{count, plural, one {# item} other {# item}}", "jobs": "Tugas", "json_editor": "Editor JSON", @@ -1349,16 +1357,16 @@ "keep_on_device_hint": "Pilih item yang akan disimpan di perangkat ini", "keep_this_delete_others": "Pertahankan ini, hapus lainnya", "keeping": "Menyimpan: {items}", - "kept_this_deleted_others": "Aset ini dipertahankan dan {count, plural, one {# asset} other {# assets}} dihapus", + "kept_this_deleted_others": "Aset ini dipertahankan dan {count, plural, one {# asset} other {# asset}} dihapus", "keyboard_shortcuts": "Pintasan papan ketik", "language": "Bahasa", "language_no_results_subtitle": "Coba sesuaikan kata kunci pencarian Anda", "language_no_results_title": "Bahasa tidak ditemukan", - "language_search_hint": "Mencari Bahasa...", - "language_setting_description": "Pilih bahasa Anda yang disukai", + "language_search_hint": "Mencari bahasa...", + "language_setting_description": "Pilih bahasa yang diinginkan", "large_files": "File Besar", "last": "Terakhir", - "last_months": "{count, plural, one {Bulan lalu} other {# Bulan lalu}}", + "last_months": "{count, plural, one {Bulan lalu} other {# bulan lalu}}", "last_seen": "Terakhir dilihat", "latest_version": "Versi Terkini", "latitude": "Lintang", @@ -1369,7 +1377,7 @@ "level": "Tingkat", "library": "Pustaka", "library_add_folder": "Tambahkan folder", - "library_edit_folder": "Sunting folder", + "library_edit_folder": "Edit folder", "library_options": "Opsi pustaka", "library_page_device_albums": "Album pada Perangkat", "library_page_new_album": "Album baru", @@ -1398,9 +1406,9 @@ "location_permission": "Izin lokasi", "location_permission_content": "Untuk menggunakan fitur pengalihan otomatis, Immich memerlukan izin lokasi yang akurat agar dapat membaca nama jaringan Wi-Fi saat ini", "location_picker_choose_on_map": "Pilih di peta", - "location_picker_latitude_error": "Masukkan lintang yang sah", + "location_picker_latitude_error": "Masukkan lintang yang valid", "location_picker_latitude_hint": "Masukkan lintang di sini", - "location_picker_longitude_error": "Masukkan bujur yang sah", + "location_picker_longitude_error": "Masukkan bujur yang valid", "location_picker_longitude_hint": "Masukkan bujur di sini", "lock": "Kunci", "locked_folder": "Folder Terkunci", @@ -1411,10 +1419,10 @@ "logged_out_all_devices": "Semua perangkat telah dikeluarkan", "logged_out_device": "Perangkat telah keluar", "login": "Log masuk", - "login_disabled": "Login telah dimatikan", - "login_form_api_exception": "Kesalahan API. Harap periksa URL server dan coba lagi.", + "login_disabled": "Log masuk telah dinonaktifkan", + "login_form_api_exception": "Kesalahan API. Periksa URL server dan coba lagi.", "login_form_back_button_text": "Kembali", - "login_form_email_hint": "emailmu@email.com", + "login_form_email_hint": "emailmu@example.com", "login_form_endpoint_hint": "http://ip-server-anda:port", "login_form_endpoint_url": "URL Endpoint Server", "login_form_err_http": "Harap tentukan http:// atau https://", @@ -1422,19 +1430,19 @@ "login_form_err_invalid_url": "URL Tidak Valid", "login_form_err_leading_whitespace": "Spasi awal", "login_form_err_trailing_whitespace": "Spasi akhir", - "login_form_failed_get_oauth_server_config": "Gagal logging menggunakan OAuth, periksa URL server", + "login_form_failed_get_oauth_server_config": "Gagal masuk menggunakan OAuth, periksa URL server", "login_form_failed_get_oauth_server_disable": "Fitur OAuth tidak tersedia di server ini", - "login_form_failed_login": "Login gagal, periksa URL server, email dan kata sandi", + "login_form_failed_login": "Log masuk gagal, periksa URL server, email, dan sandi", "login_form_handshake_exception": "Terjadi Handshake Exception dengan server. Aktifkan dukungan sertifikat swatanda di pengaturan jika Anda menggunakan sertifikat swatanda.", "login_form_password_hint": "sandi", - "login_form_save_login": "Ingat saya", + "login_form_save_login": "Tetap masuk", "login_form_server_empty": "Masukkan URL server.", "login_form_server_error": "Tidak dapat menghubungi server.", "login_has_been_disabled": "Log masuk telah dinonaktifkan.", - "login_password_changed_error": "Terdapat kesalahan mengganti password", + "login_password_changed_error": "Terjadi kesalahan saat memperbarui sandi", "login_password_changed_success": "Sandi berhasil diperbarui", - "logout_all_device_confirmation": "Apakah Anda yakin ingin keluar dari semua perangkat?", - "logout_this_device_confirmation": "Apakah Anda yakin ingin mengeluarkan perangkat ini?", + "logout_all_device_confirmation": "Yakin ingin keluar dari semua perangkat?", + "logout_this_device_confirmation": "Yakin ingin mengeluarkan perangkat ini?", "logs": "Log", "longitude": "Bujur", "look": "Tampilan", @@ -1443,22 +1451,22 @@ "main_branch_warning": "Anda menggunakan versi pengembangan; kami sangat menyarankan menggunakan versi rilis!", "main_menu": "Menu utama", "maintenance_action_restore": "Memulihkan Basis Data", - "maintenance_description": "Immich telah ditempatkan di mode pemeliharaan.", + "maintenance_description": "Immich telah ditempatkan dalam mode pemeliharaan.", "maintenance_end": "Akhiri mode pemeliharaan", "maintenance_end_error": "Gagal mengakhiri mode pemeliharaan.", "maintenance_logged_in_as": "Saat ini masuk sebagai {user}", "maintenance_restore_from_backup": "Pulihkan Dari Cadangan", "maintenance_restore_library": "Pulihkan Pustaka Anda", - "maintenance_restore_library_confirm": "Jika ini terlihat benar, lanjutkan untuk memulihkan cadangan!", + "maintenance_restore_library_confirm": "Jika sudah benar, lanjutkan untuk memulihkan cadangan!", "maintenance_restore_library_description": "Memulihkan Basis Data", "maintenance_restore_library_folder_has_files": "{folder} memiliki {count} folder", - "maintenance_restore_library_folder_no_files": "{folder} kehilangan berkas!", + "maintenance_restore_library_folder_no_files": "{folder} kehilangan file!", "maintenance_restore_library_folder_pass": "dapat dibaca dan dapat ditulis", "maintenance_restore_library_folder_read_fail": "tidak dapat dibaca", "maintenance_restore_library_folder_write_fail": "tidak dapat ditulis", - "maintenance_restore_library_hint_missing_files": "Anda mungkin kehilangan berkas penting", + "maintenance_restore_library_hint_missing_files": "Anda mungkin kehilangan file penting", "maintenance_restore_library_hint_regenerate_later": "Anda dapat membuat ulang ini nanti di pengaturan", - "maintenance_restore_library_hint_storage_template_missing_files": "Menggunakan templat penyimpanan? Anda mungkin kehilangan berkas", + "maintenance_restore_library_hint_storage_template_missing_files": "Menggunakan templat penyimpanan? Anda mungkin kehilangan file", "maintenance_restore_library_loading": "Memuat pemeriksaan integritas dan heuristikâ€Ļ", "maintenance_task_backup": "Membuat cadangan dari basis data yang adaâ€Ļ", "maintenance_task_migrations": "Menjalankan migrasi basis dataâ€Ļ", @@ -1466,12 +1474,12 @@ "maintenance_task_rollback": "Pemulihan gagal, mengembalikan ke titik pemulihanâ€Ļ", "maintenance_title": "Tidak Tersedia untuk Sementara", "make": "Merek", - "manage_geolocation": "Atur lokasi", - "manage_media_access_rationale": "Izin ini diperlukan untuk menangani perpindahan aset-aset secara tepat ke tempat sampah dan mengembalikannya dari sana.", + "manage_geolocation": "Kelola lokasi", + "manage_media_access_rationale": "Izin ini diperlukan untuk menangani perpindahan aset secara tepat ke tempat sampah dan mengembalikannya dari sana.", "manage_media_access_settings": "Buka pengaturan", - "manage_media_access_subtitle": "Izinkan aplikasi Immich untuk mengelola dan memindahkan berkas media.", + "manage_media_access_subtitle": "Izinkan aplikasi Immich untuk mengelola dan memindahkan file media.", "manage_media_access_title": "Akses Manajemen Media", - "manage_shared_links": "Kelola tautan terbagi", + "manage_shared_links": "Kelola tautan bersama", "manage_sharing_with_partners": "Kelola pembagian dengan partner", "manage_the_app_settings": "Kelola pengaturan aplikasi", "manage_your_account": "Kelola akun Anda", @@ -1480,14 +1488,14 @@ "manage_your_oauth_connection": "Kelola koneksi OAuth Anda", "map": "Peta", "map_assets_in_bounds": "{count, plural, =0 {Tidak ada foto di area ini} one {# foto} other {# foto}}", - "map_cannot_get_user_location": "Tidak dapat memeroleh lokasi pengguna", + "map_cannot_get_user_location": "Tidak dapat memperoleh lokasi pengguna", "map_location_dialog_yes": "Ya", "map_location_picker_page_use_location": "Gunakan lokasi ini", - "map_location_service_disabled_content": "Layanan lokasi perlu diaktifkan untuk menampilkan aset yang terletak di lokasi kamu saat ini. Apakah kamu ingin mengaktifkan layanan tersebut sekarang?", + "map_location_service_disabled_content": "Layanan lokasi perlu diaktifkan untuk menampilkan aset yang terletak di lokasi Anda saat ini. Ingin mengaktifkan layanan tersebut sekarang?", "map_location_service_disabled_title": "Layanan Lokasi nonaktif", "map_marker_for_images": "Penanda peta untuk gambar yang diambil di {city}, {country}", "map_marker_with_image": "Penanda peta dengan gambar", - "map_no_location_permission_content": "Izin lokasi diperlukan untuk menampilkan aset yang terletak di lokasi kamu. Apakah kamu ingin mengizinkan sekarang?", + "map_no_location_permission_content": "Izin lokasi diperlukan untuk menampilkan aset yang terletak di lokasi Anda. Ingin mengizinkannya sekarang?", "map_no_location_permission_title": "Izin Lokasi ditolak", "map_settings": "Pengaturan peta", "map_settings_dark_mode": "Mode gelap", @@ -1497,21 +1505,21 @@ "map_settings_date_range_option_years": "{years} tahun terakhir", "map_settings_dialog_title": "Pengaturan Peta", "map_settings_include_show_archived": "Sertakan yang diarsipkan", - "map_settings_include_show_partners": "Sertakan Pasangan", + "map_settings_include_show_partners": "Sertakan Partner", "map_settings_only_show_favorites": "Tampilkan Hanya Favorit", "map_settings_theme_settings": "Tema Peta", "map_zoom_to_see_photos": "Perkecil untuk lihat foto", "mark_all_as_read": "Tandai semua sebagai telah dibaca", "mark_as_read": "Tandai sebagai telah dibaca", "marked_all_as_read": "Semua telah ditandai sebagai telah dibaca", - "matches": "Cocokan", + "matches": "Yang Cocok", "matching_assets": "Aset yang Cocok", "media_type": "Jenis media", "memories": "Kenangan", "memories_all_caught_up": "Semua telah dilihat", "memories_check_back_tomorrow": "Lihat lagi besok untuk kenangan lainnya", - "memories_setting_description": "Kelola apa yang Anda lihat dalam kenangan Anda", - "memories_start_over": "Ulang Dari Awal", + "memories_setting_description": "Kelola apa yang dilihat dalam kenangan Anda", + "memories_start_over": "Ulang dari Awal", "memories_swipe_to_close": "Geser ke atas untuk menutup", "memory": "Kenangan", "memory_lane_title": "Jalur Kenangan {title}", @@ -1519,7 +1527,7 @@ "merge": "Gabungkan", "merge_people": "Gabungkan orang", "merge_people_limit": "Anda hanya dapat menggabungkan sampai 5 wajah sekaligus", - "merge_people_prompt": "Apakah Anda ingin menggabungkan orang ini? Tindakan ini tidak dapat diurungkan.", + "merge_people_prompt": "Ingin menggabungkan orang ini? Tindakan ini tidak dapat diurungkan.", "merge_people_successfully": "Orang berhasil digabungkan", "merged_people_count": "{count, plural, one {# orang} other {# orang}} digabung", "minimize": "Kecilkan", @@ -1534,17 +1542,17 @@ "month": "Bulan", "monthly_title_text_date_format": "BBBB t", "more": "Lainnya", - "move": "Pindah", - "move_down": "Pindah ke bawah", + "move": "Pindahkan", + "move_down": "Pindahkan ke bawah", "move_off_locked_folder": "Pindahkan dari folder terkunci", - "move_to": "Pindah ke", + "move_to": "Pindahkan ke", "move_to_device_trash": "Pindahkan ke tempat sampah perangkat", "move_to_lock_folder_action_prompt": "{count} ditambahkan ke folder terkunci", - "move_to_locked_folder": "Pindahkan dari folder terkunci", + "move_to_locked_folder": "Pindahkan ke folder terkunci", "move_to_locked_folder_confirmation": "Foto dan video ini akan dihapus dari semua album, dan hanya dapat dilihat dari folder terkunci", - "move_up": "Pindah ke atas", - "moved_to_archive": "Dipindahkan {count, plural, one {# asset} other {# assets}} ke arsip", - "moved_to_library": "Dipindahkan {count, plural, one {# asset} other {# assets}} ke pustaka", + "move_up": "Pindahkan ke atas", + "moved_to_archive": "{count, plural, one {# aset} other {# aset}} dipindahkan ke arsip", + "moved_to_library": "{count, plural, one {# aset} other {# aset}} dipindahkan ke pustaka", "moved_to_trash": "Dipindahkan ke sampah", "multiselect_grid_edit_date_time_err_read_only": "Tidak dapat mengedit tanggal aset hanya-baca, dilewati", "multiselect_grid_edit_gps_err_read_only": "Tidak dapat mengedit lokasi aset hanya-baca, dilewati", @@ -1554,18 +1562,18 @@ "name_or_nickname": "Nama atau nama panggilan", "name_required": "Nama diperlukan", "navigate": "Navigasi", - "navigate_to_time": "Navigasi ke Waktu", - "network_requirement_photos_upload": "Gunakan data seluler untuk cadangkan foto", - "network_requirement_videos_upload": "Gunakan data seluler untuk cadangkan video", + "navigate_to_time": "Navigasikan ke Waktu", + "network_requirement_photos_upload": "Gunakan data seluler untuk pencadangan foto", + "network_requirement_videos_upload": "Gunakan data seluler untuk pencadangan video", "network_requirements": "Persyaratan Jaringan", "network_requirements_updated": "Persyaratan jaringan telah berubah, antrean pencadangan diatur ulang", "networking_settings": "Jaringan", - "networking_subtitle": "Kelola pengaturan Endpoint server", + "networking_subtitle": "Kelola pengaturan titik akhir server", "never": "Tidak pernah", "new_album": "Album baru", "new_api_key": "Kunci API Baru", "new_date_range": "Rentang tanggal baru", - "new_password": "Kata sandi baru", + "new_password": "Sandi baru", "new_person": "Orang baru", "new_pin_code": "Kode PIN baru", "new_pin_code_subtitle": "Ini adalah akses pertama Anda ke folder terkunci. Buat kode PIN untuk mengamankan akses ke halaman ini", @@ -1573,7 +1581,7 @@ "new_update": "Pembaruan baru", "new_user_created": "Pengguna baru dibuat", "new_version_available": "VERSI BARU TERSEDIA", - "newest_first": "Terkini dahulu", + "newest_first": "Terbaru dahulu", "next": "Berikutnya", "next_memory": "Kenangan berikutnya", "no": "Tidak", @@ -1606,10 +1614,10 @@ "no_remote_assets_found": "Tidak ada aset jarak jauh yang ditemukan dengan checksum ini", "no_results": "Tidak ada hasil", "no_results_description": "Coba sinonim atau kata kunci yang lebih umum", - "no_shared_albums_message": "Buat sebuah album untuk membagikan foto dan video dengan orang-orang dalam jaringan Anda", + "no_shared_albums_message": "Buat sebuah album untuk membagikan foto dan video dengan orang lain dalam jaringan Anda", "no_uploads_in_progress": "Tidak ada unggahan yang sedang berlangsung", "none": "Tidak ada", - "not_allowed": "Tidak diperbolehkan", + "not_allowed": "Tidak diizinkan", "not_available": "T/T", "not_in_any_album": "Tidak ada dalam album apa pun", "not_selected": "Belum dipilih", @@ -1619,36 +1627,38 @@ "notification_permission_list_tile_content": "Berikan izin untuk mengaktifkan notifikasi.", "notification_permission_list_tile_enable_button": "Aktifkan Notifikasi", "notification_permission_list_tile_title": "Izin Notifikasi", - "notification_toggle_setting_description": "Aktifkan notifikasi surel", + "notification_toggle_setting_description": "Aktifkan notifikasi email", "notifications": "Notifikasi", "notifications_setting_description": "Kelola notifikasi", "oauth": "OAuth", "obtainium_configurator": "Konfigurator Obtainium", - "obtainium_configurator_instructions": "Gunakan Obtainium untuk menginstal dan memperbarui aplikasi Android secara langsung dari rilis GitHub Immich. Buat kunci API dan pilih varian untuk membuat tautan konfigurasi Obtainium anda", + "obtainium_configurator_instructions": "Gunakan Obtainium untuk menginstal dan memperbarui aplikasi Android secara langsung dari rilis GitHub Immich. Buat kunci API dan pilih varian untuk membuat tautan konfigurasi Obtainium Anda", "ocr": "OCR", "official_immich_resources": "Sumber Daya Immich Resmi", - "offline": "Luring", + "offline": "Offline", "offset": "Ofset", "ok": "Oke", "oldest_first": "Terlawas dahulu", "on_this_device": "Di perangkat ini", "onboarding": "Memulai", "onboarding_locale_description": "Pilih bahasa pilihan Anda. Anda dapat mengubahnya nanti di pengaturan.", - "onboarding_privacy_description": "Fitur-fitur berikut ini (bersifat opsional) bergantung pada layanan eksternal dan dapat Anda nonaktifkan kapan saja melalui menu pengaturan.", + "onboarding_privacy_description": "Fitur berikut ini (bersifat opsional) bergantung pada layanan eksternal dan dapat dinonaktifkan kapan saja melalui pengaturan.", "onboarding_server_welcome_description": "Mari kita konfigurasikan instans Anda dengan sejumlah pengaturan umum.", - "onboarding_theme_description": "Pilih tema warna untuk server Anda. Ini dapat diubah lagi dalam pengaturan Anda.", + "onboarding_theme_description": "Pilih tema warna untuk server Anda. Ini juga dapat diubah nanti dalam pengaturan Anda.", "onboarding_user_welcome_description": "Ayo kita mulai!", "onboarding_welcome_user": "Selamat datang, {user}", - "online": "Daring", + "online": "Online", "only_favorites": "Hanya favorit", "open": "Buka", + "open_calendar": "Buka kalender", + "open_in_browser": "buka di browser", "open_in_map_view": "Buka dalam tampilan peta", "open_in_openstreetmap": "Buka di OpenStreetMap", - "open_the_search_filters": "Buka saringan pencarian", + "open_the_search_filters": "Buka filter pencarian", "options": "Opsi", "or": "atau", - "organize_into_albums": "Atur ke dalam album", - "organize_into_albums_description": "Masukkan foto lama ke album sesuai pengaturan sinkronisasi", + "organize_into_albums": "Kelola ke dalam album", + "organize_into_albums_description": "Masukkan foto yang ada ke album sesuai pengaturan sinkronisasi", "organize_your_library": "Kelola pustaka Anda", "original": "asli", "other": "Lainnya", @@ -1657,25 +1667,25 @@ "other_variables": "Variabel lain", "owned": "Dimiliki", "owner": "Pemilik", - "page": "Laman", - "partner": "Rekan", + "page": "Halaman", + "partner": "Partner", "partner_can_access": "{partner} dapat mengakses", "partner_can_access_assets": "Semua foto dan video Anda kecuali yang ada di Arsip dan Terhapus", - "partner_can_access_location": "Lokasi di mana foto Anda diambil", + "partner_can_access_location": "Lokasi tempat foto diambil", "partner_list_user_photos": "Foto {user}", "partner_list_view_all": "Lihat semua", - "partner_page_empty_message": "Foto anda tidak dibagikan dengan partner manapun.", + "partner_page_empty_message": "Foto Anda tidak dibagikan dengan partner mana pun.", "partner_page_no_more_users": "Tidak ada pengguna lain yang bisa ditambahkan", "partner_page_partner_add_failed": "Gagal menambahkan partner", "partner_page_select_partner": "Pilih partner", "partner_page_shared_to_title": "Dibagikan dengan", "partner_page_stop_sharing_content": "{partner} tidak akan bisa mengakses foto Anda lagi.", - "partner_sharing": "Pembagian Partner", + "partner_sharing": "Berbagi dengan Partner", "partners": "Partner", - "password": "Kata sandi", - "password_does_not_match": "Kata sandi tidak cocok", - "password_required": "Kata Sandi Diperlukan", - "password_reset_success": "Pengaturan ulang kata sandi berhasil", + "password": "Sandi", + "password_does_not_match": "Sandi tidak cocok", + "password_required": "Sandi Diperlukan", + "password_reset_success": "Pengaturan ulang sandi berhasil", "past_durations": { "days": "{days, plural, one {hari} other {# hari}} lalu", "hours": "{hours, plural, one {jam} other {# jam}} lalu", @@ -1688,15 +1698,15 @@ "paused": "Dijeda", "pending": "Tertunda", "people": "Orang", - "people_edits_count": "{count, plural, one {# orang} other {# orang}} disunting", + "people_edits_count": "{count, plural, one {# orang} other {# orang}} telah diedit", "people_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan orang", "people_selected": "{count, plural, one {# orang dipilih} other {# orang dipilih}}", - "people_sidebar_description": "Tampilkan tautan ke Orang dalam bilah samping", + "people_sidebar_description": "Tampilkan tautan ke Orang di bilah samping", "permanent_deletion_warning": "Peringatan penghapusan permanen", "permanent_deletion_warning_setting_description": "Tampilkan peringatan ketika menghapus aset secara permanen", "permanently_delete": "Hapus secara permanen", "permanently_delete_assets_count": "Hapus {count, plural, one {aset} other {aset}} secara permanen", - "permanently_delete_assets_prompt": "Apakah Anda yakin untuk menghapus {count, plural, one {aset ini secara permanen?} other {sebanyak # aset-aset berikut secara permanen?}} Ini juga akan menghapus {count, plural, one {ini dari} other {semua dari}} album-albumnya.", + "permanently_delete_assets_prompt": "Yakin ingin menghapus {count, plural, one {aset ini} other {# aset berikut}} secara permanen? Ini juga akan menghapus {count, plural, one {ini dari} other {semua dari}} album-albumnya.", "permanently_deleted_asset": "Aset dihapus secara permanen", "permanently_deleted_assets_count": "{count, plural, one {# aset} other {# aset}} dihapus secara permanen", "permission": "Perizinan", @@ -1704,31 +1714,31 @@ "permission_onboarding_back": "Kembali", "permission_onboarding_continue_anyway": "Lanjutkan saja", "permission_onboarding_get_started": "Memulai", - "permission_onboarding_go_to_settings": "Buka setelan", - "permission_onboarding_permission_denied": "Izin ditolak. Untuk menggunakan Immich, berikan izin akses foto dan video di Setelan.", + "permission_onboarding_go_to_settings": "Buka pengaturan", + "permission_onboarding_permission_denied": "Izin ditolak. Untuk menggunakan Immich, berikan izin akses foto dan video di Pengaturan.", "permission_onboarding_permission_granted": "Izin diberikan! Semua sudah siap.", - "permission_onboarding_permission_limited": "Izin dibatasi. Agai Immich dapat mencadangkan dan mengatur seluruh koleksi galeri, izinkan akses foto dan video pada Setelan.", - "permission_onboarding_request": "Immich memerlukan izin untuk melihat foto dan video kamu.", + "permission_onboarding_permission_limited": "Izin dibatasi. Agar Immich dapat mencadangkan dan mengelola seluruh koleksi galeri, izinkan akses foto dan video pada Pengaturan.", + "permission_onboarding_request": "Immich memerlukan izin untuk melihat foto dan video Anda.", "person": "Orang", - "person_age_months": "{months, plural, one {# bulan} other {# bulan}} old", - "person_age_year_months": "1 year, {months, plural, one {# bulan} other {# bulan}} old", - "person_age_years": "{years, plural, other {# tahun}} old", + "person_age_months": "{months, plural, one {# bulan} other {# bulan}}", + "person_age_year_months": "1 tahun {months, plural, one {# bulan} other {# bulan}}", + "person_age_years": "{years, plural, other {# tahun}}", "person_birthdate": "Lahir pada {date}", - "person_hidden": "{name}{hidden, select, true { (tersembunyi)} other {}}", + "person_hidden": "{name}{hidden, select, true { (disembunyikan)} other {}}", "person_recognized": "Orang yang dikenali", "person_selected": "Orang yang dipilih", - "photo_shared_all_users": "Sepertinya Anda membagikan foto Anda dengan semua pengguna atau Anda tidak memiliki pengguna siapa pun untuk dibagikan.", + "photo_shared_all_users": "Sepertinya Anda telah membagikan foto Anda dengan semua pengguna atau tidak ada pengguna yang bisa menjadi tujuan berbagi.", "photos": "Foto", "photos_and_videos": "Foto & Video", "photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Foto}}", "photos_from_previous_years": "Foto dari tahun lalu", "photos_only": "Hanya foto", "pick_a_location": "Pilih lokasi", - "pick_custom_range": "Rentang kustom", + "pick_custom_range": "Rentang khusus", "pick_date_range": "Pilih rentang tanggal", "pin_code_changed_successfully": "Berhasil mengubah kode PIN", - "pin_code_reset_successfully": "Berhasil mereset kode PIN", - "pin_code_setup_successfully": "Berhasil memasang kode PIN", + "pin_code_reset_successfully": "Berhasil mengatur ulang kode PIN", + "pin_code_setup_successfully": "Berhasil menyiapkan kode PIN", "pin_verification": "Verifikasi kode PIN", "place": "Tempat", "places": "Tempat", @@ -1741,7 +1751,7 @@ "play_original_video_setting_description": "Lebih menyukai memutar video asli daripada video yang telah dikonversi. Jika aset asli tidak kompatibel, video mungkin tidak dapat diputar dengan benar.", "play_transcoded_video": "Putar video yang telah dikonversi", "please_auth_to_access": "Silakan autentikasi untuk mengakses", - "port": "Porta", + "port": "Port", "preferences_settings_subtitle": "Kelola preferensi aplikasi", "preferences_settings_title": "Preferensi", "preparing": "Mempersiapkan", @@ -1759,23 +1769,23 @@ "profile_drawer_app_logs": "Log", "profile_drawer_client_server_up_to_date": "Klien dan server menjalankan versi terbaru", "profile_drawer_github": "GitHub", - "profile_drawer_readonly_mode": "Mode baca-saja aktif. Tekan lama ikon avatar pengguna untuk keluar.", + "profile_drawer_readonly_mode": "Mode hanya-baca aktif. Tekan lama ikon avatar pengguna untuk keluar.", "profile_image_of_user": "Foto profil dari {user}", "profile_picture_set": "Foto profil ditetapkan.", "public_album": "Album publik", - "public_share": "Pembagian Publik", + "public_share": "Berbagi Publik", "purchase_account_info": "Pendukung", "purchase_activated_subtitle": "Terima kasih telah mendukung Immich dan perangkat lunak sumber terbuka", - "purchase_activated_time": "Di aktivasi pada {date}", - "purchase_activated_title": "Kunci kamu telah sukses di aktivasi", + "purchase_activated_time": "Diaktifkan pada {date}", + "purchase_activated_title": "Kunci Anda berhasil diaktifkan", "purchase_button_activate": "Aktifkan", "purchase_button_buy": "Beli", "purchase_button_buy_immich": "Beli Immich", "purchase_button_never_show_again": "Jangan tampilkan lagi", - "purchase_button_reminder": "Ingatkan saya pada 30 hari lagi", + "purchase_button_reminder": "Ingatkan saya dalam 30 hari", "purchase_button_remove_key": "Hapus kunci", "purchase_button_select": "Pilih", - "purchase_failed_activation": "Gagal mengaktifkan! Silakan periksa email kamu untuk kunci produk yang benar!", + "purchase_failed_activation": "Gagal mengaktifkan! Silakan periksa email Anda untuk kunci produk yang benar!", "purchase_individual_description_1": "Untuk perorangan", "purchase_individual_description_2": "Status pendukung", "purchase_individual_title": "Perorangan", @@ -1783,31 +1793,30 @@ "purchase_license_subtitle": "Beli Immich untuk keberlangsungan pengembangan layanan", "purchase_lifetime_description": "Pembayaran seumur hidup", "purchase_option_title": "PILIHAN PEMBAYARAN", - "purchase_panel_info_1": "Membangun Immich membutuhkan banyak waktu dan upaya, dan kami memiliki insinyur penuh waktu yang bekerja untuk membuatnya sebaik mungkin. Misi kami adalah agar perangkat lunak sumber terbuka dan praktik bisnis yang beretika menjadi sumber pendapatan yang berkelanjutan bagi para pengembang dan menciptakan ekosistem yang menghargai privasi dengan alternatif nyata untuk layanan cloud yang eksploitatif.", + "purchase_panel_info_1": "Membangun Immich membutuhkan banyak waktu dan upaya, dan kami memiliki insinyur purnawaktu yang bekerja untuk membuatnya sebaik mungkin. Misi kami adalah agar perangkat lunak sumber terbuka dan praktik bisnis yang beretika menjadi sumber pendapatan yang berkelanjutan bagi para pengembang dan menciptakan ekosistem yang menghargai privasi dengan alternatif nyata untuk layanan cloud yang eksploitatif.", "purchase_panel_info_2": "Karena kami berkomitmen untuk tidak menambahkan batasan akses berbayar (paywall), pembelian ini tidak akan memberikan fitur tambahan apa pun di Immich. Kami mengandalkan dukungan dari pengguna seperti Anda untuk memastikan pengembangan Immich dapat terus berjalan.", "purchase_panel_title": "Dukung proyek ini", "purchase_per_server": "Per server", "purchase_per_user": "Per pengguna", "purchase_remove_product_key": "Hapus Kunci Produk", - "purchase_remove_product_key_prompt": "Apakah kamu yakin ingin menghapus kunci produk?", + "purchase_remove_product_key_prompt": "Ingin menghapus kunci produk?", "purchase_remove_server_product_key": "Hapus kunci produk Server", - "purchase_remove_server_product_key_prompt": "Apakah kamu yakin ingin menghapus kunci produk Server?", + "purchase_remove_server_product_key_prompt": "Ingin menghapus kunci produk Server?", "purchase_server_description_1": "Untuk keseluruhan server", "purchase_server_description_2": "Status pendukung", "purchase_server_title": "Server", "purchase_settings_server_activated": "Kunci produk server dikelola oleh admin", "query_asset_id": "ID Aset Kueri", - "queue_status": "Antrian {count}/{total}", - "rate_asset": "Menilai Aset", + "queue_status": "Antrean {count}/{total}", + "rate_asset": "Beri Peringkat Aset", "rating": "Peringkat bintang", "rating_clear": "Hapus peringkat", - "rating_count": "{count, plural, one {# peringkat} other {# peringkat}}", + "rating_count": "{count, plural, =0 {Belum diberi peringkat} one {# bintang} other {# bintang}}", "rating_description": "Tampilkan peringkat EXIF pada panel info", - "rating_set": "Mengatur nilai menjadi {rating, plural, one {# bintang} other {# bintang}}", "reaction_options": "Opsi reaksi", "read_changelog": "Baca Log Perubahan", - "readonly_mode_disabled": "Mode baca-saja dimatikan", - "readonly_mode_enabled": "Mode baca-saja diaktifkan", + "readonly_mode_disabled": "Mode hanya-baca dinonaktifkan", + "readonly_mode_enabled": "Mode hanya-baca diaktifkan", "ready_for_upload": "Siap untuk mengunggah", "reassign": "Tetapkan ulang", "reassigned_assets_to_existing_person": "Menetapkan ulang {count, plural, one {# aset} other {# aset}} kepada {name, select, null {orang yang sudah ada} other {{name}}}", @@ -1816,17 +1825,17 @@ "recent": "Terkini", "recent_albums": "Album terkini", "recent_searches": "Pencarian terkini", - "recently_added": "Barusaja ditambahkan", + "recently_added": "Baru saja ditambahkan", "recently_added_page_title": "Baru Ditambahkan", - "recently_taken": "Diambil terkini", - "recently_taken_page_title": "Diambil Terkini", + "recently_taken": "Baru diambil", + "recently_taken_page_title": "Baru Diambil", "refresh": "Segarkan", "refresh_encoded_videos": "Segarkan video terenkode", "refresh_faces": "Segarkan wajah", "refresh_metadata": "Segarkan metadata", "refresh_thumbnails": "Segarkan gambar kecil", "refreshed": "Disegarkan", - "refreshes_every_file": "Membaca ulang semua berkas yang sudah ada dan yang baru", + "refreshes_every_file": "Membaca ulang semua file yang sudah ada dan yang baru", "refreshing_encoded_video": "Menyegarkan video terenkode", "refreshing_faces": "Menyegarkan wajah", "refreshing_metadata": "Menyegarkan metadata", @@ -1835,47 +1844,50 @@ "remote_assets": "Aset Jarak Jauh", "remote_media_summary": "Ringkasan Media Jarak Jauh", "remove": "Hapus", - "remove_assets_album_confirmation": "Apakah Anda yakin ingin menghapus {count, plural, one {# aset} other {# aset}} dari album?", - "remove_assets_shared_link_confirmation": "Apakah Anda yakin ingin menghapus {count, plural, one {# aset} other {# aset}} dari tautan terbagi ini?", + "remove_assets_album_confirmation": "Yakin ingin menghapus {count, plural, one {# aset} other {# aset}} dari album?", + "remove_assets_shared_link_confirmation": "Yakin ingin menghapus {count, plural, one {# aset} other {# aset}} dari tautan bersama ini?", "remove_assets_title": "Hapus aset?", - "remove_custom_date_range": "Hapus jangka tanggal khusus", - "remove_deleted_assets": "Hapus Berkas Luring", + "remove_custom_date_range": "Hapus rentang tanggal khusus", + "remove_deleted_assets": "Bersihkan Aset yang Dihapus", "remove_from_album": "Hapus dari album", "remove_from_album_action_prompt": "{count} telah dihapus dari album", "remove_from_favorites": "Hapus dari favorit", "remove_from_lock_folder_action_prompt": "{count} telah dihapus dari folder terkunci", "remove_from_locked_folder": "Hapus dari folder terkunci", - "remove_from_locked_folder_confirmation": "Apakah Anda yakin ingin memindahkan foto dan video ini keluar dari folder terkunci? Setelah dipindahkan, item tersebut akan terlihat di pustaka Anda.", - "remove_from_shared_link": "Hapus dari tautan terbagi", + "remove_from_locked_folder_confirmation": "Yakin ingin memindahkan foto dan video ini keluar dari folder terkunci? Setelah dipindahkan, item tersebut akan terlihat di pustaka Anda.", + "remove_from_shared_link": "Hapus dari tautan bersama", "remove_memory": "Hapus kenangan", "remove_photo_from_memory": "Hapus foto dari kenangan ini", - "remove_tag": "Hapus Tanda", + "remove_tag": "Hapus tag", "remove_url": "Hapus URL", - "remove_user": "Keluarkan pengguna", + "remove_user": "Hapus 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_from_favorites_count": "{count, plural, other {# dihapus}} dari favorit", + "removed_memory": "Kenangan dihapus", + "removed_photo_from_memory": "Foto dihapus dari kenangan", "removed_tagged_assets": "Hapus tag dari {count, plural, one {# aset} other {# aset}}", "rename": "Ubah nama", "repair": "Perbaiki", - "repair_no_results_message": "Berkas yang tidak dilacak dan hilang akan muncul di sini", + "repair_no_results_message": "File yang tidak dilacak dan hilang akan muncul di sini", "replace_with_upload": "Ganti dengan unggahan", "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", + "require_password": "Memerlukan sandi", + "require_user_to_change_password_on_first_login": "Wajibkan pengguna untuk mengubah sandi pada log masuk pertama", "rescan": "Pindai ulang", "reset": "Atur ulang", - "reset_password": "Atur ulang kata sandi", + "reset_password": "Atur ulang sandi", "reset_people_visibility": "Atur ulang keterlihatan orang", - "reset_pin_code": "Reset kode PIN", - "reset_pin_code_description": "Jika Anda lupa kode PIN, Anda bisa menghubungi admin untuk atur ulang", - "reset_pin_code_success": "Berhasil atur ulang kode PIN", - "reset_pin_code_with_password": "Anda selalu dapat mengatur ulang kode PIN dengan kata sandi Anda", + "reset_pin_code": "Atur ulang kode PIN", + "reset_pin_code_description": "Jika Anda lupa kode PIN, Anda bisa menghubungi admin untuk mengatur ulang", + "reset_pin_code_success": "Berhasil mengatur ulang kode PIN", + "reset_pin_code_with_password": "Anda selalu dapat mengatur ulang kode PIN dengan sandi Anda", "reset_sqlite": "Atur ulang basis data SQLite", - "reset_sqlite_confirmation": "Apakah Anda yakin ingin mengatur ulang basis data SQLite? Setelah tindakan ini, Anda harus keluar lalu masuk kembali untuk melakukan sinkronisasi ulang data", + "reset_sqlite_clear_app_data": "Hapus Data", + "reset_sqlite_confirmation": "Yakin ingin menghapus data aplikasi? Ini akan menghapus semua pengaturan dan membuat Anda keluar.", + "reset_sqlite_confirmation_note": "Catatan: Anda wajib memulai ulang aplikasi ini setelah pembersihan.", + "reset_sqlite_done": "Data aplikasi telah dihapus. Mulai ulang Immich dan masuk kembali.", "reset_sqlite_success": "Berhasil mengatur ulang basis data SQLite", "reset_to_default": "Atur ulang ke bawaan", "resolution": "Resolusi", @@ -1883,16 +1895,16 @@ "resolved_all_duplicates": "Semua duplikat terselesaikan", "restore": "Pulihkan", "restore_all": "Pulihkan semua", - "restore_trash_action_prompt": "Sebanyak {count} item telah dipulihkan dari tempat sampah", + "restore_trash_action_prompt": "{count} item telah dipulihkan dari tempat sampah", "restore_user": "Pulihkan pengguna", "restored_asset": "Aset dipulihkan", "resume": "Lanjutkan", "resume_paused_jobs": "Lanjutkan {count, plural, one {# pekerjaan yang dijeda} other {# pekerjaan yang dijeda}}", "retry_upload": "Ulangi pengunggahan", - "review_duplicates": "Pratinjau duplikat", - "review_large_files": "Meninjau berkas berukuran besar", + "review_duplicates": "Tinjau duplikat", + "review_large_files": "Tinjau file berukuran besar", "role": "Peran", - "role_editor": "Penyunting", + "role_editor": "Editor", "role_viewer": "Penampil", "running": "Berjalan", "save": "Simpan", @@ -1903,6 +1915,7 @@ "saved_settings": "Pengaturan disimpan", "say_something": "Ucapkan sesuatu", "scaffold_body_error_occurred": "Terjadi kesalahan", + "scaffold_body_error_unrecoverable": "Terjadi kesalahan yang tidak dapat dipulihkan. Silakan bagikan kesalahan dan stack trace di Discord atau GitHub agar kami dapat membantu. Jika disarankan, Anda dapat menghapus data aplikasi di bawah ini.", "scan": "Pindai", "scan_all_libraries": "Pindai Semua Pustaka", "scan_library": "Pindai", @@ -1913,12 +1926,12 @@ "search_albums": "Cari album", "search_by_context": "Cari berdasarkan konteks", "search_by_description": "Cari berdasarkan deskripsi", - "search_by_description_example": "Hari mendaki di Sapa", - "search_by_filename": "Cari berdasarkan nama berkas atau ekstensi", + "search_by_description_example": "Mendaki Bromo", + "search_by_filename": "Cari berdasarkan nama file atau ekstensi", "search_by_filename_example": "mis. IMG_1234.JPG atau PNG", "search_by_ocr": "Cari dengan OCR", "search_by_ocr_example": "Latte", - "search_camera_lens_model": "Pencarian model lensa...", + "search_camera_lens_model": "Cari model lensa...", "search_camera_make": "Cari merek kamera...", "search_camera_model": "Cari model kamera...", "search_city": "Cari kota...", @@ -1926,7 +1939,7 @@ "search_filter_apply": "Terapkan filter", "search_filter_camera_title": "Pilih tipe kamera", "search_filter_date": "Tanggal", - "search_filter_date_interval": "{start} sampai dengan {end}", + "search_filter_date_interval": "{start} hingga {end}", "search_filter_date_title": "Pilih rentang tanggal", "search_filter_display_option_not_in_album": "Tidak dalam album", "search_filter_display_options": "Opsi tampilan", @@ -1938,23 +1951,24 @@ "search_filter_ocr": "Cari dengan OCR", "search_filter_people_title": "Pilih orang", "search_filter_star_rating": "Peringkat Bintang", + "search_filter_tags_title": "Pilih tag", "search_for": "Cari", "search_for_existing_person": "Cari orang yang sudah ada", - "search_no_more_result": "Tidak ada hasil lagi", + "search_no_more_result": "Tidak ada hasil lainnya", "search_no_people": "Tidak ada orang", "search_no_people_named": "Tidak ada orang bernama \"{name}\"", "search_no_result": "Tidak ada hasil yang ditemukan, coba kata kunci atau kombinasi lain", - "search_options": "Pilihan pencarian", + "search_options": "Opsi pencarian", "search_page_categories": "Kategori", "search_page_motion_photos": "Foto Bergerak", "search_page_no_objects": "Tidak Ada Info Objek", "search_page_no_places": "Tidak Ada Info Lokasi", "search_page_screenshots": "Tangkapan Layar", "search_page_search_photos_videos": "Cari foto dan video Anda", - "search_page_selfies": "Swafoto", + "search_page_selfies": "Selfi", "search_page_things": "Objek", "search_page_view_all_button": "Lihat semua", - "search_page_your_activity": "Aktivitasmu", + "search_page_your_activity": "Aktivitas Anda", "search_page_your_map": "Peta Anda", "search_people": "Cari orang", "search_places": "Cari tempat", @@ -1962,19 +1976,19 @@ "search_result_page_new_search_hint": "Pencarian Baru", "search_settings": "Pengaturan pencarian", "search_state": "Cari negara bagian...", - "search_suggestion_list_smart_search_hint_1": "Penelusuran cerdas aktif secara bawaan. Untuk menelusuri metadata, gunakan sintaks ", - "search_suggestion_list_smart_search_hint_2": "m:penelusuran-kamu", + "search_suggestion_list_smart_search_hint_1": "Penelusuran cerdas diaktifkan secara bawaan. Untuk menelusuri metadata, gunakan sintaks ", + "search_suggestion_list_smart_search_hint_2": "m:kata-yang-ingin-dicari", "search_tags": "Cari tag...", "search_timezone": "Cari zona waktu...", "search_type": "Jenis pencarian", "search_your_photos": "Cari foto Anda", - "searching_locales": "Mencari lokal...", + "searching_locales": "Mencari pelokalanâ€Ļ", "second": "Detik", "see_all_people": "Lihat semua orang", "select": "Pilih", "select_album": "Pilih album", - "select_album_cover": "Pilih kover album", - "select_albums": "Pilih album-album", + "select_album_cover": "Pilih sampul album", + "select_albums": "Pilih album", "select_all": "Pilih semua", "select_all_duplicates": "Pilih semua duplikat", "select_all_in": "Pilih semua di {group}", @@ -1982,14 +1996,14 @@ "select_count": "{count, plural, one {Pilih #} other {Pilih #}}", "select_cutoff_date": "Pilih tanggal batas", "select_face": "Pilih wajah", - "select_featured_photo": "Pilih foto terfitur", + "select_featured_photo": "Pilih foto unggulan", "select_from_computer": "Pilih dari komputer", "select_keep_all": "Pilih simpan semua", "select_library_owner": "Pilih pemilik pustaka", "select_new_face": "Pilih wajah baru", "select_people": "Pilih orang", "select_person": "Pilih orang", - "select_person_to_tag": "Pilih orang untuk ditandai", + "select_person_to_tag": "Pilih orang untuk diberi tag", "select_photos": "Pilih foto", "select_trash_all": "Pilih buang semua", "select_user_for_sharing_page_err_album": "Gagal membuat album", @@ -1997,43 +2011,46 @@ "selected_count": "{count, plural, other {# dipilih}}", "selected_gps_coordinates": "Koordinat GPS yang dipilih", "send_message": "Kirim pesan", - "send_welcome_email": "Kirim surel selamat datang", + "send_welcome_email": "Kirim email selamat datang", "server_endpoint": "Endpoint server", "server_info_box_app_version": "Versi App", "server_info_box_server_url": "URL Server", - "server_offline": "Server Luring", - "server_online": "Server Daring", + "server_offline": "Server Offline", + "server_online": "Server Online", "server_privacy": "Privasi server", - "server_restarting_description": "Laman ini akan dimuat ulang sesaat lagi.", + "server_restarting_description": "Halaman ini akan dimuat ulang sesaat lagi.", "server_restarting_title": "Server sedang dimulai ulang", "server_stats": "Statistik Server", "server_update_available": "Pembaruan server tersedia", "server_version": "Versi Server", "set": "Atur", - "set_as_album_cover": "Atur sebagai kover album", + "set_as_album_cover": "Tetapkan sebagai sampul album", "set_as_featured_photo": "Tetapkan sebagai foto unggulan", - "set_as_profile_picture": "Atur sebagai foto profil", - "set_date_of_birth": "Atur tanggal lahir", + "set_as_profile_picture": "Tetapkan sebagai foto profil", + "set_date_of_birth": "Tetapkan tanggal lahir", "set_profile_picture": "Tetapkan foto profil", - "set_slideshow_to_fullscreen": "Atur Salindia ke layar penuh", - "set_stack_primary_asset": "Atur sebagai aset utama", - "setting_image_viewer_help": "Penampil detail akan terlebih dahulu memuat gambar mini berukuran kecil, kemudian memuat pratinjau berukuran sedang (apabila diaktifkan), dan akhirnya memuat berkas asli (apabila diaktifkan).", + "set_slideshow_to_fullscreen": "Tetapkan Salindia ke layar penuh", + "set_stack_primary_asset": "Tetapkan sebagai aset utama", + "setting_image_navigation_enable_subtitle": "Jika diaktifkan, Anda dapat beralih ke gambar sebelumnya/berikutnya dengan mengetap pada seperempat bagian paling kiri/kanan layar.", + "setting_image_navigation_enable_title": "Ketuk untuk Menavigasi", + "setting_image_navigation_title": "Navigasi Gambar", + "setting_image_viewer_help": "Penampil detail akan terlebih dahulu memuat gambar mini berukuran kecil, kemudian memuat pratinjau berukuran sedang (jika diaktifkan), dan akhirnya memuat file asli (jika diaktifkan).", "setting_image_viewer_original_subtitle": "Aktifkan untuk memuat gambar asli dengan resolusi penuh (berukuran besar!). Nonaktifkan untuk mengurangi penggunaan data (baik jaringan maupun cache perangkat).", "setting_image_viewer_original_title": "Muat gambar kualitas asli", - "setting_image_viewer_preview_subtitle": "Aktifkan untuk memuat gambar dengan resolusi sedang. Nonaktifkan jika ingin langsung memuat gambar asli atau hanya ingin memuat thumbnail.", - "setting_image_viewer_preview_title": "Muat gambar preview", - "setting_image_viewer_title": "Foto", + "setting_image_viewer_preview_subtitle": "Aktifkan untuk memuat gambar dengan resolusi sedang. Nonaktifkan jika ingin langsung memuat gambar asli atau hanya ingin memuat gambar kecil.", + "setting_image_viewer_preview_title": "Muat gambar pratinjau", + "setting_image_viewer_title": "Gambar", "setting_languages_apply": "Terapkan", "setting_languages_subtitle": "Mengubah bahasa pada aplikasi", "setting_notifications_notify_failures_grace_period": "Beritahu kegagalan cadangan latar belakang: {duration}", "setting_notifications_notify_hours": "{count} jam", "setting_notifications_notify_immediately": "segera", "setting_notifications_notify_minutes": "{count} menit", - "setting_notifications_notify_never": "Jangan pernah", + "setting_notifications_notify_never": "jangan pernah", "setting_notifications_notify_seconds": "{count} detik", - "setting_notifications_single_progress_subtitle": "Rincian info proses unggah setiap asset", - "setting_notifications_single_progress_title": "Tampilkan rincian proses cadangkan latar belakang", - "setting_notifications_subtitle": "Atur setelan notifikasi", + "setting_notifications_single_progress_subtitle": "Detail info proses unggah tiap asset", + "setting_notifications_single_progress_title": "Tampilkan detail proses pencadangan latar belakang", + "setting_notifications_subtitle": "Atur pengaturan notifikasi", "setting_notifications_total_progress_subtitle": "Progres keseluruhan unggahan (selesai/total aset)", "setting_notifications_total_progress_title": "Tampilkan progres total pencadangan latar belakang", "setting_video_viewer_auto_play_subtitle": "Otomatis memutar video saat dibuka", @@ -2042,18 +2059,18 @@ "setting_video_viewer_original_video_subtitle": "Ketika melakukan streaming video dari server, sistem akan memutar versi asli meskipun tersedia hasil transkode. Pengaturan ini dapat menyebabkan terjadinya buffering. Video yang tersedia secara lokal akan selalu diputar dalam kualitas asli tanpa terpengaruh oleh pengaturan ini.", "setting_video_viewer_original_video_title": "Paksa video asli", "settings": "Pengaturan", - "settings_require_restart": "Harap mulai ulang Immich untuk menerapkan pengaturan ini", + "settings_require_restart": "Mulai ulang Immich untuk menerapkan pengaturan ini", "settings_saved": "Pengaturan disimpan", - "setup_pin_code": "Pasang kode PIN", + "setup_pin_code": "Siapkan kode PIN", "share": "Bagikan", - "share_action_prompt": "Sebanyak {count} aset telah dibagikan", + "share_action_prompt": "{count} aset bersama", "share_add_photos": "Tambah foto", "share_assets_selected": "{count} dipilih", "share_dialog_preparing": "Menyiapkan...", - "share_link": "Bagikan Link", + "share_link": "Bagikan Tautan", "shared": "Dibagikan", "shared_album_activities_input_disable": "Komentar dinonaktifkan", - "shared_album_activity_remove_content": "Apakah Anda ingin menghapus aktivitas ini?", + "shared_album_activity_remove_content": "Ingin menghapus aktivitas ini?", "shared_album_activity_remove_title": "Hapus Aktivitas", "shared_album_section_people_action_error": "Gagal menghapus dari album", "shared_album_section_people_action_leave": "Hapus pengguna dari album", @@ -2063,13 +2080,13 @@ "shared_by_user": "Dibagikan oleh {user}", "shared_by_you": "Dibagikan oleh Anda", "shared_from_partner": "Foto dari {partner}", - "shared_intent_upload_button_progress_text": "{current} / {total} Diunggah", - "shared_link_app_bar_title": "Link Berbagi", - "shared_link_clipboard_copied_massage": "Tersalin ke papan klip", - "shared_link_clipboard_text": "Tautan: {link}\nKata Sandi: {password}", - "shared_link_create_error": "Terjadi kesalahan saat membuat link berbagi", + "shared_intent_upload_button_progress_text": "{current}/{total} Diunggah", + "shared_link_app_bar_title": "Tautan Bersama", + "shared_link_clipboard_copied_massage": "Disalin ke papan klip", + "shared_link_clipboard_text": "Tautan: {link}\nSandi: {password}", + "shared_link_create_error": "Terjadi kesalahan saat membuat tautan bersama", "shared_link_custom_url_description": "Akses tautan bersama ini dengan URL khusus", - "shared_link_edit_description_hint": "Masukkan deskripsi link", + "shared_link_edit_description_hint": "Masukkan deskripsi berbagi", "shared_link_edit_expire_after_option_day": "1 hari", "shared_link_edit_expire_after_option_days": "{count} hari", "shared_link_edit_expire_after_option_hour": "1 jam", @@ -2078,9 +2095,9 @@ "shared_link_edit_expire_after_option_minutes": "{count} menit", "shared_link_edit_expire_after_option_months": "{count} bulan", "shared_link_edit_expire_after_option_year": "{count} tahun", - "shared_link_edit_password_hint": "Masukkan sandi link", - "shared_link_edit_submit_button": "Perbarui link", - "shared_link_error_server_url_fetch": "Tidak dapat memuat url server", + "shared_link_edit_password_hint": "Masukkan sandi tautan", + "shared_link_edit_submit_button": "Perbarui tautan", + "shared_link_error_server_url_fetch": "Tidak dapat mengambil URL server", "shared_link_expires_day": "Kedaluwarsa dalam {count} hari", "shared_link_expires_days": "Kedaluwarsa dalam {count} hari", "shared_link_expires_hour": "Kedaluwarsa dalam {count} jam", @@ -2092,28 +2109,28 @@ "shared_link_expires_seconds": "Kedaluwarsa dalam {count} detik", "shared_link_individual_shared": "Dibagikan secara individual", "shared_link_info_chip_metadata": "EXIF", - "shared_link_manage_links": "Atur link berbagi", - "shared_link_options": "Pilihan tautan bersama", - "shared_link_password_description": "Wajibkan kata sandi untuk mengakses tautan bersama ini", - "shared_links": "Tautan terbagi", + "shared_link_manage_links": "Kelola Tautan bersama", + "shared_link_options": "Opsi tautan bersama", + "shared_link_password_description": "Wajibkan sandi untuk mengakses tautan bersama ini", + "shared_links": "Tautan bersama", "shared_links_description": "Bagikan foto dan video dengan tautan", - "shared_photos_and_videos_count": "{assetCount, plural, other {# foto & video terbagi.}}", + "shared_photos_and_videos_count": "{assetCount, plural, other {# foto & video bersama.}}", "shared_with_me": "Dibagikan kepada saya", "shared_with_partner": "Dibagikan dengan {partner}", - "sharing": "Pembagian", - "sharing_enter_password": "Masukkan kata sandi untuk membuka tautan halaman ini.", - "sharing_page_album": "Album berbagi", - "sharing_page_description": "Buat album berbagi untuk berbagi foto dan video dengan pengguna di dalam jaringan.", + "sharing": "Berbagi", + "sharing_enter_password": "Masukkan sandi untuk membuka tautan halaman ini.", + "sharing_page_album": "Album bersama", + "sharing_page_description": "Buat album bersama untuk berbagi foto dan video dengan pengguna di dalam jaringan.", "sharing_page_empty_list": "DAFTAR KOSONG", - "sharing_sidebar_description": "Tampilkan tautan ke Pembagian dalam bilah samping", - "sharing_silver_appbar_create_shared_album": "Buat album berbagi", + "sharing_sidebar_description": "Tampilkan tautan ke Berbagi di bilah samping", + "sharing_silver_appbar_create_shared_album": "Buat album bersama", "sharing_silver_appbar_share_partner": "Berbagi dengan partner", "shift_to_permanent_delete": "tekan ⇧ untuk menghapus aset secara permanen", "show_album_options": "Tampilkan opsi album", "show_albums": "Tampilkan album", "show_all_people": "Tampilkan semua orang", "show_and_hide_people": "Tampilkan & sembunyikan orang", - "show_file_location": "Tampilkan lokasi berkas", + "show_file_location": "Tampilkan lokasi file", "show_gallery": "Tampilkan galeri", "show_hidden_people": "Tampilkan orang tersembunyi", "show_in_timeline": "Tampilkan dalam lini masa", @@ -2121,16 +2138,16 @@ "show_keyboard_shortcuts": "Tampilkan pintasan papan ketik", "show_metadata": "Tampilkan metadata", "show_or_hide_info": "Tampilkan atau sembunyikan info", - "show_password": "Tampilkan kata sandi", + "show_password": "Tampilkan sandi", "show_person_options": "Tampilkan opsi orang", "show_progress_bar": "Tampilkan Bilah Progres", "show_schema": "Tampilkan skema", "show_search_options": "Tampilkan opsi pencarian", - "show_shared_links": "Tampilkan tautan terbagi", + "show_shared_links": "Tampilkan tautan bersama", "show_slideshow_transition": "Tampilkan transisi salindia", - "show_supporter_badge": "Lencana suporter", - "show_supporter_badge_description": "Tampilkan lencana suporter", - "show_text_recognition": "Tampilkan teks rekognisi", + "show_supporter_badge": "Lencana pendukung", + "show_supporter_badge_description": "Tampilkan lencana pendukung", + "show_text_recognition": "Tampilkan teks yang dikenali", "show_text_search_menu": "Tampilkan menu pencarian teks", "shuffle": "Acak", "sidebar": "Bilah sisi", @@ -2139,11 +2156,11 @@ "sign_up": "Daftar", "size": "Ukuran", "skip_to_content": "Lewati ke konten", - "skip_to_folders": "Lewati ke berkas", + "skip_to_folders": "Lewati ke folder", "skip_to_tags": "Lewati ke tag", "slideshow": "Salindia", - "slideshow_repeat": "Ulangi slideshow", - "slideshow_repeat_description": "Ulangi dari awal saat slideshow berakhir", + "slideshow_repeat": "Ulangi salindia", + "slideshow_repeat_description": "Ulangi dari awal saat salindia berakhir", "slideshow_settings": "Pengaturan salindia", "sort_albums_by": "Urutkan album berdasarkan...", "sort_created": "Tanggal dibuat", @@ -2157,8 +2174,8 @@ "source": "Sumber", "stack": "Tumpukan", "stack_action_prompt": "{count} tumpukan", - "stack_duplicates": "Stack duplikat", - "stack_select_one_photo": "Pilih satu foto utama untuk stack", + "stack_duplicates": "Tumpukan duplikat", + "stack_select_one_photo": "Pilih satu foto utama untuk tumpukan", "stack_selected_photos": "Tumpuk foto terpilih", "stacked_assets_count": "{count, plural, one {# aset} other {# aset}} ditumpuk", "stacktrace": "Jejak tumpukan", @@ -2183,27 +2200,28 @@ "support": "Dukungan", "support_and_feedback": "Dukungan & Masukan", "support_third_party_description": "Pemasangan Immich Anda telah dipaketkan oleh pihak ketiga. Masalah yang Anda alami dapat disebabkan oleh paket tersebut, jadi silakan ajukan isu dengan masalah tersebut menggunakan tautan di bawah.", + "supporter": "Pendukung", "swap_merge_direction": "Ganti arah penggabungan", - "sync": "Sinkronisasikan", + "sync": "Sinkronkan", "sync_albums": "Sinkronkan album", - "sync_albums_manual_subtitle": "Melakukan sinkronisasi semua video dan foto yang telah diunggah ke album cadangan yang dipilih", - "sync_local": "Sinkronkan lokal", - "sync_remote": "Sinkronkan jarak jauh", + "sync_albums_manual_subtitle": "Sinkronkan semua video dan foto yang telah diunggah ke album cadangan yang dipilih", + "sync_local": "Sinkronkan Lokal", + "sync_remote": "Sinkronkan Jarak Jauh", "sync_status": "Status Sinkronisasi", - "sync_status_subtitle": "Lihat dan atur sistem sinkronisasi", - "sync_upload_album_setting_subtitle": "Membuat dan mengunggah foto serta video Anda ke album yang telah dipilih pada Immich", - "tag": "Label", + "sync_status_subtitle": "Lihat dan kelola sistem sinkronisasi", + "sync_upload_album_setting_subtitle": "Buat dan unggah foto serta video Anda ke album yang telah dipilih pada Immich", + "tag": "Tag", "tag_assets": "Tag aset", - "tag_created": "Tag yang di buat: {tag}", - "tag_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan topik tag logis", + "tag_created": "Tag yang dibuat: {tag}", + "tag_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan topik tag yang logis", "tag_not_found_question": "Tidak dapat menemukan tag? Buat tag baru.", - "tag_people": "Tandai Orang", + "tag_people": "Beri Tag Orang", "tag_updated": "Tag yang diperbarui: {tag}", - "tagged_assets": "Ditandai {count, plural, one {# aset} other {# aset}}", + "tagged_assets": "{count, plural, one {# aset} other {# aset}} diberi tag", "tags": "Tag", "tap_to_run_job": "Ketuk untuk menjalankan pekerjaan", "template": "Templat", - "text_recognition": "Teks rekognisi", + "text_recognition": "Pengenalan teks", "theme": "Tema", "theme_selection": "Pemilihan tema", "theme_selection_description": "Tetapkan tema ke terang atau gelap secara otomatis berdasarkan preferensi sistem peramban Anda", @@ -2211,14 +2229,14 @@ "theme_setting_asset_list_tiles_per_row_title": "Jumlah aset per baris ({count})", "theme_setting_colorful_interface_subtitle": "Menerapkan warna utama ke permukaan latar belakang.", "theme_setting_colorful_interface_title": "Antarmuka berwarna-warni", - "theme_setting_image_viewer_quality_subtitle": "Atur kualitas dari penampil gambar", + "theme_setting_image_viewer_quality_subtitle": "Sesuaikan kualitas dari penampil gambar", "theme_setting_image_viewer_quality_title": "Kualitas penampil gambar", - "theme_setting_primary_color_subtitle": "Pilihlah warna yang akan digunakan untuk tindakan utama dan elemen aksen.", + "theme_setting_primary_color_subtitle": "Pilih warna yang akan digunakan untuk tindakan utama dan elemen aksen.", "theme_setting_primary_color_title": "Warna utama", "theme_setting_system_primary_color_title": "Gunakan warna sistem", "theme_setting_system_theme_switch": "Otomatis (Ikuti pengaturan sistem)", - "theme_setting_theme_subtitle": "Pilih setelan tema aplikasi", - "theme_setting_three_stage_loading_subtitle": "Pemuatan tiga tahap dapat meningkatkan performa pemuatan, namun akan menyebabkan beban jaringan meningkat secara signifikan", + "theme_setting_theme_subtitle": "Pilih pengaturan tema aplikasi", + "theme_setting_three_stage_loading_subtitle": "Pemuatan tiga tahap dapat meningkatkan kinerja pemuatan, namun akan menyebabkan beban jaringan meningkat secara signifikan", "theme_setting_three_stage_loading_title": "Aktifkan pemuatan tiga tahap", "then": "Lalu", "they_will_be_merged_together": "Mereka akan digabungkan bersama", @@ -2226,29 +2244,29 @@ "time": "Waktu", "time_based_memories": "Kenangan berbasis waktu", "time_based_memories_duration": "Jumlah detik untuk menampilkan tiap gambar.", - "timeline": "Lini masa", - "timezone": "Zona waktu", + "timeline": "Linimasa", + "timezone": "Zona Waktu", "to_archive": "Arsipkan", - "to_change_password": "Ubah kata sandi", + "to_change_password": "Ubah sandi", "to_favorite": "Favorit", "to_login": "Log masuk", - "to_multi_select": "untuk memilih beberapa", + "to_multi_select": "untuk memilih beberapa sekaligus", "to_parent": "Ke induk", "to_select": "untuk memilih", "to_trash": "Sampah", - "toggle_settings": "Saklar pengaturan", - "toggle_theme_description": "Sakelar tema", + "toggle_settings": "Alihkan pengaturan", + "toggle_theme_description": "Alihkan tema", "total": "Jumlah", "total_usage": "Jumlah penggunaan", "trash": "Sampah", - "trash_action_prompt": "Sebanyak {count} item telah dipindahkan ke tempat sampah", + "trash_action_prompt": "{count} item telah dipindahkan ke tempat sampah", "trash_all": "Buang Semua", "trash_count": "Sampah {count, number}", "trash_delete_asset": "Hapus Aset", "trash_emptied": "Tempat sampah telah dikosongkan", "trash_no_results_message": "Foto dan video di sampah akan muncul di sini.", "trash_page_delete_all": "Hapus Semua", - "trash_page_empty_trash_dialog_content": "Apakah kamu ingin menghapus semua aset di sampah? Item tersebut akan dihapus secara permanen dari Immich", + "trash_page_empty_trash_dialog_content": "Ingin menghapus semua aset di sampah? Item tersebut akan dihapus secara permanen dari Immich", "trash_page_info": "Item yang dipindahkan ke sampah akan terhapus secara permanen setelah {days} hari", "trash_page_no_assets": "Tidak ada aset di sampah", "trash_page_restore_all": "Pulihkan Semua", @@ -2256,81 +2274,84 @@ "trash_page_title": "Sampah ({count})", "trashed_items_will_be_permanently_deleted_after": "Item yang dibuang akan dihapus secara permanen setelah {days, plural, one {# hari} other {# hari}}.", "trigger": "Pemicu", - "trigger_asset_uploaded": "Asset telah terunggah", - "trigger_asset_uploaded_description": "Terpicu saat aset baru telah terunggah", + "trigger_asset_uploaded": "Aset Diunggah", + "trigger_asset_uploaded_description": "Terpicu saat aset baru telah diunggah", "trigger_description": "Sebuah peristiwa yang memicu alur kerja", - "trigger_person_recognized": "Orang telah dikenali", + "trigger_person_recognized": "Orang Dikenali", "trigger_person_recognized_description": "Terpicu saat seseorang terdeteksi", "trigger_type": "Tipe pemicu", "troubleshoot": "Pemecahan Masalah", "type": "Jenis", "unable_to_change_pin_code": "Tidak dapat mengubah kode PIN", "unable_to_check_version": "Tidak dapat memeriksa versi aplikasi atau server", - "unable_to_setup_pin_code": "Tidak dapat memasang kode PIN", + "unable_to_setup_pin_code": "Tidak dapat menyiapkan kode PIN", "unarchive": "Keluarkan dari arsip", - "unarchive_action_prompt": "Sebanyak {count} item telah dihapus dari Arsip", + "unarchive_action_prompt": "{count} item telah dipindahkan dari Arsip", "unarchived_count": "{count, plural, other {# dipindahkan dari arsip}}", "undo": "Urungkan", "unfavorite": "Hapus favorit", - "unfavorite_action_prompt": "Sebanyak {count} item telah dihapus dari Favorit", + "unfavorite_action_prompt": "{count} item telah dihapus dari Favorit", "unhide_person": "Munculkan orang", "unknown": "Tidak diketahui", "unknown_country": "Negara Tidak Diketahui", "unknown_date": "Tanggal tidak diketahui", "unknown_year": "Tahun Tidak Diketahui", "unlimited": "Tidak terbatas", - "unlink_motion_video": "Membatalkan tautan video gerak", + "unlink_motion_video": "Hapus 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", + "unnamed_album_delete_confirmation": "Yakin akan menghapus album ini?", + "unnamed_share": "Berbagi Tanpa Nama", "unsaved_change": "Perubahan belum disimpan", "unselect_all": "Batalkan semua pilihan", - "unselect_all_duplicates": "Batal pilih semua duplikat", - "unselect_all_in": "Membatalkan semua pilihan dalam {group}", + "unselect_all_duplicates": "Batalkan pilihan semua duplikat", + "unselect_all_in": "Batalkan semua pilihan dalam {group}", "unstack": "Batalkan penumpukan", - "unstack_action_prompt": "{count} Tidak dalam tumpukan", + "unstack_action_prompt": "{count} tidak dalam tumpukan", "unstacked_assets_count": "Penumpukan {count, plural, one {# aset} other {# aset}} dibatalkan", "unsupported_field_type": "Tipe bidang tidak didukung", - "untagged": "Tidak ditandai", + "unsupported_file_type": "File {file} tidak dapat diunggah karena jenis file {type} tidak didukung.", + "untagged": "Tag Dihapus", "untitled_workflow": "Alur kerja tak berjudul", "up_next": "Berikutnya", "update_location_action_prompt": "Perbarui lokasi {count} aset yang dipilih dengan:", "updated_at": "Diperbarui", - "updated_password": "Kata sandi diperbarui", + "updated_password": "Sandi diperbarui", "upload": "Unggah", "upload_concurrency": "Konkurensi pengunggahan", - "upload_details": "Detil unggahan", - "upload_dialog_info": "Apakah akan mencadangkan aset terpilih ke server?", + "upload_details": "Detail Unggahan", + "upload_dialog_info": "Ingin mencadangkan aset terpilih ke server?", "upload_dialog_title": "Unggah Aset", "upload_error_with_count": "Kesalahan unggah untuk {count, plural, one {# aset} other {# aset}}", - "upload_errors": "Unggahan selesai dengan {count, plural, one {# eror} other {# eror}}, muat ulang laman untuk melihat aset terunggah baru.", - "upload_finished": "Unggahan berhasil", - "upload_progress": "Tersisa {remaining, number} - Di proses {processed, number}/{total, number}", + "upload_errors": "Unggahan selesai dengan {count, plural, one {# kesalahan} other {# kesalahan}}, muat ulang halaman untuk melihat aset terunggah yang baru.", + "upload_finished": "Unggahan selesai", + "upload_progress": "Tersisa {remaining, number} - Diproses {processed, number}/{total, number}", "upload_skipped_duplicates": "Melewati {count, plural, one {# aset duplikat} other {# aset duplikat}}", "upload_status_duplicates": "Duplikat", - "upload_status_errors": "Eror", + "upload_status_errors": "Kesalahan", "upload_status_uploaded": "Diunggah", - "upload_success": "Pengunggahan berhasil, muat ulang laman untuk melihat aset terunggah yang baru.", + "upload_success": "Pengunggahan berhasil, muat ulang halaman untuk melihat aset terunggah yang baru.", "upload_to_immich": "Unggah ke Immich ({count})", "uploading": "Mengunggah", "uploading_media": "Mengunggah media", "url": "URL", "usage": "Penggunaan", "use_biometric": "Gunakan biometrik", + "use_browser_locale": "Gunakan pelokalan browser", + "use_browser_locale_description": "Format tanggal, waktu, dan angka berdasarkan pelokalan browser Anda", "use_current_connection": "Gunakan koneksi saat ini", - "use_custom_date_range": "Gunakan jangka tanggal khusus saja", + "use_custom_date_range": "Gunakan rentang tanggal khusus saja", "user": "Pengguna", "user_has_been_deleted": "Pengguna ini telah dihapus.", "user_id": "ID Pengguna", - "user_liked": "{user} menyukai {type, select, photo {foto ini} video {tayangan ini} asset {aset ini} other {ini}}", + "user_liked": "{user} menyukai {type, select, photo {foto ini} video {video ini} asset {aset ini} other {ini}}", "user_pin_code_settings": "Kode PIN", - "user_pin_code_settings_description": "Atur kode PIN Anda", - "user_privacy": "Kerahasiaan pengguna", + "user_pin_code_settings_description": "Kelola kode PIN Anda", + "user_privacy": "Privasi Pengguna", "user_purchase_settings": "Pembelian", - "user_purchase_settings_description": "Atur pembelian kamu", + "user_purchase_settings_description": "Kelola pembelian Anda", "user_role_set": "Tetapkan {user} sebagai {role}", "user_usage_detail": "Detail penggunaan pengguna", "user_usage_stats": "Statistik penggunaan akun", @@ -2350,7 +2371,7 @@ "version_history_item": "Terpasang {version} pada {date}", "video": "Video", "video_hover_setting": "Putar gambar kecil video saat kursor di atas", - "video_hover_setting_description": "Putar gambar kecil video ketika tetikus berada di atas item. Bahkan saat dinonaktifkan, pemutaran dapat dimulai dengan mengambang di atas ikon putar.", + "video_hover_setting_description": "Putar gambar kecil video ketika kursor berada di atas item. Bahkan saat dinonaktifkan, pemutaran dapat dimulai dengan mengarahkan kursor di atas ikon putar.", "videos": "Video", "videos_count": "{count, plural, one {# Video} other {# Video}}", "videos_only": "Hanya video", @@ -2358,8 +2379,8 @@ "view_album": "Tampilkan Album", "view_all": "Tampilkan Semua", "view_all_users": "Tampilkan semua pengguna", - "view_asset_owners": "Lihat pemilik asset", - "view_details": "Tampilkan detil", + "view_asset_owners": "Tampilkan pemilik asset", + "view_details": "Tampilkan Detail", "view_in_timeline": "Lihat di timeline", "view_link": "Tampilkan tautan", "view_links": "Tampilkan tautan", @@ -2375,7 +2396,7 @@ "viewer_unstack": "Lepas tumpukan", "visibility_changed": "Keterlihatan diubah untuk {count, plural, one {# orang} other {# orang}}", "visual": "Visual", - "visual_builder": "Pembuat visual", + "visual_builder": "Pembangun visual", "waiting": "Menunggu", "waiting_count": "Menunggu: {count}", "warning": "Peringatan", @@ -2384,24 +2405,24 @@ "welcome_to_immich": "Selamat datang di Immich", "width": "Lebar", "wifi_name": "Nama Wi-Fi", - "workflow_delete_prompt": "Apakah anda yakin ingin menghapus alur kerja ini?", + "workflow_delete_prompt": "Yakin ingin menghapus alur kerja ini?", "workflow_deleted": "Alur kerja telah dihapus", "workflow_description": "Deskripsi alur kerja", "workflow_info": "Informasi alur kerja", "workflow_json": "JSON alur kerja", - "workflow_json_help": "Ubah konfigurasi alur kerja dengan format JSON. Perubahan akan disinkronisasikan ke pembuat visual.", + "workflow_json_help": "Ubah konfigurasi alur kerja dengan format JSON. Perubahan akan disinkronisasikan ke pembangun visual.", "workflow_name": "Nama alur kerja", - "workflow_navigation_prompt": "Apakah anda yakin ingin keluar tanpa menyimpan perubahan anda?", + "workflow_navigation_prompt": "Yakin ingin keluar tanpa menyimpan perubahan Anda?", "workflow_summary": "Ringkasan alur kerja", "workflow_update_success": "Alur kerja berhasil diubah", "workflow_updated": "Alur kerja diubah", "workflows": "Alur kerja", - "workflows_help_text": "Alur kerja untuk otomasi kegiatan pada aset anda sesuai dengan pemicu dan filter", + "workflows_help_text": "Alur kerja untuk otomasi kegiatan pada aset Anda sesuai dengan pemicu dan filter", "wrong_pin_code": "Kode PIN salah", "year": "Tahun", - "years_ago": "{years, plural, one {# tahun} other {# tahun}} yang lalu", + "years_ago": "{years, plural, one {# tahun} other {# tahun}} lalu", "yes": "Ya", - "you_dont_have_any_shared_links": "Anda tidak memiliki tautan terbagi", + "you_dont_have_any_shared_links": "Anda tidak memiliki tautan bersama", "your_wifi_name": "Nama Wi-Fi Anda", "zero_to_clear_rating": "tekan 0 untuk menghapus penilaian pada aset", "zoom_image": "Perbesar Gambar", diff --git a/i18n/it.json b/i18n/it.json index e9cc787096..75e230654b 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "copia offsite nel cloud o in un'altra sede fisica.", "backup_onboarding_2_description": "copie locali su diversi dispositivi. CiÃ˛ include i file principali e un backup di tali file a livello locale.", "backup_onboarding_3_description": "copie totali dei tuoi dati, compresi i file originali. CiÃ˛ include 1 copia offsite e 2 copie locali.", - "backup_onboarding_description": "Per proteggere i tuoi dati, è consigliato adottare una strategia di backup 3-2-1. Per una soluzione di backup completa, è consigliato conservare copie delle foto/video caricati e del database Immich.", + "backup_onboarding_description": "Per proteggere i dati, è raccomandata una strategia di backup 3-2-1 . Per una soluzione di backup completa, è consigliabile conservare copia delle foto/video caricati e del database Immich.", "backup_onboarding_footer": "Per ulteriori informazioni sul backup di Immich, consulta la documentazione.", "backup_onboarding_parts_title": "Un backup 3-2-1 include:", "backup_onboarding_title": "Backup", @@ -104,7 +104,7 @@ "image_preview_description": "Immagine a media dimensione senza metadati, utilizzata durante la visualizzazione di una singola risorsa e per il machine learning", "image_preview_quality_description": "Qualità dell'anteprima da 1 a 100. PiÚ alto è meglio ma produce file piÚ pesanti e puÃ˛ ridurre la reattività dell'app. Impostare un valore basso puÃ˛ influenzare negativamente la qualità del machine learning.", "image_preview_title": "Impostazioni dell'anteprima", - "image_progressive": "Progressiva", + "image_progressive": "Progressivo", "image_progressive_description": "Codifica progressivamente le immagini JPEG per mostrarle con un caricamento graduale. Questo non ha effetto sulle immagini WebP.", "image_quality": "Qualità", "image_resolution": "Risoluzione", @@ -351,7 +351,7 @@ "template_settings": "Templates Notifiche", "template_settings_description": "Gestisci i modelli personalizzati per le notifiche", "theme_custom_css_settings": "CSS Personalizzato", - "theme_custom_css_settings_description": "I Cascading Style Sheets (CSS) permettono di personalizzare l'interfaccia di Immich.", + "theme_custom_css_settings_description": "I fogli di stile CSS consentono di personalizzare il design di Immich.", "theme_settings": "Impostazioni Tema", "theme_settings_description": "Gestisci la personalizzazione dell'interfaccia web di Immich", "thumbnail_generation_job": "Genera Anteprime", @@ -372,7 +372,7 @@ "transcoding_audio_codec": "Codifica Audio", "transcoding_audio_codec_description": "Opus è l'opzione con la qualità piÚ alta, ma è meno compatibile con dispositivi o software vecchi.", "transcoding_bitrate_description": "Video con bitrate superiore al massimo o in formato non accettato", - "transcoding_codecs_learn_more": "Per saperne di piÚ sulla terminologia utilizzata, fai riferimento alla documentazione di FFmpeg su codec H.264, codec HEVC e codec VP9.", + "transcoding_codecs_learn_more": "Per maggiori informazioni sulla terminologia qui utilizzata, fare riferimento alla documentazione di FFmpeg per codec H.264, codec HEVC e codec VP9.", "transcoding_constant_quality_mode": "Modalità qualità costante", "transcoding_constant_quality_mode_description": "iCQ è migliore di CQP, perÃ˛ alcuni dispositivi di accelerazione hardware non supportano questa modalità. Impostando questa opzione l'applicazione preferirà il modo specificato quando è in uso la codifica quality-based. Ignorato da NVENC perchÊ non supporta ICQ.", "transcoding_constant_rate_factor": "Fattore di rateo costante (-crf)", @@ -395,7 +395,7 @@ "transcoding_policy_description": "Imposta quando un video sarà transcodificato", "transcoding_preferred_hardware_device": "Dispositivo hardware preferito", "transcoding_preferred_hardware_device_description": "Si applica solo a VAAPI e QSV. Imposta il nodo DRI utilizzato per la transcodifica hardware.", - "transcoding_preset_preset": "Preset (-preset)", + "transcoding_preset_preset": "Preimpostazione (-preset)", "transcoding_preset_preset_description": "Velocità di compressione. Preset piÚ lenti producono file piÚ piccoli e aumentano la qualità quando viene impostato un certo bitrate. VP9 ignora velocità superiori a `faster`.", "transcoding_reference_frames": "Frame di riferimento", "transcoding_reference_frames_description": "Il numero di frame da prendere in considerazione nel comprimere un determinato frame. Valori piÚ alti migliorano l'efficienza di compressione, ma rallentano la codifica. 0 imposta questo valore automaticamente.", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mappatura della tonalità", "transcoding_tone_mapping_description": "Tenta di preservare l'aspetto dei video HDR quando convertiti in SDR. Ciascun algoritmo fa diversi compromessi per colore, dettaglio e luminosità. Hable conserva il dettaglio, Mobius conserva il colore e Reinhard conserva la luminosità.", "transcoding_transcode_policy": "Politica di transcodifica", - "transcoding_transcode_policy_description": "Politica che determina quando un video deve essere transcodificato. I video HDR verranno sempre transcodificati (eccetto quando la transcodifica è disabilitata).", + "transcoding_transcode_policy_description": "Regola che determina se un video deve essere transcodificato. I video HDR e quelli che hanno un formato pixel diverso da YUV 4:2:0, saranno sempre transcodificati (sempre che la transcodifica sia abilitata).", "transcoding_two_pass_encoding": "Codifica a due passaggi", "transcoding_two_pass_encoding_setting_description": "Transcodifica in due passaggi per produrre video codificati migliori. Quando il bitrate massimo è abilitato (necessario affinchÊ funzioni con H.264 e HEVC), questa modalità utilizza un intervallo di bitrate basato sul bitrate massimo e ignora CRF. Per VP9, CRF puÃ˛ essere utilizzato se il bitrate massimo è disabilitato.", "transcoding_video_codec": "Codec video", @@ -526,7 +526,7 @@ "allowed": "Consentito", "alt_text_qr_code": "Immagine QR", "always_keep": "Mantieni sempre", - "always_keep_photos_hint": "Libera Spazio mantiene tutte le foto su questo dispositivo.", + "always_keep_photos_hint": "Liberare spazio manterrà tutte le foto su questo dispositivo.", "always_keep_videos_hint": "Libera Spazio mantiene tutti i video su questo dispositivo.", "anti_clockwise": "Senso anti-orario", "api_key": "Chiave API", @@ -539,7 +539,7 @@ "app_bar_signout_dialog_title": "Disconnetti", "app_download_links": "Link per il download dell'app", "app_settings": "Impostazioni Applicazione", - "app_stores": "App Stores", + "app_stores": "App Store", "app_update_available": "Aggiornamento App disponibile", "appears_in": "Compare in", "apply_count": "Applica ({count, number})", @@ -872,7 +872,7 @@ "current_server_address": "Indirizzo del server in uso", "custom_date": "Data specifica", "custom_locale": "Localizzazione personalizzata", - "custom_locale_description": "Formatta data e numeri in base alla lingua e al paese", + "custom_locale_description": "Formatta date e numeri in base alla lingua e al paese selezionati", "custom_url": "URL personalizzato", "cutoff_date_description": "Mantieni le foto fino alâ€Ļ", "cutoff_day": "{count, plural, one {giorno} other {giorni}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Numero di dati EXIF", "deduplication_info": "Informazioni di deduplicazione", "deduplication_info_description": "Per preselezionare automaticamente le risorse e rimuovere i duplicati in massa, verifichiamo:", - "default_locale": "Localizzazione preimpostata", - "default_locale_description": "Formatta la data e i numeri in base alle impostazioni del tuo browser", "delete": "Elimina", "delete_action_confirmation_message": "Vuoi davvero eliminare questa risorsa? Questa azione sposterà la risorsa nel cestino del server e ti chiederà se desideri eliminarla dal dispositivo", "delete_action_prompt": "{count} elementi eliminati", @@ -1074,6 +1072,7 @@ "failed_to_update_notification_status": "Aggiornamento stato notifiche fallito", "incorrect_email_or_password": "Email o password non corretta", "library_folder_already_exists": "Questo path di importazione esiste già.", + "page_not_found": "Impossibile trovare la pagina", "paths_validation_failed": "{paths, plural, one {# percorso} other {# percorsi}} hanno fallito la validazione", "profile_picture_transparent_pixels": "Le foto profilo non possono avere pixel trasparenti. Riprova ingrandendo e/o muovendo l'immagine.", "quota_higher_than_disk_size": "Hai impostato un limite piÚ alto della dimensione del disco", @@ -1218,6 +1217,7 @@ "filter_description": "Condizioni per filtrare le risorse obiettivo", "filter_people": "Filtra persone", "filter_places": "Filtra luoghi", + "filter_tags": "Filtra tag", "filters": "Filtri", "find_them_fast": "Trovale velocemente con la ricerca", "first": "Primo", @@ -1441,7 +1441,7 @@ "login_password_changed_success": "Password aggiornata con successo", "logout_all_device_confirmation": "Sei sicuro di volerti disconnettere da tutti i dispositivi?", "logout_this_device_confirmation": "Sei sicuro di volerti disconnettere da questo dispositivo?", - "logs": "Logs", + "logs": "Registri", "longitude": "Longitudine", "look": "Guarda", "loop_videos": "Riproduci video in loop", @@ -1649,6 +1649,7 @@ "only_favorites": "Solo preferiti", "open": "Apri", "open_calendar": "Apri il calendario", + "open_in_browser": "Apri con il browser", "open_in_map_view": "Apri nella visualizzazione mappa", "open_in_openstreetmap": "Apri su OpenStreetMap", "open_the_search_filters": "Apri filtri di ricerca", @@ -1808,9 +1809,8 @@ "rate_asset": "Valuta la risorsa", "rating": "Valutazione a stelle", "rating_clear": "Azzera valutazione", - "rating_count": "{count, plural, one {# stella} other {# stelle}}", + "rating_count": "{count, plural, =0 {Senza valutazione} one {# star} other {# stars}}", "rating_description": "Visualizza la valutazione EXIF nel pannello informazioni", - "rating_set": "Valutazione impostata a {rating, plural, one {# stella} other {# stelle}}", "reaction_options": "Impostazioni Reazioni", "read_changelog": "Leggi Riepilogo Modifiche", "readonly_mode_disabled": "Modalità di sola lettura disabilitata", @@ -1882,7 +1882,10 @@ "reset_pin_code_success": "Codice PIN reimpostato con successo", "reset_pin_code_with_password": "Puoi sempre reimpostare il codice PIN usando la tua password", "reset_sqlite": "Resetta Database SQLite", - "reset_sqlite_confirmation": "Vuoi davvero reimpostare il database SQLite? Dovrai disconnetterti e riconnetterti per risincronizzare i dati", + "reset_sqlite_clear_app_data": "Cancella i dati", + "reset_sqlite_confirmation": "Sei sicuro di voler cancellare i dati dell'app? Questa azione rimuoverà tutte le impostazioni e verrai disconnesso.", + "reset_sqlite_confirmation_note": "Nota: dovrai riavviare l'app dopo la pulizia.", + "reset_sqlite_done": "I dati dell'app sono stati cancellati. Si prega di riavviare Immich ed accedere nuovamente.", "reset_sqlite_success": "Database SQLite reimpostato correttamente", "reset_to_default": "Ripristina i valori predefiniti", "resolution": "Risoluzione", @@ -1910,6 +1913,7 @@ "saved_settings": "Impostazioni salvate", "say_something": "Dici qualcosa", "scaffold_body_error_occurred": "Si è verificato un errore", + "scaffold_body_error_unrecoverable": "Si è verificato un errore irreversibile. Condividi l'errore e lo stack trace su Discord o GitHub per consentirci di aiutarti. Se necessario, puoi cancellare i dati dell'app qui sotto.", "scan": "Scansione", "scan_all_libraries": "Analizza tutte le librerie", "scan_library": "Scansione", @@ -1945,6 +1949,7 @@ "search_filter_ocr": "Cerca tramite OCR", "search_filter_people_title": "Seleziona persone", "search_filter_star_rating": "Voto in Stelle", + "search_filter_tags_title": "Seleziona tag", "search_for": "Cerca per", "search_for_existing_person": "Cerca per persona esistente", "search_no_more_result": "Non ci sono altri risultati", @@ -2024,7 +2029,10 @@ "set_profile_picture": "Imposta foto profilo", "set_slideshow_to_fullscreen": "Imposta presentazione a schermo intero", "set_stack_primary_asset": "Imposta come risorsa primaria", - "setting_image_viewer_help": "Il visualizzatore dettagliato carica una piccola thumbnail per prima, per poi caricare un immagine di media grandezza (se abilitato). Ed infine carica l'originale (se abilitato).", + "setting_image_navigation_enable_subtitle": "Se abilitata, puoi passare all'immagine precedente/successiva toccando il quarto di schermo piÚ a sinistra/piÚ a destra.", + "setting_image_navigation_enable_title": "Clicca per navigare", + "setting_image_navigation_title": "Navigazione delle immagini", + "setting_image_viewer_help": "Il visualizzatore dettagliato prima carica una piccola thumbnail , per poi caricare un immagine di media grandezza (se abilitato). Ed infine carica l'originale (se abilitato).", "setting_image_viewer_original_subtitle": "Abilita il caricamento dell’immagine originale in alta risoluzione (dimensioni elevate). Disattiva per ridurre il consumo di dati, sia di rete che in cache locale.", "setting_image_viewer_original_title": "Carica l'immagine originale", "setting_image_viewer_preview_subtitle": "Abilita per caricare un'immagine a risoluzione media. Disabilita per caricare direttamente l'immagine originale o usare la thumbnail.", @@ -2045,7 +2053,7 @@ "setting_notifications_total_progress_title": "Mostra avanzamento del backup in background", "setting_video_viewer_auto_play_subtitle": "Avvia automaticamente la riproduzione dei video quando vengono aperti", "setting_video_viewer_auto_play_title": "Riproduci video automaticamente", - "setting_video_viewer_looping_title": "Looping", + "setting_video_viewer_looping_title": "Iterazione", "setting_video_viewer_original_video_subtitle": "Quando riproduci un video dal server, riproduci l'originale anche se è disponibile una versione transcodificata. Questo potrebbe portare a buffering. I video disponibili localmente sono sempre riprodotti a qualità originale indipendentemente da questa impostazione.", "setting_video_viewer_original_video_title": "Forza video originale", "settings": "Impostazioni", @@ -2147,7 +2155,7 @@ "size": "Dimensione", "skip_to_content": "Salta al contenuto", "skip_to_folders": "Salta alle cartelle", - "skip_to_tags": "Salta alle etichette", + "skip_to_tags": "Salta ai tag", "slideshow": "Presentazione", "slideshow_repeat": "Ripeti presentazione", "slideshow_repeat_description": "Ricomincia da capo quando la presentazione termina", @@ -2202,7 +2210,7 @@ "sync_upload_album_setting_subtitle": "Crea e carica le tue foto e video sull'album selezionato in Immich", "tag": "Tag", "tag_assets": "Tagga risorse", - "tag_created": "Tag creata: {tag}", + "tag_created": "Tag creato: {tag}", "tag_feature_description": "Navigazione foto e video raggruppati per argomenti tag logici", "tag_not_found_question": "Non riesci a trovare un tag? Creane uno nuovo.", "tag_people": "Tagga persone", @@ -2302,6 +2310,7 @@ "unstack_action_prompt": "{count} separati", "unstacked_assets_count": "{count, plural, one {Separata # risorsa} other {Separate # risorse}}", "unsupported_field_type": "Tipo di campo non supportato", + "unsupported_file_type": "Il file {file} non puÃ˛ essere caricato perchÊ il tipo di file {type} non è supportato.", "untagged": "Senza tag", "untitled_workflow": "Flusso di lavoro senza titolo", "up_next": "Prossimo", @@ -2328,6 +2337,8 @@ "url": "URL", "usage": "Utilizzo", "use_biometric": "Usa biometrica", + "use_browser_locale": "Utilizza la localizzazione del browser", + "use_browser_locale_description": "Formatta date e numeri in base alla lingua e al paese del browser", "use_current_connection": "Usa la connessione attuale", "use_custom_date_range": "Altrimenti utilizza un intervallo date personalizzato", "user": "Utente", diff --git a/i18n/ja.json b/i18n/ja.json index 218e615ac1..cd98b391ef 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -37,13 +37,13 @@ "add_to_album_bottom_sheet_some_local_assets": "ã„ãã¤ã‹ãŽé …į›Žã¯ãžã ã‚ĩãƒŧバãƒŧへã‚ĸップロãƒŧドされãĻいãĒいためã‚ĸãƒĢバムãĢčŋŊ加できぞせんでした", "add_to_album_toggle": "{album}ぎ選択を切りæ›ŋえ", "add_to_albums": "ã‚ĸãƒĢバムãĢčŋŊ加", - "add_to_albums_count": "{count}つぎã‚ĸãƒĢバムへčŋŊ加", + "add_to_albums_count": "{count}äģļをã‚ĸãƒĢバムãĢčŋŊ加", "add_to_bottom_bar": "čŋŊ加する", "add_to_shared_album": "å…ąæœ‰ã‚ĸãƒĢバムãĢčŋŊ加", "add_upload_to_stack": "゚ã‚ŋックãĢã‚ĸップロãƒŧドをčŋŊ加", "add_url": "URLをčŋŊ加", "add_workflow_step": "ワãƒŧクフロãƒŧぎ゚テップをčŋŊ加", - "added_to_archive": "ã‚ĸãƒŧã‚ĢイブãĢしぞした", + "added_to_archive": "ã‚ĸãƒŧã‚Ģイブしぞした", "added_to_favorites": "お気ãĢå…ĨりãĢčŋŊ加済", "added_to_favorites_count": "{count, number} 枚ぎį”ģ像をお気ãĢå…ĨりãĢčŋŊ加しぞした", "admin": { @@ -52,34 +52,34 @@ "asset_offline_description": "こぎ外部ナイブナãƒĒぎã‚ĸã‚ģãƒƒãƒˆã¯ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢčĻ‹ã¤ã‹ã‚‰ãĒくãĒãŖãĻã‚´ãƒŸįŽąãĢį§ģå‹•ã•ã‚Œãžã—ãŸã€‚ãƒ•ã‚Ąã‚¤ãƒĢがナイブナãƒĒぎ中でį§ģ動された場合はã‚ŋã‚¤ãƒ ãƒŠã‚¤ãƒŗã§æ–°ã—ã„å¯žåŋœã™ã‚‹ã‚ĸã‚ģットをįĸēčĒã—ãĻください。こぎã‚ĸã‚ģットを垊元するãĢはäģĨä¸‹ãŽãƒ•ã‚Ąã‚¤ãƒĢパ゚がImmichからã‚ĸクã‚ģ゚できるかįĸēčĒã—ãĻナイブナãƒĒã‚’ã‚šã‚­ãƒŖãƒŗã—ãĻください。", "authentication_settings": "čĒč¨ŧč¨­åŽš", "authentication_settings_description": "čĒč¨ŧč¨­åŽšãŽįŽĄį†īŧˆãƒ‘゚ワãƒŧド、OAuth、そぎäģ–īŧ‰", - "authentication_settings_disable_all": "æœŦåŊ“ãĢ全ãĻãŽãƒ­ã‚°ã‚¤ãƒŗæ–šæŗ•ã‚’į„ĄåŠšãĢしぞすか? ãƒ­ã‚°ã‚¤ãƒŗã¯åŽŒå…¨ãĢį„ĄåŠšãĢãĒりぞす。", + "authentication_settings_disable_all": "æœŦåŊ“ãĢすずãĻãŽãƒ­ã‚°ã‚¤ãƒŗæ–šæŗ•ã‚’į„ĄåŠšãĢしぞすかīŧŸ ãƒ­ã‚°ã‚¤ãƒŗãŒåŽŒå…¨ãĢできãĒくãĒりぞす。", "authentication_settings_reenable": "å†ãŗæœ‰åŠšãĢするãĢは、ã‚ĩãƒŧバãƒŧã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãĻください。", "background_task_job": "バックグナã‚Ļãƒŗãƒ‰ã‚ŋ゚ク", "backup_database": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸップをäŊœæˆ", - "backup_database_enable_description": "デãƒŧã‚ŋベãƒŧ゚バックã‚ĸップぎäŊœæˆã‚’有劚ãĢする", - "backup_keep_last_amount": "過åŽģぎバックã‚ĸップぎäŋæŒæ•°", + "backup_database_enable_description": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸップを有劚ãĢする", + "backup_keep_last_amount": "バックã‚ĸップぎäŋæŒæ•°", "backup_onboarding_1_description": "クナã‚Ļãƒ‰ã‚’åˆŠį”¨ã—ãŸã‚Ēフã‚ĩã‚¤ãƒˆãŽã‚ŗãƒ”ãƒŧかåˆĨãŽį‰Šį†įš„ãĒ場所。", "backup_onboarding_2_description": "åˆĨ々ぎデバイ゚上ぎロãƒŧã‚ĢãƒĢã‚ŗãƒ”ãƒŧã€‚ã“ã‚Œã¯ãƒĄã‚¤ãƒŗãƒ•ã‚Ąã‚¤ãƒĢやそぎロãƒŧã‚ĢãƒĢバックã‚ĸãƒƒãƒ—ãƒ•ã‚Ąã‚¤ãƒĢをåĢãŋぞす。", "backup_onboarding_3_description": "あãĒたぎすずãĻぎデãƒŧã‚ŋ(1つぎã‚Ēフã‚ĩã‚¤ãƒˆã‚ŗãƒ”ãƒŧと2つぎロãƒŧã‚ĢãƒĢã‚ŗãƒ”ãƒŧをåĢむ)ãŽã‚ŗãƒ”ãƒŧ。", - "backup_onboarding_description": "デãƒŧã‚ŋäŋč­ˇãĢは3-2-1バックã‚ĸップæˆĻį•Ĩが推åĨ¨ã•れぞす。ã‚ĸップロãƒŧãƒ‰ã—ãŸå†™įœŸ/動į”ģãŽã‚ŗãƒ”ãƒŧãĢ加え、Immichデãƒŧã‚ŋベãƒŧã‚šãŽã‚ŗãƒ”ãƒŧもäŋæŒã™ã‚‹ã“とで包æ‹Ŧįš„ãĒバックã‚ĸップã‚ŊãƒĒãƒĨãƒŧã‚ˇãƒ§ãƒŗã‚’åŽŸįžã§ããžã™ã€‚", + "backup_onboarding_description": "デãƒŧã‚ŋäŋč­ˇãĢは、3-2-1バックã‚ĸップæˆĻį•ĨãŽåˆŠį”¨ã‚’æŽ¨åĨ¨ã—ãžã™ã€‚å†™įœŸãƒģ動į”ģデãƒŧã‚ŋとImmichぎデãƒŧã‚ŋベãƒŧ゚をあわせãĻバックã‚ĸップすることで、より厉全ãĢäŋįŽĄã§ããžã™ã€‚", "backup_onboarding_footer": "Immichぎバックã‚ĸップãĢé–ĸã™ã‚‹æƒ…å ąã¯ã€ãƒ‰ã‚­ãƒĨãƒĄãƒŗãƒ†ãƒŧã‚ˇãƒ§ãƒŗã‚’įĸēčĒã—ãĻください。", "backup_onboarding_parts_title": "3-2-1バックã‚ĸップ:", "backup_onboarding_title": "バックã‚ĸップ", - "backup_settings": "デãƒŧã‚ŋベãƒŧ゚バックã‚ĸップäŊœæˆãŽč¨­åޚ", - "backup_settings_description": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸップäŊœæˆč¨­åŽšãŽįŽĄį† (こぎジョブはãƒĸニã‚ŋãƒĒãƒŗã‚°ã•ã‚Œãžã›ã‚“ã—ã€å¤ąæ•—ãŒį™ēį”Ÿã—ãĻもあãĒたãĢ通įŸĨãŒčĄŒãã“ã¨ã¯ã‚ã‚Šãžã›ã‚“)", + "backup_settings": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸãƒƒãƒ—ãŽč¨­åŽš", + "backup_settings_description": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸãƒƒãƒ—ãŽč¨­åŽšã‚’įŽĄį†", "cleared_jobs": "{job}ぎジョブをクãƒĒã‚ĸしぞした", "config_set_by_file": "č¨­åŽšã¯įžåœ¨ Config File ã§č¨­åŽšã•ã‚ŒãĻいる", "confirm_delete_library": "æœŦåŊ“ãĢ {library} を削除しぞすかīŧŸ", "confirm_delete_library_assets": "æœŦåŊ“ãĢこぎナイブナãƒĒを削除しぞすかīŧŸ {count, plural, one {#å€‹ãŽé …į›Ž} other {#å€‹ãŽé …į›Žå…¨ãĻ}} がImmichから削除され、元ãĢæˆģã™ã“ã¨ã¯ã§ããžã›ã‚“ã€‚ãƒ•ã‚Ąã‚¤ãƒĢã¯ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢ掋りぞす。", "confirm_email_below": "įĸēčĒãŽãŸã‚ã€äģĨ下ãĢ \"{email}\" とå…Ĩ力しãĻください", - "confirm_reprocess_all_faces": "æœŦåŊ“ãĢすずãĻãŽéĄ”ã‚’å†å‡Ļį†ã—ãžã™ã‹? これãĢより名前がäģ˜ã‘られたäēēį‰Šã‚‚æļˆåŽģされぞす。", + "confirm_reprocess_all_faces": "æœŦåŊ“ãĢéĄ”ãƒ‡ãƒŧã‚ŋをすずãĻ再å‡Ļį†ã—ãžã™ã‹īŧŸį™ģéŒ˛æ¸ˆãŋぎäēēį‰Šæƒ…å ąã¯ãƒĒã‚ģットされぞす。", "confirm_user_password_reset": "æœŦåŊ“ãĢ {user} ぎパ゚ワãƒŧドをãƒĒã‚ģットしぞすかīŧŸ", - "confirm_user_pin_code_reset": "{user}ぎPINã‚ŗãƒŧドをãƒĒã‚ģットしãĻよいですかīŧŸ", + "confirm_user_pin_code_reset": "æœŦåŊ“ãĢ{user}ぎPINã‚ŗãƒŧドをãƒĒã‚ģットしぞすかīŧŸ", "copy_config_to_clipboard_description": "JSONã‚ĒブジェクトとしãĻįžåœ¨ãŽã‚ˇã‚šãƒ†ãƒ ã‚ŗãƒŗãƒ•ã‚Ŗã‚°ã‚’ã‚¯ãƒĒップボãƒŧドãĢã‚ŗãƒ”ãƒŧする", "create_job": "ジョブぎäŊœæˆ", - "cron_expression": "Cronåŧ", - "cron_expression_description": "cronぎフりãƒŧマットをäŊŋãŖãĻã‚šã‚­ãƒŖãƒŗé–“éš”ã‚’č¨­åŽšã—ãžã™ã€‚čŠŗã—ãã¯Crontab GuruãĒãŠã‚’å‚į…§ã—ãĻください", - "cron_expression_presets": "CronåŧãŽãƒ—ãƒĒã‚ģット", + "cron_expression": "åŽŸčĄŒã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢīŧˆCronīŧ‰", + "cron_expression_description": "cronåŊĸåŧã§åŽŸčĄŒã‚ŋã‚¤ãƒŸãƒŗã‚°ã‚’č¨­åŽšã—ãžã™ã€‚čŠŗã—ãã¯ Crontab Guru ã‚’å‚į…§ã—ãĻください", + "cron_expression_presets": "ã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢīŧˆãƒ—ãƒĒã‚ģットīŧ‰", "disable_login": "ãƒ­ã‚°ã‚¤ãƒŗã‚’į„ĄåŠšãĢする", "duplicate_detection_job_description": "抟æĸ°å­Ļįŋ’ã‚’į”¨ã„ãĻ類äŧŧį”ģ像ぎ検å‡ēã‚’čĄŒã„ãžã™ã€‚īŧˆã‚šãƒžãƒŧトã‚ĩãƒŧチãĢ䞝存īŧ‰", "exclusion_pattern_description": "除外パã‚ŋãƒŧãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ãƒŠã‚¤ãƒ–ãƒŠãƒĒã‚’ã‚šã‚­ãƒŖãƒŗã™ã‚‹éš›ãĢãƒ•ã‚Ąã‚¤ãƒĢやフりãƒĢãƒ€ã‚’į„ĄčĻ–ã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚RAWãƒ•ã‚Ąã‚¤ãƒĢãĒãŠã€ã‚¤ãƒŗãƒãƒŧトしたくãĒã„ãƒ•ã‚Ąã‚¤ãƒĢをåĢむフりãƒĢダがある場合ãĢäžŋ刊です。", @@ -89,7 +89,7 @@ "face_detection_description": "抟æĸ°å­Ļįŋ’ã‚’äŊŋį”¨ã—ãĻã‚ĸã‚ģãƒƒãƒˆå†…ãŽéĄ”ã‚’æ¤œå‡ēしぞす。動į”ģぎ場合は、ã‚ĩムネイãƒĢぎãŋãŒå¯žčąĄã¨ãĒりぞす。\"すずãĻ\" はすずãĻぎã‚ĸã‚ģットをīŧˆå†īŧ‰å‡Ļį†ã—ãžã™ã€‚ \"æŦ čŊ\" はぞだå‡Ļį†ã•ã‚ŒãĻいãĒいã‚ĸã‚ģットをキãƒĨãƒŧãĢå…Ĩã‚Œãžã™ã€‚éĄ”æ¤œå‡ēぎ厌äē†åžŒã€æ¤œå‡ēã•ã‚ŒãŸéĄ”ã¯éĄ”čĒč­˜ãŽã‚­ãƒĨãƒŧへå…Ĩれられ、æ—ĸ存ぞたは新čĻãŽäēēį‰ŠãĢグãƒĢãƒŧプ化されぞす。", "facial_recognition_job_description": "検å‡ēã•ã‚ŒãŸéĄ”ã‚’äēēį‰ŠãĢグãƒĢãƒŧãƒ—åŒ–ã—ãžã™ã€‚ã“ãŽã‚šãƒ†ãƒƒãƒ—ã¯éĄ”æ¤œå‡ēが厌äē†ã—た垌ãĢåŽŸčĄŒã•ã‚Œãžã™ã€‚ \"すずãĻ\" はすずãĻãŽéĄ”ã‚’īŧˆå†īŧ‰ã‚¯ãƒŠã‚šã‚ŋãƒĒãƒŗã‚°ã—ã€ \"æŦ čŊ\" はäēēį‰ŠãŒå‰˛ã‚ŠåŊ“ãĻられãĻいãĒã„éĄ”ã‚’ã‚­ãƒĨãƒŧãĢå…Ĩれぞす。", "failed_job_command": "ジョブ {job}ãŽã‚ŗãƒžãƒŗãƒ‰ {command}ãŒå¤ąæ•—ã—ãžã—ãŸ", - "force_delete_user_warning": "č­Ļ告īŧšã“ぎ操äŊœã‚’čĄŒã†ã¨ã€ãƒĻãƒŧã‚ļãƒŧとすずãĻぎã‚ĸã‚ģãƒƒãƒˆãŒį›´ãĄãĢ削除されぞす。これは元ãĢæˆģã›ãšã€ãƒ•ã‚Ąã‚¤ãƒĢも垊元できぞせん。", + "force_delete_user_warning": "č­Ļ告: こぎ操äŊœã‚’čĄŒã†ã¨ã€ãƒĻãƒŧã‚ļãƒŧとすずãĻぎã‚ĸã‚ģãƒƒãƒˆãŒį›´ãĄãĢ削除されぞす。これは元ãĢæˆģã›ãšã€ãƒ•ã‚Ąã‚¤ãƒĢも垊元できぞせん。", "image_format": "フりãƒŧマット", "image_format_description": "WebPはJPEGã‚ˆã‚Šã‚‚ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēãŒå°ã•ã„ã§ã™ãŒã€ã‚¨ãƒŗã‚ŗãƒŧドãĢ時間がかかりぞす。", "image_fullsize_description": "į”ģåƒã‚’æ‹Ąå¤§ã™ã‚‹æ™‚ãĢäŊŋã‚ã‚Œã‚‹ãƒĄã‚ŋデãƒŧã‚ŋを取り除いた原寸大į”ģ像", @@ -242,7 +242,7 @@ "nightly_tasks_settings": "æ¯Žæ™ŠčĄŒã†ã‚ŋã‚šã‚¯ãŽč¨­åŽš", "nightly_tasks_settings_description": "æ¯Žæ™ŠčĄŒã†ã‚ŋã‚šã‚¯ãŽįŽĄį†", "nightly_tasks_start_time_setting": "開始時間", - "nightly_tasks_start_time_setting_description": "こぎã‚ĩãƒŧバãƒŧãŒæ¯Žæ™ŠčĄŒã†ã‚ŋã‚šã‚¯ã‚’čĄŒã†æ™‚é–“", + "nightly_tasks_start_time_setting_description": "夜間ã‚ŋã‚šã‚¯ãŽåŽŸčĄŒé–‹å§‹æ™‚åˆģ", "nightly_tasks_sync_quota_usage_setting": "剞åŊ“厚量ぎ同期", "nightly_tasks_sync_quota_usage_setting_description": "ãƒĻãƒŧã‚ļãƒŧãŽįžåœ¨ãŽã‚šãƒˆãƒŦãƒŧジäŊŋᔍįŠļæŗãĢåŋœã˜ãĻ剞åŊ“厚量を更新", "no_paths_added": "パ゚がčŋŊ加されãĻいぞせん", @@ -812,7 +812,7 @@ "connected_device": "æŽĨįļšã•れたデバイ゚", "connected_to": "æŽĨįļš:", "contain": "収める", - "context": "įŠļæŗ", + "context": "å†™įœŸãŽå†…åŽš", "continue": "įļšã‘ã‚‹", "control_bottom_app_bar_create_new_album": "ã‚ĸãƒĢバムをäŊœæˆ", "control_bottom_app_bar_delete_from_immich": "ã‚ĩãƒŧバãƒŧから削除", @@ -890,8 +890,6 @@ "deduplication_criteria_2": "EXIFデãƒŧã‚ŋ数", "deduplication_info": "é‡č¤‡æŽ’é™¤æƒ…å ą", "deduplication_info_description": "å†™įœŸ/動į”ģをč‡Ēå‹•įš„ãĢ選択しãĻé‡č¤‡ã‚’ä¸€æ‹Ŧで削除するãĢはæŦĄãŽã‚ˆã†ãĢしぞす:", - "default_locale": "デフりãƒĢãƒˆãŽãƒ­ã‚ąãƒŧãƒĢ", - "default_locale_description": "ブナã‚Ļã‚ļãŽãƒ­ã‚ąãƒŧãƒĢãĢåŸēãĨいãĻæ—Ĩäģ˜ã¨æ•°å€¤ã‚’フりãƒŧマットしぞす", "delete": "削除", "delete_action_confirmation_message": "ã“ãŽé …į›Žã‚’å‰Šé™¤ã—ãžã™ã‹īŧŸãžãšã€ã“ãŽé …į›Žã¯ã‚ĩãƒŧバãƒŧä¸ŠãŽã‚´ãƒŸįŽąã¸į§ģ動されぞす。そぎ垌、あãĒたぎデバイ゚上から削除するかをæąēめãĻいただきぞす", "delete_action_prompt": "{count}é …į›Žã‚’å‰Šé™¤ã—ãžã—ãŸ", @@ -921,7 +919,7 @@ "delete_user": "ãƒĻãƒŧã‚ļãƒŧを削除", "deleted_shared_link": "å…ąæœ‰ãƒĒãƒŗã‚¯ã‚’å‰Šé™¤", "deletes_missing_assets": "ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰ãĒくãĒãŖãŸã‚ĸã‚ģットを削除する", - "description": "æĻ‚čρæŦ„", + "description": "čĒŦ明", "description_input_hint_text": "čĒŦ明をčŋŊ加", "description_input_submit_error": "čĒŦæ˜ŽãŽįˇ¨é›†ãĢå¤ąæ•—ã—ãžã—ãŸã€‚čŠŗį´°ã¯ãƒ­ã‚°ã‚’įĸēčĒã—ãĻください。", "deselect_all": "すずãĻãŽé¸æŠžã‚’č§Ŗé™¤", @@ -1320,10 +1318,10 @@ "individual_shares": "1æžšãšã¤ãŽå…ąæœ‰", "info": "æƒ…å ą", "interval": { - "day_at_onepm": "毎æ—Ĩ午垌1時", + "day_at_onepm": "毎æ—Ĩ 午垌1時", "hours": "{hours, plural, one {1時間} other {{hours, number}時間}}ごと", - "night_at_midnight": "æ¯Žæ™ŠįœŸå¤œä¸­ãĢ", - "night_at_twoam": "毎晊午前2時" + "night_at_midnight": "毎æ—Ĩ 午前0時", + "night_at_twoam": "毎æ—Ĩ 午前2時" }, "invalid_date": "æ—Ĩäģ˜ãŒį„ĄåŠšã§ã™", "invalid_date_format": "æ—Ĩäģ˜ãŽãƒ•りãƒŧãƒžãƒƒãƒˆãŒį„ĄåŠšã§ã™", @@ -1803,7 +1801,6 @@ "rating_clear": "čŠ•äžĄã‚’å–ã‚Šæļˆã™", "rating_count": "星{count, plural, one {#つ} other {#つ}}", "rating_description": "æƒ…å ąæŦ„ãĢEXIFãŽčŠ•äžĄã‚’čĄ¨į¤ē", - "rating_set": "お気ãĢå…ĨりåēĻ {rating, plural, one {# ツ星} other {# ツ星}}", "reaction_options": "ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãŽé¸æŠž", "read_changelog": "変更åąĨ歴をčĒ­ã‚€", "readonly_mode_disabled": "čĒ­ãŋå–ã‚Šå°‚į”¨ãƒĸãƒŧãƒ‰į„ĄåŠš", @@ -1911,13 +1908,13 @@ "scanning_for_album": "ã‚ĸãƒĢãƒãƒ ã‚’ã‚šã‚­ãƒŖãƒŗä¸­â€Ļ", "search": "検į´ĸ", "search_albums": "ã‚ĸãƒĢバムを検į´ĸ", - "search_by_context": "įŠļæŗã§æ¤œį´ĸ", - "search_by_description": "æĻ‚čĻã§æ¤œį´ĸ", - "search_by_description_example": "ã‚ĩãƒ‘ã§ãƒã‚¤ã‚­ãƒŗã‚°ã—ãŸæ—Ĩ", + "search_by_context": "å†™įœŸãŽå†…åŽšã§æ¤œį´ĸ", + "search_by_description": "čĒŦ明で検į´ĸ", + "search_by_description_example": "äēŦéƒŊãŽæĄœã‚ãã‚Š", "search_by_filename": "ãƒ•ã‚Ąã‚¤ãƒĢåã‚‚ã—ãã¯æ‹Ąåŧĩ子で検į´ĸ", "search_by_filename_example": "例: IMG_1234.JPG もしくは PNG", "search_by_ocr": "OCR検į´ĸ", - "search_by_ocr_example": "おčŒļ", + "search_by_ocr_example": "バ゚ 時åˆģ襨", "search_camera_lens_model": "ãƒŦãƒŗã‚ēãƒĸデãƒĢで検į´ĸâ€Ļ", "search_camera_make": "ã‚ĢãƒĄãƒŠãƒĄãƒŧã‚Ģãƒŧを検į´ĸâ€Ļ", "search_camera_model": "ã‚ĢãƒĄãƒŠãŽãƒĸデãƒĢを検į´ĸâ€Ļ", @@ -2069,7 +2066,7 @@ "shared_link_clipboard_text": "ãƒĒãƒŗã‚¯: {link}\nパ゚ワãƒŧド: {password}", "shared_link_create_error": "å…ąæœ‰į”¨ãŽãƒĒãƒŗã‚¯äŊœæˆæ™‚ãĢエナãƒŧがį™ēį”Ÿã—ãžã—ãŸ", "shared_link_custom_url_description": "ã“ãŽå…ąæœ‰ãƒĒãƒŗã‚¯ãĢã‚Ģ゚ã‚ŋムURLでã‚ĸクã‚ģ゚", - "shared_link_edit_description_hint": "æĻ‚čĻã‚’čŋŊ加", + "shared_link_edit_description_hint": "čĒŦ明をčŋŊ加", "shared_link_edit_expire_after_option_day": "1æ—Ĩ", "shared_link_edit_expire_after_option_days": "{count}æ—Ĩ", "shared_link_edit_expire_after_option_hour": "1時間", diff --git a/i18n/km.json b/i18n/km.json index 4a90cf5e38..f14c34095d 100644 --- a/i18n/km.json +++ b/i18n/km.json @@ -5,18 +5,25 @@ "acknowledge": "បážļនដឹងនិងទទážŊលស្គážļល់", "action": "សកម្មភážļព", "action_common_update": "ធ្វើបច្ចážģប្បន្នភážļព", + "action_description": "សំណážģំសកម្មភážļពសម្រážļប់ážĸនážģវត្តលឞឯកសážļរដែលបážļនត្រង", "actions": "សកម្មភážļពផ្សេងៗ", "active": "កំពážģងសកម្ម", "active_count": "ដំណើរកážļរ :{count}", "activity": "សកម្មភážļពផ្សេងៗ", + "activity_changed": "សកម្មភážļពគážē {enabled, select, true {បážļនបើក} other {បážļនបិទ}}", "add": "បន្ថែម", "add_a_description": "បន្ថែមកážļរពិពណ៌នážļ", "add_a_location": "បន្ថែមទីតážļំង", "add_a_name": "បន្ងែមឈ្មោះ", "add_a_title": "បន្ងែមចំណងជើង", + "add_action": "បន្ថែមសកម្មភážļព", + "add_action_description": "ចážģចដើម្បីបន្ថែមសកម្មភážļឲ្យážĸនážģវត្ត", + "add_assets": "បន្ថែមទ្រព្យ", "add_birthday": "បន្ថែមថ្ងៃខែឆ្មážļំកំណើត", "add_endpoint": "បន្ថែម Endpoint", "add_exclusion_pattern": "បន្ថែមលំនážļំលើកលែង", + "add_filter": "បន្ថែមតម្រង", + "add_filter_description": "ចážģចដើម្បីបន្ថែមតម្រងផ្សេងទៀត", "add_location": "បន្ថែមទីតážļំង", "add_more_users": "បន្ថែមážĸ្នកប្រើប្រážļស់", "add_partner": "បន្ថែមដៃគážŧ", @@ -27,7 +34,7 @@ "add_to_album": "បន្ថែមទៅក្នážģងážĸážļល់ប៊ážģម", "add_to_album_bottom_sheet_added": "បážļនបន្ថែមទៅក្នážģង {album}", "add_to_album_bottom_sheet_already_exists": "បន្ថែមក្នážģង {album} រážŊចទៅហើយ", - "add_to_album_bottom_sheet_some_local_assets": "Local assets មážŊយចំនážŊនមិនážĸážļចបញ្ចážŧលទៅក្នážģងážĸážļល់ប៊ážģមបážļនទេ", + "add_to_album_bottom_sheet_some_local_assets": "ទ្រព្យក្នážģងម៉ážļស៊ីនមážŊយចំនážŊនមិនážĸážļចបន្ថែមចážŧលážĸážļល់ប៊ážģមបážļនទេ", "add_to_album_toggle": "បិទបើកកážļរជ្រើសរើសសម្រážļប់ {album}", "add_to_albums": "បន្ថែមទៅក្នážģងážĸážļល់ប៊ážģមច្រើន", "add_to_albums_count": "បន្ថែមទៅក្នážģងážĸážļល់ប៊ážģមចំនážŊន ({count})", @@ -35,10 +42,12 @@ "add_to_shared_album": "បន្ថែមទៅក្នážģងážĸážļល់ប៊ážģមដែលបážļនចែករំលែក", "add_upload_to_stack": "បន្ថែមកážļរបង្ហោះទៅជង់", "add_url": "បន្ថែម URL", + "add_workflow_step": "បន្ថែមលំនážļំកážļរងážļរ", "added_to_archive": "បážļនបន្ថែមទៅក្នážģងបណ្ណសážļរ", "added_to_favorites": "បážļនបន្ថែមទៅក្នážģងចំណង់ចំណážŧលចិត្ត", "added_to_favorites_count": "បážļនបន្ថែម {count, number} ទៅក្នážģងចំណង់ចំណážŧលចិត្ត", "admin": { + "add_exclusion_pattern_description": "បន្ថែមទម្រង់មិនរážļប់បញ្ចážŧល។ ážĸážļចប្រើប្រážļស់ជážļមážŊយ *, ** និងសញ្ញážļ ? បážļន។ ដើម្បីមិនážĸើពើរážļល់ឯកសážļរទážļំងážĸស់ក្នážģងកន្លែងដែលមážļនឈ្មោះ \"Raw\" សážŧមប្រើ \"**/Raw/**\"។ ដើម្បីមិនážĸឞពឞឯកសážļរដែលបញ្ចប់ដោយ \".tif\" សážŧមប្រើ \"**/*.tif\"។ ដើម្បីមិនážĸើពើទីតážļំងពេញលេញ សážŧមប្រើ \"/path/to/ignore/**\"។", "admin_user": "ážĸ្នកប្រើប្រážļស់ážĸេតមីន", "asset_offline_description": "Asset ​បណ្ណážļល័យ​ខážļង​ក្រៅ​នេះ​លែង​ត្រážŧវ​បážļន​រក​ឃើញ​នៅ​លើ​ថážļស​ហើយ​ត្រážŧវ​បážļន​ផ្លážļស់ទី​តážļំងទៅ​ធážģង​សំរážļម។ áž”áŸ’ážšážŸážˇáž“áž”ážžáž¯áž€ážŸážļរត្រážŧវបážļនផ្លážļស់ទីក្នážģងបណ្ណážļល័យ, សážŧមពិនិត្យមើលកážļរកំណត់ពេលវេលážļរបស់ážĸ្នកសម្រážļប់ Asset ដែលត្រážŧវគ្នážļថ្មី។ ដើម្បីស្ដážļរ Asset នេះឡើងវិញ សážŧមប្រážļកដថážļ Path ឯកសážļរខážļងក្រោមážĸážļចចážŧលប្រើបážļនដោយ Immich និងស្កេនបណ្ណážļល័យបážļន។", "authentication_settings": "កážļរកំណត់កážļរផ្ទៀងផ្ទážļត់", @@ -49,8 +58,43 @@ "backup_database": "បង្កើតមážŧលដ្ឋážļនទិន្នន័យ​ Dump", "backup_database_enable_description": "បើកមážŧលដ្ឋážļនទិន្នន័យ Dumps", "backup_keep_last_amount": "ចំនážŊននៃ Dumps ពីមážģនដែលត្រážŧវរក្សážļទážģក", - "backup_onboarding_1_description": "ច្បážļប់ចម្លងក្រៅបណ្តážļញនៅក្នážģងពពក ážŦនៅកន្លែងផ្សេងទៀត។", + "backup_onboarding_1_description": "ច្បážļប់ចម្លងក្រៅបណ្តážļញនៅក្នážģងážĸនឡážļន ážŦនៅកន្លែងផ្សេងទៀត។", "backup_onboarding_2_description": "ឯកសážļរចម្លងនៅលើឧបករណ៍ផ្សេងៗ។ នេះរážŊមបញ្ចážŧលទážļំងឯកសážļរសំខážļន់ៗ និងកážļរបម្រážģងទážģកនៃឯកសážļរទážļំងនោះ។", - "backup_onboarding_3_description": "ចំនážŊនឯកសážļរចម្លងនៃទិន្នន័យរបស់ážĸ្នក, រážŊមបញ្ចážŧលទážļំងឯកសážļរដើម។ នេះរážŊមបញ្ចážŧលទážļំងច្បážļប់ចម្លងក្រៅបណ្តážļញ 1 និងច្បážļប់ចម្លងខážļងក្រៅ 2 ។" + "backup_onboarding_3_description": "ចំនážŊនឯកសážļរចម្លងនៃទិន្នន័យរបស់ážĸ្នក, រážŊមបញ្ចážŧលទážļំងឯកសážļរដើម។ នេះរážŊមបញ្ចážŧលទážļំងច្បážļប់ចម្លងក្រៅបណ្តážļញ 1 និងច្បážļប់ចម្លងខážļងក្រៅ 2 ។", + "backup_onboarding_description": "យážģទ្ធសážļស្ត្របម្រážģងទážģក 3-2-1 ត្រážŧវបážļនណែនážļំដើម្បីកážļរពážļរទិន្នន័យរបស់ážĸ្នក។ ážĸ្នកគážŊរតែរក្សážļទážģកច្បážļប់ចម្លងនៃរážŧបថត/វីដេážĸážŧដែលបážļនបង្ហោះរបស់ážĸ្នក ក៏ដážŧចជážļមážŧលដ្ឋážļនទិន្នន័យ Immich សម្រážļប់ដំណោះស្រážļយបម្រážģងទážģកដែលពេញលេញមážŊយ។", + "backup_onboarding_footer": "សម្រážļប់ព័ត៌មážļនបន្ថែមážĸំពីកážļរបម្រážģងទážģក Immich សážŧមមើល ឯកសážļរ។", + "backup_onboarding_parts_title": "កážļរបម្រážģងទážģក 3-2-1 រážŊមមážļន៖", + "backup_onboarding_title": "កážļរបម្រážģងទážģក", + "backup_settings": "កážļរកំណត់កážļរចážļក់ទិន្នន័យ", + "backup_settings_description": "គ្រប់គ្រងកážļរកំណត់នៃកážļរចážļក់ទិន្នន័យ។", + "cleared_jobs": "បážļនសម្ážĸážļតកážļរងážļរសម្រážļប់៖ {job}", + "config_set_by_file": "កážļរកំណត់ផ្សេងៗបច្ចážģប្បន្នកំពážģងត្រážŧវបážļនកំណត់ដោយឯកសážļរកំណត់រចនážļសម្ព័ន្ធ", + "confirm_delete_library": "តើážĸ្នកពិតជážļចង់លážģបបណ្ណážļល័យ {library} មែនទេ?", + "confirm_delete_library_assets": "តើážĸ្នកពិតជážļចង់លážģបបណ្ណážļល័យនេះមែនទេ? វážļនឹងលážģប {count, plural, one {# ឯកសážļរដែលពážļក់ព័ន្ធ} other {ឯកសážļរពážļក់ព័ន្ធទážļំងážĸស់ #}} ចេញពី Immich ហើយមិនážĸážļចយកមកវិញបážļនទេ។ ឯកសážļរនឹងនៅតែមážļននៅលើថážļស។", + "confirm_email_below": "ដើម្បីផ្ទៀងផ្ទážļត់ សážŧមវážļយ \"{email}\" ខážļងក្រោម", + "confirm_reprocess_all_faces": "តើážĸ្នកប្រážļកដទេថážļចង់ដំណើរកážļរស្កែនមážģខទážļំងážĸស់ឡើងវិញ? វážļនឹងលážģបឈ្មោះមនážģស្សដែលបážļនដážļក់ផងដែរ។", + "confirm_user_password_reset": "តើážĸ្នកប្រážļកដថážļចង់កំណត់ពážļក្យសម្ងážļត់របស់ {user} ឡើងវិញ?", + "confirm_user_pin_code_reset": "តើážĸ្នកប្រážļកដថážļចង់កំណត់លេខសម្ងážļត់ PIN របស់ {user} ឡើងវិញ?", + "copy_config_to_clipboard_description": "ចម្លងកážļរកំណត់ប្រព័ន្ធបច្ចážģប្បន្នជážļJSON object ទៅកážļន់clipboard", + "create_job": "បង្កើតកážļរងážļរ", + "cron_expression": "គ្របគ្រងពេលវេលážļ", + "cron_expression_description": "កំណត់ចន្លោះពេលស្កេនដោយប្រើទម្រង់ cron ​format។ សម្រážļប់ព័ត៌មážļនបន្ថែម សážŧមមើលឧទážļហរណ៍នៅក្នážģង Crontab Guru", + "cron_expression_presets": "ពážģម្ភក្នážģងកážļរកំណត់ពេលវេលážļ", + "disable_login": "បិទមិនážĸោយលážģកចážŧល", + "duplicate_detection_job_description": "បើកដំណើរកážļរ Machine Learning លើទ្រព្យទážļំងážĸស់ដើម្បីស្វែងរក រážŧបភážļពដែលស្រដៀងគ្នážļ។ ផ្ážĸែកលើ Smart Search", + "exclusion_pattern_description": "ទម្រង់មិនរážļប់បញ្ចážŧល ážĸនážģញ្ញážļតឱ្យážĸ្នកមិនážĸើពើពីប្រភេទរážŧបភážļព áž“ážˇáž„ážážáž¯áž€ážŸážļរនៅពេលស្កេនបណ្ណážļល័យរបស់ážĸ្នក។ នេះមážļនប្រយោជន៍ប្រសិនបើážĸ្នកមážļនថតឯកសážļរដែលមážļនប្រភេទរážŧបភážļពដែលážĸ្នកមិនចង់នážļំចážŧល ដážŧចជážļរážŧបភážļព RAW ជážļដើម។", + "export_config_as_json_description": "ទážļញយកកážļរកំណត់ប្រព័ន្ធបច្ចážģប្បន្នជážļទម្រង់ JSON", + "external_libraries_page_description": "ទំព័របណ្ណážļល័យខážļងក្រៅរបស់ážĸ្នកគ្រប់គ្រង", + "face_detection": "កážļរចážļប់យកផ្ទែមážģខ", + "face_detection_description": "រកមើលមážģខក្នážģងឯកសážļរដោយប្រើប្រážļស់ machine learning។ សម្រážļប់វីដេážĸážŧ មážļនតែរážŧបភážļពតážŧច(Thunbnail)ប៉ážģណ្ណោះដែលត្រážŧវបážļនពិចážļរណážļ។ \"Refresh\" (ដំណើរកážļរឡើងវិញ) ដំណើរកážļរឯកសážļរទážļំងážĸស់ឡើងវិញ។ \"Reset\" នឹងបន្ថែមពីលើកážļរលážģបមážģខទážļំងážĸស់។ \"Missing\" ដážļក់ជážŊរឯកសážļរដែលមិនទážļន់បážļនដំណើរកážļរ។ មážģខដែលបážļនរកឃើញនឹងត្រážŧវបážļនដážļក់ក្នážģងជážŊរសម្រážļប់កážļរសម្គážļល់មážģខ បន្ទážļប់ពីកážļររកឃើញមážģខបážļនបញ្ចប់ ដោយដážļក់ជážļក្រážģមទៅក្នážģងមនážģស្សដែលមážļនស្រážļប់ ážŦមនážģស្សថ្មី។", + "facial_recognition_job_description": "ដážļក់ក្រážģមមážģខដែលបážļនរកឃើញទៅជážļមនážģស្ស។ ជំហážļននេះដំណើរកážļរបន្ទážļប់ពីកážļររកឃើញមážģខបážļនបញ្ចប់។ \"Reset\" (ធ្វើកážļរចង្កោមឡើងវិញ) ដážļក់មážģខទážļំងážĸស់ក្នážģងក្រážģមឡើងវិញ។ \"Missing\" ដážļក់មážģខដែលមិនមážļនមនážģស្សកំណត់ក្នážģងជážŊរ។", + "failed_job_command": "ពážļក្យបញ្ជážļ {command} បážļនបរážļជ័យសម្រážļប់កិច្ចកážļរ៖ {job}", + "force_delete_user_warning": "កážļរព្រមážļន៖ វážļនឹងលážģបážĸ្នកប្រើប្រážļស់ áž“ážˇáž„áž¯áž€ážŸážļរទážļំងážĸស់ភ្លážļមៗ។ វážļមិនážĸážļចត្រឡប់វិញបážļនទេ ហឞយឯកសážļរមិនážĸážļចទážļញយកមកវិញបážļនទេ។", + "image_format": "ទ្រង់ទ្រážļយ", + "image_format_description": "WebP áž•áž›ážˇážáž¯áž€ážŸážļរតážŧចជážļង JPEG ប៉ážģន្តែដំណើរកážļរក្នážģងកážļរ encode យážēតជážļង។", + "image_fullsize_description": "រážŧបភážļពពេញលេញដែលមážļនទិន្នន័យមេតážļត្រážŧវបážļនដកចេញ វážļនឹងត្រážŧវបážļនប្រើនៅពេលពង្រីក", + "image_fullsize_enabled": "បើកកážļរបង្កើតរážŧបភážļពទំហំពេញ", + "image_fullsize_enabled_description": "បង្កើតរážŧបភážļពទំហំពេញសម្រážļប់ទម្រង់ដែលមិនមែនជážļ Web-friendly។ នៅពេលដែល \"Prefer embedded preview\" ត្រážŧវបážļនបើក កážļរមើលជážļមážģនដែលបážļនបង្កប់ត្រážŧវបážļនប្រើប្រážļស់ដោយផ្ទážļល់ដោយគ្មážļនកážļរបម្លែង។ មិនប៉ះពážļល់ដល់ទម្រង់ Web-friendly ដážŧចជážļ JPEG ទេ។", + "image_fullsize_quality_description": "គážģណភážļពរážŧបភážļពទំហំពេញពី 1-100។ ខ្ពស់ជážļងគážēល្ážĸជážļង ប៉ážģន្តែបង្កឞតឯកសážļរធំជážļង។" } } diff --git a/i18n/kn.json b/i18n/kn.json index f6dde7bf8f..16079d48bf 100644 --- a/i18n/kn.json +++ b/i18n/kn.json @@ -52,7 +52,7 @@ "authentication_settings": "ā˛Ļ⺃ā˛ĸ⺀➕➰➪ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "authentication_settings_description": "ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ, ā˛’ā˛”ā˛¤āŗ ā˛Žā˛¤āŗā˛¤āŗ ➇➤➰ ā˛Ļ⺃ā˛ĸ⺀➕➰➪ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "authentication_settings_disable_all": "➍⺀ā˛ĩ⺁ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛ĩā˛ŋā˛§ā˛žā˛¨ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ➏➂ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛ĩā˛žā˛—ā˛ŋ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", - "authentication_settings_reenable": "ā˛Žā˛°āŗ-ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁, ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛•ā˛Žā˛žā˛‚ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ.", + "authentication_settings_reenable": "ā˛Žā˛°āŗ-ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁, Server Command ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ.", "background_task_job": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛•ā˛žā˛°āŗā˛¯ā˛—ā˛ŗāŗ", "backup_database": "ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ŧāŗ‡ā˛¸āŗ ā˛Ąā˛‚ā˛Ēāŗ ➰➚ā˛ŋ➏ā˛ŋ", "backup_database_enable_description": "ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ŧāŗ‡ā˛¸āŗ ā˛Ąā˛‚ā˛Ēāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", @@ -60,7 +60,8 @@ "backup_onboarding_1_description": "ā˛•āŗā˛˛āŗŒā˛Ąāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ā˛‡ā˛¨āŗā˛¨āŗŠā˛‚ā˛Ļ⺁ ➭⺌➤ā˛ŋ➕ ā˛¸āŗā˛Ĩ➺ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➆ā˛Ģāŗâ€Œā˛¸āŗˆā˛Ÿāŗ ➍➕➞⺁.", "backup_onboarding_2_description": "ā˛ĩā˛ŋā˛ĩā˛ŋ➧ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛¸āŗā˛Ĩ➺⺀➝ ā˛Ēāŗā˛°ā˛¤ā˛ŋ➗➺⺁. ➇ā˛Ļ⺁ ā˛Žāŗā˛–āŗā˛¯ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ➆ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗ ā˛¸āŗā˛Ĩ➺⺀➝ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛’ā˛ŗā˛—āŗŠā˛‚ā˛Ąā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "backup_onboarding_3_description": "ā˛Žāŗ‚ā˛˛ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛’ā˛ŗā˛—āŗŠā˛‚ā˛Ąā˛‚ā˛¤āŗ† ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ļ ā˛’ā˛Ÿāŗā˛Ÿāŗ ā˛Ēāŗā˛°ā˛¤ā˛ŋ➗➺⺁. ➇ā˛Ļā˛°ā˛˛āŗā˛˛ā˛ŋ 1 ➆ā˛Ģāŗâ€Œā˛¸āŗˆā˛Ÿāŗ ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ 2 ā˛¸āŗā˛Ĩ➺⺀➝ ā˛Ēāŗā˛°ā˛¤ā˛ŋ➗➺⺁ ➏⺇➰ā˛ŋā˛ĩāŗ†.", - "backup_onboarding_footer": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąāŗā˛ĩ ā˛Ŧā˛—āŗā˛—āŗ† ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛—ā˛žā˛—ā˛ŋ, ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛Ąā˛žā˛•āŗā˛¯āŗā˛Žāŗ†ā˛‚ā˛Ÿāŗ‡ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛ŋ.", + "backup_onboarding_description": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ā˛°ā˛•āŗā˛ˇā˛ŋ➏➞⺁ 3-2-1 ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛¤ā˛‚ā˛¤āŗā˛° ā˛…ā˛¨āŗā˛¨āŗ ā˛ļā˛ŋā˛Ģā˛žā˛°ā˛¸āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛¸ā˛Žā˛—āŗā˛° ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Ē➰ā˛ŋā˛šā˛žā˛°ā˛•āŗā˛•ā˛žā˛—ā˛ŋ ➍⺀ā˛ĩ⺁ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ/ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗ ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šā˛žā˛—āŗ‚ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ŧāŗ‡ā˛¸āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛‡ā˛Ÿāŗā˛Ÿāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛Ŧ⺇➕⺁.", + "backup_onboarding_footer": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąāŗā˛ĩ ā˛Ŧā˛—āŗā˛—āŗ† ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛—ā˛žā˛—ā˛ŋ, ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ documentation ā˛…ā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛ŋ.", "backup_onboarding_parts_title": "3-2-1 ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ➇ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛’ā˛ŗā˛—āŗŠā˛‚ā˛Ąā˛ŋā˛Ļāŗ†:", "backup_onboarding_title": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗâ€Œā˛—ā˛ŗāŗ", "backup_settings": "ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ŧāŗ‡ā˛¸āŗ ā˛Ąā˛‚ā˛Ēāŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", @@ -68,18 +69,24 @@ "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} ➅ā˛ĩ➰ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", "confirm_user_pin_code_reset": "➍⺀ā˛ĩ⺁ {user} ➅ā˛ĩ➰ ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", "copy_config_to_clipboard_description": "ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ➏ā˛ŋā˛¸āŗā˛Ÿā˛Žāŗ ā˛•ā˛žā˛¨āŗā˛Ģā˛ŋ➗➰⺇ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ JSON ➆ā˛Ŧāŗā˛œāŗ†ā˛•āŗā˛Ÿāŗ ➆➗ā˛ŋ ā˛•āŗā˛˛ā˛ŋā˛Ēāŗâ€Œā˛Ŧāŗ‹ā˛°āŗā˛Ąāŗâ€Œā˛—āŗ† ➍➕➞ā˛ŋ➏ā˛ŋ", "create_job": "➉ā˛Ļāŗā˛¯āŗ‹ā˛— ➰➚ā˛ŋ➏ā˛ŋ", + "cron_expression": "ā˛•āŗā˛°āŗ‹ā˛¨āŗ ā˛Žā˛•āŗā˛¸āŗâ€Œā˛Ēāŗā˛°āŗ†ā˛ˇā˛¨āŗ", + "cron_expression_description": "ā˛•āŗā˛°ā˛žā˛¨āŗ ā˛¸āŗā˛ĩ➰⺂ā˛Ēā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ā˛¸āŗā˛•āŗā˛¯ā˛žā˛¨ā˛ŋā˛‚ā˛—āŗ ā˛Žā˛§āŗā˛¯ā˛‚ā˛¤ā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ. ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➉ā˛Ļā˛ž. Crontab Guru ā˛…ā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛ŋ", "cron_expression_presets": "ā˛•āŗā˛°ā˛žā˛¨āŗ ➅➭ā˛ŋā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ ā˛Ēāŗ‚ā˛°āŗā˛ĩ➍ā˛ŋ➗ā˛Ļā˛ŋ➗➺⺁", "disable_login": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", "duplicate_detection_job_description": "➒➂ā˛Ļāŗ‡ ➰⺀➤ā˛ŋ➝ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šā˛˛āŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗ ā˛Žāŗ‡ā˛˛āŗ† ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛°ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ. ā˛¸āŗā˛Žā˛žā˛°āŗā˛Ÿāŗ ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ➅ā˛ĩ➞➂ā˛Ŧā˛ŋ➏ā˛ŋā˛Ļāŗ†", + "exclusion_pattern_description": "➍ā˛ŋā˛Žāŗā˛Ž ➞⺈ā˛Ŧāŗā˛°ā˛°ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛•āŗā˛¯ā˛žā˛¨āŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛žā˛— ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛˛ā˛•āŗā˛ˇā˛ŋ➏➞⺁ ā˛Žā˛•āŗā˛¸āŗâ€Œā˛•āŗā˛˛āŗ‚ā˛ˇā˛¨āŗ ā˛Ēāŗā˛¯ā˛žā˛Ÿā˛°āŗā˛¨āŗâ€Œā˛—ā˛ŗāŗ ➍ā˛ŋā˛Žā˛—āŗ† ➅ā˛ĩā˛•ā˛žā˛ļ ā˛¨āŗ€ā˛Ąāŗā˛¤āŗā˛¤ā˛ĩāŗ†. ➍⺀ā˛ĩ⺁ ā˛†ā˛Žā˛Ļ⺁ ā˛Žā˛žā˛Ąā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛Ŧ➝➏ā˛Ļ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛Ļāŗā˛Ļ➰⺆, ➉ā˛Ļā˛žā˛šā˛°ā˛Ŗāŗ†ā˛—āŗ† RAW ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗāŗ.", "export_config_as_json_description": "ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ➏ā˛ŋā˛¸āŗā˛Ÿā˛Žāŗ ā˛•ā˛žā˛¨āŗā˛Ģā˛ŋ➗➰⺇ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ JSON ā˛Ģāŗˆā˛˛āŗ ➆➗ā˛ŋ ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ", "external_libraries_page_description": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛Ŧā˛žā˛šāŗā˛¯ ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ ā˛Ē⺁➟", "face_detection": "ā˛Žāŗā˛– ā˛Ēā˛¤āŗā˛¤āŗ†", + "face_detection_description": "ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ➍ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ† ā˛Žā˛žā˛Ąā˛ŋ. ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛ŋ➗⺆, ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛¤āŗā˛° ā˛Ē➰ā˛ŋ➗➪ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ \"➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ\" (ā˛Žā˛°āŗ-) ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. \"ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ\" ā˛šāŗ†ā˛šāŗā˛šāŗā˛ĩ➰ā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ā˛Žāŗā˛–ā˛Ļ ā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—āŗŠā˛ŗā˛ŋ➏ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ \"ā˛•ā˛žā˛Ŗāŗ†ā˛¯ā˛žā˛—ā˛ŋā˛Ļāŗ†\" ➏➰➤ā˛ŋ ā˛¸ā˛žā˛˛ā˛ŋā˛¨ā˛˛āŗā˛˛ā˛ŋ ➇➰ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Žāŗā˛– ā˛Ēā˛¤āŗā˛¤āŗ† ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛—āŗŠā˛‚ā˛Ą ➍➂➤➰ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛¯ā˛žā˛Ļ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žāŗā˛– ➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛—ā˛žā˛—ā˛ŋ ➏➰ā˛Ļā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ➇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➅ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ➅ā˛Ĩā˛ĩā˛ž ā˛šāŗŠā˛¸ ā˛œā˛¨ā˛°ā˛‚ā˛¤āŗ† ➗⺁➂ā˛Ē⺁ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "facial_recognition_job_description": "ā˛Ēā˛¤āŗā˛¤āŗ†ā˛¯ā˛žā˛Ļ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛œā˛¨ā˛°ā˛žā˛—ā˛ŋ ➗⺁➂ā˛Ē⺁ ā˛Žā˛žā˛Ąā˛ŋ. ā˛Žāŗā˛– ā˛Ēā˛¤āŗā˛¤āŗ† ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛—āŗŠā˛‚ā˛Ą ➍➂➤➰ ➈ ā˛šā˛‚ā˛¤ā˛ĩ⺁ ā˛¨ā˛Ąāŗ†ā˛¯āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ \"ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ\" (ā˛Žā˛°āŗ-) ➗⺁➂ā˛Ē⺁ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†. \"ā˛•ā˛žā˛Ŗāŗ†ā˛¯ā˛žā˛Ļ\" ➏➰➤ā˛ŋ ā˛¸ā˛žā˛˛āŗā˛—ā˛ŗāŗ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋ➏ā˛Ļ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛’ā˛ŗā˛—āŗŠā˛‚ā˛Ąā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛ĩāŗ†.", "failed_job_command": "{job} ā˛Žā˛‚ā˛Ŧ ā˛•āŗ†ā˛˛ā˛¸ā˛•āŗā˛•āŗ† {command} ā˛†ā˛œāŗā˛žāŗ† ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", "force_delete_user_warning": "ā˛Žā˛šāŗā˛šā˛°ā˛ŋ➕⺆: ➇ā˛Ļ⺁ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¤ā˛•āŗā˛ˇā˛Ŗā˛ĩāŗ‡ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➇ā˛Ļā˛¨āŗā˛¨āŗ ➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛.", "image_format": "ā˛¸āŗā˛ĩ➰⺂ā˛Ē", @@ -90,6 +97,7 @@ "image_fullsize_quality_description": "1-100 ➰ā˛ĩ➰⺆➗ā˛ŋ➍ ā˛Ēāŗ‚ā˛°āŗā˛Ŗ-ā˛—ā˛žā˛¤āŗā˛°ā˛Ļ ➚ā˛ŋā˛¤āŗā˛°ā˛Ļ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿ. ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ā˛Ļ⺁ ā˛‰ā˛¤āŗā˛¤ā˛Ž, ➆ā˛Ļ➰⺆ ā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "image_fullsize_title": "ā˛Ēāŗ‚ā˛°āŗā˛Ŗ-ā˛—ā˛žā˛¤āŗā˛°ā˛Ļ ➚ā˛ŋā˛¤āŗā˛° ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "image_prefer_embedded_preview": "ā˛Žā˛‚ā˛Ŧāŗ†ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ēāŗ‚ā˛°āŗā˛ĩā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛—āŗ† ➆ā˛Ļāŗā˛¯ā˛¤āŗ† ā˛¨āŗ€ā˛Ąā˛ŋ", + "image_prefer_embedded_preview_setting_description": "➚ā˛ŋā˛¤āŗā˛° ā˛¸ā˛‚ā˛¸āŗā˛•ā˛°ā˛Ŗāŗ†ā˛—āŗ† ā˛‡ā˛¨āŗâ€Œā˛Ēāŗā˛Ÿāŗ ➆➗ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗā˛Ļā˛žā˛— RAW ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Žā˛‚ā˛Ŧāŗ†ā˛Ąāŗ†ā˛Ąāŗ ā˛Ēāŗ‚ā˛°āŗā˛ĩā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ. ➇ā˛Ļ⺁ ➕⺆➞ā˛ĩ⺁ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛ŋ➗⺆ ā˛šāŗ†ā˛šāŗā˛šāŗ ➍ā˛ŋ➖➰ā˛ĩā˛žā˛Ļ ā˛Ŧā˛Ŗāŗā˛Ŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁, ➆ā˛Ļ➰⺆ ā˛Ēāŗ‚ā˛°āŗā˛ĩā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛¯ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛ĩ⺁ ā˛•āŗā˛¯ā˛žā˛Žāŗ†ā˛°ā˛ž-➅ā˛ĩ➞➂ā˛Ŧā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩ⺁ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛¸ā˛‚ā˛•āŗā˛šā˛ŋ➤ ā˛•ā˛˛ā˛žā˛•āŗƒā˛¤ā˛ŋā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁.", "image_prefer_wide_gamut": "ā˛ĩā˛ŋā˛ļā˛žā˛˛ ā˛ĩāŗā˛¯ā˛žā˛Ēāŗā˛¤ā˛ŋ➗⺆ ➆ā˛Ļāŗā˛¯ā˛¤āŗ† ā˛¨āŗ€ā˛Ąā˛ŋ", "image_prefer_wide_gamut_setting_description": "ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ąā˛ŋā˛¸āŗā˛Ēāŗā˛˛āŗ‡ P3 ā˛Ŧ➺➏ā˛ŋ. ➇ā˛Ļ⺁ ā˛ĩā˛ŋā˛ļā˛žā˛˛ā˛ĩā˛žā˛Ļ ā˛Ŧā˛Ŗāŗā˛Ŗā˛—ā˛ŗ ā˛¸āŗā˛Ĩā˛ŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗ ➕➂ā˛Ē➍ā˛ĩā˛¨āŗā˛¨āŗ ā˛‰ā˛¤āŗā˛¤ā˛Žā˛ĩā˛žā˛—ā˛ŋ ā˛¸ā˛‚ā˛°ā˛•āŗā˛ˇā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ā˛šā˛ŗāŗ†ā˛¯ ā˛Ŧāŗā˛°āŗŒā˛¸ā˛°āŗ ➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩ ā˛šā˛ŗāŗ†ā˛¯ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗāŗ ā˛ĩā˛ŋ➭ā˛ŋā˛¨āŗā˛¨ā˛ĩā˛žā˛—ā˛ŋ ā˛—āŗ‹ā˛šā˛°ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁. ā˛Ŧā˛Ŗāŗā˛Ŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤ā˛Ēāŗā˛Ēā˛ŋ➏➞⺁ sRGB ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ sRGB ➆➗ā˛ŋ ➇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "image_preview_description": "➒➂ā˛Ļāŗ‡ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Žā˛¤āŗā˛¤āŗ ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋā˛•āŗ†ā˛—ā˛žā˛—ā˛ŋ ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛ĩ, ā˛šāŗŠā˛°ā˛¤āŗ†ā˛—āŗ†ā˛¯ā˛˛ā˛žā˛Ļ ā˛Žāŗ†ā˛Ÿā˛žā˛Ąāŗ‡ā˛Ÿā˛ž ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩ ā˛Žā˛§āŗā˛¯ā˛Ž ā˛—ā˛žā˛¤āŗā˛°ā˛Ļ ➚ā˛ŋā˛¤āŗā˛°", @@ -99,6 +107,7 @@ "image_progressive_description": "ā˛•āŗā˛°ā˛Žāŗ‡ā˛Ŗ ā˛˛āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛¨ā˛•āŗā˛•ā˛žā˛—ā˛ŋ JPEG ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛¤ā˛šā˛‚ā˛¤ā˛ĩā˛žā˛—ā˛ŋ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ. ➇ā˛Ļ⺁ WebP ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗ ā˛Žāŗ‡ā˛˛āŗ† ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ē➰ā˛ŋā˛Ŗā˛žā˛Ž ā˛Ŧ⺀➰⺁ā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛.", "image_quality": "ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿ", "image_resolution": "ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗ", + "image_resolution_description": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ˇā˛¨āŗâ€Œā˛—ā˛ŗāŗ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛ĩā˛ŋā˛ĩā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁, ➆ā˛Ļ➰⺆ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛¸ā˛Žā˛¯ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛ĩāŗ†, ā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛Ģāŗˆā˛˛āŗ ā˛—ā˛žā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛ĩāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➆ā˛Ēāŗ ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛•āŗā˛°ā˛ŋā˛¯ā˛žā˛ļāŗ€ā˛˛ā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛Žā˛žā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁.", "image_settings": "➚ā˛ŋā˛¤āŗā˛° ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "image_settings_description": "➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿ ā˛Žā˛¤āŗā˛¤āŗ ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "image_thumbnail_description": "ā˛Žāŗā˛–āŗā˛¯ ā˛Ÿāŗˆā˛Žāŗâ€Œā˛˛āŗˆā˛¨āŗâ€Œā˛¨ā˛‚ā˛¤ā˛š ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗ ➗⺁➂ā˛Ēāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛ĩ ā˛¸āŗā˛Ÿāŗā˛°ā˛ŋā˛Ēāŗā˛Ąāŗ ā˛Žāŗ†ā˛Ÿā˛žā˛Ąāŗ‡ā˛Ÿā˛ž ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩ ā˛¸ā˛Ŗāŗā˛Ŗ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗ", @@ -110,6 +119,7 @@ "job_not_concurrency_safe": "➈ ➕⺆➞➏ā˛ĩ⺁ ā˛¸ā˛šā˛ĩā˛°āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛•āŗā˛•āŗ† ā˛¸āŗā˛°ā˛•āŗā˛ˇā˛ŋ➤ā˛ĩā˛˛āŗā˛˛.", "job_settings": "➕⺆➞➏ā˛Ļ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "job_settings_description": "➕⺆➞➏ā˛Ļ ā˛¸ā˛Žā˛•ā˛žā˛˛āŗ€ā˛¨ā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "jobs_delayed": "{jobCount, plural, other {# ā˛ĩā˛ŋ➺➂ā˛Ŧā˛ĩā˛žā˛¯ā˛ŋ➤⺁}}", "jobs_over_time": "ā˛•ā˛žā˛˛ā˛žā˛¨ā˛‚ā˛¤ā˛°ā˛Ļ ➉ā˛Ļāŗā˛¯āŗ‹ā˛—ā˛—ā˛ŗāŗ", "library_created": "➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ➞⺈ā˛Ŧāŗā˛°ā˛°ā˛ŋ: {library}", "library_deleted": "➞⺈ā˛Ŧāŗā˛°ā˛°ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", @@ -138,6 +148,7 @@ "machine_learning_availability_checks_timeout": "ā˛ĩā˛ŋ➍➂➤ā˛ŋ ➅ā˛ĩ➧ā˛ŋ ā˛Žāŗ€ā˛°ā˛ŋā˛Ļāŗ†", "machine_learning_availability_checks_timeout_description": "ā˛˛ā˛­āŗā˛¯ā˛¤āŗ† ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆➗➺ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Žā˛ŋ➞ā˛ŋā˛¸āŗ†ā˛•āŗ†ā˛‚ā˛Ąāŗā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛¸ā˛Žā˛¯ ā˛Žāŗ€ā˛°ā˛ŋā˛Ļāŗ†", "machine_learning_clip_model": "CLIP ā˛Žā˛žā˛Ļ➰ā˛ŋ", + "machine_learning_clip_model_description": "CLIP ā˛Žā˛žā˛Ļ➰ā˛ŋ➝ ā˛šāŗ†ā˛¸ā˛°ā˛¨āŗā˛¨āŗ here ā˛Ēā˛Ÿāŗā˛Ÿā˛ŋ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛Žā˛žā˛Ļ➰ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛ŋā˛Ļ ➍➂➤➰ ➍⺀ā˛ĩ⺁ ā˛Žā˛˛āŗā˛˛ā˛ž ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛ŋ➗⺆ 'ā˛¸āŗā˛Žā˛žā˛°āŗā˛Ÿāŗ ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿ' ➕⺆➞➏ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ē⺁➍➃ ā˛°ā˛¨āŗ ā˛Žā˛žā˛Ąā˛Ŧ⺇➕⺁ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛—ā˛Žā˛¨ā˛ŋ➏ā˛ŋ.", "machine_learning_duplicate_detection": "➍➕➞⺁ ā˛Ēā˛¤āŗā˛¤āŗ†", "machine_learning_duplicate_detection_enabled": "➍➕➞⺁ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šāŗā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", "machine_learning_duplicate_detection_enabled_description": "➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļ➰⺆, ➍ā˛ŋ➖➰ā˛ĩā˛žā˛—ā˛ŋ ➒➂ā˛Ļāŗ‡ ➰⺀➤ā˛ŋ➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛Ąā˛ŋ-ā˛Ąāŗ‚ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", @@ -147,12 +158,17 @@ "machine_learning_facial_recognition": "ā˛Žāŗā˛– ➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆", "machine_learning_facial_recognition_description": "➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ† ā˛Žā˛žā˛Ąā˛ŋ, ➗⺁➰⺁➤ā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➗⺁➂ā˛Ē⺁ ā˛Žā˛žā˛Ąā˛ŋ", "machine_learning_facial_recognition_model": "ā˛Žāŗā˛– ➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆ ā˛Žā˛žā˛Ļ➰ā˛ŋ", + "machine_learning_facial_recognition_model_description": "ā˛Žā˛žā˛Ļ➰ā˛ŋā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛—ā˛žā˛¤āŗā˛°ā˛Ļ ➅ā˛ĩā˛°āŗ‹ā˛šā˛Ŗ ā˛•āŗā˛°ā˛Žā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Ēā˛Ÿāŗā˛Ÿā˛ŋ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛Žā˛žā˛Ļ➰ā˛ŋ➗➺⺁ ➍ā˛ŋā˛§ā˛žā˛¨ā˛ĩā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛ĩāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Žāŗ†ā˛ŽāŗŠā˛°ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ†, ➆ā˛Ļ➰⺆ ā˛‰ā˛¤āŗā˛¤ā˛Ž ā˛Ģ➞ā˛ŋā˛¤ā˛žā˛‚ā˛ļā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¨āŗ€ā˛Ąāŗā˛¤āŗā˛¤ā˛ĩāŗ†. ā˛Žā˛žā˛Ļ➰ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛ŋā˛Ļ ➍➂➤➰ ➍⺀ā˛ĩ⺁ ā˛Žā˛˛āŗā˛˛ā˛ž ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛ŋ➗⺆ ā˛Žāŗā˛– ā˛Ēā˛¤āŗā˛¤āŗ† ā˛•ā˛žā˛°āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ē⺁➍➃ ā˛šā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧ⺇➕⺁ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛—ā˛Žā˛¨ā˛ŋ➏ā˛ŋ.", "machine_learning_facial_recognition_setting": "ā˛Žāŗā˛– ➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", "machine_learning_facial_recognition_setting_description": "➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļ➰⺆, ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žāŗā˛– ➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛—ā˛žā˛—ā˛ŋ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛ ā˛Žā˛¤āŗā˛¤āŗ ā˛Žā˛•āŗā˛¸āŗâ€Œā˛Ēāŗā˛˛āŗ‹ā˛°āŗ ā˛Ē⺁➟ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➜➍➰ ā˛ĩā˛ŋā˛­ā˛žā˛—ā˛ĩā˛¨āŗā˛¨āŗ ā˛­ā˛°āŗā˛¤ā˛ŋ ā˛Žā˛žā˛Ąāŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛.", "machine_learning_max_detection_distance": "➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ēā˛¤āŗā˛¤āŗ† ā˛Ļ⺂➰", + "machine_learning_max_detection_distance_description": "ā˛Žā˛°ā˛Ąāŗ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍➕➞ā˛ŋ ā˛Žā˛‚ā˛Ļ⺁ ā˛Ē➰ā˛ŋ➗➪ā˛ŋ➏➞⺁ ➅ā˛ĩ⺁➗➺ ā˛¨ā˛Ąāŗā˛ĩā˛ŋ➍ ➗➰ā˛ŋā˛ˇāŗā˛  ➅➂➤➰ (0.001–0.1 ā˛ĩāŗā˛¯ā˛žā˛Ēāŗā˛¤ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ). ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋā˛Ļ➰⺆ ā˛šāŗ†ā˛šāŗā˛šāŗ ➍➕➞ā˛ŋ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šā˛Ŧā˛šāŗā˛Ļ⺁, ➆ā˛Ļ➰⺆ ➤ā˛Ēāŗā˛Ē⺁ ā˛§ā˛¨ā˛žā˛¤āŗā˛Žā˛• ā˛Ģ➞ā˛ŋā˛¤ā˛žā˛‚ā˛ļ➗➺⺁ ā˛‰ā˛‚ā˛Ÿā˛žā˛—āŗā˛ĩ ā˛¸ā˛žā˛§āŗā˛¯ā˛¤āŗ† ➇ā˛Ļāŗ†.", "machine_learning_max_recognition_distance": "➗➰ā˛ŋā˛ˇāŗā˛  ➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆ ā˛Ļ⺂➰", + "machine_learning_max_recognition_distance_description": "ā˛Žā˛°ā˛Ąāŗ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➒➂ā˛Ļāŗ‡ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ ā˛Žā˛‚ā˛Ļ⺁ ā˛Ē➰ā˛ŋ➗➪ā˛ŋ➏➞⺁ ➅ā˛ĩ⺁➗➺ ā˛¨ā˛Ąāŗā˛ĩā˛ŋ➍ ➗➰ā˛ŋā˛ˇāŗā˛  ➅➂➤➰ (0–2 ā˛ĩāŗā˛¯ā˛žā˛Ēāŗā˛¤ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ). ➈ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛Žā˛žā˛Ąā˛ŋā˛Ļ➰⺆ ➇ā˛Ŧāŗā˛Ŧā˛°ā˛¨āŗā˛¨āŗ ➒➂ā˛Ļāŗ‡ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ ā˛Žā˛‚ā˛Ļ⺁ ➞⺇ā˛Ŧā˛˛āŗ ā˛Žā˛žā˛Ąāŗā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ➤ā˛Ēāŗā˛Ēā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁; ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➏ā˛ŋā˛Ļ➰⺆ ➅ā˛Ļāŗ‡ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Žā˛°ā˛Ąāŗ ā˛ĩā˛ŋ➭ā˛ŋā˛¨āŗā˛¨ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➗➺➂➤⺆ ➞⺇ā˛Ŧā˛˛āŗ ā˛Žā˛žā˛Ąāŗā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ➤ā˛Ēāŗā˛Ēā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁. ➇ā˛Ŧāŗā˛Ŧā˛°ā˛¨āŗā˛¨āŗ ➒➂ā˛Ļā˛žā˛—ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ⺁ ➏⺁➞➭, ➆ā˛Ļ➰⺆ ➒ā˛Ŧāŗā˛Ŧ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➇ā˛Ŧāŗā˛Ŧā˛°ā˛žā˛—ā˛ŋ ā˛ĩā˛ŋ➭➜ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ⺁ ā˛•ā˛ˇāŗā˛Ÿā˛ĩā˛žā˛—ā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛Ĩāŗā˛°āŗ†ā˛ļāŗâ€Œā˛šāŗ‹ā˛˛āŗā˛Ąāŗ ā˛Ŧ➺➏⺁ā˛ĩ⺁ā˛Ļ⺁ ā˛‰ā˛¤āŗā˛¤ā˛Ž.", "machine_learning_min_detection_score": "➕➍ā˛ŋā˛ˇāŗā˛  ā˛Ēā˛¤āŗā˛¤āŗ† ā˛¸āŗā˛•āŗ‹ā˛°āŗ", + "machine_learning_min_detection_score_description": "ā˛Žāŗā˛–ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šā˛˛āŗ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋ➰⺁ā˛ĩ ➕➍ā˛ŋā˛ˇāŗā˛  ā˛ĩā˛ŋā˛ļāŗā˛ĩā˛žā˛¸ ā˛¸āŗā˛•āŗ‹ā˛°āŗ (0–1 ā˛ĩāŗā˛¯ā˛žā˛Ēāŗā˛¤ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ). ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋā˛Ļ➰⺆ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šā˛Ŧā˛šāŗā˛Ļ⺁, ➆ā˛Ļ➰⺆ ➤ā˛Ēāŗā˛Ē⺁ ā˛§ā˛¨ā˛žā˛¤āŗā˛Žā˛• ā˛Ģ➞ā˛ŋā˛¤ā˛žā˛‚ā˛ļ➗➺⺁ ā˛‰ā˛‚ā˛Ÿā˛žā˛—āŗā˛ĩ ā˛¸ā˛žā˛§āŗā˛¯ā˛¤āŗ† ➇ā˛Ļāŗ†.", "machine_learning_min_recognized_faces": "➕➍ā˛ŋā˛ˇāŗā˛  ➗⺁➰⺁➤ā˛ŋā˛¸ā˛˛āŗā˛Ēā˛Ÿāŗā˛Ÿ ā˛Žāŗā˛–ā˛—ā˛ŗāŗ", + "machine_learning_min_recognized_faces_description": "➒ā˛Ŧāŗā˛Ŧ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏➞⺁ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋ➰⺁ā˛ĩ ➗⺁➰⺁➤ā˛ŋā˛¸ā˛˛āŗā˛Ēā˛Ÿāŗā˛Ÿ ā˛Žāŗā˛–ā˛—ā˛ŗ ➕➍ā˛ŋā˛ˇāŗā˛  ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†. ➈ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➏ā˛ŋā˛Ļ➰⺆ ā˛Žāŗā˛– ➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆ ā˛šāŗ†ā˛šāŗā˛šāŗ ➍ā˛ŋ➖➰ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ➒➂ā˛Ļ⺁ ā˛Žāŗā˛–ā˛ĩā˛¨āŗā˛¨āŗ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➗⺆ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛Ļāŗ‡ ➉➺ā˛ŋ➝⺁ā˛ĩ ā˛¸ā˛žā˛§āŗā˛¯ā˛¤āŗ† ā˛šāŗ†ā˛šāŗā˛šāŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "machine_learning_ocr": "➓➏ā˛ŋā˛†ā˛°āŗ", "machine_learning_ocr_description": "➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ➍ ā˛Ēā˛ āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➗⺁➰⺁➤ā˛ŋ➏➞⺁ ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ", "machine_learning_ocr_enabled": "OCR ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", @@ -160,7 +176,9 @@ "machine_learning_ocr_max_resolution": "➗➰ā˛ŋā˛ˇāŗā˛  ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ˇā˛¨āŗ", "machine_learning_ocr_max_resolution_description": "➈ ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ˇā˛¨āŗ ā˛Žāŗ‡ā˛˛ā˛ŋ➍ ā˛Ēāŗ‚ā˛°āŗā˛ĩā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛•ā˛žā˛° ➅➍⺁ā˛Ēā˛žā˛¤ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛‚ā˛°ā˛•āŗā˛ˇā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Žā˛°āŗā˛—ā˛žā˛¤āŗā˛°ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ ā˛šāŗ†ā˛šāŗā˛šāŗ ➍ā˛ŋ➖➰ā˛ĩā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛ĩāŗ†, ➆ā˛Ļ➰⺆ ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛Žā˛¤āŗā˛¤āŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Žāŗ†ā˛ŽāŗŠā˛°ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏➞⺁ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛¸ā˛Žā˛¯ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "machine_learning_ocr_min_detection_score": "➕➍ā˛ŋā˛ˇāŗā˛  ā˛Ēā˛¤āŗā˛¤āŗ† ā˛¸āŗā˛•āŗ‹ā˛°āŗ", + "machine_learning_ocr_min_detection_score_description": "ā˛Ēā˛ āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šā˛˛āŗ ➕➍ā˛ŋā˛ˇāŗā˛  ā˛ĩā˛ŋā˛ļāŗā˛ĩā˛žā˛¸ā˛žā˛°āŗā˛š ā˛¸āŗā˛•āŗ‹ā˛°āŗ 0-1. ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Ēā˛ āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šāŗā˛¤āŗā˛¤ā˛ĩāŗ† ➆ā˛Ļ➰⺆ ➤ā˛Ēāŗā˛Ē⺁ ā˛§ā˛¨ā˛žā˛¤āŗā˛Žā˛•ā˛¤āŗ†ā˛—āŗ† ā˛•ā˛žā˛°ā˛Ŗā˛ĩā˛žā˛—ā˛Ŧā˛šāŗā˛Ļ⺁.", "machine_learning_ocr_min_recognition_score": "➕➍ā˛ŋā˛ˇāŗā˛  ā˛Ąā˛ŋā˛Ÿāŗ†ā˛•āŗā˛ˇā˛¨āŗ ➅➂➕", + "machine_learning_ocr_min_score_recognition_description": "ā˛Ēā˛¤āŗā˛¤āŗ†ā˛¯ā˛žā˛Ļ ā˛Ēā˛ āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➗⺁➰⺁➤ā˛ŋ➏➞⺁ ➕➍ā˛ŋā˛ˇāŗā˛  ā˛ĩā˛ŋā˛ļāŗā˛ĩā˛žā˛¸ā˛žā˛°āŗā˛š ā˛¸āŗā˛•āŗ‹ā˛°āŗ 0-1. ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Ēā˛ āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➗⺁➰⺁➤ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ† ➆ā˛Ļ➰⺆ ➤ā˛Ēāŗā˛Ē⺁ ā˛§ā˛¨ā˛žā˛¤āŗā˛Žā˛•ā˛¤āŗ†ā˛—āŗ† ā˛•ā˛žā˛°ā˛Ŗā˛ĩā˛žā˛—ā˛Ŧā˛šāŗā˛Ļ⺁.", "machine_learning_ocr_model": "OCR ā˛Žā˛žā˛Ąāŗ†ā˛˛āŗ", "machine_learning_ocr_model_description": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛Žāŗ‹ā˛Ąāŗ†ā˛˛āŗā˛—ā˛ŗāŗ ā˛ŽāŗŠā˛Ŧāŗˆā˛˛āŗ ā˛Žāŗ‹ā˛Ąāŗ†ā˛˛āŗā˛—ā˛ŗā˛ŋ➗ā˛ŋ➂➤ ā˛šāŗ†ā˛šāŗā˛šāŗ ➍ā˛ŋ➖➰ā˛ĩā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛ĩāŗ†, ➆ā˛Ļ➰⺆ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Žāŗ†ā˛ŽāŗŠā˛°ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ŧ➺➏➞⺁ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛¸ā˛Žā˛¯ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛ĩāŗ†.", "machine_learning_settings": "ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋ➕⺆ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", @@ -169,6 +187,7 @@ "machine_learning_smart_search_description": "CLIP ā˛Žā˛‚ā˛Ŧāŗ†ā˛Ąā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛°āŗā˛Ĩā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗā˛Ąāŗā˛•ā˛ŋ", "machine_learning_smart_search_enabled": "ā˛¸āŗā˛Žā˛žā˛°āŗā˛Ÿāŗ ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", "machine_learning_smart_search_enabled_description": "➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļ➰⺆, ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛Žā˛žā˛°āŗā˛Ÿāŗ ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛.", + "machine_learning_url_description": "ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋ➕⺆ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ URL. ➒➂ā˛Ļā˛•āŗā˛•ā˛ŋ➂➤ ā˛šāŗ†ā˛šāŗā˛šāŗ URL ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➒ā˛Ļ➗ā˛ŋ➏ā˛ŋā˛Ļ➰⺆, ā˛ŽāŗŠā˛Ļ➞ā˛ŋ➍ā˛ŋ➂ā˛Ļ ā˛•āŗŠā˛¨āŗ†ā˛¯ā˛ĩ➰⺆➗⺆, ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛¸ā˛°āŗā˛ĩā˛°āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛•āŗā˛°ā˛ŋ➝ā˛ŋ➏⺁ā˛ĩā˛ĩ➰⺆➗⺆ ➒➂ā˛ĻāŗŠā˛‚ā˛Ļā˛žā˛—ā˛ŋ ā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛•āŗā˛°ā˛ŋ➝ā˛ŋ➏ā˛Ļ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➅ā˛ĩ➰⺁ ā˛†ā˛¨āŗâ€Œā˛˛āŗˆā˛¨āŗâ€Œā˛—āŗ† ā˛šā˛ŋ➂➤ā˛ŋ➰⺁➗⺁ā˛ĩā˛ĩ➰⺆➗⺆ ā˛¤ā˛žā˛¤āŗā˛•ā˛žā˛˛ā˛ŋ➕ā˛ĩā˛žā˛—ā˛ŋ ➍ā˛ŋā˛°āŗā˛˛ā˛•āŗā˛ˇā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "maintenance_delete_backup": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ➅➺ā˛ŋ➏ā˛ŋ", "maintenance_delete_backup_description": "➈ ā˛Ģāŗˆā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "maintenance_delete_error": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ➅➺ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†.", @@ -183,17 +202,23 @@ "maintenance_start": "➍ā˛ŋā˛°āŗā˛ĩā˛šā˛Ŗā˛ž ā˛Žāŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏ā˛ŋ", "maintenance_start_error": "➍ā˛ŋā˛°āŗā˛ĩā˛šā˛Ŗā˛ž ā˛•āŗā˛°ā˛Žā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†.", "maintenance_upload_backup": "ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ŧāŗ‡ā˛¸āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Ģāŗˆā˛˛āŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "maintenance_upload_backup_error": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—ā˛˛ā˛ŋā˛˛āŗā˛˛, ➅ā˛Ļ⺁ .sql/.sql.gz ā˛Ģāŗˆā˛˛āŗ ➆➗ā˛ŋā˛Ļ⺆➝⺇?", "manage_concurrency": "ā˛ā˛•ā˛•ā˛žā˛˛ā˛ŋā˛•ā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "manage_concurrency_description": "➉ā˛Ļāŗā˛¯āŗ‹ā˛— ā˛¸ā˛Žā˛•ā˛žā˛˛āŗ€ā˛¨ā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏➞⺁ ➉ā˛Ļāŗā˛¯āŗ‹ā˛—ā˛—ā˛ŗ ā˛Ēāŗā˛Ÿā˛•āŗā˛•āŗ† ā˛¨āŗā˛¯ā˛žā˛ĩā˛ŋā˛—āŗ‡ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ", "manage_log_settings": "ā˛˛ā˛žā˛—āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "map_dark_style": "ā˛Ąā˛žā˛°āŗā˛•āŗ ā˛ļ⺈➞ā˛ŋ", "map_enable_description": "ā˛¨ā˛•āŗā˛ˇāŗ† ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", "map_gps_settings": "ā˛¨ā˛•āŗā˛ˇāŗ† ā˛Žā˛¤āŗā˛¤āŗ GPS ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "map_gps_settings_description": "ā˛¨ā˛•āŗā˛ˇāŗ† ā˛Žā˛¤āŗā˛¤āŗ GPS (➰ā˛ŋā˛ĩā˛°āŗā˛¸āŗ ➜ā˛ŋā˛¯āŗ‹ā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ) ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "map_implications": "ā˛¨ā˛•āŗā˛ˇāŗ†ā˛¯ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛ĩ⺁ ā˛Ŧā˛žā˛šāŗā˛¯ ā˛Ÿāŗˆā˛˛āŗ ➏⺇ā˛ĩāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➅ā˛ĩ➞➂ā˛Ŧā˛ŋ➏ā˛ŋā˛Ļāŗ† (tiles.immich.cloud)", + "map_light_style": "ā˛Ŧ⺆➺➕ā˛ŋ➍ ā˛ļ⺈➞ā˛ŋ", + "map_manage_reverse_geocoding_settings": "➰ā˛ŋā˛ĩā˛°āŗā˛¸āŗ Reverse Geocoding ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "map_reverse_geocoding": "➰ā˛ŋā˛ĩā˛°āŗā˛¸āŗ ➜ā˛ŋā˛¯āŗ‹ā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ", "map_reverse_geocoding_enable_description": "➰ā˛ŋā˛ĩā˛°āŗā˛¸āŗ ➜ā˛ŋā˛¯āŗ‹ā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", "map_reverse_geocoding_settings": "➰ā˛ŋā˛ĩā˛°āŗā˛¸āŗ ➜ā˛ŋā˛¯āŗ‹ā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "map_settings": "ā˛¨ā˛•āŗā˛ˇāŗ†", "map_settings_description": "ā˛¨ā˛•āŗā˛ˇāŗ† ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "map_style_description": "style.json ā˛¨ā˛•āŗā˛ˇāŗ† ā˛Ĩāŗ€ā˛Žāŗâ€Œā˛—āŗ† URL", "memory_cleanup_job": "ā˛Žāŗ†ā˛ŽāŗŠā˛°ā˛ŋ ā˛¸āŗā˛ĩā˛šāŗā˛›ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆", "memory_generate_job": "ā˛¸āŗā˛Žāŗƒā˛¤ā˛ŋ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļ➍⺆", "metadata_extraction_job": "ā˛Žāŗ†ā˛Ÿā˛žā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛°ā˛¤āŗ†ā˛—āŗ†ā˛¯ā˛ŋ➰ā˛ŋ", @@ -211,6 +236,7 @@ "nightly_tasks_generate_memories_setting": "➍⺆➍ā˛Ēāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ", "nightly_tasks_generate_memories_setting_description": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋ➂ā˛Ļ ā˛šāŗŠā˛¸ ➍⺆➍ā˛Ēāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ", "nightly_tasks_missing_thumbnails_setting": "ā˛•ā˛žā˛Ŗāŗ†ā˛¯ā˛žā˛Ļ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ", + "nightly_tasks_missing_thumbnails_setting_description": "ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļā˛¨āŗ†ā˛—ā˛žā˛—ā˛ŋ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛ŋā˛˛āŗā˛˛ā˛Ļāŗ† ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏➰ā˛Ļā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ➇➰ā˛ŋ➏ā˛ŋ", "nightly_tasks_settings": "ā˛°ā˛žā˛¤āŗā˛°ā˛ŋ➝ ā˛•ā˛žā˛°āŗā˛¯ā˛—ā˛ŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "nightly_tasks_settings_description": "ā˛°ā˛žā˛¤āŗā˛°ā˛ŋ➝ ā˛•ā˛žā˛°āŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "nightly_tasks_start_time_setting": "ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ ā˛¸ā˛Žā˛¯", @@ -219,22 +245,51 @@ "nightly_tasks_sync_quota_usage_setting_description": "ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ā˛Ŧ➺➕⺆➝ ā˛†ā˛§ā˛žā˛°ā˛Ļ ā˛Žāŗ‡ā˛˛āŗ† ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗā˛ž ā˛•āŗ‹ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋ", "no_paths_added": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Žā˛žā˛°āŗā˛—ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛˛āŗā˛˛", "no_pattern_added": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ēāŗā˛¯ā˛žā˛Ÿā˛°āŗā˛¨āŗ ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛˛āŗā˛˛", + "note_apply_storage_label_previous_assets": "ā˛—ā˛Žā˛¨ā˛ŋ➏ā˛ŋ: ➈ ā˛šā˛ŋ➂ā˛Ļāŗ† ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋ➗⺆ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ† ➞⺇ā˛Ŧā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋ➏➞⺁,", "note_cannot_be_changed_later": "ā˛—ā˛Žā˛¨ā˛ŋ➏ā˛ŋ: ➇ā˛Ļā˛¨āŗā˛¨āŗ ➍➂➤➰ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛!", "notification_email_from_address": "ā˛ĩā˛ŋā˛ŗā˛žā˛¸ā˛Ļā˛ŋ➂ā˛Ļ", + "notification_email_from_address_description": "ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ā˛ĩā˛ĩ➰ ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛ĩā˛ŋā˛ŗā˛žā˛¸, ➉ā˛Ļā˛žā˛šā˛°ā˛Ŗāŗ†ā˛—āŗ†: \"Immich Photo Server \". ā˛‡ā˛Žāŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏➞⺁ ➍ā˛ŋā˛Žā˛—āŗ† ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ā˛ĩā˛ŋā˛ŗā˛žā˛¸ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏⺁ā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛–ā˛šā˛ŋ➤ā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ.", + "notification_email_host_description": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ ā˛šāŗ‹ā˛¸āŗā˛Ÿāŗ (➉ā˛Ļā˛ž. smtp.immich.app)", "notification_email_ignore_certificate_errors": "ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛° ā˛Ļāŗ‹ā˛ˇā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛˛ā˛•āŗā˛ˇā˛ŋ➏ā˛ŋ", "notification_email_ignore_certificate_errors_description": "TLS ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛° ā˛ŽāŗŒā˛˛āŗā˛¯āŗ€ā˛•ā˛°ā˛Ŗ ā˛Ļāŗ‹ā˛ˇā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛˛ā˛•āŗā˛ˇā˛ŋ➏ā˛ŋ (ā˛ļā˛ŋā˛Ģā˛žā˛°ā˛¸āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛˛āŗā˛˛)", "notification_email_password_description": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛Ļ⺃ā˛ĸ⺀➕➰ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Ŧ➺➏ā˛Ŧāŗ‡ā˛•ā˛žā˛Ļ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ", "notification_email_port_description": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ ā˛Ēāŗ‹ā˛°āŗā˛Ÿāŗ (➉ā˛Ļā˛ž. 25, 465, ➅ā˛Ĩā˛ĩā˛ž 587)", "notification_email_secure": "ā˛Žā˛¸āŗâ€Œā˛Žā˛‚ā˛Ÿā˛ŋā˛Ēā˛ŋā˛Žā˛¸āŗ", + "notification_email_secure_description": "SMTPS (TLS ā˛Žāŗ‡ā˛˛āŗ† SMTP) ā˛Ŧ➺➏ā˛ŋ", "notification_email_sent_test_email_button": "ā˛Ēā˛°āŗ€ā˛•āŗā˛ˇā˛ž ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➉➺ā˛ŋ➏ā˛ŋ", "notification_email_setting_description": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏➞⺁ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "notification_email_test_email": "ā˛Ēā˛°āŗ€ā˛•āŗā˛ˇā˛ž ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋ", "notification_email_test_email_failed": "ā˛Ēā˛°āŗ€ā˛•āŗā˛ˇā˛ž ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†, ➍ā˛ŋā˛Žāŗā˛Ž ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ", + "notification_email_test_email_sent": "{email}➗⺆ ā˛Ēā˛°āŗ€ā˛•āŗā˛ˇā˛ž ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛•ā˛ŗāŗā˛šā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛‡ā˛¨āŗâ€Œā˛Ŧā˛žā˛•āŗā˛¸āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ.", + "notification_email_username_description": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛Ļ⺃ā˛ĸ⺀➕➰ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Ŧ➺➏ā˛Ŧāŗ‡ā˛•ā˛žā˛Ļ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛šāŗ†ā˛¸ā˛°āŗ", "notification_enable_email_notifications": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", "notification_settings": "➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ† ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", "notification_settings_description": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ➏⺇➰ā˛ŋā˛Ļ➂➤⺆ ➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ† ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "oauth_auto_launch": "ā˛¸āŗā˛ĩ➝➂ ā˛‰ā˛Ąā˛žā˛ĩ➪⺆", + "oauth_auto_launch_description": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛Ēāŗā˛Ÿā˛•āŗā˛•āŗ† ā˛¨āŗā˛¯ā˛žā˛ĩā˛ŋā˛—āŗ‡ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ➍➂➤➰ OAuth ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛šā˛°ā˛ŋā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏ā˛ŋ", + "oauth_auto_register": "ā˛¸āŗā˛ĩ➝➂ ➍⺋➂ā˛Ļ➪ā˛ŋ", + "oauth_auto_register_description": "OAuth ā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛¸āŗˆā˛¨āŗ ā˛‡ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ➍➂➤➰ ā˛šāŗŠā˛¸ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ➍⺋➂ā˛Ļā˛žā˛¯ā˛ŋ➏ā˛ŋ", + "oauth_button_text": "ā˛Ŧā˛Ÿā˛¨āŗ ā˛Ēā˛ āŗā˛¯", + "oauth_client_secret_description": "ā˛—āŗŒā˛Ēāŗā˛¯ ā˛•āŗā˛˛āŗˆā˛‚ā˛Ÿāŗâ€Œā˛—āŗ† ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†, ➅ā˛Ĩā˛ĩā˛ž ā˛¸ā˛žā˛°āŗā˛ĩ➜➍ā˛ŋ➕ ā˛•āŗā˛˛āŗˆā˛‚ā˛Ÿāŗâ€Œā˛—āŗ† PKCE (ā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛•āŗā˛¸āŗâ€Œā˛šāŗ‡ā˛‚ā˛œāŗâ€Œā˛—ā˛žā˛—ā˛ŋ ā˛Ēāŗā˛°āŗ‚ā˛Ģāŗ ➕⺀) ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋā˛˛āŗā˛˛ā˛Ļā˛ŋā˛Ļāŗā˛Ļ➰⺆.", + "oauth_enable_description": "OAuth ā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ", + "oauth_mobile_redirect_uri": "ā˛ŽāŗŠā˛Ŧāŗˆā˛˛āŗ ā˛Žā˛°āŗā˛¨ā˛ŋā˛°āŗā˛Ļāŗ‡ā˛ļ➍ URI", + "oauth_mobile_redirect_uri_override": "ā˛ŽāŗŠā˛Ŧāŗˆā˛˛āŗ ā˛Žā˛°āŗā˛¨ā˛ŋā˛°āŗā˛Ļāŗ‡ā˛ļ➍ URI ➅➤ā˛ŋā˛•āŗā˛°ā˛Žā˛Ŗ", + "oauth_mobile_redirect_uri_override_description": "''{callback}'' ā˛¨ā˛‚ā˛¤ā˛š ā˛ŽāŗŠā˛Ŧāŗˆā˛˛āŗ URI ā˛…ā˛¨āŗā˛¨āŗ OAuth ā˛Ēāŗ‚ā˛°āŗˆā˛•āŗ†ā˛Ļā˛žā˛°ā˛°āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏ā˛Ļā˛ŋā˛Ļāŗā˛Ļā˛žā˛— ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "oauth_role_claim": "ā˛Ēā˛žā˛¤āŗā˛°ā˛Ļ ā˛šā˛•āŗā˛•āŗ", + "oauth_role_claim_description": "➈ ā˛šā˛•āŗā˛•ā˛ŋ➍ ➉ā˛Ēā˛¸āŗā˛Ĩā˛ŋ➤ā˛ŋ➝ ā˛†ā˛§ā˛žā˛°ā˛Ļ ā˛Žāŗ‡ā˛˛āŗ† ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ĩā˛¨āŗā˛¨āŗ ā˛¨āŗ€ā˛Ąā˛ŋ. ā˛šā˛•āŗā˛•ā˛ŋā˛¨ā˛˛āŗā˛˛ā˛ŋ 'ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°' ➅ā˛Ĩā˛ĩā˛ž '➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛•' ➇➰ā˛Ŧā˛šāŗā˛Ļ⺁.", + "oauth_settings": "OAuth", + "oauth_settings_description": "OAuth ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "oauth_settings_more_details": "➈ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛Ļ ➕⺁➰ā˛ŋ➤⺁ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ĩā˛ŋā˛ĩ➰➗➺ā˛ŋā˛—ā˛žā˛—ā˛ŋ, docs ā˛…ā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛ŋ.", + "oauth_storage_label_claim": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ† ➞⺇ā˛Ŧā˛˛āŗ ā˛šā˛•āŗā˛•āŗ", + "oauth_storage_label_claim_description": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛¸ā˛‚ā˛—āŗā˛°ā˛š ➞⺇ā˛Ŧā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ➈ ā˛šā˛•āŗā˛•ā˛ŋ➍ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛•āŗā˛•āŗ† ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ.", "oauth_storage_quota_claim": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ† ā˛•āŗ‹ā˛Ÿā˛ž ā˛šā˛•āŗā˛•āŗ", + "oauth_storage_quota_claim_description": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗā˛ž ā˛•āŗ‹ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ➈ ā˛šā˛•āŗā˛•ā˛ŋ➍ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛•āŗā˛•āŗ† ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ.", + "oauth_storage_quota_default": "ā˛Ąāŗ€ā˛Ģā˛žā˛˛āŗā˛Ÿāŗ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗā˛ž ā˛•āŗ‹ā˛Ÿā˛ž (GiB)", + "oauth_storage_quota_default_description": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛•āŗā˛˛āŗˆā˛Žāŗ ➒ā˛Ļ➗ā˛ŋ➏ā˛Ļā˛ŋā˛Ļāŗā˛Ļā˛žā˛— GiB ā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛•āŗ‹ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛Ŧ⺇➕⺁.", + "oauth_timeout": "ā˛ĩā˛ŋ➍➂➤ā˛ŋ ➅ā˛ĩ➧ā˛ŋ ā˛Žāŗ€ā˛°ā˛ŋā˛Ļāŗ†", + "oauth_timeout_description": "ā˛ĩā˛ŋ➍➂➤ā˛ŋ➗➺ā˛ŋ➗⺆ ā˛Žā˛ŋ➞ā˛ŋā˛¸āŗ†ā˛•āŗ†ā˛‚ā˛Ąāŗā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛¸ā˛Žā˛¯ ā˛Žāŗ€ā˛°ā˛ŋā˛Ļāŗ†", + "ocr_job_description": "➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ➍ ā˛Ēā˛ āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➗⺁➰⺁➤ā˛ŋ➏➞⺁ ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ", + "password_enable_description": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ", "password_settings": "ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ", "password_settings_description": "ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "paths_validated_successfully": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Žā˛žā˛°āŗā˛—ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛ŽāŗŒā˛˛āŗā˛¯āŗ€ā˛•ā˛°ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", @@ -242,80 +297,822 @@ "queue_details": "➏➰ā˛Ļā˛ŋ ā˛ĩā˛ŋā˛ĩ➰➗➺⺁", "queues": "➕⺆➞➏ā˛Ļ ➏➰➤ā˛ŋ ā˛¸ā˛žā˛˛āŗā˛—ā˛ŗāŗ", "queues_page_description": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ➕⺆➞➏ā˛Ļ ➏➰➤ā˛ŋ ā˛Ē⺁➟", + "quota_size_gib": "ā˛•āŗ‹ā˛Ÿā˛ž ā˛—ā˛žā˛¤āŗā˛° (GiB)", + "refreshing_all_libraries": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "registration": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ➍⺋➂ā˛Ļ➪ā˛ŋ", + "registration_description": "➍⺀ā˛ĩ⺁ ➏ā˛ŋā˛¸āŗā˛Ÿā˛‚ā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛ŽāŗŠā˛Ļ➞ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛žā˛—ā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ, ➍ā˛ŋā˛Žāŗā˛Žā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛•ā˛°ā˛žā˛—ā˛ŋ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛†ā˛Ąā˛ŗā˛ŋā˛¤ā˛žā˛¤āŗā˛Žā˛• ā˛•ā˛žā˛°āŗā˛¯ā˛—ā˛ŗā˛ŋ➗⺆ ➜ā˛ĩā˛žā˛Ŧāŗā˛Ļā˛žā˛°ā˛°ā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤āŗ€ā˛°ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛šāŗ†ā˛šāŗā˛šāŗā˛ĩ➰ā˛ŋ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➍⺀ā˛ĩ⺁ ➰➚ā˛ŋā˛¸āŗā˛¤āŗā˛¤āŗ€ā˛°ā˛ŋ.", + "remove_failed_jobs": "ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛Ļ ā˛•āŗ†ā˛˛ā˛¸ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋ", + "require_password_change_on_login": "ā˛ŽāŗŠā˛Ļ➞ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧāŗ‡ā˛•ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "reset_settings_to_default": "ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ąāŗ€ā˛Ģā˛žā˛˛āŗā˛Ÿāŗâ€Œā˛—āŗ† ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "reset_settings_to_recent_saved": "ā˛‡ā˛¤āŗā˛¤āŗ€ā˛šāŗ†ā˛—āŗ† ➉➺ā˛ŋ➏ā˛ŋā˛Ļ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "scanning_library": "ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛•āŗā˛¯ā˛žā˛¨āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "search_jobs": "➉ā˛Ļāŗā˛¯āŗ‹ā˛—ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗā˛Ąāŗā˛•ā˛ŋâ€Ļ", + "send_welcome_email": "ā˛¸āŗā˛ĩā˛žā˛—ā˛¤ ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋ", + "server_external_domain_settings": "ā˛Ŧā˛žā˛šāŗā˛¯ ā˛ĄāŗŠā˛Žāŗ‡ā˛¨āŗ", + "server_external_domain_settings_description": "ā˛Ŧā˛žā˛šāŗā˛¯ ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ā˛Ŧ➺➏⺁ā˛ĩ ā˛ĄāŗŠā˛Žāŗ‡ā˛¨āŗ", + "server_public_users": "ā˛¸ā˛žā˛°āŗā˛ĩ➜➍ā˛ŋ➕ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗ", + "server_public_users_description": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ (ā˛šāŗ†ā˛¸ā˛°āŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛‡ā˛Žāŗ‡ā˛˛āŗ) ā˛Ēā˛Ÿāŗā˛Ÿā˛ŋ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļā˛žā˛—, ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛Ēā˛Ÿāŗā˛Ÿā˛ŋ➝⺁ ➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛ŋ➗⺆ ā˛Žā˛žā˛¤āŗā˛° ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "server_settings": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "server_settings_description": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "server_stats_page_description": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛¸ā˛°āŗā˛ĩā˛°āŗ ➅➂➕ā˛ŋ➅➂ā˛ļ➗➺ ā˛Ē⺁➟", + "server_welcome_message": "ā˛¸āŗā˛ĩā˛žā˛—ā˛¤ ➏➂ā˛Ļāŗ‡ā˛ļ", + "server_welcome_message_description": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛Ē⺁➟ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ➏➂ā˛Ļāŗ‡ā˛ļ.", + "settings_page_description": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗ ā˛Ē⺁➟", + "sidecar_job": "ā˛¸āŗˆā˛Ąāŗâ€Œā˛•ā˛žā˛°āŗ ā˛Žāŗ†ā˛Ÿā˛žā˛Ąāŗ‡ā˛Ÿā˛ž", + "sidecar_job_description": "ā˛Ģāŗˆā˛˛āŗâ€Œā˛¸ā˛ŋā˛¸āŗā˛Ÿā˛Žāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛¸āŗˆā˛Ąāŗâ€Œā˛•ā˛žā˛°āŗ ā˛Žāŗ†ā˛Ÿā˛žā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛ĩ⺇➎ā˛ŋ➏ā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ➏ā˛ŋā˛‚ā˛•āŗā˛°āŗŠā˛¨āŗˆā˛¸āŗ ā˛Žā˛žā˛Ąā˛ŋ", + "slideshow_duration_description": "ā˛Ēāŗā˛°ā˛¤ā˛ŋ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏➞⺁ ā˛¸āŗ†ā˛•āŗ†ā˛‚ā˛Ąāŗā˛—ā˛ŗ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†", + "smart_search_job_description": "ā˛¸āŗā˛Žā˛žā˛°āŗā˛Ÿāŗ ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏➞⺁ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛¯ā˛‚ā˛¤āŗā˛° ➕➞ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛°ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ", + "storage_template_date_time_description": "ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•-ā˛¸ā˛Žā˛¯ā˛Ļ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ ā˛°ā˛šā˛¨āŗ†ā˛¯ ā˛¸ā˛Žā˛¯ā˛¸āŗā˛Ÿāŗā˛¯ā˛žā˛‚ā˛Ēāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "storage_template_date_time_sample": "ā˛Žā˛žā˛Ļ➰ā˛ŋ ā˛¸ā˛Žā˛¯ {date}", + "storage_template_enable_description": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛š ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛Žā˛‚ā˛œā˛ŋā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "storage_template_hash_verification_enabled": "ā˛šāŗā˛¯ā˛žā˛ļāŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "storage_template_hash_verification_enabled_description": "ā˛šāŗā˛¯ā˛žā˛ļāŗ ā˛Ē➰ā˛ŋā˛ļāŗ€ā˛˛ā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➇ā˛Ļ➰ ā˛Ē➰ā˛ŋā˛Ŗā˛žā˛Žā˛—ā˛ŗ ā˛Ŧā˛—āŗā˛—āŗ† ➍ā˛ŋā˛Žā˛—āŗ† ā˛–ā˛šā˛ŋ➤ā˛ĩā˛ŋā˛˛āŗā˛˛ā˛Ļā˛ŋā˛Ļāŗā˛Ļ➰⺆ ➇ā˛Ļā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛Ŧāŗ‡ā˛Ąā˛ŋ", + "storage_template_migration": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ† ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛ĩ➞➏⺆", + "storage_template_migration_description": "➈ ā˛šā˛ŋ➂ā˛Ļāŗ† ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋ➗⺆ ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ {template} ā˛…ā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋ➏ā˛ŋ", + "storage_template_migration_info": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ† ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛ĩā˛ŋā˛¸āŗā˛¤ā˛°ā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛Ŗāŗā˛Ŗā˛•āŗā˛ˇā˛°ā˛•āŗā˛•āŗ† ā˛Ē➰ā˛ŋā˛ĩā˛°āŗā˛¤ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩ➪⺆➗➺⺁ ā˛šāŗŠā˛¸ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋ➗⺆ ā˛Žā˛žā˛¤āŗā˛° ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ†. ā˛šā˛ŋ➂ā˛Ļāŗ† ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋ➗⺆ ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗ‚ā˛°āŗā˛ĩā˛žā˛¨āŗā˛ĩ➝ā˛ĩā˛žā˛—ā˛ŋ ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋ➏➞⺁, {job} ā˛…ā˛¨āŗā˛¨āŗ ā˛°ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ.", + "storage_template_migration_job": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ† ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛ĩ➞➏⺆ ➕⺆➞➏", + "storage_template_more_details": "➈ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛Ļ ➕⺁➰ā˛ŋ➤⺁ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ĩā˛ŋā˛ĩ➰➗➺ā˛ŋā˛—ā˛žā˛—ā˛ŋ, Storage Template ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛Ļ➰ implications ā˛…ā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛ŋ", + "storage_template_onboarding_description_v2": "ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļā˛žā˛—, ➈ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛ĩ⺁ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°-ā˛ĩāŗā˛¯ā˛žā˛–āŗā˛¯ā˛žā˛¨ā˛ŋ➤ ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ➆➧➰ā˛ŋ➏ā˛ŋ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩ➝➂-ā˛¸ā˛‚ā˛˜ā˛Ÿā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛—ā˛žā˛—ā˛ŋ, ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ documentation ā˛¨āŗ‹ā˛Ąā˛ŋ.", + "storage_template_path_length": "➅➂ā˛Ļā˛žā˛œāŗ ā˛Žā˛žā˛°āŗā˛— ➉ā˛Ļāŗā˛Ļā˛Ļ ā˛Žā˛ŋ➤ā˛ŋ: {length, number}/{limit, number}", + "storage_template_settings": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ† ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ", + "storage_template_settings_description": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ā˛°ā˛šā˛¨āŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛Ģāŗˆā˛˛āŗ ā˛šāŗ†ā˛¸ā˛°ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "storage_template_user_label": "{label} ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļ⺁ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗā˛ž ➞⺇ā˛Ŧā˛˛āŗ ➆➗ā˛ŋā˛Ļāŗ†", + "system_settings": "➏ā˛ŋā˛¸āŗā˛Ÿā˛‚ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "tag_cleanup_job": "ā˛Ÿāŗā˛¯ā˛žā˛—āŗ ā˛¸āŗā˛ĩā˛šāŗā˛›ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆", + "template_email_available_tags": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ➍⺀ā˛ĩ⺁ ➈ ➕⺆➺➗ā˛ŋ➍ ā˛ĩ⺇➰ā˛ŋ➝⺇ā˛Ŧā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛Ŧā˛šāŗā˛Ļ⺁: {tags}", + "template_email_if_empty": "ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛–ā˛žā˛˛ā˛ŋā˛¯ā˛žā˛—ā˛ŋā˛Ļāŗā˛Ļ➰⺆, ā˛Ąāŗ€ā˛Ģā˛žā˛˛āŗā˛Ÿāŗ ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "template_email_invite_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛†ā˛šāŗā˛ĩā˛žā˛¨ā˛ŋ➏ā˛ŋ", "template_email_preview": "ā˛Ēāŗ‚ā˛°āŗā˛ĩā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†", - "transcoding_tone_mapping": "ā˛Ÿāŗ‹ā˛¨āŗ-ā˛Žāŗā˛¯ā˛žā˛Ēā˛ŋā˛‚ā˛—āŗ" + "template_email_settings": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗâ€Œā˛—ā˛ŗāŗ", + "template_email_update_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋ", + "template_email_welcome": "ā˛¸āŗā˛ĩā˛žā˛—ā˛¤ ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ", + "template_settings": "➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ† ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗâ€Œā˛—ā˛ŗāŗ", + "template_settings_description": "➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "theme_custom_css_settings": "ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ CSS", + "theme_custom_css_settings_description": "ā˛•āŗā˛¯ā˛žā˛¸āŗā˛•āŗ‡ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛¸āŗā˛Ÿāŗˆā˛˛āŗ ā˛ļāŗ€ā˛Ÿāŗâ€Œā˛—ā˛ŗāŗ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛¨ ā˛ĩā˛ŋā˛¨āŗā˛¯ā˛žā˛¸ā˛ĩā˛¨āŗā˛¨āŗ ā˛•ā˛¸āŗā˛Ÿā˛Žāŗˆā˛¸āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➅➍⺁ā˛ĩ⺁ ā˛Žā˛žā˛Ąā˛ŋā˛•āŗŠā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "theme_settings": "ā˛Ĩāŗ€ā˛Žāŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "theme_settings_description": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛ĩāŗ†ā˛Ŧāŗ ā˛‡ā˛‚ā˛Ÿā˛°āŗā˛Ģāŗ‡ā˛¸āŗâ€Œā˛¨ ā˛—āŗā˛°ā˛žā˛šā˛•āŗ€ā˛•ā˛°ā˛Ŗā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "thumbnail_generation_job": "ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ", + "thumbnail_generation_job_description": "ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➗⺆ ā˛ĻāŗŠā˛Ąāŗā˛Ą, ā˛¸ā˛Ŗāŗā˛Ŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛Žā˛¸āŗā˛•ā˛žā˛Ļ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ, ā˛šā˛žā˛—āŗ†ā˛¯āŗ‡ ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➗⺆ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ", + "transcoding_acceleration_api": "ā˛ĩ⺇➗ā˛ĩā˛°āŗā˛§ā˛¨āŗ† API", + "transcoding_acceleration_api_description": "ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛ĩāŗ‡ā˛—ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ā˛ĻāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➏➂ā˛ĩā˛šā˛¨ ā˛¨ā˛Ąāŗ†ā˛¸āŗā˛ĩ API. ➈ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗ 'ā˛‰ā˛¤āŗā˛¤ā˛Ž ā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨': ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛Ļā˛žā˛— ā˛¸ā˛žā˛Ģāŗā˛Ÿāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗâ€Œā˛—āŗ† ā˛šā˛ŋ➂➤ā˛ŋā˛°āŗā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➍ā˛ŋā˛Žāŗā˛Ž ā˛šā˛žā˛°āŗā˛Ąāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛…ā˛¨āŗā˛¨āŗ ➅ā˛ĩ➞➂ā˛Ŧā˛ŋ➏ā˛ŋ VP9 ā˛•ā˛žā˛°āŗā˛¯ā˛¨ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁ ➅ā˛Ĩā˛ĩā˛ž ā˛•ā˛žā˛°āŗā˛¯ā˛¨ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛Ļāŗ‡ ➇➰ā˛Ŧā˛šāŗā˛Ļ⺁.", + "transcoding_acceleration_nvenc": "NVENC (NVIDIA GPU ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†)", + "transcoding_acceleration_qsv": "ā˛•āŗā˛ĩā˛ŋā˛•āŗ ➏ā˛ŋā˛‚ā˛•āŗ (7➍⺇ ā˛¤ā˛˛āŗ†ā˛Žā˛žā˛°ā˛ŋ➍ ā˛‡ā˛‚ā˛Ÿāŗ†ā˛˛āŗ CPU ➅ā˛Ĩā˛ĩā˛ž ➍➂➤➰ā˛Ļ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†)", + "transcoding_acceleration_rkmpp": "RKMPP (ā˛°ā˛žā˛•āŗâ€Œā˛šā˛ŋā˛Ēāŗ SOC ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Žā˛žā˛¤āŗā˛°)", + "transcoding_acceleration_vaapi": "VAAPI", + "transcoding_accepted_audio_codecs": "ā˛¸āŗā˛ĩ⺀➕➰ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ā˛†ā˛Ąā˛ŋ➝⺊ ā˛•āŗ‹ā˛Ąāŗ†ā˛•āŗâ€Œā˛—ā˛ŗāŗ", + "transcoding_accepted_audio_codecs_description": "ā˛¯ā˛žā˛ĩ ā˛†ā˛Ąā˛ŋ➝⺊ ā˛•āŗ‹ā˛Ąāŗ†ā˛•āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąāŗā˛ĩ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ. ➕⺆➞ā˛ĩ⺁ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ➍⺀➤ā˛ŋ➗➺ā˛ŋ➗⺆ ā˛Žā˛žā˛¤āŗā˛° ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_accepted_containers": "ā˛¸āŗā˛ĩ⺀➕➰ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ā˛•ā˛‚ā˛Ÿāŗ‡ā˛¨ā˛°āŗâ€Œā˛—ā˛ŗāŗ", + "transcoding_accepted_containers_description": "ā˛¯ā˛žā˛ĩ ā˛•ā˛‚ā˛Ÿāŗ‡ā˛¨ā˛°āŗ ā˛¸āŗā˛ĩ➰⺂ā˛Ēā˛—ā˛ŗā˛¨āŗā˛¨āŗ MP4 ➗⺆ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏⺁ā˛ĩ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ. ➕⺆➞ā˛ĩ⺁ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ➍⺀➤ā˛ŋ➗➺ā˛ŋ➗⺆ ā˛Žā˛žā˛¤āŗā˛° ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_accepted_video_codecs": "ā˛¸āŗā˛ĩ⺀➕➰ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛•āŗ‹ā˛Ąāŗ†ā˛•āŗâ€Œā˛—ā˛ŗāŗ", + "transcoding_accepted_video_codecs_description": "ā˛¯ā˛žā˛ĩ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛•āŗ‹ā˛Ąāŗ†ā˛•āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąāŗā˛ĩ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ. ➕⺆➞ā˛ĩ⺁ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ➍⺀➤ā˛ŋ➗➺ā˛ŋ➗⺆ ā˛Žā˛žā˛¤āŗā˛° ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_advanced_options_description": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧāŗ‡ā˛•ā˛žā˛—ā˛ŋā˛˛āŗā˛˛ā˛Ļ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ", + "transcoding_audio_codec": "ā˛†ā˛Ąā˛ŋ➝⺋ ā˛•āŗŠā˛Ąāŗ†ā˛•āŗ", + "transcoding_audio_codec_description": "➓ā˛Ēā˛¸āŗ ā˛…ā˛¤āŗā˛¯āŗā˛¨āŗā˛¨ā˛¤ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛Ļ ā˛†ā˛¯āŗā˛•āŗ†ā˛¯ā˛žā˛—ā˛ŋā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ā˛šā˛ŗāŗ†ā˛¯ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗāŗ ➅ā˛Ĩā˛ĩā˛ž ā˛¸ā˛žā˛Ģāŗā˛Ÿāŗâ€Œā˛ĩāŗ‡ā˛°āŗâ€Œā˛—ā˛ŗāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛Ļāŗ†.", + "transcoding_bitrate_description": "ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ ➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗâ€Œā˛—ā˛ŋ➂➤ ā˛šāŗ†ā˛šāŗā˛šā˛ŋā˛ĩāŗ† ➅ā˛Ĩā˛ĩā˛ž ā˛¸āŗā˛ĩāŗ€ā˛•āŗƒā˛¤ ā˛¸āŗā˛ĩ➰⺂ā˛Ēā˛Ļā˛˛āŗā˛˛ā˛ŋā˛˛āŗā˛˛", + "transcoding_codecs_learn_more": "ā˛‡ā˛˛āŗā˛˛ā˛ŋ ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛Ļ ā˛Ē➰ā˛ŋā˛­ā˛žā˛ˇāŗ†ā˛¯ ➕⺁➰ā˛ŋ➤⺁ ā˛‡ā˛¨āŗā˛¨ā˛ˇāŗā˛Ÿāŗ ➤ā˛ŋ➺ā˛ŋā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ, H.264 codec, HEVC codec ā˛Žā˛¤āŗā˛¤āŗ VP9 codec ā˛—ā˛žā˛—ā˛ŋ FFmpeg ā˛Ļā˛¸āŗā˛¤ā˛žā˛ĩāŗ‡ā˛œā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛ŋ.", + "transcoding_constant_quality_mode": "ā˛¸āŗā˛Ĩā˛ŋ➰ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛Ļ ā˛Žāŗ‹ā˛Ąāŗ", + "transcoding_constant_quality_mode_description": "ICQ CQP ➗ā˛ŋ➂➤ ā˛‰ā˛¤āŗā˛¤ā˛Žā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ➕⺆➞ā˛ĩ⺁ ā˛šā˛žā˛°āŗā˛Ąāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛ĩ⺇➗ā˛ĩā˛°āŗā˛§ā˛• ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗāŗ ➈ ā˛Žāŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛. ➈ ā˛†ā˛¯āŗā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿ-ā˛†ā˛§ā˛žā˛°ā˛ŋ➤ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛Ŧ➺➏⺁ā˛ĩā˛žā˛— ➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛Ļ ā˛Žāŗ‹ā˛Ąāŗâ€Œā˛—āŗ† ➆ā˛Ļāŗā˛¯ā˛¤āŗ† ā˛¨āŗ€ā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➇ā˛Ļ⺁ ICQ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏ā˛Ļ ā˛•ā˛žā˛°ā˛Ŗ NVENC ➍ā˛ŋ➂ā˛Ļ ➍ā˛ŋā˛°āŗā˛˛ā˛•āŗā˛ˇā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "transcoding_constant_rate_factor": "ā˛¸āŗā˛Ĩā˛ŋ➰ ā˛Ļ➰ ➅➂ā˛ļ (-crf)", + "transcoding_constant_rate_factor_description": "ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛Ļ ā˛Žā˛Ÿāŗā˛Ÿ. ā˛ĩā˛ŋā˛ļā˛ŋā˛ˇāŗā˛Ÿ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ H.264 ➗⺆ 23, HEVC ➗⺆ 28, VP9 ➗⺆ 31 ā˛Žā˛¤āŗā˛¤āŗ AV1 ➗⺆ 35. ā˛•ā˛Ąā˛ŋā˛Žāŗ† ➇ā˛Ļāŗā˛Ļ➰⺆ ā˛‰ā˛¤āŗā˛¤ā˛Ž, ➆ā˛Ļ➰⺆ ā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_disabled_description": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛Ŧāŗ‡ā˛Ąā˛ŋ, ➕⺆➞ā˛ĩ⺁ ā˛•āŗā˛˛āŗˆā˛‚ā˛Ÿāŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ēāŗā˛˛āŗ‡ā˛Ŧāŗā˛¯ā˛žā˛•āŗâ€Œā˛—āŗ† ā˛…ā˛Ąāŗā˛Ąā˛ŋā˛¯ā˛žā˛—ā˛Ŧā˛šāŗā˛Ļ⺁", + "transcoding_encoding_options": "ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ", + "transcoding_encoding_options_description": "ā˛Žā˛¨āŗā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛•āŗ‹ā˛Ąāŗ†ā˛•āŗâ€Œā˛—ā˛ŗāŗ, ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗ, ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿ ā˛Žā˛¤āŗā˛¤āŗ ➇➤➰ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "transcoding_hardware_acceleration": "ā˛šā˛žā˛°āŗā˛Ąāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛ĩ⺇➗ā˛ĩā˛°āŗā˛§ā˛¨āŗ†", + "transcoding_hardware_acceleration_description": "ā˛Ēāŗā˛°ā˛žā˛¯āŗ‹ā˛—ā˛ŋ➕: ā˛ĩ⺇➗ā˛ĩā˛žā˛Ļ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ➆ā˛Ļ➰⺆ ➅ā˛Ļāŗ‡ ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛Žā˛žā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁", + "transcoding_hardware_decoding": "ā˛šā˛žā˛°āŗā˛Ąāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛Ąā˛ŋā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ", + "transcoding_hardware_decoding_setting_description": "➕⺇ā˛ĩ➞ ā˛ĩ⺇➗ā˛ĩā˛°āŗā˛§ā˛• ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛Ŧā˛Ļ➞ā˛ŋ➗⺆ ā˛Žā˛‚ā˛Ąāŗ-➟⺁-ā˛Žā˛‚ā˛Ąāŗ ā˛ĩ⺇➗ā˛ĩā˛°āŗā˛§ā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Žā˛˛āŗā˛˛ā˛ž ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛•ā˛žā˛°āŗā˛¯ā˛¨ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁.", + "transcoding_max_b_frames": "➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ŧā˛ŋ-ā˛Ģāŗā˛°āŗ‡ā˛Žāŗâ€Œā˛—ā˛ŗāŗ", + "transcoding_max_b_frames_description": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ ➕➂ā˛Ēāŗā˛°āŗ†ā˛ˇā˛¨āŗ ā˛Ļā˛•āŗā˛ˇā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛§ā˛žā˛°ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛§ā˛žā˛¨ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛šā˛ŗāŗ†ā˛¯ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛šā˛žā˛°āŗā˛Ąāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛ĩ⺇➗ā˛ĩā˛°āŗā˛§ā˛¨āŗ†ā˛¯āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁. 0 ā˛Ŧā˛ŋ-ā˛Ģāŗā˛°āŗ‡ā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➆ā˛Ļ➰⺆ -1 ➈ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_max_bitrate": "➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗ", + "transcoding_max_bitrate_description": "➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛Ģāŗˆā˛˛āŗ ā˛—ā˛žā˛¤āŗā˛°ā˛—ā˛ŗāŗ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛•āŗā˛•āŗ† ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛ĩāŗ†ā˛šāŗā˛šā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛Šā˛šā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļā˛žā˛Ļā˛ĩ⺁. 720p ā˛¨ā˛˛āŗā˛˛ā˛ŋ, ā˛ĩā˛ŋā˛ļā˛ŋā˛ˇāŗā˛Ÿ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ VP9 ➅ā˛Ĩā˛ĩā˛ž HEVC ➗⺆ 2600 kbit/s, ➅ā˛Ĩā˛ĩā˛ž H.264 ➗⺆ 4500 kbit/s. 0 ➗⺆ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋā˛Ļ➰⺆ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛˜ā˛Ÿā˛•ā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿā˛Ēā˛Ąā˛ŋ➏ā˛Ļā˛ŋā˛Ļāŗā˛Ļā˛žā˛—, k (kbit/s ➗⺆) ā˛Šā˛šā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†; ➆ā˛Ļāŗā˛Ļ➰ā˛ŋ➂ā˛Ļ 5000, 5000k, ā˛Žā˛¤āŗā˛¤āŗ 5M (Mbit/s ➗⺆) ā˛¸ā˛Žā˛žā˛¨ā˛ĩā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_max_keyframe_interval": "➗➰ā˛ŋā˛ˇāŗā˛  ➕⺀ā˛Ģāŗā˛°āŗ‡ā˛Žāŗ ā˛Žā˛§āŗā˛¯ā˛‚ā˛¤ā˛°", + "transcoding_max_keyframe_interval_description": "➕⺀ā˛Ģāŗā˛°āŗ‡ā˛Žāŗâ€Œā˛—ā˛ŗ ā˛¨ā˛Ąāŗā˛ĩā˛ŋ➍ ➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ģāŗā˛°āŗ‡ā˛Žāŗ ➅➂➤➰ā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ ā˛¸ā˛‚ā˛•āŗā˛šā˛ŋ➤ ā˛Ļā˛•āŗā˛ˇā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛šā˛Ļā˛—āŗ†ā˛Ąā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ†, ➆ā˛Ļ➰⺆ ā˛¸āŗ€ā˛•āŗ ā˛¸ā˛Žā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛§ā˛žā˛°ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩ⺇➗ā˛Ļ ā˛šā˛˛ā˛¨āŗ†ā˛¯āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛Ļ⺃ā˛ļāŗā˛¯ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛§ā˛žā˛°ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁. 0 ➈ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_optimal_description": "ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ ➗⺁➰ā˛ŋ➗ā˛ŋ➂➤ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗ ➅ā˛Ĩā˛ĩā˛ž ā˛¸āŗā˛ĩāŗ€ā˛•āŗƒā˛¤ ā˛¸āŗā˛ĩ➰⺂ā˛Ēā˛Ļā˛˛āŗā˛˛ā˛ŋā˛˛āŗā˛˛", + "transcoding_policy": "ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ➍⺀➤ā˛ŋ", + "transcoding_policy_description": "ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ā˛ĩā˛¨āŗā˛¨āŗ ā˛¯ā˛žā˛ĩā˛žā˛— ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛Ŧ⺇➕⺆➂ā˛Ļ⺁ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "transcoding_preferred_hardware_device": "➆ā˛Ļāŗā˛¯ā˛¤āŗ†ā˛¯ ā˛šā˛žā˛°āŗā˛Ąāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛¸ā˛žā˛§ā˛¨", + "transcoding_preferred_hardware_device_description": "VAAPI ā˛Žā˛¤āŗā˛¤āŗ QSV ➗⺆ ā˛Žā˛žā˛¤āŗā˛° ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛šā˛žā˛°āŗā˛Ąāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛žā˛—ā˛ŋ ā˛Ŧ➺➏⺁ā˛ĩ dri ā˛¨āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_preset_preset": "ā˛Ēāŗ‚ā˛°āŗā˛ĩ➍ā˛ŋ➗ā˛Ļā˛ŋ (-ā˛Ēāŗ‚ā˛°āŗā˛ĩ➍ā˛ŋ➗ā˛Ļā˛ŋ)", + "transcoding_preset_preset_description": "ā˛¸ā˛‚ā˛•āŗ‹ā˛šā˛¨ ā˛ĩ⺇➗. ➍ā˛ŋā˛§ā˛žā˛¨ā˛ĩā˛žā˛Ļ ā˛Ēāŗ‚ā˛°āŗā˛ĩ➍ā˛ŋ➗ā˛Ļā˛ŋ➗➺⺁ ➚ā˛ŋā˛•āŗā˛• ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿ ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ➗⺁➰ā˛ŋā˛¯ā˛žā˛—ā˛ŋ➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąā˛žā˛— ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ†. VP9 'ā˛ĩ⺇➗' ā˛•āŗā˛•ā˛ŋ➂➤ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ĩ⺇➗ā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛˛ā˛•āŗā˛ˇā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_reference_frames": "ā˛‰ā˛˛āŗā˛˛āŗ‡ā˛– ā˛šāŗŒā˛•ā˛Ÿāŗā˛Ÿāŗā˛—ā˛ŗāŗ", + "transcoding_reference_frames_description": "➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿ ā˛Ģāŗā˛°āŗ‡ā˛Žāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛•āŗā˛—āŗā˛—ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛‰ā˛˛āŗā˛˛āŗ‡ā˛–ā˛ŋ➏ā˛Ŧāŗ‡ā˛•ā˛žā˛Ļ ā˛Ģāŗā˛°āŗ‡ā˛Žāŗâ€Œā˛—ā˛ŗ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†. ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ ā˛¸ā˛‚ā˛•āŗā˛šā˛ŋ➤ ā˛Ļā˛•āŗā˛ˇā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛§ā˛žā˛°ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛§ā˛žā˛¨ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. 0 ➈ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_required_description": "ā˛¸āŗā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋā˛Ļ ā˛¸āŗā˛ĩ➰⺂ā˛Ēā˛Ļā˛˛āŗā˛˛ā˛ŋā˛˛āŗā˛˛ā˛Ļ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ ā˛Žā˛žā˛¤āŗā˛°", + "transcoding_settings": "ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "transcoding_settings_description": "ā˛¯ā˛žā˛ĩ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛Ŧ⺇➕⺁ ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗ‡ā˛—āŗ† ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—āŗŠā˛ŗā˛ŋ➏ā˛Ŧ⺇➕⺁ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "transcoding_target_resolution": "➗⺁➰ā˛ŋ ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗ", + "transcoding_target_resolution_description": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗâ€Œā˛—ā˛ŗāŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ĩā˛ŋā˛ĩā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛‚ā˛°ā˛•āŗā˛ˇā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁ ➆ā˛Ļ➰⺆ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛¸ā˛Žā˛¯ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛Ŧā˛šāŗā˛Ļ⺁, ā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛Ģāŗˆā˛˛āŗ ā˛—ā˛žā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁ ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛¨ ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛Žā˛žā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁.", + "transcoding_temporal_aq": "ā˛¤ā˛žā˛¤āŗā˛•ā˛žā˛˛ā˛ŋ➕ ā˛Žā˛•āŗā˛¯āŗ‚", + "transcoding_temporal_aq_description": "NVENC ➗⺆ ā˛Žā˛žā˛¤āŗā˛° ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛¤ā˛žā˛¤āŗā˛•ā˛žā˛˛ā˛ŋ➕ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋ➕⺆➝ ā˛Ē➰ā˛ŋā˛Žā˛žā˛Ŗāŗ€ā˛•ā˛°ā˛Ŗā˛ĩ⺁ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ĩā˛ŋā˛ĩ➰, ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛šā˛˛ā˛¨āŗ†ā˛¯ ā˛Ļ⺃ā˛ļāŗā˛¯ā˛—ā˛ŗ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛šā˛ŗāŗ†ā˛¯ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁.", + "transcoding_threads": "ā˛Žā˛ŗāŗ†ā˛—ā˛ŗāŗ", + "transcoding_threads_description": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛—ā˛ŗāŗ ā˛ĩ⺇➗ā˛ĩā˛žā˛Ļ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗâ€Œā˛—āŗ† ā˛•ā˛žā˛°ā˛Ŗā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ĩāŗ†, ➆ā˛Ļ➰⺆ ā˛¸ā˛•āŗā˛°ā˛ŋ➝ā˛ĩā˛žā˛—ā˛ŋ➰⺁ā˛ĩā˛žā˛— ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ➇➤➰ ā˛•ā˛žā˛°āŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛¸āŗā˛Ĩā˛ŗā˛žā˛ĩā˛•ā˛žā˛ļā˛ĩā˛¨āŗā˛¨āŗ ā˛¨āŗ€ā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➈ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛ĩ⺁ CPU ā˛•āŗ‹ā˛°āŗâ€Œā˛—ā˛ŗ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†ā˛—ā˛ŋ➂➤ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➰ā˛Ŧā˛žā˛°ā˛Ļ⺁. 0 ➗⺆ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋā˛Ļ➰⺆ ā˛Ŧā˛ŗā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➗➰ā˛ŋā˛ˇāŗā˛ ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_tone_mapping": "ā˛Ÿāŗ‹ā˛¨āŗ-ā˛Žāŗā˛¯ā˛žā˛Ēā˛ŋā˛‚ā˛—āŗ", + "transcoding_tone_mapping_description": "SDR ➗⺆ ā˛Ē➰ā˛ŋā˛ĩā˛°āŗā˛¤ā˛ŋ➏ā˛ŋā˛Ļā˛žā˛— HDR ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗ ā˛—āŗ‹ā˛šā˛°ā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛‚ā˛°ā˛•āŗā˛ˇā˛ŋ➏➞⺁ ā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛¯āŗŠā˛‚ā˛Ļ⺁ ā˛…ā˛˛āŗā˛—ā˛žā˛°ā˛ŋā˛Ļā˛Žāŗ ā˛Ŧā˛Ŗāŗā˛Ŗ, ā˛ĩā˛ŋā˛ĩ➰ ā˛Žā˛¤āŗā˛¤āŗ ā˛šāŗŠā˛ŗā˛Ēā˛ŋ➗⺆ ā˛ĩā˛ŋ➭ā˛ŋā˛¨āŗā˛¨ ā˛°ā˛žā˛œā˛ŋ ā˛ĩā˛ŋ➍ā˛ŋā˛Žā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛šāŗ‡ā˛Ŧā˛˛āŗ ā˛ĩā˛ŋā˛ĩā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛‚ā˛°ā˛•āŗā˛ˇā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ā˛ŽāŗŠā˛Ŧā˛ŋā˛¯ā˛¸āŗ ā˛Ŧā˛Ŗāŗā˛Ŗā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛‚ā˛°ā˛•āŗā˛ˇā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛°āŗ€ā˛¨āŗâ€Œā˛šā˛žā˛°āŗā˛Ąāŗ ā˛šāŗŠā˛ŗā˛Ēā˛¨āŗā˛¨āŗ ā˛¸ā˛‚ā˛°ā˛•āŗā˛ˇā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "transcoding_transcode_policy": "ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ➍⺀➤ā˛ŋ", + "transcoding_transcode_policy_description": "ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ā˛ĩā˛¨āŗā˛¨āŗ ā˛¯ā˛žā˛ĩā˛žā˛— ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛Ŧ⺇➕⺁ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļ➰ ➍⺀➤ā˛ŋ. HDR ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¯ā˛žā˛ĩā˛žā˛—ā˛˛āŗ‚ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ† (ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļ➰⺆ ā˛šāŗŠā˛°ā˛¤āŗā˛Ēā˛Ąā˛ŋ➏ā˛ŋ).", + "transcoding_two_pass_encoding": "ā˛Žā˛°ā˛Ąāŗ-ā˛Ēā˛žā˛¸āŗ ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ", + "transcoding_two_pass_encoding_setting_description": "ā˛‰ā˛¤āŗā˛¤ā˛Ž ā˛Žā˛¨āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋ➏➞⺁ ā˛Žā˛°ā˛Ąāŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ. ➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļā˛žā˛— (H.264 ā˛Žā˛¤āŗā˛¤āŗ HEVC ā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➕⺆➞➏ ā˛Žā˛žā˛Ąā˛˛āŗ ➇ā˛Ļ⺁ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†), ➈ ā˛Žāŗ‹ā˛Ąāŗ ➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ➆➧➰ā˛ŋ➏ā˛ŋ ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗ ā˛ļāŗā˛°āŗ‡ā˛Ŗā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ CRF ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛˛ā˛•āŗā˛ˇā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. VP9 ā˛—ā˛žā˛—ā˛ŋ, ➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ŧā˛ŋā˛Ÿāŗā˛°āŗ‡ā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļ➰⺆ CRF ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛Ŧā˛šāŗā˛Ļ⺁.", + "transcoding_video_codec": "ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛•āŗŠā˛Ąāŗ†ā˛•āŗ", + "transcoding_video_codec_description": "VP9 ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Ļā˛•āŗā˛ˇā˛¤āŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ†ā˛Ŧāŗ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛¸ā˛Žā˛¯ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†. HEVC ➇ā˛Ļāŗ‡ ➰⺀➤ā˛ŋ ā˛•ā˛žā˛°āŗā˛¯ā˛¨ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛ĩāŗ†ā˛Ŧāŗ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛Ļāŗ†. H.264 ā˛ĩāŗā˛¯ā˛žā˛Ē➕ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¤āŗā˛ĩ➰ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➆ā˛Ļ➰⺆ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‰ā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. AV1 ā˛…ā˛¤āŗā˛¯ā˛‚ā˛¤ ā˛Ē➰ā˛ŋā˛Ŗā˛žā˛Žā˛•ā˛žā˛°ā˛ŋ ā˛•āŗ‹ā˛Ąāŗ†ā˛•āŗ ➆➗ā˛ŋā˛Ļāŗ† ➆ā˛Ļ➰⺆ ā˛šā˛ŗāŗ†ā˛¯ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ĩā˛ŋā˛˛āŗā˛˛.", + "trash_enabled_description": "➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "trash_number_of_days": "ā˛Ļā˛ŋ➍➗➺ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†", + "trash_number_of_days_description": "ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛ĩ ā˛ŽāŗŠā˛Ļ➞⺁ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➕➏ā˛Ļ ā˛Ŧāŗā˛Ÿāŗā˛Ÿā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛‡ā˛Ąā˛Ŧāŗ‡ā˛•ā˛žā˛Ļ ā˛Ļā˛ŋ➍➗➺ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†", + "trash_settings": "➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "trash_settings_description": "➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "unlink_all_oauth_accounts": "ā˛Žā˛˛āŗā˛˛ā˛ž OAuth ā˛–ā˛žā˛¤āŗ†ā˛—ā˛ŗ ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋ", + "unlink_all_oauth_accounts_description": "ā˛šāŗŠā˛¸ ā˛Ēāŗ‚ā˛°āŗˆā˛•āŗ†ā˛Ļā˛žā˛°ā˛°ā˛ŋ➗⺆ ā˛ĩ➞➏⺆ ā˛šāŗ‹ā˛—āŗā˛ĩ ā˛ŽāŗŠā˛Ļ➞⺁ ā˛Žā˛˛āŗā˛˛ā˛ž OAuth ā˛–ā˛žā˛¤āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗâ€Œā˛˛ā˛ŋā˛‚ā˛•āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛Žā˛°āŗ†ā˛¯ā˛Ļā˛ŋ➰ā˛ŋ.", + "unlink_all_oauth_accounts_prompt": "➍⺀ā˛ĩ⺁ ā˛Žā˛˛āŗā˛˛ā˛ž OAuth ā˛–ā˛žā˛¤āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗâ€Œā˛˛ā˛ŋā˛‚ā˛•āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➇ā˛Ļ⺁ ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛ŋ➗⺆ OAuth ID ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛Ļā˛¨āŗā˛¨āŗ ➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛.", + "user_cleanup_job": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° ā˛¸āŗā˛ĩā˛šāŗā˛›ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆", + "user_delete_delay": "{user} ➍ ā˛–ā˛žā˛¤āŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ {delay, plural, one {# day} other {# days}} ā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛ļā˛žā˛ļāŗā˛ĩ➤ ➅➺ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆➗⺆ ➍ā˛ŋ➗ā˛Ļā˛ŋā˛Ēā˛Ąā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "user_delete_delay_settings": "ā˛ĩā˛ŋ➺➂ā˛Ŧ ➅➺ā˛ŋ➏ā˛ŋ", + "user_delete_delay_settings_description": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛–ā˛žā˛¤āŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋ➏➞⺁ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋā˛Ļ ā˛Ļā˛ŋ➍➗➺ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†. ➅➺ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆➗⺆ ➏ā˛ŋā˛Ļāŗā˛§ā˛°ā˛žā˛—ā˛ŋ➰⺁ā˛ĩ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏➞⺁ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ➅➺ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆ ➕⺆➞➏ā˛ĩ⺁ ā˛Žā˛§āŗā˛¯ā˛°ā˛žā˛¤āŗā˛°ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛¨ā˛Ąāŗ†ā˛¯āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➈ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—āŗ† ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žāŗā˛‚ā˛Ļā˛ŋ➍ ā˛•ā˛žā˛°āŗā˛¯ā˛—ā˛¤ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛Žā˛žā˛Ē➍ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "user_delete_immediately": "{user} ➰ ā˛–ā˛žā˛¤āŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ ➅➺ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆➗⺆ ā˛¤ā˛•āŗā˛ˇā˛Ŗ ➏➰ā˛Ļā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ➇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "user_delete_immediately_checkbox": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° ā˛Žā˛¤āŗā˛¤āŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¤ā˛•āŗā˛ˇā˛Ŗ ➅➺ā˛ŋ➏➞⺁ ➏➰➤ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ➇➰ā˛ŋ➏ā˛ŋ", + "user_details": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛ĩā˛ŋā˛ĩ➰➗➺⺁", + "user_management": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛Ŗāŗ†", + "user_password_has_been_reset": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†:", + "user_password_reset_description": "ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛ŋ➗⺆ ā˛¤ā˛žā˛¤āŗā˛•ā˛žā˛˛ā˛ŋ➕ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➒ā˛Ļ➗ā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛ĩ➰⺁ ā˛Žāŗā˛‚ā˛Ļā˛ŋ➍ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧāŗ‡ā˛•ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛‚ā˛Ļ⺁ ➤ā˛ŋ➺ā˛ŋ➏ā˛ŋ.", + "user_restore_description": "{user} ➅ā˛ĩ➰ ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛¨ā˛ƒā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "user_restore_scheduled_removal": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏ā˛ŋ - {date, date, long} ➰➂ā˛Ļ⺁ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋ➗ā˛Ļā˛ŋā˛Ēā˛Ąā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "user_settings": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "user_settings_description": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "user_successfully_removed": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° {email} ➅ā˛ĩā˛°ā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "users_page_description": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛Ē⺁➟", + "version_check_enabled_description": "➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋ ā˛Ē➰ā˛ŋā˛ļāŗ€ā˛˛ā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "version_check_implications": "➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋ ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛ĩ⺁ github.com ā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➆ā˛ĩā˛°āŗā˛¤ā˛• ➏➂ā˛ĩā˛šā˛¨ā˛ĩā˛¨āŗā˛¨āŗ ➅ā˛ĩ➞➂ā˛Ŧā˛ŋ➏ā˛ŋā˛Ļāŗ†", + "version_check_settings": "➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋ ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆", + "version_check_settings_description": "ā˛šāŗŠā˛¸ ➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋ➝ ➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ/➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "video_conversion_job": "ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "video_conversion_job_description": "ā˛Ŧāŗā˛°āŗŒā˛¸ā˛°āŗâ€Œā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛ĩāŗā˛¯ā˛žā˛Ē➕ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛—ā˛žā˛—ā˛ŋ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ" }, "admin_email": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛‡ā˛Žāŗ‡ā˛˛āŗ", "admin_password": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ", "administration": "ā˛†ā˛Ąā˛ŗā˛ŋ➤", "advanced": "ā˛¸āŗā˛§ā˛žā˛°ā˛ŋ➤", + "advanced_settings_clear_image_cache": "ā˛‡ā˛Žāŗ‡ā˛œāŗ ā˛•āŗā˛¯ā˛žā˛ļāŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "advanced_settings_clear_image_cache_error": "➚ā˛ŋā˛¤āŗā˛°ā˛Ļ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛ĩā˛¨āŗā˛¨āŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "advanced_settings_clear_image_cache_success": "{size} ā˛…ā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "advanced_settings_enable_alternate_media_filter_subtitle": "ā˛Ēā˛°āŗā˛¯ā˛žā˛¯ ā˛Žā˛žā˛¨ā˛Ļā˛‚ā˛Ąā˛—ā˛ŗ ā˛†ā˛§ā˛žā˛°ā˛Ļ ā˛Žāŗ‡ā˛˛āŗ† ➏ā˛ŋā˛‚ā˛•āŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛žā˛— ā˛Žā˛žā˛§āŗā˛¯ā˛Žā˛ĩā˛¨āŗā˛¨āŗ ā˛Ģā˛ŋā˛˛āŗā˛Ÿā˛°āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➈ ā˛†ā˛¯āŗā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ. ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šāŗā˛ĩā˛˛āŗā˛˛ā˛ŋ ➍ā˛ŋā˛Žā˛—āŗ† ā˛¸ā˛Žā˛¸āŗā˛¯āŗ†ā˛—ā˛ŗā˛ŋā˛Ļāŗā˛Ļ➰⺆ ā˛Žā˛žā˛¤āŗā˛° ➇ā˛Ļā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋ➏ā˛ŋ.", + "advanced_settings_enable_alternate_media_filter_title": "[ā˛Ēāŗā˛°ā˛žā˛¯āŗ‹ā˛—ā˛ŋ➕] ā˛Ēā˛°āŗā˛¯ā˛žā˛¯ ā˛¸ā˛žā˛§ā˛¨ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➏ā˛ŋā˛‚ā˛•āŗ ā˛Ģā˛ŋā˛˛āŗā˛Ÿā˛°āŗ ā˛Ŧ➺➏ā˛ŋ", + "advanced_settings_log_level_title": "ā˛˛ā˛žā˛—āŗ ā˛Žā˛Ÿāŗā˛Ÿ: {level}", + "advanced_settings_prefer_remote_subtitle": "➕⺆➞ā˛ĩ⺁ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗāŗ ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋ➂ā˛Ļ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➤⺁➂ā˛Ŧā˛ž ➍ā˛ŋā˛§ā˛žā˛¨ā˛ĩā˛žā˛—ā˛ŋā˛ĩāŗ†. ā˛Ŧā˛Ļ➞ā˛ŋ➗⺆ ➰ā˛ŋā˛Žāŗ‹ā˛Ÿāŗ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➈ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ.", + "advanced_settings_prefer_remote_title": "ā˛Ļāŗ‚ā˛°ā˛¸āŗā˛Ĩ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛ŋ➗⺆ ➆ā˛Ļāŗā˛¯ā˛¤āŗ† ā˛¨āŗ€ā˛Ąā˛ŋ", + "advanced_settings_proxy_headers_subtitle": "ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗ ā˛ĩā˛ŋ➍➂➤ā˛ŋā˛¯āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛Ŧāŗ‡ā˛•ā˛žā˛Ļ ā˛Ēāŗā˛°ā˛žā˛•āŗā˛¸ā˛ŋ ā˛šāŗ†ā˛Ąā˛°āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ĩāŗā˛¯ā˛žā˛–āŗā˛¯ā˛žā˛¨ā˛ŋ➏ā˛ŋ", + "advanced_settings_proxy_headers_title": "ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ ā˛Ēāŗā˛°ā˛žā˛•āŗā˛¸ā˛ŋ ā˛šāŗ†ā˛Ąā˛°āŗâ€Œā˛—ā˛ŗāŗ [ā˛Ēāŗā˛°ā˛žā˛¯āŗ‹ā˛—ā˛ŋ➕]", + "advanced_settings_readonly_mode_subtitle": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛¤āŗā˛° ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļā˛žā˛Ļ ➓ā˛Ļ➞⺁-ā˛Žā˛žā˛¤āŗā˛° ā˛Žāŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†, ā˛Ŧā˛šāŗ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛Ąāŗā˛ĩ⺁ā˛Ļ⺁, ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛ĩ⺁ā˛Ļ⺁, ā˛Ŧā˛ŋā˛¤āŗā˛¤ā˛°ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ⺁, ➅➺ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ⺁ ā˛Žāŗā˛‚ā˛¤ā˛žā˛Ļ ā˛Žā˛˛āŗā˛˛ā˛ĩā˛¨āŗā˛¨āŗ‚ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Žāŗā˛–āŗā˛¯ ā˛Ē➰ā˛Ļ⺆➝ā˛ŋ➂ā˛Ļ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° ➅ā˛ĩā˛¤ā˛žā˛°āŗ ā˛Žāŗ‚ā˛˛ā˛• ➓ā˛Ļ➞⺁-ā˛Žā˛žā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ/➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "advanced_settings_readonly_mode_title": "➓ā˛Ļ➞⺁-ā˛Žā˛žā˛¤āŗā˛° ā˛Žāŗ‹ā˛Ąāŗ", + "advanced_settings_self_signed_ssl_subtitle": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛Žā˛‚ā˛Ąāŗâ€Œā˛Ēā˛žā˛¯ā˛ŋā˛‚ā˛Ÿāŗâ€Œā˛—ā˛žā˛—ā˛ŋ SSL ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛° ā˛Ē➰ā˛ŋā˛ļāŗ€ā˛˛ā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛¸āŗā˛ĩ➝➂ ā˛¸ā˛šā˛ŋ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛°ā˛—ā˛ŗā˛ŋ➗⺆ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†.", + "advanced_settings_self_signed_ssl_title": "ā˛¸āŗā˛ĩ➝➂ ā˛¸ā˛šā˛ŋ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ SSL ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏ā˛ŋ [ā˛Ēāŗā˛°ā˛žā˛¯āŗ‹ā˛—ā˛ŋ➕]", + "advanced_settings_sync_remote_deletions_subtitle": "ā˛ĩāŗ†ā˛Ŧāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ➆ ā˛•āŗā˛°ā˛Ž ā˛•āŗˆā˛—āŗŠā˛‚ā˛Ąā˛žā˛— ➈ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ➍ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋ➏ā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏ā˛ŋ", + "advanced_settings_sync_remote_deletions_title": "➰ā˛ŋā˛Žāŗ‹ā˛Ÿāŗ ➅➺ā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏ā˛ŋā˛‚ā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ [ā˛Ēāŗā˛°ā˛žā˛¯āŗ‹ā˛—ā˛ŋ➕]", + "advanced_settings_tile_subtitle": "ā˛¸āŗā˛§ā˛žā˛°ā˛ŋ➤ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛° ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "advanced_settings_troubleshooting_subtitle": "ā˛Ļ⺋➎➍ā˛ŋā˛ĩā˛žā˛°ā˛Ŗāŗ†ā˛—ā˛žā˛—ā˛ŋ ā˛šāŗ†ā˛šāŗā˛šāŗā˛ĩ➰ā˛ŋ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "advanced_settings_troubleshooting_title": "ā˛Ļ⺋➎➍ā˛ŋā˛ĩā˛žā˛°ā˛Ŗāŗ†", + "age_months": "ā˛ĩā˛¯ā˛¸āŗā˛¸āŗ {months, plural, one {# month} other {# months}}", + "age_year_months": "ā˛ĩā˛¯ā˛¸āŗā˛¸āŗ 1 ā˛ĩā˛°āŗā˛ˇ, {months, plural, one {# month} other {# months}}", + "age_years": "{years, plural, other {ā˛ĩā˛¯ā˛¸āŗā˛¸āŗ #}}", "album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ", "album_added": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_added_notification_setting_description": "➍ā˛ŋā˛Žāŗā˛Žā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ➏⺇➰ā˛ŋ➏ā˛ŋā˛Ļā˛žā˛— ā˛‡ā˛Žāŗ‡ā˛˛āŗ ➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋ", "album_cover_updated": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➕ā˛ĩā˛°āŗ ➍ā˛ĩ⺀➕➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_delete_confirmation": "➍⺀ā˛ĩ⺁ {album} ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛…ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "album_delete_confirmation_description": "➈ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ąā˛°āŗ†, ➇➤➰ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗ ā˛‡ā˛¨āŗā˛¨āŗ ā˛Žāŗā˛‚ā˛Ļāŗ† ➇ā˛Ļā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛.", "album_deleted": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_info_card_backup_album_excluded": "ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_info_card_backup_album_included": "➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", "album_info_updated": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_leave": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛¤āŗŠā˛°āŗ†ā˛¯āŗā˛ĩ⺁ā˛Ļāŗ‡?", + "album_leave_confirmation": "➍⺀ā˛ĩ⺁ {album} ā˛¤āŗŠā˛°āŗ†ā˛¯ā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", "album_name": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛šāŗ†ā˛¸ā˛°āŗ", + "album_options": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ", + "album_remove_user": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛ĩ⺁ā˛Ļāŗ‡?", + "album_remove_user_confirmation": "➍⺀ā˛ĩ⺁ {user} ➅ā˛ĩā˛°ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "album_search_not_found": "➍ā˛ŋā˛Žāŗā˛Ž ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿā˛•āŗā˛•āŗ† ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—āŗā˛ĩ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗāŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛", + "album_selected": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_share_no_users": "➍⺀ā˛ĩ⺁ ➈ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ąā˛ŋ➰⺁ā˛ĩ➂➤⺆ ā˛•ā˛žā˛Ŗāŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ† ➅ā˛Ĩā˛ĩā˛ž ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ŧ➺ā˛ŋ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗ ā˛‡ā˛˛āŗā˛˛.", "album_summary": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛¸ā˛žā˛°ā˛žā˛‚ā˛ļ", + "album_updated": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➍ā˛ĩ⺀➕➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_updated_setting_description": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛šāŗŠā˛¸ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩā˛žā˛— ā˛‡ā˛Žāŗ‡ā˛˛āŗ ➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋ", + "album_upload_assets": "➍ā˛ŋā˛Žāŗā˛Ž ➕➂ā˛Ēāŗā˛¯āŗ‚ā˛Ÿā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ➏⺇➰ā˛ŋ➏ā˛ŋ", + "album_user_left": "ā˛Žā˛Ą {album}", + "album_user_removed": "{user} ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_viewer_appbar_delete_confirm": "➍ā˛ŋā˛Žāŗā˛Ž ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛ŋ➂ā˛Ļ ➈ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛…ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "album_viewer_appbar_share_err_delete": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➅➺ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_viewer_appbar_share_err_leave": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛¤āŗŠā˛°āŗ†ā˛¯ā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_viewer_appbar_share_err_remove": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛¸ā˛Žā˛¸āŗā˛¯āŗ†ā˛—ā˛ŗā˛ŋā˛ĩāŗ†", + "album_viewer_appbar_share_err_title": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛ļāŗ€ā˛°āŗā˛ˇā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "album_viewer_appbar_share_leave": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛¤āŗŠā˛°āŗ†ā˛¯ā˛ŋ➰ā˛ŋ", + "album_viewer_appbar_share_to": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ", + "album_viewer_page_share_add_users": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "album_with_link_access": "➞ā˛ŋā˛‚ā˛•āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩ ā˛¯ā˛žā˛°ā˛žā˛Ļ➰⺂ ➈ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛œā˛¨ā˛°ā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛˛ā˛ŋ.", "albums": "ā˛†ā˛˛āŗā˛Ŧ➂➗➺⺁", + "albums_default_sort_order": "ā˛Ąāŗ€ā˛Ģā˛žā˛˛āŗā˛Ÿāŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛ĩā˛ŋā˛‚ā˛—ā˛Ąā˛Ŗā˛ž ā˛•āŗā˛°ā˛Ž", + "albums_default_sort_order_description": "ā˛šāŗŠā˛¸ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏⺁ā˛ĩā˛žā˛— ➆➰➂➭ā˛ŋ➕ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ā˛ĩā˛ŋā˛‚ā˛—ā˛Ąā˛Ŗāŗ† ā˛•āŗā˛°ā˛Ž.", + "albums_feature_description": "➇➤➰ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛Ŧā˛šāŗā˛Ļā˛žā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛—ā˛ŗāŗ.", + "albums_on_device_count": "ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗāŗ ({count})", "all": "ā˛Žā˛˛āŗā˛˛ā˛ĩāŗ‚", + "all_albums": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗāŗ", + "all_people": "ā˛Žā˛˛āŗā˛˛ā˛ž ➜➍➰⺁", + "all_photos": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ", + "all_videos": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ", + "allow_dark_mode": "ā˛Ąā˛žā˛°āŗā˛•āŗ ā˛Žāŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏ā˛ŋ", + "allow_edits": "➏➂ā˛Ēā˛žā˛Ļā˛¨āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏ā˛ŋ", + "allow_public_user_to_download": "ā˛¸ā˛žā˛°āŗā˛ĩ➜➍ā˛ŋ➕ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗ ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏ā˛ŋ", + "allow_public_user_to_upload": "ā˛¸ā˛žā˛°āŗā˛ĩ➜➍ā˛ŋ➕ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛ŋ➗⺆ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏ā˛ŋ", + "always_keep_photos_hint": "ā˛¸āŗā˛Ĩā˛ŗā˛žā˛ĩā˛•ā˛žā˛ļ ā˛Žāŗā˛•āŗā˛¤ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ➈ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➇➰ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "always_keep_videos_hint": "ā˛¸āŗā˛Ĩā˛ŗā˛žā˛ĩā˛•ā˛žā˛ļ ā˛Žāŗā˛•āŗā˛¤ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ ➈ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➉➺ā˛ŋā˛¯āŗā˛¤āŗā˛¤ā˛ĩāŗ†.", "anti_clockwise": "➅ā˛Ēāŗā˛°ā˛Ļā˛•āŗā˛ˇā˛ŋā˛Ŗā˛žā˛•ā˛žā˛°ā˛ĩā˛žā˛—ā˛ŋ", + "api_key_description": "➈ ā˛ŽāŗŒā˛˛āŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛’ā˛Žāŗā˛Žāŗ† ā˛Žā˛žā˛¤āŗā˛° ➤⺋➰ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛ĩā˛ŋā˛‚ā˛Ąāŗ‹ā˛ĩā˛¨āŗā˛¨āŗ ā˛Žāŗā˛šāŗā˛šāŗā˛ĩ ā˛ŽāŗŠā˛Ļ➞⺁ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➅ā˛Ļā˛¨āŗā˛¨āŗ ➍➕➞ā˛ŋ➏➞⺁ ā˛Žā˛°āŗ†ā˛¯ā˛Ļā˛ŋ➰ā˛ŋ.", + "api_key_empty": "➍ā˛ŋā˛Žāŗā˛Ž API ➕⺀ ā˛šāŗ†ā˛¸ā˛°āŗ ā˛–ā˛žā˛˛ā˛ŋā˛¯ā˛žā˛—ā˛ŋ➰ā˛Ŧā˛žā˛°ā˛Ļ⺁", + "app_bar_signout_dialog_content": "➍⺀ā˛ĩ⺁ ā˛¸āŗˆā˛¨āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "app_bar_signout_dialog_title": "ā˛¸āŗˆā˛¨āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "app_download_links": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛—ā˛ŗāŗ", + "app_settings": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "app_stores": "➆ā˛Ēāŗ ā˛¸āŗā˛Ÿāŗ‹ā˛°āŗâ€Œā˛—ā˛ŗāŗ", + "app_update_available": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➍ā˛ĩ⺀➕➰➪ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†", + "appears_in": "ā˛•ā˛žā˛Ŗā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†", "archive": "ā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ", + "archive_or_unarchive_photo": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛ĩā˛¨āŗā˛¨āŗ ā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ ā˛Žā˛žā˛Ąā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ā˛…ā˛¨āŗâ€Œā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "archive_size_description": "ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗâ€Œā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ ā˛—ā˛žā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛•ā˛žā˛¨āŗā˛Ģā˛ŋā˛—ā˛°āŗ ā˛Žā˛žā˛Ąā˛ŋ (GiB ā˛¨ā˛˛āŗā˛˛ā˛ŋ)", + "are_these_the_same_person": "➇ā˛ĩ➰⺁ ➒➂ā˛Ļāŗ‡ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➝⺇?", + "are_you_sure_to_do_this": "➍⺀ā˛ĩ⺁ ➇ā˛Ļā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "array_field_not_fully_supported": "➅➰⺇ ā˛•āŗā˛ˇāŗ‡ā˛¤āŗā˛°ā˛—ā˛ŗā˛ŋ➗⺆ ā˛šā˛¸āŗā˛¤ā˛šā˛žā˛˛ā˛ŋ➤ JSON ➏➂ā˛Ēā˛žā˛Ļ➍⺆➝ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†", + "asset_action_delete_err_read_only": "➓ā˛Ļ➞⺁ ā˛Žā˛žā˛¤āŗā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(ā˛—ā˛ŗā˛¨āŗā˛¨āŗ) ➅➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "asset_action_share_err_offline": "➆ā˛Ģāŗâ€Œā˛˛āŗˆā˛¨āŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(ā˛—ā˛ŗā˛¨āŗā˛¨āŗ) ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "asset_added_to_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "asset_adding_to_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†â€Ļ", + "asset_created": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "asset_description_updated": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ ā˛ĩā˛ŋā˛ĩā˛°ā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "asset_filename_is_offline": "{filename} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ➆ā˛Ģāŗâ€Œā˛˛āŗˆā˛¨āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋā˛Ļāŗ†", + "asset_has_unassigned_faces": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋ➏ā˛Ļ ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛Ļāŗ†", + "asset_hashing": "ā˛šāŗā˛¯ā˛žā˛ļā˛ŋā˛‚ā˛—āŗâ€Ļ", + "asset_list_group_by_sub_title": "➗⺁➂ā˛Ē⺁ ā˛Žā˛žā˛Ąā˛ŋ", + "asset_list_layout_settings_dynamic_layout_title": "ā˛Ąāŗˆā˛¨ā˛žā˛Žā˛ŋā˛•āŗ ā˛˛āŗ‡ā˛”ā˛Ÿāŗ", + "asset_list_layout_settings_group_automatically": "ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤", + "asset_list_layout_settings_group_by": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➈ ā˛Ēāŗā˛°ā˛•ā˛žā˛° ➗⺁➂ā˛Ē⺁ ā˛Žā˛žā˛Ąā˛ŋ", + "asset_list_layout_settings_group_by_month_day": "➤ā˛ŋ➂➗➺⺁ + ā˛Ļā˛ŋ➍", + "asset_list_layout_sub_title": "ā˛ĩā˛ŋā˛¨āŗā˛¯ā˛žā˛¸", + "asset_list_settings_subtitle": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ ā˛—āŗā˛°ā˛ŋā˛Ąāŗ ā˛ĩā˛ŋā˛¨āŗā˛¯ā˛žā˛¸ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "asset_list_settings_title": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ ā˛—āŗā˛°ā˛ŋā˛Ąāŗ", + "asset_not_found_on_device_android": "ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛", + "asset_not_found_on_device_ios": "ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛. ➍⺀ā˛ĩ⺁ ā˛ā˛•āŗā˛˛āŗŒā˛Ąāŗ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļ➰⺆, ā˛ā˛•āŗā˛˛āŗŒā˛Ąāŗ ā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛•āŗ†ā˛Ÿāŗā˛Ÿ ā˛Ģāŗˆā˛˛āŗ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛ĩā˛žā˛—ā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁", + "asset_not_found_on_icloud": "ā˛ā˛•āŗā˛˛āŗŒā˛Ąāŗ ā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛. ā˛ā˛•āŗā˛˛āŗŒā˛Ąāŗ ā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛•āŗ†ā˛Ÿāŗā˛Ÿ ā˛Ģāŗˆā˛˛āŗ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛ĩā˛žā˛—ā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁", + "asset_offline": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ➆ā˛Ģāŗâ€Œā˛˛āŗˆā˛¨āŗ", + "asset_offline_description": "➈ ā˛Ŧā˛žā˛šāŗā˛¯ ā˛†ā˛¸āŗā˛¤ā˛ŋ ā˛‡ā˛¨āŗā˛¨āŗ ā˛Žāŗā˛‚ā˛Ļāŗ† ā˛Ąā˛ŋā˛¸āŗā˛•āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➰⺁ā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛. ā˛¸ā˛šā˛žā˛¯ā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛•ā˛°ā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛°āŗā˛•ā˛ŋ➏ā˛ŋ.", + "asset_restored_successfully": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "asset_skipped": "ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "asset_skipped_in_trash": "➕➏ā˛Ļā˛˛āŗā˛˛ā˛ŋā˛Ļāŗ†", + "asset_trashed": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ā˛•ā˛ŗāŗā˛šā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "asset_troubleshoot": "ā˛†ā˛¸āŗā˛¤ā˛ŋ ā˛¸ā˛Žā˛¸āŗā˛¯āŗ† ➍ā˛ŋā˛ĩā˛žā˛°ā˛Ŗāŗ†", "asset_uploaded": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", "asset_uploading": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†â€Ļ", + "asset_viewer_settings_subtitle": "➍ā˛ŋā˛Žāŗā˛Ž ā˛—āŗā˛¯ā˛žā˛˛ā˛°ā˛ŋ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛• ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "asset_viewer_settings_title": "ā˛†ā˛¸āŗā˛¤ā˛ŋ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛•", "assets": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ", + "assets_deleted_permanently_from_server": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ {count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(➗➺⺁) ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "assets_removed_permanently_from_device": "➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛ŋ➂ā˛Ļ {count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(ā˛—ā˛ŗā˛¨āŗā˛¨āŗ) ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "assets_restore_confirmation": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Žā˛˛āŗā˛˛ā˛ž ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➍⺀ā˛ĩ⺁ ➈ ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛! ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ➆ā˛Ģāŗâ€Œā˛˛āŗˆā˛¨āŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➈ ➰⺀➤ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛ ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛—ā˛Žā˛¨ā˛ŋ➏ā˛ŋ.", + "assets_restored_successfully": "{count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(➗➺⺁) ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "assets_trashed": "{count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(➗➺⺁) ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ā˛•ā˛ŗāŗā˛šā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "assets_trashed_from_server": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ {count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(➗➺⺁) ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "authorized_devices": "➅➧ā˛ŋā˛•āŗƒā˛¤ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗāŗ", + "automatic_endpoint_switching_subtitle": "ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋ➰⺁ā˛ĩā˛žā˛— ā˛—āŗŠā˛¤āŗā˛¤āŗā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛Ļ ā˛ĩ⺈-ā˛Ģ⺈ ā˛Žāŗ‚ā˛˛ā˛• ā˛¸āŗā˛Ĩ➺⺀➝ā˛ĩā˛žā˛—ā˛ŋ ➏➂ā˛Ēā˛°āŗā˛•ā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ŧāŗ‡ā˛°āŗ†ā˛Ąāŗ† ā˛Ēā˛°āŗā˛¯ā˛žā˛¯ ➏➂ā˛Ēā˛°āŗā˛•ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ", + "automatic_endpoint_switching_title": "ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ URL ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩ➪⺆", + "autoplay_slideshow": "ā˛¸āŗā˛˛āŗˆā˛Ąāŗâ€Œā˛ļāŗ‹ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩ➝➂ā˛Ēāŗā˛˛āŗ‡ ā˛Žā˛žā˛Ąā˛ŋ", "back": "ā˛šā˛ŋ➂ā˛Ļāŗ†", + "back_close_deselect": "ā˛šā˛ŋ➂ā˛Ļā˛•āŗā˛•āŗ†, ā˛Žāŗā˛šāŗā˛šā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ā˛†ā˛¯āŗā˛•āŗ† ➰ā˛Ļāŗā˛Ļāŗā˛Žā˛žā˛Ąā˛ŋ", + "background_backup_running_error": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ā˛šā˛žā˛˛ā˛¨āŗ†ā˛¯ā˛˛āŗā˛˛ā˛ŋā˛Ļāŗ†, ā˛šā˛¸āŗā˛¤ā˛šā˛žā˛˛ā˛ŋ➤ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "background_location_permission": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛¸āŗā˛Ĩ➺ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ", + "background_location_permission_content": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ†ā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛šā˛žā˛˛ā˛¨āŗ†ā˛¯ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩā˛žā˛— ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁, ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ *ā˛¯ā˛žā˛ĩā˛žā˛—ā˛˛āŗ‚* ➍ā˛ŋ➖➰ā˛ĩā˛žā˛Ļ ā˛¸āŗā˛Ĩ➺ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰ā˛Ŧ⺇➕⺁ ➇ā˛Ļ➰ā˛ŋ➂ā˛Ļ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛ĩ⺈-ā˛Ģ⺈ ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗâ€Œā˛¨ ā˛šāŗ†ā˛¸ā˛°ā˛¨āŗā˛¨āŗ ➓ā˛Ļā˛Ŧā˛šāŗā˛Ļ⺁", + "background_options": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ", + "backup": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ", + "backup_album_selection_page_albums_device": "ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗāŗ ({count})", + "backup_album_selection_page_albums_tap": "➏⺇➰ā˛ŋ➏➞⺁ ā˛Ÿāŗā˛¯ā˛žā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋ, ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąā˛˛āŗ ā˛Ąā˛Ŧā˛˛āŗ ā˛Ÿāŗā˛¯ā˛žā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "backup_album_selection_page_assets_scatter": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ ā˛Ŧā˛šāŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛šā˛°ā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁. ā˛šāŗ€ā˛—ā˛žā˛—ā˛ŋ, ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋ➝⺆➝ ā˛¸ā˛Žā˛¯ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁ ➅ā˛Ĩā˛ĩā˛ž ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁.", + "backup_album_selection_page_select_albums": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ", + "backup_album_selection_page_selection_info": "ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋ", + "backup_album_selection_page_total_assets": "ā˛’ā˛Ÿāŗā˛Ÿāŗ ā˛…ā˛¨ā˛¨āŗā˛¯ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ", + "backup_albums_sync": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗ ➏ā˛ŋā˛‚ā˛•āŗā˛°āŗŠā˛¨āŗˆā˛¸āŗ‡ā˛ļā˛¨āŗ", + "backup_all": "ā˛Žā˛˛āŗā˛˛ā˛ĩāŗ‚", + "backup_background_service_backup_failed_message": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛Žā˛°āŗā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†â€Ļ", + "backup_background_service_connection_failed_message": "ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ➏➂ā˛Ēā˛°āŗā˛•ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛Žā˛°āŗā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†â€Ļ", + "backup_controller_page_background_app_refresh_disabled_content": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Ŧ➺➏➞⺁ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ > ā˛¸ā˛žā˛Žā˛žā˛¨āŗā˛¯ > ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ.", + "backup_controller_page_background_battery_info_message": "ā˛…ā˛¤āŗā˛¯āŗā˛¤āŗā˛¤ā˛Ž ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ➅➍⺁➭ā˛ĩā˛•āŗā˛•ā˛žā˛—ā˛ŋ, ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛—ā˛žā˛—ā˛ŋ ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ➚➟⺁ā˛ĩ➟ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛Ŧ➂➧ā˛ŋ➏⺁ā˛ĩ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ŧāŗā˛¯ā˛žā˛Ÿā˛°ā˛ŋ ➆ā˛Ēāŗā˛Ÿā˛ŋā˛Žāŗˆā˛¸āŗ‡ā˛ļā˛¨āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ.\n\n➇ā˛Ļ⺁ ā˛¸ā˛žā˛§ā˛¨-➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿā˛ĩā˛žā˛—ā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ, ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ ā˛¤ā˛¯ā˛žā˛°ā˛•ā˛°ā˛ŋ➗⺆ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋ➰⺁ā˛ĩ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛ŋ.", + "backup_controller_page_background_configure_error": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ➏⺇ā˛ĩāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛•ā˛žā˛¨āŗā˛Ģā˛ŋā˛—ā˛°āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "backup_controller_page_background_delay": "ā˛šāŗŠā˛¸ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛ĩā˛ŋ➺➂ā˛Ŧ: {duration}", + "backup_controller_page_background_description": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➤⺆➰⺆➝ā˛Ļ⺆➝⺇ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛šāŗŠā˛¸ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ➏⺇ā˛ĩāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛†ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ", + "backup_controller_page_background_is_off": "ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ➆ā˛Ģāŗ ➆➗ā˛ŋā˛Ļāŗ†", + "backup_controller_page_background_is_on": "ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛†ā˛¨āŗ ➆➗ā˛ŋā˛Ļāŗ†", + "backup_controller_page_backup_sub": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ", + "backup_controller_page_desc_backup": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➤⺆➰⺆➝⺁ā˛ĩā˛žā˛— ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ā˛šāŗŠā˛¸ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛Žāŗā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛†ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ.", + "backup_controller_page_remainder_sub": "ā˛†ā˛¯āŗā˛•āŗ†ā˛¯ā˛ŋ➂ā˛Ļ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➉➺ā˛ŋā˛Ļā˛ŋ➰⺁ā˛ĩ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ", + "backup_controller_page_status_off": "ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ ā˛Žāŗā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ➆ā˛Ģāŗ ➆➗ā˛ŋā˛Ļāŗ†", + "backup_controller_page_status_on": "ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ ā˛Žāŗā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛†ā˛¨āŗ ➆➗ā˛ŋā˛Ļāŗ†", + "backup_controller_page_to_backup": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛Ŧāŗ‡ā˛•ā˛žā˛Ļ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗāŗ", + "backup_controller_page_total_sub": "ā˛†ā˛¯āŗā˛Ļ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛ŋ➂ā˛Ļ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛…ā˛¨ā˛¨āŗā˛¯ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ", + "backup_err_only_album": "➒➂ā˛Ļāŗ‡ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "backup_error_sync_failed": "➏ā˛ŋā˛‚ā˛•āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛.", + "backup_info_card_assets": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ", + "backup_manual_cancelled": "➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "backup_manual_in_progress": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛ˆā˛—ā˛žā˛—ā˛˛āŗ‡ ā˛Ēāŗā˛°ā˛—ā˛¤ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋā˛Ļāŗ†. ā˛¸āŗā˛ĩā˛˛āŗā˛Ē ā˛¸ā˛Žā˛¯ā˛Ļ ➍➂➤➰ ā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋ➏ā˛ŋ", + "backup_manual_success": "➝ā˛ļā˛¸āŗā˛¸āŗ", + "backup_manual_title": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛¸āŗā˛Ĩā˛ŋ➤ā˛ŋ", + "backup_options": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ", + "backup_options_page_title": "ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ", + "backup_setting_subtitle": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛Žāŗā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "backup_settings_subtitle": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "backup_upload_details_page_more_details": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ĩā˛ŋā˛ĩ➰➗➺ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ÿāŗā˛¯ā˛žā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋ", "backward": "ā˛šā˛ŋ➂ā˛Ļā˛•āŗā˛•āŗ†", + "biometric_auth_enabled": "ā˛Ŧā˛¯āŗ‹ā˛Žāŗ†ā˛Ÿāŗā˛°ā˛ŋā˛•āŗ ā˛Ļ⺃ā˛ĸ⺀➕➰➪ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "biometric_locked_out": "➍⺀ā˛ĩ⺁ ā˛Ŧā˛¯āŗ‹ā˛Žāŗ†ā˛Ÿāŗā˛°ā˛ŋā˛•āŗ ā˛Ļ⺃ā˛ĸ⺀➕➰➪ā˛Ļā˛ŋ➂ā˛Ļ ā˛šāŗŠā˛°ā˛—āŗā˛ŗā˛ŋā˛Ļā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ", + "biometric_no_options": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ŧā˛¯āŗ‹ā˛Žāŗ†ā˛Ÿāŗā˛°ā˛ŋā˛•āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "biometric_not_available": "➈ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Ŧā˛¯āŗ‹ā˛Žāŗ†ā˛Ÿāŗā˛°ā˛ŋā˛•āŗ ā˛Ļ⺃ā˛ĸ⺀➕➰➪ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "birthdate_saved": "ā˛œā˛¨āŗā˛Ž ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ➉➺ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "birthdate_set_description": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ ➤⺆➗⺆➝⺁ā˛ĩ ā˛¸ā˛Žā˛¯ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➆ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➝ ā˛ĩā˛¯ā˛¸āŗā˛¸ā˛¨āŗā˛¨āŗ ā˛˛āŗ†ā˛•āŗā˛•ā˛šā˛žā˛•ā˛˛āŗ ā˛œā˛¨āŗā˛Ž ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "bugs_and_feature_requests": "ā˛Ļ⺋➎➗➺⺁ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ ā˛ĩā˛ŋ➍➂➤ā˛ŋ➗➺⺁", "build": "➍ā˛ŋā˛°āŗā˛Žā˛žā˛Ŗ", + "bulk_delete_duplicates_confirmation": "➍⺀ā˛ĩ⺁ {count, plural, one {# duplicate asset} other {# duplicate assets}} ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧāŗƒā˛šā˛¤āŗ ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ļā˛˛āŗā˛˛ā˛ŋ ➅➺ā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➇ā˛Ļ⺁ ā˛Ēāŗā˛°ā˛¤ā˛ŋ ➗⺁➂ā˛Ēā˛ŋ➍ ➅➤ā˛ŋā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛†ā˛¸āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➇➤➰ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¨ā˛•ā˛˛āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➍⺀ā˛ĩ⺁ ➈ ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛!", + "bulk_keep_duplicates_confirmation": "➍⺀ā˛ĩ⺁ {count, plural, one {# duplicate asset} other {# duplicate assets}} ā˛…ā˛¨āŗā˛¨āŗ ➇➰ā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➇ā˛Ļ⺁ ā˛¯ā˛žā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ‚ ➅➺ā˛ŋ➏ā˛Ļāŗ† ā˛Žā˛˛āŗā˛˛ā˛ž ➍➕➞ā˛ŋ ➗⺁➂ā˛Ēāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛šā˛°ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "bulk_trash_duplicates_confirmation": "➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ➝⺂ ā˛Ŧā˛˛āŗā˛•āŗ ā˛Ÿāŗā˛°āŗā˛¯ā˛žā˛ļāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛Ŧā˛¯ā˛¸āŗā˛¤āŗā˛¤āŗ€ā˛°ā˛ž {count, plural, one {# duplicate asset} other {# duplicate assets}}? ➇ā˛Ļ⺁ ā˛Ēāŗā˛°ā˛¤ā˛ŋ ➗⺁➂ā˛Ēā˛ŋ➍ ➅➤ā˛ŋā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛†ā˛¸āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➇➤➰ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¨ā˛•ā˛˛āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛°āŗā˛¯ā˛žā˛ļāŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "cache_settings_clear_cache_button_title": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛¨ ā˛•āŗā˛¯ā˛žā˛ļāŗ ā˛…ā˛¨āŗā˛¨āŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛•āŗā˛¯ā˛žā˛ļāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¨ā˛ŋā˛°āŗā˛Žā˛ŋ➏⺁ā˛ĩā˛ĩ➰⺆➗⺆ ➇ā˛Ļ⺁ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛¨ ā˛•ā˛žā˛°āŗā˛¯ā˛•āŗā˛ˇā˛Žā˛¤āŗ†ā˛¯ ā˛Žāŗ‡ā˛˛āŗ† ā˛—ā˛Žā˛¨ā˛žā˛°āŗā˛šā˛ĩā˛žā˛—ā˛ŋ ā˛Ē➰ā˛ŋā˛Ŗā˛žā˛Ž ā˛Ŧāŗ€ā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "cache_settings_subtitle": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛ŽāŗŠā˛Ŧāŗˆā˛˛āŗ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛¨ ā˛•āŗā˛¯ā˛žā˛ļā˛ŋā˛‚ā˛—āŗ ā˛¨ā˛Ąā˛ĩ➺ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛¯ā˛‚ā˛¤āŗā˛°ā˛ŋ➏ā˛ŋ", + "cache_settings_tile_subtitle": "ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ†ā˛¯ ā˛¨ā˛Ąā˛ĩ➺ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛¯ā˛‚ā˛¤āŗā˛°ā˛ŋ➏ā˛ŋ", "camera": "ā˛•āŗā˛¯ā˛žā˛Žāŗ†ā˛°ā˛ž", "cancel": "➰ā˛Ļāŗā˛Ļāŗā˛Žā˛žā˛Ąā˛ŋ", + "cannot_undo_this_action": "➍⺀ā˛ĩ⺁ ➈ ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛!", + "cannot_update_the_description": "ā˛ĩā˛ŋā˛ĩā˛°ā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "change_password_description": "➍⺀ā˛ĩ⺁ ➏ā˛ŋā˛¸āŗā˛Ÿā˛Žāŗâ€Œā˛—āŗ† ā˛¸āŗˆā˛¨āŗ ā˛‡ā˛¨āŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļ⺁ ➇ā˛Ļāŗ‡ ā˛ŽāŗŠā˛Ļ➞⺁ ➅ā˛Ĩā˛ĩā˛ž ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛ĩā˛ŋ➍➂➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➕⺆➺➗⺆ ā˛šāŗŠā˛¸ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ.", + "change_password_form_description": "ā˛šā˛žā˛¯āŗ {name},\n\n➍⺀ā˛ĩ⺁ ā˛ŽāŗŠā˛Ļ➞ ā˛Ŧā˛žā˛°ā˛ŋ➗⺆ ➏ā˛ŋā˛¸āŗā˛Ÿā˛Žāŗâ€Œā˛—āŗ† ā˛¸āŗˆā˛¨āŗ ā˛‡ā˛¨āŗ ➆➗ā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛ĩā˛ŋ➍➂➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➕⺆➺➗⺆ ā˛šāŗŠā˛¸ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ.", + "change_password_form_log_out": "➇➤➰ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "change_password_form_log_out_description": "➇➤➰ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛ŋ➂ā˛Ļ ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ ➆➗➞⺁ ā˛ļā˛ŋā˛Ģā˛žā˛°ā˛¸āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "change_trigger_prompt": "➍⺀ā˛ĩ⺁ ā˛Ÿāŗā˛°ā˛ŋā˛—āŗā˛—ā˛°āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➇ā˛Ļ⺁ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛•āŗā˛°ā˛ŋ➝⺆➗➺⺁ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ģā˛ŋā˛˛āŗā˛Ÿā˛°āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "charging_requirement_mobile_backup": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗâ€Œā˛—āŗ† ā˛¸ā˛žā˛§ā˛¨ā˛ĩ⺁ ā˛šā˛žā˛°āŗā˛œāŗ ā˛†ā˛—āŗā˛¤āŗā˛¤ā˛ŋ➰ā˛Ŧ⺇➕⺁", + "check_corrupt_asset_backup": "ā˛­āŗā˛°ā˛ˇāŗā˛Ÿ ā˛†ā˛¸āŗā˛¤ā˛ŋ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗâ€Œā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ", + "check_corrupt_asset_backup_description": "➈ ā˛Ē➰ā˛ŋā˛ļāŗ€ā˛˛ā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛ĩ⺈-ā˛Ģ⺈ ā˛Žāŗ‚ā˛˛ā˛• ā˛Žā˛žā˛¤āŗā˛° ā˛°ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ➍➂➤➰. ➈ ā˛Ēāŗā˛°ā˛•āŗā˛°ā˛ŋ➝⺆➝⺁ ➕⺆➞ā˛ĩ⺁ ➍ā˛ŋā˛Žā˛ŋā˛ˇā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛Ŧā˛šāŗā˛Ļ⺁.", + "choose_matching_people_to_merge": "ā˛ĩā˛ŋā˛˛āŗ€ā˛¨ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—āŗā˛ĩ ā˛œā˛¨ā˛°ā˛¨āŗā˛¨āŗ ➆➰ā˛ŋ➏ā˛ŋ", "city": "➍➗➰", + "cleanup_confirm_description": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ {date} ā˛•āŗā˛•ā˛ŋ➂➤ ā˛ŽāŗŠā˛Ļ➞⺁ ➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ {count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ā˛¸āŗā˛°ā˛•āŗā˛ˇā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛•ā˛‚ā˛Ąāŗā˛•āŗŠā˛‚ā˛Ąā˛°āŗ. ➈ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛ŋ➂ā˛Ļ ā˛¸āŗā˛Ĩ➺⺀➝ ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛ĩ⺁ā˛Ļāŗ‡?", + "cleanup_deleted_assets": "{count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛žā˛§ā˛¨ā˛Ļ ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ➏➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "cleanup_found_assets": "{count} ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛ĩāŗ†", + "cleanup_found_assets_with_size": "{count} ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ ({size}) ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛ĩāŗ†", + "cleanup_icloud_shared_albums_excluded": "ā˛ā˛•āŗā˛˛āŗŒā˛Ąāŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛•āŗā˛¯ā˛žā˛¨āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "cleanup_no_assets_found": "ā˛Žāŗ‡ā˛˛ā˛ŋ➍ ā˛Žā˛žā˛¨ā˛Ļā˛‚ā˛Ąā˛—ā˛ŗā˛ŋ➗⺆ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—āŗā˛ĩ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛. ā˛Ģāŗā˛°āŗ€ ➅ā˛Ēāŗ ā˛¸āŗā˛Ēāŗ‡ā˛¸āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛¤āŗā˛° ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛Ŧā˛šāŗā˛Ļ⺁", + "cleanup_step3_description": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛•āŗā˛•āŗ† ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—āŗā˛ĩ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛¸āŗā˛•āŗā˛¯ā˛žā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➇➰ā˛ŋ➏ā˛ŋ.", + "cleanup_step4_summary": "➍ā˛ŋā˛Žāŗā˛Ž ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛ŋ➂ā˛Ļ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ {count} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ({date} ā˛•āŗā˛•ā˛ŋ➂➤ ā˛ŽāŗŠā˛Ļ➞⺁ ➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†). ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁.", + "cleanup_trash_hint": "ā˛ļāŗ‡ā˛–ā˛°ā˛Ŗā˛ž ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ➏➂ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛ĩā˛žā˛—ā˛ŋ ā˛Žā˛°ā˛ŗā˛ŋ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ, ➏ā˛ŋā˛¸āŗā˛Ÿā˛Žāŗ ā˛—āŗā˛¯ā˛žā˛˛ā˛°ā˛ŋ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➤⺆➰⺆➝ā˛ŋ➰ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➕➏ā˛ĩā˛¨āŗā˛¨āŗ ā˛–ā˛žā˛˛ā˛ŋ ā˛Žā˛žā˛Ąā˛ŋ", + "clear": "➍ā˛ŋā˛°āŗā˛Žā˛˛", + "clear_all_recent_searches": "ā˛‡ā˛¤āŗā˛¤āŗ€ā˛šā˛ŋ➍ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "client_cert_invalid_msg": "ā˛…ā˛Žā˛žā˛¨āŗā˛¯ ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛° ā˛Ģāŗˆā˛˛āŗ ➅ā˛Ĩā˛ĩā˛ž ➤ā˛Ēāŗā˛Ē⺁ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ", + "client_cert_password_message": "➈ ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛°ā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ", + "client_cert_subtitle": "PKCS12 (.p12, .pfx) ā˛¸āŗā˛ĩ➰⺂ā˛Ēā˛ĩā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛¤āŗā˛° ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ➆➗⺁ā˛ĩ ā˛ŽāŗŠā˛Ļ➞⺁ ā˛Žā˛žā˛¤āŗā˛° ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛° ā˛†ā˛Žā˛Ļ⺁/➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛ĩā˛ŋ➕⺆ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†", + "clockwise": "ā˛•āŗā˛˛ā˛žā˛•āŗâ€Œā˛ĩāŗˆā˛¸āŗ", "close": "ā˛Žāŗā˛šāŗā˛šā˛ŋ", "collapse": "ā˛•āŗā˛—āŗā˛—ā˛ŋ➏⺁", "color": "ā˛Ŧā˛Ŗāŗā˛Ŗ", + "command_palette_prompt": "ā˛Ēāŗā˛Ÿā˛—ā˛ŗāŗ, ā˛•āŗā˛°ā˛ŋ➝⺆➗➺⺁ ➅ā˛Ĩā˛ĩā˛ž ā˛†ā˛œāŗā˛žāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¤āŗā˛ĩ➰ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗā˛Ąāŗā˛•ā˛ŋ", "confirm": "ā˛Ļ⺃ā˛ĸ⺀➕➰ā˛ŋ➏ā˛ŋ", + "confirm_delete_face": "➍⺀ā˛ĩ⺁ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ā˛ŋ➂ā˛Ļ {name} ā˛Žāŗā˛–ā˛ĩā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "confirm_delete_shared_link": "➈ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "confirm_keep_this_delete_others": "➈ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛°ā˛¤āŗā˛Ēā˛Ąā˛ŋ➏ā˛ŋ, ā˛¸āŗā˛Ÿāŗā˛¯ā˛žā˛•āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛Žā˛˛āŗā˛˛ā˛ž ➇➤➰ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➍⺀ā˛ĩ⺁ ā˛Žāŗā˛‚ā˛Ļ⺁ā˛ĩ➰ā˛ŋ➝➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "confirm_tag_face": "➈ ā˛Žāŗā˛–ā˛ĩā˛¨āŗā˛¨āŗ {name} ā˛Žā˛‚ā˛Ļ⺁ ā˛Ÿāŗā˛¯ā˛žā˛—āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➍⺀ā˛ĩ⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "confirm_tag_face_unnamed": "➈ ā˛Žāŗā˛–ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛¯ā˛žā˛—āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➍⺀ā˛ĩ⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "contain": "ā˛’ā˛ŗā˛—āŗŠā˛‚ā˛Ąā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†", "context": "➏➂ā˛Ļā˛°āŗā˛­", "continue": "ā˛Žāŗā˛‚ā˛Ļ⺁ā˛ĩ➰ā˛ŋ➏ā˛ŋ", + "copied_image_to_clipboard": "➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛•āŗā˛˛ā˛ŋā˛Ēāŗâ€Œā˛Ŧāŗ‹ā˛°āŗā˛Ąāŗâ€Œā˛—āŗ† ➍➕➞ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "copy_link_to_clipboard": "➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛•āŗā˛˛ā˛ŋā˛Ēāŗâ€Œā˛Ŧāŗ‹ā˛°āŗā˛Ąāŗâ€Œā˛—āŗ† ➍➕➞ā˛ŋ➏ā˛ŋ", "country": "ā˛Ļāŗ‡ā˛ļ", "cover": "➕ā˛ĩā˛°āŗ", "covers": "➕ā˛ĩā˛°āŗâ€Œā˛—ā˛ŗāŗ", "create": "➰➚ā˛ŋ➏ā˛ŋ", + "create_link_to_share": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ➞ā˛ŋā˛‚ā˛•āŗ ➰➚ā˛ŋ➏ā˛ŋ", + "create_new_person_hint": "ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛¸ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➗⺆ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋ➏ā˛ŋ", + "create_tag_description": "ā˛šāŗŠā˛¸ ā˛Ÿāŗā˛¯ā˛žā˛—āŗ ➰➚ā˛ŋ➏ā˛ŋ. ā˛¨āŗ†ā˛¸āŗā˛Ÿāŗ†ā˛Ąāŗ ā˛Ÿāŗā˛¯ā˛žā˛—āŗâ€Œā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ, ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛Ģā˛žā˛°āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛¸āŗā˛˛āŗā˛¯ā˛žā˛ļāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛’ā˛ŗā˛—āŗŠā˛‚ā˛Ąā˛‚ā˛¤āŗ† ā˛Ÿāŗā˛¯ā˛žā˛—āŗâ€Œā˛¨ ā˛Ēāŗ‚ā˛°āŗā˛Ŗ ā˛Žā˛žā˛°āŗā˛—ā˛ĩā˛¨āŗā˛¨āŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ.", + "created": "➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "cutoff_date_description": "ā˛šā˛ŋ➂ā˛Ļā˛ŋ➍ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➇➰ā˛ŋ➏ā˛ŋâ€Ļ", "dark": "ā˛•ā˛¤āŗā˛¤ā˛˛āŗ", + "date_of_birth_saved": "ā˛œā˛¨āŗā˛Ž ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ➉➺ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", "day": "ā˛Ļā˛ŋ➍", + "deduplication_criteria_1": "➚ā˛ŋā˛¤āŗā˛°ā˛Ļ ā˛—ā˛žā˛¤āŗā˛° ā˛Ŧāŗˆā˛Ÿāŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ", + "deduplication_criteria_2": "EXIF ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ļ ā˛Žā˛Ŗā˛ŋ➕⺆", + "deduplication_info_description": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ēāŗ‚ā˛°āŗā˛ĩ ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛Ąā˛˛āŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛¨ā˛•ā˛˛āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ĻāŗŠā˛Ąāŗā˛Ą ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ļā˛˛āŗā˛˛ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ, ā˛¨ā˛žā˛ĩ⺁ ā˛‡ā˛˛āŗā˛˛ā˛ŋ ā˛¨āŗ‹ā˛Ąāŗā˛¤āŗā˛¤āŗ‡ā˛ĩāŗ†:", "delete": "➅➺ā˛ŋ➏ā˛ŋ", + "delete_action_confirmation_message": "➍⺀ā˛ĩ⺁ ➈ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➈ ā˛•āŗā˛°ā˛ŋ➝⺆➝⺁ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ➏➰ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➍⺀ā˛ĩ⺁ ➅ā˛Ļā˛¨āŗā˛¨āŗ ā˛¸āŗā˛Ĩ➺⺀➝ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋ➏➞⺁ ā˛Ŧ➝➏ā˛ŋā˛Ļ➰⺆ ā˛•āŗ‡ā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "delete_api_key_prompt": "➈ API ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "delete_dialog_alert": "➈ ā˛ā˛Ÿā˛‚ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛ŋ➂ā˛Ļ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "delete_dialog_alert_local": "➈ ā˛ā˛Ÿā˛‚ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛ŋ➂ā˛Ļ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ† ➆ā˛Ļ➰⺆ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛°āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "delete_dialog_alert_local_non_backed_up": "➕⺆➞ā˛ĩ⺁ ā˛ā˛Ÿā˛‚ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛—āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛˛āŗā˛˛ ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛ŋ➂ā˛Ļ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "delete_duplicates_confirmation": "➍⺀ā˛ĩ⺁ ➈ ā˛¨ā˛•ā˛˛āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "deletes_missing_assets": "ā˛Ąā˛ŋā˛¸āŗā˛•āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛•ā˛žā˛Ŗāŗ†ā˛¯ā˛žā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➅➺ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†", "description": "ā˛ĩā˛ŋā˛ĩ➰➪⺆", + "description_input_submit_error": "ā˛ĩā˛ŋā˛ĩā˛°ā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏⺁ā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛Ļ⺋➎, ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛ĩā˛ŋā˛ĩ➰➗➺ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛˛ā˛žā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ", "details": "ā˛ĩā˛ŋā˛ĩ➰➗➺⺁", "direction": "➍ā˛ŋā˛°āŗā˛Ļāŗ‡ā˛ļ➍", + "disabled": "➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "discord": "➅ā˛Ēā˛ļāŗā˛°āŗā˛¤ā˛ŋ", + "discover": "ā˛…ā˛¨āŗā˛ĩ⺇➎ā˛ŋ➏ā˛ŋ", + "display_original_photos_setting_description": "ā˛Žāŗ‚ā˛˛ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ā˛ĩāŗ†ā˛Ŧāŗ-ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—ā˛ŋā˛Ļāŗā˛Ļā˛žā˛— ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗâ€Œā˛—ā˛ŗ ā˛Ŧā˛Ļ➞ā˛ŋ➗⺆ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Žāŗ‚ā˛˛ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏➞⺁ ➆ā˛Ļāŗā˛¯ā˛¤āŗ† ā˛¨āŗ€ā˛Ąā˛ŋ. ➇ā˛Ļ⺁ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļ➍ ā˛ĩ⺇➗ā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛§ā˛žā˛¨ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛•ā˛žā˛°ā˛Ŗā˛ĩā˛žā˛—ā˛Ŧā˛šāŗā˛Ļ⺁.", + "do_not_show_again": "➈ ➏➂ā˛Ļāŗ‡ā˛ļā˛ĩā˛¨āŗā˛¨āŗ ā˛Žā˛¤āŗā˛¤āŗ† ➤⺋➰ā˛ŋ➏ā˛Ŧāŗ‡ā˛Ąā˛ŋ", "documentation": "ā˛Ļā˛¸āŗā˛¤ā˛žā˛ĩāŗ‡ā˛œāŗ€ā˛•ā˛°ā˛Ŗ", "done": "ā˛Žāŗā˛—ā˛ŋā˛Ļā˛ŋā˛Ļāŗ†", "download": "ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ", + "download_include_embedded_motion_videos_description": "ā˛šā˛˛ā˛¨āŗ†ā˛¯ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Žā˛‚ā˛Ŧāŗ†ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛¤āŗā˛¯āŗ‡ā˛• ā˛Ģāŗˆā˛˛āŗ ➆➗ā˛ŋ ➏⺇➰ā˛ŋ➏ā˛ŋ", "download_settings": "ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ", + "download_settings_description": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗâ€Œā˛—āŗ† ➏➂ā˛Ŧ➂➧ā˛ŋ➏ā˛ŋā˛Ļ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "download_sucess_android": "ā˛Žā˛žā˛§āŗā˛¯ā˛Žā˛ĩā˛¨āŗā˛¨āŗ DCIM/Immich ➗⺆ ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "downloading": "ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "drop_files_to_upload": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛˛āŗā˛˛ā˛ŋā˛¯ā˛žā˛Ļ➰⺂ ā˛Ŧā˛ŋā˛Ąā˛ŋ", + "duplicates": "➍➕➞⺁➗➺⺁", "duration": "➅ā˛ĩ➧ā˛ŋ", + "edit": "➤ā˛ŋā˛Ļāŗā˛Ļ⺁", + "edit_date_and_time": "ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛• ā˛Žā˛¤āŗā˛¤āŗ ā˛¸ā˛Žā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏ā˛ŋ", + "edit_date_and_time_action_prompt": "{count} ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛• ā˛Žā˛¤āŗā˛¤āŗ ā˛¸ā˛Žā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "edit_date_and_time_by_offset_interval": "ā˛šāŗŠā˛¸ ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛• ā˛ļāŗā˛°āŗ‡ā˛Ŗā˛ŋ: {from} - {to}", + "edit_description_prompt": "ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛šāŗŠā˛¸ ā˛ĩā˛ŋā˛ĩā˛°ā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ:", + "editor": "➏➂ā˛Ēā˛žā˛Ļ➕", + "editor_close_without_save_prompt": "ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➉➺ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛", + "editor_confirm_reset_all_changes": "➍⺀ā˛ĩ⺁ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", "email": "ā˛‡ā˛Žāŗ†āŗ•ā˛˛āŗ", + "empty_trash_confirmation": "➍⺀ā˛ĩ⺁ ➕➏ā˛ĩā˛¨āŗā˛¨āŗ ā˛–ā˛žā˛˛ā˛ŋ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➇ā˛Ļ⺁ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ➕➏ā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛¤āŗā˛¤ā˛Ļāŗ†.\n➍⺀ā˛ĩ⺁ ➈ ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛!", "enable": "ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "enable_biometric_auth_description": "ā˛Ŧā˛¯āŗ‹ā˛Žāŗ†ā˛Ÿāŗā˛°ā˛ŋā˛•āŗ ā˛Ļ⺃ā˛ĸ⺀➕➰➪ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ", "enabled": "ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "enter_your_pin_code_subtitle": "ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ", "error": "ā˛Ļ⺋➎", + "error_change_sort_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛ĩā˛ŋā˛‚ā˛—ā˛Ąā˛Ŗā˛ž ā˛•āŗā˛°ā˛Žā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "error_delete_face": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ā˛ŋ➂ā˛Ļ ā˛Žāŗā˛–ā˛ĩā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Ļ⺋➎ ā˛Žā˛Ļāŗā˛°ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "error_tag_face_bounding_box": "ā˛Žāŗā˛–ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛¯ā˛žā˛—āŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛Ļ⺋➎ - ā˛ŦāŗŒā˛‚ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛Ŧā˛žā˛•āŗā˛¸āŗ ➍ā˛ŋā˛°āŗā˛Ļāŗ‡ā˛ļā˛žā˛‚ā˛•ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "error_title": "ā˛Ļ⺋➎ - ā˛ā˛¨āŗ‹ ➤ā˛Ēāŗā˛Ēā˛žā˛—ā˛ŋā˛Ļāŗ†", + "error_while_navigating": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➗⺆ ā˛¨āŗā˛¯ā˛žā˛ĩā˛ŋā˛—āŗ‡ā˛Ÿāŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛žā˛— ā˛Ļ⺋➎ ➏➂➭ā˛ĩā˛ŋ➏ā˛ŋā˛Ļāŗ†", + "errors": { + "cannot_navigate_next_asset": "ā˛Žāŗā˛‚ā˛Ļā˛ŋ➍ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➗⺆ ā˛¨āŗā˛¯ā˛žā˛ĩā˛ŋā˛—āŗ‡ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "cannot_navigate_previous_asset": "ā˛šā˛ŋ➂ā˛Ļā˛ŋ➍ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➗⺆ ā˛¨āŗā˛¯ā˛žā˛ĩā˛ŋā˛—āŗ‡ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "cant_change_asset_favorite": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Žāŗ†ā˛šāŗā˛šā˛ŋ➍ā˛Ļā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗ", + "cant_get_number_of_comments": "ā˛•ā˛žā˛Žāŗ†ā˛‚ā˛Ÿāŗâ€Œā˛—ā˛ŗ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "error_adding_assets_to_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Ļ⺋➎ ā˛Žā˛Ļāŗā˛°ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "error_adding_users_to_album": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ➏⺇➰ā˛ŋ➏⺁ā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛Ļ⺋➎", + "error_deleting_shared_user": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏⺁ā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛Ļ⺋➎", + "error_hiding_buy_button": "➖➰⺀ā˛Ļā˛ŋ ā˛Ŧā˛Ÿā˛¨āŗ ā˛Žā˛°āŗ†ā˛Žā˛žā˛Ąāŗā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛Ļ⺋➎", + "error_selecting_all_assets": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛Ąāŗā˛ĩā˛žā˛— ā˛Ļ⺋➎ ā˛‰ā˛‚ā˛Ÿā˛žā˛—ā˛ŋā˛Ļāŗ†", + "exclusion_pattern_already_exists": "➈ ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąāŗā˛ĩ ā˛Žā˛žā˛Ļ➰ā˛ŋ ā˛ˆā˛—ā˛žā˛—ā˛˛āŗ‡ ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋā˛Ļāŗ†.", + "failed_to_create_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➰➚ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_create_shared_link": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ➰➚ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_edit_shared_link": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_get_people": "ā˛œā˛¨ā˛°ā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯āŗā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_load_asset": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_load_assets": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_load_people": "ā˛œā˛¨ā˛°ā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_remove_product_key": "ā˛‰ā˛¤āŗā˛Ēā˛¨āŗā˛¨ ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_reset_pin_code": "ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_stack_assets": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛œāŗ‹ā˛Ąā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_unstack_assets": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗ-ā˛¸āŗā˛Ÿāŗā˛¯ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "failed_to_update_notification_status": "➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ† ā˛¸āŗā˛Ĩā˛ŋ➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "incorrect_email_or_password": "➤ā˛Ēāŗā˛Ēā˛žā˛Ļ ā˛‡ā˛Žāŗ‡ā˛˛āŗ ➅ā˛Ĩā˛ĩā˛ž ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ", + "library_folder_already_exists": "➈ ā˛†ā˛Žā˛Ļ⺁ ā˛Žā˛žā˛°āŗā˛—ā˛ĩ⺁ ā˛ˆā˛—ā˛žā˛—ā˛˛āŗ‡ ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋā˛Ļāŗ†.", + "profile_picture_transparent_pixels": "ā˛Ēāŗā˛°āŗŠā˛Ģāŗˆā˛˛āŗ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗāŗ ā˛Ēā˛žā˛°ā˛Ļā˛°āŗā˛ļ➕ ā˛Ēā˛ŋā˛•āŗā˛¸āŗ†ā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰ā˛Ŧā˛žā˛°ā˛Ļ⺁. ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛œāŗ‚ā˛Žāŗ ā˛‡ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ/➅ā˛Ĩā˛ĩā˛ž ➏➰ā˛ŋ➏ā˛ŋ.", + "unable_to_add_album_users": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_add_assets_to_shared_link": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛—āŗ† ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_add_comment": "ā˛•ā˛žā˛Žāŗ†ā˛‚ā˛Ÿāŗ ➏⺇➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_add_exclusion_pattern": "ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąāŗā˛ĩā˛ŋ➕⺆ ā˛Žā˛žā˛Ļ➰ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_add_partners": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_change_album_user_role": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛° ā˛Ēā˛žā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_change_date": "ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_change_favorite": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Žāŗ†ā˛šāŗā˛šā˛ŋ➍ā˛Ļā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_change_location": "ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_change_password": "ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_complete_oauth_login": "OAuth ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_copy_to_clipboard": "ā˛•āŗā˛˛ā˛ŋā˛Ēāŗâ€Œā˛Ŧāŗ‹ā˛°āŗā˛Ąāŗâ€Œā˛—āŗ† ➍➕➞ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ➍⺀ā˛ĩ⺁ https ā˛Žāŗ‚ā˛˛ā˛• ā˛Ē⺁➟ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ ā˛Žā˛‚ā˛Ļ⺁ ā˛–ā˛šā˛ŋ➤ā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ", + "unable_to_create_admin_account": "➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛• ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_create_api_key": "ā˛šāŗŠā˛¸ API ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_create_library": "ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_create_user": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_delete_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➅➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_delete_asset": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_delete_exclusion_pattern": "ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąāŗā˛ĩā˛ŋ➕⺆ ā˛Žā˛žā˛Ļ➰ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_delete_shared_link": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_delete_user": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_download_files": "ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_edit_exclusion_pattern": "ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąāŗā˛ĩā˛ŋ➕⺆ ā˛Žā˛žā˛Ļ➰ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_empty_trash": "➕➏ā˛ĩā˛¨āŗā˛¨āŗ ā˛–ā˛žā˛˛ā˛ŋ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_enter_fullscreen": "ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛Ē➰ā˛Ļāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_exit_fullscreen": "ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛Ē➰ā˛Ļ⺆➝ā˛ŋ➂ā˛Ļ ➍ā˛ŋā˛°āŗā˛—ā˛Žā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_get_comments_number": "ā˛•ā˛žā˛Žāŗ†ā˛‚ā˛Ÿāŗâ€Œā˛—ā˛ŗ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_get_shared_link": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "unable_to_hide_person": "ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗ†ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_link_motion_video": "ā˛šā˛˛ā˛¨āŗ†ā˛¯ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ā˛ĩā˛¨āŗā˛¨āŗ ➞ā˛ŋā˛‚ā˛•āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_link_oauth_account": "OAuth ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➞ā˛ŋā˛‚ā˛•āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_log_out_all_devices": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_log_out_device": "ā˛¸ā˛žā˛§ā˛¨ā˛ĩā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_login_with_oauth": "OAuth ā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ➆➗➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_play_video": "ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛Ēāŗā˛˛āŗ‡ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_reassign_assets_new_person": "ā˛šāŗŠā˛¸ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➗⺆ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_refresh_user": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_remove_album_users": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_remove_api_key": "API ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_remove_assets_from_shared_link": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_remove_library": "ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_remove_partner": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_remove_reaction": "ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_reset_password": "ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_reset_pin_code": "ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_resolve_duplicate": "ā˛¨ā˛•ā˛˛ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛šā˛°ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_restore_assets": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_restore_trash": "➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛ĩā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_restore_user": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_save_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➉➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—ā˛˛ā˛ŋā˛˛āŗā˛˛", + "unable_to_save_api_key": "API ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_save_date_of_birth": "ā˛œā˛¨āŗā˛Ž ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_save_name": "ā˛šāŗ†ā˛¸ā˛°ā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_save_profile": "ā˛Ēāŗā˛°āŗŠā˛Ģāŗˆā˛˛āŗ ➉➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_save_settings": "ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_scan_libraries": "ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛•āŗā˛¯ā˛žā˛¨āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_scan_library": "ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛•āŗā˛¯ā˛žā˛¨āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_set_feature_photo": "ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_set_profile_picture": "ā˛Ēāŗā˛°āŗŠā˛Ģāŗˆā˛˛āŗ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_submit_job": "➕⺆➞➏ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛˛āŗā˛˛ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_trash_asset": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ā˛ĩā˛°āŗā˛—ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_unlink_account": "ā˛–ā˛žā˛¤āŗ†ā˛¯ ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ➰ā˛Ļāŗā˛Ļāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_unlink_motion_video": "ā˛šā˛˛ā˛¨āŗ†ā˛¯ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ā˛Ļ ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_update_album_cover": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➕ā˛ĩā˛°āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_update_album_info": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_update_library": "ā˛—āŗā˛°ā˛‚ā˛Ĩā˛žā˛˛ā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_update_location": "ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_update_settings": "ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "unable_to_update_timeline_display_status": "ā˛Ÿāŗˆā˛Žāŗâ€Œā˛˛āŗˆā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļ➍ ā˛¸āŗā˛Ĩā˛ŋ➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_update_user": "ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_upload_file": "ā˛Ģāŗˆā˛˛āŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛" + }, "exif": "ā˛Žā˛•āŗā˛¸ā˛ŋā˛Ģāŗ", + "experimental_settings_subtitle": "➍ā˛ŋā˛Žāŗā˛Ž ā˛¸āŗā˛ĩ➂➤ ➅ā˛Ēā˛žā˛¯ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Ŧ➺➏ā˛ŋ!", + "expired": "➅ā˛ĩ➧ā˛ŋ ā˛Žāŗ€ā˛°ā˛ŋā˛Ļāŗ†", + "explore": "ā˛Ē➰ā˛ŋā˛ļ⺋➧ā˛ŋ➏⺁", + "explorer": "ā˛Žā˛•āŗā˛¸āŗâ€Œā˛Ēāŗā˛˛āŗ‹ā˛°ā˛°āŗ", + "external_network_sheet_info": "➍⺀ā˛ĩ⺁ ➆ā˛Ļāŗā˛¯ā˛¤āŗ†ā˛¯ ā˛ĩ⺈-ā˛Ģ⺈ ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛‡ā˛˛āŗā˛˛ā˛Ļā˛ŋ➰⺁ā˛ĩā˛žā˛—, ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛Žāŗ‡ā˛˛ā˛ŋ➍ā˛ŋ➂ā˛Ļ ā˛•āŗ†ā˛ŗā˛•āŗā˛•āŗ† ➤➞⺁ā˛Ēā˛Ŧā˛šāŗā˛Ļā˛žā˛Ļ ➕⺆➺➗ā˛ŋ➍ URL ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛ŽāŗŠā˛Ļ➞➍⺆➝ā˛Ļ➰ ā˛Žāŗ‚ā˛˛ā˛• ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ➏➂ā˛Ēā˛°āŗā˛•ā˛—āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†", "face_unassigned": "➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛˛āŗā˛˛", + "failed_to_load_assets": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "favorite_or_unfavorite_photo": "ā˛¨āŗ†ā˛šāŗā˛šā˛ŋ➍ ➅ā˛Ĩā˛ĩā˛ž ā˛Žāŗ†ā˛šāŗā˛šā˛ŋ➍ā˛Ļ➰ā˛ŋ➂ā˛Ļ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹", "favorites": "ā˛Žāŗ†ā˛šāŗā˛šā˛ŋ➍ā˛ĩ⺁➗➺⺁", + "features_setting_description": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "file_name_or_extension": "ā˛Ģāŗˆā˛˛āŗ ā˛šāŗ†ā˛¸ā˛°āŗ ➅ā˛Ĩā˛ĩā˛ž ā˛ĩā˛ŋā˛¸āŗā˛¤ā˛°ā˛Ŗāŗ†", "filename": "ā˛Ģāŗˆā˛˛āŗ ā˛šāŗ†ā˛¸ā˛°āŗ", "filetype": "ā˛Ģāŗˆā˛˛āŗ ā˛Ēāŗā˛°ā˛•ā˛žā˛°", + "filter_description": "➗⺁➰ā˛ŋ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ģā˛ŋā˛˛āŗā˛Ÿā˛°āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ˇā˛°ā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ", + "find_them_fast": "ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿā˛Ļ ā˛Žāŗ‚ā˛˛ā˛• ā˛šāŗ†ā˛¸ā˛°ā˛ŋ➍ā˛ŋ➂ā˛Ļ ➅ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ĩ⺇➗ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗā˛Ąāŗā˛•ā˛ŋ", "folders": "ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛—ā˛ŗāŗ", + "folders_feature_description": "ā˛Ģāŗˆā˛˛āŗ ➏ā˛ŋā˛¸āŗā˛Ÿā˛Žāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛°āŗŒā˛¸āŗ ā˛Žā˛žā˛Ąāŗā˛ĩ⺁ā˛Ļ⺁", "forward": "ā˛Žāŗā˛‚ā˛Ļāŗ†", + "free_up_space_description": "ā˛¸āŗā˛Ĩā˛ŗā˛žā˛ĩā˛•ā˛žā˛ļā˛ĩā˛¨āŗā˛¨āŗ ā˛Žāŗā˛•āŗā˛¤ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ā˛Ļ ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ➏➰ā˛ŋ➏ā˛ŋ. ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēāŗā˛°ā˛¤ā˛ŋ➗➺⺁ ā˛¸āŗā˛°ā˛•āŗā˛ˇā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ➉➺ā˛ŋā˛¯āŗā˛¤āŗā˛¤ā˛ĩāŗ†.", + "gcast_enabled_description": "➈ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛ĩ⺁ ➕⺆➞➏ ā˛Žā˛žā˛Ąā˛˛āŗ Google ➍ā˛ŋ➂ā˛Ļ ā˛Ŧā˛žā˛šāŗā˛¯ ➏➂ā˛Ēā˛¨āŗā˛Žāŗ‚ā˛˛ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "general": "ā˛œā˛¨ā˛°ā˛˛āŗ", + "geolocation_instruction_location": "GPS ➍ā˛ŋā˛°āŗā˛Ļāŗ‡ā˛ļā˛žā˛‚ā˛•ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➰⺁ā˛ĩ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏➞⺁ ➅ā˛Ļ➰ ā˛Žāŗ‡ā˛˛āŗ† ā˛•āŗā˛˛ā˛ŋā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ, ➅ā˛Ĩā˛ĩā˛ž ā˛¨ā˛•āŗā˛ˇāŗ†ā˛¯ā˛ŋ➂ā˛Ļ ➍⺇➰ā˛ĩā˛žā˛—ā˛ŋ ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ", + "get_wifiname_error": "ā˛ĩ⺈-ā˛Ģ⺈ ā˛šāŗ†ā˛¸ā˛°ā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—ā˛˛ā˛ŋā˛˛āŗā˛˛. ➍⺀ā˛ĩ⺁ ā˛…ā˛—ā˛¤āŗā˛¯ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¨āŗ€ā˛Ąā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩ⺈-ā˛Ģ⺈ ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗâ€Œā˛—āŗ† ➏➂ā˛Ēā˛°āŗā˛•ā˛—āŗŠā˛‚ā˛Ąā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ ā˛Žā˛‚ā˛Ļ⺁ ā˛–ā˛šā˛ŋ➤ā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ", + "home_page_add_to_album_conflicts": "{album} ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† {added} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. {failed} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ ā˛ˆā˛—ā˛žā˛—ā˛˛āŗ‡ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋā˛ĩāŗ†.", + "home_page_add_to_album_err_local": "ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ➏⺇➰ā˛ŋ➏➞⺁ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_add_to_album_success": "{album} ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† {added} ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "home_page_archive_err_local": "ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_archive_err_partner": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_delete_err_partner": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_delete_remote_err_local": "➅➺ā˛ŋ➏⺁ ➰ā˛ŋā˛Žāŗ‹ā˛Ÿāŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_favorite_err_local": "ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛Žāŗ†ā˛šāŗā˛šā˛ŋ➍ā˛ĩ⺁ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_favorite_err_partner": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛Žāŗ†ā˛šāŗā˛šā˛ŋ➍ā˛ĩ⺁ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_first_time_notice": "➍⺀ā˛ĩ⺁ ➈ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛ŽāŗŠā˛Ļ➞ ā˛Ŧā˛žā˛°ā˛ŋ➗⺆ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļ➰⺆, ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛Ąā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ ➇ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛Ÿāŗˆā˛Žāŗâ€Œā˛˛āŗˆā˛¨āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺁➂ā˛Ŧā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁", + "home_page_locked_error_local": "ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛—āŗ† ➏➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_locked_error_partner": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛—āŗ† ➏➰ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_share_err_local": "➞ā˛ŋā˛‚ā˛•āŗ ā˛Žāŗ‚ā˛˛ā˛• ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "home_page_upload_err_limit": "ā˛’ā˛Žāŗā˛Žāŗ†ā˛—āŗ† ➗➰ā˛ŋā˛ˇāŗā˛  30 ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛¤āŗā˛° ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁", "host": "ā˛šāŗ‹ā˛¸āŗā˛Ÿāŗ", "hour": "ā˛—ā˛‚ā˛Ÿāŗ†", + "ignore_icloud_photos_description": "ā˛ā˛•āŗā˛˛āŗŒā˛Ąāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛ĩā˛žā˛—ā˛ŋ➰⺁ā˛ĩ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛", "image": "➚ā˛ŋā˛¤āŗā˛°", + "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Image}} ā˛…ā˛¨āŗā˛¨āŗ {city}, {country} ā˛¨ā˛˛āŗā˛˛ā˛ŋ {person1}, {person2}, ā˛Žā˛¤āŗā˛¤āŗ {additionalCount, number} others ā˛œāŗŠā˛¤āŗ†ā˛—āŗ† {date} ➰➂ā˛Ļ⺁ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "include_shared_partner_assets": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", "info": "ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋ", + "interval": { + "day_at_onepm": "ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛Ļā˛ŋ➍ ā˛Žā˛§āŗā˛¯ā˛žā˛šāŗā˛¨ 1 ā˛—ā˛‚ā˛Ÿāŗ†ā˛—āŗ†", + "night_at_midnight": "ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛°ā˛žā˛¤āŗā˛°ā˛ŋ ā˛Žā˛§āŗā˛¯ā˛°ā˛žā˛¤āŗā˛°ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ", + "night_at_twoam": "ā˛Ēāŗā˛°ā˛¤ā˛ŋā˛Ļā˛ŋ➍ ā˛°ā˛žā˛¤āŗā˛°ā˛ŋ 2 ā˛—ā˛‚ā˛Ÿāŗ†ā˛—āŗ†" + }, + "ios_debug_info_no_sync_yet": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ➏ā˛ŋā˛‚ā˛•āŗ ➕⺆➞➏ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛šā˛žā˛˛ā˛¨āŗ†ā˛¯ā˛žā˛—ā˛ŋā˛˛āŗā˛˛", "jobs": "➉ā˛Ļāŗā˛¯āŗ‹ā˛—ā˛—ā˛ŗāŗ", "keep": "➇➰ā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ", + "keep_description": "ā˛¸āŗā˛Ĩā˛ŗā˛žā˛ĩā˛•ā˛žā˛ļ ā˛Žāŗā˛•āŗā˛¤ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩā˛žā˛— ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛ā˛¨āŗ ➉➺ā˛ŋā˛¯āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛‚ā˛Ŧ⺁ā˛Ļā˛¨āŗā˛¨āŗ ➆➰ā˛ŋ➏ā˛ŋ.", + "keep_on_device_hint": "➈ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➇➰ā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛ā˛Ÿā˛‚ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ", + "keep_this_delete_others": "➇ā˛Ļā˛¨āŗā˛¨āŗ ā˛‡ā˛Ÿāŗā˛Ÿāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ, ā˛‡ā˛¤ā˛°ā˛°ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏ā˛ŋ", "language": "ā˛­ā˛žā˛ˇāŗ†", + "language_no_results_subtitle": "➍ā˛ŋā˛Žāŗā˛Ž ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿ ā˛Ēā˛Ļā˛ĩā˛¨āŗā˛¨āŗ ➏➰ā˛ŋā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋ➏ā˛ŋ", + "language_setting_description": "➍ā˛ŋā˛Žāŗā˛Ž ➆ā˛Ļāŗā˛¯ā˛¤āŗ†ā˛¯ ā˛­ā˛žā˛ˇāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ", "leave": "ā˛Ŧā˛ŋā˛Ąā˛ŋ", "level": "ā˛Žā˛Ÿāŗā˛Ÿ", "light": "ā˛Ŧ⺆➺➕⺁", "list": "ā˛Ēā˛Ÿāŗā˛Ÿā˛ŋ", + "loading_search_results_failed": "ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿ ā˛Ģ➞ā˛ŋā˛¤ā˛žā˛‚ā˛ļā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛˛āŗā˛˛ā˛ŋ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†", + "local_asset_cast_failed": "ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŋā˛¤āŗā˛¤ā˛°ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "local_network_sheet_info": "➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛Ļ ā˛ĩ⺈-ā˛Ģ⺈ ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗ ā˛Ŧ➺➏⺁ā˛ĩā˛žā˛— ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➈ URL ā˛Žāŗ‚ā˛˛ā˛• ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ➏➂ā˛Ēā˛°āŗā˛•ā˛—āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "location_permission_content": "ā˛¸āŗā˛ĩ➝➂-ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩ➪⺆ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏➞⺁, ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛—āŗ† ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ā˛ĩ⺈-ā˛Ģ⺈ ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗâ€Œā˛¨ ā˛šāŗ†ā˛¸ā˛°ā˛¨āŗā˛¨āŗ ➓ā˛Ļ➞⺁ ➍ā˛ŋ➖➰ā˛ĩā˛žā˛Ļ ā˛¸āŗā˛Ĩ➺ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➝ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†", + "log_out_all_devices": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "logged_out_all_devices": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", "login": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ", + "login_form_err_http": "ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ http:// ➅ā˛Ĩā˛ĩā˛ž https:// ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿā˛Ēā˛Ąā˛ŋ➏ā˛ŋ", + "login_form_failed_get_oauth_server_config": "OAuth ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ā˛˛ā˛žā˛—ā˛ŋā˛‚ā˛—āŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛žā˛— ā˛Ļ⺋➎, ā˛¸ā˛°āŗā˛ĩā˛°āŗ URL ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ", + "login_form_failed_get_oauth_server_disable": "➈ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ OAuth ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "login_form_handshake_exception": "ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šāŗā˛¯ā˛žā˛‚ā˛Ąāŗâ€Œā˛ļāŗ‡ā˛•āŗ ā˛ĩā˛ŋā˛¨ā˛žā˛¯ā˛ŋ➤ā˛ŋ ā˛‡ā˛¤āŗā˛¤āŗ. ➍⺀ā˛ĩ⺁ ā˛¸āŗā˛ĩ➝➂ ā˛¸ā˛šā˛ŋ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļ➰⺆ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛¸āŗā˛ĩ➝➂ ā˛¸ā˛šā˛ŋ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ēāŗā˛°ā˛Žā˛žā˛Ŗā˛Ēā˛¤āŗā˛° ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ.", + "login_form_server_error": "ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ➏➂ā˛Ēā˛°āŗā˛•ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—ā˛˛ā˛ŋā˛˛āŗā˛˛.", + "login_has_been_disabled": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "login_password_changed_error": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Ļ⺋➎ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛Ļāŗ†", + "main_branch_warning": "➍⺀ā˛ĩ⺁ ➅➭ā˛ŋā˛ĩ⺃ā˛Ļāŗā˛§ā˛ŋ ➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ; ā˛Ŧā˛ŋā˛Ąāŗā˛—ā˛Ąāŗ† ➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏➞⺁ ā˛¨ā˛žā˛ĩ⺁ ā˛Ŧ➞ā˛ĩā˛žā˛—ā˛ŋ ā˛ļā˛ŋā˛Ģā˛žā˛°ā˛¸āŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤āŗ‡ā˛ĩāŗ†!", + "maintenance_description": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛…ā˛¨āŗā˛¨āŗ maintenance mode ā˛•āŗā˛•āŗ† ➇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "maintenance_end_error": "➍ā˛ŋā˛°āŗā˛ĩā˛šā˛Ŗā˛ž ā˛•āŗā˛°ā˛Žā˛ĩā˛¨āŗā˛¨āŗ ā˛•āŗŠā˛¨āŗ†ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "maintenance_logged_in_as": "ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ {user} ➆➗ā˛ŋ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ➆➗ā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ", + "maintenance_restore_library_confirm": "➇ā˛Ļ⺁ ➏➰ā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļ➰⺆, ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ā˛Žāŗā˛‚ā˛Ļ⺁ā˛ĩ➰ā˛ŋ➏ā˛ŋ!", + "maintenance_restore_library_hint_missing_files": "➍⺀ā˛ĩ⺁ ā˛Ēāŗā˛°ā˛Žāŗā˛– ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➕➺⺆ā˛Ļāŗā˛•āŗŠā˛‚ā˛Ąā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁", + "maintenance_restore_library_hint_regenerate_later": "➍⺀ā˛ĩ⺁ ➇ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍➂➤➰ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ēāŗā˛¨ā˛°āŗā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁", + "maintenance_restore_library_hint_storage_template_missing_files": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗā˛ž ā˛Ÿāŗ†ā˛‚ā˛Ēāŗā˛˛āŗ‡ā˛Ÿāŗ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļāŗ€ā˛°ā˛ž? ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗāŗ ā˛•ā˛žā˛Ŗāŗ†ā˛¯ā˛žā˛—ā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁", + "maintenance_restore_library_loading": "ā˛¸ā˛Žā˛—āŗā˛°ā˛¤āŗ† ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆➗➺⺁ ā˛Žā˛¤āŗā˛¤āŗ ā˛šāŗā˛¯āŗ‚ā˛°ā˛ŋā˛¸āŗā˛Ÿā˛ŋā˛•āŗā˛¸āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†â€Ļ", + "maintenance_task_backup": "ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ŧāŗ‡ā˛¸āŗâ€Œā˛¨ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛…ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†â€Ļ", + "maintenance_task_rollback": "ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ē➍⺆ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†, ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ē➍⺆ ā˛Ŧā˛ŋ➂ā˛Ļ⺁ā˛ĩā˛ŋ➗⺆ ā˛šā˛ŋ➂➤ā˛ŋā˛°āŗā˛—ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†â€Ļ", "make": "ā˛Žā˛žā˛Ąā˛ŋ", + "manage_media_access_rationale": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➕➏ā˛Ļ ā˛Ŧāŗā˛Ÿāŗā˛Ÿā˛ŋ➗⺆ ā˛¸āŗā˛Ĩā˛ŗā˛žā˛‚ā˛¤ā˛°ā˛ŋ➏⺁ā˛ĩ ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛Ļ➰ā˛ŋ➂ā˛Ļ ➅ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏⺁ā˛ĩ ➏➰ā˛ŋā˛¯ā˛žā˛Ļ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛Ŗāŗ†ā˛—āŗ† ➈ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†.", + "manage_media_access_subtitle": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛—āŗ† ā˛Žā˛žā˛§āŗā˛¯ā˛Ž ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏➞⺁ ā˛Žā˛¤āŗā˛¤āŗ ➏➰ā˛ŋ➏➞⺁ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏ā˛ŋ.", + "manage_sharing_with_partners": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛°ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "manage_the_app_settings": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "manage_your_api_keys": "➍ā˛ŋā˛Žāŗā˛Ž API ā˛•āŗ€ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "manage_your_devices": "➍ā˛ŋā˛Žāŗā˛Ž ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ➆➗ā˛ŋ➰⺁ā˛ĩ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "manage_your_oauth_connection": "➍ā˛ŋā˛Žāŗā˛Ž OAuth ➏➂ā˛Ēā˛°āŗā˛•ā˛ĩā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", "map": "ā˛¨ā˛•āŗā˛ˇāŗ†", + "map_location_service_disabled_content": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ā˛¸āŗā˛Ĩ➺ā˛Ļā˛ŋ➂ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏➞⺁ ā˛¸āŗā˛Ĩ➺ ➏⺇ā˛ĩāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏⺁ā˛ĩ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†. ➍⺀ā˛ĩ⺁ ā˛ˆā˛— ➅ā˛Ļā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "map_marker_for_images": "{city}, {country} ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➤⺆➗⺆ā˛Ļ ➚ā˛ŋā˛¤āŗā˛°ā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛¨ā˛•āŗā˛ˇāŗ† ā˛Žā˛žā˛°āŗā˛•ā˛°āŗ", + "map_marker_with_image": "➚ā˛ŋā˛¤āŗā˛°ā˛ĻāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛¨ā˛•āŗā˛ˇāŗ† ā˛Žā˛žā˛°āŗā˛•ā˛°āŗ", + "map_no_location_permission_content": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ā˛¸āŗā˛Ĩ➺ā˛Ļā˛ŋ➂ā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏➞⺁ ā˛¸āŗā˛Ĩ➺ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†. ➍⺀ā˛ĩ⺁ ā˛ˆā˛— ➅ā˛Ļā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏➞⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "map_zoom_to_see_photos": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛˛āŗ ā˛āŗ‚ā˛Žāŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ", "memories": "➍⺆➍ā˛Ē⺁➗➺⺁", - "memory": "➍⺆➍ā˛Ē⺁" + "memories_check_back_tomorrow": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ➍⺆➍ā˛Ē⺁➗➺ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛¨ā˛žā˛ŗāŗ† ā˛Žā˛¤āŗā˛¤āŗ† ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ", + "memories_setting_description": "➍ā˛ŋā˛Žāŗā˛Ž ➍⺆➍ā˛Ēāŗā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ➍⺀ā˛ĩ⺁ ā˛¨āŗ‹ā˛Ąāŗā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "memory": "➍⺆➍ā˛Ē⺁", + "merge_people_limit": "➍⺀ā˛ĩ⺁ ā˛’ā˛Žāŗā˛Žāŗ†ā˛—āŗ† 5 ā˛Žāŗā˛–ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛¤āŗā˛° ā˛ĩā˛ŋā˛˛āŗ€ā˛¨ā˛—āŗŠā˛ŗā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁", + "merge_people_prompt": "➍⺀ā˛ĩ⺁ ➈ ā˛œā˛¨ā˛°ā˛¨āŗā˛¨āŗ ā˛ĩā˛ŋā˛˛āŗ€ā˛¨ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➈ ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛.", + "mobile_app_download_onboarding_note": "➈ ➕⺆➺➗ā˛ŋ➍ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ➕➂ā˛Ēāŗā˛¯ā˛žā˛¨ā˛ŋā˛¯ā˛¨āŗ ā˛ŽāŗŠā˛Ŧāŗˆā˛˛āŗ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛ĄāŗŒā˛¨āŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "move_off_locked_folder": "ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛šāŗŠā˛°ā˛—āŗ† ➏➰ā˛ŋ➏ā˛ŋ", + "move_to_lock_folder_action_prompt": "ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛—āŗ† {count} ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "move_to_locked_folder_confirmation": "➈ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛ŋ➂ā˛Ļ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛Žā˛žā˛¤āŗā˛° ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļā˛žā˛—ā˛ŋā˛Ļāŗ†", + "multiselect_grid_edit_date_time_err_read_only": "➓ā˛Ļ➞⺁ ā˛Žā˛žā˛¤āŗā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(➗➺) ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "multiselect_grid_edit_gps_err_read_only": "➓ā˛Ļ➞⺁ ā˛Žā˛žā˛¤āŗā˛° ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(➗➺) ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛, ā˛Ŧā˛ŋā˛Ÿāŗā˛Ÿāŗā˛Ŧā˛ŋā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "network_requirement_photos_upload": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸āŗ†ā˛˛āŗā˛¯āŗā˛˛ā˛žā˛°āŗ ā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ", + "network_requirement_videos_upload": "ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸āŗ†ā˛˛āŗā˛¯āŗā˛˛ā˛žā˛°āŗ ā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ", + "network_requirements_updated": "ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗ ➅ā˛ĩā˛ļāŗā˛¯ā˛•ā˛¤āŗ†ā˛—ā˛ŗāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛—ā˛ŋā˛ĩāŗ†, ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛•āŗā˛¯āŗ‚ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "networking_subtitle": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛Žā˛‚ā˛Ąāŗâ€Œā˛Ēā˛žā˛¯ā˛ŋā˛‚ā˛Ÿāŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "new_pin_code_subtitle": "ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ā˛…ā˛¨āŗā˛¨āŗ ➍⺀ā˛ĩ⺁ ā˛ŽāŗŠā˛Ļ➞ ā˛Ŧā˛žā˛°ā˛ŋ➗⺆ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ. ➈ ā˛Ē⺁➟ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛°ā˛•āŗā˛ˇā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ➰➚ā˛ŋ➏ā˛ŋ", + "no_albums_with_name_yet": "➈ ā˛šāŗ†ā˛¸ā˛°ā˛ŋā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➍⺀ā˛ĩ⺁ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛˛āŗā˛˛ ā˛Žā˛‚ā˛Ļ⺁ ā˛¤āŗ‹ā˛°āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†.", + "no_archived_assets_message": "➍ā˛ŋā˛Žāŗā˛Ž Photos ā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛¯ā˛ŋ➂ā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗ†ā˛Žā˛žā˛Ąā˛˛āŗ ➅ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "no_assets_message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛ŽāŗŠā˛Ļ➞ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛•āŗā˛˛ā˛ŋā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ", + "no_checksum_local": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛šāŗ†ā˛•āŗā˛¸ā˛Žāŗ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛ - ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "no_checksum_remote": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛šāŗ†ā˛•āŗā˛¸ā˛Žāŗ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛ - ➰ā˛ŋā˛Žāŗ‹ā˛Ÿāŗ ā˛†ā˛¸āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "no_duplicates_found": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ➍➕➞⺁➗➺⺁ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛.", + "no_exif_info_available": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Žā˛•āŗā˛¸ā˛ŋā˛Ģāŗ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛", + "no_explore_results_message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛ĩā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛ĩ⺇➎ā˛ŋ➏➞⺁ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ.", + "no_local_assets_found": "➈ ā˛šāŗ†ā˛•āŗā˛¸ā˛Žāŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛¸āŗā˛Ĩ➺⺀➝ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛", + "no_locked_photos_message": "ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗ†ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➍⺀ā˛ĩ⺁ ➍ā˛ŋā˛Žāŗā˛Ž ➞⺈ā˛Ŧāŗā˛°ā˛°ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛°āŗŒā˛¸āŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛žā˛— ➅ā˛Ĩā˛ĩā˛ž ā˛šāŗā˛Ąāŗā˛•āŗā˛ĩā˛žā˛— ➅ā˛ĩ⺁ ā˛•ā˛žā˛Ŗā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛.", + "no_remote_assets_found": "➈ ā˛šāŗ†ā˛•āŗā˛¸ā˛Žāŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ➰ā˛ŋā˛Žāŗ‹ā˛Ÿāŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛˛āŗā˛˛", + "no_results_description": "ā˛¸ā˛Žā˛žā˛¨ā˛žā˛°āŗā˛Ĩ➕ ā˛Ēā˛Ļ ➅ā˛Ĩā˛ĩā˛ž ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛¸ā˛žā˛Žā˛žā˛¨āŗā˛¯ ➕⺀ā˛ĩā˛°āŗā˛Ąāŗ ā˛Ēāŗā˛°ā˛¯ā˛¤āŗā˛¨ā˛ŋ➏ā˛ŋ", + "no_shared_albums_message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛œā˛¨ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➰➚ā˛ŋ➏ā˛ŋ", + "not_in_any_album": "ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋā˛˛āŗā˛˛", + "notification_permission_dialog_content": "➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁, ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ā˛šāŗ‹ā˛—ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ➏⺁ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ.", + "notification_permission_list_tile_content": "➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ā˛¨āŗ€ā˛Ąā˛ŋ.", + "obtainium_configurator_instructions": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ➗ā˛ŋā˛Ÿāŗâ€Œā˛šā˛Ŧāŗâ€Œā˛¨ ā˛Ŧā˛ŋā˛Ąāŗā˛—ā˛Ąāŗ†ā˛¯ā˛ŋ➂ā˛Ļ ➍⺇➰ā˛ĩā˛žā˛—ā˛ŋ ā˛†ā˛‚ā˛Ąāŗā˛°ā˛žā˛¯āŗā˛Ąāŗ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋ➏➞⺁ ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ā˛…ā˛Ÿāŗ‡ā˛Ÿā˛ŋ➍ā˛ŋā˛¯ā˛Žāŗ ā˛Ŧ➺➏ā˛ŋ. API ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛…ā˛Ÿāŗ‡ā˛Ÿā˛ŋ➍ā˛ŋā˛¯ā˛Žāŗ ā˛•ā˛žā˛¨āŗā˛Ģā˛ŋ➗➰⺇ā˛ļā˛¨āŗ ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏➞⺁ ➰⺂ā˛Ēā˛žā˛‚ā˛¤ā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ", + "onboarding_locale_description": "➍ā˛ŋā˛Žāŗā˛Ž ➆ā˛Ļāŗā˛¯ā˛¤āŗ†ā˛¯ ā˛­ā˛žā˛ˇāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ. ➍⺀ā˛ĩ⺁ ➇ā˛Ļā˛¨āŗā˛¨āŗ ➍➂➤➰ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁.", + "onboarding_privacy_description": "➕⺆➺➗ā˛ŋ➍ (ā˛ā˛šāŗā˛›ā˛ŋ➕) ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛—ā˛ŗāŗ ā˛Ŧā˛žā˛šāŗā˛¯ ➏⺇ā˛ĩāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➅ā˛ĩ➞➂ā˛Ŧā˛ŋ➏ā˛ŋā˛ĩāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛¸ā˛Žā˛¯ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁.", + "onboarding_theme_description": "➍ā˛ŋā˛Žāŗā˛Ž ➍ā˛ŋā˛Ļā˛°āŗā˛ļā˛¨ā˛•āŗā˛•āŗ† ā˛Ŧā˛Ŗāŗā˛Ŗā˛Ļ ā˛Ĩāŗ€ā˛Žāŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ. ➍⺀ā˛ĩ⺁ ➇ā˛Ļā˛¨āŗā˛¨āŗ ➍➂➤➰ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁.", + "open_in_map_view": "ā˛¨ā˛•āŗā˛ˇāŗ† ā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛¯ā˛˛āŗā˛˛ā˛ŋ ➤⺆➰⺆➝ā˛ŋ➰ā˛ŋ", + "open_the_search_filters": "ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿ ā˛Ģā˛ŋā˛˛āŗā˛Ÿā˛°āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➰⺆➝ā˛ŋ➰ā˛ŋ", + "organize_into_albums_description": "ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ➏ā˛ŋā˛‚ā˛•āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ➇➰ā˛ŋ➏ā˛ŋ", + "partner_can_access_assets": "ā˛†ā˛°āŗā˛•āŗˆā˛ĩāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Žā˛¤āŗā˛¤āŗ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛°ā˛¤āŗā˛Ēā˛Ąā˛ŋ➏ā˛ŋ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ", + "partner_can_access_location": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļ ā˛¸āŗā˛Ĩ➺", + "partner_page_empty_message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛¨āŗā˛¨āŗ‚ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛°ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ąā˛ŋā˛˛āŗā˛˛.", + "partner_page_no_more_users": "➏⺇➰ā˛ŋ➏➞⺁ ā˛‡ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛ŋā˛˛āŗā˛˛", + "password_does_not_match": "ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "people_feature_description": "➜➍➰ā˛ŋ➂ā˛Ļ ➗⺁➂ā˛Ē⺁ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛°āŗŒā˛¸āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†", + "people_sidebar_description": "ā˛¸āŗˆā˛Ąāŗâ€Œā˛Ŧā˛žā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ➜➍➰⺁ ā˛Žā˛‚ā˛Ŧ ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏ā˛ŋ", + "permanent_deletion_warning_setting_description": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Žā˛šāŗā˛šā˛°ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➤⺋➰ā˛ŋ➏ā˛ŋ", + "permanently_delete_assets_prompt": "➍⺀ā˛ĩ⺁ {count, plural, one {this asset?} other {these # assets?}} ā˛…ā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋ➏➞⺁ ā˛Ŧā˛¯ā˛¸āŗā˛¤āŗā˛¤āŗ€ā˛°ā˛ž? ➇ā˛Ļ⺁ {count, plural, one {it from its} other {them from their}} ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ(➗➺⺁) ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛š ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "permission_empty": "➍ā˛ŋā˛Žāŗā˛Ž ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ā˛–ā˛žā˛˛ā˛ŋā˛¯ā˛žā˛—ā˛ŋ➰ā˛Ŧā˛žā˛°ā˛Ļ⺁", + "permission_onboarding_permission_denied": "ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ➍ā˛ŋā˛°ā˛žā˛•ā˛°ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛Ŧ➺➏➞⺁, ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¨āŗ€ā˛Ąā˛ŋ.", + "permission_onboarding_permission_granted": "ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ā˛¨āŗ€ā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†! ➍⺀ā˛ĩ⺁ ➏ā˛ŋā˛Ļāŗā˛§ā˛°ā˛žā˛—ā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ.", + "permission_onboarding_permission_limited": "ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ā˛¸āŗ€ā˛Žā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†. ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ➍ā˛ŋā˛Žāŗā˛Ž ➏➂ā˛Ēāŗ‚ā˛°āŗā˛Ŗ ā˛—āŗā˛¯ā˛žā˛˛ā˛°ā˛ŋ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏➞⺁, ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¨āŗ€ā˛Ąā˛ŋ.", + "permission_onboarding_request": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏➞⺁ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛—āŗ† ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋ ā˛Ŧ⺇➕⺁.", + "photo_shared_all_users": "➍⺀ā˛ĩ⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ąā˛ŋ➰⺁ā˛ĩ➂➤⺆ ā˛•ā˛žā˛Ŗāŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ† ➅ā˛Ĩā˛ĩā˛ž ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ŧ➺ā˛ŋ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛ŋā˛˛āŗā˛˛.", + "photos_from_previous_years": "ā˛šā˛ŋ➂ā˛Ļā˛ŋ➍ ā˛ĩā˛°āŗā˛ˇā˛—ā˛ŗ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ", + "pin_code_setup_successfully": "ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "play_or_pause_video": "ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛Ēāŗā˛˛āŗ‡ ā˛Žā˛žā˛Ąā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ā˛ĩā˛ŋā˛°ā˛žā˛Žā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", + "play_original_video_setting_description": "ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛ŋ➗ā˛ŋ➂➤ ā˛Žāŗ‚ā˛˛ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗ ā˛Ēāŗā˛˛āŗ‡ā˛Ŧāŗā˛¯ā˛žā˛•āŗâ€Œā˛—āŗ† ➆ā˛Ļāŗā˛¯ā˛¤āŗ† ā˛¨āŗ€ā˛Ąā˛ŋ. ā˛Žāŗ‚ā˛˛ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—ā˛Ļā˛ŋā˛Ļāŗā˛Ļ➰⺆ ➅ā˛Ļ⺁ ➏➰ā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛Ēāŗā˛˛āŗ‡ā˛Ŧāŗā˛¯ā˛žā˛•āŗ ➆➗ā˛Ļā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁.", + "profile_drawer_client_server_up_to_date": "ā˛•āŗā˛˛āŗˆā˛‚ā˛Ÿāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛¸ā˛°āŗā˛ĩā˛°āŗ ➍ā˛ĩāŗ€ā˛•āŗƒā˛¤ā˛ĩā˛žā˛—ā˛ŋā˛ĩāŗ†", + "profile_image_of_user": "{user} ➰ ā˛Ēāŗā˛°āŗŠā˛Ģāŗˆā˛˛āŗ ➚ā˛ŋā˛¤āŗā˛°", + "purchase_activated_subtitle": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛Žā˛¤āŗā˛¤āŗ ➓ā˛Ēā˛¨āŗ ā˛¸āŗ‹ā˛°āŗā˛¸āŗ ā˛¸ā˛žā˛Ģāŗā˛Ÿāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛§ā˛¨āŗā˛¯ā˛ĩā˛žā˛Ļ➗➺⺁", + "purchase_activated_title": "➍ā˛ŋā˛Žāŗā˛Ž ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "purchase_button_reminder": "30 ā˛Ļā˛ŋā˛¨ā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ➍➍➗⺆ ➍⺆➍ā˛Ēā˛ŋ➏ā˛ŋ", + "purchase_failed_activation": "ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛ĩā˛ŋā˛Ģ➞ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†! ➏➰ā˛ŋā˛¯ā˛žā˛Ļ ā˛‰ā˛¤āŗā˛Ēā˛¨āŗā˛¨ ➕⺀➞ā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ!", + "purchase_input_suggestion": "ā˛‰ā˛¤āŗā˛Ēā˛¨āŗā˛¨ ➕⺀➞ā˛ŋ ➇ā˛Ļ⺆➝⺇? ➕⺆➺➗⺆ ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ", + "purchase_panel_info_1": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ➍ā˛ŋā˛°āŗā˛Žā˛žā˛Ŗā˛ĩ⺁ ā˛¸ā˛žā˛•ā˛ˇāŗā˛Ÿāŗ ā˛¸ā˛Žā˛¯ ā˛Žā˛¤āŗā˛¤āŗ ā˛ļāŗā˛°ā˛Žā˛ĩā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†, ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛Ļā˛¨āŗā˛¨āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛Ļā˛ˇāŗā˛Ÿāŗ ā˛‰ā˛¤āŗā˛¤ā˛Žā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛¨ā˛žā˛ĩ⺁ ā˛Ēāŗ‚ā˛°āŗā˛Ŗ ā˛¸ā˛Žā˛¯ā˛Ļ ā˛Žā˛‚ā˛œā˛ŋ➍ā˛ŋā˛¯ā˛°āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛Ļāŗā˛Ļāŗ‡ā˛ĩāŗ†. ➓ā˛Ēā˛¨āŗ-ā˛¸āŗ‹ā˛°āŗā˛¸āŗ ā˛¸ā˛žā˛Ģāŗā˛Ÿāŗâ€Œā˛ĩāŗ‡ā˛°āŗ ā˛Žā˛¤āŗā˛¤āŗ ➍⺈➤ā˛ŋ➕ ā˛ĩāŗā˛¯ā˛ĩā˛šā˛žā˛° ā˛…ā˛­āŗā˛¯ā˛žā˛¸ā˛—ā˛ŗāŗ ā˛Ąāŗ†ā˛ĩ➞ā˛Ēā˛°āŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ā˛¸āŗā˛¸āŗā˛Ĩā˛ŋ➰ ➆ā˛Ļā˛žā˛¯ā˛Ļ ā˛Žāŗ‚ā˛˛ā˛ĩā˛žā˛—āŗā˛ĩ⺁ā˛Ļ⺁ ā˛Žā˛¤āŗā˛¤āŗ ā˛ļ⺋➎➪⺆➝ ā˛•āŗā˛˛āŗŒā˛Ąāŗ ➏⺇ā˛ĩ⺆➗➺ā˛ŋ➗⺆ ➍ā˛ŋ➜ā˛ĩā˛žā˛Ļ ā˛Ēā˛°āŗā˛¯ā˛žā˛¯ā˛—ā˛ŗāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛—āŗŒā˛Ēāŗā˛¯ā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛—āŗŒā˛°ā˛ĩā˛ŋ➏⺁ā˛ĩ ā˛Ē➰ā˛ŋ➏➰ ā˛ĩāŗā˛¯ā˛ĩā˛¸āŗā˛Ĩāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļ⺁ ā˛¨ā˛Žāŗā˛Ž ā˛§āŗā˛¯āŗ‡ā˛¯ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "purchase_panel_info_2": "ā˛¨ā˛žā˛ĩ⺁ ā˛Ēāŗ‡ā˛ĩā˛žā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛Ļā˛ŋ➰➞⺁ ā˛Ŧā˛Ļāŗā˛§ā˛°ā˛žā˛—ā˛ŋ➰⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ, ➈ ➖➰⺀ā˛Ļā˛ŋ➝⺁ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ➍ā˛ŋā˛Žā˛—āŗ† ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛šāŗ†ā˛šāŗā˛šāŗā˛ĩ➰ā˛ŋ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¨āŗ€ā˛Ąāŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛. ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛¨ ā˛¨ā˛Ąāŗ†ā˛¯āŗā˛¤āŗā˛¤ā˛ŋ➰⺁ā˛ĩ ➅➭ā˛ŋā˛ĩ⺃ā˛Ļāŗā˛§ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏➞⺁ ā˛¨ā˛žā˛ĩ⺁ ➍ā˛ŋā˛Žāŗā˛Žā˛‚ā˛¤ā˛š ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➅ā˛ĩ➞➂ā˛Ŧā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļāŗ‡ā˛ĩāŗ†.", + "purchase_remove_server_product_key": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛‰ā˛¤āŗā˛Ēā˛¨āŗā˛¨ ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋ", + "purchase_remove_server_product_key_prompt": "➍⺀ā˛ĩ⺁ ā˛¸ā˛°āŗā˛ĩā˛°āŗ ā˛‰ā˛¤āŗā˛Ēā˛¨āŗā˛¨ ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "purchase_server_description_1": "ā˛‡ā˛Ąāŗ€ ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ†", + "rating_description": "ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋ ā˛Ģ➞➕ā˛Ļā˛˛āŗā˛˛ā˛ŋ EXIF ā˛°āŗ‡ā˛Ÿā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏ā˛ŋ", + "reassigned_assets_to_existing_person": "{count, plural, one {# ā˛†ā˛¸āŗā˛¤ā˛ŋ} other {# ā˛†ā˛¸āŗā˛¤ā˛ŋ➗➺⺁}} ā˛…ā˛¨āŗā˛¨āŗ {name, select, null {➒➂ā˛Ļ⺁ ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ} other {{name}}} ➗⺆ ā˛Žā˛°āŗ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "reassing_hint": "ā˛†ā˛¯āŗā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➗⺆ ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋ➏ā˛ŋ", + "refreshes_every_file": "ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛Žā˛¤āŗā˛¤āŗ ā˛šāŗŠā˛¸ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ē⺁➍➃ ➓ā˛Ļāŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "remove_assets_album_confirmation": "➍⺀ā˛ĩ⺁ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ {count, plural, one {# asset} other {# assets}} ā˛…ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "remove_assets_shared_link_confirmation": "➈ ā˛šā˛‚ā˛šā˛ŋ➕⺆➝ ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ {count, plural, one {# asset} other {# assets}} ā˛…ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛āŗ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "remove_custom_date_range": "ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛• ā˛ļāŗā˛°āŗ‡ā˛Ŗā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋ", + "remove_from_album_action_prompt": "{count} ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "remove_from_lock_folder_action_prompt": "ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ {count} ā˛…ā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "remove_from_locked_folder_confirmation": "ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ➈ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛°ā˛—āŗ† ➏➰ā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➅ā˛ĩ⺁ ➍ā˛ŋā˛Žāŗā˛Ž ➞⺈ā˛Ŧāŗā˛°ā˛°ā˛ŋā˛¯ā˛˛āŗā˛˛ā˛ŋ ā˛—āŗ‹ā˛šā˛°ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ†.", + "remove_from_shared_link": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋ", + "remove_photo_from_memory": "➈ ➍⺆➍ā˛Ēā˛ŋ➍ā˛ŋ➂ā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛ŋ", + "removed_api_key": "➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛Ļ API ➕⺀: {name}", + "removed_photo_from_memory": "➍⺆➍ā˛Ēā˛ŋ➍ā˛ŋ➂ā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "repair_no_results_message": "ā˛Ÿāŗā˛°āŗā˛¯ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛Ļ ā˛Žā˛¤āŗā˛¤āŗ ā˛•ā˛žā˛Ŗāŗ†ā˛¯ā˛žā˛Ļ ā˛Ģāŗˆā˛˛āŗâ€Œā˛—ā˛ŗāŗ ā˛‡ā˛˛āŗā˛˛ā˛ŋ ā˛•ā˛žā˛Ŗā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛ĩāŗ†", + "require_user_to_change_password_on_first_login": "ā˛ŽāŗŠā˛Ļ➞ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧāŗ‡ā˛•ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "reset_pin_code_description": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➍⺀ā˛ĩ⺁ ā˛Žā˛°āŗ†ā˛¤ā˛ŋā˛Ļāŗā˛Ļ➰⺆, ➅ā˛Ļā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛¸ā˛°āŗā˛ĩā˛°āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛•ā˛°ā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛°āŗā˛•ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁", + "reset_sqlite_confirmation": "➍⺀ā˛ĩ⺁ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➇ā˛Ļ⺁ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛Žāŗā˛Žā˛¨āŗā˛¨āŗ ā˛¸āŗˆā˛¨āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "reset_sqlite_confirmation_note": "ā˛—ā˛Žā˛¨ā˛ŋ➏ā˛ŋ: ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļ ➍➂➤➰ ➍⺀ā˛ĩ⺁ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏ā˛Ŧāŗ‡ā˛•ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "reset_sqlite_success": "SQLite ā˛Ąāŗ‡ā˛Ÿā˛žā˛Ŧāŗ‡ā˛¸āŗ ā˛…ā˛¨āŗā˛¨āŗ ➝ā˛ļā˛¸āŗā˛ĩā˛ŋā˛¯ā˛žā˛—ā˛ŋ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", + "scaffold_body_error_unrecoverable": "➏➰ā˛ŋā˛Ēā˛Ąā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛Ļ ā˛Ļ⺋➎ ➏➂➭ā˛ĩā˛ŋ➏ā˛ŋā˛Ļāŗ†. ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛Ļ⺋➎ā˛ĩā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ąā˛ŋā˛¸āŗā˛•ā˛žā˛°āŗā˛Ąāŗ ➅ā˛Ĩā˛ĩā˛ž ➗ā˛ŋā˛Ÿāŗâ€Œā˛šā˛Ŧāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ÿāŗā˛°āŗ‡ā˛¸āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛Ÿāŗā˛¯ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ ➇ā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛¨ā˛žā˛ĩ⺁ ā˛¸ā˛šā˛žā˛¯ ā˛Žā˛žā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁. ā˛¸ā˛˛ā˛šāŗ† ā˛¨āŗ€ā˛Ąā˛ŋā˛Ļ➰⺆, ➍⺀ā˛ĩ⺁ ➕⺆➺➗ā˛ŋ➍ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛Ąāŗ‡ā˛Ÿā˛žā˛ĩā˛¨āŗā˛¨āŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁.", + "search_by_description_example": "ā˛¸ā˛žā˛Ēā˛žā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Ēā˛žā˛Ļā˛¯ā˛žā˛¤āŗā˛°āŗ†ā˛¯ ā˛Ļā˛ŋ➍", + "search_by_filename": "ā˛Ģāŗˆā˛˛āŗ ā˛šāŗ†ā˛¸ā˛°āŗ ➅ā˛Ĩā˛ĩā˛ž ā˛ĩā˛ŋā˛¸āŗā˛¤ā˛°ā˛Ŗāŗ†ā˛¯ ā˛Žāŗ‚ā˛˛ā˛• ā˛šāŗā˛Ąāŗā˛•ā˛ŋ", + "search_by_filename_example": "➅➂ā˛Ļ➰⺆ IMG_1234.JPG ➅ā˛Ĩā˛ĩā˛ž PNG", + "search_for_existing_person": "ā˛…ā˛¸āŗā˛¤ā˛ŋā˛¤āŗā˛ĩā˛Ļā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗā˛Ąāŗā˛•ā˛ŋ", + "search_no_people_named": "\"{name}\" ā˛šāŗ†ā˛¸ā˛°ā˛ŋ➍ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ➜➍➰ā˛ŋā˛˛āŗā˛˛", + "search_page_search_photos_videos": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗā˛Ąāŗā˛•ā˛ŋ", + "select_person_to_tag": "ā˛Ÿāŗā˛¯ā˛žā˛—āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ", + "server_restarting_description": "➈ ā˛Ē⺁➟ā˛ĩ⺁ ā˛•āŗā˛ˇā˛Ŗā˛Žā˛žā˛¤āŗā˛°ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ ā˛†ā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "set_as_album_cover": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗ ➕ā˛ĩā˛°āŗ ➆➗ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "set_as_featured_photo": "ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ ā˛Žā˛‚ā˛Ļ⺁ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "set_as_profile_picture": "ā˛Ēāŗā˛°āŗŠā˛Ģāŗˆā˛˛āŗ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "set_date_of_birth": "ā˛œā˛¨āŗā˛Ž ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "set_slideshow_to_fullscreen": "ā˛¸āŗā˛˛āŗˆā˛Ąāŗâ€Œā˛ļāŗ‹ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛Ē➰ā˛Ļ⺆➗⺆ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "setting_image_navigation_enable_subtitle": "ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļ➰⺆, ā˛Ē➰ā˛Ļ⺆➝ ā˛Žā˛Ąā˛­ā˛žā˛—ā˛Ļ/ā˛Ŧā˛˛ā˛­ā˛žā˛—ā˛Ļ ā˛•ā˛žā˛˛āŗā˛­ā˛žā˛—ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ÿāŗā˛¯ā˛žā˛Ēāŗ ā˛Žā˛žā˛Ąāŗā˛ĩ ā˛Žāŗ‚ā˛˛ā˛• ➍⺀ā˛ĩ⺁ ā˛šā˛ŋ➂ā˛Ļā˛ŋ➍/ā˛Žāŗā˛‚ā˛Ļā˛ŋ➍ ➚ā˛ŋā˛¤āŗā˛°ā˛•āŗā˛•āŗ† ā˛¨āŗā˛¯ā˛žā˛ĩā˛ŋā˛—āŗ‡ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁.", + "setting_image_viewer_help": "ā˛ĩā˛ŋā˛ĩ➰ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛•ā˛ĩ⺁ ā˛ŽāŗŠā˛Ļ➞⺁ ā˛¸ā˛Ŗāŗā˛Ŗ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†, ➍➂➤➰ ā˛Žā˛§āŗā˛¯ā˛Ž ā˛—ā˛žā˛¤āŗā˛°ā˛Ļ ā˛Ēāŗ‚ā˛°āŗā˛ĩā˛ĩāŗ€ā˛•āŗā˛ˇā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ† (ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļ➰⺆), ➅➂➤ā˛ŋā˛Žā˛ĩā˛žā˛—ā˛ŋ ā˛Žāŗ‚ā˛˛ā˛ĩā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ† (ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļ➰⺆).", + "setting_image_viewer_original_subtitle": "ā˛Žāŗ‚ā˛˛ ā˛Ēāŗ‚ā˛°āŗā˛Ŗ-ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ (ā˛ĻāŗŠā˛Ąāŗā˛Ąā˛Ļ⺁!). ā˛Ąāŗ‡ā˛Ÿā˛ž ā˛Ŧā˛ŗā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛•ā˛Ąā˛ŋā˛Žāŗ† ā˛Žā˛žā˛Ąā˛˛āŗ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ (ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛¸ā˛žā˛§ā˛¨ā˛Ļ ā˛¸ā˛‚ā˛—āŗā˛°ā˛š ā˛Žā˛°ā˛Ąā˛°ā˛˛āŗā˛˛āŗ‚).", + "setting_image_viewer_preview_subtitle": "ā˛Žā˛§āŗā˛¯ā˛Ž ā˛°āŗ†ā˛¸ā˛˛āŗā˛¯āŗ‚ā˛ļā˛¨āŗ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ. ā˛Žāŗ‚ā˛˛ā˛ĩā˛¨āŗā˛¨āŗ ➍⺇➰ā˛ĩā˛žā˛—ā˛ŋ ā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➅ā˛Ĩā˛ĩā˛ž ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛žā˛¤āŗā˛° ā˛Ŧ➺➏➞⺁ ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ.", + "setting_notifications_notify_failures_grace_period": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛ĩ⺈ā˛Ģā˛˛āŗā˛¯ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗ‚ā˛šā˛ŋ➏ā˛ŋ: {duration}", + "setting_notifications_single_progress_subtitle": "ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ ā˛ĩā˛ŋā˛ĩ➰ā˛ĩā˛žā˛Ļ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Ēāŗā˛°ā˛—ā˛¤ā˛ŋ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋ", + "setting_notifications_single_progress_title": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛ĩā˛ŋā˛ĩ➰ ā˛Ēāŗā˛°ā˛—ā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➤⺋➰ā˛ŋ➏ā˛ŋ", + "setting_notifications_total_progress_subtitle": "ā˛’ā˛Ÿāŗā˛Ÿā˛žā˛°āŗ† ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Ēāŗā˛°ā˛—ā˛¤ā˛ŋ (ā˛Žāŗā˛—ā˛ŋā˛Ļā˛ŋā˛Ļāŗ†/ā˛’ā˛Ÿāŗā˛Ÿāŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗāŗ)", + "setting_notifications_total_progress_title": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛’ā˛Ÿāŗā˛Ÿāŗ ā˛Ēāŗā˛°ā˛—ā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➤⺋➰ā˛ŋ➏ā˛ŋ", + "setting_video_viewer_auto_play_subtitle": "ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ ➤⺆➰⺆ā˛Ļā˛žā˛— ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ēāŗā˛˛āŗ‡ ➆➗➞⺁ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏ā˛ŋ", + "setting_video_viewer_original_video_subtitle": "ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛Ÿāŗā˛°āŗ€ā˛Žāŗ ā˛Žā˛žā˛Ąāŗā˛ĩā˛žā˛—, ā˛Ÿāŗā˛°ā˛žā˛¨āŗā˛¸āŗâ€Œā˛•āŗ‹ā˛Ąāŗ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗā˛Ļ➰⺂ ā˛¸ā˛š ā˛Žāŗ‚ā˛˛ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛˛āŗ‡ ā˛Žā˛žā˛Ąā˛ŋ. ā˛Ŧā˛Ģ➰ā˛ŋā˛‚ā˛—āŗâ€Œā˛—āŗ† ā˛•ā˛žā˛°ā˛Ŗā˛ĩā˛žā˛—ā˛Ŧā˛šāŗā˛Ļ⺁. ➈ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛˛āŗ†ā˛•āŗā˛•ā˛ŋ➏ā˛Ļāŗ† ā˛¸āŗā˛Ĩ➺⺀➝ā˛ĩā˛žā˛—ā˛ŋ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋ➰⺁ā˛ĩ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žāŗ‚ā˛˛ ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Ēāŗā˛˛āŗ‡ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", + "settings_require_restart": "➈ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋ➏➞⺁ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏ā˛ŋ", + "shared_album_activity_remove_content": "➍⺀ā˛ĩ⺁ ➈ ➚➟⺁ā˛ĩ➟ā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "shared_link_create_error": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ➰➚ā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛Ļ⺋➎ ā˛•ā˛‚ā˛Ąāŗā˛Ŧ➂ā˛Ļā˛ŋā˛Ļāŗ†", + "shared_link_custom_url_description": "ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ URL ā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➈ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏ā˛ŋ", + "shared_link_error_server_url_fetch": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ url ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēā˛Ąāŗ†ā˛¯ā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "shared_link_password_description": "➈ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†", + "shared_links_description": "➞ā˛ŋā˛‚ā˛•āŗ ā˛Žāŗ‚ā˛˛ā˛• ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ", + "sharing_enter_password": "➈ ā˛Ē⺁➟ā˛ĩā˛¨āŗā˛¨āŗ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏➞⺁ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ.", + "sharing_page_description": "➍ā˛ŋā˛Žāŗā˛Ž ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛œā˛¨ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛šā˛‚ā˛šā˛ŋā˛Ļ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ.", + "sharing_sidebar_description": "ā˛¸āŗˆā˛Ąāŗâ€Œā˛Ŧā˛žā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛šā˛‚ā˛šā˛ŋ➕⺆➗⺆ ➞ā˛ŋā˛‚ā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏ā˛ŋ", + "shift_to_permanent_delete": "ā˛†ā˛¸āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋ➏➞⺁ ⇧ ā˛’ā˛¤āŗā˛¤ā˛ŋ➰ā˛ŋ", + "slideshow_repeat_description": "ā˛¸āŗā˛˛āŗˆā˛Ąāŗâ€Œā˛ļāŗ‹ ā˛•āŗŠā˛¨āŗ†ā˛—āŗŠā˛‚ā˛Ąā˛žā˛— ā˛†ā˛°ā˛‚ā˛­ā˛•āŗā˛•āŗ† ā˛šā˛ŋ➂➤ā˛ŋ➰⺁➗ā˛ŋ", + "stack_select_one_photo": "ā˛¸āŗā˛Ÿāŗā˛¯ā˛žā˛•āŗâ€Œā˛—ā˛žā˛—ā˛ŋ ➒➂ā˛Ļ⺁ ā˛Žāŗā˛–āŗā˛¯ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛ĩā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋ", + "start_date_before_end_date": "➆➰➂➭ā˛Ļ ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛ĩ⺁ ➅➂➤ā˛ŋā˛Ž ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•ā˛•āŗā˛•ā˛ŋ➂➤ ā˛ŽāŗŠā˛Ļ➞⺁ ➇➰ā˛Ŧ⺇➕⺁", + "stop_sharing_photos_with_user": "➈ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛˛āŗā˛˛ā˛ŋ➏ā˛ŋ", + "support_third_party_description": "➍ā˛ŋā˛Žāŗā˛Ž ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ā˛¸āŗā˛Ĩā˛žā˛Ēā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Žāŗ‚ā˛°ā˛¨āŗ‡ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋ➝ā˛ŋ➂ā˛Ļ ā˛Ēāŗā˛¯ā˛žā˛•āŗ‡ā˛œāŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†. ➍⺀ā˛ĩ⺁ ➅➍⺁➭ā˛ĩā˛ŋ➏⺁ā˛ĩ ā˛¸ā˛Žā˛¸āŗā˛¯āŗ†ā˛—ā˛ŗāŗ ➆ ā˛Ēāŗā˛¯ā˛žā˛•āŗ‡ā˛œāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛‰ā˛‚ā˛Ÿā˛žā˛—ā˛ŋ➰ā˛Ŧā˛šāŗā˛Ļ⺁, ➆ā˛Ļāŗā˛Ļ➰ā˛ŋ➂ā˛Ļ ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ➕⺆➺➗ā˛ŋ➍ ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ā˛ŽāŗŠā˛Ļ➞ ➏➂ā˛Ļā˛°āŗā˛­ā˛Ļā˛˛āŗā˛˛ā˛ŋ ➅ā˛ĩā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛¸ā˛Žā˛¸āŗā˛¯āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛¤āŗā˛¤ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ.", + "sync_albums_manual_subtitle": "➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ➏ā˛ŋā˛‚ā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ", + "sync_status_subtitle": "➏ā˛ŋā˛‚ā˛•āŗ ā˛ĩāŗā˛¯ā˛ĩā˛¸āŗā˛Ĩāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛ĩāŗ€ā˛•āŗā˛ˇā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏ā˛ŋ", + "sync_upload_album_setting_subtitle": "ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛†ā˛¯āŗā˛Ļ ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—ā˛ŗā˛ŋ➗⺆ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋ", + "tag_not_found_question": "ā˛Ÿāŗā˛¯ā˛žā˛—āŗ ➏ā˛ŋā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛ā˛ĩāŗ‡? Create a new tag.", + "theme_selection_description": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ŧāŗā˛°āŗŒā˛¸ā˛°āŗâ€Œā˛¨ ➏ā˛ŋā˛¸āŗā˛Ÿā˛‚ ➆ā˛Ļāŗā˛¯ā˛¤āŗ†ā˛¯ ā˛†ā˛§ā˛žā˛°ā˛Ļ ā˛Žāŗ‡ā˛˛āŗ† ā˛Ĩāŗ€ā˛Žāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ⺆➺➕⺁ ➅ā˛Ĩā˛ĩā˛ž ā˛—ā˛žā˛ĸā˛•āŗā˛•āŗ† ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "theme_setting_asset_list_storage_indicator_title": "ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛ŋ➍ ā˛Ÿāŗˆā˛˛āŗâ€Œā˛—ā˛ŗā˛˛āŗā˛˛ā˛ŋ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗā˛ž ā˛¸āŗ‚ā˛šā˛•ā˛ĩā˛¨āŗā˛¨āŗ ➤⺋➰ā˛ŋ➏ā˛ŋ", + "theme_setting_asset_list_tiles_per_row_title": "ā˛Ēāŗā˛°ā˛¤ā˛ŋ ā˛¸ā˛žā˛˛ā˛ŋā˛¨ā˛˛āŗā˛˛ā˛ŋ➰⺁ā˛ĩ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ† ({count})", + "theme_setting_colorful_interface_subtitle": "ā˛šā˛ŋā˛¨āŗā˛¨āŗ†ā˛˛āŗ† ā˛Žāŗ‡ā˛˛āŗā˛Žāŗˆā˛—ā˛ŗā˛ŋ➗⺆ ā˛Ēāŗā˛°ā˛žā˛Ĩā˛Žā˛ŋ➕ ā˛Ŧā˛Ŗāŗā˛Ŗā˛ĩā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛ĩ➝ā˛ŋ➏ā˛ŋ.", + "theme_setting_image_viewer_quality_subtitle": "ā˛ĩā˛ŋā˛ĩ➰ ➚ā˛ŋā˛¤āŗā˛° ā˛ĩāŗ€ā˛•āŗā˛ˇā˛•ā˛° ā˛—āŗā˛Ŗā˛Žā˛Ÿāŗā˛Ÿā˛ĩā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ", + "theme_setting_primary_color_subtitle": "ā˛Ēāŗā˛°ā˛žā˛Ĩā˛Žā˛ŋ➕ ā˛•āŗā˛°ā˛ŋ➝⺆➗➺⺁ ā˛Žā˛¤āŗā˛¤āŗ ā˛‰ā˛šāŗā˛šā˛žā˛°ā˛Ŗāŗ†ā˛—ā˛ŗā˛ŋ➗⺆ ā˛Ŧā˛Ŗāŗā˛Ŗā˛ĩā˛¨āŗā˛¨āŗ ➆➰ā˛ŋ➏ā˛ŋ.", + "theme_setting_theme_subtitle": "ā˛†āŗā˛¯ā˛Ēāŗâ€Œā˛¨ ā˛Ĩāŗ€ā˛Žāŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ➆➰ā˛ŋ➏ā˛ŋ", + "theme_setting_three_stage_loading_subtitle": "ā˛Žāŗ‚ā˛°āŗ-ā˛šā˛‚ā˛¤ā˛Ļ ā˛˛āŗ‹ā˛Ąā˛ŋā˛‚ā˛—āŗ ā˛•ā˛žā˛°āŗā˛¯ā˛•āŗā˛ˇā˛Žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁ ➆ā˛Ļ➰⺆ ā˛—ā˛Žā˛¨ā˛žā˛°āŗā˛šā˛ĩā˛žā˛—ā˛ŋ ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛¨āŗ†ā˛Ÿāŗâ€Œā˛ĩā˛°āŗā˛•āŗ ā˛˛āŗ‹ā˛Ąāŗâ€Œā˛—āŗ† ā˛•ā˛žā˛°ā˛Ŗā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "they_will_be_merged_together": "➅ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛’ā˛Ÿāŗā˛Ÿā˛ŋ➗⺆ ā˛ĩā˛ŋā˛˛āŗ€ā˛¨ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "time_based_memories_duration": "ā˛Ēāŗā˛°ā˛¤ā˛ŋ ➚ā˛ŋā˛¤āŗā˛°ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛Ļā˛°āŗā˛ļā˛ŋ➏➞⺁ ā˛¸āŗ†ā˛•āŗ†ā˛‚ā˛Ąāŗā˛—ā˛ŗ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†.", + "trash_no_results_message": "➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ā˛ĩā˛°āŗā˛—ā˛žā˛¯ā˛ŋā˛¸ā˛˛ā˛žā˛Ļ ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛ĩāŗ€ā˛Ąā˛ŋā˛¯āŗŠā˛—ā˛ŗāŗ ā˛‡ā˛˛āŗā˛˛ā˛ŋ ā˛•ā˛žā˛Ŗā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗāŗā˛¤āŗā˛¤ā˛ĩāŗ†.", + "trash_page_empty_trash_dialog_content": "➍ā˛ŋā˛Žāŗā˛Ž ➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛–ā˛žā˛˛ā˛ŋ ā˛Žā˛žā˛Ąā˛˛āŗ ➍⺀ā˛ĩ⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž? ➈ ā˛ā˛Ÿā˛‚ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "trash_page_info": "➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤ā˛•āŗā˛•āŗ† ➏⺇➰ā˛ŋ➏ā˛ŋā˛Ļ ā˛ā˛Ÿā˛‚ā˛—ā˛ŗā˛¨āŗā˛¨āŗ {days} ā˛Ļā˛ŋ➍➗➺ ➍➂➤➰ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "trigger_asset_uploaded_description": "ā˛šāŗŠā˛¸ ā˛¸āŗā˛ĩā˛¤āŗā˛¤ā˛¨āŗā˛¨āŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļā˛žā˛— ā˛Ÿāŗā˛°ā˛ŋā˛—ā˛°āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "trigger_description": "➕⺆➞➏ā˛Ļ ā˛šā˛°ā˛ŋā˛ĩā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏⺁ā˛ĩ ➒➂ā˛Ļ⺁ ā˛˜ā˛Ÿā˛¨āŗ†", + "trigger_person_recognized_description": "➒ā˛Ŧāŗā˛Ŧ ā˛ĩāŗā˛¯ā˛•āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šā˛ŋā˛Ļā˛žā˛— ā˛Ēāŗā˛°ā˛šāŗ‹ā˛Ļā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†", + "unable_to_change_pin_code": "ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_check_version": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ➅ā˛Ĩā˛ĩā˛ž ā˛¸ā˛°āŗā˛ĩā˛°āŗ ➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏➞⺁ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unable_to_setup_pin_code": "ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛¸āŗ†ā˛Ÿā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛˛āŗā˛˛", + "unsupported_file_type": "{file} ā˛Ģāŗˆā˛˛āŗ ā˛Ēāŗā˛°ā˛•ā˛žā˛°ā˛ĩ⺁ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋā˛˛āŗā˛˛ā˛Ļ {type} ā˛•ā˛žā˛°ā˛Ŗ ➅ā˛Ļā˛¨āŗā˛¨āŗ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛.", + "update_location_action_prompt": "{count} ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗ ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ➇ā˛Ļā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➍ā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋ:", + "upload_dialog_info": "ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗ(ā˛—ā˛ŗā˛¨āŗā˛¨āŗ) ā˛¸ā˛°āŗā˛ĩā˛°āŗâ€Œā˛—āŗ† ā˛Ŧāŗā˛¯ā˛žā˛•ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➍⺀ā˛ĩ⺁ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "upload_errors": "{count, plural, one {# ā˛Ļ⺋➎} other {# ā˛Ļ⺋➎➗➺⺁}} ā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛—āŗŠā˛‚ā˛Ąā˛ŋā˛Ļāŗ†, ā˛šāŗŠā˛¸ ➅ā˛Ēāŗâ€Œā˛˛āŗ‹ā˛Ąāŗ ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¨āŗ‹ā˛Ąā˛˛āŗ ā˛Ē⺁➟ā˛ĩā˛¨āŗā˛¨āŗ ➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ ā˛Žā˛žā˛Ąā˛ŋ.", + "use_custom_date_range": "ā˛Ŧā˛Ļ➞ā˛ŋ➗⺆ ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛• ā˛ļāŗā˛°āŗ‡ā˛Ŗā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ", + "user_has_been_deleted": "➈ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†.", + "validate_endpoint_error": "ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ ā˛Žā˛žā˛¨āŗā˛¯ā˛ĩā˛žā˛Ļ URL ā˛…ā˛¨āŗā˛¨āŗ ā˛¨ā˛Žāŗ‚ā˛Ļā˛ŋ➏ā˛ŋ", + "version_announcement_message": "ā˛¨ā˛Žā˛¸āŗā˛•ā˛žā˛°! ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗâ€Œā˛¨ ā˛šāŗŠā˛¸ ➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋ ā˛˛ā˛­āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†. ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ➤ā˛Ēāŗā˛Ē⺁ ā˛¸ā˛‚ā˛°ā˛šā˛¨āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¤ā˛Ąāŗ†ā˛—ā˛Ÿāŗā˛Ÿā˛˛āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸āŗ†ā˛Ÿā˛Ēāŗ ➍ā˛ĩāŗ€ā˛•āŗƒā˛¤ā˛ĩā˛žā˛—ā˛ŋā˛Ļāŗ† ā˛Žā˛‚ā˛Ļ⺁ ā˛–ā˛šā˛ŋ➤ā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ, ā˛ĩā˛ŋā˛ļ⺇➎ā˛ĩā˛žā˛—ā˛ŋ ➍⺀ā˛ĩ⺁ ā˛ĩā˛žā˛šāŗâ€Œā˛Ÿā˛ĩā˛°āŗ ➅ā˛Ĩā˛ĩā˛ž ➍ā˛ŋā˛Žāŗā˛Ž ā˛‡ā˛Žāŗā˛Žā˛ŋā˛šāŗ ➍ā˛ŋā˛Ļā˛°āŗā˛ļ➍ā˛ĩā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ➍ā˛ĩ⺀➕➰ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏⺁ā˛ĩ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛•ā˛žā˛°āŗā˛¯ā˛ĩā˛ŋā˛§ā˛žā˛¨ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŗā˛¸āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗā˛Ļ➰⺆, ā˛Ļ➝ā˛ĩā˛ŋā˛Ÿāŗā˛Ÿāŗ release notes ➓ā˛Ļ➞⺁ ā˛¸āŗā˛ĩā˛˛āŗā˛Ē ā˛¸ā˛Žā˛¯ ➤⺆➗⺆ā˛Ļāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛ŋ.", + "video_hover_setting": "ā˛šāŗ‹ā˛ĩā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗ ā˛Ēāŗā˛˛āŗ‡ ā˛Žā˛žā˛Ąā˛ŋ", + "video_hover_setting_description": "ā˛ŽāŗŒā˛¸āŗ ā˛ā˛Ÿā˛‚ ā˛Žāŗ‡ā˛˛āŗ† ➏⺁➺ā˛ŋā˛Ļā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛ŋ➰⺁ā˛ĩā˛žā˛— ā˛ĩāŗ€ā˛Ąā˛ŋ➝⺊ ā˛Ĩ➂ā˛Ŧāŗâ€Œā˛¨āŗ‡ā˛˛āŗ ā˛Ēāŗā˛˛āŗ‡ ā˛Žā˛žā˛Ąā˛ŋ. ➍ā˛ŋā˛ˇāŗā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļ➰⺂ ā˛¸ā˛š, ā˛Ēāŗā˛˛āŗ‡ ā˛ā˛•ā˛žā˛¨āŗ ā˛Žāŗ‡ā˛˛āŗ† ➏⺁➺ā˛ŋā˛Ļā˛žā˛Ąāŗā˛ĩ ā˛Žāŗ‚ā˛˛ā˛• ā˛Ēāŗā˛˛āŗ‡ā˛Ŧāŗā˛¯ā˛žā˛•āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁.", + "workflow_delete_prompt": "➈ ā˛ĩā˛°āŗā˛•āŗâ€Œā˛Ģāŗā˛˛āŗ‹ ā˛…ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "workflow_json_help": "JSON ā˛¸āŗā˛ĩ➰⺂ā˛Ēā˛Ļā˛˛āŗā˛˛ā˛ŋ ➕⺆➞➏ā˛Ļ ā˛šā˛°ā˛ŋā˛ĩā˛ŋ➍ ā˛¸ā˛‚ā˛°ā˛šā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏ā˛ŋ. ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩ➪⺆➗➺⺁ ā˛Ļ⺃ā˛ļāŗā˛¯ ā˛Ŧā˛ŋā˛˛āŗā˛Ąā˛°āŗâ€Œā˛—āŗ† ➏ā˛ŋā˛‚ā˛•āŗ ā˛†ā˛—āŗā˛¤āŗā˛¤ā˛ĩāŗ†.", + "workflow_navigation_prompt": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏ā˛Ļ⺆➝⺇ ➍⺀ā˛ĩ⺁ ā˛šāŗŠā˛°ā˛Ąā˛˛āŗ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", + "workflows_help_text": "ā˛Ÿāŗā˛°ā˛ŋā˛—āŗā˛—ā˛°āŗâ€Œā˛—ā˛ŗāŗ ā˛Žā˛¤āŗā˛¤āŗ ā˛Ģā˛ŋā˛˛āŗā˛Ÿā˛°āŗâ€Œā˛—ā˛ŗ ā˛†ā˛§ā˛žā˛°ā˛Ļ ā˛Žāŗ‡ā˛˛āŗ† ➍ā˛ŋā˛Žāŗā˛Ž ā˛¸āŗā˛ĩā˛¤āŗā˛¤āŗā˛—ā˛ŗ ā˛Žāŗ‡ā˛˛ā˛ŋ➍ ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➕⺆➞➏ā˛Ļ ā˛šā˛°ā˛ŋā˛ĩ⺁➗➺⺁ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋā˛¤ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛ĩāŗ†", + "you_dont_have_any_shared_links": "➍⺀ā˛ĩ⺁ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛‚ā˛Ą ➞ā˛ŋā˛‚ā˛•āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛˛āŗā˛˛", + "zero_to_clear_rating": "ā˛†ā˛¸āŗā˛¤ā˛ŋ ā˛°āŗ‡ā˛Ÿā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏➞⺁ 0 ā˛’ā˛¤āŗā˛¤ā˛ŋ➰ā˛ŋ" } diff --git a/i18n/ko.json b/i18n/ko.json index 5449bf1e44..22d5d1b8a6 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -5,7 +5,7 @@ "acknowledge": "í™•ė¸", "action": "ėž‘ė—…", "action_common_update": "ė—…ë°ė´íŠ¸", - "action_description": "필터링된 ėžė‚°ė— 대해 ėˆ˜í–‰í•  ėŧë ¨ė˜ ėž‘ė—…", + "action_description": "필터링된 항ëĒŠė— ėˆ˜í–‰í•  ėŧë ¨ė˜ ėž‘ė—…", "actions": "ėž‘ė—…", "active": "í™œė„ą", "active_count": "í™œė„ą: {count}", @@ -17,13 +17,13 @@ "add_a_name": "ė´ëĻ„ ėļ”ę°€", "add_a_title": "렜ëĒŠ ėļ”ę°€", "add_action": "ėž‘ė—… ėļ”ę°€", - "add_action_description": "클ëĻ­í•˜ė—Ŧ ėˆ˜í–‰í•  ėž‘ė—…ė„ ėļ”ę°€í•˜ė„¸ėš”", + "add_action_description": "클ëĻ­í•˜ė—Ŧ ėˆ˜í–‰í•  ėž‘ė—… ėļ”ę°€", "add_assets": "항ëĒŠ ėļ”ę°€", "add_birthday": "ėƒėŧ ėļ”ę°€", "add_endpoint": "ė—”ë“œíŦė¸íŠ¸ ėļ”ę°€", "add_exclusion_pattern": "ė œė™¸ ęˇœėš™ ėļ”ę°€", "add_filter": "필터 ėļ”ę°€", - "add_filter_description": "필터 ėĄ°ęą´ė„ ėļ”ę°€í•˜ë ¤ëŠ´ 클ëĻ­í•˜ė„¸ėš”", + "add_filter_description": "클ëĻ­í•˜ė—Ŧ 필터 ėĄ°ęą´ ėļ”ę°€", "add_location": "ėœ„ėš˜ ėļ”ę°€", "add_more_users": "다ëĨ¸ ė‚ŦėšŠėž ėļ”ę°€", "add_partner": "파트너 ėļ”ę°€", @@ -34,7 +34,7 @@ "add_to_album": "ė•¨ë˛”ė— ėļ”ę°€", "add_to_album_bottom_sheet_added": "{album}뗐 ėļ”가됨", "add_to_album_bottom_sheet_already_exists": "ė´ë¯¸ {album}뗐 ėžˆėŒ", - "add_to_album_bottom_sheet_some_local_assets": "ėŧëļ€ ëĄœėģŦ 항ëĒŠė´ ė•¨ë˛”ė— ėļ”ę°€ë˜ė§€ ė•Šė•˜ėŠĩ니다.", + "add_to_album_bottom_sheet_some_local_assets": "ėŧëļ€ ëĄœėģŦ 항ëĒŠė„ ė•¨ë˛”ė— ėļ”가할 눘 ė—†ėŠĩ니다.", "add_to_album_toggle": "{album} ė„ íƒ/í•´ė œ", "add_to_albums": "ė—ŦëŸŦ ė•¨ë˛”ė— ėļ”ę°€", "add_to_albums_count": "ė—ŦëŸŦ ė•¨ë˛”ė— ėļ”ę°€ ({count})", @@ -49,7 +49,7 @@ "admin": { "add_exclusion_pattern_description": "*, **, ? ë“ąė˜ glob íŒ¨í„´ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´ \"Raw\" 폴더 내 ëĒ¨ë“  파ėŧė„ ė œė™¸í•˜ë ¤ëŠ´ \"**/Raw/**\"ëĨŧ, .tif 파ėŧė„ ė œė™¸í•˜ë ¤ëŠ´ \"**/*.tif\", íŠšė •í•œ ė ˆëŒ€ ę˛Ŋ로ëĨŧ ė œė™¸í•˜ë ¤ëŠ´ \"/path/to/ignore/**\" 래ëŸŧ ė‚ŦėšŠí•Šë‹ˆë‹¤.", "admin_user": "관ëĻŦėž", - "asset_offline_description": "ė´ 항ëĒŠė€ 뙏ëļ€ ëŧė´ë¸ŒëŸŦëĻŦ뗐 ë“ąëĄë˜ė—ˆėœŧ나 ë””ėŠ¤íŦė—ė„œ ė°žė„ 눘 뗆떴 íœ´ė§€í†ĩėœŧ로 ė´ë™í–ˆėŠĩ니다. 파ėŧė´ ëŧė´ë¸ŒëŸŦëĻŦ ę˛Ŋ로 ë‚´ė—ė„œ ė´ë™ëœ ę˛Ŋ뚰 íƒ€ėž„ëŧė¸ė—ė„œ ėƒˆëĄœ ė¸ė‹ëœ 항ëĒŠė´ ėžˆëŠ”ė§€ í™•ė¸í•´ëŗ´ė„¸ėš”. ė´ 항ëĒŠė„ ëŗĩė›í•˜ë ¤ëŠ´ ė•„ëž˜ ę˛ŊëĄœė— Immich가 ė ‘ęˇŧ할 눘 ėžˆëŠ”ė§€ í™•ė¸í•˜ęŗ  ëŧė´ë¸ŒëŸŦëĻŦëĨŧ ë‹¤ė‹œ 늤ėē”í•˜ė„¸ėš”.", + "asset_offline_description": "해당 뙏ëļ€ ëŧė´ë¸ŒëŸŦëĻŦ 항ëĒŠė€ ë””ėŠ¤íŦė—ė„œ 더 ė´ėƒ ė°žė„ 눘 ė—†ėœŧ늰 íœ´ė§€í†ĩėœŧ로 ė´ë™ë˜ė—ˆėŠĩ니다. 파ėŧė´ ëŧė´ë¸ŒëŸŦëĻŦ ë‚´ė—ė„œ ė´ë™ëœ ę˛Ŋ뚰 íƒ€ėž„ëŧė¸ė—ė„œ ėƒˆëĄœ ė¸ė‹ëœ 항ëĒŠė´ ėžˆëŠ”ė§€ í™•ė¸í•˜ė„¸ėš”. ė´ 항ëĒŠė„ ëŗĩė›í•˜ë ¤ëŠ´ ė•„ëž˜ ę˛ŊëĄœė— Immich가 ė ‘ęˇŧ할 눘 ėžˆëŠ”ė§€ í™•ė¸í•˜ęŗ  ëŧė´ë¸ŒëŸŦëĻŦëĨŧ ë‹¤ė‹œ 늤ėē”í•˜ė„¸ėš”.", "authentication_settings": "ė¸ėĻ 네렕", "authentication_settings_description": "비밀번호, OAuth 및 기타 ė¸ėĻ ė„¤ė •ė„ 관ëĻŦ합니다.", "authentication_settings_disable_all": "ëĒ¨ë“  ëĄœęˇ¸ė¸ ėˆ˜ë‹¨ė„ ëš„í™œė„ąí™”í•˜ė‹œę˛ ėŠĩ니까? ë”ė´ėƒ ëĄœęˇ¸ė¸í•  눘 ė—†ėŠĩ니다.", @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "개는 클ëŧėš°ë“œë‚˜ 다ëĨ¸ ëŦŧëĻŦ렁 ėœ„ėš˜ė— ëŗ´ę´€í•Šë‹ˆë‹¤.", "backup_onboarding_2_description": "개는 ė„œëĄœ 다ëĨ¸ 로ėģŦ ėžĨėš˜ė— ëŗ´ę´€í•˜ęŗ ,", "backup_onboarding_3_description": "ę°œė˜ ë°ė´í„° ė‚Ŧëŗ¸ė„ 만듭니다.", - "backup_onboarding_description": "ė†Œė¤‘í•œ ë°ė´í„°ëĨŧ ė•ˆė „í•˜ę˛Œ ëŗ´í˜¸í•˜ę¸° ėœ„í•´ 3-2-1 ë°ąė—… ė „ëžĩ ė‚ŦėšŠė„ ęļŒėžĨ합니다. ImmichëĨŧ ë°ąė—…í•  때 ė—…ëĄœë“œí•œ ė‚Ŧė§„ 및 ë™ė˜ėƒëŋ ė•„ë‹ˆëŧ ë°ė´í„°ë˛ ė´ėŠ¤ë„ 함ęģ˜ ëŗ´ę´€í•´ė•ŧ 한다는 ė ė„ ėžŠė§€ ë§ˆė„¸ėš”.", + "backup_onboarding_description": "ë°ė´í„° ëŗ´í˜¸ëĨŧ ėœ„í•´ 3-2-1 ë°ąė—… ė „ëžĩ ė‚ŦėšŠė„ ęļŒėžĨ합니다. ë°ąė—…ė—ëŠ” ė—…ëĄœë“œí•œ ė‚Ŧė§„ 및 ë™ė˜ėƒëŋ ė•„ë‹ˆëŧ Immich ë°ė´í„°ë˛ ė´ėŠ¤ë„ íŦí•¨ë˜ė–´ė•ŧ 합니다.", "backup_onboarding_footer": "Immich ë°ąė—…ė— 대한 ėžė„¸í•œ ë‚´ėšŠė€ ęŗĩė‹ ëŦ¸ė„œëĨŧ ė°¸ėĄ°í•˜ė„¸ėš”.", "backup_onboarding_parts_title": "3-2-1 ë°ąė—…ė´ëž€:", "backup_onboarding_title": "ë°ąė—…", @@ -72,61 +72,61 @@ "confirm_delete_library": "{library} ëŧė´ë¸ŒëŸŦëĻŦëĨŧ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까?", "confirm_delete_library_assets": "ė´ ëŧė´ë¸ŒëŸŦëĻŦëĨŧ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까? Immichė—ė„œ {count, plural, one {항ëĒŠ #개가} other {항ëĒŠ #개가}} ė‚­ė œë˜ëŠ° 되돌ëĻ´ 눘 ė—†ėŠĩ니다. ė›ëŗ¸ 파ėŧė€ ë””ėŠ¤íŦ뗐 ë‚¨ė•„ ėžˆėŠĩ니다.", "confirm_email_below": "ęŗ„ė† ė§„í–‰í•˜ë ¤ëŠ´ ė•„ëž˜ė— \"{email}\" ėž…ë Ĩ", - "confirm_reprocess_all_faces": "ëĒ¨ë“  ė–ŧęĩ´ė„ ë‹¤ė‹œ 래ëĻŦí•˜ė‹œę˛ ėŠĩ니까? ė´ëĻ„ė´ ė§€ė •ëœ ė¸ëŦŧ도 ė´ˆę¸°í™”ëŠë‹ˆë‹¤.", + "confirm_reprocess_all_faces": "ëĒ¨ë“  ė–ŧęĩ´ė„ ë‹¤ė‹œ 래ëĻŦí•˜ė‹œę˛ ėŠĩ니까? ė¸ëŦŧ뗐 ė§€ė •í•œ ė´ëĻ„ë„ ė‚­ė œëŠë‹ˆë‹¤.", "confirm_user_password_reset": "{user}ë‹˜ė˜ 비밀번호ëĨŧ ė´ˆę¸°í™”í•˜ė‹œę˛ ėŠĩ니까?", "confirm_user_pin_code_reset": "{user}ë‹˜ė˜ PIN ėŊ”드ëĨŧ ė´ˆę¸°í™”í•˜ė‹œę˛ ėŠĩ니까?", - "copy_config_to_clipboard_description": "현ėžŦ ė‹œėŠ¤í…œ ęĩŦė„ąė„ JSON 형태로 클ëĻŊëŗ´ë“œė— ëŗĩė‚Ŧ합니다.", + "copy_config_to_clipboard_description": "현ėžŦ ė‹œėŠ¤í…œ ęĩŦė„ąė„ JSON ę°ė˛´ëĄœ 클ëĻŊëŗ´ë“œė— ëŗĩė‚Ŧ합니다.", "create_job": "냈 ėž‘ė—…", "cron_expression": "Cron í‘œí˜„ė‹", - "cron_expression_description": "Cron í‘œí˜„ė‹ėœŧ로 늤ėē” ėŖŧ기ëĨŧ ė„¤ė •í•Šë‹ˆë‹¤. ėžė„¸í•œ ë‚´ėšŠė€ ë‹¤ėŒ 링íŦëĨŧ í™•ė¸í•˜ė„¸ėš”. Crontab Guru", + "cron_expression_description": "Cron í‘œí˜„ė‹ėœŧ로 늤ėē” ėŖŧ기ëĨŧ ė„¤ė •í•Šë‹ˆë‹¤. ėžė„¸í•œ ë‚´ėšŠė€ Crontab GuruëĨŧ í™•ė¸í•˜ė„¸ėš”.", "cron_expression_presets": "Cron í‘œí˜„ė‹ 프ëĻŦė…‹", "disable_login": "ëĄœęˇ¸ė¸ ëš„í™œė„ąí™”", "duplicate_detection_job_description": "揰溄 학ėŠĩėœŧ로 뜠ė‚Ŧ한 ė´ë¯¸ė§€ëĨŧ ę°ė§€í•Šë‹ˆë‹¤. ėŠ¤ë§ˆíŠ¸ ę˛€ėƒ‰ė´ í™œė„ąí™”ë˜ė–´ ėžˆė–´ė•ŧ 합니다.", - "exclusion_pattern_description": "ëŧė´ë¸ŒëŸŦëĻŦ 늤ėē”ė—ė„œ ė œė™¸í•  파ėŧė´ë‚˜ 폴더 ęˇœėš™ė„ ė„¤ė •í•Šë‹ˆë‹¤. í´ë”ė— ė›í•˜ė§€ ė•ŠëŠ” 파ėŧ(RAW 파ėŧ 등)ė´ 함ęģ˜ ėĄ´ėžŦ하는 ę˛Ŋ뚰 ėœ ėšŠí•Šë‹ˆë‹¤.", + "exclusion_pattern_description": "ëŧė´ë¸ŒëŸŦëĻŦ 늤ėē”ė—ė„œ ė œė™¸í•  파ėŧė´ë‚˜ 폴더 ęˇœėš™ė„ ė„¤ė •í•Šë‹ˆë‹¤. ę°€ė ¸ė˜¤ė§€ ė•Šė„ 파ėŧ(RAW 파ėŧ 등)ė´ íŦ함된 폴더가 ėžˆė„ 때 ė‚ŦėšŠí•Šë‹ˆë‹¤.", "export_config_as_json_description": "현ėžŦ ė‹œėŠ¤í…œ ęĩŦė„ąė„ JSON 파ėŧ로 ë‹¤ėš´ëĄœë“œí•Šë‹ˆë‹¤.", - "external_libraries_page_description": "뙏ëļ€ ëŧė´ë¸ŒëŸŦëĻŦ íŽ˜ė´ė§€ 관ëĻŦ", + "external_libraries_page_description": "뙏ëļ€ ëŧė´ë¸ŒëŸŦëĻŦ 관ëĻŦ íŽ˜ė´ė§€", "face_detection": "ė–ŧęĩ´ 氐맀", - "face_detection_description": "揰溄 학ėŠĩėœŧ로 항ëĒŠė—ė„œ ė–ŧęĩ´ė„ ę°ė§€í•Šë‹ˆë‹¤. ë™ė˜ėƒė˜ ę˛Ŋ뚰 ė„Ŧ네ėŧ만 ëļ„ė„ė— ė‚ŦėšŠëŠë‹ˆë‹¤. \"ėƒˆëĄœęŗ ėš¨\"ė€ ëĒ¨ë“  항ëĒŠė„ (ėžŦ)래ëĻŦ하며, \"ė´ˆę¸°í™”\"는 현ėžŦ ëĒ¨ë“  ė–ŧęĩ´ ë°ė´í„°ëĨŧ ėļ”ę°€ëĄœ ė‚­ė œí•Šë‹ˆë‹¤. \"누ëŊ\"ė€ 땄링 래ëĻŦë˜ė§€ ė•Šė€ 항ëĒŠė„ ëŒ€ę¸°ė—´ė— ėļ”ę°€í•Šë‹ˆë‹¤. ė–ŧęĩ´ 氐맀氀 ė™„ëŖŒë˜ëŠ´ ė–ŧęĩ´ ė¸ė‹ ë‹¨ęŗ„ëĄœ ë„˜ė–´ę°€ ę¸°ėĄ´ ė¸ëŦŧė´ë‚˜ ėƒˆëĄœėš´ ė¸ëŦŧ로 ęˇ¸ëŖší™”í•Šë‹ˆë‹¤.", - "facial_recognition_job_description": "ę°ė§€ëœ ė–ŧęĩ´ė„ ė¸ëŦŧëŗ„ëĄœ ęˇ¸ëŖší™”í•Šë‹ˆë‹¤. ė´ ėž‘ė—…ė€ ė–ŧęĩ´ 氐맀 ėž‘ė—…ė´ ė™„ëŖŒëœ 후 ė§„í–‰ëŠë‹ˆë‹¤. \"ė´ˆę¸°í™”\"는 ëĒ¨ë“  ė–ŧęĩ´ė„ ë‹¤ė‹œ ęˇ¸ëŖší™”í•Šë‹ˆë‹¤. \"누ëŊ\"ė€ ęˇ¸ëŖší™”ë˜ė§€ ė•Šė€ ė–ŧęĩ´ė„ ëŒ€ę¸°ė—´ė— ėļ”ę°€í•Šë‹ˆë‹¤.", + "face_detection_description": "揰溄 학ėŠĩė„ ė‚ŦėšŠí•´ 항ëĒŠė—ė„œ ė–ŧęĩ´ė„ ę°ė§€í•Šë‹ˆë‹¤. ë™ė˜ėƒė€ ė„Ŧ네ėŧ만 ė‚ŦėšŠí•Šë‹ˆë‹¤. \"ėƒˆëĄœęŗ ėš¨\"ė€ ëĒ¨ë“  항ëĒŠė„ 래ëĻŦ합니다. \"ė´ˆę¸°í™”\"는 ëĒ¨ë“  ė–ŧęĩ´ ë°ė´í„°ëĨŧ ė‚­ė œí•Šë‹ˆë‹¤. \"누ëŊ\"ė€ 땄링 래ëĻŦë˜ė§€ ė•Šė€ 항ëĒŠė„ ëŒ€ę¸°ė—´ė— ėļ”ę°€í•Šë‹ˆë‹¤. ę°ė§€ëœ ė–ŧęĩ´ė€ ė–ŧęĩ´ ė¸ė‹ ë‹¨ęŗ„ė—ė„œ 래ëĻŦ되늰, ę¸°ėĄ´ ė¸ëŦŧ 또는 냈 ė¸ëŦŧ로 ęˇ¸ëŖší™”ëŠë‹ˆë‹¤.", + "facial_recognition_job_description": "ę°ė§€ëœ ė–ŧęĩ´ė„ ė¸ëŦŧëŗ„ëĄœ ęˇ¸ëŖší™”í•Šë‹ˆë‹¤. ė´ ėž‘ė—…ė€ ė–ŧęĩ´ 氐맀氀 ė™„ëŖŒëœ 후 ė§„í–‰ëŠë‹ˆë‹¤. \"ė´ˆę¸°í™”\"는 ëĒ¨ë“  ė–ŧęĩ´ė„ ęˇ¸ëŖší™”í•Šë‹ˆë‹¤. \"누ëŊ\"ė€ ęˇ¸ëŖší™”ë˜ė§€ ė•Šė€ ė–ŧęĩ´ė„ ëŒ€ę¸°ė—´ė— ėļ”ę°€í•Šë‹ˆë‹¤.", "failed_job_command": "{job} ėž‘ė—…ė˜ {command} ė‹¤íŒ¨", "force_delete_user_warning": "ę˛Ŋęŗ : ė´ ėž‘ė—…ė€ 해당 ė‚ŦėšŠėžė˜ ęŗ„ė •ęŗŧ ëĒ¨ë“  항ëĒŠė„ ėĻ‰ė‹œ ė‚­ė œí•Šë‹ˆë‹¤. ė´ ėž‘ė—…ė€ 되돌ëĻ´ 눘 ė—†ėœŧ늰 ė‚­ė œëœ 파ėŧė€ ëŗĩęĩŦ할 눘 ė—†ėŠĩ니다.", "image_format": "í˜•ė‹", - "image_format_description": "WebP는 JPEGëŗ´ë‹¤ 파ėŧ íŦ기가 ėž‘ė§€ë§Œ ė¸ėŊ”딊 ė†ë„ę°€ 느ëĻŊ니다.", - "image_fullsize_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ 렄랴 íŦ기 ė´ë¯¸ė§€. ė´ë¯¸ė§€ 확대 ė‹œ ė‚ŦėšŠëŠë‹ˆë‹¤.", + "image_format_description": "WebP는 JPEGëŗ´ë‹¤ 파ėŧ íŦ기는 ėž‘ė§€ë§Œ ė¸ėŊ”딊 ė†ë„ę°€ 느ëĻŊ니다.", + "image_fullsize_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ 렄랴 íŦ기 ė´ë¯¸ė§€. ė´ë¯¸ė§€ëĨŧ 확대할 때 ė‚ŦėšŠëŠë‹ˆë‹¤.", "image_fullsize_enabled": "렄랴 íŦ기 ė´ë¯¸ė§€ ėƒė„ą í™œė„ąí™”", - "image_fullsize_enabled_description": "ė›š ėšœí™”ė ė´ė§€ ė•Šė€ í˜•ė‹ė— 대해 렄랴 íŦ기 ė´ë¯¸ė§€ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤. \"파ėŧ뗐 íŦ함된 미ëĻŦëŗ´ę¸° ėš°ė„ \"ė´ í™œė„ąí™”ëœ ę˛Ŋ뚰, ëŗ€í™˜ ė—†ė´ 해당 미ëĻŦëŗ´ę¸°ëĨŧ 그대로 ė‚ŦėšŠí•Šë‹ˆë‹¤. JPEGęŗŧ ę°™ė€ ė›š ėšœí™”ė ė¸ í˜•ė‹ė—ëŠ” 똁í–Ĩė„ ėŖŧė§€ ė•ŠėŠĩ니다.", - "image_fullsize_quality_description": "렄랴 íŦ기 ė´ë¯¸ė§€ė˜ í’ˆė§ˆė„ 1ė—ė„œ 100 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė„ ë†’ė´ëŠ´ í’ˆė§ˆė´ ėĸ‹ė•„ė§€ė§€ë§Œ 파ėŧ íŦ기가 ėģ¤ė§‘니다.", + "image_fullsize_enabled_description": "ė›šė—ė„œ ė§€ė›ë˜ė§€ ė•ŠëŠ” í˜•ė‹ė— 대해 렄랴 íŦ기 ė´ë¯¸ė§€ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤. \"íŦ함된 미ëĻŦëŗ´ę¸° ėš°ė„  ė‚ŦėšŠ\"ė„ í™œė„ąí™”í•˜ëŠ´ 미ëĻŦëŗ´ę¸°ëĨŧ 그대로 ė‚ŦėšŠí•Šë‹ˆë‹¤.", + "image_fullsize_quality_description": "렄랴 íŦ기 ė´ë¯¸ė§€ í’ˆė§ˆė„ 1~100 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ í´ėˆ˜ëĄ í’ˆė§ˆė´ ėĸ‹ė•„ė§€ė§€ë§Œ 파ėŧ íŦ기도 ėģ¤ė§‘니다.", "image_fullsize_title": "렄랴 íŦ기 ė´ë¯¸ė§€ 네렕", - "image_prefer_embedded_preview": "파ėŧ뗐 íŦ함된 미ëĻŦëŗ´ę¸° ėš°ė„  ė‚ŦėšŠ", - "image_prefer_embedded_preview_setting_description": "RAW ė‚Ŧ맄뗐 íŦ함된 내ėžĨ 미ëĻŦëŗ´ę¸°ëĨŧ 가ëŠĨ한 ę˛Ŋ뚰 ė´ë¯¸ė§€ 래ëĻŦ뗐 ė‚ŦėšŠí•Šë‹ˆë‹¤. ė´ ë°Šė‹ė€ ėŧëļ€ ė´ë¯¸ė§€ė—ė„œ 더 ė •í™•í•œ ėƒ‰ėƒė„ ė–ģė„ 눘 ėžˆė§€ë§Œ, 미ëĻŦëŗ´ę¸°ė˜ í’ˆė§ˆė€ ėš´ëŠ”ëŧ뗐 따ëŧ 다ëĨ´ëа ė••ėļ•ėœŧ로 ė¸í•œ í’ˆė§ˆ ė €í•˜ę°€ 나타날 눘 ėžˆėŠĩ니다.", + "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_preview_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ 뤑氄 íŦ기 ė´ë¯¸ė§€. 揰溄 학ėŠĩ 또는 ę°œëŗ„ 항ëĒŠė„ í‘œė‹œí•  때 ė‚ŦėšŠëŠë‹ˆë‹¤.", - "image_preview_quality_description": "미ëĻŦëŗ´ę¸°ė˜ í’ˆė§ˆė„ 1ė—ė„œ 100 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė„ ë†’ė´ëŠ´ í’ˆė§ˆė´ ėĸ‹ė•„ė§€ė§€ë§Œ 파ėŧ íŦ기가 ėģ¤ė§€ęŗ  ė•ą ë°˜ė‘ ė†ë„ę°€ ëŠë ¤ė§ˆ 눘 ėžˆėŠĩ니다. 너ëŦ´ ë‚Žė€ ę°’ė€ 揰溄 학ėŠĩ뗐 똁í–Ĩė„ 뤄 눘 ėžˆėŠĩ니다.", + "image_prefer_wide_gamut_setting_description": "ė„Ŧ네ėŧ뗐 Display P3ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. ę´‘ėƒ‰ė—­ í‘œí˜„ė´ 더 ė •í™•í•´ė§€ė§€ë§Œ ęĩŦ형 환ę˛Ŋė—ė„œëŠ” 다ëĨ´ę˛Œ ëŗ´ėŧ 눘 ėžˆėŠĩ니다. sRGB ė´ë¯¸ė§€ëŠ” ėƒ‰ė—­ė„ ėœ ė§€í•Šë‹ˆë‹¤.", + "image_preview_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ 뤑氄 íŦ기 ė´ë¯¸ė§€. 揰溄 학ėŠĩ 및 ę°œëŗ„ 항ëĒŠė„ í‘œė‹œí•  때 ė‚ŦėšŠëŠë‹ˆë‹¤.", + "image_preview_quality_description": "미ëĻŦëŗ´ę¸° í’ˆė§ˆė„ 1~100 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ í´ėˆ˜ëĄ ėĸ‹ė§€ë§Œ 파ėŧ íŦ기가 ėģ¤ė§€ęŗ  ė•ą ë°˜ė‘ ė†ë„ę°€ ëŠë ¤ė§ˆ 눘 ėžˆėŠĩ니다. 너ëŦ´ ë‚Žė€ ę°’ė€ 揰溄 학ėŠĩ í’ˆė§ˆė— 똁í–Ĩė„ 뤄 눘 ėžˆėŠĩ니다.", "image_preview_title": "미ëĻŦëŗ´ę¸° 네렕", "image_progressive": "렐맄렁 로딩", "image_progressive_description": "JPEG ė´ë¯¸ė§€ëĨŧ 렐맄렁ėœŧ로 í‘œė‹œí•  눘 ėžˆę˛Œ ë‹¨ęŗ„ė ėœŧ로 ė¸ėŊ”딊핊니다. WebP ė´ë¯¸ė§€ė—ëŠ” 똁í–Ĩė´ ė—†ėŠĩ니다.", "image_quality": "í’ˆė§ˆ", "image_resolution": "í•´ėƒë„", - "image_resolution_description": "í•´ėƒë„ę°€ 높ėœŧ늴 넏ëļ€ ė •ëŗ´ę°€ ëŗ´ėĄ´ë˜ė§€ë§Œ, ė¸ėŊ”ë”Šė— 더 ë§Žė€ ė‹œę°„ė´ ė†Œėš”ë˜ęŗ  파ėŧ íŦ기가 ėģ¤ė ¸ ė•ą ë°˜ė‘ ė†ë„ę°€ ëŠë ¤ė§ˆ 눘 ėžˆėŠĩ니다.", + "image_resolution_description": "í•´ėƒë„ę°€ ë†’ė„ėˆ˜ëĄ 더 ë§Žė€ 넏ëļ€ ė •ëŗ´ëĨŧ ëŗ´ėĄ´í•  눘 ėžˆė§€ë§Œ, ė¸ėŊ”딊 ė‹œę°„ė´ 描떴맀溠 파ėŧ íŦ기가 ėģ¤ė§€ëа ė•ą ë°˜ė‘ ė†ë„ę°€ ëŠë ¤ė§ˆ 눘 ėžˆėŠĩ니다.", "image_settings": "ė´ë¯¸ė§€ 네렕", - "image_settings_description": "ė´ë¯¸ė§€ė˜ í’ˆė§ˆ 및 래ëĻŦ ë°Šė‹ė„ 관ëĻŦ합니다.", - "image_thumbnail_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ ėž‘ė€ ė„Ŧ네ėŧ. ëŠ”ė¸ íƒ€ėž„ëŧė¸ ë“ąė—ė„œ ė—ŦëŸŦ ė‚Ŧė§„ė„ í‘œė‹œí•  때 ė‚ŦėšŠëŠë‹ˆë‹¤.", - "image_thumbnail_quality_description": "ė„Ŧ네ėŧ í’ˆė§ˆė„ 1ė—ė„œ 100 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė„ ë†’ė´ëŠ´ í’ˆė§ˆė´ ėĸ‹ė•„ė§€ė§€ë§Œ 파ėŧ íŦ기가 ėģ¤ė§€ęŗ  ė•ą ë°˜ė‘ ė†ë„ę°€ ëŠë ¤ė§ˆ 눘 ėžˆėŠĩ니다.", + "image_settings_description": "ėƒė„ąë˜ëŠ” ė´ë¯¸ė§€ė˜ í’ˆė§ˆ 및 í•´ėƒë„ëĨŧ 관ëĻŦ합니다.", + "image_thumbnail_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ ėž‘ė€ ė„Ŧ네ėŧ. ëŠ”ė¸ íƒ€ėž„ëŧė¸ 등 ė‚Ŧė§„ ëĒŠëĄė„ í‘œė‹œí•  때 ė‚ŦėšŠëŠë‹ˆë‹¤.", + "image_thumbnail_quality_description": "ė„Ŧ네ėŧ í’ˆė§ˆė„ 1~100 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ í´ėˆ˜ëĄ ėĸ‹ė§€ë§Œ 파ėŧ íŦ기가 ėģ¤ė§€ęŗ  ė•ą ë°˜ė‘ ė†ë„ę°€ ëŠë ¤ė§ˆ 눘 ėžˆėŠĩ니다.", "image_thumbnail_title": "ė„Ŧ네ėŧ 네렕", "import_config_from_json_description": "JSON 파ėŧė„ ė—…ëĄœë“œí•˜ė—Ŧ ė‹œėŠ¤í…œ ęĩŦė„ąė„ 氀렏ė˜ĩ니다.", "job_concurrency": "{job} ë™ė‹œė„ą", "job_created": "ėž‘ė—…ė´ ėƒė„ąë˜ė—ˆėŠĩ니다.", "job_not_concurrency_safe": "ė´ ėž‘ė—…ė€ ë™ė‹œ ė‹¤í–‰ė— ė•ˆė „í•˜ė§€ ė•ŠėŠĩ니다.", "job_settings": "ėž‘ė—… 네렕", - "job_settings_description": "각 ėž‘ė—…ė—ė„œ ë™ė‹œė— 래ëĻŦ할 항ëĒŠ 눘ëĨŧ ė§€ė •í•Šë‹ˆë‹¤.", + "job_settings_description": "ėž‘ė—…ė˜ ë™ė‹œ ė‹¤í–‰ 눘ëĨŧ 관ëĻŦ합니다.", "jobs_delayed": "{jobCount, plural, other {#氜}} 맀뗰", "jobs_failed": "{jobCount, plural, other {#氜}} ė‹¤íŒ¨", - "jobs_over_time": "ėž‘ė—… ë§ŒëŖŒ ė‹œę°„", + "jobs_over_time": "ė‹œę°„ëŗ„ ėž‘ė—… 눘", "library_created": "{library} ëŧė´ë¸ŒëŸŦëĻŦëĨŧ ėƒė„ąí–ˆėŠĩ니다.", "library_deleted": "ëŧė´ë¸ŒëŸŦëĻŦ가 ė‚­ė œë˜ė—ˆėŠĩ니다.", "library_details": "ëŧė´ë¸ŒëŸŦëĻŦ ėƒė„¸", - "library_folder_description": "氀렏ė˜Ŧ 폴더ëĨŧ ė§€ė •í•Šë‹ˆë‹¤. 해당 폴더ëĨŧ íŦ함한 ëĒ¨ë“  í•˜ėœ„ í´ë”ė—ė„œ ė´ë¯¸ė§€ 및 ë™ė˜ėƒė„ 늤ėē”핊니다.", + "library_folder_description": "氀렏ė˜Ŧ 폴더ëĨŧ ė§€ė •í•Šë‹ˆë‹¤. ė§€ė •í•œ í´ë”ė™€ í•˜ėœ„ í´ë”ė—ė„œ ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ 늤ėē”핊니다.", "library_remove_exclusion_pattern_prompt": "ė´ ė œė™¸ ęˇœėš™ė„ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까?", "library_remove_folder_prompt": "ė´ ę°€ė ¸ė˜¤ę¸° 폴더ëĨŧ ė •ë§ëĄœ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까?", "library_scanning": "ėŖŧę¸°ė ė¸ 늤ėē”", @@ -148,9 +148,9 @@ "machine_learning_availability_checks_interval": "í™•ė¸ ėŖŧ기", "machine_learning_availability_checks_interval_description": "ę°€ėšŠė„ą í™•ė¸ ėŖŧ기 (밀ëĻŦ봈 ë‹¨ėœ„)", "machine_learning_availability_checks_timeout": "ėš”ė˛­ íƒ€ėž„ė•„ė›ƒ", - "machine_learning_availability_checks_timeout_description": "ę°€ėšŠė„ą í™•ė¸ ėš”ė˛­ íƒ€ėž„ė•„ė›ƒ (밀ëĻŦ봈 ë‹¨ėœ„)", + "machine_learning_availability_checks_timeout_description": "ę°€ėšŠė„ą í™•ė¸ íƒ€ėž„ė•„ė›ƒ (밀ëĻŦ봈 ë‹¨ėœ„)", "machine_learning_clip_model": "CLIP ëĒ¨ë¸", - "machine_learning_clip_model_description": "CLIP ëĒ¨ë¸ė˜ ėĸ…ëĨ˜ëŠ” ė´ęŗŗė„ ė°¸ėĄ°í•˜ė„¸ėš”. 한ęĩ­ė–´ 등 ė—ŦëŸŦ ė–¸ė–´ëĄœ ę˛€ėƒ‰í•˜ë ¤ëŠ´ Multilingual CLIP ëĒ¨ë¸ė„ ė„ íƒí•˜ė„¸ėš”. ëĒ¨ë¸ė„ ëŗ€ę˛Ŋ한 ę˛Ŋ뚰 ëĒ¨ë“  ė´ë¯¸ė§€ė˜ 'ėŠ¤ë§ˆíŠ¸ ę˛€ėƒ‰' ėž‘ė—…ė„ ë‹¤ė‹œ ė‹¤í–‰í•´ė•ŧ 합니다.", + "machine_learning_clip_model_description": "CLIP ëĒ¨ë¸ė˜ ėĸ…ëĨ˜ëŠ” ė´ęŗŗė„ ė°¸ėĄ°í•˜ė„¸ėš”. 한ęĩ­ė–´ëĨŧ íŦ함한 다ęĩ­ė–´ ę˛€ėƒ‰ė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ Multilingual CLIP ëĒ¨ë¸ė„ ė„ íƒí•˜ė„¸ėš”. ëĒ¨ë¸ė„ ëŗ€ę˛Ŋ한 ę˛Ŋ뚰 ëĒ¨ë“  ė´ë¯¸ė§€ė˜ ėŠ¤ë§ˆíŠ¸ ę˛€ėƒ‰ ėž‘ė—…ė„ ë‹¤ė‹œ ė‹¤í–‰í•´ė•ŧ 합니다.", "machine_learning_duplicate_detection": "ëš„ėŠˇí•œ 항ëĒŠ 氐맀", "machine_learning_duplicate_detection_enabled": "ëš„ėŠˇí•œ 항ëĒŠ 氐맀 í™œė„ąí™”", "machine_learning_duplicate_detection_enabled_description": "ëš„í™œė„ąí™”í•´ë„ ė™„ė „ížˆ 동ėŧ한 항ëĒŠė€ 뤑ëŗĩ ė œęą°ëŠë‹ˆë‹¤.", @@ -164,23 +164,23 @@ "machine_learning_facial_recognition_setting": "ė–ŧęĩ´ ė¸ė‹ í™œė„ąí™”", "machine_learning_facial_recognition_setting_description": "ëš„í™œė„ąí™”í•˜ëŠ´ ė´ë¯¸ė§€ė—ė„œ ė–ŧęĩ´ ė¸ė‹ė„ ė§„í–‰í•˜ė§€ ė•Šėœŧ늰, íƒėƒ‰ íŽ˜ė´ė§€ė— ė¸ëŦŧ ëĒŠëĄė´ í‘œė‹œë˜ė§€ ė•ŠėŠĩ니다.", "machine_learning_max_detection_distance": "ėĩœëŒ€ 氐맀 ęą°ëĻŦ", - "machine_learning_max_detection_distance_description": "ëš„ėŠˇí•œ ė´ë¯¸ė§€ëĄœ 간ėŖŧ하는 ėž„ęŗ„ę°’ė„ 0.001ė—ė„œ 0.1 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė„ ë†’ė´ëŠ´ ëš„ėŠˇí•œ 항ëĒŠė´ 더 ë§Žė´ ę°ė§€ë˜ė§€ë§Œ ėž˜ëĒģ ę°ė§€ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", + "machine_learning_max_detection_distance_description": "ëš„ėŠˇí•œ ė´ë¯¸ė§€ëĄœ 간ėŖŧ하는 ėž„ęŗ„ę°’ė„ 0.001~0.1 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ í´ėˆ˜ëĄ ëš„ėŠˇí•œ 항ëĒŠė´ 더 ë§Žė´ ę°ė§€ë˜ė§€ë§Œ ėž˜ëĒģ ę°ė§€ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", "machine_learning_max_recognition_distance": "ėĩœëŒ€ ė¸ė‹ ęą°ëĻŦ", - "machine_learning_max_recognition_distance_description": "두 ė–ŧęĩ´ė„ 동ėŧė¸ėœŧ로 간ėŖŧ하는 ėž„ęŗ„ę°’ė„ 0ė—ė„œ 2 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ė´ ę°’ė„ 낮ėļ”늴 두 ė‚ŦëžŒė„ 동ėŧė¸ėœŧ로 ė¸ė‹í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•  눘 ėžˆęŗ , ę°’ė„ ë†’ė´ëŠ´ 한 ė‚ŦëžŒė„ 다ëĨ¸ 두 ė‚Ŧ람ėœŧ로 ė¸ė‹í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•  눘 ėžˆėŠĩ니다. 두 ė‚ŦëžŒė„ í•Šėš˜ëŠ” ę˛ƒė´ 한 ė‚ŦëžŒė„ 두 ëĒ…ėœŧ로 ëļ„ëĻŦ하는 ę˛ƒëŗ´ë‹¤ ė‰Ŧėš°ë¯€ëĄœ 가ëŠĨ한 ë‚Žė€ ę°’ė„ ė‚ŦėšŠí•˜ė„¸ėš”.", + "machine_learning_max_recognition_distance_description": "두 ė–ŧęĩ´ė„ 동ėŧė¸ėœŧ로 간ėŖŧ하는 ėž„ęŗ„ę°’ė„ 0~2 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ ėž‘ė„ėˆ˜ëĄ 두 ė‚ŦëžŒė„ 동ėŧė¸ėœŧ로 ė¸ė‹í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•  눘 ėžˆęŗ , ę°’ė´ í´ėˆ˜ëĄ 한 ė‚ŦëžŒė„ 다ëĨ¸ 두 ė‚Ŧ람ėœŧ로 ė¸ė‹í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•  눘 ėžˆėŠĩ니다. 두 ė‚ŦëžŒė„ í•Šėš˜ëŠ” ę˛ƒė´ 한 ė‚ŦëžŒė„ 두 ëĒ…ėœŧ로 ëļ„ëĻŦ하는 ę˛ƒëŗ´ë‹¤ ė‰Ŧėš°ë¯€ëĄœ 가ëŠĨ한 ėž‘ė€ ę°’ė„ ė‚ŦėšŠí•˜ė„¸ėš”.", "machine_learning_min_detection_score": "ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘", - "machine_learning_min_detection_score_description": "ę°ė§€ëœ ė–ŧęĩ´ė˜ ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘ëĨŧ 0ė—ė„œ 1 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė„ 낮ėļ”늴 더 ë§Žė€ ė–ŧęĩ´ė„ ę°ė§€í•˜ė§€ë§Œ ėž˜ëĒģ ę°ė§€ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", + "machine_learning_min_detection_score_description": "ę°ė§€ëœ ė–ŧęĩ´ė˜ ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘ëĨŧ 0~1 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ ėž‘ė„ėˆ˜ëĄ 더 ë§Žė€ ė–ŧęĩ´ė„ ę°ė§€í•˜ė§€ë§Œ ėž˜ëĒģ ę°ė§€ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", "machine_learning_min_recognized_faces": "ėĩœė†Œ ė¸ė‹ ė–ŧęĩ´", - "machine_learning_min_recognized_faces_description": "ė¸ëŦŧė„ ėƒė„ąí•˜ę¸° ėœ„í•´ ė¸ė‹í•  ė–ŧęĩ´ ėˆ˜ė˜ ėĩœė†Ÿę°’ė„ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ 높ėœŧ늴 ė–ŧęĩ´ ė¸ė‹ė´ ė •í™•í•´ė§€ė§€ë§Œ ę°ė§€ëœ ė–ŧęĩ´ė´ ė¸ëŦŧ뗐 í• ë‹šë˜ė§€ ė•Šė„ 가ëŠĨė„ąė´ ėĻę°€í•Šë‹ˆë‹¤.", + "machine_learning_min_recognized_faces_description": "ė¸ëŦŧė„ ėƒė„ąí•˜ę¸° ėœ„í•´ ė¸ė‹í•  ė–ŧęĩ´ ėˆ˜ė˜ ėĩœė†Ÿę°’ė„ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ í´ėˆ˜ëĄ ė–ŧęĩ´ ė¸ė‹ė´ ė •í™•í•´ė§€ė§€ë§Œ ę°ė§€ëœ ė–ŧęĩ´ė´ ė¸ëŦŧ뗐 í• ë‹šë˜ė§€ ė•Šė„ 가ëŠĨė„ąė´ ë†’ė•„ė§‘ë‹ˆë‹¤.", "machine_learning_ocr": "OCR", - "machine_learning_ocr_description": "揰溄 학ėŠĩėœŧ로 ė´ë¯¸ė§€ė—ė„œ í…ėŠ¤íŠ¸ëĨŧ ė¸ė‹í•Šë‹ˆë‹¤.", + "machine_learning_ocr_description": "揰溄 학ėŠĩėœŧ로 ė´ë¯¸ė§€ė—ė„œ í…ėŠ¤íŠ¸ ė¸ė‹", "machine_learning_ocr_enabled": "OCR í™œė„ąí™”", "machine_learning_ocr_enabled_description": "ëš„í™œė„ąí™”í•˜ëŠ´ ė´ë¯¸ė§€ė—ė„œ í…ėŠ¤íŠ¸ ė¸ė‹ė„ ė§„í–‰í•˜ė§€ ė•ŠėŠĩ니다.", "machine_learning_ocr_max_resolution": "ėĩœëŒ€ í•´ėƒë„", - "machine_learning_ocr_max_resolution_description": "ė´ í•´ėƒë„ëŗ´ë‹¤ ë†’ė€ 미ëĻŦëŗ´ę¸°ëŠ” ėĸ…횥뚄ëĨŧ ėœ ė§€í•˜ëŠ´ė„œ íŦ기가 ėĄ°ė ˆëŠë‹ˆë‹¤. ę°’ė´ ë†’ė„ėˆ˜ëĄ ė •í™•ë„ë„ ë†’ė•„ė§€ė§€ë§Œ, 래ëĻŦ ė‹œę°„ė´ 描떴맀溠 메ëǍëĻŦ ė‚ŦėšŠëŸ‰ë„ ëŠ˜ė–´ë‚Šë‹ˆë‹¤.", + "machine_learning_ocr_max_resolution_description": "ė´ í•´ėƒë„ëŗ´ë‹¤ ë†’ė€ 미ëĻŦëŗ´ę¸°ëŠ” ėĸ…횥뚄ëĨŧ ėœ ė§€í•˜ëŠ´ė„œ íŦ기가 ėĄ°ė ˆëŠë‹ˆë‹¤. ę°’ė´ í´ėˆ˜ëĄ ė •í™•ë„ę°€ ë†’ė•„ė§€ė§€ë§Œ, 래ëĻŦ ė‹œę°„ė´ 描떴맀溠 메ëǍëĻŦ ė‚ŦėšŠëŸ‰ë„ ëŠ˜ė–´ë‚Šë‹ˆë‹¤.", "machine_learning_ocr_min_detection_score": "ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘", - "machine_learning_ocr_min_detection_score_description": "ę°ė§€í•  í…ėŠ¤íŠ¸ė˜ ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘ëĨŧ 0ė—ė„œ 1 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė„ 낮ėļ”늴 더 ë§Žė€ í…ėŠ¤íŠ¸ëĨŧ ę°ė§€í•˜ė§€ë§Œ ėž˜ëĒģ ę°ė§€ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", + "machine_learning_ocr_min_detection_score_description": "ę°ė§€í•  í…ėŠ¤íŠ¸ė˜ ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘ëĨŧ 0~1 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ ėž‘ė„ėˆ˜ëĄ 더 ë§Žė€ í…ėŠ¤íŠ¸ëĨŧ ę°ė§€í•˜ė§€ë§Œ ėž˜ëĒģ ę°ė§€ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", "machine_learning_ocr_min_recognition_score": "ėĩœė†Œ ė¸ė‹ 렐눘", - "machine_learning_ocr_min_score_recognition_description": "ė¸ė‹í•  í…ėŠ¤íŠ¸ė˜ ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘ëĨŧ 0ė—ė„œ 1 ė‚Ŧė´ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė„ 낮ėļ”늴 더 ë§Žė€ í…ėŠ¤íŠ¸ëĨŧ ė¸ė‹í•˜ė§€ë§Œ ėž˜ëĒģ ė¸ė‹ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", + "machine_learning_ocr_min_score_recognition_description": "ė¸ė‹í•  í…ėŠ¤íŠ¸ė˜ ėĩœė†Œ ė‹ ëĸ°ë„ 렐눘ëĨŧ 0~1 ë˛”ėœ„ė—ė„œ ė„¤ė •í•Šë‹ˆë‹¤. ę°’ė´ ėž‘ė„ėˆ˜ëĄ 더 ë§Žė€ í…ėŠ¤íŠ¸ëĨŧ ė¸ė‹í•˜ė§€ë§Œ ėž˜ëĒģ ė¸ė‹ë  가ëŠĨė„ąë„ ë†’ė•„ė§‘ë‹ˆë‹¤.", "machine_learning_ocr_model": "OCR ëĒ¨ë¸", "machine_learning_ocr_model_description": "ė„œë˛„ ëĒ¨ë¸ė€ ëĒ¨ë°”ėŧ ëĒ¨ë¸ëŗ´ë‹¤ ė •í™•í•˜ė§€ë§Œ, 래ëĻŦ ė‹œę°„ė´ 描떴맀溠 메ëǍëĻŦ ė‚ŦėšŠëŸ‰ë„ ëŠ˜ė–´ë‚Šë‹ˆë‹¤.", "machine_learning_settings": "揰溄 학ėŠĩ 네렕", @@ -191,22 +191,22 @@ "machine_learning_smart_search_enabled_description": "ëš„í™œė„ąí™”í•˜ëŠ´ ėŠ¤ë§ˆíŠ¸ ę˛€ėƒ‰ė„ ėœ„í•œ ė´ë¯¸ė§€ 래ëĻŦëĨŧ ė§„í–‰í•˜ė§€ ė•ŠėŠĩ니다.", "machine_learning_url_description": "揰溄 학ėŠĩ ė„œë˛„ė˜ URLė„ ė„¤ė •í•Šë‹ˆë‹¤. ė—ŦëŸŦ 개가 ėž…ë Ĩ되늴 ė˛Ģ ë˛ˆė§¸ëļ€í„° 한 ë˛ˆė— í•˜ë‚˜ė”Š ėˆœė„œëŒ€ëĄœ ė‘ë‹ĩ하는 ė„œë˛„ëĨŧ ė°žė„ ë•ŒęšŒė§€ ėš”ė˛­ė„ ė‹œë„í•Šë‹ˆë‹¤. ė‘ë‹ĩí•˜ė§€ ė•ŠëŠ” ė„œë˛„ëŠ” ë‹¤ė‹œ ė‚ŦėšŠ 가ëŠĨ할 ë•ŒęšŒė§€ ėŧė‹œė ėœŧ로 ė œė™¸ëŠë‹ˆë‹¤.", "maintenance_delete_backup": "ë°ąė—… ė‚­ė œ", - "maintenance_delete_backup_description": "ė´ 파ėŧė€ 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤.", - "maintenance_delete_error": "ë°ąė—… ė‚­ė œ ė‹¤íŒ¨.", + "maintenance_delete_backup_description": "ė´ 파ėŧė´ 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤.", + "maintenance_delete_error": "ë°ąė—… ė‚­ė œė— ė‹¤íŒ¨í–ˆėŠĩ니다.", "maintenance_restore_backup": "ë°ąė—… ëŗĩ뛐", - "maintenance_restore_backup_description": "Immich가 ė‚­ė œë˜ęŗ  ė„ íƒí•œ ë°ąė—…ė—ė„œ ëŗĩė›ëŠë‹ˆë‹¤. ęŗ„ė†í•˜ę¸° 렄뗐 ë°ąė—…ė´ ėƒė„ąëŠë‹ˆë‹¤.", + "maintenance_restore_backup_description": "Immich가 ė´ˆę¸°í™”ëœ 후 ė„ íƒí•œ ë°ąė—…ėœŧ로 ëŗĩė›ëŠë‹ˆë‹¤. ęŗ„ė†í•˜ę¸° 렄뗐 ë°ąė—…ė´ ėžë™ėœŧ로 ėƒė„ąëŠë‹ˆë‹¤.", "maintenance_restore_backup_different_version": "ė´ ë°ąė—…ė€ 다ëĨ¸ ë˛„ė „ė˜ Immichė—ė„œ ėƒė„ąë˜ė—ˆėŠĩ니다!", "maintenance_restore_backup_unknown_version": "ë°ąė—… ë˛„ė „ė„ í™•ė¸í•  눘 ė—†ėŠĩ니다.", "maintenance_restore_database_backup": "ë°ė´í„°ë˛ ė´ėŠ¤ ë°ąė—… ëŗĩ뛐", - "maintenance_restore_database_backup_description": "ë°ąė—… 파ėŧė„ ė‚ŦėšŠí•´ ė´ė „ ë°ė´í„°ë˛ ė´ėŠ¤ ėƒíƒœëĄœ 륤밹", + "maintenance_restore_database_backup_description": "ë°ąė—… 파ėŧė„ ė‚ŦėšŠí•´ ė´ė „ ë°ė´í„°ë˛ ė´ėŠ¤ ėƒíƒœëĄœ 되돌ëĻŦ기", "maintenance_settings": "ėœ ė§€ëŗ´ėˆ˜", - "maintenance_settings_description": "ImmichëĨŧ ėœ ė§€ ëŗ´ėˆ˜ ëĒ¨ë“œëĄœ ė „í™˜í•˜ę¸°.", - "maintenance_start": "ėœ ė§€ ëŗ´ėˆ˜ ëĒ¨ë“œëĄœ ė „í™˜", - "maintenance_start_error": "ėœ ė§€ ëŗ´ėˆ˜ ëĒ¨ë“œ ė‹œėž‘ė— ė‹¤íŒ¨í•¨.", + "maintenance_settings_description": "ImmichëĨŧ ėœ ė§€ëŗ´ėˆ˜ ëĒ¨ë“œëĄœ ė „í™˜í•Šë‹ˆë‹¤.", + "maintenance_start": "ėœ ė§€ëŗ´ėˆ˜ ëĒ¨ë“œëĄœ ė „í™˜", + "maintenance_start_error": "ėœ ė§€ëŗ´ėˆ˜ ëĒ¨ë“œ ė‹œėž‘ė— ė‹¤íŒ¨í–ˆėŠĩ니다.", "maintenance_upload_backup": "ë°ė´í„°ë˛ ė´ėŠ¤ ë°ąė—… 파ėŧ ė—…ëĄœë“œ", - "maintenance_upload_backup_error": "ë°ąė—…ė„ ė—…ëĄœë“œí•  눘 ė—†ėŠĩ니다, .sql/.sql.gz 파ėŧė´ 맞ėŠĩ니까?", + "maintenance_upload_backup_error": "ë°ąė—…ė„ ė—…ëĄœë“œí•  눘 ė—†ėŠĩ니다, .sql/.sql.gz 파ėŧė´ ë§žë‚˜ėš”?", "manage_concurrency": "ë™ė‹œė„ą 관ëĻŦ", - "manage_concurrency_description": "ėž‘ė—… íŽ˜ė´ė§€ëĄœ ė´ë™í•˜ė—Ŧ ėž‘ė—… ë™ė‹œ ė§„í–‰ ėƒí™Šė„ 관ëĻŦí•˜ė„¸ėš”", + "manage_concurrency_description": "ėž‘ė—… íŽ˜ė´ė§€ëĄœ ė´ë™í•˜ė—Ŧ ėž‘ė—… ë™ė‹œ ė§„í–‰ ėƒí™Šė„ 관ëĻŦí•˜ė„¸ėš”.", "manage_log_settings": "로그 기록 ė„¤ė •ė„ 관ëĻŦ합니다.", "map_dark_style": "다íŦ ėŠ¤íƒ€ėŧ", "map_enable_description": "ė§€ë„ 기ëŠĨ í™œė„ąí™”", @@ -244,7 +244,7 @@ "nightly_tasks_start_time_setting": "ė‹œėž‘ ė‹œę°„", "nightly_tasks_start_time_setting_description": "ė„œë˛„ę°€ ėž‘ė—…ė„ ė‹œėž‘í•˜ëŠ” ė‹œę°„", "nightly_tasks_sync_quota_usage_setting": "ė‚ŦėšŠëŸ‰ 동기화", - "nightly_tasks_sync_quota_usage_setting_description": "ė‚ŦėšŠėžė˜ ė €ėžĨ ęŗĩ간 í• ë‹šëŸ‰ė„ 현ėžŦ ė‚ŦėšŠëŸ‰ 기반ėœŧ로 ę°ąė‹ í•Šë‹ˆë‹¤.", + "nightly_tasks_sync_quota_usage_setting_description": "ė‚ŦėšŠėžė˜ ė €ėžĨ ęŗĩ간 í• ë‹šëŸ‰ė„ 현ėžŦ ė‚ŦėšŠëŸ‰ 기반ėœŧ로 ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤.", "no_paths_added": "ėļ”ę°€ëœ ę˛Ŋ로 ė—†ėŒ", "no_pattern_added": "ėļ”ę°€ëœ ęˇœėš™ ė—†ėŒ", "note_apply_storage_label_previous_assets": "및溠: ė´ė „ė— ė—…ëĄœë“œí•œ 항ëĒŠė—ë„ ėŠ¤í† ëĻŦė§€ ë ˆė´ë¸”ė„ ė ėšŠí•˜ë ¤ëŠ´ ë‹¤ėŒė„ ė‹¤í–‰í•Šë‹ˆë‹¤,", @@ -281,7 +281,7 @@ "oauth_role_claim_description": "ėš”ė˛­í•œ í´ë ˆėž„ė„ ė‚ŦėšŠėžė˜ ė—­í• ëĄœ ėžë™ ė„¤ė •í•Šë‹ˆë‹¤. 'user' 또는 'admin'ė„ ė„ íƒí•  눘 ėžˆėŠĩ니다.", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth ëĄœęˇ¸ė¸ ė„¤ė •ė„ 관ëĻŦ합니다.", - "oauth_settings_more_details": "ė´ 기ëŠĨ뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ ëŦ¸ė„œëĨŧ ė°¸ėĄ°í•˜ė„¸ėš”.", + "oauth_settings_more_details": "해당 기ëŠĨ뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ ëŦ¸ė„œëĨŧ ė°¸ėĄ°í•˜ė„¸ėš”.", "oauth_storage_label_claim": "ėŠ¤í† ëĻŦė§€ ë ˆė´ë¸” í´ë ˆėž„", "oauth_storage_label_claim_description": "í´ë ˆėž„ė˜ ę°’ė„ ė‚ŦėšŠėž ėŠ¤í† ëĻŦė§€ ë ˆė´ë¸”ëĄœ ėžë™ ė„¤ė •í•Šë‹ˆë‹¤.", "oauth_storage_quota_claim": "ėŠ¤í† ëĻŦė§€ ėšŠëŸ‰ í´ë ˆėž„", @@ -311,7 +311,7 @@ "search_jobs": "ėž‘ė—… ę˛€ėƒ‰â€Ļ", "send_welcome_email": "í™˜ė˜ ė´ëŠ”ėŧ ė „ė†Ą", "server_external_domain_settings": "뙏ëļ€ ë„ëŠ”ė¸", - "server_external_domain_settings_description": "ęŗĩ氜 ęŗĩ뜠 링íŦ뗐 ė‚ŦėšŠí•  ë„ëŠ”ė¸ (http(s):// íŦ함)", + "server_external_domain_settings_description": "뙏ëļ€ ë§íŦ뗐 ė‚ŦėšŠë˜ëŠ” ë„ëŠ”ė¸", "server_public_users": "ëĒ¨ë“  ė‚ŦėšŠėž", "server_public_users_description": "ė‚ŦėšŠėžëĨŧ ęŗĩ뜠 ė•¨ë˛”ė— ėļ”가할 때 ëĒ¨ë“  ė‚ŦėšŠėž(ė´ëĻ„ęŗŧ ė´ëŠ”ėŧ)가 í‘œė‹œëŠë‹ˆë‹¤. ëš„í™œė„ąí™”í•˜ëŠ´ 관ëĻŦėžë§Œ ëĒŠëĄė„ ëŗŧ 눘 ėžˆėŠĩ니다.", "server_settings": "ė„œë˛„ 네렕", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "톤 매핑", "transcoding_tone_mapping_description": "HDR ė˜ėƒė„ SDR로 ëŗ€í™˜í•  때 ė‚ŦėšŠí•  톤 매핑 ė•Œęŗ ëĻŦėĻ˜ė„ ė„¤ė •í•Šë‹ˆë‹¤. Hableė€ 디테ėŧ, Mobius는 ėƒ‰ėƒ, Reinhard는 ë°ę¸°ė— ė¤‘ė ė„ 두며 'ëš„í™œė„ąí™”'는 톤 ë§¤í•‘ė„ ė‚ŦėšŠí•˜ė§€ ė•ŠėŠĩ니다.", "transcoding_transcode_policy": "íŠ¸ëžœėŠ¤ėŊ”드 揰뤀", - "transcoding_transcode_policy_description": "ë™ė˜ėƒė„ íŠ¸ëžœėŠ¤ėŊ”딊할 ę¸°ė¤€ė„ ė„¤ė •í•Šë‹ˆë‹¤. HDR ë™ė˜ėƒė€ í•­ėƒ íŠ¸ëžœėŠ¤ėŊ”딊됊니다. (íŠ¸ëžœėŠ¤ėŊ”ë”Šė´ ëš„í™œė„ąí™”ëœ ę˛Ŋ뚰 ė œė™¸)", + "transcoding_transcode_policy_description": "ë™ė˜ėƒė„ íŠ¸ëžœėŠ¤ėŊ”딊할 ę¸°ė¤€ė„ ė„¤ė •í•Šë‹ˆë‹¤. HDR ë™ė˜ėƒęŗŧ YUV 4:2:0 í˜•ė‹ė´ ė•„ë‹Œ í”Ŋė…€ ëš„ë””ė˜¤ëŠ” í•­ėƒ íŠ¸ëžœėŠ¤ėŊ”딊됊니다. (íŠ¸ëžœėŠ¤ėŊ”ë”Šė´ ëš„í™œė„ąí™”ëœ ę˛Ŋ뚰 ė œė™¸)", "transcoding_two_pass_encoding": "2íŒ¨ėŠ¤ ė¸ėŊ”딊", "transcoding_two_pass_encoding_setting_description": "2íŒ¨ėŠ¤ ė¸ėŊ”ë”Šė„ ė‚ŦėšŠí•´ ė¸ėŊ”딊 í’ˆė§ˆė„ ë†’ėž…ë‹ˆë‹¤. H.264 및 HEVCė˜ ę˛Ŋ뚰 CRFëĨŧ ëŦ´ė‹œí•˜ęŗ  ėĩœëŒ€ ëš„íŠ¸ë ˆė´íŠ¸ ę¸°ë°˜ė˜ ëš„íŠ¸ë ˆė´íŠ¸ ë˛”ėœ„ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. VP9ė˜ ę˛Ŋ뚰 ėĩœëŒ€ ëš„íŠ¸ë ˆė´íŠ¸ëĨŧ ëš„í™œė„ąí™”í•˜ëŠ´ CRFëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다.", "transcoding_video_codec": "ë™ė˜ėƒ ėŊ”덱", @@ -782,6 +782,8 @@ "client_cert_import": "ę°€ė ¸ė˜¤ę¸°", "client_cert_import_success_msg": "클ëŧė´ė–¸íŠ¸ ė¸ėĻė„œ ę°€ė ¸ė˜¤ę¸° ė™„ëŖŒ", "client_cert_invalid_msg": "ė¸ėĻė„œę°€ ėœ íš¨í•˜ė§€ ė•Šęą°ë‚˜ 비밀번호가 ė˜Ŧ바ëĨ´ė§€ ė•ŠėŒ", + "client_cert_password_message": "ė´ ė¸ėĻė„œė˜ 비밀번호ëĨŧ ėž…ë Ĩ해 ėŖŧė„¸ėš”", + "client_cert_password_title": "ė¸ėĻ 비밀번호", "client_cert_remove_msg": "클ëŧė´ė–¸íŠ¸ ė¸ėĻė„œ ė œęą°ë¨", "client_cert_subtitle": "ė¸ėĻė„œ ę°€ė ¸ė˜¤ę¸°/ė œęą°ëŠ” ëĄœęˇ¸ė¸ ė „ė—ë§Œ 가ëŠĨ하며, PKCS12 (.p12, .pfx) í˜•ė‹ë§Œ ė§€ė›í•Šë‹ˆë‹¤.", "client_cert_title": "SSL 클ëŧė´ė–¸íŠ¸ ė¸ėĻė„œ (ė‹¤í—˜ė )", @@ -792,6 +794,11 @@ "color": "ėƒ‰ėƒ", "color_theme": "테마 ėƒ‰ėƒ", "command": "ëĒ…ë š", + "command_palette_prompt": "íŽ˜ė´ė§€, ėž‘ė—…, ëĒ…ë šė„ ëš ëĨ´ę˛Œ ė°žę¸°", + "command_palette_to_close": "ë‹Ģ기", + "command_palette_to_navigate": "ë“¤ė–´ę°€ę¸°", + "command_palette_to_select": "ė„ íƒí•˜ę¸°", + "command_palette_to_show_all": "다 ëŗ´ė—ŦėŖŧ기", "comment_deleted": "ëŒ“ę¸€ė´ ė‚­ė œë˜ė—ˆėŠĩ니다.", "comment_options": "댓글 ė˜ĩė…˜", "comments_and_likes": "댓글 및 ėĸ‹ė•„ėš”", @@ -865,7 +872,7 @@ "current_server_address": "현ėžŦ ė„œë˛„ ėŖŧė†Œ", "custom_date": "ë‚ ė§œ ė„ íƒ", "custom_locale": "ė‚ŦėšŠėž 맀렕 로ėŧ€ėŧ", - "custom_locale_description": "떏떴 및 맀뗭뗐 따ëĨ¸ ë‚ ė§œ 및 ėˆĢėž í˜•ė‹ 맀렕", + "custom_locale_description": "떏떴 및 맀뗭 ė„ íƒė— 따ëĨ¸ ë‚ ė§œ, ė‹œę°„ 및 ėˆĢėž í˜•ė‹ 맀렕", "custom_url": "ė‚ŦėšŠėž 맀렕 URL", "cutoff_date_description": "ė„ íƒí•œ ę¸°ę°„ė˜ ė‚Ŧė§„ė„ ėœ ė§€í•Šë‹ˆë‹¤â€Ļ", "cutoff_day": "{count, plural, one {ėŧ} other {ėŧ}}", @@ -888,8 +895,6 @@ "deduplication_criteria_2": "EXIF ė •ëŗ´ 항ëĒŠ 눘", "deduplication_info": "ëš„ėŠˇí•œ 항ëĒŠ ė •ëŗ´", "deduplication_info_description": "항ëĒŠė„ ėžë™ėœŧ로 미ëĻŦ ė„ íƒí•˜ęŗ , ëš„ėŠˇí•œ 항ëĒŠė„ ęĩŦëļ„í•  때 ë‹¤ėŒ ė •ëŗ´ëĨŧ ė°¸ęŗ í•Šë‹ˆë‹¤:", - "default_locale": "ę¸°ëŗ¸ 로ėŧ€ėŧ", - "default_locale_description": "브ëŧėš°ė € 로ėŧ€ėŧ뗐 따ëĨ¸ ë‚ ė§œ 및 ėˆĢėž í˜•ė‹ 맀렕", "delete": "ė‚­ė œ", "delete_action_confirmation_message": "ė´ 항ëĒŠė„ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까? ė„œë˛„ė—ė„œëŠ” 항ëĒŠė„ íœ´ė§€í†ĩėœŧ로 ė´ë™ė‹œí‚¤ëŠ°, 로ėģŦė—ė„œë„ ė‚­ė œí•  ę˛ƒė¸ė§€ í™•ė¸ ëŠ”ė‹œė§€ę°€ í‘œė‹œëŠë‹ˆë‹¤.", "delete_action_prompt": "{count}氜 항ëĒŠ ė‚­ė œë¨", @@ -995,6 +1000,11 @@ "editor_close_without_save_prompt": "ëŗ€ę˛Ŋ ė‚Ŧí•­ė´ ė €ėžĨë˜ė§€ ė•ŠėŠĩ니다.", "editor_close_without_save_title": "íŽ¸ė§‘ė„ ėĸ…ëŖŒí•˜ė‹œę˛ ėŠĩ니까?", "editor_confirm_reset_all_changes": "ëĒ¨ë“  ėˆ˜ė •ė‚Ŧí•­ė„ ė´ˆę¸°í™”í•˜ė‹œę˛ ėŠĩ니까?", + "editor_discard_edits_confirm": "ëŗ€ę˛Ŋ ė‚Ŧ항 ėˇ¨ė†Œ", + "editor_discard_edits_prompt": "ė €ėžĨë˜ė§€ ė•Šė€ ëŗ€ę˛Ŋė‚Ŧí•­ė´ ėžˆėŠĩ니다. ëŗ€ę˛Ŋė‚Ŧí•­ė„ ėˇ¨ė†Œí•˜ę˛ ėŠĩ니까?", + "editor_discard_edits_title": "íŽ¸ė§‘ė„ ėˇ¨ė†Œí• ęšŒėš”?", + "editor_edits_applied_error": "íŽ¸ė§‘ ė ėšŠė— ė‹¤íŒ¨í–ˆėŠĩ니다.", + "editor_edits_applied_success": "íŽ¸ė§‘ė´ ė ėšŠë˜ė—ˆėŠĩ니다.", "editor_flip_horizontal": "ėĸŒėš°ë°˜ė „", "editor_flip_vertical": "ėƒí•˜ë°˜ė „", "editor_orientation": "ë°Ší–Ĩ", @@ -1022,9 +1032,11 @@ "error_loading_albums": "ė•¨ë˛” 로딩 똤ëĨ˜", "error_loading_image": "ė´ë¯¸ė§€ 로딩 똤ëĨ˜", "error_loading_partners": "파트너 로딩 똤ëĨ˜: {error}", + "error_retrieving_asset_information": "항ëĒŠ ė •ëŗ´ëĨŧ ëļˆëŸŦė˜¤ëŠ” 데 ė‹¤íŒ¨í–ˆėŠĩ니다", "error_saving_image": "똤ëĨ˜: {error}", "error_tag_face_bounding_box": "ė–ŧęĩ´ 태그 ė‹¤íŒ¨ - ė–ŧęĩ´ė˜ ėœ„ėš˜ëĨŧ 氀렏ė˜Ŧ 눘 ė—†ėŠĩ니다.", "error_title": "똤ëĨ˜ - ëŦ¸ė œę°€ ë°œėƒí–ˆėŠĩ니다", + "error_while_navigating": "항ëĒŠ ė „í™˜ė— ė‹¤íŒ¨í–ˆėŠĩ니다", "errors": { "cannot_navigate_next_asset": "ë‹¤ėŒ 항ëĒŠėœŧ로 ė´ë™í•  눘 ė—†ėŠĩ니다.", "cannot_navigate_previous_asset": "ė´ė „ 항ëĒŠėœŧ로 ė´ë™í•  눘 ė—†ėŠĩ니다.", @@ -1053,25 +1065,26 @@ "failed_to_load_assets": "항ëĒŠ 로드 ė‹¤íŒ¨", "failed_to_load_notifications": "ė•ŒëĻŧ 로드 ė‹¤íŒ¨", "failed_to_load_people": "ė¸ëŦŧ 로드 ė‹¤íŒ¨", - "failed_to_remove_product_key": "ė œí’ˆ 키 ė œęą°ė— ė‹¤íŒ¨í–ˆėŠĩ니다.", + "failed_to_remove_product_key": "ė œí’ˆ 키 ė œęą°ė— ė‹¤íŒ¨", "failed_to_reset_pin_code": "PIN ėŊ”드 ė´ˆę¸°í™” ė‹¤íŒ¨", - "failed_to_stack_assets": "항ëĒŠ ėŠ¤íƒė— ė‹¤íŒ¨í–ˆėŠĩ니다.", - "failed_to_unstack_assets": "항ëĒŠ ėŠ¤íƒ í’€ę¸°ė— ė‹¤íŒ¨í–ˆėŠĩ니다.", + "failed_to_stack_assets": "항ëĒŠ ėŠ¤íƒė— ė‹¤íŒ¨", + "failed_to_unstack_assets": "항ëĒŠ ėŠ¤íƒ í’€ę¸°ė— ė‹¤íŒ¨", "failed_to_update_notification_status": "ė•ŒëĻŧ ėƒíƒœ ė—…ë°ė´íŠ¸ ė‹¤íŒ¨", "incorrect_email_or_password": "ėž˜ëĒģ된 ė´ëŠ”ėŧ 또는 비밀번호", "library_folder_already_exists": "氀렏ė˜Ŧ ę˛Ŋ로가 ė´ë¯¸ ėĄ´ėžŦ합니다.", + "page_not_found": "íŽ˜ė´ė§€ëĨŧ ė°žė„ 눘 ė—†ėŒ :/", "paths_validation_failed": "{paths, plural, one {ę˛Ŋ로 #氜} other {ę˛Ŋ로 #氜}}가 ėœ íš¨ė„ą 검ė‚Ŧ뗐 ė‹¤íŒ¨í–ˆėŠĩ니다.", "profile_picture_transparent_pixels": "프로필 ė‚Ŧ맄뗐 íˆŦëĒ… í”Ŋė…€ė„ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. ė‚Ŧė§„ė„ 확대하거나 ė´ë™í•˜ė„¸ėš”.", "quota_higher_than_disk_size": "í• ë‹šëŸ‰ė€ ë””ėŠ¤íŦ íŦę¸°ëŗ´ë‹¤ ėž‘ė•„ė•ŧ 합니다.", "something_went_wrong": "ëŦ¸ė œę°€ ë°œėƒí–ˆėŠĩ니다.", - "unable_to_add_album_users": "ė•¨ë˛”ė— ė‚ŦėšŠėžëĨŧ ėļ”가할 눘 ė—†ėŠĩ니다.", - "unable_to_add_assets_to_shared_link": "항ëĒŠė„ ęŗĩ뜠 링íŦ뗐 ėļ”가할 눘 ė—†ėŠĩ니다.", - "unable_to_add_comment": "ëŒ“ę¸€ė„ ėļ”가할 눘 ė—†ėŠĩ니다.", - "unable_to_add_exclusion_pattern": "ė œė™¸ ęˇœėš™ė„ ėļ”가할 눘 ė—†ėŠĩ니다.", - "unable_to_add_partners": "파트너ëĨŧ ėļ”가할 눘 ė—†ėŠĩ니다.", - "unable_to_add_remove_archive": "{archived, select, true {ëŗ´ę´€í•¨ė—ė„œ 항ëĒŠė„ ė œęą°í• } other {ëŗ´ę´€í•¨ėœŧ로 항ëĒŠė„ ė´ë™í• }} 눘 ė—†ėŠĩ니다.", - "unable_to_add_remove_favorites": "ėĻę˛¨ė°žę¸°ė— 항ëĒŠė„ {favorite, select, true {ėļ”ę°€} other {ė œęą°}}할 눘 ė—†ėŠĩ니다", - "unable_to_archive_unarchive": "항ëĒŠė„ {archived, select, true {ëŗ´ę´€} other {ëŗ´ę´€ í•´ė œ}}할 눘 ė—†ėŠĩ니다", + "unable_to_add_album_users": "ė•¨ë˛”ė— ė‚ŦėšŠėžëĨŧ ėļ”가할 눘 ė—†ėŒ", + "unable_to_add_assets_to_shared_link": "항ëĒŠė„ ęŗĩ뜠 링íŦ뗐 ėļ”가할 눘 ė—†ėŒ", + "unable_to_add_comment": "ëŒ“ę¸€ė„ ėļ”가할 눘 ė—†ėŒ", + "unable_to_add_exclusion_pattern": "ė œė™¸ ęˇœėš™ė„ ėļ”가할 눘 ė—†ėŒ", + "unable_to_add_partners": "파트너ëĨŧ ėļ”가할 눘 ė—†ėŒ", + "unable_to_add_remove_archive": "{archived, select, true {ëŗ´ę´€í•¨ė—ė„œ 항ëĒŠė„ ė œęą°í• } other {ëŗ´ę´€í•¨ėœŧ로 항ëĒŠė„ ė´ë™í• }} 눘 ė—†ėŒ", + "unable_to_add_remove_favorites": "ėĻę˛¨ė°žę¸°ė— 항ëĒŠė„ {favorite, select, true {ėļ”ę°€} other {ė œęą°}}할 눘 ė—†ėŒ", + "unable_to_archive_unarchive": "항ëĒŠė„ {archived, select, true {ëŗ´ę´€} other {ëŗ´ę´€ í•´ė œ}}할 눘 ė—†ėŒ", "unable_to_change_album_user_role": "ė•¨ë˛” ė‚ŦėšŠėžė˜ ė—­í• ė„ ëŗ€ę˛Ŋ할 눘 ė—†ėŠĩ니다.", "unable_to_change_date": "ë‚ ė§œëĨŧ ëŗ€ę˛Ŋ할 눘 ė—†ėŠĩ니다.", "unable_to_change_description": "네ëĒ…ė„ ëŗ€ę˛Ŋ할 눘 ė—†ėŠĩ니다.", @@ -1117,10 +1130,10 @@ "unable_to_remove_library": "ëŧė´ë¸ŒëŸŦëĻŦëĨŧ ė œęą°í•  눘 ė—†ėŠĩ니다.", "unable_to_remove_partner": "파트너ëĨŧ ė œęą°í•  눘 ė—†ėŠĩ니다.", "unable_to_remove_reaction": "ë°˜ė‘ė„ ė œęą°í•  눘 ė—†ėŠĩ니다.", - "unable_to_reset_password": "비밀번호ëĨŧ ė´ˆę¸°í™”í•  눘 ė—†ėŠĩ니다.", + "unable_to_reset_password": "비밀번호ëĨŧ ė´ˆę¸°í™”í•  눘 ė—†ėŒ", "unable_to_reset_pin_code": "PIN ėŊ”드ëĨŧ ė´ˆę¸°í™”í•  눘 ė—†ėŒ", "unable_to_resolve_duplicate": "ëš„ėŠˇí•œ 항ëĒŠė„ 래ëĻŦ할 눘 ė—†ėŒ", - "unable_to_restore_assets": "항ëĒŠė„ ëŗĩė›í•  눘 ė—†ėŠĩ니다.", + "unable_to_restore_assets": "항ëĒŠė„ ëŗĩė›í•  눘 ė—†ėŒ", "unable_to_restore_trash": "íœ´ė§€í†ĩė„ ëŗĩė›í•  눘 ė—†ėŠĩ니다.", "unable_to_restore_user": "ė‚ŦėšŠėžëĨŧ ëŗĩė›í•  눘 ė—†ėŠĩ니다.", "unable_to_save_album": "ė•¨ë˛”ė„ ė €ėžĨ할 눘 ė—†ėŠĩ니다.", @@ -1133,6 +1146,7 @@ "unable_to_scan_library": "ëŧė´ë¸ŒëŸŦëĻŦëĨŧ 늤ėē”í•  눘 ė—†ėŠĩ니다.", "unable_to_set_feature_photo": "대표 ė‚Ŧė§„ė„ ė„¤ė •í•  눘 ė—†ėŠĩ니다.", "unable_to_set_profile_picture": "프로필 ė‚Ŧė§„ė„ ė„¤ė •í•  눘 ė—†ėŠĩ니다.", + "unable_to_set_rating": "í‰ė ė„ ė •í•  눘 ė—†ėŒ", "unable_to_submit_job": "ėž‘ė—…ė„ ėˆ˜í–‰í•  눘 ė—†ėŠĩ니다.", "unable_to_trash_asset": "íœ´ė§€í†ĩėœŧ로 ė´ë™í•  눘 ė—†ėŠĩ니다.", "unable_to_unlink_account": "ęŗ„ė • ė—°ę˛°ė„ í•´ė œí•  눘 ė—†ėŠĩ니다.", @@ -1147,6 +1161,7 @@ "unable_to_update_workflow": "ė›ŒíŦ플로ëĨŧ ė—…ë°ė´íŠ¸í•  눘 ė—†ėŠĩ니다", "unable_to_upload_file": "파ėŧė„ ė—…ëĄœë“œí•  눘 ė—†ėŠĩ니다." }, + "errors_text": "똤ëĨ˜", "exclusion_pattern": "ė œė™¸ ęˇœėš™", "exif": "EXIF", "exif_bottom_sheet_description": "네ëĒ… ėļ”ę°€...", @@ -1157,6 +1172,7 @@ "exif_bottom_sheet_people": "ė¸ëŦŧ", "exif_bottom_sheet_person_add_person": "ė´ëĻ„ ėļ”ę°€", "exit_slideshow": "ėŠŦëŧė´ë“œ ė‡ŧ ėĸ…ëŖŒ", + "expand": "확ėžĨ", "expand_all": "ëĒ¨ë‘ 확ėžĨ", "experimental_settings_new_asset_list_subtitle": "ė§„í–‰ 뤑", "experimental_settings_new_asset_list_title": "냈 ė‚Ŧė§„ ë°°ė—´ ė‚ŦėšŠ (ė‹¤í—˜ė )", @@ -1192,6 +1208,8 @@ "features_in_development": "개발 ė¤‘ė¸ 기ëŠĨ", "features_setting_description": "ė‚Ŧė§„ 및 ë™ė˜ėƒ 관ëĻŦ 기ëŠĨė„ ė„¤ė •í•Šë‹ˆë‹¤.", "file_name_or_extension": "파ėŧëĒ… 또는 확ėžĨėž", + "file_name_text": "파ėŧëĒ…", + "file_name_with_value": "파ėŧëĒ…: {file_name}", "file_size": "파ėŧ íŦ기", "filename": "파ėŧëĒ…", "filetype": "파ėŧ í˜•ė‹", @@ -1199,6 +1217,7 @@ "filter_description": "ëŒ€ėƒ ėžė‚°ė„ 필터링하기 ėœ„í•œ ėĄ°ęą´", "filter_people": "ė¸ëŦŧ 필터", "filter_places": "ėžĨė†Œ 필터", + "filter_tags": "태그 필터", "filters": "필터", "find_them_fast": "ė´ëĻ„ėœŧ로 ę˛€ėƒ‰í•˜ė—Ŧ ëš ëĨ´ę˛Œ ė°žę¸°", "first": "ė˛Ģ ë˛ˆė§¸", @@ -1429,10 +1448,28 @@ "loop_videos_description": "ėƒė„¸ ëŗ´ę¸°ė—ė„œ ė˜ėƒė„ 반ëŗĩ ėžŦėƒí•Šë‹ˆë‹¤.", "main_branch_warning": "개발 ë˛„ė „ė„ ė‚ŦėšŠ ė¤‘ėž…ë‹ˆë‹¤. ė •ė‹ ëĻ´ëĻŦ늤 ë˛„ė „ ė‚ŦėšŠė„ ęļŒėžĨ합니다!", "main_menu": "ëŠ”ė¸ 메뉴", + "maintenance_action_restore": "ë°ė´í„°ë˛ ė´ėŠ¤ëĨŧ ëŗĩė›í•˜ëŠ” 뤑", "maintenance_description": "Immich가 ėœ ė§€ę´€ëĻŦ ëĒ¨ë“œëĄœ ė „í™˜ë˜ė—ˆėŠĩ니다.", "maintenance_end": "ėœ ė§€ 관ëĻŦ ëĒ¨ë“œ ėĸ…ëŖŒ", "maintenance_end_error": "ėœ ė§€ę´€ëĻŦ ëĒ¨ë“œëĨŧ ėĸ…ëŖŒí•˜ëŠ” 데 ė‹¤íŒ¨í–ˆėŠĩ니다.", - "maintenance_logged_in_as": "현ėžŦ {user} 님ėœŧ로 ëĄœęˇ¸ė¸ë˜ė–´ ėžˆėŠĩ니다", + "maintenance_logged_in_as": "현ėžŦ {user}님ėœŧ로 ëĄœęˇ¸ė¸ë˜ė–´ ėžˆėŠĩ니다.", + "maintenance_restore_from_backup": "ë°ąė—…ė—ė„œ ëŗĩ뛐", + "maintenance_restore_library": "ëŧė´ë¸ŒëŸŦëĻŦ ëŗĩ뛐", + "maintenance_restore_library_confirm": "ë°ąė—…ė„ ëŗĩė›í•˜ę¸° 렄뗐 ė´ę˛ƒė´ ė˜Ŧ바ëĨ¸ė§€ í™•ė¸í•˜ė„¸ėš”!", + "maintenance_restore_library_description": "ë°ė´í„°ë˛ ė´ėŠ¤ëĨŧ ëŗĩė›í•˜ëŠ” 뤑", + "maintenance_restore_library_folder_has_files": "{folder} ė•ˆė— {count} 폴더가 ėžˆėŠĩ니다", + "maintenance_restore_library_folder_no_files": "{folder} 뗐 파ėŧė´ ė—†ėŠĩ니다!", + "maintenance_restore_library_folder_pass": "ėŊ기 및 듰揰 가ëŠĨ", + "maintenance_restore_library_folder_read_fail": "ėŊ기 ëļˆę°€", + "maintenance_restore_library_folder_write_fail": "듰揰 ëļˆę°€", + "maintenance_restore_library_hint_missing_files": "ė¤‘ėš”í•œ 파ėŧė´ 누ëŊ될 눘 ėžˆėŠĩ니다", + "maintenance_restore_library_hint_regenerate_later": "ë‚˜ė¤‘ė— ė„¤ė •ė—ė„œ ėžŦėƒė„ąí•  눘 ėžˆėŠĩ니다", + "maintenance_restore_library_hint_storage_template_missing_files": "ėŠ¤í† ëĻŦė§€ 템플ëĻŋė„ ė‚ŦėšŠė¤‘ė´ė‹ ę°€ėš”? 파ėŧė´ 누ëŊ될 눘 ėžˆėŠĩ니다", + "maintenance_restore_library_loading": "ëŦ´ę˛°ė„ą 검ė‚Ŧ 및 휴ëĻŦėŠ¤í‹ą ëļˆëŸŦė˜¤ëŠ” 뤑 â€Ļ", + "maintenance_task_backup": "현ėžŦ ë°ė´í„°ë˛ ė´ėŠ¤ė—ė„œ ë°ąė—… ėƒė„ąė¤‘ â€Ļ", + "maintenance_task_migrations": "ë°ė´í„°ë˛ ė´ėŠ¤ ę°ąė‹  ė‹¤í–‰ė¤‘ â€Ļ", + "maintenance_task_restore": "ė„ íƒí•œ ë°ąė—…ė—ė„œ ëŗĩ뛐뤑 â€Ļ", + "maintenance_task_rollback": "ëŗĩ뛐 ė‹¤íŒ¨. ė´ė „ ëŗĩ뛐 맀렐ėœŧ로 되돌ëĻŦ는 뤑 â€Ļ", "maintenance_title": "ėŧė‹œė ėœŧ로 ė´ėšŠí•  눘 ė—†ėŠĩ니다", "make": "ė œėĄ°ė‚Ŧ", "manage_geolocation": "ėœ„ėš˜ ė •ëŗ´ 관ëĻŦ", @@ -1577,6 +1614,7 @@ "no_results_description": "ë™ė˜ė–´ 또는 더 ėŧë°˜ė ė¸ ë‹¨ė–´ëĨŧ ė‚ŦėšŠí•´ ëŗ´ė„¸ėš”.", "no_shared_albums_message": "ė•¨ë˛”ė„ ë§Œë“¤ė–´ ėŖŧëŗ€ ė‚Ŧ람들ęŗŧ ė‚Ŧė§„ 및 ë™ė˜ėƒė„ ęŗĩėœ í•˜ė„¸ėš”.", "no_uploads_in_progress": "ė§„í–‰ ė¤‘ė¸ ė—…ëĄœë“œ ė—†ėŒ", + "none": "None", "not_allowed": "í—ˆėšŠë˜ė§€ ė•ŠėŒ", "not_available": "ė—†ėŒ", "not_in_any_album": "ė•¨ë˛”ė— ė—†ėŒ", @@ -1610,6 +1648,7 @@ "online": "똍ëŧė¸", "only_favorites": "ėĻę˛¨ė°žę¸°ë§Œ", "open": "뗴揰", + "open_calendar": "ėē˜ëĻ°ë” 뗴揰", "open_in_map_view": "ė§€ë„ ëŗ´ę¸°ė—ė„œ 뗴揰", "open_in_openstreetmap": "OpenStreetMapė—ė„œ 뗴揰", "open_the_search_filters": "ę˛€ėƒ‰ 필터 뗴揰", @@ -1690,6 +1729,7 @@ "photos_and_videos": "ė‚Ŧė§„ 및 ë™ė˜ėƒ", "photos_count": "ė‚Ŧė§„ {count, plural, one {{count, number}氜} other {{count, number}氜}}", "photos_from_previous_years": "ė§€ë‚œ ëLJ ë…„ę°„ė˜ ė‚Ŧė§„", + "photos_only": "ė‚Ŧė§„ë§Œ", "pick_a_location": "ėœ„ėš˜ ė„ íƒ", "pick_custom_range": "ë˛”ėœ„ 맀렕", "pick_date_range": "ë‚ ė§œ ë˛”ėœ„ ė„ íƒ", @@ -1765,9 +1805,10 @@ "purchase_settings_server_activated": "ė„œë˛„ ė œí’ˆ 키는 관ëĻŦėžę°€ ė œė–´í•Šë‹ˆë‹¤.", "query_asset_id": "ėŋŧëĻŦ 항ëĒŠ ID", "queue_status": "렄랴 {total}, {count} 대기 뤑", - "rating": "등급", - "rating_clear": "등급 ė´ˆę¸°í™”", - "rating_count": "{count, plural, one {#렐} other {#렐}}", + "rate_asset": "항ëĒŠ í‰ė ", + "rating": "ëŗ„ė ", + "rating_clear": "í‰ė  ė´ˆę¸°í™”", + "rating_count": "{count, plural, =0 {í‰ė  ė—†ėŒ} one {#렐} other {#렐}}", "rating_description": "ėƒė„¸ ė •ëŗ´ íŒ¨ë„ė— EXIF 등급 태그 í‘œė‹œ", "reaction_options": "ë°˜ė‘ ė˜ĩė…˜", "read_changelog": "ëŗ€ę˛Ŋ ë‚´ė—­ ëŗ´ę¸°", @@ -1840,7 +1881,10 @@ "reset_pin_code_success": "PIN ėŊ”드ëĨŧ ė´ˆę¸°í™”í–ˆėŠĩ니다.", "reset_pin_code_with_password": "íŒ¨ėŠ¤ė›Œë“œëĄœ PIN ėŊ”드ëĨŧ ėžŦė„¤ė •í•  눘 ėžˆėŠĩ니다.", "reset_sqlite": "SQLite ë°ė´í„°ë˛ ė´ėŠ¤ ė´ˆę¸°í™”", - "reset_sqlite_confirmation": "SQLite ë°ė´í„°ë˛ ė´ėŠ¤ëĨŧ ė´ˆę¸°í™”í•˜ė‹œę˛ ėŠĩ니까? ë°ė´í„°ëĨŧ ėžŦ동기화하려면 ëĄœęˇ¸ė•„ė›ƒ 후 ë‹¤ė‹œ ëĄœęˇ¸ė¸í•´ė•ŧ 합니다.", + "reset_sqlite_clear_app_data": "ë°ė´í„° ė‚­ė œ", + "reset_sqlite_confirmation": "ė•ą ë°ė´í„°ëĨŧ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까? ëĒ¨ë“  ė„¤ė •ė„ ė œęą°í•˜ęŗ  ëĄœęˇ¸ė•„ė›ƒí•Šë‹ˆë‹¤.", + "reset_sqlite_confirmation_note": "ėŖŧė˜: ė‚­ė œę°€ ė™„ëŖŒëœ 후 ė•ąė„ ėžŦė‹œėž‘í•´ė•ŧ 합니다.", + "reset_sqlite_done": "ė•ą ë°ė´í„°ę°€ ė‚­ė œë˜ė—ˆėŠĩ니다. ImmichëĨŧ ėžŦė‹œėž‘í•˜ęŗ  ë‹¤ė‹œ ëĄœęˇ¸ė¸í•´ ėŖŧė‹­ė‹œė˜¤.", "reset_sqlite_success": "SQLite ë°ė´í„°ë˛ ė´ėŠ¤ëĨŧ ė´ˆę¸°í™”í–ˆėŠĩ니다.", "reset_to_default": "ę¸°ëŗ¸ę°’ėœŧ로 ëŗĩ뛐", "resolution": "í•´ėƒë„", @@ -1868,10 +1912,12 @@ "saved_settings": "ė„¤ė •ė´ ė €ėžĨë˜ė—ˆėŠĩ니다.", "say_something": "ëŒ“ę¸€ė„ ėž…ë Ĩí•˜ė„¸ėš”", "scaffold_body_error_occurred": "똤ëĨ˜ę°€ ë°œėƒí–ˆėŠĩ니다.", + "scaffold_body_error_unrecoverable": "ëŗĩęĩŦ할 눘 ė—†ëŠ” 똤ëĨ˜ę°€ ë°œėƒí–ˆėŠĩ니다. ė €íŦ가 ë„ė™€ë“œëĻ´ 눘 ėžˆë„ëĄ 똤ëĨ˜ė™€ ėŠ¤íƒ ėļ”ė ė„ Discord 또는 GitHub뗐 ęŗĩėœ í•´ ėŖŧė‹­ė‹œė˜¤. ėĄ°ė–¸ė„ 드ëĻŦėžëŠ´, ė•„ëž˜ė—ė„œ ė•ą ë°ė´í„°ëĨŧ ė‚­ė œí•˜ė‹¤ 눘 ėžˆėŠĩ니다.", "scan": "늤ėē”", "scan_all_libraries": "ëĒ¨ë“  ëŧė´ë¸ŒëŸŦëĻŦ 늤ėē”", "scan_library": "늤ėē”", "scan_settings": "늤ėē” ė„¤ė •", + "scanning": "늤ėē” ė¤‘", "scanning_for_album": "ė•¨ë˛”ė„ 늤ėē”하는 뤑...", "search": "ę˛€ėƒ‰", "search_albums": "ė•¨ë˛” ę˛€ėƒ‰", @@ -1900,6 +1946,8 @@ "search_filter_media_type_title": "ë¯¸ë””ė–´ ėĸ…ëĨ˜ ė„ íƒ", "search_filter_ocr": "OCR ę˛€ėƒ‰", "search_filter_people_title": "ė¸ëŦŧ ė„ íƒ", + "search_filter_star_rating": "í‰ė ", + "search_filter_tags_title": "태그 ė„ íƒ", "search_for": "ę˛€ėƒ‰", "search_for_existing_person": "ėĄ´ėžŦ하는 ė¸ëŦŧ ę˛€ėƒ‰", "search_no_more_result": "ë”ė´ėƒ 결ęŗŧ ė—†ėŒ", @@ -1941,6 +1989,7 @@ "select_all_duplicates": "ëš„ėŠˇí•œ 항ëĒŠ ëĒ¨ë‘ ė„ íƒ", "select_all_in": "{group}ė˜ ëĒ¨ë“  항ëĒŠ ė„ íƒ", "select_avatar_color": "ė•„ë°”íƒ€ ėƒ‰ėƒ ė„ íƒ", + "select_count": "{count, plural, one {# ė„ íƒė¤‘} other {# ė„ íƒė¤‘}}", "select_face": "ė–ŧęĩ´ ė„ íƒ", "select_featured_photo": "대표 ė‚Ŧė§„ ė„ íƒ", "select_from_computer": "ėģ´í“¨í„°ė—ė„œ ė„ íƒ", @@ -1977,6 +2026,9 @@ "set_profile_picture": "프로필 ė‚Ŧė§„ėœŧ로 네렕", "set_slideshow_to_fullscreen": "ėŠŦëŧė´ë“œ ė‡ŧëĨŧ 렄랴 화면ėœŧ로 네렕", "set_stack_primary_asset": "대표 항ëĒŠėœŧ로 네렕", + "setting_image_navigation_enable_subtitle": "í™œė„ąí™”ë˜ëŠ´ í™”ëŠ´ė˜ ė™ŧėĒŊ 또는 똤ëĨ¸ėĒŊ 끄트머ëĻŦëĨŧ 탭하ė—Ŧ ė´ë¯¸ė§€ëĨŧ ė „í™˜í•Šë‹ˆë‹¤.", + "setting_image_navigation_enable_title": "íƒ­í•´ė„œ ė „í™˜", + "setting_image_navigation_title": "ė´ë¯¸ė§€ ė „í™˜", "setting_image_viewer_help": "ėƒė„¸ ëŗ´ę¸°ė—ė„œëŠ” ėž‘ė€ ė„Ŧ네ėŧ, (í™œė„ąí™”ëœ ę˛Ŋ뚰) 뤑氄 ė„Ŧ네ėŧ, ė›ëŗ¸ 눜ėœŧ로 ëļˆëŸŦė˜ĩ니다.", "setting_image_viewer_original_subtitle": "ė›ëŗ¸ ęŗ í•´ėƒë„ ė´ë¯¸ė§€ëĨŧ ëļˆëŸŦė˜ĩ니다. ë°ė´í„° ė‚ŦėšŠëŸ‰ 및 ėēė‹œ íŦ기ëĨŧ ė¤„ė´ë ¤ëŠ´ ëš„í™œė„ąí™”í•˜ė„¸ėš”.", "setting_image_viewer_original_title": "ė›ëŗ¸ ė´ë¯¸ė§€ 로드", @@ -2143,6 +2195,7 @@ "support": "맀뛐", "support_and_feedback": "맀뛐 & ė œė•ˆ", "support_third_party_description": "ė„œë“œíŒŒí‹° íŒ¨í‚¤ė§€ëĨŧ ė´ėšŠí•˜ė—Ŧ Immich가 ė„¤ėš˜ëœ 것ėœŧ로 ëŗ´ėž…ë‹ˆë‹¤. 현ėžŦ ë°œėƒí•˜ëŠ” ëŦ¸ė œëŠ” 해당 íŒ¨í‚¤ė§€ę°€ ė›ė¸ėŧ 눘 ėžˆėœŧë¯€ëĄœ, ë¨ŧė € ė•„ëž˜ 링íŦëĨŧ í†ĩ해 íŒ¨í‚¤ė§€ ę°œë°œėžė—ę˛Œ ëŦ¸ė˜í•´ėŖŧė„¸ėš”.", + "supporter": "ė„œíŦ터", "swap_merge_direction": "ëŗ‘í•Š ë°Ší–Ĩ ëŗ€ę˛Ŋ", "sync": "동기화", "sync_albums": "ė•¨ë˛” 동기화", @@ -2253,6 +2306,7 @@ "unstack_action_prompt": "항ëĒŠ {count}氜 ėŠ¤íƒ 풀ëĻŧ", "unstacked_assets_count": "항ëĒŠ {count, plural, one {#氜} other {#氜}}ė˜ ėŠ¤íƒė„ í’€ė—ˆėŠĩ니다.", "unsupported_field_type": "ė§€ė›ë˜ė§€ ė•ŠëŠ” 필드 ėœ í˜•", + "unsupported_file_type": "{file} 파ėŧė€ {type} ėœ í˜•ė´ ė§€ė›ë˜ė§€ ė•Šė•„ ė—…ëĄœë“œí•  눘 ė—†ė—ˆėŠĩ니다.", "untagged": "태그 í•´ė œë¨", "untitled_workflow": "렜ëĒŠ ė—†ëŠ” ė›ŒíŦ플로", "up_next": "ë‹¤ėŒ", @@ -2279,6 +2333,8 @@ "url": "URL", "usage": "ė‚ŦėšŠëŸ‰", "use_biometric": "ėƒė˛´ ė¸ėĻ ė‚ŦėšŠ", + "use_browser_locale": "브ëŧėš°ė € 로ėŧ€ėŧ ė‚ŦėšŠ", + "use_browser_locale_description": "브ëŧėš°ė € 로ėŧ€ėŧ 기반 ë‚ ė§œ, ė‹œę°„, ėˆĢėž í˜•ė‹", "use_current_connection": "현ėžŦ ë„¤íŠ¸ė›ŒíŦ ė‚ŦėšŠ", "use_custom_date_range": "ëŒ€ė‹  맞ėļ¤ ę¸°ę°„ ė‚ŦėšŠ", "user": "ė‚ŦėšŠėž", @@ -2312,6 +2368,7 @@ "video_hover_setting_description": "ė„Ŧ네ėŧ ėœ„ė— ë§ˆėš°ėŠ¤ëĨŧ ė˜ŦëĻŦ늴 미ëĻŦëŗ´ę¸°ëĨŧ ėžŦėƒí•Šë‹ˆë‹¤. ëš„í™œė„ąí™”í•´ë„ ėžŦėƒ ė•„ė´ėŊ˜ė— ë§ˆėš°ėŠ¤ëĨŧ ė˜Ŧë ¤ 미ëĻŦëŗŧ 눘 ėžˆėŠĩ니다.", "videos": "ë™ė˜ėƒ", "videos_count": "ë™ė˜ėƒ {count, plural, one {#氜} other {#氜}}", + "videos_only": "ë™ė˜ėƒë§Œ", "view": "ëŗ´ę¸°", "view_album": "ė•¨ë˛” ëŗ´ę¸°", "view_all": "ëĒ¨ë‘ ëŗ´ę¸°", @@ -2361,6 +2418,7 @@ "yes": "네", "you_dont_have_any_shared_links": "ęŗĩ뜠 링íŦ가 ė—†ėŠĩ니다.", "your_wifi_name": "Wi-Fi ë„¤íŠ¸ė›ŒíŦ ė´ëĻ„", + "zero_to_clear_rating": "0ė„ 눌ëŸŦ 항ëĒŠ í‰ė  ė´ˆę¸°í™”", "zoom_image": "ė´ë¯¸ė§€ 확대", "zoom_to_bounds": "í™”ëŠ´ė— 맞ėļ° í™•ëŒ€" } diff --git a/i18n/lt.json b/i18n/lt.json index fec5905957..5675673317 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -47,7 +47,7 @@ "added_to_favorites": "Pridėta prie mėgstamiausiÅŗ", "added_to_favorites_count": "{count, plural, one {# pridėtas} few {# pridėti} other {# pridėta}} prie mėgstamiausiÅŗ", "admin": { - "add_exclusion_pattern_description": "Pridėti iÅĄimčiÅŗ taisykles. Palaikomi simboliai *,**, ir ?. Ignoruoti bet kokius failus bet kuriame aplanke pavadintame \"Raw\", naudokite \"**/RAW/**\". Ignoravimui failÅŗ su plėtiniu \".tif\", naudokite \"**/*.tiff\". Aplanko kelio nustatymams, naudokite \"/aplanko/kelias/ignoruoti/**\".", + "add_exclusion_pattern_description": "Pridėti iÅĄimčiÅŗ taisykles. Palaikomi simboliai *,**, ir ?. Ignoruoti bet kokius failus bet kuriame aplanke pavadintame \"Raw\", naudokite \"**/Raw/**\". Ignoravimui failÅŗ su plėtiniu \".tif\", naudokite \"**/*.tiff\". Aplanko kelio nustatymams, naudokite \"/aplanko/kelias/ignoruoti/**\".", "admin_user": "Administratorius", "asset_offline_description": "Å is iÅĄorinės bibliotekos elementas nebepasiekiamas diske ir buvo perkeltas į ÅĄiukÅĄliadėŞę. Jei failas buvo perkeltas toje pačioje bibliotekoje, laiko skalėje rasite naują atitinkamą elementą. Jei norite ÅĄÄ¯ elementą atkurti, įsitikinkite, kad Immich gali pasiekti failą Åžemiau nurodytu adresu, ir suvykdykite bibliotekos skenavimą.", "authentication_settings": "Autentifikavimo nustatymai", @@ -311,7 +311,7 @@ "search_jobs": "IeÅĄkoma uÅžduočiÅŗâ€Ļ", "send_welcome_email": "SiÅŗsti sveikinimo el. laiÅĄką", "server_external_domain_settings": "IÅĄorinis domenas", - "server_external_domain_settings_description": "Bendrinimo nuorodÅŗ domenas, įskaitant http(s)://", + "server_external_domain_settings_description": "Domenas naudojamas iÅĄorinėm nuorodom", "server_public_users": "VieÅĄi naudotojai", "server_public_users_description": "Pridedant naudotoją į bendrinamus albumus, rodomas visÅŗ naudotojÅŗ sąraÅĄas (vardas ir el. paÅĄtas). Jei iÅĄjungta, naudotojÅŗ sąraÅĄas bus prieinamas tik administratoriÅŗ paskyroms.", "server_settings": "Serverio nustatymai", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "TonÅŗ atvaizdavimas", "transcoding_tone_mapping_description": "Bandoma iÅĄsaugoti HDR vaizdo įraÅĄÅŗ iÅĄvaizdą konvertuojant į SDR. Kiekvienas algoritmas taiko skirtingus kompromisus dėl spalvÅŗ, detaliÅŗ ir ÅĄviesumo. Hable iÅĄsaugo detales, Mobius iÅĄsaugo spalvas, o Reinhard iÅĄsaugo ÅĄviesumą.", "transcoding_transcode_policy": "Perkodavimo strategija", - "transcoding_transcode_policy_description": "Strategija, kada vaizdo įraÅĄas turi bÅĢti perkoduotas. HDR vaizdo įraÅĄai visada bus perkoduoti (iÅĄskyrus jei perkodavimas iÅĄjungtas).", + "transcoding_transcode_policy_description": "Strategija, kada vaizdo įraÅĄas turi bÅĢti perkoduotas. Vaizdo įraÅĄai su HDR ir pikselio formatu kitu, nei YUV 4:2:0, visada bus perkoduoti (iÅĄskyrus jei perkodavimas iÅĄjungtas).", "transcoding_two_pass_encoding": "DviejÅŗ perėjimÅŗ uÅžkodavimas", "transcoding_two_pass_encoding_setting_description": "Perkoduoti su dviem perėjimais, kad gauti geriau uÅžkoduotą vaizdo įraÅĄÄ…. Kai maksimalus bitÅŗ srautas įjungtas (veikimui reikalaujamas H.264 ir HVEC), tada naudojamas bitÅŗ intervalas remiantis maksimaliu bitÅŗ srautu ir ignoruojamas CRF. Su VP9 gali bÅĢti naudojamas CRF, jei maksimalus bitÅŗ srautas yra iÅĄjungtas.", "transcoding_video_codec": "Video kodekas", @@ -626,7 +626,7 @@ "backup_album_selection_page_select_albums": "PaÅžymėti albumai", "backup_album_selection_page_selection_info": "PaÅžymėjimo informacija", "backup_album_selection_page_total_assets": "Viso unikaliÅŗ elementÅŗ", - "backup_albums_sync": "Atsarginio kopijavimo albumÅŗ sinchronizacija", + "backup_albums_sync": "AtsarginiÅŗ kopijÅŗ AlbumÅŗ Sinchronizacija", "backup_all": "Visi", "backup_background_service_backup_failed_message": "Nepavyko sukurti atsarginiÅŗ kopijÅŗ. Bandoma dar kartąâ€Ļ", "backup_background_service_complete_notification": "ElementÅŗ atsarginės kopijos kÅĢrimas baigtas", @@ -765,9 +765,12 @@ "cleanup_deleting": "Metama į ÅĄiukÅĄlinę...", "cleanup_found_assets": "Rasta {count} {count, plural, one {iÅĄsaugotas elementas} few {iÅĄsaugoti elementai} other {iÅĄsaugotÅŗ elementÅŗ}}", "cleanup_found_assets_with_size": "Rasta {count} {count, plural, one {iÅĄsaugotas elementas} few {iÅĄsaugoti elementai} other {iÅĄsaugotÅŗ elementÅŗ}} ({size})", + "cleanup_icloud_shared_albums_excluded": "iCloud bendrinami albumai neįtraukiami į skanavimą", "cleanup_no_assets_found": "Nerasta elementÅŗ, atitinkančiÅŗ aukÅĄÄiau pateiktus kriterijus. Atlaisvinti Vietos gali paÅĄalinti tik tuos iÅĄteklius, kuriÅŗ atsarginės kopijos yra serveryje", "cleanup_preview_title": "ElementÅŗ iÅĄtrinti ({count})", + "cleanup_step3_description": "Skanuokite atsargines kopijas, atitinkančias jÅĢsÅŗ datą, ir iÅĄsaugokite nustatymus.", "cleanup_step4_summary": "{count} {count, plural, one {elementas (sukurtas iki {date}), kurį reikia paÅĄalinti iÅĄ vietinio įrenginio. Nuotrauka liks pasiekiama Immich galerijoje} few {elementai (sukurti iki {date}), kuriuos reikia paÅĄalinti iÅĄ vietinio įrenginio. Nuotraukos liks pasiekiamos Immich galerijoje} other {elementÅŗ (sukurtÅŗ iki {date}), kuriuos reikia paÅĄalinti iÅĄ vietinio įrenginio. Nuotraukos liks pasiekiamos Immich galerijoje}}.", + "cleanup_trash_hint": "Norint atlaisvinti visą saugyklos vietą, atidarykite sistemos galerijos programėlę ir iÅĄtuÅĄtinkite ÅĄiukÅĄliadėŞę", "clear": "IÅĄvalyti", "clear_all": "IÅĄvalyti viską", "clear_all_recent_searches": "IÅĄvalyti visas naujausias paieÅĄkas", @@ -779,6 +782,8 @@ "client_cert_import": "Importuoti", "client_cert_import_success_msg": "Kliento sertifikatas yra importuotas", "client_cert_invalid_msg": "Netinkamas sertifikato failas arba neteisingas slaptaÅžodis", + "client_cert_password_message": "ÄŽveskite ÅĄio sertifikato slaptaÅžodį", + "client_cert_password_title": "Sertifikato SlaptaÅžodis", "client_cert_remove_msg": "Kliento sertifikatas yra paÅĄalintas", "client_cert_subtitle": "Palaikomi tik PKCS12 (.p12, .pfx) formatai. Sertifikato importavimas/ paÅĄalinimas galimas tik prieÅĄ prisijungimą", "client_cert_title": "SSL kliento sertifikatas [Experimentinis]", @@ -789,6 +794,11 @@ "color": "Spalva", "color_theme": "Temos spalva", "command": "Komanda", + "command_palette_prompt": "Greitai raskite puslapius, veiksmus ar komandas", + "command_palette_to_close": "uÅždaryti", + "command_palette_to_navigate": "įeiti", + "command_palette_to_select": "pasirinkti", + "command_palette_to_show_all": "rodyti visus", "comment_deleted": "Komentaras iÅĄtrintas", "comment_options": "KomentarÅŗ parinktys", "comments_and_likes": "Komentarai ir patiktukai", @@ -862,9 +872,9 @@ "current_server_address": "Dabartinis serverio adresas", "custom_date": "Pasirinktinė data", "custom_locale": "Pasirinktinė vietovė", - "custom_locale_description": "Formatuoti datas ir skaičius pagal kalbą ir regioną", + "custom_locale_description": "Formatuoti datas, laiką ir skaičius pagal pasirinktą kalbą ir regioną", "custom_url": "Pasirinktinis URL", - "cutoff_date_description": "PaÅĄalinkite senesnes nuotraukas ir vaizdo įraÅĄus nei", + "cutoff_date_description": "IÅĄsaugoti nuotraukas iÅĄ paskutinėsâ€Ļ", "cutoff_day": "{count, plural, one {diena} other {dienos}}", "cutoff_year": "{count, plural, one {metai} other {metai}}", "daily_title_text_date": "E, MMM dd", @@ -885,8 +895,6 @@ "deduplication_criteria_2": "EXIF metaduomenÅŗ įraÅĄÅŗ skaičius", "deduplication_info": "DublikatÅŗ ÅĄalinimo informacija", "deduplication_info_description": "Automatinis elementÅŗ parinkimas ir masinis dublikatÅŗ ÅĄalinimas atliekamas atsiÅžvelgiant į:", - "default_locale": "Pradinė vietovė", - "default_locale_description": "Formatuoti datas ir skaičius pagal jÅĢsÅŗ narÅĄyklės lokalę", "delete": "IÅĄtrinti", "delete_action_confirmation_message": "Ar tikrai norite iÅĄtrinti ÅĄÄ¯ elementą? Å is veiksmas perkels elementą į serverio ÅĄiukÅĄliadėŞę ir paklaus ar norite iÅĄtrinti vietiniame įrenginyje", "delete_action_prompt": "{count} iÅĄtrinta", @@ -992,8 +1000,15 @@ "editor_close_without_save_prompt": "Pakeitimai nebus iÅĄsaugoti", "editor_close_without_save_title": "UÅždaryti redaktoriÅŗ?", "editor_confirm_reset_all_changes": "Ar tikrai norite atstatyti visus pakeitimus?", + "editor_discard_edits_confirm": "Atmesti pakeitimus", + "editor_discard_edits_prompt": "Turite neiÅĄsaugotÅŗ pakeitimÅŗ. Ar tikrai norite juos atmesti?", + "editor_discard_edits_title": "Atmesti pakeitimus?", + "editor_edits_applied_error": "Nepavyko iÅĄsaugoti pakeitimÅŗ", + "editor_edits_applied_success": "Pakeitimai iÅĄsaugoti sėkmingai", "editor_flip_horizontal": "Apversti horizontaliai", "editor_flip_vertical": "Apversti vertikaliai", + "editor_handle_corner": "{corner, select, top_left {VirÅĄaus kairės} top_right {VirÅĄaus deÅĄinės} bottom_left {Apačios kairės} bottom_right {Apačios deÅĄinės} other {}} kampo vilkimo rankenėlė", + "editor_handle_edge": "{edge, select, top {VirÅĄutinio} bottom {Apatinio} left {Kairio} right {DeÅĄinio} other {}} kraÅĄto rankenėlė", "editor_orientation": "Orientacija", "editor_reset_all_changes": "AtÅĄaukti pakeitimus", "editor_rotate_left": "Pasukti 90° prieÅĄ laikrodÅžio rodyklę", @@ -1016,11 +1031,14 @@ "error_change_sort_album": "Nepavyko pakeisti albumo rÅĢÅĄiavimo tvarkos", "error_delete_face": "Klaida trinant veidą iÅĄ elementÅŗ", "error_getting_places": "Klaida gaunant vietoves", + "error_loading_albums": "Klaida kraunant albumus", "error_loading_image": "Klaida įkeliant vaizdą", "error_loading_partners": "Klaida uÅžkraunant partnerius: {error}", + "error_retrieving_asset_information": "Klaida gaunant elemento informaciją", "error_saving_image": "Klaida: {error}", "error_tag_face_bounding_box": "Klaida apraÅĄant veidą - nepavyko gauti veido vietos koordinačiÅŗ", "error_title": "Klaida - KaÅžkas nutiko ne taip", + "error_while_navigating": "Klaida naviguojant prie elementÅŗ", "errors": { "cannot_navigate_next_asset": "Negalima pereiti prie sekančio elemento", "cannot_navigate_previous_asset": "Negalima pereiti prie buvusio elemento", @@ -1056,6 +1074,7 @@ "failed_to_update_notification_status": "Nepavyko atnaujinti praneÅĄimo statuso", "incorrect_email_or_password": "Neteisingas el. paÅĄto adresas arba slaptaÅžodis", "library_folder_already_exists": "Å ita importavimo vieta jau egzistuoja.", + "page_not_found": "Puslapis nerastas", "paths_validation_failed": "Nepavyko {paths, plural, one {# kelio} other {# keliÅŗ}} patvirtinimas", "profile_picture_transparent_pixels": "Profilio nuotrauka negali turėti permatomÅŗ pikseliÅŗ. PraÅĄome priartinti ir/arba perkelkite nuotrauką.", "quota_higher_than_disk_size": "Nustatyta kvota, virÅĄija disko dydį", @@ -1155,6 +1174,7 @@ "exif_bottom_sheet_people": "ÅŊMONĖS", "exif_bottom_sheet_person_add_person": "Pridėti vardą", "exit_slideshow": "IÅĄeiti iÅĄ skaidriÅŗ perÅžiÅĢros", + "expand": "IÅĄplėsti", "expand_all": "IÅĄskleisti viską", "experimental_settings_new_asset_list_subtitle": "Dirbama", "experimental_settings_new_asset_list_title": "ÄŽgalinti eksperimentinį nuotraukÅŗ tinklelį", @@ -1190,12 +1210,16 @@ "features_in_development": "KÅĢrimo funkcijos", "features_setting_description": "Valdyti aplikacijos funkcijas", "file_name_or_extension": "Failo pavadinimas arba plėtinys", + "file_name_text": "Failo pavadinimas", + "file_name_with_value": "Failo pavadinimas: {file_name}", "file_size": "Failo dydis", "filename": "Failopavadinimas", "filetype": "Failo tipas", "filter": "Filtras", + "filter_description": "TiksliniÅŗ elementÅŗ filtravimo sąlygos", "filter_people": "Filtruoti Åžmones", "filter_places": "Filtruoti vietoves", + "filter_tags": "Filtruoti Åžymas", "filters": "Filtrai", "find_them_fast": "Raskite greitai paieÅĄkoje pagal vardą", "first": "Pirmas", @@ -1426,11 +1450,28 @@ "loop_videos_description": "ÄŽgalinti automatinį vaizdo įraÅĄo rodymą iÅĄ naujo detaliÅŗ perÅžiÅĢroje.", "main_branch_warning": "JÅĢs naudojate kÅĢrėjo versiją, mes stipriai rekomenduojame naudoti galutinę versiją!", "main_menu": "Pagrindinis meniu", + "maintenance_action_restore": "DuomenÅŗ bazė atstatoma", "maintenance_description": "ÄŽjungtas Immich techninės prieÅžiÅĢros reÅžimas.", "maintenance_end": "Baigti techninę prieÅžiÅĢrą", "maintenance_end_error": "Nepavyko iÅĄjungti techninės prieÅžiÅĢros reÅžimo.", "maintenance_logged_in_as": "Å iuo metu prisijungę kaip {user}", + "maintenance_restore_from_backup": "Atstatyti iÅĄ atsarginės kopijos", + "maintenance_restore_library": "Atstatyti Savo Biblioteką", + "maintenance_restore_library_confirm": "Jei viskas teisinga, tęskite atsarginės kopijos atkÅĢrimą!", + "maintenance_restore_library_description": "Atstatoma DuomenÅŗ Bazė", "maintenance_restore_library_folder_has_files": "{folder} turi {count} {count, plural, one {aplanką} few {aplankus} other {aplankÅŗ}}", + "maintenance_restore_library_folder_no_files": "{folder} trÅĢksta failÅŗ!", + "maintenance_restore_library_folder_pass": "nuskaitoma ir įraÅĄoma", + "maintenance_restore_library_folder_read_fail": "nenuskaitoma", + "maintenance_restore_library_folder_write_fail": "neįraÅĄoma", + "maintenance_restore_library_hint_missing_files": "Gali trÅĢkti svarbiÅŗ failÅŗ", + "maintenance_restore_library_hint_regenerate_later": "Vėliau galėsite juos atkurti nustatymuose", + "maintenance_restore_library_hint_storage_template_missing_files": "Naudojate saugyklos ÅĄabloną? Gali trÅĢkti failÅŗ", + "maintenance_restore_library_loading": "ÄŽkeliami vientisumo patikrinimai ir euristikaâ€Ļ", + "maintenance_task_backup": "Kuriama esamos duomenÅŗ bazės atsarginė kopijaâ€Ļ", + "maintenance_task_migrations": "Vyksta duomenÅŗ bazės migracijaâ€Ļ", + "maintenance_task_restore": "Atkuriama pasirinkta atsarginė kopijaâ€Ļ", + "maintenance_task_rollback": "Atkurti nepavyko, grįŞtama į atkÅĢrimo taÅĄkąâ€Ļ", "maintenance_title": "Laikinai Neprieinamas", "make": "Gamintojas", "manage_geolocation": "Tvarkyti vietovę", @@ -1539,17 +1580,18 @@ "new_timeline": "Nauja laiko juosta", "new_update": "Nauja versija", "new_user_created": "Naujas naudotojas sukurtas", - "new_version_available": "PRIEINAMA NAUJA VERSIJA", + "new_version_available": "IÅ LEISTA NAUJA VERSIJA", "newest_first": "Pirmiausia naujausi", "next": "Sekantis", "next_memory": "Sekantis atsiminimas", "no": "Ne", "no_actions_added": "JokiÅŗ veiksmÅŗ dar nepridėta", + "no_albums_found": "AlbumÅŗ nerasta", "no_albums_message": "Sukurkite albumą nuotraukoms ir vaizdo įraÅĄams tvarkyti", "no_albums_with_name_yet": "Atrodo, kad dar neturite albumÅŗ su ÅĄiuo pavadinimu.", "no_albums_yet": "Atrodo, kad dar neturite albumÅŗ.", "no_archived_assets_message": "Suarchyvuokite nuotraukas ir vaizdo įraÅĄus, kad jie nebÅĢtÅŗ rodomi nuotraukÅŗ rodinyje", - "no_assets_message": "SPUSTELĖKITE NORĖDAMI ÄŽKELTI SAVO PIRMĄJĄ NUOTRAUKĄ", + "no_assets_message": "Spauskite norėdami įkelti savo pirmąją nuotrauką", "no_assets_to_show": "Nėra rodomÅŗ elementÅŗ", "no_cast_devices_found": "Nerasta transliavimo įrenginiÅŗ", "no_checksum_local": "Kontrolinė suma nepasiekiama – negalima gauti vietiniÅŗ elementÅŗ", @@ -1608,6 +1650,7 @@ "online": "Prisijungęs", "only_favorites": "Tik mėgstamiausi", "open": "Atverti", + "open_calendar": "Atidaryti kalendoriÅŗ", "open_in_map_view": "Atverti Åžemėlapio perÅžiÅĢroje", "open_in_openstreetmap": "Atverti per OpenStreetMap", "open_the_search_filters": "Atidaryti paieÅĄkos filtrus", @@ -1662,7 +1705,7 @@ "permanent_deletion_warning_setting_description": "Rodyti perspėjimą kai elementas iÅĄtrinamas visam laikui", "permanently_delete": "IÅĄtrinti visam laikui", "permanently_delete_assets_count": "Visam laikui iÅĄtrinti {count, plural, one {# elementą} few {# elementus} other {# elementÅŗ}}", - "permanently_delete_assets_prompt": "Ar tikrai norite visam laikui iÅĄtrinti {count, plural, one {ÅĄÄ¯ elementą?} other {ÅĄiuos # elementus?}} Tai bus tuo pačiu paÅĄalinta {count, plural, one {iÅĄ} other {iÅĄ jÅŗ}} albumo(Åŗ).", + "permanently_delete_assets_prompt": "Ar tikrai norite visam laikui iÅĄtrinti {count, plural, one {ÅĄÄ¯ elementą?} other {ÅĄiuos # elementus(Åŗ)?}} Tai bus tuo pačiu paÅĄalinta {count, plural, one {iÅĄ} other {iÅĄ jÅŗ}} albumo(Åŗ).", "permanently_deleted_asset": "VisiÅĄkai iÅĄtrinti elementai", "permanently_deleted_assets_count": "Visam laikui {count, plural, one {iÅĄtrintas # elementas} few {iÅĄtrinti # elementai} other {iÅĄtrinta # elementÅŗ}}", "permission": "Leidimas", @@ -1749,8 +1792,8 @@ "purchase_license_subtitle": "ÄŽsigykite Immich, kad palaikytumėte tolesnį paslaugos vystymą", "purchase_lifetime_description": "Pirkimas visam gyvenimui", "purchase_option_title": "PIRKIMO PASIRINKIMAS", - "purchase_panel_info_1": "Immich kÅĢrimas uÅžima daug laiko ir pastangÅŗ, o visą darbo dieną dirba inÅžinieriai, kad jis bÅĢtÅŗ kuo geresnis. MÅĢsÅŗ misija yra, kad atvirojo kodo programinė įranga ir etiÅĄka verslo praktika taptÅŗ tvariu kÅĢrėjÅŗ pajamÅŗ ÅĄaltiniu ir sukurtÅŗ privatumą gerbiančią ekosistemą su realiomis alternatyvomis iÅĄnaudojamoms debesijos paslaugoms.", - "purchase_panel_info_2": "Kadangi esame įsipareigoję nepridėti mokamÅŗ sienÅŗ, ÅĄis pirkinys nesuteiks jums jokiÅŗ papildomÅŗ Immich funkcijÅŗ. Mes tikime, kad tokie naudotojai kaip jÅĢs palaikys nuolatinį Immich vystymąsi.", + "purchase_panel_info_1": "Immich kÅĢrimas uÅžima daug laiko ir pastangÅŗ, inÅžinieriai dirba visą darbo dieną, kad Immich bÅĢtÅŗ kuo geresnis. MÅĢsÅŗ misija yra, kad atvirojo kodo programinė įranga ir etiÅĄka verslo praktika taptÅŗ tvariu kÅĢrėjÅŗ pajamÅŗ ÅĄaltiniu ir sukurtÅŗ privatumą gerbiančią ekosistemą su realia alternatyva tarp kitÅŗ pelno siekiančiÅŗ Cloud paslaugÅŗ.", + "purchase_panel_info_2": "Kadangi esame įsipareigoję nepridėti mokamÅŗ sienÅŗ, ÅĄis pirkinys nesuteiks jums jokiÅŗ papildomÅŗ Immich funkcijÅŗ. Mes tikime, kad tokie naudotojai, kaip jÅĢs, palaikys nuolatinį Immich vystymąsi.", "purchase_panel_title": "Palaikykite projektą", "purchase_per_server": "Vienam serveriui", "purchase_per_user": "Vienam naudotojui", @@ -1767,11 +1810,17 @@ "rate_asset": "ÄŽvertinti Elementą", "rating": "ÄŽvertinimas ÅžvaigÅždutėmis", "rating_clear": "PaÅĄalinti įvertinimą", - "rating_count": "{count, plural, one {# įvertinimas} few {# įvertinimai} other {# įvertinimÅŗ}}", + "rating_count": "{count, plural, =0 {Neįvertinta} one {# įvertinimas} few {# įvertinimai} other {# įvertinimÅŗ}}", "rating_description": "Rodyti EXIF įvertinimus informacijos skydelyje", "reaction_options": "ReakcijÅŗ parinktys", "read_changelog": "Skaityti pakeitimÅŗ sąraÅĄÄ…", + "readonly_mode_disabled": "Tik skaitymo reÅžimas iÅĄjungtas", + "readonly_mode_enabled": "Tik skaitymo reÅžimas įjungtas", "ready_for_upload": "ParuoÅĄta įkėlimui", + "reassign": "Perskirstyti", + "reassigned_assets_to_existing_person": "{count, plural, one {Perskirstytas # elementas} few {Perskaityti # elementai} other {Perskaityta # elementÅŗ}} į {name, select, null {egzistuojantį asmenį} other {{name}}}", + "reassigned_assets_to_new_person": "{count, plural, one {Perskirstytas # elementas} few {Perskirstyti # elementai} other {Perskirstyta # elementÅŗ}} į naują asmenį", + "reassing_hint": "Priskirti pasirinktus elementus esamam asmeniui", "recent": "Naujausi", "recent_albums": "Naujausi albumai", "recent_searches": "Naujausios paieÅĄkos", @@ -1797,6 +1846,7 @@ "remove_assets_album_confirmation": "Ar tikrai norite paÅĄalinti {count, plural, one {# elementą} few {# elementus} other {# elementÅŗ}} iÅĄ albumo?", "remove_assets_shared_link_confirmation": "Ar tikrai norite paÅĄalinti {count, plural, one {# elementą} few {# elementus} other {# elementÅŗ}} iÅĄ ÅĄios bendrinimo nuorodos?", "remove_assets_title": "PaÅĄalinti elementus?", + "remove_custom_date_range": "PaÅĄalinti pasirinktinę dienÅŗ seką", "remove_deleted_assets": "PaÅĄalinti IÅĄtrintus Elemenuts", "remove_from_album": "PaÅĄalinti iÅĄ albumo", "remove_from_album_action_prompt": "{count} paÅĄalinta iÅĄ albumo", @@ -1833,7 +1883,10 @@ "reset_pin_code_success": "Sėkmingai atstatytas PIN kodas", "reset_pin_code_with_password": "PIN kodą visada galite atkurti naudodami savo slaptaÅžodį", "reset_sqlite": "Atstatyti SQLite duomenÅŗ bazę", - "reset_sqlite_confirmation": "Ar tikrai norite atstatyti SQLite duomenÅŗ bazę? Turėsite atsijungti ir vėl prisijungti, kad iÅĄ naujo sinchronizuotumėte duomenis", + "reset_sqlite_clear_app_data": "IÅĄtrinti Duomenis", + "reset_sqlite_confirmation": "Ar tikrai norite iÅĄtrinti programos duomenis? Tai paÅĄalins visus nustatymus ir atjungs jus.", + "reset_sqlite_confirmation_note": "Pastaba: iÅĄvalius programą reikės paleisti iÅĄ naujo.", + "reset_sqlite_done": "Programos duomenys iÅĄvalyti. Paleiskite Immich iÅĄ naujo ir prisijunkite dar kartą.", "reset_sqlite_success": "Sėkmingai atstatyta SQLite duomenÅŗ bazė", "reset_to_default": "Atkurti numatytuosius", "resolution": "Rezoliucija", @@ -1861,6 +1914,7 @@ "saved_settings": "IÅĄsaugoti nustatymai", "say_something": "Ką nors pasakykite", "scaffold_body_error_occurred": "ÄŽvyko klaida", + "scaffold_body_error_unrecoverable": "ÄŽvyko nepataisoma klaida. Pasidalinkite klaidos apraÅĄymu Discord ar GitHub, kad galėtume padėti. Jei patartina, galite iÅĄvalyti programos duomenis Åžemiau.", "scan": "Skenuoti", "scan_all_libraries": "Skenuoti visas bibliotekas", "scan_library": "Skenuoti", @@ -1875,7 +1929,7 @@ "search_by_filename": "IeÅĄkoti pagal failo pavadinimą arba plėtinį", "search_by_filename_example": "pvz. IMG_1234.JPG arba PNG", "search_by_ocr": "IeÅĄkoti pagal OCR", - "search_by_ocr_example": "Latte", + "search_by_ocr_example": "Kakava", "search_camera_lens_model": "IeÅĄkoti objektyvo modelio...", "search_camera_make": "IeÅĄkoti pagal kameros gamintoją...", "search_camera_model": "IeÅĄkoti kameros modelį...", @@ -1896,6 +1950,7 @@ "search_filter_ocr": "IeÅĄkoti pagal OCR", "search_filter_people_title": "Pasirinkti asmenis", "search_filter_star_rating": "ÄŽvertinimas", + "search_filter_tags_title": "Pasirinkti Åžymas", "search_for": "IeÅĄkoti ko", "search_for_existing_person": "IeÅĄkoti įvardinto asmens", "search_no_more_result": "Nėra daugiau rezultatÅŗ", @@ -1975,6 +2030,9 @@ "set_profile_picture": "Nustatyti profilio nuotrauką", "set_slideshow_to_fullscreen": "Nustatyti skaidriÅŗ perÅžiÅĢrą per visą ekraną", "set_stack_primary_asset": "Nustatyti kaip pagrindinį elementą", + "setting_image_navigation_enable_subtitle": "Jei įjungta, galite pereiti prie ankstesnio/kito vaizdo paliesdami kairįjį/deÅĄinįjį ekrano ketvirtį.", + "setting_image_navigation_enable_title": "Spustelkite narÅĄymui", + "setting_image_navigation_title": "NuotraukÅŗ narÅĄyklė", "setting_image_viewer_help": "Detali perÅžiÅĢra pirmiausia įkelia maŞą miniatiÅĢrą, tada įkelia vidutinio dydÅžio versiją (jei įjungta) ir galiausiai įkelia originalą (jei įjungta).", "setting_image_viewer_original_subtitle": "ÄŽjunkite, kad įkeltumėte originalÅŗ pilnos raiÅĄkos vaizdą (didelį!). IÅĄjunkite, kad sumaÅžintumėte duomenÅŗ naudojimą (tiek tinkle, tiek įrenginio talpykloje).", "setting_image_viewer_original_title": "UÅžkrauti originalią nuotrauką", @@ -2141,6 +2199,7 @@ "support": "Pagalba", "support_and_feedback": "Palaikymas ir atsiliepimai", "support_third_party_description": "JÅĢsÅŗ Immich paketas yra sukurtas trečios ÅĄalies. Problemos, su kuriomis susiduriate, gali bÅĢti susijusios su ÅĄiuo paketu, todėl pirmiausia praneÅĄkite apie problemas jiems, naudodami toliau pateiktas nuorodas.", + "supporter": "Rėmėjas", "swap_merge_direction": "Keisti sujungimo kryptį", "sync": "Sinchronizuoti", "sync_albums": "Sinchronizuoti albumus", @@ -2213,15 +2272,22 @@ "trash_page_select_assets_btn": "Pasirinkti elementus", "trash_page_title": "Å iukÅĄliÅŗ ({count})", "trashed_items_will_be_permanently_deleted_after": "ÄŽ ÅĄiukÅĄliadėŞę perkelti elementai bus visam laikui iÅĄtrinti po {days, plural, one {# dienos} other {# dienÅŗ}}.", + "trigger": "Trigeris", "trigger_asset_uploaded": "Elementas IÅĄsiÅŗstas", + "trigger_asset_uploaded_description": "Pradės, kai naujas elementas bus iÅĄsiÅŗstas", + "trigger_description": "ÄŽvykis, kuris pradeda darbo eigą", "trigger_person_recognized": "Asmuo AtpaÅžintas", + "trigger_person_recognized_description": "Pradės, kai asmuo yra aptiktas", + "trigger_type": "Trigerio tipas", "troubleshoot": "Å alinti triktis", "type": "Tipas", "unable_to_change_pin_code": "Negalima pakeisti PIN kodo", "unable_to_check_version": "Nepavyko patvirtinti programos/serverio versijos", + "unable_to_setup_pin_code": "Nepavyko nustatyti PIN kodo", "unarchive": "IÅĄarchyvuoti", "unarchive_action_prompt": "{count} paÅĄalinta iÅĄ Archyvo", "unarchived_count": "{count, plural, other {# iÅĄarchyvuota}}", + "undo": "Anuliuoti", "unfavorite": "PaÅĄalinti iÅĄ mėgstamiausiÅŗ", "unfavorite_action_prompt": "{count} paÅĄalinta iÅĄ MėgstamiausiÅŗ", "unhide_person": "Nebeslėpti Åžmogaus", @@ -2230,8 +2296,10 @@ "unknown_date": "NeÅžinoma data", "unknown_year": "NeÅžinomi metai", "unlimited": "Neribota", + "unlink_motion_video": "Atsieti video", "unlink_oauth": "Atsieti OAuth", "unlinked_oauth_account": "Atsieta OAuth paskyra", + "unmute_memories": "ÄŽjungti Atsiminimus", "unnamed_album": "Neįvardytas Albumas", "unnamed_album_delete_confirmation": "Ar tikrai norite iÅĄtrinti ÅĄÄ¯ albumą?", "unnamed_share": "Neįvardytas Bendrinimas", @@ -2242,7 +2310,10 @@ "unstack": "IÅĄgrupuoti", "unstack_action_prompt": "{count} iÅĄgrupuota", "unstacked_assets_count": "{count, plural, one {IÅĄgrupuotas # elementas} few {IÅĄgrupuoti # elementai} other {IÅĄgrupuota # elementÅŗ}}", + "unsupported_field_type": "Nepalaikomas laukelio tipas", + "unsupported_file_type": "Failas {file} negali bÅĢti iÅĄsiÅŗstas, nes failo tipas {type} yra nepalaikomas.", "untagged": "NepaÅžymėta", + "untitled_workflow": "Neįvardinta veikla", "up_next": "Seknatis", "update_location_action_prompt": "Atnaujinti {count} {count, plural, one {pasirinkto elemento} few {pasirinktÅŗ elementÅŗ} other {pasirinktÅŗ elementÅŗ}} vietovę naudojant:", "updated_at": "Atnaujintas", @@ -2252,8 +2323,11 @@ "upload_details": "ÄŽkėlimo Detalės", "upload_dialog_info": "Ar norite sukurti pasirinkto(-Åŗ) turinio(-Åŗ) atsarginę kopiją serveryje?", "upload_dialog_title": "ÄŽkelti turinį", + "upload_error_with_count": "IÅĄsiuntimo klaida {count, plural, one {# elementui} few {# elementams} other {# elementÅŗ}}", "upload_errors": "ÄŽkėlimas įvyko su {count, plural, one {# klaida} few {# klaidomis} other {# klaidÅŗ}}, norėdami pamatyti naujai įkeltus elementus perkraukite puslapį.", + "upload_finished": "IÅĄsiuntimas neuÅžbaigtas", "upload_progress": "Liko {remaining, number} - Apdorota {processed, number}/{total, number}", + "upload_skipped_duplicates": "{count, plural, one {Praleistas # dublikatas} few {Praleisti # dublikatai} other {Praleista # dublikatÅŗ}}", "upload_status_duplicates": "Dublikatai", "upload_status_errors": "Klaidos", "upload_status_uploaded": "ÄŽkelta", @@ -2264,7 +2338,10 @@ "url": "URL", "usage": "Naudojimas", "use_biometric": "Naudoti biometriją", + "use_browser_locale": "Naudoti narÅĄyklės vietovę", + "use_browser_locale_description": "Formatuoti datas, laiką ir skaičius pagal jÅĢsÅŗ narÅĄyklės vietovę", "use_current_connection": "Naudoti dabartinį ryÅĄÄ¯", + "use_custom_date_range": "Naudokite pasirinktinę dienÅŗ seką", "user": "Naudotojas", "user_has_been_deleted": "Å is naudotojas buvo iÅĄtrintas.", "user_id": "Naudotojo ID", @@ -2273,8 +2350,9 @@ "user_pin_code_settings_description": "Tvarkykite savo PIN kodą", "user_privacy": "Vartotojo Privatumas", "user_purchase_settings": "ÄŽsigyti", - "user_purchase_settings_description": "Tvarkyti savo pirkinį", + "user_purchase_settings_description": "Pirkinio pasirinkimas", "user_role_set": "Nustatyti {user}, kaip {role}", + "user_usage_detail": "Vartotojo naudojimo detalės", "user_usage_stats": "Paskyros naudojimo statistika", "user_usage_stats_description": "ÅŊiÅĢrėti paskyros naudojimo statistiką", "username": "Naudotojo vardas", @@ -2287,7 +2365,7 @@ "variables": "Kintamieji", "version": "Versija", "version_announcement_closing": "Tavo draugas, Alex", - "version_announcement_message": "Sveiki! Nauja „Immich“ versija yra pasiekiama. PraÅĄome skirti ÅĄiek tiek laiko perskaityti leidimo pastabas, kad įsitikintumėte, jog jÅĢsÅŗ nustatymai yra atnaujinti. Tai padės iÅĄvengti netinkamo sukonfigÅĢravimo, ypač jei naudojate „WatchTower“ ar kitą mechanizmą, kuris automatiÅĄkai atnaujina jÅĢsÅŗ „Immich“ serverį.", + "version_announcement_message": "Sveiki! Nauja Immich versija iÅĄleista. PraÅĄome skirti ÅĄiek tiek laiko perskaityti leidimo pastabas, kad įsitikintumėte, jog jÅĢsÅŗ nustatymai yra atnaujinti. Tai padės iÅĄvengti netinkamo sukonfigÅĢravimo, ypač jei naudojate „WatchTower“ ar kitą mechanizmą, kuris automatiÅĄkai atnaujina jÅĢsÅŗ Immich serverį.", "version_history": "VersijÅŗ istorija", "version_history_item": "Versija {version} įdiegta {date}", "video": "Vaizdo įraÅĄas", @@ -2300,14 +2378,24 @@ "view_album": "ÅŊiÅĢrėti albumą", "view_all": "PerÅžiÅĢrėti viską", "view_all_users": "PerÅžiÅĢrėti visus naudotojus", + "view_asset_owners": "ÅŊiÅĢrėti elemento savininką", + "view_details": "ÅŊiÅĢrėti Detales", "view_in_timeline": "ÅŊiÅĢrėti laiko skalėje", "view_link": "ÅŊiÅĢrėti nuorodą", "view_links": "ÅŊiÅĢrėti nuorodas", "view_name": "ÅŊiÅĢrėti", "view_next_asset": "ÅŊiÅĢrėti sekantį elementą", + "view_previous_asset": "ÅŊiÅĢrėti ankstesnį elementą", "view_qr_code": "ÅŊiÅĢrėti QR kodą", "view_similar_photos": "ÅŊiÅĢrėti panaÅĄias foto", "view_stack": "PerÅžiÅĢrėti grupę", + "view_user": "ÅŊiÅĢrėti Vartotoją", + "viewer_remove_from_stack": "PaÅĄalinti iÅĄ Grupės", + "viewer_stack_use_as_main_asset": "Naudoti, kaip pagrindinį elementą", + "viewer_unstack": "IÅĄgrupuoti", + "visibility_changed": "Matomumas pasikeitė {count, plural, one {# asmeniui} few {# asmenims} other {# asmenÅŗ}}", + "visual": "IÅĄdėstymas", + "visual_builder": "IÅĄdėstymo koreguotojas", "waiting": "Laukiama", "waiting_count": "Laukiama: {count}", "warning": "ÄŽspėjimas", @@ -2328,12 +2416,14 @@ "workflow_update_success": "DarbÅŗ eiga sėkmingai atnaujinta", "workflow_updated": "DarbÅŗ eiga atnaujinta", "workflows": "DarbÅŗ eigos", + "workflows_help_text": "Darbo eigos automatizuoja veiksmus su jÅĢsÅŗ elementais pagal trigerius ir filtrus", "wrong_pin_code": "Neteisingas PIN kodas", "year": "Metai", "years_ago": "PrieÅĄ {years, plural, one {# metus} other {# metÅŗ}}", "yes": "Taip", "you_dont_have_any_shared_links": "Bendrinimo nuorodÅŗ neturite", "your_wifi_name": "JÅĢsÅŗ Wi-Fi pavadinimas", + "zero_to_clear_rating": "spauskite 0, kad paÅĄalinti elemento įvertinimą", "zoom_image": "Priartinti vaizdą", "zoom_to_bounds": "Priartinti iki kraÅĄtÅŗ" } diff --git a/i18n/lv.json b/i18n/lv.json index f5c96d8bcb..59b5dea657 100644 --- a/i18n/lv.json +++ b/i18n/lv.json @@ -84,6 +84,7 @@ "duplicate_detection_job_description": "Analizēt failus ar maÅĄÄĢnmācÄĢÅĄanos, lai noteiktu lÄĢdzÄĢgus attēlus. Å ÄĢ funkcija izmanto viedo meklÄ“ÅĄanu", "exclusion_pattern_description": "IzslēgÅĄanas ÅĄabloni Äŧauj ignorēt failus un mapes, skenējot bibliotēku. Tas ir noderÄĢgi, ja jums ir mapes, kas satur failus, kurus nevēlaties importēt, piemēram, RAW failus.", "export_config_as_json_description": "Lejupielādēt paÅĄreizējo sistēmas konfigurāciju kā JSON failu", + "external_libraries_page_description": "Administratora ārējās bibliotēkas lapa", "face_detection": "Seju noteikÅĄana", "face_detection_description": "AtpazÄĢt attēlos sejas, izmantojot maÅĄÄĢnmācÄĢÅĄanos. Video gadÄĢjumā tiek ņemta vērā tikai sÄĢktēls. \"Atsvaidzināt\" atkārtoti apstrādā visus attēlus. \"AtiestatÄĢt\" izdzÄ“ÅĄ visus paÅĄreizējos seju datus. \"TrÅĢkstoÅĄie\" ierindo attēlus, kas vēl nav apstrādāti. Pēc seju noteikÅĄanas pabeigÅĄanas atrastās sejas tiek ierindotas seju atpazÄĢÅĄanai, grupējot tās pēc esoÅĄas vai jauns personas.", "facial_recognition_job_description": "Grupēt atpazÄĢtās sejas pēc cilvēkiem. Å is solis tiek veikts pēc seju noteikÅĄanas pabeigÅĄanas. \"AtiestatÄĢt\" atkārtoti sagrupē visas sejas. \"TrÅĢkstoÅĄie\" ierindo sejas, kurām nav pieÅĄÄˇirta persona.", @@ -119,20 +120,25 @@ "job_not_concurrency_safe": "Å is uzdevums nav droÅĄs vienlaicÄĢgai izpildei.", "job_settings": "Uzdevumu iestatÄĢjumi", "job_settings_description": "Uzdevumu izpildes vienlaicÄĢguma pārvaldÄĢba", + "jobs_delayed": "{jobCount, plural, other {# delayed}}", "jobs_over_time": "Uzdevumi laika gaitā", "library_created": "Izveidoja bibliotēku: {library}", "library_deleted": "Bibliotēka dzēsta", "library_details": "Bibliotēkas dati", "library_folder_description": "Norādi importējamo mapi. Lai meklētu attēlus un videoklipus, tiks pārbaudÄĢta ÅĄÄĢ mape un tās apakÅĄmapes.", + "library_remove_exclusion_pattern_prompt": "Vai tieÅĄÄm vēlaties noņemt ÅĄo izslēgÅĄanas modeli?", + "library_remove_folder_prompt": "Vai tieÅĄÄm vēlies dzēst ÅĄo importa failu?", "library_scanning": "Periodiska skenÄ“ÅĄana", "library_scanning_description": "Konfigurē periodisku bibliotēku skenÄ“ÅĄanu", "library_scanning_enable_description": "Iespējot periodisku bibliotēku skenÄ“ÅĄanu", "library_settings": "Ārējās bibliotēkas", "library_settings_description": "Ārējo bibliotēku iestatÄĢjumu pārvaldÄĢba", "library_tasks_description": "PārbaudÄĢt ārējās bibliotēkas, lai atrastu jaunus un/vai mainÄĢtus failus", + "library_updated": "Atjaunināta bibliotēka", "library_watching_enable_description": "UzraudzÄĢt ārējo bibliotēku failu izmaiņas", "library_watching_settings": "Bibliotēku uzraudzÄĢÅĄana [EKSPERIMENTĀLA]", "library_watching_settings_description": "Automātiski uzraudzÄĢt, vai ir mainÄĢti faili", + "logging_enable_description": "Iespējot atkÄŧÅĢdoÅĄanas Åžurnālu", "logging_level_description": "Ja iespējots, kādu Åžurnāla lÄĢmeni izmantot.", "logging_settings": "ÅŊurnalÄ“ÅĄana", "machine_learning_availability_checks": "PieejamÄĢbas pārbaudes", @@ -173,6 +179,7 @@ "machine_learning_ocr_min_detection_score": "Minimālais atpazÄĢÅĄanas rezultāts", "machine_learning_ocr_min_detection_score_description": "Minimālais teksta noteikÅĄanas ticamÄĢbas rādÄĢtājs no 0 lÄĢdz 1. Zemākas vērtÄĢbas noteiks vairāk teksta, taču var izraisÄĢt kÄŧÅĢdaini pozitÄĢvus rezultātus.", "machine_learning_ocr_min_recognition_score": "Minimālais atpazÄĢÅĄanas rezultāts", + "machine_learning_ocr_min_score_recognition_description": "Minimālais ticamÄĢbas rezultāts, lai atrastais teksts bÅĢtu atpazÄĢts , no 0-1. Zemākas vērtÄĢbas atpazÄĢs vairāk tekstu, bet var izraisÄĢt kÄŧÅĢdainus rezultātus.", "machine_learning_ocr_model": "OCR modelis", "machine_learning_ocr_model_description": "Serveru modeÄŧi ir precÄĢzāki nekā mobilie modeÄŧi, bet apstrāde aizņem vairāk laika un tie izmanto vairāk atmiņas.", "machine_learning_settings": "MaÅĄÄĢnmācÄĢÅĄanās iestatÄĢjumi", @@ -186,12 +193,14 @@ "maintenance_delete_backup_description": "Å is fails tiks neatgriezeniski dzēsts.", "maintenance_delete_error": "Neizdevās dzēst rezerves kopiju.", "maintenance_restore_backup": "Atjaunot no rezerves kopijas", + "maintenance_restore_backup_description": "Immich dati tiks dzēsti un atjaunoti no izvēlētā dublējuma. Tiks izveidots dublējums pirms turpinājuma.", "maintenance_restore_backup_different_version": "Å ÄĢ rezerves kopija tika izveidota ar citu Immich versiju!", "maintenance_restore_backup_unknown_version": "Nevarēja noteikt rezerves kopijas versiju.", + "maintenance_restore_database_backup": "Atjaunināt datubāzes dublējumu", "maintenance_restore_database_backup_description": "Atgrizties pie iepriekÅĄÄ“jā datubāzes stāvokÄŧa, izmantojot rezerves kopijas failu", "maintenance_settings": "Apkope", "maintenance_settings_description": "Pārslēgt Immich apkopes reÅžÄĢmā.", - "maintenance_start": "Sākt apkopes reÅžÄĢmu", + "maintenance_start": "MainÄĢt uz apkopes reÅžÄĢmu", "maintenance_start_error": "Neizdevās uzsākt apkopes reÅžÄĢmu.", "maintenance_upload_backup": "AugÅĄupielādēt datubāzes rezerves kopijas failu", "maintenance_upload_backup_error": "Nevarēja augÅĄupielādēt rezerves kopiju, vai tas ir .sql/.sql.gz fails?", @@ -262,7 +271,7 @@ "oauth_auto_register": "Automātiska reÄŖistrācija", "oauth_auto_register_description": "Pēc pieslēgÅĄanās ar OAuth automātiski reÄŖistrēt jaunus lietotājus", "oauth_button_text": "Pogas teksts", - "oauth_client_secret_description": "NepiecieÅĄams, ja OAuth pakalpojuma sniedzējs neatbalsta PKCE (Proof Key for Code Exchange)", + "oauth_client_secret_description": "NepiecieÅĄams konfidenciālam klientam vai ja PKCE (Proof Key for Code Exchange) netiek atbalstÄĢta publiskajam klientam.", "oauth_enable_description": "Pieslēgties ar OAuth", "oauth_mobile_redirect_uri": "Mobilās pāradresÄ“ÅĄanas URI", "oauth_mobile_redirect_uri_override": "Mobilās pāradresÄ“ÅĄanas URI pārrakstÄĢÅĄana", @@ -274,7 +283,10 @@ "oauth_settings_more_details": "PlaÅĄÄku informāciju par ÅĄo funkcionalitāti skatÄĢt dokumentācijā.", "oauth_storage_label_claim": "Glabātuves nosaukuma pieteikums", "oauth_storage_label_claim_description": "Automātiski iestatÄĢt lietotāja glabātuves nosaukumu uz ÅĄÄĢ pieteikuma vērtÄĢbu.", + "oauth_storage_quota_claim": "Krātuves kvotas pieprasÄĢjums", + "oauth_storage_quota_claim_description": "Automātiski iestatÄĢt lietotāja krātuves kvotu ÅĄÄĢs prasÄĢbas vērtÄĢbā.", "oauth_storage_quota_default": "Noklusējuma krātuves kvota (GiB)", + "oauth_storage_quota_default_description": "Kvota GiB, kas jāizmanto, ja netiek iesniegta prasÄĢba.", "oauth_timeout": "PieprasÄĢjuma noildze", "oauth_timeout_description": "PieprasÄĢjumu laika limits milisekundēs", "ocr_job_description": "Izmantot maÅĄÄĢnmācÄĢÅĄanos, lai atpazÄĢtu tekstu attēlos", @@ -285,10 +297,12 @@ "person_cleanup_job": "Personu tÄĢrÄĢÅĄana", "queue_details": "Vaicājuma dati", "queues": "Uzdevumu rindas", + "queues_page_description": "Administratora darba uzdevumu lapa", "quota_size_gib": "Kvotas izmērs (GiB)", "refreshing_all_libraries": "Atsvaidzina visas bibliotēkas", "registration": "Administratora reÄŖistrācija", "registration_description": "Tā kā tu esi pirmais sistēmas lietotājs, tev tiks pieÅĄÄˇirts administratora statuss un tu bÅĢsi atbildÄĢgs par administrÄ“ÅĄanas uzdevumiem, kā arÄĢ par citu lietotāju izveidi.", + "remove_failed_jobs": "Dzēst neizdevuÅĄos darbus", "require_password_change_on_login": "PieprasÄĢt lietotājam mainÄĢt paroli pēc pirmās pieteikÅĄanās", "reset_settings_to_default": "Atjaunot iestatÄĢjumus uz noklusējuma vērtÄĢbām", "reset_settings_to_recent_saved": "Atjaunot iestatÄĢjumus uz pēdējiem saglabātajiem iestatÄĢjumiem", @@ -296,17 +310,22 @@ "search_jobs": "Meklēt uzdevumusâ€Ļ", "send_welcome_email": "NosÅĢtÄĢt sveiciena e-pastu", "server_external_domain_settings": "Ārējais domēns", - "server_external_domain_settings_description": "Domēns publiski kopÄĢgotajām saitēm, iekÄŧaujot http(s)://", + "server_external_domain_settings_description": "Domēns, kas tiek izmantots ārējām saitēm", "server_public_users": "Publiski lietotāji", + "server_public_users_description": "Pievienojot lietotāju koplietotajiem albumiem, tiek uzskaitÄĢti visi lietotāji (vārds un e-pasts). Ja ÅĄÄĢ opcija ir atspējota, lietotāju saraksts bÅĢs pieejams tikai administratoriem.", "server_settings": "Servera iestatÄĢjumi", "server_settings_description": "Servera iestatÄĢjumu pārvaldÄĢba", + "server_stats_page_description": "Administratora servera statistikas lapa", "server_welcome_message": "Sveiciena ziņa", "server_welcome_message_description": "Ziņojums, kas tiek parādÄĢts pieslēgÅĄanās lapā.", + "settings_page_description": "Administratora iestatÄĢjumu lapa", "sidecar_job": "Blakusfailu metadati", "sidecar_job_description": "Atklāt vai sinhronizēt blakusfailu metadatus no failu sistēmas", "slideshow_duration_description": "Katra attēla rādÄĢÅĄanas ilgums sekundēs", "smart_search_job_description": "Analizēt failus ar maÅĄÄĢnmācÄĢÅĄanos lai sagatavotu datus viedajai meklÄ“ÅĄanai", + "storage_template_date_time_description": "Datuma un laika informācijai tiek izmantots resursa izveides laika zÄĢmogs", "storage_template_date_time_sample": "Laika paraugs {date}", + "storage_template_enable_description": "Iespējot krātuves veidņu dzinēju", "storage_template_hash_verification_enabled": "JaucējvērtÄĢbu pārbaude ir iespējota", "storage_template_hash_verification_enabled_description": "Iespējo jaucējvērtÄĢbu pārbaudi, neatslēdz to, ja neapzinies sekas", "storage_template_migration": "Krātuves veidņu migrācija", @@ -314,38 +333,55 @@ "storage_template_migration_info": "Krātuves veidne pārveidos visus failu paplaÅĄinājumus uz mazajiem burtiem. Veidnes izmaiņas attieksies tikai uz jauniem failiem. Lai veidni piemērotu ar atpakaÄŧejoÅĄu efektu iepriekÅĄ augÅĄupielādētiem failiem, palaidiet {job}.", "storage_template_migration_job": "Krātuves veidņu migrācijas uzdevumu", "storage_template_more_details": "PlaÅĄÄku informāciju par ÅĄo funkcionalitāti skatÄĢt sadaÄŧā Krātuves veidne un tās sekas", + "storage_template_onboarding_description_v2": "Kad iespējots, ÅĄÄĢ funkcija automātiski organizēs failus ņemot vērā lietotāja doto veidni. Lai saņemtu vairāk informāciju, lÅĢdzu apskatiet dokumentāciju.", "storage_template_path_length": "Aptuvenais ceÄŧa garuma ierobeÅžojums: {length, number}/{limit, number}", "storage_template_settings": "Krātuves veidne", "storage_template_settings_description": "PārvaldÄĢt augÅĄupielādēto failu mapju struktÅĢru un faila nosaukumu", "storage_template_user_label": "Lietotāja krātuves nosaukums ir {label}", "system_settings": "Sistēmas iestatÄĢjumi", + "tag_cleanup_job": "Birku tÄĢrÄĢÅĄana", "template_email_available_tags": "Sagatavē var izmantot ÅĄos mainÄĢgos: {tags}", "template_email_if_empty": "Ja sagatave ir tukÅĄa, tiks izmantots noklusējuma e-pasts.", "template_email_invite_album": "Albuma ielÅĢguma sagatave", "template_email_preview": "PriekÅĄskatÄĢjums", "template_email_settings": "E-pasta sagataves", "template_email_update_album": "Atjaunināt albuma sagatavi", + "template_email_welcome": "Sveiciena e-pasta veidne", + "template_settings": "Paziņojumu veidnes", "template_settings_description": "Pielāgotu paziņojumu veidņu pārvaldÄĢba", "theme_custom_css_settings": "Pielāgots CSS", "theme_custom_css_settings_description": "Cascading Style Sheets Äŧauj pielāgot Immich izskatu.", + "theme_settings": "MotÄĢva iestatÄĢjumi", "theme_settings_description": "Immich tÄĢmekÄŧa saskarnes pielāgojumu pārvaldÄĢba", "thumbnail_generation_job": "SÄĢktēlu ÄŖenerÄ“ÅĄana", "thumbnail_generation_job_description": "Izveidot lielu, mazu un izplÅĢduÅĄu sÄĢktēlu katram failam, kā arÄĢ sÄĢktēlu katrai personai", "transcoding_acceleration_api": "PaātrinÄÅĄanas API", + "transcoding_acceleration_api_description": "API, kas mijiedarbosies ar jÅĢsu ierÄĢci, lai paātrinātu transkodÄ“ÅĄanu. Å is iestatÄĢjums ir “labākās iespējas”: kÄŧÅĢmes gadÄĢjumā tas pāries uz SW (programmatÅĢras) transkodÄ“ÅĄanu. VP9 var darboties vai nedarboties atkarÄĢbā no jÅĢsu dzelÅža.", "transcoding_acceleration_nvenc": "NVENC (nepiecieÅĄams NVIDIA GPU)", "transcoding_acceleration_qsv": "Quick Sync (nepiecieÅĄams 7. paaudzes vai jaunāks Intel procesors)", "transcoding_acceleration_rkmpp": "RKMPP (tikai Rockchip SOC)", "transcoding_acceleration_vaapi": "VAAPI", + "transcoding_accepted_audio_codecs": "Apstiprinātie audio kodeksi", + "transcoding_accepted_audio_codecs_description": "Izvēlieties kurus audio kodeksus nav nepiecieÅĄams transkodēt. Tiek izmantots tikai specifiskās transkodÄ“ÅĄanas politikām.", + "transcoding_accepted_containers": "Apstiprinātie konteineri", + "transcoding_accepted_containers_description": "Izvēlieties kurus konteineru formātus nav nepiecieÅĄams pārveidot uz MP4. Tiek izmantots tikai specifiskās transkodÄ“ÅĄanas politikās.", "transcoding_accepted_video_codecs": "Akceptētie video kodeki", "transcoding_accepted_video_codecs_description": "Izvēlies, kurus video kodekus nav nepiecieÅĄams transkodēt. Tiek izmantots tikai noteiktām transkodÄ“ÅĄanas politikām.", "transcoding_advanced_options_description": "Lielākajai daÄŧai lietotāju nevajadzētu mainÄĢt ÅĄÄĢs opcijas", "transcoding_audio_codec": "Audio kodeks", "transcoding_audio_codec_description": "Opus ir augstākās kvalitātes izvēle, bet tā ir mazāk saderÄĢga ar vecām ierÄĢcēm vai programmatÅĢru.", + "transcoding_bitrate_description": "Videoklipi, kuru bitu pārraides ātrums pārsniedz maksimālo, vai arÄĢ tie nav pieņemamā formātā", "transcoding_codecs_learn_more": "Lai uzzinātu vairāk par ÅĄeit lietoto terminoloÄŖiju, skatiet FFmpeg dokumentāciju par H.264 kodeku, HEVC kodeku un VP9 kodeku.", "transcoding_constant_quality_mode": "NemainÄĢgas kvalitātes reÅžÄĢms", "transcoding_constant_quality_mode_description": "ICQ ir labāks nekā CQP, bet daÅžas aparatÅĢras paātrinājuma ierÄĢces neatbalsta ÅĄo reÅžÄĢmu. Iestatot ÅĄo opciju, tiks izmantots norādÄĢtais reÅžÄĢms, ja tiek izmantota kvalitātē balstÄĢta kodÄ“ÅĄana. NVENC to ignorē, jo neatbalsta ICQ.", + "transcoding_constant_rate_factor": "Konstantais ātrums koeficients (-crf)", "transcoding_constant_rate_factor_description": "Video kvalitātes lÄĢmenis. Tipiskās vērtÄĢbas ir 23 priekÅĄ H.264, 28 priekÅĄ HEVC, 31 priekÅĄ VP9 un 35 priekÅĄ AV1. Zemāka vērtÄĢba ir labāka, bet rada lielākus failus.", + "transcoding_disabled_description": "Atspējot jebkāda veida videoklipu transkodÄ“ÅĄanu. AtskaņoÅĄana var nestrādāt daÅžiem klientiem", + "transcoding_encoding_options": "KodÄ“ÅĄanas opcijas", + "transcoding_encoding_options_description": "UzstādÄĢt kodeksus, izÅĄÄˇirtspēju, kvalitāti un citas opcijas kodētiem videoklipiem", "transcoding_hardware_acceleration": "AparatÅĢras paātrinājums", + "transcoding_hardware_acceleration_description": "Eksperimentāli: ātrāka transkodÄ“ÅĄana, bet var samazināt kvalitāti tādā paÅĄÄ bitu pārraides ātrumā", + "transcoding_hardware_decoding": "AparatÅĢras (HW) kodÄ“ÅĄana", "transcoding_required_description": "Tikai video, kas nav atbalstÄĢtā formātā", "transcoding_settings": "Video transkodÄ“ÅĄanas iestatÄĢjumi", "transcoding_threads": "Pavedieni", @@ -641,6 +677,7 @@ "color": "Krāsa", "color_theme": "Krāsu tēma", "command": "Komanda", + "command_palette_prompt": "Ātri atrodi lapas, darbÄĢbas vai komandas", "comment_deleted": "Komentārs dzēsts", "comment_options": "Komentāru iespējas", "comments_and_likes": "Komentāri un tÄĢkÅĄÄˇi", @@ -685,6 +722,8 @@ "create_workflow": "Izveidot darba plÅĢsmu", "created_at": "Izveidots", "crop": "Apcirpt", + "crop_aspect_ratio_fixed": "Fiksēts", + "crop_aspect_ratio_free": "BrÄĢvs", "crop_aspect_ratio_original": "OriÄŖināls", "curated_object_page_title": "Lietas", "current_pin_code": "EsoÅĄais PIN kods", @@ -711,8 +750,6 @@ "deduplication_criteria_2": "EXIF datu skaitu", "deduplication_info": "DeduplicÄ“ÅĄanas informācija", "deduplication_info_description": "Lai automātiski atzÄĢmētu failus un masveidā noņemtu dublikātus, mēs skatāmies uz:", - "default_locale": "Noklusējuma lokalizācija", - "default_locale_description": "Formatēt datumus un skaitÄŧus atbilstoÅĄi pārlÅĢka lokalizācijai", "delete": "Dzēst", "delete_album": "Dzēst albumu", "delete_dialog_alert": "Å ie vienumi tiks neatgriezeniski dzēsti no Immich un jÅĢsu ierÄĢces", @@ -878,6 +915,7 @@ "exif_bottom_sheet_people": "PERSONAS", "exif_bottom_sheet_person_add_person": "Pievienot vārdu", "exit_slideshow": "Iziet no slÄĢdrādes", + "expand": "Izvērst", "experimental_settings_new_asset_list_subtitle": "Izstrādes posmā", "experimental_settings_new_asset_list_title": "Iespējot eksperimentālo fotoreÅžÄŖi", "experimental_settings_subtitle": "Izmanto uzņemoties risku!", @@ -1191,6 +1229,7 @@ "my_albums": "Mani albumi", "name": "Vārds", "name_or_nickname": "Vārds vai iesauka", + "name_required": "Nosaukums ir obligāts", "navigate_to_time": "Pāriet uz laiku", "network_requirement_photos_upload": "Izmantot mobilo datu pārraidi, lai dublētu fotoattēlus", "network_requirement_videos_upload": "Izmantot mobilo datu pārraidi, lai dublētu video", @@ -1246,7 +1285,7 @@ "notifications_setting_description": "Paziņojumu pārvaldÄĢba", "oauth": "OAuth", "obtainium_configurator": "Obtainium konfigurētājs", - "obtainium_configurator_instructions": "LÅĢdzu, izveido API atslēgu un izvēlies variantu, lai izveidotu savu Obtainium konfigurācijas saiti.", + "obtainium_configurator_instructions": "Izmanto Obtainium, lai instalētu un atjauninātu Android lietotni pa tieÅĄo no Immich GitHub laidiena. Izveido API atslēgu un izvēlies variantu, lai izveidotu savu Obtainium konfigurācijas saiti.", "official_immich_resources": "Oficiālie Immich resursi", "offline": "Bezsaistē", "offset": "NobÄĢde", @@ -1259,6 +1298,7 @@ "online": "TieÅĄsaistē", "only_favorites": "Tikai izlase", "open": "Atvērt", + "open_calendar": "Atvērt kalendāru", "open_in_map_view": "Atvērt kartes skatā", "open_in_openstreetmap": "Atvērt OpenStreetMap", "open_the_search_filters": "Atvērt meklÄ“ÅĄanas filtrus", @@ -1378,6 +1418,7 @@ "reaction_options": "Reakcijas iespējas", "read_changelog": "LasÄĢt izmaiņu sarakstu", "ready_for_upload": "Gatavs augÅĄupielādei", + "recent_albums": "Nesenie albumi", "recently_added_page_title": "Nesen Pievienotais", "refresh": "Atsvaidzināt", "refresh_faces": "Atsvaidzināt sejas", @@ -1663,6 +1704,7 @@ "support": "Atbalsts", "support_and_feedback": "Atbalsts un atsauksmes", "support_third_party_description": "Tavu Immich instalāciju ir sagatavojusi treÅĄÄ puse. Problēmas, ar kurām sastopies, var bÅĢt saistÄĢtas ar ÅĄo pakotni, tāpēc lÅĢdzu vispirms ziņo par tām, izmantojot zemāk norādÄĢtās saites.", + "supporter": "AtbalstÄĢtājs", "sync": "Sinhronizēt", "sync_local": "Sinhronizēt lokāli", "sync_status": "Sinhronizācijas statuss", @@ -1764,6 +1806,7 @@ "users": "Lietotāji", "utilities": "RÄĢki", "validate": "PārbaudÄĢt", + "validate_endpoint_error": "LÅĢdzu, ievadi derÄĢgu URL", "validation_error": "Pārbaudes kÄŧÅĢda", "variables": "MainÄĢgie", "version": "Versija", diff --git a/i18n/ml.json b/i18n/ml.json index 9e93ce9fc6..f6d170623a 100644 --- a/i18n/ml.json +++ b/i18n/ml.json @@ -42,6 +42,7 @@ "add_to_shared_album": "ā´Ēā´™āĩā´•ā´ŋⴟāĩā´Ÿ ā´†āĩŊā´Ŧā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "add_upload_to_stack": "ā´…ā´Ēāĩâ€Œā´˛āĩ‹ā´Ąāĩ ā´¸āĩā´ąāĩā´ąā´žā´•āĩā´•ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "add_url": "URL ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "add_workflow_step": "ā´ĩāĩŧā´•āĩā´•āĩā´Ģāĩā´˛āĩ‹ ⴘⴟāĩā´Ÿā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "added_to_archive": "ā´†āĩŧā´•āĩā´•āĩˆā´ĩā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´¤āĩā´¤āĩ", "added_to_favorites": "ā´Ēāĩā´°ā´ŋā´¯ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´Ÿā´ĩā´¯ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´¤āĩā´¤āĩ", "added_to_favorites_count": "{count, number} ā´Žā´Ŗāĩā´Ŗā´‚ ā´Ēāĩā´°ā´ŋā´¯ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´Ÿā´ĩā´¯ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´¤āĩā´¤āĩ", @@ -74,6 +75,7 @@ "confirm_reprocess_all_faces": "ā´Žā´˛āĩā´˛ā´ž ā´Žāĩā´–ā´™āĩā´™ā´ŗāĩā´‚ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ā´Ēāĩā´°āĩ‹ā´¸ā´¸āĩā´¸āĩ ⴚāĩ†ā´¯āĩā´¯ā´Ŗā´Žāĩ†ā´¨āĩā´¨āĩ ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´‰ā´ąā´Ēāĩā´Ēā´žā´Ŗāĩ‹? ⴇⴤāĩ ā´Ēāĩ‡ā´°āĩā´ŗāĩā´ŗ ⴆⴺāĩā´•ā´ŗāĩ†ā´¯āĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´‚.", "confirm_user_password_reset": "{user}-ā´¨āĩā´ąāĩ† ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´ąāĩ€ā´¸āĩ†ā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯ā´Ŗā´Žāĩ†ā´¨āĩā´¨āĩ ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´‰ā´ąā´Ēāĩā´Ēā´žā´Ŗāĩ‹?", "confirm_user_pin_code_reset": "{user}-ā´¨āĩā´ąāĩ† ā´Ēā´ŋāĩģ ā´•āĩ‹ā´Ąāĩ ā´ąāĩ€ā´¸āĩ†ā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯ā´Ŗā´Žāĩ†ā´¨āĩā´¨āĩ ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´‰ā´ąā´Ēāĩā´Ēā´žā´Ŗāĩ‹?", + "copy_config_to_clipboard_description": "ā´¨ā´ŋā´˛ā´ĩā´ŋā´˛āĩ† ā´¸ā´ŋā´¸āĩā´ąāĩā´ąā´‚ ā´•āĩ‹āĩēā´Ģā´ŋā´—ā´ąāĩ‡ā´ˇāĩģ ā´’ā´°āĩ JSON ā´’ā´Ŧāĩā´œā´•āĩā´ąāĩā´ąāĩ ⴆⴝā´ŋ ā´•āĩā´˛ā´ŋā´Ēāĩā´Ēāĩā´Ŧāĩ‹āĩŧā´Ąā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Ēā´•āĩŧā´¤āĩā´¤āĩā´•", "create_job": "ⴜāĩ‹ā´˛ā´ŋ ⴉ⴪āĩā´Ÿā´žā´•āĩā´•āĩā´•", "cron_expression": "ā´•āĩā´°āĩ‹āĩē ā´Žā´•āĩā´¸āĩā´Ēāĩā´°ā´ˇāĩģ", "cron_expression_description": "ā´•āĩā´°āĩ‹āĩē ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´¸āĩā´•ā´žā´¨ā´ŋā´‚ā´—āĩ ā´‡ā´Ÿā´ĩāĩ‡ā´ŗ ⴏⴜāĩā´œāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•. ā´•āĩ‚ā´Ÿāĩā´¤āĩŊ ā´ĩā´ŋā´ĩā´°ā´™āĩā´™āĩžā´•āĩā´•ā´žā´¯ā´ŋ ā´Ļā´¯ā´ĩā´žā´¯ā´ŋ ā´•āĩā´°āĩ‹āĩēā´Ÿā´žā´Ŧāĩ ā´—āĩā´°āĩ ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗā´ĩ ā´Ēā´°ā´ŋā´ļāĩ‹ā´§ā´ŋā´•āĩā´•āĩā´•", @@ -81,6 +83,8 @@ "disable_login": "ā´˛āĩ‹ā´—ā´ŋāĩģ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´°ā´šā´ŋā´¤ā´Žā´žā´•āĩā´•āĩā´•", "duplicate_detection_job_description": "ā´¸ā´Žā´žā´¨ ⴚā´ŋā´¤āĩā´°ā´™āĩā´™āĩž ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´žāĩģ ā´…ā´¸ā´ąāĩā´ąāĩā´•ā´ŗā´ŋāĩŊ ā´Žāĩ†ā´ˇāĩ€āĩģ ā´˛āĩ‡ā´Ŗā´ŋā´‚ā´—āĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•. ⴇⴤāĩ ā´¸āĩā´Žā´žāĩŧⴟāĩā´Ÿāĩ ā´¸āĩ†āĩŧⴚāĩā´šā´ŋā´¨āĩ† ā´†ā´ļāĩā´°ā´¯ā´ŋⴚāĩā´šā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ", "exclusion_pattern_description": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´˛āĩˆā´Ŧāĩā´°ā´ąā´ŋ ā´¸āĩā´•ā´žāĩģ ⴚāĩ†ā´¯āĩā´¯āĩā´Žāĩā´Ēāĩ‹āĩž ā´Ģⴝⴞāĩā´•ā´ŗāĩā´‚ ā´Ģāĩ‹āĩžā´Ąā´ąāĩā´•ā´ŗāĩā´‚ ā´’ā´´ā´ŋā´ĩā´žā´•āĩā´•ā´žāĩģ ā´Žā´•āĩā´¸āĩā´•āĩā´˛āĩ‚ā´ˇāĩģ ā´Ēā´žā´ąāĩā´ąāĩ‡ā´Ŗāĩā´•āĩž ā´¨ā´ŋā´™āĩā´™ā´ŗāĩ† ā´¸ā´šā´žā´¯ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ. ā´¨ā´ŋā´™āĩā´™āĩž ā´‡ā´Žāĩā´Ēāĩ‹āĩŧⴟāĩā´Ÿāĩ ⴚāĩ†ā´¯āĩā´¯ā´žāĩģ ⴆⴗāĩā´°ā´šā´ŋā´•āĩā´•ā´žā´¤āĩā´¤ ā´Ģⴝⴞāĩā´•āĩž ā´…ā´Ÿā´™āĩā´™ā´ŋā´¯ ā´Ģāĩ‹āĩžā´Ąā´ąāĩā´•āĩž (ā´‰ā´Ļā´žā´šā´°ā´Ŗā´¤āĩā´¤ā´ŋā´¨āĩ RAW ā´Ģⴝⴞāĩā´•āĩž) ⴉ⴪āĩā´Ÿāĩ†ā´™āĩā´•ā´ŋāĩŊ ⴇⴤāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´Ēāĩā´°ā´Ļā´Žā´žā´Ŗāĩ.", + "export_config_as_json_description": "ā´¨ā´ŋā´˛ā´ĩā´ŋā´˛āĩā´ŗāĩā´ŗ ā´¸ā´ŋā´¸āĩā´ąāĩā´ąā´‚ ā´•āĩ‹āĩēā´Ģā´ŋā´—ā´ąāĩ‡ā´ˇāĩģ JSON ā´Ģā´¯ā´˛ā´žā´¯ā´ŋ ā´ĄāĩŒāĩēā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "external_libraries_page_description": "ā´…ā´Ąāĩā´Žā´ŋāĩģ ā´Žā´•āĩā´¸āĩā´ąāĩā´ąāĩ‡ā´ŖāĩŊ ā´˛āĩˆā´Ŧāĩā´°ā´ąā´ŋ ā´Ēāĩ‡ā´œāĩ", "face_detection": "ā´Žāĩā´–ā´‚ ā´¤ā´ŋā´°ā´ŋⴚāĩā´šā´ąā´ŋā´¯āĩŊ", "face_detection_description": "ā´Žāĩ†ā´ˇāĩ€āĩģ ā´˛āĩ‡ā´Ŗā´ŋā´‚ā´—āĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´…ā´¸ā´ąāĩā´ąāĩā´•ā´ŗā´ŋā´˛āĩ† ā´Žāĩā´–ā´™āĩā´™āĩž ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩā´•. ā´ĩāĩ€ā´Ąā´ŋā´¯āĩ‹ā´•āĩžā´•āĩā´•ā´žā´¯ā´ŋ, ⴤⴂā´Ŧāĩā´¨āĩ†ā´¯ā´ŋāĩŊ ā´Žā´žā´¤āĩā´°ā´Žāĩ‡ ā´Ēā´°ā´ŋā´—ā´Ŗā´ŋā´•āĩā´•āĩ‚. \"ā´ąā´ŋā´Ģāĩā´°ā´ˇāĩ\" ā´Žā´˛āĩā´˛ā´ž ā´…ā´¸ā´ąāĩā´ąāĩā´•ā´ŗāĩā´‚ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ā´Ēāĩā´°āĩ‹ā´¸ā´¸āĩā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ. \"ā´ąāĩ€ā´¸āĩ†ā´ąāĩā´ąāĩ\" ā´¨ā´ŋā´˛ā´ĩā´ŋā´˛āĩā´ŗāĩā´ŗ ā´Žā´˛āĩā´˛ā´ž ā´Žāĩā´– ā´Ąā´žā´ąāĩā´ąā´¯āĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ā´šāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ. \"ā´Žā´ŋā´¸āĩā´¸ā´ŋā´‚ā´—āĩ\" ⴇⴤāĩā´ĩā´°āĩ† ā´Ēāĩā´°āĩ‹ā´¸ā´¸āĩā´¸āĩ ⴚāĩ†ā´¯āĩā´¯ā´žā´¤āĩā´¤ ā´…ā´¸ā´ąāĩā´ąāĩā´•ā´ŗāĩ† ā´•āĩā´¯āĩ‚ā´ĩā´ŋā´˛ā´žā´•āĩā´•āĩā´¨āĩā´¨āĩ. ā´Žāĩā´–ā´‚ ā´¤ā´ŋā´°ā´ŋⴚāĩā´šā´ąā´ŋā´¯āĩŊ ā´Ēāĩ‚āĩŧā´¤āĩā´¤ā´ŋā´¯ā´žā´¯ ā´ļāĩ‡ā´ˇā´‚, ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´ŋā´¯ ā´Žāĩā´–ā´™āĩā´™āĩž ā´Ģāĩ‡ā´ˇāĩā´¯āĩŊ ā´ąāĩ†ā´•āĩā´•ā´—āĩā´¨ā´ŋā´ˇā´¨ā´žā´¯ā´ŋ ā´•āĩā´¯āĩ‚ ⴚāĩ†ā´¯āĩā´¯ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´‚, ā´…ā´ĩā´¯āĩ† ā´¨ā´ŋā´˛ā´ĩā´ŋā´˛āĩā´ŗāĩā´ŗā´¤āĩ‹ ā´Ēāĩā´¤ā´ŋⴝⴤāĩ‹ ⴆⴝ ⴆⴺāĩā´•ā´ŗā´žā´¯ā´ŋ ⴤⴰⴂⴤā´ŋā´°ā´ŋā´•āĩā´•āĩā´‚.", "facial_recognition_job_description": "ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´ŋā´¯ ā´Žāĩā´–ā´™āĩā´™ā´ŗāĩ† ⴆⴺāĩā´•ā´ŗā´žā´¯ā´ŋ ā´—āĩā´°āĩ‚ā´Ēāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•. ā´Žāĩā´–ā´‚ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩŊ ā´Ēāĩ‚āĩŧā´¤āĩā´¤ā´ŋā´¯ā´žā´¯ā´¤ā´ŋā´¨āĩ ā´ļāĩ‡ā´ˇā´Žā´žā´Ŗāĩ ⴈ ⴘⴟāĩā´Ÿā´‚ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ. \"ā´ąāĩ€ā´¸āĩ†ā´ąāĩā´ąāĩ\" ā´Žā´˛āĩā´˛ā´ž ā´Žāĩā´–ā´™āĩā´™ā´ŗāĩ†ā´¯āĩā´‚ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ā´•āĩā´˛ā´¸āĩā´ąāĩā´ąāĩŧ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ. \"ā´Žā´ŋā´¸āĩā´¸ā´ŋā´‚ā´—āĩ\" ā´’ā´°āĩ ā´ĩāĩā´¯ā´•āĩā´¤ā´ŋā´¯āĩ†ā´¯āĩā´‚ ā´…ā´¸āĩˆāĩģ ⴚāĩ†ā´¯āĩā´¯ā´žā´¤āĩā´¤ ā´Žāĩā´–ā´™āĩā´™ā´ŗāĩ† ā´•āĩā´¯āĩ‚ā´ĩā´ŋā´˛ā´žā´•āĩā´•āĩā´¨āĩā´¨āĩ.", @@ -100,6 +104,8 @@ "image_preview_description": "ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´¨āĩ€ā´•āĩā´•ā´‚ā´šāĩ†ā´¯āĩā´¤ ā´‡ā´Ÿā´¤āĩā´¤ā´°ā´‚ ā´ĩā´˛āĩā´Ēāĩā´Ēā´Žāĩā´ŗāĩā´ŗ ⴚā´ŋā´¤āĩā´°ā´‚, ā´’ā´°āĩŠā´ąāĩā´ą ā´…ā´¸ā´ąāĩā´ąāĩ ā´•ā´žā´Ŗāĩā´Žāĩā´Ēāĩ‹ā´´āĩā´‚ ā´Žāĩ†ā´ˇāĩ€āĩģ ā´˛āĩ‡ā´Ŗā´ŋā´‚ā´—ā´ŋā´¨āĩā´‚ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ", "image_preview_quality_description": "ā´Ēāĩā´°ā´ŋā´ĩāĩā´¯āĩ‚ ā´—āĩā´Ŗā´Žāĩ‡ā´¨āĩā´Ž 1-100 ā´ĩā´°āĩ†. ⴉⴝāĩŧā´¨āĩā´¨ ā´Žāĩ‚ā´˛āĩā´¯ā´‚ ā´Žā´ŋā´•ā´šāĩā´šā´¤ā´žā´Ŗāĩ, ā´Ēā´•āĩā´ˇāĩ‡ ā´ĩā´˛ā´ŋā´¯ ā´Ģⴝⴞāĩā´•āĩž ⴉ⴪āĩā´Ÿā´žā´•āĩā´•āĩā´•ā´¯āĩā´‚ ā´†ā´Ēāĩā´Ēā´ŋā´¨āĩā´ąāĩ† ā´Ēāĩā´°ā´¤ā´ŋā´•ā´°ā´Ŗā´ļāĩ‡ā´ˇā´ŋ ā´•āĩā´ąā´¯āĩā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´‚. ā´•āĩā´ąā´žāĩā´ž ā´Žāĩ‚ā´˛āĩā´¯ā´‚ ⴏⴜāĩā´œāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ā´Žāĩ†ā´ˇāĩ€āĩģ ā´˛āĩ‡ā´Ŗā´ŋā´‚ā´—āĩ ā´—āĩā´Ŗā´Žāĩ‡ā´¨āĩā´Žā´¯āĩ† ā´Ŧā´žā´§ā´ŋⴚāĩā´šāĩ‡ā´•āĩā´•ā´žā´‚.", "image_preview_title": "ā´Ēāĩā´°ā´ŋā´ĩāĩā´¯āĩ‚ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´Ŗā´™āĩā´™āĩž", + "image_progressive": "ā´Ēāĩā´°āĩ‹ā´—ā´Žā´¨ā´Ēā´°ā´‚", + "image_progressive_description": "ā´•āĩā´°ā´Žā´žā´¨āĩā´—ā´¤ā´Žā´žā´¯ ā´˛āĩ‹ā´Ąā´ŋā´‚ā´—āĩ ā´Ąā´ŋā´¸āĩā´Ēāĩā´˛āĩ‡ā´¯āĩā´•āĩā´•ā´žā´¯ā´ŋ JPEG ⴚā´ŋā´¤āĩā´°ā´™āĩā´™āĩž ā´•āĩā´°ā´Žāĩ‡ā´Ŗ ā´Žāĩģā´•āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•. ⴇⴤāĩ WebP ⴚā´ŋā´¤āĩā´°ā´™āĩā´™ā´ŗāĩ† ā´Ŧā´žā´§ā´ŋā´•āĩā´•ā´ŋā´˛āĩā´˛.", "image_quality": "ā´—āĩā´Ŗā´Žāĩ‡ā´¨āĩā´Ž", "image_resolution": "ā´ąāĩ†ā´¸ā´˛āĩā´¯āĩ‚ā´ˇāĩģ", "image_resolution_description": "ⴉⴝāĩŧā´¨āĩā´¨ ā´ąāĩ†ā´¸ā´˛āĩā´¯āĩ‚ⴎⴍāĩā´•āĩžā´•āĩā´•āĩ ā´•āĩ‚ā´Ÿāĩā´¤āĩŊ ā´ĩā´ŋā´ļā´Ļā´žā´‚ā´ļā´™āĩā´™āĩž ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•ā´žāĩģ ā´•ā´´ā´ŋā´¯āĩā´‚, ā´Ēā´•āĩā´ˇāĩ‡ ā´Žāĩģā´•āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯ā´žāĩģ ā´•āĩ‚ā´Ÿāĩā´¤āĩŊ ā´¸ā´Žā´¯ā´Žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´‚, ā´ĩā´˛ā´ŋā´¯ ā´Ģā´¯āĩŊ ā´ĩā´˛āĩā´Ēāĩā´Ēā´Žāĩā´Ŗāĩā´Ÿā´žā´•āĩā´‚, ā´•āĩ‚ā´Ÿā´žā´¤āĩ† ā´†ā´Ēāĩā´Ēā´ŋā´¨āĩā´ąāĩ† ā´Ēāĩā´°ā´¤ā´ŋā´•ā´°ā´Ŗā´ļāĩ‡ā´ˇā´ŋ ā´•āĩā´ąā´¯āĩā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´‚.", @@ -108,6 +114,7 @@ "image_thumbnail_description": "ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´¨āĩ€ā´•āĩā´•ā´‚ā´šāĩ†ā´¯āĩā´¤ ⴚāĩ†ā´ąā´ŋā´¯ ⴤⴂā´Ŧāĩā´¨āĩ†ā´¯ā´ŋāĩŊ, ā´Ēāĩā´°ā´§ā´žā´¨ ⴟāĩˆā´‚ā´˛āĩˆāĩģ ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗ ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹ā´•ā´ŗāĩā´Ÿāĩ† ā´—āĩā´°āĩ‚ā´Ēāĩā´Ēāĩā´•āĩž ā´•ā´žā´Ŗāĩā´Žāĩā´Ēāĩ‹āĩž ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ", "image_thumbnail_quality_description": "ⴤⴂā´Ŧāĩā´¨āĩ†ā´¯ā´ŋā´˛ā´ŋā´¨āĩā´ąāĩ† ā´—āĩā´Ŗā´Žāĩ‡ā´¨āĩā´Ž 1-100 ā´ĩā´°āĩ†. ⴉⴝāĩŧā´¨āĩā´¨ ā´Žāĩ‚ā´˛āĩā´¯ā´‚ ā´Žā´ŋā´•ā´šāĩā´šā´¤ā´žā´Ŗāĩ, ā´Ēā´•āĩā´ˇāĩ‡ ā´ĩā´˛ā´ŋā´¯ ā´Ģⴝⴞāĩā´•āĩž ⴉ⴪āĩā´Ÿā´žā´•āĩā´•āĩā´•ā´¯āĩā´‚ ā´†ā´Ēāĩā´Ēā´ŋā´¨āĩā´ąāĩ† ā´Ēāĩā´°ā´¤ā´ŋā´•ā´°ā´Ŗā´ļāĩ‡ā´ˇā´ŋ ā´•āĩā´ąā´¯āĩā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´‚.", "image_thumbnail_title": "ⴤⴂā´Ŧāĩā´¨āĩ†ā´¯ā´ŋāĩŊ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´Ŗā´™āĩā´™āĩž", + "import_config_from_json_description": "ā´’ā´°āĩ JSON ā´•āĩ‹āĩēā´Ģā´ŋā´—ā´ąāĩ‡ā´ˇāĩģ ā´Ģā´¯āĩŊ ā´…ā´Ēāĩâ€Œā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¤āĩā´•āĩŠā´Ŗāĩā´Ÿāĩ ā´¸ā´ŋā´¸āĩā´ąāĩā´ąā´‚ ā´•āĩ‹āĩēā´Ģā´ŋā´—ā´ąāĩ‡ā´ˇāĩģ ā´‡ā´ąā´•āĩā´•āĩā´Žā´¤ā´ŋ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "job_concurrency": "{job} ā´•āĩ‹āĩēā´•ā´ąāĩģā´¸ā´ŋ", "job_created": "ⴜāĩ‹ā´˛ā´ŋ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋⴚāĩā´šāĩ", "job_not_concurrency_safe": "ⴈ ⴜāĩ‹ā´˛ā´ŋ ā´•āĩ‹āĩēā´•ā´ąāĩģā´¸ā´ŋ-ā´¸āĩ‡ā´Ģāĩ ā´…ā´˛āĩā´˛.", @@ -819,8 +826,6 @@ "deduplication_criteria_2": "EXIF ā´Ąā´žā´ąāĩā´ąā´¯āĩā´Ÿāĩ† ā´Žā´Ŗāĩā´Ŗā´‚", "deduplication_info": "ā´Ąāĩā´¯āĩ‚ā´Ēāĩā´˛ā´ŋā´•āĩā´•āĩ‡ā´ˇāĩģ ā´’ā´´ā´ŋā´ĩā´žā´•āĩā´•āĩŊ ā´ĩā´ŋā´ĩā´°ā´‚", "deduplication_info_description": "ā´…ā´¸ā´ąāĩā´ąāĩā´•āĩž ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´Žāĩāĩģā´•āĩ‚ā´Ÿāĩā´Ÿā´ŋ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩā´‚ ā´Ąāĩā´¯āĩ‚ā´Ēāĩā´˛ā´ŋā´•āĩā´•āĩ‡ā´ąāĩā´ąāĩā´•āĩž ā´Ŧāĩžā´•āĩā´•ā´žā´¯ā´ŋ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩā´‚, ā´žā´™āĩā´™āĩž ā´‡ā´ĩ ā´Ēā´°ā´ŋā´—ā´Ŗā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ:", - "default_locale": "ā´Ąā´ŋā´Ģāĩ‹āĩžā´Ÿāĩā´Ÿāĩ ā´˛āĩŠā´•āĩā´•āĩ‡āĩŊ", - "default_locale_description": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ŧāĩā´°āĩ—ā´¸āĩŧ ā´˛āĩŠā´•āĩā´•āĩ‡ā´˛ā´ŋā´¨āĩ† ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´¤āĩ€ā´¯ā´¤ā´ŋā´•ā´ŗāĩā´‚ ā´…ā´•āĩā´•ā´™āĩā´™ā´ŗāĩā´‚ ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "delete": "ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•", "delete_action_confirmation_message": "ⴈ ā´…ā´¸ā´ąāĩā´ąāĩ ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•ā´Ŗā´Žāĩ†ā´¨āĩā´¨āĩ ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´‰ā´ąā´Ēāĩā´Ēā´žā´Ŗāĩ‹? ⴈ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´‚ ā´…ā´¸ā´ąāĩā´ąā´ŋā´¨āĩ† ā´¸āĩ†āĩŧā´ĩā´ąā´ŋā´¨āĩā´ąāĩ† ⴟāĩā´°ā´žā´ˇā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´‚, ā´•āĩ‚ā´Ÿā´žā´¤āĩ† ⴇⴤāĩ ā´Ēāĩā´°ā´žā´Ļāĩ‡ā´ļā´ŋā´•ā´Žā´žā´¯ā´ŋ ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•ā´Ŗāĩ‹ ā´Žā´¨āĩā´¨āĩ ⴚāĩ‹ā´Ļā´ŋā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´‚", "delete_action_prompt": "{count} ā´Žā´Ŗāĩā´Ŗā´‚ ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•ā´ŋ", diff --git a/i18n/mr.json b/i18n/mr.json index f31b080e37..cbeac5131f 100644 --- a/i18n/mr.json +++ b/i18n/mr.json @@ -814,8 +814,6 @@ "deduplication_criteria_2": "EXIF ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗ", "deduplication_info": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤Ÿ ⤍ā¤ŋā¤ĩā¤žā¤°ā¤Ŗ ā¤Žā¤žā¤šā¤ŋ⤤āĨ€", "deduplication_info_description": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤Ÿ ⤏āĨā¤ĩā¤¯ā¤‚ā¤šā¤˛ā¤ŋ⤤ā¤Ē⤪āĨ‡ ⤍ā¤ŋā¤ĩā¤ĄāĨ‚⤍ ā¤•ā¤žā¤ĸ⤪āĨā¤¯ā¤žā¤¸ā¤žā¤ āĨ€ ā¤–ā¤žā¤˛āĨ€ā¤˛ ⤍ā¤ŋ⤕⤎ ā¤ĩā¤žā¤Ē⤰⤞āĨ‡ ā¤œā¤žā¤¤ā¤žā¤¤:", - "default_locale": "ā¤ĒāĨ‚⤰āĨā¤ĩ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ā¤­ā¤žā¤ˇā¤ž", - "default_locale_description": "⤤āĨā¤Žā¤šāĨā¤¯ā¤ž ā¤ŦāĨā¤°ā¤žā¤‰ā¤ā¤°ā¤šāĨā¤¯ā¤ž ā¤­ā¤žā¤ˇā¤ž-ā¤Ē⤰ā¤ŋā¤¸ā¤°ā¤žā¤¨āĨā¤¸ā¤žā¤° ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ā¤ĩ ⤏⤂⤖āĨā¤¯ā¤ž ⤏āĨā¤ĩ⤰āĨ‚ā¤Ēā¤ŋ⤤ ā¤•ā¤°ā¤ž", "delete": "ā¤šā¤Ÿā¤ĩā¤ž", "delete_action_confirmation_message": "⤤āĨā¤ŽāĨā¤šā¤žā¤˛ā¤ž ā¤šāĨ€ ā¤Ģā¤žā¤ˆā¤˛ ā¤šā¤Ÿā¤ĩā¤žā¤¯ā¤šāĨ€ ā¤†ā¤šāĨ‡ ā¤•ā¤ž? ā¤šāĨ€ ⤕āĨā¤°ā¤ŋā¤¯ā¤ž ⤏⤰āĨā¤ĩāĨā¤šā¤°ā¤šāĨā¤¯ā¤ž ⤟āĨā¤°āĨ…ā¤ļā¤Žā¤§āĨā¤¯āĨ‡ ā¤šā¤˛ā¤ĩāĨ‡ā¤˛ ⤆⤪ā¤ŋ ⤏āĨā¤Ĩā¤žā¤¨ā¤ŋ⤕ā¤Ē⤪āĨ‡ ā¤šā¤Ÿā¤ĩā¤žā¤¯ā¤šāĨ‡ ā¤•ā¤ž ⤤āĨ‡ ā¤ĩā¤ŋā¤šā¤žā¤°āĨ‡ā¤˛", "delete_action_prompt": "{count} ā¤šā¤Ÿā¤ĩ⤞āĨ‡", diff --git a/i18n/ms.json b/i18n/ms.json index cbec851018..0c1ae6c156 100644 --- a/i18n/ms.json +++ b/i18n/ms.json @@ -15,6 +15,7 @@ "add_a_location": "Tambah lokasi", "add_a_name": "Tambah nama", "add_a_title": "Tambah tajuk", + "add_action": "Tambah Tindakan", "add_birthday": "Tambah hari jadi", "add_endpoint": "Tambah titik akhir", "add_exclusion_pattern": "Tambahkan corak pengecualian", @@ -436,7 +437,6 @@ "deduplication_criteria_2": "Kiraan data EXIF", "deduplication_info": "Maklumat Pendeduplikasian", "deduplication_info_description": "Untuk prapilih aset secara automatik dan mengalih keluar pendua secara pukal, kami melihat pada:", - "default_locale": "Tempatan Lalai", "delete": "Padam", "delete_album": "Padam album", "delete_api_key_prompt": "Adakah anda pasti mahu memadam kunci API ini?", diff --git a/i18n/nb_NO.json b/i18n/nb_NO.json index 564c3c0de9..4de7864811 100644 --- a/i18n/nb_NO.json +++ b/i18n/nb_NO.json @@ -311,7 +311,7 @@ "search_jobs": "Søk etter jobberâ€Ļ", "send_welcome_email": "Send velkomst-e-post", "server_external_domain_settings": "Eksternt domene", - "server_external_domain_settings_description": "Domene for offentlige delingslenker, inkludert http(s)://", + "server_external_domain_settings_description": "Domene brukt for eksterne lenker", "server_public_users": "Offentlige brukere", "server_public_users_description": "Alle brukere (navn og epost) blir vist nÃĨr en bruker blir lagt til et delt album. NÃĨr deaktivert, vil brukerne bare bli synlig for administratorer.", "server_settings": "Serverinstillinger", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Tone mapping", "transcoding_tone_mapping_description": "Forsøker ÃĨ bevare utseendet til HDR-videoer nÃĨr de konverteres til SDR. Hver algoritme gjør ulike avveininger mellom farge, detaljer og lysstyrke. Hable bevarer detaljer, Mobius bevarer farge, og Reinhard bevarer lysstyrke.", "transcoding_transcode_policy": "Transkode retningslinjer", - "transcoding_transcode_policy_description": "Retningslinjer for nÃĨr en video skal transkodes. HDR-videoer vil alltid bli transkodet (unntatt hvis transkoding er deaktivert).", + "transcoding_transcode_policy_description": "Retningslinjer for nÃĨr en video skal transkodes. HDR-videoer med annet format enn YUV 4:2:0 vil alltid bli transkodet (unntatt hvis transkoding er deaktivert).", "transcoding_two_pass_encoding": "To-passert koding", "transcoding_two_pass_encoding_setting_description": "Transkoding i to pass for ÃĨ produsere bedre kodede videoer. NÃĨr maksimal bithastighet er aktivert (nødvendig for ÃĨ fungere med H.264 og HEVC), bruker denne modusen et bithastighetsomrÃĨde basert pÃĨ maksimal bithastighet og ignorerer CRF. For VP9 kan CRF brukes hvis maksimal bithastighet er deaktivert.", "transcoding_video_codec": "Videokodek", @@ -782,6 +782,8 @@ "client_cert_import": "Importer", "client_cert_import_success_msg": "Klient sertifikat er importert", "client_cert_invalid_msg": "Ugyldig sertifikat eller feil passord", + "client_cert_password_message": "Skriv inn passordet for dette sertifikatet", + "client_cert_password_title": "Sertifikat passord", "client_cert_remove_msg": "Klient sertifikat er fjernet", "client_cert_subtitle": "Støtter kun PKCS12 (.p12, .pfx) formater. Importering/Fjerning av sertifikater er kun mulig før innlogging", "client_cert_title": "SSL Klient sertifikat [EKSPERIMENTELL]", @@ -792,6 +794,11 @@ "color": "Farge", "color_theme": "Fargetema", "command": "Kommando", + "command_palette_prompt": "Finn sider, handlinger, eller kommandoer raskt", + "command_palette_to_close": "ÃĨ lukke", + "command_palette_to_navigate": "ÃĨ gÃĨ inn i", + "command_palette_to_select": "ÃĨ velge", + "command_palette_to_show_all": "ÃĨ vise alle", "comment_deleted": "Kommentar slettet", "comment_options": "Kommentaralternativer", "comments_and_likes": "Kommentarer & likes", @@ -865,7 +872,7 @@ "current_server_address": "NÃĨvÃĻrende serveradresse", "custom_date": "Egendefinert dato", "custom_locale": "Tilpasset lokalisering", - "custom_locale_description": "Formater datoer og tall basert pÃĨ sprÃĨk og region", + "custom_locale_description": "Formater datoer, tid og tall basert pÃĨ det valgte sprÃĨket og regionen", "custom_url": "Tilpasset URL", "cutoff_date_description": "Fjern bilder som er eldre ennâ€Ļ", "cutoff_day": "{count, plural, one {dag} other {dager}}", @@ -888,8 +895,6 @@ "deduplication_criteria_2": "Antall av EXIF data", "deduplication_info": "Dedupliseringsinformasjon", "deduplication_info_description": "For ÃĨ automatisk forhÃĨndsvelge eiendeler og fjerne duplikater samtidig, ser vi pÃĨ:", - "default_locale": "Standard sprÃĨkinnstilling", - "default_locale_description": "Formater datoer og tall basert pÃĨ nettleserens sprÃĨkinnstilling", "delete": "Slett", "delete_action_confirmation_message": "Vil du virkelig slette dette elementet? Dette vil flytte elementet til papirkurvn og vil gi deg beskjed om du vil slette det lokalt", "delete_action_prompt": "{count} slettet", @@ -995,8 +1000,15 @@ "editor_close_without_save_prompt": "Endringene vil ikke bli lagret", "editor_close_without_save_title": "Lukk redigering?", "editor_confirm_reset_all_changes": "Er du sikker pÃĨ at du vil tilbakestille alle endringer?", + "editor_discard_edits_confirm": "Kast bort endringer", + "editor_discard_edits_prompt": "Du har ulagrede endringer. Er du sikker pÃĨ at du vil kaste dem bort?", + "editor_discard_edits_title": "Forkast endringer?", + "editor_edits_applied_error": "Kunne ikke lagre endringer", + "editor_edits_applied_success": "Lagring av endringer vellykket", "editor_flip_horizontal": "Roter horisontalt", "editor_flip_vertical": "Roter vertikalt", + "editor_handle_corner": "{corner, select, top_left {Øvre venstre} top_right {Øvre høyre} bottom_left {Nedre venstre} bottom_right {Nedre høyre} other {A}} hjørnehÃĨndtak", + "editor_handle_edge": "{edge, select, top {Øvre} bottom {Nedre} left {Venstre} right {Høyre} other {Et}} kanthÃĨndtak", "editor_orientation": "Orientering", "editor_reset_all_changes": "Tilbakestill endringer", "editor_rotate_left": "Roter 90° mot klokken", @@ -1062,6 +1074,7 @@ "failed_to_update_notification_status": "Kunne ikke oppdatere varslingsstatusen", "incorrect_email_or_password": "Feil epost eller passord", "library_folder_already_exists": "Importstien eksisterer allerede.", + "page_not_found": "Siden ble ikke funnet", "paths_validation_failed": "{paths, plural, one {# sti} other {# sti}} mislyktes validering", "profile_picture_transparent_pixels": "Profil bilde kan ikke ha gjennomsiktige piksler. Vennligst zoom inn og/eller flytt bilde.", "quota_higher_than_disk_size": "Du har satt kvoten større enn diskstørrelsen", @@ -1161,6 +1174,7 @@ "exif_bottom_sheet_people": "MENNESKER", "exif_bottom_sheet_person_add_person": "Legg til navn", "exit_slideshow": "Avslutt lysbildefremvisning", + "expand": "Utvid", "expand_all": "Utvid alle", "experimental_settings_new_asset_list_subtitle": "Under utvikling", "experimental_settings_new_asset_list_title": "Aktiver eksperimentell rutenettsvisning", @@ -1196,6 +1210,8 @@ "features_in_development": "Funksjoner under utvikling", "features_setting_description": "Administrer funksjoner for appen", "file_name_or_extension": "Filnavn eller filtype", + "file_name_text": "Filnavn", + "file_name_with_value": "Filnavn: {file_name}", "file_size": "Filstørrelse", "filename": "Filnavn", "filetype": "Filtype", @@ -1203,6 +1219,7 @@ "filter_description": "Betingelser for ÃĨ filtrere objekter", "filter_people": "Filtrer personer", "filter_places": "Filtrer steder", + "filter_tags": "Filtrer emner", "filters": "Filtre", "find_them_fast": "Finn dem raskt ved søking av navn", "first": "Første", @@ -1633,6 +1650,7 @@ "online": "Tilkoblet", "only_favorites": "Bare favoritter", "open": "Åpne", + "open_calendar": "Åpne kalender", "open_in_map_view": "Åpne i kartvisning", "open_in_openstreetmap": "Åpne i OpenStreetMap", "open_the_search_filters": "Åpne søkefiltrene", @@ -1792,9 +1810,8 @@ "rate_asset": "Vurder objekt", "rating": "Stjernevurdering", "rating_clear": "Slett vurdering", - "rating_count": "{count, plural, one {# sjerne} other {# stjerner}}", + "rating_count": "{count, plural, =0 {Unrated} one {# stjerne} other {# stjerner}}", "rating_description": "Vis EXIF vurdering i informasjonspanel", - "rating_set": "Vurdering satt til {rating, plural, one {# stjerne} other {# stjerner}}", "reaction_options": "Reaksjonsalternativer", "read_changelog": "Les endringslogg", "readonly_mode_disabled": "Skrivebeskyttet modus deaktivert", @@ -1866,7 +1883,10 @@ "reset_pin_code_success": "PIN-koden er tilbakestilt", "reset_pin_code_with_password": "Du kan alltid tilbakestiller PIN-koden med passordet ditt", "reset_sqlite": "Reset SQLite Databasen", - "reset_sqlite_confirmation": "Vil du virkelig resette SQLite databasen? Du blir nødt til ÃĨ logge ut og inn igjen for ÃĨ resynkronisere data", + "reset_sqlite_clear_app_data": "Slett data", + "reset_sqlite_confirmation": "Vil du virkelig tømme appens data? Dette vil fjerne alle innstillingene dine og logge deg ut.", + "reset_sqlite_confirmation_note": "Notis: Du mÃĨ restarte appen etter tømming.", + "reset_sqlite_done": "App data har blitt tømt. Vennligst restart Immich og logg inn igjen.", "reset_sqlite_success": "Vellykket resetting av SQLite databasen", "reset_to_default": "Tilbakestill til standard", "resolution": "Oppløsning", @@ -1894,6 +1914,7 @@ "saved_settings": "Lagret instillinger", "say_something": "Si noe", "scaffold_body_error_occurred": "Feil oppstÃĨtt", + "scaffold_body_error_unrecoverable": "Det har oppstÃĨtt en uopprettelig feil. Vennligst del feilmeldingen og \"stack trace\" pÃĨ Discord eller GitHub slik at vi kan hjelpe deg. Hvis du fÃĨr beskjed om det, kan du slette app-dataene nedenfor.", "scan": "Skann", "scan_all_libraries": "Skann alle biblioteker", "scan_library": "Skann", @@ -1907,7 +1928,7 @@ "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_by_ocr": "Søk etter tekst i bilde", + "search_by_ocr": "Søk med tekstgjenkjenning", "search_by_ocr_example": "Latte", "search_camera_lens_model": "Søk etter objektivmodell...", "search_camera_make": "Søk etter kameramerke...", @@ -1929,6 +1950,7 @@ "search_filter_ocr": "Søk etter tekst i bilde", "search_filter_people_title": "Velg mennesker", "search_filter_star_rating": "Stjernerating", + "search_filter_tags_title": "Velg emner", "search_for": "Søk etter", "search_for_existing_person": "Søk etter eksisterende person", "search_no_more_result": "Ingen flere resultater", @@ -2008,6 +2030,9 @@ "set_profile_picture": "Sett profilbilde", "set_slideshow_to_fullscreen": "Sett lysbildefremvisning til fullskjerm", "set_stack_primary_asset": "Velg som primÃĻrbilde", + "setting_image_navigation_enable_subtitle": "Hvis aktivert, kan du navigere til forrige/neste bilde ved ÃĨ trykke pÃĨ den venstre eller høyre fjerdedelen av skjermen.", + "setting_image_navigation_enable_title": "Trykk for ÃĨ navigere", + "setting_image_navigation_title": "Bildenavigering", "setting_image_viewer_help": "Detaljvisningen laster først miniatyrbildet, deretter forhÃĨndsvisningsbildet (hvis aktivert), og til slutt originalen (hvis aktivert).", "setting_image_viewer_original_subtitle": "Aktiver for ÃĨ laste originalbildet i full oppløsning (stort!). Deaktiver for ÃĨ spare databruk (bÃĨde nettverksbruk og bufferdata pÃĨ enheten).", "setting_image_viewer_original_title": "Last originalbildet", @@ -2174,6 +2199,7 @@ "support": "Støtte", "support_and_feedback": "Støtte og tilbakemelding", "support_third_party_description": "Immich-installasjonen din ble pakket av en tredjepart. Problemer du opplever kan vÃĻre forÃĨrsaket av den pakken, sÃĨ vennligst ta opp problemer med dem i første omgang ved ÃĨ bruke koblingene nedenfor.", + "supporter": "Støtter", "swap_merge_direction": "Bytt retning pÃĨ sammenslÃĨingen", "sync": "Synkroniser", "sync_albums": "Synkroniser album", @@ -2285,6 +2311,7 @@ "unstack_action_prompt": "{count} ustakket", "unstacked_assets_count": "Ikke stablet {count, plural, one {# element} other {# elementer}}", "unsupported_field_type": "Ustøttede felttyper", + "unsupported_file_type": "Filen {file} kan ikke lastes opp fordi filtypen {type} ikke støttes.", "untagged": "Umerket", "untitled_workflow": "Arbeidsflyt uten navn", "up_next": "Neste", @@ -2311,6 +2338,8 @@ "url": "URL", "usage": "Bruk", "use_biometric": "Bruk biometri", + "use_browser_locale": "Bruk nettleser lokale", + "use_browser_locale_description": "Formater datoer, tider, og tall basert pÃĨ nettleserens lokale", "use_current_connection": "Bruk nÃĨvÃĻrende tilkobling", "use_custom_date_range": "Bruk egendefinert datoperiode i stedet", "user": "Bruker", diff --git a/i18n/nl.json b/i18n/nl.json index 24197a15b8..89daa4bee5 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -2,7 +2,7 @@ "about": "Over", "account": "Account", "account_settings": "Accountinstellingen", - "acknowledge": "Erkennen", + "acknowledge": "Bevestigen", "action": "Actie", "action_common_update": "Bijwerken", "action_description": "Een groep acties om uit te voeren op de gefilterde items", @@ -122,7 +122,7 @@ "job_settings_description": "Beheer aantal gelijktijdige taken", "jobs_delayed": "{jobCount, plural, other {# vertraagd}}", "jobs_failed": "{jobCount, plural, other {# mislukt}}", - "jobs_over_time": "Taken in de loop der tÄŗd", + "jobs_over_time": "Taken in de loop der tijd", "library_created": "Bibliotheek aangemaakt: {library}", "library_deleted": "Bibliotheek verwijderd", "library_details": "Bibliotheek details", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Tone mapping", "transcoding_tone_mapping_description": "Probeert het uiterlijk van HDR-video's te behouden wanneer ze worden geconverteerd naar SDR. Elk algoritme maakt verschillende afwegingen voor kleur, detail en helderheid. Hable behoudt detail, Mobius behoudt kleur en Reinhard behoudt helderheid.", "transcoding_transcode_policy": "Transcodeerbeleid", - "transcoding_transcode_policy_description": "Beleid voor wanneer een video getranscodeerd moet worden. HDR-video's worden altijd getranscodeerd (behalve als transcodering is uitgeschakeld).", + "transcoding_transcode_policy_description": "Beleid voor wanneer een video getranscodeerd moet worden. HDR-video's en video's met een pixelformaat anders dan YUV 4:2:0 worden altijd getranscodeerd (behalve als transcodering is uitgeschakeld).", "transcoding_two_pass_encoding": "Two-pass encodering", "transcoding_two_pass_encoding_setting_description": "Transcodeer in twee passes om beter gecodeerde video's te produceren. Wanneer de maximale bitrate is ingeschakeld (vereist om te werken met H.264 en HEVC), gebruikt deze modus een bitraterange op basis van de maximale bitrate en negeert CRF. Voor VP9 kan CRF worden gebruikt als de maximale bitrate is uitgeschakeld.", "transcoding_video_codec": "Video Codec", @@ -471,7 +471,7 @@ "advanced_settings_troubleshooting_subtitle": "Schakel extra functies voor probleemoplossing in", "advanced_settings_troubleshooting_title": "Probleemoplossing", "age_months": "Leeftijd {months, plural, one {# maand} other {# maanden}}", - "age_year_months": "Leeftijd 1 jaar, {months, plural, one {# maand} other {# maanden}}", + "age_year_months": "Leeftijd 1 jaar en {months, plural, one {# maand} other {# maanden}}", "age_years": "{years, plural, other {Leeftijd #}}", "album": "Album", "album_added": "Album toegevoegd", @@ -591,7 +591,7 @@ "assets_added_to_album_count": "{count, plural, one {# item} other {# items}} aan het album toegevoegd", "assets_added_to_albums_count": "{assetTotal, plural, one {# asset} other {# assets}} toegevoegd aan {albumTotal, plural, one {# album} other {#albums}}", "assets_cannot_be_added_to_album_count": "{count, plural, one {# item} other {# items}} konden niet aan album toegevoegd worden", - "assets_cannot_be_added_to_albums": "{count, plural, one {Middel kan} other {Middelen kunnen}} niet toegevoegd worden aan de albums", + "assets_cannot_be_added_to_albums": "{count, plural, one {Item kan} other {Items kunnen}} niet toegevoegd worden aan de albums", "assets_count": "{count, plural, one {# item} other {# items}}", "assets_deleted_permanently": "{count} item(s) permanent verwijderd", "assets_deleted_permanently_from_server": "{count} item(s) permanent verwijderd van de Immich server", @@ -608,7 +608,7 @@ "assets_trashed_count": "{count, plural, one {# item} other {# items}} naar prullenbak verplaatst", "assets_trashed_from_server": "{count} item(s) naar de prullenbak verplaatst op de Immich server", "assets_were_part_of_album_count": "{count, plural, one {Item was} other {Items waren}} al onderdeel van het album", - "assets_were_part_of_albums_count": "{count, plural, one {Middel is} other {Middelen zijn}} al onderdeel van de albums", + "assets_were_part_of_albums_count": "{count, plural, one {Item is} other {Items zijn}} al onderdeel van de albums", "authorized_devices": "Geautoriseerde apparaten", "automatic_endpoint_switching_subtitle": "Maak indien beschikbaar lokaal verbinding via het aangewezen wifi-netwerk en gebruik elders alternatieve verbindingen", "automatic_endpoint_switching_title": "Automatische serverwissel", @@ -872,7 +872,7 @@ "current_server_address": "Huidig serveradres", "custom_date": "Aangepaste datum", "custom_locale": "Aangepaste landinstelling", - "custom_locale_description": "Formatteer datums en getallen op basis van de taal en de regio", + "custom_locale_description": "Formatteer datums, tijden en getallen op basis van de geselecteerde taal en de regio", "custom_url": "Aangepaste URL", "cutoff_date_description": "Bewaar foto's van de laatsteâ€Ļ", "cutoff_day": "{count, plural, one {dag} other {dagen}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Aantal EXIF data", "deduplication_info": "Deduplicatie-info", "deduplication_info_description": "Om automatisch items te preselecteren en duplicaten te verwijderen in bulk, kijken we naar:", - "default_locale": "Standaard landinstelling", - "default_locale_description": "Formatteer datums en getallen op basis van de landinstellingen van je browser", "delete": "Verwijderen", "delete_action_confirmation_message": "Weet je zeker dat je dit item wilt verwijderen? Deze actie zorgt ervoor dat het item naar de prullenbak van de server wordt verplaatst en je wordt gevraagd of je deze ook lokaal wilt verwijderen", "delete_action_prompt": "{count} item(s) verwijderd", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "De wijzigingen zijn succesvol toegepast", "editor_flip_horizontal": "Horizontaal spiegelen", "editor_flip_vertical": "Verticaal spiegelen", + "editor_handle_corner": "Handgreep {corner, select, top_left {linkerbovenhoek} top_right {rechterbovenhoek} bottom_left {linkeronderhoek} bottom_right {rechteronderhoek} other {hoek}}", + "editor_handle_edge": "Handgreep {edge, select, top {bovenkant} bottom {onderkant} left {linkerkant} right {rechterkant} other {zijkant}}", "editor_orientation": "OriÃĢntatie", "editor_reset_all_changes": "Reset wijzigingen", "editor_rotate_left": "Draai 90° tegen de klok in", @@ -1074,7 +1074,8 @@ "failed_to_update_notification_status": "Kon notificatiestatus niet updaten", "incorrect_email_or_password": "Onjuist e-mailadres of wachtwoord", "library_folder_already_exists": "Dit import­pad bestaat al.", - "paths_validation_failed": "validatie van {paths, plural, one {# pad} other {# paden}} mislukt", + "page_not_found": "Pagina niet gevonden", + "paths_validation_failed": "Valideren van {paths, plural, one {# pad} other {# paden}} mislukt", "profile_picture_transparent_pixels": "Profielfoto's kunnen geen transparante pixels bevatten. Zoom in en/of verplaats de afbeelding.", "quota_higher_than_disk_size": "Je hebt een opslaglimiet ingesteld die hoger is dan de schijfgrootte", "something_went_wrong": "Er liep iets mis", @@ -1093,7 +1094,7 @@ "unable_to_change_location": "Kan locatie niet wijzigen", "unable_to_change_password": "Kan wachtwoord niet veranderen", "unable_to_change_visibility": "Kan de zichtbaarheid van {count, plural, one {# persoon} other {# mensen}} niet wijzigen", - "unable_to_complete_oauth_login": "Kan inloggen met OAuth niet voltooie", + "unable_to_complete_oauth_login": "Kan inloggen met OAuth niet voltooien", "unable_to_connect": "Kan niet verbinden", "unable_to_copy_to_clipboard": "Kan niet naar klembord kopiÃĢren, zorg ervoor dat je de pagina via https opent", "unable_to_create": "Kan werkstroom niet aanmaken", @@ -1162,7 +1163,7 @@ "unable_to_update_workflow": "Kan werkstroom niet bijwerken", "unable_to_upload_file": "Kan bestand niet uploaden" }, - "errors_text": "Errors", + "errors_text": "Fouten", "exclusion_pattern": "Uitsluitingspatroon", "exif": "Exif", "exif_bottom_sheet_description": "Beschrijving toevoegen...", @@ -1216,8 +1217,9 @@ "filetype": "Bestandstype", "filter": "Filter", "filter_description": "Filtervoorwaarden voor doel items", - "filter_people": "Filter op mensen", - "filter_places": "Filter locaties", + "filter_people": "Filteren op persoon", + "filter_places": "Filteren op locatie", + "filter_tags": "Filteren op label", "filters": "Filters", "find_them_fast": "Vind ze snel op naam door te zoeken", "first": "Eerste", @@ -1428,7 +1430,7 @@ "login_form_err_invalid_url": "Ongeldige URL", "login_form_err_leading_whitespace": "Spatie aan het begin", "login_form_err_trailing_whitespace": "Spatie aan het eind", - "login_form_failed_get_oauth_server_config": "Fout bij inloggen met OAuth, controleer server-URL", + "login_form_failed_get_oauth_server_config": "Fout bij het inloggen met OAuth, controleer server-URL", "login_form_failed_get_oauth_server_disable": "OAuth-functie is niet beschikbaar op deze server", "login_form_failed_login": "Fout bij inloggen; controleer server-URL, e-mailadres en wachtwoord", "login_form_handshake_exception": "Er was een Handshake Exception met de server. Schakel ondersteuning voor zelfondertekende certificaten in bij de instellingen als u een zelfondertekend certificaat gebruikt.", @@ -1554,7 +1556,7 @@ "moved_to_trash": "Naar de prullenbak verplaatst", "multiselect_grid_edit_date_time_err_read_only": "Kan datum van alleen-lezen item(s) niet wijzigen, overslaan", "multiselect_grid_edit_gps_err_read_only": "Kan locatie van alleen-lezen item(s) niet wijzigen, overslaan", - "mute_memories": "Herrinneringen dempen", + "mute_memories": "Herinneringen dempen", "my_albums": "Mijn albums", "name": "Naam", "name_or_nickname": "Naam of gebruikersnaam", @@ -1639,7 +1641,7 @@ "oldest_first": "Oudste eerst", "on_this_device": "Op dit apparaat", "onboarding": "Introductie", - "onboarding_locale_description": "Selecteer je voorkeurstaal. Je dan dit later wijzigen in je instellingen.", + "onboarding_locale_description": "Selecteer je voorkeurstaal. Je kan dit later wijzigen in je instellingen.", "onboarding_privacy_description": "De volgende (optionele) functies zijn afhankelijk van externe services en kunnen op elk moment worden uitgeschakeld in de instellingen.", "onboarding_server_welcome_description": "Laten we je instantie instellen met een aantal veelgebruikte instellingen.", "onboarding_theme_description": "Kies een kleurenthema voor de applicatie. Dit kun je later wijzigen in je instellingen.", @@ -1649,6 +1651,7 @@ "only_favorites": "Alleen favorieten", "open": "Openen", "open_calendar": "Open kalender", + "open_in_browser": "Openen in browser", "open_in_map_view": "Openen in kaartweergave", "open_in_openstreetmap": "Openen in OpenStreetMap", "open_the_search_filters": "Open de zoekfilters", @@ -1808,9 +1811,8 @@ "rate_asset": "Item waardering geven", "rating": "Sterwaardering", "rating_clear": "Waardering verwijderen", - "rating_count": "{count, plural, one {# ster} other {# sterren}}", + "rating_count": "{count, plural, =0 {Niet beoordeeld} one {# ster} other {# sterren}}", "rating_description": "De EXIF-waardering weergeven in het infopaneel", - "rating_set": "Item {rating, plural, one {# ster} other {# sterren}} gegeven", "reaction_options": "Reactie-opties", "read_changelog": "Lees wijzigingen", "readonly_mode_disabled": "Alleen-lezen modus uitgeschakeld", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "Pincode succesvol gereset", "reset_pin_code_with_password": "Je kan je pincode altijd resetten met je wachtwoord", "reset_sqlite": "SQLite database resetten", - "reset_sqlite_confirmation": "Ben je zeker dat je de SQLite database wilt resetten? Je zal moeten uitloggen om de data opnieuw te synchroniseren", + "reset_sqlite_clear_app_data": "Wis gegevens", + "reset_sqlite_confirmation": "Weet je zeker dat je de app-gegevens wilt wissen? Hiermee worden alle instellingen verwijderd en word je uitgelogd.", + "reset_sqlite_confirmation_note": "Let op: Je moet de app opnieuw opstarten nadat je deze hebt gewist.", + "reset_sqlite_done": "App data is gewist. Start Immich opnieuw op en log opnieuw in.", "reset_sqlite_success": "De SQLite database is succesvol gereset", "reset_to_default": "Resetten naar standaard", "resolution": "Resolutie", @@ -1910,6 +1915,7 @@ "saved_settings": "Instellingen opgeslagen", "say_something": "Zeg iets", "scaffold_body_error_occurred": "Fout opgetreden", + "scaffold_body_error_unrecoverable": "Er is een onherstelbare fout opgetreden. Deel de foutmelding en de stacktrace op Discord of GitHub zodat we kunnen helpen. Als dit wordt geadviseerd, kun je hieronder de app data wissen.", "scan": "Scan", "scan_all_libraries": "Scan alle bibliotheken", "scan_library": "Scan", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "Zoeken op tekst herkend door OCR", "search_filter_people_title": "Selecteer mensen", "search_filter_star_rating": "Sterbeoordeling", + "search_filter_tags_title": "Labels selecteren", "search_for": "Zoeken naar", "search_for_existing_person": "Zoek naar bestaande persoon", "search_no_more_result": "Geen resultaten meer", @@ -2024,6 +2031,9 @@ "set_profile_picture": "Profielfoto instellen", "set_slideshow_to_fullscreen": "Diavoorstelling op volledig scherm", "set_stack_primary_asset": "Instellen als primair item", + "setting_image_navigation_enable_subtitle": "Indien ingeschakeld kun je naar de vorige/volgende afbeelding gaan door op het meest linkse of meest rechtse kwart van het scherm te tikken.", + "setting_image_navigation_enable_title": "Tik om te navigeren", + "setting_image_navigation_title": "Afbeelding Navigatie", "setting_image_viewer_help": "De gedetailleerde weergave laadt eerst de kleine thumbnail, vervolgens het middelgrote voorbeeld (indien ingeschakeld) en ten slotte het origineel (indien ingeschakeld).", "setting_image_viewer_original_subtitle": "Schakel in om de originele afbeelding met volledige resolutie (groot!) te laden. Schakel uit om datagebruik te verminderen (zowel netwerk als apparaatcache).", "setting_image_viewer_original_title": "Originele afbeelding laden", @@ -2122,7 +2132,7 @@ "show_and_hide_people": "Toon & verberg mensen", "show_file_location": "Toon bestandslocatie", "show_gallery": "Toon galerij", - "show_hidden_people": "Verbogen mensen weergeven", + "show_hidden_people": "Verborgen mensen weergeven", "show_in_timeline": "Toon in tijdlijn", "show_in_timeline_setting_description": "Toon foto's en video's van deze gebruiker in je tijdlijn", "show_keyboard_shortcuts": "Sneltoetsen tonen", @@ -2290,7 +2300,7 @@ "unlink_motion_video": "Ontkoppel bewegende video", "unlink_oauth": "Ontkoppel OAuth", "unlinked_oauth_account": "OAuth account ontkoppeld", - "unmute_memories": "Dempen van herrinneringen opheffen", + "unmute_memories": "Dempen van herinneringen opheffen", "unnamed_album": "Naamloos album", "unnamed_album_delete_confirmation": "Weet je zeker dat je dit album wilt verwijderen?", "unnamed_share": "Naamloze deellink", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} item(s) ontstapeld", "unstacked_assets_count": "{count, plural, one {# item} other {# items}} ontstapeld", "unsupported_field_type": "Veldtype niet ondersteund", + "unsupported_file_type": "Bestand {file} kan niet worden geÃŧpload omdat het bestandstype {type} niet wordt ondersteund.", "untagged": "Zonder tags", "untitled_workflow": "Naamloze werkstroom", "up_next": "Volgende", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "Gebruik", "use_biometric": "Gebruik biometrische authenticatie", + "use_browser_locale": "Gebruik landinstelling van browser", + "use_browser_locale_description": "Formatteer datums, tijden en getallen op basis van de landinstelling van je browser", "use_current_connection": "Gebruik huidige verbinding", "use_custom_date_range": "Gebruik in plaats daarvan een aangepast datumbereik", "user": "Gebruiker", @@ -2407,7 +2420,7 @@ "workflows_help_text": "Werkstromen automatiseren acties op je items gebaseerd op triggers en filters", "wrong_pin_code": "Onjuiste pincode", "year": "Jaar", - "years_ago": "{years, plural, one {# jaar} other {# jaar}} geleden", + "years_ago": "{years, plural, one {Een jaar} other {# jaar}} geleden", "yes": "Ja", "you_dont_have_any_shared_links": "Je hebt geen gedeelde links", "your_wifi_name": "Je WiFi-naam", diff --git a/i18n/package.json b/i18n/package.json index 4d4aa7965c..a66505923d 100644 --- a/i18n/package.json +++ b/i18n/package.json @@ -1,6 +1,6 @@ { "name": "immich-i18n", - "version": "2.5.6", + "version": "2.6.3", "private": true, "scripts": { "format": "prettier --cache --check .", diff --git a/i18n/pl.json b/i18n/pl.json index d98533a41e..d123d17077 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -311,7 +311,7 @@ "search_jobs": "Zadania przeszukiwaniaâ€Ļ", "send_welcome_email": "Wyślij powitalny e-mail", "server_external_domain_settings": "Domena zewnętrzna", - "server_external_domain_settings_description": "Domena dla publicznie udostępnionych linkÃŗw, wraz z http(s)://", + "server_external_domain_settings_description": "Domena uÅŧywana do linkÃŗw zewnętrznych", "server_public_users": "UÅŧytkownicy publiczni", "server_public_users_description": "Wszyscy uÅŧytkownicy (nazwa i adres e-mail) są wymienieni podczas dodawania uÅŧytkownika do udostępnionych albumÃŗw. Po wyłączeniu lista uÅŧytkownikÃŗw będzie dostępna tylko dla administratorÃŗw.", "server_settings": "Ustawienia Serwera", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapowanie tonÃŗw", "transcoding_tone_mapping_description": "PrÃŗbuje zachować wygląd filmÃŗw HDR po konwersji do SDR. KaÅŧdy algorytm dokonuje rÃŗÅŧnych kompromisÃŗw w zakresie koloru, szczegÃŗÅ‚owości i jasności. Hable zachowuje szczegÃŗÅ‚y, Mobius kolor, a Reinhard jasność.", "transcoding_transcode_policy": "Zasady transkodowania", - "transcoding_transcode_policy_description": "Zasady dotyczące transkodowania filmu. Filmy HDR będą zawsze transkodowane (z wyjątkiem sytuacji, gdy transkodowanie jest wyłączone).", + "transcoding_transcode_policy_description": "Zasady dotyczące transkodowania filmu. Filmy HDR oraz filmy w formacie innym od YUV 4:2:0 będą zawsze transkodowane (z wyjątkiem sytuacji, gdy transkodowanie jest wyłączone).", "transcoding_two_pass_encoding": "Kodowanie dwuprzebiegowe", "transcoding_two_pass_encoding_setting_description": "Transkoduj w dwÃŗch przebiegach, aby uzyskać lepiej zakodowane filmy. Gdy włączona jest maksymalna prędkość transmisji (wymagana do działania z H.264 i HEVC), ten tryb wykorzystuje zakres oparty na maksymalnej prędkości transmisji i ignoruje CRF. W przypadku wersji VP9 moÅŧna uÅŧyć CRF, jeśli maksymalna prędkość transmisji jest wyłączona.", "transcoding_video_codec": "Kodek Wideo", @@ -794,6 +794,11 @@ "color": "Kolor", "color_theme": "Motyw kolorÃŗw", "command": "Polecenie", + "command_palette_prompt": "Szybko znajdÅē strony, działania lub polecenia", + "command_palette_to_close": "aby zamknąć", + "command_palette_to_navigate": "aby wejść", + "command_palette_to_select": "aby wybrać", + "command_palette_to_show_all": "aby pokazać wszystko", "comment_deleted": "Usunięto komentarz", "comment_options": "Opcje komentarza", "comments_and_likes": "Komentarze i polubienia", @@ -866,8 +871,8 @@ "current_pin_code": "Aktualny kod PIN", "current_server_address": "Aktualny adres serwera", "custom_date": "Data niestandardowa", - "custom_locale": "Niestandardowy Region", - "custom_locale_description": "Formatuj daty i liczby na podstawie języka i regionu", + "custom_locale": "Niestandardowe ustawienia regionalne", + "custom_locale_description": "Formatuj daty, godziny i liczby zgodnie z wybranym językiem i regionem", "custom_url": "Niestandardowy URL", "cutoff_date_description": "Zachowaj zdjęcia z ostatnichâ€Ļ", "cutoff_day": "{count, plural, one {dzień} other {dni}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Ilość plikÃŗw EXIF", "deduplication_info": "Stan duplikatÃŗw", "deduplication_info_description": "Aby zakwalifikować elementy jako duplikaty do masowego usunięcia, sprawdzane jest:", - "default_locale": "Domyślny Region", - "default_locale_description": "Formatuj daty i liczby na podstawie ustawień Twojej przeglądarki", "delete": "Usuń", "delete_action_confirmation_message": "Jesteś pewien, Åŧe chcesz usunąć ten zasÃŗb? Ta czynność przeniesie zasÃŗb do kosza na serwerze i wyświetli komunikat z pytaniem, czy chcesz go usunąć lokalnie", "delete_action_prompt": "{count} usuniętych", @@ -1069,6 +1072,7 @@ "failed_to_update_notification_status": "Nie udało się zaktualizować stanu powiadomienia", "incorrect_email_or_password": "Nieprawidłowy e-mail lub hasło", "library_folder_already_exists": "Ta ścieÅŧka importu juÅŧ istnieje.", + "page_not_found": "Nie znaleziono strony", "paths_validation_failed": "{paths, plural, one {# ścieÅŧka} few {# ścieÅŧki} other {# ścieÅŧek}}", "profile_picture_transparent_pixels": "Zdjęcia profilowe nie mogą mieć przezroczystych pikseli. Powiększ i/lub przesuń obraz.", "quota_higher_than_disk_size": "Ustawiony przez ciebie limit większy niÅŧ rozmiar dysku", @@ -1168,6 +1172,7 @@ "exif_bottom_sheet_people": "LUDZIE", "exif_bottom_sheet_person_add_person": "Dodaj nazwę", "exit_slideshow": "Zamknij Pokaz SlajdÃŗw", + "expand": "Rozwiń", "expand_all": "Rozwiń wszystko", "experimental_settings_new_asset_list_subtitle": "Praca w toku", "experimental_settings_new_asset_list_title": "Włącz eksperymentalny układ zdjęć", @@ -1212,6 +1217,7 @@ "filter_description": "Warunki filtrowania wybranych zasobÃŗw", "filter_people": "Szukaj osoby", "filter_places": "Filtruj miejsca", + "filter_tags": "Filtruj tagi", "filters": "Filtry", "find_them_fast": "Wyszukuj szybciej przypisując nazwę", "first": "Pierwszy", @@ -1642,6 +1648,8 @@ "online": "Połączony", "only_favorites": "Tylko ulubione", "open": "OtwÃŗrz", + "open_calendar": "OtwÃŗrz kalendarz", + "open_in_browser": "OtwÃŗrz w przeglądarce", "open_in_map_view": "OtwÃŗrz w widoku mapy", "open_in_openstreetmap": "OtwÃŗrz w OpenStreetMap", "open_the_search_filters": "OtwÃŗrz filtry wyszukiwania", @@ -1801,9 +1809,8 @@ "rate_asset": "Oceń zasÃŗb", "rating": "Ocena gwiazdkowa", "rating_clear": "Wyczyść ocenę", - "rating_count": "{count, plural, one {# gwiazdka} other {# gwiazdek}}", + "rating_count": "{count, plural, =0 {Bez oceny} one {# gwiazdka} few {# gwiazdki} other {# gwiazdek}}", "rating_description": "Wyświetl ocenę z EXIF w panelu informacji", - "rating_set": "Ocena ustawiona na {rating, plural, one {# gwiazdkę} few {# gwiazdki} other {# gwiazdek}}", "reaction_options": "Opcje reakcji", "read_changelog": "Zobacz Zmiany", "readonly_mode_disabled": "Tryb tylko do odczytu wyłączony", @@ -1875,7 +1882,10 @@ "reset_pin_code_success": "Pomyślnie zresetowano kod PIN", "reset_pin_code_with_password": "Zawsze moÅŧesz zresetować swÃŗj kod PIN za pomocą hasła", "reset_sqlite": "Zresetuj bazę danych SQLite", - "reset_sqlite_confirmation": "Czy na pewno chcesz zresetować bazę danych SQLite? Wymagane będzie wylogowanie oraz ponowne zalogowanie, aby zsynchronizować dane", + "reset_sqlite_clear_app_data": "Wyczyść dane", + "reset_sqlite_confirmation": "Czy na pewno chcesz wyczyścić dane aplikacji? Spowoduje to usunięcie wszystkich ustawień i wylogowanie.", + "reset_sqlite_confirmation_note": "Informacja: Po wyczyszczeniu musisz zamknąć i ponownie uruchomić aplikację.", + "reset_sqlite_done": "Dane aplikacji zostały usunięte. Proszę zamknij i uruchom ponownie Immich, a następnie zaloguj się na nowo.", "reset_sqlite_success": "Pomyślnie zresetowano bazę danych SQLite", "reset_to_default": "PrzywrÃŗÄ‡ ustawienia domyślne", "resolution": "Rozdzielczość", @@ -1903,6 +1913,7 @@ "saved_settings": "Zapisane ustawienia", "say_something": "Powiedz coś", "scaffold_body_error_occurred": "Wystąpił błąd", + "scaffold_body_error_unrecoverable": "Wystąpił błąd nie do naprawienia. Prosimy o przesłanie informacji o błędzie i śladzie stosu na Discord lub GitHub, abyśmy mogli pomÃŗc. Jeśli zostanie to zalecone, moÅŧna wyczyścić dane aplikacji poniÅŧej.", "scan": "Skanuj", "scan_all_libraries": "Skanuj wszystkie biblioteki", "scan_library": "Skanuj", @@ -1938,6 +1949,7 @@ "search_filter_ocr": "Wyszukaj przy uÅŧyciu OCR", "search_filter_people_title": "Wybierz osoby", "search_filter_star_rating": "Ocena gwiazdkowa", + "search_filter_tags_title": "Wybierz tagi", "search_for": "Szukaj wśrÃŗd", "search_for_existing_person": "Wyszukaj istniejącą osobę", "search_no_more_result": "Brak dalszych wynikÃŗw", @@ -2017,6 +2029,9 @@ "set_profile_picture": "Ustaw zdjęcie profilowe", "set_slideshow_to_fullscreen": "Ustaw Pokaz slajdÃŗw na pełny ekran", "set_stack_primary_asset": "Ustaw jako gÅ‚Ãŗwny zasÃŗb", + "setting_image_navigation_enable_subtitle": "Po włączeniu, moÅŧesz przejść do poprzedniego/następnego obrazu, dotykając lewej/prawej zewnętrznej ćwiartki ekranu.", + "setting_image_navigation_enable_title": "Dotknij, aby przejść", + "setting_image_navigation_title": "Nawigacja obrazÃŗw", "setting_image_viewer_help": "Przeglądarka szczegÃŗÅ‚Ãŗw najpierw ładuje małą miniaturę, następnie ładuje podgląd obrazu średniej wielkości (jeśli jest włączony), a na koniec ładuje oryginał (jeśli jest włączony).", "setting_image_viewer_original_subtitle": "Włącz, aby załadować oryginalny obraz w pełnej rozdzielczości (duÅŧy!). Wyłącz, aby zmniejszyć zuÅŧycie danych (zarÃŗwno w sieci, jak i w pamięci podręcznej urządzenia).", "setting_image_viewer_original_title": "Załaduj oryginalny obraz", @@ -2032,7 +2047,7 @@ "setting_notifications_notify_never": "nigdy", "setting_notifications_notify_seconds": "{count} sekund", "setting_notifications_single_progress_subtitle": "SzczegÃŗÅ‚owe informacje o postępie przesyłania dla kaÅŧdego zasobu", - "setting_notifications_single_progress_title": "PokaÅŧ postęp szczegÃŗÅ‚Ãŗw kopii zapasowej w tle", + "setting_notifications_single_progress_title": "PokaÅŧ szczegÃŗÅ‚y postępu kopii zapasowej w tle", "setting_notifications_subtitle": "Dostosuj preferencje powiadomień", "setting_notifications_total_progress_subtitle": "OgÃŗlny postęp przesyłania (gotowe/całkowite zasoby)", "setting_notifications_total_progress_title": "PokaÅŧ całkowity postęp tworzenia kopii zapasowej w tle", @@ -2183,6 +2198,7 @@ "support": "Wsparcie", "support_and_feedback": "Wsparcie i opinie", "support_third_party_description": "Twoja instalacja immich została spakowana przez trzecią stronę. Problemy, ktÃŗre napotykasz, mogą być spowodowane przez ten pakiet, więc w pierwszej kolejności zgłaszaj problemy u nich, korzystając z poniÅŧszych linkÃŗw.", + "supporter": "Wspierający", "swap_merge_direction": "Zmień kierunek złączenia", "sync": "Synchronizuj", "sync_albums": "Synchronizuj albumy", @@ -2294,6 +2310,7 @@ "unstack_action_prompt": "{count} rozdzielono", "unstacked_assets_count": "Rozdzielono {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}}", "unsupported_field_type": "Nieobsługiwany typ pola", + "unsupported_file_type": "Nie moÅŧna przesłać pliku {file}, poniewaÅŧ jego typ {type} nie jest obsługiwany.", "untagged": "Nieoznaczone", "untitled_workflow": "Przepływ pracy bez tytułu", "up_next": "Do następnego", @@ -2320,6 +2337,8 @@ "url": "URL", "usage": "UÅŧycie", "use_biometric": "UÅŧyj biometrii", + "use_browser_locale": "UÅŧyj ustawień regionalnych przeglądarki", + "use_browser_locale_description": "Formatuj daty, godziny i liczby zgodnie z ustawieniami regionalnymi przeglądarki", "use_current_connection": "UÅŧyj bieÅŧącego połączenia", "use_custom_date_range": "Zamiast tego uÅŧyj niestandardowego zakresu dat", "user": "UÅŧytkownik", diff --git a/i18n/pt.json b/i18n/pt.json index 4d281c94fa..e4822f12ff 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -311,7 +311,7 @@ "search_jobs": "Pesquisar tarefasâ€Ļ", "send_welcome_email": "Enviar e-mail de boas-vindas", "server_external_domain_settings": "Domínio externo", - "server_external_domain_settings_description": "Domínio para links pÃēblicos partilhados, incluindo http(s)://", + "server_external_domain_settings_description": "Domínio utilizado para acesso externo", "server_public_users": "Utilizadores PÃēblicos", "server_public_users_description": "Todos os utilizadores (nome e e-mail) serÃŖo listados quando adicionar um utilizador a ÃĄlbuns partilhados. Quando desativado, a lista de utilizadores sÃŗ serÃĄ visível a administradores.", "server_settings": "DefiniçÃĩes do Servidor", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapeamento de tons", "transcoding_tone_mapping_description": "Tenta preservar a aparÃĒncia dos vídeos HDR quando convertidos para SDR. Cada algoritmo faz compensaçÃĩes diferentes em termos de cor, detalhes e brilho. Hable preserva os detalhes, Mobius preserva as cores e Reinhard preserva o brilho.", "transcoding_transcode_policy": "Política de transcodificaÃ§ÃŖo", - "transcoding_transcode_policy_description": "Política para quando um vídeo deve ser transcodificado. Os vídeos HDR serÃŖo sempre transcodificados (exceto se a transcodificaÃ§ÃŖo estiver desativada).", + "transcoding_transcode_policy_description": "Política para quando um vídeo deve ser transcodificado. Os vídeos HDR e os vídeos com formato diferente de YUV 4:2:0 serÃŖo sempre transcodificados (exceto se a transcodificaÃ§ÃŖo estiver desativada).", "transcoding_two_pass_encoding": "CodificaÃ§ÃŖo em duas passagens", "transcoding_two_pass_encoding_setting_description": "Transcodificar em duas passagens para produzir vídeos melhor codificados. Quando a taxa de bits mÃĄxima estÃĄ ativada (necessÃĄrio para funcionar com H.264 e HEVC), este modo usa um intervalo de taxa de bits baseado na taxa de bits mÃĄxima e ignora o CRF. Para VP9, o CRF pode ser usado se a taxa de bits mÃĄxima estiver desativada.", "transcoding_video_codec": "Codificador de Vídeo", @@ -794,6 +794,11 @@ "color": "Cor", "color_theme": "Esquema de cores", "command": "Comando", + "command_palette_prompt": "Encontre de forma rÃĄpida pÃĄginas, açÃĩes ou comandos", + "command_palette_to_close": "para fechar", + "command_palette_to_navigate": "para entrar", + "command_palette_to_select": "para selecionar", + "command_palette_to_show_all": "para mostrar tudo", "comment_deleted": "ComentÃĄrio eliminado", "comment_options": "OpçÃĩes de comentÃĄrio", "comments_and_likes": "ComentÃĄrios e gostos", @@ -866,8 +871,8 @@ "current_pin_code": "CÃŗdigo PIN atual", "current_server_address": "Endereço atual do servidor", "custom_date": "Data personalizada", - "custom_locale": "LocalizaÃ§ÃŖo Personalizada", - "custom_locale_description": "Formatar datas e nÃēmeros baseados na língua e na regiÃŖo", + "custom_locale": "LocalizaÃ§ÃŖo personalizada", + "custom_locale_description": "Formatar datas, horas e nÃēmeros baseados na língua e regiÃŖo selecionadas", "custom_url": "URL personalizado", "cutoff_date_description": "Manter fotos dos Ãēltimosâ€Ļ", "cutoff_day": "{count, plural, one {dia} other {dias}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Quantidade de dados EXIF", "deduplication_info": "InformaçÃĩes sobre remoÃ§ÃŖo de duplicados", "deduplication_info_description": "Para selecionar automaticamente itens e remover duplicados em massa, iremos ver o seguinte:", - "default_locale": "LocalizaÃ§ÃŖo PadrÃŖo", - "default_locale_description": "Formatar datas e nÃēmeros baseados na linguagem do seu navegador", "delete": "Eliminar", "delete_action_confirmation_message": "Tem a certeza de que quer eliminar este ficheiro? EstÃĄ aÃ§ÃŖo irÃĄ mover o ficheiro para a reciclagem do servidor e perguntar se quer apagÃĄ-lo localmente", "delete_action_prompt": "{count} eliminados", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "AlteraçÃĩes aplicadas com sucesso", "editor_flip_horizontal": "Espelhar na horizontal", "editor_flip_vertical": "Espelhar na vertical", + "editor_handle_corner": "Prender ao canto {corner, select, top_left {superior esquerdo} top_right {superior direito} bottom_left {inferior esquerdo} bottom_right {inferior direito} other {A}}", + "editor_handle_edge": "Prender ao limite {edge, select, top {superior} bottom {inferior} left {esquerdo} right {direito} other {}}", "editor_orientation": "OrientaÃ§ÃŖo", "editor_reset_all_changes": "Desfazer alteraçÃĩes", "editor_rotate_left": "Rodar 90° à esquerda", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "Ocorreu um erro ao atualizar o estado das notificaçÃĩes", "incorrect_email_or_password": "Email ou palavra-passe incorretos", "library_folder_already_exists": "Este caminho de importaÃ§ÃŖo jÃĄ existe.", + "page_not_found": "PÃĄgina nÃŖo encontrada", "paths_validation_failed": "Ocorreu um erro na validaÃ§ÃŖo de {paths, plural, one {# caminho} other {# caminhos}}", "profile_picture_transparent_pixels": "Imagem de perfil nÃŖo pode ter pixeis transparentes. Por favor amplie e/ou mova a imagem.", "quota_higher_than_disk_size": "Definiu uma quota maior do que o tamanho do disco", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "PESSOAS", "exif_bottom_sheet_person_add_person": "Adicionar nome", "exit_slideshow": "Sair da apresentaÃ§ÃŖo", + "expand": "Expandir", "expand_all": "Expandir tudo", "experimental_settings_new_asset_list_subtitle": "Trabalho em andamento", "experimental_settings_new_asset_list_title": "Ativar visualizaÃ§ÃŖo de grade experimental", @@ -1212,6 +1219,7 @@ "filter_description": "CondiçÃĩes para filtrar os ficheiros alvo", "filter_people": "Filtrar pessoas", "filter_places": "Filtrar lugares", + "filter_tags": "Filtrar etiquetas", "filters": "Filtros", "find_them_fast": "Encontre-as mais rapidamente pelo nome numa pesquisa", "first": "Primeiro", @@ -1642,6 +1650,7 @@ "online": "Online", "only_favorites": "Apenas favoritos", "open": "Abrir", + "open_calendar": "Abrir calendÃĄrio", "open_in_map_view": "Abrir na visualizaÃ§ÃŖo de mapa", "open_in_openstreetmap": "Abrir no OpenStreetMap", "open_the_search_filters": "Abrir os filtros de pesquisa", @@ -1801,9 +1810,8 @@ "rate_asset": "Classificar ficheiro", "rating": "ClassificaÃ§ÃŖo por estrelas", "rating_clear": "Limpar classificaÃ§ÃŖo", - "rating_count": "{count, plural, one {# estrela} other {# estrelas}}", + "rating_count": "{count, plural, =0 {Sem ClassificaÃ§ÃŖo} one {# estrela} other {# estrelas}}", "rating_description": "Mostrar a classificaÃ§ÃŖo EXIF no painel de informaçÃĩes", - "rating_set": "ClassificaÃ§ÃŖo definida para {rating, plural, one {# estrela} other {# estrelas}}", "reaction_options": "OpçÃĩes de reaÃ§ÃŖo", "read_changelog": "Ler Novidades", "readonly_mode_disabled": "Modo sÃŗ de leitura desativado", @@ -1875,7 +1883,10 @@ "reset_pin_code_success": "CÃŗdigo PIN redefinido com sucesso", "reset_pin_code_with_password": "Pode sempre repor o seu cÃŗdigo PIN com a sua palavra-passe", "reset_sqlite": "Reiniciar Base de Dados SQLite", - "reset_sqlite_confirmation": "Tem a certeza de que quer reiniciar a base de dados SQLite? Vai ter de terminar a sessÃŖo e entrar outra vez para sincronizar os dados de novo", + "reset_sqlite_clear_app_data": "Limpar Dados", + "reset_sqlite_confirmation": "Tem a certeza de que quer limpar os dados da aplicaÃ§ÃŖo? Isto irÃĄ remover todas as definiçÃĩes e terminarÃĄ a sua sessÃŖo.", + "reset_sqlite_confirmation_note": "Nota: SerÃĄ necessÃĄrio reiniciar a aplicaÃ§ÃŖo depois de limpar.", + "reset_sqlite_done": "Os dados da aplicaÃ§ÃŖo foram limpos. Por favor reinicie o Immich e inicie sessÃŖo novamente.", "reset_sqlite_success": "Base de dados SQLite reiniciada com sucesso", "reset_to_default": "Repor predefiniçÃĩes", "resolution": "ResoluÃ§ÃŖo", @@ -1903,6 +1914,7 @@ "saved_settings": "DefiniçÃĩes guardadas", "say_something": "Diga alguma coisa", "scaffold_body_error_occurred": "Ocorreu um erro", + "scaffold_body_error_unrecoverable": "Ocorreu um erro irrecuperÃĄvel. Por favor partilhe o erro e a \"stack trace\" no Discord ou no GitHub para o podermos ajudar. Se tal lhe for pedido, pode limpar os dados da aplicaÃ§ÃŖo em baixo.", "scan": "Analisar", "scan_all_libraries": "Analisar todas as bibliotecas", "scan_library": "Analisar", @@ -1938,6 +1950,7 @@ "search_filter_ocr": "Pesquisar por OCR", "search_filter_people_title": "Selecionar pessoas", "search_filter_star_rating": "ClassificaÃ§ÃŖo", + "search_filter_tags_title": "Selecionar etiquetas", "search_for": "Pesquisar por", "search_for_existing_person": "Pesquisar por pessoas existentes", "search_no_more_result": "Sem mais resultados", @@ -2017,6 +2030,9 @@ "set_profile_picture": "Definir foto de perfil", "set_slideshow_to_fullscreen": "ApresentaÃ§ÃŖo em ecrÃŖ inteiro", "set_stack_primary_asset": "Definir como ficheiro principal", + "setting_image_navigation_enable_subtitle": "Se ativado, pode navegar entre as imagens seguintes e anteriores ao tocar nas partes esquerda e direita do ecrÃŖ.", + "setting_image_navigation_enable_title": "Tocar para Navegar", + "setting_image_navigation_title": "NavegaÃ§ÃŖo de Imagens", "setting_image_viewer_help": "O visualizador carrega primeiro a miniatura pequena, depois carrega a visualizaÃ§ÃŖo de tamanho mÊdio (se ativado) e, finalmente, carrega o original (se ativado).", "setting_image_viewer_original_subtitle": "Ative para carregar a imagem original em resoluÃ§ÃŖo total (grande!). Desative para reduzir o uso de dados (na rede e no cache do dispositivo).", "setting_image_viewer_original_title": "Carregar imagem original", @@ -2183,6 +2199,7 @@ "support": "Apoio", "support_and_feedback": "Apoio e feedback", "support_third_party_description": "A sua instalaÃ§ÃŖo do Immich foi empacotada por terceiros. Quaisquer problemas que possa vir a ter poderÃŖo ser causados por esse pacote, por isso, em primeiro lugar, relate problemas aos criadores desse pacote utilizando os links abaixo.", + "supporter": "Apoiante", "swap_merge_direction": "Alternar direÃ§ÃŖo da uniÃŖo", "sync": "Sincronizar", "sync_albums": "Sincronizar ÃĄlbuns", @@ -2294,6 +2311,7 @@ "unstack_action_prompt": "{count} desempilhados", "unstacked_assets_count": "Desempilhados {count, plural, one {# ficheiro} other {# ficheiros}}", "unsupported_field_type": "Tipo de campo nÃŖo suportado", + "unsupported_file_type": "O ficheiro {file} nÃŖo pôde ser carregado porque o seu tipo de ficheiro {type} nÃŖo Ê suportado.", "untagged": "Sem etiqueta", "untitled_workflow": "Fluxo de trabalho sem nome", "up_next": "A seguir", @@ -2320,6 +2338,8 @@ "url": "URL", "usage": "UtilizaÃ§ÃŖo", "use_biometric": "Utilizar dados biomÊtricos", + "use_browser_locale": "Utilizar localizaÃ§ÃŖo do browser", + "use_browser_locale_description": "Formatar datas, horas e nÃēmeros com base na localizaÃ§ÃŖo do browser", "use_current_connection": "Utilizar a ligaÃ§ÃŖo atual", "use_custom_date_range": "Utilizar um intervalo de datas personalizado", "user": "Utilizador", diff --git a/i18n/pt_BR.json b/i18n/pt_BR.json index 7f2845fc53..b35fa25b4b 100644 --- a/i18n/pt_BR.json +++ b/i18n/pt_BR.json @@ -311,7 +311,7 @@ "search_jobs": "Pesquisar tarefasâ€Ļ", "send_welcome_email": "Enviar e-mail de boas-vindas", "server_external_domain_settings": "Domínio externo", - "server_external_domain_settings_description": "Domínio para links pÃēblicos compartilhados, incluindo http(s)://", + "server_external_domain_settings_description": "Domínio utilizado para acesso externo", "server_public_users": "UsuÃĄrios pÃēblicos", "server_public_users_description": "Todos os usuÃĄrios (nome e e-mail) serÃŖo exibidos na lista de adicionar usuÃĄrios em ÃĄlbuns compartilhados. Quando desativado, essa lista de usuÃĄrios sÃŗ serÃĄ visível aos administradores.", "server_settings": "ConfiguraçÃĩes do servidor", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapeamento de tons", "transcoding_tone_mapping_description": "Tenta preservar a aparÃĒncia dos vídeos HDR quando convertidos para SDR. Cada algoritmo faz compensaçÃĩes diferentes em termos de cor, detalhes e brilho. Hable preserva os detalhes, Mobius preserva as cores e Reinhard preserva o brilho.", "transcoding_transcode_policy": "Política de transcodificaÃ§ÃŖo", - "transcoding_transcode_policy_description": "Política para quando um vídeo deve ser transcodificado. Os vídeos HDR sempre serÃŖo transcodificados (exceto se a transcodificaÃ§ÃŖo estiver desativada).", + "transcoding_transcode_policy_description": "Política para quando um vídeo deve ser transcodificado. Os vídeos HDR e vídeos com formato diferente que YUV 4:2:0 serÃŖo sempre transcodificados (exceto se a transcodificaÃ§ÃŖo estiver desativada).", "transcoding_two_pass_encoding": "CodificaÃ§ÃŖo de duas passagens", "transcoding_two_pass_encoding_setting_description": "Transcodifique em duas passagens para produzir vídeos melhor codificados. Quando a taxa de bits mÃĄxima estÃĄ habilitada (necessÃĄria para funcionar com H.264 e HEVC), este modo usa um intervalo de taxa de bits baseado na taxa de bits mÃĄxima e ignora o CRF. Para VP9, o CRF pode ser usado se a taxa de bits mÃĄxima estiver desabilitada.", "transcoding_video_codec": "Codec de vídeo", @@ -453,7 +453,7 @@ "advanced": "Avançado", "advanced_settings_clear_image_cache": "Limpar cache de imagens", "advanced_settings_clear_image_cache_error": "Falha ao limpar o cache de imagens", - "advanced_settings_clear_image_cache_success": "Limpeza concluída com sucesso {size}", + "advanced_settings_clear_image_cache_success": "Foram liberados {size} com sucesso", "advanced_settings_enable_alternate_media_filter_subtitle": "Use esta opÃ§ÃŖo para filtrar mídias durante a sincronizaÃ§ÃŖo com base em critÊrios alternativos. Tente esta opÃ§ÃŖo somente se o aplicativo estiver com problemas para detectar todos os ÃĄlbuns.", "advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Utilizar filtro alternativo de sincronizaÃ§ÃŖo de ÃĄlbum de dispositivo", "advanced_settings_log_level_title": "Nível de log: {level}", @@ -782,7 +782,7 @@ "client_cert_import": "Importar", "client_cert_import_success_msg": "Certificado do cliente importado", "client_cert_invalid_msg": "Arquivo de certificado invÃĄlido ou senha errada", - "client_cert_password_message": "Entre com a senha para esse certificado", + "client_cert_password_message": "Digite a senha deste certificado", "client_cert_password_title": "Senha do certificado", "client_cert_remove_msg": "Certificado do cliente removido", "client_cert_subtitle": "Suporta apenas o formato PKCS12 (.p12, .pfx). A importaÃ§ÃŖo/remoÃ§ÃŖo de certificados estÃĄ disponível apenas antes do login", @@ -794,6 +794,11 @@ "color": "Cor", "color_theme": "Tema de cores", "command": "Comando", + "command_palette_prompt": "Encontre rapidamente pÃĄginas, açÃĩes ou comandos", + "command_palette_to_close": "para fechar", + "command_palette_to_navigate": "para entrar", + "command_palette_to_select": "para selecionar", + "command_palette_to_show_all": "para mostrar tudo", "comment_deleted": "ComentÃĄrio excluído", "comment_options": "OpçÃĩes de comentÃĄrio", "comments_and_likes": "ComentÃĄrios e curtidas", @@ -866,8 +871,8 @@ "current_pin_code": "CÃŗdigo PIN atual", "current_server_address": "Endereço atual do servidor", "custom_date": "Data específica", - "custom_locale": "LocalizaÃ§ÃŖo Customizada", - "custom_locale_description": "Formatar datas e nÃēmeros baseado no idioma e na regiÃŖo", + "custom_locale": "Localidade customizada", + "custom_locale_description": "Formata as datas, horas e nÃēmeros baseado no idioma e regiÃŖo selecionada", "custom_url": "URL personalizada", "cutoff_date_description": "Manter fotos dos Ãēltimosâ€Ļ", "cutoff_day": "{count, plural, one {dia} other {dias}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Quantidade de dados EXIF", "deduplication_info": "InformaçÃĩes", "deduplication_info_description": "Ao selecionar os arquivos que serÃŖo marcados para remoÃ§ÃŖo por duplicidade, serÃĄ considerado os parÃĸmetros:", - "default_locale": "LocalizaÃ§ÃŖo PadrÃŖo", - "default_locale_description": "Formatar datas e nÃēmeros baseados na linguagem do seu navegador", "delete": "Excluir", "delete_action_confirmation_message": "Tem certeza? O arquivo serÃĄ enviado para a lixeira do servidor, depois vocÃĒ poderÃĄ confirmar se deseja tambÊm deletar do seu dispositivo local", "delete_action_prompt": "{count} deletados", @@ -999,11 +1002,13 @@ "editor_confirm_reset_all_changes": "Tem certeza que deseja desfazer todas alteraçÃĩes?", "editor_discard_edits_confirm": "Descartar alteraçÃĩes", "editor_discard_edits_prompt": "VocÃĒ possui alteraçÃĩes que nÃŖo foram salvas. Tem certeza que deseja descarta-las?", - "editor_discard_edits_title": "Desfazer as alteraçÃĩes?", - "editor_edits_applied_error": "Falhou ao salvar as alteraçÃĩes", + "editor_discard_edits_title": "Descartar as alteraçÃĩes?", + "editor_edits_applied_error": "Falha ao salvar as alteraçÃĩes", "editor_edits_applied_success": "AlteraçÃĩes salvas com sucesso", "editor_flip_horizontal": "Virar na horizontal", "editor_flip_vertical": "Virar na vertical", + "editor_handle_corner": "Controle de canto {corner, select, top_left {superior esquerdo} top_right {superior direito} bottom_left {inferior esquerdo} bottom_right {inferior direito} other {geral}}", + "editor_handle_edge": "Controle de borda {edge, select, top {superior} bottom {inferior} left {esquerda} right {direita} other {geral}}", "editor_orientation": "OrientaÃ§ÃŖo", "editor_reset_all_changes": "Desfazer alteraçÃĩes", "editor_rotate_left": "Girar 90° em sentido anti-horÃĄrio", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "Falha ao atualizar o status da notificaÃ§ÃŖo", "incorrect_email_or_password": "E-mail ou senha incorretos", "library_folder_already_exists": "Este caminho de importaÃ§ÃŖo jÃĄ existe.", + "page_not_found": "PÃĄgina nÃŖo encontrada", "paths_validation_failed": "A validaÃ§ÃŖo de {paths, plural, one {# caminho falhou} other {# caminhos falharam}}", "profile_picture_transparent_pixels": "As imagens de perfil nÃŖo podem ter pixels transparentes. Aumente o zoom e/ou mova a imagem.", "quota_higher_than_disk_size": "VocÃĒ definiu uma cota maior do que o tamanho do disco", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "PESSOAS", "exif_bottom_sheet_person_add_person": "Adicionar nome", "exit_slideshow": "Sair da apresentaÃ§ÃŖo", + "expand": "Expandir", "expand_all": "Expandir tudo", "experimental_settings_new_asset_list_subtitle": "Em andamento", "experimental_settings_new_asset_list_title": "Ativar grade de fotos experimental", @@ -1212,6 +1219,7 @@ "filter_description": "CondiçÃĩes para filtrar os arquivos enviados", "filter_people": "Filtrar pessoas", "filter_places": "Filtrar lugares", + "filter_tags": "Filtrar marcadores", "filters": "Filtros", "find_them_fast": "Encontre pelo nome em uma pesquisa", "first": "Primeiro", @@ -1642,6 +1650,8 @@ "online": "Conectado", "only_favorites": "Somente favoritos", "open": "Abrir", + "open_calendar": "Abrir calendÃĄrio", + "open_in_browser": "Abrir no navegador", "open_in_map_view": "Mostrar no mapa", "open_in_openstreetmap": "Abrir no OpenStreetMap", "open_the_search_filters": "Abre os filtros de pesquisa", @@ -1801,9 +1811,8 @@ "rate_asset": "Classificar arquivo", "rating": "Estrelas", "rating_clear": "Limpar classificaÃ§ÃŖo", - "rating_count": "{count, plural, one {# estrela} other {# estrelas}}", + "rating_count": "{count, plural, =0 {Sem ClassificaÃ§ÃŖo} one {# estrela} other {# estrelas}}", "rating_description": "Exibir o EXIF de classificaÃ§ÃŖo no painel de informaçÃĩes", - "rating_set": "ClassificaÃ§ÃŖo alterada para {rating, plural, one {# estrela} other {# estrelas}}", "reaction_options": "OpçÃĩes de reaÃ§ÃŖo", "read_changelog": "Ler Novidades", "readonly_mode_disabled": "Modo apenas visualizaÃ§ÃŖo desativado", @@ -1875,7 +1884,10 @@ "reset_pin_code_success": "cÃŗdigo PIN alterado com sucesso", "reset_pin_code_with_password": "VocÃĒ sempre poderÃĄ redefinir seu cÃŗdigo PIN usando a sua senha", "reset_sqlite": "Redefinir o Banco de Dados SQLite", - "reset_sqlite_confirmation": "Realmente deseja redefinir o banco de dados SQLite? SerÃĄ necessÃĄrio sair e entrar em sua conta novamente para ressincronizar os dados", + "reset_sqlite_clear_app_data": "Limpar dados", + "reset_sqlite_confirmation": "Realmente deseja limpar os dados do aplicativo? Isto removerÃĄ todas as configuraçÃĩes e sairÃĄ da sua conta.", + "reset_sqlite_confirmation_note": "Nota: VocÃĒ terÃĄ que reiniciar o app depois da limpeza.", + "reset_sqlite_done": "Os dados do App foram apagados. Por favor reinicie o Immich e faça log in novamente.", "reset_sqlite_success": "Banco de dados SQLite redefinido com sucesso", "reset_to_default": "Redefinir para a configuraÃ§ÃŖo padrÃŖo", "resolution": "ResoluÃ§ÃŖo", @@ -1903,6 +1915,7 @@ "saved_settings": "ConfiguraçÃĩes salvas", "say_something": "Diga algo", "scaffold_body_error_occurred": "Ocorreu um erro", + "scaffold_body_error_unrecoverable": "Ocorreu um erro irrecuperÃĄvel. Por favor compartilhe o erro e o \"stack trace\" no Discord ou no GitHub para o podermos ajudar. Se recomendado pela comunidade, pode limpar os dados da aplicaÃ§ÃŖo abaixo.", "scan": "Escanear", "scan_all_libraries": "Escanear Todas Bibliotecas", "scan_library": "Escanear", @@ -1938,6 +1951,7 @@ "search_filter_ocr": "Buscar por OCR", "search_filter_people_title": "Selecione pessoas", "search_filter_star_rating": "AvaliaÃ§ÃŖo", + "search_filter_tags_title": "Escolher marcadores", "search_for": "Pesquisar por", "search_for_existing_person": "Pesquisar por pessoas", "search_no_more_result": "NÃŖo hÃĄ mais resultados", @@ -2017,6 +2031,9 @@ "set_profile_picture": "Definir foto de perfil", "set_slideshow_to_fullscreen": "ApresentaÃ§ÃŖo em tela cheia", "set_stack_primary_asset": "Selecionar como arquivo principal", + "setting_image_navigation_enable_subtitle": "Ative para habilitar a navegaÃ§ÃŖo para a imagem anterior/seguinte ao tocar na lateral esquerda/direita da tela.", + "setting_image_navigation_enable_title": "Tocar para navegar", + "setting_image_navigation_title": "NavegaÃ§ÃŖo de Imagens", "setting_image_viewer_help": "O visualizador de imagens carrega primeiro a miniatura pequena, depois carrega a imagem de tamanho mÊdio (se ativado) e, por fim, carrega o original (se ativado).", "setting_image_viewer_original_subtitle": "Ative para carregar a imagem original em resoluÃ§ÃŖo mÃĄxima (grande!). Desative para reduzir o uso de dados (tanto na rede quanto no cache do dispositivo).", "setting_image_viewer_original_title": "Carregar imagem original", @@ -2183,6 +2200,7 @@ "support": "Ajuda", "support_and_feedback": "Ajuda & Feedback", "support_third_party_description": "Sua instalaÃ§ÃŖo do Immich Ê fornecida por terceiros. É possível que problemas sejam causados por eles, por isso, se tiver problemas, procure primeiro ajuda com eles utilizando os links abaixo.", + "supporter": "Colaborador", "swap_merge_direction": "Alternar direÃ§ÃŖo da mesclagem", "sync": "Sincronizar", "sync_albums": "Sincronizar ÃĄlbuns", @@ -2294,6 +2312,7 @@ "unstack_action_prompt": "{count} desagrupados", "unstacked_assets_count": "{count, plural, one {# arquivo retirado} other {# arquivos retirados}} do grupo", "unsupported_field_type": "Tipo de campo nÃŖo suportado", + "unsupported_file_type": "O arquivo {file} nÃŖo foi enviado porque o formato {type} nÃŖo Ê suportado.", "untagged": "Marcador removido", "untitled_workflow": "Fluxo sem título", "up_next": "A seguir", @@ -2320,6 +2339,8 @@ "url": "URL", "usage": "Uso", "use_biometric": "Usar biometria", + "use_browser_locale": "Utilizar o locale do browser", + "use_browser_locale_description": "Formatar datas, horas e nÃēmeros com base na localidade do navegador", "use_current_connection": "Usar a conexÃŖo atual", "use_custom_date_range": "Usar intervalo de datas personalizado", "user": "UsuÃĄrio", diff --git a/i18n/ro.json b/i18n/ro.json index b36ae22d36..9e097b4d20 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "copie externă ÃŽn cloud sau ÃŽntr-o altă locație fizică.", "backup_onboarding_2_description": "copii locale pe diferite dispozitive. Include fișierele principale și o copie de rezervă a acestor fișiere la nivel local.", "backup_onboarding_3_description": "numărul total de copii ale datelor dvs., inclusiv fișierele originale. Aceasta include 1 copie externă și 2 copii locale.", - "backup_onboarding_description": "Pentru a vă proteja datele, vă recomandăm să utilizați strategia de backup 3-2-1. Pentru o soluție completă de backup, ar trebui să păstrați copii ale fotografiilor/videoclipurilor ÃŽncărcate, precum și ale bazei de date Immich.", + "backup_onboarding_description": "Pentru a vă proteja datele, vă recomandăm să utilizați strategia de backup 3-2-1. Pentru o soluție completă de backup, ar trebui să păstrați copii ale fotografiilor/videoclipurilor ÃŽncărcate, precum și ale bazei de date Immich.", "backup_onboarding_footer": "Pentru mai multe informații despre copierea de rezervă a Immich, consultați documentația.", "backup_onboarding_parts_title": "O copie de rezervă 3-2-1 include:", "backup_onboarding_title": "Copii de rezervă", @@ -105,7 +105,7 @@ "image_preview_quality_description": "Calitatea previzualizării de la 1 la 100. O valoare mai mare oferă o calitate mai bună, dar produce fișiere mai mari și poate reduce receptivitatea aplicației. Setarea unei valori scăzute poate afecta calitatea ÃŽnvățării automate.", "image_preview_title": "Previzualizați setările", "image_progressive": "Progresiv", - "image_progressive_description": "Encodează imaginile JPEG progresiv, pentru ÃŽncărcare graduală.Fără efect pentru imaginile WebP", + "image_progressive_description": "Encodează imaginile JPEG progresiv, pentru ÃŽncărcare graduală. Fără efect pentru imaginile WebP.", "image_quality": "Calitate", "image_resolution": "Rezolutie", "image_resolution_description": "Rezoluțiile mai mari pot păstra mai multe detalii, dar necesită mai mult timp pentru a fi codificate, au dimensiuni mai mari ale fișierelor și pot reduce răspunsul aplicației.", @@ -311,7 +311,7 @@ "search_jobs": "Caută job-uriâ€Ļ", "send_welcome_email": "Trimite email de bun-venit", "server_external_domain_settings": "Domeniu extern", - "server_external_domain_settings_description": "Domeniu pentru distribuire publicĮŽ a scurtĮŽturilor, incluzÃĸnd http(s)://", + "server_external_domain_settings_description": "Domeniu utilizat pentru link-uri externe", "server_public_users": "Utilizatori publici", "server_public_users_description": "Toți utilizatorii (nume și e-mail) sunt listați atunci cÃĸnd adăugați un utilizator la albumele partajate. CÃĸnd este dezactivată, lista de utilizatori va fi disponibilă numai pentru utilizatorii admin.", "server_settings": "SetĮŽri Server", @@ -359,7 +359,7 @@ "transcoding_acceleration_api": "API de accelerare", "transcoding_acceleration_api_description": "API-ul care va interacționa cu dispozitivul tău pentru a accelera transcodarea. Această setare este 'cel mai bun efort': va reveni la transcodarea software ÃŽn caz de eșec. VP9 poate funcționa sau nu, ÃŽn funcție de hardware-ul tău.", "transcoding_acceleration_nvenc": "NVENC (necesitĮŽ GPU NVIDIA)", - "transcoding_acceleration_qsv": "Sincronizare Rapidă (necesitĮŽ CPU Intel de generația a 7-a sau mai mare)", + "transcoding_acceleration_qsv": "Quick Sync (necesitĮŽ CPU Intel de generația a 7-a sau mai mare)", "transcoding_acceleration_rkmpp": "RKMPP (doar pe SOC-uri Rockchip)", "transcoding_acceleration_vaapi": "VAAPI", "transcoding_accepted_audio_codecs": "Codecuri audio acceptate", @@ -383,7 +383,7 @@ "transcoding_hardware_acceleration": "Accelerare hardware", "transcoding_hardware_acceleration_description": "Experimental: transcodare mai rapidă, dar poate reduce calitatea la aceeași rată de biți", "transcoding_hardware_decoding": "Decodare hardware", - "transcoding_hardware_decoding_setting_description": "Se aplică doar pentru NVENC, QSV și RKMPP. Activează accelerarea completă ÃŽn loc de doar accelerarea codificării. S-ar putea să nu funcționeze pentru toate videoclipurile.", + "transcoding_hardware_decoding_setting_description": "Activează accelerarea completă ÃŽn loc de doar accelerarea codificării. S-ar putea să nu funcționeze pentru toate videoclipurile.", "transcoding_max_b_frames": "Număr maxim de cadre B", "transcoding_max_b_frames_description": "Valorile mai mari ÃŽmbunătățesc eficiența compresiei, dar ÃŽncetinesc codarea. Este posibil să nu fie compatibile cu accelerarea hardware pe dispozitivele mai vechi. 0 dezactivează cadrele B, ÃŽn timp ce -1 setează această valoare automat.", "transcoding_max_bitrate": "Rata de biți maximă", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Mapare tonuri", "transcoding_tone_mapping_description": "Încearcă să păstreze aspectul videoclipurilor HDR atunci cÃĸnd sunt convertite ÃŽn SDR. Fiecare algoritm face compromisuri diferite pentru culoare, detalii și strălucire. Hable păstrează detaliile, Mobius păstrează culoarea, iar Reinhard păstrează strălucirea.", "transcoding_transcode_policy": "Politica de transcodare", - "transcoding_transcode_policy_description": "Politica pentru momentul cÃĸnd un videoclip ar trebui să fie transcodificat. Videoclipurile HDR vor fi ÃŽntotdeauna transcodificate (cu excepția cazului ÃŽn care transcodarea este dezactivată).", + "transcoding_transcode_policy_description": "Politica pentru momentul cÃĸnd un videoclip ar trebui să fie transcodificat. Videoclipurile HDR și cele cu un format de pixeli diferit de YUV 4:2:0, vor fi ÃŽntotdeauna transcodificate (cu excepția cazului ÃŽn care transcodarea este dezactivată).", "transcoding_two_pass_encoding": "Codare ÃŽn doi pași", "transcoding_two_pass_encoding_setting_description": "Transcodificare ÃŽn două treceri pentru a produce videoclipuri codificate mai bine. CÃĸnd rata maximă de biți este activată (necesară pentru a funcționa cu H.264 și HEVC), acest mod utilizează un interval de rată de biți bazat pe rata maximă de biți și ignoră CRF. Pentru VP9, CRF poate fi utilizat dacă rata maximă de biți este dezactivată.", "transcoding_video_codec": "Codec video", @@ -513,7 +513,7 @@ "albums_default_sort_order_description": "Ordinea inițială de sortare a pozelor la crearea de albume noi.", "albums_feature_description": "Colecții de date care pot fi partajate cu alți utilizatori.", "albums_on_device_count": "{count} albume pe dispozitiv", - "albums_selected": "{număr, plural, unul {# album selectat} altele {# albumuri selectate}}", + "albums_selected": "{count, plural, one {# album selectat} few {# albume selectate} other {# de albume selectate}}", "all": "Toate", "all_albums": "Toate albumele", "all_people": "Toți oamenii", @@ -600,7 +600,7 @@ "assets_moved_to_trash_count": "Am mutat {count, plural, one {# resursă} other {# resurse}} ÃŽn coșul de gunoi", "assets_permanently_deleted_count": "Șters permanent {count, plural, one {# resursă} other {# resurse}}", "assets_removed_count": "Eliminat {count, plural, one {# resursă} other {# resurse}}", - "assets_removed_permanently_from_device": "{count} resurse eliminate permanent din dispozitivul dvs.", + "assets_removed_permanently_from_device": "{count} resurse eliminate permanent de pe dispozitivul dvs", "assets_restore_confirmation": "Ești sigur că vrei să restaurezi toate resursele tale din coșul de gunoi? Nu poți anula această acțiune! Ține minte că resursele offline nu se restaurează astfel.", "assets_restored_count": "Restaurat {count, plural, one {# resursă} other {# resurse}}", "assets_restored_successfully": "{count} resursă(e) restaurate cu succes", @@ -720,8 +720,8 @@ "camera": "CamerĮŽ", "camera_brand": "MarcĮŽ cameră", "camera_model": "Model cameră", - "cancel": "Anuleaza", - "cancel_search": "Anuleaza căutarea", + "cancel": "Anulează", + "cancel_search": "Anulează căutarea", "canceled": "Anulat", "canceling": "În curs de anulare", "cannot_merge_people": "Nu se pot ÃŽmbina persoanele", @@ -766,14 +766,14 @@ "cleanup_found_assets": "Am găsit {count} materiale in copia de rezerva", "cleanup_found_assets_with_size": "{count} obiecte găsite ({size})", "cleanup_icloud_shared_albums_excluded": "Albumele partajate iCLoud sunt excluse de la cautare", - "cleanup_no_assets_found": "Nu au fost găsite fișiere care să corespundă criteriilor de mai sus. „Eliberare spațiu” poate șterge doar fișierele care au fost deja salvate pe server.", + "cleanup_no_assets_found": "Nu au fost găsite fișiere care să corespundă criteriilor de mai sus. „Eliberare spațiu” poate șterge doar fișierele care au fost deja salvate pe server", "cleanup_preview_title": "Materiale sa fie șterse ({count})", "cleanup_step3_description": "Scanează fișierele salvate pe server care corespund setărilor tale de dată și păstrare.", - "cleanup_step4_summary": "{count} elemente create ÃŽnainte de {date} sunt puse ÃŽn coadă pentru a fi eliminate de pe dispozitiv", + "cleanup_step4_summary": "{count} elemente (create ÃŽnainte de {date}) de șters de pe dispozitivul local. Pozele vor rămÃĸne accesibile din aplicația Immich.", "cleanup_trash_hint": "Pentru a recupera complet spațiu de stocare, deschideți aplicația Galerie și goliți coșul de gunoi", - "clear": "Curățați", - "clear_all": "Curățați tot", - "clear_all_recent_searches": "Curățați toate căutările recente", + "clear": "Șterge", + "clear_all": "Șterge tot", + "clear_all_recent_searches": "Șterge toate căutările recente", "clear_file_cache": "Ștergeți memoria cache a fișierelor", "clear_message": "Ștergeți mesajul", "clear_value": "Ștergeți valoarea", @@ -794,6 +794,11 @@ "color": "Culoare", "color_theme": "Tema de culoare", "command": "Comandă", + "command_palette_prompt": "Găsește rapid pagini, acțiuni sau comenzi", + "command_palette_to_close": "pentru ÃŽnchidere", + "command_palette_to_navigate": "pentru accesare", + "command_palette_to_select": "pentru a selecta", + "command_palette_to_show_all": "pentru a afișa tot", "comment_deleted": "Comentariu șters", "comment_options": "Opțiuni comentariu", "comments_and_likes": "Comentarii & aprecieri", @@ -866,11 +871,11 @@ "current_pin_code": "Codul PIN actual", "current_server_address": "Adresa actuală a serverului", "custom_date": "Data personalizată", - "custom_locale": "Setare Regională Personalizată", - "custom_locale_description": "Formatați datele și numerele ÃŽn funcție de limbă și regiune", + "custom_locale": "Setare regională personalizată", + "custom_locale_description": "Formatați datele, timpul și numerele ÃŽn funcție de limbă și regiune", "custom_url": "URL personalizat", "cutoff_date_description": "Păstrează fotografiile din ultimeleâ€Ļ", - "cutoff_day": "{număr, plural, o {day} mai multe {days}}", + "cutoff_day": "{count, plural, one {# zi} few {# zile} other {# de zile}}", "cutoff_year": "{count, plural, =0 {0 ani} one {# an} few {# ani} other {# de ani}}", "daily_title_text_date": "E, LLL zz", "daily_title_text_date_year": "E, LLL zz, aaaa", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "Numărul de date EXIF", "deduplication_info": "Informați despre deduplicare", "deduplication_info_description": "Ca să preselecționăm activele și să scoatem duplicatele ÃŽn vrac , ne uităm la:", - "default_locale": "Setare Regională Implicită", - "default_locale_description": "Formatați datele și numerele ÃŽn funcție de regiunea browserului dvs", "delete": "Ștergere", "delete_action_confirmation_message": "Sigur vrei să ștergi acest element? Această acțiune va muta elementul ÃŽn coșul de gunoi al serverului și te va ÃŽntreba dacă vrei să-l ștergi local", "delete_action_prompt": "{count} șterse", @@ -909,7 +912,7 @@ "delete_library": "Ștergere biblioteca", "delete_link": "Ștergere link", "delete_local_action_prompt": "{count} șterse local", - "delete_local_dialog_ok_backed_up_only": "Șterge doar fișierele pentru care s-a făcut backup", + "delete_local_dialog_ok_backed_up_only": "Șterge doar cele cu backup", "delete_local_dialog_ok_force": "Șterge oricum", "delete_others": "Ștergeți celelalte", "delete_permanently": "Șterge permanent", @@ -1021,7 +1024,7 @@ "enqueued": "Pus ÃŽn coadă", "enter_wifi_name": "Introduceți numele rețelei Wi-Fi", "enter_your_pin_code": "Introduceți codul PIN", - "enter_your_pin_code_subtitle": "Introduceți codul PIN pentru a accesa folderul blocat", + "enter_your_pin_code_subtitle": "Introdu codul PIN pentru a accesa dosarul blocat", "error": "Eroare", "error_change_sort_album": "Nu s-a putut modifica ordinea de sortare a albumului", "error_delete_face": "Eroare la ștergerea feței din activ", @@ -1069,6 +1072,7 @@ "failed_to_update_notification_status": "Nu s-a putut actualiza starea notificării", "incorrect_email_or_password": "E-mail sau parolă incorect/ă", "library_folder_already_exists": "Această cale de import există deja.", + "page_not_found": "Pagina nu a fost găsită", "paths_validation_failed": "{paths, plural, one {# cale} other {# căi}} nu a trecut validarea", "profile_picture_transparent_pixels": "Pozele de profil nu pot avea pixeli transparenți. Te rugăm să mărești imaginea și/sau să o muți.", "quota_higher_than_disk_size": "Ați stabilit o valoare a spațiului de stocare mai mare decÃĸt dimensiunea discului", @@ -1168,6 +1172,7 @@ "exif_bottom_sheet_people": "PERSOANE", "exif_bottom_sheet_person_add_person": "Adaugă nume", "exit_slideshow": "Ieșire din Prezentare", + "expand": "Extinde", "expand_all": "Extindeți-le pe toate", "experimental_settings_new_asset_list_subtitle": "Acțiune ÃŽn desfășurare", "experimental_settings_new_asset_list_title": "Activează grila experimentală de fotografii", @@ -1212,6 +1217,7 @@ "filter_description": "Condiții pentru filtrarea activelor țintă", "filter_people": "Filtrați persoanele", "filter_places": "Filtrează locurile", + "filter_tags": "Filtrează etichete", "filters": "Filtre", "find_them_fast": "Găsiți-le rapid prin căutare după nume", "first": "Primul", @@ -1279,8 +1285,8 @@ "home_page_favorite_err_local": "Resursele locale nu pot fi adăugate la favorite ÃŽncă, omitere", "home_page_favorite_err_partner": "Momentan nu se pot adăuga fișierele partenerului la favorite, omitere", "home_page_first_time_notice": "Dacă este prima dată cÃĸnd utilizezi aplicația, te rugăm să te asiguri că alegi unul sau mai multe albume de backup, astfel ÃŽncÃĸt cronologia să poată fi populată cu fotografiile și videoclipurile din aceste albume", - "home_page_locked_error_local": "Nu se pot muta resursele locale ÃŽn folderul blocat, se omit", - "home_page_locked_error_partner": "Nu se pot muta resursele partenerului ÃŽn folderul blocat, omit", + "home_page_locked_error_local": "Nu se pot muta resursele locale ÃŽn dosarul blocat, se omit", + "home_page_locked_error_partner": "Nu se pot muta resursele partenerului ÃŽn dosarul blocat, omit", "home_page_share_err_local": "Nu se pot distribui fișiere locale prin link, omitere", "home_page_upload_err_limit": "Se pot ÃŽncărca maxim 30 de resurse odată, omitere", "host": "Gazdă", @@ -1462,7 +1468,7 @@ "maintenance_restore_library_loading": "Încarc verificările de integritate si euristiceâ€Ļ", "maintenance_task_backup": "Creez backupul bazei de date existenteâ€Ļ", "maintenance_task_migrations": "Rulez migrările bazei de dateâ€Ļ", - "maintenance_task_restore": "Restaurez backupul alesâ€Ļ", + "maintenance_task_restore": "Se restaureză backupulâ€Ļ", "maintenance_task_rollback": "Restaurarea a eșuat, ÃŽntorc la punctul de restaurareâ€Ļ", "maintenance_title": "Temporar indisponibil", "make": "Marcă", @@ -1536,7 +1542,7 @@ "more": "Mai mult", "move": "Mută", "move_down": "Mută ÃŽn jos", - "move_off_locked_folder": "Mutați din folderul blocat", + "move_off_locked_folder": "Mutați din dosarul blocat", "move_to": "Mutare la", "move_to_device_trash": "Mutare ÃŽn coșul de gunoi al dispozitivului", "move_to_lock_folder_action_prompt": "{count} adăugate ÃŽn dosarul blocat", @@ -1568,7 +1574,7 @@ "new_password": "Parolă nouă", "new_person": "PersoanĮŽ nouĮŽ", "new_pin_code": "Cod PIN nou", - "new_pin_code_subtitle": "Aceasta este prima dată cÃĸnd accesați folderul blocat. Creați un cod PIN pentru a accesa ÃŽn siguranță această pagină", + "new_pin_code_subtitle": "Aceasta este prima dată cÃĸnd accesați dosarul blocat. Creați un cod PIN pentru a accesa ÃŽn siguranță această pagină", "new_timeline": "Noua cronologie", "new_update": "Nouă actualizare", "new_user_created": "Utilizator nou creat", @@ -1583,7 +1589,7 @@ "no_albums_with_name_yet": "Se pare că nu aveți ÃŽncă niciun album cu acest nume.", "no_albums_yet": "Se pare că nu aveți ÃŽncă niciun album.", "no_archived_assets_message": "Arhivați fotografii și videoclipuri pentru a le ascunde din vizualizarea fotografii", - "no_assets_message": "Apasă pentru a ÃŽncărca prima ta fotografie.", + "no_assets_message": "Apasă pentru a ÃŽncărca prima ta fotografie", "no_assets_to_show": "Nicio resursă de afișat", "no_cast_devices_found": "Nu s-au găsit dispozitive de difuzare", "no_checksum_local": "Nu există checksum – nu se pot prelua resursele locale", @@ -1598,7 +1604,7 @@ "no_libraries_message": "Creați o bibliotecă externă pentru a vă vizualiza fotografiile și videoclipurile", "no_local_assets_found": "Nicio resursă locală găsită cu acest checksum", "no_location_set": "Locație neconfigurată", - "no_locked_photos_message": "Fotografiile și videoclipurile din folderul blocat sunt ascunse și nu vor apărea atunci cÃĸnd răsfoiți sau căutați ÃŽn bibliotecă.", + "no_locked_photos_message": "Fotografiile și videoclipurile din dosarul blocat sunt ascunse și nu vor apărea atunci cÃĸnd răsfoiți sau căutați ÃŽn bibliotecă.", "no_name": "Fără Nume", "no_notifications": "Nicio notificare", "no_people_found": "Nu au fost găsite persoane potrivite căutării", @@ -1642,6 +1648,8 @@ "online": "Online", "only_favorites": "Doar favorite", "open": "Deschide", + "open_calendar": "Deschide calendarul", + "open_in_browser": "Deschide ÃŽn browser", "open_in_map_view": "Deschideți ÃŽn vizualizarea hărții", "open_in_openstreetmap": "Deschideți ÃŽn OpenStreetMap", "open_the_search_filters": "Deschideți filtrele de căutare", @@ -1800,10 +1808,9 @@ "queue_status": "Se pun ÃŽn coadă {count}/{total}", "rate_asset": "Dă o notă", "rating": "Evaluare cu stele", - "rating_clear": "Anuleaza evaluarea", - "rating_count": "{count, plural, one {# stea} other {# stele}}", + "rating_clear": "Anulează evaluarea", + "rating_count": "{count, plural, =0 {Fără rating} one {# stea} other {# stele}}", "rating_description": "Afișați evaluarea EXIF ÃŽn panoul de informații", - "rating_set": "Evaluare setată la {rating, plural, o {# star} alte {# stars}}", "reaction_options": "Opțiuni de reacție", "read_changelog": "Citiți Jurnalul de Modificări", "readonly_mode_disabled": "Modul doar citire dezactivat", @@ -1875,7 +1882,10 @@ "reset_pin_code_success": "Codul PIN a fost resetat cu succes", "reset_pin_code_with_password": "Puteți reseta oricÃĸnd codul PIN cu ajutorul parolei", "reset_sqlite": "Resetare bază de date SQLite", - "reset_sqlite_confirmation": "Sigur doriți să resetați baza de date SQLite? Va trebui să vă deconectați și să vă conectați din nou pentru a resincroniza datele", + "reset_sqlite_clear_app_data": "Șterge date", + "reset_sqlite_confirmation": "Sigur dorești să ștergi datele aplicației? Vor fi șterse toate setările și vei fi deconectat.", + "reset_sqlite_confirmation_note": "Notă: Este necesară repornirea aplicației după ștergere.", + "reset_sqlite_done": "Datele aplicației au fost șterse. Repornește Immich și loghează-te din nou.", "reset_sqlite_success": "Resetarea cu succes a bazei de date SQLite", "reset_to_default": "Resetați la valoarea implicită", "resolution": "Rezoluție", @@ -1903,6 +1913,7 @@ "saved_settings": "Setări salvate", "say_something": "Spuneți ceva", "scaffold_body_error_occurred": "A apărut o eroare", + "scaffold_body_error_unrecoverable": "O eroare nerecuperabilă a avut loc. Te rugăm să trimiți eroarea și stack trace-ul pe Discord sau GitHub pentru ați putea oferi ajutor. Dacă ÃŽČ›i este recomandat, poți șterge datele aplicației mai jos.", "scan": "Scanare", "scan_all_libraries": "Scanați toate bibliotecile", "scan_library": "Scanare", @@ -1938,6 +1949,7 @@ "search_filter_ocr": "Caută dupa OCR", "search_filter_people_title": "Selectați persoane", "search_filter_star_rating": "După rating ÃŽn stele", + "search_filter_tags_title": "Selectează etichete", "search_for": "Căutare după", "search_for_existing_person": "Caută o persoană existentă", "search_no_more_result": "Nu mai există rezultate", @@ -2017,6 +2029,9 @@ "set_profile_picture": "Setați poza de profil", "set_slideshow_to_fullscreen": "Setați Prezentare de Diapozitive la ecran complet", "set_stack_primary_asset": "Setați ca element principal", + "setting_image_navigation_enable_subtitle": "Dacă este activată, poți naviga la imaginea precedentă/următoare prin apăsarea ÃŽn partea din stÃĸnga/dreapta a ecranului.", + "setting_image_navigation_enable_title": "Apasă pentru a naviga", + "setting_image_navigation_title": "Navigare imagini", "setting_image_viewer_help": "Vizualizatorul detaliilor ÃŽncarcă mai ÃŽntÃĸi miniatura mică, apoi ÃŽncarcă previzualizarea de dimensiune medie (dacă este activată), ÃŽn cele din urmă ÃŽncarcă originalul (dacă este activat).", "setting_image_viewer_original_subtitle": "Activează pentru a ÃŽncărca imaginea originală ÃŽn rezoluție completă (mare!). Dezactivează pentru a reduce consumul de date (atat pe rețea, cÃĸt și ÃŽn memoria cache a dispozitivului).", "setting_image_viewer_original_title": "Încarcă fotografia originală", @@ -2183,6 +2198,7 @@ "support": "Suport tehnic", "support_and_feedback": "Suport tehnic și feedback", "support_third_party_description": "Instalarea dvs. Immich a fost pregătită de o terță parte. Problemele pe care le ÃŽntÃĸmpinați pot fi cauzate de acel pachet, așa că vă rugăm să ridicați probleme cu ei ÃŽn primă instanță utilizÃĸnd linkurile de mai jos.", + "supporter": "Susținător", "swap_merge_direction": "Schimbați direcția de ÃŽmbinare", "sync": "Sincronizare", "sync_albums": "Sincronizează albumele", @@ -2294,6 +2310,7 @@ "unstack_action_prompt": "{count} neÃŽmpachetate", "unstacked_assets_count": "Nestivuit {count, plural, one {# resursă} other {# resurse}}", "unsupported_field_type": "Tip de cÃĸmp neacceptat", + "unsupported_file_type": "Fișierul {file} nu poate fi ÃŽncărcat deoarece extensia sa {type} nu este suportată.", "untagged": "Neetichetat", "untitled_workflow": "Flux de lucru fără titlu", "up_next": "Mai departe", @@ -2305,7 +2322,7 @@ "upload_details": "Detalii ÃŽncărcare", "upload_dialog_info": "Vrei să backup resursele selectate pe server?", "upload_dialog_title": "Încarcă resursă", - "upload_error_with_count": "Eroare la ÃŽncărcare pentru {număr, plural, un {# fișier} alte {# fișiere}}", + "upload_error_with_count": "Eroare la ÃŽncărcare pentru {count, plural, one {# fișier} other {# fișiere}}", "upload_errors": "Încărcare finalizată cu {count, plural, one {# eroare} other {# erori}}, reÃŽmprospătați pagina pentru a reÃŽncărca noile resurse.", "upload_finished": "Încărcarea s-a finalizat", "upload_progress": "Rămas {remaining, number} - Procesat {processed, number}/{total, number}", @@ -2320,6 +2337,8 @@ "url": "URL", "usage": "Utilizare", "use_biometric": "Folosește biometrice", + "use_browser_locale": "Folosește setarea de limbă din browser", + "use_browser_locale_description": "Formatează date, timp și numere bazat pe setările de limbă din browser", "use_current_connection": "Folosește conexiunea curentă", "use_custom_date_range": "Utilizați ÃŽn schimb un interval de date personalizat", "user": "Utilizator", diff --git a/i18n/ru.json b/i18n/ru.json index a1e542a2e5..d1958d76e6 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "Ņ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК вĐŊĐĩ҈ĐŊĐĩĐš ĐēĐžĐŋии в ОйĐģаĐēĐĩ иĐģи Đ´Ņ€ŅƒĐŗĐžĐŧ Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐžĐŧ ĐŧĐĩҁ҂Đĩ.", "backup_onboarding_2_description": "Ņ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ ĐžŅĐŊОвĐŊҋ҅ Ņ„Đ°ĐšĐģОв и Đ¸Ņ… ĐģĐžĐēаĐģҌĐŊОК ĐēĐžĐŋии ĐŊа Đ´Đ˛ŅƒŅ… Ņ€Đ°ĐˇĐŊҋ҅ Ņ‚Đ¸ĐŋĐ°Ņ… ĐŊĐžŅĐ¸Ņ‚ĐĩĐģĐĩĐš.", "backup_onboarding_3_description": "ŅĐžĐˇĐ´Đ°ĐŊиĐĩ ҂Ҁґ҅ ĐēĐžĐŋиК даĐŊĐŊҋ҅, вĐēĐģŅŽŅ‡Đ°Ņ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹: 2 ĐģĐžĐēаĐģҌĐŊҋ҅ ĐēĐžĐŋии и 1 вĐŊĐĩ҈ĐŊŅŽŅŽ.", - "backup_onboarding_description": "ДĐģŅ ĐŊĐ°Đ´Ņ‘ĐļĐŊОК ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸ŅŽ Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ даĐŊĐŊҋ҅ 3-2-1. ДĐĩĐģĐ°ĐšŅ‚Đĩ ĐēĐžĐŋии ĐēаĐē ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊҋ҅ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đš и видĐĩĐž, Ņ‚Đ°Đē и ĐąĐ°ĐˇŅ‹ даĐŊĐŊҋ҅ Immich.", + "backup_onboarding_description": "ДĐģŅ ĐŊĐ°Đ´Ņ‘ĐļĐŊОК ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸ŅŽ Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ даĐŊĐŊҋ҅ 3-2-1. ĐĄĐžĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐēĐžĐŋии ĐēаĐē ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊҋ҅ Ņ„ĐžŅ‚Đž и видĐĩĐž, Ņ‚Đ°Đē и ĐąĐ°ĐˇŅ‹ даĐŊĐŊҋ҅ Immich.", "backup_onboarding_footer": "ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐŋĐž Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŧ҃ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸ŅŽ Immich Đ´ĐžŅŅ‚ŅƒĐŋĐŊа в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸.", "backup_onboarding_parts_title": "ĐĄŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸Ņ 3-2-1 ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐĩŅ‚:", "backup_onboarding_title": "Đ ĐĩСĐĩŅ€Đ˛ĐŊĐžĐĩ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ", @@ -372,7 +372,7 @@ "transcoding_audio_codec": "ĐŅƒĐ´Đ¸ĐžĐēОдĐĩĐē", "transcoding_audio_codec_description": "Opus — Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚ ŅĐ°ĐŧĐžĐŗĐž Đ˛Ņ‹ŅĐžĐēĐžĐŗĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đ°, ĐŊĐž иĐŧĐĩĐĩŅ‚ ĐŧĐĩĐŊŅŒŅˆŅƒŅŽ ŅĐžĐ˛ĐŧĐĩŅŅ‚Đ¸ĐŧĐžŅŅ‚ŅŒ ŅĐž ŅŅ‚Đ°Ņ€Ņ‹Đŧи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Đŧи иĐģи ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧĐŊŅ‹Đŧ ОйĐĩҁĐŋĐĩ҇ĐĩĐŊиĐĩĐŧ.", "transcoding_bitrate_description": "ВидĐĩĐž ҁ ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚ĐžĐŧ Đ˛Ņ‹ŅˆĐĩ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐžĐŗĐž иĐģи в ĐŊĐĩĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰ĐĩĐŧ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ ĐŧĐžĐļĐĩŅ‚ Đ˛Ņ‹ĐˇĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹", - "transcoding_codecs_learn_more": "ДĐģŅ Đ¸ĐˇŅƒŅ‡ĐĩĐŊĐ¸Ņ Ņ‚ĐĩŅ€ĐŧиĐŊĐžĐģĐžĐŗĐ¸Đ¸, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧОК СдĐĩҁҌ, ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Đē Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ FFmpeg ĐŋĐž ĐēОдĐĩĐēаĐŧ H.264, HEVC и VP9.", + "transcoding_codecs_learn_more": "ДĐģŅ ĐŋĐžĐŊиĐŧаĐŊĐ¸Ņ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧОК Ņ‚ĐĩŅ€ĐŧиĐŊĐžĐģĐžĐŗĐ¸Đ¸ ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Đē Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ FFmpeg ĐŋĐž ĐēОдĐĩĐēаĐŧ H.264, HEVC и VP9.", "transcoding_constant_quality_mode": "Đ ĐĩĐļиĐŧ ĐŋĐžŅŅ‚ĐžŅĐŊĐŊĐžĐŗĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đ°", "transcoding_constant_quality_mode_description": "Đ ĐĩĐļиĐŧ ICQ ĐģŅƒŅ‡ŅˆĐĩ, ҇ĐĩĐŧ CQP, ĐŊĐž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊĐžĐŗĐž ҃ҁĐēĐžŅ€ĐĩĐŊĐ¸Ņ ĐĩĐŗĐž ĐŊĐĩ ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚. ĐŖŅŅ‚Đ°ĐŊОвĐēа ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸ ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ‚Đ´Đ°Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€ĐĩĐ´ĐŋĐžŅ‡Ņ‚ĐĩĐŊиĐĩ ҃ĐēаСаĐŊĐŊĐžĐŧ҃ Ņ€ĐĩĐļиĐŧ҃ ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ĐŊа ĐžŅĐŊОвĐĩ ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đ°. NVENC ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ Ņ€ĐĩĐļиĐŧ ICQ.", "transcoding_constant_rate_factor": "ĐšĐžŅŅ„Ņ„Đ¸Ņ†Đ¸ĐĩĐŊŅ‚ ĐŋĐžŅŅ‚ĐžŅĐŊĐŊОК ҁĐēĐžŅ€ĐžŅŅ‚Đ¸ (-crf)", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ Ņ‚ĐžĐŊОв", "transcoding_tone_mapping_description": "ĐŸŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ вĐŊĐĩ҈ĐŊиК вид HDR-видĐĩĐž ĐŋŅ€Đ¸ ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊии в SDR. КаĐļĐ´Ņ‹Đš аĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ Đ´ĐĩĐģаĐĩŅ‚ Ņ€Đ°ĐˇĐŊŅ‹Đĩ ĐēĐžĐŧĐŋŅ€ĐžĐŧĐ¸ŅŅŅ‹ ĐŧĐĩĐļĐ´Ņƒ Ņ†Đ˛ĐĩŅ‚ĐžĐŧ, Đ´ĐĩŅ‚Đ°ĐģĐ¸ĐˇĐ°Ņ†Đ¸ĐĩĐš и ŅŅ€ĐēĐžŅŅ‚ŅŒŅŽ. Hable ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ Đ´ĐĩŅ‚Đ°Đģи, Mobius ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ Ņ†Đ˛ĐĩŅ‚, а Reinhard ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ ŅŅ€ĐēĐžŅŅ‚ŅŒ.", "transcoding_transcode_policy": "ПоĐģĐ¸Ņ‚Đ¸Đēа ĐŋĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ", - "transcoding_transcode_policy_description": "ĐŸŅ€Đ°Đ˛Đ¸Đģа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅŅŽŅ‰Đ¸Đĩ ĐēĐžĐŗĐ´Đ° видĐĩĐž Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž. HDR-видĐĩĐž Đ˛ŅĐĩĐŗĐ´Đ° ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒŅŅ (Са Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩĐŧ ҁĐģŅƒŅ‡Đ°Đĩв, ĐēĐžĐŗĐ´Đ° ĐŋĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊĐž).", + "transcoding_transcode_policy_description": "ĐŸŅ€Đ°Đ˛Đ¸Đģа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅŅŽŅ‰Đ¸Đĩ, ĐēаĐēиĐĩ видĐĩĐž Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹. HDR-видĐĩĐž и видĐĩĐž ҁ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ĐžĐŧ ĐŋиĐēҁĐĩĐģĐĩĐš, ĐžŅ‚ĐģĐ¸Ņ‡ĐŊŅ‹Đŧ ĐžŅ‚ YUV 4:2:0, Đ˛ŅĐĩĐŗĐ´Đ° ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒŅŅ (Са Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩĐŧ ҁĐģŅƒŅ‡Đ°Đĩв, ĐēĐžĐŗĐ´Đ° ĐŋĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊĐž).", "transcoding_two_pass_encoding": "Đ”Đ˛ŅƒŅ…ĐŋŅ€ĐžŅ…ĐžĐ´ĐŊĐžĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ", "transcoding_two_pass_encoding_setting_description": "ПĐĩŅ€ĐĩĐēĐžĐ´Đ¸Ņ€ŅƒĐšŅ‚Đĩ Са два ĐŋŅ€ĐžŅ…ĐžĐ´Đ°, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ йОĐģĐĩĐĩ ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐĩĐŊĐŊĐžĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ видĐĩĐž. ĐšĐžĐŗĐ´Đ° вĐēĐģŅŽŅ‡ĐĩĐŊ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊŅ‹Đš ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚ (ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧ Đ´ĐģŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹ ҁ H.264 и HEVC), в ŅŅ‚ĐžĐŧ Ņ€ĐĩĐļиĐŧĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ диаĐŋаСОĐŊ ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚Đ°, ĐžŅĐŊОваĐŊĐŊŅ‹Đš ĐŊа ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐžĐŧ ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚Đĩ, и Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ CRF. ДĐģŅ VP9 ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ CRF, ĐĩҁĐģи ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊŅ‹Đš ĐąĐ¸Ņ‚Ņ€ĐĩĐšŅ‚.", "transcoding_video_codec": "ВидĐĩĐžĐēОдĐĩĐē", @@ -871,8 +871,8 @@ "current_pin_code": "ĐĸĐĩĐēŅƒŅ‰Đ¸Đš PIN-ĐēОд", "current_server_address": "ĐĸĐĩĐēŅƒŅ‰Đ¸Đš Đ°Đ´Ņ€Đĩҁ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", "custom_date": "ĐŸŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģҌĐŊĐ°Ņ Đ´Đ°Ņ‚Đ°", - "custom_locale": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК Ņ€ĐĩĐŗĐ¸ĐžĐŊ", - "custom_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ´Đ°Ņ‚ и Ņ‡Đ¸ŅĐĩĐģ в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸ ĐžŅ‚ ŅĐˇŅ‹Đēа и Ņ€ĐĩĐŗĐ¸ĐžĐŊа", + "custom_locale": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиĐĩ ŅĐˇŅ‹ĐēĐžĐ˛Ņ‹Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи", + "custom_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ´Đ°Ņ‚, Đ˛Ņ€ĐĩĐŧĐĩĐŊи и Ņ‡Đ¸ŅĐĩĐģ ĐŊа ĐžŅĐŊОваĐŊии Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž ŅĐˇŅ‹Đēа и Ņ€ĐĩĐŗĐ¸ĐžĐŊа", "custom_url": "ХвОК URL", "cutoff_date_description": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ Ņ„ĐžŅ‚Đž Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩâ€Ļ", "cutoff_day": "{count, plural, one {Đ´ĐĩĐŊҌ} many {Đ´ĐŊĐĩĐš} other {Đ´ĐŊŅ}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž EXIF даĐŊĐŊҋ҅", "deduplication_info": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Đž Đ´ĐĩĐ´ŅƒĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", "deduplication_info_description": "ДĐģŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐŗĐž Đ˛Ņ‹ĐąĐžŅ€Đ° ĐģŅƒŅ‡ŅˆĐ¸Ņ… ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ҁҀĐĩди Đ´ŅƒĐąĐģиĐēĐ°Ņ‚ĐžĐ˛ аĐŊаĐģĐ¸ĐˇĐ¸Ņ€ŅƒĐĩŅ‚ŅŅ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ:", - "default_locale": "Đ”Đ°Ņ‚Đ° и Đ˛Ņ€ĐĩĐŧŅ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", - "default_locale_description": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´Đ°Ņ‚Ņ‹ и Đ˛Ņ€ĐĩĐŧĐĩĐŊи в ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ¸Đ¸ ҁ ŅĐˇŅ‹ĐēĐžĐ˛Ņ‹Đŧ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐžĐŧ Đ˛Đ°ŅˆĐĩĐŗĐž ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°", "delete": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", "delete_action_confirmation_message": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐžĐąŅŠĐĩĐēŅ‚? Đ­Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚ ĐžĐąŅŠĐĩĐēŅ‚ в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° и ĐŋĐžĐŋŅ€ĐžĐąŅƒĐĩŅ‚ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐĩĐŗĐž ĐģĐžĐēаĐģҌĐŊĐž.", "delete_action_prompt": "ĐžĐąŅŠĐĩĐē҂ҋ ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹ ({count} ŅˆŅ‚.)", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "ИСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋŅ€Đ¸ĐŧĐĩĐŊĐĩĐŊŅ‹", "editor_flip_horizontal": "ĐžŅ‚Ņ€Đ°ĐˇĐ¸Ņ‚ŅŒ ĐŗĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊĐž", "editor_flip_vertical": "ĐžŅ‚Ņ€Đ°ĐˇĐ¸Ņ‚ŅŒ вĐĩŅ€Ņ‚Đ¸ĐēаĐģҌĐŊĐž", + "editor_handle_corner": "{corner, select, top_left {ЛĐĩĐ˛Ņ‹Đš вĐĩҀ҅ĐŊиК ŅƒĐŗĐžĐģ} top_right {ĐŸŅ€Đ°Đ˛Ņ‹Đš вĐĩҀ҅ĐŊиК ŅƒĐŗĐžĐģ} bottom_left {ЛĐĩĐ˛Ņ‹Đš ĐŊиĐļĐŊиК ŅƒĐŗĐžĐģ} bottom_right {ĐŸŅ€Đ°Đ˛Ņ‹Đš ĐŊиĐļĐŊиК ŅƒĐŗĐžĐģ} other {ĐŖĐŗĐžĐģ}}", + "editor_handle_edge": "{edge, select, top {ВĐĩҀ҅ĐŊиК ĐēŅ€Đ°Đš} bottom {НиĐļĐŊиК ĐēŅ€Đ°Đš} left {ЛĐĩĐ˛Ņ‹Đš ĐēŅ€Đ°Đš} right {ĐŸŅ€Đ°Đ˛Ņ‹Đš ĐēŅ€Đ°Đš} other {ĐšŅ€Đ°Đš}}", "editor_orientation": "ĐžŅ€Đ¸ĐĩĐŊŅ‚Đ°Ņ†Đ¸Ņ", "editor_reset_all_changes": "ĐĄĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ", "editor_rotate_left": "ПовĐĩŅ€ĐŊŅƒŅ‚ŅŒ ĐŊа 90° ĐŋŅ€ĐžŅ‚Đ¸Đ˛ Ņ‡Đ°ŅĐžĐ˛ĐžĐš ҁ҂ҀĐĩĐģĐēи", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ", "incorrect_email_or_password": "НĐĩвĐĩŅ€ĐŊŅ‹Đš Đ°Đ´Ņ€Đĩҁ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹ иĐģи ĐŋĐ°Ņ€ĐžĐģҌ", "library_folder_already_exists": "ĐĸаĐēĐ°Ņ ĐŋаĐŋĐēа ҃ĐļĐĩ ĐĩŅŅ‚ŅŒ в ҁĐŋĐ¸ŅĐēĐĩ.", + "page_not_found": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° ĐŊĐĩ ĐŊаКдĐĩĐŊа", "paths_validation_failed": "{paths, plural, one {# ĐŋŅƒŅ‚ŅŒ ĐŊĐĩ ĐŋŅ€ĐžŅˆŅ‘Đģ} many {# ĐŋŅƒŅ‚ĐĩĐš ĐŊĐĩ ĐŋŅ€ĐžŅˆĐģи} other {# ĐŋŅƒŅ‚Đ¸ ĐŊĐĩ ĐŋŅ€ĐžŅˆĐģи}} ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃", "profile_picture_transparent_pixels": "Đ¤ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Ņ ĐŋŅ€ĐžŅ„Đ¸ĐģŅ ĐŊĐĩ Đ´ĐžĐģĐļĐŊа ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊҋ҅ ĐŋиĐēҁĐĩĐģĐĩĐš. ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ŅƒĐ˛ĐĩĐģĐ¸Ņ‡Đ¸Ņ‚ŅŒ и/иĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ.", "quota_higher_than_disk_size": "Đ’Ņ‹ ŅƒŅŅ‚Đ°ĐŊОвиĐģи ĐēĐ˛ĐžŅ‚Ņƒ, ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ŅŽŅ‰ŅƒŅŽ Ņ€Đ°ĐˇĐŧĐĩŅ€ Đ´Đ¸ŅĐēа", @@ -1218,6 +1219,7 @@ "filter_description": "ĐŖŅĐģĐžĐ˛Đ¸Ņ ĐžŅ‚ĐąĐžŅ€Đ° ҆ĐĩĐģĐĩĐ˛Ņ‹Ņ… ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛", "filter_people": "ФиĐģŅŒŅ‚Ņ€ ĐŋĐž ĐģŅŽĐ´ŅĐŧ", "filter_places": "ФиĐģŅŒŅ‚Ņ€ ĐŋĐž ĐŧĐĩŅŅ‚Đ°Đŧ", + "filter_tags": "ФиĐģŅŒŅ‚Ņ€ ĐŋĐž Ņ‚ĐĩĐŗĐ°Đŧ", "filters": "ФиĐģŅŒŅ‚Ņ€Ņ‹", "find_them_fast": "Đ‘Ņ‹ŅŅ‚Ņ€Đž ĐŊĐ°ĐšĐ´Đ¸Ņ‚Đĩ Đ¸Ņ… ĐŋĐž иĐŧĐĩĐŊи ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐŋĐžĐ¸ŅĐēа", "first": "ПĐĩŅ€Đ˛Ņ‹Đš", @@ -1649,6 +1651,7 @@ "only_favorites": "ĐĸĐžĐģҌĐēĐž Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐĩ", "open": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ", "open_calendar": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ĐēаĐģĐĩĐŊĐ´Đ°Ņ€ŅŒ", + "open_in_browser": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ", "open_in_map_view": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в Ņ€ĐĩĐļиĐŧĐĩ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đ° ĐēĐ°Ņ€Ņ‚Ņ‹", "open_in_openstreetmap": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в OpenStreetMap", "open_the_search_filters": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Ņ‹ ĐŋĐžĐ¸ŅĐēа", @@ -1808,9 +1811,8 @@ "rate_asset": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ", "rating": "Đ ĐĩĐšŅ‚Đ¸ĐŊĐŗ", "rating_clear": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ", - "rating_count": "{count, plural, one {# СвĐĩСда} many {# СвĐĩСд} other {# СвĐĩĐˇĐ´Ņ‹}}", + "rating_count": "{count, plural, =0 {БĐĩС Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗĐ°} one {# СвĐĩСда} many {# СвĐĩСд} other {# СвĐĩĐˇĐ´Ņ‹}}", "rating_description": "ĐĄĐ¸ŅŅ‚ĐĩĐŧа ĐžŅ†ĐĩĐŊĐēи ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ в ĐŋаĐŊĐĩĐģи иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸", - "rating_set": "ĐŖŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ {rating, plural, one {# СвĐĩСда} many {# СвĐĩСд} other {# СвĐĩĐˇĐ´Ņ‹}}", "reaction_options": "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ ҁ ĐžŅ‚ĐŧĐĩŅ‚ĐēОК", "read_changelog": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ Ņ€ĐĩĐģиСОв", "readonly_mode_disabled": "Đ ĐĩĐļиĐŧ ÂĢŅ‚ĐžĐģҌĐēĐž ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Âģ ĐžŅ‚ĐēĐģŅŽŅ‡Ņ‘ĐŊ", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "PIN-ĐēОд ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐąŅ€ĐžŅˆĐĩĐŊ", "reset_pin_code_with_password": "Đ’Ņ‹ Đ˛ŅĐĩĐŗĐ´Đ° ĐŧĐžĐļĐĩŅ‚Đĩ ŅĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ PIN-ĐēОд ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐŋĐ°Ņ€ĐžĐģŅ", "reset_sqlite": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ ĐąĐ°ĐˇŅƒ даĐŊĐŊҋ҅ SQLite", - "reset_sqlite_confirmation": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ ĐąĐ°ĐˇŅƒ даĐŊĐŊҋ҅ SQLite? ВаĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ˛Ņ‹ĐšŅ‚Đ¸ иС ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ и ҁĐŊОва Đ˛ĐžĐšŅ‚Đ¸ Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊОК ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ даĐŊĐŊҋ҅.", + "reset_sqlite_clear_app_data": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ", + "reset_sqlite_confirmation": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ? ĐĄĐąŅ€ĐžŅŅŅ‚ŅŅ Đ˛ŅĐĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи и ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ СаĐŊОвО Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ.", + "reset_sqlite_confirmation_note": "ĐŸŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊиĐĩ: ĐŅƒĐļĐŊĐž ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ ĐŋĐžŅĐģĐĩ ĐžŅ‡Đ¸ŅŅ‚Đēи.", + "reset_sqlite_done": "ДаĐŊĐŊŅ‹Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ ĐąŅ‹Đģи ĐžŅ‡Đ¸Ņ‰ĐĩĐŊŅ‹. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ Immich и Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇŅƒĐšŅ‚ĐĩҁҌ ҁĐŊОва.", "reset_sqlite_success": "База даĐŊĐŊҋ҅ SQLite ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‡Đ¸Ņ‰ĐĩĐŊа", "reset_to_default": "Đ’ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиК ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", "resolution": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ", @@ -1910,6 +1915,7 @@ "saved_settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹", "say_something": "НаĐŋĐ¸ŅˆĐ¸Ņ‚Đĩ Ņ‡Ņ‚Đž-ĐŊĐ¸ĐąŅƒĐ´ŅŒ", "scaffold_body_error_occurred": "ВозĐŊиĐēĐģа ĐžŅˆĐ¸ĐąĐēа", + "scaffold_body_error_unrecoverable": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐŊĐĩŅƒŅŅ‚Ņ€Đ°ĐŊиĐŧĐ°Ņ ĐžŅˆĐ¸ĐąĐēа. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ŅĐžĐžĐąŅ‰Đ¸Ņ‚Đĩ Ой ĐžŅˆĐ¸ĐąĐēĐĩ в Discord иĐģи ĐŊа GitHub, Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đēи ĐŧĐžĐŗĐģи ĐŋĐžĐŧĐžŅ‡ŅŒ. Đ•ŅĐģи ŅĐžĐ˛ĐĩŅ‚ŅƒŅŽŅ‚, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ.", "scan": "ĐŸĐžĐ¸ŅĐē", "scan_all_libraries": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ йийĐģĐ¸ĐžŅ‚ĐĩĐēи", "scan_library": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "ĐŸĐžĐ¸ŅĐē Ņ‚ĐĩĐēŅŅ‚Đ°", "search_filter_people_title": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐģŅŽĐ´ĐĩĐš", "search_filter_star_rating": "Đ ĐĩĐšŅ‚Đ¸ĐŊĐŗ", + "search_filter_tags_title": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ‚ĐĩĐŗĐ¸", "search_for": "ĐŸĐžĐ¸ŅĐē ĐŋĐž", "search_for_existing_person": "ĐŸĐžĐ¸ŅĐē ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐŗĐž ҇ĐĩĐģОвĐĩĐēа", "search_no_more_result": "БоĐģҌ҈Đĩ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚ĐžĐ˛ ĐŊĐĩŅ‚", @@ -2024,6 +2031,9 @@ "set_profile_picture": "ĐŖŅŅ‚Đ°ĐŊОвĐēа Ņ„ĐžŅ‚Đž ĐŋŅ€ĐžŅ„Đ¸ĐģŅ", "set_slideshow_to_fullscreen": "ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ҁĐģаКд-ŅˆĐžŅƒ в ĐŋĐžĐģĐŊĐžŅĐēŅ€Đ°ĐŊĐŊŅ‹Đš Ņ€ĐĩĐļиĐŧ", "set_stack_primary_asset": "НазĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ ĐžŅĐŊОвĐŊŅ‹Đŧ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐŧ", + "setting_image_navigation_enable_subtitle": "ВозĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´Đ° Đē ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŧ҃/ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ҃ Ņ„ĐžŅ‚Đž, ĐēĐ°ŅĐ°ŅŅŅŒ ĐģĐĩвОК/ĐŋŅ€Đ°Đ˛ĐžĐš ҇ĐĩŅ‚Đ˛ĐĩŅ€Ņ‚Đ¸ ŅĐēŅ€Đ°ĐŊа.", + "setting_image_navigation_enable_title": "ĐĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ ĐēĐ°ŅĐ°ĐŊиĐĩĐŧ", + "setting_image_navigation_title": "ĐĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ ĐŋĐž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸ŅĐŧ", "setting_image_viewer_help": "ĐŸŅ€Đ¸ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ ҁĐŋĐĩŅ€Đ˛Đ° ĐˇĐ°ĐŗŅ€ŅƒĐļаĐĩŅ‚ŅŅ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ°, ĐˇĐ°Ņ‚ĐĩĐŧ ҃ĐŧĐĩĐŊҌ҈ĐĩĐŊĐŊĐžĐĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ ҁҀĐĩĐ´ĐŊĐĩĐŗĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đ° (ĐĩҁĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐž), а ĐˇĐ°Ņ‚ĐĩĐŧ ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģ (ĐĩҁĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐž).", "setting_image_viewer_original_subtitle": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ Đ´ĐģŅ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēи Đ¸ŅŅ…ĐžĐ´ĐŊĐžĐŗĐž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ в ĐŋĐžĐģĐŊĐžĐŧ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊии (йОĐģŅŒŅˆĐžĐĩ!). ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ Đ´ĐģŅ ҃ĐŧĐĩĐŊҌ҈ĐĩĐŊĐ¸Ņ ĐžĐąŅŠŅ‘Đŧа даĐŊĐŊҋ҅ (ĐēаĐē ҁĐĩŅ‚Đ¸, Ņ‚Đ°Đē и ĐēŅŅˆĐ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°).", "setting_image_viewer_original_title": "Đ—Đ°ĐŗŅ€ŅƒĐļĐ°Ņ‚ŅŒ Đ¸ŅŅ…ĐžĐ´ĐŊĐžĐĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "ĐžĐąŅŠĐĩĐē҂ҋ Ņ€Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹ ({count} ŅˆŅ‚.)", "unstacked_assets_count": "{count, plural, one {Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊ # ĐžĐąŅŠĐĩĐēŅ‚} many {Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚Đ°}}", "unsupported_field_type": "НĐĩĐŋОддĐĩŅ€ĐļиваĐĩĐŧŅ‹Đš Ņ‚Đ¸Đŋ ĐŋĐžĐģŅ", + "unsupported_file_type": "ФаКĐģ {file} ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊ, Ņ‚Đ¸Đŋ {type} ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ.", "untagged": "БĐĩС Ņ‚ĐĩĐŗĐžĐ˛", "untitled_workflow": "Đ Đ°ĐąĐžŅ‡Đ¸Đš ĐŋŅ€ĐžŅ†Đĩҁҁ ĐąĐĩС ĐŊаСваĐŊĐ¸Ņ", "up_next": "ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐĩ", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ", "use_biometric": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ йиОĐŧĐĩŅ‚Ņ€Đ¸ŅŽ", + "use_browser_locale": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐˇŅ‹ĐēĐžĐ˛Ņ‹Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°", + "use_browser_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ´Đ°Ņ‚, Đ˛Ņ€ĐĩĐŧĐĩĐŊи и Ņ‡Đ¸ŅĐĩĐģ ĐŊа ĐžŅĐŊОваĐŊии ŅĐˇŅ‹ĐēĐžĐ˛Ņ‹Ņ… ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐē ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°", "use_current_connection": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐĩ ĐŋОдĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ", "use_custom_date_range": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК диаĐŋаСОĐŊ Đ´Đ°Ņ‚", "user": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ", diff --git a/i18n/sk.json b/i18n/sk.json index c8c3c69802..6235815c2b 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "externÃē kÃŗpiu v cloude alebo na inom fyzickom mieste.", "backup_onboarding_2_description": "lokÃĄlne kÃŗpie na rôznych zariadeniach. To zahŕňa hlavnÊ sÃēbory a ich lokÃĄlnu zÃĄlohu.", "backup_onboarding_3_description": "kompletnÊ kÃŗpie vaÅĄich Ãēdajov vrÃĄtane pôvodnÃŊch sÃēborov. Toto zahŕňa 1 externÃē kÃŗpiu a 2 lokÃĄlne kÃŗpie.", - "backup_onboarding_description": "Na ochranu vaÅĄich Ãēdajov sa odporÃēča stratÊgia zÃĄlohovania 3-2-1. Pre komplexnÊ rieÅĄenie zÃĄlohovania by ste mali uchovÃĄvaÅĨ kÃŗpie nahratÃŊch fotografií/videí, ako aj databÃĄzy Immich.", + "backup_onboarding_description": "Na ochranu vaÅĄich Ãēdajov sa odporÃēča stratÊgia zÃĄlohovania 3-2-1. Pre komplexnÊ rieÅĄenie zÃĄlohovania by ste mali uchovÃĄvaÅĨ kÃŗpie nahratÃŊch fotografií/videí, ako aj databÃĄzy Immich.", "backup_onboarding_footer": "ĎalÅĄie informÃĄcie o vytvÃĄraní zÃĄlohy Immich nÃĄjdete v dokumentÃĄcii.", "backup_onboarding_parts_title": "ZÃĄlohovanie 3-2-1 zahŕňa:", "backup_onboarding_title": "ZÃĄlohy", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "TÃŗnovÊ mapovanie", "transcoding_tone_mapping_description": "SnaŞí sa zachovaÅĨ vzhÄžad videí HDR pri konverzii na SDR. KaÅždÃŊ algoritmus robí rôzne kompromisy v oblasti farieb, detailov a jasu. Hable zachovÃĄva detaily, Mobius zachovÃĄva farby a Reinhard zachovÃĄva jas.", "transcoding_transcode_policy": "PravidlÃĄ prekÃŗdovania", - "transcoding_transcode_policy_description": "PravidlÃĄ, kedy sa mÃĄ video prekÃŗdovaÅĨ. HDR videÃĄ sa prekÃŗdujÃē vÅždy (okrem prípadov, keď je prekÃŗdovanie vypnutÊ).", + "transcoding_transcode_policy_description": "Pravidlo pre prípady, kedy sa mÃĄ video prekÃŗdovaÅĨ. HDR videÃĄ a videÃĄ s inÃŊm formÃĄtom pixelov ako YUV 4:2:0 sa prekÃŗdujÃē vÅždy (okrem prípadov, keď je prekÃŗdovanie vypnutÊ).", "transcoding_two_pass_encoding": "DvojfÃĄzovÊ kÃŗdovanie", "transcoding_two_pass_encoding_setting_description": "PrekÃŗdovaÅĨ v dvoch fÃĄzach, aby sa vytvorili lepÅĄie kÃŗdovanÊ videÃĄ. Keď je povolenÃŊ maximÃĄlny dÃĄtovÃŊ tok (vyÅžaduje sa na prÃĄcu s formÃĄtmi H.264 a HEVC), tento reÅžim pouŞíva rozsah dÃĄtovÊho toku na zÃĄklade maximÃĄlneho dÃĄtovÊho toku a ignoruje CRF. V prípade VP9 sa CRF môŞe pouÅžiÅĨ, ak je maximÃĄlny bitrate vypnutÃŊ.", "transcoding_video_codec": "Video kodek", @@ -569,7 +569,7 @@ "asset_list_layout_settings_group_automatically": "Automaticky", "asset_list_layout_settings_group_by": "ZoskupiÅĨ poloÅžky podÄža", "asset_list_layout_settings_group_by_month_day": "Mesiac + deň", - "asset_list_layout_sub_title": "Rozvrhnutie", + "asset_list_layout_sub_title": "RozloÅženie", "asset_list_settings_subtitle": "Nastavenia rozloÅženia mrieÅžky fotografií", "asset_list_settings_title": "MrieÅžka fotografií", "asset_not_found_on_device_android": "PoloÅžka nebola nÃĄjdenÃĄ v zariadení", @@ -872,7 +872,7 @@ "current_server_address": "AktuÃĄlna adresa servera", "custom_date": "VlastnÃŊ dÃĄtum", "custom_locale": "VlastnÊ nastavenie jazyka", - "custom_locale_description": "FormÃĄtovanie dÃĄtumov a čísel podÄža jazyka a regiÃŗnu", + "custom_locale_description": "FormÃĄtovaÅĨ dÃĄtumy, časy a čísla podÄža vybranÊho jazyka a regiÃŗnu", "custom_url": "VlastnÃĄ URL adresa", "cutoff_date_description": "PonechaÅĨ fotografie z poslednÊho obdobiaâ€Ļ", "cutoff_day": "{count, plural, one {deň} few {dni} other {dní}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Počet EXIF Ãēdajov", "deduplication_info": "Info o deduplikÃĄcii", "deduplication_info_description": "Na automatickÃŊ predvÃŊber poloÅžiek a hromadnÊ odstrÃĄnenie duplicít, sa pozerÃĄme do:", - "default_locale": "PredvolenÊ miestne nastavenie", - "default_locale_description": "FormÃĄtovanie dÃĄtumov a čísel na zÃĄklade miestneho nastavenia prehliadača", "delete": "VymazaÅĨ", "delete_action_confirmation_message": "Naozaj chcete tÃēto poloÅžku odstrÃĄniÅĨ? TÃĄto akcia presunie poloÅžku do koÅĄa na serveri a zobrazí sa otÃĄzka, či ju chcete odstrÃĄniÅĨ aj lokÃĄlne", "delete_action_prompt": "{count} vymazanÃŊch", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "Úpravy boli ÃēspeÅĄne vykonanÊ", "editor_flip_horizontal": "PrevrÃĄtiÅĨ horizontÃĄlne", "editor_flip_vertical": "PrevrÃĄtiÅĨ vertikÃĄlne", + "editor_handle_corner": "{corner, select, top_left {ÄŊavÃŊ hornÃŊ} top_right {PravÃŊ hornÃŊ} bottom_left {ÄŊavÃŊ dolnÃŊ} bottom_right {PravÃŊ dolnÃŊ} other { }} roh", + "editor_handle_edge": "{edge, select, top {HornÃŊ} bottom {DolnÃŊ} left {ÄŊavÃŊ} right {PravÃŊ} other {}} okraj", "editor_orientation": "OrientÃĄcia", "editor_reset_all_changes": "ZruÅĄiÅĨ zmeny", "editor_rotate_left": "OtočiÅĨ o 90° doÄžava", @@ -1021,7 +1021,7 @@ "enable": "AktivovaÅĨ", "enable_backup": "PovoliÅĨ zÃĄlohovanie", "enable_biometric_auth_description": "Zadajte svoj PIN kÃŗd, aby ste povolili biometrickÊ overenie", - "enabled": "AktivovanÃŊ", + "enabled": "AktivovanÊ", "end_date": "KoncovÃŊ dÃĄtum", "enqueued": "V poradí", "enter_wifi_name": "Zadajte nÃĄzov Wi-Fi", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "Nepodarilo sa aktualizovaÅĨ stav oznÃĄmenia", "incorrect_email_or_password": "NesprÃĄvny e-mail alebo heslo", "library_folder_already_exists": "TÃĄto cesta importu uÅž existuje.", + "page_not_found": "StrÃĄnka nebola nÃĄjdenÃĄ", "paths_validation_failed": "{paths, plural, one {# cesta zlyhala} few {# cesty zlyhali} other {# ciest zlyhalo}} pri validÃĄcii", "profile_picture_transparent_pixels": "ProfilovÊ obrÃĄzky nemôŞu maÅĨ priehÄžadnÊ pixely. Prosím priblíŞte a/alebo posuňte obrÃĄzok.", "quota_higher_than_disk_size": "Nastavili ste kvÃŗtu vyÅĄÅĄiu ako je veÄžkosÅĨ disku", @@ -1218,6 +1219,7 @@ "filter_description": "Podmienky na filtrovanie cieÄžovÃŊch poloÅžiek", "filter_people": "FiltrovaÅĨ Äžudí", "filter_places": "FiltrovaÅĨ miesta", + "filter_tags": "FiltrovaÅĨ značky", "filters": "Filtre", "find_them_fast": "NÃĄjdite ich rÃŊchlejÅĄie podÄža mena", "first": "PrvÊ", @@ -1649,6 +1651,7 @@ "only_favorites": "Len obÄžÃēbenÊ", "open": "OtvoriÅĨ", "open_calendar": "OtvoriÅĨ kalendÃĄr", + "open_in_browser": "OtvoriÅĨ v prehliadači", "open_in_map_view": "OtvoriÅĨ v mape", "open_in_openstreetmap": "OtvoriÅĨ v OpenStreetMap", "open_the_search_filters": "OtvoriÅĨ vyhÄžadÃĄvacie filtre", @@ -1808,9 +1811,8 @@ "rate_asset": "OhodnotiÅĨ poloÅžku", "rating": "Hodnotenie hviezdičkami", "rating_clear": "VyčistiÅĨ hodnotenie", - "rating_count": "{count, plural, one {# hviezdička} few {# hviezdičky} other {# hviezdičiek}}", + "rating_count": "{count, plural, =0 {bez hodnotenia} one {# hviezdička} few {# hviezdičky} other {# hviezdičiek}}", "rating_description": "ZobraziÅĨ EXIF hodnotenie v informačnom paneli", - "rating_set": "Hodnotenie nastavenÊ na {rating, plural, one {# hviezdičku} few {# hviezdičky} other {# hviezdičiek}}", "reaction_options": "MoÅžnosti reakcie", "read_changelog": "PrečítaÅĨ zoznam zmien", "readonly_mode_disabled": "ReÅžim iba na čítanie je vypnutÃŊ", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "PIN kÃŗd bol ÃēspeÅĄne obnovenÃŊ", "reset_pin_code_with_password": "Svoj PIN kÃŗd môŞete kedykoÄžvek obnoviÅĨ pomocou vÃĄÅĄho hesla", "reset_sqlite": "ObnoviÅĨ SQLite databÃĄzu", - "reset_sqlite_confirmation": "Ste si istí, Åže chcete obnoviÅĨ SQLite databÃĄzu? Na opätovnÃē synchronizÃĄciu Ãēdajov sa budete musieÅĨ odhlÃĄsiÅĨ a znova prihlÃĄsiÅĨ", + "reset_sqlite_clear_app_data": "VyčistiÅĨ Ãēdaje", + "reset_sqlite_confirmation": "Naozaj chcete vymazaÅĨ Ãēdaje aplikÃĄcie? TÃŊmto krokom sa odstrÃĄnia vÅĄetky nastavenia a budete odhlÃĄsení.", + "reset_sqlite_confirmation_note": "PoznÃĄmka: Po vyčistení budete musieÅĨ aplikÃĄciu reÅĄtartovaÅĨ.", + "reset_sqlite_done": "Údaje aplikÃĄcie boli vyčistenÊ. ReÅĄtartujte prosím aplikÃĄciu Immich a prihlÃĄste sa znova.", "reset_sqlite_success": "ÚspeÅĄnÊ obnovenie databÃĄzy SQLite", "reset_to_default": "ObnoviÅĨ na predvolenÊ", "resolution": "RozlÃ­ÅĄenie", @@ -1910,6 +1915,7 @@ "saved_settings": "Nastavenia boli uloÅženÊ", "say_something": "NapÃ­ÅĄte niečo", "scaffold_body_error_occurred": "Vyskytla sa chyba", + "scaffold_body_error_unrecoverable": "DoÅĄlo k neodstrÃĄniteÄžnej chybe. Prosím, zdieÄžajte chybu a trasu zÃĄsobníka na Discord alebo GitHub, aby sme vÃĄm mohli pomôcÅĨ. Ak je to odporÃēčanÊ, môŞete vymazaÅĨ Ãēdaje aplikÃĄcie niÅžÅĄie.", "scan": "SkenovaÅĨ", "scan_all_libraries": "PreskenovaÅĨ vÅĄetky kniÅžnice", "scan_library": "SkenovaÅĨ", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "HÄžadaÅĨ podÄža OCR", "search_filter_people_title": "Vyberte Äžudí", "search_filter_star_rating": "Hodnotenie hviezdičkami", + "search_filter_tags_title": "Vyberte značky", "search_for": "VyhÄžadaÅĨ", "search_for_existing_person": "HÄžadaÅĨ existujÃēcu osobu", "search_no_more_result": "ÅŊiadne ďalÅĄie vÃŊsledky", @@ -2024,6 +2031,9 @@ "set_profile_picture": "NastaviÅĨ profilovÃŊ obrÃĄzok", "set_slideshow_to_fullscreen": "NastaviÅĨ prezentÃĄciu na celÃē obrazovku", "set_stack_primary_asset": "NastaviÅĨ ako primÃĄrnu poloÅžku", + "setting_image_navigation_enable_subtitle": "Ak je tÃĄto funkcia povolenÃĄ, môŞete prejsÅĨ na predchÃĄdzajÃēci/nasledujÃēci obrÃĄzok ÅĨuknutím na ÄžavÃē/pravÃē ÅĄtvrtinu obrazovky.", + "setting_image_navigation_enable_title": "Ťuknutím prechÃĄdzajte obrÃĄzkami", + "setting_image_navigation_title": "PrechÃĄdzanie obrÃĄzkov", "setting_image_viewer_help": "V detailnom prehliadači sa najprv načíta malÃĄ miniatÃēra, potom sa načíta stredne veÄžkÃŊ nÃĄhÄžad (ak je povolenÃŊ) a nakoniec sa načíta originÃĄl (ak je povolenÃŊ).", "setting_image_viewer_original_subtitle": "Povolením umoÅžníte načítaÅĨ pôvodnÃŊ obrÃĄzok v plnom rozlÃ­ÅĄení (veÄžkÃŊ!). ZakÃĄzaním zníŞite pouŞívania dÃĄt (v sieti, aj v dočasnej pamäte zariadenia).", "setting_image_viewer_original_title": "NačítaÅĨ pôvodnÃŊ obrÃĄzok", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} nezoskupenÃŊch", "unstacked_assets_count": "ZruÅĄenÊ zoskupenia pre {count, plural, one {# poloÅžku} few {# poloÅžky} other {# poloÅžiek}}", "unsupported_field_type": "NepodporovanÃŊ typ poÄža", + "unsupported_file_type": "SÃēbor {file} nie je moÅžnÊ nahraÅĨ, lebo typ {type} nie je podporovanÃŊ.", "untagged": "Bez ÅĄtítku", "untitled_workflow": "PracovnÃŊ postup bez nÃĄzvu", "up_next": "To je vÅĄetko", @@ -2328,6 +2339,8 @@ "url": "Odkaz URL", "usage": "PouÅžitie", "use_biometric": "PouÅžiÅĨ biometrickÊ Ãēdaje", + "use_browser_locale": "PouÅžiÅĨ jazyk prehliadača", + "use_browser_locale_description": "FormÃĄtovaÅĨ dÃĄtumy, časy a čísla podÄža nastavenia vÃĄÅĄho prehliadača", "use_current_connection": "PouÅžiÅĨ aktuÃĄlne pripojenie", "use_custom_date_range": "PouÅžiÅĨ radÅĄej vlastnÃŊ rozsah dÃĄtumov", "user": "PouŞívateÄž", diff --git a/i18n/sl.json b/i18n/sl.json index b4f899bb4d..ce24a71fd3 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Tonska preslikava", "transcoding_tone_mapping_description": "PoskuÅĄa ohraniti videz videoposnetkov HDR pri pretvorbi v SDR. Vsak algoritem naredi različne kompromise glede barve, podrobnosti in svetlosti. Hable ohrani podrobnosti, Mobius ohrani barvo, Reinhard pa svetlost.", "transcoding_transcode_policy": "Politika prekodiranja", - "transcoding_transcode_policy_description": "Pravilnik o tem, kdaj je treba videoposnetek prekodirati. Videoposnetki HDR bodo vedno prekodirani (razen če je prekodiranje onemogočeno).", + "transcoding_transcode_policy_description": "Pravilnik o tem, kdaj je treba videoposnetek prekodirati. Videoposnetki HDR in videoposnetki z drugačnim formatom slikovnih pik kot YUV 4:2:0 bodo vedno prekodirani (razen če je prekodiranje onemogočeno).", "transcoding_two_pass_encoding": "Dvohodno kodiranje", "transcoding_two_pass_encoding_setting_description": "Prekodirajte v dveh prehodih za ustvarjanje bolje kodiranih videoposnetkov. Ko je omogočena največja bitna hitrost (ki je potrebna za delovanje s H.264 in HEVC), ta način uporablja obseg bitne hitrosti, ki temelji na največji bitni hitrosti, in ignorira CRF. Za VP9 je mogoče uporabiti CRF, če je največja bitna hitrost onemogočena.", "transcoding_video_codec": "Video kodek", @@ -872,7 +872,7 @@ "current_server_address": "Trenutni naslov streÅžnika", "custom_date": "Datum po meri", "custom_locale": "Jezik po meri", - "custom_locale_description": "Oblikujte datume in ÅĄtevilke glede na jezik in regijo", + "custom_locale_description": "Oblikovanje datuma, časa in ÅĄtevilk glede na izbrani jezik in regijo", "custom_url": "URL po meri", "cutoff_date_description": "Shranite fotografije iz zadnjegaâ€Ļ", "cutoff_day": "{count, plural, one {dan} other {dni}}", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "Å tevilo podatkov EXIF", "deduplication_info": "Informacije o zaznavanju dvojnikov", "deduplication_info_description": "Za samodejno vnaprejÅĄnjo izbiro sredstev in mnoÅžično odstranjevanje dvojnikov si ogledamo:", - "default_locale": "Privzeti jezik", - "default_locale_description": "Oblikujte datume in ÅĄtevilke glede na lokalne nastavitve brskalnika", "delete": "IzbriÅĄi", "delete_action_confirmation_message": "Ali ste prepričani, da Åželite izbrisati to sredstvo? S tem dejanjem boste sredstvo premaknili v koÅĄ na streÅžniku in vas pozvali, ali ga Åželite izbrisati lokalno", "delete_action_prompt": "izbrisano {count}", @@ -1009,6 +1007,8 @@ "editor_edits_applied_success": "Spremembe so bile uspeÅĄno uporabljene", "editor_flip_horizontal": "Obrni vodoravno", "editor_flip_vertical": "Obrni navpično", + "editor_handle_corner": "{corner, select, top_left {Zgoraj levo} top_right {Zgoraj desno} bottom_left {Spodaj levo} bottom_right {Spodaj desno} other {A}} ročaj kota", + "editor_handle_edge": "{edge, select, top {Zgoraj} bottom {Spodaj} left {Levo} right {Desno} other {An}} ročaj roba", "editor_orientation": "Usmerjenost", "editor_reset_all_changes": "Ponastavi spremembe", "editor_rotate_left": "Zavrtite za 90° v levo", @@ -1074,6 +1074,7 @@ "failed_to_update_notification_status": "Stanja obvestila ni bilo mogoče posodobiti", "incorrect_email_or_password": "Napačen e-poÅĄtni naslov ali geslo", "library_folder_already_exists": "Ta pot uvoza Åže obstaja.", + "page_not_found": "Strani ni bilo mogoče najti", "paths_validation_failed": "{paths, plural, one {# pot ni bila uspeÅĄno preverjena} two {# poti nista bili uspeÅĄno preverjeni} few {# poti niso bile uspeÅĄno preverjene} other {# poti ni bilo uspeÅĄno preverjenih}}", "profile_picture_transparent_pixels": "Profilne slike ne smejo imeti prosojnih slikovnih pik. Povečajte in/ali premaknite sliko.", "quota_higher_than_disk_size": "Nastavili ste kvoto, ki je viÅĄja od velikosti diska", @@ -1218,6 +1219,7 @@ "filter_description": "Pogoji za filtriranje ciljnih sredstev", "filter_people": "Filtriraj ljudi", "filter_places": "Filtriraj kraje", + "filter_tags": "Filtriraj oznake", "filters": "Filtri", "find_them_fast": "Z iskanjem jih hitro poiÅĄÄite po imenu", "first": "Prvi", @@ -1649,6 +1651,7 @@ "only_favorites": "Samo priljubljene", "open": "Odpri", "open_calendar": "Odpri koledar", + "open_in_browser": "Odpri v brskalniku", "open_in_map_view": "Odpri v pogledu zemljevida", "open_in_openstreetmap": "Odpri v OpenStreetMap", "open_the_search_filters": "Odpri iskalne filtre", @@ -1808,9 +1811,8 @@ "rate_asset": "Oceni sredstvo", "rating": "Ocena z zvezdicami", "rating_clear": "Počisti oceno", - "rating_count": "{count, plural, one {# zvezdica} two {# zvezdici} few {# zvezdice} other {# zvezdic}}", + "rating_count": "{count, plural, =0 {Neocenjeno} one {# zvezdica} two {# zvezdici} few {# zvezdice} other {# zvezdic}}", "rating_description": "PrikaÅžite oceno EXIF v informacijski ploÅĄÄi", - "rating_set": "Ocena nastavljena na {rating, plural, one {# zvezdo} two {# zvezdi} few {# zvezde} other {# zvezd}}", "reaction_options": "MoÅžnosti reakcije", "read_changelog": "Preberi dnevnik sprememb", "readonly_mode_disabled": "Način samo za branje je onemogočen", @@ -1882,7 +1884,10 @@ "reset_pin_code_success": "PIN koda je bila uspeÅĄno ponastavljena", "reset_pin_code_with_password": "PIN-kodo lahko vedno ponastavite z geslom", "reset_sqlite": "Ponastavi bazo podatkov SQLite", - "reset_sqlite_confirmation": "Ali ste prepričani, da Åželite ponastaviti bazo podatkov SQLite? Za ponovno sinhronizacijo podatkov se boste morali odjaviti in znova prijaviti", + "reset_sqlite_clear_app_data": "Počisti podatke", + "reset_sqlite_confirmation": "Ali ste prepričani, da Åželite izbrisati podatke aplikacije? S tem boste odstranili vse nastavitve in se odjavili.", + "reset_sqlite_confirmation_note": "Opomba: Po brisanju boste morali aplikacijo znova zagnati.", + "reset_sqlite_done": "Podatki aplikacije so bili izbrisani. Ponovno zaÅženite Immich in se ponovno prijavite.", "reset_sqlite_success": "UspeÅĄno ponastavljena baza podatkov SQLite", "reset_to_default": "Ponastavi na privzeto", "resolution": "Ločljivost", @@ -1910,6 +1915,7 @@ "saved_settings": "Shranjene nastavitve", "say_something": "Reci kaj", "scaffold_body_error_occurred": "PriÅĄlo je do napake", + "scaffold_body_error_unrecoverable": "PriÅĄlo je do nepopravljive napake. Prosimo, delite napako in sled sklada na Discordu ali GitHubu, da vam lahko pomagamo. Če vam svetujemo, lahko spodaj izbriÅĄete podatke aplikacije.", "scan": "Skeniraj", "scan_all_libraries": "Preglej vse knjiÅžnice", "scan_library": "Pregled", @@ -1945,6 +1951,7 @@ "search_filter_ocr": "Iskanje po optičnem prepoznavanju znakov (OCR)", "search_filter_people_title": "Izberi osebe", "search_filter_star_rating": "Ocena z zvezdicami", + "search_filter_tags_title": "Izberite oznake", "search_for": "PoiÅĄÄi za", "search_for_existing_person": "Iskanje obstoječe osebe", "search_no_more_result": "Ni več rezultatov", @@ -2024,6 +2031,9 @@ "set_profile_picture": "Nastavi profilno sliko", "set_slideshow_to_fullscreen": "Nastavi diaprojekcijo na celozaslonski način", "set_stack_primary_asset": "Nastavi kot glavno sredstvo", + "setting_image_navigation_enable_subtitle": "Če je omogočeno, se lahko na prejÅĄnjo/naslednjo sliko premaknete tako, da se dotaknete skrajne leve/desne četrtine zaslona.", + "setting_image_navigation_enable_title": "Dotaknite se za usmerjanje", + "setting_image_navigation_title": "Usmerjanje slik", "setting_image_viewer_help": "Pregledovalnik podrobnosti najprej naloÅži majhno sličico, nato naloÅži predogled srednje velikosti (če je omogočen), na koncu naloÅži izvirnik (če je omogočen).", "setting_image_viewer_original_subtitle": "Omogoči nalaganje originalne slike polne ločljivosti (velike!). Onemogočite, da zmanjÅĄate porabo podatkov (tako v omreÅžju kot v predpomnilniku naprave).", "setting_image_viewer_original_title": "NaloÅži originalno sliko", @@ -2302,6 +2312,7 @@ "unstack_action_prompt": "{count} razloÅženih", "unstacked_assets_count": "RazloÅži {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}}", "unsupported_field_type": "Nepodprta vrsta polja", + "unsupported_file_type": "Datoteke {file} ni mogoče naloÅžiti, ker njena vrsta datoteke {type} ni podprta.", "untagged": "Neoznačeno", "untitled_workflow": "Neimenovani potek dela", "up_next": "Naslednja", @@ -2328,6 +2339,8 @@ "url": "URL", "usage": "Uporaba", "use_biometric": "Uporabite biometrične podatke", + "use_browser_locale": "Uporabi jezikovne nastavitve brskalnika", + "use_browser_locale_description": "Oblikujte datume, čase in ÅĄtevilke glede na jezikovne nastavitve brskalnika", "use_current_connection": "Uporabi trenutno povezavo", "use_custom_date_range": "Namesto tega uporabite časovno obdobje po meri", "user": "Uporabnik", diff --git a/i18n/sr_Cyrl.json b/i18n/sr_Cyrl.json index ad4dd8ecca..00fc4b3087 100644 --- a/i18n/sr_Cyrl.json +++ b/i18n/sr_Cyrl.json @@ -7,6 +7,7 @@ "action_common_update": "АĐļŅƒŅ€Đ¸Ņ€Đ°Ņ˜", "actions": "ĐŸĐžŅŅ‚ŅƒĐŋŅ†Đ¸", "active": "АĐēŅ‚Đ¸Đ˛ĐŊи", + "active_count": "АĐēŅ‚Đ¸Đ˛ĐŊĐž:{count}", "activity": "АĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚", "activity_changed": "АĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚ ҘĐĩ {enabled, select, true {ĐžĐŧĐžĐŗŅƒŅ›ĐĩĐŊа} other {ĐžĐŊĐĩĐŧĐžĐŗŅƒŅ›ĐĩĐŊа}}", "add": "Đ”ĐžĐ´Đ°Ņ˜", @@ -14,9 +15,12 @@ "add_a_location": "Đ”ĐžĐ´Đ°Ņ˜ ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Ņƒ", "add_a_name": "Đ”ĐžĐ´Đ°Ņ˜ иĐŧĐĩ", "add_a_title": "Đ”ĐžĐ´Đ°Ņ˜ ĐŊĐ°ŅĐģОв", + "add_action": "Đ”ĐžĐ´Đ°Ņ˜ ĐŋĐžŅŅ‚ŅƒĐŋаĐē", + "add_assets": "Đ”ĐžĐ´Đ°Ņ˜ ĐŋŅ€ĐĩĐ´ĐŧĐĩŅ‚Đĩ", "add_birthday": "Đ”ĐžĐ´Đ°Ņ˜ Ņ€ĐžŅ’ĐĩĐŊдаĐŊ", "add_endpoint": "Đ”ĐžĐ´Đ°Ņ˜ Đ°Đ´Ņ€Đĩҁ҃", "add_exclusion_pattern": "Đ”ĐžĐ´Đ°Ņ˜ ĐžĐąŅ€Đ°ĐˇĐ°Ņ† Đ¸ĐˇŅƒĐˇĐ¸ĐŧĐ°ŅšĐ°", + "add_filter": "Đ”ĐžĐ´Đ°Ņ˜ Ņ„Đ¸ĐģŅ‚ĐĩŅ€", "add_location": "Đ”ĐžĐ´Đ°Ņ˜ ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Ņƒ", "add_more_users": "Đ”ĐžĐ´Đ°Ņ˜ ĐēĐžŅ€Đ¸ŅĐŊиĐēĐĩ", "add_partner": "Đ”ĐžĐ´Đ°Ņ˜ ĐŋĐ°Ņ€Ņ‚ĐŊĐĩŅ€Đ°", @@ -733,8 +737,6 @@ "deduplication_criteria_2": "Đ‘Ņ€ĐžŅ˜ EXIF ĐŋĐžĐ´Đ°Ņ‚Đ°Đēа", "deduplication_info": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ˜Đĩ Đž Đ´ĐĩĐ´ŅƒĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸", "deduplication_info_description": "Да ĐąĐ¸ŅĐŧĐž Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи ҃ĐŊаĐŋŅ€ĐĩĐ´ ĐžĐ´Đ°ĐąŅ€Đ°Đģи Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ и ҃ĐēĐģĐžĐŊиĐģи Đ´ŅƒĐŋĐģиĐēĐ°Ņ‚Đĩ ĐŗŅ€ŅƒĐŋĐŊĐž, ĐŗĐģĐĩдаĐŧĐž:", - "default_locale": "ĐŸĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊа ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Đ° (ĐģĐžŅ†Đ°ĐģĐĩ)", - "default_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€Đ°Ņ˜Ņ‚Đĩ Đ´Đ°Ņ‚ŅƒĐŧĐĩ и ĐąŅ€ĐžŅ˜ĐĩвĐĩ ĐŊа ĐžŅĐŊĐžĐ˛Ņƒ ĐģĐžĐēаĐģĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ Đ˛Đ°ŅˆĐĩĐŗ ĐŋŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°Ņ‡Đ°", "delete": "ĐžĐąŅ€Đ¸ŅˆĐ¸", "delete_album": "ĐžĐąŅ€Đ¸ŅˆĐ¸ аĐģĐąŅƒĐŧ", "delete_api_key_prompt": "Да Đģи ҁ҂Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊи да ĐļĐĩĐģĐ¸Ņ‚Đĩ да Đ¸ĐˇĐąŅ€Đ¸ŅˆĐĩŅ‚Đĩ ĐžĐ˛Đ°Ņ˜ АПИ ĐēŅ™ŅƒŅ‡ (ĐēĐĩy)?", diff --git a/i18n/sr_Latn.json b/i18n/sr_Latn.json index b59f86f37c..d09e1a1abf 100644 --- a/i18n/sr_Latn.json +++ b/i18n/sr_Latn.json @@ -42,6 +42,7 @@ "add_to_shared_album": "Dodaj u deljen album", "add_upload_to_stack": "Dodaj fajl u snop", "add_url": "Dodaj URL", + "add_workflow_step": "Dodaj korak toka posla", "added_to_archive": "Dodato u arhivu", "added_to_favorites": "Dodato u favorite", "added_to_favorites_count": "Dodato {count, number} u favorite", @@ -83,6 +84,7 @@ "duplicate_detection_job_description": "Pokrenite maÅĄinsko učenje na sredstvima da biste otkrili slične slike. Oslanja se na pametnu pretragu", "exclusion_pattern_description": "Obrasci izuzimanja vam omogucˁavaju da ignoriÅĄete datoteke i fascikle kada skenirate biblioteku. Ovo je korisno ako imate fascikle koje sadrÅže datoteke koje ne Åželite da uvezete, kao ÅĄto su RAW datoteke.", "export_config_as_json_description": "Skini trenutnu sistemsku konfiguraciju kao JSON fajl", + "external_libraries_page_description": "Administrativna spoljna stranica biblioteke", "face_detection": "Detekcija lica", "face_detection_description": "Otkrijte lica u datotekama pomocˁu maÅĄinskog učenja. Za video snimke se uzima u obzir samo sličica. „OsveÅži“ (ponovno) obrađuje sve datoteke. „Resetovanje“ dodatno briÅĄe sve trenutne podatke o licu. „Nedostaju“ datoteke u redu koje joÅĄ nisu obrađene. Otkrivena lica cˁe biti stavljena u red za prepoznavanje lica nakon ÅĄto se prepoznavanje lica zavrÅĄi, grupiÅĄucˁi ih u postojecˁe ili nove osobe.", "facial_recognition_job_description": "Grupa je detektovala lica i dodala ih postojecˁim osobama. Ovaj korak se pokrecˁe nakon ÅĄto je prepoznavanje lica zavrÅĄeno. „Resetuj“ (ponovno) grupiÅĄe sva lica. „Nedostaju“ lica u redovima kojima nije dodeljena osoba.", @@ -103,6 +105,7 @@ "image_preview_quality_description": "Kvalitet pregleda od 1-100. ViÅĄe je bolje, ali proizvodi vecˁe datoteke i moÅže smanjiti odziv aplikacije. Postavljanje niske vrednosti moÅže uticati na kvalitet maÅĄinskog učenja.", "image_preview_title": "PodeÅĄavanja pregleda", "image_progressive": "Napredan", + "image_progressive_description": "Kodirajte JPEG slike progresivno za postepeno učitavanje prikaza. Ovo nema uticaja na WebP slike.", "image_quality": "Kvalitet", "image_resolution": "Rezolucija", "image_resolution_description": "Vecˁe rezolucije mogu da sačuvaju viÅĄe detalja, ali im je potrebno viÅĄe vremena za kodiranje, imaju vecˁe veličine datoteka i mogu da smanje odziv aplikacije.", @@ -111,6 +114,7 @@ "image_thumbnail_description": "Mala sličica sa ogoljenim metapodacima, koja se koristi prilikom pregleda grupa fotografija kao ÅĄto je glavna vremenska linija", "image_thumbnail_quality_description": "Kvalitet sličica od 1-100. ViÅĄe je bolje, ali proizvodi vecˁe datoteke i moÅže smanjiti odziv aplikacije.", "image_thumbnail_title": "PodeÅĄavanja sličica", + "import_config_from_json_description": "Uvezite sistemsku konfiguraciju otpremanjem JSON konfiguracione datoteke", "job_concurrency": "{job} paralelnost", "job_created": "Posao kreiran", "job_not_concurrency_safe": "Ovaj posao nije bezbedan da bude paralelno aktivan.", @@ -118,24 +122,33 @@ "job_settings_description": "Upravljajte paralelnoÅĄcˁu poslova", "jobs_delayed": "{jobCount, plural, one {# odloÅženi} few {# odloÅžena} other {# odloÅženih}}", "jobs_failed": "{jobCount, plural, one {# neuspeÅĄni} few {# neuspeÅĄna} other {# neuspeÅĄnih}}", + "jobs_over_time": "Poslovi tokom vremena", "library_created": "Napravljena biblioteka: {library}", "library_deleted": "Biblioteka je izbrisana", + "library_details": "Detalji biblioteke", + "library_folder_description": "Navedite fasciklu za uvoz. Ova fascikla, uključujucˁi podfascikle, bicˁe skenirana za slike i video zapise.", + "library_remove_exclusion_pattern_prompt": "Da li ste sigurni da Åželite da uklonite ovaj obrazac isključenja?", + "library_remove_folder_prompt": "Da li ste sigurni da Åželite da uklonite ovu fasciklu za uvoz?", "library_scanning": "Periodično skeniranje", "library_scanning_description": "KonfiguriÅĄite periodično skeniranje biblioteke", "library_scanning_enable_description": "Omogucˁite periodično skeniranje biblioteke", "library_settings": "Spoljna biblioteka", "library_settings_description": "Upravljajte podeÅĄavanjima spoljne biblioteke", "library_tasks_description": "Obavljaj zadatke biblioteke", + "library_updated": "AÅžurirana biblioteka", "library_watching_enable_description": "Pratite spoljne biblioteke za promene datoteka", - "library_watching_settings": "Nadgledanje biblioteke (EKSPERIMENTALNO)", + "library_watching_settings": "Nadgledanje biblioteke [EKSPERIMENTALNO]", "library_watching_settings_description": "Automatski pratite promenjene datoteke", "logging_enable_description": "Omogucˁi evidentiranje", "logging_level_description": "Kada je omogucˁeno, koji nivo evidencije koristiti.", "logging_settings": "Evidentiranje", "machine_learning_availability_checks": "Provere dostupnosti", + "machine_learning_availability_checks_description": "Automatski detektuje i preferira dostupne servere za maÅĄinsko učenje", "machine_learning_availability_checks_enabled": "Omogući provere dostupnosti", "machine_learning_availability_checks_interval": "Interval provere", "machine_learning_availability_checks_interval_description": "Interval u milisekundama između provera dostupnosti", + "machine_learning_availability_checks_timeout": "Zahtev za vremensko ograničenje", + "machine_learning_availability_checks_timeout_description": "Vremensko ograničenje u milisekundama za provere dostupnosti", "machine_learning_clip_model": "Model CLIP", "machine_learning_clip_model_description": "Naziv CLIP modela je naveden ovde. Imajte na umu da morate ponovo da pokrenete posao „Pametno pretraÅživanje“ za sve slike nakon promene modela.", "machine_learning_duplicate_detection": "Detekcija duplikata", @@ -158,6 +171,18 @@ "machine_learning_min_detection_score_description": "Minimalni rezultat pouzdanosti za lice koje treba otkriti od 0-1. NiÅže vrednosti cˁe otkriti viÅĄe lica, ali mogu dovesti do laÅžnih pozitivnih rezultata.", "machine_learning_min_recognized_faces": "Najmanje prepoznatih lica", "machine_learning_min_recognized_faces_description": "Minimalni broj prepoznatih lica za kreiranje osobe. Povecˁanje ovoga čini prepoznavanje lica preciznijim po cenu povecˁanja ÅĄanse da lice nije dodeljeno osobi.", + "machine_learning_ocr": "OCR", + "machine_learning_ocr_description": "Koristite maÅĄinsko učenje za prepoznavanje teksta na slikama", + "machine_learning_ocr_enabled": "Omogucˁi OCR", + "machine_learning_ocr_enabled_description": "Ako je onemogucˁeno, slike necˁe biti prepoznate po tekstu.", + "machine_learning_ocr_max_resolution": "Maksimalna rezolucija", + "machine_learning_ocr_max_resolution_description": "Pregledi iznad ove rezolucije bicˁe promenjeni u veličinu uz očuvanje odnosa ÅĄirine i visine. Vecˁe vrednosti su preciznije, ali im je potrebno viÅĄe vremena za obradu i koriste viÅĄe memorije.", + "machine_learning_ocr_min_detection_score": "Minimalni rezultat detekcije", + "machine_learning_ocr_min_detection_score_description": "Minimalna ocena pouzdanosti za detekciju teksta je od 0 do 1. NiÅže vrednosti cˁe detektovati viÅĄe teksta, ali mogu dovesti do laÅžno pozitivnih rezultata.", + "machine_learning_ocr_min_recognition_score": "Minimalni rezultat prepoznavanja", + "machine_learning_ocr_min_score_recognition_description": "Minimalna ocena pouzdanosti za prepoznavanje detektovanog teksta je od 0 do 1. NiÅže vrednosti cˁe prepoznati viÅĄe teksta, ali mogu dovesti do laÅžno pozitivnih rezultata.", + "machine_learning_ocr_model": "OCR model", + "machine_learning_ocr_model_description": "Serverski modeli su precizniji od mobilnih modela, ali im je potrebno viÅĄe vremena za obradu i koriste viÅĄe memorije.", "machine_learning_settings": "PodeÅĄavanja maÅĄinskog učenja", "machine_learning_settings_description": "Upravljajte funkcijama i podeÅĄavanjima maÅĄinskog učenja", "machine_learning_smart_search": "Pametna pretraga", @@ -165,7 +190,23 @@ "machine_learning_smart_search_enabled": "Omogucˁite pametnu pretragu", "machine_learning_smart_search_enabled_description": "Ako je onemogucˁeno, slike necˁe biti kodirane za pametnu pretragu.", "machine_learning_url_description": "URL servera za maÅĄinsko učenje. Ako je navedeno viÅĄe URL adresa, svaki server cˁe biti pokuÅĄavan pojedinačno dok ne odgovori uspeÅĄno, redom od prvog do poslednjeg. Serveri koji ne odgovore bicˁe privremeno ignorisani dok se ponovo ne poveÅžu sa mreÅžom.", + "maintenance_delete_backup": "ObriÅĄi rezervnu kopiju", + "maintenance_delete_backup_description": "Ova datoteka cˁe biti nepovratno obrisana.", + "maintenance_delete_error": "Brisanje rezervne kopije nije uspelo.", + "maintenance_restore_backup": "Vrati rezervnu kopiju", + "maintenance_restore_backup_description": "Immich cˁe biti obrisan i vracˁen iz izabrane rezervne kopije. Rezervna kopija cˁe biti kreirana pre nego ÅĄto se nastavi.", + "maintenance_restore_backup_different_version": "Ova rezervna kopija je napravljena sa drugom verzijom [Immich]-a!", + "maintenance_restore_backup_unknown_version": "Nije mogucˁe utvrditi rezervnu verziju.", + "maintenance_restore_database_backup": "Vrati rezervnu kopiju baze podataka", + "maintenance_restore_database_backup_description": "Vracˁanje na ranije stanje baze podataka pomocˁu rezervne kopije", + "maintenance_settings": "OdrÅžavanje", + "maintenance_settings_description": "Stavite Immich u reÅžim odrÅžavanja.", + "maintenance_start": "Prebacite se na reÅžim odrÅžavanja", + "maintenance_start_error": "Pokretanje reÅžima odrÅžavanja nije uspelo.", + "maintenance_upload_backup": "Otpremi datoteku rezervne kopije baze podataka", + "maintenance_upload_backup_error": "Nije mogucˁe otpremiti rezervnu kopiju, da li je u pitanju .sql/.sql.gz datoteka?", "manage_concurrency": "Upravljanje paralelnoÅĄcˁu", + "manage_concurrency_description": "Idite na stranicu sa poslovima da biste upravljali konkurentnoÅĄcˁu poslova", "manage_log_settings": "Upravljajte podeÅĄavanjima evidencije", "map_dark_style": "Tamni stil", "map_enable_description": "Omogucˁite karakteristike mape", @@ -202,6 +243,7 @@ "nightly_tasks_settings_description": "Upravljaj noćnim zadacima", "nightly_tasks_start_time_setting": "Vreme početka", "nightly_tasks_start_time_setting_description": "Vreme kada server započinje noćne zadatke", + "nightly_tasks_sync_quota_usage_setting": "KoriÅĄcˁenje kvote sinhronizacije", "nightly_tasks_sync_quota_usage_setting_description": "AÅžurirajte kvotu memorijskog prostora korisnika na osnovu trenutne upotrebe", "no_paths_added": "Nema dodatih putanja", "no_pattern_added": "Nije dodat obrazac", @@ -214,6 +256,8 @@ "notification_email_ignore_certificate_errors_description": "IgnoriÅĄite greÅĄke u validaciji TLS sertifikata (ne preporučuje se)", "notification_email_password_description": "Lozinka za upotrebu pri autentifikaciji sa serverom e-poÅĄte", "notification_email_port_description": "Port servera e-poÅĄte (npr. 25, 465 ili 587)", + "notification_email_secure": "SMTPS", + "notification_email_secure_description": "Koristite SMTPS (SMTP preko TLS-a)", "notification_email_sent_test_email_button": "PoÅĄaljite probnu e-poÅĄtu i sačuvajte", "notification_email_setting_description": "PodeÅĄavanja za slanje obaveÅĄtenja putem e-poÅĄte", "notification_email_test_email": "PoÅĄaljite probnu e-poÅĄtu", @@ -228,11 +272,13 @@ "oauth_auto_register": "Automatska registracija", "oauth_auto_register_description": "Automatski registrujte nove korisnike nakon ÅĄto se prijavite pomocˁu OAuth-a", "oauth_button_text": "Tekst dugmeta", - "oauth_client_secret_description": "Potrebno ako OAuth provajder ne podrÅžava PKCE (Proof Key for Code Exchange)", + "oauth_client_secret_description": "Obavezno za poverljivog klijenta ili ako PKCE (Proof Key for Code Exchange) nije podrÅžan za javnog klijenta.", "oauth_enable_description": "Prijavite se pomocˁu OAuth-a", "oauth_mobile_redirect_uri": "URI za preusmeravanje mobilnih uređaja", "oauth_mobile_redirect_uri_override": "Zamena URI-ja mobilnog preusmeravanja", "oauth_mobile_redirect_uri_override_description": "Omogucˁi kada OAuth dobavljač (provider) ne dozvoljava mobilni URI, kao ÅĄto je ''{callback}''", + "oauth_role_claim": "Preuzimanje uloge", + "oauth_role_claim_description": "Automatski dodeli administratorski pristup na osnovu prisustva ovog zahteva. Zahtev moÅže imati „korisnik“ ili „administrator“.", "oauth_settings": "OAutorizacija", "oauth_settings_description": "Upravljajte podeÅĄavanjima za prijavu sa OAutorizacijom", "oauth_settings_more_details": "Za viÅĄe detalja o ovoj funkciji pogledajte dokumente.", @@ -244,15 +290,20 @@ "oauth_storage_quota_default_description": "Kvota u GiB koja se koristi kada nema potraÅživanja.", "oauth_timeout": "Vremensko ograničenje zahteva", "oauth_timeout_description": "Vremensko ograničenje za zahteve u milisekundama", + "ocr_job_description": "Koristite maÅĄinsko učenje za prepoznavanje teksta na slikama", "password_enable_description": "Prijavite se pomocˁu e-poÅĄte i lozinke", "password_settings": "Lozinka za prijavu", "password_settings_description": "Upravljajte podeÅĄavanjima za prijavu lozinkom", "paths_validated_successfully": "Sve putanje su uspeÅĄno potvrđene", "person_cleanup_job": "ČiÅĄcˁenje osoba", + "queue_details": "Detalji reda", + "queues": "Redovi čekanja za poslove", + "queues_page_description": "Stranica sa redovima čekanja za administratorske poslove", "quota_size_gib": "Veličina kvote (GiB)", "refreshing_all_libraries": "OsveÅžavanje svih biblioteka", "registration": "Registracija administratora", "registration_description": "PoÅĄto ste prvi korisnik na sistemu, bicˁete dodeljeni kao Admin i odgovorni ste za administrativne zadatke, a dodatne korisnike cˁete kreirati vi.", + "remove_failed_jobs": "Uklonite neuspeÅĄne zadatke", "require_password_change_on_login": "Zahtevati od korisnika da promeni lozinku pri prvom prijavljivanju", "reset_settings_to_default": "Resetujte podeÅĄavanja na podrazumevane vrednosti", "reset_settings_to_recent_saved": "Resetujte podeÅĄavanja na nedavno sačuvana podeÅĄavanja", @@ -260,13 +311,15 @@ "search_jobs": "TraÅži posloveâ€Ļ", "send_welcome_email": "PoÅĄaljite e-poÅĄtu dobrodoÅĄlice", "server_external_domain_settings": "Eksterni domain", - "server_external_domain_settings_description": "Domain za javne deljene veze, uključujucˁi http(s)://", + "server_external_domain_settings_description": "Domen koji se koristi za eksterne linkove", "server_public_users": "Javni korisnici", "server_public_users_description": "Svi korisnici (ime i adresa e-poÅĄte) su navedeni prilikom dodavanja korisnika u deljene albume. Kada je onemogucˁena, lista korisnika cˁe biti dostupna samo administratorima.", "server_settings": "PodeÅĄavanja servera", "server_settings_description": "Upravljajte podeÅĄavanjima servera", + "server_stats_page_description": "Stranica sa statistikom administratorskog servera", "server_welcome_message": "Poruka dobrodoÅĄlice", "server_welcome_message_description": "Poruka koja se prikazuje na stranici za prijavu.", + "settings_page_description": "Stranica sa podeÅĄavanjima administratora", "sidecar_job": "Bočni (sidecar) metapodaci", "sidecar_job_description": "Otkrijte ili sinhronizujte bočne (sidecar) metapodatke iz sistema datoteka", "slideshow_duration_description": "Broj sekundi za prikaz svake slike", @@ -281,6 +334,7 @@ "storage_template_migration_info": "Promene ÅĄablona cˁe se primeniti samo na nove datoteke. Da biste retroaktivno primenili ÅĄablon na prethodno otpremljene datoteke, pokrenite {job}.", "storage_template_migration_job": "Posao migracije skladiÅĄta", "storage_template_more_details": "Za viÅĄe detalja o ovoj funkciji pogledajte Å ablon za skladiÅĄte i njegove implikacije", + "storage_template_onboarding_description_v2": "Kada je omogucˁena, ova funkcija cˁe automatski organizovati datoteke na osnovu korisnički definisanog ÅĄablona. Za viÅĄe informacija, pogledajte dokumentaciju.", "storage_template_path_length": "PribliÅžno ograničenje duÅžine putanje: {length, number}/{limit, number}", "storage_template_settings": "Å ablon za skladiÅĄtenje", "storage_template_settings_description": "Upravljajte strukturom direktorijuma i imenom datoteke sredstva za otpremanje", @@ -297,7 +351,7 @@ "template_settings": "Å abloni obaveÅĄtenja", "template_settings_description": "Upravljajte prilagođenim ÅĄablonima za obaveÅĄtenja", "theme_custom_css_settings": "Prilagođeni CSS", - "theme_custom_css_settings_description": "Kaskadni listovi stilova (CSS) omogucˁavaju prilagođavanje dizajna Immich-a.", + "theme_custom_css_settings_description": "Kaskadni listovi stilova omogucˁavaju prilagođavanje dizajna Immich-a.", "theme_settings": "PodeÅĄavanje tema", "theme_settings_description": "Upravljajte prilagođavanjem Immich web interfejsa", "thumbnail_generation_job": "GeneriÅĄite sličice", @@ -327,13 +381,13 @@ "transcoding_encoding_options": "Opcije Kodiranja", "transcoding_encoding_options_description": "Podesite kodeke, rezoluciju, kvalitet i druge opcije za kodirane video zapise", "transcoding_hardware_acceleration": "Hardversko ubrzanje", - "transcoding_hardware_acceleration_description": "Ekperimentalno; mnogo brÅže, ali cˁe imati niÅži kvalitet pri istoj brzini prenosa", + "transcoding_hardware_acceleration_description": "Eksperimentalno: brÅže transkodovanje, ali moÅže smanjiti kvalitet pri istoj brzini prenosa", "transcoding_hardware_decoding": "Hardversko dekodiranje", "transcoding_hardware_decoding_setting_description": "Omogucˁava ubrzanje od kraja do kraja umesto da samo ubrzava kodiranje. MoÅžda necˁe raditi na svim video snimcima.", "transcoding_max_b_frames": "Maksimalni B-kadri", "transcoding_max_b_frames_description": "ViÅĄe vrednosti poboljÅĄavaju efikasnost kompresije, ali usporavaju kodiranje. MoÅžda nije kompatibilno sa hardverskim ubrzanjem na starijim uređajima. 0 onemogucˁava B-kadre, dok -1 automatski postavlja ovu vrednost.", "transcoding_max_bitrate": "Maksimalni bitrate", - "transcoding_max_bitrate_description": "PodeÅĄavanje maksimalnog bitrate-a moÅže učiniti veličine datoteka predvidljivijim uz manju cenu kvaliteta. Pri 720p, tipične vrednosti su 2600k za VP9 ili HEVC, ili 4500k za H.264. Onemogucˁeno ako je postavljeno na 0.", + "transcoding_max_bitrate_description": "Postavljanje maksimalne brzine prenosa moÅže učiniti veličine datoteka predvidljivijim uz manji gubitak kvaliteta. Pri 720p, tipične vrednosti su 2600 kbit/s za VP9 ili HEVC, ili 4500 kbit/s za H.264. Onemogucˁeno ako je podeÅĄeno na 0. Kada nije navedena jedinica, pretpostavlja se k (za kbit/s); stoga su 5000, 5000k i 5M (za Mbit/s) ekvivalentni.", "transcoding_max_keyframe_interval": "Maksimalni interval keyframe-a", "transcoding_max_keyframe_interval_description": "Postavlja maksimalnu udaljenost kadrova između ključnih kadrova. NiÅže vrednosti pogorÅĄavaju efikasnost kompresije, ali poboljÅĄavaju vreme traÅženja i mogu poboljÅĄati kvalitet scena sa brzim kretanjem. 0 automatski postavlja ovu vrednost.", "transcoding_optimal_description": "Video snimci vecˁi od ciljne rezolucije ili nisu u prihvacˁenom formatu", @@ -351,7 +405,7 @@ "transcoding_target_resolution": "Ciljana rezolucija", "transcoding_target_resolution_description": "Vecˁe rezolucije mogu da sačuvaju viÅĄe detalja, ali im je potrebno viÅĄe vremena za kodiranje, imaju vecˁe veličine datoteka i mogu da smanje brzinu aplikacije.", "transcoding_temporal_aq": "Vremenski (Temporal) AQ", - "transcoding_temporal_aq_description": "Odnosi se samo na NVENC. Povecˁava kvalitet scena sa visokim detaljima i niskim pokretima. MoÅžda nije kompatibilan sa starijim uređajima.", + "transcoding_temporal_aq_description": "VaÅži samo za NVENC. Temporalna adaptivna kvantizacija povecˁava kvalitet scena sa visokim nivoom detalja i niskim pokretima. MoÅžda nije kompatibilno sa starijim uređajima.", "transcoding_threads": "Niti (threads)", "transcoding_threads_description": "ViÅĄe vrednosti dovode do brÅžeg kodiranja, ali ostavljaju manje prostora serveru za obradu drugih zadataka dok je aktivan. Ova vrednost ne bi trebalo da bude vecˁa od broja CPU jezgara. Maksimizira iskoriÅĄcˁenost ako je podeÅĄeno na 0.", "transcoding_tone_mapping": "Mapiranje (tone-mapping)", @@ -367,6 +421,9 @@ "trash_number_of_days_description": "Broj dana za drÅžanje datoteka u otpadu pre nego ÅĄto ih trajno uklonite", "trash_settings": "PodeÅĄavanja smecˁa", "trash_settings_description": "Upravljajte podeÅĄavanjima smecˁa", + "unlink_all_oauth_accounts": "Raskini vezu sa svim OAuth nalozima", + "unlink_all_oauth_accounts_description": "Ne zaboravite da raskinete vezu sa svim OAuth nalozima pre nego ÅĄto pređete na novog dobavljača.", + "unlink_all_oauth_accounts_prompt": "Da li ste sigurni da Åželite da raskinete vezu sa svim OAuth nalozima? Ovo cˁe resetovati OAuth ID za svakog korisnika i ne moÅže se poniÅĄtiti.", "user_cleanup_job": "ČiÅĄcˁenje korisnika", "user_delete_delay": "Nalog i datoteke {user} bicˁe zakazani za trajno brisanje za {delay, plural, one {# dan} other {# dana}}.", "user_delete_delay_settings": "IzbriÅĄi uz kaÅĄnjenje", @@ -381,6 +438,8 @@ "user_restore_scheduled_removal": "Vrati korisnika - zakazano uklanjanje za {date, date, long}", "user_settings": "PodeÅĄavanja korisnika", "user_settings_description": "Upravljajte korisničkim podeÅĄavanjima", + "user_successfully_removed": "Korisnik {email} je uspeÅĄno uklonjen.", + "users_page_description": "Stranica administratorskih korisnika", "version_check_enabled_description": "Omogucˁite proveru novih izdanja", "version_check_implications": "Funkcija provere verzije se oslanja na periodičnu komunikaciju sa github.com", "version_check_settings": "Provera verzije", @@ -392,15 +451,20 @@ "admin_password": "Administratorska Lozinka", "administration": "Administracija", "advanced": "Napredno", + "advanced_settings_clear_image_cache": "ObriÅĄi keÅĄ slike", + "advanced_settings_clear_image_cache_error": "Brisanje keÅĄ memorije slika nije uspelo", + "advanced_settings_clear_image_cache_success": "UspeÅĄno obrisano {size}", "advanced_settings_enable_alternate_media_filter_subtitle": "Koristite ovu opciju za filtriranje medija tokom sinhronizacije na osnovu alternativnih kriterijuma. PokuÅĄajte ovo samo ako imate problema sa aplikacijom da otkrije sve albume.", "advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTALNO] Koristite filter za sinhronizaciju albuma na alternativnom uređaju", "advanced_settings_log_level_title": "Nivo evidencije (log): {level}", - "advanced_settings_prefer_remote_subtitle": "Neki uređaji veoma sporo učitavaju sličice sa sredstava na uređaju. Aktivirajte ovo podeÅĄavanje da biste umesto toga učitali udaljene slike.", + "advanced_settings_prefer_remote_subtitle": "Neki uređaji izuzetno sporo učitavaju sličice sa lokalnih resursa. Aktivirajte ovo podeÅĄavanje da biste umesto toga učitavali udaljene slike.", "advanced_settings_prefer_remote_title": "Preferirajte udaljene slike", "advanced_settings_proxy_headers_subtitle": "DefiniÅĄite proksi zaglavlja koje Immich treba da poÅĄalje sa svakim mreÅžnim zahtevom", - "advanced_settings_proxy_headers_title": "Proksi Headeri (headers)", + "advanced_settings_proxy_headers_title": "Prilagođeni proksi zaglavci [EKSPERIMENTALNO]", + "advanced_settings_readonly_mode_subtitle": "Omogucˁava reÅžim samo za čitanje gde se fotografije mogu samo pregledati, stvari poput odabira viÅĄe slika, deljenja, emitovanja i brisanja su onemogucˁene. Omogucˁi/onemogucˁi reÅžim samo za čitanje preko korisničkog avatara sa glavnog ekrana", + "advanced_settings_readonly_mode_title": "ReÅžim samo za čitanje", "advanced_settings_self_signed_ssl_subtitle": "Preskače verifikaciju SSL sertifikata za krajnju tačku servera. Obavezno za samopotpisane sertifikate.", - "advanced_settings_self_signed_ssl_title": "Dozvoli samopotpisane SSL sertifikate", + "advanced_settings_self_signed_ssl_title": "Dozvoli samopotpisane SSL sertifikate [EKSPERIMENTALNO]", "advanced_settings_sync_remote_deletions_subtitle": "Automatski izbriÅĄite ili vratite sredstvo na ovom uređaju kada se ta radnja preduzme na vebu", "advanced_settings_sync_remote_deletions_title": "Sinhronizujte udaljena brisanja [EKSPERIMENTALNO]", "advanced_settings_tile_subtitle": "Napredna korisnička podeÅĄavanja", @@ -409,11 +473,13 @@ "age_months": "Starost{months, plural, one {# mesec} other {# meseci}}", "age_year_months": "Starost 1 godina, {months, plural, one {# mesec} other {# mesec(a/i)}}", "age_years": "{years, plural, other {Starost #}}", + "album": "Album", "album_added": "Album dodan", "album_added_notification_setting_description": "Primi obaveÅĄtenje e-poÅĄtom kad budeÅĄ dodan u deljen album", "album_cover_updated": "Omot albuma aÅžuriran", "album_delete_confirmation": "Da li stvarno Åželite da izbriÅĄete album {album}?", "album_delete_confirmation_description": "Ako se ovaj album deli, drugi korisnici viÅĄe necˁe mocˁi da mu pristupe.", + "album_deleted": "Album obrisan", "album_info_card_backup_album_excluded": "ISKLJUČENO", "album_info_card_backup_album_included": "UKLJUČENO", "album_info_updated": "Informacija albuma aÅžurirana", @@ -423,9 +489,13 @@ "album_options": "Opcije albuma", "album_remove_user": "Ukloniti korisnika?", "album_remove_user_confirmation": "Da li ste sigurni da Åželite da uklonite {user}?", + "album_search_not_found": "Nije pronađen nijedan album koji odgovara vaÅĄoj pretrazi", + "album_selected": "Album selektovan", "album_share_no_users": "Izgleda da ste podelili ovaj album sa svim korisnicima ili da nemate nijednog korisnika sa kojim biste delili.", + "album_summary": "Rezime albuma", "album_updated": "Album aÅžuriran", "album_updated_setting_description": "Primite obaveÅĄtenje e-poÅĄtom kada deljeni album ima nova svojstva", + "album_upload_assets": "Otpremite sadrÅžaj sa računara i dodajte ga u album", "album_user_left": "Napustio/la {album}", "album_user_removed": "Uklonjen {user}", "album_viewer_appbar_delete_confirm": "Da li ste sigurni da Åželite da izbriÅĄete ovaj album sa svog naloga?", @@ -439,26 +509,42 @@ "album_with_link_access": "Neka svako ko ima vezu vidi fotografije i ljude u ovom albumu.", "albums": "Albumi", "albums_count": "{count, plural, one {{count, number} Album} few {{count, number} Albumi} other {{count, number} Albumi}}", + "albums_default_sort_order": "Podrazumevani redosled sortiranja albuma", + "albums_default_sort_order_description": "Početni redosled sortiranja elemenata pri kreiranju novih albuma.", + "albums_feature_description": "Kolekcije imovine koje se mogu deliti sa drugim korisnicima.", + "albums_on_device_count": "Albumi na uređaju ({count})", + "albums_selected": "{count, plural, one {# izabranih albuma} other {# izabranih albuma}}", "all": "Sve", "all_albums": "Svi albumi", "all_people": "Sve osobe", + "all_photos": "Sve fotografije", "all_videos": "Svi video snimci", "allow_dark_mode": "Dozvoli tamni reÅžim", "allow_edits": "Dozvoli uređenje", "allow_public_user_to_download": "Dozvolite javnom korisniku da preuzme (download-uje)", "allow_public_user_to_upload": "Dozvoli javnom korisniku da otpremi (upload-uje)", + "allowed": "Dozvoljeno", "alt_text_qr_code": "Slika QR koda", + "always_keep": "Uvek sačuvaj", + "always_keep_photos_hint": "Oslobodi Prostor će sačuvati sve slike na ovom uređaju.", + "always_keep_videos_hint": "Oslobodi Prostor će sačuvati sve snimke na ovom uređaju.", "anti_clockwise": "U smeru suprotnom od kazaljke na satu", "api_key": "API ključ (key)", "api_key_description": "Ova vrednost cˁe biti prikazana samo jednom. Obavezno kopirajte pre nego ÅĄto zatvorite prozor.", "api_key_empty": "Ime vaÅĄeg API ključa ne bi trebalo da bude prazno", "api_keys": "API ključevi (keys)", + "app_architecture_variant": "Varijanta (Arhitektura)", "app_bar_signout_dialog_content": "Da li ste sigurni da Åželite da se odjavite?", "app_bar_signout_dialog_ok": "Da", "app_bar_signout_dialog_title": "Odjavite se", + "app_download_links": "Linkovi za preuzimanje aplikacije", "app_settings": "PodeÅĄavanja aplikacije", + "app_stores": "Prodavnice aplikacija", + "app_update_available": "Dostupna je nova verzija aplikacije", "appears_in": "Pojavljuje se u", + "apply_count": "Primeni ({count, number})", "archive": "Arhiva", + "archive_action_prompt": "{count} je dodato u Arhivu", "archive_or_unarchive_photo": "Arhivirajte ili poniÅĄtite arhiviranje fotografije", "archive_page_no_archived_assets": "Nisu pronađena arhivirana sredstva", "archive_page_title": "Arhiva ({count})", @@ -468,10 +554,12 @@ "archived_count": "{count, plural, other {Arhivirano #}}", "are_these_the_same_person": "Da li su ovo ista osoba?", "are_you_sure_to_do_this": "Jeste li sigurni da Åželite ovo da uradite?", + "array_field_not_fully_supported": "Polja niza zahtevaju ručne JSON izmene", "asset_action_delete_err_read_only": "Ne mogu da obriÅĄem element(e) samo za čitanje, preskačem", "asset_action_share_err_offline": "Nije mogucˁe preuzeti oflajn resurs(e), preskačem", "asset_added_to_album": "Dodato u album", "asset_adding_to_album": "Dodaje se u albumâ€Ļ", + "asset_created": "Stvar kreirana", "asset_description_updated": "Opis datoteke je aÅžuriran", "asset_filename_is_offline": "Datoteka {filename} je van mreÅže (offline)", "asset_has_unassigned_faces": "Datoteka ima nedodeljena lica", @@ -481,13 +569,18 @@ "asset_list_layout_settings_group_automatically": "Automatski", "asset_list_layout_settings_group_by": "GrupiÅĄi zapise po", "asset_list_layout_settings_group_by_month_day": "Mesec + Dan", + "asset_list_layout_sub_title": "Raspored", "asset_list_settings_subtitle": "Opcije za mreÅžni prikaz fotografija", "asset_list_settings_title": "MreÅžni prikaz fotografija", + "asset_not_found_on_device_android": "Stvar nije pronađena na uređaju", + "asset_not_found_on_device_ios": "Stvar nije pronađena na uređaju. Ako koristiÅĄ iCloud, stvar moÅže biti nedostupna ako je loÅĄ fajl sačuvan na iCloud", + "asset_not_found_on_icloud": "Stvar nije pronađena na iCloud. Stvar moÅže biti nedostupna ako je loÅĄ fajl sačuvan na iCloud", "asset_offline": "Datoteka odsutna", "asset_offline_description": "Ova vanjska datoteka se viÅĄe ne nalazi na disku. Molimo kontaktirajte svog Immich administratora za pomocˁ.", "asset_restored_successfully": "Imovina je uspeÅĄno vracˁena", "asset_skipped": "Preskočeno", "asset_skipped_in_trash": "U otpad", + "asset_trashed": "Stvar ubačena u korpu", "asset_uploaded": "Otpremljeno (Uploaded)", "asset_uploading": "Otpremanjeâ€Ļ", "asset_viewer_settings_subtitle": "Upravljajte podeÅĄavanjima pregledača galerije", @@ -512,10 +605,13 @@ "authorized_devices": "OvlaÅĄcˁeni uređaji", "automatic_endpoint_switching_subtitle": "PoveÅžite se lokalno preko određenog Wi-Fi-ja kada je dostupan i koristite alternativne veze na drugim mestima", "automatic_endpoint_switching_title": "Automatska promena URL-ova", + "autoplay_slideshow": "Automatska projekcija", "back": "Nazad", "back_close_deselect": "Nazad, zatvorite ili opozovite izbor", + "background_backup_running_error": "Pozadinska rezervna kopija se trenutno izvrÅĄava, nije moguće pokrenuti ručnu rezervnu kopiju", "background_location_permission": "Dozvola za lokaciju u pozadini", "background_location_permission_content": "Da bi se menjale mreÅže dok se radi u pozadini, Imih mora *uvek* imati precizan pristup lokaciji kako bi aplikacija mogla da pročita ime Wi-Fi mreÅže", + "background_options": "Pozadinske opcije", "backup": "Napravi rezervnu kopiju", "backup_album_selection_page_albums_device": "Albuma na uređaju ({count})", "backup_album_selection_page_albums_tap": "Dodirni da uključiÅĄ, dodirni dvaput da isključiÅĄ", @@ -523,8 +619,10 @@ "backup_album_selection_page_select_albums": "Odaberi albume", "backup_album_selection_page_selection_info": "Informacije o selekciji", "backup_album_selection_page_total_assets": "Ukupno jedinstvenih ***", + "backup_albums_sync": "Sinhronizacija Albuma Rezervne Kopije", "backup_all": "Sve", "backup_background_service_backup_failed_message": "Pravljenje rezervne kopije elemenata nije uspelo. PokuÅĄava se ponovoâ€Ļ", + "backup_background_service_complete_notification": "Rezervna kopija stvari zavrÅĄena", "backup_background_service_connection_failed_message": "Povezivanje sa serverom nije uspelo. PokuÅĄavam ponovoâ€Ļ", "backup_background_service_current_upload_notification": "Otpremanje {filename}", "backup_background_service_default_notification": "Proveravanje novih zapisaâ€Ļ", @@ -537,6 +635,7 @@ "backup_controller_page_background_app_refresh_enable_button_text": "Idi u podeÅĄavanja", "backup_controller_page_background_battery_info_link": "PokaÅži mi kako", "backup_controller_page_background_battery_info_message": "Za najpouzdanije pravljenje rezervnih kopija, ugasite bilo koju opciju u optimizacijama koje bi sprečavale Immich sa pravilnim radom.\n\nOvaj postupak varira od uređaja do uređaja, proverite potrebne korake za VaÅĄ uređaj.", + "backup_controller_page_background_battery_info_ok": "OK", "backup_controller_page_background_battery_info_title": "Optimizacija Baterije", "backup_controller_page_background_charging": "Samo tokom punjenja", "backup_controller_page_background_configure_error": "NeuspeÅĄno konfigurisanje pozadinskog servisa", @@ -571,12 +670,22 @@ "backup_controller_page_turn_on": "Uključi pravljenje rezervnih kopija u prvom planu", "backup_controller_page_uploading_file_info": "Otpremanje svojstava datoteke", "backup_err_only_album": "Nemoguće brisanje jedinog albuma", + "backup_error_sync_failed": "Sinhronizacija nije uspela. Nije moguće procesuirati rezervnu kopiju.", "backup_info_card_assets": "zapisi", "backup_manual_cancelled": "Otkazano", "backup_manual_in_progress": "Otpremanje je vecˁ u toku. PokuÅĄajte kasnije", "backup_manual_success": "Uspeh", + "backup_manual_title": "Status otpremanja", + "backup_options": "Opcije Rezervne Kopije", + "backup_options_page_title": "Opcije rezervne kopije", "backup_setting_subtitle": "Upravljajte podeÅĄavanjima otpremanja u pozadini i prednjem planu", + "backup_settings_subtitle": "Upravljanje opcijama otpremanja", + "backup_upload_details_page_more_details": "Pritisni za viÅĄe detalja", "backward": "Unazad", + "biometric_auth_enabled": "Biometrijska autentifikacija je uključena", + "biometric_locked_out": "Onemogućena ti je biometrijska autentifikacija", + "biometric_no_options": "Nema dostupnih biometrijskih opcija", + "biometric_not_available": "Biometrijska autentifikacija nije podrÅžana na ovom uređaju", "birthdate_saved": "Datum rođenja uspeÅĄno sačuvan", "birthdate_set_description": "Datum rođenja se koristi da bi se izračunale godine ove osobe u dobu određene fotografije.", "blurred_background": "Zamucˁena pozadina", @@ -589,7 +698,8 @@ "buy": "Kupite licencu Immich-a", "cache_settings_clear_cache_button": "ObriÅĄi keÅĄ memoriju", "cache_settings_clear_cache_button_title": "Ova opcija briÅĄe keÅĄ memoriju aplikacije. Ovo će bitno uticati na performanse aplikacije dok se keÅĄ memorija ne učita ponovo.", - "cache_settings_duplicated_assets_subtitle": "Fotografije i video snimci koje je aplikacija stavila na crnu listu", + "cache_settings_duplicated_assets_clear_button": "OČISTI", + "cache_settings_duplicated_assets_subtitle": "Fotografije i video snimci koje aplikacija ignoriÅĄe su navedeni", "cache_settings_duplicated_assets_title": "Duplirani elementi ({count})", "cache_settings_statistics_album": "Minijature biblioteka", "cache_settings_statistics_full": "Pune slike", @@ -606,47 +716,79 @@ "cancel": "Odustani", "cancel_search": "OtkaÅži pretragu", "canceled": "Otkazano", + "canceling": "Otkazivanje", "cannot_merge_people": "Ne moÅže spojiti osobe", "cannot_undo_this_action": "Ne moÅžete poniÅĄtiti ovu radnju!", "cannot_update_the_description": "Ne moÅže aÅžurirati opis", "change_date": "Promeni datum", + "change_description": "Promeni opis", "change_display_order": "Promeni redosled prikaza", "change_expiration_time": "Promeni vreme isteka", "change_location": "Promeni mesto", "change_name": "Promeni ime", - "change_name_successfully": "Promeni ime uspeÅĄno", + "change_name_successfully": "Ime je uspeÅĄno promenjeno", "change_password": "Promeni Lozinku", "change_password_description": "Ovo je ili prvi put da se prijavljujete na sistem ili je podnet zahtev za promenu lozinke. Unesite novu lozinku ispod.", "change_password_form_confirm_password": "Ponovo unesite ÅĄifru", "change_password_form_description": "Ćao, {name}\n\nOvo je verovatno VaÅĄe prvo pristupanje sistemu, ili je podneÅĄen zahtev za promenu ÅĄifre. Molimo Vas, unesite novu ÅĄifru ispod.", + "change_password_form_log_out": "Odjavi sve druge uređaje", + "change_password_form_log_out_description": "Preporučeno je da se odjaviÅĄ sa svih drugih uređaja", "change_password_form_new_password": "Nova ÅĄifra", "change_password_form_password_mismatch": "Å ifre se ne podudaraju", "change_password_form_reenter_new_password": "Ponovo unesite novu ÅĄifru", "change_pin_code": "Promena PIN koda", + "change_trigger": "Promeni okidač", + "change_trigger_prompt": "Da li zaista ÅželiÅĄ da iznemiÅĄ okidač? Ovo će ukloniti sve postojeće akcije i filtere.", "change_your_password": "Promeni svoju ÅĄifru", "changed_visibility_successfully": "Vidljivost je uspeÅĄno promenjena", + "charging": "Puni se", + "charging_requirement_mobile_backup": "Pozadinska rezervna kopija zahteva da uređaj bude na punjenju", "check_corrupt_asset_backup": "Proverite da li postoje oÅĄtecˁene rezervne kopije imovine", "check_corrupt_asset_backup_button": "IzvrÅĄite proveru", "check_corrupt_asset_backup_description": "Pokrenite ovu proveru samo preko Wi-Fi mreÅže i nakon ÅĄto se napravi rezervna kopija svih podataka. Postupak moÅže potrajati nekoliko minuta.", "check_logs": "Proverite dnevnike (logs)", + "checksum": "Kontrolni zbir", "choose_matching_people_to_merge": "Izaberite odgovarajucˁe osobe za spajanje", "city": "Grad", + "cleanup_confirm_description": "Immich je pronaÅĄao {count} stvari (napravljene pre {date}) sačuvane rezervnom kopijom na server. Obrisati lokalne kopije sa ovog uređaja?", + "cleanup_confirm_prompt_title": "Ukloni sa ovog uređaja?", + "cleanup_deleted_assets": "Pomereno je {count} stvari u kantu uređaja", + "cleanup_deleting": "Stavlja se u kantu...", + "cleanup_found_assets": "Pronađeno je {count} stvari u rezervnoj kopiji", + "cleanup_found_assets_with_size": "Pronađeno je {count} stvari u rezervnoj kopiji ({size})", + "cleanup_icloud_shared_albums_excluded": "iCloud Podeljeni Albumi su izostavljeni iz skeniranja", + "cleanup_no_assets_found": "Nisu pronađene stvari koje se podudaraju sa kriterijumom iznad. Oslobodi Prostor moÅže ukloniti samo stvari koje su sačuvane rezervnom kopijom na serveru", + "cleanup_preview_title": "Stvari za uklanjanje ({count})", + "cleanup_step3_description": "Skeniraj stvari iz rezervne kopije koje se podudaraju sa datumom i podeÅĄavanjima za čuvanje.", + "cleanup_step4_summary": "{count} stvari (napravljenih pre {date}) za brisanje sa lokalnog uređaja. Slike će ostati dostupne putem Immich aplikacije.", + "cleanup_trash_hint": "Da u potpunosti oslobodiÅĄ prostor, otvori sistemsku aplikaciju za galeriju i isprazni kantu", "clear": "Jasno", "clear_all": "IzbriÅĄi sve", "clear_all_recent_searches": "ObriÅĄite sve nedavne pretrage", "clear_message": "ObriÅĄi poruku", "clear_value": "Jasna vrednost", + "client_cert_dialog_msg_confirm": "OK", + "client_cert_enter_password": "Unesi Å ifru", + "client_cert_import": "Uvezi", "client_cert_import_success_msg": "Sertifikat klijenta je uvezen", "client_cert_invalid_msg": "NevaÅžecˁa datoteka sertifikata ili pogreÅĄna lozinka", + "client_cert_password_message": "Unesi ÅĄifru za ovaj sertifikat", + "client_cert_password_title": "Å ifra Sertifikata", "client_cert_remove_msg": "Sertifikat klijenta je uklonjen", "client_cert_subtitle": "PodrÅžava samo PKCS12 (.p12, .pfx) format. Uvoz/uklanjanje sertifikata je dostupno samo pre prijave", - "client_cert_title": "SSL klijentski sertifikat", + "client_cert_title": "SSL klijentski sertifikat [EKSPERIMENTALNO]", "clockwise": "U smeru kazaljke", "close": "Zatvori", "collapse": "Skupi", "collapse_all": "Skupi sve", "color": "Boja", "color_theme": "ReÅžim boja", + "command": "Komanda", + "command_palette_prompt": "Brzo pronađi stranice, akcije ili komande", + "command_palette_to_close": "za zatvaranje", + "command_palette_to_navigate": "za unos", + "command_palette_to_select": "za odabir", + "command_palette_to_show_all": "za prikaz svega", "comment_deleted": "Komentar obrisan", "comment_options": "Opcije komentara", "comments_and_likes": "Komentari i lajkovi", @@ -660,6 +802,10 @@ "confirm_keep_this_delete_others": "Sve ostale datoteke u grupi cˁe biti izbrisane osim ove datoteke. Da li ste sigurni da Åželite da nastavite?", "confirm_new_pin_code": "Potvrdite novi PIN kod", "confirm_password": "Ponovo unesi ÅĄifru", + "confirm_tag_face": "Da li ÅželiÅĄ da označiÅĄ ovo lice kao {name}?", + "confirm_tag_face_unnamed": "Da li ÅželiÅĄ da označiÅĄ ovo lice?", + "connected_device": "Pozevan uređaj", + "connected_to": "Povezan na", "contain": "Obuhvati", "context": "Kontekst", "continue": "Nastavi", @@ -686,30 +832,44 @@ "create": "Napravi", "create_album": "Napravi album", "create_album_page_untitled": "Bez naslova", + "create_api_key": "Kreiraj API ključ (key)", + "create_first_workflow": "Kreiraj prvi tok rada", "create_library": "Napravi Biblioteku", "create_link": "Napravi vezu", "create_link_to_share": "Napravi vezu za deljenje", "create_link_to_share_description": "Neka svako sa vezom vidi izabrane fotografije", + "create_new": "KREIRAJ NOVO", "create_new_person": "Napravi novu osobu", "create_new_person_hint": "Dodelite izabrane datoteke novoj osobi", "create_new_user": "Napravi novog korisnika", "create_shared_album_page_share_add_assets": "DODAJ SREDSTVA", "create_shared_album_page_share_select_photos": "Odaberi fotografije", + "create_shared_link": "Kreiraj deljeni link", "create_tag": "Kreirajte oznaku (tag)", "create_tag_description": "Napravite novu oznaku (tag). Za ugneŞđene oznake, unesite punu putanju oznake uključujucˁi kose crte.", "create_user": "Napravi korisnika", + "create_workflow": "Kreiraj tok rada", "created": "Napravljen", "created_at": "Kreirano", + "creating_linked_albums": "Kreiraju se povezani albumi...", "crop": "Obrezivanje", + "crop_aspect_ratio_fixed": "Fiksiran", + "crop_aspect_ratio_free": "Slobodan", + "crop_aspect_ratio_original": "Originalni", "curated_object_page_title": "Stvari", "current_device": "Trenutni uređaj", "current_pin_code": "Trenutni PIN kod", "current_server_address": "Trenutna adresa servera", - "custom_locale": "Prilagođena lokacija (locale)", - "custom_locale_description": "Formatirajte datume i brojeve na osnovu jezika i regiona", + "custom_date": "Odabir datuma", + "custom_locale": "Prilagođeni lokalitet", + "custom_locale_description": "Formatirajte datume, vreme i brojeve na osnovu izabranog jezika i regiona", + "custom_url": "Odabir URL", + "cutoff_date_description": "Sačuvaj slike od prethodnihâ€Ļ", "daily_title_text_date": "E dd MMM", "daily_title_text_date_year": "E dd MMM yyyy", "dark": "Tamno", + "dark_theme": "Primeni tamnu temu", + "date": "Datum", "date_after": "Datum posle", "date_and_time": "Datum i Vreme", "date_before": "Datum pre", @@ -717,14 +877,15 @@ "date_of_birth_saved": "Datum rođenja uspeÅĄno sačuvan", "date_range": "Raspon datuma", "day": "Dan", + "days": "Dani", "deduplicate_all": "De-dupliciraj sve", "deduplication_criteria_1": "Veličina slike u bajtovima", "deduplication_criteria_2": "Broj EXIF podataka", "deduplication_info": "Informacije o deduplikaciji", "deduplication_info_description": "Da bismo automatski unapred odabrali datoteke i uklonili duplikate grupno, gledamo:", - "default_locale": "Podrazumevana lokacija (locale)", - "default_locale_description": "Formatirajte datume i brojeve na osnovu lokalizacije vaÅĄeg pretraÅživača", "delete": "ObriÅĄi", + "delete_action_confirmation_message": "Da li sigurno ÅželiÅĄ da obriÅĄeÅĄ ovu stvar? Ova akcija će pomeriti stvar u serversku kantu i ponuditi da li ÅželiÅĄ da je obriÅĄeÅĄ i lokalno", + "delete_action_prompt": "{count} obrisano", "delete_album": "ObriÅĄi album", "delete_api_key_prompt": "Da li ste sigurni da Åželite da izbriÅĄete ovaj API ključ (key)?", "delete_dialog_alert": "Ove stvari će permanentno biti obrisane sa Immich-a i VaÅĄeg uređaja", @@ -738,9 +899,12 @@ "delete_key": "IzbriÅĄi ključ", "delete_library": "ObriÅĄi biblioteku", "delete_link": "ObriÅĄi vezu", + "delete_local_action_prompt": "{count} lokalno obrisano", "delete_local_dialog_ok_backed_up_only": "ObriÅĄi samo rezervne kopije", "delete_local_dialog_ok_force": "Ipak obriÅĄi", "delete_others": "IzbriÅĄite druge", + "delete_permanently": "ObriÅĄi zauvek", + "delete_permanently_action_prompt": "{count} obrisano zauvek", "delete_shared_link": "ObriÅĄi deljenu vezu", "delete_shared_link_dialog_title": "ObriÅĄi deljeni link", "delete_tag": "ObriÅĄi oznaku (tag)", @@ -749,13 +913,17 @@ "deleted_shared_link": "ObriÅĄena deljena veza", "deletes_missing_assets": "BriÅĄe sredstva koja nedostaju sa diska", "description": "Opis", + "description_input_hint_text": "Dodaj opis...", "description_input_submit_error": "GreÅĄka pri aÅžuriranju opisa, proverite dnevnik za viÅĄe detalja", + "deselect_all": "PoniÅĄti Izbor Svega", "details": "Detalji", "direction": "Smer", + "disable": "Onemogući", "disabled": "Onemogucˁeno", "disallow_edits": "Zabrani izmene", "discord": "Diskord", "discover": "Otkrijte", + "discovered_devices": "Pronađeni uređaji", "dismiss_all_errors": "Odbacite sve greÅĄke", "dismiss_error": "Odbaci greÅĄku", "display_options": "Opcije prikaza", @@ -766,14 +934,17 @@ "documentation": "Dokumentacija", "done": "Urađeno", "download": "Preuzmi", + "download_action_prompt": "Preuzimanje {count} stvari", "download_canceled": "Preuzmi otkazano", "download_complete": "Preuzmi zavrÅĄeno", "download_enqueue": "Preuzimanje je stavljeno u red", + "download_error": "GreÅĄka pri preuzimanju", "download_failed": "Preuzimanje nije uspelo", "download_finished": "Preuzimanje zavrÅĄeno", "download_include_embedded_motion_videos": "Ugrađeni video snimci", "download_include_embedded_motion_videos_description": "Uključite video zapise ugrađene u fotografije u pokretu kao zasebnu datoteku", "download_notfound": "Preuzimanje nije pronađeno", + "download_original": "Preuzmi original", "download_paused": "Preuzimanje je pauzirano", "download_settings": "Preuzimanje", "download_settings_description": "Upravljajte podeÅĄavanjima vezanim za preuzimanje datoteka", @@ -783,6 +954,7 @@ "download_waiting_to_retry": "Čekanje na ponovni pokuÅĄaj", "downloading": "Preuzimanje u toku", "downloading_asset_filename": "Preuzimanje datoteke {filename}", + "downloading_from_icloud": "Preuzmi sa iCloud", "downloading_media": "Preuzimanje medija", "drop_files_to_upload": "Ubacite datoteke bilo gde da ih otpremite (upload-ujete)", "duplicates": "Duplikati", @@ -791,22 +963,37 @@ "edit": "Uredi", "edit_album": "Uredi album", "edit_avatar": "Uredi avatar", + "edit_birthday": "Izmeni rođendan", "edit_date": "Uredi datum", "edit_date_and_time": "Uredi datum i vreme", + "edit_date_and_time_action_prompt": "{count} datuma i vremena izmenjeno", + "edit_date_and_time_by_offset_interval": "Novi raspon datuma: {from} - {to}", + "edit_description": "Izmeni opis", "edit_exclusion_pattern": "Izmenite obrazac izuzimanja", "edit_faces": "Uredi lica", "edit_key": "Izmeni ključ", "edit_link": "Uredi vezu", "edit_location": "Uredi lokaciju", + "edit_location_action_prompt": "{count} lokacija izmenjeno", "edit_location_dialog_title": "Lokacija", "edit_name": "Uredi ime", "edit_people": "Uredi osobe", "edit_tag": "Uredi oznaku (tag)", "edit_title": "Uredi titulu", "edit_user": "Uredi korisnika", + "edit_workflow": "Izmeni radni tok", "editor": "Urednik", "editor_close_without_save_prompt": "Promene necˁe biti sačuvane", "editor_close_without_save_title": "Zatvoriti uređivač?", + "editor_confirm_reset_all_changes": "Da li sigurno ÅželiÅĄ da sve promene vratiÅĄ na početna podeÅĄavanja?", + "editor_discard_edits_confirm": "Odbaci izmene", + "editor_discard_edits_prompt": "ImaÅĄ nesačuvane izneme. Da li sigurno zeliÅĄ da ih odbaciÅĄ?", + "editor_discard_edits_title": "Odbaci izmene?", + "editor_edits_applied_error": "NeuspeÅĄna primena izmena", + "editor_edits_applied_success": "Izmene primenjene uspeÅĄno", + "editor_flip_horizontal": "Okreni horizontalno", + "editor_flip_vertical": "Okreni vertikalno", + "editor_orientation": "Orijentacija", "email": "E-poÅĄta", "email_notifications": "ObaveÅĄtenja e-poÅĄtom", "empty_folder": "Ova mapa je prazna", @@ -817,6 +1004,7 @@ "end_date": "Krajnji datum", "enqueued": "Stavljeno u red", "enter_wifi_name": "Unesite naziv Wi-Fi mreÅže", + "enter_your_pin_code_subtitle": "Unesite VaÅĄ PIN da bi ste pristupili zaključanoj fascikli", "error": "GreÅĄka", "error_change_sort_album": "Promena redosleda sortiranja albuma nije uspela", "error_delete_face": "GreÅĄka pri brisanju osobe iz dela", @@ -856,9 +1044,11 @@ "failed_to_unstack_assets": "Rasklapanje datoteka nije uspelo", "failed_to_update_notification_status": "AÅžuriranje statusa obaveÅĄtenja nije uspelo", "incorrect_email_or_password": "Neispravan e-mail ili lozinka", + "page_not_found": "Stranica nije pronađena :/", "paths_validation_failed": "{paths, plural, one {# putanja nije proÅĄla} few {# putanje nisu proÅĄle} other {# putanja nisu proÅĄle}} proveru valjanosti", "profile_picture_transparent_pixels": "Slike profila ne mogu imati prozirne piksele. Molimo uvecˁajte i/ili pomerite sliku.", "quota_higher_than_disk_size": "Postavili ste kvotu vecˁu od veličine diska", + "something_went_wrong": "NeÅĄto je krenulo po zlu", "unable_to_add_album_users": "Nije mogucˁe dodati korisnike u album", "unable_to_add_assets_to_shared_link": "Nije mogucˁe dodati elemente deljenoj vezi", "unable_to_add_comment": "Nije mogucˁe dodati komentar", @@ -869,6 +1059,7 @@ "unable_to_archive_unarchive": "Nije mogucˁe {archived, select, true {arhivirati} other {de-arhivirati}}", "unable_to_change_album_user_role": "Nije mogucˁe promeniti ulogu korisnika albuma", "unable_to_change_date": "Nije mogucˁe promeniti datum", + "unable_to_change_description": "Nije moguće promeniti opis", "unable_to_change_favorite": "Nije mogucˁe promeniti favorit za datoteku/e", "unable_to_change_location": "Nije mogucˁe promeniti lokaciju", "unable_to_change_password": "Nije mogucˁe promeniti lozinku", @@ -876,6 +1067,7 @@ "unable_to_complete_oauth_login": "Nije mogucˁe dovrÅĄiti OAuth prijavu", "unable_to_connect": "Nije mogucˁe povezati se", "unable_to_copy_to_clipboard": "Nije mogucˁe kopirati u međuspremnik (clipboard), proverite da li pristupate stranici preko https-a", + "unable_to_create": "Nije moguće kreirati radni tok", "unable_to_create_admin_account": "Nije mogucˁe napraviti administratorski nalog", "unable_to_create_api_key": "Nije mogucˁe napraviti novi API ključ (key)", "unable_to_create_library": "Nije mogucˁe napraviti biblioteku", @@ -886,6 +1078,7 @@ "unable_to_delete_exclusion_pattern": "Nije mogucˁe izbrisati obrazac izuzimanja", "unable_to_delete_shared_link": "Nije mogucˁe izbrisati deljeni link", "unable_to_delete_user": "Nije mogucˁe izbrisati korisnika", + "unable_to_delete_workflow": "Nije moguće obrisati radni tok", "unable_to_download_files": "Nije mogucˁe preuzeti datoteke", "unable_to_edit_exclusion_pattern": "Nije mogucˁe izmeniti obrazac izuzimanja", "unable_to_empty_trash": "Nije mogucˁe isprazniti otpad", @@ -925,6 +1118,7 @@ "unable_to_scan_library": "Nije moguće skenirati biblioteku", "unable_to_set_feature_photo": "Nije mogucˁe postaviti istaknutu fotografiju", "unable_to_set_profile_picture": "Nije moguće postaviti profilnu sliku", + "unable_to_set_rating": "Nije moguće postaviti rejting", "unable_to_submit_job": "Nije moguće predati zadatak", "unable_to_trash_asset": "Nije mogucˁe izbaciti materijal u otpad", "unable_to_unlink_account": "Nije moguće raskinuti profil", @@ -936,13 +1130,21 @@ "unable_to_update_settings": "Nije moguće aÅžurirati podeÅĄavanja", "unable_to_update_timeline_display_status": "Nije moguće aÅžurirati status prikaza vremenske linije", "unable_to_update_user": "Nije moguće aÅžurirati korisnika", + "unable_to_update_workflow": "Nije moguće aÅžurirati radni tok", "unable_to_upload_file": "Nije mogucˁe otpremiti datoteku" }, - "exif": "EXIF", - "exif_bottom_sheet_description": "Dodaj opis...", + "errors_text": "GreÅĄke", + "exclusion_pattern": "Å ablon isključenja", + "exif": "Exif", + "exif_bottom_sheet_description": "Dodaj Opis...", + "exif_bottom_sheet_description_error": "GreÅĄka pri aÅžuriranju opisa", "exif_bottom_sheet_details": "DETALJI", "exif_bottom_sheet_location": "LOKACIJA", + "exif_bottom_sheet_no_description": "Bez opisa", + "exif_bottom_sheet_people": "LJUDI", + "exif_bottom_sheet_person_add_person": "Dodaj ime", "exit_slideshow": "Izađi iz projekcije slajdova", + "expand": "RaÅĄiri", "expand_all": "ProÅĄiri sve", "experimental_settings_new_asset_list_subtitle": "U izradi", "experimental_settings_new_asset_list_title": "Aktiviraj eksperimentalni mreÅžni prikaz fotografija", @@ -955,6 +1157,8 @@ "explorer": "PretraÅživač (Explorer)", "export": "Izvezi", "export_as_json": "Izvezi JSON", + "export_database": "Izvezi bazu podataka", + "export_database_description": "Izvezi SQLite bazu podataka", "extension": "Ekstenzija (Extension)", "external": "SpoljaÅĄnji", "external_libraries": "SpoljaÅĄnje Biblioteke", @@ -962,9 +1166,12 @@ "external_network_sheet_info": "Kada nije na Åželjenoj Wi-Fi mreÅži, aplikacija cˁe se povezati sa serverom preko prve od dole navedenih URL adresa do kojih moÅže da dođe, počevÅĄi od vrha do dna", "face_unassigned": "Neraspoređeni", "failed": "NeuspeÅĄno", + "failed_count": "Neuspelo: {count}", + "failed_to_authenticate": "NeuspeÅĄna autentifikacija", "failed_to_load_assets": "Datoteke nisu uspeÅĄno učitane", "failed_to_load_folder": "Učitavanje fascikle nije uspelo", "favorite": "Favorit", + "favorite_action_prompt": "{count} dodato u Omiljene", "favorite_or_unfavorite_photo": "Omiljena ili neomiljena fotografija", "favorites": "Favoriti", "favorites_page_no_favorites": "Nije pronađen nijedan omiljeni materijal", @@ -1005,12 +1212,15 @@ "header_settings_header_name_input": "Naziv zaglavlja", "header_settings_header_value_input": "Vrednost zaglavlja", "headers_settings_tile_title": "Prilagođeni proksi zaglavci", + "height": "Visina", "hi_user": "Zdravo {name} ({email})", "hide_all_people": "Sakrij sve osobe", "hide_gallery": "Sakrij galeriju", "hide_named_person": "Sakrij osobu {name}", "hide_password": "Sakrij lozinku", "hide_person": "Sakrij osobu", + "hide_schema": "Sakrij ÅĄemu", + "hide_text_recognition": "Sakrij prepoznavanje teksta", "hide_unnamed_people": "Sakrij neimenovane osobe", "home_page_add_to_album_conflicts": "Dodat {added} zapis u album {album}. {failed} zapisi su već u albumu.", "home_page_add_to_album_err_local": "Trenutno nemoguće dodati lokalne zapise u albume, preskacu se", @@ -1108,6 +1318,7 @@ "location_picker_latitude_hint": "Unesite svoju geografsku ÅĄirinu ovde", "location_picker_longitude_error": "Unesite vaÅžecˁu geografsku duÅžinu", "location_picker_longitude_hint": "Unesite svoju geografsku duÅžinu ovde", + "locked_folder": "Zaključana fascikla", "log_out": "Odjavi se", "log_out_all_devices": "Odjavite se sa svih uređaja", "logged_out_all_devices": "Odjavljeni su svi uređaji", @@ -1140,7 +1351,7 @@ "look": "Pogledaj", "loop_videos": "Ponavljajte video zapise", "loop_videos_description": "Omogucˁite za automatsko ponavljanje video zapisa u pregledniku detalja.", - "main_branch_warning": "Upotrebljavate razvojnu verziju; strogo preporučujemo upotrebu izdate verzije!", + "main_branch_warning": "Koristite razvojnu verziju; toplo preporučujemo da koristite objavljenu verziju!", "main_menu": "Glavni meni", "make": "Kreiraj", "manage_shared_links": "Upravljajte deljenim vezama", @@ -1151,7 +1362,7 @@ "manage_your_devices": "Upravljajte svojim prijavljenim uređajima", "manage_your_oauth_connection": "Upravljajte svojom OAuth vezom", "map": "Mapa", - "map_assets_in_bounds": "{count} fotografija", + "map_assets_in_bounds": "{count, plural, =0 {Nema fotografija u ovoj oblasti} one {# photo} other {# photos}}", "map_cannot_get_user_location": "Nije mogucˁe dobiti lokaciju korisnika", "map_location_dialog_yes": "Da", "map_location_picker_page_use_location": "Koristite ovu lokaciju", @@ -1198,6 +1409,8 @@ "missing": "Nedostaje", "month": "Mesec", "more": "ViÅĄe", + "move_off_locked_folder": "Premesti iz zaključane fascikle", + "move_to_locked_folder": "Premesti u zaključanu fasciklu", "moved_to_archive": "PremeÅĄteno {count, plural, one {# datoteka} other {# datoteke}} u arhivu", "moved_to_library": "PremeÅĄteno {count, plural, one {# datoteka} other {# datoteke}} u biblioteku", "moved_to_trash": "PremeÅĄteno u smecˁe", @@ -1225,7 +1438,7 @@ "no_albums_with_name_yet": "Izgleda da joÅĄ uvek nemate nijedan album sa ovim imenom.", "no_albums_yet": "Izgleda da joÅĄ nemate nijedan album.", "no_archived_assets_message": "Arhivirajte fotografije i video zapise da biste ih sakrili iz prikaza fotografija", - "no_assets_message": "KLIKNITE DA UPLOADIRATE SVOJU PRVU FOTOGRAFIJU", + "no_assets_message": "Kliknite da biste otpremili svoju prvu fotografiju", "no_assets_to_show": "Nema elemenata za prikaz", "no_duplicates_found": "Nije pronađen nijedan duplikat.", "no_exif_info_available": "Nema dostupnih exif informacija", @@ -1254,7 +1467,7 @@ "oldest_first": "Najstarije prvo", "on_this_device": "Na ovom uređaju", "onboarding": "Pristupanje (Onboarding)", - "onboarding_privacy_description": "Sledecˁe (opcione) funkcije se oslanjaju na spoljne usluge i mogu se onemogucˁiti u bilo kom trenutku u podeÅĄavanjima administracije.", + "onboarding_privacy_description": "Sledecˁe (opcionalne) funkcije se oslanjaju na spoljne servise i mogu se onemogucˁiti u bilo kom trenutku u podeÅĄavanjima.", "onboarding_theme_description": "Izaberite temu boja za svoj nalog. Ovo moÅžete kasnije da promenite u podeÅĄavanjima.", "onboarding_welcome_user": "DobrodoÅĄli, {user}", "online": "Dostupan (Online)", @@ -1346,7 +1559,7 @@ "preview": "Pregled", "previous": "ProÅĄlo", "previous_memory": "Prethodno secˁanje", - "previous_or_next_photo": "Prethodna ili sledecˁa fotografija", + "previous_or_next_photo": "Fotografija napred/nazad", "primary": "Primarna (Primary)", "privacy": "Privatnost", "profile": "Profil", @@ -1376,7 +1589,7 @@ "purchase_lifetime_description": "DoÅživotna licenca", "purchase_option_title": "OPCIJE KUPOVINE", "purchase_panel_info_1": "Izgradnja Immich-a zahteva mnogo vremena i truda, a imamo inÅženjere koji rade na tome sa punim radnim vremenom kako bismo je učinili ÅĄto je mogucˁe boljom. NaÅĄa misija je da softver otvorenog koda i etičke poslovne prakse postanu odrÅživ izvor prihoda za programere i da stvorimo ekosistem koji poÅĄtuje privatnost sa stvarnim alternativama eksploatativnim uslugama u oblaku.", - "purchase_panel_info_2": "PoÅĄto smo se obavezali da necˁemo dodavati platne zidove, ova kupovina vam necˁe dati nikakve dodatne funkcije u Immich-u. Oslanjamo se na korisnike poput vas da podrÅže Immich-ov stalni razvoj.", + "purchase_panel_info_2": "PoÅĄto smo se obavezali da ne dodajemo platne sisteme (paywall), ova kupovina vam necˁe omogucˁiti nikakve dodatne funkcije u Immich-u. Oslanjamo se na korisnike poput vas da podrÅže kontinuirani razvoj Immich-a.", "purchase_panel_title": "PodrÅžite projekat", "purchase_per_server": "Po serveru", "purchase_per_user": "Po korisniku", @@ -1389,7 +1602,7 @@ "purchase_settings_server_activated": "Ključem proizvoda servera upravlja administrator", "rating": "Ocena zvezdica", "rating_clear": "ObriÅĄi ocenu", - "rating_count": "{count, plural, one {# zvezda} other {# zvezde}}", + "rating_count": "{count, plural, =0 {Neocenjeno} one {# star} other {# stars}}", "rating_description": "PrikaÅžite EXIF ocenu u info panelu", "reaction_options": "Opcije reakcije", "read_changelog": "Pročitajte dnevnik promena", @@ -1610,7 +1823,7 @@ "shared_link_edit_expire_after_option_months": "{count} meseci", "shared_link_edit_expire_after_option_year": "{count} godina", "shared_link_edit_password_hint": "Unesite lozinku za deljenje", - "shared_link_error_server_url_fetch": "Ne mogu da preuzmem URL servera", + "shared_link_error_server_url_fetch": "Ne mogu da preuzmem url servera", "shared_link_expires_day": "Ističe za {count} dan(a)", "shared_link_expires_days": "Ističe za {count} dana", "shared_link_expires_hour": "Ističe za {count} sat", @@ -1709,7 +1922,7 @@ "tag_assets": "Označite (tag) sredstva", "tag_created": "Napravljena oznaka (tag): {tag}", "tag_feature_description": "Pregledavanje fotografija i video snimaka grupisanih po logičnim temama oznaka", - "tag_not_found_question": "Ne moÅžete da pronađete oznaku (tag)? Napravite novu oznaku", + "tag_not_found_question": "Ne moÅžete da pronađete oznaku? Napravite novu oznaku.", "tag_people": "Označite ljude", "tag_updated": "AÅžurirana oznaka (tag): {tag}", "tagged_assets": "Označeno (tagged) {count, plural, one {# datoteka} other {# datoteke}}", @@ -1799,7 +2012,7 @@ "upload_to_immich": "Otpremi u Immich ({count})", "uploading": "Otpremanje", "usage": "Upotreba", - "use_current_connection": "koristi trenutnu vezu", + "use_current_connection": "Koristi trenutnu vezu", "use_custom_date_range": "Umesto toga koristite prilagođeni period", "user": "Korisnik", "user_id": "ID korisnika", diff --git a/i18n/sv.json b/i18n/sv.json index ddc6a1b336..82c2398b02 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -5,7 +5,7 @@ "acknowledge": "Bekräfta", "action": "Åtgärd", "action_common_update": "Uppdatera", - "action_description": "En uppsättning ÃĨtgärder som ska utfÃļras pÃĨ de filtrerade tillgÃĨngarna", + "action_description": "En uppsättning ÃĨtgärder som ska utfÃļras pÃĨ de filtrerade objekten", "actions": "Händelser", "active": "Aktiv", "active_count": "Aktiva: {count}", @@ -18,7 +18,7 @@ "add_a_title": "Lägg till en titel", "add_action": "Lägg till ÃĨtgärd", "add_action_description": "Klicka fÃļr att lägga till en ÃĨtgärd att utfÃļra", - "add_assets": "Lägg till tillgÃĨngar", + "add_assets": "Lägg till objekt", "add_birthday": "Lägg till fÃļdelsedag", "add_endpoint": "Lägg till ändpunkt", "add_exclusion_pattern": "Lägg till uteslutningsmÃļnster", @@ -34,7 +34,7 @@ "add_to_album": "Lägg till i album", "add_to_album_bottom_sheet_added": "Tillagd till {album}", "add_to_album_bottom_sheet_already_exists": "Redan i {album}", - "add_to_album_bottom_sheet_some_local_assets": "Vissa lokala tillgÃĨngar kunde inte läggas till i albumet", + "add_to_album_bottom_sheet_some_local_assets": "Vissa lokala objekt kunde inte läggas till i albumet", "add_to_album_toggle": "Växla val fÃļr {album}", "add_to_albums": "Lägg till i album", "add_to_albums_count": "Lägg till i album ({count})", @@ -49,7 +49,7 @@ "admin": { "add_exclusion_pattern_description": "Lägg till exkluderande mÃļnster. Matchning med jokertecken *, ** samt ? stÃļdjs. FÃļr att ignorera alla filer i samtliga mappar som heter \"Raw\", använd \"**/Raw/**\". FÃļr att ignorera alla filer som slutar med \".tif\", använd \"**/*.tif\". FÃļr att ignorera en absolut sÃļkväg, använd \"/sÃļkväg/att/ignorera/**\".", "admin_user": "Adminanvändare", - "asset_offline_description": "Denna externa bibliotekstillgÃĨng finns inte längre pÃĨ disken och har flyttats till papperskorgen. Om filen flyttades inom biblioteket, kontrollera din tidslinje fÃļr den nya motsvarande tillgÃĨngen. FÃļr att ÃĨterställa denna tillgÃĨng, se till att filsÃļkvägen nedan kan nÃĨs av Immich och skanna biblioteket.", + "asset_offline_description": "Detta externa biblioteksobjekt finns inte längre pÃĨ disken och har flyttats till papperskorgen. Om filen flyttades inom biblioteket, kontrollera din tidslinje fÃļr det nya motsvarande objektet. FÃļr att ÃĨterställa detta objekt, se till att filsÃļkvägen nedan kan nÃĨs av Immich och skanna biblioteket.", "authentication_settings": "Autentiseringsinställningar", "authentication_settings_description": "Hantera lÃļsenord, OAuth, och andra autentiseringsinställningar", "authentication_settings_disable_all": "Är du säker pÃĨ att du vill inaktivera alla inloggningsmetoder? Inloggning kommer att helt inaktiveras.", @@ -101,7 +101,7 @@ "image_prefer_embedded_preview_setting_description": "Använd inbäddade fÃļrhandsvisningar i RAW-foton som indata till bildbehandling och när det är tillgängligt. Detta kan ge mer exakta färger fÃļr vissa bilder, men kvaliteten pÃĨ fÃļrhandsgranskningen är kameraberoende och bilden kan ha fler komprimeringsartefakter.", "image_prefer_wide_gamut": "FÃļredra brett färgomfÃĨng", "image_prefer_wide_gamut_setting_description": "Använd Display P3 fÃļr miniatyrer. Detta bevarar livfullheten bättre hos bilder med bred färgrymd, men bilder kan se annorlunda ut pÃĨ gamla enheter med en gammal webbläsarversion. sRGB-bilder behÃĨlls som sRGB fÃļr att undvika färgskiftningar.", - "image_preview_description": "Mellanstor bild med avskalad metadata, används vid visning av en enskild tillgÃĨng och fÃļr maskininlärning", + "image_preview_description": "Mellanstor bild med avskalad metadata, används vid visning av ett enskilt objekt och fÃļr maskininlärning", "image_preview_quality_description": "FÃļrhandsgranskningskvalitet frÃĨn 1-100. HÃļgre är bättre, men ger stÃļrre filer och kan gÃļra appen mindre fÃļljsam. Att ställa in ett lÃĨgt värde kan pÃĨverka kvaliteten pÃĨ maskininlärning.", "image_preview_title": "FÃļrhandsvisningsinställningar", "image_progressive": "Progressiv", @@ -150,10 +150,10 @@ "machine_learning_availability_checks_timeout": "Begär timeout", "machine_learning_availability_checks_timeout_description": "Timeout i millisekunder fÃļr tillgänglighetskontroller", "machine_learning_clip_model": "CLIP-modell", - "machine_learning_clip_model_description": "Namnet pÃĨ en CLIP-modell listad här . Observera att du mÃĨste kÃļra ett \"Smart SÃļkning\" jobb fÃļr alla bilder när du ändrar modell.", + "machine_learning_clip_model_description": "Namnet pÃĨ en CLIP-modell listad här. Observera att du mÃĨste kÃļra ett \"Smart SÃļkning\" jobb fÃļr alla bilder när du ändrar modell.", "machine_learning_duplicate_detection": "Dubblettdetektering", "machine_learning_duplicate_detection_enabled": "Aktivera dubblettdetektering", - "machine_learning_duplicate_detection_enabled_description": "Om den inaktiveras kommer exakt identiska tillgÃĨngar fortfarande att dedupliceras.", + "machine_learning_duplicate_detection_enabled_description": "Om inaktiverad, kommer identiska objekt fortfarande att vara deduplicerade.", "machine_learning_duplicate_detection_setting_description": "Använd CLIP-inbäddningar fÃļr att hitta troliga dubbletter", "machine_learning_enabled": "Aktivera maskininlärning", "machine_learning_enabled_description": "Om det är inaktiverat kommer alla ML-funktioner att inaktiveras oavsett inställningarna nedan.", @@ -236,7 +236,7 @@ "nightly_tasks_database_cleanup_setting": "Uppgifter fÃļr databassanering", "nightly_tasks_database_cleanup_setting_description": "Rensa bort gammal, utgÃĨngen data frÃĨn databasen", "nightly_tasks_generate_memories_setting": "Generera minnen", - "nightly_tasks_generate_memories_setting_description": "Skapa nya minnen frÃĨn tillgÃĨngar", + "nightly_tasks_generate_memories_setting_description": "Skapa nya minnen frÃĨn objekt", "nightly_tasks_missing_thumbnails_setting": "Generera saknade miniatyrbilder", "nightly_tasks_missing_thumbnails_setting_description": "KÃļa resurser utan miniatyrer fÃļr generering av miniatyrer", "nightly_tasks_settings": "Inställningar fÃļr nattliga uppgifter", @@ -247,7 +247,7 @@ "nightly_tasks_sync_quota_usage_setting_description": "Uppdatera användarlagringskvot baserat pÃĨ aktuell användning", "no_paths_added": "Inga vägar tillagda", "no_pattern_added": "Inga mÃļnster tillagda", - "note_apply_storage_label_previous_assets": "Obs: Om du vill använda lagringsetiketten pÃĨ tidigare uppladdade tillgÃĨngar kÃļr du", + "note_apply_storage_label_previous_assets": "Obs: Om du vill använda lagringsetiketten pÃĨ tidigare uppladdade objekt, kÃļr du", "note_cannot_be_changed_later": "OBS: Detta kan inte ändras i efterhand!", "notification_email_from_address": "FrÃĨn adress", "notification_email_from_address_description": "Avsändarens e-post, till exempel: \"Immich Fotoserver \". Säkerställ att du använder en adress som du har tillÃĨtelse att skicka e-post frÃĨn.", @@ -311,7 +311,7 @@ "search_jobs": "SÃļkjobbâ€Ļ", "send_welcome_email": "Skicka välkomstmail", "server_external_domain_settings": "Extern domän", - "server_external_domain_settings_description": "Domän fÃļr publikt delade länkar, inklusive http(s)://", + "server_external_domain_settings_description": "Domän som används fÃļr externa länkar", "server_public_users": "Vanlig användare", "server_public_users_description": "Alla användare (namn och e-post) är listade när man lägger till en användare till ett delat album. Om inaktiverat, kommer användarlistan endast vara synlig fÃļr administratÃļrer.", "server_settings": "Serverinställningar", @@ -411,25 +411,25 @@ "transcoding_tone_mapping": "Ton mappning", "transcoding_tone_mapping_description": "FÃļrsÃļker att bevara utseendet pÃĨ HDR-videor när de konverteras till SDR. Varje algoritm gÃļr olika avvägningar fÃļr färg, detaljer och ljusstyrka. Hable bevarar detaljer, Mobius bevarar färg och Reinhard bevarar ljusstyrkan.", "transcoding_transcode_policy": "Omkodningspolicy", - "transcoding_transcode_policy_description": "Policy fÃļr när en video ska omkodas. HDR-videor kommer alltid att omkodas (fÃļrutom om omkodning är inaktiverad).", + "transcoding_transcode_policy_description": "Policy fÃļr när en video ska omkodas. HDR-videor och videor med ett annat pixelformat än YUV 4:2:0 kommer alltid att omkodas (fÃļrutom om omkodning är inaktiverad).", "transcoding_two_pass_encoding": "TvÃĨ-pass kodning", "transcoding_two_pass_encoding_setting_description": "Koda om i tvÃĨ omgÃĨngar fÃļr att producera bättre kodade videor. När max bitrate är aktiverat (krävs fÃļr att det ska fungera med H.264 och HEVC), använder det här läget ett bithastighetsomrÃĨde baserat pÃĨ max bitrate och ignorerar CRF. FÃļr VP9 kan CRF användas om max bitrate är inaktiverat.", "transcoding_video_codec": "Video codec", "transcoding_video_codec_description": "VP9 har hÃļg effektivitet och webbkompatibilitet, men tar längre tid att omkoda. HEVC fungerar pÃĨ liknande sätt, men har lägre webbkompatibilitet. H.264 är allmänt kompatibel och snabb att omkoda, men producerar mycket stÃļrre filer. AV1 är den mest effektiva codec men saknar stÃļd pÃĨ äldre enheter.", "trash_enabled_description": "Aktivera papperskorgen", "trash_number_of_days": "Antal dagar", - "trash_number_of_days_description": "Antal dagar fÃļr att fÃļrvara tillgÃĨngarna i papperskorgen innan de permanent tas bort", + "trash_number_of_days_description": "Antal dagar att fÃļrvara objekten i papperskorgen innan de tas bort permanent", "trash_settings": "Papperskorginställningar", "trash_settings_description": "Hantera papperskorginställningar", "unlink_all_oauth_accounts": "Ta bort länken till alla OAuth-konton", "unlink_all_oauth_accounts_description": "Kom ihÃĨg att ta bort länken till alla OAuth-konton innan du migrerar till en ny leverantÃļr.", "unlink_all_oauth_accounts_prompt": "Är du säker pÃĨ att du vill ta bort länken till alla OAuth-konton? Detta ÃĨterställer OAuth-ID:t fÃļr varje användare och kan inte ÃĨngras.", "user_cleanup_job": "Användarrensning", - "user_delete_delay": "{user}s konto och tillgÃĨngar kommer att schemaläggas fÃļr permanent radering om {delay, plural, one {# day} other {# days}}.", + "user_delete_delay": "{user} 's konto och objekt kommer att schemaläggas fÃļr permanent radering om {delay, plural, one {# day} other {# days}}.", "user_delete_delay_settings": "BorttagningsfÃļrdrÃļjning", - "user_delete_delay_settings_description": "Antal dagar efter borttagning fÃļr att permanent radera en användares konto och tillgÃĨngar. Arbetet med borttagning av användare kÃļrs vid midnatt fÃļr att sÃļka efter användare som är redo fÃļr radering. Ändringar av denna inställning kommer att utvärderas vid nästa kÃļrning.", - "user_delete_immediately": "{user} konto och tillgÃĨngar kommer att stÃĨ i kÃļ fÃļr permanent radering.", - "user_delete_immediately_checkbox": "KÃļa användare och tillgÃĨngar fÃļr omedelbar radering", + "user_delete_delay_settings_description": "Antal dagar efter borttagning fÃļr att permanent radera en användares konto och objekt. Arbetet med borttagning av användare kÃļrs vid midnatt fÃļr att sÃļka efter användare som är redo fÃļr radering. Ändringar av denna inställning kommer att utvärderas vid nästa kÃļrning.", + "user_delete_immediately": "{user} konto och objekt kommer att stÃĨ i kÃļ fÃļr permanent radering.", + "user_delete_immediately_checkbox": "KÃļa användare och objekt fÃļr omedelbar radering", "user_details": "Användardetaljer", "user_management": "Användarhantering", "user_password_has_been_reset": "Användarens lÃļsenord har ÃĨterställts:", @@ -494,7 +494,7 @@ "album_share_no_users": "Det verkar som att du har delat det här albumet med alla användare eller sÃĨ har du inte nÃĨgon användare att dela med.", "album_summary": "Albumsammanfattning", "album_updated": "Albumet uppdaterat", - "album_updated_setting_description": "FÃĨ ett e-postmeddelande när ett delat album har nya tillgÃĨngar", + "album_updated_setting_description": "FÃĨ ett e-postmeddelande när ett delat album har nya objekt", "album_upload_assets": "Ladda upp material frÃĨn din dator och lägg till i album", "album_user_left": "Lämnade {album}", "album_user_removed": "Tog bort {user}", @@ -559,10 +559,10 @@ "asset_action_share_err_offline": "Kan inte hämta offline-objekt, hoppar Ãļver", "asset_added_to_album": "Lades till i album", "asset_adding_to_album": "Lägger till i album...â€Ļ", - "asset_created": "TillgÃĨng skapad", - "asset_description_updated": "TillgÃĨngens beskrivning har uppdaterats", - "asset_filename_is_offline": "TillgÃĨngen {filename} är offline", - "asset_has_unassigned_faces": "TillgÃĨngen har otilldelade ansikten", + "asset_created": "Objekt skapad", + "asset_description_updated": "Objektbeskrivning har uppdaterats", + "asset_filename_is_offline": "Objektet {filename} är offline", + "asset_has_unassigned_faces": "Objektet har otilldelade ansikten", "asset_hashing": "Hashing...â€Ļ", "asset_list_group_by_sub_title": "Gruppera pÃĨ", "asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout", @@ -572,16 +572,16 @@ "asset_list_layout_sub_title": "Layout", "asset_list_settings_subtitle": "Layoutinställningar fÃļr bildrutnät", "asset_list_settings_title": "Bildrutnät", - "asset_not_found_on_device_android": "TillgÃĨngar hittades inte pÃĨ enheten", - "asset_not_found_on_device_ios": "TillgÃĨngar hittades inte pÃĨ enheten. Om du använder iCloud kan tillgÃĨngen vara oÃĨtkomlig pÃĨ grund av en felaktig fil som lagrats pÃĨ iCloud", - "asset_not_found_on_icloud": "TillgÃĨngar hittades inte pÃĨ iCloud. TillgÃĨngen kan vara oÃĨtkomlig pÃĨ grund av en felaktig fil som lagras pÃĨ iCloud", - "asset_offline": "TillgÃĨng offline", - "asset_offline_description": "Denna externa tillgÃĨng finns inte längre pÃĨ disken. Kontakta din Immich-administratÃļr fÃļr hjälp.", + "asset_not_found_on_device_android": "Objektet hittades inte pÃĨ enheten", + "asset_not_found_on_device_ios": "Objektet hittades inte pÃĨ enheten. Om du använder iCloud kan objektet vara oÃĨtkomligt pÃĨ grund av en felaktig fil som lagrats pÃĨ iCloud", + "asset_not_found_on_icloud": "Objektet hittades inte pÃĨ iCloud. Objektet kan vara oÃĨtkomligt pÃĨ grund av en felaktig fil som lagras pÃĨ iCloud", + "asset_offline": "Objekt offline", + "asset_offline_description": "Detta externa objekt finns inte längre pÃĨ disken. Kontakta din Immich-administratÃļr fÃļr hjälp.", "asset_restored_successfully": "Objekt ÃĨterställt", "asset_skipped": "Överhoppad", "asset_skipped_in_trash": "I papperskorgen", - "asset_trashed": "TillgÃĨng kasserad", - "asset_troubleshoot": "FelsÃļkning av tillgÃĨngar", + "asset_trashed": "Objekt kasserat", + "asset_troubleshoot": "FelsÃļkning av objekt", "asset_uploaded": "Uppladdad", "asset_uploading": "Laddar upp...â€Ļ", "asset_viewer_settings_subtitle": "Hantera inställningar fÃļr gallerivisare", @@ -629,7 +629,7 @@ "backup_albums_sync": "Backup-albumsynkronisering", "backup_all": "Allt", "backup_background_service_backup_failed_message": "Säkerhetskopiering av foton och videor misslyckades. FÃļrsÃļker igenâ€Ļ", - "backup_background_service_complete_notification": "Säkerhetskopiering av tillgÃĨngar klar", + "backup_background_service_complete_notification": "Säkerhetskopiering av objekt klar", "backup_background_service_connection_failed_message": "Anslutning till servern misslyckades. FÃļrsÃļker igenâ€Ļ", "backup_background_service_current_upload_notification": "Laddar upp {filename}", "backup_background_service_default_notification": "SÃļker efter nya objektâ€Ļ", @@ -699,9 +699,9 @@ "bugs_and_feature_requests": "Buggar och funktionsfÃļrfrÃĨgningar", "build": "Bygge", "build_image": "Byggfil", - "bulk_delete_duplicates_confirmation": "Är du säker pÃĨ att du vill massradera {count, plural, one {# duplicate asset} other {# duplicate assets}}? Detta kommer att behÃĨlla den stÃļrsta tillgÃĨngen i varje grupp och permanent radera alla andra dubbletter. Du kan inte ÃĨngra den här ÃĨtgärden!", + "bulk_delete_duplicates_confirmation": "Är du säker pÃĨ att du vill massradera {count, plural, one {# dublettobjekt} other {# dublettobjekt}}? Detta kommer att behÃĨlla det stÃļrsta objektet i varje grupp och permanent radera alla andra dubbletter. Du kan inte ÃĨngra den här ÃĨtgärden!", "bulk_keep_duplicates_confirmation": "Är du säker pÃĨ att du vill behÃĨlla {count, plural, one {# duplicate asset} other {# duplicate assets}}? Detta kommer att lÃļsa alla dubbletter av grupper utan att ta bort nÃĨgonting.", - "bulk_trash_duplicates_confirmation": "Är du säker pÃĨ att du vill skicka till papperskorgen {count, plural, one {# duplicate asset} other {# duplicate assets}}? Detta kommer att behÃĨlla den stÃļrsta tillgÃĨngen i varje grupp och alla andra dubbletter kasseras.", + "bulk_trash_duplicates_confirmation": "Är du säker pÃĨ att du vill skicka {count, plural, one {# dublettobjekt} other {# dublettobjekt}} till papperskorgen? Detta kommer att behÃĨlla det stÃļrsta objektet i varje grupp och alla andra dubbletter kasseras.", "buy": "KÃļp Immich", "cache_settings_clear_cache_button": "Rensa cacheminnet", "cache_settings_clear_cache_button_title": "Rensar appens cacheminne. Detta kommer att avsevärt pÃĨverka appens prestanda tills cachen har byggts om.", @@ -764,12 +764,12 @@ "cleanup_deleted_assets": "Flyttade {count} material till enhetens papperskorg", "cleanup_deleting": "Flyttar till papperskorg...", "cleanup_found_assets": "Hittade {count} säkerhetskopierade material", - "cleanup_found_assets_with_size": "Hittade {count} säkerhetskopierade tillgÃĨngar ({size})", + "cleanup_found_assets_with_size": "Hittade {count} säkerhetskopierade objekt ({size})", "cleanup_icloud_shared_albums_excluded": "iCloud delade album exkluderas frÃĨn skanningen", - "cleanup_no_assets_found": "Inga tillgÃĨngar hittades som matchar kriterierna ovan. FrigÃļr utrymme kan bara ta bort tillgÃĨngar som har säkerhetskopierats till servern", + "cleanup_no_assets_found": "Inga objekt hittades som matchar kriterierna ovan. FrigÃļr utrymme kan bara ta bort objekt som har säkerhetskopierats till servern", "cleanup_preview_title": "Material att ta bort {count}", - "cleanup_step3_description": "Skanna efter säkerhetskopierade tillgÃĨngar som matchar ditt datum och behÃĨll inställningarna.", - "cleanup_step4_summary": "{count} tillgÃĨngar (skapade fÃļre {date}) att tas bort frÃĨn din lokala enhet. Foton kommer att fÃļrbli tillgängliga frÃĨn Immich-appen.", + "cleanup_step3_description": "Skanna efter säkerhetskopierade objekt som matchar ditt datum och behÃĨll inställningarna.", + "cleanup_step4_summary": "{count} objekt (skapade fÃļre {date}) att tas bort frÃĨn din lokala enhet. Foton kommer att fÃļrbli tillgängliga frÃĨn Immich-appen.", "cleanup_trash_hint": "FÃļr att helt frigÃļra lagringsutrymme, Ãļppna systemgalleriappen och tÃļm papperskorgen", "clear": "Rensa", "clear_all": "Rensa allt", @@ -794,6 +794,11 @@ "color": "Färg", "color_theme": "Färgtema", "command": "Kommando", + "command_palette_prompt": "Hitta snabbt sidor, ÃĨtgärder eller kommandon", + "command_palette_to_close": "att stänga", + "command_palette_to_navigate": "fÃļr att komma in", + "command_palette_to_select": "fÃļr att välja", + "command_palette_to_show_all": "fÃļr att visa alla", "comment_deleted": "Kommentar raderad", "comment_options": "Kommentarsalternativ", "comments_and_likes": "Kommentarer & likes", @@ -804,7 +809,7 @@ "confirm_admin_password": "Bekräfta administratÃļrslÃļsenord", "confirm_delete_face": "Är du säker pÃĨ att du vill ta bort {name}'s ansikte frÃĨn objektet?", "confirm_delete_shared_link": "Är du säker pÃĨ att du vill ta bort den här delade länken?", - "confirm_keep_this_delete_others": "Alla tillgÃĨngar fÃļrutom den här tas bort frÃĨn stacken. Är du säker pÃĨ att du vill fortsätta?", + "confirm_keep_this_delete_others": "Alla objekt fÃļrutom den här tas bort frÃĨn hÃļgen. Är du säker pÃĨ att du vill fortsätta?", "confirm_new_pin_code": "Bekräfta ny PIN-kod", "confirm_password": "Bekräfta lÃļsenord", "confirm_tag_face": "Vill du tagga det här ansiktet som {name}?", @@ -866,8 +871,8 @@ "current_pin_code": "Nuvarande PIN-kod", "current_server_address": "Aktuell server-adress", "custom_date": "Anpassat datum", - "custom_locale": "Anpassad plats", - "custom_locale_description": "Formatera datum och siffror baserat pÃĨ sprÃĨket och regionen", + "custom_locale": "Anpassad sprÃĨkinställning", + "custom_locale_description": "Formatera datum, tider och siffror baserat pÃĨ valt sprÃĨk och region", "custom_url": "Anpassad URL", "cutoff_date_description": "BehÃĨll bilder frÃĨnâ€Ļ", "cutoff_day": "{count, plural, one {dag} other {dagar}}", @@ -890,10 +895,8 @@ "deduplication_criteria_2": "Räkning av EXIF-data", "deduplication_info": "Dedupliceringsinformation", "deduplication_info_description": "FÃļr att automatiskt välja filer och ta bort dubletter i bulk analyserar vi:", - "default_locale": "Standardplats", - "default_locale_description": "Formatera datum och siffror baserat pÃĨ din webbläsares sprÃĨkversion", "delete": "Radera", - "delete_action_confirmation_message": "Är du säker pÃĨ att du vill ta bort den här tillgÃĨngen? Den här ÃĨtgärden flyttar tillgÃĨngen till serverns papperskorg och frÃĨgar om du vill ta bort den lokalt", + "delete_action_confirmation_message": "Är du säker pÃĨ att du vill ta bort det här objektet? Den här ÃĨtgärden flyttar objektet till serverns papperskorg och frÃĨgar om du vill ta bort den lokalt", "delete_action_prompt": "{count} raderade", "delete_album": "Ta bort album", "delete_api_key_prompt": "Är du säker pÃĨ att du vill ta bort denna API-nyckel?", @@ -938,7 +941,7 @@ "display_options": "Visningsalternativ", "display_order": "Visa Ordning", "display_original_photos": "Visa originalfoton", - "display_original_photos_setting_description": "FÃļredrar att visa originalfotot när du visar en tillgÃĨng snarare än miniatyrbilder när den ursprungliga tillgÃĨngen är webbkompatibel. Detta kan resultera i lÃĨngsammare bildvisningshastigheter.", + "display_original_photos_setting_description": "FÃļredra att visa originalfotot när du visar ett objekt snarare än miniatyrbilder när det ursprungliga objektet är webbkompatibelt. Detta kan resultera i lÃĨngsammare bildvisningshastigheter.", "do_not_show_again": "Visa inte det här meddelandet igen", "documentation": "Dokumentation", "done": "Klart", @@ -1029,7 +1032,7 @@ "error_loading_albums": "Fel vid laddning av album", "error_loading_image": "Fel vid bildladdning", "error_loading_partners": "Fel vid inläsning av partner: {error}", - "error_retrieving_asset_information": "Fel vid hämtning av tillgÃĨngsinformation", + "error_retrieving_asset_information": "Fel vid hämtning av objektinformation", "error_saving_image": "Fel: {error}", "error_tag_face_bounding_box": "Fel vid taggning av ansikte – kan inte hämta koordinater fÃļr begränsningsruta", "error_title": "Fel – nÃĨgot gick fel", @@ -1069,6 +1072,7 @@ "failed_to_update_notification_status": "Misslyckades med att uppdatera aviseringens status", "incorrect_email_or_password": "Felaktig e-postadress eller lÃļsenord", "library_folder_already_exists": "Denna sÃļkväg är redan importerad.", + "page_not_found": "Sidan hittades inte", "paths_validation_failed": "{paths, plural, one {# path} other {# paths}} misslyckades valideringen", "profile_picture_transparent_pixels": "Profilbilder kan inte ha genomskinliga pixlar. Zooma in och/eller flytta bilden.", "quota_higher_than_disk_size": "Du har angett en kvot som är hÃļgre än diskstorleken", @@ -1117,7 +1121,7 @@ "unable_to_log_out_device": "Det gick inte att logga ut enheten", "unable_to_login_with_oauth": "Det gick inte att logga in med OAuth", "unable_to_play_video": "Kunde inte spela upp video", - "unable_to_reassign_assets_existing_person": "Det gÃĨr inte att tilldela om tillgÃĨngar till {name, select, null {an existing person} other {{name}}}", + "unable_to_reassign_assets_existing_person": "Det gÃĨr inte att tilldela objekt till {name, select, null {an existing person} other {{name}}}", "unable_to_reassign_assets_new_person": "Kunde inte tilldela objekt till en annan person", "unable_to_refresh_user": "Kunde inte ladda om användaren", "unable_to_remove_album_users": "Kunde inte ta bort personen frÃĨn albumet", @@ -1129,7 +1133,7 @@ "unable_to_reset_password": "Kunde inte ÃĨterställa lÃļsenord", "unable_to_reset_pin_code": "Kunde inte ÃĨterställa pinkod", "unable_to_resolve_duplicate": "Det gÃĨr inte att lÃļsa dubbletter", - "unable_to_restore_assets": "Det gÃĨr inte att ÃĨterställa tillgÃĨngar", + "unable_to_restore_assets": "Det gÃĨr inte att ÃĨterställa objekt", "unable_to_restore_trash": "Det gick inte att ÃĨterställa papperskorgen", "unable_to_restore_user": "Kunde inte ÃĨterställa användare", "unable_to_save_album": "Kunde inte spara album", @@ -1168,6 +1172,7 @@ "exif_bottom_sheet_people": "PERSONER", "exif_bottom_sheet_person_add_person": "Lägg till namn", "exit_slideshow": "Avsluta bildspel", + "expand": "Expandera", "expand_all": "Expandera alla", "experimental_settings_new_asset_list_subtitle": "Under uppbyggnad", "experimental_settings_new_asset_list_title": "Aktivera experimentellt fotorutnät", @@ -1209,9 +1214,10 @@ "filename": "Filnamn", "filetype": "Filtyp", "filter": "Filter", - "filter_description": "Villkor fÃļr att filtrera mÃĨltillgÃĨngarna", + "filter_description": "Villkor fÃļr att filtrera objekten", "filter_people": "Filtrera personer", "filter_places": "Filtrera platser", + "filter_tags": "Filtrera taggar", "filters": "Filter", "find_them_fast": "Hitta dem snabbt efter namn med sÃļk", "first": "FÃļrst", @@ -1229,7 +1235,7 @@ "gcast_enabled": "Google-Cast", "gcast_enabled_description": "Denna funktion läser in externa resurser frÃĨn Google fÃļr att fungera.", "general": "Allmänt", - "geolocation_instruction_location": "Klicka pÃĨ en tillgÃĨng med GPS-koordinater fÃļr att använda dess plats, eller välj en plats direkt frÃĨn kartan", + "geolocation_instruction_location": "Klicka pÃĨ ett objekt med GPS-koordinater fÃļr att använda dess plats, eller välj en plats direkt frÃĨn kartan", "get_help": "FÃĨ hjälp", "get_people_error": "Fel vid hämtning av personer", "get_wifiname_error": "Kunde inte hämta Wi-Fi-namn. Säkerställ att du tillÃĨtit nÃļdvändiga rättigheter och är ansluten till ett Wi-Fi-nätverk", @@ -1249,8 +1255,8 @@ "haptic_feedback_switch": "Aktivera haptisk feedback", "haptic_feedback_title": "Haptisk Feedback", "has_quota": "Har kvot", - "hash_asset": "Hash-tillgÃĨng", - "hashed_assets": "Hash-tillgÃĨngar", + "hash_asset": "Hash-objekt", + "hashed_assets": "Hashade-objekt", "hashing": "Hashning", "header_settings_add_header_tip": "Lägg till header", "header_settings_field_validator_msg": "Värdet kan inte vara tomt", @@ -1315,7 +1321,7 @@ "in_year_selector": "In", "include_archived": "Inkludera arkiverade", "include_shared_albums": "Inkludera delade album", - "include_shared_partner_assets": "Inkludera delade partners tillgÃĨngar", + "include_shared_partner_assets": "Inkludera delade partners objekt", "individual_share": "Enskild delning", "individual_shares": "Individuella delningar", "info": "Information", @@ -1349,7 +1355,7 @@ "keep_on_device_hint": "Välj objekt som ska behÃĨllas pÃĨ denna enhet", "keep_this_delete_others": "BehÃĨll denna, radera Ãļvriga", "keeping": "BehÃĨller: {items}", - "kept_this_deleted_others": "BehÃĨll denna tillgÃĨng och borttagna {count, plural, one {# asset} other {# assets}}", + "kept_this_deleted_others": "BehÃĨll detta objekt och borttagna {count, plural, one {# objekt} other {# objekt}}", "keyboard_shortcuts": "Kortkommandon", "language": "SprÃĨk", "language_no_results_subtitle": "FÃļrsÃļk att justera ditt sÃļkord", @@ -1388,8 +1394,8 @@ "loading": "Inläsning", "loading_search_results_failed": "Det gick inte att läsa in sÃļkresultat", "local": "Lokalt", - "local_asset_cast_failed": "Det gÃĨr inte att casta en tillgÃĨng som inte har laddats upp till servern", - "local_assets": "Lokala tillgÃĨngar", + "local_asset_cast_failed": "Det gÃĨr inte att casta ett objekt som inte har laddats upp till servern", + "local_assets": "Lokala objekt", "local_id": "Lokalt ID", "local_media_summary": "Sammanfattning av lokala medier", "local_network": "Lokalt nätverk", @@ -1467,7 +1473,7 @@ "maintenance_title": "Tillfälligt otillgänglig", "make": "Tillverkare", "manage_geolocation": "Hantera plats", - "manage_media_access_rationale": "Denna behÃļrighet krävs fÃļr korrekt hantering av att flytta tillgÃĨngar till papperskorgen och ÃĨterställa dem frÃĨn den.", + "manage_media_access_rationale": "Denna behÃļrighet krävs fÃļr korrekt hantering av objekt flyttade till papperskorgen och ÃĨterställande frÃĨn den.", "manage_media_access_settings": "Öppna inställningar", "manage_media_access_subtitle": "TillÃĨt Immich-appen att hantera och flytta mediefiler.", "manage_media_access_title": "Åtkomst till mediehantering", @@ -1505,7 +1511,7 @@ "mark_as_read": "Markera som läst", "marked_all_as_read": "Markerade alla som lästa", "matches": "Matchar", - "matching_assets": "Matchande tillgÃĨngar", + "matching_assets": "Matchande objekt", "media_type": "Mediatyp", "memories": "Minnen", "memories_all_caught_up": "Du är ikapp", @@ -1586,8 +1592,8 @@ "no_assets_message": "Kicka fÃļr att ladda upp din fÃļrsta bild", "no_assets_to_show": "Inga objekt att visa", "no_cast_devices_found": "Inga Cast-enheter hittades", - "no_checksum_local": "Ingen kontrollsumma tillgänglig - kan inte hämta lokala tillgÃĨngar", - "no_checksum_remote": "Ingen kontrollsumma tillgänglig - kan inte hämta fjärrtillgÃĨng", + "no_checksum_local": "Ingen kontrollsumma tillgänglig - kan inte hämta lokala objekt", + "no_checksum_remote": "Ingen kontrollsumma tillgänglig - kan inte hämta fjärrobjekt", "no_configuration_needed": "Ingen konfiguration behÃļvs", "no_devices": "Inga auktoriserade enheter", "no_duplicates_found": "Inga dubbletter hittades.", @@ -1596,14 +1602,14 @@ "no_favorites_message": "Lägg till favoriter fÃļr att snabbt hitta dina bästa bilder och videor", "no_filters_added": "Inga filter tillagda än", "no_libraries_message": "Skapa ett externt bibliotek fÃļr att se dina bilder och videor", - "no_local_assets_found": "Inga lokala tillgÃĨngar hittades med denna kontrollsumma", + "no_local_assets_found": "Inga lokala objekt hittades med denna kontrollsumma", "no_location_set": "Ingen plats satt", "no_locked_photos_message": "Foton och videor i den lÃĨsta mappen är dolda och visas inte när du bläddrar eller sÃļker i ditt bibliotek.", "no_name": "Inget namn", "no_notifications": "Inga aviseringar", "no_people_found": "Inga matchande personer hittade", "no_places": "Inga platser", - "no_remote_assets_found": "Inga fjärrtillgÃĨngar hittades med denna kontrollsumma", + "no_remote_assets_found": "Inga fjärrobjekt hittades med denna kontrollsumma", "no_results": "Inga resultat", "no_results_description": "PrÃļva en synonym eller ett annat mer allmänt sÃļkord", "no_shared_albums_message": "Skapa ett album fÃļr att dela bilder och videor med andra personer", @@ -1642,6 +1648,8 @@ "online": "Ansluten", "only_favorites": "Endast favoriter", "open": "Öppen", + "open_calendar": "Öppna kalender", + "open_in_browser": "Öppna i webbläsare", "open_in_map_view": "Öppna kartvy", "open_in_openstreetmap": "Öppna med OpenStreetMap", "open_the_search_filters": "Öppna sÃļkfilter", @@ -1693,11 +1701,11 @@ "people_selected": "{count, plural, one {# person vald} other {# personer valda}}", "people_sidebar_description": "Visa en länk till Personer i sidopanelen", "permanent_deletion_warning": "Varning om permanent radering", - "permanent_deletion_warning_setting_description": "Visa en varning när tillgÃĨngar raderas permanent", + "permanent_deletion_warning_setting_description": "Visa en varning när objekt raderas permanent", "permanently_delete": "Radera permanent", "permanently_delete_assets_count": "Radera {count, plural, one {asset} other {assets}} permanent", "permanently_delete_assets_prompt": "Är du säker pÃĨ att du permanent vill ta bort {count, plural, one {denna fil?} other{these # filer?}} Detta kommer ocksÃĨ ta bort {count, plural, one {dem frÃĨn } other{them from their}} album.", - "permanently_deleted_asset": "Permanent raderad tillgÃĨng", + "permanently_deleted_asset": "Permanent raderat objekt", "permanently_deleted_assets_count": "Permanent borttagning av {count, plural, one {# asset} other {# assets}}", "permission": "BehÃļrigheter", "permission_empty": "Dina behÃļrighet kan inte vara blankt", @@ -1801,9 +1809,8 @@ "rate_asset": "Betygsätt materialet", "rating": "Antal stjärnor", "rating_clear": "Ta bort betyg", - "rating_count": "{count, plural, one {# stjärna} other {# stjärnor}}", + "rating_count": "{count, plural, =0 {Ej betygsatt} one {# stjärna} other {# stjärnor}}", "rating_description": "Visa EXIF betyget i informationspanelen", - "rating_set": "Rating set to {rating, plural, one {# stjärna} other {# stjärnor}}", "reaction_options": "Alternativ fÃļr reaktion", "read_changelog": "Läs ändringslogg", "readonly_mode_disabled": "Skrivskyddat läge inaktiverat", @@ -1812,7 +1819,7 @@ "reassign": "OmfÃļrdela", "reassigned_assets_to_existing_person": "Tilldelade om {count, plural, one {# objekt} other {# objekt}} till {name, select, null {an existing person} other {{name}}}", "reassigned_assets_to_new_person": "Tilldelade om {count, plural, one {# objekt} other {# objekt}} till en ny persson", - "reassing_hint": "Tilldela valda tillgÃĨngar till en befintlig person", + "reassing_hint": "Tilldela valda objekt till en befintlig person", "recent": "Nyligen", "recent_albums": "Senaste album", "recent_searches": "Senaste sÃļkningar", @@ -1832,14 +1839,14 @@ "refreshing_metadata": "Återladdar metadata", "regenerating_thumbnails": "Uppdaterar miniatyrer", "remote": "Fjärrr", - "remote_assets": "FjärrtillgÃĨngar", + "remote_assets": "Fjärrobjekt", "remote_media_summary": "Sammanfattning av fjärrmedia", "remove": "Ta bort", "remove_assets_album_confirmation": "Är du säker pÃĨ att du vill ta bort {count, plural, one {# asset} other {# assets}} frÃĨn albumet?", "remove_assets_shared_link_confirmation": "Är du säker pÃĨ att du vill ta bort {count, plural, one {# asset} other {# assets}} frÃĨn denna delade länk?", "remove_assets_title": "Ta bort filer?", "remove_custom_date_range": "Ta bort anpassat datumintervall", - "remove_deleted_assets": "Ta bort borttagna tillgÃĨngar", + "remove_deleted_assets": "Ta bort borttagna objekt", "remove_from_album": "Ta bort frÃĨn album", "remove_from_album_action_prompt": "{count} borttaget frÃĨn albumet", "remove_from_favorites": "Ta bort frÃĨn favoriter", @@ -1875,7 +1882,10 @@ "reset_pin_code_success": "PIN-koden har ÃĨterställts", "reset_pin_code_with_password": "Du kan alltid ÃĨterställa din PIN-kod med ditt lÃļsenord", "reset_sqlite": "Återställ SQLite-databasen", - "reset_sqlite_confirmation": "Är du säker pÃĨ att du vill ÃĨterställa SQLite-databasen? Du mÃĨste logga ut och logga in igen fÃļr att synkronisera om data", + "reset_sqlite_clear_app_data": "Rensa data", + "reset_sqlite_confirmation": "Är du säker pÃĨ att du vill rensa appdatan? Detta tar bort alla inställningar och du loggas ut.", + "reset_sqlite_confirmation_note": "Obs: Du mÃĨste starta om appen efter rensning.", + "reset_sqlite_done": "Appdata har raderats. Starta om Immich och logga in igen.", "reset_sqlite_success": "Återställde SQLite-databasen", "reset_to_default": "Återställ till standard", "resolution": "UpplÃļsning", @@ -1885,7 +1895,7 @@ "restore_all": "Återställ alla", "restore_trash_action_prompt": "{count} ÃĨterställd frÃĨn papperskorgen", "restore_user": "Återställ användare", - "restored_asset": "Återställ tillgÃĨng", + "restored_asset": "Återställ objekt", "resume": "Återuppta", "resume_paused_jobs": "Återuppta {count, plural, one {# pausat jobb} other {# pausade jobb}}", "retry_upload": "Ladda upp igen", @@ -1903,6 +1913,7 @@ "saved_settings": "Sparade inställningar", "say_something": "Säg nÃĨgot", "scaffold_body_error_occurred": "Fel uppstod", + "scaffold_body_error_unrecoverable": "Ett oÃĨterkalleligt fel har uppstÃĨtt. Vänligen dela felet och stackspÃĨrningen pÃĨ Discord eller GitHub sÃĨ att vi kan hjälpa till. Om du fÃĨtt rÃĨdet att rensa appdata kan du gÃļra det nedan.", "scan": "Skanna", "scan_all_libraries": "Skanna alla bibliotek", "scan_library": "Skanna", @@ -1938,6 +1949,7 @@ "search_filter_ocr": "SÃļk efter OCR", "search_filter_people_title": "Välj personer", "search_filter_star_rating": "Stjärnbetyg", + "search_filter_tags_title": "Välj taggar", "search_for": "SÃļk efter", "search_for_existing_person": "SÃļk efter befintlig person", "search_no_more_result": "Inga fler resultat", @@ -2016,7 +2028,10 @@ "set_date_of_birth": "Ange fÃļdelsedatum", "set_profile_picture": "Ange som profilbild", "set_slideshow_to_fullscreen": "Ställ in bildspel pÃĨ helskärm", - "set_stack_primary_asset": "Ange som primär tillgÃĨng", + "set_stack_primary_asset": "Ange som primärt objekt", + "setting_image_navigation_enable_subtitle": "Om det är aktiverat kan du navigera till fÃļregÃĨende/nästa bild genom att trycka pÃĨ den vänstra/hÃļgra fjärdedelen av skärmen.", + "setting_image_navigation_enable_title": "Tryck fÃļr att navigera", + "setting_image_navigation_title": "Bildnavigation", "setting_image_viewer_help": "Detaljerad vy laddar miniatyrer fÃļrst. Efter detta laddas den medelstora fÃļrhandsgranskningen av bilden (om detta är aktiverat), och visar slutligen originalet (om detta är aktiverat).", "setting_image_viewer_original_subtitle": "Aktivera fÃļr att ladda originalbilden i full storlek (stor!). Inaktivera fÃļr att minska dataanvändningen (bÃĨde i nätverket och fÃļr enhetscache).", "setting_image_viewer_original_title": "Ladda originalbilden", @@ -2034,7 +2049,7 @@ "setting_notifications_single_progress_subtitle": "Detaljerad uppladdningsstatus per bild och video", "setting_notifications_single_progress_title": "Visa detaljerat uppladdningsfÃļrlopp", "setting_notifications_subtitle": "Anpassa dina notis-inställningar", - "setting_notifications_total_progress_subtitle": "Övergripande uppladdningsfÃļrlopp (klar/totala tillgÃĨngar)", + "setting_notifications_total_progress_subtitle": "Övergripande uppladdningsfÃļrlopp (klar/totala objekt)", "setting_notifications_total_progress_title": "Visa totalt uppladdningsfÃļrlopp", "setting_video_viewer_auto_play_subtitle": "BÃļrja automatiskt spela upp videor när de Ãļppnas", "setting_video_viewer_auto_play_title": "Automatisk uppspelning av video", @@ -2046,7 +2061,7 @@ "settings_saved": "Inställningar sparade", "setup_pin_code": "Konfigurera pinkod", "share": "Dela", - "share_action_prompt": "Delade {count} tillgÃĨngar", + "share_action_prompt": "Delade {count} objekt", "share_add_photos": "Lägg till foton", "share_assets_selected": "{count} valda", "share_dialog_preparing": "FÃļrbereder...", @@ -2108,7 +2123,7 @@ "sharing_sidebar_description": "Visa en länk till Delning i sidopanelen", "sharing_silver_appbar_create_shared_album": "Skapa delat album", "sharing_silver_appbar_share_partner": "Dela med partner", - "shift_to_permanent_delete": "tryck pÃĨ ⇧ fÃļr att permanent radera tillgÃĨngen", + "shift_to_permanent_delete": "tryck pÃĨ ⇧ fÃļr att permanent radera objektet", "show_album_options": "Visa albumalternativ", "show_albums": "Visa album", "show_all_people": "Visa alla personer", @@ -2183,6 +2198,7 @@ "support": "Support", "support_and_feedback": "Support och Feedback", "support_third_party_description": "Din Immich-installation paketerades av en tredje part. Problem som du upplever kan orsakas av det paketet, sÃĨ vänligen ta upp problem med dem i fÃļrsta hand med hjälp av länkarna nedan.", + "supporter": "StÃļdjare", "swap_merge_direction": "Byt sammanfogningsriktning", "sync": "Synka", "sync_albums": "Synka album", @@ -2193,7 +2209,7 @@ "sync_status_subtitle": "Visa och hantera synkroniseringssystemet", "sync_upload_album_setting_subtitle": "Skapa och ladda upp dina foton och videor till de valda albumen pÃĨ Immich", "tag": "Tagg", - "tag_assets": "Tagga tillgÃĨngar", + "tag_assets": "Tagga objekt", "tag_created": "Skapade tagg: {tag}", "tag_feature_description": "Bläddra bland foton och videor grupperade efter logiska taggar", "tag_not_found_question": "Kan du inte hitta en tagg? Skapa en ny tagg.", @@ -2244,7 +2260,7 @@ "trash_action_prompt": "{count} flyttad till papperskorgen", "trash_all": "Kasta alla", "trash_count": "Papperskorg {count, number}", - "trash_delete_asset": "Papperskorgen/Ta bort tillgÃĨng", + "trash_delete_asset": "Kassera/Ta bort objekt", "trash_emptied": "TÃļmd papperskorg", "trash_no_results_message": "Borttagna foton och videor kommer att visas här.", "trash_page_delete_all": "Ta Bort Alla", @@ -2256,8 +2272,8 @@ "trash_page_title": "Papperskorg ({count})", "trashed_items_will_be_permanently_deleted_after": "Objekt i papperskorgen raderas permanent efter {days, plural, one {# dag} other {# dagar}}.", "trigger": "UtlÃļsare", - "trigger_asset_uploaded": "TillgÃĨng uppladdad", - "trigger_asset_uploaded_description": "UtlÃļses när en ny tillgÃĨng laddas upp", + "trigger_asset_uploaded": "Objekt uppladdat", + "trigger_asset_uploaded_description": "UtlÃļses när ett nytt objekt laddas upp", "trigger_description": "Ett evenemang som sätter igÃĨng arbetsflÃļdet", "trigger_person_recognized": "Person igenkänd", "trigger_person_recognized_description": "UtlÃļses när en person upptäcks", @@ -2294,10 +2310,11 @@ "unstack_action_prompt": "{count} ostaplade", "unstacked_assets_count": "Avstaplade {count, plural, one {# asset} other {# assets}}", "unsupported_field_type": "Fälttyp som inte stÃļds", + "unsupported_file_type": "Fil {file} kan inte laddas upp eftersom dess filtyp {type} inte stÃļds.", "untagged": "Otaggad", "untitled_workflow": "NamnlÃļst arbetsflÃļde", "up_next": "Kommande", - "update_location_action_prompt": "Uppdatera platsen fÃļr {count} valda tillgÃĨngar med:", + "update_location_action_prompt": "Uppdatera platsen fÃļr {count} valda objekt med:", "updated_at": "Uppdaterat", "updated_password": "LÃļsenordet har uppdaterats", "upload": "Ladda upp", @@ -2320,6 +2337,8 @@ "url": "URL", "usage": "Användning", "use_biometric": "Använd biometri", + "use_browser_locale": "Använd webbläsarens sprÃĨkinställning", + "use_browser_locale_description": "Formatera datum, tider och siffror baserat pÃĨ din webbläsares sprÃĨkinställning", "use_current_connection": "Använd aktuell anslutning", "use_custom_date_range": "Använd anpassat datumintervall istället", "user": "Användare", @@ -2345,7 +2364,7 @@ "variables": "Variabler", "version": "Version", "version_announcement_closing": "Din vän, Alex", - "version_announcement_message": "Hej där! En ny version av Immich är tillgänglig. Ta dig tid att läsa versionsfakta fÃļr att säkerställa att dina inställningar är uppdaterade fÃļr att fÃļrhindra eventuella felkonfigurationer, särskilt om du använder WatchTower eller nÃĨgon mekanism som hanterar uppdatering av din Immich instans automatiskt.", + "version_announcement_message": "Hej där! En ny version av Immich är tillgänglig. Ta dig tid att läsa versionsfakta fÃļr att säkerställa att dina inställningar är uppdaterade fÃļr att fÃļrhindra eventuella felkonfigurationer, särskilt om du använder WatchTower eller nÃĨgon mekanism som hanterar uppdatering av din Immich instans automatiskt.", "version_history": "Versionshistorik", "version_history_item": "Version {version} installerad {date}", "video": "Video", @@ -2358,7 +2377,7 @@ "view_album": "Visa Album", "view_all": "Visa alla", "view_all_users": "Visa alla användare", - "view_asset_owners": "Visa tillgÃĨngsägare", + "view_asset_owners": "Visa ägare av objekt", "view_details": "Visa detaljer", "view_in_timeline": "Visa i tidslinjen", "view_link": "Visa länk", diff --git a/i18n/ta.json b/i18n/ta.json index 90a7ce6664..f33c148fd5 100644 --- a/i18n/ta.json +++ b/i18n/ta.json @@ -833,8 +833,6 @@ "deduplication_criteria_2": "EXIF āŽ¤āŽ°āŽĩāŽŋāŽŠā¯ āŽŽāŽŖā¯āŽŖāŽŋāŽ•ā¯āŽ•ā¯ˆ", "deduplication_info": "āŽ•āŽ´āŽŋāŽ¤ā¯āŽ¤āŽ˛ā¯ āŽšā¯†āŽ¯ā¯āŽ¤āŽŋ", "deduplication_info_description": "āŽšā¯ŠāŽ¤ā¯āŽ¤ā¯āŽ•ā¯āŽ•āŽŗā¯ˆ āŽ¤āŽžāŽŠāŽžāŽ• āŽŽā¯āŽŠā¯āŽŠā¯†āŽŸā¯āŽ¤ā¯āŽ¤ā¯āŽšā¯ āŽšā¯†āŽ˛ā¯āŽ˛āŽĩā¯āŽŽā¯, āŽŽā¯ŠāŽ¤ā¯āŽ¤āŽŽāŽžāŽ• āŽ¨āŽ•āŽ˛ā¯āŽ•āŽŗā¯ˆ āŽ…āŽ•āŽąā¯āŽąāŽĩā¯āŽŽā¯, āŽ¨āŽžāŽ™ā¯āŽ•āŽŗā¯ āŽĒāŽžāŽ°ā¯āŽ•ā¯āŽ•āŽŋāŽąā¯‹āŽŽā¯:", - "default_locale": "āŽ‡āŽ¯āŽ˛ā¯āŽĒā¯āŽ¨āŽŋāŽ˛ā¯ˆ āŽ‡āŽŸāŽŽā¯", - "default_locale_description": "āŽ‰āŽ™ā¯āŽ•āŽŗā¯ āŽ‰āŽ˛āŽžāŽĩāŽŋ āŽ‡āŽ°ā¯āŽĒā¯āŽĒāŽŋāŽŸāŽ¤ā¯āŽ¤āŽŋāŽŠā¯ āŽ…āŽŸāŽŋāŽĒā¯āŽĒāŽŸā¯ˆāŽ¯āŽŋāŽ˛ā¯ āŽĩāŽŸāŽŋāŽĩāŽŽā¯ˆāŽĒā¯āŽĒ❁ āŽ¤ā¯‡āŽ¤āŽŋāŽ•āŽŗā¯ āŽŽāŽąā¯āŽąā¯āŽŽā¯ āŽŽāŽŖā¯āŽ•āŽŗā¯", "delete": "āŽ¨ā¯€āŽ•ā¯āŽ•ā¯", "delete_action_confirmation_message": "āŽ‡āŽ¨ā¯āŽ¤ āŽšā¯ŠāŽ¤ā¯āŽ¤ā¯ˆ āŽ¨ā¯€āŽ•ā¯āŽ• āŽĩāŽŋāŽ°ā¯āŽŽā¯āŽĒā¯āŽ•āŽŋāŽąā¯€āŽ°ā¯āŽ•āŽŗāŽž? āŽ‡āŽ¨ā¯āŽ¤ āŽ¨āŽŸāŽĩāŽŸāŽŋāŽ•ā¯āŽ•ā¯ˆ āŽšā¯ŠāŽ¤ā¯āŽ¤ā¯ˆ āŽšā¯‡āŽĩā¯ˆāŽ¯āŽ•āŽ¤ā¯āŽ¤āŽŋāŽŠā¯ āŽ•ā¯āŽĒā¯āŽĒā¯ˆāŽ•ā¯āŽ•ā¯ āŽ¨āŽ•āŽ°ā¯āŽ¤ā¯āŽ¤ā¯āŽŽā¯, āŽŽā¯‡āŽ˛ā¯āŽŽā¯ āŽ¨ā¯€āŽ™ā¯āŽ•āŽŗā¯ āŽ…āŽ¤ā¯ˆ āŽ‰āŽŗā¯āŽ¨āŽžāŽŸā¯āŽŸāŽŋāŽ˛ā¯ āŽ¨ā¯€āŽ•ā¯āŽ• āŽĩāŽŋāŽ°ā¯āŽŽā¯āŽĒāŽŋāŽŠāŽžāŽ˛ā¯ āŽ•ā¯‡āŽŸā¯āŽ•ā¯āŽŽā¯", "delete_action_prompt": "{count} āŽ¨ā¯€āŽ•ā¯āŽ•āŽĒā¯āŽĒāŽŸā¯āŽŸāŽ¤ā¯", diff --git a/i18n/te.json b/i18n/te.json index 275b2deb42..18b38069b4 100644 --- a/i18n/te.json +++ b/i18n/te.json @@ -5,6 +5,7 @@ "acknowledge": "ā°—āąā°°āąā°¤ā°ŋā°‚ā°šā°‚ā°Ąā°ŋ", "action": "ā°šā°°āąā°¯", "action_common_update": "ā°¨ā°ĩāą€ā°•ā°°ā°ŋā°‚ā°šāą", + "action_description": "ā°Ģā°ŋā°˛āąā°Ÿā°°āą ā°šāą‡ā°¸ā°ŋā°¨ ā°…ā°‚ā°ļā°žā°˛ā°Ēāąˆ ā°šāą‡ā°¯ā°žā°˛āąā°¸ā°ŋā°¨ ā°šā°°āąā°¯ā°˛āą", "actions": "ā°šā°°āąā°¯ā°˛āą", "active": "ā°šāąā°°āąā°•āąā°—ā°ž", "activity": "ā°•ā°žā°°āąā°¯ā°žā°šā°°ā°Ŗ", @@ -526,8 +527,6 @@ "deduplication_criteria_2": "EXIF ā°Ąāą‡ā°Ÿā°ž ā°¸ā°‚ā°–āąā°¯", "deduplication_info": "ⰍⰕā°ŋā°˛āą€ā°˛ ā°¤āąŠā°˛ā°—ā°ŋā°‚ā°Ēāą ā°¸ā°Žā°žā°šā°žā°°ā°‚", "deduplication_info_description": "ā°†ā°¸āąā°¤āąā°˛ā°¨āą ā°¸āąā°ĩā°¯ā°‚ā°šā°žā°˛ā°•ā°‚ā°—ā°ž ā°Žāąā°‚ā°Ļā°¸āąā°¤āąā°—ā°ž ā°Žā°‚ā°šāąā°•āą‹ā°ĩā°Ąā°žā°¨ā°ŋā°•ā°ŋ ā°Žā°°ā°ŋā°¯āą ⰍⰕā°ŋā°˛āą€ā°˛ā°¨āą ā°Ēāą†ā°Ļāąā°Ļā°ŽāąŠā°¤āąā°¤ā°‚ā°˛āą‹ ā°¤āąŠā°˛ā°—ā°ŋā°‚ā°šā°Ąā°žā°¨ā°ŋā°•ā°ŋ, ā°Žāą‡ā°Žāą ā°ĩāą€ā°Ÿā°ŋā°¨ā°ŋ ā°Ēā°°ā°ŋā°ļāą€ā°˛ā°ŋā°¸āąā°¤ā°žā°Žāą:", - "default_locale": "ā°Ēāą‚ā°°āąā°ĩā°¨ā°ŋā°¯āą‹ā°œā°ŋā°¤ ā°­ā°žā°ˇ", - "default_locale_description": "ā°Žāą€ ā°Ŧāąā°°āąŒā°œā°°āą ā°˛āąŠā°•āą‡ā°˛āą ā°†ā°§ā°žā°°ā°‚ā°—ā°ž ā°¤āą‡ā°Ļāą€ā°˛āą ā°Žā°°ā°ŋā°¯āą ā°¸ā°‚ā°–āąā°¯ā°˛ā°¨āą ā°Ģā°žā°°āąā°Žā°žā°Ÿāą ā°šāą‡ā°¯ā°‚ā°Ąā°ŋ", "delete": "ā°¤āąŠā°˛ā°—ā°ŋā°‚ā°šāą", "delete_album": "ā°†ā°˛āąā°Ŧā°Žāąâ€Œā°¨āą ā°¤āąŠā°˛ā°—ā°ŋā°‚ā°šāą", "delete_api_key_prompt": "ā°Žāą€ā°°āą Ⰸ API ā°•āą€ā°¨ā°ŋ ā°–ā°šāąā°šā°ŋā°¤ā°‚ā°—ā°ž ā°¤āąŠā°˛ā°—ā°ŋā°‚ā°šā°žā°˛ā°¨āąā°•āąā°‚ā°Ÿāąā°¨āąā°¨ā°žā°°ā°ž?", diff --git a/i18n/th.json b/i18n/th.json index ee53ff2c9f..f22c83dfb8 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -39,7 +39,7 @@ "add_upload_to_stack": "āš€ā¸žā¸´āšˆā¸Ąā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš€ā¸‚āš‰ā¸˛ stack", "add_url": "āš€ā¸žā¸´āšˆā¸Ą URL", "added_to_archive": "āš€ā¸žā¸´āšˆā¸Ąāš„ā¸›ā¸ĸā¸ąā¸‡ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗ", - "added_to_favorites": "āš€ā¸žā¸´āšˆā¸Ąāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”", + "added_to_favorites": "āš€ā¸žā¸´āšˆā¸Ąāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”āšā¸Ĩāš‰ā¸§", "added_to_favorites_count": "āš€ā¸žā¸´āšˆā¸Ą {count, number} ā¸Ŗā¸šā¸›āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”āšā¸Ĩāš‰ā¸§", "admin": { "add_exclusion_pattern_description": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›āšā¸šā¸šā¸‚āš‰ā¸­ā¸ĸā¸āš€ā¸§āš‰ā¸™ ā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ *, ** āšā¸Ĩ⏰ ? ā¸Ģā¸˛ā¸ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩā¸°āš€ā¸§āš‰ā¸™āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšƒā¸™āš„ā¸”āš€ā¸Ŗāš‡ā¸ā¸—ā¸­ā¸Ŗā¸ĩ⏗ā¸ĩāšˆā¸Šā¸ˇāšˆā¸­ā¸§āšˆā¸˛ \"Raw\" āšƒā¸Ģāš‰āšƒā¸Šāš‰ \"**/Raw/**\" ā¸–āš‰ā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩā¸°āš€ā¸§āš‰ā¸™āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸—ā¸ĩāšˆā¸Ĩā¸‡ā¸—āš‰ā¸˛ā¸ĸā¸”āš‰ā¸§ā¸ĸ \".tif\" āšƒā¸Ģāš‰āšƒā¸Šāš‰ \"**/*.tif\" ā¸–āš‰ā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩā¸°āš€ā¸§āš‰ā¸™ā¸žā¸˛ā¸˜ā¸—ā¸ĩāšˆāš€ā¸Ŗā¸´āšˆā¸Ąā¸ˆā¸˛ā¸āš„ā¸”āš€ā¸Ŗā¸ā¸—ā¸­ā¸Ŗā¸ĩā¸šā¸™ā¸Ēā¸¸ā¸”āšƒā¸Ģāš‰āšƒā¸Šāš‰ \"/ā¸žā¸˛ā¸˜/⏗ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ/ā¸Ĩā¸°āš€ā¸§āš‰ā¸™/**\"", @@ -57,7 +57,7 @@ "backup_onboarding_2_description": "ā¸Ēā¸ŗāš€ā¸™ā¸˛ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸—ā¸ĩāšˆā¸•āšˆā¸˛ā¸‡ā¸ā¸ąā¸™ ⏋ā¸ļāšˆā¸‡ā¸Ŗā¸§ā¸Ąā¸–ā¸ļā¸‡āš„ā¸Ÿā¸ĨāšŒā¸Ģā¸Ĩā¸ąā¸āšā¸Ĩā¸°āš„ā¸Ÿā¸ĨāšŒā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸šā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡", "backup_onboarding_3_description": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸Šā¸¸ā¸”ā¸‚ā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” ā¸Ŗā¸§ā¸Ąā¸–ā¸ļā¸‡āš„ā¸Ÿā¸ĨāšŒāš€ā¸”ā¸´ā¸Ą ⏋ā¸ļāšˆā¸‡ā¸Ŗā¸§ā¸Ąā¸–ā¸ļ⏇ 1 ā¸Šā¸¸ā¸”ā¸—ā¸ĩāšˆā¸•ā¸ąāš‰ā¸‡ā¸­ā¸ĸā¸šāšˆā¸„ā¸™ā¸Ĩā¸°ā¸–ā¸´āšˆā¸™ āšā¸Ĩ⏰ā¸Ēā¸ŗāš€ā¸™ā¸˛ā¸šā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ 2 ā¸Šā¸¸ā¸”", "backup_onboarding_description": "āšā¸™ā¸°ā¸™ā¸ŗāšƒā¸Ģāš‰āšƒā¸Šāš‰ ⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸šā¸š 3-2-1āš€ā¸žā¸ˇāšˆā¸­ā¸›ā¸ā¸›āš‰ā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ ā¸„ā¸§ā¸Ŗāš€ā¸āš‡ā¸šā¸Ēā¸ŗāš€ā¸™ā¸˛ā¸‚ā¸­ā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž/⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āšā¸Ĩā¸°ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏂⏭⏇ Immich āš€ā¸žā¸ˇāšˆā¸­ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš„ā¸”āš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸—ā¸ąāšˆā¸§ā¸–ā¸ļ⏇", - "backup_onboarding_footer": "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ąā¸—ā¸ĩāšˆāš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏂⏭⏇ Immich āš‚ā¸›ā¸Ŗā¸”ā¸”ā¸šā¸—ā¸ĩāšˆ documentation", + "backup_onboarding_footer": "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ąāš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ Immich āš‚ā¸›ā¸Ŗā¸”ā¸”ā¸šāš€ā¸­ā¸ā¸Ēā¸˛ā¸Ŗā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", "backup_onboarding_parts_title": "⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸šā¸š 3-2-1 ā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šāš„ā¸›ā¸”āš‰ā¸§ā¸ĸ:", "backup_onboarding_title": "ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "backup_settings": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", @@ -65,7 +65,7 @@ "cleared_jobs": "āš€ā¸„ā¸Ĩā¸ĩā¸ĸā¸ŖāšŒā¸‡ā¸˛ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸š: {job}", "config_set_by_file": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸„ā¸­ā¸™ā¸Ÿā¸´ā¸ā¸ā¸ŗā¸Ĩā¸ąā¸‡ā¸–ā¸šā¸ā¸ā¸ŗā¸Ģā¸™ā¸”āš‚ā¸”ā¸ĸāš„ā¸Ÿā¸ĨāšŒā¸„ā¸­ā¸™ā¸Ÿā¸´ā¸", "confirm_delete_library": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸­ā¸ĸ⏞⏁ā¸Ĩā¸šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž {library} ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", - "confirm_delete_library_assets": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩā¸šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ? ā¸Ēā¸ĩāšˆā¸­ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” {count, plural, one {# ā¸Ēā¸ˇāšˆā¸­} other {all # ā¸Ēā¸ˇāšˆā¸­}} ā¸Ēā¸ĩāšˆā¸­āšƒā¸™ā¸„ā¸Ĩā¸ąā¸‡ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩ⏚⏭⏭⏁⏈⏞⏁ Immich āš‚ā¸”ā¸ĸ⏖⏞⏧⏪ āš„ā¸Ÿā¸ĨāšŒā¸ˆā¸°ā¸ĸā¸ąā¸‡ā¸„ā¸‡ā¸­ā¸ĸā¸šāšˆā¸šā¸™ā¸”ā¸´ā¸Ēā¸āšŒ", + "confirm_delete_library_assets": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩā¸šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ? ā¸Ēā¸ĩāšˆā¸­{count, plural, one { # ⏪⏞ā¸ĸ⏁⏞⏪} other {ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” # ⏪⏞ā¸ĸ⏁⏞⏪}}āšƒā¸™ā¸„ā¸Ĩā¸ąā¸‡ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩ⏚⏭⏭⏁⏈⏞⏁ Immich āš‚ā¸”ā¸ĸ⏖⏞⏧⏪ āš„ā¸Ÿā¸ĨāšŒā¸ˆā¸°ā¸ĸā¸ąā¸‡ā¸„ā¸‡ā¸­ā¸ĸā¸šāšˆā¸šā¸™ā¸”ā¸´ā¸Ēā¸āšŒ", "confirm_email_below": "āš‚ā¸›ā¸Ŗā¸”ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ āš‚ā¸”ā¸ĸā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ąā¸žāšŒ \"{email}\" ā¸‚āš‰ā¸˛ā¸‡ā¸Ĩāšˆā¸˛ā¸‡", "confirm_reprocess_all_faces": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩāšƒā¸šā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšƒā¸Ģā¸Ąāšˆ? ā¸Šā¸ˇāšˆā¸­ā¸„ā¸™ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩā¸šāš„ā¸›ā¸”āš‰ā¸§ā¸ĸ", "confirm_user_password_reset": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸‚ā¸­ā¸‡ {user} ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", @@ -112,6 +112,7 @@ "job_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸—ā¸ŗā¸Ģā¸Ĩ⏞ā¸ĸā¸‡ā¸˛ā¸™ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸ā¸ąā¸™", "jobs_delayed": "{jobCount, plural, other {# ā¸Ĩāšˆā¸˛ā¸Šāš‰ā¸˛}}", "jobs_failed": "{jobCount, plural, other {# ā¸Ĩāš‰ā¸Ąāš€ā¸Ģā¸Ĩ⏧}}", + "jobs_over_time": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸‡ā¸˛ā¸™ā¸•ā¸˛ā¸Ąā¸Šāšˆā¸§ā¸‡āš€ā¸§ā¸Ĩ⏞", "library_created": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž: {library}", "library_deleted": "⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸–ā¸šā¸ā¸Ĩ⏚", "library_details": "⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", @@ -126,12 +127,14 @@ "library_tasks_description": "ā¸Ēāšā¸ā¸™ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸ⏙⏭⏁ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāšƒā¸Ģā¸Ąāšˆāšā¸Ĩ⏰/ā¸Ģ⏪⏎⏭⏗ā¸ĩāšˆāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇", "library_updated": "⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸–ā¸šā¸ā¸­ā¸ąā¸›āš€ā¸”ā¸•", "library_watching_enable_description": "ā¸”ā¸šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸ⏙⏭⏁ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩā¸‡ā¸‚ā¸­ā¸‡āš„ā¸Ÿā¸ĨāšŒ", - "library_watching_settings": "ā¸ā¸˛ā¸Ŗā¸”ā¸šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž [⏟ā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒā¸—ā¸”ā¸Ĩ⏭⏇]", + "library_watching_settings": "ā¸ā¸˛ā¸Ŗāš€ā¸āš‰ā¸˛ā¸”ā¸šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž [⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇]", "library_watching_settings_description": "ā¸Ģā¸˛āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩā¸‡āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "logging_enable_description": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸™ā¸—ā¸ļ⏁", "logging_level_description": "āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ āšƒā¸Šāš‰ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸ā¸˛ā¸Ŗā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸­ā¸°āš„ā¸Ŗ", "logging_settings": "ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸™ā¸—ā¸ļ⏁", + "machine_learning_availability_checks": "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸„ā¸§ā¸˛ā¸Ąā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "machine_learning_availability_checks_description": "ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šāšā¸Ĩā¸°āš€ā¸Ĩā¸ˇā¸­ā¸āšƒā¸Šāš‰āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ machine learning āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", + "machine_learning_availability_checks_enabled": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸„ā¸§ā¸˛ā¸Ąā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "machine_learning_availability_checks_interval": "⏪⏰ā¸ĸā¸°āš€ā¸§ā¸Ĩā¸˛ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚", "machine_learning_availability_checks_interval_description": "⏪⏰ā¸ĸā¸°āš€ā¸§ā¸Ĩā¸˛āš€ā¸›āš‡ā¸™ā¸Ąā¸´ā¸Ĩā¸Ĩ⏴⏧⏴⏙⏞⏗ā¸ĩ⏪⏰ā¸Ģā¸§āšˆā¸˛ā¸‡ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸„ā¸§ā¸˛ā¸Ąā¸žā¸Ŗāš‰ā¸­ā¸Ąāšā¸•āšˆā¸Ĩā¸°ā¸„ā¸Ŗā¸ąāš‰ā¸‡", "machine_learning_availability_checks_timeout": "⏄⏺⏂⏭ā¸Ģā¸Ąā¸”āš€ā¸§ā¸Ĩ⏞", @@ -141,7 +144,7 @@ "machine_learning_duplicate_detection": "ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸ā¸˛ā¸Ŗā¸‹āš‰ā¸ŗā¸ā¸ąā¸™", "machine_learning_duplicate_detection_enabled": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸ā¸˛ā¸Ŗā¸‹āš‰ā¸ŗ", "machine_learning_duplicate_detection_enabled_description": "ā¸Ģā¸˛ā¸ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆāš€ā¸Ģā¸Ąā¸ˇā¸­ā¸™ā¸ā¸ąā¸™ā¸ˆā¸°ā¸ĸā¸ąā¸‡ā¸–ā¸šā¸ā¸Ĩ⏚⏭⏭⏁", - "machine_learning_duplicate_detection_setting_description": "āšƒā¸Šāš‰ CLIP āš€ā¸žā¸ˇāšˆā¸­āšā¸Ē⏔⏇⏗ā¸ĩāšˆā¸Ąā¸ĩāšā¸™ā¸§āš‚ā¸™āš‰ā¸Ąā¸‹āš‰āšā¸˛", + "machine_learning_duplicate_detection_setting_description": "āšƒā¸Šāš‰ CLIP āš€ā¸žā¸ˇāšˆā¸­āšā¸Ē⏔⏇ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸Ąā¸ĩāšā¸™ā¸§āš‚ā¸™āš‰ā¸Ąā¸‹āš‰ā¸ŗ", "machine_learning_enabled": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ machine learning", "machine_learning_enabled_description": "ā¸Ģā¸˛ā¸ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ ⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ ML ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ˆā¸°ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš‚ā¸”ā¸ĸāš„ā¸Ąāšˆā¸„āšā¸˛ā¸™ā¸ļ⏇⏖ā¸ļā¸‡ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡.", "machine_learning_facial_recognition": "ā¸ā¸˛ā¸Ŗā¸ˆā¸”ā¸ˆā¸ŗāšƒā¸šā¸Ģā¸™āš‰ā¸˛", @@ -149,7 +152,7 @@ "machine_learning_facial_recognition_model": "āš‚ā¸Ąāš€ā¸”ā¸Ĩā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸ˆā¸”ā¸ˆā¸ŗāšƒā¸šā¸Ģā¸™āš‰ā¸˛", "machine_learning_facial_recognition_model_description": "āš‚ā¸Ąāš€ā¸”ā¸Ĩāš€ā¸Ŗā¸ĩā¸ĸā¸‡ā¸•ā¸˛ā¸Ąā¸‚ā¸™ā¸˛ā¸”ā¸Ĩ⏔ā¸Ģā¸Ĩā¸ąāšˆā¸™ā¸Ĩā¸‡ā¸Ąā¸˛ āš‚ā¸Ąāš€ā¸”ā¸Ĩ⏗ā¸ĩāšˆāšƒā¸Ģā¸āšˆā¸ā¸§āšˆā¸˛ā¸ˆā¸°ā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩā¸Šāš‰ā¸˛ā¸ā¸§āšˆā¸˛āšā¸Ĩā¸°āšƒā¸Šāš‰ā¸Ģā¸™āšˆā¸§ā¸ĸā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸ŗā¸Ąā¸˛ā¸ā¸ā¸§āšˆā¸˛ āšā¸•āšˆāšƒā¸Ģāš‰ā¸œā¸Ĩā¸Ĩā¸ąā¸žā¸˜āšŒā¸—ā¸ĩāšˆā¸”ā¸ĩ⏂ā¸ļāš‰ā¸™ ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ģā¸•ā¸¸āš„ā¸§āš‰ā¸§āšˆā¸˛āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš‚ā¸Ąāš€ā¸”ā¸Ĩ ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸Ŗā¸ąā¸™ā¸‡ā¸˛ā¸™ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šāšƒā¸šā¸Ģā¸™āš‰ā¸˛ā¸—ā¸¸ā¸ā¸ ā¸˛ā¸žāšƒā¸Ģā¸Ąāšˆā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "machine_learning_facial_recognition_setting": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸ˆā¸”ā¸ˆāšā¸˛āšƒā¸šā¸Ģā¸™āš‰ā¸˛", - "machine_learning_facial_recognition_setting_description": "ā¸Ģā¸˛ā¸ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ąā¸ĩā¸ā¸˛ā¸Ŗā¸ˆā¸”ā¸ˆā¸ŗāšƒā¸šā¸Ģā¸™āš‰ā¸˛ā¸šā¸™ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩā¸°ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ąā¸ĩā¸Ēāšˆā¸§ā¸™ā¸œā¸šāš‰ā¸„ā¸™āšƒā¸™ā¸Ģā¸™āš‰ā¸˛āš€ā¸§āš‡ā¸š", + "machine_learning_facial_recognition_setting_description": "ā¸Ģā¸˛ā¸ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ąā¸ĩā¸ā¸˛ā¸Ŗā¸ˆā¸”ā¸ˆā¸ŗāšƒā¸šā¸Ģā¸™āš‰ā¸˛ā¸šā¸™ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩā¸°ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ąā¸ĩā¸Ēāšˆā¸§ā¸™ā¸œā¸šāš‰ā¸„ā¸™āšƒā¸™ā¸Ģā¸™āš‰ā¸˛ \"ā¸Ē⏺⏪⏧⏈\"", "machine_learning_max_detection_distance": "⏪⏰ā¸ĸā¸°ā¸—ā¸˛ā¸‡ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸Ēā¸šā¸‡ā¸Ē⏏⏔", "machine_learning_max_detection_distance_description": "⏪⏰ā¸ĸ⏰ā¸Ģāšˆā¸˛ā¸‡ā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡ā¸Ēā¸­ā¸‡ā¸ ā¸˛ā¸žā¸—ā¸ĩāšˆāš„ā¸ā¸Ĩā¸Ē⏏⏔⏗ā¸ĩāšˆā¸–ā¸ˇā¸­ā¸§āšˆā¸˛āš€ā¸›āš‡ā¸™ā¸ ā¸˛ā¸žā¸‹āš‰ā¸ŗ ā¸„āšˆā¸˛ā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡ 0.001-0.1 ā¸„āšˆā¸˛ā¸ĸā¸´āšˆā¸‡ā¸Ēā¸šā¸‡ā¸ˆā¸°ā¸ĸā¸´āšˆā¸‡āš€ā¸ˆā¸­ā¸ ā¸˛ā¸žā¸‹āš‰ā¸ŗā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™ āšā¸•āšˆā¸­ā¸˛ā¸ˆā¸Ąā¸ĩ⏜ā¸Ĩā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", "machine_learning_max_recognition_distance": "⏪⏰ā¸ĸā¸°ā¸—ā¸˛ā¸‡ā¸ā¸˛ā¸Ŗā¸ˆā¸”ā¸ˆā¸ŗā¸Ēā¸šā¸‡ā¸Ē⏏⏔", @@ -166,7 +169,10 @@ "machine_learning_ocr_max_resolution_description": "Preview ⏗ā¸ĩāšˆā¸Ąā¸ĩā¸„ā¸§ā¸˛ā¸Ąā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔ā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸–ā¸šā¸ā¸›ā¸Ŗā¸ąā¸šā¸‚ā¸™ā¸˛ā¸”āš‚ā¸”ā¸ĸā¸„ā¸‡ā¸­ā¸ąā¸•ā¸Ŗā¸˛ā¸Ēāšˆā¸§ā¸™ā¸‚ā¸­ā¸‡ā¸ ā¸˛ā¸žāš„ā¸§āš‰ ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸Ēā¸šā¸‡ā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸Ąā¸ĩā¸„ā¸§ā¸˛ā¸Ąāšā¸Ąāšˆā¸™ā¸ĸā¸ŗā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™āšā¸•āšˆā¸ˆā¸°āšƒā¸Šāš‰āš€ā¸§ā¸Ĩā¸˛ā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩāšā¸Ĩ⏰ā¸Ģā¸™āšˆā¸§ā¸ĸā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸ŗā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™", "machine_learning_ocr_min_detection_score": "ā¸„ā¸°āšā¸™ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸•āšˆā¸ŗā¸Ē⏏⏔", "machine_learning_ocr_min_detection_score_description": "ā¸„ā¸°āšā¸™ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸•āšˆā¸ŗā¸Ē⏏⏔⏗ā¸ĩāšˆā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸°ā¸–ā¸šā¸ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸š ā¸„āšˆā¸˛ā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡ 0-1 ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸•āšˆā¸ŗā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸–ā¸šā¸ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™āšā¸•āšˆā¸­ā¸˛ā¸ˆā¸—ā¸ŗāšƒā¸Ģāš‰ā¸œā¸Ĩā¸šā¸§ā¸ā¸›ā¸Ĩā¸­ā¸Ąā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™", + "machine_learning_ocr_min_recognition_score": "ā¸„āšˆā¸˛ā¸‚ā¸ąāš‰ā¸™ā¸•āšˆā¸ŗā¸‚ā¸­ā¸‡ā¸„ā¸°āšā¸™ā¸™ā¸ā¸˛ā¸Ŗā¸Ŗā¸ąā¸šā¸Ŗā¸šāš‰", + "machine_learning_ocr_min_score_recognition_description": "ā¸„āšˆā¸˛ā¸„ā¸§ā¸˛ā¸Ąā¸Ąā¸ąāšˆā¸™āšƒā¸ˆā¸‚ā¸ąāš‰ā¸™ā¸•āšˆā¸ŗāš€ā¸žā¸ˇāšˆā¸­ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸§ā¸ˆā¸žā¸šāš„ā¸”āš‰ ⏈⏞⏁ 0-1 ā¸„āšˆā¸˛ā¸ĸā¸´āšˆā¸‡ā¸•āšˆā¸ŗā¸ˆā¸°ā¸ĸā¸´āšˆā¸‡ā¸•ā¸Ŗā¸§ā¸ˆā¸žā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Ąā¸˛ā¸āšā¸•āšˆā¸­ā¸˛ā¸ˆā¸Ąā¸ĩā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”āš„ā¸”āš‰", "machine_learning_ocr_model": "āš‚ā¸Ąāš€ā¸”ā¸Ĩ OCR", + "machine_learning_ocr_model_description": "āš‚ā¸Ąāš€ā¸”ā¸Ĩāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸Ąā¸ĩā¸„ā¸§ā¸˛ā¸Ąāšā¸Ąāšˆā¸™ā¸ĸ⏺ā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛āš‚ā¸Ąāš€ā¸”ā¸Ĩā¸Ąā¸ˇā¸­ā¸–ā¸ˇā¸­ āšā¸•āšˆāšƒā¸Šāš‰āš€ā¸§ā¸Ĩā¸˛ā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩā¸™ā¸˛ā¸™ā¸ā¸§āšˆā¸˛āšā¸Ĩā¸°āšƒā¸Šāš‰ā¸Ģā¸™āšˆā¸§ā¸ĸā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸ŗā¸Ąā¸˛ā¸ā¸ā¸§āšˆā¸˛", "machine_learning_settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ machine learning", "machine_learning_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ machine learning", "machine_learning_smart_search": "ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģā¸˛ā¸­ā¸ąā¸ˆā¸‰ā¸Ŗā¸´ā¸ĸ⏰", @@ -176,6 +182,19 @@ "machine_learning_url_description": "URL ā¸‚ā¸­ā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ machine learning ⏁⏪⏓ā¸ĩā¸Ąā¸ĩ URL ā¸Ąā¸˛ā¸ā¸ā¸§āšˆā¸˛ā¸Ģ⏙ā¸ļāšˆā¸‡ URL ā¸ˆā¸°ā¸—ā¸ŗā¸ā¸˛ā¸Ŗā¸—ā¸”ā¸Ĩ⏭⏇ā¸Ēāšˆā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ŗā¸ĩā¸ĸā¸‡āš„ā¸›ā¸—ā¸ĩā¸Ĩā¸°ā¸­ā¸ąā¸™ā¸•ā¸˛ā¸Ąā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸ˆā¸™ā¸ā¸§āšˆā¸˛ā¸ˆā¸°ā¸žā¸š URL ⏗ā¸ĩāšˆā¸•ā¸­ā¸šā¸Ē⏙⏭⏇ āšā¸Ĩā¸°ā¸ˆā¸°āš€ā¸Ĩ⏴⏁ā¸Ēāšˆā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸Šā¸ąāšˆā¸§ā¸„ā¸Ŗā¸˛ā¸§āšƒā¸™ā¸Ēāšˆā¸§ā¸™ā¸‚ā¸­ā¸‡ URL ⏗ā¸ĩāšˆāš„ā¸Ąāšˆā¸•ā¸­ā¸šā¸Ē⏙⏭⏇", "maintenance_delete_backup": "ā¸Ĩ⏚⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "maintenance_delete_backup_description": "āš„ā¸Ÿā¸ĨāšŒā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩā¸šāšā¸Ĩā¸°āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šāš„ā¸”āš‰", + "maintenance_delete_error": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ĩ⏚⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_restore_backup": "ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_restore_backup_description": "Immich ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩāš‰ā¸˛ā¸‡ āšā¸Ĩā¸°ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏈⏞⏁⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏗ā¸ĩāšˆāš€ā¸Ĩ⏎⏭⏁ ⏪⏰⏚⏚⏈⏰ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸āšˆā¸­ā¸™ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­", + "maintenance_restore_backup_different_version": "⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏙ā¸ĩāš‰ā¸–ā¸šā¸ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸”āš‰ā¸§ā¸ĸ Immich āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸•āšˆā¸˛ā¸‡ā¸ā¸ąā¸™!", + "maintenance_restore_backup_unknown_version": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ŗā¸°ā¸šā¸¸āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸‚ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_restore_database_backup": "ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_restore_database_backup_description": "ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš„ā¸›ā¸ĸā¸ąā¸‡ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛āš‚ā¸”ā¸ĸāšƒā¸Šāš‰āš„ā¸Ÿā¸ĨāšŒā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_settings": "ā¸ā¸˛ā¸Ŗā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛", + "maintenance_settings_description": "ā¸Ēā¸Ĩā¸ąā¸š Immich āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆāš‚ā¸Ģā¸Ąā¸”ā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛", + "maintenance_start": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸›āš‡ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛", + "maintenance_start_error": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛", + "maintenance_upload_backup": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš„ā¸Ÿā¸ĨāšŒā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_upload_backup_error": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ āš‚ā¸›ā¸Ŗā¸”ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸§āšˆā¸˛āš€ā¸›āš‡ā¸™āš„ā¸Ÿā¸ĨāšŒ .sql/.sql.gz", "manage_concurrency": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸ā¸ąā¸™", "manage_log_settings": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ˆā¸”ā¸šā¸ąā¸™ā¸—ā¸ļ⏁", "map_dark_style": "āšā¸šā¸šā¸Ąā¸ˇā¸”", @@ -191,7 +210,7 @@ "map_settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸œā¸™ā¸—ā¸ĩāšˆāšā¸Ĩ⏰ GPS", "map_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸œā¸™ā¸—ā¸ĩāšˆ", "map_style_description": "URL āš„ā¸›ā¸ĸā¸ąā¸‡ā¸˜ā¸ĩā¸Ąāšā¸œā¸™ā¸—ā¸ĩāšˆ style.json", - "memory_cleanup_job": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšƒā¸™ā¸Ģā¸™āšˆā¸§ā¸ĸā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸ŗ (memory)", + "memory_cleanup_job": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗ", "memory_generate_job": "⏁⏞⏪ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗ", "metadata_extraction_job": "⏔ā¸ļā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ metadata", "metadata_extraction_job_description": "⏔ā¸ļā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ metadata ⏈⏞⏁ā¸Ēā¸ˇāšˆā¸­ āš€ā¸Šāšˆā¸™ GPS āšā¸Ĩā¸°ā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸Ąā¸Šā¸ąā¸”", @@ -202,12 +221,16 @@ "migration_job": "ā¸ā¸˛ā¸Ŗāš‚ā¸ĸ⏁ā¸ĸāš‰ā¸˛ā¸ĸ", "migration_job_description": "ā¸ĸāš‰ā¸˛ā¸ĸā¸ ā¸˛ā¸žā¸•ā¸ąā¸§ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ēā¸ˇāšˆā¸­āšā¸Ĩā¸°āšƒā¸šā¸Ģā¸™āš‰ā¸˛āš„ā¸›ā¸ĸā¸ąā¸‡āš‚ā¸„ā¸Ŗā¸‡ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "nightly_tasks_cluster_new_faces_setting": "⏄ā¸Ĩā¸ąā¸Ēāš€ā¸•ā¸­ā¸ŖāšŒāšƒā¸šā¸Ģā¸™āš‰ā¸˛āšƒā¸Ģā¸Ąāšˆ", + "nightly_tasks_database_cleanup_setting": "ā¸‡ā¸˛ā¸™āš€ā¸āš‡ā¸šā¸ā¸§ā¸˛ā¸”ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "nightly_tasks_database_cleanup_setting_description": "ā¸Ĩā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏗ā¸ĩāšˆāš€ā¸āšˆā¸˛āšā¸Ĩ⏰ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "nightly_tasks_generate_memories_setting": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗ", "nightly_tasks_generate_memories_setting_description": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗāšƒā¸Ģā¸Ąāšˆā¸ˆā¸˛ā¸ā¸Ēā¸ˇāšˆā¸­", "nightly_tasks_missing_thumbnails_setting": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸ ā¸˛ā¸žā¸‚ā¸™ā¸˛ā¸”ā¸ĸāšˆā¸­ā¸—ā¸ĩāšˆā¸‚ā¸˛ā¸”ā¸Ģ⏞ā¸ĸāš„ā¸›", "nightly_tasks_missing_thumbnails_setting_description": "āš€ā¸žā¸´āšˆā¸Ąā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸Ąā¸ĩā¸ ā¸˛ā¸žā¸‚ā¸™ā¸˛ā¸”ā¸ĸāšˆā¸­āš„ā¸›ā¸ĸā¸ąā¸‡ā¸„ā¸´ā¸§āš€ā¸žā¸ˇāšˆā¸­ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸ ā¸˛ā¸žā¸‚ā¸™ā¸˛ā¸”ā¸ĸāšˆā¸­", "nightly_tasks_start_time_setting": "āš€ā¸§ā¸Ĩā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™", "nightly_tasks_start_time_setting_description": "āš€ā¸§ā¸Ĩ⏞⏗ā¸ĩāšˆāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸ˆā¸°āš€ā¸Ŗā¸´āšˆā¸Ąā¸‡ā¸˛ā¸™ā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸„ā¸ˇā¸™", + "nightly_tasks_sync_quota_usage_setting": "ā¸‹ā¸´ā¸‡ā¸āšŒāš‚ā¸„ā¸§ā¸•āš‰ā¸˛ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", + "nightly_tasks_sync_quota_usage_setting_description": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•āš‚ā¸„ā¸§ā¸•āš‰ā¸˛ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ ā¸•ā¸˛ā¸Ąā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™", "no_paths_added": "āš„ā¸Ąāšˆāš„ā¸”āš‰āš€ā¸žā¸´āšˆā¸Ąā¸žā¸˛ā¸˜", "no_pattern_added": "āš„ā¸Ąāšˆāš„ā¸”āš‰āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›āšā¸šā¸š", "note_apply_storage_label_previous_assets": "ā¸Ģā¸˛ā¸ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ Storage Label ā¸ā¸ąā¸šāš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰ āšƒā¸Ģāš‰ā¸Ŗā¸ąā¸™ā¸„ā¸ŗā¸Ēā¸ąāšˆā¸‡ā¸™ā¸ĩāš‰", @@ -219,6 +242,8 @@ "notification_email_ignore_certificate_errors_description": "āš„ā¸Ąāšˆā¸Ēā¸™āšƒā¸ˆā¸ā¸˛ā¸Ŗā¸ĸ⏎⏙ā¸ĸā¸ąā¸™āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ TLS ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ (āš„ā¸Ąāšˆāšā¸™ā¸°ā¸™ā¸ŗ)", "notification_email_password_description": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸—ā¸ĩāšˆāšƒā¸Šāš‰āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸­ā¸ĩāš€ā¸Ąā¸Ĩ", "notification_email_port_description": "ā¸žā¸­ā¸ŖāšŒā¸•ā¸‚ā¸­ā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸­ā¸ĩāš€ā¸Ąā¸Ĩ (āš€ā¸Šāšˆā¸™ 25, 465, ā¸Ģ⏪⏎⏭ 587)", + "notification_email_secure": "SMTPS", + "notification_email_secure_description": "āšƒā¸Šāš‰ SMTPS (SMTP over TLS)", "notification_email_sent_test_email_button": "ā¸Ēāšˆā¸‡ā¸­ā¸ĩāš€ā¸Ąā¸Ĩ⏗⏔ā¸Ĩā¸­ā¸‡āšā¸Ĩā¸°ā¸šā¸ąā¸™ā¸—ā¸ļ⏁", "notification_email_setting_description": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ēāšˆā¸‡ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸ĩāš€ā¸Ąā¸Ĩ", "notification_email_test_email": "ā¸Ēāšˆā¸‡ā¸­ā¸ĩāš€ā¸Ąā¸Ĩ⏗⏔ā¸Ĩ⏭⏇", @@ -233,7 +258,7 @@ "oauth_auto_register": "ā¸Ĩā¸‡ā¸—ā¸°āš€ā¸šā¸ĩā¸ĸā¸™ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "oauth_auto_register_description": "ā¸Ĩā¸‡ā¸—ā¸°āš€ā¸šā¸ĩā¸ĸā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āšƒā¸Ģā¸Ąāšˆā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ā¸œāšˆā¸˛ā¸™ OAuth", "oauth_button_text": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸¸āšˆā¸Ąā¸ā¸”", - "oauth_client_secret_description": "ā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸•āš‰ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸¸ā¸Ģā¸˛ā¸ā¸œā¸šāš‰āšƒā¸Ģāš‰ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗ OAuth āš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸š PKCE (Proof Key for Code Exchange)", + "oauth_client_secret_description": "ā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸•āš‰ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸¸ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāš„ā¸„ā¸Ĩāš€ā¸­āš‡ā¸™ā¸•āšŒā¸Ĩā¸ąā¸š ā¸Ģ⏪⏎⏭ā¸Ģā¸˛ā¸āš„ā¸„ā¸Ĩāš€ā¸­āš‡ā¸™ā¸•āšŒā¸Ēā¸˛ā¸˜ā¸˛ā¸Ŗā¸“ā¸°āš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸š PKCE (Proof Key for Code Exchange)", "oauth_enable_description": "ā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ā¸œāšˆā¸˛ā¸™ OAuth", "oauth_mobile_redirect_uri": "URI āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸šā¸™āš‚ā¸—ā¸Ŗā¸¨ā¸ąā¸žā¸—āšŒ", "oauth_mobile_redirect_uri_override": "āšā¸—ā¸™ā¸—ā¸ĩāšˆ URI āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸šā¸™āš‚ā¸—ā¸Ŗā¸¨ā¸ąā¸žā¸—āšŒ", @@ -254,10 +279,14 @@ "password_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸‚ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ā¸œāšˆā¸˛ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", "paths_validated_successfully": "āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸–ā¸šā¸ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆāšā¸Ĩāš‰ā¸§", "person_cleanup_job": "ā¸ā¸˛ā¸Ŗā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔", + "queue_details": "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏄⏴⏧", + "queues": "⏄⏴⏧⏇⏞⏙", + "queues_page_description": "ā¸Ģā¸™āš‰ā¸˛ā¸„ā¸´ā¸§ā¸‡ā¸˛ā¸™ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ", "quota_size_gib": "āš‚ā¸„ā¸§ā¸•ā¸˛ (GiB)", "refreshing_all_libraries": "⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "registration": "ā¸Ĩā¸‡ā¸—ā¸°āš€ā¸šā¸ĩā¸ĸā¸™ā¸œā¸šāš‰ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗ", "registration_description": "āš€ā¸™ā¸ˇāšˆā¸­ā¸‡ā¸ˆā¸˛ā¸ā¸„ā¸¸ā¸“āš€ā¸›āš‡ā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āšā¸Ŗā¸ā¸‚ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸š ā¸„ā¸¸ā¸“ā¸ˆā¸°ā¸–ā¸šā¸āšā¸•āšˆā¸‡ā¸•ā¸ąāš‰ā¸‡āš€ā¸›āš‡ā¸™ā¸œā¸šāš‰ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāšā¸Ĩā¸°ā¸Ŗā¸ąā¸šā¸œā¸´ā¸”ā¸Šā¸­ā¸šā¸‡ā¸˛ā¸™ā¸šā¸Ŗā¸´ā¸Ģ⏞⏪ ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ąā¸ˆā¸°ā¸–ā¸šā¸ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āš‚ā¸”ā¸ĸ⏄⏏⏓", + "remove_failed_jobs": "ā¸Ĩā¸šā¸‡ā¸˛ā¸™ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "require_password_change_on_login": "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āšƒā¸Ģāš‰āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šā¸„ā¸Ŗā¸ąāš‰ā¸‡āšā¸Ŗā¸", "reset_settings_to_default": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš€ā¸›āš‡ā¸™ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™", "reset_settings_to_recent_saved": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš€ā¸›āš‡ā¸™ā¸„āšˆā¸˛ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", @@ -265,13 +294,15 @@ "search_jobs": "ā¸„āš‰ā¸™ā¸Ģ⏞⏇⏞⏙â€Ļ", "send_welcome_email": "ā¸Ēāšˆā¸‡ā¸­ā¸ĩāš€ā¸Ąā¸Ĩā¸•āš‰ā¸­ā¸™ā¸Ŗā¸ąā¸š", "server_external_domain_settings": "āš‚ā¸”āš€ā¸Ąā¸™ā¸ ā¸˛ā¸ĸ⏙⏭⏁", - "server_external_domain_settings_description": "āš‚ā¸”āš€ā¸Ąā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ĩā¸´ā¸‡ā¸āšŒāšā¸Šā¸ŖāšŒā¸Ēā¸˛ā¸˜ā¸˛ā¸Ŗā¸“ā¸° āšā¸šā¸šā¸Ąā¸ĩ http(s)://", + "server_external_domain_settings_description": "āš‚ā¸”āš€ā¸Ąā¸™ā¸—ā¸ĩāšˆāšƒā¸Šāš‰ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ĩā¸´ā¸‡ā¸āšŒā¸ ā¸˛ā¸ĸ⏙⏭⏁", "server_public_users": "ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸Ēā¸˛ā¸˜ā¸˛ā¸Ŗā¸“ā¸°", "server_public_users_description": "ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” (ā¸Šā¸ˇāšˆā¸­āšā¸Ĩ⏰⏭ā¸ĩāš€ā¸Ąā¸Ĩ) ā¸ˆā¸°āšā¸Ē⏔⏇⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸žā¸´āšˆā¸Ąā¸œā¸šāš‰āšƒā¸Šāš‰āš„ā¸›ā¸ĸā¸ąā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ āš€ā¸Ąā¸ˇāšˆā¸­ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ ⏪⏞ā¸ĸā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸ˆā¸°ā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ā¸—ā¸ĩāšˆāš€ā¸›āš‡ā¸™ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩā¸Ŗā¸°ā¸šā¸šāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", "server_settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "server_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", + "server_stats_page_description": "ā¸Ģā¸™āš‰ā¸˛ā¸Ēā¸–ā¸´ā¸•ā¸´āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ", "server_welcome_message": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸•āš‰ā¸­ā¸™ā¸Ŗā¸ąā¸š", "server_welcome_message_description": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆāšā¸Ēā¸”ā¸‡ā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™", + "settings_page_description": "ā¸Ģā¸™āš‰ā¸˛ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ", "sidecar_job": "āš„ā¸Ÿā¸ĨāšŒ metadata", "sidecar_job_description": "ā¸„āš‰ā¸™ā¸Ģ⏞ā¸Ģā¸Ŗā¸ˇā¸­ā¸‹ā¸´ā¸‡ā¸„āšŒāš„ā¸Ÿā¸ĨāšŒ metadata ⏈⏞⏁⏪⏰⏚⏚", "slideshow_duration_description": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸§ā¸´ā¸™ā¸˛ā¸—ā¸ĩ⏗ā¸ĩāšˆā¸ˆā¸°āšā¸Ēā¸”ā¸‡āšā¸•āšˆā¸Ĩā¸°ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", @@ -283,14 +314,14 @@ "storage_template_hash_verification_enabled_description": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚ hash ā¸Ģāš‰ā¸˛ā¸Ąā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš€ā¸§āš‰ā¸™āšā¸•āšˆā¸„ā¸¸ā¸“ā¸ˆā¸°āš€ā¸‚āš‰ā¸˛āšƒā¸ˆā¸œā¸Ĩā¸ā¸Ŗā¸°ā¸—ā¸š", "storage_template_migration": "⏁⏞⏪ā¸ĸāš‰ā¸˛ā¸ĸāš€ā¸—ā¸Ąāš€ā¸žā¸Ĩ⏕⏗ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "storage_template_migration_description": "āšƒā¸Šāš‰{template}ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™ā¸ā¸ąā¸šā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰", - "storage_template_migration_info": "āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩā¸•ā¸‚ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸ˆā¸°āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸•ā¸ąā¸§ā¸­ā¸ąā¸ā¸Šā¸Ŗāš€ā¸›āš‡ā¸™ā¸•ā¸ąā¸§ā¸žā¸´ā¸Ąā¸žāšŒāš€ā¸Ĩāš‡ā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩā¸‡āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩā¸•ā¸ˆā¸°ā¸Ąā¸ĩ⏜ā¸Ĩā¸ā¸ąā¸šāšā¸­ā¸Ēāš€ā¸‹āš‡ā¸•āšƒā¸Ģā¸Ąāšˆāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ ā¸Ģā¸˛ā¸ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸™ā¸ŗāš€ā¸—ā¸Ąāš€ā¸žā¸Ĩā¸•āš„ā¸›āšƒā¸Šāš‰ā¸ā¸ąā¸š Asset ⏗ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰ āšƒā¸Ģāš‰ā¸Ŗā¸ąā¸™ {job}.", - "storage_template_migration_job": "āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩ⏕⏁⏞⏪ Migration ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "storage_template_migration_info": "āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩ⏕⏗ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸ˆā¸°āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸•ā¸ąā¸§ā¸­ā¸ąā¸ā¸Šā¸Ŗāš€ā¸›āš‡ā¸™ā¸•ā¸ąā¸§ā¸žā¸´ā¸Ąā¸žāšŒāš€ā¸Ĩāš‡ā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩā¸‡āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩā¸•ā¸ˆā¸°ā¸Ąā¸ĩ⏜ā¸Ĩā¸ā¸ąā¸šā¸Ēā¸ˇāšˆā¸­āšƒā¸Ģā¸Ąāšˆāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ ā¸Ģā¸˛ā¸ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸™ā¸ŗāš€ā¸—ā¸Ąāš€ā¸žā¸Ĩā¸•āš„ā¸›āšƒā¸Šāš‰ā¸ā¸ąā¸šā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰ āšƒā¸Ģāš‰ā¸Ŗā¸ąā¸™ {job}", + "storage_template_migration_job": "⏇⏞⏙ā¸ĸāš‰ā¸˛ā¸ĸāš€ā¸—ā¸Ąāš€ā¸žā¸Ĩ⏕⏗ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "storage_template_more_details": "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”āš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ąāš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸šā¸Ÿā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒā¸™ā¸ĩāš‰ āš‚ā¸›ā¸Ŗā¸”ā¸”ā¸šā¸—ā¸ĩāšˆ Storage Template āšā¸Ĩ⏰ ⏜ā¸Ĩā¸ā¸Ŗā¸°ā¸—ā¸š", "storage_template_onboarding_description_v2": "āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸” ⏟ā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒā¸ˆā¸°ā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸•ā¸˛ā¸Ąāš€ā¸—ā¸Ąāš€ā¸žā¸Ĩ⏕⏗ā¸ĩāšˆā¸œā¸šāš‰āšƒā¸Šāš‰ā¸ā¸ŗā¸Ģ⏙⏔ ā¸­āšˆā¸˛ā¸™āš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ą", "storage_template_path_length": "⏂ā¸ĩā¸”ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸‚ā¸­ā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸ĸā¸˛ā¸§ā¸žā¸˛ā¸˜āš‚ā¸”ā¸ĸā¸›ā¸Ŗā¸°ā¸Ąā¸˛ā¸“: {length, number}/{limit, number}", - "storage_template_settings": "āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩā¸•ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "storage_template_settings": "āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩ⏕⏗ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "storage_template_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāš‚ā¸„ā¸Ŗā¸‡ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒāšā¸Ĩā¸°ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔", - "storage_template_user_label": "{label} ā¸›āš‰ā¸˛ā¸ĸā¸ā¸ŗā¸ā¸ąā¸šā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸āš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "storage_template_user_label": "{label} ā¸„ā¸ˇā¸­ā¸›āš‰ā¸˛ā¸ĸā¸ā¸ŗā¸ā¸ąā¸šā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸‚ā¸­ā¸‡ā¸œā¸šāš‰āšƒā¸Šāš‰", "system_settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ŗā¸°ā¸šā¸š", "tag_cleanup_job": "āš€ā¸„ā¸Ĩā¸ĩā¸ĸā¸ŖāšŒ Tags", "template_email_available_tags": "⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšƒā¸Šāš‰ā¸•ā¸ąā¸§āšā¸›ā¸Ŗā¸•āšˆā¸­āš„ā¸›ā¸™ā¸ĩāš‰āšƒā¸™āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩā¸•ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸”āš‰: {tags}", @@ -333,7 +364,7 @@ "transcoding_encoding_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", "transcoding_encoding_options_description": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ codecs, ā¸„ā¸§ā¸˛ā¸Ąā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔, ā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸ž (āšā¸Ĩā¸°ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ˇāšˆā¸™āš† ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē (encoded videos)", "transcoding_hardware_acceleration": "ā¸ā¸˛ā¸Ŗāš€ā¸Ŗāšˆā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸”āš‰ā¸§ā¸ĸā¸Žā¸˛ā¸ŖāšŒā¸”āšā¸§ā¸ŖāšŒ", - "transcoding_hardware_acceleration_description": "⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇: ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ē⏗ā¸ĩāšˆāš€ā¸Ŗāš‡ā¸§ā¸‚ā¸ļāš‰ā¸™ āšā¸•āšˆā¸­ā¸˛ā¸ˆā¸—ā¸ŗāšƒā¸Ģāš‰ā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žā¸Ĩ⏔ā¸Ĩ⏇⏗ā¸ĩāšˆā¸šā¸´ā¸•āš€ā¸Ŗā¸•āš€ā¸—āšˆā¸˛āš€ā¸”ā¸´ā¸Ą", + "transcoding_hardware_acceleration_description": "⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇: āšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ēāš€ā¸Ŗāš‡ā¸§ā¸‚ā¸ļāš‰ā¸™ āšā¸•āšˆā¸­ā¸˛ā¸ˆā¸—ā¸ŗāšƒā¸Ģāš‰ā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žā¸Ĩ⏔ā¸Ĩ⏇⏗ā¸ĩāšˆā¸šā¸´ā¸•āš€ā¸Ŗā¸•āš€ā¸—āšˆā¸˛āš€ā¸”ā¸´ā¸Ą", "transcoding_hardware_decoding": "⏁⏞⏪⏖⏭⏔⏪ā¸Ģā¸ąā¸Ēā¸”āš‰ā¸§ā¸ĸā¸Žā¸˛ā¸ŖāšŒā¸”āšā¸§ā¸ŖāšŒ", "transcoding_hardware_decoding_setting_description": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ā¸˛ā¸Ŗāš€ā¸Ŗāšˆā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§āšā¸šā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” āšā¸—ā¸™ā¸ā¸˛ā¸Ŗāš€ā¸Ŗāšˆā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ēāš€ā¸žā¸ĩā¸ĸ⏇⏭ā¸ĸāšˆā¸˛ā¸‡āš€ā¸”ā¸ĩā¸ĸ⏧ ā¸­ā¸˛ā¸ˆāšƒā¸Šāš‰āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸ā¸ąā¸šā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "transcoding_max_b_frames": "B-frames ā¸Ēā¸šā¸‡ā¸Ē⏏⏔", @@ -348,7 +379,7 @@ "transcoding_preferred_hardware_device": "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸Žā¸˛ā¸ŖāšŒā¸”āšā¸§ā¸ŖāšŒā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ", "transcoding_preferred_hardware_device_description": "āšƒā¸Šāš‰āš„ā¸”āš‰ā¸ā¸ąā¸š VAAPI āšā¸Ĩ⏰ QSV āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš‚ā¸Ģ⏙⏔ dri ⏗ā¸ĩāšˆāšƒā¸Šāš‰ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸—ā¸Ŗā¸˛ā¸™ā¸ĒāšŒāš‚ā¸„āš‰ā¸”ā¸Žā¸˛ā¸ŖāšŒā¸”āšā¸§ā¸ŖāšŒ", "transcoding_preset_preset": "ā¸žā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸• (-preset)", - "transcoding_preset_preset_description": "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§āšƒā¸™ā¸ā¸˛ā¸Ŗā¸šā¸ĩā¸šā¸­ā¸ąā¸” ā¸žā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸—ā¸ĩāšˆā¸Šāš‰ā¸˛ā¸ā¸§āšˆā¸˛ā¸ˆā¸°ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸Ąā¸ĩā¸‚ā¸™ā¸˛ā¸”āš€ā¸Ĩāš‡ā¸ā¸Ĩā¸‡āšā¸Ĩā¸°āš€ā¸žā¸´āšˆā¸Ąā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žāš€ā¸Ąā¸ˇāšˆā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸›āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸ⏗ā¸ĩāšˆā¸­ā¸ąā¸•ā¸Ŗā¸˛ā¸šā¸´ā¸•āš€ā¸Ŗā¸•ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģ⏙⏔ VP9 ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ēā¸™āšƒā¸ˆā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸—ā¸ĩāšˆā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛ 'āš€ā¸Ŗāš‡ā¸§ā¸ā¸§āšˆā¸˛'", + "transcoding_preset_preset_description": "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§āšƒā¸™ā¸ā¸˛ā¸Ŗā¸šā¸ĩā¸šā¸­ā¸ąā¸” ā¸žā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸—ā¸ĩāšˆā¸Šāš‰ā¸˛ā¸ā¸§āšˆā¸˛ā¸ˆā¸°ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸Ąā¸ĩā¸‚ā¸™ā¸˛ā¸”āš€ā¸Ĩāš‡ā¸ā¸Ĩā¸‡āšā¸Ĩā¸°āš€ā¸žā¸´āšˆā¸Ąā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žāš€ā¸Ąā¸ˇāšˆā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸›āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸ⏗ā¸ĩāšˆā¸­ā¸ąā¸•ā¸Ŗā¸˛ā¸šā¸´ā¸•āš€ā¸Ŗā¸•ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģ⏙⏔ VP9 ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ēā¸™āšƒā¸ˆā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸—ā¸ĩāšˆā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛ 'faster'", "transcoding_reference_frames": "frames ā¸­āš‰ā¸˛ā¸‡ā¸­ā¸´ā¸‡", "transcoding_reference_frames_description": "ā¸ˆā¸ŗā¸™ā¸§ā¸™āš€ā¸Ÿā¸Ŗā¸Ąā¸—ā¸ĩāšˆā¸ˆā¸°ā¸­āš‰ā¸˛ā¸‡ā¸­ā¸´ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸šā¸ĩā¸šā¸­ā¸ąā¸”āš€ā¸Ÿā¸Ŗā¸Ąā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģ⏙⏔ ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸Ēā¸šā¸‡ā¸‚ā¸ļāš‰ā¸™ā¸ˆā¸°ā¸Šāšˆā¸§ā¸ĸāš€ā¸žā¸´āšˆā¸Ąā¸›ā¸Ŗā¸°ā¸Ēā¸´ā¸—ā¸˜ā¸´ā¸ ā¸˛ā¸žāšƒā¸™ā¸ā¸˛ā¸Ŗā¸šā¸ĩā¸šā¸­ā¸ąā¸” āšā¸•āšˆā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ēā¸Šāš‰ā¸˛ā¸Ĩ⏇ ā¸„āšˆā¸˛ 0 ā¸ˆā¸°ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "transcoding_required_description": "āš€ā¸‰ā¸žā¸˛ā¸°ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸Ŗā¸šā¸›āšā¸šā¸šā¸—ā¸ĩāšˆā¸ĸā¸­ā¸Ąā¸Ŗā¸ąā¸šāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", @@ -356,14 +387,14 @@ "transcoding_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸§āšˆā¸˛ā¸§ā¸ĩ⏔ā¸ĩāš‚ā¸­āš„ā¸Ģā¸™ā¸ˆā¸°ā¸–ā¸šā¸āšā¸›ā¸Ĩā¸‡ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē (Transcode) āšā¸Ĩ⏰⏧⏴⏘ā¸ĩā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩāš„ā¸Ÿā¸ĨāšŒā¸”ā¸ąā¸‡ā¸ā¸Ĩāšˆā¸˛ā¸§", "transcoding_target_resolution": "āš€ā¸›āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸Ąā¸Šā¸ąā¸”", "transcoding_target_resolution_description": "ā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸Ąā¸Šā¸ąā¸”ā¸—ā¸ĩāšˆā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛ā¸ˆā¸°āš€ā¸āš‡ā¸šā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔⏔ā¸ĩā¸ā¸§āšˆā¸˛āšā¸•āšˆāšƒā¸Šāš‰āš€ā¸§ā¸Ĩā¸˛āšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒā¸™ā¸˛ā¸™ā¸ā¸§āšˆā¸˛ ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒāšƒā¸Ģā¸āšˆā¸ā¸§āšˆā¸˛ āšā¸Ĩ⏰ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡ā¸‚ā¸­ā¸‡āšā¸­ā¸›", - "transcoding_temporal_aq": "AQ ā¸Šā¸ąāšˆā¸§ā¸„ā¸Ŗā¸˛ā¸§", - "transcoding_temporal_aq_description": "āš€ā¸‰ā¸žā¸˛ā¸° NVENC āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ āš€ā¸žā¸´āšˆā¸Ąā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸‡ā¸‰ā¸˛ā¸ā¸—ā¸ĩāšˆā¸Ąā¸ĩ⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔ā¸Ēā¸šā¸‡āšā¸Ĩā¸°ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģā¸§ā¸•āšˆā¸ŗ ā¸­ā¸˛ā¸ˆāš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸—ā¸ĩāšˆāš€ā¸āšˆā¸˛ā¸ā¸§āšˆā¸˛", + "transcoding_temporal_aq": "Temporal AQ", + "transcoding_temporal_aq_description": "āš€ā¸‰ā¸žā¸˛ā¸° NVENC āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ Temporal Adaptive Quantization ā¸ˆā¸°āš€ā¸žā¸´āšˆā¸Ąā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸‡ā¸‰ā¸˛ā¸ā¸—ā¸ĩāšˆā¸Ąā¸ĩ⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔ā¸Ēā¸šā¸‡āšā¸Ĩā¸°ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģā¸§ā¸•āšˆā¸ŗ ā¸­ā¸˛ā¸ˆāš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸—ā¸ĩāšˆāš€ā¸āšˆā¸˛ā¸ā¸§āšˆā¸˛", "transcoding_threads": "āš€ā¸˜ā¸Ŗā¸”", "transcoding_threads_description": "ā¸„āšˆā¸˛ā¸ĸā¸´āšˆā¸‡āš€ā¸ĸā¸­ā¸°ā¸ˆā¸°āšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒāš€ā¸Ŗāš‡ā¸§ā¸ā¸§āšˆā¸˛ āšā¸•āšˆā¸ˆā¸°āš€ā¸Ģā¸Ĩā¸ˇā¸­ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆāšƒā¸Ģāš‰āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩā¸‡ā¸˛ā¸™ā¸­ā¸ˇāšˆā¸™ā¸™āš‰ā¸­ā¸ĸā¸Ĩā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸—āšā¸˛ā¸‡ā¸˛ā¸™ā¸™ā¸ĩāš‰ ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰āš„ā¸Ąāšˆā¸„ā¸§ā¸Ŗā¸Ąā¸˛ā¸ā¸ā¸§āšˆā¸˛ā¸ˆāšā¸˛ā¸™ā¸§ā¸™ CPU core ā¸ˆā¸°ā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩāš€ā¸•āš‡ā¸Ąā¸—ā¸ĩāšˆāš€ā¸Ąā¸ˇāšˆā¸­ā¸•ā¸ąāš‰ā¸‡āš€ā¸›āš‡ā¸™ 0", "transcoding_tone_mapping": "⏁⏞⏪⏉⏞ā¸ĸāš‚ā¸—ā¸™ā¸Ēā¸ĩ", "transcoding_tone_mapping_description": "ā¸žā¸ĸ⏞ā¸ĸā¸˛ā¸Ąā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸Ŗā¸šā¸›āšā¸šā¸šā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ HDR āš€ā¸Ąā¸ˇāšˆā¸­āšā¸›ā¸Ĩā¸‡āš€ā¸›āš‡ā¸™ SDR ā¸­ā¸ąā¸Ĩ⏁⏭⏪⏴⏗ā¸ļā¸Ąāšā¸•āšˆā¸Ĩā¸°ā¸•ā¸ąā¸§ā¸ˆā¸°ā¸›ā¸Ŗā¸ąā¸šā¸Ēā¸ĩ,⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔ āšā¸Ĩā¸°ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡āšā¸•ā¸ā¸•āšˆā¸˛ā¸‡ā¸ā¸ąā¸™ Hable ā¸ˆā¸°ā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔ Mobius ā¸ˆā¸°ā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸Ēā¸ĩ āšā¸Ĩ⏰ Reinhard ā¸ˆā¸°ā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡", "transcoding_transcode_policy": "ā¸ā¸Žā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒ", - "transcoding_transcode_policy_description": "ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸāš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸šāš€ā¸§ā¸Ĩ⏞⏗ā¸ĩāšˆā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸ˆā¸°ā¸•āš‰ā¸­ā¸‡āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ē ⏧⏴⏔ā¸ĩāš‚ā¸­ HDR ā¸ˆā¸°āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ēāš€ā¸Ēā¸Ąā¸­ (ā¸ĸā¸āš€ā¸§āš‰ā¸™āšƒā¸™ā¸ā¸Ŗā¸“ā¸ĩ⏗ā¸ĩāšˆā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ē)", + "transcoding_transcode_policy_description": "ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸāš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸šāš€ā¸§ā¸Ĩ⏞⏗ā¸ĩāšˆā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸ˆā¸°ā¸•āš‰ā¸­ā¸‡āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ē ⏧⏴⏔ā¸ĩāš‚ā¸­ HDR āšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸Ąā¸ĩā¸Ŗā¸šā¸›āšā¸šā¸šā¸žā¸´ā¸āš€ā¸‹ā¸Ĩā¸­ā¸ˇāšˆā¸™ā¸™ā¸­ā¸ā¸ˆā¸˛ā¸ YUV 4:2:0 ā¸ˆā¸°āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ēāš€ā¸Ēā¸Ąā¸­ (ā¸ĸā¸āš€ā¸§āš‰ā¸™āšƒā¸™ā¸ā¸Ŗā¸“ā¸ĩ⏗ā¸ĩāšˆā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇⏪ā¸Ģā¸ąā¸Ē)", "transcoding_two_pass_encoding": "ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒā¸Ēā¸­ā¸‡ā¸Ŗā¸­ā¸š", "transcoding_two_pass_encoding_setting_description": "ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒā¸Ēā¸­ā¸‡ā¸Ŗā¸­ā¸šā¸ˆā¸°ā¸Šāšˆā¸§ā¸ĸāšƒā¸Ģāš‰āš„ā¸”āš‰ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸”ā¸ĩ⏂ā¸ļāš‰ā¸™ āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ bitrate ā¸Ēā¸šā¸‡ā¸Ē⏏⏔ (ā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāš„ā¸Ÿā¸ĨāšŒ H.264 āšā¸Ĩ⏰ HEVC) āš‚ā¸Ģā¸Ąā¸”ā¸™ā¸ĩāš‰ā¸ˆā¸°āšƒā¸Šāš‰ā¸Šāšˆā¸§ā¸‡ bitrate ⏗ā¸ĩāšˆā¸‚ā¸ļāš‰ā¸™ā¸­ā¸ĸā¸šāšˆā¸ā¸ąā¸šā¸„āšˆā¸˛ bitrate ā¸Ēā¸šā¸‡ā¸Ēā¸¸ā¸”āšā¸Ĩā¸°āš„ā¸Ąāšˆā¸Ēā¸™āšƒā¸ˆ CRF ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸š VP9 ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšƒā¸Šāš‰ā¸„āšˆā¸˛ CRF āš„ā¸”āš‰ā¸–āš‰ā¸˛ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ bitrate ā¸Ēā¸šā¸‡ā¸Ē⏏⏔", "transcoding_video_codec": "āšā¸šā¸šāš„ā¸Ÿā¸ĨāšŒā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­", @@ -373,6 +404,7 @@ "trash_number_of_days_description": "ā¸ˆāšā¸˛ā¸™ā¸§ā¸™ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸Ēā¸ˇāšˆā¸­āš„ā¸§āš‰āšƒā¸™ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°ā¸āšˆā¸­ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸°ā¸Ĩā¸šā¸–ā¸˛ā¸§ā¸Ŗ", "trash_settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", "trash_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", + "unlink_all_oauth_accounts": "āš€ā¸Ĩ⏴⏁ā¸Ĩā¸´ā¸‡ā¸āšŒā¸šā¸ąā¸ā¸Šā¸ĩ OAuth ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "user_cleanup_job": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸œā¸šāš‰āšƒā¸Šāš‰", "user_delete_delay": "ā¸šā¸ąā¸ā¸Šā¸ĩāšā¸Ĩ⏰ā¸Ēā¸ˇāšˆā¸­ā¸‚ā¸­ā¸‡ {user} ā¸ˆā¸°ā¸–ā¸šā¸ā¸•ā¸ąāš‰ā¸‡āš€ā¸§ā¸Ĩ⏞ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ĩā¸šā¸–ā¸˛ā¸§ā¸Ŗāšƒā¸™ {delay, plural, one {# ā¸§ā¸ąā¸™} other {# ā¸§ā¸ąā¸™}}", "user_delete_delay_settings": "ā¸Ĩā¸šā¸ā¸˛ā¸Ŗā¸–āšˆā¸§ā¸‡āš€ā¸§ā¸Ĩ⏞", @@ -387,6 +419,8 @@ "user_restore_scheduled_removal": "ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰ - ⏁⏺ā¸Ģ⏙⏔⏁⏞⏪ā¸Ĩā¸šāšƒā¸™ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date, date,long}", "user_settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸œā¸šāš‰āšƒā¸Šāš‰", "user_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸œā¸šāš‰āšƒā¸Šāš‰", + "user_successfully_removed": "ā¸Ĩā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ {email} āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸Ąā¸šā¸šā¸Ŗā¸“āšŒāšā¸Ĩāš‰ā¸§", + "users_page_description": "ā¸Ģā¸™āš‰ā¸˛ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ", "version_check_enabled_description": "āš€ā¸Šāš‡ā¸„ GitHub āš€ā¸›āš‡ā¸™ā¸Ŗā¸°ā¸ĸ⏰ āš† āš€ā¸žā¸ˇāšˆā¸­ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸Ŗā¸¸āšˆā¸™āšƒā¸Ģā¸Ąāšˆ", "version_check_implications": "ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āšƒā¸Ģā¸Ąāšˆā¸ˆā¸°ā¸•āš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸•āšˆā¸­ā¸ā¸ąā¸š github.com āš€ā¸›āš‡ā¸™ā¸Ŗā¸°ā¸ĸ⏰", "version_check_settings": "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸Ŗā¸¸āšˆā¸™", @@ -398,15 +432,20 @@ "admin_password": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ⏪⏰⏚⏚", "administration": "ā¸ā¸˛ā¸Ŗā¸”ā¸šāšā¸Ĩ⏪⏰⏚⏚", "advanced": "ā¸‚ā¸ąāš‰ā¸™ā¸Ēā¸šā¸‡", + "advanced_settings_clear_image_cache": "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "advanced_settings_clear_image_cache_error": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "advanced_settings_clear_image_cache_success": "āš€ā¸„ā¸Ĩā¸ĩā¸ĸā¸ŖāšŒā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆ {size} ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "advanced_settings_enable_alternate_media_filter_subtitle": "āšƒā¸Šāš‰ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁⏙ā¸ĩāš‰āš€ā¸žā¸ˇāšˆā¸­ā¸ā¸Ŗā¸­ā¸‡ā¸Ēā¸ˇāšˆā¸­ā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡ā¸ā¸˛ā¸Ŗā¸‹ā¸´ā¸‡ā¸āšŒāš‚ā¸”ā¸ĸā¸­ā¸´ā¸‡ā¸•ā¸˛ā¸Ąāš€ā¸‡ā¸ˇāšˆā¸­ā¸™āš„ā¸‚ā¸—ā¸˛ā¸‡āš€ā¸Ĩ⏎⏭⏁ āšā¸™ā¸°ā¸™ā¸ŗāšƒā¸Ģāš‰āšƒā¸Šāš‰āš€ā¸‰ā¸žā¸˛ā¸°āš€ā¸Ąā¸ˇāšˆā¸­āšā¸­ā¸›ā¸Ąā¸ĩā¸›ā¸ąā¸ā¸Ģā¸˛āšƒā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "advanced_settings_enable_alternate_media_filter_title": "[⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇] āšƒā¸Šāš‰ā¸•ā¸ąā¸§ā¸ā¸Ŗā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸‹ā¸´ā¸‡ā¸āšŒā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸‚ā¸­ā¸‡ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāšā¸šā¸šā¸—ā¸˛ā¸‡āš€ā¸Ĩ⏎⏭⏁", "advanced_settings_log_level_title": "ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸ā¸˛ā¸Ŗ Log: {level}", - "advanced_settings_prefer_remote_subtitle": "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸šā¸˛ā¸‡āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ĸāšˆā¸­ā¸Šāš‰ā¸˛ā¸Ąā¸˛ā¸ āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰āš€ā¸žā¸ˇāšˆā¸­āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸ˆā¸˛ā¸ā¸Ŗā¸ĩāš‚ā¸Ąā¸—āšā¸—ā¸™", + "advanced_settings_prefer_remote_subtitle": "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸šā¸˛ā¸‡āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡āš‚ā¸Ģā¸Ĩā¸”ā¸ ā¸˛ā¸žā¸‚ā¸™ā¸˛ā¸”ā¸ĸāšˆā¸­ā¸ˆā¸˛ā¸ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Šāš‰ā¸˛ā¸Ąā¸˛ā¸ āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰āš€ā¸žā¸ˇāšˆā¸­āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸—ā¸˛ā¸‡āš„ā¸ā¸Ĩāšā¸—ā¸™", "advanced_settings_prefer_remote_title": "āšƒā¸Ģāš‰ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸ŗā¸„ā¸ąā¸ā¸ā¸ąā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸Ŗā¸ĩāš‚ā¸Ąā¸—", "advanced_settings_proxy_headers_subtitle": "⏁⏺ā¸Ģ⏙⏔ proxy headers ⏗ā¸ĩāšˆ Immich ⏄⏧⏪ā¸Ēāšˆā¸‡ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸ā¸ąā¸šāšā¸•āšˆā¸Ĩā¸°ā¸„ā¸ŗā¸‚ā¸­āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ", - "advanced_settings_proxy_headers_title": "ā¸žāš‡ā¸­ā¸ā¸‹ā¸ĩāšˆ āš€ā¸Žā¸”āš€ā¸”ā¸­ā¸ŖāšŒ", + "advanced_settings_proxy_headers_title": "ā¸Ēāšˆā¸§ā¸™ā¸Ģā¸ąā¸§ā¸žā¸Ŗāš‡ā¸­ā¸ā¸‹ā¸ĩ⏁⏺ā¸Ģā¸™ā¸”āš€ā¸­ā¸‡ [⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇]", + "advanced_settings_readonly_mode_subtitle": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸­āšˆā¸˛ā¸™āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ ⏋ā¸ļāšˆā¸‡ā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸”ā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāš„ā¸”āš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡āš€ā¸”ā¸ĩā¸ĸ⏧ āšā¸•āšˆāš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸Ĩ⏎⏭⏁ā¸Ģā¸Ĩ⏞ā¸ĸā¸ ā¸˛ā¸ž, āšā¸Šā¸ŖāšŒ, āšā¸„ā¸Ēā¸•āšŒ, ā¸Ĩā¸šā¸ ā¸˛ā¸žāš„ā¸”āš‰ āš€ā¸›ā¸´ā¸”ā¸Ģā¸Ŗā¸ˇā¸­ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸­āšˆā¸˛ā¸™āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™āš„ā¸”āš‰ā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸žāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­ā¸Ģā¸Ĩā¸ąā¸", + "advanced_settings_readonly_mode_title": "āš‚ā¸Ģā¸Ąā¸”ā¸­āšˆā¸˛ā¸™āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", "advanced_settings_self_signed_ssl_subtitle": "ā¸‚āš‰ā¸˛ā¸Ąā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ SSL ā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡āšā¸šā¸š self-signed", - "advanced_settings_self_signed_ssl_title": "ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ SSL āšā¸šā¸š self-signed", + "advanced_settings_self_signed_ssl_title": "ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ SSL āšā¸šā¸š self-signed [⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇]", "advanced_settings_sync_remote_deletions_subtitle": "ā¸Ĩ⏚ā¸Ģā¸Ŗā¸ˇā¸­ā¸ā¸šāš‰ā¸„ā¸ˇā¸™āš„ā¸Ÿā¸ĨāšŒā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸™ā¸ĩāš‰āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āš€ā¸Ąā¸ˇāšˆā¸­ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸”ā¸ąā¸‡ā¸ā¸Ĩāšˆā¸˛ā¸§ā¸œāšˆā¸˛ā¸™āš€ā¸§āš‡ā¸š", "advanced_settings_sync_remote_deletions_title": "ā¸‹ā¸´ā¸‡ā¸āšŒā¸ā¸˛ā¸Ŗā¸Ĩ⏚⏈⏞⏁⏪⏰ā¸ĸā¸°āš„ā¸ā¸Ĩ [⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇]", "advanced_settings_tile_subtitle": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸‚ā¸ąāš‰ā¸™ā¸Ēā¸šā¸‡", @@ -418,13 +457,13 @@ "album": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "album_added": "āš€ā¸žā¸´āšˆā¸Ąā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", "album_added_notification_setting_description": "āšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸ĩāš€ā¸Ąā¸Ĩāš€ā¸Ąā¸ˇāšˆā¸­ā¸„ā¸¸ā¸“ā¸–ā¸šā¸āš€ā¸žā¸´āšˆā¸Ąāš„ā¸›āšƒā¸™ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸ā¸ąā¸™", - "album_cover_updated": "ā¸­ā¸ąā¸žāš€ā¸”ā¸—ā¸Ģā¸™āš‰ā¸˛ā¸›ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", + "album_cover_updated": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸Ģā¸™āš‰ā¸˛ā¸›ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", "album_delete_confirmation": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸—ā¸ĩāšˆā¸ˆā¸°ā¸Ĩā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą {album} ⏙ā¸ĩāš‰ ?", "album_delete_confirmation_description": "ā¸Ģā¸˛ā¸āšā¸Šā¸ŖāšŒā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸™ā¸ĩāš‰ ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸Ŗā¸˛ā¸ĸā¸­ā¸ˇāšˆā¸™ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡āš„ā¸”āš‰ā¸­ā¸ĩ⏁", "album_deleted": "ā¸Ĩā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", "album_info_card_backup_album_excluded": "ā¸–ā¸šā¸ā¸ĸā¸āš€ā¸§āš‰ā¸™", "album_info_card_backup_album_included": "ā¸Ŗā¸§ā¸Ą", - "album_info_updated": "ā¸­ā¸ąā¸›āš€ā¸”ā¸—ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", + "album_info_updated": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", "album_leave": "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą ?", "album_leave_confirmation": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą {album} āšƒā¸Šāšˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", "album_name": "ā¸Šā¸ˇāšˆā¸­ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", @@ -435,8 +474,8 @@ "album_selected": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", "album_share_no_users": "ā¸”ā¸šāš€ā¸Ģā¸Ąā¸ˇā¸­ā¸™ā¸§āšˆā¸˛ā¸„ā¸¸ā¸“āš„ā¸”āš‰āšā¸Šā¸ŖāšŒā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸™ā¸ĩāš‰ā¸ā¸ąā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšā¸Ĩāš‰ā¸§", "album_summary": "ā¸Ēā¸Ŗā¸¸ā¸›ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", - "album_updated": "ā¸­ā¸ąā¸›āš€ā¸”ā¸—ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", - "album_updated_setting_description": "āšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸ĩāš€ā¸Ąā¸Ĩāš€ā¸Ąā¸ˇāšˆā¸­ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸ā¸ąā¸™ā¸Ąā¸ĩā¸Ēā¸ˇāšˆā¸­āšƒā¸Ģā¸Ąāšˆ", + "album_updated": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšā¸Ĩāš‰ā¸§", + "album_updated_setting_description": "ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸ĩāš€ā¸Ąā¸Ĩāš€ā¸Ąā¸ˇāšˆā¸­ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸Ąā¸ĩā¸Ēā¸ˇāšˆā¸­āšƒā¸Ģā¸Ąāšˆ", "album_upload_assets": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ˇāšˆā¸­ā¸ˆā¸˛ā¸ā¸„ā¸­ā¸Ąā¸žā¸´ā¸§āš€ā¸•ā¸­ā¸ŖāšŒāš€ā¸žā¸ˇāšˆā¸­āš€ā¸žā¸´āšˆā¸Ąāš„ā¸›ā¸ĸā¸ąā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "album_user_left": "⏭⏭⏁⏈⏞⏁ {album}", "album_user_removed": "ā¸Ĩā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ {user} āšā¸Ĩāš‰ā¸§", @@ -475,6 +514,7 @@ "api_key_description": "ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰ā¸ˆā¸°āšā¸Ēā¸”ā¸‡āš€ā¸žā¸ĩā¸ĸā¸‡ā¸„ā¸Ŗā¸ąāš‰ā¸‡āš€ā¸”ā¸ĩā¸ĸ⏧ āš‚ā¸›ā¸Ŗā¸”ā¸„ā¸ąā¸”ā¸Ĩā¸­ā¸ā¸āšˆā¸­ā¸™ā¸›ā¸´ā¸”ā¸Ģā¸™āš‰ā¸˛ā¸•āšˆā¸˛ā¸‡", "api_key_empty": "ā¸Šā¸ˇāšˆā¸­ API Key ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸Ąāšˆā¸„ā¸§ā¸Ŗā¸§āšˆā¸˛ā¸‡āš€ā¸›ā¸Ĩāšˆā¸˛", "api_keys": "API Key", + "app_architecture_variant": "ā¸Ŗā¸šā¸›āšā¸šā¸š (ā¸Ēā¸–ā¸˛ā¸›ā¸ąā¸•ā¸ĸā¸ā¸Ŗā¸Ŗā¸Ą)", "app_bar_signout_dialog_content": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸­ā¸ĸ⏞⏁⏭⏭⏁⏈⏞⏁⏪⏰⏚⏚", "app_bar_signout_dialog_ok": "āšƒā¸Šāšˆ", "app_bar_signout_dialog_title": "⏭⏭⏁⏈⏞⏁⏪⏰⏚⏚", @@ -483,6 +523,7 @@ "app_stores": "ā¸Ŗāš‰ā¸˛ā¸™ā¸„āš‰ā¸˛āšā¸­ā¸›", "app_update_available": "ā¸Ąā¸ĩā¸­ā¸ąā¸›āš€ā¸”ā¸•āšā¸­ā¸›", "appears_in": "⏭ā¸ĸā¸šāšˆāšƒā¸™", + "apply_count": "āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ ({count, number})", "archive": "āš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗ", "archive_action_prompt": "āš€ā¸žā¸´āšˆā¸Ą {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš„ā¸›ā¸ĸā¸ąā¸‡āš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗāšā¸Ĩāš‰ā¸§", "archive_or_unarchive_photo": "āš€ā¸āš‡ā¸š/āš„ā¸Ąāšˆāš€ā¸āš‡ā¸šā¸ ā¸˛ā¸žā¸–ā¸˛ā¸§ā¸Ŗ", @@ -565,8 +606,10 @@ "backup_album_selection_page_select_albums": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "backup_album_selection_page_selection_info": "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏂⏭⏇⏗ā¸ĩāšˆāš€ā¸Ĩ⏎⏭⏁", "backup_album_selection_page_total_assets": "ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", + "backup_albums_sync": "ā¸ā¸˛ā¸Ŗā¸‹ā¸´ā¸‡ā¸āšŒā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "backup_all": "ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "backup_background_service_backup_failed_message": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ĩā¸­ā¸‡āšƒā¸Ģā¸Ąāšˆ...", + "backup_background_service_complete_notification": "ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸Ēā¸ˇāšˆā¸­āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸Ąā¸šā¸šā¸Ŗā¸“āšŒ", "backup_background_service_connection_failed_message": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸ā¸ąā¸šāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒāš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ĩā¸­ā¸‡āšƒā¸Ģā¸Ąāšˆ...", "backup_background_service_current_upload_notification": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸­ā¸ąā¸žāš‚ā¸Ģā¸Ĩ⏔ {filename}", "backup_background_service_default_notification": "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚ā¸Ģā¸˛ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāšƒā¸Ģā¸Ąāšˆ...", @@ -614,6 +657,7 @@ "backup_controller_page_turn_on": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšƒā¸™ā¸‰ā¸˛ā¸ā¸Ģā¸™āš‰ā¸˛", "backup_controller_page_uploading_file_info": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸­ā¸ąā¸žāš‚ā¸Ģā¸Ĩā¸”ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš„ā¸Ÿā¸ĨāšŒ", "backup_err_only_album": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸™ā¸ŗā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸Ēā¸¸ā¸”ā¸—āš‰ā¸˛ā¸ĸā¸­ā¸­ā¸āš„ā¸”āš‰", + "backup_error_sync_failed": "ā¸ā¸˛ā¸Ŗā¸‹ā¸´ā¸‡ā¸āšŒāš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩ⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "backup_info_card_assets": "ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪", "backup_manual_cancelled": "ā¸–ā¸šā¸ā¸ĸā¸āš€ā¸Ĩ⏴⏁", "backup_manual_in_progress": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸­ā¸ĸā¸šāšˆ āš‚ā¸›ā¸Ŗā¸”ā¸Ĩā¸­ā¸‡āšƒā¸Ģā¸Ąāšˆāšƒā¸™ā¸Ēā¸ąā¸ā¸žā¸ąā¸", @@ -630,9 +674,9 @@ "biometric_no_options": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ēā¸šā¸ˆā¸™āšŒā¸­ā¸ąā¸•ā¸Ĩā¸ąā¸ā¸Šā¸“āšŒāš€ā¸žā¸ˇāšˆā¸­ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸šā¸¸ā¸„ā¸„ā¸Ĩ", "biometric_not_available": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ēā¸šā¸ˆā¸™āšŒā¸­ā¸ąā¸•ā¸Ĩā¸ąā¸ā¸Šā¸“āšŒāš€ā¸žā¸ˇāšˆā¸­ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸šā¸¸ā¸„ā¸„ā¸Ĩāš„ā¸”āš‰ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸™ā¸ĩāš‰", "birthdate_saved": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸§ā¸ąā¸™āš€ā¸ā¸´ā¸”āšā¸Ĩāš‰ā¸§", - "birthdate_set_description": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāš€ā¸ā¸´ā¸”ā¸ˆā¸°ā¸™ā¸ŗā¸Ąā¸˛āšƒā¸Šāš‰āšƒā¸™ā¸ā¸˛ā¸Ŗā¸„ā¸ŗā¸™ā¸§ā¸“ā¸­ā¸˛ā¸ĸā¸¸ā¸‚ā¸­ā¸‡ā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏙ā¸ĩāš‰āšƒā¸™ā¸‚ā¸“ā¸°ā¸—ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸā¸Ŗā¸šā¸›", + "birthdate_set_description": "ā¸§ā¸ąā¸™āš€ā¸ā¸´ā¸”ā¸ˆā¸°āšƒā¸Šāš‰āš€ā¸žā¸ˇāšˆā¸­ā¸„ā¸ŗā¸™ā¸§ā¸“ā¸­ā¸˛ā¸ĸā¸¸ā¸‚ā¸­ā¸‡ā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏙ā¸ĩāš‰āšƒā¸™ā¸‚ā¸“ā¸°ā¸—ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸā¸Ŗā¸šā¸›", "blurred_background": "ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡āšā¸šā¸šāš€ā¸šā¸Ĩ⏭", - "bugs_and_feature_requests": "⏪⏞ā¸ĸā¸‡ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ & ā¸‚āš‰ā¸­āš€ā¸Ēā¸™ā¸­āšā¸™ā¸°", + "bugs_and_feature_requests": "⏪⏞ā¸ĸā¸‡ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”āšā¸Ĩā¸°ā¸‚āš‰ā¸­āš€ā¸Ēā¸™ā¸­āšā¸™ā¸°", "build": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡", "build_image": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ Image", "bulk_delete_duplicates_confirmation": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩ⏚ {count, plural, one {# duplicate asset} other {# duplicate asset}} āš€ā¸›āš‡ā¸™ā¸ā¸Ĩā¸¸āšˆā¸Ą ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰ā¸ˆā¸°āš€ā¸āš‡ā¸šā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆāšƒā¸Ģā¸āšˆā¸—ā¸ĩāšˆā¸Ēā¸¸ā¸”ā¸‚ā¸­ā¸‡āšā¸•āšˆā¸Ĩ⏰⏁ā¸Ĩā¸¸āšˆā¸Ąāšā¸Ĩ⏰ā¸Ĩ⏚ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸‹āš‰ā¸ŗā¸ā¸ąā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸–ā¸˛ā¸§ā¸Ŗ ā¸„ā¸¸ā¸“āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰āš„ā¸”āš‰!", @@ -642,7 +686,7 @@ "cache_settings_clear_cache_button": "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Š", "cache_settings_clear_cache_button_title": "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Šā¸‚ā¸­ā¸‡āšā¸­ā¸ž ⏈⏰ā¸Ēāšˆā¸‡ā¸œā¸Ĩā¸ā¸Ŗā¸°ā¸—ā¸šā¸•āšˆā¸­ā¸›ā¸Ŗā¸°ā¸Ēā¸´ā¸—ā¸˜ā¸´ā¸ ā¸˛ā¸žāšā¸­ā¸žā¸ˆā¸™ā¸ā¸§āšˆā¸˛āšā¸„ā¸Šā¸ˆā¸°ā¸–ā¸šā¸ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšƒā¸Ģā¸Ąāšˆ", "cache_settings_duplicated_assets_clear_button": "ā¸Ĩāš‰ā¸˛ā¸‡", - "cache_settings_duplicated_assets_subtitle": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸–ā¸šā¸ā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛āšā¸šā¸Ĩāš‡ā¸ā¸Ĩ⏴ā¸Ēā¸•āšŒāš‚ā¸”ā¸ĸāšā¸­ā¸›", + "cache_settings_duplicated_assets_subtitle": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸–ā¸šā¸ā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš€ā¸žā¸´ā¸āš€ā¸‰ā¸ĸāš‚ā¸”ā¸ĸāšā¸­ā¸›", "cache_settings_duplicated_assets_title": "ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪⏗ā¸ĩāšˆā¸‹āš‰ā¸ŗā¸ā¸ąā¸™ ({count})", "cache_settings_statistics_album": "ā¸Ŗā¸šā¸›ā¸ĸāšˆā¸­ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", "cache_settings_statistics_full": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāš€ā¸•āš‡ā¸Ą", @@ -701,9 +745,12 @@ "cleanup_icloud_shared_albums_excluded": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸šā¸™ iCloud āš„ā¸Ąāšˆā¸™ā¸ąā¸šā¸Ŗā¸§ā¸Ąāšƒā¸™ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞", "cleanup_no_assets_found": "āš„ā¸Ąāšˆā¸žā¸šā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸‡ā¸•ā¸˛ā¸Ąāš€ā¸‡ā¸ˇāšˆā¸­ā¸™āš„ā¸‚ā¸”āš‰ā¸˛ā¸™ā¸šā¸™ \"āš€ā¸žā¸´āšˆā¸Ąā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸§āšˆā¸˛ā¸‡\" ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ĩā¸šāš„ā¸”āš‰āš€ā¸‰ā¸žā¸˛ā¸°ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸šā¸™āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒāš€ā¸Ŗā¸ĩā¸ĸā¸šā¸Ŗāš‰ā¸­ā¸ĸāšā¸Ĩāš‰ā¸§āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", "cleanup_preview_title": "ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸ˆā¸°ā¸Ĩ⏚ ({count})", + "cleanup_step3_description": "ā¸Ēāšā¸ā¸™ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸Ĩāš‰ā¸§ ⏗ā¸ĩāšˆā¸•ā¸Ŗā¸‡ā¸•ā¸˛ā¸Ąā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸Ĩā¸°ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", + "cleanup_step4_summary": "ā¸Ēā¸ˇāšˆā¸­ {count} ⏪⏞ā¸ĸ⏁⏞⏪ (ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸āšˆā¸­ā¸™ {date}) ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩā¸šā¸ˆā¸˛ā¸ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸•āš‰ā¸™ā¸—ā¸˛ā¸‡ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸ˆā¸°ā¸ĸā¸ąā¸‡āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡āš„ā¸”āš‰ā¸ˆā¸˛ā¸āšā¸­ā¸› Immich", "clear": "ā¸Ĩāš‰ā¸˛ā¸‡", "clear_all": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "clear_all_recent_searches": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸›ā¸Ŗā¸°ā¸§ā¸ąā¸•ā¸´ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞", + "clear_file_cache": "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Šāš„ā¸Ÿā¸ĨāšŒ", "clear_message": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", "clear_value": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸„āšˆā¸˛", "client_cert_dialog_msg_confirm": "āš€ā¸Ēā¸Ŗāš‡ā¸ˆ", @@ -711,15 +758,23 @@ "client_cert_import": "ā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛", "client_cert_import_success_msg": "ā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "client_cert_invalid_msg": "āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ ā¸Ģ⏪⏎⏭⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", + "client_cert_password_message": "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸™ā¸ĩāš‰", + "client_cert_password_title": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", "client_cert_remove_msg": "ā¸Ĩā¸šāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", - "client_cert_subtitle": "ā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šāš€ā¸‰ā¸žā¸˛ā¸° PKCS12 (.p12, .pfx) āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ ā¸ā¸˛ā¸Ŗā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛/ā¸Ĩā¸šāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸—ā¸ŗāš„ā¸”āš‰ā¸āšˆā¸­ā¸™ā¸Ĩāš‡ā¸­ā¸„ā¸­ā¸´ā¸™āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", - "client_cert_title": "āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ SSL āš„ā¸„ā¸Ĩāš€ā¸­ā¸™ā¸•āšŒ", + "client_cert_subtitle": "ā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šāš€ā¸‰ā¸žā¸˛ā¸° PKCS12 (.p12, .pfx) āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ ā¸ā¸˛ā¸Ŗā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛/ā¸Ĩā¸šāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸—ā¸ŗāš„ā¸”āš‰ā¸āšˆā¸­ā¸™āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", + "client_cert_title": "āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ SSL āš„ā¸„ā¸Ĩāš€ā¸­ā¸™ā¸•āšŒ [⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸”ā¸Ĩ⏭⏇]", "clockwise": "ā¸•ā¸˛ā¸Ąāš€ā¸‚āš‡ā¸Ąā¸™ā¸˛ā¸Ŧ⏴⏁⏞", "close": "⏛⏴⏔", "collapse": "ā¸ĸāšˆā¸­", "collapse_all": "ā¸ĸāšˆā¸­ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "color": "ā¸Ēā¸ĩ", "color_theme": "ā¸Ēā¸ĩ⏘ā¸ĩā¸Ą", + "command": "⏄⏺ā¸Ēā¸ąāšˆā¸‡", + "command_palette_prompt": "ā¸„āš‰ā¸™ā¸Ģ⏞ā¸Ģā¸™āš‰ā¸˛ ⏁⏞⏪⏁⏪⏰⏗⏺ ā¸Ģ⏪⏎⏭⏄⏺ā¸Ēā¸ąāšˆā¸‡āš„ā¸”āš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸Ŗā¸§ā¸”āš€ā¸Ŗāš‡ā¸§", + "command_palette_to_close": "āš€ā¸žā¸ˇāšˆā¸­ā¸›ā¸´ā¸”", + "command_palette_to_navigate": "āš€ā¸žā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛", + "command_palette_to_select": "āš€ā¸žā¸ˇāšˆā¸­āš€ā¸Ĩ⏎⏭⏁", + "command_palette_to_show_all": "āš€ā¸žā¸ˇāšˆā¸­āšā¸Ēā¸”ā¸‡ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "comment_deleted": "ā¸Ĩā¸šā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸´ā¸”āš€ā¸Ģāš‡ā¸™āšā¸Ĩāš‰ā¸§", "comment_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸´ā¸”āš€ā¸Ģāš‡ā¸™", "comments_and_likes": "ā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸´ā¸”āš€ā¸Ģāš‡ā¸™āšā¸Ĩā¸°ā¸ā¸˛ā¸Ŗā¸–ā¸šā¸āšƒā¸ˆ", @@ -742,10 +797,10 @@ "continue": "ā¸•āšˆā¸­āš„ā¸›", "control_bottom_app_bar_create_new_album": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšƒā¸Ģā¸Ąāšˆ", "control_bottom_app_bar_delete_from_immich": "ā¸Ĩ⏚⏈⏞⏁ Immich", - "control_bottom_app_bar_delete_from_local": "ā¸Ĩā¸šā¸ˆā¸˛ā¸āš€ā¸Ŗā¸ˇāšˆā¸­ā¸‡", + "control_bottom_app_bar_delete_from_local": "ā¸Ĩā¸šā¸ˆā¸˛ā¸āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡", "control_bottom_app_bar_edit_location": "āšā¸āš‰āš„ā¸‚ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", "control_bottom_app_bar_edit_time": "āšā¸āš‰āš„ā¸‚ā¸§ā¸ąā¸™āšā¸Ĩā¸°āš€ā¸§ā¸Ĩ⏞", - "control_bottom_app_bar_share_link": "āšā¸Šā¸ŖāšŒā¸Ĩā¸´ā¸‡ā¸„āšŒ", + "control_bottom_app_bar_share_link": "āšā¸Šā¸ŖāšŒā¸Ĩā¸´ā¸‡ā¸āšŒ", "control_bottom_app_bar_share_to": "āšā¸Šā¸ŖāšŒāšƒā¸Ģāš‰", "control_bottom_app_bar_trash_from_immich": "ā¸ĸāš‰ā¸˛ā¸ĸāš€ā¸‚āš‰ā¸˛ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", "copied_image_to_clipboard": "ā¸„ā¸ąā¸”ā¸Ĩā¸­ā¸ā¸ ā¸˛ā¸žāš„ā¸›ā¸ĸā¸ąā¸‡ā¸„ā¸Ĩā¸´ā¸›ā¸šā¸­ā¸ŖāšŒā¸”āšā¸Ĩāš‰ā¸§", @@ -763,6 +818,7 @@ "create": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡", "create_album": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "create_album_page_untitled": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸Šā¸ˇāšˆā¸­", + "create_api_key": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸ĩā¸ĸāšŒ API", "create_library": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", "create_link": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ĩā¸´ā¸‡ā¸āšŒ", "create_link_to_share": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ĩā¸´ā¸‡ā¸āšŒāš€ā¸žā¸ˇāšˆā¸­āšā¸Šā¸ŖāšŒ", @@ -773,35 +829,47 @@ "create_new_user": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āšƒā¸Ģā¸Ąāšˆ", "create_shared_album_page_share_add_assets": "āš€ā¸žā¸´āšˆā¸Ąā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪", "create_shared_album_page_share_select_photos": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "create_shared_link": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", "create_tag": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšā¸—āš‡ā¸āšƒā¸Ģā¸Ąāšˆ", "create_tag_description": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšā¸—āš‡ā¸āšƒā¸Ģā¸Ąāšˆ ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāšā¸—āš‡ā¸ā¸—ā¸ĩāšˆā¸‹āš‰ā¸­ā¸™ā¸ā¸ąā¸™ āš‚ā¸›ā¸Ŗā¸”ā¸›āš‰ā¸­ā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸‚ā¸­ā¸‡āšā¸—āš‡ā¸ ā¸Ŗā¸§ā¸Ąā¸–ā¸ļā¸‡āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸā¸—ā¸ąā¸š", "create_user": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸œā¸šāš‰āšƒā¸Šāš‰", "created": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšā¸Ĩāš‰ā¸§", "created_at": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­", "crop": "⏄⏪⏭⏛", + "crop_aspect_ratio_fixed": "⏄⏇⏗ā¸ĩāšˆ", + "crop_aspect_ratio_free": "⏭⏴ā¸Ē⏪⏰", + "crop_aspect_ratio_original": "ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š", "curated_object_page_title": "ā¸Ēā¸´āšˆā¸‡ā¸‚ā¸­ā¸‡", "current_device": "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™", "current_pin_code": "⏪ā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN) ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™", "current_server_address": "⏗ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™", - "custom_locale": "ā¸›ā¸Ŗā¸ąā¸šā¸ ā¸˛ā¸Šā¸˛ā¸—āš‰ā¸­ā¸‡ā¸–ā¸´āšˆā¸™āš€ā¸­ā¸‡", - "custom_locale_description": "āšƒā¸Šāš‰ā¸Ŗā¸šā¸›āšā¸šā¸šā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸Ĩā¸°ā¸•ā¸ąā¸§āš€ā¸Ĩā¸‚ā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸Šā¸˛āšā¸Ĩā¸°ā¸‚ā¸­ā¸šāš€ā¸‚ā¸•", + "custom_date": "⏁⏺ā¸Ģā¸™ā¸”ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāš€ā¸­ā¸‡", + "custom_locale": "⏁⏺ā¸Ģā¸™ā¸”ā¸ ā¸˛ā¸Šā¸˛ā¸—āš‰ā¸­ā¸‡ā¸–ā¸´āšˆā¸™āš€ā¸­ā¸‡", + "custom_locale_description": "āšƒā¸Šāš‰ā¸Ŗā¸šā¸›āšā¸šā¸šā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ āš€ā¸§ā¸Ĩ⏞ āšā¸Ĩā¸°ā¸•ā¸ąā¸§āš€ā¸Ĩā¸‚ā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸Šā¸˛āšā¸Ĩā¸°ā¸ ā¸šā¸Ąā¸´ā¸ ā¸˛ā¸„ā¸—ā¸ĩāšˆāš€ā¸Ĩ⏎⏭⏁", + "custom_url": "URL ⏁⏺ā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", + "cutoff_date_description": "āš€ā¸āš‡ā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸ˆā¸˛ā¸ā¸Šāšˆā¸§ā¸‡āš€ā¸§ā¸Ĩ⏞â€Ļ", + "cutoff_day": "{count, plural, one {ā¸§ā¸ąā¸™} other {ā¸§ā¸ąā¸™}}", + "cutoff_year": "{count, plural, one {⏛ā¸ĩ} other {⏛ā¸ĩ}}", "daily_title_text_date": "E dd MMM", "daily_title_text_date_year": "E dd MMM yyyy", "dark": "ā¸Ąā¸ˇā¸”", + "dark_theme": "āš€ā¸›ā¸´ā¸”-ā¸›ā¸´ā¸”ā¸˜ā¸ĩā¸Ąā¸Ēā¸ĩā¸Ąā¸ˇā¸”", + "date": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ", "date_after": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆā¸Ģā¸Ĩā¸ąā¸‡ā¸ˆā¸˛ā¸", "date_and_time": "ā¸§ā¸ąā¸™āšā¸Ĩā¸°āš€ā¸§ā¸Ĩ⏞", "date_before": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆā¸āšˆā¸­ā¸™", + "date_format": "E d LLL y â€ĸ hh:mm", "date_of_birth_saved": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸§ā¸ąā¸™āš€ā¸ā¸´ā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸šā¸Ŗāš‰ā¸­ā¸ĸāšā¸Ĩāš‰ā¸§", "date_range": "ā¸Šāšˆā¸§ā¸‡ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ", "day": "ā¸§ā¸ąā¸™", + "days": "ā¸§ā¸ąā¸™", "deduplicate_all": "ā¸Ŗā¸§ā¸Ąāš€ā¸‚āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "deduplication_criteria_1": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸šā¸•āšŒā¸‚ā¸­ā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "deduplication_criteria_2": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ EXIF", "deduplication_info": "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸ā¸˛ā¸Ŗā¸‚ā¸ˆā¸ąā¸”ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸‹āš‰ā¸ŗā¸‹āš‰ā¸­ā¸™", "deduplication_info_description": "āš€ā¸Ĩ⏎⏭⏁ā¸Ēā¸ˇāšˆā¸­ā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āšā¸Ĩ⏰ā¸Ĩ⏚⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗā¸‹āš‰ā¸ŗā¸‹āš‰ā¸­ā¸™ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸Ąā¸˛ā¸ āš€ā¸Ŗā¸˛ā¸ˆā¸°ā¸”ā¸šā¸—ā¸ĩāšˆ:", - "default_locale": "ā¸ ā¸˛ā¸Šā¸˛ā¸—āš‰ā¸­ā¸‡ā¸–ā¸´āšˆā¸™ā¸›ā¸ā¸•ā¸´", - "default_locale_description": "āšƒā¸Šāš‰ā¸Ŗā¸šā¸›āšā¸šā¸šā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸Ĩā¸°ā¸•ā¸ąā¸§āš€ā¸Ĩā¸‚ā¸ˆā¸˛ā¸āš€ā¸šā¸Ŗā¸˛ā¸§āšŒāš€ā¸‹ā¸­ā¸ŖāšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "delete": "ā¸Ĩ⏚⏭⏭⏁", + "delete_action_prompt": "ā¸Ĩ⏚ {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§", "delete_album": "ā¸Ĩā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "delete_api_key_prompt": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩ⏚ API ⏄ā¸ĩā¸ĸāšŒ ⏙ā¸ĩāš‰āšƒā¸Šāšˆāš„ā¸Ģā¸Ą ?", "delete_dialog_alert": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗā¸”ā¸ąā¸‡ā¸ā¸Ĩāšˆā¸˛ā¸§ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩ⏚⏈⏞⏁ Immich āšā¸Ĩā¸°āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸–ā¸˛ā¸§ā¸Ŗ", @@ -815,9 +883,12 @@ "delete_key": "ā¸Ĩā¸šā¸ā¸¸ā¸āšā¸ˆ", "delete_library": "ā¸Ĩā¸šā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", "delete_link": "ā¸Ĩ⏚ā¸Ĩā¸´ā¸‡ā¸āšŒ", + "delete_local_action_prompt": "ā¸Ĩ⏚ {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāšƒā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡āšā¸Ĩāš‰ā¸§", "delete_local_dialog_ok_backed_up_only": "ā¸Ĩā¸šā¸—ā¸ĩāšˆā¸Ēā¸ŗā¸Ŗā¸­ā¸‡āš„ā¸§āš‰āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", "delete_local_dialog_ok_force": "ā¸Ĩā¸šā¸•āšˆā¸­āš„ā¸›", "delete_others": "ā¸Ĩā¸šā¸œā¸šāš‰ā¸­ā¸ˇāšˆā¸™", + "delete_permanently": "ā¸Ĩā¸šā¸–ā¸˛ā¸§ā¸Ŗ", + "delete_permanently_action_prompt": "ā¸Ĩā¸šā¸–ā¸˛ā¸§ā¸Ŗ {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§", "delete_shared_link": "ā¸Ĩ⏚ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", "delete_shared_link_dialog_title": "ā¸Ĩ⏚ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", "delete_tag": "ā¸Ĩā¸šāšā¸—āš‡ā¸", @@ -828,8 +899,10 @@ "description": "⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔", "description_input_hint_text": "āš€ā¸žā¸ˇāšˆā¸Ąā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔...", "description_input_submit_error": "ā¸­ā¸ąā¸žāš€ā¸”ā¸•ā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚ log āš€ā¸žā¸ˇāšˆā¸­ā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”āš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ą", + "deselect_all": "ā¸ĸā¸āš€ā¸Ĩā¸´ā¸ā¸ā¸˛ā¸Ŗāš€ā¸Ĩā¸ˇā¸­ā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "details": "⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔", "direction": "āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡", + "disable": "ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "disabled": "ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "disallow_edits": "āš„ā¸Ąāšˆā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšƒā¸Ģāš‰āšā¸āš‰āš„ā¸‚", "discord": "⏔⏴ā¸Ēā¸„ā¸­ā¸ŖāšŒā¸”", @@ -837,12 +910,12 @@ "discovered_devices": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ", "dismiss_all_errors": "ā¸›ā¸ā¸´āš€ā¸Ēā¸˜ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "dismiss_error": "ā¸›ā¸ā¸´āš€ā¸Ēā¸˜ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", - "display_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗāšā¸Ē⏔⏇", + "display_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸œā¸Ĩ", "display_order": "ā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸œā¸Ĩ", "display_original_photos": "āšā¸Ēā¸”ā¸‡ā¸ ā¸˛ā¸žā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š", "display_original_photos_setting_description": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸Ēā¸”ā¸‡ā¸œā¸Ĩā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰ā¸­ā¸˛ā¸ˆā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸ ā¸˛ā¸žāš„ā¸”āš‰ā¸Šāš‰ā¸˛ā¸Ĩ⏇", "do_not_show_again": "āš„ā¸Ąāšˆāšā¸Ēā¸”ā¸‡ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸™ā¸ĩāš‰ā¸­ā¸ĩ⏁", - "documentation": "āš€ā¸­ā¸ā¸Ē⏞⏪", + "documentation": "āš€ā¸­ā¸ā¸Ēā¸˛ā¸Ŗā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", "done": "āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™", "download": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔", "download_action_prompt": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔ {count} ā¸Šā¸´āš‰ā¸™", @@ -877,6 +950,8 @@ "edit_birthday": "āšā¸āš‰āš„ā¸‚ā¸§ā¸ąā¸™āš€ā¸ā¸´ā¸”", "edit_date": "āšā¸āš‰āš„ā¸‚ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ", "edit_date_and_time": "āšā¸āš‰āš„ā¸‚ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸Ĩā¸°āš€ā¸§ā¸Ĩ⏞", + "edit_date_and_time_action_prompt": "āšā¸āš‰āš„ā¸‚ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸Ĩā¸°āš€ā¸§ā¸Ĩ⏞ {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§", + "edit_date_and_time_by_offset_interval": "ā¸Šāšˆā¸§ā¸‡ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšƒā¸Ģā¸Ąāšˆ: {from} - {to}", "edit_description": "āšā¸āš‰āš„ā¸‚ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸ", "edit_description_prompt": "āš‚ā¸›ā¸Ŗā¸”āš€ā¸Ĩā¸ˇāšˆā¸­ā¸ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸāšƒā¸Ģā¸Ąāšˆ", "edit_exclusion_pattern": "āšā¸āš‰āš„ā¸‚ā¸‚āš‰ā¸­ā¸ĸā¸āš€ā¸§āš‰ā¸™", @@ -913,6 +988,7 @@ "empty_trash": "ā¸—ā¸´āš‰ā¸‡ā¸ˆā¸˛ā¸ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", "empty_trash_confirmation": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩāš‰ā¸˛ā¸‡ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰ ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸Ĩā¸šā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšƒā¸™ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰⏭⏭⏁⏈⏞⏁ Immich ⏭ā¸ĸāšˆā¸˛ā¸‡ā¸–ā¸˛ā¸§ā¸Ŗ\nā¸„ā¸¸ā¸“āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰āš„ā¸”āš‰!", "enable": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", + "enable_backup": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "enable_biometric_auth_description": "āšƒā¸Ēāšˆā¸žā¸´ā¸™āš€ā¸žā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ēā¸šā¸ˆā¸™āšŒā¸­ā¸ąā¸•ā¸Ĩā¸ąā¸ā¸Šā¸“āšŒāš€ā¸žā¸ˇāšˆā¸­ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸šā¸¸ā¸„ā¸„ā¸Ĩ", "enabled": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "end_date": "ā¸§ā¸ąā¸™ā¸Ēā¸´āš‰ā¸™ā¸Ē⏏⏔", @@ -923,10 +999,15 @@ "error": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", "error_change_sort_album": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸ā¸˛ā¸Ŗāš€ā¸Ŗā¸ĩā¸ĸ⏇ā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "error_delete_face": "āš€ā¸ā¸´ā¸”āš€ā¸­ā¸­āš€ā¸Ŗā¸­ā¸ŖāšŒ āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ĩā¸šāšƒā¸šā¸Ģā¸™āš‰ā¸˛ā¸­ā¸­ā¸āš„ā¸”āš‰", + "error_getting_places": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏂⏓⏰⏔ā¸ļ⏇ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ", + "error_loading_albums": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”ā¸‚ā¸“ā¸°āš‚ā¸Ģā¸Ĩā¸”ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "error_loading_image": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏪⏰ā¸Ģā¸§āšˆā¸˛ā¸‡āš‚ā¸Ģā¸Ĩā¸”ā¸ ā¸˛ā¸ž", + "error_loading_partners": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”ā¸‚ā¸“ā¸°āš‚ā¸Ģā¸Ĩā¸”ā¸„ā¸šāšˆā¸Ģā¸š: {error}", + "error_retrieving_asset_information": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏂⏓⏰⏔ā¸ļā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸Ēā¸ˇāšˆā¸­", "error_saving_image": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏪⏰ā¸Ģā¸§āšˆā¸˛ā¸‡āš€ā¸‹ā¸Ÿā¸ ā¸˛ā¸ž: {error}", "error_tag_face_bounding_box": "ā¸ā¸˛ā¸Ŗāšā¸—āš‡ā¸āšƒā¸šā¸Ģā¸™āš‰ā¸˛ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ - āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸•ā¸ĩā¸ā¸Ŗā¸­ā¸šāšƒā¸šā¸Ģā¸™āš‰ā¸˛āš„ā¸”āš‰", "error_title": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", + "error_while_navigating": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”ā¸‚ā¸“ā¸°ā¸™ā¸ŗā¸—ā¸˛ā¸‡āš„ā¸›ā¸ĸā¸ąā¸‡ā¸Ēā¸ˇāšˆā¸­", "errors": { "cannot_navigate_next_asset": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡āš„ā¸”āš‰", "cannot_navigate_previous_asset": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛āš„ā¸”āš‰", @@ -956,13 +1037,16 @@ "failed_to_load_notifications": "āš‚ā¸Ģā¸Ĩā¸”ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™āš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "failed_to_load_people": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš‚ā¸Ģā¸Ĩā¸”ā¸šā¸¸ā¸„ā¸„ā¸Ĩāš„ā¸”āš‰", "failed_to_remove_product_key": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ĩ⏚ product key āš„ā¸”āš‰", + "failed_to_reset_pin_code": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸Ŗā¸Ģā¸ąā¸Ē PIN", "failed_to_stack_assets": "Failed to stack assets", "failed_to_unstack_assets": "Failed to un-stack assets", "failed_to_update_notification_status": "ā¸­ā¸ąā¸žāš€ā¸”ā¸—ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™āš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "incorrect_email_or_password": "⏭ā¸ĩāš€ā¸Ąā¸Ĩā¸Ģ⏪⏎⏭⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", + "page_not_found": "āš„ā¸Ąāšˆā¸žā¸šā¸Ģā¸™āš‰ā¸˛ :/", "paths_validation_failed": "ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚ {paths, plural, one {# path} other {# paths}} ā¸Ĩāš‰ā¸Ąāš€ā¸Ģā¸Ĩ⏧", "profile_picture_transparent_pixels": "ā¸Ŗā¸šā¸›āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒāš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ąā¸ĩā¸žā¸´ā¸āš€ā¸‹ā¸Ĩāš‚ā¸›ā¸Ŗāšˆā¸‡āšƒā¸Ēāš„ā¸”āš‰ āš‚ā¸›ā¸Ŗā¸”ā¸‹ā¸šā¸Ąāš€ā¸‚āš‰ā¸˛āšā¸Ĩ⏰/ā¸Ģ⏪⏎⏭ā¸ĸāš‰ā¸˛ā¸ĸā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "quota_higher_than_disk_size": "ā¸„ā¸¸ā¸“ā¸•ā¸ąāš‰ā¸‡āš‚ā¸„ā¸§ā¸•ā¸˛āš„ā¸§āš‰ā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛ā¸‚ā¸™ā¸˛ā¸”ā¸”ā¸´ā¸Ēā¸āšŒ", + "something_went_wrong": "ā¸Ąā¸ĩā¸šā¸˛ā¸‡ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", "unable_to_add_album_users": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸žā¸´āšˆā¸Ąā¸œā¸šāš‰āšƒā¸Šāš‰āš„ā¸›ā¸ĸā¸ąā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸”āš‰", "unable_to_add_assets_to_shared_link": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸žā¸´āšˆā¸Ąā¸Ĩā¸‡āšƒā¸™ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒāš„ā¸”āš‰", "unable_to_add_comment": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸žā¸´āšˆā¸Ąā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ģāš‡ā¸™āš„ā¸”āš‰", @@ -1022,7 +1106,7 @@ "unable_to_restore_user": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸Ŗā¸ĩā¸ĸā¸ā¸„ā¸ˇā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰āš„ā¸”āš‰", "unable_to_save_album": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸”āš‰", "unable_to_save_api_key": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸šā¸ąā¸™ā¸—ā¸ļ⏁ API ⏄ā¸ĩā¸ĸāšŒ āš„ā¸”āš‰", - "unable_to_save_date_of_birth": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸•ā¸ąāš‰ā¸‡ā¸§ā¸ąā¸™āš€ā¸ā¸´ā¸”āš„ā¸”āš‰", + "unable_to_save_date_of_birth": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸§ā¸ąā¸™āš€ā¸ā¸´ā¸”āš„ā¸”āš‰", "unable_to_save_name": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸Šā¸ˇāšˆā¸­āš„ā¸”āš‰", "unable_to_save_profile": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸šā¸ąā¸™ā¸—ā¸ļā¸āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒāš„ā¸”āš‰", "unable_to_save_settings": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš„ā¸”āš‰", @@ -1036,20 +1120,24 @@ "unable_to_unlink_motion_video": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšā¸ĸā¸ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģā¸§āš„ā¸”āš‰", "unable_to_update_album_cover": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸›ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸”āš‰", "unable_to_update_album_info": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸”āš‰", - "unable_to_update_library": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸žāš€ā¸”ā¸—ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žāš„ā¸”āš‰", - "unable_to_update_location": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸žāš€ā¸”ā¸—ā¸•āšā¸˛āšā¸Ģā¸™āšˆā¸‡āš„ā¸”āš‰", - "unable_to_update_settings": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸žāš€ā¸”ā¸—ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš„ā¸”āš‰", + "unable_to_update_library": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žāš„ā¸”āš‰", + "unable_to_update_location": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸•āšā¸˛āšā¸Ģā¸™āšˆā¸‡āš„ā¸”āš‰", + "unable_to_update_settings": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš„ā¸”āš‰", "unable_to_update_timeline_display_status": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšā¸āš‰āš„ā¸‚ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸ā¸˛ā¸Ŗāšā¸Ē⏔⏇ā¸Ĩā¸ŗā¸”ā¸ąā¸šāš€ā¸§ā¸Ĩā¸˛āš„ā¸”āš‰", - "unable_to_update_user": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸žāš€ā¸”ā¸—ā¸œā¸šāš‰āšƒā¸Šāš‰āš„ā¸”āš‰", + "unable_to_update_user": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸œā¸šāš‰āšƒā¸Šāš‰āš„ā¸”āš‰", "unable_to_upload_file": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš„ā¸”āš‰" }, + "errors_text": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", "exif": "Exif", "exif_bottom_sheet_description": "āš€ā¸žā¸´āšˆā¸Ąā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸ", + "exif_bottom_sheet_description_error": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”ā¸‚ā¸“ā¸°ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸ", "exif_bottom_sheet_details": "⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔", "exif_bottom_sheet_location": "ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", + "exif_bottom_sheet_no_description": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸ", "exif_bottom_sheet_people": "⏄⏙", "exif_bottom_sheet_person_add_person": "āš€ā¸žā¸´āšˆā¸Ąā¸Šā¸ˇāšˆā¸­", "exit_slideshow": "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸ā¸˛ā¸Ŗā¸™ā¸ŗāš€ā¸Ē⏙⏭", + "expand": "⏂ā¸ĸ⏞ā¸ĸ", "expand_all": "⏂ā¸ĸ⏞ā¸ĸā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "experimental_settings_new_asset_list_subtitle": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸žā¸ąā¸’ā¸™ā¸˛", "experimental_settings_new_asset_list_title": "āš€ā¸›ā¸´ā¸”ā¸•ā¸˛ā¸Ŗā¸˛ā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ĩā¸ąā¸‡ā¸—ā¸”ā¸Ĩ⏭⏇", @@ -1058,39 +1146,49 @@ "expire_after": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸ⏏ā¸Ģā¸Ĩā¸ąā¸‡ā¸ˆā¸˛ā¸", "expired": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸āšā¸Ĩāš‰ā¸§", "expires_date": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "explore": "ā¸Ēāšā¸˛ā¸Ŗā¸§ā¸ˆ", + "explore": "ā¸Ē⏺⏪⏧⏈", "explorer": "āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ąā¸ˇā¸­ā¸Ē⏺⏪⏧⏈", "export": "ā¸Ēāšˆā¸‡ā¸­ā¸­ā¸", "export_as_json": "ā¸Ēāšˆā¸‡ā¸­ā¸­ā¸āš€ā¸›āš‡ā¸™āš„ā¸Ÿā¸ĨāšŒ JSON", + "export_database": "ā¸Ēāšˆā¸‡ā¸­ā¸­ā¸ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "export_database_description": "ā¸Ēāšˆā¸‡ā¸­ā¸­ā¸ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ SQLite", "extension": "ā¸Ēāšˆā¸§ā¸™ā¸•āšˆā¸­ā¸‚ā¸ĸ⏞ā¸ĸ", "external": "⏠⏞ā¸ĸ⏙⏭⏁", "external_libraries": "⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸ⏙⏭⏁", "external_network": "ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸ ā¸˛ā¸ĸ⏙⏭⏁", - "external_network_sheet_info": "āš€ā¸Ąā¸ˇāšˆā¸­āš„ā¸Ąāšˆāš„ā¸”āš‰āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ Wi-Fi ⏗ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸§āš‰ āšā¸­ā¸žā¸ˆā¸°āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸œāšˆā¸˛ā¸™ URL ā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡ā¸•ā¸˛ā¸Ąā¸Ĩā¸ŗā¸”ā¸ąā¸š", + "external_network_sheet_info": "āš€ā¸Ąā¸ˇāšˆā¸­āš„ā¸Ąāšˆāš„ā¸”āš‰āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ Wi-Fi ⏗ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸§āš‰ āšā¸­ā¸›ā¸ˆā¸°āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸œāšˆā¸˛ā¸™ URL ā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡ā¸—ā¸ĩāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡āš„ā¸”āš‰ā¸•ā¸˛ā¸Ąā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸ˆā¸˛ā¸ā¸šā¸™ā¸Ĩ⏇ā¸Ĩāšˆā¸˛ā¸‡", "face_unassigned": "āš„ā¸Ąāšˆā¸ā¸ŗā¸Ģā¸™ā¸”ā¸Ąā¸­ā¸šā¸Ģā¸Ąā¸˛ā¸ĸ", "failed": "ā¸Ĩāš‰ā¸Ąāš€ā¸Ģā¸Ĩ⏧", + "failed_count": "āš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ: {count}", "failed_to_authenticate": "⏁⏞⏪ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸•ā¸™āš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "failed_to_load_assets": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”āšƒā¸™ā¸ā¸˛ā¸Ŗāš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ˇāšˆā¸­", "failed_to_load_folder": "āš‚ā¸Ģā¸Ĩā¸”āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒāš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "favorite": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”", + "favorite_action_prompt": "āš€ā¸žā¸´āšˆā¸Ą {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš„ā¸›ā¸ĸā¸ąā¸‡ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”āšā¸Ĩāš‰ā¸§", "favorite_or_unfavorite_photo": "āš‚ā¸›ā¸Ŗā¸”ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆāš‚ā¸›ā¸Ŗā¸”ā¸ ā¸˛ā¸ž", "favorites": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”", "favorites_page_no_favorites": "āš„ā¸Ąāšˆā¸žā¸šā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāšƒā¸™ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”", - "feature_photo_updated": "ā¸­ā¸ąā¸žāš€ā¸”ā¸—ā¸ ā¸˛ā¸žāš€ā¸”āšˆā¸™āšā¸Ĩāš‰ā¸§", + "feature_photo_updated": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸ ā¸˛ā¸žāš€ā¸”āšˆā¸™āšā¸Ĩāš‰ā¸§", "features": "⏟ā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒ", + "features_in_development": "⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛", "features_setting_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸Ÿā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒāšā¸­ā¸›", "file_name_or_extension": "ā¸™ā¸˛ā¸Ąā¸Ē⏁⏏ā¸Ĩā¸Ģā¸Ŗā¸ˇā¸­ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ", + "file_name_text": "ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ", + "file_name_with_value": "ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ: {file_name}", + "file_size": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ", "filename": "ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ", "filetype": "ā¸Šā¸™ā¸´ā¸”āš„ā¸Ÿā¸ĨāšŒ", "filter": "ā¸•ā¸ąā¸§ā¸ā¸Ŗā¸­ā¸‡", "filter_people": "ā¸ā¸Ŗā¸­ā¸‡ā¸œā¸šāš‰ā¸„ā¸™", "filter_places": "⏁⏪⏭⏇ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ", + "filters": "ā¸•ā¸ąā¸§ā¸ā¸Ŗā¸­ā¸‡", "find_them_fast": "ā¸„āš‰ā¸™ā¸Ģā¸˛āš‚ā¸”ā¸ĸā¸Šā¸ˇāšˆā¸­ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸Ŗā¸§ā¸”āš€ā¸Ŗāš‡ā¸§", "fix_incorrect_match": "āšā¸āš‰āš„ā¸‚ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", "folder": "āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒ", "folder_not_found": "āš„ā¸Ąāšˆā¸žā¸šāš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒ", "folders": "āš‚ā¸Ÿā¸ĨāšŒāš€ā¸”ā¸­ā¸ŖāšŒ", "folders_feature_description": "ā¸ā¸˛ā¸Ŗāš€ā¸Ŗā¸ĩā¸ĸā¸ā¸”ā¸šā¸Ąā¸¸ā¸Ąā¸Ąā¸­ā¸‡āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ ā¸˛ā¸žā¸–āšˆā¸˛ā¸ĸāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­āšƒā¸™ā¸Ŗā¸°ā¸šā¸šāš„ā¸Ÿā¸ĨāšŒ", + "forgot_pin_code_question": "ā¸Ģ⏞⏁ā¸Ĩā¸ˇā¸Ą PIN", "forward": "āš„ā¸›ā¸‚āš‰ā¸˛ā¸‡ā¸Ģā¸™āš‰ā¸˛", "free_up_space": "āš€ā¸žā¸´āšˆā¸Ąā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸§āšˆā¸˛ā¸‡", "free_up_space_description": "āš€ā¸žā¸´āšˆā¸Ąā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸§āšˆā¸˛ā¸‡āš‚ā¸”ā¸ĸ⏁⏞⏪ā¸ĸāš‰ā¸˛ā¸ĸā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸Ĩāš‰ā¸§āš„ā¸›ā¸ĸā¸ąā¸‡ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°ā¸‚ā¸­ā¸‡ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ ā¸Ēā¸ŗāš€ā¸™ā¸˛ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸šā¸™āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸ĸā¸ąā¸‡ā¸„ā¸‡ā¸­ā¸ĸā¸šāšˆā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ", @@ -1098,12 +1196,16 @@ "gcast_enabled": "Google Cast", "gcast_enabled_description": "⏟ā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒā¸™ā¸ĩāš‰ā¸•āš‰ā¸­ā¸‡āš‚ā¸Ģā¸Ĩā¸”ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪⏈⏞⏁ Google āš€ā¸žā¸ˇāšˆā¸­ā¸—ā¸ŗā¸‡ā¸˛ā¸™", "general": "ā¸—ā¸ąāšˆā¸§āš„ā¸›", + "geolocation_instruction_location": "⏄ā¸Ĩā¸´ā¸ā¸šā¸™ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸Ąā¸ĩā¸žā¸´ā¸ā¸ąā¸” GPS āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸™ā¸ąāš‰ā¸™ ā¸Ģā¸Ŗā¸ˇā¸­āš€ā¸Ĩā¸ˇā¸­ā¸ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸ˆā¸˛ā¸āšā¸œā¸™ā¸—ā¸ĩāšˆāš‚ā¸”ā¸ĸ⏕⏪⏇", "get_help": "ā¸‚ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Šāšˆā¸§ā¸ĸāš€ā¸Ģā¸Ĩ⏎⏭", + "get_people_error": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏂⏓⏰⏔ā¸ļā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸œā¸šāš‰ā¸„ā¸™", "get_wifiname_error": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ŗā¸ąā¸šā¸Šā¸ˇāšˆā¸­ Wi-Fi ⏁⏪⏏⏓⏞ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸ā¸˛ā¸Ŗāšƒā¸Ģāš‰ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšā¸­ā¸ž āšā¸Ĩ⏰ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸§āšˆā¸˛ Wi-Fi āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸­ā¸ĸā¸šāšˆ", "getting_started": "āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "go_back": "⏁ā¸Ĩā¸ąā¸š", "go_to_folder": "āš„ā¸›ā¸—ā¸ĩāšˆāš‚ā¸Ÿā¸ĨāšŒāš€ā¸”ā¸­ā¸ŖāšŒ", "go_to_search": "⏁ā¸Ĩā¸ąā¸šāš„ā¸›ā¸ĸā¸ąā¸‡ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞", + "gps": "GPS", + "gps_missing": "āš„ā¸Ąāšˆā¸Ąā¸ĩ GPS", "grant_permission": "āšƒā¸Ģāš‰ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•", "group_albums_by": "ā¸ˆā¸ąā¸”ā¸ā¸Ĩā¸¸āšˆā¸Ąā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸•ā¸˛ā¸Ą", "group_country": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸ⏇⏁ā¸Ĩā¸¸āšˆā¸Ąā¸•ā¸˛ā¸Ąā¸›ā¸Ŗā¸°āš€ā¸—ā¸¨", @@ -1119,16 +1221,18 @@ "header_settings_header_name_input": "ā¸Šā¸ˇāšˆā¸­ Header", "header_settings_header_value_input": "ā¸„āšˆā¸˛ Header", "headers_settings_tile_title": "ā¸›ā¸Ŗā¸ąā¸šāšā¸•āšˆā¸‡ proxy headers", + "height": "ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸šā¸‡", "hi_user": "ā¸Ēā¸§ā¸ąā¸Ē⏔ā¸ĩ⏄⏏⏓ {name} {email}", "hide_all_people": "ā¸‹āšˆā¸­ā¸™ā¸šā¸¸ā¸„ā¸„ā¸Ĩā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "hide_gallery": "ā¸‹āšˆā¸­ā¸™ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", "hide_named_person": "ā¸‹āšˆā¸­ā¸™ {name}", "hide_password": "ā¸‹āšˆā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", "hide_person": "ā¸‹āšˆā¸­ā¸™ā¸šā¸¸ā¸„ā¸„ā¸Ĩ", + "hide_text_recognition": "ā¸‹āšˆā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", "hide_unnamed_people": "ā¸‹āšˆā¸­ā¸™ā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏗ā¸ĩāšˆāš„ā¸Ąāšˆāš„ā¸”āš‰ā¸Ŗā¸°ā¸šā¸¸ā¸Šā¸ˇāšˆā¸­", "home_page_add_to_album_conflicts": "āš€ā¸žā¸´āšˆā¸Ą {added} ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą {album}. {failed} ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪⏭ā¸ĸā¸šāšˆāšƒā¸™ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸­ā¸ĸā¸šāšˆāšā¸Ĩāš‰ā¸§", "home_page_add_to_album_err_local": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸žā¸´āšˆā¸Ąā¸Ēā¸ˇāšˆā¸­ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš€ā¸‚āš‰ā¸˛ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą ā¸‚āš‰ā¸˛ā¸Ą", - "home_page_add_to_album_success": "āš€ā¸žā¸´āšˆā¸Ąā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪ {added} āš€ā¸‚āš‰ā¸˛ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą {album}", + "home_page_add_to_album_success": "āš€ā¸žā¸´āšˆā¸Ąā¸Ēā¸ˇāšˆā¸­ {added} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą {album} āšā¸Ĩāš‰ā¸§", "home_page_album_err_partner": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸žā¸´āšˆā¸Ąā¸Ēā¸ˇāšˆā¸­ā¸‚ā¸­ā¸‡ā¸„ā¸šāšˆā¸Ģā¸šāš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", "home_page_archive_err_local": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗāš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", "home_page_archive_err_partner": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸āš‡ā¸šā¸Ēā¸ˇāšˆā¸­ā¸‚ā¸­ā¸‡ā¸„ā¸šāšˆā¸Ģā¸šāš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", @@ -1140,25 +1244,27 @@ "home_page_first_time_notice": "ā¸–āš‰ā¸˛ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸™ā¸ĩāš‰āš€ā¸›āš‡ā¸™ā¸„ā¸Ŗā¸ąāš‰ā¸‡āšā¸Ŗā¸ā¸—ā¸ĩāšˆāšƒā¸Šāš‰āšā¸­ā¸›ā¸™ā¸ĩāš‰ ā¸ā¸Ŗā¸¸ā¸“ā¸˛āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆā¸ˆā¸°ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ āš„ā¸—ā¸ĄāšŒāš„ā¸Ĩā¸™āšŒā¸ˆā¸°āš„ā¸”āš‰āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "home_page_locked_error_local": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ĸāš‰ā¸˛ā¸ĸā¸Ēā¸ˇāšˆā¸­ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš„ā¸›ā¸ĸā¸ąā¸‡āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸„ ā¸‚āš‰ā¸˛ā¸Ą", "home_page_locked_error_partner": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸žā¸´āšˆā¸Ąā¸Ēā¸ˇāšˆā¸­ā¸‚ā¸­ā¸‡ā¸„ā¸šāšˆā¸Ģā¸šāš„ā¸›ā¸ĸā¸ąā¸‡āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸„āš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", - "home_page_share_err_local": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšā¸Šā¸ŖāšŒā¸œāšˆā¸˛ā¸™ā¸Ĩā¸´ā¸‡ā¸„āšŒāš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", + "home_page_share_err_local": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšā¸Šā¸ŖāšŒā¸Ēā¸ˇāšˆā¸­āšƒā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸œāšˆā¸˛ā¸™ā¸Ĩā¸´ā¸‡ā¸āšŒāš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", "home_page_upload_err_limit": "ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸žāš‚ā¸Ģā¸Ĩā¸”āš„ā¸”āš‰ā¸Ąā¸˛ā¸ā¸Ēā¸¸ā¸”ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸Ĩ⏰ 30 ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", "host": "āš‚ā¸Žā¸Ēā¸•āšŒ", "hour": "ā¸Šā¸ąāšˆā¸§āš‚ā¸Ąā¸‡", + "hours": "ā¸Šā¸ąāšˆā¸§āš‚ā¸Ąā¸‡", "id": "āš„ā¸­ā¸”ā¸ĩ", + "idle": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™", "ignore_icloud_photos": "ā¸‚āš‰ā¸˛ā¸Ąā¸ ā¸˛ā¸žā¸šā¸™ iCloud", "ignore_icloud_photos_description": "ā¸ ā¸˛ā¸žā¸—ā¸ĩāšˆā¸–ā¸šā¸āš€ā¸āš‡ā¸šā¸šā¸™ iCloud ā¸ˆā¸°āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸­ā¸ąā¸žāš‚ā¸Ģā¸Ĩ⏔⏂ā¸ļāš‰ā¸™ Immich", "image": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", - "image_alt_text_date": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}ā¸–ā¸šā¸ā¸–āšˆā¸˛ā¸ĸāš€ā¸Ąā¸ˇāšˆā¸­ {date}", - "image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_2_people": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1} āšā¸Ĩ⏰ {person2} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_3_people": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1}, {person2},āšā¸Ĩ⏰ {person3} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_4_or_more_people": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1}, {person2},āšā¸Ĩ⏰ {additionalCount, number} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_place": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_place_1_person": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_place_2_people": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1} āšā¸Ĩ⏰ {person2} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_place_3_people": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1}, {person2},āšā¸Ĩ⏰ {person3} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Image}} ā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1}, {person2}, āšā¸Ĩ⏰ {additionalCount, number} āšƒā¸™ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", - "image_saved_successfully": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸–ā¸šā¸āš€ā¸‹ā¸Ÿ", + "image_alt_text_date": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸāš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_1_person": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_2_people": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1} āšā¸Ĩ⏰ {person2} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_3_people": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1}, {person2}, āšā¸Ĩ⏰ {person3} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_4_or_more_people": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸā¸ā¸ąā¸š {person1}, {person2}, āšā¸Ĩ⏰ {additionalCount, number} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_place": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_place_1_person": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_place_2_people": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1} āšā¸Ĩ⏰ {person2} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_place_3_people": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1}, {person2}, āšā¸Ĩ⏰ {person3} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {⏧⏴⏔ā¸ĩāš‚ā¸­} other {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž}}⏗ā¸ĩāšˆā¸–āšˆā¸˛ā¸ĸāšƒā¸™ {city}, {country} ā¸ā¸ąā¸š {person1}, {person2}, āšā¸Ĩ⏰ {additionalCount, number} āš€ā¸Ąā¸ˇāšˆā¸­ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", + "image_saved_successfully": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩāš‰ā¸§", "image_viewer_page_state_provider_download_started": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™", "image_viewer_page_state_provider_download_success": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "image_viewer_page_state_provider_share_error": "āšā¸Šā¸ŖāšŒā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", @@ -1168,6 +1274,8 @@ "import_path": "ā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡", "in_albums": "āšƒā¸™ {count, plural, one {# album} other {# albums}}", "in_archive": "āšƒā¸™ā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗ", + "in_year": "āšƒā¸™ā¸›ā¸ĩ {year}", + "in_year_selector": "āšƒā¸™ā¸›ā¸ĩ", "include_archived": "ā¸Ŗā¸§ā¸Ąāš„ā¸Ÿā¸ĨāšŒāš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗ", "include_shared_albums": "ā¸Ŗā¸§ā¸Ąā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸ā¸ąā¸™", "include_shared_partner_assets": "ā¸Ŗā¸§ā¸Ąā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸ā¸ąā¸šā¸„ā¸šāšˆā¸Ģā¸š", @@ -1188,15 +1296,22 @@ "ios_debug_info_last_sync_at": "ā¸‹ā¸´ā¸‡ā¸„āšŒā¸Ĩāšˆā¸˛ā¸Ē⏏⏔ {dateTime}", "ios_debug_info_no_processes_queued": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸„ā¸´ā¸§āšƒā¸™ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡", "ios_debug_info_no_sync_yet": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ąā¸ĩā¸‡ā¸˛ā¸™ā¸‹ā¸´ā¸‡ā¸„āšŒā¸Ŗā¸ąā¸™āšƒā¸™ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡", - "ios_debug_info_processes_queued": "{count} āš‚ā¸žā¸Ŗāš€ā¸‹ā¸Ēā¸Ŗā¸­ā¸„ā¸´ā¸§āšƒā¸™ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡", + "ios_debug_info_processes_queued": "{count, plural, one {{count} āš‚ā¸žā¸Ŗāš€ā¸‹ā¸Ēā¸Ŗā¸­ā¸„ā¸´ā¸§āšƒā¸™ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡} other {{count} āš‚ā¸žā¸Ŗāš€ā¸‹ā¸Ēā¸Ŗā¸­ā¸„ā¸´ā¸§āšƒā¸™ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡}}", "ios_debug_info_processing_ran_at": "āš‚ā¸žā¸Ŗāš€ā¸‹ā¸Ēā¸Ŗā¸ąā¸™āš€ā¸Ąā¸ˇāšˆā¸­ {dateTime}", "items_count": "{count, plural, one {# ⏪⏞ā¸ĸ⏁⏞⏪} other {# ⏪⏞ā¸ĸ⏁⏞⏪}}", "jobs": "⏇⏞⏙", + "json_editor": "ā¸•ā¸ąā¸§āšā¸āš‰āš„ā¸‚ JSON", + "json_error": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ JSON", "keep": "āš€ā¸āš‡ā¸š", + "keep_albums": "āš€ā¸āš‡ā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", + "keep_albums_count": "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸āš‡ā¸š {count} {count, plural, one {ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą} other {ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą}}", "keep_all": "āš€ā¸āš‡ā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "keep_description": "āš€ā¸Ĩ⏎⏭⏁ā¸Ēā¸´āšˆā¸‡ā¸—ā¸ĩāšˆā¸ˆā¸°āš€ā¸āš‡ā¸šāš„ā¸§āš‰ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸‚ā¸“ā¸°āš€ā¸žā¸´āšˆā¸Ąā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸§āšˆā¸˛ā¸‡", + "keep_favorites": "āš€ā¸āš‡ā¸šā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”", + "keep_on_device": "āš€ā¸āš‡ā¸šā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ", "keep_on_device_hint": "āš€ā¸Ĩ⏎⏭⏁⏪⏞ā¸ĸ⏁⏞⏪⏗ā¸ĩāšˆā¸ˆā¸°āš€ā¸āš‡ā¸šāš„ā¸§āš‰ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸™ā¸ĩāš‰", "keep_this_delete_others": "āš€ā¸āš‡ā¸šā¸Ēā¸´āšˆā¸‡ā¸™ā¸ĩāš‰āš„ā¸§āš‰ ā¸Ĩā¸šā¸­ā¸ąā¸™ā¸­ā¸ˇāšˆā¸™ā¸­ā¸­ā¸", + "keeping": "āš€ā¸āš‡ā¸šāš„ā¸§āš‰: {items}", "kept_this_deleted_others": "āš€ā¸āš‡ā¸šāš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģ⏞⏙ā¸ĩāš‰āšā¸Ĩ⏰ā¸Ĩ⏚ {count, plural, one {# Asset} other {# Asset}}", "keyboard_shortcuts": "ā¸›ā¸¸āšˆā¸Ąā¸žā¸´ā¸Ąā¸žāšŒā¸Ĩā¸ąā¸”", "language": "ā¸ ā¸˛ā¸Šā¸˛", @@ -1205,14 +1320,18 @@ "language_search_hint": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸ ā¸˛ā¸Šā¸˛...", "language_setting_description": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ ā¸˛ā¸Šā¸˛ā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ", "large_files": "āš„ā¸Ÿā¸ĨāšŒā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆ", + "last_months": "{count, plural, one {āš€ā¸”ā¸ˇā¸­ā¸™ā¸—ā¸ĩāšˆā¸œāšˆā¸˛ā¸™ā¸Ąā¸˛} other {# āš€ā¸”ā¸ˇā¸­ā¸™ā¸—ā¸ĩāšˆā¸œāšˆā¸˛ā¸™ā¸Ąā¸˛}}", "last_seen": "āš€ā¸Ģāš‡ā¸™ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "latest_version": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "latitude": "ā¸Ĩā¸°ā¸•ā¸´ā¸ˆā¸šā¸”", "leave": "ā¸—ā¸´āš‰ā¸‡", + "leave_album": "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "lens_model": "ā¸Ŗā¸šā¸›āšā¸šā¸šāš€ā¸Ĩā¸™ā¸ŠāšŒ", "let_others_respond": "āšƒā¸Ģāš‰ā¸„ā¸™ā¸­ā¸ˇāšˆā¸™ā¸•ā¸­ā¸š", "level": "ā¸Ŗā¸°ā¸”ā¸ąā¸š", "library": "⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", + "library_add_folder": "āš€ā¸žā¸´āšˆā¸Ąāš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒ", + "library_edit_folder": "āšā¸āš‰āš„ā¸‚āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒ", "library_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", "library_page_device_albums": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸šā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡", "library_page_new_album": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšƒā¸Ģā¸Ąāšˆ", @@ -1220,17 +1339,24 @@ "library_page_sort_created": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "library_page_sort_last_modified": "āšā¸āš‰āš„ā¸‚ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "library_page_sort_title": "ā¸Šā¸ˇāšˆā¸­ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", + "licenses": "ā¸Ēā¸ąā¸ā¸ā¸˛ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•", "light": "ā¸Ēā¸§āšˆā¸˛ā¸‡", - "like_deleted": "ā¸Ĩā¸šā¸—ā¸ĩāšˆā¸–ā¸šā¸āšƒā¸ˆāšā¸Ĩāš‰ā¸§", + "like": "ā¸–ā¸šā¸āšƒā¸ˆ", + "like_deleted": "ā¸Ĩā¸šā¸ā¸˛ā¸Ŗā¸–ā¸šā¸āšƒā¸ˆāšā¸Ĩāš‰ā¸§", "link_motion_video": "ā¸Ĩā¸´ā¸‡ā¸āšŒā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­āš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģ⏧", "link_to_oauth": "ā¸Ĩā¸´ā¸‡ā¸āšŒāš„ā¸›ā¸ĸā¸ąā¸‡ OAuth", "linked_oauth_account": "ā¸Ĩā¸´ā¸‡ā¸āšŒā¸šā¸ąā¸ā¸Šā¸ĩā¸œā¸šāš‰āšƒā¸Šāš‰ OAuth", "list": "⏪⏞ā¸ĸ⏁⏞⏪", "loading": "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔", "loading_search_results_failed": "āš‚ā¸Ģā¸Ĩā¸”ā¸œā¸Ĩā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞ā¸Ĩāš‰ā¸Ąāš€ā¸Ģā¸Ĩ⏧", + "local": "āšƒā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡", "local_asset_cast_failed": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšā¸„ā¸Ēā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸–ā¸šā¸ā¸­ā¸ąā¸žāš‚ā¸Ģā¸Ĩā¸”āš„ā¸›ā¸ĸā¸ąā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", + "local_assets": "ā¸Ēā¸ˇāšˆā¸­āšƒā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡", + "local_id": "ID āšƒā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡", + "local_media_summary": "ā¸Ē⏪⏏⏛ā¸Ēā¸ˇāšˆā¸­āšƒā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡", "local_network": "āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ⏪⏰ā¸ĸā¸°āšƒā¸ā¸Ĩāš‰", "local_network_sheet_info": "āšā¸­ā¸žā¸ˆā¸°ā¸—ā¸ŗā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­āš„ā¸›ā¸ĸā¸ąā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸œāšˆā¸˛ā¸™ URL ⏙ā¸ĩāš‰āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸Šā¸ˇāšˆā¸­ā¸•āšˆā¸­ā¸ā¸ąā¸š Wi-Fi ⏗ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸§āš‰", + "location": "ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", "location_permission": "ā¸ā¸˛ā¸Ŗā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", "location_permission_content": "āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸Ÿā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒā¸ā¸˛ā¸Ŗā¸Ēā¸ąā¸šāš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ Immich ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡ā¸•āšˆā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸—ā¸ĩāšˆāšā¸Ąāšˆā¸™ā¸ĸā¸ŗāš€ā¸žā¸ˇāšˆā¸­ā¸­āšˆā¸˛ā¸™ā¸Šā¸ˇāšˆā¸­ Wi-Fi ⏗ā¸ĩāšˆāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸­ā¸ĸā¸šāšˆ", "location_picker_choose_on_map": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸šā¸™āšā¸œā¸™ā¸—ā¸ĩāšˆ", @@ -1241,7 +1367,7 @@ "lock": "ā¸Ĩāš‡ā¸­ā¸„", "locked_folder": "āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸„", "log_out": "⏭⏭⏁⏈⏞⏁⏪⏰⏚⏚", - "log_out_all_devices": "āšƒā¸Ģāš‰ā¸—ā¸¸ā¸ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸Ŗā¸°ā¸šā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", + "log_out_all_devices": "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸Ŗā¸°ā¸šā¸šā¸—ā¸¸ā¸ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ", "logged_in_as": "{user} ⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ĩāš‡ā¸­ā¸„ā¸­ā¸´ā¸™", "logged_out_all_devices": "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸Ŗā¸°ā¸šā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšā¸Ĩāš‰ā¸§", "logged_out_device": "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸Ŗā¸°ā¸šā¸šāšā¸Ĩāš‰ā¸§", @@ -1276,8 +1402,34 @@ "loop_videos_description": "āš€ā¸›ā¸´ā¸”āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸§ā¸™ā¸Ĩā¸šā¸›āšƒā¸™ā¸—ā¸ĩāšˆā¸”ā¸šā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔", "main_branch_warning": "⏄⏏⏓⏁⏺ā¸Ĩā¸ąā¸‡āšƒā¸Šāš‰āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ āš€ā¸Ŗā¸˛ā¸‚ā¸­āšā¸™ā¸°ā¸™ā¸ŗā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸ĸā¸´āšˆā¸‡āšƒā¸Ģāš‰āšƒā¸Šāš‰āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āš€ā¸Ē⏖ā¸ĩā¸ĸ⏪ !", "main_menu": "āš€ā¸Ąā¸™ā¸šā¸Ģā¸Ĩā¸ąā¸", - "make": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡", + "maintenance_action_restore": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_description": "Immich āš„ā¸”āš‰āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆāš‚ā¸Ģā¸Ąā¸”ā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛", + "maintenance_end": "ā¸Ēā¸´āš‰ā¸™ā¸Ēā¸¸ā¸”āš‚ā¸Ģā¸Ąā¸”ā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛", + "maintenance_end_error": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ēā¸´āš‰ā¸™ā¸Ēā¸¸ā¸”āš‚ā¸Ģā¸Ąā¸”ā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛", + "maintenance_logged_in_as": "āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šāšƒā¸™ā¸Šā¸ˇāšˆā¸­ {user} ⏭ā¸ĸā¸šāšˆ", + "maintenance_restore_from_backup": "ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ˆā¸˛ā¸ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_restore_library": "ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", + "maintenance_restore_library_confirm": "ā¸Ģā¸˛ā¸ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏙ā¸ĩāš‰ā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡ ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸•āšˆā¸­āš„ā¸”āš‰", + "maintenance_restore_library_description": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "maintenance_restore_library_folder_has_files": "{folder} ā¸Ąā¸ĩ {count} āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒ", + "maintenance_restore_library_folder_no_files": "{folder} āš„ā¸Ąāšˆā¸Ąā¸ĩāš„ā¸Ÿā¸ĨāšŒ!", + "maintenance_restore_library_folder_pass": "ā¸­āšˆā¸˛ā¸™āšā¸Ĩā¸°āš€ā¸‚ā¸ĩā¸ĸā¸™āš„ā¸”āš‰", + "maintenance_restore_library_folder_read_fail": "ā¸­āšˆā¸˛ā¸™āš„ā¸Ąāšˆāš„ā¸”āš‰", + "maintenance_restore_library_folder_write_fail": "āš€ā¸‚ā¸ĩā¸ĸā¸™āš„ā¸Ąāšˆāš„ā¸”āš‰", + "maintenance_restore_library_hint_missing_files": "āš„ā¸Ÿā¸ĨāšŒā¸Ēā¸ŗā¸„ā¸ąā¸ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸­ā¸˛ā¸ˆā¸‚ā¸˛ā¸”ā¸Ģ⏞ā¸ĸāš„ā¸›", + "maintenance_restore_library_hint_regenerate_later": "⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšƒā¸Ģā¸Ąāšˆāš„ā¸”āš‰āšƒā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", + "maintenance_restore_library_hint_storage_template_missing_files": "ā¸Ģā¸˛ā¸ā¸„ā¸¸ā¸“āšƒā¸Šāš‰āš€ā¸—ā¸Ąāš€ā¸žā¸Ĩ⏕⏗ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ āš„ā¸Ÿā¸ĨāšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸­ā¸˛ā¸ˆā¸ˆā¸°ā¸‚ā¸˛ā¸”ā¸Ģ⏞ā¸ĸāš„ā¸›", + "maintenance_task_backup": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āš„ā¸Ÿā¸ĨāšŒā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚ā¸­ā¸‡ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸”ā¸´ā¸Ąâ€Ļ", + "maintenance_task_migrations": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸ĸāš‰ā¸˛ā¸ĸā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩâ€Ļ", + "maintenance_task_restore": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏗ā¸ĩāšˆāš€ā¸Ĩ⏎⏭⏁â€Ļ", + "maintenance_task_rollback": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ā¸šāš‰ā¸„ā¸ˇā¸™āš„ā¸”āš‰ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šāš„ā¸›ā¸ĸā¸ąā¸‡ā¸ˆā¸¸ā¸”ā¸ā¸šāš‰ā¸„ā¸ˇā¸™â€Ļ", + "maintenance_title": "āš„ā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸Šā¸ąāšˆā¸§ā¸„ā¸Ŗā¸˛ā¸§", + "make": "ā¸ĸā¸ĩāšˆā¸Ģāš‰ā¸­", "manage_geolocation": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", + "manage_media_access_rationale": "ā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸•āš‰ā¸­ā¸‡āšƒā¸Ģāš‰ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸™ā¸ĩāš‰āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰ā¸Ŗā¸°ā¸šā¸šā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ĸāš‰ā¸˛ā¸ĸā¸Ēā¸ˇāšˆā¸­āš„ā¸›ā¸ĸā¸ąā¸‡ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°āšā¸Ĩā¸°ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸ˆā¸˛ā¸ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°āš„ā¸”āš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", + "manage_media_access_settings": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", + "manage_media_access_subtitle": "ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšƒā¸Ģāš‰āšā¸­ā¸› Immich ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāšā¸Ĩ⏰ā¸ĸāš‰ā¸˛ā¸ĸāš„ā¸Ÿā¸ĨāšŒā¸Ēā¸ˇāšˆā¸­", + "manage_media_access_title": "ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸Ēā¸ˇāšˆā¸­", "manage_shared_links": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", "manage_sharing_with_partners": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗāšā¸Šā¸ŖāšŒā¸ā¸ąā¸šā¸„ā¸šāšˆā¸Ģā¸š", "manage_the_app_settings": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸­ā¸›", @@ -1286,7 +1438,7 @@ "manage_your_devices": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "manage_your_oauth_connection": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ OAuth ⏂⏭⏇⏄⏏⏓", "map": "āšā¸œā¸™ā¸—ā¸ĩāšˆ", - "map_assets_in_bounds": "{count} ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "map_assets_in_bounds": "{count, plural, =0 {āš„ā¸Ąāšˆā¸Ąā¸ĩā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšƒā¸™ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸™ā¸ĩāš‰} one {# ā¸Ŗā¸šā¸›} other {# ā¸Ŗā¸šā¸›}}", "map_cannot_get_user_location": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ģā¸˛ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš„ā¸”āš‰", "map_location_dialog_yes": "āšƒā¸Šāšˆ", "map_location_picker_page_use_location": "āšƒā¸Šāš‰ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸™ā¸ĩāš‰", @@ -1308,8 +1460,12 @@ "map_settings_only_show_favorites": "āšā¸Ē⏔⏇⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", "map_settings_theme_settings": "⏘ā¸ĩā¸Ąāšā¸œā¸™ā¸—ā¸ĩāšˆ", "map_zoom_to_see_photos": "ā¸‹ā¸šā¸Ąā¸­ā¸­ā¸āš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸šā¸Ŗā¸šā¸›", + "mark_all_as_read": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āš€ā¸›āš‡ā¸™ā¸­āšˆā¸˛ā¸™āšā¸Ĩāš‰ā¸§", + "mark_as_read": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸›āš‡ā¸™ā¸­āšˆā¸˛ā¸™āšā¸Ĩāš‰ā¸§", + "marked_all_as_read": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸›āš‡ā¸™ā¸­āšˆā¸˛ā¸™āšā¸Ĩāš‰ā¸§ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšā¸Ĩāš‰ā¸§", "matches": "ā¸•ā¸Ŗā¸‡ā¸ā¸ąā¸™", - "media_type": "ā¸Šā¸™ā¸´ā¸”ā¸Ēā¸ˇāšˆā¸­", + "matching_assets": "ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸‡ā¸ā¸ąā¸™", + "media_type": "ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—ā¸Ēā¸ˇāšˆā¸­", "memories": "ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗ", "memories_all_caught_up": "ā¸•ā¸˛ā¸Ąā¸—ā¸ąā¸™ā¸Ģā¸Ąā¸”āšā¸Ĩāš‰ā¸§", "memories_check_back_tomorrow": "⏁ā¸Ĩā¸ąā¸šā¸Ąā¸˛ā¸”ā¸šā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗā¸Ąā¸˛ā¸ā¸ā¸§āšˆā¸˛ā¸™ā¸ĩāš‰āšƒā¸™ā¸§ā¸ąā¸™ā¸–ā¸ąā¸”āš„ā¸›", @@ -1322,79 +1478,128 @@ "merge": "ā¸Ŗā¸§ā¸Ą", "merge_people": "ā¸Ŗā¸§ā¸Ąā¸œā¸šāš‰ā¸„ā¸™", "merge_people_limit": "ā¸„ā¸¸ā¸“ā¸Ŗā¸§ā¸Ąāšƒā¸šā¸Ģā¸™āš‰ā¸˛āš„ā¸”āš‰ā¸Ąā¸˛ā¸ā¸–ā¸ļ⏇ 5 ā¸Ŗā¸šā¸›ā¸•āšˆā¸­ā¸„ā¸Ŗā¸ąāš‰ā¸‡", - "merge_people_prompt": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ŗā¸§ā¸Ąā¸„ā¸™ā¸žā¸§ā¸ā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ ⏁⏞⏪⏁⏪⏰⏗⏺⏙ā¸ĩāš‰āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šāš„ā¸”āš‰", + "merge_people_prompt": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ŗā¸§ā¸Ąā¸šā¸¸ā¸„ā¸„ā¸Ĩāš€ā¸Ģā¸Ĩāšˆā¸˛ā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ ⏁⏞⏪⏁⏪⏰⏗⏺⏙ā¸ĩāš‰āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šāš„ā¸”āš‰", "merge_people_successfully": "ā¸Ŗā¸§ā¸Ąā¸œā¸šāš‰ā¸„ā¸™āš€ā¸Ŗā¸ĩā¸ĸā¸šā¸Ŗāš‰ā¸­ā¸ĸāšā¸Ĩāš‰ā¸§", - "merged_people_count": "{count, plural, one {# person} other {# people}} ā¸–ā¸šā¸ā¸Ŗā¸§ā¸Ąāš€ā¸‚āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™", + "merged_people_count": "ā¸Ŗā¸§ā¸Ą {count, plural, one {# ⏄⏙} other {# ⏄⏙}}āš€ā¸‚āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™āšā¸Ĩāš‰ā¸§", "minimize": "ā¸ĸāšˆā¸­ā¸Ĩ⏇", "minute": "⏙⏞⏗ā¸ĩ", + "minutes": "⏙⏞⏗ā¸ĩ", + "mirror_horizontal": "āšā¸™ā¸§ā¸™ā¸­ā¸™", + "mirror_vertical": "āšā¸™ā¸§ā¸•ā¸ąāš‰ā¸‡", "missing": "⏂⏞⏔ā¸Ģ⏞ā¸ĸ", + "mobile_app": "āšā¸­ā¸›ā¸Ąā¸ˇā¸­ā¸–ā¸ˇā¸­", + "mobile_app_download_onboarding_note": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āšā¸­ā¸›ā¸Ąā¸ˇā¸­ā¸–ā¸ˇā¸­ā¸”āš‰ā¸§ā¸ĸā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸•āšˆā¸­āš„ā¸›ā¸™ā¸ĩāš‰", "model": "āš‚ā¸Ąāš€ā¸”ā¸Ĩ", "month": "āš€ā¸”ā¸ˇā¸­ā¸™", "more": "āš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ą", "move": "ā¸ĸāš‰ā¸˛ā¸ĸ", + "move_down": "ā¸ĸāš‰ā¸˛ā¸ĸā¸Ĩ⏇", "move_off_locked_folder": "ā¸ĸāš‰ā¸˛ā¸ĸā¸­ā¸­ā¸ā¸ˆā¸˛ā¸āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸„", + "move_to": "ā¸ĸāš‰ā¸˛ā¸ĸāš„ā¸›ā¸ĸā¸ąā¸‡", + "move_to_device_trash": "ā¸ĸāš‰ā¸˛ā¸ĸāš„ā¸›ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ", + "move_to_lock_folder_action_prompt": "āš€ā¸žā¸´āšˆā¸Ą {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš„ā¸›ā¸ĸā¸ąā¸‡āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸āšā¸Ĩāš‰ā¸§", "move_to_locked_folder": "ā¸ĸāš‰ā¸˛ā¸ĸāš„ā¸›āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸„", + "move_to_locked_folder_confirmation": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­āš€ā¸Ģā¸Ĩāšˆā¸˛ā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩā¸šā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸—ā¸¸ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą āšā¸Ĩ⏰⏈⏰ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸”ā¸šāš„ā¸”āš‰ā¸ˆā¸˛ā¸āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", + "move_up": "ā¸ĸāš‰ā¸˛ā¸ĸ⏂ā¸ļāš‰ā¸™", + "moved_to_library": "ā¸ĸāš‰ā¸˛ā¸ĸā¸Ēā¸ˇāšˆā¸­ {count, plural, one {# ⏪⏞ā¸ĸ⏁⏞⏪} other {# ⏪⏞ā¸ĸ⏁⏞⏪}}āš„ā¸›ā¸ĸā¸ąā¸‡ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žāšā¸Ĩāš‰ā¸§", "moved_to_trash": "ā¸—ā¸´āš‰ā¸‡ā¸Ĩā¸‡ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°āšā¸Ĩāš‰ā¸§", "multiselect_grid_edit_date_time_err_read_only": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšā¸āš‰āš„ā¸‚ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāšā¸šā¸šā¸­āšˆā¸˛ā¸™ā¸­ā¸ĸāšˆā¸˛ā¸‡āš€ā¸”ā¸ĩā¸ĸ⏧ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", "multiselect_grid_edit_gps_err_read_only": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšā¸āš‰ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸‚ā¸­ā¸‡ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāšā¸šā¸šā¸­āšˆā¸˛ā¸™ā¸­ā¸ĸāšˆā¸˛ā¸‡āš€ā¸”ā¸ĩā¸ĸ⏧ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸‚āš‰ā¸˛ā¸Ą", + "mute_memories": "ā¸›ā¸´ā¸”āš€ā¸Ēā¸ĩā¸ĸā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗ", "my_albums": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸‚ā¸­ā¸‡ā¸‰ā¸ąā¸™", "name": "ā¸Šā¸ˇāšˆā¸­", "name_or_nickname": "ā¸Šā¸ˇāšˆā¸­ā¸Ģā¸Ŗā¸ˇā¸­ā¸Šā¸ˇāšˆā¸­āš€ā¸Ĩāšˆā¸™", + "name_required": "ā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸•āš‰ā¸­ā¸‡ā¸Ąā¸ĩā¸Šā¸ˇāšˆā¸­", + "navigate": "⏙⏺⏗⏞⏇", + "navigate_to_time": "ā¸™ā¸ŗā¸—ā¸˛ā¸‡āš„ā¸›ā¸ĸā¸ąā¸‡āš€ā¸§ā¸Ĩ⏞", + "network_requirement_photos_upload": "āšƒā¸Šāš‰ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸‹ā¸Ĩā¸Ĩā¸šā¸Ĩā¸˛ā¸ŖāšŒāš€ā¸žā¸ˇāšˆā¸­ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "network_requirement_videos_upload": "āšƒā¸Šāš‰ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸‹ā¸Ĩā¸Ĩā¸šā¸Ĩā¸˛ā¸ŖāšŒāš€ā¸žā¸ˇāšˆā¸­ā¸Ē⏺⏪⏭⏇⏧⏴⏔ā¸ĩāš‚ā¸­", + "network_requirements": "ā¸„ā¸§ā¸˛ā¸Ąā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ", + "network_requirements_updated": "ā¸„ā¸§ā¸˛ā¸Ąā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸā¸Ąā¸ĩā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇ ⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸„ā¸´ā¸§ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", "networking_settings": "ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­", "networking_subtitle": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸›ā¸Ĩ⏞ā¸ĸā¸—ā¸˛ā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "never": "āš„ā¸Ąāšˆāš€ā¸„ā¸ĸ", "new_album": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšƒā¸Ģā¸Ąāšˆ", "new_api_key": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ API ⏄ā¸ĩā¸ĸāšŒāšƒā¸Ģā¸Ąāšˆ", + "new_date_range": "ā¸Šāšˆā¸§ā¸‡ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšƒā¸Ģā¸Ąāšˆ", "new_password": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āšƒā¸Ģā¸Ąāšˆ", "new_person": "ā¸„ā¸™āšƒā¸Ģā¸Ąāšˆ", - "new_pin_code": "⏪ā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN) āšƒā¸Ģā¸Ąāšˆ", + "new_pin_code": "⏪ā¸Ģā¸ąā¸Ē PIN āšƒā¸Ģā¸Ąāšˆ", + "new_pin_code_subtitle": "⏄⏏⏓⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸āš€ā¸›āš‡ā¸™ā¸„ā¸Ŗā¸ąāš‰ā¸‡āšā¸Ŗā¸ āš‚ā¸›ā¸Ŗā¸”ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ē PIN āš€ā¸žā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇ā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ", + "new_timeline": "āš„ā¸—ā¸ĄāšŒāš„ā¸Ĩā¸™āšŒāšƒā¸Ģā¸Ąāšˆ", + "new_update": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•āšƒā¸Ģā¸Ąāšˆ", "new_user_created": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸œā¸šāš‰āšƒā¸Šāš‰āšƒā¸Ģā¸Ąāšˆāšā¸Ĩāš‰ā¸§", "new_version_available": "ā¸Ąā¸ĩāš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āšƒā¸Ģā¸Ąāšˆāšƒā¸Ģāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "newest_first": "āšƒā¸Ģā¸Ąāšˆā¸Ēā¸¸ā¸”ā¸āšˆā¸­ā¸™", "next": "ā¸•āšˆā¸­āš„ā¸›", "next_memory": "ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗā¸•āšˆā¸­āš„ā¸›", "no": "āš„ā¸Ąāšˆ", + "no_actions_added": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆāš„ā¸”āš‰āš€ā¸žā¸´āšˆā¸Ąā¸ā¸˛ā¸Ŗā¸ā¸Ŗā¸°ā¸—ā¸ŗ", + "no_albums_found": "āš„ā¸Ąāšˆā¸žā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "no_albums_message": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš€ā¸žā¸ˇāšˆā¸­ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", - "no_albums_with_name_yet": "ā¸”ā¸šāš€ā¸Ģā¸Ąā¸ˇā¸­ā¸™ā¸§āšˆā¸˛āš„ā¸Ąāšˆā¸Ąā¸ĩā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸Ģ⏙⏗ā¸ĩāšˆāšƒā¸Šāš‰ā¸Šā¸ˇāšˆā¸­ā¸™ā¸ĩāš‰", + "no_albums_with_name_yet": "ā¸”ā¸šāš€ā¸Ģā¸Ąā¸ˇā¸­ā¸™ā¸§āšˆā¸˛ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ąā¸ĩā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸Ģ⏙⏗ā¸ĩāšˆāšƒā¸Šāš‰ā¸Šā¸ˇāšˆā¸­ā¸™ā¸ĩāš‰", "no_albums_yet": "ā¸”ā¸šāš€ā¸Ģā¸Ąā¸ˇā¸­ā¸™ā¸§āšˆā¸˛ā¸„ā¸¸ā¸“ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ąā¸ĩā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšƒā¸”āš†", "no_archived_assets_message": "ā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧ā¸ĩā¸”ā¸´āš‚ā¸­ā¸–ā¸˛ā¸§ā¸Ŗāš€ā¸žā¸ˇāšˆā¸­ā¸‹āšˆā¸­ā¸™ā¸ˆā¸˛ā¸ā¸Ąā¸¸ā¸Ąā¸Ąā¸­ā¸‡ā¸„ā¸¸ā¸“", - "no_assets_message": "ā¸ā¸”āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ēāšˆā¸ ā¸˛ā¸žā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žāšā¸Ŗā¸", + "no_assets_message": "⏄ā¸Ĩā¸´ā¸āš€ā¸žā¸ˇāšˆā¸­ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸ ā¸˛ā¸žāšā¸Ŗā¸ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "no_assets_to_show": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗāšƒā¸Ģāš‰āšā¸Ē⏔⏇", + "no_cast_devices_found": "āš„ā¸Ąāšˆā¸žā¸šā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāšā¸„ā¸Ēā¸•āšŒ", + "no_configuration_needed": "āš„ā¸Ąāšˆā¸•āš‰ā¸­ā¸‡ā¸Ąā¸ĩ⏁⏞⏪⏁⏺ā¸Ģā¸™ā¸”ā¸„āšˆā¸˛āšƒā¸” āš†", + "no_devices": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸—ā¸ĩāšˆāš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•", "no_duplicates_found": "āš„ā¸Ąāšˆā¸žā¸šā¸Ŗā¸˛ā¸ĸ⏁⏞⏪⏗ā¸ĩāšˆā¸‹āš‰ā¸ŗā¸ā¸ąā¸™", "no_exif_info_available": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ exif", - "no_explore_results_message": "āš„ā¸Ąāšˆā¸žā¸šā¸œā¸Ĩā¸Ĩā¸ąā¸žā¸˜āšŒ ā¸Ĩā¸­ā¸‡āšƒā¸Šāš‰ā¸„ā¸ŗā¸„āš‰ā¸™ā¸Ģā¸˛ā¸­ā¸ˇāšˆā¸™ āš†", + "no_explore_results_message": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāš€ā¸žā¸´āšˆā¸Ąāš€ā¸žā¸ˇāšˆā¸­ā¸Ēā¸ŗā¸Ŗā¸§ā¸ˆā¸„ā¸­ā¸Ĩāš€ā¸Ĩā¸ā¸Šā¸ąā¸™ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "no_favorites_message": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”āš€ā¸žā¸ˇāšˆā¸­ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸”ā¸ĩ⏗ā¸ĩāšˆā¸Ē⏏⏔⏂⏭⏇⏄⏏⏓⏭ā¸ĸāšˆā¸˛ā¸‡ā¸Ŗā¸§ā¸”āš€ā¸Ŗāš‡ā¸§", + "no_filters_added": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ąā¸ĩā¸ā¸˛ā¸Ŗāš€ā¸žā¸´āšˆā¸Ąā¸•ā¸ąā¸§ā¸ā¸Ŗā¸­ā¸‡", "no_libraries_message": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸā¸™ā¸­ā¸āš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸šā¸ ā¸˛ā¸žā¸–āšˆā¸˛ā¸ĸāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸•āšˆā¸˛ā¸‡ āš† ⏂⏭⏇⏄⏏⏓", + "no_location_set": "āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸Ŗā¸°ā¸šā¸¸ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", + "no_locked_photos_message": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­āšƒā¸™āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒā¸Ĩāš‡ā¸­ā¸ā¸ˆā¸°ā¸–ā¸šā¸ā¸‹āšˆā¸­ā¸™āš„ā¸§āš‰ āšā¸Ĩā¸°āš„ā¸Ąāšˆāšā¸Ē⏔⏇⏪⏰ā¸Ģā¸§āšˆā¸˛ā¸‡ā¸”ā¸šā¸Ģā¸Ŗā¸ˇā¸­ā¸„āš‰ā¸™ā¸Ģ⏞⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "no_name": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸Šā¸ˇāšˆā¸­", + "no_notifications": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™", + "no_people_found": "āš„ā¸Ąāšˆā¸žā¸šā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏗ā¸ĩāšˆā¸•ā¸Ŗā¸‡ā¸ā¸ąā¸™", "no_places": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ", "no_results": "āš„ā¸Ąāšˆā¸Ąā¸ĩ⏜ā¸Ĩā¸Ĩā¸ąā¸žā¸˜āšŒ", "no_results_description": "ā¸Ĩā¸­ā¸‡āšƒā¸Šāš‰ā¸„ā¸ŗā¸žāš‰ā¸­ā¸‡ā¸Ģ⏪⏎⏭⏄⏺ā¸Ģā¸Ĩā¸ąā¸ā¸—ā¸ĩāšˆā¸ā¸§āš‰ā¸˛ā¸‡ā¸ā¸§āšˆā¸˛ā¸™ā¸ĩāš‰", "no_shared_albums_message": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš€ā¸žā¸ˇāšˆā¸­āšā¸Šā¸ŖāšŒā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸ā¸ąā¸šā¸„ā¸™āšƒā¸™āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ⏂⏭⏇⏄⏏⏓", + "no_uploads_in_progress": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔⏗ā¸ĩāšˆā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸­ā¸ĸā¸šāšˆ", + "none": "āš„ā¸Ąāšˆā¸Ąā¸ĩ", + "not_allowed": "āš„ā¸Ąāšˆā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•", "not_in_any_album": "āš„ā¸Ąāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāšƒā¸” āš†", + "not_selected": "āš„ā¸Ąāšˆāš„ā¸”āš‰āš€ā¸Ĩ⏎⏭⏁", "notes": "ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ģ⏕⏏", - "notification_permission_dialog_content": "āš€ā¸žā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ āš€ā¸‚āš‰ā¸˛ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸Ĩāš‰ā¸§ā¸ā¸”ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•", - "notification_permission_list_tile_content": "ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™", + "nothing_here_yet": "⏕⏪⏇⏙ā¸ĩāš‰ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸Ąā¸ĩā¸­ā¸°āš„ā¸Ŗ", + "notification_permission_dialog_content": "āš€ā¸žā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ āš€ā¸‚āš‰ā¸˛āš„ā¸›ā¸—ā¸ĩāšˆā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸Ĩāš‰ā¸§ā¸ā¸” ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•", + "notification_permission_list_tile_content": "āšƒā¸Ģāš‰ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒāš€ā¸žā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™", "notification_permission_list_tile_enable_button": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸”ā¸ˇā¸­ā¸™", "notification_permission_list_tile_title": "ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™", - "notification_toggle_setting_description": "āš€ā¸›ā¸´ā¸”/⏛⏴⏔ ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸ĩāš€ā¸Ąā¸Ĩ", + "notification_toggle_setting_description": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸ĩāš€ā¸Ąā¸Ĩ", "notifications": "ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™", "notifications_setting_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™", + "oauth": "OAuth", + "obtainium_configurator": "ā¸•ā¸ąā¸§ā¸ā¸ŗā¸Ģā¸™ā¸”ā¸„āšˆā¸˛ Obtainium", + "obtainium_configurator_instructions": "āšƒā¸Šāš‰ Obtainium āš€ā¸žā¸ˇāšˆā¸­ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡āšā¸Ĩā¸°ā¸­ā¸ąā¸›āš€ā¸”ā¸•āšā¸­ā¸› Android āš‚ā¸”ā¸ĸā¸•ā¸Ŗā¸‡ā¸ˆā¸˛ā¸ Github ⏂⏭⏇ Immich ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸„ā¸ĩā¸ĸāšŒ API āšā¸Ĩā¸°āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ŗā¸šā¸›āšā¸šā¸šāš€ā¸žā¸ˇāšˆā¸­ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ĩā¸´ā¸‡ā¸āšŒā¸ā¸ŗā¸Ģā¸™ā¸”ā¸„āšˆā¸˛ Obtainium ⏂⏭⏇⏄⏏⏓", + "ocr": "OCR", "official_immich_resources": "āšā¸Ģā¸Ĩāšˆā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ Immich ⏭ā¸ĸāšˆā¸˛ā¸‡āš€ā¸›āš‡ā¸™ā¸—ā¸˛ā¸‡ā¸ā¸˛ā¸Ŗ", "offline": "ā¸­ā¸­ā¸Ÿāš„ā¸Ĩā¸™āšŒ", "ok": "⏕⏁ā¸Ĩ⏇", "oldest_first": "āš€ā¸Ŗā¸ĩā¸ĸā¸‡āš€ā¸āšˆā¸˛ā¸Ēā¸¸ā¸”ā¸āšˆā¸­ā¸™", "on_this_device": "ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸™ā¸ĩāš‰", "onboarding": "ā¸ā¸˛ā¸Ŗāš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", + "onboarding_locale_description": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ ā¸˛ā¸Šā¸˛ā¸—ā¸ĩāšˆā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ ⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš„ā¸”āš‰ā¸ ā¸˛ā¸ĸā¸Ģā¸Ĩā¸ąā¸‡āšƒā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", "onboarding_privacy_description": "⏟ā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒ (ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁) ā¸•āšˆā¸­āš„ā¸›ā¸™ā¸ĩāš‰ā¸•āš‰ā¸­ā¸‡ā¸­ā¸˛ā¸¨ā¸ąā¸ĸ⏚⏪⏴⏁⏞⏪⏠⏞ā¸ĸ⏙⏭⏁ āšā¸Ĩ⏰ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš„ā¸”āš‰ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩā¸˛āšƒā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗ", + "onboarding_server_welcome_description": "ā¸Ąā¸˛ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸”āš‰ā¸§ā¸ĸā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆāšƒā¸Šāš‰ā¸šāšˆā¸­ā¸ĸā¸ā¸ąā¸™āš€ā¸–ā¸­ā¸°", "onboarding_theme_description": "āš€ā¸Ĩ⏎⏭⏁⏘ā¸ĩā¸Ąā¸Ēā¸ĩ ⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩā¸‡āš„ā¸”āš‰āšƒā¸™ā¸ ā¸˛ā¸ĸā¸Ģā¸Ĩā¸ąā¸‡āšƒā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", + "onboarding_user_welcome_description": "ā¸Ąā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ā¸ā¸ąā¸™āš€ā¸–ā¸­ā¸°!", "onboarding_welcome_user": "ā¸ĸ⏴⏙⏔ā¸ĩā¸•āš‰ā¸­ā¸™ā¸Ŗā¸ąā¸šā¸„ā¸¸ā¸“ {user}", "online": "ā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒ", "only_favorites": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", + "open": "āš€ā¸›ā¸´ā¸”", + "open_calendar": "āš€ā¸›ā¸´ā¸”ā¸›ā¸ā¸´ā¸—ā¸´ā¸™", "open_in_map_view": "āš€ā¸›ā¸´ā¸”ā¸”ā¸šāšƒā¸™āšā¸œā¸™ā¸—ā¸ĩāšˆ", "open_in_openstreetmap": "āš€ā¸›ā¸´ā¸”āšƒā¸™ OpenStreetMap", "open_the_search_filters": "āš€ā¸›ā¸´ā¸”ā¸•ā¸ąā¸§ā¸ā¸Ŗā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞", "options": "ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁", "or": "ā¸Ģ⏪⏎⏭", + "organize_into_albums": "ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸā¸šāšƒā¸Ēāšˆā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "organize_your_library": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸ⏇⏄ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "original": "ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š", "other": "ā¸­ā¸ˇāšˆā¸™ āš†", @@ -1402,6 +1607,7 @@ "other_variables": "ā¸•ā¸ąā¸§āšā¸›ā¸Ŗā¸­ā¸ˇāšˆā¸™", "owned": "āš€ā¸›āš‡ā¸™āš€ā¸ˆāš‰ā¸˛ā¸‚ā¸­ā¸‡", "owner": "āš€ā¸ˆāš‰ā¸˛ā¸‚ā¸­ā¸‡", + "page": "ā¸Ģā¸™āš‰ā¸˛", "partner": "ā¸„ā¸šāšˆā¸Ģā¸š", "partner_can_access": "{partner} ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇", "partner_can_access_assets": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ĸā¸āš€ā¸§āš‰ā¸™ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™āš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗāšā¸Ĩā¸°ā¸–ā¸šā¸ā¸Ĩā¸šā¸—ā¸´āš‰ā¸‡", @@ -1451,40 +1657,60 @@ "permission_onboarding_permission_limited": "ā¸Ēā¸´ā¸—ā¸˜āšŒā¸ˆā¸ŗā¸ā¸ąā¸” āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰ Immich ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸Ĩā¸°ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žāš„ā¸”āš‰ ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ēā¸´ā¸—ā¸˜ā¸´āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­", "permission_onboarding_request": "Immich ā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸ˆā¸°ā¸•āš‰ā¸­ā¸‡āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸”ā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­", "person": "ā¸šā¸¸ā¸„ā¸„ā¸Ĩ", + "person_age_months": "⏭⏞ā¸ĸ⏏ {months, plural, one {# āš€ā¸”ā¸ˇā¸­ā¸™} other {# āš€ā¸”ā¸ˇā¸­ā¸™}}", + "person_age_year_months": "⏭⏞ā¸ĸ⏏ 1 ⏛ā¸ĩ {months, plural, one {# āš€ā¸”ā¸ˇā¸­ā¸™} other {# āš€ā¸”ā¸ˇā¸­ā¸™}}", "person_age_years": "⏭⏞ā¸ĸ⏏ {years, plural, other {# ⏛ā¸ĩ}}", "person_birthdate": "āš€ā¸ā¸´ā¸”āš€ā¸Ąā¸ˇāšˆā¸­ {date}", + "person_hidden": "{name}{hidden, select, true { (ā¸‹āšˆā¸­ā¸™ā¸­ā¸ĸā¸šāšˆ)} other {}}", + "person_selected": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸šā¸¸ā¸„ā¸„ā¸Ĩāšā¸Ĩāš‰ā¸§", "photo_shared_all_users": "ā¸”ā¸šāš€ā¸Ģā¸Ąā¸ˇā¸­ā¸™ā¸§āšˆā¸˛ā¸„ā¸¸ā¸“āš„ā¸”āš‰āšā¸Šā¸ŖāšŒā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸ā¸ąā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” ā¸Ģā¸Ŗā¸ˇā¸­ā¸„ā¸¸ā¸“āš„ā¸Ąāšˆā¸Ąā¸ĩā¸œā¸šāš‰āšƒā¸Šāš‰āšƒā¸”ā¸—ā¸ĩāšˆā¸ˆā¸°āšā¸Šā¸ŖāšŒā¸”āš‰ā¸§ā¸ĸ", "photos": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "photos_and_videos": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž āšā¸Ĩ⏰ ⏧⏴⏔ā¸ĩāš‚ā¸­", "photos_count": "{count, plural, one {{count, number} ā¸Ŗā¸šā¸›} other {{count, number} ā¸Ŗā¸šā¸›}}", "photos_from_previous_years": "ā¸ ā¸˛ā¸žā¸–āšˆā¸˛ā¸ĸā¸ˆā¸˛ā¸ā¸›ā¸ĩā¸āšˆā¸­ā¸™", + "photos_only": "āš€ā¸‰ā¸žā¸˛ā¸°ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "pick_a_location": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸•āšā¸˛āšā¸Ģā¸™āšˆā¸‡", - "pin_code_changed_successfully": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏪ā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN) ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", - "pin_code_reset_successfully": "ā¸•ā¸ąāš‰ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN) āšƒā¸Ģā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", - "pin_code_setup_successfully": "ā¸•ā¸ąāš‰ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN) ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", + "pick_custom_range": "⏁⏺ā¸Ģā¸™ā¸”ā¸Šāšˆā¸§ā¸‡āš€ā¸­ā¸‡", + "pick_date_range": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Šāšˆā¸§ā¸‡ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ", + "pin_code_changed_successfully": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏪ā¸Ģā¸ąā¸Ē PIN ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", + "pin_code_reset_successfully": "⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸Ŗā¸Ģā¸ąā¸Ē PIN ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", + "pin_code_setup_successfully": "ā¸•ā¸ąāš‰ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ē PIN ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", + "pin_verification": "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸Ŗā¸Ģā¸ąā¸Ē PIN", "place": "ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ", "places": "ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ", + "places_count": "{count, plural, one {{count, number} ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ} other {{count, number} ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ}}", "play": "āš€ā¸Ĩāšˆā¸™", "play_memories": "āš€ā¸Ĩāšˆā¸™ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆāšā¸˛", "play_motion_photo": "āš€ā¸Ĩāšˆā¸™ā¸ ā¸˛ā¸žā¸§ā¸ąā¸•ā¸–ā¸¸āš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģ⏧", "play_or_pause_video": "āš€ā¸Ĩāšˆā¸™ā¸Ģ⏪⏎⏭ā¸Ģā¸ĸ⏏⏔⏧⏴⏔ā¸ĩāš‚ā¸­", + "play_original_video": "āš€ā¸Ĩāšˆā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š", + "play_original_video_setting_description": "āš€ā¸™āš‰ā¸™āš€ā¸Ĩāšˆā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸šāšā¸—ā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆāšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒāšā¸Ĩāš‰ā¸§ ā¸Ģ⏞⏁ā¸Ēā¸ˇāšˆā¸­ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸šāš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸­ā¸˛ā¸ˆāš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸Ĩāšˆā¸™āš„ā¸”āš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", + "play_transcoded_video": "āš€ā¸Ĩāšˆā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆāšā¸›ā¸Ĩā¸‡āšā¸Ĩāš‰ā¸§", + "please_auth_to_access": "āš‚ā¸›ā¸Ŗā¸”ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸•ā¸™āš€ā¸žā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇", "port": "ā¸žā¸­ā¸ŖāšŒā¸•", + "preferences_settings_subtitle": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸ā¸ŗā¸Ģā¸™ā¸”ā¸„āšˆā¸˛ā¸‚ā¸­ā¸‡āšā¸­ā¸›", "preferences_settings_title": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", + "preparing": "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸•ā¸Ŗā¸ĩā¸ĸā¸Ą", "preset": "ā¸žā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•", "preview": "ā¸•ā¸ąā¸§ā¸­ā¸ĸāšˆā¸˛ā¸‡", "previous": "ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛", "previous_memory": "ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆāšā¸˛ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛", + "previous_or_next_day": "ā¸§ā¸ąā¸™ā¸–ā¸ąā¸”āš„ā¸›ā¸Ģā¸Ŗā¸ˇā¸­ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛", + "previous_or_next_month": "āš€ā¸”ā¸ˇā¸­ā¸™ā¸–ā¸ąā¸”āš„ā¸›ā¸Ģā¸Ŗā¸ˇā¸­ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛", "previous_or_next_photo": "ā¸ ā¸˛ā¸žā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸Ģā¸Ŗā¸ˇā¸­ā¸ ā¸˛ā¸žā¸–ā¸ąā¸”āš„ā¸›", + "previous_or_next_year": "⏛ā¸ĩā¸–ā¸ąā¸”āš„ā¸›ā¸Ģā¸Ŗā¸ˇā¸­ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛", "primary": "ā¸Ģā¸Ĩā¸ąā¸", "privacy": "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§", + "profile": "āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ", "profile_drawer_app_logs": "ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸™ā¸—ā¸ļ⏁", "profile_drawer_client_server_up_to_date": "āš„ā¸„ā¸Ĩāš€ā¸­ā¸™ā¸•āšŒāšā¸Ĩā¸°āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒāš€ā¸›āš‡ā¸™ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™", + "profile_drawer_github": "GitHub", "profile_image_of_user": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒā¸‚ā¸­ā¸‡ {user}", "profile_picture_set": "ā¸•ā¸ąāš‰ā¸‡ā¸ ā¸˛ā¸žāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒāšā¸Ĩāš‰ā¸§", "public_album": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸Ēā¸˛ā¸˜ā¸˛ā¸Ŗā¸“ā¸°", "public_share": "āšā¸Šā¸ŖāšŒāšā¸šā¸šā¸Ēā¸˛ā¸˜ā¸˛ā¸Ŗā¸“ā¸°", "purchase_account_info": "ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙", - "purchase_activated_subtitle": "ā¸‚ā¸­ā¸šā¸„ā¸¸ā¸“ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙ Immich āšā¸Ĩā¸°ā¸‹ā¸­ā¸Ÿā¸•āšŒāšā¸§ā¸ŖāšŒāš€ā¸Ē⏪ā¸ĩ (Open source software)", + "purchase_activated_subtitle": "ā¸‚ā¸­ā¸šā¸„ā¸¸ā¸“ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙ Immich āšā¸Ĩā¸°ā¸‹ā¸­ā¸Ÿā¸•āšŒāšā¸§ā¸ŖāšŒāš‚ā¸­āš€ā¸žā¸™ā¸‹ā¸­ā¸ŖāšŒā¸Ē", "purchase_activated_time": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", "purchase_activated_title": "⏪ā¸Ģā¸ąā¸Ēā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸–ā¸šā¸āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš€ā¸Ŗā¸ĩā¸ĸā¸šā¸Ŗāš‰ā¸­ā¸ĸāšā¸Ĩāš‰ā¸§", "purchase_button_activate": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", @@ -1499,10 +1725,10 @@ "purchase_individual_description_2": "ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙", "purchase_individual_title": "ā¸šā¸¸ā¸„ā¸„ā¸Ĩā¸—ā¸ąāšˆā¸§āš„ā¸›", "purchase_input_suggestion": "ā¸Ąā¸ĩ⏪ā¸Ģā¸ąā¸Ē⏜ā¸Ĩā¸´ā¸•ā¸ ā¸ąā¸“ā¸‘āšŒā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ? āšƒā¸Ēāšˆā¸Ŗā¸Ģā¸ąā¸Ēā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡", - "purchase_license_subtitle": "ā¸‹ā¸ˇāš‰ā¸­ Immich āš€ā¸žā¸ˇāšˆā¸­ā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸•āšˆā¸­āš€ā¸™ā¸ˇāšˆā¸­ā¸‡", + "purchase_license_subtitle": "ā¸‹ā¸ˇāš‰ā¸­ Immich āš€ā¸žā¸ˇāšˆā¸­ā¸Ēā¸™ā¸ąā¸šā¸Ēā¸™ā¸¸ā¸™ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸•āšˆā¸­āš€ā¸™ā¸ˇāšˆā¸­ā¸‡", "purchase_lifetime_description": "ā¸‹ā¸ˇāš‰ā¸­ā¸•ā¸Ĩā¸­ā¸”ā¸Šā¸ĩā¸ž", "purchase_option_title": "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗā¸‹ā¸ˇāš‰ā¸­", - "purchase_panel_info_1": "⏗⏞⏇⏗ā¸ĩā¸Ą Immich ā¸•āš‰ā¸­ā¸‡āšƒā¸Šāš‰āš€ā¸§ā¸Ĩā¸˛āšā¸Ĩā¸°ā¸„ā¸§ā¸˛ā¸Ąā¸žā¸ĸ⏞ā¸ĸā¸˛ā¸Ąā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸Ąā¸˛ā¸āšƒā¸™ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ā¸Ŗā¸°ā¸šā¸šā¸™ā¸ĩāš‰ā¸‚ā¸ļāš‰ā¸™ā¸Ąā¸˛ āšā¸Ĩā¸°āš€ā¸Ŗā¸˛ā¸Ąā¸ĩ⏧⏴⏍⏧⏁⏪⏗ā¸ĩāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™āš€ā¸•āš‡ā¸Ąāš€ā¸§ā¸Ĩā¸˛āš€ā¸žā¸ˇāšˆā¸­ā¸žā¸ąā¸’ā¸™ā¸˛āšƒā¸Ģāš‰ā¸”ā¸ĩ⏗ā¸ĩāšˆā¸Ēā¸¸ā¸”āš€ā¸—āšˆā¸˛ā¸—ā¸ĩāšˆā¸ˆā¸°ā¸—ā¸ŗāš„ā¸”āš‰ ā¸ ā¸˛ā¸Ŗā¸ā¸´ā¸ˆā¸‚ā¸­ā¸‡āš€ā¸Ŗā¸˛ā¸„ā¸ˇā¸­ā¸ā¸˛ā¸Ŗā¸—ā¸ŗāšƒā¸Ģāš‰ā¸‹ā¸­ā¸Ÿā¸•āšŒāšā¸§ā¸ŖāšŒāš‚ā¸­āš€ā¸žāšˆā¸™ā¸‹ā¸­ā¸ŖāšŒā¸Ēāšā¸Ĩā¸°āšā¸™ā¸§ā¸—ā¸˛ā¸‡ā¸›ā¸ā¸´ā¸šā¸ąā¸•ā¸´ā¸—ā¸˛ā¸‡ā¸˜ā¸¸ā¸Ŗā¸ā¸´ā¸ˆā¸—ā¸ĩāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡ā¸•ā¸˛ā¸Ąā¸ˆā¸Ŗā¸´ā¸ĸā¸˜ā¸Ŗā¸Ŗā¸Ąā¸ā¸Ĩ⏞ā¸ĸāš€ā¸›āš‡ā¸™āšā¸Ģā¸Ĩāšˆā¸‡ā¸Ŗā¸˛ā¸ĸāš„ā¸”āš‰ā¸—ā¸ĩāšˆā¸ĸā¸ąāšˆā¸‡ā¸ĸ⏎⏙ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸™ā¸ąā¸ā¸žā¸ąā¸’ā¸™ā¸˛ āšā¸Ĩ⏰ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ŗā¸°ā¸šā¸šā¸™ā¸´āš€ā¸§ā¸¨ā¸—ā¸ĩāšˆāš€ā¸„ā¸˛ā¸Ŗā¸žā¸„ā¸§ā¸˛ā¸Ąāš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸—ā¸˛ā¸‡āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ˇāšˆā¸™ā¸—ā¸ĩāšˆāš€ā¸›āš‡ā¸™ā¸Ŗā¸šā¸›ā¸˜ā¸Ŗā¸Ŗā¸Ąāšā¸—ā¸™ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗā¸„ā¸Ĩā¸˛ā¸§ā¸”āšŒā¸—ā¸ĩāšˆāš€ā¸­ā¸˛ā¸Ŗā¸ąā¸”āš€ā¸­ā¸˛āš€ā¸›ā¸Ŗā¸ĩā¸ĸ⏚", + "purchase_panel_info_1": "ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ Immich ā¸•āš‰ā¸­ā¸‡āšƒā¸Šāš‰āš€ā¸§ā¸Ĩā¸˛āšā¸Ĩā¸°ā¸„ā¸§ā¸˛ā¸Ąā¸žā¸ĸ⏞ā¸ĸā¸˛ā¸Ąā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸Ąā¸˛ā¸ āšā¸Ĩā¸°āš€ā¸Ŗā¸˛ā¸Ąā¸ĩ⏧⏴⏍⏧⏁⏪⏗ā¸ĩāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™āš€ā¸•āš‡ā¸Ąāš€ā¸§ā¸Ĩā¸˛āš€ā¸žā¸ˇāšˆā¸­ā¸žā¸ąā¸’ā¸™ā¸˛āšƒā¸Ģāš‰ā¸”ā¸ĩ⏗ā¸ĩāšˆā¸Ēā¸¸ā¸”āš€ā¸—āšˆā¸˛ā¸—ā¸ĩāšˆā¸ˆā¸°ā¸—ā¸ŗāš„ā¸”āš‰ ā¸ ā¸˛ā¸Ŗā¸ā¸´ā¸ˆā¸‚ā¸­ā¸‡āš€ā¸Ŗā¸˛ā¸„ā¸ˇā¸­ā¸ā¸˛ā¸Ŗā¸—ā¸ŗāšƒā¸Ģāš‰ā¸‹ā¸­ā¸Ÿā¸•āšŒāšā¸§ā¸ŖāšŒāš‚ā¸­āš€ā¸žā¸™ā¸‹ā¸­ā¸ŖāšŒā¸Ēāšā¸Ĩā¸°āšā¸™ā¸§ā¸—ā¸˛ā¸‡ā¸›ā¸ā¸´ā¸šā¸ąā¸•ā¸´ā¸—ā¸˛ā¸‡ā¸˜ā¸¸ā¸Ŗā¸ā¸´ā¸ˆā¸—ā¸ĩāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡ā¸•ā¸˛ā¸Ąā¸ˆā¸Ŗā¸´ā¸ĸā¸˜ā¸Ŗā¸Ŗā¸Ąā¸ā¸Ĩ⏞ā¸ĸāš€ā¸›āš‡ā¸™āšā¸Ģā¸Ĩāšˆā¸‡ā¸Ŗā¸˛ā¸ĸāš„ā¸”āš‰ā¸—ā¸ĩāšˆā¸ĸā¸ąāšˆā¸‡ā¸ĸ⏎⏙ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸™ā¸ąā¸ā¸žā¸ąā¸’ā¸™ā¸˛ āšā¸Ĩ⏰ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ŗā¸°ā¸šā¸šā¸™ā¸´āš€ā¸§ā¸¨ā¸—ā¸ĩāšˆāš€ā¸„ā¸˛ā¸Ŗā¸žā¸„ā¸§ā¸˛ā¸Ąāš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸—ā¸˛ā¸‡āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ˇāšˆā¸™ā¸—ā¸ĩāšˆāš€ā¸›āš‡ā¸™ā¸Ŗā¸šā¸›ā¸˜ā¸Ŗā¸Ŗā¸Ąāšā¸—ā¸™ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗā¸„ā¸Ĩā¸˛ā¸§ā¸”āšŒā¸—ā¸ĩāšˆāš€ā¸­ā¸˛ā¸Ŗā¸ąā¸”āš€ā¸­ā¸˛āš€ā¸›ā¸Ŗā¸ĩā¸ĸ⏚", "purchase_panel_info_2": "āš€ā¸™ā¸ˇāšˆā¸­ā¸‡ā¸ˆā¸˛ā¸āš€ā¸Ŗā¸˛āšƒā¸Ģāš‰ā¸„ā¸ŗā¸Ąā¸ąāšˆā¸™ā¸§āšˆā¸˛ ā¸ˆā¸°āš„ā¸Ąāšˆāš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸°ā¸šā¸šā¸Šā¸ŗā¸Ŗā¸°āš€ā¸‡ā¸´ā¸™āšƒā¸™ā¸Ŗā¸°ā¸šā¸šā¸‚ā¸­ā¸‡āš€ā¸Ŗā¸˛ ā¸”ā¸ąā¸‡ā¸™ā¸ąāš‰ā¸™ā¸ā¸˛ā¸Ŗā¸‹ā¸ˇāš‰ā¸­ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸™ā¸ĩāš‰ā¸ˆā¸°āš„ā¸Ąāšˆā¸—ā¸ŗāšƒā¸Ģāš‰ā¸„ā¸¸ā¸“āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸Ÿā¸ĩāš€ā¸ˆā¸­ā¸ŖāšŒāš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ąāšƒā¸™ Immich āš€ā¸›āš‡ā¸™ā¸žā¸´āš€ā¸¨ā¸Š āš€ā¸Ŗā¸˛ā¸­ā¸˛ā¸¨ā¸ąā¸ĸā¸œā¸šāš‰ā¸„ā¸™āšā¸šā¸šā¸„ā¸¸ā¸“āšƒā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸™ā¸ąā¸šā¸Ēā¸™ā¸¸ā¸™ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸•āšˆā¸­āš€ā¸™ā¸ˇāšˆā¸­ā¸‡ā¸‚ā¸­ā¸‡ Immich", "purchase_panel_title": "ā¸Ēā¸™ā¸ąā¸šā¸Ēā¸™ā¸¸ā¸™āš‚ā¸„ā¸Ŗā¸‡ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰", "purchase_per_server": "ā¸•āšˆā¸­āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", @@ -1511,16 +1737,21 @@ "purchase_remove_product_key_prompt": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ē⏜ā¸Ĩā¸´ā¸•ā¸ ā¸ąā¸“ā¸‘āšŒā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", "purchase_remove_server_product_key": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ē⏜ā¸Ĩā¸´ā¸•ā¸ ā¸ąā¸“ā¸‘āšŒāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "purchase_remove_server_product_key_prompt": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ē⏜ā¸Ĩā¸´ā¸•ā¸ ā¸ąā¸“ā¸‘āšŒāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ?", - "purchase_server_description_1": "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸—ā¸ąāš‰ā¸‡āš€ā¸‹ā¸´ā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", + "purchase_server_description_1": "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸—ā¸ąāš‰ā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "purchase_server_description_2": "ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙", - "purchase_server_title": "āš€ā¸‹ā¸´ā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", + "purchase_server_title": "āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "purchase_settings_server_activated": "⏪ā¸Ģā¸ąā¸Ē⏜ā¸Ĩā¸´ā¸•ā¸ ā¸ąā¸“ā¸‘āšŒāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒāš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāš‚ā¸”ā¸ĸā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ⏪⏰⏚⏚", + "queue_status": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸„ā¸´ā¸§ {count}/{total}", + "rate_asset": "āšƒā¸Ģāš‰ā¸„ā¸°āšā¸™ā¸™ā¸Ēā¸ˇāšˆā¸­", "rating": "ā¸ā¸˛ā¸Ŗāšƒā¸Ģāš‰ā¸„ā¸°āšā¸™ā¸™", "rating_clear": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸„ā¸°āšā¸™ā¸™", - "rating_count": "{count, plural, one {# ⏔⏞⏧} other {# ⏔⏞⏧}}", + "rating_count": "{count, plural, =0 {āš„ā¸Ąāšˆā¸Ąā¸ĩā¸„ā¸°āšā¸™ā¸™} one {# ⏔⏞⏧} other {# ⏔⏞⏧}}", "rating_description": "āšā¸Ēā¸”ā¸‡ā¸„ā¸°āšā¸™ā¸™ EXIF āšƒā¸™ Info panel", "reaction_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁ reaction", "read_changelog": "ā¸­āšˆā¸˛ā¸™ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇", + "readonly_mode_disabled": "ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸­āšˆā¸˛ā¸™āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™āšā¸Ĩāš‰ā¸§", + "readonly_mode_enabled": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸­āšˆā¸˛ā¸™āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™āšā¸Ĩāš‰ā¸§", + "ready_for_upload": "ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔", "reassign": "ā¸Ąā¸­ā¸šā¸Ģā¸Ąā¸˛ā¸ĸāšƒā¸Ģā¸Ąāšˆ", "reassigned_assets_to_existing_person": "ā¸Ąā¸­ā¸šā¸Ģā¸Ąā¸˛ā¸ĸ {count, plural, one {# ā¸Ēā¸ˇāšˆā¸­} other {# ā¸Ēā¸ˇāšˆā¸­}} āšƒā¸Ģāš‰ā¸ā¸ąā¸š {name, select, null {an existing person} other {{name}}}", "reassigned_assets_to_new_person": "ā¸Ąā¸­ā¸šā¸Ģā¸Ąā¸˛ā¸ĸ {count, plural, one {# ā¸Ēā¸ˇāšˆā¸­} other {# ā¸Ēā¸ˇāšˆā¸­}} āšƒā¸Ģāš‰ā¸ā¸ąā¸šā¸šā¸¸ā¸„ā¸„ā¸Ĩāšƒā¸Ģā¸Ąāšˆ", @@ -1528,7 +1759,10 @@ "recent": "ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "recent_albums": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "recent_searches": "ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", + "recently_added": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "recently_added_page_title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", + "recently_taken": "ā¸–āšˆā¸˛ā¸ĸā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", + "recently_taken_page_title": "ā¸–āšˆā¸˛ā¸ĸā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "refresh": "⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Š", "refresh_encoded_videos": "āš‚ā¸Ģā¸Ĩ⏔⏁⏞⏪ encoded ⏧⏴⏔ā¸ĩāš‚ā¸­āšƒā¸Ģā¸Ąāšˆ", "refresh_faces": "⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Šāšƒā¸šā¸Ģā¸™āš‰ā¸˛", @@ -1542,7 +1776,7 @@ "regenerating_thumbnails": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ŗā¸šā¸› thumbnails āšƒā¸Ģā¸Ąāšˆ", "remove": "ā¸Ĩ⏚", "remove_assets_album_confirmation": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸—ā¸ĩāšˆā¸ˆā¸°ā¸Ĩ⏚ {count, plural, one {# ā¸Ēā¸ˇāšˆā¸­} other {# ā¸Ēā¸ˇāšˆā¸­}} ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą ?", - "remove_assets_shared_link_confirmation": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸—ā¸ĩāšˆā¸ˆā¸°ā¸Ĩ⏚ {count, plural, one {# ā¸Ēā¸ˇāšˆā¸­} other {# ā¸Ēā¸ˇāšˆā¸­}} ⏭⏭⏁⏈⏞⏁ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸™ā¸ĩāš‰ ?", + "remove_assets_shared_link_confirmation": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸—ā¸ĩāšˆā¸ˆā¸°ā¸Ĩ⏚ā¸Ēā¸ˇāšˆā¸­ {count, plural, one {# ⏪⏞ā¸ĸ⏁⏞⏪} other {# ⏪⏞ā¸ĸ⏁⏞⏪}} ⏭⏭⏁⏈⏞⏁ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", "remove_assets_title": "ā¸Ĩ⏚ā¸Ēā¸ˇāšˆā¸­āšƒā¸Šāšˆāš„ā¸Ģā¸Ą ?", "remove_custom_date_range": "ā¸Ĩā¸šā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šā¸Šāšˆā¸§ā¸‡āš€ā¸§ā¸Ĩ⏞", "remove_deleted_assets": "ā¸Ĩ⏚ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸–ā¸šā¸ā¸Ĩ⏚", @@ -1571,53 +1805,90 @@ "reset_password": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āšƒā¸Ģā¸Ąāšˆ", "reset_people_visibility": "ā¸›ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ąā¸­ā¸‡āš€ā¸Ģāš‡ā¸™āšƒā¸Ģā¸Ąāšˆ", "reset_pin_code": "ā¸•ā¸ąāš‰ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN) āšƒā¸Ģā¸Ąāšˆ", + "reset_pin_code_description": "ā¸Ģ⏞⏁⏄⏏⏓ā¸Ĩā¸ˇā¸Ąā¸Ŗā¸Ģā¸ąā¸Ē PIN ⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸•ā¸´ā¸”ā¸•āšˆā¸­ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩāš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒāš€ā¸žā¸ˇāšˆā¸­ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸Ŗā¸Ģā¸ąā¸Ēāš„ā¸”āš‰", + "reset_pin_code_success": "⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸Ŗā¸Ģā¸ąā¸Ē PIN ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", + "reset_pin_code_with_password": "⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸Ŗā¸Ģā¸ąā¸Ē PIN ā¸”āš‰ā¸§ā¸ĸ⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸”āš‰āš€ā¸Ēā¸Ąā¸­", + "reset_sqlite": "⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ SQLite", + "reset_sqlite_clear_app_data": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", + "reset_sqlite_confirmation": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩāš‰ā¸˛ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸­ā¸›ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ? ⏁⏞⏪⏁⏪⏰⏗⏺⏙ā¸ĩāš‰ā¸ˆā¸°ā¸Ĩā¸šā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšā¸Ĩā¸°ā¸™ā¸ŗā¸„ā¸¸ā¸“ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸Ŗā¸°ā¸šā¸š", + "reset_sqlite_confirmation_note": "ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ģ⏕⏏: ā¸„ā¸¸ā¸“ā¸ˆā¸°ā¸•āš‰ā¸­ā¸‡ā¸›ā¸´ā¸”āšā¸Ĩā¸°āš€ā¸›ā¸´ā¸”āšā¸­ā¸›āšƒā¸Ģā¸Ąāšˆā¸Ģā¸Ĩā¸ąā¸‡ā¸ˆā¸˛ā¸ā¸Ĩāš‰ā¸˛ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸Ĩāš‰ā¸§", + "reset_sqlite_done": "ā¸Ĩāš‰ā¸˛ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸­ā¸›āšā¸Ĩāš‰ā¸§ āš‚ā¸›ā¸Ŗā¸”ā¸›ā¸´ā¸”āšā¸Ĩā¸°āš€ā¸›ā¸´ā¸” Immich āšƒā¸Ģā¸Ąāšˆ āšā¸Ĩā¸°āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šā¸­ā¸ĩā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡", + "reset_sqlite_success": "⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ SQLite ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "reset_to_default": "⏁ā¸Ĩā¸ąā¸šāš„ā¸›ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™", + "resolution": "ā¸„ā¸§ā¸˛ā¸Ąā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔", "resolve_duplicates": "āšā¸āš‰āš„ā¸‚ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸‹āš‰ā¸ŗā¸‹āš‰ā¸­ā¸™", "resolved_all_duplicates": "āšā¸āš‰āš„ā¸‚ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸‹āš‰ā¸ŗā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "restore": "āš€ā¸Ŗā¸ĩā¸ĸ⏁⏄⏎⏙", "restore_all": "āš€ā¸Ŗā¸ĩā¸ĸā¸ā¸„ā¸ˇā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", + "restore_trash_action_prompt": "ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗā¸ˆā¸˛ā¸ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°āšā¸Ĩāš‰ā¸§", "restore_user": "āš€ā¸Ŗā¸ĩā¸ĸā¸ā¸„ā¸ˇā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰", "restored_asset": "asset ā¸–ā¸šā¸ā¸„ā¸ˇā¸™ā¸„āšˆā¸˛", - "resume": "⏁ā¸Ĩā¸ąā¸šā¸„ā¸ˇā¸™", + "resume": "ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸•āšˆā¸­", + "resume_paused_jobs": "ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­ {count, plural, one {# ⏇⏞⏙⏗ā¸ĩāšˆā¸Ģā¸ĸā¸¸ā¸”ā¸žā¸ąā¸āš„ā¸§āš‰} other {# ⏇⏞⏙⏗ā¸ĩāšˆā¸Ģā¸ĸā¸¸ā¸”ā¸žā¸ąā¸āš„ā¸§āš‰}}", "retry_upload": "ā¸Ĩā¸­ā¸‡ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āšƒā¸Ģā¸Ąāšˆ", "review_duplicates": "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚⏪⏞ā¸ĸ⏁⏞⏪⏗ā¸ĩāšˆā¸‹āš‰ā¸ŗā¸ā¸ąā¸™", "review_large_files": "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸Ąā¸ĩā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆ", "role": "ā¸šā¸—ā¸šā¸˛ā¸—", "role_editor": "āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ąā¸ˇā¸­āšā¸āš‰āš„ā¸‚", "role_viewer": "ā¸”ā¸š", + "running": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸—ā¸ŗā¸‡ā¸˛ā¸™", "save": "ā¸šā¸ąā¸™ā¸—ā¸ļ⏁", + "save_to_gallery": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸āš„ā¸›ā¸ĸā¸ąā¸‡āšā¸ā¸Ĩāš€ā¸Ĩ⏭⏪ā¸ĩ", + "saved": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšā¸Ĩāš‰ā¸§", "saved_api_key": "ā¸šā¸ąā¸™ā¸—ā¸ļ⏁ API ⏄ā¸ĩā¸ĸāšŒ āšā¸Ĩāš‰ā¸§", "saved_profile": "āšā¸āš‰āš„ā¸‚āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "saved_settings": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "say_something": "ā¸žā¸šā¸”ā¸­ā¸°āš„ā¸Ŗā¸Ēā¸ąā¸ā¸­ā¸ĸāšˆā¸˛ā¸‡", "scaffold_body_error_occurred": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", + "scaffold_body_error_unrecoverable": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏗ā¸ĩāšˆāš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸ā¸šāš‰ā¸„ā¸ˇā¸™āš„ā¸”āš‰ āš‚ā¸›ā¸Ŗā¸”āšā¸Šā¸ŖāšŒā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”āšā¸Ĩ⏰ stack trace āš„ā¸›ā¸ĸā¸ąā¸‡ Discord ā¸Ģ⏪⏎⏭ GitHub āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰āš€ā¸Ŗā¸˛ā¸Šāšˆā¸§ā¸ĸāš€ā¸Ģā¸Ĩ⏎⏭ ā¸Ģā¸˛ā¸āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸„ā¸ŗāšā¸™ā¸°ā¸™ā¸ŗ ⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ĩāš‰ā¸˛ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸­ā¸›āš„ā¸”āš‰ā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡", + "scan": "ā¸Ēāšā¸ā¸™", "scan_all_libraries": "ā¸Ēāšā¸ā¸™ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸žā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "scan_library": "ā¸Ēāšā¸ā¸™", "scan_settings": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸Ēāšā¸ā¸™", + "scanning": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ēāšā¸ā¸™", "scanning_for_album": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ēāšā¸ā¸™ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą...", "search": "ā¸„āš‰ā¸™ā¸Ģ⏞", "search_albums": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "search_by_context": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸•ā¸˛ā¸Ąā¸šā¸Ŗā¸´ā¸šā¸—", "search_by_description": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸”āš‰ā¸§ā¸ĸā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸ", "search_by_description_example": "ā¸§ā¸ąā¸™ā¸›ā¸ĩā¸™āš€ā¸‚ā¸˛āšƒā¸™ā¸‹ā¸˛ā¸›ā¸˛", - "search_by_filename": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒā¸Šā¸ˇāšˆā¸­ ā¸Ģ⏪⏎⏭ ā¸Šā¸™ā¸´ā¸”āš„ā¸Ÿā¸ĨāšŒ", + "search_by_filename": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸•ā¸˛ā¸Ąā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒā¸Ģā¸Ŗā¸ˇā¸­ā¸™ā¸˛ā¸Ąā¸Ē⏁⏏ā¸Ĩāš„ā¸Ÿā¸ĨāšŒ", "search_by_filename_example": "ā¸•ā¸ąā¸§ā¸­ā¸ĸāšˆā¸˛ā¸‡. IMG_1234.JPG ā¸Ģ⏪⏎⏭ PNG", + "search_by_ocr": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸”āš‰ā¸§ā¸ĸ OCR", + "search_by_ocr_example": "ā¸Ĩā¸˛āš€ā¸•āš‰", + "search_camera_lens_model": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸Ŗā¸¸āšˆā¸™āš€ā¸Ĩ⏙ā¸ĒāšŒ...", "search_camera_make": "ā¸„āš‰ā¸™ā¸Ģ⏞ā¸ĸā¸ĩāšˆā¸Ģāš‰ā¸­ā¸ā¸Ĩāš‰ā¸­ā¸‡", "search_camera_model": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸Ŗā¸¸āšˆā¸™ā¸ā¸Ĩāš‰ā¸­ā¸‡", "search_city": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸•ā¸˛ā¸Ąāš€ā¸Ąā¸ˇā¸­ā¸‡", "search_country": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸•ā¸˛ā¸Ąā¸›ā¸Ŗā¸°āš€ā¸—ā¸¨", "search_filter_apply": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸•ā¸ąā¸§ā¸ā¸Ŗā¸­ā¸‡", + "search_filter_camera_title": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—ā¸ā¸Ĩāš‰ā¸­ā¸‡", + "search_filter_date": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ", + "search_filter_date_interval": "{start} ⏖ā¸ļ⏇ {end}", + "search_filter_date_title": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Šāšˆā¸§ā¸‡ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ", "search_filter_display_option_not_in_album": "āš„ā¸Ąāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", + "search_filter_display_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸œā¸Ĩ", + "search_filter_filename": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸”āš‰ā¸§ā¸ĸā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ", + "search_filter_location": "ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", + "search_filter_location_title": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", + "search_filter_media_type": "ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—ā¸Ēā¸ˇāšˆā¸­", + "search_filter_media_type_title": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—ā¸Ēā¸ˇāšˆā¸­", + "search_filter_ocr": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸”āš‰ā¸§ā¸ĸ OCR", + "search_filter_people_title": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸œā¸šāš‰ā¸„ā¸™", + "search_filter_star_rating": "ā¸„ā¸°āšā¸™ā¸™ā¸”ā¸˛ā¸§", "search_for": "ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸š", "search_for_existing_person": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏗ā¸ĩāšˆā¸Ąā¸ĩ⏭ā¸ĸā¸šāšˆ", - "search_no_people": "āš„ā¸Ąāšˆā¸žā¸šā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏄⏙", - "search_no_people_named": "āš„ā¸Ąāšˆā¸žā¸š \"{name}\"", + "search_no_more_result": "āš„ā¸Ąāšˆā¸Ąā¸ĩ⏜ā¸Ĩā¸Ĩā¸ąā¸žā¸˜āšŒāš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ą", + "search_no_people": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸šā¸¸ā¸„ā¸„ā¸Ĩ", + "search_no_people_named": "āš„ā¸Ąāšˆā¸žā¸šā¸œā¸šāš‰ā¸„ā¸™ā¸—ā¸ĩāšˆā¸Šā¸ˇāšˆā¸­ \"{name}\"", + "search_no_result": "āš„ā¸Ąāšˆā¸žā¸šā¸œā¸Ĩā¸Ĩā¸ąā¸žā¸˜āšŒ ā¸Ĩā¸­ā¸‡āšƒā¸Šāš‰ā¸„ā¸ŗā¸„āš‰ā¸™ā¸Ģā¸˛ā¸­ā¸ˇāšˆā¸™ā¸Ģ⏪⏎⏭⏁ā¸Ĩā¸¸āšˆā¸Ąā¸„ā¸ŗā¸„āš‰ā¸™ā¸Ģā¸˛ā¸­ā¸ˇāšˆā¸™", "search_options": "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞", "search_page_categories": "ā¸Ģā¸Ąā¸§ā¸”ā¸Ģā¸Ąā¸šāšˆ", "search_page_motion_photos": "ā¸ ā¸˛ā¸žāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģ⏧", "search_page_no_objects": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏪⏞ā¸ĸ⏁⏞⏪", "search_page_no_places": "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ", "search_page_screenshots": "āšā¸„ā¸›ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­", + "search_page_search_photos_videos": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "search_page_selfies": "āš€ā¸‹ā¸Ĩ⏟ā¸ĩāšˆ", "search_page_things": "ā¸Ēā¸´āšˆā¸‡ā¸‚ā¸­ā¸‡", "search_page_view_all_button": "ā¸”ā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", @@ -1639,16 +1910,23 @@ "second": "⏧⏴⏙⏞⏗ā¸ĩ", "see_all_people": "ā¸”ā¸šā¸šā¸¸ā¸„ā¸„ā¸Ĩā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "select": "āš€ā¸Ĩ⏎⏭⏁", + "select_album": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "select_album_cover": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ ā¸˛ā¸žā¸›ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", + "select_albums": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "select_all": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "select_all_duplicates": "āš€ā¸Ĩ⏎⏭⏁⏪⏞ā¸ĸ⏁⏞⏪⏗ā¸ĩāšˆā¸‹āš‰ā¸ŗā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", + "select_all_in": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšƒā¸™ {group}", "select_avatar_color": "āš€ā¸Ĩ⏎⏭⏁ā¸Ēā¸ĩā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡ā¸‚ā¸­ā¸‡ā¸Ŗā¸šā¸›āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ", + "select_count": "{count, plural, one {āš€ā¸Ĩ⏎⏭⏁ #} other {āš€ā¸Ĩ⏎⏭⏁ #}}", + "select_cutoff_date": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆā¸•ā¸ąā¸”ā¸Ŗā¸­ā¸š", "select_face": "āš€ā¸Ĩā¸ˇā¸­ā¸āšƒā¸šā¸Ģā¸™āš‰ā¸˛", "select_featured_photo": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ ā¸˛ā¸žāš€ā¸”āšˆā¸™", "select_from_computer": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ˆā¸˛ā¸ā¸„ā¸­ā¸Ąā¸žā¸´ā¸§āš€ā¸•ā¸­ā¸ŖāšŒ", "select_keep_all": "āš€ā¸Ĩā¸ˇā¸­ā¸āš€ā¸āš‡ā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "select_library_owner": "āš€ā¸Ĩā¸ˇā¸­ā¸āš€ā¸ˆāš‰ā¸˛ā¸‚ā¸­ā¸‡ā¸„ā¸Ĩā¸ąā¸‡ā¸ ā¸˛ā¸ž", "select_new_face": "āš€ā¸Ĩā¸ˇā¸­ā¸āšƒā¸šā¸Ģā¸™āš‰ā¸˛āšƒā¸Ģā¸Ąāšˆ", + "select_people": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸œā¸šāš‰ā¸„ā¸™", + "select_person": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸šā¸¸ā¸„ā¸„ā¸Ĩ", "select_person_to_tag": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸šā¸¸ā¸„ā¸„ā¸Ĩ", "select_photos": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "select_trash_all": "āš€ā¸Ĩā¸ˇā¸­ā¸āšƒā¸™ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", @@ -1658,13 +1936,16 @@ "send_message": "ā¸Ēāšˆā¸‡ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", "send_welcome_email": "ā¸Ēāšˆā¸‡ā¸­ā¸ĩāš€ā¸Ąā¸Ĩā¸•āš‰ā¸­ā¸™ā¸Ŗā¸ąā¸š", "server_endpoint": "⏛ā¸Ĩ⏞ā¸ĸā¸—ā¸˛ā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", - "server_info_box_app_version": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āšā¸­ā¸ž", + "server_info_box_app_version": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āšā¸­ā¸›", "server_info_box_server_url": "URL āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "server_offline": "āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸­ā¸­ā¸Ÿāš„ā¸Ĩā¸™āšŒ", "server_online": "āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒ", "server_privacy": "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", + "server_restarting_description": "ā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸Ŗā¸ĩāš€ā¸Ÿā¸Ŗā¸Šāšƒā¸™ā¸­ā¸ĩ⏁ā¸Ēā¸ąā¸ā¸„ā¸Ŗā¸šāšˆ", + "server_restarting_title": "āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸ā¸ŗā¸Ĩā¸ąā¸‡āš€ā¸Ŗā¸´āšˆā¸Ąā¸Ŗā¸°ā¸šā¸šāšƒā¸Ģā¸Ąāšˆ", "server_stats": "ā¸Ēā¸–ā¸´ā¸•ā¸´āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", - "server_version": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸‚ā¸­ā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", + "server_update_available": "ā¸Ąā¸ĩā¸­ā¸ąā¸›āš€ā¸”ā¸•āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒāšƒā¸Ģāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", + "server_version": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "set": "ā¸•ā¸ąāš‰ā¸‡", "set_as_album_cover": "ā¸•ā¸ąāš‰ā¸‡āš€ā¸›āš‡ā¸™ā¸ ā¸˛ā¸žā¸›ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "set_as_featured_photo": "ā¸•ā¸ąāš‰ā¸‡āš€ā¸›āš‡ā¸™ā¸Ŗā¸šā¸›ā¸Ēā¸ŗā¸„ā¸ąā¸", @@ -1672,6 +1953,9 @@ "set_date_of_birth": "ā¸•ā¸ąāš‰ā¸‡ā¸§ā¸ąā¸™āš€ā¸ā¸´ā¸”", "set_profile_picture": "ā¸•ā¸ąāš‰ā¸‡ā¸Ŗā¸šā¸›āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ", "set_slideshow_to_fullscreen": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸™ā¸ŗāš€ā¸Ēā¸™ā¸­āš€ā¸•āš‡ā¸Ąā¸ˆā¸­", + "set_stack_primary_asset": "ā¸•ā¸ąāš‰ā¸‡āš€ā¸›āš‡ā¸™ā¸Ēā¸ˇāšˆā¸­ā¸Ģā¸Ĩā¸ąā¸", + "setting_image_navigation_enable_title": "āšā¸•ā¸°āš€ā¸žā¸ˇāšˆā¸­ā¸™ā¸ŗā¸—ā¸˛ā¸‡", + "setting_image_navigation_title": "ā¸ā¸˛ā¸Ŗā¸™ā¸ŗā¸—ā¸˛ā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "setting_image_viewer_help": "ā¸•ā¸ąā¸§ā¸”ā¸šā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ĸāšˆā¸­ā¸āšˆā¸­ā¸™ āšā¸Ĩāš‰ā¸§ā¸ˆā¸°āš‚ā¸Ģā¸Ĩā¸”ā¸žā¸Ŗā¸ĩ⏧⏴⏧⏂⏙⏞⏔⏁ā¸Ĩ⏞⏇ (ā¸–āš‰ā¸˛āš€ā¸›ā¸´ā¸”) āšā¸Ĩāš‰ā¸§ā¸„āšˆā¸­ā¸ĸāš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š (ā¸–āš‰ā¸˛āš€ā¸›ā¸´ā¸”)", "setting_image_viewer_original_subtitle": "āš€ā¸›ā¸´ā¸”āš€ā¸žā¸ˇāšˆā¸­āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸šā¸„ā¸§ā¸˛ā¸Ąā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”āš€ā¸•āš‡ā¸Ą (āšƒā¸Ģā¸āšˆ!) ā¸›ā¸´ā¸”āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ (ā¸—ā¸ąāš‰ā¸‡ā¸šā¸™āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸāšā¸Ĩā¸°āšā¸„ā¸Šā¸šā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡)", "setting_image_viewer_original_title": "āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š", @@ -1679,26 +1963,32 @@ "setting_image_viewer_preview_title": "āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸•ā¸ąā¸§ā¸­ā¸ĸāšˆā¸˛ā¸‡", "setting_image_viewer_title": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "setting_languages_apply": "ā¸šā¸ąā¸™ā¸—ā¸ļ⏁", + "setting_languages_subtitle": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸ ā¸˛ā¸Šā¸˛ā¸‚ā¸­ā¸‡āšā¸­ā¸›", "setting_notifications_notify_failures_grace_period": "āšā¸ˆāš‰ā¸‡ā¸ā¸˛ā¸Ŗā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšƒā¸™āš€ā¸šā¸ˇāš‰ā¸­ā¸‡ā¸Ģā¸Ĩā¸ąā¸‡ā¸Ĩāš‰ā¸Ąāš€ā¸Ģā¸Ĩ⏧: {duration}", "setting_notifications_notify_hours": "{count} ā¸Šā¸ąāšˆā¸§āš‚ā¸Ąā¸‡", "setting_notifications_notify_immediately": "āš‚ā¸”ā¸ĸā¸—ā¸ąā¸™ā¸—ā¸ĩ", "setting_notifications_notify_minutes": "{count} ⏙⏞⏗ā¸ĩ", "setting_notifications_notify_never": "āš„ā¸Ąāšˆāš€ā¸„ā¸ĸ", "setting_notifications_notify_seconds": "{count} ⏧⏴⏙⏞⏗ā¸ĩ", - "setting_notifications_single_progress_subtitle": "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸ˇā¸šā¸Ģā¸™āš‰ā¸˛ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš‚ā¸”ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”ā¸•āšˆā¸­ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪", + "setting_notifications_single_progress_subtitle": "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸ˇā¸šā¸Ģā¸™āš‰ā¸˛ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš‚ā¸”ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”ā¸•āšˆā¸­ā¸Ēā¸ˇāšˆā¸­", "setting_notifications_single_progress_title": "āšā¸Ē⏔⏇⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔ā¸Ē⏖⏞⏙⏰⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšƒā¸™āš€ā¸šā¸ˇāš‰ā¸­ā¸‡ā¸Ģā¸Ĩā¸ąā¸‡", "setting_notifications_subtitle": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™", "setting_notifications_total_progress_subtitle": "ā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸ˇā¸šā¸Ģā¸™āš‰ā¸˛ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš‚ā¸”ā¸ĸā¸Ŗā¸§ā¸Ą (āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™/ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”)", "setting_notifications_total_progress_title": "āšā¸Ē⏔⏇ā¸Ē⏖⏞⏙⏰⏁⏞⏪ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšƒā¸™āš€ā¸šā¸ˇāš‰ā¸­ā¸‡ā¸Ģā¸Ĩā¸ąā¸‡ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", + "setting_video_viewer_auto_play_subtitle": "āš€ā¸Ŗā¸´āšˆā¸Ąāš€ā¸Ĩāšˆā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ā¸Ģā¸Ĩā¸ąā¸‡āš€ā¸›ā¸´ā¸”āšā¸Ĩāš‰ā¸§", + "setting_video_viewer_auto_play_title": "āš€ā¸Ĩāšˆā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "setting_video_viewer_looping_title": "⏧⏙ā¸Ĩā¸šā¸›", + "setting_video_viewer_original_video_title": "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š", "settings": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", "settings_require_restart": "⏁⏪⏏⏓⏞⏪ā¸ĩā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸— Immmich āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", "settings_saved": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸Ĩāš‰ā¸§", "setup_pin_code": "ā¸•ā¸ąāš‰ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN)", "share": "āšā¸Šā¸ŖāšŒ", + "share_action_prompt": "āšā¸Šā¸ŖāšŒā¸Ēā¸ˇāšˆā¸­ {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§", "share_add_photos": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "share_assets_selected": "{count} ā¸–ā¸šā¸āš€ā¸Ĩ⏎⏭⏁", "share_dialog_preparing": "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸•ā¸Ŗā¸ĩā¸ĸā¸Ą...", + "share_link": "āšā¸Šā¸ŖāšŒā¸Ĩā¸´ā¸‡ā¸āšŒ", "shared": "āšā¸Šā¸ŖāšŒ", "shared_album_activities_input_disable": "ā¸„ā¸­ā¸Ąāš€ā¸Ąā¸™ā¸•āšŒā¸–ā¸šā¸ā¸›ā¸´ā¸”", "shared_album_activity_remove_content": "ā¸¸ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩā¸šā¸ā¸´ā¸ˆā¸ā¸Ŗā¸Ŗā¸Ąā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", @@ -1711,10 +2001,12 @@ "shared_by_user": "āšā¸Šā¸ŖāšŒāš‚ā¸”ā¸ĸ {user}", "shared_by_you": "āšā¸Šā¸ŖāšŒāš‚ā¸”ā¸ĸ⏄⏏⏓", "shared_from_partner": "ā¸Ŗā¸šā¸›ā¸ˆā¸˛ā¸ {partner}", + "shared_intent_upload_button_progress_text": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āšā¸Ĩāš‰ā¸§ {current} / {total}", "shared_link_app_bar_title": "ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", - "shared_link_clipboard_copied_massage": "ā¸„ā¸ąā¸”ā¸Ĩ⏭⏁ā¸Ĩ⏇⏄ā¸Ĩā¸´ā¸›ā¸šā¸­ā¸ŖāšŒā¸”", + "shared_link_clipboard_copied_massage": "ā¸„ā¸ąā¸”ā¸Ĩā¸­ā¸āš„ā¸›ā¸ĸā¸ąā¸‡ā¸„ā¸Ĩā¸´ā¸›ā¸šā¸­ā¸ŖāšŒā¸”āšā¸Ĩāš‰ā¸§", "shared_link_clipboard_text": "ā¸Ĩā¸´ā¸‡ā¸āšŒ: {link}\n⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™: {password}", "shared_link_create_error": "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏂⏓⏰ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ĩā¸´ā¸‡ā¸āšŒāšā¸Šā¸ŖāšŒ", + "shared_link_custom_url_description": "āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸™ā¸ĩāš‰ā¸”āš‰ā¸§ā¸ĸ URL ⏗ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", "shared_link_edit_description_hint": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”ā¸ā¸˛ā¸Ŗāšā¸Šā¸ŖāšŒ", "shared_link_edit_expire_after_option_day": "1 ā¸§ā¸ąā¸™", "shared_link_edit_expire_after_option_days": "{count} ā¸§ā¸ąā¸™", @@ -1724,9 +2016,9 @@ "shared_link_edit_expire_after_option_minutes": "{count} ⏙⏞⏗ā¸ĩ", "shared_link_edit_expire_after_option_months": "{count} āš€ā¸”ā¸ˇā¸­ā¸™", "shared_link_edit_expire_after_option_year": "{count} ⏛ā¸ĩ", - "shared_link_edit_password_hint": "⏁⏪⏭⏁⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āšā¸Šā¸ŖāšŒ", + "shared_link_edit_password_hint": "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āšā¸Šā¸ŖāšŒ", "shared_link_edit_submit_button": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸Ĩā¸´ā¸‡ā¸āšŒ", - "shared_link_error_server_url_fetch": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ŗā¸ąā¸š URL ā¸ˆā¸˛ā¸āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", + "shared_link_error_server_url_fetch": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ŗā¸ąā¸š url āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "shared_link_expires_day": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸āšƒā¸™ā¸­ā¸ĩ⏁ {count} ā¸§ā¸ąā¸™", "shared_link_expires_days": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸āšƒā¸™ā¸­ā¸ĩ⏁ {count} ā¸§ā¸ąā¸™", "shared_link_expires_hour": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸āšƒā¸™ā¸­ā¸ĩ⏁ {count} ā¸Šā¸ąāšˆā¸§āš‚ā¸Ąā¸‡", @@ -1737,10 +2029,14 @@ "shared_link_expires_second": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸āšƒā¸™ā¸­ā¸ĩ⏁ {count} ⏧⏴⏙⏞⏗ā¸ĩ", "shared_link_expires_seconds": "ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸āšƒā¸™ā¸­ā¸ĩ⏁ {count} ⏧⏴⏙⏞⏗ā¸ĩ", "shared_link_individual_shared": "āšā¸Šā¸ŖāšŒā¸Ŗā¸˛ā¸ĸā¸šā¸¸ā¸„ā¸„ā¸Ĩ", - "shared_link_manage_links": "⏚⏪⏴ā¸Ģ⏞⏪ā¸Ĩā¸´ā¸‡ā¸āšŒ", + "shared_link_info_chip_metadata": "EXIF", + "shared_link_manage_links": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", "shared_link_options": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", + "shared_link_password_description": "ā¸•āš‰ā¸­ā¸‡āšƒā¸Šāš‰ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš€ā¸žā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒā¸™ā¸ĩāš‰", "shared_links": "ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", - "shared_links_description": "āšā¸šāšˆā¸‡ā¸›ā¸ąā¸™ā¸Ŗā¸šā¸›āšā¸Ĩ⏰⏧ā¸ĩ⏔ā¸ĩāš‚ā¸­ā¸”āš‰ā¸§ā¸ĸā¸Ĩā¸´āš‰ā¸‡ā¸„āšŒ", + "shared_links_description": "āšā¸šāšˆā¸‡ā¸›ā¸ąā¸™ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧ā¸ĩ⏔ā¸ĩāš‚ā¸­ā¸”āš‰ā¸§ā¸ĸā¸Ĩā¸´ā¸‡ā¸āšŒ", + "shared_photos_and_videos_count": "{assetCount, plural, other {# ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸–ā¸šā¸āšā¸Šā¸ŖāšŒ}}", + "shared_with_me": "āšā¸Šā¸ŖāšŒā¸ā¸ąā¸šā¸‰ā¸ąā¸™", "shared_with_partner": "āšā¸Šā¸ŖāšŒā¸ā¸ąā¸š {partner}", "sharing": "ā¸ā¸˛ā¸Ŗāšā¸Šā¸ŖāšŒ", "sharing_enter_password": "āš‚ā¸›ā¸Ŗā¸”ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāš€ā¸›ā¸´ā¸”ā¸”ā¸šā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰", @@ -1750,7 +2046,7 @@ "sharing_sidebar_description": "āšā¸Ē⏔⏇ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒāšƒā¸™āšā¸–ā¸šā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡", "sharing_silver_appbar_create_shared_album": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒāšƒā¸Ģā¸Ąāšˆ", "sharing_silver_appbar_share_partner": "āšā¸Šā¸ŖāšŒā¸ā¸ąā¸šā¸„ā¸šāšˆā¸Ģā¸š", - "shift_to_permanent_delete": "⏁⏔ ⇧ to ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ĩ⏚ā¸Ēā¸ˇāšˆā¸­ā¸–ā¸˛ā¸§ā¸Ŗ", + "shift_to_permanent_delete": "⏁⏔ ⇧ āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩ⏚ā¸Ēā¸ˇāšˆā¸­ā¸–ā¸˛ā¸§ā¸Ŗ", "show_album_options": "āšā¸Ēā¸”ā¸‡ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "show_albums": "āšā¸Ēā¸”ā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "show_all_people": "āšā¸Ēā¸”ā¸‡ā¸šā¸¸ā¸„ā¸„ā¸Ĩā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", @@ -1767,10 +2063,12 @@ "show_person_options": "āšā¸Ēā¸”ā¸‡ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸‚ā¸­ā¸‡ā¸•ā¸ąā¸§ā¸šā¸¸ā¸„ā¸„ā¸Ĩ", "show_progress_bar": "āšā¸Ēā¸”ā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸ˇā¸šā¸Ģā¸™āš‰ā¸˛ āšā¸–ā¸š", "show_search_options": "āšā¸Ēā¸”ā¸‡ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞", - "show_shared_links": "āšā¸Ē⏔⏇ā¸Ĩā¸´āš‰ā¸‡ā¸„āšŒā¸—ā¸ĩāšˆā¸–ā¸šā¸āšā¸šāšˆā¸‡ā¸›ā¸ąā¸™", + "show_shared_links": "āšā¸Ē⏔⏇ā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", "show_slideshow_transition": "āšā¸Ē⏔⏇ā¸Ēāš„ā¸Ĩā¸„āšŒāš‚ā¸Šā¸§āšŒ", "show_supporter_badge": "āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙", "show_supporter_badge_description": "āšā¸Ēā¸”ā¸‡āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙", + "show_text_recognition": "āšā¸Ēā¸”ā¸‡ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", + "show_text_search_menu": "āšā¸Ēā¸”ā¸‡āš€ā¸Ąā¸™ā¸šā¸„āš‰ā¸™ā¸Ģā¸˛ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", "shuffle": "ā¸Ēā¸ąā¸šāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙", "sidebar": "āšā¸–ā¸šā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡", "sidebar_display_description": "āš€ā¸›ā¸´ā¸”ā¸Ģā¸Ŗā¸ˇā¸­ā¸›ā¸´ā¸”āšā¸–ā¸šā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡", @@ -1786,46 +2084,61 @@ "sort_created": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸‡ā¸•ā¸˛ā¸Ąā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆā¸Ēā¸Ŗāš‰ā¸˛ā¸‡", "sort_items": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸ⏇⏪⏞ā¸ĸ⏁⏞⏪", "sort_modified": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸‡ā¸•ā¸˛ā¸Ąā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸āš‰āš„ā¸‚", + "sort_newest": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšƒā¸Ģā¸Ąāšˆā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "sort_oldest": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸‡ā¸•ā¸˛ā¸Ąāš€ā¸āšˆā¸˛ā¸Ē⏏⏔", "sort_people_by_similarity": "ā¸ˆā¸¸ā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸‡ā¸šā¸¸ā¸„ā¸„ā¸Ĩā¸•ā¸˛ā¸Ąā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸Ĩāš‰ā¸˛ā¸ĸ⏄ā¸Ĩā¸ļ⏇", "sort_recent": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸‡āšƒā¸Ģā¸Ąāšˆā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", "sort_title": "āš„ā¸•āš€ā¸•ā¸´āš‰ā¸Ĩ", "source": "āšā¸Ģā¸Ĩāšˆā¸‡", "stack": "ā¸‹āš‰ā¸­ā¸™", + "stack_action_prompt": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§", "stack_duplicates": "⏙⏺ā¸Ēā¸´āšˆā¸‡ā¸—ā¸ĩāšˆā¸‹āš‰ā¸ŗā¸Ąā¸˛ā¸‹āš‰ā¸­ā¸™ā¸­ā¸ĸā¸šāšˆā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™", "stack_select_one_photo": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ŗā¸šā¸›ā¸Ģā¸Ĩā¸ąā¸ā¸Ģ⏙ā¸ļāšˆā¸‡ā¸Ŗā¸šā¸›ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸šā¸›ā¸—ā¸ĩāšˆā¸‹āš‰ā¸­ā¸™ā¸ā¸ąā¸™ā¸™ā¸ĩāš‰", "stack_selected_photos": "ā¸‹āš‰ā¸­ā¸™ā¸Ŗā¸šā¸›ā¸—ā¸ĩāšˆā¸–ā¸šā¸āš€ā¸Ĩ⏎⏭⏁", + "stacked_assets_count": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸šā¸Ēā¸ˇāšˆā¸­ {count, plural, one {# ⏪⏞ā¸ĸ⏁⏞⏪} other {# ⏪⏞ā¸ĸ⏁⏞⏪}}āšā¸Ĩāš‰ā¸§", "start": "āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™", "start_date": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāš€ā¸Ŗā¸´āšˆā¸Ą", + "start_date_before_end_date": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ā¸•āš‰ā¸­ā¸‡ā¸Ąā¸˛ā¸āšˆā¸­ā¸™ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆā¸Ēā¸´āš‰ā¸™ā¸Ē⏏⏔", "state": "ā¸Ŗā¸ąā¸", "status": "ā¸Ē⏖⏞⏙⏰", + "stop_casting": "ā¸Ģā¸ĸā¸¸ā¸”āšā¸„ā¸Ēā¸•āšŒ", "stop_motion_photo": "ā¸ ā¸˛ā¸žā¸§ā¸ąā¸•ā¸–ā¸¸āš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģ⏧", "stop_photo_sharing": "ā¸Ģā¸ĸā¸¸ā¸”āšā¸Šā¸ŖāšŒā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž?", "stop_photo_sharing_description": "{partner} ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡ā¸Ŗā¸šā¸›ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸”āš‰ā¸­ā¸ĩ⏁", "stop_sharing_photos_with_user": "ā¸Ģā¸ĸā¸¸ā¸”ā¸ā¸˛ā¸Ŗāšā¸Šā¸ŖāšŒā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸ā¸ąā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ā¸™ā¸ĩāš‰", "storage": "ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸š", "storage_label": "āš€ā¸™ā¸ˇāš‰ā¸­ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸š", + "storage_quota": "āš‚ā¸„ā¸§ā¸•āš‰ā¸˛ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸š", "storage_usage": "āšƒā¸Šāš‰āš„ā¸› {used} ⏈⏞⏁ {available}", "submit": "ā¸Ēāšˆā¸‡", + "success": "ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ", "suggestions": "ā¸‚āš‰ā¸­āš€ā¸Ēā¸™ā¸­āšā¸™ā¸°", "sunrise_on_the_beach": "ā¸žā¸Ŗā¸°ā¸­ā¸˛ā¸—ā¸´ā¸•ā¸ĸāšŒā¸‚ā¸ļāš‰ā¸™ā¸šā¸™ā¸Šā¸˛ā¸ĸā¸Ģ⏞⏔", "support": "ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙", - "support_and_feedback": "ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙ & ā¸‚āš‰ā¸­āš€ā¸Ēā¸™ā¸­āšā¸™ā¸°", + "support_and_feedback": "ā¸Šāšˆā¸§ā¸ĸāš€ā¸Ģā¸Ĩā¸ˇā¸­āšā¸Ĩā¸°ā¸‚āš‰ā¸­āš€ā¸Ēā¸™ā¸­āšā¸™ā¸°", "support_third_party_description": "ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ Immich ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸–ā¸šā¸ā¸ˆā¸ąā¸”ā¸—ā¸ŗāšā¸žāš‡ā¸āš€ā¸ā¸ˆāš‚ā¸”ā¸ĸā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏗ā¸ĩāšˆā¸Ēā¸˛ā¸Ą ā¸›ā¸ąā¸ā¸Ģ⏞⏗ā¸ĩāšˆā¸„ā¸¸ā¸“ā¸žā¸šā¸­ā¸˛ā¸ˆāš€ā¸ā¸´ā¸”ā¸ˆā¸˛ā¸āšā¸žāš‡ā¸āš€ā¸ā¸ˆā¸”ā¸ąā¸‡ā¸ā¸Ĩāšˆā¸˛ā¸§ ā¸”ā¸ąā¸‡ā¸™ā¸ąāš‰ā¸™āš‚ā¸›ā¸Ŗā¸”āšā¸ˆāš‰ā¸‡ā¸›ā¸ąā¸ā¸Ģ⏞⏗ā¸ĩāšˆāš€ā¸ā¸´ā¸”ā¸‚ā¸ļāš‰ā¸™ā¸ā¸ąā¸šā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏗ā¸ĩāšˆā¸Ēā¸˛ā¸Ąā¸āšˆā¸­ā¸™āš‚ā¸”ā¸ĸāšƒā¸Šāš‰ā¸Ĩā¸´ā¸‡ā¸āšŒā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡", + "supporter": "ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙", "swap_merge_direction": "ā¸Ēā¸Ĩā¸ąā¸šā¸”āš‰ā¸˛ā¸™ā¸Ŗā¸§ā¸Ą", "sync": "ā¸‹ā¸´ā¸‡ā¸„āšŒ", + "sync_albums": "ā¸‹ā¸´ā¸‡ā¸āšŒā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", + "sync_albums_manual_subtitle": "ā¸‹ā¸´ā¸‡ā¸āšŒā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­āšā¸Ĩā¸°ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āšā¸Ĩāš‰ā¸§ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āš„ā¸›ā¸ĸā¸ąā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸Ēā¸ŗā¸Ŗā¸­ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏗ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸§āš‰", + "sync_status": "ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸‹ā¸´ā¸‡ā¸āšŒ", + "sync_status_subtitle": "ā¸”ā¸šāšā¸Ĩā¸°ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸Ŗā¸°ā¸šā¸šā¸‹ā¸´ā¸‡ā¸āšŒ", + "sync_upload_album_setting_subtitle": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšā¸Ĩā¸°ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸›ā¸ĸā¸ąā¸‡ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸—ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸ā¸šā¸™ Immich", "tag": "āšā¸—āš‡ā¸", "tag_created": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšā¸—āš‡ā¸: {tag}", "tag_not_found_question": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ģā¸˛āšā¸—āš‡ā¸āš„ā¸”āš‰āšƒā¸Šāšˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšā¸—āš‡ā¸āšƒā¸Ģā¸Ąāšˆ", "tag_people": "āšā¸—āš‡ā¸ā¸œā¸šāš‰ā¸„ā¸™", "tag_updated": "āšā¸—āš‡ā¸ā¸—ā¸ĩāšˆā¸–ā¸šā¸ā¸­ā¸ąā¸žāš€ā¸”ā¸•: {tag}", "tags": "āšā¸—āš‡ā¸", + "tap_to_run_job": "āšā¸•ā¸°āš€ā¸žā¸ˇāšˆā¸­ā¸Ŗā¸ąā¸™ā¸‡ā¸˛ā¸™", "template": "āš€ā¸—āš‡ā¸Ąāš€ā¸žā¸Ĩ⏕", "theme": "⏘ā¸ĩā¸Ą", "theme_selection": "ā¸ā¸˛ā¸Ŗāš€ā¸Ĩ⏎⏭⏁⏘ā¸ĩā¸Ą", "theme_selection_description": "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸˜ā¸ĩā¸Ąāšƒā¸Ģāš‰ā¸Ēā¸§āšˆā¸˛ā¸‡ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ąā¸ˇā¸”āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ ā¸­ā¸´ā¸‡ā¸ˆā¸˛ā¸ā¸„āšˆā¸˛ā¸‚ā¸­ā¸‡āš€ā¸šā¸Ŗā¸˛ā¸§āšŒāš€ā¸‹ā¸­ā¸ŖāšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“", "theme_setting_asset_list_storage_indicator_title": "āšā¸Ēā¸”ā¸‡ā¸•ā¸ąā¸§ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸šā¸™ā¸•ā¸˛ā¸Ŗā¸˛ā¸‡ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪", "theme_setting_asset_list_tiles_per_row_title": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗā¸•āšˆā¸­āšā¸–ā¸§ ({count})", + "theme_setting_colorful_interface_title": "ā¸­ā¸´ā¸™āš€ā¸•ā¸­ā¸ŖāšŒāš€ā¸Ÿā¸‹ā¸Ąā¸ĩā¸Ēā¸ĩā¸Ēā¸ąā¸™", "theme_setting_image_viewer_quality_subtitle": "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žā¸‚ā¸­ā¸•ā¸ąā¸§ā¸”ā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔", "theme_setting_image_viewer_quality_title": "ā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žā¸•ā¸ąā¸‡ā¸”ā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "theme_setting_primary_color_title": "ā¸Ēā¸ĩā¸Ģā¸Ĩā¸ąā¸", @@ -1834,24 +2147,32 @@ "theme_setting_theme_subtitle": "āš€ā¸Ĩ⏎⏭⏁⏘ā¸ĩā¸Ąā¸‚ā¸­ā¸‡āšā¸­ā¸ž", "theme_setting_three_stage_loading_subtitle": "ā¸ā¸˛ā¸Ŗāš‚ā¸Ģā¸Ĩā¸”āšā¸šā¸šā¸Ēā¸˛ā¸Ąā¸‚ā¸ąāš‰ā¸™ā¸•ā¸­ā¸™ā¸­ā¸˛ā¸ˆāš€ā¸žā¸´āšˆā¸Ąā¸›ā¸Ŗā¸°ā¸Ēā¸´ā¸—ā¸˜ā¸´ā¸ ā¸˛ā¸žāšƒā¸™ā¸ā¸˛ā¸Ŗāš‚ā¸Ģā¸Ĩā¸”āšā¸•āšˆā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰āš‚ā¸Ģā¸Ĩā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‚āšˆā¸˛ā¸ĸāš€ā¸žā¸´āšˆā¸Ąā¸‚ā¸ļāš‰ā¸™ā¸Ąā¸˛ā¸", "theme_setting_three_stage_loading_title": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸˛ā¸Ąā¸‚ā¸ąāš‰ā¸™ā¸•ā¸­ā¸™", + "then": "ā¸ˆā¸˛ā¸ā¸™ā¸ąāš‰ā¸™", "they_will_be_merged_together": "ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ŗā¸§ā¸Ąāš€ā¸‚āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™", "third_party_resources": "ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗā¸šā¸¸ā¸„ā¸„ā¸Ĩ⏗ā¸ĩāšˆā¸Ēā¸˛ā¸Ą", + "time": "āš€ā¸§ā¸Ĩ⏞", "time_based_memories": "ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆāšā¸˛ā¸•ā¸˛ā¸Ąāš€ā¸§ā¸Ĩ⏞", - "timeline": "ā¸—ā¸˛ā¸Ąāš„ā¸Ĩā¸™āšŒ", + "time_based_memories_duration": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸§ā¸´ā¸™ā¸˛ā¸—ā¸ĩ⏗ā¸ĩāšˆā¸ˆā¸°āšā¸Ēā¸”ā¸‡āšā¸•āšˆā¸Ĩā¸°ā¸ ā¸˛ā¸ž", + "timeline": "āš„ā¸—ā¸ĄāšŒāš„ā¸Ĩā¸™āšŒ", "timezone": "āš€ā¸‚ā¸•āš€ā¸§ā¸Ĩ⏞", "to_archive": "ā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗ", "to_change_password": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", "to_favorite": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”", "to_login": "āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸š", + "to_multi_select": "āš€ā¸žā¸ˇāšˆā¸­āš€ā¸Ĩ⏎⏭⏁ā¸Ģā¸Ĩ⏞ā¸ĸ⏪⏞ā¸ĸ⏁⏞⏪", "to_parent": "āš„ā¸›ā¸ĸā¸ąā¸‡ā¸šā¸™ā¸Ē⏏⏔", + "to_select": "āš€ā¸žā¸ˇāšˆā¸­āš€ā¸Ĩ⏎⏭⏁", "to_trash": "ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", "toggle_settings": "ā¸Ēā¸Ĩā¸ąā¸šā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", + "toggle_theme_description": "ā¸Ēā¸Ĩā¸ąā¸šā¸˜ā¸ĩā¸Ą", "total": "ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "total_usage": "ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸Ŗā¸§ā¸Ą", "trash": "ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", "trash_action_prompt": "{count} ā¸ĸāš‰ā¸˛ā¸ĸāš„ā¸›ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", "trash_all": "ā¸—ā¸´āš‰ā¸‡ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "trash_count": "{count, number} āšƒā¸™ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", + "trash_delete_asset": "ā¸ĸāš‰ā¸˛ā¸ĸāš„ā¸›ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰/ā¸Ĩ⏚ā¸Ēā¸ˇāšˆā¸­", + "trash_emptied": "ā¸—ā¸ŗā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°āšƒā¸Ģāš‰ā¸§āšˆā¸˛ā¸‡āšā¸Ĩāš‰ā¸§", "trash_no_results_message": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸Ģ⏪⏎⏭⏧⏴⏔ā¸ĩāš‚ā¸­ā¸—ā¸ĩāšˆā¸–ā¸šā¸ā¸Ĩ⏚⏈⏰⏭ā¸ĸā¸šāšˆā¸—ā¸ĩāšˆā¸™ā¸ĩāšˆ", "trash_page_delete_all": "ā¸Ĩā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "trash_page_empty_trash_dialog_content": "ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸—ā¸´āš‰ā¸‡ā¸‚ā¸ĸā¸°ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗā¸žā¸§ā¸ā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩ⏚⏈⏞⏁ Immich ⏖⏞⏧⏪", @@ -1860,10 +2181,12 @@ "trash_page_restore_all": "ā¸ā¸šāš‰ā¸„ā¸ˇā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "trash_page_select_assets_btn": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪", "trash_page_title": "⏂ā¸ĸ⏰ ({count})", - "trashed_items_will_be_permanently_deleted_after": "⏪⏞ā¸ĸ⏁⏞⏪⏗ā¸ĩāšˆā¸–ā¸šā¸ā¸Ĩā¸šā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩā¸šā¸—ā¸´āš‰ā¸‡ā¸ ā¸˛ā¸ĸāšƒā¸™ {days, plural, one {# ā¸§ā¸ąā¸™} other {# ā¸§ā¸ąā¸™}}.", + "trashed_items_will_be_permanently_deleted_after": "⏪⏞ā¸ĸ⏁⏞⏪⏗ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸–ā¸ąā¸‡ā¸‚ā¸ĸā¸°ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩ⏚⏭ā¸ĸāšˆā¸˛ā¸‡ā¸–ā¸˛ā¸§ā¸Ŗā¸Ģā¸Ĩā¸ąā¸‡ā¸œāšˆā¸˛ā¸™āš„ā¸› {days, plural, one {# ā¸§ā¸ąā¸™} other {# ā¸§ā¸ąā¸™}}", + "trigger_asset_uploaded": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ˇāšˆā¸­āšā¸Ĩāš‰ā¸§", "troubleshoot": "ā¸ā¸˛ā¸Ŗāšā¸āš‰ā¸›ā¸ąā¸ā¸Ģ⏞", "type": "ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—", "unable_to_change_pin_code": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏪ā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN)", + "unable_to_check_version": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸‚ā¸­ā¸‡āšā¸­ā¸›ā¸Ģā¸Ŗā¸ˇā¸­āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "unable_to_setup_pin_code": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸•ā¸ąāš‰ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN)", "unarchive": "ā¸™ā¸ŗā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗ", "unarchive_action_prompt": "{count} ā¸–ā¸šā¸ā¸™ā¸ŗā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸–ā¸˛ā¸§ā¸Ŗ", @@ -1878,26 +2201,37 @@ "unlimited": "āš„ā¸Ąāšˆā¸ˆā¸ŗā¸ā¸ąā¸”", "unlink_oauth": "ā¸ĸā¸āš€ā¸Ĩā¸´ā¸āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ OAuth", "unlinked_oauth_account": "ā¸ĸā¸āš€ā¸Ĩā¸´ā¸ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ OAuth", + "unmute_memories": "āš€ā¸Ĩā¸´ā¸ā¸›ā¸´ā¸”āš€ā¸Ēā¸ĩā¸ĸā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸Ŗā¸‡ā¸ˆā¸ŗ", "unnamed_album": "ā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąāš„ā¸Ąāšˆā¸Ąā¸ĩā¸Šā¸ˇāšˆā¸­", "unnamed_album_delete_confirmation": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸ˆā¸°ā¸Ĩā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ąā¸™ā¸ĩāš‰ āšƒā¸Šāšˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ ?", "unnamed_share": "āšā¸Šā¸ŖāšŒāšā¸šā¸šāš„ā¸Ąāšˆā¸Ŗā¸°ā¸šā¸¸ā¸Šā¸ˇāšˆā¸­", + "unsaved_change": "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸šā¸ąā¸™ā¸—ā¸ļ⏁", "unselect_all": "ā¸ĸā¸āš€ā¸Ĩā¸´ā¸ā¸ā¸˛ā¸Ŗāš€ā¸Ĩā¸ˇā¸­ā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "unselect_all_in": "ā¸ĸā¸āš€ā¸Ĩā¸´ā¸ā¸ā¸˛ā¸Ŗāš€ā¸Ĩā¸ˇā¸­ā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšƒā¸™ {group}", "unstack": "ā¸Ģā¸ĸā¸¸ā¸”ā¸‹āš‰ā¸­ā¸™", + "unstack_action_prompt": "āš€ā¸Ĩā¸´ā¸ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š {count} ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§", + "unstacked_assets_count": "āš€ā¸Ĩā¸´ā¸ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š {count, plural, one {# ⏪⏞ā¸ĸ⏁⏞⏪} other {# ⏪⏞ā¸ĸ⏁⏞⏪}}āšā¸Ĩāš‰ā¸§", + "unsupported_file_type": "āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš„ā¸Ÿā¸ĨāšŒ {file} āš€ā¸™ā¸ˇāšˆā¸­ā¸‡ā¸ˆā¸˛ā¸ā¸Ŗā¸°ā¸šā¸šāš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸›ā¸Ŗā¸°āš€ā¸ ā¸—āš„ā¸Ÿā¸ĨāšŒ {type} ⏗ā¸ĩāšˆāš„ā¸Ÿā¸ĨāšŒā¸™ā¸ąāš‰ā¸™āšƒā¸Šāš‰", "up_next": "ā¸•āšˆā¸­āš„ā¸›", - "updated_at": "ā¸­ā¸ąā¸žāš€ā¸”ā¸—", + "updated_at": "ā¸­ā¸ąā¸›āš€ā¸”ā¸•āš€ā¸Ąā¸ˇāšˆā¸­", "updated_password": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸Ĩāš‰ā¸§", "upload": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔", "upload_concurrency": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸ā¸ąā¸™", "upload_details": "⏪⏞ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔", - "upload_dialog_info": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸žāš‚ā¸Ģā¸Ĩā¸”ā¸—ā¸Ŗā¸ąā¸žā¸ĸā¸˛ā¸ā¸Ŗā¸”ā¸ąā¸‡ā¸ā¸Ĩāšˆā¸˛ā¸§ā¸šā¸™āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", - "upload_dialog_title": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪", - "upload_status_duplicates": "ā¸Ŗā¸§ā¸Ąāš€ā¸‚āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™", + "upload_dialog_info": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸›ā¸ĸā¸ąā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", + "upload_dialog_title": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ˇāšˆā¸­", + "upload_errors": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™āš‚ā¸”ā¸ĸā¸Ąā¸ĩā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ {count, plural, one {# ⏪⏞ā¸ĸ⏁⏞⏪} other {# ⏪⏞ā¸ĸ⏁⏞⏪}} ⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Šā¸Ģā¸™āš‰ā¸˛āš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸šā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āšƒā¸Ģā¸Ąāšˆ", + "upload_finished": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™", + "upload_progress": "ā¸„ā¸‡āš€ā¸Ģā¸Ĩ⏎⏭ {remaining, number} - ā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩāšā¸Ĩāš‰ā¸§ {processed, number}/{total, number}", + "upload_skipped_duplicates": "ā¸‚āš‰ā¸˛ā¸Ąā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆā¸‹āš‰ā¸ŗā¸ā¸ąā¸™ {count, plural, one {# ⏪⏞ā¸ĸ⏁⏞⏪} other {# ⏪⏞ā¸ĸ⏁⏞⏪}}āšā¸Ĩāš‰ā¸§", + "upload_status_duplicates": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗā¸‹āš‰ā¸ŗ", "upload_status_errors": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", "upload_status_uploaded": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āšā¸Ĩāš‰ā¸§", - "upload_success": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ, ⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Šā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰āšƒā¸Ģā¸Ąāšˆā¸„ā¸¸ā¸“ā¸ˆā¸°āš€ā¸Ģāš‡ā¸™ā¸Ēā¸ˇāšˆā¸­ā¸—ā¸ĩāšˆāš€ā¸žā¸´āšˆā¸Ąā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", - "uploading": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸­ā¸ąā¸žāš‚ā¸Ģā¸Ĩ⏔", + "upload_success": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ ⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Šā¸Ģā¸™āš‰ā¸˛āš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸šā¸Ēā¸ˇāšˆā¸­āšƒā¸Ģā¸Ąāšˆā¸—ā¸ĩāšˆā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔", + "upload_to_immich": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš„ā¸›ā¸ĸā¸ąā¸‡ Immich ({count})", + "uploading": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔", "uploading_media": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔ā¸Ēā¸ˇāšˆā¸­", + "url": "URL", "usage": "ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "use_biometric": "āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ēā¸šā¸ˆā¸™āšŒā¸­ā¸ąā¸•ā¸Ĩā¸ąā¸ā¸Šā¸“āšŒ", "use_current_connection": "āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™", @@ -1905,6 +2239,7 @@ "user": "ā¸œā¸šāš‰āšƒā¸Šāš‰", "user_has_been_deleted": "ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸Ŗā¸˛ā¸ĸ⏙ā¸ĩāš‰ā¸–ā¸šā¸ā¸Ĩā¸šāš„ā¸›āšā¸Ĩāš‰ā¸§", "user_id": "āš„ā¸­ā¸”ā¸ĩā¸œā¸šāš‰āšƒā¸Šāš‰", + "user_liked": "{user} āš„ā¸”āš‰ā¸–ā¸šā¸āšƒā¸ˆ{type, select, photo {ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸™ā¸ĩāš‰} video {⏧⏴⏔ā¸ĩāš‚ā¸­ā¸™ā¸ĩāš‰} asset {ā¸Ēā¸ˇāšˆā¸­ā¸™ā¸ĩāš‰} other {ā¸Ēā¸´āšˆā¸‡ā¸™ā¸ĩāš‰}}", "user_pin_code_settings": "⏪ā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN)", "user_pin_code_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸Ŗā¸Ģā¸ąā¸Ēā¸›ā¸Ŗā¸°ā¸ˆā¸ŗā¸•ā¸ąā¸§ (PIN)", "user_privacy": "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§ā¸œā¸šāš‰āšƒā¸Šāš‰", @@ -1923,7 +2258,7 @@ "variables": "ā¸•ā¸ąā¸§āšā¸›ā¸Ŗ", "version": "ā¸Ŗā¸¸āšˆā¸™", "version_announcement_closing": "āš€ā¸žā¸ˇāšˆā¸­ā¸™ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ ā¸­āš€ā¸Ĩāš‡ā¸ā¸‹āšŒ", - "version_announcement_message": "ā¸Ēā¸§ā¸ąā¸Ē⏔ā¸ĩ! Immich āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āšƒā¸Ģā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Ģāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āšā¸Ĩāš‰ā¸§ āš‚ā¸›ā¸Ŗā¸”āšƒā¸Šāš‰āš€ā¸§ā¸Ĩ⏞ā¸Ēā¸ąā¸ā¸„ā¸Ŗā¸šāšˆāš€ā¸žā¸ˇāšˆā¸­ā¸­āšˆā¸˛ā¸™ ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ģā¸•ā¸¸ā¸ā¸˛ā¸Ŗāš€ā¸œā¸ĸāšā¸žā¸Ŗāšˆ āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•āšā¸Ĩāš‰ā¸§ āš€ā¸žā¸ˇāšˆā¸­ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸ā¸ŗā¸Ģā¸™ā¸”ā¸„āšˆā¸˛ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ āš‚ā¸”ā¸ĸāš€ā¸‰ā¸žā¸˛ā¸°ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸ĸā¸´āšˆā¸‡ā¸Ģā¸˛ā¸ā¸„ā¸¸ā¸“āšƒā¸Šāš‰ WatchTower ā¸Ģ⏪⏎⏭⏁ā¸Ĩāš„ā¸ā¸­ā¸ˇāšˆā¸™āš† ⏗ā¸ĩāšˆā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸­ā¸´ā¸™ā¸Ēāšā¸•ā¸™ā¸‹āšŒ Immich ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", + "version_announcement_message": "ā¸Ēā¸§ā¸ąā¸Ē⏔ā¸ĩ! Immich āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āšƒā¸Ģā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Ģāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āšā¸Ĩāš‰ā¸§ āš‚ā¸›ā¸Ŗā¸”āšƒā¸Šāš‰āš€ā¸§ā¸Ĩ⏞ā¸Ēā¸ąā¸ā¸„ā¸Ŗā¸šāšˆāš€ā¸žā¸ˇāšˆā¸­ā¸­āšˆā¸˛ā¸™ ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ģā¸•ā¸¸ā¸ā¸˛ā¸Ŗāš€ā¸œā¸ĸāšā¸žā¸Ŗāšˆ āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸”āš‰ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•āšā¸Ĩāš‰ā¸§ āš€ā¸žā¸ˇāšˆā¸­ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸ā¸ŗā¸Ģā¸™ā¸”ā¸„āšˆā¸˛ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔ āš‚ā¸”ā¸ĸāš€ā¸‰ā¸žā¸˛ā¸°ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸ĸā¸´āšˆā¸‡ā¸Ģā¸˛ā¸ā¸„ā¸¸ā¸“āšƒā¸Šāš‰ WatchTower ā¸Ģ⏪⏎⏭⏁ā¸Ĩāš„ā¸ā¸­ā¸ˇāšˆā¸™ āš† ⏗ā¸ĩāšˆā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸­ā¸´ā¸™ā¸Ēāšā¸•ā¸™ā¸‹āšŒ Immich ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "version_history": "ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇", "version_history_item": "ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ {version} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ {date}", "video": "⏧⏴⏔ā¸ĩāš‚ā¸­", @@ -1935,10 +2270,12 @@ "view_album": "ā¸”ā¸šā¸­ā¸ąā¸Ĩā¸šā¸ąāš‰ā¸Ą", "view_all": "ā¸”ā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "view_all_users": "ā¸”ā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", + "view_asset_owners": "ā¸”ā¸šāš€ā¸ˆāš‰ā¸˛ā¸‚ā¸­ā¸‡ā¸Ēā¸ˇāšˆā¸­", "view_details": "ā¸”ā¸šā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸ⏔", "view_in_timeline": "ā¸”ā¸šāš„ā¸—ā¸ĄāšŒāš„ā¸Ĩā¸™āšŒ", "view_link": "ā¸”ā¸šā¸Ĩā¸´ā¸‡ā¸āšŒ", "view_links": "ā¸”ā¸šā¸Ĩā¸´ā¸‡ā¸āšŒ", + "view_name": "ā¸”ā¸š", "view_next_asset": "ā¸”ā¸šā¸Ēā¸ˇāšˆā¸­ā¸–ā¸ąā¸”āš„ā¸›", "view_previous_asset": "ā¸”ā¸šā¸Ēā¸ˇāšˆā¸­ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛", "view_qr_code": "ā¸”ā¸šā¸„ā¸´ā¸§ā¸­ā¸˛ā¸ŖāšŒāš‚ā¸„āš‰ā¸”", @@ -1948,18 +2285,23 @@ "viewer_stack_use_as_main_asset": "āšƒā¸Šāš‰āš€ā¸›āš‡ā¸™ā¸—ā¸Ŗā¸ąā¸žā¸ĸ⏞⏁⏪ā¸Ģā¸Ĩā¸ąā¸", "viewer_unstack": "ā¸Ģā¸ĸā¸¸ā¸”ā¸‹āš‰ā¸­ā¸™", "visibility_changed": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩā¸‡ā¸ā¸˛ā¸Ŗā¸Ąā¸­ā¸‡āš€ā¸Ģāš‡ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸š {count, plural, one {# ā¸šā¸¸ā¸„ā¸„ā¸Ĩ} other {# ā¸šā¸¸ā¸„ā¸„ā¸Ĩ}}", + "visual": "āš€ā¸Ģāš‡ā¸™ā¸ ā¸˛ā¸ž", + "visual_builder": "ā¸•ā¸ąā¸§ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡āšā¸šā¸šāš€ā¸Ģāš‡ā¸™ā¸ ā¸˛ā¸ž", "waiting": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ŗā¸­", + "waiting_count": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ŗā¸­: {count}", "warning": "ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™", "week": "ā¸Ēā¸ąā¸›ā¸”ā¸˛ā¸ĢāšŒ", "welcome": "ā¸ĸ⏴⏙⏔ā¸ĩā¸•āš‰ā¸­ā¸™ā¸Ŗā¸ąā¸š", "welcome_to_immich": "ā¸ĸ⏴⏙⏔ā¸ĩā¸•āš‰ā¸­ā¸™ā¸Ŗā¸ąā¸šā¸Ēā¸šāšˆ immich", "width": "ā¸„ā¸§ā¸˛ā¸Ąā¸ā¸§āš‰ā¸˛ā¸‡", "wifi_name": "ā¸Šā¸ˇāšˆā¸­ Wi-Fi", + "workflow_navigation_prompt": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸­ā¸āš‚ā¸”ā¸ĸ⏗ā¸ĩāšˆā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", "wrong_pin_code": "⏪ā¸Ģā¸ąā¸Ē PIN āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", "year": "⏛ā¸ĩ", "years_ago": "{years, plural, one {# ⏛ā¸ĩ} other {# ⏛ā¸ĩ}} ⏗ā¸ĩāšˆāšā¸Ĩāš‰ā¸§", "yes": "āšƒā¸Šāšˆ", "you_dont_have_any_shared_links": "ā¸„ā¸¸ā¸“āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸Ąā¸ĩā¸Ĩā¸´ā¸‡ā¸āšŒā¸—ā¸ĩāšˆāšā¸Šā¸ŖāšŒ", "your_wifi_name": "ā¸Šā¸ˇāšˆā¸­ Wi-Fi", - "zoom_image": "ā¸‹ā¸šā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž" + "zoom_image": "ā¸‹ā¸šā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "zoom_to_bounds": "ā¸‹ā¸šā¸Ąāš„ā¸›ā¸ĸā¸ąā¸‡ā¸‚ā¸­ā¸šāš€ā¸‚ā¸•" } diff --git a/i18n/tr.json b/i18n/tr.json index 1331621ad9..66813d7d9d 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -243,7 +243,7 @@ "nightly_tasks_settings_description": "Gece gÃļrevlerini yÃļnet", "nightly_tasks_start_time_setting": "BaşlangÄąÃ§ saati", "nightly_tasks_start_time_setting_description": "Sunucunun gece gÃļrevlerini çalÄąÅŸtÄąrmaya başladığı saat", - "nightly_tasks_sync_quota_usage_setting": "Kota kullanÄąmÄąnÄą senkronize et", + "nightly_tasks_sync_quota_usage_setting": "Kota kullanÄąmÄąnÄą eşitle", "nightly_tasks_sync_quota_usage_setting_description": "Mevcut kullanÄąma gÃļre kullanÄącÄą depolama kotasÄąnÄą gÃŧncelle", "no_paths_added": "Yol eklenmedi", "no_pattern_added": "Desen eklenmedi", @@ -311,7 +311,7 @@ "search_jobs": "GÃļrevler araâ€Ļ", "send_welcome_email": "Hoş geldin e-postasÄą gÃļnder", "server_external_domain_settings": "DÄąÅŸ domain", - "server_external_domain_settings_description": "PaylaÅŸÄąlan fotoğraflar için domain, http(s):// dahil", + "server_external_domain_settings_description": "Harici bağlantÄąlar için kullanÄąlan alan adÄą", "server_public_users": "Harici KullanÄącÄąlar", "server_public_users_description": "PaylaÅŸÄąlan albÃŧmlere bir kullanÄącÄą eklenirken tÃŧm kullanÄącÄąlar (ad ve e-posta) listelenir. Devre dÄąÅŸÄą bÄąrakÄąldığında, kullanÄącÄą listesi yalnÄązca yÃļnetici kullanÄącÄąlar tarafÄąndan kullanÄąlabilir.", "server_settings": "Sunucu AyarlarÄą", @@ -321,7 +321,7 @@ "server_welcome_message_description": "Giriş sayfasÄąnda gÃļsterilen mesaj.", "settings_page_description": "YÃļnetici ayarlar sayfasÄą", "sidecar_job": "Ek dosya ile taÅŸÄąnan metadata", - "sidecar_job_description": "Dosya sisteminden sidecar meta verilerini keşfedin veya senkronize edin", + "sidecar_job_description": "Dosya sisteminden sidecar meta verilerini keşfedin veya eşitleyin", "slideshow_duration_description": "Her fotoğrafÄąn kaç saniye gÃļrÃŧntÃŧleneceği", "smart_search_job_description": "AkÄąllÄą aramayÄą desteklemek için tÃŧm Ãļğelerde makine Ãļğrenmesini çalÄąÅŸtÄąrÄąn", "storage_template_date_time_description": "Öğenin oluşturulma zaman damgasÄą, tarih ve saat bilgisi için kullanÄąlÄąr", @@ -334,7 +334,7 @@ "storage_template_migration_info": "Depolama şablonu tÃŧm dosya uzantÄąlarÄąnÄą kÃŧçÃŧk harfe dÃļnÃŧştÃŧrecektir. Şablon ayarlarÄąndaki değişiklikler sadece yeni Ãļğelere uygulanacak. Şablon ayarlarÄąnÄą daha Ãļnce yÃŧklenmiş olan Ãļğelere uygulamak için {job} çalÄąÅŸtÄąrÄąn.", "storage_template_migration_job": "Depolama Adreslerini Değiştirme GÃļrevi", "storage_template_more_details": "Bu Ãļzellik hakkÄąnda daha fazla bilgi için, Depolama Şablonu ve onun etkileri kÄąsmÄąna bakÄąn", - "storage_template_onboarding_description_v2": "Etkinleştirildiğinde, bu Ãļzellik dosyalarÄą kullanÄącÄą tanÄąmlÄą bir şablona gÃļre otomatik olarak organize eder. Daha fazla bilgi için lÃŧtfen belgelere bakÄąn.", + "storage_template_onboarding_description_v2": "Etkinleştirildiğinde, bu Ãļzellik dosyalarÄą kullanÄącÄą tanÄąmlÄą bir şablona gÃļre otomatik olarak dÃŧzenleyecektir. Daha fazla bilgi için lÃŧtfen belgelere bakÄąn.", "storage_template_path_length": "Tahmini dosya adresi uzunluğu: {length, number}/{limit, number}", "storage_template_settings": "Depolama Şablonu", "storage_template_settings_description": "YÃŧklenen Ãļğenin ismini ve klasÃļr yapÄąsÄąnÄą dÃŧzenle", @@ -359,7 +359,7 @@ "transcoding_acceleration_api": "HÄązlandÄąrma API", "transcoding_acceleration_api_description": "Video formatÄą çevriminde kullanÄąlacak API. Bu ayara 'mÃŧmkÃŧn olduğunca' uyulmaktadÄąr; seçilen API'da sorun Ã§Äąkarsa yazÄąlÄąm tabanlÄą çevirime dÃļnÃŧlÃŧr. VP9 donanÄąmÄąnÄąza bağlÄą olarak çalÄąÅŸmayabilir.", "transcoding_acceleration_nvenc": "NVENC (NVIDIA GPU gerektirir)", - "transcoding_acceleration_qsv": "HÄązlÄą Senkronizasyon (7. nesil Intel işlemci veya Ãŧzeri gerektirir)", + "transcoding_acceleration_qsv": "HÄązlÄą Eşitleme (7. nesil Intel işlemci veya Ãŧzeri gerektirir)", "transcoding_acceleration_rkmpp": "RKMPP (Sadece Rockchip SOC'ler)", "transcoding_acceleration_vaapi": "VAAPI", "transcoding_accepted_audio_codecs": "Kabul edilen ses kodekleri", @@ -372,7 +372,7 @@ "transcoding_audio_codec": "Ses kodek", "transcoding_audio_codec_description": "En yÃŧksek kaliteye sahip olan Opus, fakat eski cihaz ve yazÄąlÄąmlarla uyumluluğu daha az.", "transcoding_bitrate_description": "Videolar maksimum bir oranÄąndan yÃŧrksek ya da kabul edilir bir formatta değil", - "transcoding_codecs_learn_more": "Buradaki terminolojiyi Ãļğrenmek için FFmpeg dokÃŧmantasyonlarÄąna bakabilirsiniz: H.264, HEVC ve VP9.", + "transcoding_codecs_learn_more": "Burada kullanÄąlan terminoloji hakkÄąnda daha fazla bilgi edinmek için, H.264 codec, HEVC codec ve VP9 codec ile ilgili FFmpeg belgelerine bakÄąn.", "transcoding_constant_quality_mode": "Sabit kalite modu", "transcoding_constant_quality_mode_description": "ICQ, CQP'den daha iyidir, ancak bazÄą donanÄąm hÄązlandÄąrma cihazlarÄą bu modu desteklemez. Bu seçeneğin ayarlanmasÄą, kalite tabanlÄą kodlama kullanÄąrken belirtilen modu tercih eder. ICQ'yu desteklemediği için NVENC tarafÄąndan gÃļz ardÄą edilir.", "transcoding_constant_rate_factor": "Sabit oran faktÃļrÃŧ (-crf)", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "Ton-haritalama", "transcoding_tone_mapping_description": "HDR videolarÄąn SDR'ye dÃļnÃŧştÃŧrÃŧlÃŧrken gÃļrÃŧnÃŧmÃŧnÃŧ korumayÄą amaçlar. Her algoritma renk, detay ve parlaklÄąk için farklÄą dengeleme yapar. Hable detaylarÄą korur, Mobius renkleri korur ve Reinhard parlaklığı korur.", "transcoding_transcode_policy": "DÃļnÃŧştÃŧrme (çevirme) politikasÄą", - "transcoding_transcode_policy_description": "Bir videonun ne zaman kod dÃļnÃŧştÃŧrÃŧlmesi gerektiğine ilişkin ilke. DÃļnÃŧştÃŧrme devre dÄąÅŸÄą bÄąrakÄąlmadığı sÃŧrece HDR videolar her zaman dÃļnÃŧştÃŧrÃŧlÃŧr.", + "transcoding_transcode_policy_description": "Video dÃļnÃŧştÃŧrme işlemi zamanÄąna ilişkin ilke. HDR videolar ve YUV 4:2:0 dÄąÅŸÄąnda bir piksel biçimine sahip videolar her zaman (dÃļnÃŧştÃŧrme devre dÄąÅŸÄą bÄąrakÄąlmadığı sÃŧrece) dÃļnÃŧştÃŧrÃŧlecektir.", "transcoding_two_pass_encoding": "İki geçişli kodlama", "transcoding_two_pass_encoding_setting_description": "Daha iyi kodlanmÄąÅŸ videolar Ãŧretmek için iki geçişte kod dÃļnÃŧştÃŧrÃŧn. Maksimum bit hÄązÄą etkinleştirildiğinde (H.264 ve HEVC ile çalÄąÅŸmasÄą için gereklidir), bu mod maksimum bit hÄązÄąna dayalÄą bir bit hÄązÄą aralığı kullanÄąr ve CRF'yi yok sayar. VP9 için, maksimum bit hÄązÄą devre dÄąÅŸÄą bÄąrakÄąlÄąrsa CRF kullanÄąlabilir.", "transcoding_video_codec": "Video kodlayÄącÄą", @@ -454,8 +454,8 @@ "advanced_settings_clear_image_cache": "GÃļrsel Önbelleğini Temizle", "advanced_settings_clear_image_cache_error": "GÃļrsel Ãļnbelleği temizlenemedi", "advanced_settings_clear_image_cache_success": "BaşarÄąyla temizlendi: {size}", - "advanced_settings_enable_alternate_media_filter_subtitle": "Bu seçeneği, senkronizasyon sÄąrasÄąnda medyayÄą alternatif ÃļlçÃŧtlere gÃļre filtrelemek için kullanÄąn. UygulamanÄąn tÃŧm albÃŧmleri algÄąlamasÄąnda sorun yaÅŸÄąyorsanÄąz yalnÄązca bu durumda deneyin.", - "advanced_settings_enable_alternate_media_filter_title": "[DENEYSEL] Alternatif cihaz albÃŧm senkronizasyon filtresini kullan", + "advanced_settings_enable_alternate_media_filter_subtitle": "Bu seçeneği, eşitleme sÄąrasÄąnda medyayÄą alternatif ÃļlçÃŧtlere gÃļre filtrelemek için kullanÄąn. UygulamanÄąn tÃŧm albÃŧmleri algÄąlamasÄąnda sorun yaÅŸÄąyorsanÄąz yalnÄązca bu durumda deneyin.", + "advanced_settings_enable_alternate_media_filter_title": "[DENEYSEL] Alternatif cihaz albÃŧm eşitleme filtresini kullan", "advanced_settings_log_level_title": "GÃŧnlÃŧk seviyesi: {level}", "advanced_settings_prefer_remote_subtitle": "BazÄą cihazlar yerel Ãļğelerden kÃŧçÃŧk resimleri yÃŧklerken çok yavaş çalÄąÅŸÄąr. Bunun yerine uzak gÃļrÃŧntÃŧleri yÃŧklemek için bu ayarÄą etkinleştirin.", "advanced_settings_prefer_remote_title": "Uzak gÃļrÃŧntÃŧleri tercih et", @@ -466,7 +466,7 @@ "advanced_settings_self_signed_ssl_subtitle": "Sunucu uç noktasÄą için SSL sertifika doğrulamasÄąnÄą atlar. Kendinden imzalÄą sertifikalar için gereklidir.", "advanced_settings_self_signed_ssl_title": "Kendinden imzalÄą SSL sertifikalarÄąna izin ver [DENEYSEL]", "advanced_settings_sync_remote_deletions_subtitle": "Web Ãŧzerinde işlem yapÄąldığında, bu aygÄąttaki Ãļğeyi otomatik olarak sil veya geri yÃŧkle", - "advanced_settings_sync_remote_deletions_title": "Uzaktan silme işlemlerini senkronize et [DENEYSEL]", + "advanced_settings_sync_remote_deletions_title": "Uzaktan silme işlemlerini eşitle [DENEYSEL]", "advanced_settings_tile_subtitle": "Gelişmiş kullanÄącÄą ayarlarÄą", "advanced_settings_troubleshooting_subtitle": "Sorun giderme için ek Ãļzellikleri etkinleştirin", "advanced_settings_troubleshooting_title": "Sorun Giderme", @@ -626,7 +626,7 @@ "backup_album_selection_page_select_albums": "AlbÃŧmleri seç", "backup_album_selection_page_selection_info": "Seçim Bilgileri", "backup_album_selection_page_total_assets": "Toplam eşsiz Ãļğeler", - "backup_albums_sync": "AlbÃŧm Yedekleme Senkronizasyonu", + "backup_albums_sync": "AlbÃŧm Yedeklerini Eşitleme", "backup_all": "TÃŧmÃŧ", "backup_background_service_backup_failed_message": "Yedekleme başarÄąsÄąz. Tekrar deneniyorâ€Ļ", "backup_background_service_complete_notification": "Öğe yedekleme tamamlandÄą", @@ -677,7 +677,7 @@ "backup_controller_page_turn_on": "Ön planda yedeklemeyi aç", "backup_controller_page_uploading_file_info": "Dosya bilgisi yÃŧkleniyor", "backup_err_only_album": "Tek albÃŧm kaldÄąrÄąlamaz", - "backup_error_sync_failed": "Senkronizasyon başarÄąsÄąz. Yedekleme işlemi gerçekleştirilemiyor.", + "backup_error_sync_failed": "Eşitleme başarÄąsÄąz. Yedekleme işlemi gerçekleştirilemiyor.", "backup_info_card_assets": "Ãļğeler", "backup_manual_cancelled": "İptal Edildi", "backup_manual_in_progress": "YÃŧkleme halihazÄąrda devam ediyor. Bir sÃŧre sonra deneyin", @@ -794,6 +794,11 @@ "color": "Renk", "color_theme": "Renk temasÄą", "command": "Komut", + "command_palette_prompt": "SayfalarÄą, eylemleri veya komutlarÄą hÄązlÄąca bulun", + "command_palette_to_close": "kapatmak için", + "command_palette_to_navigate": "girmek için", + "command_palette_to_select": "seçmek için", + "command_palette_to_show_all": "tÃŧmÃŧnÃŧ gÃļster", "comment_deleted": "Yorum silindi", "comment_options": "Yorum seçenekleri", "comments_and_likes": "Yorumlar & beğeniler", @@ -866,8 +871,8 @@ "current_pin_code": "Mevcut PIN kodu", "current_server_address": "Mevcut sunucu adresi", "custom_date": "Özel tarih", - "custom_locale": "Özel Yerel Ayar", - "custom_locale_description": "Tarihleri ve sayÄąlarÄą dile ve bÃļlgeye gÃļre biçimlendirin", + "custom_locale": "Özel yerel ayar", + "custom_locale_description": "Tarih, saat ve sayÄąlar seçilen dil ve bÃļlgeye gÃļre biçimlendirilsin", "custom_url": "Özel URL", "cutoff_date_description": "Son dÃļneme ait fotoğraflarÄą tut â€Ļ", "cutoff_day": "{count, plural, one {gÃŧn} other {gÃŧn}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "EXIF veri sayÄąsÄą", "deduplication_info": "Tekilleştirme Bilgileri", "deduplication_info_description": "Öğeleri otomatik olarak Ãļnceden seçmek ve yinelenenleri toplu olarak kaldÄąrmak için şunlara bakÄąyoruz:", - "default_locale": "VarsayÄąlan Yerel Ayar", - "default_locale_description": "Tarihleri ve sayÄąlarÄą tarayÄącÄąnÄązÄąn yerel ayarÄąna gÃļre biçimlendirin", "delete": "Sil", "delete_action_confirmation_message": "Bu Ãļğeyi silmek istediğinizden emin misiniz? Bu işlem, Ãļğeyi sunucunun çÃļp kutusuna taÅŸÄąyacak ve yerel olarak silmek isteyip istemediğinizi soracaktÄąr", "delete_action_prompt": "{count} silindi", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "DÃŧzenlemeler başarÄąyla uygulandÄą", "editor_flip_horizontal": "Yatay çevir", "editor_flip_vertical": "Dikey çevir", + "editor_handle_corner": "{corner, select, top_left {Sol-Ãŧst} top_right {Sağ-Ãŧst} bottom_left {Sol-alt} bottom_right {Sağ-alt} other {A}} kÃļşe tutacağı", + "editor_handle_edge": "{edge, select, top {Üst} bottom {Alt} left {Sol} right {Sağ} other {An}} kenar tutacağı", "editor_orientation": "YÃļnlendirme", "editor_reset_all_changes": "Değişiklikleri sÄąfÄąrla", "editor_rotate_left": "90° Saat yÃļnÃŧnÃŧn tersine çevir", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "Bildirim durumu gÃŧncellenemedi", "incorrect_email_or_password": "YanlÄąÅŸ e-posta veya şifre", "library_folder_already_exists": "Bu içe aktarma yolu zaten mevcut.", + "page_not_found": "Sayfa bulunamadÄą", "paths_validation_failed": "{paths, plural, one {# Yol} other {# Yollar}} doğrulanamadÄą", "profile_picture_transparent_pixels": "Profil resimleri şeffaf piksele sahip olamaz. LÃŧtfen resme yakÄąnlaştÄąrÄąn ve/veya resmi hareket ettirin.", "quota_higher_than_disk_size": "Disk boyutundan daha yÃŧksek bir kota belirlediniz", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "KİŞİLER", "exif_bottom_sheet_person_add_person": "İsim ekle", "exit_slideshow": "Slayt gÃļsterisinden Ã§Äąk", + "expand": "Genişlet", "expand_all": "Hepsini genişlet", "experimental_settings_new_asset_list_subtitle": "ÇalÄąÅŸmalar devam ediyor", "experimental_settings_new_asset_list_title": "Deneysel fotoğraf ÄązgarasÄąnÄą etkinleştir", @@ -1212,6 +1219,7 @@ "filter_description": "Hedef Ãļğeleri filtreleme koşullarÄą", "filter_people": "Kişileri filtrele", "filter_places": "Yerleri sÃŧz", + "filter_tags": "SÃŧzgeç etiketleri", "filters": "Filtreler", "find_them_fast": "AdlarÄąna gÃļre hÄązlÄąca bul", "first": "İlk", @@ -1330,9 +1338,9 @@ "invite_people": "Kişileri Davet Et", "invite_to_album": "AlbÃŧme davet et", "ios_debug_info_fetch_ran_at": "Veri çekme {dateTime} tarihinde çalÄąÅŸtÄąrÄąldÄą", - "ios_debug_info_last_sync_at": "Son senkronizasyon {dateTime}", + "ios_debug_info_last_sync_at": "Son eşitleme {dateTime}", "ios_debug_info_no_processes_queued": "Hiçbir arka plan işlemi kuyruğa alÄąnmadÄą", - "ios_debug_info_no_sync_yet": "HenÃŧz hiçbir arka plan senkronizasyon gÃļrevi çalÄąÅŸtÄąrÄąlmadÄą", + "ios_debug_info_no_sync_yet": "HenÃŧz hiçbir arka plan eşitleme gÃļrevi çalÄąÅŸtÄąrÄąlmadÄą", "ios_debug_info_processes_queued": "{count, plural, one {{count} arka plan işlemi kuyruğa alÄąndÄą} other {{count} arka plan işlemi kuyruğa alÄąndÄą}}", "ios_debug_info_processing_ran_at": "İşleme {dateTime} tarihinde çalÄąÅŸtÄąrÄąldÄą", "items_count": "{count, plural, one {# Öğe} other {# Öğe}}", @@ -1642,13 +1650,14 @@ "online": "Çevrimiçi", "only_favorites": "Sadece favoriler", "open": "Aç", + "open_calendar": "Takvimi aç", "open_in_map_view": "Harita gÃļrÃŧnÃŧmÃŧnde aç", "open_in_openstreetmap": "OpenStreetMap'te Aç", "open_the_search_filters": "Arama filtrelerini aç", "options": "Seçenekler", "or": "veya", "organize_into_albums": "AlbÃŧmler halinde dÃŧzenle", - "organize_into_albums_description": "Mevcut fotoğraflarÄą geçerli senkronizasyon ayarlarÄąnÄą kullanarak albÃŧmlere yerleştirin", + "organize_into_albums_description": "Mevcut fotoğraflarÄą geçerli eşitleme ayarlarÄąnÄą kullanarak albÃŧmlere yerleştirin", "organize_your_library": "KÃŧtÃŧphanenizi dÃŧzenleyin", "original": "orijinal", "other": "Diğer", @@ -1783,7 +1792,7 @@ "purchase_license_subtitle": "Immich'i satÄąn alarak devam eden gelişimini destekleyin", "purchase_lifetime_description": "ÖmÃŧr boyu geçerli", "purchase_option_title": "SATIN ALMA SEÇENEKLERİ", - "purchase_panel_info_1": "Immich'in gelişimi zaman ve çaba gerektiriyor ve tam zamanlÄą geliştiricilerimiz var. AmacÄąmÄąz, aÃ§Äąk kaynak yazÄąlÄąmÄą sÃŧrdÃŧrÃŧlebilir bir gelir kaynağı haline getirmek.", + "purchase_panel_info_1": "Immich'i geliştirmek çok zaman ve çaba gerektiriyor ve mÃŧmkÃŧn olan en iyi hale getirmek için tam zamanlÄą mÃŧhendislerimiz bu konuda çalÄąÅŸÄąyor. Misyonumuz, aÃ§Äąk kaynaklÄą yazÄąlÄąm ve etik iş uygulamalarÄąnÄąn geliştiriciler için sÃŧrdÃŧrÃŧlebilir bir gelir kaynağı haline gelmesini sağlamak ve sÃļmÃŧrÃŧcÃŧ bulut hizmetlerine gerçek alternatifler sunan, gizliliğe saygÄąlÄą bir ekosistem yaratmaktÄąr.", "purchase_panel_info_2": "Ücretli Ãļzellikler (paywall) eklememeye kararlÄą olduğumuz için, bu satÄąn alma işlemi Immich'te ek işlevsellik sağlamaz. Immich'in sÃŧrekli gelişimini desteklemek için sizin gibi kullanÄącÄąlara gÃŧveniyoruz.", "purchase_panel_title": "Projeyi destekleyin", "purchase_per_server": "Sunucu baÅŸÄąna", @@ -1801,9 +1810,8 @@ "rate_asset": "Öğeyi Derecelendir", "rating": "Derecelendirme", "rating_clear": "Derecelendirmeyi temizle", - "rating_count": "{count, plural, one {# yÄąldÄąz} other {# yÄąldÄąz}}", + "rating_count": "{count, plural, =0 {Derecelendirilmemiş} one {# yÄąldÄąz} other {# yÄąldÄąz}}", "rating_description": "EXIF derecelendirmesini bilgi panelinde gÃļster", - "rating_set": "Derecelendirme {rating, plural, one {# yÄąldÄąz} other {# yÄąldÄąz}} olarak ayarlandÄą", "reaction_options": "Tepki seçenekleri", "read_changelog": "Değişiklik gÃŧnlÃŧğÃŧnÃŧ oku", "readonly_mode_disabled": "Salt okunur mod devre dÄąÅŸÄą", @@ -1875,7 +1883,10 @@ "reset_pin_code_success": "PIN kodu başarÄąyla sÄąfÄąrlandÄą", "reset_pin_code_with_password": "PIN kodunuzu her zaman şifrenizle sÄąfÄąrlayabilirsiniz", "reset_sqlite": "SQLite VeritabanÄąnÄą SÄąfÄąrla", - "reset_sqlite_confirmation": "SQLite veritabanÄąnÄą sÄąfÄąrlamak istediğinizden emin misiniz? Verileri yeniden senkronize etmek için oturumu kapatÄąp tekrar giriş yapmanÄąz gerekecek", + "reset_sqlite_clear_app_data": "Verileri temizle", + "reset_sqlite_confirmation": "Uygulama verilerini silmek istediğinizden emin misiniz? Bu işlem tÃŧm ayarlarÄą silecektir ve oturumunuz kapatÄąlacaktÄąr.", + "reset_sqlite_confirmation_note": "Not: Temizleme işleminden sonra uygulamayÄą yeniden başlatmanÄąz gerekecektir.", + "reset_sqlite_done": "Uygulama verileri silindi. LÃŧtfen Immich'i yeniden başlatÄąn ve tekrar giriş yapÄąn.", "reset_sqlite_success": "SQLite veritabanÄąnÄą başarÄąyla sÄąfÄąrladÄąnÄąz", "reset_to_default": "VarsayÄąlana sÄąfÄąrla", "resolution": "ÇÃļzÃŧnÃŧrlÃŧk", @@ -1903,6 +1914,7 @@ "saved_settings": "Kaydedilen ayarlar", "say_something": "Bir şey sÃļyle", "scaffold_body_error_occurred": "Bir hata meydana geldi", + "scaffold_body_error_unrecoverable": "Geri dÃļndÃŧrÃŧlemez bir hata oluştu. Size yardÄąmcÄą olabilmemiz için hatayÄą ve hata izleme kaydÄąnÄą Discord veya GitHub Ãŧzerinden paylaÅŸÄąn. İsterseniz, aşağıdaki bağlantÄądan uygulama verilerini temizleyebilirsiniz.", "scan": "Tara", "scan_all_libraries": "TÃŧm KÃŧtÃŧphaneleri Tara", "scan_library": "KÃŧtÃŧphaneyi tara", @@ -1938,6 +1950,7 @@ "search_filter_ocr": "OCR'ye gÃļre ara", "search_filter_people_title": "Kişi seç", "search_filter_star_rating": "YÄąldÄąz PuanÄą", + "search_filter_tags_title": "Etiketleri seç", "search_for": "AraştÄąr", "search_for_existing_person": "Mevcut bir kişiyi ara", "search_no_more_result": "Daha fazla sonuç yok", @@ -2017,6 +2030,9 @@ "set_profile_picture": "Profil resmini ayarla", "set_slideshow_to_fullscreen": "Slayt gÃļsterisini tam ekran yap", "set_stack_primary_asset": "Birincil Ãļğe olarak ayarla", + "setting_image_navigation_enable_subtitle": "Etkinleştirilirse, ekranÄąn en sol ve en sağdaki çeyreğine dokunarak Ãļnceki ve sonraki gÃļrÃŧntÃŧye geçebilirsiniz.", + "setting_image_navigation_enable_title": "Gezinmek için dokun", + "setting_image_navigation_title": "GÃļrÃŧntÃŧ gezinmesi", "setting_image_viewer_help": "GÃļrÃŧntÃŧleyici Ãļnce kÃŧçÃŧk resmi gÃļsterir, ardÄąndan orta boy Ãļnizlemeyi (etkinleştirilmişse) ve son olarak orijinali (etkinleştirilmişse) gÃļsterir.", "setting_image_viewer_original_subtitle": "Orijinal tam çÃļzÃŧnÃŧrlÃŧklÃŧ gÃļrÃŧntÃŧyÃŧ (bÃŧyÃŧk!) yÃŧklemek için etkinleştirin. Veri kullanÄąmÄąnÄą azaltmak için devre dÄąÅŸÄą bÄąrakÄąn (hem ağ hem de cihaz Ãļnbelleği).", "setting_image_viewer_original_title": "Orijinal gÃļrÃŧntÃŧyÃŧ yÃŧkle", @@ -2183,14 +2199,15 @@ "support": "Destek", "support_and_feedback": "Destek & Geri Bildirim", "support_third_party_description": "Immich kurulumu ÃŧçÃŧncÃŧ bir tarafça yapÄąldÄą. YaşadığınÄąz sorunlar bu paketle ilgili olabilir. LÃŧtfen Ãļncelikli olarak aşağıdaki bağlantÄąlarÄą kullanarak bu sağlayÄącÄąyla iletişime geçin.", + "supporter": "Destekçi", "swap_merge_direction": "Birleştirme yÃļnÃŧnÃŧ değiştir", - "sync": "Senkronizasyon", - "sync_albums": "AlbÃŧmleri senkronize et", - "sync_albums_manual_subtitle": "YÃŧklenen tÃŧm videolarÄą ve fotoğraflarÄą seçilen yedekleme albÃŧmlerine senkronize edin", - "sync_local": "Yerel Senkronizasyon", - "sync_remote": "Uzaktan Senkronizasyon", - "sync_status": "Senkronizasyon Durumu", - "sync_status_subtitle": "Senkronizasyon sistemini gÃļrÃŧntÃŧleyin ve yÃļnetin", + "sync": "Eşitle", + "sync_albums": "AlbÃŧmleri eşitle", + "sync_albums_manual_subtitle": "YÃŧklenen tÃŧm videolarÄą ve fotoğraflarÄą seçilen yedekleme albÃŧmlerine eşitle", + "sync_local": "Yerel Eşitleme", + "sync_remote": "Uzaktan Eşitleme", + "sync_status": "Eşitleme Durumu", + "sync_status_subtitle": "Eşitleme sistemini gÃļrÃŧntÃŧleyin ve yÃļnetin", "sync_upload_album_setting_subtitle": "FotoğraflarÄąnÄązÄą ve videolarÄąnÄązÄą oluşturun ve Immich'te seçtiğiniz albÃŧmlere yÃŧkleyin", "tag": "Etiket", "tag_assets": "Öğeleri etiketle", @@ -2294,6 +2311,7 @@ "unstack_action_prompt": "{count} istiflenmemiş", "unstacked_assets_count": "{count, plural, one {# Ãļğenin} other {# Ãļğelerin}} yığınÄą kaldÄąrÄąldÄą", "unsupported_field_type": "Desteklenmeyen alan tÃŧrÃŧ", + "unsupported_file_type": "{type} dosya tÃŧrÃŧ desteklenmediği için {file} dosyasÄą yÃŧklenemiyor.", "untagged": "Etiketlenmemiş", "untitled_workflow": "BaşlÄąksÄąz iş akÄąÅŸÄą", "up_next": "SÄąradaki", @@ -2320,6 +2338,8 @@ "url": "URL", "usage": "KullanÄąm", "use_biometric": "Biyometri kullan", + "use_browser_locale": "TarayÄącÄą yerel ayarlarÄąnÄą kullan", + "use_browser_locale_description": "Tarih, saat ve sayÄąlar tarayÄącÄąnÄązÄąn yerel ayarlarÄąna gÃļre biçimlendirilsin", "use_current_connection": "Mevcut bağlantÄąyÄą kullan", "use_custom_date_range": "Bunun yerine Ãļzel tarih aralığınÄą kullan", "user": "KullanÄącÄą", diff --git a/i18n/uk.json b/i18n/uk.json index 0609edf28c..74647210c2 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -311,7 +311,7 @@ "search_jobs": "ĐŸĐžŅˆŅƒĐē СавдаĐŊҌâ€Ļ", "send_welcome_email": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ Đ˛Ņ–Ņ‚Đ°ĐģҌĐŊиК ĐģĐ¸ŅŅ‚", "server_external_domain_settings": "ЗовĐŊŅ–ŅˆĐŊŅ–Đš Đ´ĐžĐŧĐĩĐŊ", - "server_external_domain_settings_description": "ДоĐŧĐĩĐŊ Đ´ĐģŅ ĐŋŅƒĐąĐģҖ҇ĐŊĐ¸Ņ… ĐˇĐ°ĐŗĐ°ĐģҌĐŊĐžĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ http(s)://", + "server_external_domain_settings_description": "ДоĐŧĐĩĐŊ Đ´ĐģŅ СОвĐŊŅ–ŅˆĐŊŅ–Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ", "server_public_users": "ĐŸŅƒĐąĐģҖ҇ĐŊŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–", "server_public_users_description": "ĐŖŅŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ– (Ņ–Đŧ'Ņ Ņ‚Đ° ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊа ĐŋĐžŅˆŅ‚Đ°) Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ дОдаваĐŊĐŊŅ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° Đ´Đž ҁĐŋŅ–ĐģҌĐŊĐ¸Ņ… аĐģŅŒĐąĐžĐŧŅ–Đ˛. Đ¯ĐēŅ‰Đž виĐŧĐēĐŊĐĩĐŊĐž, ҁĐŋĐ¸ŅĐžĐē ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиК ĐģĐ¸ŅˆĐĩ адĐŧŅ–ĐŊŅ–ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°Đŧ.", "server_settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "ĐĸĐžĐŊОвĐĩ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "transcoding_tone_mapping_description": "НаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ СйĐĩŅ€ĐĩĐŗŅ‚Đ¸ Đ˛Đ¸ĐŗĐģŅĐ´ HDR-Đ˛Ņ–Đ´ĐĩĐž ĐŋŅ€Đ¸ ĐēĐžĐŊвĐĩŅ€Ņ‚Đ°Ņ†Ņ–Ņ— в SDR. КоĐļĐĩĐŊ аĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ€Ņ–ĐˇĐŊŅ– ĐēĐžĐŧĐŋŅ€ĐžĐŧŅ–ŅĐ¸ Ņ‰ĐžĐ´Đž ĐēĐžĐģŅŒĐžŅ€Ņƒ, Đ´ĐĩŅ‚Đ°ĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ— Ņ‚Đ° ŅŅĐēŅ€Đ°Đ˛ĐžŅŅ‚Ņ–. АĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ Hable СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Đ´ĐĩŅ‚Đ°ĐģŅ–, Mobius - ĐēĐžĐģŅŒĐžŅ€Đ¸, Reinhard - ŅŅĐēŅ€Đ°Đ˛Ņ–ŅŅ‚ŅŒ.", "transcoding_transcode_policy": "ПоĐģŅ–Ņ‚Đ¸Đēа ĐŋĐĩŅ€ĐĩĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ", - "transcoding_transcode_policy_description": "ПоĐģŅ–Ņ‚Đ¸Đēа Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´ĐģŅ Đ˛Ņ–Đ´ĐĩĐž. HDR Đ˛Ņ–Đ´ĐĩĐž СавĐļди ĐąŅƒĐ´Đĩ Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅŒ (ĐēҀҖĐŧ виĐŋадĐēŅ–Đ˛, ĐēĐžĐģи Ņ‚Ņ€Đ°ĐŊҁĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ виĐŧĐēĐŊĐĩĐŊĐž).", + "transcoding_transcode_policy_description": "ПоĐģŅ–Ņ‚Đ¸Đēа Ņ‰ĐžĐ´Đž Ņ‚ĐžĐŗĐž, ĐēĐžĐģи Đ˛Ņ–Đ´ĐĩĐž ҁĐģŅ–Đ´ ĐŋĐĩŅ€ĐĩĐēĐžĐ´ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. Đ’Ņ–Đ´ĐĩĐž С HDR Ņ– Đ˛Ņ–Đ´ĐĩĐž С ĐŋŅ–ĐēҁĐĩĐģҌĐŊиĐŧ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ĐžĐŧ, Đ˛Ņ–Đ´ĐŧŅ–ĐŊĐŊиĐŧ Đ˛Ņ–Đ´ YUV 4:2:0, СавĐļди ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩĐēОдОваĐŊĐž (ĐēҀҖĐŧ виĐŋадĐēŅ–Đ˛, ĐēĐžĐģи ĐŋĐĩŅ€ĐĩĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ виĐŧĐēĐŊĐĩĐŊĐž).", "transcoding_two_pass_encoding": "ĐšĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ С двОĐŧа ĐŋŅ€ĐžŅ…ĐžĐ´Đ°Đŧи", "transcoding_two_pass_encoding_setting_description": "ĐĸŅ€Đ°ĐŊҁĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ Са двОĐŧа ĐŋŅ€ĐžŅ…ĐžĐ´Đ°Đŧи Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ ĐēŅ€Đ°Ņ‰Đ¸Ņ… СаĐēОдОваĐŊĐ¸Ņ… Đ˛Ņ–Đ´ĐĩĐž. КоĐģи Đ˛Đ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊиК ĐąŅ–Ņ‚Ņ€ĐĩĐšŅ‚ (ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊиК Đ´ĐģŅ Ņ€ĐžĐąĐžŅ‚Đ¸ С H.264 Ņ‚Đ° HEVC), ҆ĐĩĐš Ņ€ĐĩĐļиĐŧ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Đ´Ņ–Đ°ĐŋаСОĐŊ ĐąŅ–Ņ‚Ņ€ĐĩĐšŅ‚Ņƒ, ĐˇĐ°ŅĐŊОваĐŊиК ĐŊа ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐžĐŧ҃ ĐąŅ–Ņ‚Ņ€ĐĩĐšŅ‚Ņ–, Ņ– Ņ–ĐŗĐŊĐžŅ€ŅƒŅ” CRF. ДĐģŅ VP9 ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ CRF, ŅĐēŅ‰Đž виĐŧĐēĐŊĐĩĐŊĐž ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊиК ĐąŅ–Ņ‚Ņ€ĐĩĐšŅ‚.", "transcoding_video_codec": "Đ’Ņ–Đ´ĐĩĐžĐēОдĐĩĐē", @@ -794,6 +794,11 @@ "color": "КоĐģŅ–Ņ€", "color_theme": "КоĐģŅŒĐžŅ€ĐžĐ˛Đ° Ņ‚ĐĩĐŧа", "command": "КоĐŧаĐŊда", + "command_palette_prompt": "ШвидĐēĐž СĐŊĐ°Ņ…ĐžĐ´ŅŒŅ‚Đĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃, Đ´Ņ–ŅŽ Ņ‡Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ", + "command_palette_to_close": "СаĐēŅ€Đ¸Ņ‚Đ¸", + "command_palette_to_navigate": "Đ˛Đ˛Ņ–ĐšŅ‚Đ¸", + "command_palette_to_select": "ĐžĐąŅ€Đ°Ņ‚Đ¸", + "command_palette_to_show_all": "ĐŋĐžĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ˛ŅĐĩ", "comment_deleted": "КоĐŧĐĩĐŊŅ‚Đ°Ņ€ видаĐģĐĩĐŊĐž", "comment_options": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ–Đ˛", "comments_and_likes": "КоĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ– Ņ‚Đ° вĐŋОдОйаĐŊĐŊŅ", @@ -867,7 +872,7 @@ "current_server_address": "ĐŸĐžŅ‚ĐžŅ‡ĐŊа Đ°Đ´Ņ€ĐĩŅĐ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", "custom_date": "ВĐģĐ°ŅĐŊа Đ´Đ°Ņ‚Đ°", "custom_locale": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК Ņ€ĐĩĐŗŅ–ĐžĐŊ", - "custom_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ°Ņ‚Đ¸ Ņ‚Đ° Ņ‡Đ¸ŅĐģа С ŅƒŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŧОви Ņ‚Đ° Ņ€ĐĩĐŗŅ–ĐžĐŊ҃", + "custom_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ°Ņ‚Ņƒ, Ņ‡Đ°Ņ Ņ‚Đ° Ņ‡Đ¸ŅĐģа С ŅƒŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐžĐąŅ€Đ°ĐŊĐžŅ— ĐŧОви Ņ‚Đ° Ņ€ĐĩĐŗŅ–ĐžĐŊ҃", "custom_url": "ВĐģĐ°ŅĐŊа URL-Đ°Đ´Ņ€ĐĩŅĐ°", "cutoff_date_description": "ЗбĐĩŅ€ĐĩĐļŅ–Ņ‚ŅŒ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Ņ–Ņ— С ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžĐŗĐžâ€Ļ", "cutoff_day": "{count, plural, one {Đ´ĐĩĐŊҌ} few {Đ´ĐŊŅ–} many {Đ´ĐŊŅ–Đ˛} other {Đ´ĐŊŅ–Đ˛}}", @@ -890,8 +895,6 @@ "deduplication_criteria_2": "ĐšŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ даĐŊĐ¸Ņ… EXIF", "deduplication_info": "ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž Đ´ĐĩĐ´ŅƒĐŋĐģŅ–ĐēĐ°Ņ†Ņ–ŅŽ", "deduplication_info_description": "ДĐģŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžĐŗĐž ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž Đ˛Đ¸ĐąĐžŅ€Ņƒ Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ– ĐŧĐ°ŅĐžĐ˛ĐžĐŗĐž видаĐģĐĩĐŊĐŊŅ Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Ņ–Đ˛ Đŧи Đ˛Ņ€Đ°Ņ…ĐžĐ˛ŅƒŅ”ĐŧĐž:", - "default_locale": "Мова Ņ‚Đ° Ņ€ĐĩĐŗŅ–ĐžĐŊ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ", - "default_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ°Ņ‚Đ¸ Ņ‚Đ° Ņ‡Đ¸ŅĐģа С ŅƒŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŧОви Đ˛Đ°ŅˆĐžĐŗĐž ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°", "delete": "ВидаĐģĐ¸Ņ‚Đ¸", "delete_action_confirmation_message": "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ видаĐģĐ¸Ņ‚Đ¸ ҆ĐĩĐš Ņ„Đ°ĐšĐģ? Đ™ĐžĐŗĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž Đ´Đž ĐēĐžŅˆĐ¸Đēа ĐŊа ҁĐĩŅ€Đ˛ĐĩҀҖ, а Ņ‚Đ°ĐēĐžĐļ СĘŧŅĐ˛Đ¸Ņ‚ŅŒŅŅ СаĐŋĐ¸Ņ‚ ĐŊа ĐšĐžĐŗĐž видаĐģĐĩĐŊĐŊŅ С ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ", "delete_action_prompt": "ВидаĐģĐĩĐŊĐž {count, plural, one {# Ņ„Đ°ĐšĐģ} few {# Ņ„Đ°ĐšĐģи} other {# Ņ„Đ°ĐšĐģŅ–Đ˛}}", @@ -1004,6 +1007,8 @@ "editor_edits_applied_success": "ЗĐŧŅ–ĐŊи ҃ҁĐŋŅ–ŅˆĐŊĐž ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛Đ°ĐŊĐž", "editor_flip_horizontal": "Đ’Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ ĐŗĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊĐž", "editor_flip_vertical": "Đ’Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ вĐĩŅ€Ņ‚Đ¸ĐēаĐģҌĐŊĐž", + "editor_handle_corner": "{corner, select, top_left {Đ›Ņ–Đ˛Đ¸Đš вĐĩҀ҅ĐŊŅ–Đš ĐēŅƒŅ‚} top_right {ĐŸŅ€Đ°Đ˛Đ¸Đš вĐĩҀ҅ĐŊŅ–Đš ĐēŅƒŅ‚} bottom_left {Đ›Ņ–Đ˛Đ¸Đš ĐŊиĐļĐŊŅ–Đš ĐēŅƒŅ‚} bottom_right {ĐŸŅ€Đ°Đ˛Đ¸Đš ĐŊиĐļĐŊŅ–Đš ĐēŅƒŅ‚} other {ĐšŅƒŅ‚}}", + "editor_handle_edge": "{edge, select, top {ВĐĩҀ҅ĐŊŅ–Đš ĐēŅ€Đ°Đš} bottom {НиĐļĐŊŅ–Đš ĐēŅ€Đ°Đš} left {Đ›Ņ–Đ˛Đ¸Đš ĐēŅ€Đ°Đš} right {ĐŸŅ€Đ°Đ˛Đ¸Đš ĐēŅ€Đ°Đš} other {ĐšŅ€Đ°Đš}}", "editor_orientation": "ĐžŅ€Ņ–Ņ”ĐŊŅ‚Đ°Ņ†Ņ–Ņ", "editor_reset_all_changes": "ĐĄĐēиĐŊŅƒŅ‚Đ¸ СĐŧŅ–ĐŊи", "editor_rotate_left": "ПовĐĩŅ€ĐŊŅƒŅ‚Đ¸ ĐŊа 90° ĐŋŅ€ĐžŅ‚Đ¸ ĐŗĐžĐ´Đ¸ĐŊĐŊиĐēĐžĐ˛ĐžŅ— ҁ҂ҀҖĐģĐēи", @@ -1069,6 +1074,7 @@ "failed_to_update_notification_status": "НĐĩ вдаĐģĐžŅŅ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ŅŅ‚Đ°Ņ‚ŅƒŅ ҁĐŋĐžĐ˛Ņ–Ņ‰ĐĩĐŊĐŊŅ", "incorrect_email_or_password": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊа Đ°Đ´Ņ€ĐĩŅĐ° ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅ— ĐŋĐžŅˆŅ‚Đ¸ айО ĐŋĐ°Ņ€ĐžĐģҌ", "library_folder_already_exists": "ĐĻĐĩĐš ҈ĐģŅŅ… Ņ–ĐŧĐŋĐžŅ€Ņ‚Ņƒ вĐļĐĩ ҖҁĐŊŅƒŅ”.", + "page_not_found": "ĐĄŅ‚ĐžŅ€Ņ–ĐŊĐēа ĐŊĐĩ СĐŊаКдĐĩĐŊа", "paths_validation_failed": "{paths, plural, one {# ҈ĐģŅŅ…} few {# ҈ĐģŅŅ…Đ¸} many {# ҈ĐģŅŅ…Ņ–Đ˛} other {# ҈ĐģŅŅ…Ņƒ}} ĐŊĐĩ ĐŋŅ€ĐžĐšŅˆĐģĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃", "profile_picture_transparent_pixels": "Đ—ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ„Ņ–ĐģŅŽ ĐŊĐĩ ĐŧĐžĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžĐˇĐžŅ€Đ¸Ņ… ĐŋŅ–ĐēҁĐĩĐģŅ–Đ˛. Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ĐˇĐąŅ–ĐģŅŒŅˆŅ–Ņ‚ŅŒ ĐŧĐ°ŅŅˆŅ‚Đ°Đą Ņ‚Đ°/айО ĐŋĐĩŅ€ĐĩĐŧŅ–ŅŅ‚Ņ–Ņ‚ŅŒ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ.", "quota_higher_than_disk_size": "Ви Đ˛ŅŅ‚Đ°ĐŊОвиĐģи ĐēĐ˛ĐžŅ‚Ņƒ, Ņ‰Đž ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” Ņ€ĐžĐˇĐŧŅ–Ņ€ Đ´Đ¸ŅĐēа", @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "ЛЮДИ", "exif_bottom_sheet_person_add_person": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Ņ–Đŧ'Ņ", "exit_slideshow": "Đ’Đ¸ĐšŅ‚Đ¸ ĐˇŅ– ҁĐģаКд-ŅˆĐžŅƒ", + "expand": "Đ ĐžĐˇĐŗĐžŅ€ĐŊŅƒŅ‚Đ¸", "expand_all": "Đ ĐžĐˇĐŗĐžŅ€ĐŊŅƒŅ‚Đ¸ Đ˛ŅĐĩ", "experimental_settings_new_asset_list_subtitle": "В Ņ€ĐžĐˇŅ€ĐžĐąŅ†Ņ–", "experimental_settings_new_asset_list_title": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊ҃ ҁҖ҂Đē҃ Ņ„ĐžŅ‚Đž", @@ -1212,6 +1219,7 @@ "filter_description": "ĐŖĐŧОви Đ´ĐģŅ ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— ҆ҖĐģŅŒĐžĐ˛Đ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛", "filter_people": "Đ¤Ņ–ĐģŅŒŅ‚Ņ€ Са ĐģŅŽĐ´ŅŒĐŧи", "filter_places": "Đ¤Ņ–ĐģŅŒŅ‚Ņ€ Са ĐŧŅ–ŅŅ†ŅĐŧи", + "filter_tags": "Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‚ĐĩĐŗĐ¸", "filters": "Đ¤Ņ–ĐģŅŒŅ‚Ņ€Đ¸", "find_them_fast": "ШвидĐēĐž СĐŊĐ°Ņ…ĐžĐ´ŅŒŅ‚Đĩ Ņ—Ņ… Са ĐŊĐ°ĐˇĐ˛ĐžŅŽ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐžŅˆŅƒĐē҃", "first": "ПĐĩŅ€ŅˆĐ¸Đš", @@ -1642,6 +1650,8 @@ "online": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊиК", "only_favorites": "Đ›Đ¸ŅˆĐĩ ĐžĐąŅ€Đ°ĐŊŅ–", "open": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸", + "open_calendar": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ĐēаĐģĐĩĐŊĐ´Đ°Ņ€", + "open_in_browser": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ в ĐąŅ€Đ°ŅƒĐˇĐĩҀҖ", "open_in_map_view": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ĐŊа ĐŧаĐŋŅ–", "open_in_openstreetmap": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ в OpenStreetMap", "open_the_search_filters": "Đ’Ņ–Đ´ĐēŅ€Đ¸ĐšŅ‚Đĩ ҄ҖĐģŅŒŅ‚Ņ€Đ¸ ĐŋĐžŅˆŅƒĐē҃", @@ -1803,7 +1813,6 @@ "rating_clear": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ", "rating_count": "{count, plural, one {# ĐˇŅ–Ņ€Đēа} few {# ĐˇŅ–Ņ€Đēи} many {# ĐˇŅ–Ņ€ĐžĐē} other {# ĐˇŅ–Ņ€ĐžĐē}}", "rating_description": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ EXIF ĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊŅ–Đš ĐŋаĐŊĐĩĐģŅ–", - "rating_set": "Đ ĐĩĐšŅ‚Đ¸ĐŊĐŗ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž ĐŊа {rating, plural, one {# ĐˇŅ–Ņ€Đē҃} few {# ĐˇŅ–Ņ€Đēи} many {# ĐˇŅ–Ņ€ĐžĐē} other {# ĐˇŅ–Ņ€ĐžĐē}}", "reaction_options": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Ņ€ĐĩаĐē҆Җҗ", "read_changelog": "ĐŸŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ СĐŧŅ–ĐŊи в ĐžĐŊОвĐģĐĩĐŊĐŊŅ–", "readonly_mode_disabled": "Đ ĐĩĐļиĐŧ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ виĐŧĐēĐŊĐĩĐŊĐž", @@ -1875,7 +1884,10 @@ "reset_pin_code_success": "PIN-ĐēОд ҃ҁĐŋŅ–ŅˆĐŊĐž ҁĐēиĐŊŅƒŅ‚Đž", "reset_pin_code_with_password": "Ви СавĐļди ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēиĐŊŅƒŅ‚Đ¸ ŅĐ˛Ņ–Đš PIN-ĐēОд Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŋĐ°Ņ€ĐžĐģŅ", "reset_sqlite": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ ĐąĐ°ĐˇŅƒ даĐŊĐ¸Ņ… SQLite", - "reset_sqlite_confirmation": "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ ĐąĐ°ĐˇŅƒ даĐŊĐ¸Ņ… SQLite? ĐŸŅ–ŅĐģŅ Ņ†ŅŒĐžĐŗĐž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ Đ˛Đ¸ĐšŅ‚Đ¸ С ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Ņ‚Đ° ŅƒĐ˛Ņ–ĐšŅ‚Đ¸ СĐŊĐžĐ˛Ņƒ Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžŅ— ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— даĐŊĐ¸Ņ…", + "reset_sqlite_clear_app_data": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ даĐŊŅ–", + "reset_sqlite_confirmation": "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ видаĐģĐ¸Ņ‚Đ¸ Đ˛ŅŅ– даĐŊŅ–? ĐĻĐĩ видаĐģĐ¸Ņ‚ŅŒ Đ˛ŅŅ– ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ– виКдĐĩ С виКдĐĩ С Đ˛Đ°ŅˆĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒŅŽ", + "reset_sqlite_confirmation_note": "ĐŖĐ˛Đ°ĐŗĐ°: ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧ҃ ĐŋҖҁĐģŅ ĐžŅ‡Đ¸ŅŅ‚Đēи.", + "reset_sqlite_done": "ДаĐŊŅ– ĐąŅƒĐģĐž ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐž. Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ĐŋĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļŅ‚Đĩ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧ҃ Ņ– СĐŊĐžĐ˛Ņƒ ŅƒĐ˛Ņ–ĐšĐ´Ņ–Ņ‚ŅŒ ҃ ŅĐ˛Ņ–Đš ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ.", "reset_sqlite_success": "Đ‘Đ°ĐˇŅƒ даĐŊĐ¸Ņ… SQLite ҃ҁĐŋŅ–ŅˆĐŊĐž ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐž", "reset_to_default": "ĐĄĐēиĐŊŅƒŅ‚Đ¸ Đ´Đž ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ", "resolution": "Đ ĐžĐˇĐ´Ņ–ĐģҌĐŊа Đ—Đ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŒ", @@ -1938,6 +1950,7 @@ "search_filter_ocr": "ĐŸĐžŅˆŅƒĐē Са OCR", "search_filter_people_title": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐģŅŽĐ´ĐĩĐš", "search_filter_star_rating": "Đ—ĐžŅ€ŅĐŊиК Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ", + "search_filter_tags_title": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Ņ‚ĐĩĐŗĐ¸", "search_for": "Đ¨ŅƒĐēĐ°Ņ‚Đ¸ Đ´ĐģŅ", "search_for_existing_person": "ĐŸĐžŅˆŅƒĐē ҖҁĐŊŅƒŅŽŅ‡ĐžŅ— ĐžŅĐžĐąĐ¸", "search_no_more_result": "Đ‘Ņ–ĐģҌ҈Đĩ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ–Đ˛ ĐŊĐĩĐŧĐ°Ņ”", @@ -2017,6 +2030,7 @@ "set_profile_picture": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ„Ņ–ĐģŅŽ", "set_slideshow_to_fullscreen": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ҁĐģаКд-ŅˆĐžŅƒ ĐŊа вĐĩҁҌ ĐĩĐēŅ€Đ°ĐŊ", "set_stack_primary_asset": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ŅĐē ĐžŅĐŊОвĐŊиК Ņ„Đ°ĐšĐģ", + "setting_image_navigation_title": "ĐĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ–Ņ ĐŋĐž ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅŅ…", "setting_image_viewer_help": "ПовĐŊĐžĐĩĐēŅ€Đ°ĐŊĐŊиК ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Đ°Ņ‡ ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ СаваĐŊŅ‚Đ°ĐļŅƒŅ” ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Ņƒ в ĐŊĐ¸ĐˇŅŒĐēŅ–Đš Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊŅ–Đš ĐˇĐ´Đ°Ņ‚ĐŊĐžŅŅ‚Ņ–, ĐŋĐžŅ‚Ņ–Đŧ СаваĐŊŅ‚Đ°ĐļŅƒŅ” ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ в СĐŧĐĩĐŊ҈ĐĩĐŊŅ–Đš Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊŅ–Đš ĐˇĐ´Đ°Ņ‚ĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģ҃ (ŅĐēŅ‰Đž вĐēĐģŅŽŅ‡ĐĩĐŊĐž) Ņ– ĐˇŅ€ĐĩŅˆŅ‚ĐžŅŽ СаваĐŊŅ‚Đ°ĐļŅƒŅ” ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģ (ŅĐēŅ‰Đž вĐēĐģŅŽŅ‡ĐĩĐŊĐž).", "setting_image_viewer_original_subtitle": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Đ´ĐģŅ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊĐžĐŗĐž ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ С ĐŋОвĐŊĐžŅŽ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊĐžŅŽ ĐˇĐ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŽ (вĐĩĐģиĐēĐĩ!). ВиĐŧĐēĐŊŅƒŅ‚Đ¸, Ņ‰ĐžĐą СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ даĐŊĐ¸Ņ… (ŅĐē ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃, Ņ‚Đ°Đē Ņ– ĐŊа ĐēĐĩŅˆŅ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ).", "setting_image_viewer_original_title": "ЗаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°Ņ‚Đ¸ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊĐĩ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", @@ -2183,6 +2197,7 @@ "support": "ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēа", "support_and_feedback": "ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēа Ņ‚Đ° ĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊиК Св'ŅĐˇĐžĐē", "support_third_party_description": "Đ’Đ°ŅˆŅƒ ŅƒŅŅ‚Đ°ĐŊОвĐē҃ Immich ĐąŅƒĐģĐž ҃ĐŋаĐēОваĐŊĐž ҂ҀĐĩŅ‚ŅŒĐžŅŽ ŅŅ‚ĐžŅ€ĐžĐŊĐžŅŽ. ĐŸŅ€ĐžĐąĐģĐĩĐŧи, С ŅĐēиĐŧи ви ŅŅ‚Đ¸ĐēĐ°Ņ”Ņ‚ĐĩҁҌ, ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐģиĐēаĐŊŅ– Ņ†Đ¸Đŧ ĐŋаĐēĐĩŅ‚ĐžĐŧ, Ņ‚ĐžĐŧ҃ ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ СвĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ Đ´Đž ĐŊĐ¸Ņ… Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐŊавĐĩĐ´ĐĩĐŊŅ– ĐŊиĐļ҇Đĩ ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ.", + "supporter": "ĐŸŅ€Đ¸Ņ…Đ¸ĐģҌĐŊиĐē", "swap_merge_direction": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŊаĐŋŅ€ŅĐŧĐžĐē Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ", "sync": "ХиĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇŅƒĐ˛Đ°Ņ‚Đ¸", "sync_albums": "ХиĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ аĐģŅŒĐąĐžĐŧи", @@ -2320,6 +2335,7 @@ "url": "URL", "usage": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ", "use_biometric": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Ņ–ŅŽ", + "use_browser_locale": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐžĐēаĐģҌ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°", "use_current_connection": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐŋĐžŅ‚ĐžŅ‡ĐŊĐĩ С'Ņ”Đ´ĐŊаĐŊĐŊŅ", "use_custom_date_range": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК Đ´Ņ–Đ°ĐŋаСОĐŊ Đ´Đ°Ņ‚", "user": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡", diff --git a/i18n/vi.json b/i18n/vi.json index 0ba340ad2c..e9d5fb4006 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -18,6 +18,7 @@ "add_a_title": "ThÃĒm tÃĒn", "add_action": "ThÃĒm hành đáģ™ng", "add_action_description": "NháēĨn đáģƒ thÃĒm hành đáģ™ng cáē§n tháģąc hiáģ‡n", + "add_assets": "ThÃĒm áēŖnh/video", "add_birthday": "ThÃĒm sinh nháē­t", "add_endpoint": "ThÃĒm endpoint", "add_exclusion_pattern": "ThÃĒm quy táē¯c loáēĄi tráģĢ", @@ -54,18 +55,18 @@ "authentication_settings_disable_all": "BáēĄn cÃŗ cháē¯c muáģ‘n vô hiáģ‡u hÃŗa máģi phÆ°ÆĄng tháģŠc đăng nháē­p? Đăng nháē­p sáēŊ báģ‹ vô hiáģ‡u hÃŗa hoàn toàn.", "authentication_settings_reenable": "Đáģƒ báē­t láēĄi, dÚng Láģ‡nh MÃĄy cháģ§.", "background_task_job": "CÃĄc tÃĄc váģĨ náģn", - "backup_database": "TáēĄo báēŖn sao lưu CSDL", + "backup_database": "TáēĄo báēŖn sao lưu CÆĄ sáģŸ dáģ¯ liáģ‡u", "backup_database_enable_description": "Báē­t sao lưu cÆĄ sáģŸ dáģ¯ liáģ‡u", - "backup_keep_last_amount": "Sáģ‘ lưáģŖng cÃĄc báēŖn sao lưu CSDL trưáģ›c Ä‘Ãŗ đưáģŖc giáģ¯ láēĄi", + "backup_keep_last_amount": "Sáģ‘ lưáģŖng cÃĄc báēŖn sao lưu trưáģ›c Ä‘Ãŗ đưáģŖc giáģ¯ láēĄi", "backup_onboarding_1_description": "sao chÊp ngoài trang web trÃĒn Ä‘ÃĄm mÃĸy hoáēˇc táēĄi máģ™t váģ‹ trí váē­t lÃŊ khÃĄc.", "backup_onboarding_2_description": "báēŖn sao cáģĨc báģ™ trÃĒn cÃĄc thiáēŋt báģ‹ khÃĄc nhau. Bao gáģ“m cÃĄc táģ‡p chính và báēŖn sao lưu cáģĨc báģ™ cáģ§a cÃĄc táģ‡p Ä‘Ãŗ.", "backup_onboarding_3_description": "táģ•ng sáģ‘ báēŖn sao dáģ¯ liáģ‡u cáģ§a báēĄn, bao gáģ“m cáēŖ táģ‡p gáģ‘c. Bao gáģ“m 1 báēŖn sao lưu tráģ¯ ngoài và 2 báēŖn sao lưu tráģ¯ cáģĨc báģ™.", - "backup_onboarding_description": "Chiáēŋn thuáē­t sao lưu 3-2-1 đưáģŖc đáģ xuáēĨt đáģƒ báēŖo váģ‡ dáģ¯ liáģ‡u cáģ§a báēĄn. BáēĄn nÃĒn lưu giáģ¯ báēŖn sao áēŖnh/video Ä‘ÃŖ táēŖi lÃĒn cÅŠng như cÆĄ sáģŸ dáģ¯ liáģ‡u Immich đáģƒ cÃŗ giáēŖi phÃĄp sao lưu toàn diáģ‡n.", + "backup_onboarding_description": "3-2-1 backup strategy (Chiáēŋn thuáē­t sao lưu 3-2-1) đưáģŖc đáģ xuáēĨt đáģƒ báēŖo váģ‡ dáģ¯ liáģ‡u cáģ§a báēĄn. BáēĄn nÃĒn lưu giáģ¯ báēŖn sao áēŖnh/video Ä‘ÃŖ táēŖi lÃĒn và cÆĄ sáģŸ dáģ¯ liáģ‡u cáģ§a Immich đáģƒ cÃŗ giáēŖi phÃĄp sao lưu toàn diáģ‡n.", "backup_onboarding_footer": "Đáģƒ biáēŋt thÃĒm thông tin váģ sao lưu Immich, hÃŖy xem hưáģ›ng dáēĢn.", "backup_onboarding_parts_title": "PhÆ°ÆĄng phÃĄp sao lưu 3-2-1 bao gáģ“m:", "backup_onboarding_title": "Sao lưu", "backup_settings": "Cài đáēˇt sao lưu cÆĄ sáģŸ dáģ¯ liáģ‡u", - "backup_settings_description": "QuáēŖn lÃŊ cài đáēˇt sao lưu CSDL.", + "backup_settings_description": "QuáēŖn lÃŊ cài đáēˇt cáģ§a báēŖn sao lưu cÆĄ sáģŸ dáģ¯ liáģ‡u.", "cleared_jobs": "ÄÃŖ xÃŗa cÃĄc tÃĄc váģĨ: {job}", "config_set_by_file": "CáēĨu hÃŦnh hiáģ‡n táēĄi đang đưáģŖc đáēˇt báģŸi máģ™t táģ‡p cáēĨu hÃŦnh", "confirm_delete_library": "BáēĄn cÃŗ cháē¯c muáģ‘n xÃŗa thư viáģ‡n {library}?", @@ -103,6 +104,8 @@ "image_preview_description": "áēĸnh kích thưáģ›c trung bÃŦnh Ä‘ÃŖ loáēĄi báģ metadata, đưáģŖc sáģ­ dáģĨng khi xem máģ™t táģ‡p duy nháēĨt và cho háģc mÃĄy", "image_preview_quality_description": "CháēĨt lưáģŖng xem trưáģ›c táģĢ 1-100. Càng cao càng táģ‘t, nhưng sáēŊ táēĄo ra cÃĄc táģ‡p láģ›n cÃŗ tháģƒ làm giáēŖm kháēŖ năng pháēŖn háģ“i cáģ§a app. Sáģ­ dáģĨng giÃĄ tráģ‹ tháēĨp cÃŗ tháģƒ áēŖnh hưáģŸng đáēŋn cháēĨt lưáģŖng tÃĄc váģĨ háģc mÃĄy.", "image_preview_title": "Cài đáēˇt Xem trưáģ›c", + "image_progressive": "Mang tính táģ‹nh tiáēŋn", + "image_progressive_description": "MÃŖ hoÃĄ JPEG máģ™t cÃĄch táģ‹nh tiáēŋn đáģƒ áēŖnh hiáģƒn tháģ‹ dáē§n trong quÃĄ trÃŦnh táēŖi. Không ÃĄp dáģĨng cho WebP.", "image_quality": "CháēĨt lưáģŖng", "image_resolution": "Đáģ™ phÃĸn giáēŖi", "image_resolution_description": "Đáģ™ phÃĸn giáēŖi cao hÆĄn sáēŊ rÃĩ nÊt hÆĄn nhưng táģ‘n nhiáģu tháģi gian đáģƒ mÃŖ hÃŗa, kích cáģĄ táģ‡p láģ›n hÆĄn và cÃŗ tháģƒ làm giáēŖm kháēŖ năng pháēŖn háģ“i cáģ§a app.", @@ -187,12 +190,21 @@ "machine_learning_smart_search_enabled": "Báē­t TÃŦm kiáēŋm Thông minh", "machine_learning_smart_search_enabled_description": "Náēŋu táē¯t, áēŖnh sáēŊ không đưáģŖc mÃŖ hÃŗa đáģƒ tÃŦm kiáēŋm thông minh.", "machine_learning_url_description": "Đáģ‹a cháģ‰ mÃĄy cháģ§ háģc mÃĄy. Náēŋu cÃŗ nhiáģu hÆĄn máģ™t đáģ‹a cháģ‰ Ä‘Æ°áģŖc cung cáēĨp, máģ—i mÃĄy cháģ§ sáēŊ đưáģŖc kiáģƒm tra máģ™t láē§n cho đáēŋn khi cÃŗ máģ™t mÃĄy cháģ§ tráēŖ láģi thành công, theo tháģŠ táģą táģĢ mÃĄy cháģ§ Ä‘áē§u tiÃĒn đáēŋn mÃĄy cháģ§ cuáģ‘i cÚng. MÃĄy cháģ§ không pháēŖn háģ“i sáēŊ táēĄm tháģi đưáģŖc báģ qua cho đáēŋn khi mÃĄy cháģ§ online tráģŸ láēĄi.", + "maintenance_delete_backup": "XÃŗa báēŖn sao lưu", "maintenance_delete_backup_description": "Táģ‡p này sáēŊ báģ‹ xoÃĄ vÄŠnh viáģ…n.", + "maintenance_delete_error": "Láģ—i khi xÃŗa báēŖn sao lưu.", "maintenance_restore_backup": "Khôi pháģĨc sao lưu", + "maintenance_restore_backup_description": "Immich sáēŊ xÃŗa sáēĄch toàn báģ™ dáģ¯ liáģ‡u hiáģ‡n táēĄi và khôi pháģĨc dáģ¯ liáģ‡u táģĢ báēŖn sao lưu Ä‘ÃŖ đưáģŖc cháģn. Háģ‡ tháģ‘ng sáēŊ táēĄo máģ™t báēŖn sao lưu cho dáģ¯ liáģ‡u hiáģ‡n táēĄi trưáģ›c khi báē¯t đáē§u.", + "maintenance_restore_backup_different_version": "BáēŖn sao lưu này Ä‘ÃŖ đưáģŖc táēĄo ra báēąng máģ™t phiÃĒn báēŖn khÃĄc cáģ§a Immich!", + "maintenance_restore_backup_unknown_version": "Không tháģƒ xÃĄc đáģ‹nh phiÃĒn báēŖn cáģ§a báēŖn sao lưu.", + "maintenance_restore_database_backup": "Khôi pháģĨc cÆĄ sáģŸ dáģ¯ liáģ‡u táģĢ báēŖn sao lưu", + "maintenance_restore_database_backup_description": "Khôi pháģĨc tráēĄng thÃĄi trưáģ›c Ä‘Ãŗ cáģ§a cÆĄ sáģŸ dáģ¯ liáģ‡u báēąng báēŖn sao lưu", "maintenance_settings": "BáēŖo trÃŦ", "maintenance_settings_description": "Đáēˇt [immich] vào cháēŋ đáģ™ báēŖo trÃŦ.", - "maintenance_start": "Báē¯t đáē§u cháēŋ đáģ™ báēŖo trÃŦ", + "maintenance_start": "Chuyáģƒn sang cháēŋ đáģ™ báēŖo trÃŦ", "maintenance_start_error": "Không tháģƒ báē¯t đáē§u cháēŋ đáģ™ báēŖo trÃŦ.", + "maintenance_upload_backup": "TáēŖi lÃĒn táģ‡p báēŖn sao lưu cáģ§a cÆĄ sáģŸ dáģ¯ liáģ‡u", + "maintenance_upload_backup_error": "Không tháģƒ táēŖi lÃĒn báēŖn sao lưu. ĐÃĸy cÃŗ pháēŖi táģ‡p cÃŗ đáģ‹nh dáēĄng .sql/.sql.gz không?", "manage_concurrency": "QuáēŖn lÃŊ TÃĄc váģĨ", "manage_concurrency_description": "Điáģu hưáģ›ng đáēŋn trang tÃĄc váģĨ đáģƒ quáēŖn lÃŊ tÃĄc váģĨ đáģ“ng tháģi", "manage_log_settings": "QuáēŖn lÃŊ cài đáēˇt log", @@ -222,7 +234,7 @@ "nightly_tasks_cluster_faces_setting_description": "CháēĄy nháē­n diáģ‡n khuôn máēˇt trÃĒn nháģ¯ng khuôn máēˇt máģ›i đưáģŖc phÃĄt hiáģ‡n", "nightly_tasks_cluster_new_faces_setting": "NhÃŗm cÃĄc khuôn máēˇt máģ›i", "nightly_tasks_database_cleanup_setting": "TÃĄc váģĨ dáģn dáēšp cÆĄ sáģŸ dáģ¯ liáģ‡u", - "nightly_tasks_database_cleanup_setting_description": "Làm sáēĄch dáģ¯ liáģ‡u cÅŠ, háēŋt háēĄn trong CSDL", + "nightly_tasks_database_cleanup_setting_description": "Làm sáēĄch dáģ¯ liáģ‡u cÅŠ hoáēˇc/và háēŋt háēĄn trong cÆĄ sáģŸ dáģ¯ liáģ‡u", "nightly_tasks_generate_memories_setting": "TáēĄo káģˇ niáģ‡m", "nightly_tasks_generate_memories_setting_description": "TáēĄo ra nháģ¯ng káģˇ niáģ‡m máģ›i táģĢ táģ‡p", "nightly_tasks_missing_thumbnails_setting": "TáēĄo áēŖnh đáēĄi diáģ‡n báģ‹ thiáēŋu", @@ -255,12 +267,12 @@ "notification_enable_email_notifications": "Báē­t thông bÃĄo qua email", "notification_settings": "Thông bÃĄo", "notification_settings_description": "QuáēŖn lÃŊ cÃĄc cài đáēˇt thông bÃĄo, bao gáģ“m email", - "oauth_auto_launch": "Táģą Ä‘áģ™ng kháģŸi cháēĄy OAuth", + "oauth_auto_launch": "Táģą Ä‘áģ™ng kháģŸi cháēĄy", "oauth_auto_launch_description": "Táģą Ä‘áģ™ng đăng nháē­p báēąng tài khoáēŖn OAuth khi báēĄn truy cáē­p trang đăng nháē­p", "oauth_auto_register": "Táģą Ä‘áģ™ng đăng kÃŊ", "oauth_auto_register_description": "Táģą Ä‘áģ™ng đăng kÃŊ ngưáģi dÚng máģ›i sau khi đăng nháē­p váģ›i OAuth", "oauth_button_text": "Náģ™i dung nÃēt báēĨm", - "oauth_client_secret_description": "Báē¯t buáģ™c náēŋu nhà cung cáēĨp OAuth không háģ— tráģŖ PKCE (Proof Key for Code Exchange)", + "oauth_client_secret_description": "Báē¯t buáģ™c đáģ‘i váģ›i ngưáģi sáģ­ dáģĨng áģŠng dáģĨng báēŖo máē­t, hoáēˇc náēŋu nhà cung cáēĨp áģŠng dáģĨng không háģ— tráģŖ PKCE (Proof Key for Code Exchange).", "oauth_enable_description": "Đăng nháē­p váģ›i OAuth", "oauth_mobile_redirect_uri": "URI chuyáģƒn hưáģ›ng trÃĒn thiáēŋt báģ‹ di đáģ™ng", "oauth_mobile_redirect_uri_override": "Ghi đè URI chuyáģƒn hưáģ›ng cho thiáēŋt báģ‹ di đáģ™ng", @@ -299,7 +311,7 @@ "search_jobs": "TÃŦm kiáēŋm tÃĄc váģĨâ€Ļ", "send_welcome_email": "Gáģ­i email chào máģĢng", "server_external_domain_settings": "TÃĒn miáģn công khai", - "server_external_domain_settings_description": "TÃĒn miáģn dành cho cÃĄc liÃĒn káēŋt chia sáēģ công khai, bao gáģ“m http(s)://", + "server_external_domain_settings_description": "TÃĒn miáģn dành cho cÃĄc liÃĒn káēŋt chia sáēģ công khai", "server_public_users": "Ngưáģi dÚng công khai", "server_public_users_description": "TáēĨt cáēŖ ngưáģi dÚng (tÃĒn và email) đưáģŖc liáģ‡t kÃĒ khi thÃĒm máģ™t ngưáģi dÚng vào máģ™t album đưáģŖc chia sáēģ. Khi táē¯t láģąa cháģn này, danh sÃĄch ngưáģi dÚng cháģ‰ cÃŗ tháģƒ Ä‘Æ°áģŖc tháēĨy báģŸi ngưáģi dÚng quáēŖn tráģ‹.", "server_settings": "MÃĄy cháģ§", @@ -360,7 +372,7 @@ "transcoding_audio_codec": "ChuáēŠn nÊn Ãĸm thanh", "transcoding_audio_codec_description": "Opus là tÚy cháģn cháēĨt lưáģŖng cao nháēĨt, nhưng cÃŗ tính tÆ°ÆĄng thích tháēĨp hÆĄn váģ›i cÃĄc thiáēŋt báģ‹ hoáēˇc pháē§n máģm cÅŠ.", "transcoding_bitrate_description": "Video cÃŗ bitrate cao hÆĄn hoáēˇc không áģŸ Ä‘áģ‹nh dáēĄng đưáģŖc cháēĨp nháē­n", - "transcoding_codecs_learn_more": "Đáģƒ hiáģƒu thÃĒm váģ thuáē­t ngáģ¯ áģŸ Ä‘Ãĸy, hÃŖy tham kháēŖo tài liáģ‡u FFmpeg cho codec H.264, codec HEVC và codec VP9.", + "transcoding_codecs_learn_more": "Đáģƒ hiáģƒu thÃĒm váģ thuáē­t ngáģ¯ áģŸ Ä‘Ãĸy, hÃŖy tham kháēŖo tài liáģ‡u FFmpeg cho H.264 codec, HEVC codec và VP9 codec.", "transcoding_constant_quality_mode": "Cháēŋ đáģ™ cháēĨt lưáģŖng cáģ‘ Ä‘áģ‹nh", "transcoding_constant_quality_mode_description": "ICQ táģ‘t hÆĄn CQP, nhưng máģ™t sáģ‘ thiáēŋt báģ‹ tăng táģ‘c pháē§n cáģŠng không háģ— tráģŖ cháēŋ đáģ™ này. Cài đáēˇt tÚy cháģn này sáēŊ ưu tiÃĒn cháēŋ đáģ™ Ä‘Æ°áģŖc cháģ‰ Ä‘áģ‹nh khi sáģ­ dáģĨng mÃŖ hÃŗa dáģąa trÃĒn cháēĨt lưáģŖng. Báģ‹ báģ qua báģŸi NVENC vÃŦ nÃŗ không háģ— tráģŖ ICQ.", "transcoding_constant_rate_factor": "Háģ‡ sáģ‘ táģˇ láģ‡ cáģ‘ Ä‘áģ‹nh (-crf)", @@ -439,6 +451,9 @@ "admin_password": "Máē­t kháēŠu QuáēŖn tráģ‹ viÃĒn", "administration": "QuáēŖn tráģ‹", "advanced": "NÃĸng cao", + "advanced_settings_clear_image_cache": "GiáēŖi phÃŗng báģ™ nháģ› Ä‘áģ‡m", + "advanced_settings_clear_image_cache_error": "Láģ—i khi giáēŖi phÃŗng báģ™ nháģ› Ä‘áģ‡m", + "advanced_settings_clear_image_cache_success": "ÄÃŖ giáēŖi phÃŗng thành công {size}", "advanced_settings_enable_alternate_media_filter_subtitle": "DÚng tÚy cháģn này đáģƒ láģc phÆ°ÆĄng tiáģ‡n khi đáģ“ng báģ™ theo tiÃĒu chí khÃĄc. Cháģ‰ tháģ­ khi app không nháē­n diáģ‡n đưáģŖc táēĨt cáēŖ cÃĄc album.", "advanced_settings_enable_alternate_media_filter_title": "[THáģŦ NGHIáģ†M] DÚng báģ™ láģc đáģ“ng báģ™ album thay tháēŋ", "advanced_settings_log_level_title": "PhÃĸn loáēĄi log: {level}", @@ -480,6 +495,7 @@ "album_summary": "Mô táēŖ album", "album_updated": "ÄÃŖ cáē­p nháē­t album", "album_updated_setting_description": "Nháē­n thông bÃĄo qua email khi máģ™t album chia sáēģ cÃŗ cÃĄc áēŖnh máģ›i", + "album_upload_assets": "TáēŖi áēŖnh/video táģĢ mÃĄy tính cáģ§a báēĄn lÃĒn và thÃĒm vào album", "album_user_left": "ÄÃŖ ráģi kháģi {album}", "album_user_removed": "ÄÃŖ xÃŗa {user}", "album_viewer_appbar_delete_confirm": "BáēĄn cÃŗ muáģ‘n xÃŗa album này kháģi tài khoáēŖn cáģ§a mÃŦnh?", @@ -501,6 +517,7 @@ "all": "TáēĨt cáēŖ", "all_albums": "TáēĨt cáēŖ album", "all_people": "TáēĨt cáēŖ máģi ngưáģi", + "all_photos": "TáēĨt cáēŖ hÃŦnh áēŖnh", "all_videos": "TáēĨt cáēŖ video", "allow_dark_mode": "Cho phÊp cháēŋ đáģ™ táģ‘i", "allow_edits": "Cho phÊp cháģ‰nh sáģ­a", @@ -508,6 +525,9 @@ "allow_public_user_to_upload": "Cho phÊp táēŖi áēŖnh lÃĒn", "allowed": "Cho phÊp", "alt_text_qr_code": "áēĸnh mÃŖ QR", + "always_keep": "Luôn luôn giáģ¯ láēĄi", + "always_keep_photos_hint": "Tính năng GiáēŖi phÃŗng dung lưáģŖng sáēŊ giáģ¯ láēĄi táēĨt cáēŖ áēŖnh trÃĒn thiáēŋt báģ‹ này.", + "always_keep_videos_hint": "Tính năng GiáēŖi phÃŗng dung lưáģŖng sáēŊ giáģ¯ láēĄi táēĨt cáēŖ video trÃĒn thiáēŋt báģ‹ này.", "anti_clockwise": "Xoay trÃĄi", "api_key": "KhÃŗa API", "api_key_description": "GiÃĄ tráģ‹ này cháģ‰ Ä‘Æ°áģŖc hiáģƒn tháģ‹ máģ™t láē§n. Vui lÃ˛ng sao chÊp nÃŗ trưáģ›c khi Ä‘Ãŗng cáģ­a sáģ•.", @@ -552,6 +572,9 @@ "asset_list_layout_sub_title": "Báģ‘ cáģĨc", "asset_list_settings_subtitle": "Báģ‘ cáģĨc lưáģ›i áēŖnh", "asset_list_settings_title": "Lưáģ›i áēŖnh", + "asset_not_found_on_device_android": "Không tÃŦm tháēĨy táģ‡p trÃĒn thiáēŋt báģ‹", + "asset_not_found_on_device_ios": "Không tÃŦm tháēĨy táģ‡p trÃĒn thiáēŋt báģ‹. Náēŋu báēĄn đang dÚng iCloud, cÃŗ tháģƒ táģ‡p lưu trÃĒn iCloud báģ‹ láģ—i nÃĒn không tháģƒ Ä‘Æ°áģŖc truy cáē­p", + "asset_not_found_on_icloud": "Không tÃŦm tháēĨy táģ‡p trÃĒn iCloud. CÃŗ tháģƒ táģ‡p lưu trÃĒn iCloud báģ‹ láģ—i nÃĒn không tháģƒ Ä‘Æ°áģŖc truy cáē­p", "asset_offline": "Táģ‡p NgoáēĄi tuyáēŋn", "asset_offline_description": "Táģ‡p bÃĒn ngoài này không cÃ˛n trÃĒn áģ• Ä‘ÄŠa. Vui lÃ˛ng liÃĒn háģ‡ quáēŖn tráģ‹ viÃĒn Immich cáģ§a báēĄn đáģƒ Ä‘Æ°áģŖc tráģŖ giÃēp.", "asset_restored_successfully": "ÄÃŖ khôi pháģĨc táģ‡p thành công", @@ -603,7 +626,7 @@ "backup_album_selection_page_select_albums": "Cháģn album", "backup_album_selection_page_selection_info": "Thông tin cÃĄc máģĨc Ä‘ÃŖ cháģn", "backup_album_selection_page_total_assets": "Táģ•ng sáģ‘ táģ‡p không trÚng láēˇp", - "backup_albums_sync": "Đáģ“ng báģ™ hÃŗa album sao lưu", + "backup_albums_sync": "Đáģ“ng báģ™ hÃŗa báēŖn sao lưu album", "backup_all": "TáēĨt cáēŖ", "backup_background_service_backup_failed_message": "Sao lưu táģ‡p tháēĨt báēĄi. Đang tháģ­ láēĄiâ€Ļ", "backup_background_service_complete_notification": "Hoàn táēĨt sao lưu táģ‡p", @@ -736,6 +759,18 @@ "checksum": "Checksum", "choose_matching_people_to_merge": "Cháģn nháģ¯ng ngưáģi trÚng kháģ›p đáģƒ háģŖp nháēĨt", "city": "Thành pháģ‘", + "cleanup_confirm_description": "Immich phÃĄt hiáģ‡n {count} táģ‡p (đưáģŖc táēĄo ra trưáģ›c {date}) đưáģŖc sao lưu trÃĒn mÃĄy cháģ§. BáēĄn cÃŗ muáģ‘n xÃŗa báēŖn sao đưáģŖc lưu trÃĒn thiáēŋt báģ‹ này không?", + "cleanup_confirm_prompt_title": "XÃŗa kháģi thiáēŋt báģ‹ này?", + "cleanup_deleted_assets": "ÄÃŖ chuyáģƒn {count} táģ‡p vào thÚng rÃĄc", + "cleanup_deleting": "Đang chuyáģƒn vào thÚng rÃĄc...", + "cleanup_found_assets": "PhÃĄt hiáģ‡n {count} táģ‡p đưáģŖc sao lưu", + "cleanup_found_assets_with_size": "PhÃĄt hiáģ‡n {count} đưáģŖc sao lưu ({size})", + "cleanup_icloud_shared_albums_excluded": "Nháģ¯ng album đưáģŖc chia sáēģ trÃĒn iCloud không náēąm trong pháēĄm vi quÊt", + "cleanup_no_assets_found": "Không tÃŦm tháēĨy táģ‡p nào phÚ háģŖp váģ›i điáģu khiáģ‡n trÃĒn. Tính năng GiáēŖi phÃŗng dung lưáģŖng cháģ‰ cÃŗ tháģƒ xÃŗa táģ‡p Ä‘ÃŖ đưáģŖc sao lưu lÃĒn mÃĄy cháģ§", + "cleanup_preview_title": "CÃĄc táģ‡p sáēŊ báģ‹ xÃŗa ({count})", + "cleanup_step3_description": "TÃŦm cÃĄc táģ‡p Ä‘ÃŖ đưáģŖc sao lưu theo báģ™ láģc ngày và giáģ¯ láēĄi cài đáēˇt cáģ§a báēĄn.", + "cleanup_step4_summary": "CÃŗ {count} táģ‡p (đưáģŖc táēĄo trưáģ›c {date}) sáēŊ báģ‹ xÃŗa kháģi thiáēŋt báģ‹ cáģ§a báēĄn. áēĸnh váēĢn cÃŗ tháģƒ Ä‘Æ°áģŖc truy cáē­p báēąng áģŠng dáģĨng Immich.", + "cleanup_trash_hint": "Đáģƒ giáēŖi phÃŗng táģ‘i đa báģ™ nháģ›, vui lÃ˛ng máģŸ áģŠng dáģĨng thư viáģ‡n áēŖnh cáģ§a háģ‡ tháģ‘ng và dáģn sáēĄch thÚng rÃĄc", "clear": "XÃŗa", "clear_all": "XÃŗa táēĨt cáēŖ", "clear_all_recent_searches": "XÃŗa táēĨt cáēŖ tÃŦm kiáēŋm gáē§n đÃĸy", @@ -747,6 +782,8 @@ "client_cert_import": "Nháē­p", "client_cert_import_success_msg": "CháģŠng cháģ‰ khÃĄch Ä‘ÃŖ đưáģŖc nháē­p", "client_cert_invalid_msg": "Táģ‡p cháģŠng cháģ‰ không háģŖp láģ‡ hoáēˇc sai máē­t kháēŠu", + "client_cert_password_message": "Nháē­p máē­t kháēŠu cáģ§a cháģŠng cháģ‰ (certificate) này", + "client_cert_password_title": "Máē­t kháēŠu cáģ§a cháģŠng cháģ‰ (Certificate Password)", "client_cert_remove_msg": "CháģŠng cháģ‰ khÃĄch Ä‘ÃŖ báģ‹ xÃŗa", "client_cert_subtitle": "Cháģ‰ háģ— tráģŖ Ä‘áģ‹nh dáēĄng PKCS12 (.p12, .pfx). Cháģ‰ cÃŗ tháģƒ nháē­p/xÃŗa cháģŠng cháģ‰ trưáģ›c khi đăng nháē­p", "client_cert_title": "CháģŠng cháģ‰ khÃĄch SSL [THáģŦ NGHIáģ†M]", @@ -757,6 +794,11 @@ "color": "Màu", "color_theme": "Màu cháģ§ Ä‘áģ", "command": "DÃ˛ng láģ‡nh", + "command_palette_prompt": "TÃŦm nhanh cÃĄc trang, thao tÃĄc, hoáēˇc láģ‡nh", + "command_palette_to_close": "ÄÃŗng", + "command_palette_to_navigate": "Truy cáē­p", + "command_palette_to_select": "ÄÃĄnh dáēĨu", + "command_palette_to_show_all": "Hiáģƒn tháģ‹ táēĨt cáēŖ", "comment_deleted": "BÃŦnh luáē­n Ä‘ÃŖ báģ‹ xÃŗa", "comment_options": "TÚy cháģn bÃŦnh luáē­n", "comments_and_likes": "BÃŦnh luáē­n & lưáģŖt thích", @@ -821,13 +863,20 @@ "created_at": "ÄÃŖ táēĄo", "creating_linked_albums": "Đang táēĄo album đưáģŖc liÃĒn káēŋt...", "crop": "Cáē¯t", + "crop_aspect_ratio_fixed": "Cáģ‘ Ä‘áģ‹nh", + "crop_aspect_ratio_free": "Táģą do", + "crop_aspect_ratio_original": "NguyÃĒn báēŖn", "curated_object_page_title": "Đáģ‘i tưáģŖng", "current_device": "Thiáēŋt báģ‹ hiáģ‡n táēĄi", "current_pin_code": "MÃŖ PIN hiáģ‡n táēĄi", "current_server_address": "Đáģ‹a cháģ§ mÃĄy cháģ§ hiáģ‡n táēĄi", + "custom_date": "Thiáēŋt láē­p ngày tÚy cháģ‰nh", "custom_locale": "Ngôn ngáģ¯ và khu váģąc", "custom_locale_description": "Đáģ‹nh dáēĄng ngày và sáģ‘ dáģąa trÃĒn ngôn ngáģ¯ và khu váģąc", "custom_url": "URL tÚy cháģ‰nh", + "cutoff_date_description": "Giáģ¯ láēĄi áēŖnh trong vÃ˛ngâ€Ļ", + "cutoff_day": "{count, plural, one {ngày} other {ngày}}", + "cutoff_year": "{count, plural, one {năm} other {năm}}", "daily_title_text_date": "E, dd MMM", "daily_title_text_date_year": "E, dd MMM, yyyy", "dark": "Táģ‘i", @@ -846,8 +895,6 @@ "deduplication_criteria_2": "Sáģ‘ lưáģŖng dáģ¯ liáģ‡u EXIF", "deduplication_info": "Thông tin loáēĄi báģ dáģ¯ liáģ‡u trÚng láēˇp", "deduplication_info_description": "Đáģƒ táģą Ä‘áģ™ng cháģn trưáģ›c và loáēĄi báģ cÃĄc táģ‡p trÚng láēˇp hàng loáēĄt, chÃēng tôi sáēŊ xem xÊt dáģąa trÃĒn:", - "default_locale": "Đáģ‹nh dáēĄng ngày giáģ", - "default_locale_description": "Dáģąa theo trÃŦnh duyáģ‡t cáģ§a báēĄn", "delete": "XÃŗa", "delete_action_confirmation_message": "BáēĄn cÃŗ cháē¯c muáģ‘n xÃŗa táģ‡p này? Thao tÃĄc này sáēŊ chuyáģƒn táģ‡p vào thÚng rÃĄc cáģ§a mÃĄy cháģ§ và sáēŊ háģi báēĄn cÃŗ muáģ‘n xÃŗa nÃŗ cáģĨc báģ™ không", "delete_action_prompt": "{count} Ä‘ÃŖ xÃŗa", @@ -909,6 +956,7 @@ "download_include_embedded_motion_videos": "Video nhÃēng", "download_include_embedded_motion_videos_description": "Gáģ“m cÃĄc video đưáģŖc nhÃēng trong áēŖnh chuyáģƒn đáģ™ng thành máģ™t táģ‡p riÃĒng", "download_notfound": "Không tÃŦm tháēĨy táēŖi xuáģ‘ng", + "download_original": "TáēŖi xuáģ‘ng báēŖn gáģ‘c", "download_paused": "ÄÃŖ táēĄm dáģĢng táēŖi xuáģ‘ng", "download_settings": "TáēŖi xuáģ‘ng", "download_settings_description": "QuáēŖn lÃŊ cài đáēˇt liÃĒn quan đáēŋn viáģ‡c táēŖi áēŖnh xuáģ‘ng", @@ -918,6 +966,7 @@ "download_waiting_to_retry": "Đang cháģ tháģ­ láēĄi", "downloading": "Đang táēŖi xuáģ‘ng", "downloading_asset_filename": "Đang táēŖi xuáģ‘ng táģ‡p {filename}", + "downloading_from_icloud": "Đang táēŖi xuáģ‘ng táģĢ iCloud", "downloading_media": "Đang táēŖi xuáģ‘ng phÆ°ÆĄng tiáģ‡n", "drop_files_to_upload": "KÊo tháēŖ cÃĄc táģ‡p đáģƒ táēŖi lÃĒn", "duplicates": "Táģ‡p trÚng láēˇp", @@ -950,6 +999,18 @@ "editor": "TrÃŦnh cháģ‰nh sáģ­a", "editor_close_without_save_prompt": "Nháģ¯ng thay đáģ•i sáēŊ không đưáģŖc lưu", "editor_close_without_save_title": "ÄÃŗng trÃŦnh cháģ‰nh sáģ­a?", + "editor_confirm_reset_all_changes": "BáēĄn cÃŗ cháē¯c muáģ‘n đáēˇt láēĄi máģi thay đáģ•i không?", + "editor_discard_edits_confirm": "Báģ thay đáģ•i", + "editor_discard_edits_prompt": "BáēĄn cÃŗ nháģ¯ng thay đáģ•i chưa đưáģŖc lưu. BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n háģ§y báģ chÃēng không?", + "editor_discard_edits_title": "Háģ§y thay đáģ•i?", + "editor_edits_applied_error": "Láģ—i khi ÃĄp dáģĨng thay đáģ•i", + "editor_edits_applied_success": "Thay đáģ•i đưáģŖc ÃĄp dáģĨng thành công", + "editor_flip_horizontal": "Láē­t ngang", + "editor_flip_vertical": "Láē­t dáģc", + "editor_orientation": "Đáģ‹nh hưáģ›ng", + "editor_reset_all_changes": "Hoàn tÃĄc táēĨt cáēŖ thay đáģ•i", + "editor_rotate_left": "Xoay 90° ngưáģŖc chiáģu kim đáģ“ng háģ“", + "editor_rotate_right": "Xoay 90° theo chiáģu kim đáģ“ng háģ“", "email": "Email", "email_notifications": "Thông bÃĄo qua email", "empty_folder": "Thư máģĨc tráģ‘ng", @@ -968,11 +1029,14 @@ "error_change_sort_album": "Thay đáģ•i tháģŠ táģą sáē¯p xáēŋp album tháēĨt báēĄi", "error_delete_face": "Láģ—i khi xÃŗa khuôn máēˇt kháģi táģ‡p", "error_getting_places": "Láģ—i khi láēĨy đáģ‹a điáģƒm", + "error_loading_albums": "Láģ—i khi táēŖi cÃĄc táē­p áēŖnh (album)", "error_loading_image": "Láģ—i táēŖi áēŖnh", "error_loading_partners": "Láģ—i khi láēĨy ngưáģi thÃĸn: {error}", + "error_retrieving_asset_information": "Không tháģƒ truy xuáēĨt thông tin táģ‡p", "error_saving_image": "Láģ—i: {error}", "error_tag_face_bounding_box": "Láģ—i gáē¯n tháēģ khuôn máēˇt: - không tháģƒ láēĨy đưáģŖc táģa đáģ™ khung bao", "error_title": "Láģ—i - CÃŗ điáģu gÃŦ Ä‘Ãŗ không đÃēng", + "error_while_navigating": "Không tháģƒ Ä‘iáģu hưáģ›ng đáēŋn táģ‡p", "errors": { "cannot_navigate_next_asset": "Không tháģƒ chuyáģƒn đáēŋn táģ‡p tiáēŋp theo", "cannot_navigate_previous_asset": "Không tháģƒ chuyáģƒn đáēŋn táģ‡p trưáģ›c Ä‘Ãŗ", @@ -1008,6 +1072,7 @@ "failed_to_update_notification_status": "Cáē­p nháē­t tráēĄng thÃĄi thông bÃĄo tháēĨt báēĄi", "incorrect_email_or_password": "Email hoáēˇc máē­t kháēŠu không chính xÃĄc", "library_folder_already_exists": "Đưáģng dáēĢn nháē­p này Ä‘ÃŖ táģ“n táēĄi.", + "page_not_found": "Không tÃŦm tháēĨy trang :/", "paths_validation_failed": "{paths, plural, one {# đưáģng dáēĢn} other {# đưáģng dáēĢn}} không háģŖp láģ‡", "profile_picture_transparent_pixels": "áēĸnh đáēĄi diáģ‡n không tháģƒ cÃŗ điáģƒm áēŖnh trong suáģ‘t. Vui lÃ˛ng phÃŗng to và/hoáēˇc di chuyáģƒn hÃŦnh áēŖnh.", "quota_higher_than_disk_size": "BáēĄn Ä‘ÃŖ đáēˇt háēĄn máģŠc cao hÆĄn dung lưáģŖng áģ• Ä‘ÄŠa", @@ -1096,6 +1161,7 @@ "unable_to_update_workflow": "Không tháģƒ cáē­p nháē­t workflow", "unable_to_upload_file": "Không tháģƒ táēŖi táģ‡p lÃĒn" }, + "errors_text": "Láģ—i", "exclusion_pattern": "MáēĢu ngoáēĄi láģ‡", "exif": "Exif", "exif_bottom_sheet_description": "ThÃĒm mô táēŖ...", @@ -1106,6 +1172,7 @@ "exif_bottom_sheet_people": "MáģŒI NGƯáģœI", "exif_bottom_sheet_person_add_person": "ThÃĒm tÃĒn", "exit_slideshow": "ThoÃĄt trÃŦnh chiáēŋu", + "expand": "Hiáģƒn tháģ‹ Ä‘áē§y đáģ§", "expand_all": "MáģŸ ráģ™ng táēĨt cáēŖ", "experimental_settings_new_asset_list_subtitle": "Đang phÃĄt triáģƒn", "experimental_settings_new_asset_list_title": "Báē­t lưáģ›i áēŖnh tháģ­ nghiáģ‡m", @@ -1141,6 +1208,8 @@ "features_in_development": "Tính năng đang đưáģŖc phÃĄt triáģƒn", "features_setting_description": "QuáēŖn lÃŊ cÃĄc tính năng app", "file_name_or_extension": "TÃĒn hoáēˇc pháē§n máģŸ ráģ™ng táē­p tin", + "file_name_text": "TÃĒn táģ‡p", + "file_name_with_value": "TÃĒn táģ‡p: {file_name}", "file_size": "Kích cáģĄ táģ‡p tin", "filename": "TÃĒn táģ‡p", "filetype": "LoáēĄi táģ‡p", @@ -1148,6 +1217,7 @@ "filter_description": "Điáģu kiáģ‡n đáģƒ láģc táģ‡p máģĨc tiÃĒu", "filter_people": "Láģc ngưáģi", "filter_places": "Láģc đáģ‹a điáģƒm", + "filter_tags": "Báģ™ láģc theo tháēģ", "filters": "Báģ™ láģc", "find_them_fast": "TÃŦm nhanh báēąng tÃĒn váģ›i tÃŦm kiáēŋm", "first": "Đáē§u tiÃĒn", @@ -1158,6 +1228,9 @@ "folders_feature_description": "Duyáģ‡t áēŖnh và video theo thư máģĨc trÃĒn háģ‡ tháģ‘ng táģ‡p", "forgot_pin_code_question": "QuÃĒn mÃŖ PIN?", "forward": "Tiáēŋn táģ›i", + "free_up_space": "GiáēŖi phÃŗng Báģ™ nháģ›", + "free_up_space_description": "Chuyáģƒn hÃŦnh áēŖnh và video Ä‘ÃŖ đưáģŖc sao lưu vào thÚng rÃĄc cáģ§a thiáēŋt báģ‹ Ä‘áģƒ giáēŖi phÃŗng dung lưáģŖng. BáēŖn sao lưu trÃĒn mÃĄy cháģ§ không báģ‹ áēŖnh hưáģŸng.", + "free_up_space_settings_subtitle": "GiáēŖi phÃŗng báģ™ nháģ› cáģ§a thiáēŋt báģ‹", "full_path": "Đưáģng dáēĢn đáē§y đáģ§: {path}", "gcast_enabled": "Google Cast", "gcast_enabled_description": "Tính năng này táēŖi cÃĄc tài nguyÃĒn bÃĒn ngoài táģĢ Google đáģƒ hoáēĄt đáģ™ng.", @@ -1273,8 +1346,15 @@ "json_editor": "BiÃĒn táē­p JSON", "json_error": "Láģ—i JSON", "keep": "Giáģ¯", + "keep_albums": "Giáģ¯ láēĄi cÃĄc táē­p áēŖnh", + "keep_albums_count": "Giáģ¯ láēĄi {count} {count, plural, one {táē­p áēŖnh} other {táē­p áēŖnh}}", "keep_all": "Giáģ¯ táēĨt cáēŖ", + "keep_description": "Cháģn nháģ¯ng gÃŦ sáēŊ đưáģŖc giáģ¯ láēĄi trÃĒn thiáēŋt báģ‹ khi giáēŖi phÃŗng báģ™ nháģ›.", + "keep_favorites": "Giáģ¯ láēĄi cÃĄc máģĨc yÃĒu thích", + "keep_on_device": "Giáģ¯ láēĄi trÃĒn thiáēŋt báģ‹", + "keep_on_device_hint": "Cháģn cÃĄc táģ‡p sáēŊ đưáģŖc giáģ¯ láēĄi trÃĒn thiáēŋt báģ‹", "keep_this_delete_others": "Giáģ¯ táģ‡p này, xÃŗa cÃĄc táģ‡p khÃĄc", + "keeping": "Giáģ¯ láēĄi: {items}", "kept_this_deleted_others": "ÄÃŖ giáģ¯ láēĄi táģ‡p này và xÃŗa {count, plural, one {# táģ‡p} other {# táģ‡p}}", "keyboard_shortcuts": "Phím táē¯t", "language": "Ngôn ngáģ¯", @@ -1368,10 +1448,28 @@ "loop_videos_description": "Báē­t đáģƒ video táģą Ä‘áģ™ng láēˇp láēĄi trong trÃŦnh xem chi tiáēŋt.", "main_branch_warning": "BáēĄn đang dÚng phiÃĒn báēŖn đang phÃĄt triáģƒn; chÃēng tôi khuyÃĒn báēĄn nÃĒn dÚng phiÃĒn báēŖn phÃĄt hành!", "main_menu": "Menu chính", + "maintenance_action_restore": "Khôi pháģĨc CÆĄ sáģŸ dáģ¯ liáģ‡u", "maintenance_description": "Immich Ä‘ÃŖ đưáģŖc đáēˇt vào cháēŋ đáģ™ báēŖo trÃŦ.", "maintenance_end": "Káēŋt thÃēc cháēŋ đáģ™ báēŖo trÃŦ", "maintenance_end_error": "Không tháģƒ káēŋt thÃēc cháēŋ đáģ™ báēŖo trÃŦ.", "maintenance_logged_in_as": "Hiáģ‡n táēĄi Ä‘ÃŖ đăng nháē­p {user}", + "maintenance_restore_from_backup": "Khôi pháģĨc táģĢ báēŖn sao lưu", + "maintenance_restore_library": "Khôi pháģĨc Thư viáģ‡n cáģ§a báēĄn", + "maintenance_restore_library_confirm": "Náēŋu náģ™i dáģĨng hiáģ‡n tháģ‰ là chính xÃĄc, hÃŖy tiáēŋp táģĨc quÃĄ trÃŦnh khôi pháģĨc!", + "maintenance_restore_library_description": "Khôi pháģĨc CÆĄ sáģŸ dáģ¯ liÃĒu", + "maintenance_restore_library_folder_has_files": "Thư máģĨc {folder} cÃŗ {count} thư máģĨc", + "maintenance_restore_library_folder_no_files": "Thư máģĨc {folder} thiáēŋu máģ™t sáģ‘ táģ‡p!", + "maintenance_restore_library_folder_pass": "ĐưáģŖc phÊp đáģc và cháģ‰nh sáģ­a", + "maintenance_restore_library_folder_read_fail": "Không đưáģŖc phÊp đáģc", + "maintenance_restore_library_folder_write_fail": "Không đưáģŖc phÊp cháģ‰nh sáģ­a", + "maintenance_restore_library_hint_missing_files": "Máģ™t sáģ‘ táģ‡p quan tráģng cÃŗ tháģƒ Ä‘ang báģ‹ tháēĨt láēĄc", + "maintenance_restore_library_hint_regenerate_later": "BáēĄn cÃŗ tháģƒ táēĄo láēĄi nháģ¯ng tháģŠ này trong pháē§n Cài đáēˇt", + "maintenance_restore_library_hint_storage_template_missing_files": "BáēĄn cÃŗ đang sáģ­ dáģĨng máēĢu lưu tráģ¯ (storage template) không? Máģ™t sáģ‘ táģ‡p cÃŗ tháģƒ Ä‘ang báģ‹ tháēĨt láēĄc", + "maintenance_restore_library_loading": "Đang kháģŸi cháēĄy kiáģƒm tra và phÃĸn tích tính toàn váēšnâ€Ļ", + "maintenance_task_backup": "Đang táēĄo máģ™t báēŖng sao lưu cho cÆĄ sáģŸ dáģ¯ liáģ‡u hiáģ‡n táēĄiâ€Ļ", + "maintenance_task_migrations": "Đang tháģąc hiáģ‡n di chuyáģƒn cÆĄ sáģŸ dáģ¯ liáģ‡uâ€Ļ", + "maintenance_task_restore": "Đang khôi pháģĨc báēŖn sao lưu Ä‘ÃŖ cháģnâ€Ļ", + "maintenance_task_rollback": "Khôi pháģĨc tháēĨt báēĄi, đang quay láēĄi điáģƒm khôi pháģĨc trưáģ›c Ä‘Ãŗâ€Ļ", "maintenance_title": "TáēĄm tháģi không kháēŖ dáģĨng", "make": "ThÆ°ÆĄng hiáģ‡u", "manage_geolocation": "QuáēŖn lÃŊ đáģ‹a điáģƒm", @@ -1433,6 +1531,8 @@ "minimize": "Thu nháģ", "minute": "PhÃēt", "minutes": "PhÃēt", + "mirror_horizontal": "Theo chiáģu ngang", + "mirror_vertical": "Dáģc", "missing": "Thiáēŋu", "mobile_app": "áģ¨ng dáģĨng di đáģ™ng", "mobile_app_download_onboarding_note": "TáēŖi xuáģ‘ng app đáģ“ng hành báēąng cÃĄc tÚy cháģn sau", @@ -1444,6 +1544,7 @@ "move_down": "Di chuyáģƒn xuáģ‘ng", "move_off_locked_folder": "Di chuyáģƒn ra kháģi thư máģĨc KhÃŗa", "move_to": "Chuyáģƒn đáēŋn", + "move_to_device_trash": "Chuyáģƒn đáēŋn thÚng rÃĄc cáģ§a thiáēŋt báģ‹", "move_to_lock_folder_action_prompt": "{count} Ä‘ÃŖ đưáģŖc thÃĒm vào thư máģĨc KhÃŗa", "move_to_locked_folder": "Di chuyáģƒn đáēŋn thư máģĨc KhÃŗa", "move_to_locked_folder_confirmation": "áēĸnh và video này sáēŊ báģ‹ xÃŗa kháģi cÃĄc album, cháģ‰ cÃŗ tháģƒ xem đưáģŖc trong thư máģĨc KhÃŗa", @@ -1483,11 +1584,12 @@ "next_memory": "Káģˇ niáģ‡m tiáēŋp theo", "no": "Không", "no_actions_added": "Chưa cÃŗ hành đáģ™ng nào đưáģŖc thÃĒm vào", + "no_albums_found": "Không phÃĄt hiáģ‡n táē­p áēŖnh nào", "no_albums_message": "TáēĄo album đáģƒ sáē¯p xáēŋp áēŖnh và video cáģ§a báēĄn", "no_albums_with_name_yet": "CÃŗ váēģ như báēĄn chưa cÃŗ báēĨt káģŗ album nào váģ›i tÃĒn này.", "no_albums_yet": "CÃŗ váēģ như báēĄn chưa cÃŗ báēĨt káģŗ album nào.", "no_archived_assets_message": "Lưu tráģ¯ áēŖnh và video đáģƒ áēŠn chÃēng kháģi thư viáģ‡n áēĸnh cáģ§a báēĄn", - "no_assets_message": "NHáē¤N VÀO Đáģ‚ TáēĸI LÊN áēĸNH ĐáēĻU TIÊN CáģĻA Báē N", + "no_assets_message": "NháēĨn vào đáģƒ táēŖi lÃĒn áēŖnh cáģ§a báēĄn láē§n đáē§u tiÃĒn", "no_assets_to_show": "Không cÃŗ gÃŦ đáģƒ hiáģƒn tháģ‹", "no_cast_devices_found": "Không tÃŦm tháēĨy thiáēŋt báģ‹ chiáēŋu", "no_checksum_local": "Không cÃŗ checksum kháēŖ dáģĨng - không tháģƒ truy xuáēĨt táģ‡p trÃĒn thiáēŋt báģ‹", @@ -1512,6 +1614,7 @@ "no_results_description": "Tháģ­ máģ™t táģĢ Ä‘áģ“ng nghÄŠa hoáēˇc táģĢ khÃŗa táģ•ng quÃĄt hÆĄn", "no_shared_albums_message": "TáēĄo máģ™t album đáģƒ chia sáēģ áēŖnh và video váģ›i máģi ngưáģi trong máēĄng cáģ§a báēĄn", "no_uploads_in_progress": "Không cÃŗ táēŖi lÃĒn nào đang tiáēŋn hành", + "none": "Tráģ‘ng", "not_allowed": "Không cho phÊp", "not_available": "Thiáēŋu", "not_in_any_album": "Không thuáģ™c album nào", @@ -1545,6 +1648,7 @@ "online": "Tráģąc tuyáēŋn", "only_favorites": "Cháģ‰ lưáģŖt thích", "open": "MáģŸ", + "open_calendar": "Hiáģ‡n tháģ‹ láģ‹ch", "open_in_map_view": "MáģŸ trong báēŖn đáģ“", "open_in_openstreetmap": "MáģŸ trong OpenStreetMap", "open_the_search_filters": "MáģŸ báģ™ láģc tÃŦm kiáēŋm", @@ -1625,6 +1729,7 @@ "photos_and_videos": "áēĸnh & Video", "photos_count": "{count, plural, one {{count, number} áēĸnh} other {{count, number} áēĸnh}}", "photos_from_previous_years": "áēĸnh táģĢ cÃĄc năm trưáģ›c", + "photos_only": "Cháģ‰ bao gáģ“m áēŖnh", "pick_a_location": "Cháģn máģ™t váģ‹ trí", "pick_custom_range": "TÚy cháģ‰nh khoáēŖng", "pick_date_range": "Cháģn khoáēŖng ngày", @@ -1705,7 +1810,6 @@ "rating_clear": "XÃŗa xáēŋp háēĄng", "rating_count": "{count, plural, one {# sao} other {# sao}}", "rating_description": "Hiáģƒn tháģ‹ xáēŋp háēĄng EXIF trong báēŖng thông tin", - "rating_set": "ÄÃĄnh giÃĄ đáēˇt thành {rating, plural, one {# sao} other {# sao}}", "reaction_options": "TÚy cháģn pháēŖn áģŠng", "read_changelog": "Đáģc nháē­t kÃŊ thay đáģ•i", "readonly_mode_disabled": "ÄÃŖ táē¯t cháēŋ đáģ™ cháģ‰-xem", @@ -1805,9 +1909,11 @@ "saved_settings": "Cài đáēˇt Ä‘ÃŖ lưu", "say_something": "NÃŗi điáģu gÃŦ Ä‘Ãŗ", "scaffold_body_error_occurred": "XáēŖy ra láģ—i", + "scan": "QuÊt", "scan_all_libraries": "QuÊt táēĨt cáēŖ thư viáģ‡n", "scan_library": "QuÊt", "scan_settings": "Cài đáēˇt quÊt", + "scanning": "Đang quÊt", "scanning_for_album": "Đang quÊt album...", "search": "TÃŦm kiáēŋm", "search_albums": "TÃŦm album", @@ -1837,6 +1943,8 @@ "search_filter_media_type_title": "Cháģn loáēĄi phÆ°ÆĄng tiáģ‡n", "search_filter_ocr": "TÃŦm báēąng OCR", "search_filter_people_title": "Cháģn ngưáģi", + "search_filter_star_rating": "Xáēŋp háēĄng sao", + "search_filter_tags_title": "Cháģn cÃĄc tháēģ", "search_for": "TÃŦm kiáēŋm", "search_for_existing_person": "TÃŦm ngưáģi hiáģ‡n cÃŗ", "search_no_more_result": "Không cÃ˛n káēŋt quáēŖ", @@ -1879,6 +1987,7 @@ "select_all_in": "Cháģn táēĨt cáēŖ trong {group}", "select_avatar_color": "Cháģn màu áēŖnh đáēĄi diáģ‡n", "select_count": "{count, plural, one {Cháģn #} other {Cháģn #}}", + "select_cutoff_date": "Cháģn giáģ›i háēĄn tháģi gian", "select_face": "Cháģn khuôn máēˇt", "select_featured_photo": "Cháģn áēŖnh náģ•i báē­t", "select_from_computer": "Cháģn táģĢ mÃĄy tính", @@ -1915,6 +2024,9 @@ "set_profile_picture": "Đáēˇt áēŖnh đáēĄi diáģ‡n", "set_slideshow_to_fullscreen": "Đáēˇt trÃŦnh chiáēŋu áģŸ cháēŋ đáģ™ toàn màn hÃŦnh", "set_stack_primary_asset": "Đáēˇt làm tài sáēŖn chính", + "setting_image_navigation_enable_subtitle": "Náēŋu đưáģŖc báē­t, báēĄn cÃŗ tháģƒ Ä‘iáģu hưáģ›ng đáēŋn áēŖnh phía trưáģ›c/káēŋ tiáēŋp báēąng cÃĄch cháēĄm vào pháē§n tư bÃĒn trÃĄi/pháēŖi màn hÃŦnh.", + "setting_image_navigation_enable_title": "CháēĄm đáģƒ Ä‘iáģu hưáģ›ng", + "setting_image_navigation_title": "Điáģu hưáģ›ng hÃŦnh áēŖnh", "setting_image_viewer_help": "TrÃŦnh xem áēŖnh táēŖi áēŖnh thu nháģ cáģĄ nháģ trưáģ›c, sau Ä‘Ãŗ táēŖi cáģĄ trung bÃŦnh (náēŋu đưáģŖc báē­t), cuáģ‘i cÚng táēŖi báēŖn gáģ‘c (náēŋu đưáģŖc báē­t).", "setting_image_viewer_original_subtitle": "Báē­t đáģƒ táēŖi áēŖnh gáģ‘c áģŸ Ä‘áģ™ phÃĸn giáēŖi đáē§y đáģ§ (dung lưáģŖng láģ›n). Táē¯t đáģƒ giáēŖm máģŠc sáģ­ dáģĨng dáģ¯ liáģ‡u (máģŠc sáģ­ dáģĨng máēĄng và báģ™ nháģ› Ä‘áģ‡m trÃĒn thiáēŋt báģ‹).", "setting_image_viewer_original_title": "TáēŖi áēŖnh gáģ‘c", @@ -2040,6 +2152,8 @@ "skip_to_folders": "Chuyáģƒn đáēŋn thư máģĨc", "skip_to_tags": "Chuyáģƒn đáēŋn tháēģ", "slideshow": "TrÃŦnh chiáēŋu", + "slideshow_repeat": "TrÃŦnh chiáēŋu láēĄi", + "slideshow_repeat_description": "PhÃĄt láēĄi táģĢ Ä‘áē§u khi trÃŦnh chiáēŋu káēŋt thÃēc", "slideshow_settings": "Cài đáēˇt trÃŦnh chiáēŋu", "sort_albums_by": "Sáē¯p xáēŋp album theo...", "sort_created": "Ngày táēĄo", @@ -2079,6 +2193,7 @@ "support": "Háģ— tráģŖ", "support_and_feedback": "Háģ— tráģŖ & GÃŗp ÃŊ", "support_third_party_description": "BáēŖn cài đáēˇt Immich cáģ§a báēĄn đưáģŖc Ä‘Ãŗng gÃŗi báģŸi máģ™t bÃĒn tháģŠ ba. CÃĄc sáģą cáģ‘ báēĄn gáēˇp pháēŖi cÃŗ tháģƒ do gÃŗi Ä‘Ãŗ gÃĸy ra, vÃŦ váē­y vui lÃ˛ng bÃĄo cÃĄo sáģą cáģ‘ váģ›i háģ trưáģ›c báēąng cÃĄch sáģ­ dáģĨng cÃĄc liÃĒn káēŋt bÃĒn dưáģ›i.", + "supporter": "Ngưáģi háģ— tráģŖ", "swap_merge_direction": "Đáģ•i hưáģ›ng háģŖp nháēĨt", "sync": "Đáģ“ng báģ™", "sync_albums": "Đáģ“ng báģ™ album", @@ -2092,7 +2207,7 @@ "tag_assets": "Gáē¯n tháēģ", "tag_created": "ÄÃŖ táēĄo tháēģ: {tag}", "tag_feature_description": "Duyáģ‡t áēŖnh và video đưáģŖc nhÃŗm theo cháģ§ Ä‘áģ tháēģ háģŖp lÃŊ", - "tag_not_found_question": "Không tÃŦm tháēĨy tháēģ? TáēĄo máģ™t tháēģ máģ›i", + "tag_not_found_question": "Không tÃŦm tháēĨy tháēģ? Create a new tag. (TáēĄo máģ™t tháēģ máģ›i)", "tag_people": "Gáē¯n tháēģ Máģi ngưáģi", "tag_updated": "ÄÃŖ cáē­p nháē­t tháēģ: {tag}", "tagged_assets": "ÄÃŖ gáē¯n tháēģ {count, plural, one {# táģ‡p} other {# táģ‡p}}", @@ -2116,6 +2231,7 @@ "theme_setting_theme_subtitle": "Cháģn cài đáēˇt giao diáģ‡n app", "theme_setting_three_stage_loading_subtitle": "TáēŖi ba giai đoáēĄn cÃŗ tháģƒ tăng táģ‘c đáģ™ táēŖi áēŖnh nhưng sáēŊ táģ‘n dáģ¯ liáģ‡u máēĄng Ä‘ÃĄng káģƒ", "theme_setting_three_stage_loading_title": "Báē­t táēŖi ba giai đoáēĄn", + "then": "Tiáēŋp theo", "they_will_be_merged_together": "ChÃēng sáēŊ đưáģŖc háģŖp nháēĨt váģ›i nhau", "third_party_resources": "Tài nguyÃĒn bÃĒn tháģŠ ba", "time": "Tháģi gian", @@ -2171,6 +2287,7 @@ "unhide_person": "Hiáģ‡n ngưáģi", "unknown": "Không xÃĄc đáģ‹nh", "unknown_country": "Quáģ‘c gia chưa rÃĩ", + "unknown_date": "Dáģ¯ liáģ‡u không xÃĄc đáģ‹nh", "unknown_year": "Năm không rÃĩ", "unlimited": "Không giáģ›i háēĄn", "unlink_motion_video": "Háģ§y liÃĒn káēŋt video chuyáģƒn đáģ™ng", @@ -2188,6 +2305,7 @@ "unstack_action_prompt": "{count} Ä‘ÃŖ báģ nhÃŗm", "unstacked_assets_count": "ÄÃŖ háģ§y xáēŋp nhÃŗm {count, plural, one {# táģ‡p} other {# táģ‡p}}", "unsupported_field_type": "LoáēĄi trưáģng không đưáģŖc háģ— tráģŖ", + "unsupported_file_type": "Táģ‡p {file} không tháģƒ Ä‘Æ°áģŖc táēŖi lÃĒn vÃŦ loáēĄi táģ‡p {type} không đưáģŖc háģ— tráģŖ.", "untagged": "Chưa gáē¯n tháēģ", "untitled_workflow": "Workflow chưa đáēˇt tÃĒn", "up_next": "Tiáēŋp theo", @@ -2199,6 +2317,7 @@ "upload_details": "Chi tiáēŋt táēŖi lÃĒn", "upload_dialog_info": "BáēĄn cÃŗ muáģ‘n sao lưu nháģ¯ng táģ‡p Ä‘ÃŖ cháģn lÃĒn mÃĄy cháģ§ không?", "upload_dialog_title": "TáēŖi lÃĒn táģ‡p", + "upload_error_with_count": "Không tháģƒ táēŖi lÃĒn {count, plural, one {# táģ‡p} other {# táģ‡p}}", "upload_errors": "ÄÃŖ hoàn táēĨt táēŖi lÃĒn váģ›i {count, plural, one {# láģ—i} other {# láģ—i}}, làm máģ›i trang đáģƒ xem cÃĄc táģ‡p váģĢa táēŖi lÃĒn.", "upload_finished": "ÄÃŖ hoàn táēĨt táēŖi lÃĒn", "upload_progress": "CÃ˛n láēĄi {remaining, number} - ÄÃŖ xáģ­ lÃŊ {processed, number}/{total, number}", @@ -2213,7 +2332,7 @@ "url": "URL", "usage": "Sáģ­ dáģĨng", "use_biometric": "DÚng sinh tráē¯c háģc", - "use_current_connection": "dÚng káēŋt náģ‘i hiáģ‡n táēĄi", + "use_current_connection": "DÚng káēŋt náģ‘i hiáģ‡n táēĄi", "use_custom_date_range": "Cháģn khoáēŖng tháģi gian tÚy cháģ‰nh", "user": "Ngưáģi dÚng", "user_has_been_deleted": "Ngưáģi dÚng này Ä‘ÃŖ báģ‹ xÃŗa.", diff --git a/i18n/yue_Hant.json b/i18n/yue_Hant.json index 372816da2a..ab1ff60fef 100644 --- a/i18n/yue_Hant.json +++ b/i18n/yue_Hant.json @@ -40,14 +40,20 @@ "add_to_albums_count": "加 ({count}) å€‹é …į›Žč‡ŗį›¸į°ŋ", "add_to_bottom_bar": "åŠ č‡ŗ", "add_to_shared_album": "åŠ č‡ŗå…ąäēĢᛏį°ŋ", + "add_upload_to_stack": "新åĸžä¸Šå‚ŗåˆ°å †į–Š", "add_url": "加įļ˛å€", "add_workflow_step": "åĸžåŠ åˇĨäŊœæ­Ĩ驟", + "added_to_archive": "厞æˇģč‡ŗå°å­˜", "added_to_favorites": "åˇ˛åŠ č‡ŗæœ€æ„›", "added_to_favorites_count": "厞加{count, number} å€‹é …į›Žč‡ŗæœ€æ„›", "admin": { + "add_exclusion_pattern_description": "æˇģåŠ æŽ’é™¤æ¨Ąåŧã€‚支持äŊŋᔍ *、** 同? 嘅čŦį”¨å­—å…ƒæ¯”å° (Globbing)。䞋åĻ‚īŧŒäŊŋį”¨ã€Œ**/Raw/**」åŋŊį•ĨäģģäŊ•rawæĒ”æĄˆīŧŒæˆ–č€…åˇ˛ã€Œ**/*.tif」åŋŊį•Ĩ全部äģĨ「.tif」įĩå°žįš„æĒ”æĄˆīŧ›åĻ‚æžœčρåŋŊį•Ĩį‰šåŽšå˜…įĩ•å°čˇ¯åž‘čĢ‹äŊŋį”¨ã€Œ/path/to/ignore/**」。", "admin_user": "įŽĄį†å“Ąį”¨æˆļ", + "asset_offline_description": "æĩ唔到å‘ĸ個外部åĒ’éĢ”åēĢīŧŒåˇ˛įļ“å°‡äŊĸį§ģ動到垃圞æĄļ。åĻ‚æžœå‘ĸ個æĒ”æĄˆäŋ‚å–ēåĒ’éĢ”åēĢå…Ĩéĸį§ģå‹•å˜…čŠąīŧŒčĢ‹å–ē時間čģ¸å…Ĩéĸæĩčŋ”æ–°å˜…å°æ‡‰é …į›Žã€‚åĻ‚æžœčĻé‚„åŽŸå‘ĸå€‹é …į›Žå˜…čŠąīŧŒčĢ‹įĸēäŋä¸‹æ–šå˜…æĒ”æĄˆčˇ¯åž‘äŋ‚可äģĨčĸĢImmichæŸĨé–ąå˜…īŧŒä¸Ļ重新掃描åĒ’éĢ”åēĢ。", "authentication_settings": "éŠ—č­‰č¨­åŽš", "authentication_settings_description": "įŽĄį†å¯†įĸŧ、OAuth 同å…ļäģ–éŠ—č­‰č¨­åŽš", + "authentication_settings_disable_all": "äŊ įĸē厚äŊ čĻåœį”¨æ‰€æœ‰į™ģå…Ĩ嘅斚åŧå—ŽīŧŸäŊ æœƒåŽŒå…¨å†‡čžĻæŗ•į™ģå…Ĩ。", + "authentication_settings_reenable": "åĻ‚æžœäŊ čĻé‡æ–°å•Ÿį”¨å˜…čŠąīŧŒčĢ‹äŊŋį”¨å˜…äŧ翜å™¨æŒ‡äģ¤ã€‚", "background_task_job": "čƒŒæ™¯æ“äŊœ", "backup_database": "åģēįĢ‹čŗ‡æ–™åēĢ備äģŊ", "backup_database_enable_description": "å•Ÿį”¨čŗ‡æ–™åēĢ備äģŊ", @@ -55,6 +61,7 @@ "backup_onboarding_1_description": "äŋ‚雲įĢ¯æˆ–č€…å…ļäģ–å¯ĻéĢ”åœ°æ–šåģēįĢ‹å˜…å‚™äģŊ副æœŦ。", "backup_onboarding_2_description": "å„˛å­˜äŋ‚å””åŒčŖįŊŽå˜…æœŦ地副æœŦ。包åĢä¸ģčĻå˜…æĒ”æĄˆåŒåŸ‹å–ēæœŦ抟嘅備äģŊ。", "backup_onboarding_3_description": "čŗ‡æ–™åŒ…åĢ原始文äģļīŧŒį¸Ŋå…ąå‚™äģŊ嘅æŦĄæ•¸ã€‚å‘ĸ個包æ‹Ŧ1äģŊį•°åœ°å˜…å‚™äģŊ同埋2äģŊæœŦ抟副æœŦ。", + "backup_onboarding_description": "我哋åģēč­°äŊ äŊŋį”¨å˜…3-2-1備äģŊ嚟äŋéšœäŊ å˜…čŗ‡æ–™ã€‚į‚ē咗可äģĨ全斚äŊåœ°å‚™äģŊäŊ å˜…čŗ‡æ–™īŧŒäŊ æ‡‰čОäŋį•™åˇ˛įļ“ä¸Šå‚ŗå˜…į›¸/åŊąį‰‡å˜…副æœŦīŧŒåŒåŸ‹Immichå˜…čŗ‡æ–™åēĢīŧŒã€‚", "backup_onboarding_footer": "有關å…ļäģ–Immich備äģŊå˜…čŗ‡æ–™īŧŒčĢ‹åƒč€ƒã€‚", "backup_onboarding_parts_title": "一個3-2-1備äģŊ包æ‹Ŧīŧš", "backup_onboarding_title": "備äģŊ", @@ -65,7 +72,126 @@ "confirm_delete_library": "äŊ äŋ‚å””äŋ‚įĸē厚čĻéŸé™¤{library}å˜…å¤–éƒ¨čŗ‡æ–™åēĢīŧŸ", "confirm_delete_library_assets": "äŊ äŋ‚å””äŋ‚įĸē厚čĻéŸé™¤å‘ĸ個外部åĒ’éĢ”åēĢīŧŸImmich將會鏟除 {count, plural, one {# å€‹é …į›Ž} other {# å€‹é …į›Ž}}īŧŒä¸”į„Ąæŗ•æ’¤å›žã€‚æĒ”æĄˆäģį„ļ會čĸĢäŋį•™å–ēįĄŦįĸŸå…Ĩéĸ。", "confirm_email_below": "čĢ‹å–ēåē•下čŧ¸å…Ĩ{email}厞įĸēčĒ", - "confirm_reprocess_all_faces": "äŊ įĸē厚čĻé‡æ–°č™•į†æ‰€æœ‰å˜…éĸ螌īŧŸå‘ĸå€‹éŽį¨‹äēĻéƒŊæœƒæ¸…é™¤åˇ˛å‘Ŋ名嘅äēēį‰Šã€‚" + "confirm_reprocess_all_faces": "äŊ įĸē厚čĻé‡æ–°č™•į†æ‰€æœ‰å˜…éĸ螌īŧŸå‘ĸå€‹éŽį¨‹äēĻéƒŊæœƒæ¸…é™¤åˇ˛å‘Ŋ名嘅äēēį‰Šã€‚", + "confirm_user_password_reset": "äŊ äŋ‚å””äŋ‚įĸē厚äŊ čĻé‡č¨­{user}嘅密įĸŧīŧŸ", + "confirm_user_pin_code_reset": "äŊ äŋ‚å””äŋ‚įĸē厚äŊ čĻé‡č¨­{user}嘅PINįĸŧīŧŸ", + "copy_config_to_clipboard_description": "å°‡č€ŒåŽļ嘅įŗģįĩąč¨­åޚäģĨ JSON æ ŧåŧč¤‡čŖŊ到å‰Ēč˛ŧį°ŋ", + "create_job": "åģēįĢ‹äģģ務", + "cron_expression": "Cron 表達åŧ", + "cron_expression_description": "äŊŋᔍ Cron æ ŧåŧåšŸč¨­åŽšæŽƒæå˜…é–“éš”ã€‚æ›´å¤šå˜…čŗ‡č¨ŠčĢ‹æŸĨ閱 Crontab Guru", + "cron_expression_presets": "Cron 表達åŧé č¨­é¸é …", + "disable_login": "停æ­ĸäŊŋᔍį™ģå…Ĩ", + "duplicate_detection_job_description": "é‹į”¨æŠŸæĸ°å­¸įŋ’īŧŒäžé æ™ē慧搜尋嚟åĩæ¸Ŧᛏäŧŧå˜…į›¸į‰‡", + "exclusion_pattern_description": "äŊ å¯äģĨį”¨æŽ’é™¤æ¨Ąåŧå–ē掃描åĒ’éĢ”åēĢæ™‚åŋŊį•Ĩį‰šåŽšå˜…æĒ”æĄˆåŒčŗ‡æ–™å¤žã€‚å–ēæŸå•˛čŗ‡æ–™å¤žæœ‰äŊ å””æƒŗåŠ å…Ĩ嘅æĒ”æĄˆīŧˆäž‹åĻ‚RAWᛏīŧ‰å˜…æƒ…æŗä¸‹å‘ĸ個功čƒŊ將會åĨŊæœ‰į”¨ã€‚", + "export_config_as_json_description": "å°‡į›Žå‰å˜…įŗģįĩąč¨­åŽšä¸‹čŧ‰į‚ē JSON æĒ”æĄˆ", + "external_libraries_page_description": "įŽĄį†å¤–éƒ¨åĒ’éĢ”åēĢ嘅頁éĸ", + "face_detection": "äēēéĸåĩæ¸Ŧ", + "face_detection_description": "į”¨æŠŸå™¨å­¸įŋ’åšŸæœå°‹į›¸ä¸­å˜…ã€‚", + "failed_job_command": "åŸˇčĄŒ{job}äģģ務嘅{command}指äģ¤å¤ąæ•—", + "force_delete_user_warning": "č­Ļ告īŧšå‘ĸ個會įĢ‹åŗåˆĒ除ᔍæˆļ同埋äŊĸ所有嘅æĒ”æĄˆã€‚å‘ĸ個äŋ‚į„Ąæŗ•æ’¤éŠˇå˜…å‹•äŊœīŧŒč€Œä¸”åˆĒ除嘅æĒ”æĄˆå°‡å†‡čžĻæŗ•åžŠåŽŸã€‚", + "image_format": "æ ŧåŧ", + "image_format_description": "WebP æ ŧåŧį›¸å˜…æĒ”æĄˆæœƒæ¯” JPEG į´°īŧŒäŊ†äŋ‚ᎍįĸŧ嘅速åēĻæœƒæ…ĸå•˛ã€‚", + "image_fullsize_description": "厞åˆĒ除元數據嘅全å°ē坏ᛏīŧŒå–ēæ”žå¤§į›¸å˜…æ™‚å€™į”¨å˜…", + "image_fullsize_enabled": "å•Ÿį”¨å…¨å°ēå¯¸å˜…åœ–į‰‡į”Ÿæˆ", + "image_fullsize_enabled_description": "į‚ē非įļ˛é å‹å–„æ ŧåŧį”Ÿæˆå¤§å°ēå¯¸åœ–į‰‡ã€‚å•Ÿį”¨", + "image_fullsize_quality_description": "į”ą 1 到 100īŧŒį”Ÿæˆå…¨å°ēå¯¸åœ–į‰‡å˜…čŗĒį´ ã€‚æ•¸å€ŧčļŠé̘į•ĢčŗĒčļŠåĨŊīŧŒäŊ†äŋ‚æĒ”æĄˆæœƒæ›´åŠ å¤§ã€‚", + "image_fullsize_title": "全å°ēå¯¸åœ–į‰‡č¨­åŽš", + "image_prefer_embedded_preview": "偏向åĩŒå…Ĩ預čĻŊ", + "image_prefer_wide_gamut": "傞向åģŖč‰˛åŸŸ", + "image_preview_description": "䏭ᭉå°ēå¯¸å˜…åœ–į‰‡īŧŒį”¨åšŸæĒĸčĻ–å–Žä¸€åŊąåƒåŒåŸ‹æŠŸå™¨å­¸įŋ’", + "image_preview_title": "預čĻŊč¨­åŽš", + "image_progressive": "逐æ­Ĩ", + "image_progressive_description": "對 JPEG åœ–į‰‡æŽĄį”¨æŧ¸é€˛åŧįˇ¨įĸŧīŧŒäģĨå¯Ļįžæŧ¸é€˛åŧčŧ‰å…ĨéĄ¯į¤ē。å‘ĸ個選項唔會åŊąéŸŋ WebP åœ–į‰‡ã€‚", + "image_quality": "品čŗĒ", + "image_resolution": "č§ŖåƒåēĻ", + "image_resolution_description": "čŧƒéĢ˜å˜…č§ŖåƒåēĻ可äģĨäŋį•™æ›´å¤šį´°į¯€īŧŒäŊ†äŋ‚ᎍįĸŧæ™‚é–“é•ˇīŧŒæĒ”æĄˆå¤§į´°æœƒæ›´åŠ å¤§īŧŒč€Œä¸”可čƒŊ降äŊŽæ‡‰į”¨å˜…反應速åēĻ。", + "image_settings": "åœ–į‰‡č¨­åŽš", + "image_settings_description": "įŽĄį†į”Ÿæˆåœ–į‰‡å˜…å“čŗĒåŒåŸ‹č§ŖåƒåēĻ", + "image_thumbnail_description": "剝é›ĸå…ƒæ•¸æ“šå˜…į¸Žåœ–īŧŒį”¨åšŸå–ēį‡å¤§é‡į›¸å˜…æ™‚å€™äŊŋᔍīŧŒäž‹åĻ‚ä¸ģæ™‚é–“įˇš", + "image_thumbnail_quality_description": "į¸Žåœ–å“čŗĒīŧˆ1-100īŧ‰ã€‚數å€ŧčļŠé̘į•ĢčŗĒčļŠåĨŊīŧŒäŊ†äŋ‚æĒ”æĄˆæ›´åŠ å¤§īŧŒč€Œä¸”可čƒŊ降äŊŽæ‡‰į”¨å˜…回應速åēĻ。", + "image_thumbnail_title": "į¸Žåœ–č¨­åŽš", + "import_config_from_json_description": "é€éŽä¸Šå‚ŗ JSON č¨­åŽšåšŸå°Žå…Ĩįŗģįĩąč¨­åޚ", + "job_concurrency": "{job} ä¸ĻčĄŒæ•¸", + "job_created": "厞åģēįĢ‹äģģ務", + "job_not_concurrency_safe": "å‘ĸ個äģģ務唔支援ä¸ĻčĄŒåŸˇčĄŒã€‚", + "job_settings": "äģģå‹™č¨­åŽš", + "job_settings_description": "įŽĄį†äģģ務ä¸ĻčĄŒæ•¸", + "jobs_delayed": "{jobCount, plural, other {# 個äģģå‹™æŽ¨é˛}}", + "jobs_failed": "{jobCount, plural, other {# 個äģģå‹™å¤ąæ•—}}", + "jobs_over_time": "äģģ務數量čļ¨å‹ĸ", + "library_created": "厞åģēįĢ‹åĒ’éĢ”åēĢīŧš{library}", + "library_deleted": "åĒ’éĢ”åēĢ厞åˆĒ除", + "library_details": "åĒ’éĢ”åēĢčŠŗį´°čŗ‡č¨Š", + "library_folder_description": "指厚čĻå°Žå…Ĩ嘅文äģļ夞。įŗģįĩąå°‡æœƒæŽƒæå‘ĸ個文äģļ夞īŧˆåŒ…åĢ子文äģļ夞īŧ‰ä¸­æ‰€æœ‰å˜…į›¸åŒåŸ‹åŊąį‰‡ã€‚", + "library_remove_exclusion_pattern_prompt": "äŋ‚å””äŋ‚įĸē厚čρį§ģ除å‘ĸå€‹æŽ’é™¤æ¨ĄåŧīŧŸ", + "library_remove_folder_prompt": "äŋ‚å””äŋ‚įĸē厚čρåˆĒ除å‘ĸ個導å…Ĩ文äģļ夞īŧŸ", + "library_scanning": "厚期掃描", + "library_scanning_description": "č¨­åŽšåŽšæœŸæŽƒæ", + "library_scanning_enable_description": "å•Ÿį”¨åŽšæœŸæŽƒæ", + "library_settings": "外部åĒ’éĢ”åēĢ", + "library_settings_description": "įŽĄį†å¤–éƒ¨åĒ’éĢ”åēĢč¨­åŽš", + "library_tasks_description": "掃描外部åĒ’éĢ”åēĢäģĨæĩå‡ē新åĸžåŒåŸ‹čŽŠæ›´å˜…æ–‡äģļ", + "library_updated": "åˇ˛æ›´æ–°åĒ’éĢ”åēĢ", + "library_watching_enable_description": "ᛪčĻ–å¤–éƒ¨åĒ’éĢ”åēĢ嘅æĒ”æĄˆčŽŠåŒ–", + "library_watching_settings": "åĒ’éĢ”åēĢį›ŖæŽ§ [å¯Ļ銗性]", + "library_watching_settings_description": "č‡Ēå‹•į›ŖæŽ§æĒ”æĄˆå˜…čŽŠåŒ–", + "logging_enable_description": "å•Ÿį”¨į´€éŒ„åŠŸčƒŊ", + "logging_level_description": "å•Ÿį”¨æ™‚å˜…į´€éŒ„åą¤į´šã€‚", + "logging_settings": "į´€éŒ„", + "machine_learning_availability_checks": "å¯į”¨æ€§æĒĸæŸĨ", + "machine_learning_availability_checks_description": "č‡Ē動åĩæ¸Ŧ同埋å„Ēå…ˆé¸æ“‡å¯į”¨å˜…æŠŸå™¨å­¸įŋ’äŧ翜å™¨", + "machine_learning_availability_checks_enabled": "å•Ÿį”¨å¯į”¨æ€§æĒĸæŸĨ", + "machine_learning_availability_checks_interval": "æĒĸæŸĨ間隔", + "machine_learning_availability_checks_interval_description": "å¯į”¨æ€§æĒĸæŸĨ䚋間嘅間隔īŧˆæ¯Ģį§’īŧ‰", + "machine_learning_availability_checks_timeout": "čĢ‹æą‚čļ…æ™‚", + "machine_learning_availability_checks_timeout_description": "å¯į”¨æ€§æĒĸæŸĨčļ…æ™‚īŧˆæ¯Ģį§’īŧ‰", + "machine_learning_clip_model": "CLIP æ¨Ąåž‹", + "machine_learning_clip_model_description": "å–ē å‘ĸåēĻ åˆ—å‡ē嘅 CLIP æ¨Ąåž‹ã€‚ æŗ¨æ„īŧšæ›´æ›æ¨Ąåž‹åžŒåŋ…é ˆé‡æ–°åŸˇčĄŒæ‰€æœ‰åœ–į‰‡å˜…ã€Œæ™ē慧搜尋」äģģ務。", + "machine_learning_duplicate_detection": "é‡č¤‡é …į›Žåĩæ¸Ŧ", + "machine_learning_duplicate_detection_enabled": "å•Ÿį”¨é‡č¤‡é …į›Žåĩæ¸Ŧ", + "machine_learning_duplicate_detection_enabled_description": "å°ąįŽ—åœį”¨å‘ĸ個功čƒŊīŧŒåŽŒå…¨į›¸åŒå˜…é‡č¤‡é …į›Žäģį„ļ會čĸĢåˆĒ除。", + "machine_learning_duplicate_detection_setting_description": "åˆŠį”¨ CLIP 向量比對尋扞可čƒŊå˜…é‡č¤‡é …į›Ž", + "machine_learning_settings": "抟器學įŋ’設åޚ", + "machine_learning_settings_description": "įŽĄį†æŠŸå™¨å­¸įŋ’嘅功čƒŊåŒåŸ‹č¨­åŽš", + "machine_learning_smart_search": "æ™ēčƒŊ搜尋", + "machine_learning_smart_search_description": "ᔍ CLIP åĩŒå…Ĩå‘é‡į”¨čĒžæ„æ–šåŧæĩᛏ", + "machine_learning_smart_search_enabled": "å•Ÿį”¨æ™ē慧搜尋", + "machine_learning_smart_search_enabled_description": "åĻ‚æžœåœį”¨īŧŒį›¸į‰‡å””æœƒé€˛čĄŒæ™ēčƒŊæœå°‹įˇ¨įĸŧ。", + "machine_learning_url_description": "抟器學įŋ’äŧ翜å™¨å˜… URL。åĻ‚æžœäŊ æäž›å¤šå€‹ URLīŧŒįŗģįĩ࿜ƒé€ä¸€å˜—čŠĻīŧŒį›´åˆ°æœ‰ä¸€å€‹æˆåŠŸå›žæ‡‰į‚ēæ­ĸīŧˆį”ąå‰åˆ°åžŒīŧ‰ã€‚æœĒ回應嘅äŧ翜å™¨å°‡čĸĢæšĢ時åŋŊį•ĨīŧŒį›´åˆ°äŊĸé‡æ–°ä¸Šįˇšį‚ēæ­ĸ。", + "maintenance_delete_backup": "åˆĒ除備äģŊ", + "maintenance_delete_backup_description": "æ­¤æĒ”æĄˆå°‡čĸĢæ°¸äš…åˆĒ除。", + "maintenance_delete_error": "åˆĒ除備äģŊå¤ąæ•—ã€‚", + "maintenance_restore_backup": "還原備äģŊ", + "maintenance_restore_backup_description": "Immich įš„čŗ‡æ–™å°‡æœƒčĸĢæ¸…除īŧŒä¸Ļ還原äŊ æ€å˜…å‚™äģŊ。å–ēįšŧį猿“äŊœå‰īŧŒįŗģįĩ࿜ƒå…ˆåģēįĢ‹į›Žå‰å˜…čŗ‡æ–™å‚™äģŊ。", + "maintenance_restore_backup_different_version": "å‘ĸ個備äģŊäŋ‚į”ąä¸åŒį‰ˆæœŦ嘅 Immich 所åģēįĢ‹īŧ", + "maintenance_restore_backup_unknown_version": "į„Ąæŗ•įĸē厚備äģŊį‰ˆæœŦ。", + "maintenance_restore_database_backup": "é‚„åŽŸčŗ‡æ–™åēĢ備äģŊ", + "maintenance_restore_database_backup_description": "äŊŋᔍ備äģŊ文äģļ將數據åēĢ還原到čŧƒæ—Šå˜…į‹€æ…‹", + "maintenance_settings": "įļ­äŋŽ", + "maintenance_settings_description": "å•Ÿį”¨ Immich įļ­äŋŽæ¨Ąåŧã€‚", + "maintenance_start": "啟動įļ­äŋŽæ¨Ąåŧ", + "maintenance_start_error": "啟動įļ­äŋŽæ¨Ąåŧå¤ąæ•—。", + "maintenance_upload_backup": "ä¸Šå‚ŗčŗ‡æ–™åēĢ備äģŊ嘅æĒ”æĄˆ", + "maintenance_upload_backup_error": "ä¸Šå‚ŗå””åˆ°å‚™äģŊīŧŒäŊĸäŋ‚å””äŋ‚ .sql 或 .sql.gz æ ŧåŧå˜…æĒ”æĄˆīŧŸ", + "manage_concurrency": "įŽĄį†ä¸ĻčĄŒč¨­åŽš", + "manage_concurrency_description": "前垀äģģ務頁éĸäģĨįŽĄį†äģģ務ä¸ĻčĄŒč¨­åŽš", + "manage_log_settings": "įŽĄį†į´€éŒ„č¨­åŽš", + "map_dark_style": "æˇąč‰˛éĸ¨æ ŧ", + "map_enable_description": "äŊŋį”¨åœ°åœ–åŠŸčƒŊ", + "map_gps_settings": "地圖同埋 GPS č¨­åŽš", + "map_gps_settings_description": "įŽĄį†åœ°åœ–åŒåŸ‹ GPSīŧˆåå‘åœ°į†įˇ¨įĸŧīŧ‰č¨­åޚ", + "map_implications": "地圖功čƒŊäģ°čŗ´å¤–éƒ¨åœ–įŖšæœå‹™īŧˆtiles.immich.cloudīŧ‰", + "map_light_style": "æˇē色éĸ¨æ ŧ", + "map_manage_reverse_geocoding_settings": "įŽĄį† é€†å‘åœ°į†įˇ¨įĸŧ å˜…č¨­åŽš", + "map_reverse_geocoding": "åå‘åœ°į†įˇ¨įĸŧ", + "map_reverse_geocoding_settings": "åå‘åœ°į†įˇ¨įĸŧč¨­åŽš", + "map_settings": "地圖", + "map_settings_description": "įŽĄį†åœ°åœ–č¨­åŽš", + "map_style_description": "地圖ä¸ģ題īŧˆstyle.jsonīŧ‰įš„įļ˛å€", + "memory_cleanup_job": "回æ†ļæ¸…į†", + "memory_generate_job": "į”ĸį”Ÿå›žæ†ļ", + "metadata_extraction_job": "æŠŊ取元數據", + "metadata_extraction_job_description": "å–翝å€‹é …į›Žä¸­æŠŊå–å…ƒæ•¸æ“ščŗ‡č¨ŠīŧŒäž‹åĻ‚ GPSã€č‡‰å­”åŒåŸ‹č§ŖæžåēĻ" }, "main_menu": "ä¸ģ選喎", "maintenance_action_restore": "é‚„åŽŸįˇŠæ•¸æ“šåēĢ", diff --git a/i18n/zh_Hans.json b/i18n/zh_Hans.json index 2e7960bffd..2a85e2e3b7 100644 --- a/i18n/zh_Hans.json +++ b/i18n/zh_Hans.json @@ -61,7 +61,7 @@ "backup_onboarding_1_description": "åŧ‚地备äģŊīŧŒäž‹åĻ‚å­˜å‚¨åœ¨äē‘įĢ¯æˆ–åĻ一ä¸Ēį‰Šį†äŊįŊŽã€‚", "backup_onboarding_2_description": "æœŦåœ°å¤ščŽžå¤‡å‰¯æœŦã€‚åŗåœ¨ä¸åŒčŽžå¤‡ä¸Šäŋå­˜ä¸ģ文äģļ及å…ļæœŦ地备äģŊ。", "backup_onboarding_3_description": "æ•°æŽįš„æ€ģ副æœŦ数īŧŒåŒ…åĢ原始文äģļ。䞋åĻ‚īŧš1 äģŊåŧ‚地备äģŊ和 2 äģŊæœŦ地副æœŦ。", - "backup_onboarding_description": "åģēčŽŽé‡‡į”¨ 3-2-1 备äģŊį­–į•Ĩ æĨäŋæŠ¤æ‚¨įš„æ•°æŽã€‚ä¸ēäē†åŽžįŽ°å…¨éĸįš„å¤‡äģŊæ–šæĄˆīŧŒæ‚¨åē”åŊ“äŋå­˜ä¸Šäŧ įš„ᅧቇ/视éĸ‘副æœŦäģĨ及 Immich 数捎åē“。", + "backup_onboarding_description": "åģēčŽŽé‡‡į”¨ 3-2-1 备äģŊį­–į•Ĩ æĨäŋæŠ¤æ‚¨įš„æ•°æŽã€‚äŊ åē”č¯Ĩäŋį•™åˇ˛ä¸Šäŧ įš„ᅧቇ/视éĸ‘äģĨ及 Immich 数捎åē“įš„å‰¯æœŦīŧŒäģĨåŽžįŽ°å…¨éĸįš„å¤‡äģŊč§Ŗå†ŗæ–šæĄˆã€‚", "backup_onboarding_footer": "æœ‰å…ŗå¤‡äģŊ Immich įš„æ›´å¤šäŋĄæ¯īŧŒč¯ˇå‚阅 æ–‡æĄŖã€‚", "backup_onboarding_parts_title": "3-2-1 备äģŊį­–į•Ĩ包æ‹Ŧīŧš", "backup_onboarding_title": "备äģŊ", @@ -338,7 +338,7 @@ "storage_template_path_length": "čŋ‘äŧŧčˇ¯åž„é•ŋåēĻ限åˆļīŧš{length, number}/{limit, number}", "storage_template_settings": "å­˜å‚¨æ¨Ąæŋ", "storage_template_settings_description": "įŽĄį†ä¸Šäŧ čĩ„äē§æ–‡äģļ多į쓿ž„和文äģļ名", - "storage_template_user_label": "{label}ä¸ēį”¨æˆˇįš„å­˜å‚¨æ ‡į­ž", + "storage_template_user_label": "{label}ä¸ēč¯Ĩį”¨æˆˇįš„å­˜å‚¨æ ‡į­ž", "system_settings": "įŗģįģŸčŽžįŊŽ", "tag_cleanup_job": "æ ‡į­žæ¸…į†", "template_email_available_tags": "您可äģĨåœ¨æ¨Ąæŋ中äŊŋᔍäģĨ下变量īŧš{tags}", @@ -411,7 +411,7 @@ "transcoding_tone_mapping": "č‰˛č°ƒæ˜ å°„", "transcoding_tone_mapping_description": "旨在将 HDR 视éĸ‘čŊŦæĸä¸ē SDR æ—ļīŧŒå°Ŋ量äŋį•™åŽŸæœ‰įš„č§†č§‰æ•ˆæžœã€‚æ¯į§įŽ—æŗ•éƒŊåœ¨č‰˛åŊŠã€įģ†čŠ‚å’ŒäēŽåēĻ䚋间做å‡ēäē†ä¸åŒįš„å–čˆīŧšHable įŽ—æŗ•äž§é‡äŋį•™įģ†čŠ‚īŧŒMobius įŽ—æŗ•äž§é‡äŋį•™č‰˛åŊŠīŧŒč€Œ Reinhard įŽ—æŗ•åˆ™äž§é‡äŋį•™äēŽåēĻ。", "transcoding_transcode_policy": "čŊŦ᠁᭖į•Ĩ", - "transcoding_transcode_policy_description": "čŽžåŽšč§†éĸ‘äŊ•æ—ļåē”čŋ›čĄŒčŊŦį įš„į­–į•Ĩ。HDR 视éĸ‘å§‹įģˆäŧščĸĢčŊŦ᠁īŧˆé™¤éžåˇ˛åŽŒå…¨įρᔍčŊŦ᠁功čƒŊīŧ‰ã€‚", + "transcoding_transcode_policy_description": "视éĸ‘čŊŦ᠁᭖į•ĨīŧšåŊ“视éĸ‘ä¸ē HDR æ ŧåŧīŧŒæˆ–åƒį´ æ ŧåŧéž YUV 4:2:0 æ—ļīŧŒåŋ…éĄģčŋ›čĄŒčŊŦ᠁īŧˆé™¤éžåˇ˛įρᔍčŊŦ᠁功čƒŊīŧ‰ã€‚", "transcoding_two_pass_encoding": "ä猿ŦĄįŧ–᠁", "transcoding_two_pass_encoding_setting_description": "采ᔍ䏤æŦĄįŧ–į æ¨ĄåŧäģĨį”Ÿæˆč´¨é‡æ›´äŧ˜įš„视éĸ‘。åŊ“åŧ€å¯æœ€å¤§į įއ限åˆļæ—ļīŧˆH.264 和 HEVC įŧ–᠁æ ŧåŧåŋ…éĄģåŧ€å¯æ­¤é€‰éĄšæ‰čƒŊį”Ÿæ•ˆīŧ‰īŧŒč¯Ĩæ¨ĄåŧäŧšäžæŽæœ€å¤§į įŽ‡čŽžåŽšä¸€ä¸Ēį įŽ‡čŒƒå›´īŧŒåšļåŋŊį•Ĩ CRF 莞įŊŽã€‚寚äēŽ VP9 įŧ–᠁īŧŒč‹Ĩå…ŗé—­æœ€å¤§į įŽ‡é™åˆļīŧŒåˆ™å¯äģĨäŊŋᔍ CRF 莞įŊŽã€‚", "transcoding_video_codec": "视éĸ‘įŧ–᠁æ ŧåŧ", @@ -425,10 +425,10 @@ "unlink_all_oauth_accounts_description": "在čŋį§ģåˆ°æ–°æœåŠĄå•†äš‹å‰īŧŒč¯ˇčŽ°åž—č§Ŗé™¤æ‰€æœ‰ OAuth č´Ļæˆˇįš„å…ŗč”ã€‚", "unlink_all_oauth_accounts_prompt": "æ‚¨įĄŽåŽščĻč§Ŗé™¤æ‰€æœ‰ OAuth č´Ļæˆˇįš„å…ŗč”å—īŧŸæ­¤æ“äŊœå°†é‡įŊŽæ¯ä¸Ēį”¨æˆˇįš„čēĢäģŊčŽ¤č¯ IDīŧŒä¸”æ— æŗ•æ’¤é”€ã€‚", "user_cleanup_job": "į”¨æˆˇæ¸…į†", - "user_delete_delay": "{user}įš„č´ĻæˆˇåŠčĩ„äē§å°†åœ¨{delay, plural, one {#夊} other {#夊}}后č‡Ē动永䚅删除。", + "user_delete_delay": "{user}įš„č´ĻæˆˇåŠčĩ„äē§å°†åœ¨{delay, plural, one {#夊} other {#夊}}后čĸĢ厉排永䚅删除。", "user_delete_delay_settings": "åģᅵŸåˆ é™¤", "user_delete_delay_settings_description": "į§ģ除后多少夊īŧŒæ°¸äš…åˆ é™¤į”¨æˆˇįš„č´ĻæˆˇåŠčĩ„äē§ã€‚į”¨æˆˇåˆ é™¤äģģåŠĄå°†åœ¨åˆå¤œčŋčĄŒīŧŒäģĨæŖ€æŸĨ是åĻæœ‰åž…åˆ é™¤įš„į”¨æˆˇã€‚æ­¤čŽžįŊŽįš„æ›´æ”šå°†åœ¨ä¸‹æŦĄäģģåŠĄæ‰§čĄŒæ—ļį”Ÿæ•ˆã€‚", - "user_delete_immediately": "{user}įš„č´ĻæˆˇåŠčĩ„äē§å°†čĸĢįĢ‹åŗåŠ å…Ĩ永䚅删除队列。", + "user_delete_immediately": "{user}įš„č´ĻæˆˇåŠčĩ„äē§å°†čĸĢįĢ‹åŗåŽ‰æŽ’æ°¸äš…åˆ é™¤ã€‚", "user_delete_immediately_checkbox": "å°†į”¨æˆˇåŠå…ļčĩ„äē§åŠ å…ĨįĢ‹åŗåˆ é™¤é˜Ÿåˆ—", "user_details": "į”¨æˆˇč¯Ļ情", "user_management": "į”¨æˆˇįŽĄį†", @@ -714,7 +714,7 @@ "cache_settings_statistics_thumbnail": "įŧŠį•Ĩ回", "cache_settings_statistics_title": "įŧ“å­˜å į”¨æƒ…å†ĩ", "cache_settings_subtitle": "įŽĄį† Immich 手æœēįĢ¯įš„įŧ“å­˜", - "cache_settings_tile_subtitle": "莞įŊŽæœŦåœ°å­˜å‚¨čĄŒä¸ē", + "cache_settings_tile_subtitle": "įŽĄį†æœŦåœ°å­˜å‚¨į›¸å…ŗčĄŒä¸ē", "cache_settings_tile_title": "æœŦ地存储", "cache_settings_title": "įŧ“å­˜čŽžįŊŽ", "camera": "ᛏæœē", @@ -725,7 +725,7 @@ "canceled": "åˇ˛å–æļˆ", "canceling": "取æļˆä¸­", "cannot_merge_people": "æ— æŗ•åˆåšļäēēį‰Š", - "cannot_undo_this_action": "æŗ¨æ„īŧšč¯Ĩ操äŊœæ— æŗ•čĸĢæ’¤æļˆīŧ", + "cannot_undo_this_action": "此操äŊœä¸å¯æ’¤é”€īŧ", "cannot_update_the_description": "æ— æŗ•æ›´æ–°æčŋ°", "cast": "æŠ•åą", "cast_description": "配įŊŽå¯į”¨įš„æŠ•åąčŽžå¤‡", @@ -735,145 +735,150 @@ "change_expiration_time": "更攚čŋ‡æœŸæ—ļ间", "change_location": "更攚äŊįŊŽ", "change_name": "æ›´æ”šåį§°", - "change_name_successfully": "æ›´æ”šåį§°æˆåŠŸ", - "change_password": "äŋŽæ”šå¯†į ", - "change_password_description": "čŋ™æ˜¯æ‚¨įš„įŦŦ一æŦĄį™ģåŊ•äēĻæˆ–有äēēčĻæą‚æ›´æ”šæ‚¨įš„å¯†į ã€‚č¯ˇåœ¨ä¸‹éĸ输å…Ĩæ–°å¯†į ã€‚", + "change_name_successfully": "åį§°äŋŽæ”šæˆåŠŸ", + "change_password": "æ›´æ”šå¯†į ", + "change_password_description": "čŋ™æ˜¯æ‚¨éĻ–æŦĄį™ģåŊ•įŗģįģŸīŧŒæˆ–厞æ”ļ到äŋŽæ”šå¯†į įš„č¯ˇæą‚ã€‚č¯ˇåœ¨ä¸‹æ–ščž“å…Ĩæ–°å¯†į ã€‚", "change_password_form_confirm_password": "įĄŽčŽ¤å¯†į ", - "change_password_form_description": "{name} 您åĨŊīŧŒ\n\nčŋ™æ˜¯æ‚¨éĻ–æŦĄį™ģåŊ•įŗģįģŸīŧŒæˆ–čĸĢįŽĄį†å‘˜čĻæą‚æ›´æ”šå¯†į ã€‚č¯ˇåœ¨ä¸‹æ–ščž“å…Ĩæ–°å¯†į ã€‚", - "change_password_form_log_out": "æŗ¨é”€æ‰€æœ‰å…ļäģ–čŽžå¤‡", - "change_password_form_log_out_description": "åģē议退å‡ē所有å…ļäģ–čŽžå¤‡", + "change_password_form_description": "嗨īŧŒ{name} īŧš\n\nčŋ™æ˜¯æ‚¨éĻ–æŦĄį™ģåŊ•įŗģįģŸīŧŒæˆ–厞æ”ļ到äŋŽæ”šå¯†į įš„č¯ˇæą‚ã€‚č¯ˇåœ¨ä¸‹æ–ščž“å…Ĩæ–°å¯†į ã€‚", + "change_password_form_log_out": "将å…ļäģ–æ‰€æœ‰čŽžå¤‡į™ģå‡ē", + "change_password_form_log_out_description": "åģē议退å‡ēå…ļäģ–æ‰€æœ‰čŽžå¤‡įš„į™ģåŊ•", "change_password_form_new_password": "æ–°å¯†į ", "change_password_form_password_mismatch": "å¯†į ä¸åŒšé…", "change_password_form_reenter_new_password": "再æŦĄčž“å…Ĩæ–°å¯†į ", "change_pin_code": "äŋŽæ”šPIN᠁", "change_trigger": "更攚č§Ļå‘æĄäģļ", - "change_trigger_prompt": "æ‚¨įĄŽåŽščĻæ›´æ”šč§Ļå‘æĄäģļ吗īŧŸčŋ™å°†åˆ é™¤æ‰€æœ‰įŽ°æœ‰æ“äŊœå’Œį­›é€‰ã€‚", - "change_your_password": "äŋŽæ”šæ‚¨įš„å¯†į ", - "changed_visibility_successfully": "æ›´æ”šå¯č§æ€§æˆåŠŸ", - "charging": "充į”ĩ", + "change_trigger_prompt": "įĄŽåŽščĻæ›´æ”šč§Ļå‘æĄäģļ吗īŧŸæ­¤æ“äŊœå°†åˆ é™¤æ‰€æœ‰įŽ°æœ‰įš„æ“äŊœå’Œį­›é€‰å™¨ã€‚", + "change_your_password": "äŋŽæ”šå¯†į ", + "changed_visibility_successfully": "å¯č§įŠļ态更新成功", + "charging": "充į”ĩ中", "charging_requirement_mobile_backup": "后台备äģŊ需čĻčŽžå¤‡å¤„äēŽå……į”ĩįŠļ态", - "check_corrupt_asset_backup": "æŖ€æŸĨ备äģŊ是åĻ损坏", + "check_corrupt_asset_backup": "æŖ€æŸĨčĩ„äē§å¤‡äģŊ是åĻ损坏", "check_corrupt_asset_backup_button": "æ‰§čĄŒæŖ€æŸĨ", - "check_corrupt_asset_backup_description": "äģ…在čŋžæŽĨ到 Wi-Fi åšļ厌成所有čĩ„äē§å¤‡äģŊåŽæ‰§čĄŒæ­¤æŖ€æŸĨ。č¯Ĩčŋ‡į¨‹å¯čƒŊ需čĻå‡ åˆ†é’Ÿã€‚", + "check_corrupt_asset_backup_description": "äģ…在 Wi-Fi įŽ¯åĸƒä¸‹čŋčĄŒæ­¤æŖ€æŸĨīŧŒåšļįĄŽäŋæ‰€æœ‰čĩ„æēå‡åˇ˛å¤‡äģŊ。č¯Ĩčŋ‡į¨‹å¯čƒŊ需čĻå‡ åˆ†é’Ÿæ—ļ间。", "check_logs": "æŖ€æŸĨæ—Ĩåŋ—", "checksum": "æ ĄéĒŒå’Œ", - "choose_matching_people_to_merge": "é€‰æ‹ŠåŒšé…įš„äēēčŋ›čĄŒåˆåšļ", + "choose_matching_people_to_merge": "选拊čρ合åšļįš„äēēį‰Š", "city": "城市", - "cleanup_confirm_description": "Immichå‘įŽ°{count}ä¸Ēčĩ„äē§īŧˆåœ¨{date}䚋前创åģēīŧ‰åˇ˛åމ免备äģŊåˆ°æœåŠĄå™¨ã€‚æ˜¯åĻäģŽæ­¤čŽžå¤‡ä¸­åˆ é™¤æœŦ地副æœŦīŧŸ", - "cleanup_confirm_prompt_title": "äģŽæ­¤čŽžå¤‡åˆ é™¤īŧŸ", - "cleanup_deleted_assets": "将{count}ä¸Ēčĩ„äē§į§ģåŠ¨åˆ°čŽžå¤‡å›žæ”ļįĢ™", - "cleanup_deleting": "į§ģč‡ŗå›žæ”ļįĢ™...", - "cleanup_found_assets": "扞到{count}ä¸Ē备äģŊčĩ„äē§", - "cleanup_found_assets_with_size": "扞到 {count} ä¸Ē厞备äģŊįš„æ–‡äģļ ({size})", - "cleanup_icloud_shared_albums_excluded": "iCloudå…ąäēĢį›¸å†ŒčĸĢæŽ’é™¤åœ¨æ‰Ģ描䚋外", - "cleanup_no_assets_found": "æœĒ扞到įŦĻ合上čŋ°æĄäģļįš„æ–‡äģļ。释攞įŠē间功čƒŊåĒčƒŊį§ģ除厞备äģŊåˆ°æœåŠĄå™¨įš„æ–‡äģļ", - "cleanup_preview_title": "čĻåˆ é™¤įš„čĩ„äē§īŧˆ{count}ä¸Ēīŧ‰", - "cleanup_step3_description": "æ‰Ģ描įŦĻ合您æ—Ĩ期和äŋį•™čŽžįŊŽįš„厞备äģŊ文äģļ。", - "cleanup_step4_summary": "将äģŽæœŦæœēį§ģ除 {count} ä¸Ē文äģļīŧˆåˆ›åģēäēŽ {date} 䚋前īŧ‰ã€‚ᅧቇäģå¯åœ¨ Immich åē”ᔍ䏭æŸĨįœ‹ã€‚", - "cleanup_trash_hint": "čĻåŽŒå…¨å›žæ”ļ存储įŠē间īŧŒč¯ˇæ‰“åŧ€įŗģįģŸåē“åē”ᔍፋåēåšļ清įŠē回æ”ļįĢ™", + "cleanup_confirm_description": "Immich åˇ˛æ‰žåˆ° {count} ä¸Ē厉全备äģŊč‡ŗæœåŠĄå™¨įš„čĩ„æēīŧˆåˆ›åģēäēŽ {date} 䚋前īŧ‰ã€‚是åĻäģŽæ­¤čŽžå¤‡į§ģ除æœŦ地副æœŦīŧŸ", + "cleanup_confirm_prompt_title": "是åĻäģŽæ­¤čŽžå¤‡į§ģ除īŧŸ", + "cleanup_deleted_assets": "厞将 {count} ä¸Ēčĩ„æēį§ģč‡ŗčŽžå¤‡å›žæ”ļįĢ™", + "cleanup_deleting": "æ­Ŗåœ¨į§ģč‡ŗå›žæ”ļįĢ™...", + "cleanup_found_assets": "åˇ˛æ‰žåˆ° {count} ä¸Ē厞备äģŊįš„čĩ„æē", + "cleanup_found_assets_with_size": "åˇ˛æ‰žåˆ° {count} ä¸Ē厞备äģŊįš„čĩ„æē ({size})", + "cleanup_icloud_shared_albums_excluded": "iCloud å…ąäēĢį›¸å†Œåˇ˛æŽ’é™¤åœ¨æ‰ĢæčŒƒå›´äš‹å¤–", + "cleanup_no_assets_found": "æœĒ扞到įŦĻ合上čŋ°æĄäģļįš„čĩ„æēã€‚“释攞įŠē间”äģ…čƒŊį§ģ除厞备äģŊč‡ŗæœåŠĄå™¨įš„æ–‡äģļ", + "cleanup_preview_title": "åž…į§ģé™¤įš„čĩ„æē ({count})", + "cleanup_step3_description": "æ‰Ģ描įŦĻ合æ—Ĩ期及äŋį•™čŽžįŊŽįš„厞备äģŊčĩ„æēã€‚", + "cleanup_step4_summary": "将äģŽæœŦæœēį§ģ除 {count} ä¸Ēčĩ„æēīŧˆåˆ›åģēäēŽ {date} 䚋前īŧ‰ã€‚ᅧቇäģå¯åœ¨ Immich åē”ᔍ䏭čŽŋ闎。", + "cleanup_trash_hint": "ä¸ēåŊģåē•释攞存储įŠē间īŧŒč¯ˇæ‰“åŧ€įŗģįģŸį›¸å†Œåē”ᔍåšļ清įŠē回æ”ļįĢ™", "clear": "清įŠē", - "clear_all": "清įŠē全部", - "clear_all_recent_searches": "清除所有最čŋ‘搜į´ĸ", - "clear_file_cache": "清除文äģļįŧ“å­˜", - "clear_message": "清įŠēæļˆæ¯", - "clear_value": "删除内厚", + "clear_all": "全部清除", + "clear_all_recent_searches": "清除全部最čŋ‘搜į´ĸ莰åŊ•", + "clear_file_cache": "清įŠē文äģļįŧ“å­˜", + "clear_message": "清įŠē通įŸĨ", + "clear_value": "清除", "client_cert_dialog_msg_confirm": "įĄŽåŽš", "client_cert_enter_password": "输å…Ĩ坆᠁", "client_cert_import": "å¯ŧå…Ĩ", - "client_cert_import_success_msg": "åŽĸæˆˇį̝蝁äšĻ厞å¯ŧå…Ĩ", - "client_cert_invalid_msg": "æ— æ•ˆįš„č¯äšĻ文äģ￈–坆᠁错蝝", - "client_cert_password_message": "输å…Ĩ蝁äšĻįš„å¯†į ", + "client_cert_import_success_msg": "蝁äšĻå¯ŧå…Ĩ成功", + "client_cert_invalid_msg": "蝁äšĻ文äģļæ— æ•ˆæˆ–坆᠁错蝝", + "client_cert_password_message": "č¯ˇčž“å…Ĩč¯Ĩ蝁äšĻįš„å¯†į ", "client_cert_password_title": "蝁äšĻ坆᠁", "client_cert_remove_msg": "åŽĸæˆˇį̝蝁äšĻ厞į§ģ除", - "client_cert_subtitle": "äģ…æ”¯æŒPKCS12īŧˆ.p12、.pfxīŧ‰æ ŧåŧã€‚蝁äšĻå¯ŧå…Ĩ/删除äģ…在į™ģåŊ•å‰å¯į”¨", - "client_cert_title": "SSL åŽĸæˆˇį̝蝁äšĻ[厞éĒŒæ€§]", + "client_cert_subtitle": "äģ…æ”¯æŒ PKCS12 æ ŧåŧ (.p12, .pfx)。į™ģåŊ•åŽå°†æ— æŗ•å¯ŧå…Ĩ或į§ģ除蝁äšĻ", + "client_cert_title": "SSL åŽĸæˆˇį̝蝁äšĻ[厞éĒŒæ€§åŠŸčƒŊ]", "clockwise": "éĄēæ—ļ针", "close": "å…ŗé—­", - "collapse": "折叠", - "collapse_all": "全部折叠", + "collapse": "æ”ļčĩˇ", + "collapse_all": "全部æ”ļčĩˇ", "color": "éĸœč‰˛", - "color_theme": "éĸœč‰˛ä¸ģéĸ˜", + "color_theme": "色åŊŠä¸ģéĸ˜", "command": "å‘Ŋäģ¤", + "command_palette_prompt": "åŋĢ速æŸĨ扞éĄĩéĸ、操äŊœæˆ–å‘Ŋäģ¤", + "command_palette_to_close": "å…ŗé—­", + "command_palette_to_navigate": "įĄŽčŽ¤", + "command_palette_to_select": "选拊", + "command_palette_to_show_all": "昞į¤ē所有", "comment_deleted": "蝄čŽēåˇ˛åˆ é™¤", - "comment_options": "蝄čŽē选项", + "comment_options": "更多", "comments_and_likes": "蝄čŽē & į‚ščĩž", - "comments_are_disabled": "蝄čŽē厞įρᔍ", - "common_create_new_album": "新åģēį›¸å†Œ", + "comments_are_disabled": "蝄čŽē厞兺闭", + "common_create_new_album": "创åģēæ–°į›¸å†Œ", "completed": "åˇ˛åŽŒæˆ", "confirm": "įĄŽčŽ¤", "confirm_admin_password": "įĄŽčŽ¤įŽĄį†å‘˜å¯†į ", - "confirm_delete_face": "æ‚¨įĄŽåŽščρäģŽčĩ„äē§ä¸­åˆ é™¤ {name} įš„äēē脸äŋĄæ¯å—īŧŸ", + "confirm_delete_face": "įĄŽåŽščρäģŽæ­¤æ–‡äģļ中删除 {name} įš„éĸ部äŋĄæ¯å—īŧŸ", "confirm_delete_shared_link": "įĄŽåŽščĻåˆ é™¤æ­¤å…ąäēĢ链æŽĨ吗īŧŸ", - "confirm_keep_this_delete_others": "除äē†čŋ™ä¸Ēčĩ„äē§äš‹å¤–īŧŒå †æ ˆä¸­įš„æ‰€æœ‰å…ļäģ–čĩ„äē§éƒŊ将čĸĢåˆ é™¤ã€‚æ‚¨įĄŽåŽščρįģ§įģ­å—īŧŸ", - "confirm_new_pin_code": "įĄŽčŽ¤æ–°įš„PIN᠁", + "confirm_keep_this_delete_others": "堆栈中所有å…ļäģ–čĩ„æēéƒŊ将čĸĢ删除īŧŒäģ…äŋį•™æ­¤čĩ„æēã€‚įĄŽåޚčρįģ§įģ­å—īŧŸ", + "confirm_new_pin_code": "įĄŽčŽ¤æ–° PIN ᠁", "confirm_password": "įĄŽčŽ¤å¯†į ", - "confirm_tag_face": "æ‚¨æƒŗå°†čŋ™ä¸Ēäēēč„¸æ ‡čŽ°ä¸ē“{name}”吗īŧŸ", - "confirm_tag_face_unnamed": "是åĻæ ‡čŽ°æ­¤äēē脸īŧŸ", - "connected_device": "厞čŋžæŽĨčŽžå¤‡", - "connected_to": "厞čŋžæŽĨ到", - "contain": "包åĢ", + "confirm_tag_face": "是åĻ将此äēēč„¸æ ‡čŽ°ä¸ē {name}īŧŸ", + "confirm_tag_face_unnamed": "是åĻčĻæ ‡čŽ°æ­¤äēē脸īŧŸ", + "connected_device": "厞čŋžæŽĨįš„čŽžå¤‡", + "connected_to": "厞čŋžæŽĨ臺", + "contain": "适åē”", "context": "äģĨ文搜回", "continue": "įģ§įģ­", "control_bottom_app_bar_create_new_album": "新åģēį›¸å†Œ", "control_bottom_app_bar_delete_from_immich": "äģŽ Immich æœåŠĄå™¨ä¸­åˆ é™¤", - "control_bottom_app_bar_delete_from_local": "äģŽæ‰‹æœē中删除", - "control_bottom_app_bar_edit_location": "įŧ–čž‘äŊįŊŽäŋĄæ¯", + "control_bottom_app_bar_delete_from_local": "äģŽčŽžå¤‡ä¸­åˆ é™¤", + "control_bottom_app_bar_edit_location": "įŧ–čž‘äŊįŊŽ", "control_bottom_app_bar_edit_time": "įŧ–čž‘æ—Ĩ期和æ—ļ间", "control_bottom_app_bar_share_link": "å…ąäēĢ链æŽĨ", - "control_bottom_app_bar_share_to": "发送įģ™", - "control_bottom_app_bar_trash_from_immich": "į§ģå…Ĩ回æ”ļįĢ™", - "copied_image_to_clipboard": "åˇ˛å¤åˆļå›žį‰‡č‡ŗå‰Ē切æŋ。", - "copied_to_clipboard": "åˇ˛å¤åˆļ到å‰Ē切æŋīŧ", + "control_bottom_app_bar_share_to": "分äēĢ臺", + "control_bottom_app_bar_trash_from_immich": "į§ģ到回æ”ļįĢ™", + "copied_image_to_clipboard": "å›žį‰‡åˇ˛å¤åˆļ到å‰Ēč´´æŋ。", + "copied_to_clipboard": "åˇ˛å¤åˆļ到å‰Ēč´´æŋīŧ", "copy_error": "复åˆļå‡ē错", "copy_file_path": "复åˆļ文äģļčˇ¯åž„", "copy_image": "复åˆļå›žį‰‡", "copy_link": "复åˆļ链æŽĨ", - "copy_link_to_clipboard": "复åˆļ链æŽĨ到å‰Ē切æŋ", + "copy_link_to_clipboard": "复åˆļ链æŽĨ到å‰Ēč´´æŋ", "copy_password": "复åˆļ坆᠁", - "copy_to_clipboard": "复åˆļ到å‰Ē切æŋ", + "copy_to_clipboard": "复åˆļ到å‰Ēč´´æŋ", "country": "å›ŊåŽļ", - "cover": "封éĸ", + "cover": "åĄĢ充", "covers": "封éĸ", "create": "创åģē", "create_album": "创åģēį›¸å†Œ", "create_album_page_untitled": "æœĒå‘Ŋ名", - "create_api_key": "创åģē API Key", - "create_first_workflow": "创åģēįŦŦ一ä¸ĒåˇĨäŊœæĩ", - "create_library": "创åģēčĩ„äē§åē“", + "create_api_key": "创åģē API 密é’Ĩ", + "create_first_workflow": "创åģēéĻ–ä¸ĒåˇĨäŊœæĩ", + "create_library": "创åģēčĩ„æ–™åē“", "create_link": "创åģē链æŽĨ", "create_link_to_share": "创åģēå…ąäēĢ链æŽĨ", - "create_link_to_share_description": "čŽˇåž—æ­¤é“žæŽĨįš„äēē均可æŸĨįœ‹æ‰€é€‰į…§į‰‡", + "create_link_to_share_description": "å…čŽ¸äģģäŊ•æ‹Ĩ有铞æŽĨįš„äē翟Ĩįœ‹æ‰€é€‰į…§į‰‡", "create_new": "新åģē", "create_new_person": "创åģēæ–°äēēį‰Š", - "create_new_person_hint": "æŒ‡æ´žåˇ˛é€‰æ‹Ščĩ„äē§åˆ°æ–°įš„äēēį‰Š", - "create_new_user": "创åģēæ–°į”¨æˆˇ", - "create_shared_album_page_share_add_assets": "æˇģ加čĩ„äē§", - "create_shared_album_page_share_select_photos": "选拊čĩ„äē§", + "create_new_person_hint": "将所选čĩ„æēåˆ†é…į왿–°äēēį‰Š", + "create_new_user": "新åģēį”¨æˆˇ", + "create_shared_album_page_share_add_assets": "æˇģ加čĩ„æē", + "create_shared_album_page_share_select_photos": "é€‰æ‹Šį…§į‰‡", "create_shared_link": "创åģēå…ąäēĢ链æŽĨ", "create_tag": "创åģēæ ‡į­ž", - "create_tag_description": "创åģē一ä¸Ēæ–°æ ‡į­žã€‚å¯šäēŽåĩŒåĨ—æ ‡į­žīŧŒč¯ˇčž“å…Ĩæ ‡į­žįš„åŽŒæ•´čˇ¯åž„īŧŒåŒ…æ‹Ŧæ­Ŗæ–œæ īŧˆ/īŧ‰ã€‚", + "create_tag_description": "创åģēæ–°æ ‡į­žã€‚åĻ‚éœ€åˆ›åģēå­æ ‡į­žīŧŒč¯ˇčž“å…Ĩ包åĢæ­Ŗæ–œæ īŧˆ/īŧ‰įš„åŽŒæ•´æ ‡į­žčˇ¯åž„ã€‚", "create_user": "创åģēį”¨æˆˇ", - "create_workflow": "创åģēåˇĨäŊœæĩ", + "create_workflow": "新åģēåˇĨäŊœæĩ", "created": "åˇ˛åˆ›åģē", "created_at": "创åģēæ—ļ间", "creating_linked_albums": "æ­Ŗåœ¨åˆ›åģēį›¸å†Œé“žæŽĨâ€Ļ", "crop": "誁å‰Ē", - "crop_aspect_ratio_fixed": "å›ē厚įēĩæ¨Ē比", - "crop_aspect_ratio_free": "č‡Ēį”ąįēĩæ¨Ē比", - "crop_aspect_ratio_original": "原始įēĩæ¨Ē比", - "curated_object_page_title": "äē‹į‰Š", + "crop_aspect_ratio_fixed": "å›ē厚比䞋", + "crop_aspect_ratio_free": "č‡Ēį”ąæ¯”äž‹", + "crop_aspect_ratio_original": "原始比䞋", + "curated_object_page_title": "į˛žé€‰é›†", "current_device": "åŊ“å‰čŽžå¤‡", - "current_pin_code": "åŊ“前PIN᠁", + "current_pin_code": "åŊ“前 PIN ᠁", "current_server_address": "åŊ“å‰æœåŠĄå™¨åœ°å€", "custom_date": "č‡Ē厚䚉æ—Ĩ期", - "custom_locale": "č‡Ē厚䚉地åŒē", - "custom_locale_description": "æ—Ĩ期和数字昞į¤ēæ ŧåŧčˇŸéšč¯­č¨€å’Œåœ°åŒē", - "custom_url": "č‡Ē厚䚉URL", + "custom_locale": "č‡Ē厚䚉åŒē域", + "custom_locale_description": "æ šæŽæ‰€é€‰įš„č¯­č¨€å’Œåœ°åŒēæĨæ ŧåŧåŒ–æ—Ĩ期、æ—ļ间和数字", + "custom_url": "č‡Ē厚䚉 URL", "cutoff_date_description": "äŋį•™æœ€čŋ‘įš„į…§į‰‡â€Ļ", "cutoff_day": "{count, plural, one {夊} other {夊}}", "cutoff_year": "{count, plural, one {åš´} other {åš´}}", "daily_title_text_date": "MMM dd (E)", - "daily_title_text_date_year": "YYYYåš´M月Dæ—Ĩ (E)", + "daily_title_text_date_year": "YYYYåš´M月dæ—Ĩ (E)", "dark": "æˇąč‰˛", "dark_theme": "切æĸæˇąč‰˛ä¸ģéĸ˜", "date": "æ—Ĩ期", @@ -888,62 +893,60 @@ "deduplicate_all": "åˆ é™¤æ‰€æœ‰é‡å¤éĄš", "deduplication_criteria_1": "回像大小īŧˆå­—节īŧ‰", "deduplication_criteria_2": "EXIF æ•°æŽčŽĄæ•°", - "deduplication_info": "é‡å¤æ•°æŽåˆ é™¤æą‡æ€ģ", - "deduplication_info_description": "čρč‡Ē动éĸ„选čĩ„äē§åšļæ‰šé‡åˆ é™¤é‡å¤éĄšīŧŒæˆ‘äģŦäŧšč€ƒč™‘īŧš", - "default_locale": "éģ˜čޤ地åŒē", - "default_locale_description": "æ šæŽæ‚¨įš„æĩč§ˆå™¨åœ°åŒē莞įŊŽæ—Ĩ期和数字昞į¤ēæ ŧåŧ", + "deduplication_info": "åŽģ重įģŸčŽĄ", + "deduplication_info_description": "ä¸ēäē†č‡Ē动éĸ„é€‰į´ æåšļ扚量åŽģé™¤é‡å¤éĄšīŧŒæˆ‘äģŦäŧšå‚č€ƒäģĨ下äŋĄæ¯īŧš", "delete": "删除", - "delete_action_confirmation_message": "æ‚¨įĄŽåŽščĻåˆ é™¤æ­¤čĩ„äē§å—īŧŸæ­¤æ“äŊœäŧšå°†čĩ„äē§į§ģč‡ŗæœåŠĄå™¨å›žæ”ļįĢ™īŧŒåšļäŧšæį¤ē您是åĻčρ圍æœŦ地删除厃", + "delete_action_confirmation_message": "æ‚¨įĄŽåŽščĻåˆ é™¤æ­¤į´ æå—īŧŸæ­¤æ“äŊœäŧšå°†č¯Ĩį´ æį§ģč‡ŗæœåŠĄå™¨įš„å›žæ”ļįĢ™īŧŒåšļ提į¤ē您是åĻ将å…ļ在æœŦåœ°čŽžå¤‡ä¸Šåˆ é™¤", "delete_action_prompt": "åˇ˛åˆ é™¤ {count} 饚", "delete_album": "åˆ é™¤į›¸å†Œ", - "delete_api_key_prompt": "是åĻįĄŽčŽ¤åˆ é™¤æ­¤ API 密é’ĨīŧŸ", - "delete_dialog_alert": "čŋ™äē›čĩ„äē§å°†äģŽ Immich å’Œæ‚¨įš„čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤", - "delete_dialog_alert_local": "čŋ™äē›éĄšį›Žå°†äģŽæ‚¨įš„į§ģåŠ¨čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤īŧŒäŊ†äģį„ļ可äģĨäģŽ Immich æœåŠĄå™¨ä¸­å†æŦĄčŽˇå–", - "delete_dialog_alert_local_non_backed_up": "éƒ¨åˆ†éĄšį›Žčŋ˜æœĒ备äģŊ臺 Immich æœåŠĄå™¨īŧŒå°†äģŽæ‚¨įš„į§ģåŠ¨čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤", - "delete_dialog_alert_remote": "čŋ™äē›éĄšį›Žå°†äģŽ Immich æœåŠĄå™¨ä¸­æ°¸äš…åˆ é™¤", - "delete_dialog_ok_force": "įĄŽčŽ¤åˆ é™¤", + "delete_api_key_prompt": "æ‚¨įĄŽåŽščĻåˆ é™¤æ­¤ API 密é’Ĩ吗īŧŸ", + "delete_dialog_alert": "čŋ™äē›éĄšį›Žå°†äģŽ Immich æœåŠĄå™¨äģĨ及äŊ įš„čŽžå¤‡ä¸ŠčĸĢæ°¸äš…删除", + "delete_dialog_alert_local": "čŋ™äē›éĄšį›Žå°†äģŽäŊ įš„čŽžå¤‡ä¸ŠčĸĢæ°¸äš…į§ģ除īŧŒäŊ†äžį„ļäŧšäŋį•™åœ¨ Immich æœåŠĄå™¨ä¸Š", + "delete_dialog_alert_local_non_backed_up": "éƒ¨åˆ†éĄšį›Žå°šæœĒ备äģŊ到 ImmichīŧŒäģŽčŽžå¤‡ä¸Šåˆ é™¤åŽå°†æ°¸äš…ä¸ĸå¤ą", + "delete_dialog_alert_remote": "čŋ™äē›éĄšį›Žå°†äģŽ Immich æœåŠĄå™¨ä¸ŠčĸĢæ°¸äš…删除", + "delete_dialog_ok_force": "įģ§įģ­åˆ é™¤", "delete_dialog_title": "永䚅删除", - "delete_duplicates_confirmation": "įĄŽåŽščĻæ°¸äš…åˆ é™¤čŋ™äē›é‡å¤éĄšå—īŧŸ", - "delete_face": "删除äēē脸", + "delete_duplicates_confirmation": "æ‚¨įĄŽåŽščĻæ°¸äš…åˆ é™¤čŋ™äē›é‡å¤éĄšå—īŧŸ", + "delete_face": "删除č¯Ĩäēē脸", "delete_key": "删除密é’Ĩ", - "delete_library": "删除čĩ„äē§åē“", + "delete_library": "删除čĩ„æ–™åē“", "delete_link": "删除铞æŽĨ", - "delete_local_action_prompt": "åˇ˛åˆ é™¤æœŦåœ°éĄšį›Ž{count}饚", - "delete_local_dialog_ok_backed_up_only": "äģ…åˆ é™¤åˇ˛å¤‡äģŊéĄšį›Ž", - "delete_local_dialog_ok_force": "įĄŽčŽ¤åˆ é™¤", + "delete_local_action_prompt": "{count} éĄšåˇ˛åœ¨æœŦ地删除", + "delete_local_dialog_ok_backed_up_only": "äģ…åˆ é™¤åˇ˛å¤‡äģŊįš„éĄšį›Ž", + "delete_local_dialog_ok_force": "åŧēåˆļ删除", "delete_others": "删除å…ļ厃", "delete_permanently": "永䚅删除", - "delete_permanently_action_prompt": "åˇ˛æ°¸äš…åˆ é™¤ {count} 饚", + "delete_permanently_action_prompt": "{count} éĄšåˇ˛æ°¸äš…åˆ é™¤", "delete_shared_link": "åˆ é™¤å…ąäēĢ链æŽĨ", "delete_shared_link_dialog_title": "åˆ é™¤å…ąäēĢ链æŽĨ", "delete_tag": "åˆ é™¤æ ‡į­ž", - "delete_tag_confirmation_prompt": "æ‚¨įĄŽåŽščĻåˆ é™¤â€œ{tagName}â€æ ‡į­žå—īŧŸ", + "delete_tag_confirmation_prompt": "æ‚¨įĄŽåŽščĻåˆ é™¤â€œ{tagName}”čŋ™ä¸Ēæ ‡į­žå—īŧŸ", "delete_user": "åˆ é™¤į”¨æˆˇ", "deleted_shared_link": "å…ąäēĢ链æŽĨåˇ˛åˆ é™¤", - "deletes_missing_assets": "åˆ é™¤įŖį›˜ä¸­ä¸ĸå¤ąįš„čĩ„äē§", + "deletes_missing_assets": "æ¸…į†ä¸ĸå¤ąįš„åĒ’äŊ“å瓿Ąį›Ž", "description": "描čŋ°", "description_input_hint_text": "æˇģ加描čŋ°...", - "description_input_submit_error": "更新描čŋ°æ—ļå‡ē错īŧŒč¯ˇæŖ€æŸĨæ—Ĩåŋ—äģĨčŽˇå–æ›´å¤šč¯Ļįģ†äŋĄæ¯", + "description_input_submit_error": "更新描čŋ°äŋĄæ¯æ—ļå‡ē错īŧŒč¯ˇæŖ€æŸĨæ—Ĩåŋ—äģĨčŽˇå–æ›´å¤šč¯Ļ情", "deselect_all": "取æļˆå…¨é€‰", "details": "č¯Ļ情", "direction": "斚向", "disable": "įρᔍ", "disabled": "įρᔍ", - "disallow_edits": "ä¸å…čŽ¸įŧ–čž‘", + "disallow_edits": "įρæ­ĸįŧ–čž‘", "discord": "Discord į¤žåŒē", "discover": "å‘įŽ°", "discovered_devices": "åˇ˛å‘įŽ°įš„čŽžå¤‡", "dismiss_all_errors": "åŋŊį•Ĩæ‰€æœ‰é”™č¯¯", - "dismiss_error": "åŋŊį•Ĩ错蝝", + "dismiss_error": "åŋŊį•Ĩæ­¤é”™č¯¯", "display_options": "昞į¤ē选项", - "display_order": "昞į¤ēéĄēåē", - "display_original_photos": "昞į¤ēåŽŸå§‹į…§į‰‡", - "display_original_photos_setting_description": "在įŊ‘įģœä¸ŽåŽŸå§‹æ ŧåŧå…ŧåŽšįš„æƒ…å†ĩ下īŧŒæŸĨįœ‹å›žį‰‡æˆ–č§†éĸ‘æ—ļäŧ˜å…ˆæ˜žį¤ē原始文äģļč€Œä¸æ˜¯įŧŠį•Ĩ回。čŋ™å¯čƒŊå¯ŧč‡´į…§į‰‡æ˜žį¤ē速åēĻ变æ…ĸ。", - "do_not_show_again": "不再昞į¤ēæ­¤äŋĄæ¯", - "documentation": "å¸ŽåŠŠæ–‡æĄŖ", + "display_order": "排åēæ–šåŧ", + "display_original_photos": "昞į¤ē原回", + "display_original_photos_setting_description": "在æŸĨįœ‹æ–‡äģļæ—ļīŧŒäŧ˜å…ˆæ˜žį¤ēåŽŸå›žč€ŒéžįŧŠį•Ĩ回īŧˆäģ…é™å¯į›´æŽĨ在įŊ‘éĄĩ中昞į¤ēįš„åŽŸå›žæ ŧåŧīŧ‰ã€‚此操äŊœå¯čƒŊäŧšå¯ŧč‡´į…§į‰‡åŠ čŊŊ速åēĻ变æ…ĸ。", + "do_not_show_again": "不再昞į¤ē", + "documentation": "æ–‡æĄŖ", "done": "厌成", "download": "下čŊŊ", - "download_action_prompt": "æ­Ŗåœ¨ä¸‹čŊŊ {count} ä¸Ēčĩ„äē§", + "download_action_prompt": "æ­Ŗåœ¨ä¸‹čŊŊ {count} éĄšå†…åŽš", "download_canceled": "下čŊŊåˇ˛å–æļˆ", "download_complete": "下čŊŊ厌成", "download_enqueue": "厞加å…Ĩ下čŊŊ队列", @@ -951,23 +954,23 @@ "download_failed": "下čŊŊå¤ąč´Ĩ", "download_finished": "下čŊŊ厌成", "download_include_embedded_motion_videos": "内åĩŒč§†éĸ‘", - "download_include_embedded_motion_videos_description": "将厞å†ĩį…§į‰‡ä¸­įš„å†…åĩŒč§†éĸ‘äŊœä¸ē单į‹Ŧ文äģļįēŗå…Ĩ", - "download_notfound": "æ— æŗ•æ‰žåˆ°ä¸‹čŊŊ", + "download_include_embedded_motion_videos_description": "å°†åŠ¨æ€į…§į‰‡ä¸­įš„å†…åĩŒč§†éĸ‘äŊœä¸ēį‹ŦįĢ‹æ–‡äģļå¯ŧå…Ĩ", + "download_notfound": "下čŊŊå¤ąč´Ĩīŧšæ–‡äģᅵǿ‰žåˆ°", "download_original": "下čŊŊ原始文äģļ", "download_paused": "下čŊŊåˇ˛æš‚åœ", "download_settings": "下čŊŊ", - "download_settings_description": "įŽĄį†éĄšį›Žä¸‹čŊŊį›¸å…ŗčŽžįŊŽ", + "download_settings_description": "įŽĄį†ä¸Žæ–‡äģļ下čŊŊį›¸å…ŗįš„čŽžįŊŽ", "download_started": "åŧ€å§‹ä¸‹čŊŊ", "download_sucess": "下čŊŊ成功", - "download_sucess_android": "åĒ’äŊ“厞䏋čŊŊ臺 DCIM/Immich", + "download_sucess_android": "厞äŋå­˜åˆ° DCIM/Immich 文äģļ多", "download_waiting_to_retry": "į­‰åž…é‡č¯•", "downloading": "下čŊŊ中", - "downloading_asset_filename": "下čŊŊéĄšį›Žâ€œ{filename}”", + "downloading_asset_filename": "æ­Ŗåœ¨ä¸‹čŊŊ文äģļīŧš{filename}", "downloading_from_icloud": "äģŽiCloud下čŊŊ", - "downloading_media": "æ­Ŗåœ¨ä¸‹čŊŊåĒ’äŊ“", - "drop_files_to_upload": "拖攞文äģļäģĨ上äŧ ", + "downloading_media": "æ­Ŗåœ¨ä¸‹čŊŊåĒ’äŊ“æ–‡äģļ", + "drop_files_to_upload": "随意拖攞文äģļäģĨ上äŧ ", "duplicates": "é‡å¤éĄš", - "duplicates_description": "åŽĄæŸĨ每įģ„į–‘äŧŧé‡å¤éĄšåšļæ ‡čŽ°å“Ēä盿˜¯é‡å¤įš„īŧˆåĻ‚æžœæœ‰įš„č¯īŧ‰", + "duplicates_description": "č¯ˇé€ä¸€æ ‡čŽ°æ¯įģ„ä¸­įš„é‡å¤æ–‡äģļ", "duration": "æ—ļé•ŋ", "edit": "įŧ–čž‘", "edit_album": "įŧ–čž‘į›¸å†Œ", @@ -976,8 +979,8 @@ "edit_date": "įŧ–čž‘æ—Ĩ期", "edit_date_and_time": "įŧ–čž‘æ—Ĩ期和æ—ļ间", "edit_date_and_time_action_prompt": "厞įŧ–čž‘ {count} 饚æ—Ĩ期æ—ļ间", - "edit_date_and_time_by_offset": "按æ—ļ间偏į§ģ量更攚æ—Ĩ期", - "edit_date_and_time_by_offset_interval": "新æ—ĨæœŸįš„čŒƒå›´īŧš{from} - {to}", + "edit_date_and_time_by_offset": "按偏į§ģé‡č°ƒæ•´æ—Ĩ期", + "edit_date_and_time_by_offset_interval": "新æ—ĨæœŸčŒƒå›´īŧš{from} - {to}", "edit_description": "äŋŽæ”šæčŋ°", "edit_description_prompt": "č¯ˇé€‰æ‹Šæ–°įš„æčŋ°īŧš", "edit_exclusion_pattern": "įŧ–čž‘æŽ’é™¤č§„åˆ™", @@ -985,7 +988,7 @@ "edit_key": "įŧ–čž‘ API 密é’Ĩ", "edit_link": "įŧ–螑铞æŽĨ", "edit_location": "įŧ–čž‘äŊįŊŽ", - "edit_location_action_prompt": "{count} ä¸ĒäŊįŊŽåˇ˛įŧ–čž‘", + "edit_location_action_prompt": "厞įŧ–čž‘ {count} ä¸ĒäŊįŊŽ", "edit_location_dialog_title": "äŊįŊŽ", "edit_name": "įŧ–čž‘åį§°", "edit_people": "įŧ–čž‘äēēį‰Š", @@ -994,111 +997,114 @@ "edit_user": "įŧ–čž‘į”¨æˆˇ", "edit_workflow": "įŧ–čž‘åˇĨäŊœæĩ", "editor": "įŧ–čž‘å™¨", - "editor_close_without_save_prompt": "此更攚不äŧščĸĢäŋå­˜", + "editor_close_without_save_prompt": "更攚将不äŧščĸĢäŋå­˜", "editor_close_without_save_title": "å…ŗé—­įŧ–čž‘å™¨īŧŸ", "editor_confirm_reset_all_changes": "æ‚¨įĄŽåŽščĻé‡įŊŽæ‰€æœ‰æ›´æ”šå—īŧŸ", "editor_discard_edits_confirm": "攞åŧƒįŧ–čž‘", - "editor_discard_edits_prompt": "您有æœĒäŋå­˜įš„æ›´æ”šīŧŒįĄŽåޚčĻæ”žåŧƒå—īŧŸ", + "editor_discard_edits_prompt": "您有æœĒäŋå­˜įš„äŋŽæ”šīŧŒįĄŽåޚčρä¸ĸåŧƒå—īŧŸ", "editor_discard_edits_title": "įĄŽåŽšæ”žåŧƒįŧ–čž‘å—īŧŸ", "editor_edits_applied_error": "åē”ᔍįŧ–čž‘å¤ąč´Ĩ", "editor_edits_applied_success": "įŧ–čž‘åˇ˛æˆåŠŸåē”ᔍ", "editor_flip_horizontal": "æ°´åšŗįŋģčŊŦ", "editor_flip_vertical": "åž‚į›´įŋģčŊŦ", + "editor_handle_corner": "{corner, select, top_left {åˇĻ上角} top_right {åŗä¸Šč§’} bottom_left {åˇĻ下角} bottom_right {åŗä¸‹č§’} other {某ä¸Ē}} 角čŊįš„æŽ§åˆļ手柄", + "editor_handle_edge": "{edge, select, top {éĄļ部} bottom {åē•部} left {åˇĻäž§} right {åŗäž§} other {某ä¸Ē}} čžšįŧ˜įš„æŽ§åˆļ手柄", "editor_orientation": "斚向", - "editor_reset_all_changes": "重įŊŽæ›´æ”š", + "editor_reset_all_changes": "čŋ˜åŽŸæ›´æ”š", "editor_rotate_left": "逆æ—ļ针旋čŊŦ90°", "editor_rotate_right": "éĄēæ—ļ针旋čŊŦ90åēĻ", "email": "é‚ŽįŽą", "email_notifications": "邮äģļ通įŸĨ", "empty_folder": "此文äģļ多ä¸ēįŠē", "empty_trash": "清įŠē回æ”ļįĢ™", - "empty_trash_confirmation": "įĄŽåŽščĻæ¸…įŠē回æ”ļįĢ™īŧŸčŋ™å°†æ°¸äš…删除回æ”ļįĢ™ä¸­įš„æ‰€æœ‰éĄšį›Žã€‚\næŗ¨æ„īŧšč¯Ĩ操äŊœæ— æŗ•æ’¤æļˆīŧ", + "empty_trash_confirmation": "įĄŽåŽščĻæ¸…įŠē回æ”ļį̙吗īŧŸæ­¤æ“äŊœå°†æ°¸äš…删除回æ”ļįĢ™ä¸­įš„æ‰€æœ‰čĩ„æēã€‚\nč¯Ĩ操äŊœæ— æŗ•撤销īŧ", "enable": "吝ᔍ", "enable_backup": "吝ᔍ备äģŊ", - "enable_biometric_auth_description": "输å…Ĩæ‚¨įš„PIN᠁äģĨå¯į”¨į”Ÿį‰Šč¯†åˆĢčēĢäģŊénj蝁", + "enable_biometric_auth_description": "č¯ˇčž“å…Ĩæ‚¨įš„ PIN ᠁äģĨå¯į”¨į”Ÿį‰Šč¯†åˆĢčŽ¤č¯", "enabled": "厞吝ᔍ", "end_date": "į쓿Ÿæ—Ĩ期", - "enqueued": "排队中", + "enqueued": "厞加å…Ĩ队列", "enter_wifi_name": "输å…Ĩ Wi-Fi åį§°", - "enter_your_pin_code": "输å…Ĩæ‚¨įš„PIN᠁", - "enter_your_pin_code_subtitle": "输å…Ĩæ‚¨įš„PIN᠁äģĨčŽŋ闎此锁厚文äģļ多", + "enter_your_pin_code": "输å…Ĩæ‚¨įš„ PIN ᠁", + "enter_your_pin_code_subtitle": "输å…ĨäŊ įš„ PIN ᠁äģĨčŽŋé—Žé”åŽšįš„æ–‡äģļ多", "error": "错蝝", - "error_change_sort_album": "æ›´æ”šį›¸å†ŒæŽ’åēå¤ąč´Ĩ", - "error_delete_face": "删除äēēč„¸å¤ąč´Ĩ", - "error_getting_places": "čŽˇå–äŊįŊŽæ—ļå‡ē错", - "error_loading_albums": "加čŊŊį›¸å†Œå¤ąč´Ĩ", + "error_change_sort_album": "æ›´æ”šį›¸å†ŒæŽ’åēéĄēåēå¤ąč´Ĩ", + "error_delete_face": "删除č¯Ĩčĩ„äē§ä¸­įš„äēē脸æ—ļå‡ē错", + "error_getting_places": "čŽˇå–åœ°į‚šäŋĄæ¯æ—ļå‡ē错", + "error_loading_albums": "加čŊŊį›¸å†Œæ—ļå‡ē错", "error_loading_image": "加čŊŊå›žį‰‡æ—ļå‡ē错", "error_loading_partners": "加čŊŊ协äŊœč€…æ—ļå‡ē错īŧš{error}", - "error_retrieving_asset_information": "čŽˇå–čĩ„äē§äŋĄæ¯æ—ļå‡ē错", + "error_retrieving_asset_information": "čŽˇå–čĩ„æēäŋĄæ¯æ—ļå‡ē错", "error_saving_image": "错蝝īŧš{error}", - "error_tag_face_bounding_box": "æ ‡čŽ°äēē脸å‡ē错 - æ— æŗ•čŽˇå–äēēč„¸æĄ†åæ ‡", - "error_title": "错蝝 - åĨŊ像å‡ēäē†é—Žéĸ˜", - "error_while_navigating": "莺čŊŦ到文äģļæ—ļå‡ē错", + "error_tag_face_bounding_box": "æ ‡čŽ°äēē脸æ—ļå‡ē错 - æ— æŗ•čŽˇå–čžšį•ŒæĄ†åæ ‡", + "error_title": "错蝝 - å‡ēįŽ°äē†é—Žéĸ˜", + "error_while_navigating": "莺čŊŦ到čĩ„æēæ—ļå‡ē错", "errors": { - "cannot_navigate_next_asset": "æ— æŗ•å¯ŧčˆĒ到下一ä¸ĒéĄšį›Ž", - "cannot_navigate_previous_asset": "æ— æŗ•å¯ŧčˆĒ到上一ä¸ĒéĄšį›Ž", + "cannot_navigate_next_asset": "æ— æŗ•čˇŗčŊŦ到下一ä¸Ēčĩ„æē", + "cannot_navigate_previous_asset": "æ— æŗ•čˇŗčŊŦ到上一ä¸Ēčĩ„æē", "cant_apply_changes": "æ— æŗ•åē”į”¨æ›´æ”š", - "cant_change_activity": "æ— æŗ•{enabled, select, true {įρᔍ} other {吝ᔍ}}æ´ģ动", - "cant_change_asset_favorite": "æ— æŗ•äŋŽæ”šéĄšį›Žįš„æ”ļč—åąžæ€§", - "cant_change_metadata_assets_count": "æ— æŗ•äŋŽæ”š{count, plural, one {#ä¸ĒéĄšį›Ž} other {#ä¸ĒéĄšį›Ž}}įš„å…ƒæ•°æŽ", + "cant_change_activity": "æ— æŗ• {enabled, select, true {įρᔍ} other {吝ᔍ}} æ´ģ动", + "cant_change_asset_favorite": "æ— æŗ•æ›´æ”ščĩ„æēįš„æ”ļ藏įŠļ态", + "cant_change_metadata_assets_count": "æ— æŗ•äŋŽæ”š{count, plural, one {#ä¸Ēčĩ„æē} other {#ä¸Ēčĩ„æē}}įš„å…ƒæ•°æŽ", "cant_get_faces": "æ— æŗ•čŽˇå–äēē脸", "cant_get_number_of_comments": "æ— æŗ•čŽˇå–č¯„čŽē数量", - "cant_search_people": "æ— æŗ•æŖ€į´ĸäēēį‰Š", - "cant_search_places": "æ— æŗ•æŖ€į´ĸåœ°į‚š", - "error_adding_assets_to_album": "æˇģåŠ éĄšį›Žåˆ°į›¸å†Œæ—ļå‡ē错", + "cant_search_people": "æ— æŗ•æœį´ĸäēēį‰Š", + "cant_search_places": "æ— æŗ•æœį´ĸåœ°į‚š", + "error_adding_assets_to_album": "æˇģ加čĩ„æēåˆ°į›¸å†Œæ—ļå‡ē错", "error_adding_users_to_album": "æˇģåŠ į”¨æˆˇåˆ°į›¸å†Œæ—ļå‡ē错", "error_deleting_shared_user": "åˆ é™¤å…ąäēĢį”¨æˆˇæ—ļå‡ē错", "error_downloading": "下čŊŊ“{filename}”æ—ļå‡ē错", "error_hiding_buy_button": "éšč—č´­äš°æŒ‰é’Žæ—ļå‡ē错", - "error_removing_assets_from_album": "äģŽį›¸å†Œä¸­į§ģé™¤éĄšį›Žæ—ļå‡ē错īŧŒč¯ˇåˆ°æŽ§åˆļå°čŽˇå–æ›´č¯Ļįģ†äŋĄæ¯", - "error_selecting_all_assets": "é€‰æ‹Šæ‰€æœ‰éĄšį›Žæ—ļå‡ē错", - "exclusion_pattern_already_exists": "åˇ˛å­˜åœ¨į›¸åŒæŽ’é™¤č§„åˆ™ã€‚", + "error_removing_assets_from_album": "į§ģé™¤į›¸å†Œčĩ„æēæ—ļå‡ē错īŧŒč¯ˇæŖ€æŸĨ控åˆļ台äģĨčŽˇå–æ›´å¤šč¯Ļ情", + "error_selecting_all_assets": "全选čĩ„æēæ—ļå‡ē错", + "exclusion_pattern_already_exists": "æ­¤æŽ’é™¤æ¨Ąåŧåˇ˛å­˜åœ¨ã€‚", "failed_to_create_album": "创åģēį›¸å†Œå¤ąč´Ĩ", "failed_to_create_shared_link": "创åģēå…ąäēĢ链æŽĨå¤ąč´Ĩ", "failed_to_edit_shared_link": "įŧ–čž‘å…ąäēĢ链æŽĨå¤ąč´Ĩ", - "failed_to_get_people": "æ— æŗ•čŽˇå–äēēį‰Š", - "failed_to_keep_this_delete_others": "æ— æŗ•äŋį•™č¯ĨéĄšį›Žåšļ删除å…ļåŽƒéĄšį›Ž", - "failed_to_load_asset": "加čŊŊéĄšį›Žå¤ąč´Ĩ", - "failed_to_load_assets": "加čŊŊéĄšį›Žå¤ąč´Ĩ", + "failed_to_get_people": "čŽˇå–äēēį‰Šåˆ—čĄ¨å¤ąč´Ĩ", + "failed_to_keep_this_delete_others": "äŋį•™æ­¤čĩ„æēåšļ删除å…ļäģ–čĩ„æēå¤ąč´Ĩ", + "failed_to_load_asset": "加čŊŊčĩ„æēå¤ąč´Ĩ", + "failed_to_load_assets": "加čŊŊčĩ„æēå¤ąč´Ĩ", "failed_to_load_notifications": "加čŊŊ通įŸĨå¤ąč´Ĩ", "failed_to_load_people": "加čŊŊäēēį‰Šå¤ąč´Ĩ", "failed_to_remove_product_key": "į§ģ除äē§å“å¯†é’Ĩå¤ąč´Ĩ", - "failed_to_reset_pin_code": "重įŊŽPINį å¤ąč´Ĩ", - "failed_to_stack_assets": "æ— æŗ•å †å éĄšį›Ž", - "failed_to_unstack_assets": "æ— æŗ•å–æļˆå †å éĄšį›Ž", + "failed_to_reset_pin_code": "重įŊŽ PIN į å¤ąč´Ĩ", + "failed_to_stack_assets": "堆叠čĩ„æēå¤ąč´Ĩ", + "failed_to_unstack_assets": "取æļˆå †å čĩ„æēå¤ąč´Ĩ", "failed_to_update_notification_status": "更新通įŸĨįŠļæ€å¤ąč´Ĩ", "incorrect_email_or_password": "é‚ŽįŽąæˆ–å¯†į é”™č¯¯", - "library_folder_already_exists": "å¯ŧå…Ĩčˇ¯åž„åˇ˛å­˜åœ¨ã€‚", + "library_folder_already_exists": "č¯Ĩå¯ŧå…Ĩčˇ¯åž„åˇ˛å­˜åœ¨ã€‚", + "page_not_found": "éĄĩéĸæœĒ扞到", "paths_validation_failed": "{paths, plural, one {#æĄčˇ¯åž„} other {#æĄčˇ¯åž„}} æ ĄéĒŒå¤ąč´Ĩ", - "profile_picture_transparent_pixels": "ä¸Ēäēēčĩ„æ–™å›žį‰‡ä¸å¯äģĨ包åĢé€æ˜Žåƒį´ ã€‚č¯ˇæ”žå¤§æˆ–į§ģåŠ¨æ­¤å›žį‰‡ã€‚", - "quota_higher_than_disk_size": "莞įŊŽįš„配éĸå¤§äēŽįŖį›˜åŽšé‡", - "something_went_wrong": "å‡ēäē†į‚šé—Žéĸ˜", - "unable_to_add_album_users": "æ— æŗ•æˇģåŠ į”¨æˆˇč‡ŗį›¸å†Œ", - "unable_to_add_assets_to_shared_link": "æ— æŗ•æˇģåŠ éĄšį›Žåˆ°å…ąäēĢ链æŽĨ", + "profile_picture_transparent_pixels": "å¤´åƒä¸æ”¯æŒé€æ˜ŽčƒŒæ™¯īŧŒč¯ˇæ”žå¤§æˆ–į§ģåŠ¨å›žį‰‡ã€‚", + "quota_higher_than_disk_size": "äŊ čŽžįŊŽįš„配éĸčļ…čŋ‡äē†įŖį›˜æ€ģ大小", + "something_went_wrong": "å‡ē错äē†", + "unable_to_add_album_users": "æ— æŗ•å‘į›¸å†ŒæˇģåŠ į”¨æˆˇ", + "unable_to_add_assets_to_shared_link": "æ— æŗ•å‘åˆ†äēĢ链æŽĨæˇģ加čĩ„æē", "unable_to_add_comment": "æ— æŗ•æˇģåŠ č¯„čŽē", "unable_to_add_exclusion_pattern": "æ— æŗ•æˇģåŠ æŽ’é™¤č§„åˆ™", "unable_to_add_partners": "æ— æŗ•æˇģ加协äŊœč€…", - "unable_to_add_remove_archive": "æ— æŗ•{archived, select, true {äģŽåŊ’æĄŖä¸­į§ģ除} other {æˇģåŠ éĄšį›Žåˆ°åŊ’æĄŖ}}", - "unable_to_add_remove_favorites": "æ— æŗ•{favorite, select, true {æˇģåŠ éĄšį›Žåˆ°æ”ļ藏} other {äģŽæ”ļ藏中į§ģ除}}", + "unable_to_add_remove_archive": "æ— æŗ•{archived, select, true {äģŽåŊ’æĄŖä¸­į§ģ除} other {æˇģ加čĩ„æēåˆ°åŊ’æĄŖ}}", + "unable_to_add_remove_favorites": "æ— æŗ•{favorite, select, true {æˇģ加čĩ„æēåˆ°æ”ļ藏} other {äģŽæ”ļ藏中į§ģ除}}", "unable_to_archive_unarchive": "æ— æŗ•{archived, select, true {åŊ’æĄŖ} other {取æļˆåŊ’æĄŖ}}", - "unable_to_change_album_user_role": "æ— æŗ•æ›´æ”šį›¸å†Œį”¨æˆˇč§„åˆ™", + "unable_to_change_album_user_role": "æ— æŗ•æ›´æ”šį›¸å†Œį”¨æˆˇįš„č§’č‰˛", "unable_to_change_date": "æ— æŗ•æ›´æ”šæ—Ĩ期", "unable_to_change_description": "æ— æŗ•äŋŽæ”šæčŋ°", - "unable_to_change_favorite": "æ— æŗ•äŋŽæ”šéĄšį›Žįš„æ”ļč—åąžæ€§", + "unable_to_change_favorite": "æ— æŗ•æ›´æ”ščĩ„æēįš„æ”ļ藏įŠļ态", "unable_to_change_location": "æ— æŗ•æ›´æ”šäŊįŊŽ", "unable_to_change_password": "æ— æŗ•äŋŽæ”šå¯†į ", - "unable_to_change_visibility": "æ— æŗ•äŋŽæ”š{count, plural, one {#ä¸Ēäēē} other {#ä¸Ēäēē}}įš„å¯č§æ€§", + "unable_to_change_visibility": "æ— æŗ•äŋŽæ”š{count, plural, one {#ä¸Ēäēē} other {#ä¸Ēäēē}}įš„å¯č§æ€§čŽžįŊŽ", "unable_to_complete_oauth_login": "æ— æŗ•åŽŒæˆ OAuth į™ģåŊ•", "unable_to_connect": "æ— æŗ•čŋžæŽĨ", - "unable_to_copy_to_clipboard": "æ— æŗ•å¤åˆļ到å‰Ē切æŋīŧŒč¯ˇįĄŽäŋæ‚¨åœ¨äŊŋᔍhttpsčŽŋ问æœŦéĄĩ", + "unable_to_copy_to_clipboard": "æ— æŗ•å¤åˆļ到å‰Ēč´´æŋīŧŒč¯ˇįĄŽäŋäŊ æ˜¯é€ščŋ‡ HTTPS čŽŋ问č¯ĨéĄĩéĸįš„", "unable_to_create": "æ— æŗ•åˆ›åģēåˇĨäŊœæĩ", "unable_to_create_admin_account": "æ— æŗ•åˆ›åģēįŽĄį†å‘˜č´Ļæˆˇ", "unable_to_create_api_key": "æ— æŗ•åˆ›åģēæ–°įš„ API 密é’Ĩ", - "unable_to_create_library": "æ— æŗ•åˆ›åģēčĩ„äē§åē“", + "unable_to_create_library": "æ— æŗ•åˆ›åģēåē“", "unable_to_create_user": "æ— æŗ•åˆ›åģēį”¨æˆˇ", "unable_to_delete_album": "æ— æŗ•åˆ é™¤į›¸å†Œ", - "unable_to_delete_asset": "æ— æŗ•åˆ é™¤éĄšį›Ž", - "unable_to_delete_assets": "æ— æŗ•åˆ é™¤éĄšį›Ž", + "unable_to_delete_asset": "æ— æŗ•åˆ é™¤čĩ„æē", + "unable_to_delete_assets": "删除čĩ„æē æ—ļå‡ē错", "unable_to_delete_exclusion_pattern": "æ— æŗ•åˆ é™¤æŽ’é™¤č§„åˆ™", "unable_to_delete_shared_link": "æ— æŗ•åˆ é™¤å…ąäēĢ链æŽĨ", "unable_to_delete_user": "æ— æŗ•åˆ é™¤į”¨æˆˇ", @@ -1106,54 +1112,54 @@ "unable_to_download_files": "æ— æŗ•ä¸‹čŊŊ文äģļ", "unable_to_edit_exclusion_pattern": "æ— æŗ•įŧ–čž‘æŽ’é™¤č§„åˆ™", "unable_to_empty_trash": "æ— æŗ•æ¸…įŠē回æ”ļįĢ™", - "unable_to_enter_fullscreen": "æ— æŗ•čŋ›å…Ĩå…¨åą", - "unable_to_exit_fullscreen": "æ— æŗ•é€€å‡ēå…¨åą", + "unable_to_enter_fullscreen": "æ— æŗ•čŋ›å…Ĩå…¨åąæ¨Ąåŧ", + "unable_to_exit_fullscreen": "æ— æŗ•é€€å‡ēå…¨åąæ¨Ąåŧ", "unable_to_get_comments_number": "æ— æŗ•čŽˇå–č¯„čŽē数量", "unable_to_get_shared_link": "čŽˇå–å…ąäēĢ链æŽĨå¤ąč´Ĩ", "unable_to_hide_person": "æ— æŗ•éšč—äēēį‰Š", - "unable_to_link_motion_video": "æ— æŗ•é“žæŽĨåˆ°åŠ¨æ€č§†éĸ‘", + "unable_to_link_motion_video": "æ— æŗ•å…ŗč”åŠ¨æ€č§†éĸ‘", "unable_to_link_oauth_account": "æ— æŗ•å…ŗč” OAuth č´Ļæˆˇ", - "unable_to_log_out_all_devices": "æ— æŗ•äģŽæ‰€æœ‰čŽžå¤‡į™ģå‡ē", + "unable_to_log_out_all_devices": "æ— æŗ•äģŽæ‰€æœ‰å…ļäģ–čŽžå¤‡į™ģå‡ē", "unable_to_log_out_device": "æ— æŗ•äģŽčŽžå¤‡į™ģå‡ē", "unable_to_login_with_oauth": "æ— æŗ•äŊŋᔍ OAuth čŋ›čĄŒį™ģåŊ•", "unable_to_play_video": "æ— æŗ•æ’­æ”žč§†éĸ‘", "unable_to_reassign_assets_existing_person": "æ— æŗ•å°†éĄšį›Žé‡æ–°åˆ†é…įģ™{name, select, null {åˇ˛å­˜åœ¨įš„äēēį‰Š} other {{name}}}", - "unable_to_reassign_assets_new_person": "æ— æŗ•é‡æ–°åˆ†é…éĄšį›Žį왿–°įš„äēēį‰Š", + "unable_to_reassign_assets_new_person": "æ— æŗ•é‡æ–°åˆ†é…čĩ„æēį왿–°įš„äēēį‰Š", "unable_to_refresh_user": "æ— æŗ•åˆˇæ–°į”¨æˆˇ", "unable_to_remove_album_users": "æ— æŗ•äģŽį›¸å†Œä¸­į§ģé™¤į”¨æˆˇ", "unable_to_remove_api_key": "æ— æŗ•į§ģ除 API 密é’Ĩ", - "unable_to_remove_assets_from_shared_link": "æ— æŗ•äģŽå…ąäēĢ链æŽĨ中į§ģé™¤éĄšį›Ž", - "unable_to_remove_library": "æ— æŗ•į§ģ除čĩ„äē§åē“", + "unable_to_remove_assets_from_shared_link": "æ— æŗ•äģŽå…ąäēĢ链æŽĨ中į§ģ除čĩ„æē", + "unable_to_remove_library": "æ— æŗ•į§ģ除åē“", "unable_to_remove_partner": "æ— æŗ•į§ģ除协äŊœč€…", "unable_to_remove_reaction": "æ— æŗ•åˆ é™¤å›žå¤", "unable_to_reset_password": "æ— æŗ•é‡įŊŽå¯†į ", - "unable_to_reset_pin_code": "æ— æŗ•é‡įŊŽPIN᠁", - "unable_to_resolve_duplicate": "æ— æŗ•č§Ŗå†ŗé‡å¤éĄš", - "unable_to_restore_assets": "æ— æŗ•æĸå¤éĄšį›Ž", - "unable_to_restore_trash": "æ— æŗ•æĸ复回æ”ļįĢ™", + "unable_to_reset_pin_code": "æ— æŗ•é‡įŊŽ PIN ᠁", + "unable_to_resolve_duplicate": "æ— æŗ•å¤„į†é‡å¤éĄš", + "unable_to_restore_assets": "æ— æŗ•æĸ复čĩ„æē", + "unable_to_restore_trash": "æ— æŗ•čŋ˜åŽŸå›žæ”ļįĢ™", "unable_to_restore_user": "æ— æŗ•æĸå¤į”¨æˆˇ", "unable_to_save_album": "æ— æŗ•äŋå­˜į›¸å†Œ", "unable_to_save_api_key": "æ— æŗ•äŋå­˜ API 密é’Ĩ", "unable_to_save_date_of_birth": "æ— æŗ•äŋå­˜å‡ēį”Ÿæ—Ĩ期", - "unable_to_save_name": "æ— æŗ•äŋå­˜åį§°", - "unable_to_save_profile": "æ— æŗ•äŋå­˜é…įŊŽæ–‡äģļ", + "unable_to_save_name": "æ— æŗ•æ›´æ–°äēēį‰Šåį§°", + "unable_to_save_profile": "æ— æŗ•äŋå­˜į”¨æˆˇčĩ„æ–™", "unable_to_save_settings": "æ— æŗ•äŋå­˜čŽžįŊŽ", - "unable_to_scan_libraries": "æ— æŗ•æ‰Ģ描åē“", - "unable_to_scan_library": "æ— æŗ•æ‰Ģ描čĩ„äē§åē“", - "unable_to_set_feature_photo": "æ— æŗ•čŽžįŊŽäēēį‰Šå¤´åƒ", + "unable_to_scan_libraries": "æ— æŗ•æ‰Ģ描回åē“", + "unable_to_scan_library": "æ— æŗ•æ‰Ģ描č¯Ĩ回åē“", + "unable_to_set_feature_photo": "æ— æŗ•čŽžä¸ē封éĸ", "unable_to_set_profile_picture": "æ— æŗ•čŽžįŊŽä¸Ēäēēčĩ„æ–™å›žį‰‡", "unable_to_set_rating": "æ— æŗ•čŽžįŊŽæ˜Ÿįē§", "unable_to_submit_job": "æ— æŗ•æäē¤äģģåŠĄ", - "unable_to_trash_asset": "æ— æŗ•æ”žå…Ĩ回æ”ļįĢ™", - "unable_to_unlink_account": "æ— æŗ•å–æļˆč´Ļæˆˇé“žæŽĨ", - "unable_to_unlink_motion_video": "æ— æŗ•å–æļˆé“žæŽĨåŠ¨æ€č§†éĸ‘", + "unable_to_trash_asset": "æ— æŗ•į§ģč‡ŗå›žæ”ļįĢ™", + "unable_to_unlink_account": "æ— æŗ•č§Ŗé™¤č´Ļåˇå…ŗč”", + "unable_to_unlink_motion_video": "æ— æŗ•č§Ŗé™¤åŽžå†ĩ视éĸ‘兺联", "unable_to_update_album_cover": "æ— æŗ•æ›´æ–°į›¸å†Œå°éĸ", "unable_to_update_album_info": "æ— æŗ•æ›´æ–°į›¸å†ŒäŋĄæ¯", - "unable_to_update_library": "æ— æŗ•æ›´æ–°čĩ„äē§åē“", - "unable_to_update_location": "æ— æŗ•æ›´æ–°äŊįŊŽ", + "unable_to_update_library": "æ— æŗ•æ›´æ–°å›žåē“", + "unable_to_update_location": "æ— æŗ•æ›´æ–°äŊįŊŽäŋĄæ¯", "unable_to_update_settings": "æ— æŗ•æ›´æ–°čŽžįŊŽ", - "unable_to_update_timeline_display_status": "æ— æŗ•æ›´æ–°æ—ļ间čŊ´æ˜žį¤ēįŠļ态", - "unable_to_update_user": "æ— æŗ•æ›´æ–°į”¨æˆˇ", + "unable_to_update_timeline_display_status": "æ— æŗ•æ›´æ–°æ—ļ间įēŋ昞į¤ēįŠļ态", + "unable_to_update_user": "æ— æŗ•æ›´æ–°į”¨æˆˇäŋĄæ¯", "unable_to_update_workflow": "æ— æŗ•æ›´æ–°åˇĨäŊœæĩ", "unable_to_upload_file": "æ— æŗ•ä¸Šäŧ æ–‡äģļ" }, @@ -1168,6 +1174,7 @@ "exif_bottom_sheet_people": "äēēį‰Š", "exif_bottom_sheet_person_add_person": "æˇģ加姓名", "exit_slideshow": "退å‡ēåšģį¯į‰‡æ”žæ˜ ", + "expand": "åą•åŧ€", "expand_all": "å…¨éƒ¨åą•åŧ€", "experimental_settings_new_asset_list_subtitle": "æ­Ŗåœ¨å¤„į†", "experimental_settings_new_asset_list_title": "å¯į”¨åŽžéĒŒæ€§į…§į‰‡įŊ‘æ ŧ", @@ -1175,7 +1182,7 @@ "experimental_settings_title": "厞éĒŒæ€§åŠŸčƒŊ", "expire_after": "čŋ‡æœŸæ—ļ间", "expired": "厞čŋ‡æœŸ", - "expires_date": "čŋ‡æœŸäēŽ {date}", + "expires_date": "将äēŽ {date} čŋ‡æœŸ", "explore": "æŽĸį´ĸ", "explorer": "čĩ„æēįŽĄį†å™¨", "export": "å¯ŧå‡ē", @@ -1184,112 +1191,113 @@ "export_database_description": "å¯ŧå‡ē SQLite 数捎åē“", "extension": "æ‰Šåą•å", "external": "外部", - "external_libraries": "外部回åē“", + "external_libraries": "外部åē“", "external_network": "外部įŊ‘įģœ", - "external_network_sheet_info": "åŊ“æœĒčŋžæŽĨåˆ°æŒ‡åŽšįš„ Wi-Fi įŊ‘į윿—ļīŧŒåē”ᔍፋåēå°†é€ščŋ‡ä¸‹æ–šįŦŦ一ä¸Ē可čŋžé€šįš„ URL čŽŋé—ŽæœåŠĄå™¨", - "face_unassigned": "æœĒ指洞", + "external_network_sheet_info": "åŊ“不在éĻ–é€‰įš„ Wi-Fi įŊ‘įģœä¸­æ—ļīŧŒåē”ᔍ将äģŽä¸Šåˆ°ä¸‹äžæŦĄå°č¯•īŧŒé€ščŋ‡ä¸‹æ–šįŦŦ一ä¸ĒčƒŊ够成功čŽŋé—Žįš„ URL čŋžæŽĨåˆ°æœåŠĄå™¨", + "face_unassigned": "æœĒ分配", "failed": "å¤ąč´Ĩ", - "failed_count": "å¤ąč´Ĩ: {count}", + "failed_count": "å¤ąč´Ĩ: {count}æŦĄ", "failed_to_authenticate": "čēĢäģŊéĒŒč¯å¤ąč´Ĩ", - "failed_to_load_assets": "加čŊŊéĄšį›Žå¤ąč´Ĩ", - "failed_to_load_folder": "加čŊŊ文äģļå¤šå¤ąč´Ĩ", + "failed_to_load_assets": "čĩ„æēåŠ čŊŊå¤ąč´Ĩ", + "failed_to_load_folder": "文äģļ多加čŊŊå¤ąč´Ĩ", "favorite": "æ”ļ藏", - "favorite_action_prompt": "厞将 {count} 饚æˇģ加到æ”ļ藏", + "favorite_action_prompt": "厞æˇģ加 {count} ä¸Ē到æ”ļč—å¤š", "favorite_or_unfavorite_photo": "æ”ļč—æˆ–å–æļˆæ”ļč—į…§į‰‡", "favorites": "æ”ļč—å¤š", - "favorites_page_no_favorites": "æœĒ扞到æ”ļč—éĄšį›Ž", - "feature_photo_updated": "äēēį‰Šå¤´åƒåˇ˛æ›´æ–°", + "favorites_page_no_favorites": "æœĒ扞到æ”ļč—įš„čĩ„æē", + "feature_photo_updated": "更æĸäēēį‰Šå°éĸį…§į‰‡æˆåŠŸ", "features": "功čƒŊ", "features_in_development": "åŧ€å‘ä¸­įš„åŠŸčƒŊ", - "features_setting_description": "įŽĄį† App 功čƒŊ", + "features_setting_description": "įŽĄį†åē”į”¨åŠŸčƒŊ", "file_name_or_extension": "文äģļåæˆ–æ‰Šåą•å", "file_name_text": "文äģļ名", "file_name_with_value": "文äģļ名īŧš{file_name}", "file_size": "大小", "filename": "文äģļ名", "filetype": "文äģļįąģ型", - "filter": "æģ¤é•œ", - "filter_description": "į›Žæ ‡éĄšį›Žį­›é€‰æĄäģļ", + "filter": "᭛选", + "filter_description": "į­›é€‰į›Žæ ‡čĩ„æēįš„æĄäģļ", "filter_people": "᭛选äēēį‰Š", "filter_places": "į­›é€‰åœ°į‚š", + "filter_tags": "į­›é€‰æ ‡į­ž", "filters": "᭛选噍", "find_them_fast": "æŒ‰åį§°åŋĢ速搜į´ĸ", "first": "įŦŦ一ä¸Ē", - "fix_incorrect_match": "äŋŽå¤ä¸æ­ŖįĄŽįš„匚配", + "fix_incorrect_match": "äŋŽå¤é”™č¯¯įš„匚配", "folder": "文äģļ多", "folder_not_found": "æœĒ扞到文äģļ多", "folders": "文äģļ多", - "folders_feature_description": "在文äģļå¤šč§†å›žä¸­æĩč§ˆæ–‡äģļįŗģįģŸä¸Šįš„į…§į‰‡å’Œč§†éĸ‘", + "folders_feature_description": "在文äģļįŗģįģŸä¸­īŧŒé€ščŋ‡æ–‡äģļå¤šč§†å›žæĩč§ˆį…§į‰‡å’Œč§†éĸ‘", "forgot_pin_code_question": "åŋ˜čŽ°æ‚¨įš„PIN᠁äē†īŧŸ", - "forward": "向前", + "forward": "前čŋ›", "free_up_space": "释攞įŠē间", - "free_up_space_description": "将厞备äģŊįš„į…§į‰‡å’Œč§†éĸ‘į§ģč‡ŗčŽžå¤‡å›žæ”ļįĢ™äģĨ释攞įŠēé—´ã€‚æœåŠĄå™¨ä¸Šįš„å‰¯æœŦ将äŋæŒåŽ‰å…¨ã€‚", + "free_up_space_description": "将厞备äģŊįš„į…§į‰‡å’Œč§†éĸ‘į§ģå…ĨčŽžå¤‡įš„å›žæ”ļįĢ™īŧŒäģĨ释攞įŠēé—´ã€‚æ‚¨åœ¨æœåŠĄå™¨ä¸Šįš„å‰¯æœŦäģį„ļ厉全。", "free_up_space_settings_subtitle": "é‡Šæ”žčŽžå¤‡å­˜å‚¨įŠē间", "full_path": "åŽŒæ•´čˇ¯åž„īŧš{path}", - "gcast_enabled": "Google Cast æŠ•åą", - "gcast_enabled_description": "č¯Ĩ功čƒŊ需čρ加čŊŊæĨč‡Ē Google įš„å¤–éƒ¨čĩ„æēã€‚", - "general": "é€šį”¨", - "geolocation_instruction_location": "į‚šå‡ģå¸Ļ有GPSåæ ‡įš„čĩ„äē§äģĨäŊŋᔍå…ļäŊįŊŽīŧŒæˆ–į›´æŽĨäģŽåœ°å›žä¸Šé€‰æ‹ŠäŊįŊŽ", + "gcast_enabled": "æŠ•åą", + "gcast_enabled_description": "此功čƒŊ需čρäģŽ Google 加čŊŊ外部čĩ„æēæ‰čƒŊčŋčĄŒã€‚", + "general": "叏规", + "geolocation_instruction_location": "į‚šå‡ģå¸Ļ有 GPS åæ ‡įš„åĒ’äŊ“æ–‡äģļäģĨäŊŋᔍå…ļäŊįŊŽīŧŒæˆ–į›´æŽĨ在地回上选拊äŊįŊŽ", "get_help": "čŽˇå–å¸ŽåŠŠ", - "get_people_error": "čŽˇå–äēēį‰Šé”™č¯¯", - "get_wifiname_error": "æ— æŗ•čŽˇå– Wi-Fi åį§°ã€‚įĄŽäŋåˇ˛æŽˆäēˆåŋ…čĻįš„æƒé™īŧŒåšļ厞čŋžæŽĨ到 Wi-Fi įŊ‘įģœ", + "get_people_error": "čŽˇå–äēēį‰Šåˆ—čĄ¨é”™č¯¯", + "get_wifiname_error": "æ— æŗ•čŽˇå– Wi-Fi åį§°ã€‚č¯ˇįĄŽäŋæ‚¨åˇ˛æŽˆäēˆåŋ…čĻįš„æƒé™īŧŒåšļ䏔厞čŋžæŽĨ到 Wi-Fi įŊ‘įģœ", "getting_started": "å…Ĩ门", "go_back": "čŋ”回", - "go_to_folder": "čŋ›å…Ĩ文äģļ多", - "go_to_search": "搜į´ĸ", + "go_to_folder": "前垀文äģļ多", + "go_to_search": "前垀搜į´ĸ", "gps": "有GPSäŋĄæ¯", "gps_missing": "无GPSäŋĄæ¯", - "grant_permission": "čŽˇå–æƒé™", + "grant_permission": "授权权限", "group_albums_by": "į›¸å†Œåˆ†įģ„䞝捎...", "group_country": "按å›ŊåŽļ分įģ„", - "group_no": "æœĒ分įģ„", + "group_no": "不分įģ„", "group_owner": "æŒ‰æ‰€æœ‰č€…åˆ†įģ„", "group_places_by": "åœ°į‚šåˆ†įģ„䞝捎...", "group_year": "按嚴分įģ„", "haptic_feedback_switch": "å¯į”¨æŒ¯åŠ¨åéψ", "haptic_feedback_title": "振动反éψ", "has_quota": "配éĸå¤§å°", - "hash_asset": "å“ˆå¸ŒéĄšį›Ž", - "hashed_assets": "åˇ˛å“ˆå¸Œįš„éĄšį›Ž", + "hash_asset": "čŽĄįŽ—æ–‡äģļ哈希å€ŧ", + "hashed_assets": "åˇ˛å“ˆå¸Œæ–‡äģļ", "hashing": "æ­Ŗåœ¨čŋ›čĄŒå“ˆå¸ŒæŖ€énj", - "header_settings_add_header_tip": "æˇģ加标头", - "header_settings_field_validator_msg": "莞įŊŽä¸å¯ä¸ēįŠē", - "header_settings_header_name_input": "æ ‡å¤´åį§°", - "header_settings_header_value_input": "标头å€ŧ", - "headers_settings_tile_title": "č‡Ē厚䚉äģŖį†æ ‡å¤´", + "header_settings_add_header_tip": "æˇģåŠ č¯ˇæą‚å¤´", + "header_settings_field_validator_msg": "å€ŧ不可ä¸ēįŠē", + "header_settings_header_name_input": "č¯ˇæą‚å¤´åį§°", + "header_settings_header_value_input": "č¯ˇæą‚å¤´å€ŧ", + "headers_settings_tile_title": "č‡Ē厚䚉äģŖį†č¯ˇæą‚头", "height": "é̘åēĻ", "hi_user": "您åĨŊīŧŒ{name}īŧˆ{email}īŧ‰", "hide_all_people": "éšč—æ‰€æœ‰äēēį‰Š", "hide_gallery": "éšč—į›¸å†Œ", - "hide_named_person": "隐藏äēēį‰Šâ€œ{name}”", + "hide_named_person": "隐藏äēēį‰Šīŧš{name}", "hide_password": "éšč—å¯†į ", "hide_person": "隐藏äēēį‰Š", - "hide_schema": "隐藏æžļ构", - "hide_text_recognition": "éšč—æ–‡æœŦ蝆åˆĢ", + "hide_schema": "éšč—æ¨Ąåŧ", + "hide_text_recognition": "éšč—æ–‡æœŦ蝆åˆĢį쓿žœ", "hide_unnamed_people": "隐藏æœĒå‘Ŋåįš„äēēį‰Š", - "home_page_add_to_album_conflicts": "åˇ˛å‘į›¸å†Œ {album} 中æˇģ加 {added} éĄšã€‚å…ļ中 {failed} éĄšåœ¨į›¸å†Œä¸­åˇ˛å­˜åœ¨ã€‚", - "home_page_add_to_album_err_local": "æš‚æ— æŗ•å°†æœŦåœ°éĄšį›ŽæˇģåŠ åˆ°į›¸å†Œä¸­īŧŒčˇŗčŋ‡", - "home_page_add_to_album_success": "åˇ˛å‘į›¸å†Œ {album} 中æˇģ加 {added} éĄšã€‚", - "home_page_album_err_partner": "æš‚æ— æŗ•å°†åäŊœč€…įš„éĄšį›ŽæˇģåŠ åˆ°į›¸å†ŒīŧŒčˇŗčŋ‡", - "home_page_archive_err_local": "æš‚æ— æŗ•åŊ’æĄŖæœŦåœ°éĄšį›ŽīŧŒčˇŗčŋ‡", - "home_page_archive_err_partner": "æ— æŗ•å­˜æĄŖåäŊœč€…įš„éĄšį›ŽīŧŒčˇŗčŋ‡", - "home_page_building_timeline": "æ­Ŗåœ¨į”Ÿæˆæ—ļ间įēŋ", - "home_page_delete_err_partner": "æ— æŗ•åˆ é™¤åäŊœč€…įš„éĄšį›ŽīŧŒčˇŗčŋ‡", - "home_page_delete_remote_err_local": "čŋœį¨‹éĄšį›Žåˆ é™¤æ¨ĄåŧīŧŒčˇŗčŋ‡æœŦåœ°éĄšį›Ž", - "home_page_favorite_err_local": "æš‚æ— æŗ•æ”ļ藏æœŦåœ°éĄšį›ŽīŧŒčˇŗčŋ‡", - "home_page_favorite_err_partner": "æš‚æ— æŗ•æ”ļč—åäŊœč€…įš„éĄšį›ŽīŧŒčˇŗčŋ‡", - "home_page_first_time_notice": "åĻ‚æžœčŋ™æ˜¯æ‚¨įŦŦ一æŦĄäŊŋᔍč¯Ĩåē”ᔍፋåēīŧŒč¯ˇįĄŽäŋé€‰æ‹Šä¸€ä¸Ēčρ备äģŊįš„æœŦåœ°į›¸å†ŒīŧŒäģĨäžŋ可äģĨ在æ—ļ间įēŋ中éĸ„č§ˆč¯Ĩį›¸å†Œä¸­įš„į…§į‰‡å’Œč§†éĸ‘", - "home_page_locked_error_local": "æ— æŗ•å°†æœŦåœ°éĄšį›Žį§ģ动到锁厚文äģļ多īŧŒčˇŗčŋ‡", - "home_page_locked_error_partner": "æ— æŗ•å°†åäŊœč€…įš„éĄšį›Žį§ģ动到锁厚文äģļ多īŧŒčˇŗčŋ‡", - "home_page_share_err_local": "æš‚æ— æŗ•é€ščŋ‡é“žæŽĨå…ąäēĢæœŦåœ°éĄšį›ŽīŧŒčˇŗčŋ‡", - "home_page_upload_err_limit": "一æŦĄæœ€å¤šåĒčƒŊ上äŧ  30 ä¸ĒéĄšį›ŽīŧŒčˇŗčŋ‡", + "home_page_add_to_album_conflicts": "厞将 {added} ä¸Ē文äģᅫģåŠ åˆ°į›¸å†Œ \"{album}\" 中。å…ļ中有 {failed} ä¸Ē文äģᅵŦæĨå°ąåœ¨į›¸å†Œé‡Œäē†ã€‚", + "home_page_add_to_album_err_local": "暂æ—ļæ— æŗ•å°†æœŦ地文äģᅫģåŠ åˆ°į›¸å†ŒīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_add_to_album_success": "åˇ˛æˆåŠŸå°† {added} ä¸Ē文äģᅫģåŠ åˆ°į›¸å†Œ \"{album}\" 中。", + "home_page_album_err_partner": "暂æ—ļæ— æŗ•å°†\"寚斚\"įš„čĩ„äē§æˇģåŠ åˆ°į›¸å†Œä¸­īŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_archive_err_local": "暂æ—ļæ— æŗ•åŊ’æĄŖæœŦ地文äģļīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_archive_err_partner": "æ— æŗ•åŊ’æĄŖåäŊœč€…įš„æ–‡äģļīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_building_timeline": "æ­Ŗåœ¨æž„åģēæ—ļ间įēŋ", + "home_page_delete_err_partner": "æ— æŗ•åˆ é™¤åäŊœč€…įš„æ–‡äģļīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_delete_remote_err_local": "æŖ€æĩ‹åˆ°åž…åˆ é™¤åˆ—čĄ¨ä¸­åŒ…åĢä熿œŦ地文äģļīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_favorite_err_local": "暂不支持æ”ļ藏æœŦ地文äģļīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_favorite_err_partner": "暂不支持æ”ļč—åäŊœč€…įš„æ–‡äģļīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_first_time_notice": "åĻ‚æžœæ‚¨æ˜¯éĻ–æŦĄäŊŋᔍæœŦåē”ᔍīŧŒč¯ˇåŠĄåŋ…选拊一ä¸Ē备äģŊį›¸å†ŒīŧŒäģĨäžŋæ—ļ间įēŋčƒŊäģŽä¸­čŽˇå–åšļåą•į¤ēį…§į‰‡å’Œč§†éĸ‘", + "home_page_locked_error_local": "æ— æŗ•å°†æœŦ地文äģļį§ģå…Ĩé”åŽšįš„æ–‡äģļ多īŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_locked_error_partner": "æ— æŗ•å°†åäŊœč€…įš„æ–‡äģļį§ģå…Ĩé”åŽšįš„æ–‡äģļ多īŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_share_err_local": "æ— æŗ•é€ščŋ‡é“žæŽĨ分äēĢæœŦ地文äģļīŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "home_page_upload_err_limit": "每æŦĄæœ€å¤šåĒčƒŊ上äŧ  30 ä¸Ē文äģļīŧŒčļ…å‡ēéƒ¨åˆ†åˇ˛čˇŗčŋ‡", "host": "æœåŠĄå™¨", "hour": "æ—ļ", "hours": "小æ—ļ", "id": "ID", "idle": "įŠē闲", "ignore_icloud_photos": "åŋŊį•Ĩ iCloud ᅧቇ", - "ignore_icloud_photos_description": "存储在 iCloud ä¸­įš„į…§į‰‡ä¸äŧšä¸Šäŧ č‡ŗ Immich æœåŠĄå™¨", + "ignore_icloud_photos_description": "邪äē›äģ…存储在 iCloud 中īŧˆæœĒ下čŊŊ到æœŦ地īŧ‰įš„ᅧቇīŧŒå°†ä¸äŧščĸĢ上äŧ åˆ° Immich æœåŠĄå™¨", "image": "å›žį‰‡", "image_alt_text_date": "在{date}æ‹æ‘„įš„{isVideo, select, true {视éĸ‘} other {ᅧቇ}}", "image_alt_text_date_1_person": "{date}æ‹æ‘„įš„åŒ…åĢ{person1}įš„{isVideo, select, true {视éĸ‘} other {ᅧቇ}}", @@ -1302,22 +1310,22 @@ "image_alt_text_date_place_3_people": "{date}在{country}{city}æ‹æ‘„įš„åŒ…åĢ{person1}、{person2}和{person3}įš„{isVideo, select, true {视éĸ‘} other {ᅧቇ}}", "image_alt_text_date_place_4_or_more_people": "{date}在{country}{city}æ‹æ‘„įš„åŒ…åĢ{person1}、{person2}及å…ļäģ–{additionalCount, number}ä¸Ēäēēį‰Šįš„{isVideo, select, true {视éĸ‘} other {ᅧቇ}}", "image_saved_successfully": "å›žį‰‡åˇ˛äŋå­˜", - "image_viewer_page_state_provider_download_started": "下čŊŊ启动", + "image_viewer_page_state_provider_download_started": "åŧ€å§‹ä¸‹čŊŊ", "image_viewer_page_state_provider_download_success": "下čŊŊ成功", - "image_viewer_page_state_provider_share_error": "å…ąäēĢå‡ē错", + "image_viewer_page_state_provider_share_error": "分äēĢå‡ē错", "immich_logo": "Immich 标åŋ—", - "immich_web_interface": "Immich Web į•Œéĸ", + "immich_web_interface": "Immich įŊ‘éĄĩį•Œéĸ", "import_from_json": "äģŽ JSON å¯ŧå…Ĩ", "import_path": "å¯ŧå…Ĩčˇ¯åž„", "in_albums": "在{count, plural, one {# ä¸Ēį›¸å†Œ} other {# ä¸Ēį›¸å†Œ}}中", - "in_archive": "在åŊ’æĄŖä¸­", + "in_archive": "厞åŊ’æĄŖ", "in_year": "{year}åš´", "in_year_selector": "在", "include_archived": "包æ‹Ŧ厞åŊ’æĄŖ", "include_shared_albums": "包æ‹Ŧå…ąäēĢį›¸å†Œ", - "include_shared_partner_assets": "包æ‹Ŧ协äŊœč€…å…ąäēĢéĄšį›Ž", - "individual_share": "ä¸Ēäēē分äēĢ", - "individual_shares": "ä¸Ēäēē分äēĢ", + "include_shared_partner_assets": "包æ‹Ŧ协äŊœč€…å…ąäēĢčĩ„æē", + "individual_share": "单į‹Ŧ分äēĢ", + "individual_shares": "单į‹Ŧ分äēĢ", "info": "äŋĄæ¯", "interval": { "day_at_onepm": "每夊下午 1 į‚š", @@ -1330,12 +1338,12 @@ "invite_people": "邀蝎äēē员", "invite_to_album": "é‚€č¯ˇåŠ å…Ĩį›¸å†Œ", "ios_debug_info_fetch_ran_at": "čŋčĄŒæ‹‰å– {dateTime}", - "ios_debug_info_last_sync_at": "上æŦĄåŒæ­Ĩ {dateTime}", - "ios_debug_info_no_processes_queued": "æ˛Ąæœ‰åŽå°čŋ›į¨‹åœ¨é˜Ÿåˆ—中", - "ios_debug_info_no_sync_yet": "尚æœĒ后台同æ­ĨäģģåŠĄåœ¨čŋčĄŒ", - "ios_debug_info_processes_queued": "{count, plural, one {{count} ä¸Ē后台čŋ›į¨‹åœ¨é˜Ÿåˆ—中} other {{count} ä¸Ē后台čŋ›į¨‹åœ¨é˜Ÿåˆ—中}}", - "ios_debug_info_processing_ran_at": "čŋčĄŒå¤„ᐆ {dateTime}", - "items_count": "{count, plural, one {#ä¸ĒéĄšį›Ž} other {#ä¸ĒéĄšį›Ž}}", + "ios_debug_info_last_sync_at": "上æŦĄåŒæ­ĨäēŽ {dateTime}", + "ios_debug_info_no_processes_queued": "æ— åž…å¤„į†įš„åŽå°čŋ›į¨‹", + "ios_debug_info_no_sync_yet": "尚æœĒæ‰§čĄŒåŽå°åŒæ­ĨäģģåŠĄ", + "ios_debug_info_processes_queued": "{count, plural, one {{count} ä¸Ē后台äģģåŠĄåœ¨æŽ’é˜Ÿ} other {{count} ä¸Ē后台äģģåŠĄåœ¨æŽ’é˜Ÿ}}", + "ios_debug_info_processing_ran_at": "处ᐆäēŽ {dateTime}", + "items_count": "{count, plural, one {#ä¸Ē} other {#ä¸Ē}}", "jobs": "äģģåŠĄ", "json_editor": "JSONįŧ–čž‘å™¨", "json_error": "JSON错蝝", @@ -1344,18 +1352,18 @@ "keep_albums_count": "äŋį•™ {count} {count, plural, one {ä¸Ēį›¸å†Œ} other {ä¸Ēį›¸å†Œ}}", "keep_all": "全部äŋį•™", "keep_description": "选拊释攞įŠē间æ—ļäŋį•™åœ¨čŽžå¤‡ä¸Šįš„å†…åŽšã€‚", - "keep_favorites": "äŋį•™æ”ļč—å¤š", + "keep_favorites": "äŋį•™æ”ļ藏", "keep_on_device": "äŋį•™åœ¨čŽžå¤‡ä¸Š", "keep_on_device_hint": "选拊čρäŋį•™åœ¨æœŦčŽžå¤‡ä¸Šįš„éĄšį›Ž", "keep_this_delete_others": "äŋį•™æ­¤éĄšīŧŒå…ļäŊ™åˆ é™¤", "keeping": "äŋį•™: {items}", - "kept_this_deleted_others": "äŋį•™č¯ĨéĄšį›Žåšļ删除 {count, plural, one {# ä¸ĒéĄšį›Ž} other {# ä¸ĒéĄšį›Ž}}", + "kept_this_deleted_others": "äŋį•™č¯Ĩčĩ„æēåšļ删除 {count, plural, one {# ä¸Ēčĩ„æē} other {# ä¸Ēčĩ„æē}}", "keyboard_shortcuts": "é”Žį›˜åŋĢæˇé”Ž", "language": "蝭荀", "language_no_results_subtitle": "å°č¯•č°ƒæ•´æ‚¨įš„æœį´ĸč¯", "language_no_results_title": "æœĒ扞到寚åē”蝭荀", "language_search_hint": "搜į´ĸ蝭荀...", - "language_setting_description": "é€‰æ‹Šæ‚¨įš„č¯­č¨€ååĨŊ", + "language_setting_description": "é€‰æ‹Šæ‚¨įš„éϖ选蝭荀", "large_files": "大文äģļ", "last": "最后一ä¸Ē", "last_months": "{count, plural, one {上ä¸Ē月} other {最čŋ‘ # ä¸Ē月}}", @@ -1365,39 +1373,39 @@ "leave": "įĻģåŧ€", "leave_album": "įĻģåŧ€į›¸å†Œ", "lens_model": "é•œå¤´åž‹åˇ", - "let_others_respond": "å…čŽ¸äģ–äēē回åē”", + "let_others_respond": "å…čŽ¸äģ–äēē回复", "level": "į­‰įē§", - "library": "čĩ„äē§åē“", + "library": "čĩ„æ–™åē“", "library_add_folder": "æˇģ加文äģļ多", "library_edit_folder": "įŧ–čž‘æ–‡äģļ多", - "library_options": "čĩ„äē§åē“选饚", + "library_options": "čĩ„æ–™åē“选饚", "library_page_device_albums": "čŽžå¤‡ä¸Šįš„į›¸å†Œ", "library_page_new_album": "新åģēį›¸å†Œ", - "library_page_sort_asset_count": "éĄšį›Žæ•°é‡", + "library_page_sort_asset_count": "čĩ„æēæ•°é‡", "library_page_sort_created": "创åģēæ—Ĩ期", "library_page_sort_last_modified": "上æŦĄäŋŽæ”š", "library_page_sort_title": "į›¸å†Œæ ‡éĸ˜", "licenses": "čŽ¸å¯č¯", "light": "æĩ…色", - "like": "喜æŦĸ", - "like_deleted": "åˇ˛åˆ é™¤įš„æ”ļ藏", + "like": "į‚ščĩž", + "like_deleted": "取æļˆį‚ščĩž", "link_motion_video": "链æŽĨåŠ¨æ€č§†éĸ‘", "link_to_oauth": "įģ‘åޚ OAuth", - "linked_oauth_account": "厞įģ‘åޚ OAuth č´Ļæˆˇ", + "linked_oauth_account": "厞įģ‘åŽšįš„ OAuth č´Ļæˆˇ", "list": "åˆ—čĄ¨", "loading": "加čŊŊ中", "loading_search_results_failed": "加čŊŊ搜į´ĸį쓿žœå¤ąč´Ĩ", "local": "æœŦ地", - "local_asset_cast_failed": "æ— æŗ•æŠ•åąæœĒ上äŧ č‡ŗæœåŠĄå™¨įš„éĄšį›Ž", - "local_assets": "æœŦåœ°éĄšį›Ž", + "local_asset_cast_failed": "æ— æŗ•å¤„į†å°šæœĒ上äŧ č‡ŗæœåŠĄå™¨įš„čĩ„äē§", + "local_assets": "æœŦ地čĩ„æē", "local_id": "æœŦ地 ID", "local_media_summary": "æœŦ地åĒ’äŊ“摘čρ", "local_network": "æœŦ地įŊ‘įģœ", - "local_network_sheet_info": "åŊ“äŊŋį”¨æŒ‡åŽšįš„ Wi-Fi įŊ‘į윿—ļīŧŒåē”ᔍፋåēå°†é€ščŋ‡æ­¤ URL čŽŋé—ŽæœåŠĄå™¨", + "local_network_sheet_info": "äŊŋį”¨æŒ‡åŽšįš„ Wi-Fi įŊ‘į윿—ļīŧŒåē”į”¨å°†é€ščŋ‡æ­¤ URL čŋžæŽĨåˆ°æœåŠĄå™¨", "location": "äŊįŊŽ", "location_permission": "厚äŊæƒé™", - "location_permission_content": "äŊŋᔍč‡Ē动切æĸ功čƒŊīŧŒImmich 需čĻį˛žįĄŽåŽšäŊæƒé™īŧŒäģĨčŽˇå–åŊ“前 Wi-Fi įŊ‘įģœåį§°", - "location_picker_choose_on_map": "在地回上厚äŊ", + "location_permission_content": "ä¸ēäē†äŊŋᔍč‡Ē动切æĸ功čƒŊīŧŒImmich 需čĻčŽˇå–į˛žįĄŽäŊįŊŽæƒé™īŧŒäģĨäžŋč¯ģ取åŊ“前 Wi-Fi įŊ‘įģœįš„åį§°", + "location_picker_choose_on_map": "äģŽåœ°å›žé€‰å–", "location_picker_latitude_error": "č¯ˇčž“å…Ĩæœ‰æ•ˆįš„įēŦåēĻ", "location_picker_latitude_hint": "č¯ˇåœ¨æ­¤å¤„čž“å…ĨįēŦåēĻ", "location_picker_longitude_error": "č¯ˇčž“å…Ĩæœ‰æ•ˆįš„įģåēĻ", @@ -1407,87 +1415,87 @@ "log_detail_title": "æ—Ĩåŋ—č¯Ļįģ†äŋĄæ¯", "log_out": "æŗ¨é”€", "log_out_all_devices": "æŗ¨é”€æ‰€æœ‰čŽžå¤‡", - "logged_in_as": "äģĨ {user} čēĢäģŊį™ģåŊ•", - "logged_out_all_devices": "äģŽæ‰€æœ‰čŽžå¤‡æŗ¨é”€", - "logged_out_device": "äģŽčŽžå¤‡æŗ¨é”€", + "logged_in_as": "åŊ“前į™ģåŊ•į”¨æˆˇīŧš{user}", + "logged_out_all_devices": "厞退å‡ēæ‰€æœ‰čŽžå¤‡įš„į™ģåŊ•", + "logged_out_device": "厞退å‡ēčŽžå¤‡į™ģåŊ•", "login": "į™ģåŊ•", - "login_disabled": "į™ģåŊ•厞čĸĢįρᔍ", - "login_form_api_exception": "API åŧ‚常īŧŒč¯ˇæŖ€æŸĨæœåŠĄå™¨åœ°å€åšļé‡č¯•ã€‚", - "login_form_back_button_text": "后退", + "login_disabled": "į™ģåŊ•功čƒŊ厞įρᔍ", + "login_form_api_exception": "API åŧ‚å¸¸ã€‚č¯ˇæŖ€æŸĨæœåŠĄå™¨ URL åšļé‡č¯•ã€‚", + "login_form_back_button_text": "čŋ”回", "login_form_email_hint": "youremail@email.com", "login_form_endpoint_hint": "http://æ‚¨įš„æœåŠĄå™¨åœ°å€:įĢ¯åŖ", - "login_form_endpoint_url": "æœåŠĄå™¨é“žæŽĨ地址", - "login_form_err_http": "č¯ˇæŗ¨æ˜Ž http:// 或 https://", + "login_form_endpoint_url": "æœåŠĄå™¨įĢ¯į‚šURL", + "login_form_err_http": "č¯ˇæ˜ŽįĄŽæŒ‡åŽš http:// 或 https://", "login_form_err_invalid_email": "æ— æ•ˆįš„į”ĩå­é‚ŽįŽą", - "login_form_err_invalid_url": "æ— æ•ˆįš„åœ°å€", - "login_form_err_leading_whitespace": "å¸Ļ有前å¯ŧįŠēæ ŧ", - "login_form_err_trailing_whitespace": "å¸Ļ有尞随įŠēæ ŧ", - "login_form_failed_get_oauth_server_config": "äŊŋᔍ OAuth į™ģåŊ•æ—ļ错蝝īŧŒč¯ˇæŖ€æŸĨæœåŠĄå™¨åœ°å€", - "login_form_failed_get_oauth_server_disable": "OAuth 功čƒŊåœ¨æ­¤æœåŠĄå™¨ä¸Šä¸å¯į”¨", + "login_form_err_invalid_url": "æ— æ•ˆįš„URL", + "login_form_err_leading_whitespace": "ä¸å…čŽ¸å‰å¯ŧįŠēæ ŧ", + "login_form_err_trailing_whitespace": "ä¸å…čŽ¸å°žéšįŠēæ ŧ", + "login_form_failed_get_oauth_server_config": "äŊŋᔍ OAuth į™ģåŊ•å‡ē错īŧŒč¯ˇæŖ€æŸĨæœåŠĄå™¨åœ°å€", + "login_form_failed_get_oauth_server_disable": "æ­¤æœåŠĄå™¨ä¸æ”¯æŒ OAuth 功čƒŊ", "login_form_failed_login": "į™ģåŊ•å¤ąč´ĨīŧŒč¯ˇæŖ€æŸĨæœåŠĄå™¨åœ°å€ã€é‚ŽįŽąå’Œå¯†į ", - "login_form_handshake_exception": "ä¸ŽæœåŠĄå™¨é€šäŋĄæ—ļå‡ēįŽ°æĄæ‰‹åŧ‚常。åĻ‚æžœæ‚¨äŊŋį”¨įš„æ˜¯č‡Ēį­žåč¯äšĻīŧŒč¯ˇåœ¨čŽžįŊŽä¸­å¯į”¨č‡Ēį­žåč¯äšĻ支持。", + "login_form_handshake_exception": "ä¸ŽæœåŠĄå™¨įš„æĄæ‰‹åŧ‚常。åĻ‚æžœæ‚¨äŊŋį”¨įš„æ˜¯č‡Ēį­žåč¯äšĻīŧŒč¯ˇåœ¨čŽžįŊŽä¸­åŧ€å¯å¯šč‡Ēį­žåč¯äšĻįš„æ”¯æŒã€‚", "login_form_password_hint": "坆᠁", - "login_form_save_login": "äŋæŒį™ģåŊ•", - "login_form_server_empty": "输å…ĨæœåŠĄå™¨åœ°å€ã€‚", + "login_form_save_login": "äŋæŒį™ģåŊ•įŠļ态", + "login_form_server_empty": "č¯ˇčž“å…ĨæœåŠĄå™¨ URL。", "login_form_server_error": "æ— æŗ•čŋžæŽĨåˆ°æœåŠĄå™¨ã€‚", - "login_has_been_disabled": "į™ģåŊ•厞įĻį”¨ã€‚", + "login_has_been_disabled": "į™ģåŊ•功čƒŊ厞įĻį”¨ã€‚", "login_password_changed_error": "æ›´æ–°å¯†į æ—ļå‡ē错", "login_password_changed_success": "å¯†į æ›´æ–°æˆåŠŸ", - "logout_all_device_confirmation": "įĄŽåŽščρäģŽæ‰€æœ‰čŽžå¤‡æŗ¨é”€īŧŸ", - "logout_this_device_confirmation": "įĄŽåŽščρäģŽæœŦčŽžå¤‡æŗ¨é”€īŧŸ", + "logout_all_device_confirmation": "įĄŽåŽščρ退å‡ēæ‰€æœ‰čŽžå¤‡įš„į™ģåŊ•吗īŧŸ", + "logout_this_device_confirmation": "įĄŽåŽščρ退å‡ēæ­¤čŽžå¤‡įš„į™ģåŊ•吗īŧŸ", "logs": "æ—Ĩåŋ—", "longitude": "įģåēĻ", - "look": "æ ˇåŧ", - "loop_videos": "åžĒįŽ¯č§†éĸ‘", - "loop_videos_description": "å¯į”¨åœ¨č¯Ļįģ†äŋĄæ¯ä¸­č‡Ē动åžĒįŽ¯æ’­æ”žč§†éĸ‘。", - "main_branch_warning": "您åŊ“前äŊŋį”¨įš„æ˜¯åŧ€å‘į‰ˆīŧ›æˆ‘äģŦåŧē჈åģēčŽŽæ‚¨äŊŋį”¨æ­Ŗåŧå‘čĄŒį‰ˆīŧˆreleaseį‰ˆīŧ‰īŧ", + "look": "外观", + "loop_videos": "åžĒįŽ¯æ’­æ”žč§†éĸ‘", + "loop_videos_description": "å¯į”¨åœ¨č¯Ļ情æŸĨįœ‹å™¨ä¸­č‡Ē动åžĒįŽ¯æ’­æ”žč§†éĸ‘。", + "main_branch_warning": "æ‚¨æ­Ŗåœ¨äŊŋᔍåŧ€å‘į‰ˆæœŦīŧ›æˆ‘äģŦåŧē჈åģēčŽŽæ‚¨äŊŋį”¨æ­Ŗåŧå‘å¸ƒį‰ˆæœŦīŧ", "main_menu": "ä¸ģčœå•", "maintenance_action_restore": "æ­Ŗåœ¨æĸ复数捎åē“", "maintenance_description": "Immich厞čŋ›å…Ĩįģ´æŠ¤æ¨Ąåŧã€‚", "maintenance_end": "退å‡ēįģ´æŠ¤æ¨Ąåŧ", "maintenance_end_error": "退å‡ēįģ´æŠ¤æ¨Ąåŧå¤ąč´Ĩ。", - "maintenance_logged_in_as": "åŊ“前äģĨ{user}čēĢäģŊį™ģåŊ•", - "maintenance_restore_from_backup": "äģŽå¤‡äģŊ中æĸ复", - "maintenance_restore_library": "æĸå¤æ‚¨įš„čĩ„äē§åē“", - "maintenance_restore_library_confirm": "åĻ‚æžœäģĨ上äŋĄæ¯æ— č¯¯īŧŒč¯ˇįģ§įģ­čŋ›čĄŒå¤‡äģŊæĸ复īŧ", + "maintenance_logged_in_as": "åŊ“前į™ģåŊ•į”¨æˆˇīŧš{user}", + "maintenance_restore_from_backup": "äģŽå¤‡äģŊæĸ复", + "maintenance_restore_library": "æĸå¤æ‚¨įš„å›žåē“", + "maintenance_restore_library_confirm": "åĻ‚æžœįĄŽčŽ¤æ— č¯¯īŧŒč¯ˇįģ§įģ­čŋ›čĄŒå¤‡äģŊæĸ复īŧ", "maintenance_restore_library_description": "æ­Ŗåœ¨æĸ复数捎åē“", "maintenance_restore_library_folder_has_files": "{folder} 包åĢ {count} ä¸Ē文äģļ多", "maintenance_restore_library_folder_no_files": "{folder} įŧē少文äģļīŧ", - "maintenance_restore_library_folder_pass": "可č¯ģ且可写", + "maintenance_restore_library_folder_pass": "可č¯ģ可写", "maintenance_restore_library_folder_read_fail": "不可č¯ģ", "maintenance_restore_library_folder_write_fail": "不可写", - "maintenance_restore_library_hint_missing_files": "您可čƒŊä¸ĸå¤ąäē†é‡čĻæ–‡äģļ", - "maintenance_restore_library_hint_regenerate_later": "您可äģĨåœ¨čŽžįŊŽä¸­į¨åŽé‡æ–°į”Ÿæˆčŋ™äē›å†…厚", - "maintenance_restore_library_hint_storage_template_missing_files": "æ­Ŗåœ¨äŊŋį”¨å­˜å‚¨æ¨ĄæŋīŧŸæ‚¨å¯čƒŊä¸ĸå¤ąä熿–‡äģļ", + "maintenance_restore_library_hint_missing_files": "您可čƒŊįŧē少重čĻæ–‡äģļ", + "maintenance_restore_library_hint_regenerate_later": "您䚋后可äģĨåœ¨â€œčŽžįŊŽâ€ä¸­é‡æ–°į”Ÿæˆčŋ™ä盿–‡äģļ", + "maintenance_restore_library_hint_storage_template_missing_files": "äŊŋᔍäē†å­˜å‚¨æ¨ĄæŋīŧŸæ‚¨å¯čƒŊä¸ĸå¤ąä熿–‡äģļ", "maintenance_restore_library_loading": "æ­Ŗåœ¨åŠ čŊŊåŽŒæ•´æ€§æŖ€æŸĨ与启发åŧåˆ†æžâ€Ļ", "maintenance_task_backup": "æ­Ŗåœ¨åˆ›åģēįŽ°æœ‰æ•°æŽåē“įš„å¤‡äģŊâ€Ļ", "maintenance_task_migrations": "æ­Ŗåœ¨čŋčĄŒæ•°æŽåē“čŋį§ģâ€Ļ", - "maintenance_task_restore": "æ­Ŗåœ¨æĸå¤é€‰åŽšįš„å¤‡äģŊâ€Ļ", + "maintenance_task_restore": "æ­Ŗåœ¨æĸå¤æ‰€é€‰įš„å¤‡äģŊâ€Ļ", "maintenance_task_rollback": "æĸå¤å¤ąč´ĨīŧŒæ­Ŗåœ¨å›žæģšåˆ°čŋ˜åŽŸį‚šâ€Ļ", "maintenance_title": "įŗģį쟿š‚æ—ļä¸å¯į”¨", "make": "å“į‰Œ", - "manage_geolocation": "įŽĄį†åæ ‡äŊįŊŽ", - "manage_media_access_rationale": "æ­ŖįĄŽå¤„į†å°†čĩ„äē§į§ģč‡ŗåžƒåœžæĄļåšļ将å…ļäģŽåžƒåœžæĄļ中æĸ复需čĻæ­¤čŽ¸å¯ã€‚", + "manage_geolocation": "įŽĄį†äŊįŊŽ", + "manage_media_access_rationale": "需čĻæ­¤æƒé™æ‰čƒŊæ­ŖįĄŽå¤„į†å°†æ–‡äģļį§ģå…Ĩ回æ”ļįĢ™åŠäģŽä¸­æĸå¤įš„æ“äŊœã€‚", "manage_media_access_settings": "打åŧ€čŽžįŊŽ", - "manage_media_access_subtitle": "å…čŽ¸Immichåē”ᔍፋåēįŽĄį†å’Œį§ģ动åĒ’äŊ“æ–‡äģļ。", - "manage_media_access_title": "åĒ’äŊ“įŽĄį†čŽŋ问", + "manage_media_access_subtitle": "å…čŽ¸ Immich åē”į”¨įŽĄį†å’Œį§ģ动åĒ’äŊ“æ–‡äģļ。", + "manage_media_access_title": "åĒ’äŊ“įŽĄį†čŽŋ闎权限", "manage_shared_links": "įŽĄį†å…ąäēĢ链æŽĨ", - "manage_sharing_with_partners": "įŽĄį†ä¸ŽåäŊœč€…įš„å…ąäēĢ", + "manage_sharing_with_partners": "įŽĄį†ä¸ŽåäŊœč€…įš„å…ąäēĢ莞įŊŽ", "manage_the_app_settings": "įŽĄį†åē”į”¨čŽžįŊŽ", "manage_your_account": "įŽĄį†æ‚¨įš„č´Ļæˆˇ", "manage_your_api_keys": "įŽĄį†æ‚¨įš„ API 密é’Ĩ", - "manage_your_devices": "įŽĄį†åˇ˛į™ģåŊ•čŽžå¤‡", - "manage_your_oauth_connection": "įŽĄį†æ‚¨įš„ OAuth įģ‘åޚ", + "manage_your_devices": "įŽĄį†æ‚¨åˇ˛į™ģåŊ•įš„čŽžå¤‡", + "manage_your_oauth_connection": "įŽĄį†æ‚¨įš„ OAuth čŋžæŽĨ", "map": "地回", - "map_assets_in_bounds": "{count, plural, =0 {æ­¤å¤„æ— į…§į‰‡} one {# åŧ į…§į‰‡} other {# åŧ į…§į‰‡}}", + "map_assets_in_bounds": "{count, plural, =0 {čŋ™ä¸ĒåŒēåŸŸæ— į…§į‰‡} one {# åŧ į…§į‰‡} other {# åŧ į…§į‰‡}}", "map_cannot_get_user_location": "æ— æŗ•čŽˇå–į”¨æˆˇäŊįŊŽ", "map_location_dialog_yes": "是", "map_location_picker_page_use_location": "äŊŋį”¨æ­¤äŊįŊŽ", - "map_location_service_disabled_content": "需čĻå¯į”¨åŽšäŊæœåŠĄæ‰čƒŊ昞į¤ēåŊ“前äŊįŊŽį›¸å…ŗįš„éĄšį›Žã€‚čĻįŽ°åœ¨å¯į”¨å—īŧŸ", + "map_location_service_disabled_content": "需čĻå¯į”¨åŽšäŊæœåŠĄæ‰čƒŊ昞į¤ē您åŊ“前äŊįŊŽįš„åĒ’äŊ“æ–‡äģļ。是åĻįŽ°åœ¨å¯į”¨åŽƒīŧŸ", "map_location_service_disabled_title": "厚äŊæœåŠĄåˇ˛įρᔍ", - "map_marker_for_images": "{country} {city}įš„å›žåƒåœ°å›žæ ‡čŽ°", - "map_marker_with_image": "å¸Ļå›žåƒįš„åœ°å›žæ ‡čŽ°", - "map_no_location_permission_content": "需čρäŊįŊŽæƒé™æ‰čƒŊ昞į¤ē与åŊ“前äŊįŊŽį›¸å…ŗįš„éĄšį›Žã€‚čĻįŽ°åœ¨å°ąæŽˆäēˆäŊįŊŽæƒé™å—īŧŸ", + "map_marker_for_images": "æ ‡čŽ°{city}、{country}æ‹æ‘„į…§į‰‡įš„åœ°å›žå›žæ ‡", + "map_marker_with_image": "å¸Ļéĸ„č§ˆå›žįš„åœ°å›žæ ‡čް", + "map_no_location_permission_content": "需čρäŊįŊŽæƒé™æ‰čƒŊ昞į¤ē您åŊ“前äŊįŊŽįš„čĩ„æēã€‚įŽ°åœ¨čĻå…čŽ¸å—īŧŸ", "map_no_location_permission_title": "äŊįŊŽæƒé™čĸĢæ‹’įģ", "map_settings": "åœ°å›žčŽžįŊŽ", "map_settings_dark_mode": "æˇąč‰˛æ¨Ąåŧ", @@ -1496,43 +1504,43 @@ "map_settings_date_range_option_year": "1嚴前", "map_settings_date_range_option_years": "{years} 嚴前", "map_settings_dialog_title": "åœ°å›žčŽžįŊŽ", - "map_settings_include_show_archived": "包æ‹Ŧ厞åŊ’æĄŖéĄšį›Ž", + "map_settings_include_show_archived": "包åĢ厞åŊ’æĄŖįš„å†…åŽš", "map_settings_include_show_partners": "包åĢ协äŊœč€…", - "map_settings_only_show_favorites": "äģ…æ˜žį¤ēæ”ļč—įš„éĄšį›Ž", + "map_settings_only_show_favorites": "äģ…æ˜žį¤ēæ”ļ藏项", "map_settings_theme_settings": "地回ä¸ģéĸ˜", - "map_zoom_to_see_photos": "įŧŠå°äģĨæŸĨįœ‹éĄšį›Ž", + "map_zoom_to_see_photos": "蝎įŧŠå°åœ°å›žäģĨæŸĨįœ‹į…§į‰‡", "mark_all_as_read": "å…¨éƒ¨æ ‡čŽ°ä¸ē厞č¯ģ", "mark_as_read": "æ ‡čŽ°ä¸ē厞č¯ģ", "marked_all_as_read": "åˇ˛å…¨éƒ¨æ ‡čŽ°ä¸ē厞č¯ģ", - "matches": "匚配", - "matching_assets": "匚配čĩ„äē§", + "matches": "åŒšé…éĄš", + "matching_assets": "åŒšé…įš„čĩ„æē", "media_type": "åĒ’äŊ“įąģ型", "memories": "é‚Ŗåš´ä슿—Ĩ", - "memories_all_caught_up": "åˇ˛å…¨éƒ¨įœ‹åŽŒ", - "memories_check_back_tomorrow": "æ˜Žå¤Šå†įœ‹", - "memories_setting_description": "įŽĄį†å›žåŋ†ä¸­įš„内厚", - "memories_start_over": "å†įœ‹ä¸€æŦĄ", - "memories_swipe_to_close": "ä¸Šåˆ’å…ŗé—­", - "memory": "回åŋ†", - "memory_lane_title": "莰åŋ†įēŋ{title}", + "memories_all_caught_up": "åˇ˛å¤„į†åŽŒæ¯•", + "memories_check_back_tomorrow": "明夊再æĨå›žéĄžæ›´å¤šé‚Ŗåš´ä슿—Ĩ吧", + "memories_setting_description": "įŽĄį†äŊ åœ¨é‚Ŗåš´ä슿—Ĩä¸­įœ‹åˆ°įš„å†…åŽš", + "memories_start_over": "重新åŧ€å§‹", + "memories_swipe_to_close": "向上æģ‘动äģĨå…ŗé—­", + "memory": "é‚Ŗåš´ä슿—Ĩ", + "memory_lane_title": "é‚Ŗåš´ä슿—Ĩ¡{title}", "menu": "čœå•", "merge": "合åšļ", "merge_people": "合åšļäēēį‰Š", - "merge_people_limit": "每æŦĄæœ€å¤šåĒčƒŊ合åšļ 5 ä¸Ēäēē", - "merge_people_prompt": "是åĻįĄŽåŽšåˆåšļ所选äēēį‰ŠīŧŸč¯Ĩ操äŊœæ— æŗ•撤销。", - "merge_people_successfully": "合åšļäēēį‰ŠæˆåŠŸ", - "merged_people_count": "厞合åšļ{count, plural, one {# ä¸Ēäēē} other {# ä¸Ēäēē}}", + "merge_people_limit": "每æŦĄæœ€å¤šåĒčƒŊ合åšļ 5 ä¸Ēéĸ孔", + "merge_people_prompt": "是åĻ合åšļčŋ™äē›äēē选īŧŸæ­¤æ“äŊœä¸å¯æ’¤é”€ã€‚", + "merge_people_successfully": "äēēį‰Šåˆåšļ成功", + "merged_people_count": "厞合åšļ{count, plural, one {# äēē} other {# äēē}}", "minimize": "最小化", "minute": "分", "minutes": "分钟", - "mirror_horizontal": "æ°´åšŗ", - "mirror_vertical": "åž‚į›´", + "mirror_horizontal": "æ°´åšŗįŋģčŊŦ", + "mirror_vertical": "åž‚į›´įŋģčŊŦ", "missing": "įŧēå¤ą", "mobile_app": "į§ģ动į̝APP", - "mobile_app_download_onboarding_note": "下čŊŊį§ģ动åē”ᔍäģĨčŽŋ问čŋ™äē›é€‰éĄš", + "mobile_app_download_onboarding_note": "äŊŋᔍäģĨ下选项下čŊŊ配åĨ—手æœēåē”ᔍ", "model": "åž‹åˇ", "month": "月", - "monthly_title_text_date_format": "y MMMM", + "monthly_title_text_date_format": "yyyyåš´M月", "more": "更多", "move": "į§ģ动", "move_down": "向下į§ģ动", @@ -1540,14 +1548,14 @@ "move_to": "į§ģ动到", "move_to_device_trash": "į§ģč‡ŗčŽžå¤‡å›žæ”ļįĢ™", "move_to_lock_folder_action_prompt": "厞将 {count} 饚æˇģ加到锁厚文äģļ多", - "move_to_locked_folder": "į§ģ动到锁厚文äģļ多", - "move_to_locked_folder_confirmation": "čŋ™äē›į…§į‰‡å’Œč§†éĸ‘å°†äģŽæ‰€æœ‰į›¸å†Œä¸­į§ģ除īŧŒåĒčƒŊ在锁厚文äģļ多中æŸĨįœ‹", + "move_to_locked_folder": "į§ģč‡ŗé”åŽšæ–‡äģļ多", + "move_to_locked_folder_confirmation": "čŋ™äē›į…§į‰‡å’Œč§†éĸ‘å°†äģŽæ‰€æœ‰į›¸å†Œä¸­į§ģ除īŧŒäģ…可在锁厚文äģļ多内æŸĨįœ‹", "move_up": "向上į§ģ动", - "moved_to_archive": "厞åŊ’æĄŖ {count, plural, one {# ä¸ĒéĄšį›Ž} other {# ä¸ĒéĄšį›Ž}}", - "moved_to_library": "厞į§ģ动 {count, plural, one {# ä¸ĒéĄšį›Ž} other {# ä¸ĒéĄšį›Ž}} 到回åē“", - "moved_to_trash": "åˇ˛æ”žå…Ĩ回æ”ļįĢ™", - "multiselect_grid_edit_date_time_err_read_only": "æ— æŗ•įŧ–čž‘åĒč¯ģéĄšį›Žįš„æ—Ĩ期īŧŒčˇŗčŋ‡", - "multiselect_grid_edit_gps_err_read_only": "æ— æŗ•įŧ–čž‘åĒč¯ģéĄšį›Žįš„äŊįŊŽäŋĄæ¯īŧŒčˇŗčŋ‡", + "moved_to_archive": "厞将 {count, plural, one {# 饚čĩ„äē§} other {# 饚čĩ„äē§}} į§ģ臺åŊ’æĄŖ", + "moved_to_library": "厞将 {count, plural, one {# 饚čĩ„äē§} other {# 饚čĩ„äē§}} į§ģ臺čĩ„æ–™åē“", + "moved_to_trash": "厞į§ģč‡ŗå›žæ”ļįĢ™", + "multiselect_grid_edit_date_time_err_read_only": "æ— æŗ•įŧ–čž‘åĒč¯ģčĩ„æēįš„æ—Ĩ期īŧŒæ­Ŗåœ¨čˇŗčŋ‡", + "multiselect_grid_edit_gps_err_read_only": "æ— æŗ•įŧ–čž‘åĒč¯ģčĩ„æēįš„äŊįŊŽäŋĄæ¯īŧŒæ­Ŗåœ¨čˇŗčŋ‡", "mute_memories": "é™éŸŗå›žåŋ†", "my_albums": "æˆ‘įš„į›¸å†Œ", "name": "åį§°", @@ -1558,11 +1566,11 @@ "network_requirement_photos_upload": "äŊŋį”¨čœ‚įĒæ•°æŽå¤‡äģŊᅧቇ", "network_requirement_videos_upload": "äŊŋį”¨čœ‚įĒæ•°æŽå¤‡äģŊ视éĸ‘", "network_requirements": "įŊ‘įģœčĻæą‚", - "network_requirements_updated": "įŊ‘įģœčĻæą‚å‘į”Ÿå˜åŒ–īŧŒæ­Ŗåœ¨é‡įŊŽå¤‡äģŊ队列", - "networking_settings": "įŊ‘įģœ", - "networking_subtitle": "įŽĄį†æœåŠĄå™¨æŽĨåŖčŽžįŊŽ", + "network_requirements_updated": "įŊ‘įģœčĻæą‚åˇ˛æ›´æ”šīŧŒæ­Ŗåœ¨é‡įŊŽå¤‡äģŊ队列", + "networking_settings": "įŊ‘įģœčŽžįŊŽ", + "networking_subtitle": "įŽĄį†æœåŠĄå™¨įĢ¯į‚ščŽžįŊŽ", "never": "永不čŋ‡æœŸ", - "new_album": "æ–°į›¸å†Œ", + "new_album": "新åģēį›¸å†Œ", "new_api_key": "新åĸž API 密é’Ĩ", "new_date_range": "æ–°įš„æ—ĨæœŸčŒƒå›´", "new_password": "æ–°å¯†į ", @@ -1575,82 +1583,84 @@ "new_version_available": "æœ‰æ–°į‰ˆæœŦ发布å•Ļ", "newest_first": "最新äŧ˜å…ˆ", "next": "下一ä¸Ē", - "next_memory": "下一ä¸Ē", + "next_memory": "下一ä¸Ē回åŋ†", "no": "åĻ", "no_actions_added": "尚æœĒæˇģ加动äŊœ", "no_albums_found": "æœĒæ‰žåˆ°į›¸å†Œ", - "no_albums_message": "创åģēį›¸å†ŒäģĨæ•´į†į…§į‰‡å’Œč§†éĸ‘", - "no_albums_with_name_yet": "螌äŧŧ您čŋ˜æ˛Ąæœ‰æ­¤åå­—įš„į›¸å†Œã€‚", - "no_albums_yet": "螌äŧŧ您čŋ˜æ˛Ąæœ‰åˆ›åģēį›¸å†Œã€‚", - "no_archived_assets_message": "åŊ’æĄŖį…§į‰‡å’Œč§†éĸ‘äģĨäžŋåœ¨į…§į‰‡č§†å›žä¸­éšč—åŽƒäģŦ", - "no_assets_message": "į‚šå‡ģ此处上äŧ äŊ įš„įŦŦ一åŧ į…§į‰‡", - "no_assets_to_show": "æ˛Ąæœ‰čĻæ˜žį¤ēįš„čĩ„äē§", - "no_cast_devices_found": "æœĒæ‰žåˆ°æŠ•æ”žčŽžå¤‡", - "no_checksum_local": "æ˛Ąæœ‰å¯į”¨įš„æ ĄéĒŒå’Œ-æ— æŗ•čŽˇå–æœŦ地čĩ„äē§", - "no_checksum_remote": "æ˛Ąæœ‰å¯į”¨įš„æ ĄéĒŒå’Œ-æ— æŗ•čŽˇå–čŋœį¨‹čĩ„äē§", - "no_configuration_needed": "不需čĻé…įŊŽ", - "no_devices": "æ— æŽˆæƒčŽžå¤‡", - "no_duplicates_found": "æœĒå‘įŽ°é‡å¤éĄšã€‚", - "no_exif_info_available": "æ˛Ąæœ‰å¯į”¨įš„ EXIF äŋĄæ¯", - "no_explore_results_message": "上äŧ æ›´å¤šį…§į‰‡æĨæŽĸį´ĸ。", - "no_favorites_message": "æˇģ加到æ”ļč—å¤šīŧŒåŋĢ速æŸĨ扞最äŊŗå›žį‰‡å’Œč§†éĸ‘", - "no_filters_added": "尚æœĒæˇģåŠ į­›é€‰", - "no_libraries_message": "创åģē外部回å瓿ĨæŸĨįœ‹æ‚¨įš„į…§į‰‡å’Œč§†éĸ‘", - "no_local_assets_found": "æœĒæ‰žåˆ°å…ˇæœ‰æ­¤æ ĄéĒŒå’Œįš„æœŦ地čĩ„äē§", - "no_location_set": "æœĒ莞įŊŽåœ°į‚š", - "no_locked_photos_message": "锁厚文äģļå¤šä¸­įš„į…§į‰‡å’Œč§†éĸ‘å°†čĸĢ隐藏īŧŒä¸äŧšåœ¨æ‚¨æĩč§ˆã€æœį´ĸ回å瓿—ļå‡ēįŽ°ã€‚", - "no_name": "æœĒå‘Ŋ名", - "no_notifications": "æ˛Ąæœ‰é€šįŸĨ", + "no_albums_message": "创åģēį›¸å†ŒäģĨæ•´į†æ‚¨įš„į…§į‰‡å’Œč§†éĸ‘", + "no_albums_with_name_yet": "įœ‹čĩˇæĨčŋ˜æ˛Ąæœ‰åŒåįš„į›¸å†Œã€‚", + "no_albums_yet": "įœ‹čĩˇæĨ您čŋ˜æ˛Ąæœ‰åˆ›åģēäģģäŊ•į›¸å†Œã€‚", + "no_archived_assets_message": "åŊ’æĄŖį…§į‰‡å’Œč§†éĸ‘īŧŒå°†å…ļäģŽâ€œį…§į‰‡â€č§†å›žä¸­éšč—", + "no_assets_message": "į‚šå‡ģ上äŧ äŊ įš„įŦŦ一åŧ į…§į‰‡", + "no_assets_to_show": "暂无内厚可昞į¤ē", + "no_cast_devices_found": "æœĒæ‰žåˆ°å¯į”¨įš„æŠ•åąčŽžå¤‡", + "no_checksum_local": "æ— å¯į”¨įš„æ ĄéĒŒå’Œ — æ— æŗ•čŽˇå–æœŦ地čĩ„æē", + "no_checksum_remote": "æ— å¯į”¨įš„æ ĄéĒŒå’Œ — æ— æŗ•čŽˇå–čŋœį¨‹čĩ„æē", + "no_configuration_needed": "无需配įŊŽ", + "no_devices": "æš‚æ— åˇ˛æŽˆæƒįš„čŽžå¤‡", + "no_duplicates_found": "æœĒå‘įŽ°é‡å¤å†…åŽšã€‚", + "no_exif_info_available": "æ— å¯į”¨įš„ EXIF äŋĄæ¯", + "no_explore_results_message": "上äŧ æ›´å¤šį…§į‰‡īŧŒæĨæŽĸį´ĸäŊ įš„回åē“吧。", + "no_favorites_message": "æˇģ加æ”ļ藏īŧŒäģĨäžŋåŋĢ速扞到äŊ æœ€į˛žåŊŠįš„į…§į‰‡å’Œč§†éĸ‘", + "no_filters_added": "尚æœĒæˇģåŠ į­›é€‰æĄäģļ", + "no_libraries_message": "创åģē外部回åē“īŧŒäģĨæĩč§ˆäŊ įš„į…§į‰‡å’Œč§†éĸ‘", + "no_local_assets_found": "æœĒæ‰žåˆ°å…ˇæœ‰æ­¤æ ĄéĒŒå’Œįš„æœŦ地čĩ„æē", + "no_location_set": "æœĒ莞įŊŽäŊįŊŽ", + "no_locked_photos_message": "锁厚文äģļå¤šä¸­įš„į…§į‰‡å’Œč§†éĸ‘äŧščĸĢ隐藏īŧŒåœ¨æĩč§ˆæˆ–搜į´ĸ回å瓿—ļ不äŧšæ˜žį¤ē。", + "no_name": "æœĒå‘Ŋ名äēēį‰Š", + "no_notifications": "暂无通įŸĨ", "no_people_found": "æœĒæ‰žåˆ°åŒšé…įš„äēēį‰Š", - "no_places": "无äŊįŊŽ", - "no_remote_assets_found": "æœĒæ‰žåˆ°å…ˇæœ‰æ­¤æ ĄéĒŒå’Œįš„čŋœį¨‹čĩ„äē§", - "no_results": "无搜į´ĸį쓿žœ", - "no_results_description": "å°č¯•äŊŋį”¨åŒäš‰č¯æˆ–æ›´é€šį”¨įš„å…ŗé”Žč¯", - "no_shared_albums_message": "创åģēį›¸å†ŒäģĨå…ąäēĢį…§į‰‡å’Œč§†éĸ‘", - "no_uploads_in_progress": "æ˛Ąæœ‰æ­Ŗåœ¨čŋ›čĄŒįš„上äŧ ", + "no_places": "æš‚æ— åœ°į‚š", + "no_remote_assets_found": "æœĒæ‰žåˆ°å…ˇæœ‰æ­¤æ ĄéĒŒå’Œįš„čŋœį¨‹čĩ„æē", + "no_results": "æœĒ扞到äģģäŊ•åŒšé…éĄš", + "no_results_description": "č¯ˇå°č¯•äŊŋį”¨åŒäš‰č¯æˆ–æ›´åŽŊæŗ›įš„å…ŗé”Žč¯", + "no_shared_albums_message": "创åģēį›¸å†ŒīŧŒä¸Žį¤žäē¤åœˆå†…įš„åĨŊå‹å…ąäēĢį…§į‰‡å’Œč§†éĸ‘", + "no_uploads_in_progress": "暂无上äŧ äģģåŠĄ", "none": "无", "not_allowed": "ä¸å…čŽ¸", "not_available": "ä¸é€‚į”¨", - "not_in_any_album": "不在äģģäŊ•į›¸å†Œä¸­", + "not_in_any_album": "æœĒæ”ļåŊ•äēŽäģģäŊ•į›¸å†Œ", "not_selected": "æœĒ选拊", - "notes": "提į¤ē", - "nothing_here_yet": "čŋ™é‡Œäģ€äšˆéƒŊæ˛Ąæœ‰", - "notification_permission_dialog_content": "čĻå¯į”¨é€šįŸĨīŧŒč¯ˇčŊŦåˆ°â€œčŽžįŊŽâ€īŧŒåšļé€‰æ‹Šâ€œå…čŽ¸â€ã€‚", - "notification_permission_list_tile_content": "授äēˆé€šįŸĨ权限。", + "notes": "å¤‡æŗ¨", + "nothing_here_yet": "暂无内厚", + "notification_permission_dialog_content": "čĻæƒŗåŧ€å¯é€šįŸĨ功čƒŊīŧŒéœ€čρåŽģ“设įŊŽâ€é‡Œæ‰‹åŠ¨å…čŽ¸ã€‚", + "notification_permission_list_tile_content": "č¯ˇæŽˆäēˆīŧˆį›¸å…ŗīŧ‰æƒé™īŧŒäģĨåŧ€å¯é€šįŸĨ功čƒŊ。", "notification_permission_list_tile_enable_button": "å¯į”¨é€šįŸĨ", "notification_permission_list_tile_title": "通įŸĨ权限", - "notification_toggle_setting_description": "å¯į”¨é‚Žäģļ通įŸĨ", + "notification_toggle_setting_description": "åŧ€å¯é‚Žäģļ通įŸĨ", "notifications": "通įŸĨ", "notifications_setting_description": "įŽĄį†é€šįŸĨ", "oauth": "OAuth", "obtainium_configurator": "Obtainium配įŊŽå™¨", - "obtainium_configurator_instructions": "äŊŋᔍ Obtainium į›´æŽĨäģŽ Immich GitHub įš„å‘å¸ƒåŒēåŽ‰čŖ…å’Œæ›´æ–° Android åē”ᔍፋåēã€‚创åģē API Keyåšļ选拊一ä¸Ē变äŊ“æĨ创åģēæ‚¨įš„ Obtainium 配įŊŽé“žæŽĨ", - "ocr": "文æœŦ蝆åˆĢ", + "obtainium_configurator_instructions": "äŊŋᔍ Obtainium į›´æŽĨäģŽ Immich įš„ GitHub 发布éĄĩåŽ‰čŖ…å’Œæ›´æ–° Android åē”į”¨ã€‚č¯ˇåˆ›åģē一ä¸Ē API 密é’Ĩåšļ选拊一ä¸Ēį‰ˆæœŦīŧŒäģĨį”ŸæˆäŊ įš„ Obtainium 配įŊŽé“žæŽĨ", + "ocr": "OCR", "official_immich_resources": "Immich 厘斚čĩ„æē", "offline": "įĻģįēŋ", "offset": "偏į§ģ量", "ok": "įĄŽåŽš", "oldest_first": "最旧äŧ˜å…ˆ", - "on_this_device": "åœ¨æ­¤čŽžå¤‡", - "onboarding": "ᛛ大åŧ€å¯", + "on_this_device": "在æœŦčŽžå¤‡ä¸Š", + "onboarding": "新手åŧ•å¯ŧ", "onboarding_locale_description": "选拊您偏åĨŊįš„č¯­č¨€ã€‚æ‚¨å¯äģĨåœ¨čŽžįŊŽä¸­éšæ—ļæ›´æ”šæ­¤é€‰éĄšã€‚", - "onboarding_privacy_description": "äģĨ下īŧˆå¯é€‰īŧ‰åŠŸčƒŊ䞝čĩ–å¤–éƒ¨æœåŠĄīŧŒå¯éšæ—ļåœ¨čŽžįŊŽä¸­įĻį”¨ã€‚", - "onboarding_server_welcome_description": "čŽŠæˆ‘äģŦä¸ēæ‚¨čŽžįŊŽįŗģįģŸåšļ配įŊŽä¸€äē›é€šį”¨čŽžįŊŽã€‚", - "onboarding_theme_description": "é€‰æ‹ŠæœåŠĄįš„éĸœč‰˛ä¸ģéĸ˜ã€‚į¨åŽå¯äģĨåœ¨čŽžįŊŽä¸­čŋ›čĄŒäŋŽæ”šã€‚", + "onboarding_privacy_description": "äģĨ下īŧˆå¯é€‰īŧ‰åŠŸčƒŊ䞝čĩ–äēŽå¤–éƒ¨æœåŠĄīŧŒæ‚¨å¯éšæ—ļåœ¨čŽžįŊŽä¸­å°†å…ļįĻį”¨ã€‚", + "onboarding_server_welcome_description": "čŽŠæˆ‘äģŦ通čŋ‡ä¸€äē›å¸¸į”¨čŽžįŊŽæĨ配įŊŽæ‚¨įš„厞䞋。", + "onboarding_theme_description": "ä¸ēæ‚¨įš„åŽžäž‹é€‰æ‹Šä¸€ä¸Ēéĸœč‰˛ä¸ģéĸ˜ã€‚æ‚¨į¨åŽå¯äģĨåœ¨čŽžįŊŽä¸­æ›´æ”šæ­¤é€‰éĄšã€‚", "onboarding_user_welcome_description": "åŗåˆģčĩˇį¨‹īŧ", - "onboarding_welcome_user": "æŦĸčŋŽīŧŒ{user}", + "onboarding_welcome_user": "æŦĸčŋŽæ‚¨īŧŒ{user}", "online": "在įēŋ", "only_favorites": "äģ…æ˜žį¤ē厞æ”ļ藏", "open": "打åŧ€", + "open_calendar": "打åŧ€æ—Ĩ历", + "open_in_browser": "在æĩč§ˆå™¨ä¸­æ‰“åŧ€", "open_in_map_view": "åœ¨åœ°å›žč§†å›žä¸­æ‰“åŧ€", "open_in_openstreetmap": "在 OpenStreetMap 中打åŧ€", "open_the_search_filters": "打åŧ€æœį´ĸ᭛选", "options": "选项", "or": "或", - "organize_into_albums": "æ•´į†æˆį›¸å†Œ", - "organize_into_albums_description": "äŊŋᔍåŊ“前同æ­Ĩ莞įŊŽå°†įŽ°æœ‰į…§į‰‡æ”žå…Ĩį›¸å†Œ", - "organize_your_library": "æ•´į†æ‚¨įš„å›žåē“", - "original": "原回", + "organize_into_albums": "æ•´į†åˆ°į›¸å†Œä¸­", + "organize_into_albums_description": "äŊŋᔍåŊ“å‰įš„åŒæ­Ĩ莞įŊŽīŧŒå°†įŽ°æœ‰į…§į‰‡åŊ’å…Ĩį›¸å†Œ", + "organize_your_library": "æ•´į†æ‚¨įš„čĩ„æ–™åē“", + "original": "åŽŸå§‹įš„", "other": "å…ļ厃", "other_devices": "å…ļåŽƒčŽžå¤‡", "other_entities": "å…ļäģ–厞äŊ“", @@ -1660,22 +1670,22 @@ "page": "éĄĩéĸ", "partner": "协äŊœč€…", "partner_can_access": "{partner}可äģĨčŽŋ问", - "partner_can_access_assets": "除åŊ’æĄŖå’Œåˆ é™¤äš‹å¤–įš„æ‰€æœ‰į…§į‰‡å’Œč§†éĸ‘", - "partner_can_access_location": "厚äŊį…§į‰‡æ‹æ‘„äŊįŊŽ", + "partner_can_access_assets": "æ‰€æœ‰į…§į‰‡å’Œč§†éĸ‘īŧŒé™¤äē†åˇ˛åŊ’æĄŖå’Œåˇ˛åˆ é™¤įš„äš‹å¤–", + "partner_can_access_location": "æ‹æ‘„į…§į‰‡įš„åœ°į‚š", "partner_list_user_photos": "{user}įš„į…§į‰‡", - "partner_list_view_all": "åą•į¤ē全部", + "partner_list_view_all": "æŸĨįœ‹å…¨éƒ¨", "partner_page_empty_message": "æ‚¨įš„į…§į‰‡å°šæœĒ与äģģäŊ•协äŊœč€…å…ąäēĢ。", - "partner_page_no_more_users": "无需æˇģåŠ æ›´å¤šį”¨æˆˇ", - "partner_page_partner_add_failed": "æˇģ加协äŊœč€…å¤ąč´Ĩ", - "partner_page_select_partner": "选拊协äŊœč€…", - "partner_page_shared_to_title": "å…ąäēĢįģ™", + "partner_page_no_more_users": "į”¨æˆˇæ•°é‡åˇ˛čžžä¸Šé™", + "partner_page_partner_add_failed": "æˇģ加åĨŊå‹å¤ąč´Ĩ", + "partner_page_select_partner": "é€‰æ‹Šį›Žæ ‡", + "partner_page_shared_to_title": "分äēĢįģ™", "partner_page_stop_sharing_content": "{partner} å°†æ— æŗ•å†čŽŋé—Žæ‚¨įš„į…§į‰‡ã€‚", - "partner_sharing": "协äŊœč€…å…ąäēĢ", - "partners": "协äŊœč€…", + "partner_sharing": "åĨŊå‹å…ąäēĢ", + "partners": "åĨŊ友", "password": "坆᠁", - "password_does_not_match": "å¯†į ä¸åŒšé…", + "password_does_not_match": "å¯†į ä¸æ­ŖįĄŽ", "password_required": "需čρ坆᠁", - "password_reset_success": "å¯†į é‡įŊŽæˆåŠŸ", + "password_reset_success": "å¯†į åˇ˛é‡įŊŽ", "past_durations": { "days": "{days, plural, one {夊} other {#夊}}前", "hours": "{hours, plural, one {小æ—ļ} other {#小æ—ļ}}前", @@ -1689,56 +1699,56 @@ "pending": "åž…å¤„į†", "people": "äēēį‰Š", "people_edits_count": "{count, plural, one {#ä¸Ēäēēį‰Š} other {#ä¸Ēäēēį‰Š}}厞įŧ–čž‘", - "people_feature_description": "按äēēį‰Šåˆ†įģ„čŋ›čĄŒæĩč§ˆį…§į‰‡å’Œč§†éĸ‘", - "people_selected": "{count, plural, one {åˇ˛é€‰æ‹Š # äēē} other {åˇ˛é€‰æ‹Š # äēē}}", - "people_sidebar_description": "åœ¨äž§čžšæ ä¸­æ˜žį¤ē“äēēį‰Šâ€é“žæŽĨ", + "people_feature_description": "按äēēį‰Šåˆ†į섿ĩč§ˆį…§į‰‡å’Œč§†éĸ‘", + "people_selected": "{count, plural, one {厞选䏭 # äēē} other {厞选䏭 # äēē}}", + "people_sidebar_description": "åœ¨äž§čžšæ æ˜žį¤ē“äēēį‰Šâ€é“žæŽĨ", "permanent_deletion_warning": "永䚅删除č­Ļ告", - "permanent_deletion_warning_setting_description": "åŊ“æ°¸äš…åˆ é™¤éĄšį›Žæ—ļ昞į¤ēč­Ļ告", + "permanent_deletion_warning_setting_description": "永䚅删除čĩ„æēæ—ļ昞į¤ēč­Ļ告", "permanently_delete": "永䚅删除", - "permanently_delete_assets_count": "永䚅删除{count, plural, one {éĄšį›Ž} other {éĄšį›Ž}}", - "permanently_delete_assets_prompt": "įĄŽåŽščĻæ°¸äš…åˆ é™¤{count, plural, other {čŋ™#ä¸ĒéĄšį›ŽīŧŸ}}此操äŊœäŧšä¸€åšļ将{count, plural, one {厃} other {厃äģŦ}}äģŽå…￉€åąžį›¸å†Œä¸­į§ģ除。", - "permanently_deleted_asset": "æ°¸äš…åˆ é™¤įš„éĄšį›Ž", - "permanently_deleted_assets_count": "{count, plural, one {#ä¸ĒéĄšį›Ž} other {#ä¸ĒéĄšį›Ž}}åˇ˛åˆ é™¤", + "permanently_delete_assets_count": "永䚅删除{count, plural, one {ä¸Ēčĩ„æē} other {ä¸Ēčĩ„æē}}", + "permanently_delete_assets_prompt": "įĄŽåŽščĻæ°¸äš…åˆ é™¤ {count, plural, one {æ­¤čĩ„æēå—īŧŸ} other {čŋ™ # ä¸Ēčĩ„æēå—īŧŸ}}čŋ™äšŸäŧšå°† {count, plural, one {å…ļ} other {厃äģŦ}}äģŽæ‰€åąžį›¸å†Œä¸­į§ģ除。", + "permanently_deleted_asset": "æ°¸äš…åˆ é™¤įš„čĩ„æē", + "permanently_deleted_assets_count": "åˇ˛æ°¸äš…åˆ é™¤{count, plural, one {#ä¸Ēčĩ„æē} other {#ä¸Ēčĩ„æē}}", "permission": "权限", "permission_empty": "权限不čƒŊä¸ēįŠē", "permission_onboarding_back": "čŋ”回", "permission_onboarding_continue_anyway": "äģį„ļįģ§įģ­", "permission_onboarding_get_started": "åŧ€å§‹äŊŋᔍ", "permission_onboarding_go_to_settings": "čŊŦåˆ°čŽžįŊŽ", - "permission_onboarding_permission_denied": "权限čĸĢæ‹’īŧščρäŊŋᔍ ImmichīŧŒč¯ˇåœ¨â€œčŽžįŊŽâ€ä¸­æŽˆäēˆį…§į‰‡å’Œč§†éĸ‘权限。", - "permission_onboarding_permission_granted": "åˇ˛æŽˆæƒīŧä¸€åˆ‡å°ąįģĒ。", - "permission_onboarding_permission_limited": "权限受限īŧščĻčŽŠ Immich 备äģŊå’ŒįŽĄį†æ‚¨įš„æ•´ä¸Ē回å瓿”ļ藏īŧŒč¯ˇåœ¨â€œčŽžįŊŽâ€ä¸­æŽˆäēˆį…§į‰‡å’Œč§†éĸ‘权限。", - "permission_onboarding_request": "Immich 需čĻæƒé™æ‰čƒŊæŸĨįœ‹æ‚¨įš„į…§į‰‡å’Œč§†éĸ‘。", + "permission_onboarding_permission_denied": "权限čĸĢæ‹’įģã€‚čρäŊŋᔍ ImmichīŧŒč¯ˇåœ¨â€œčŽžįŊŽâ€ä¸­æŽˆäēˆį…§į‰‡å’Œč§†éĸ‘权限。", + "permission_onboarding_permission_granted": "æƒé™åˇ˛æŽˆäēˆīŧä¸€åˆ‡å‡†å¤‡å°ąįģĒ。", + "permission_onboarding_permission_limited": "权限受限。čĻčŽŠ Immich 备äģŊåšļįŽĄį†äŊ įš„æ•´ä¸Ē回åē“īŧŒč¯ˇåœ¨â€œčŽžįŊŽâ€ä¸­æŽˆäēˆį…§į‰‡å’Œč§†éĸ‘权限。", + "permission_onboarding_request": "Immich 需čĻæƒé™æ‰čƒŊæŸĨįœ‹äŊ įš„į…§į‰‡å’Œč§†éĸ‘。", "person": "äēēį‰Š", - "person_age_months": "{months, plural, one {# ä¸Ē月} other {# ä¸Ē月}}", - "person_age_year_months": "1 垁, {months, plural, one {# ä¸Ē月} other {# ä¸Ē月}}", + "person_age_months": "{months, plural, one {# ä¸Ē月} other {# ä¸Ē月}}大", + "person_age_year_months": "1 垁{months, plural, one {# ä¸Ē月} other {# ä¸Ē月}}大", "person_age_years": "{years, plural, other {# 垁}}", "person_birthdate": "å‡ēį”ŸäēŽ{date}", - "person_hidden": "{name}{hidden, select, true {īŧˆåˇ˛éšč—īŧ‰} other {}}", - "person_recognized": "蝆åˆĢå‡ēįš„äēēį‰Š", - "person_selected": "é€‰æ‹Šįš„äēēį‰Š", - "photo_shared_all_users": "įœ‹čĩˇæĨæ‚¨åˇ˛ä¸Žæ‰€æœ‰į”¨æˆˇå…ąäēĢä熿­¤į›¸å†ŒīŧŒæˆ–č€…æ‚¨æ šæœŦæ˛Ąæœ‰äģģäŊ•į”¨æˆˇå¯å…ąäēĢ。", + "person_hidden": "{name}{hidden, select, true { (隐藏)} other {}}", + "person_recognized": "厞蝆åˆĢäēēį‰Š", + "person_selected": "åˇ˛é€‰æ‹Šäēēį‰Š", + "photo_shared_all_users": "įœ‹čĩˇæĨäŊ åˇ˛įģä¸Žæ‰€æœ‰į”¨æˆˇå…ąäēĢäē†äŊ įš„ᅧቇīŧŒæˆ–者äŊ æ˛Ąæœ‰äģģäŊ•可äģĨå…ąäēĢįš„į”¨æˆˇã€‚", "photos": "ᅧቇ", "photos_and_videos": "ᅧቇ & 视éĸ‘", - "photos_count": "{count, plural, one {{count, number}åŧ į…§į‰‡} other {{count, number}åŧ į…§į‰‡}}", - "photos_from_previous_years": "čŋ‡åž€įš„ä슿˜”įžŦ间", + "photos_count": "{count, plural, one {{count, number} åŧ į…§į‰‡} other {{count, number} åŧ į…§į‰‡}}", + "photos_from_previous_years": "é‚Ŗåš´ä슿—Ĩ", "photos_only": "äģ…ᅧቇ", "pick_a_location": "选拊äŊįŊŽ", "pick_custom_range": "č‡ĒåŽšäš‰čŒƒå›´", "pick_date_range": "选拊æ—ĨæœŸčŒƒå›´", - "pin_code_changed_successfully": "äŋŽæ”šPINį æˆåŠŸ", - "pin_code_reset_successfully": "重įŊŽPINį æˆåŠŸ", - "pin_code_setup_successfully": "莞įŊŽPINį æˆåŠŸ", + "pin_code_changed_successfully": "PIN᠁äŋŽæ”šæˆåŠŸ", + "pin_code_reset_successfully": "PINį é‡įŊŽæˆåŠŸ", + "pin_code_setup_successfully": "PINį čŽžįŊŽæˆåŠŸ", "pin_verification": "PIN᠁énj蝁", "place": "åœ°į‚š", "places": "åœ°į‚š", "places_count": "{count, plural, one {{count, number} ä¸Ēåœ°į‚š} other {{count, number} ä¸Ēåœ°į‚š}}", "play": "播攞", - "play_memories": "播攞回åŋ†", + "play_memories": "æ’­æ”žé‚Ŗåš´ä슿—Ĩ", "play_motion_photo": "æ’­æ”žåŠ¨æ€å›žį‰‡", "play_or_pause_video": "æ’­æ”žæˆ–æš‚åœč§†éĸ‘", "play_original_video": "æ’­æ”žåŽŸå§‹č§†éĸ‘", - "play_original_video_setting_description": "更倞向äēŽæ’­æ”žåŽŸå§‹č§†éĸ‘īŧŒč€Œä¸æ˜¯čŊŦ᠁视éĸ‘。åĻ‚æžœåŽŸå§‹čĩ„æēä¸å…ŧ厚īŧŒåˆ™å¯čƒŊæ— æŗ•æ­ŖįĄŽæ’­æ”žã€‚", + "play_original_video_setting_description": "äŧ˜å…ˆæ’­æ”žåŽŸå§‹č§†éĸ‘īŧŒč€ŒéžčŊŦ᠁视éĸ‘。åĻ‚æžœåŽŸå§‹čĩ„æēä¸å…ŧ厚īŧŒå¯čƒŊæ— æŗ•æ­Ŗå¸¸æ’­æ”žã€‚", "play_transcoded_video": "播攞čŊŦ᠁视éĸ‘", "please_auth_to_access": "蝎čŋ›čĄŒčēĢäģŊénj蝁äģĨčŽŋ问", "port": "įĢ¯åŖ", @@ -1801,9 +1811,8 @@ "rate_asset": "čĩ„äē§æ˜Ÿįē§", "rating": "星įē§", "rating_clear": "删除星įē§", - "rating_count": "{count, plural, one {#星} other {#星}}", + "rating_count": "{count, plural, =0 {æœĒ蝄įē§} one {# 星} other {# 星}}", "rating_description": "在äŋĄæ¯éĸæŋä¸­åą•į¤ē EXIF 星įē§", - "rating_set": "åˇ˛čŽžįŊŽä¸ē {rating, plural, one {# 星} other {# 星}}", "reaction_options": "å›žå¤é€‰éĄš", "read_changelog": "阅č¯ģ更新æ—Ĩåŋ—", "readonly_mode_disabled": "åĒč¯ģæ¨Ąåŧåˇ˛įρᔍ", @@ -1875,7 +1884,10 @@ "reset_pin_code_success": "成功重įŊŽPIN᠁", "reset_pin_code_with_password": "您始įģˆå¯äģĨäŊŋį”¨æ‚¨įš„å¯†į æĨ重įŊŽæ‚¨įš„PIN᠁", "reset_sqlite": "重įŊŽ SQLite 数捎åē“", - "reset_sqlite_confirmation": "æ‚¨įĄŽåŽščĻé‡įŊŽ SQLite 数捎åē“吗īŧŸæ‚¨éœ€čĻæŗ¨é”€åšļ重新į™ģåŊ•才čƒŊ重新同æ­Ĩ数捎", + "reset_sqlite_clear_app_data": "清除数捎", + "reset_sqlite_confirmation": "æ‚¨įĄŽåŽščĻæ¸…é™¤æ‰€æœ‰æ•°æŽå—īŧŸčŋ™äŧšæ¸…é™¤æ‰€æœ‰čŽžįŊŽå’Œį™ģå‡ēæ‚¨įš„č´Ļæˆˇã€‚", + "reset_sqlite_confirmation_note": "æŗ¨æ„īŧšæ¸…é™¤æ•°æŽåŽīŧŒæ‚¨éœ€čĻé‡æ–°å¯åŠ¨į¨‹åēã€‚", + "reset_sqlite_done": "æ•°æŽåˇ˛æ¸…é™¤ã€‚č¯ˇé‡å¯ Immich åšļ重新į™ģåŊ•。", "reset_sqlite_success": "åˇ˛æˆåŠŸé‡įŊŽ SQLite 数捎åē“", "reset_to_default": "æĸ复éģ˜čޤå€ŧ", "resolution": "åˆ†čž¨įŽ‡", @@ -1903,6 +1915,7 @@ "saved_settings": "厞äŋå­˜čŽžįŊŽ", "say_something": "č¯´į‚šäģ€äšˆ", "scaffold_body_error_occurred": "å‘į”Ÿé”™č¯¯", + "scaffold_body_error_unrecoverable": "å‘į”Ÿæ— æŗ•æĸå¤įš„é”™č¯¯ã€‚č¯ˇåœ¨ Discord 或 GitHub 上分äēĢ错蝝äŋĄæ¯å’Œå †æ ˆčˇŸč¸ĒīŧŒäģĨäžŋ我äģŦ提䞛帎劊。åĻ‚æœ‰éœ€čρīŧŒæ‚¨å¯äģĨå°č¯•æ¸…é™¤åē”į”¨æ•°æŽīŧˆåĻ‚ä¸‹æ“äŊœīŧ‰ã€‚", "scan": "æ‰Ģ描", "scan_all_libraries": "æ‰Ģ描所有回åē“", "scan_library": "æ‰Ģ描", @@ -1938,6 +1951,7 @@ "search_filter_ocr": "通čŋ‡æ–‡æœŦ蝆åˆĢ搜į´ĸ", "search_filter_people_title": "选拊äēēį‰Š", "search_filter_star_rating": "星įē§č¯„分", + "search_filter_tags_title": "é€‰æ‹Šæ ‡į­ž", "search_for": "æŸĨ扞", "search_for_existing_person": "æŸĨæ‰žåˇ˛æœ‰äēēį‰Š", "search_no_more_result": "无更多į쓿žœ", @@ -2017,6 +2031,9 @@ "set_profile_picture": "莞įŊŽä¸Ēäēēčĩ„æ–™å›žį‰‡", "set_slideshow_to_fullscreen": "å…¨åąæ”žæ˜ åšģၝቇ", "set_stack_primary_asset": "莞ä¸ēä¸ģčĻéĄšį›Ž", + "setting_image_navigation_enable_subtitle": "å¯į”¨åŽīŧŒčŊģč§Ļåąåš•åˇĻåŗčžšįŧ˜åŒēåŸŸåŗå¯åˆ‡æĸ上一åŧ æˆ–下一åŧ ã€‚", + "setting_image_navigation_enable_title": "į‚šå‡ģ切æĸ", + "setting_image_navigation_title": "å›žį‰‡åˆ‡æĸ", "setting_image_viewer_help": "č¯Ļįģ†äŋĄæ¯æŸĨįœ‹å™¨éĻ–å…ˆåŠ čŊŊ小įŧŠį•Ĩ回īŧŒį„ļ后加čŊŊä¸­į­‰å¤§å°įš„éĸ„č§ˆå›žīŧˆč‹Ĩ吝ᔍīŧ‰īŧŒæœ€åŽåŠ čŊŊ原始回像。", "setting_image_viewer_original_subtitle": "吝ᔍäģĨ加čŊŊ原回īŧŒįρᔍäģĨ减少数捎äŊŋį”¨é‡īŧˆįŊ‘įģœå’ŒčŽžå¤‡įŧ“å­˜īŧ‰ã€‚", "setting_image_viewer_original_title": "加čŊŊ原回", @@ -2183,6 +2200,7 @@ "support": "支持", "support_and_feedback": "支持和反éψ", "support_third_party_description": "æ‚¨įš„ Immich åŽ‰čŖ…į¨‹åēį”ąįŦŦ三斚打包。åŊ“前闎éĸ˜å¯čƒŊį”ąč¯ĨčŊ¯äģļ包åŧ•čĩˇīŧŒå› æ­¤č¯ˇäŧ˜å…ˆé€ščŋ‡ä¸‹æ–šé“žæŽĨ向寚åē”äŊœč€…提äē¤ Issue。", + "supporter": "čĩžåŠŠč€…", "swap_merge_direction": "äē’æĸ合åšļ斚向", "sync": "同æ­Ĩ", "sync_albums": "同æ­Ĩį›¸å†Œ", @@ -2196,7 +2214,7 @@ "tag_assets": "æ ‡čŽ°éĄšį›Ž", "tag_created": "åˇ˛åˆ›åģēæ ‡į­žīŧš{tag}", "tag_feature_description": "按é€ģčž‘æ ‡į­žåˆ†įģ„åšļæĩč§ˆį…§į‰‡å’Œč§†éĸ‘", - "tag_not_found_question": "æ‰žä¸åˆ°æ ‡į­žå—īŧŸåˆ›åģēæ–°æ ‡į­ž", + "tag_not_found_question": "æ‰žä¸åˆ°æ ‡į­žå—īŧŸåˆ›åģēæ–°æ ‡į­žã€‚", "tag_people": "å‘Ŋ名äēēį‰Š", "tag_updated": "åˇ˛æ›´æ–°æ ‡į­žīŧš{tag}", "tagged_assets": "{count, plural, one {# ä¸ĒéĄšį›Ž} other {# ä¸ĒéĄšį›Ž}}čĸĢåŠ ä¸Šæ ‡į­ž", @@ -2294,6 +2312,7 @@ "unstack_action_prompt": "{count} ä¸ĒæœĒ堆叠", "unstacked_assets_count": "{count, plural, one {#ä¸ĒéĄšį›Ž} other {#ä¸ĒéĄšį›Ž}}åˇ˛å–æļˆå †å ", "unsupported_field_type": "ä¸æ”¯æŒįš„å­—æŽĩįąģ型", + "unsupported_file_type": "不支持上äŧ æ–‡äģļ {file}īŧŒåŊ“前不支持 {type} įąģåž‹įš„æ–‡äģļ。", "untagged": "æ— æ ‡į­ž", "untitled_workflow": "无标éĸ˜åˇĨäŊœæĩ", "up_next": "下一ä¸Ē", @@ -2320,6 +2339,8 @@ "url": "URL", "usage": "į”¨é‡", "use_biometric": "äŊŋį”¨į”Ÿį‰Šč¯†åˆĢ", + "use_browser_locale": "äŊŋᔍæĩč§ˆå™¨éģ˜čޤ蝭荀", + "use_browser_locale_description": "栚捎äŊ įš„æĩč§ˆå™¨č¯­č¨€å’Œåœ°åŒē莞įŊŽæĨæ ŧåŧåŒ–æ—Ĩ期、æ—ļ间和数字", "use_current_connection": "äŊŋᔍåŊ“前čŋžæŽĨ", "use_custom_date_range": "č‡Ē厚䚉æ—ĨæœŸčŒƒå›´", "user": "į”¨æˆˇ", @@ -2345,7 +2366,7 @@ "variables": "变量", "version": "į‰ˆæœŦ", "version_announcement_closing": "æ‚¨įš„æœ‹å‹īŧŒAlex", - "version_announcement_message": "您åĨŊīŧåˇ˛įģæŖ€æĩ‹åˆ° Immich æœ‰æ–°į‰ˆæœŦã€‚č¯ˇæŠŊįŠē阅č¯ģä¸€ä¸‹å‘čĄŒč¯´æ˜ŽīŧŒäģĨįĄŽäŋæ‚¨įš„配įŊŽæ–‡äģ￘¯æœ€æ–°įš„īŧŒéŋ免存在配įŊŽé”™č¯¯īŧŒį‰šåˆĢ是åŊ“您是äŊŋᔍ WatchTower 或å…ļ厃įąģäŧŧįš„č‡Ē动升įē§åˇĨå…ˇæ—ļ。", + "version_announcement_message": "Immich įŽ°åˇ˛æŽ¨å‡ēæ–°į‰ˆæœŦã€‚č¯ˇæŸĨé˜…å‘čĄŒč¯´æ˜ŽīŧŒåŠæ—ļ更新配įŊŽäģĨ防æ­ĸå‡ē错。č‹Ĩ您通čŋ‡ WatchTower 或å…ļäģ–åˇĨå…ˇč‡Ē动更新 ImmichīŧŒéœ€į‰šåˆĢæŗ¨æ„ã€‚", "version_history": "į‰ˆæœŦæ›´æ–°åŽ†å˛čŽ°åŊ•", "version_history_item": "在 {date} åŽ‰čŖ… {version} į‰ˆæœŦ", "video": "视éĸ‘", diff --git a/i18n/zh_Hant.json b/i18n/zh_Hant.json index 60dae6ed22..a61b03c28c 100644 --- a/i18n/zh_Hant.json +++ b/i18n/zh_Hant.json @@ -62,7 +62,7 @@ "backup_onboarding_2_description": "å„˛å­˜åœ¨ä¸åŒčŖįŊŽä¸Šįš„æœŦ抟副æœŦ。這包åĢä¸ģčρæĒ”æĄˆåŠå…ļæœŦ抟備äģŊ。", "backup_onboarding_3_description": "æ‚¨čŗ‡æ–™įš„į¸Ŋ備äģŊäģŊ數īŧŒåŒ…æ‹Ŧ原始æĒ”æĄˆåœ¨å…§ã€‚é€™åŒ…æ‹Ŧ 1 äģŊį•°åœ°å‚™äģŊ與 2 äģŊæœŦ抟副æœŦ。", "backup_onboarding_description": "åģēč­°æŽĄį”¨ 3-2-1 備äģŊį­–į•Ĩ 來äŋč­ˇæ‚¨įš„čŗ‡æ–™ã€‚æ‚¨æ‡‰äŋį•™åˇ˛ä¸Šå‚ŗįš„ᛏቇ/åŊąį‰‡å‰¯æœŦīŧŒäģĨ及 Immich čŗ‡æ–™åēĢīŧŒäģĨåģēįĢ‹åŽŒæ•´įš„å‚™äģŊæ–šæĄˆã€‚", - "backup_onboarding_footer": "更多備äģŊ Immich čŗ‡č¨ŠīŧŒčĢ‹åƒč€ƒčĒĒæ˜Žæ–‡äģļ。", + "backup_onboarding_footer": "更多備äģŊ Immich čŗ‡č¨ŠīŧŒčĢ‹åƒč€ƒ čĒĒæ˜Žæ–‡äģļ。", "backup_onboarding_parts_title": "éĩåžžå‚™äģŊ原則 3-2-1īŧš", "backup_onboarding_title": "備äģŊ", "backup_settings": "čŗ‡æ–™åēĢ備äģŊč¨­åŽš", @@ -86,8 +86,8 @@ "export_config_as_json_description": "å°‡į›Žå‰įŗģįĩąč¨­åŽšä¸‹čŧ‰į‚ē JSON æĒ”æĄˆ", "external_libraries_page_description": "įŽĄį†å¤–éƒ¨åĒ’éĢ”åēĢ頁éĸ", "face_detection": "臉孔åĩæ¸Ŧ", - "face_detection_description": "äŊŋį”¨æŠŸå™¨å­¸įŋ’åĩæ¸Ŧé …į›Žä¸­įš„č‡‰å­”ã€‚å°æ–ŧåŊąį‰‡īŧŒåƒ…æœƒåˆ†æžį¸Žåœ–ã€‚ã€Œé‡æ–°æ•´į†ã€æœƒīŧˆé‡æ–°īŧ‰č™•į†æ‰€æœ‰é …į›Žīŧ›ã€Œé‡č¨­ã€å‰‡æœƒéĄå¤–æ¸…é™¤į›Žå‰įš„č‡‰å­”čŗ‡æ–™īŧ›ã€ŒæŽ’å…ĨæœĒč™•į†ã€æœƒå°‡å°šæœĒč™•į†įš„é …į›ŽåŠ å…ĨäŊ‡åˆ—ã€‚åŽŒæˆã€Œč‡‰å­”åĩæ¸Ŧ」垌īŧŒåĩæ¸Ŧåˆ°įš„č‡‰å­”å°‡åŠ å…Ĩã€Œč‡‰å­”čž¨č­˜ã€äŊ‡åˆ—īŧŒä¸Ļæ­¸éĄžč‡ŗįžæœ‰æˆ–æ–°įš„äēēį‰Šįž¤įĩ„。", - "facial_recognition_job_description": "將åĩæ¸Ŧåˆ°įš„č‡‰å­”æ­¸éĄžį‚ēäēēį‰Šã€‚æ­¤æ­ĨéŠŸæœƒåœ¨č‡‰å­”åĩæ¸ŦåŽŒæˆåžŒåŸˇčĄŒã€‚ã€Œé‡č¨­ã€æœƒé‡æ–°å°æ‰€æœ‰č‡‰å­”é€˛čĄŒåˆ†įž¤īŧ›ã€ŒæŽ’å…ĨæœĒč™•į†ã€å‰‡æœƒå°‡å°šæœĒ指洞äēēį‰Šįš„č‡‰å­”åŠ å…ĨäŊ‡åˆ—。", + "face_detection_description": "äŊŋį”¨æŠŸå™¨å­¸įŋ’åĩæ¸Ŧé …į›Žä¸­įš„č‡‰å­”ã€‚å°æ–ŧåŊąį‰‡īŧŒåƒ…æœƒåˆ†æžį¸Žåœ–ã€‚ã€Œé‡æ–°æ•´į†ã€æœƒé‡æ–°č™•į†æ‰€æœ‰é …į›Žīŧ›ã€Œé‡č¨­ã€å‰‡æœƒéĄå¤–æ¸…é™¤į›Žå‰įš„č‡‰å­”čŗ‡æ–™īŧ›ã€ŒåŠ å…ĨæŽ’į¨‹ã€æœƒå°‡å°šæœĒč™•į†įš„é …į›ŽåŠ å…Ĩåēåˆ—ã€‚åŽŒæˆã€Œč‡‰å­”åĩæ¸Ŧ」垌īŧŒåĩæ¸Ŧåˆ°įš„č‡‰å­”å°‡åŠ å…Ĩã€Œč‡‰å­”čž¨č­˜ã€æŽ’į¨‹īŧŒä¸Ļæ­¸éĄžč‡ŗįžæœ‰æˆ–æ–°įš„äēēį‰Šįž¤įĩ„。", + "facial_recognition_job_description": "將åĩæ¸Ŧåˆ°įš„č‡‰å­”æ­¸éĄžį‚ēäēēį‰Šã€‚æ­¤æ­ĨéŠŸæœƒåœ¨č‡‰å­”åĩæ¸ŦåŽŒæˆåžŒåŸˇčĄŒã€‚ã€Œé‡č¨­ã€æœƒé‡æ–°å°æ‰€æœ‰č‡‰å­”é€˛čĄŒåˆ†įž¤īŧ›ã€ŒåŠ å…ĨæŽ’į¨‹ã€å‰‡æœƒå°‡å°šæœĒ指洞äēēį‰Šįš„č‡‰å­”åŠ å…Ĩåēåˆ—。", "failed_job_command": "{job} äģģå‹™įš„ {command} 指äģ¤åŸˇčĄŒå¤ąæ•—", "force_delete_user_warning": "č­Ļ告īŧšé€™å°‡įĢ‹åŗåˆĒ除äŊŋį”¨č€…åŠå…￉€æœ‰é …į›Žã€‚æ­¤å‹•äŊœį„Ąæŗ•垊原īŧŒä¸”į„Ąæŗ•æ‰žå›žåˇ˛åˆĒé™¤įš„æĒ”æĄˆã€‚", "image_format": "æ ŧåŧ", @@ -150,7 +150,7 @@ "machine_learning_availability_checks_timeout": "čĢ‹æą‚čļ…æ™‚", "machine_learning_availability_checks_timeout_description": "å¯į”¨æ€§æĒĸæŸĨčļ…æ™‚īŧˆæ¯Ģį§’īŧ‰", "machine_learning_clip_model": "CLIP æ¨Ąåž‹", - "machine_learning_clip_model_description": "é€™čŖĄæœ‰äģŊ CLIP æ¨Ąåž‹æ¸…å–Žã€‚æŗ¨æ„īŧšæ›´æ›æ¨Ąåž‹åžŒåŋ…é ˆå°æ‰€æœ‰į›¸į‰‡é‡æ–°åŸˇčĄŒã€Œæ™ē慧搜尋」äģģ務。", + "machine_learning_clip_model_description": "在 é€™čŖĄ 列å‡ēįš„ CLIP æ¨Ąåž‹ã€‚æŗ¨æ„īŧšæ›´æ›æ¨Ąåž‹åžŒåŋ…é ˆå°æ‰€æœ‰į›¸į‰‡é‡æ–°åŸˇčĄŒã€Œæ™ē慧搜尋」äģģ務。", "machine_learning_duplicate_detection": "é‡č¤‡é …į›Žåĩæ¸Ŧ", "machine_learning_duplicate_detection_enabled": "å•Ÿį”¨é‡č¤‡é …į›Žåĩæ¸Ŧ", "machine_learning_duplicate_detection_enabled_description": "č‹Ĩåœį”¨īŧŒåŽŒå…¨į›¸åŒįš„é …į›Žäģæœƒé€˛čĄŒé‡č¤‡é …į›ŽåˆĒ除。", @@ -214,7 +214,7 @@ "map_gps_settings_description": "įŽĄį†åœ°åœ–čˆ‡ GPSīŧˆåå‘åœ°į†įˇ¨įĸŧīŧ‰č¨­åޚ", "map_implications": "地圖功čƒŊäģ°čŗ´å¤–éƒ¨åœ–įŖšæœå‹™īŧˆtiles.immich.cloudīŧ‰", "map_light_style": "æˇēč‰˛æ¨Ŗåŧ", - "map_manage_reverse_geocoding_settings": "įŽĄį†é€†å‘åœ°į†įˇ¨įĸŧč¨­åŽš", + "map_manage_reverse_geocoding_settings": "įŽĄį† é€†å‘åœ°į†įˇ¨įĸŧ č¨­åŽš", "map_reverse_geocoding": "åå‘åœ°į†įˇ¨įĸŧ", "map_reverse_geocoding_enable_description": "å•Ÿį”¨åå‘åœ°į†įˇ¨įĸŧ", "map_reverse_geocoding_settings": "åå‘åœ°į†įˇ¨įĸŧč¨­åŽš", @@ -238,7 +238,7 @@ "nightly_tasks_generate_memories_setting": "į”ĸį”Ÿå›žæ†ļ", "nightly_tasks_generate_memories_setting_description": "åžžé …į›ŽåģēįĢ‹æ–°å›žæ†ļ", "nightly_tasks_missing_thumbnails_setting": "į”ĸį”Ÿįŧēå°‘įš„į¸Žåœ–", - "nightly_tasks_missing_thumbnails_setting_description": "將įŧēå°‘į¸Žåœ–įš„é …į›ŽæŽ’å…ĨäŊ‡åˆ—äģĨį”ĸį”Ÿį¸Žåœ–", + "nightly_tasks_missing_thumbnails_setting_description": "將įŧēå°‘į¸Žåœ–įš„é …į›ŽåŠ å…ĨæŽ’į¨‹äģĨį”ĸį”Ÿį¸Žåœ–", "nightly_tasks_settings": "夜間äģģå‹™č¨­åŽš", "nightly_tasks_settings_description": "įŽĄį†å¤œé–“äģģ務", "nightly_tasks_start_time_setting": "開始時間", @@ -281,7 +281,7 @@ "oauth_role_claim_description": "æ šæ“šæ­¤åŽŖå‘Šįš„å­˜åœ¨īŧŒč‡Ē動授äēˆįŽĄį†å“ĄæŦŠé™ã€‚čŠ˛åŽŖå‘Šįš„å€ŧ可äģĨ是 'user' 或 'admin'。", "oauth_settings": "OAuth", "oauth_settings_description": "įŽĄį† OAuth į™ģå…Ĩč¨­åŽš", - "oauth_settings_more_details": "æŦ˛įž­č§Ŗæ­¤åŠŸčƒŊīŧŒčĢ‹åƒé–ąčĒĒæ˜Žæ›¸ã€‚", + "oauth_settings_more_details": "æŦ˛įž­č§Ŗæ­¤åŠŸčƒŊīŧŒčĢ‹åƒé–ą čĒĒæ˜Žæ›¸ã€‚", "oauth_storage_label_claim": "å„˛å­˜æ¨™įą¤åŽŖå‘Š", "oauth_storage_label_claim_description": "č‡Ē動將äŊŋį”¨č€…įš„å„˛å­˜æ¨™įą¤åŽšį‚ēæ­¤åŽŖå‘Šäš‹å€ŧ。", "oauth_storage_quota_claim": "å„˛å­˜é…éĄåŽŖå‘Š", @@ -297,8 +297,8 @@ "paths_validated_successfully": "æ‰€æœ‰čˇ¯åž‘éŠ—č­‰æˆåŠŸ", "person_cleanup_job": "æ¸…į†äēēį‰Š", "queue_details": "äŊ‡åˆ—čŗ‡č¨Š", - "queues": "äģģ務äŊ‡åˆ—", - "queues_page_description": "įŽĄį†č€…äŊ‡åˆ—頁éĸ", + "queues": "äģģå‹™æŽ’į¨‹", + "queues_page_description": "åēåˆ—æŽ’į¨‹įŽĄį†į•Œéĸ", "quota_size_gib": "é…éĄå¤§å°īŧˆGiBīŧ‰", "refreshing_all_libraries": "æ­Ŗåœ¨é‡æ–°æ•´į†æ‰€æœ‰åĒ’éĢ”åēĢ", "registration": "įŽĄį†č€…č¨ģ冊", @@ -333,8 +333,8 @@ "storage_template_migration_description": "åĨ—į”¨į›Žå‰įš„ {template} č‡ŗå…ˆå‰ä¸Šå‚ŗįš„é …į›Ž", "storage_template_migration_info": "å„˛å­˜į¯„æœŦ會將所有副æĒ”名čŊ‰æ›į‚ē小å¯Ģã€‚į¯„æœŦčŽŠæ›´åƒ…æœƒåĨ—į”¨č‡ŗæ–°é …į›Žã€‚č‹ĨčρčŋŊæē¯åĨ—ᔍᝄæœŦč‡ŗå…ˆå‰ä¸Šå‚ŗįš„é …į›ŽīŧŒčĢ‹åŸˇčĄŒ {job}。", "storage_template_migration_job": "å„˛å­˜į¯„æœŦ遡į§ģäŊœæĨ­", - "storage_template_more_details": "關æ–ŧ此功čƒŊįš„æ›´å¤ščŠŗį´°čŗ‡č¨ŠīŧŒčĢ‹åƒé–ąå„˛å­˜į¯„æœŦ及å…ļåŊąéŸŋ", - "storage_template_onboarding_description_v2": "å•Ÿį”¨åžŒīŧŒæ­¤åŠŸčƒŊ將䞝據äŊŋᔍ者č‡Ē荂ᝄæœŦč‡Ēå‹•æ•´į†æĒ”æĄˆã€‚æ›´å¤ščŗ‡č¨ŠčĢ‹åƒé–ąčĒĒæ˜Žæ–‡äģļ。", + "storage_template_more_details": "關æ–ŧ此功čƒŊįš„æ›´å¤ščŠŗį´°čŗ‡č¨ŠīŧŒčĢ‹åƒé–ą å„˛å­˜į¯„æœŦ 及å…ļ åŊąéŸŋ", + "storage_template_onboarding_description_v2": "å•Ÿį”¨åžŒīŧŒæ­¤åŠŸčƒŊ將䞝據äŊŋᔍ者č‡Ē荂ᝄæœŦč‡Ēå‹•æ•´į†æĒ”æĄˆã€‚æ›´å¤ščŗ‡č¨ŠčĢ‹åƒé–ą čĒĒæ˜Žæ–‡äģļ。", "storage_template_path_length": "預äŧ°čˇ¯åž‘镡åēĻ上限īŧš{length, number}/{limit, number}", "storage_template_settings": "å„˛å­˜į¯„æœŦ", "storage_template_settings_description": "įŽĄį†ä¸Šå‚ŗé …į›Žįš„čŗ‡æ–™å¤žįĩæ§‹čˆ‡æĒ”名", @@ -428,8 +428,8 @@ "user_delete_delay": "{user} įš„å¸ŗč™Ÿå’Œé …į›Žæœƒåœ¨ {delay, plural, one {# 夊} other {# 夊}} 垌永䚅åˆĒ除。", "user_delete_delay_settings": "åģļ垌åˆĒ除", "user_delete_delay_settings_description": "č‡Ēį§ģ除垌čĩˇįŽ—įš„å¤Šæ•¸īŧŒé€žæœŸåžŒå°‡æ°¸äš…åˆĒ除äŊŋį”¨č€…å¸ŗč™Ÿčˆ‡é …į›Žã€‚äŊŋᔍ者åˆĒ除äŊœæĨ­æœƒåœ¨æ¯æ—Ĩåˆå¤œåŸˇčĄŒīŧŒäģĨæĒĸæŸĨįŦĻ合åˆĒ除æĸäģļįš„å¸ŗč™Ÿã€‚æ­¤č¨­åŽšįš„čŽŠæ›´å°‡åœ¨ä¸‹ä¸€æŦĄåŸˇčĄŒæ™‚į”Ÿæ•ˆã€‚", - "user_delete_immediately": "{user} įš„å¸ŗč™Ÿčˆ‡é …į›Žå°‡įĢ‹åŗæŽ’å…Ĩ永䚅åˆĒ除äŊ‡åˆ—。", - "user_delete_immediately_checkbox": "įĢ‹åŗå°‡äŊŋį”¨č€…čˆ‡é …į›ŽæŽ’å…Ĩ永䚅åˆĒ除äŊ‡åˆ—", + "user_delete_immediately": "{user} įš„å¸ŗč™Ÿčˆ‡é …į›Žå°‡ įĢ‹åŗ 排å…Ĩ永䚅åˆĒ除åēåˆ—。", + "user_delete_immediately_checkbox": "įĢ‹åŗå°‡äŊŋį”¨č€…čˆ‡é …į›ŽæŽ’å…Ĩ永䚅åˆĒ除åēåˆ—", "user_details": "äŊŋį”¨č€…čŠŗį´°čŗ‡č¨Š", "user_management": "äŊŋį”¨č€…įŽĄį†", "user_password_has_been_reset": "äŊŋᔍ者坆įĸŧåˇ˛é‡č¨­īŧš", @@ -895,8 +895,6 @@ "deduplication_criteria_2": "EXIF čŗ‡æ–™æ•¸é‡", "deduplication_info": "é‡č¤‡čŗ‡æ–™åˆĒé™¤čŗ‡č¨Š", "deduplication_info_description": "č‹Ĩčρč‡Ēå‹•é å…ˆé¸å–é …į›Žä¸Ļ扚æŦĄį§ģé™¤é‡č¤‡é …į›ŽīŧŒæˆ‘們會æĒĸæŸĨīŧš", - "default_locale": "é č¨­åœ°å€č¨­åŽš", - "default_locale_description": "äžį…§æ‚¨įš„į€čĻŊå™¨åœ°å€č¨­åŽšæ ŧåŧåŒ–æ—ĨæœŸčˆ‡æ•¸å­—", "delete": "åˆĒ除", "delete_action_confirmation_message": "您įĸē厚čρåˆĒé™¤æ­¤é …į›Žå—ŽīŧŸæ­¤å‹•äŊœæœƒå°‡čŠ˛é …į›Žį§ģ臺äŧ翜å™¨įš„垃圞æĄļīŧŒä¸ĻčŠĸ問您是åĻčρ圍æœŦ抟同æ­ĨåˆĒ除", "delete_action_prompt": "{count} 個厞åˆĒ除", @@ -951,7 +949,7 @@ "download_action_prompt": "æ­Ŗåœ¨ä¸‹čŧ‰ {count} å€‹é …į›Ž", "download_canceled": "下čŧ‰åˇ˛å–æļˆ", "download_complete": "下čŧ‰åŽŒæˆ", - "download_enqueue": "厞加å…Ĩ下čŧ‰äŊ‡åˆ—", + "download_enqueue": "厞加å…Ĩ下čŧ‰", "download_error": "下čŧ‰æ™‚į™ŧį”ŸéŒ¯čǤ", "download_failed": "下čŧ‰å¤ąæ•—", "download_finished": "下čŧ‰åŽŒæˆ", @@ -1014,16 +1012,16 @@ "editor_rotate_left": "逆時針旋čŊ‰90åēĻ", "editor_rotate_right": "順時針旋čŊ‰90åēĻ", "email": "é›ģ子éƒĩäģļ", - "email_notifications": "Email 通įŸĨ", + "email_notifications": "é›ģ子éƒĩäģļ通įŸĨ", "empty_folder": "é€™å€‹čŗ‡æ–™å¤žæ˜¯įŠēįš„", "empty_trash": "清įŠē垃圞æĄļ", "empty_trash_confirmation": "您įĸē厚čĻæ¸…įŠē垃圞æĄļ嗎īŧŸé€™æœƒåžž Immich 永䚅į§ģ除垃圞æĄļä¸­æ‰€æœ‰įš„é …į›Žã€‚\næ‚¨į„Ąæŗ•åžŠåŽŸæ­¤å‹•äŊœīŧ", "enable": "å•Ÿį”¨", "enable_backup": "å•Ÿį”¨å‚™äģŊ", "enable_biometric_auth_description": "čŧ¸å…Ĩæ‚¨įš„ PIN įĸŧäģĨå•Ÿį”¨į”Ÿį‰Ščž¨č­˜éŠ—č­‰", - "enabled": "åˇąå•Ÿį”¨", + "enabled": "åˇ˛å•Ÿį”¨", "end_date": "įĩæŸæ—Ĩ期", - "enqueued": "åˇ˛æŽ’å…ĨäŊ‡åˆ—", + "enqueued": "åˇ˛æŽ’å…Ĩåēåˆ—", "enter_wifi_name": "čŧ¸å…Ĩ Wi-Fi åį¨ą", "enter_your_pin_code": "čŧ¸å…Ĩæ‚¨įš„ PIN įĸŧ", "enter_your_pin_code_subtitle": "čŧ¸å…Ĩæ‚¨įš„ PIN įĸŧäģĨå­˜å–ã€Œåˇ˛éŽ–åŽšã€čŗ‡æ–™å¤ž", @@ -1074,6 +1072,7 @@ "failed_to_update_notification_status": "į„Ąæŗ•æ›´æ–°é€šįŸĨį‹€æ…‹", "incorrect_email_or_password": "é›ģ子éƒĩäģ￈–密įĸŧ錯čǤ", "library_folder_already_exists": "此匯å…Ĩčˇ¯åž‘åˇ˛å­˜åœ¨ã€‚", + "page_not_found": "æœĒ扞到頁éĸ :/", "paths_validation_failed": "{paths, plural, one {# å€‹čˇ¯åž‘} other {# å€‹čˇ¯åž‘}} éŠ—č­‰å¤ąæ•—", "profile_picture_transparent_pixels": "個äēēčŗ‡æ–™åœ–į‰‡ä¸čƒŊ有透明į•Ģį´ ã€‚čĢ‹æ”žå¤§ä¸Ļ/或į§ģ動åŊąåƒã€‚", "quota_higher_than_disk_size": "æ‚¨č¨­åŽšįš„é…éĄå¤§æ–ŧ᪁įĸŸåŽšé‡", @@ -1218,6 +1217,7 @@ "filter_description": "į¯Šé¸į›Žæ¨™é …į›Žįš„æĸäģļ", "filter_people": "į¯Šé¸äēēį‰Š", "filter_places": "į¯Šé¸åœ°éģž", + "filter_tags": "į¯Šé¸æ¨™įą¤", "filters": "į¯Šé¸å™¨", "find_them_fast": "透過搜尋姓名åŋĢ速扞到äģ–們", "first": "įŦŦ一個", @@ -1564,7 +1564,7 @@ "network_requirement_photos_upload": "äŊŋį”¨čĄŒå‹•įļ˛čˇ¯æĩé‡å‚™äģŊᛏቇ", "network_requirement_videos_upload": "äŊŋį”¨čĄŒå‹•įļ˛čˇ¯æĩé‡å‚™äģŊåŊąį‰‡", "network_requirements": "įļ˛čˇ¯čĻæą‚", - "network_requirements_updated": "įļ˛čˇ¯éœ€æą‚åˇ˛čŽŠæ›´īŧŒæ­Ŗåœ¨é‡č¨­å‚™äģŊäŊ‡åˆ—", + "network_requirements_updated": "įļ˛čˇ¯éœ€æą‚åˇ˛čŽŠæ›´īŧŒæ­Ŗåœ¨é‡č¨­å‚™äģŊåēåˆ—", "networking_settings": "įļ˛čˇ¯", "networking_subtitle": "įŽĄį†äŧ翜å™¨į̝éģžč¨­åޚ", "never": "æ°¸ä¸å¤ąæ•ˆ", @@ -1808,9 +1808,8 @@ "rate_asset": "é …į›ŽčŠ•åˆ†", "rating": "čŠ•æ˜Ÿ", "rating_clear": "æ¸…é™¤čŠ•į­‰", - "rating_count": "{count, plural, other {# 星}}", + "rating_count": "{count, plural, =0 {Unrated} other {# 星}}", "rating_description": "åœ¨čŗ‡č¨Šéĸæŋä¸­éĄ¯į¤ē EXIF čŠ•į­‰", - "rating_set": "åˇ˛č¨­åŽšį‚ē{rating, plural, one {# 星} other {# 星}}", "reaction_options": "反應選項", "read_changelog": "閱čĻŊæ›´æ–°į´€éŒ„", "readonly_mode_disabled": "å”¯čŽ€æ¨Ąåŧåˇ˛åœį”¨", @@ -1882,7 +1881,10 @@ "reset_pin_code_success": "PIN įĸŧåˇ˛æˆåŠŸé‡č¨­", "reset_pin_code_with_password": "您可隨時äŊŋį”¨æ‚¨įš„å¯†įĸŧ來重設 PIN įĸŧ", "reset_sqlite": "重設 SQLite čŗ‡æ–™åēĢ", - "reset_sqlite_confirmation": "įĸē厚čĻé‡č¨­ SQLite čŗ‡æ–™åēĢ嗎īŧŸæ‚¨éœ€čρį™ģå‡ēä¸Ļ重新į™ģå…Ĩ才čƒŊ重新同æ­Ĩčŗ‡æ–™", + "reset_sqlite_clear_app_data": "清除數據", + "reset_sqlite_confirmation": "įĸē厚čĻé‡č¨­æ‰€æœ‰æ•¸æ“šå—ŽīŧŸäŊ įš„æ‰€æœ‰č¨­įŊŽå°‡čĸĢ重設īŧŒä¸”äŊ æœƒčĸĢį™ģå‡ē。", + "reset_sqlite_confirmation_note": "æŗ¨æ„īŧšäŊ éœ€čĻåœ¨æ¸…é™¤æ•¸æ“šåžŒé‡æ–°é–‹å•Ÿæ‡‰į”¨ã€‚", + "reset_sqlite_done": "æ•¸æ“šåˇ˛æ¸…é™¤ã€‚čĢ‹é‡å•ŸImmich及重新į™ģ錄。", "reset_sqlite_success": "åˇ˛æˆåŠŸé‡č¨­ SQLite čŗ‡æ–™åēĢ", "reset_to_default": "重設į‚ē預設å€ŧ", "resolution": "č§ŖæžåēĻ", @@ -1910,6 +1912,7 @@ "saved_settings": "åˇ˛å„˛å­˜č¨­åŽš", "say_something": "čĒĒčĒĒæ‚¨įš„æƒŗæŗ•吧", "scaffold_body_error_occurred": "į™ŧį”ŸéŒ¯čǤ", + "scaffold_body_error_unrecoverable": "į™ŧį”Ÿį„Ąæŗ•æĸåžŠįš„éŒ¯čĒ¤ã€‚čĢ‹åœ¨ Discord 或 Github 上分äēĢ錯čǤäŋĄæ¯åŠå †į–ŠčŋŊ蚤īŧŒäģĨäžŋ我們提䞛協劊。在čĸĢåģēč­°įš„æƒ…æŗä¸‹äŊ å¯äģĨ在下斚嘗čŠĻæ¸…é™¤į¨‹åŧæ•¸æ“šã€‚", "scan": "掃描", "scan_all_libraries": "æŽƒææ‰€æœ‰į›¸į°ŋ", "scan_library": "掃描", @@ -1945,6 +1948,7 @@ "search_filter_ocr": "透過OCR搜尋", "search_filter_people_title": "選擇äēēį‰Š", "search_filter_star_rating": "čŠ•åˆ†", + "search_filter_tags_title": "é¸æ“‡æ¨™įą¤", "search_for": "搜尋", "search_for_existing_person": "æœå°‹įžæœ‰äēēį‰Š", "search_no_more_result": "į„Ąæ›´å¤šįĩæžœ", @@ -2024,6 +2028,9 @@ "set_profile_picture": "č¨­åŽšå€‹äēēčŗ‡æ–™åœ–į‰‡", "set_slideshow_to_fullscreen": "äģĨ全čžĸ嚕攞映åšģį‡ˆį‰‡", "set_stack_primary_asset": "č¨­åŽšå †į–Šįš„éĻ–čĻé …į›Ž", + "setting_image_navigation_enable_subtitle": "開啟垌äģĨ觸įĸ°åąåš•åˇĻ/åŗé‚ŠįˇŖå€åŸŸįš„æ–šåŧåˆ‡æ›ä¸Š/ä¸‹åœ–į‰‡ã€‚", + "setting_image_navigation_enable_title": "éģžæ“Šåˆ‡æ›", + "setting_image_navigation_title": "åœ–į‰‡å°Žåŧ•", "setting_image_viewer_help": "čŠŗį´°čŗ‡č¨ŠæĒĸčĻ–å™¨æœƒäžåēčŧ‰å…Ĩå°åž‹į¸Žåœ–ã€ä¸­į­‰å°ē寸預čĻŊ圖īŧˆč‹Ĩå•Ÿį”¨īŧ‰īŧŒæœ€åžŒčŧ‰å…ĨåŽŸå§‹į›¸į‰‡ã€‚", "setting_image_viewer_original_subtitle": "å•Ÿį”¨äģĨčŧ‰å…ĨåŽŸå§‹å…¨č§ŖæžåēĻåœ–į‰‡īŧˆæĒ”æĄˆčŧƒå¤§īŧīŧ‰ã€‚åœį”¨äģĨ減少æĩé‡äŊŋᔍīŧˆåŒ…æ‹Ŧįļ˛čˇ¯å‚ŗčŧ¸čˆ‡čŖįŊŽåŋĢ取īŧ‰ã€‚", "setting_image_viewer_original_title": "čŧ‰å…Ĩ原圖", @@ -2302,6 +2309,7 @@ "unstack_action_prompt": "{count} 個取æļˆå †į–Š", "unstacked_assets_count": "åˇ˛č§Ŗé™¤å †į–Š {count, plural, other {# 個æĒ”æĄˆ}}", "unsupported_field_type": "ä¸æ”¯æ´įš„æŦ„äŊéĄžåž‹", + "unsupported_file_type": "不支持 {type} éĄžåž‹įš„æĒ”æĄˆīŧŒį„Ąæŗ•ä¸Šå‚ŗ {file} 文äģļ。", "untagged": "į„Ąæ¨™įą¤", "untitled_workflow": "æœĒå‘Ŋ名åˇĨäŊœæĩį¨‹", "up_next": "下一個", @@ -2328,6 +2336,7 @@ "url": "įļ˛å€", "usage": "į”¨é‡", "use_biometric": "äŊŋį”¨į”Ÿį‰Ščž¨č­˜", + "use_browser_locale": "äŊŋį”¨į€čĻŊ器čĒžč¨€", "use_current_connection": "äŊŋį”¨į›Žå‰įš„é€Ŗįˇš", "use_custom_date_range": "æ”šį”¨č‡Ē訂æ—ĨæœŸį¯„åœ", "user": "äŊŋᔍ者", @@ -2344,7 +2353,7 @@ "user_usage_stats": "å¸ŗč™ŸäŊŋį”¨é‡įĩąč¨ˆ", "user_usage_stats_description": "æĒĸčĻ–å¸ŗč™ŸäŊŋį”¨é‡", "username": "äŊŋį”¨č€…åį¨ą", - "users": "admin", + "users": "äŊŋᔍ者", "users_added_to_album_count": "åˇ˛åœ¨æ­¤į›¸į°ŋ中新åĸžäē† {count, plural, one {# 個} other {# 個}} äŊŋᔍ者", "utilities": "åˇĨå…ˇ", "validate": "驗證", diff --git a/machine-learning/pyproject.toml b/machine-learning/pyproject.toml index e3ce9c002f..fd6b61d6c2 100644 --- a/machine-learning/pyproject.toml +++ b/machine-learning/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "immich-ml" -version = "2.5.6" +version = "2.6.3" description = "" authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }] requires-python = ">=3.11,<4.0" diff --git a/machine-learning/uv.lock b/machine-learning/uv.lock index 5f87a59fa6..e07f942312 100644 --- a/machine-learning/uv.lock +++ b/machine-learning/uv.lock @@ -898,7 +898,7 @@ wheels = [ [[package]] name = "immich-ml" -version = "2.5.6" +version = "2.6.3" source = { editable = "." } dependencies = [ { name = "aiocache" }, diff --git a/mise.toml b/mise.toml index 0ec32de20c..90cc03a50f 100644 --- a/mise.toml +++ b/mise.toml @@ -14,9 +14,9 @@ config_roots = [ ] [tools] -node = "24.13.1" +node = "24.14.1" flutter = "3.35.7" -pnpm = "10.30.3" +pnpm = "10.32.1" terragrunt = "0.99.4" opentofu = "1.11.5" java = "21.0.2" diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index bd90986f60..103cf79e4e 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -113,6 +113,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "com.squareup.okhttp3:okhttp:$okhttp_version" implementation 'org.chromium.net:cronet-embedded:143.7445.0' + implementation("androidx.media3:media3-datasource-okhttp:1.9.2") + implementation("androidx.media3:media3-datasource-cronet:1.9.2") implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" implementation "androidx.work:work-runtime-ktx:$work_version" implementation "androidx.concurrent:concurrent-futures:$concurrent_version" diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt index a85929a0e9..06649de8f0 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt @@ -12,6 +12,7 @@ import app.alextran.immich.connectivity.ConnectivityApiImpl import app.alextran.immich.core.HttpClientManager import app.alextran.immich.core.ImmichPlugin import app.alextran.immich.core.NetworkApiPlugin +import me.albemala.native_video_player.NativeVideoPlayerPlugin import app.alextran.immich.images.LocalImageApi import app.alextran.immich.images.LocalImagesImpl import app.alextran.immich.images.RemoteImageApi @@ -31,6 +32,7 @@ class MainActivity : FlutterFragmentActivity() { companion object { fun registerPlugins(ctx: Context, flutterEngine: FlutterEngine) { HttpClientManager.initialize(ctx) + NativeVideoPlayerPlugin.dataSourceFactory = HttpClientManager::createDataSourceFactory flutterEngine.plugins.add(NetworkApiPlugin()) val messenger = flutterEngine.dartExecutor.binaryMessenger diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/core/HttpClientManager.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/core/HttpClientManager.kt index 180ae4735d..cefdf4fbd2 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/core/HttpClientManager.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/core/HttpClientManager.kt @@ -3,7 +3,13 @@ package app.alextran.immich.core import android.content.Context import android.content.SharedPreferences import android.security.KeyChain +import androidx.annotation.OptIn import androidx.core.content.edit +import androidx.media3.common.util.UnstableApi +import androidx.media3.datasource.DataSource +import androidx.media3.datasource.ResolvingDataSource +import androidx.media3.datasource.cronet.CronetDataSource +import androidx.media3.datasource.okhttp.OkHttpDataSource import app.alextran.immich.BuildConfig import app.alextran.immich.NativeBuffer import okhttp3.Cache @@ -16,15 +22,30 @@ import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.OkHttpClient +import org.chromium.net.CronetEngine +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import java.io.ByteArrayInputStream import java.io.File +import java.io.IOException +import java.nio.file.FileVisitResult +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.SimpleFileVisitor +import java.nio.file.attribute.BasicFileAttributes +import java.net.Authenticator +import java.net.CookieHandler +import java.net.PasswordAuthentication import java.net.Socket +import java.net.URI import java.security.KeyStore import java.security.Principal import java.security.PrivateKey import java.security.cert.X509Certificate +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import javax.net.ssl.HttpsURLConnection import javax.net.ssl.SSLContext @@ -56,6 +77,7 @@ private enum class AuthCookie(val cookieName: String, val httpOnly: Boolean) { */ object HttpClientManager { private const val CACHE_SIZE_BYTES = 100L * 1024 * 1024 // 100MiB + const val MEDIA_CACHE_SIZE_BYTES = 1024L * 1024 * 1024 // 1GiB private const val KEEP_ALIVE_CONNECTIONS = 10 private const val KEEP_ALIVE_DURATION_MINUTES = 5L private const val MAX_REQUESTS_PER_HOST = 64 @@ -67,6 +89,11 @@ object HttpClientManager { private lateinit var appContext: Context private lateinit var prefs: SharedPreferences + var cronetEngine: CronetEngine? = null + private set + private lateinit var cronetStorageDir: File + val cronetExecutor: ExecutorService = Executors.newFixedThreadPool(4) + private val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) } var keyChainAlias: String? = null @@ -89,6 +116,25 @@ object HttpClientManager { keyChainAlias = prefs.getString(PREFS_CERT_ALIAS, null) cookieJar.init(prefs) + System.setProperty("http.agent", USER_AGENT) + Authenticator.setDefault(object : Authenticator() { + override fun getPasswordAuthentication(): PasswordAuthentication? { + val url = requestingURL ?: return null + if (url.userInfo.isNullOrEmpty()) return null + val parts = url.userInfo.split(":", limit = 2) + return PasswordAuthentication(parts[0], parts.getOrElse(1) { "" }.toCharArray()) + } + }) + CookieHandler.setDefault(object : CookieHandler() { + override fun get(uri: URI, requestHeaders: Map>): Map> { + val httpUrl = uri.toString().toHttpUrlOrNull() ?: return emptyMap() + val cookies = cookieJar.loadForRequest(httpUrl) + if (cookies.isEmpty()) return emptyMap() + return mapOf("Cookie" to listOf(cookies.joinToString("; ") { "${it.name}=${it.value}" })) + } + + override fun put(uri: URI, responseHeaders: Map>) {} + }) val savedHeaders = prefs.getString(PREFS_HEADERS, null) if (savedHeaders != null) { @@ -107,6 +153,10 @@ object HttpClientManager { val cacheDir = File(File(context.cacheDir, "okhttp"), "api") client = build(cacheDir) + + cronetStorageDir = File(context.cacheDir, "cronet").apply { mkdirs() } + cronetEngine = buildCronetEngine() + initialized = true } } @@ -223,6 +273,77 @@ object HttpClientManager { ?.joinToString("; ") { "${it.name}=${it.value}" } } + fun getAuthHeaders(url: String): Map { + val result = mutableMapOf() + headers.forEach { (key, value) -> result[key] = value } + loadCookieHeader(url)?.let { result["Cookie"] = it } + url.toHttpUrlOrNull()?.let { httpUrl -> + if (httpUrl.username.isNotEmpty()) { + result["Authorization"] = Credentials.basic(httpUrl.username, httpUrl.password) + } + } + return result + } + + suspend fun rebuildCronetEngine(): Result { + return runCatching { + cronetEngine?.shutdown() + val deletionResult = deleteFolderAndGetSize(cronetStoragePath.toPath()) + cronetEngine = buildCronetEngine() + deletionResult + } + } + + val cronetStoragePath: File get() = cronetStorageDir + + @OptIn(UnstableApi::class) + fun createDataSourceFactory(headers: Map): DataSource.Factory { + return if (isMtls) { + OkHttpDataSource.Factory(client.newBuilder().cache(null).build()) + } else { + ResolvingDataSource.Factory( + CronetDataSource.Factory(cronetEngine!!, cronetExecutor) + ) { dataSpec -> + val newHeaders = dataSpec.httpRequestHeaders.toMutableMap() + newHeaders.putAll(getAuthHeaders(dataSpec.uri.toString())) + newHeaders["Cache-Control"] = "no-store" + dataSpec.buildUpon().setHttpRequestHeaders(newHeaders).build() + } + } + } + + fun buildCronetEngine(): CronetEngine { + return CronetEngine.Builder(appContext) + .enableHttp2(true) + .enableQuic(true) + .enableBrotli(true) + .setStoragePath(cronetStorageDir.absolutePath) + .setUserAgent(USER_AGENT) + .enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK, MEDIA_CACHE_SIZE_BYTES) + .build() + } + + private suspend fun deleteFolderAndGetSize(root: Path): Long = withContext(Dispatchers.IO) { + var totalSize = 0L + + Files.walkFileTree(root, object : SimpleFileVisitor() { + override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult { + totalSize += attrs.size() + Files.delete(file) + return FileVisitResult.CONTINUE + } + + override fun postVisitDirectory(dir: Path, exc: IOException?): FileVisitResult { + if (dir != root) { + Files.delete(dir) + } + return FileVisitResult.CONTINUE + } + }) + + totalSize + } + private fun build(cacheDir: File): OkHttpClient { val connectionPool = ConnectionPool( maxIdleConnections = KEEP_ALIVE_CONNECTIONS, diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/images/RemoteImagesImpl.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/images/RemoteImagesImpl.kt index b820b45425..9255eff44b 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/images/RemoteImagesImpl.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/images/RemoteImagesImpl.kt @@ -7,7 +7,6 @@ import app.alextran.immich.INITIAL_BUFFER_SIZE import app.alextran.immich.NativeBuffer import app.alextran.immich.NativeByteBuffer import app.alextran.immich.core.HttpClientManager -import app.alextran.immich.core.USER_AGENT import kotlinx.coroutines.* import okhttp3.Cache import okhttp3.Call @@ -15,9 +14,6 @@ import okhttp3.Callback import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response -import okhttp3.Credentials -import okhttp3.HttpUrl.Companion.toHttpUrlOrNull -import org.chromium.net.CronetEngine import org.chromium.net.CronetException import org.chromium.net.UrlRequest import org.chromium.net.UrlResponseInfo @@ -25,16 +21,7 @@ import java.io.EOFException import java.io.File import java.io.IOException import java.nio.ByteBuffer -import java.nio.file.FileVisitResult -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.SimpleFileVisitor -import java.nio.file.attribute.BasicFileAttributes import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.Executors - - -private const val CACHE_SIZE_BYTES = 1024L * 1024 * 1024 private class RemoteRequest(val cancellationSignal: CancellationSignal) @@ -101,7 +88,6 @@ class RemoteImagesImpl(context: Context) : RemoteImageApi { } private object ImageFetcherManager { - private lateinit var appContext: Context private lateinit var cacheDir: File private lateinit var fetcher: ImageFetcher private var initialized = false @@ -110,7 +96,6 @@ private object ImageFetcherManager { if (initialized) return synchronized(this) { if (initialized) return - appContext = context.applicationContext cacheDir = context.cacheDir fetcher = build() HttpClientManager.addClientChangedListener(::invalidate) @@ -143,7 +128,7 @@ private object ImageFetcherManager { return if (HttpClientManager.isMtls) { OkHttpImageFetcher.create(cacheDir) } else { - CronetImageFetcher(appContext, cacheDir) + CronetImageFetcher() } } } @@ -161,19 +146,11 @@ private sealed interface ImageFetcher { fun clearCache(onCleared: (Result) -> Unit) } -private class CronetImageFetcher(context: Context, cacheDir: File) : ImageFetcher { - private val ctx = context - private var engine: CronetEngine - private val executor = Executors.newFixedThreadPool(4) +private class CronetImageFetcher : ImageFetcher { private val stateLock = Any() private var activeCount = 0 private var draining = false private var onCacheCleared: ((Result) -> Unit)? = null - private val storageDir = File(cacheDir, "cronet").apply { mkdirs() } - - init { - engine = build(context) - } override fun fetch( url: String, @@ -190,30 +167,16 @@ private class CronetImageFetcher(context: Context, cacheDir: File) : ImageFetche } val callback = FetchCallback(onSuccess, onFailure, ::onComplete) - val requestBuilder = engine.newUrlRequestBuilder(url, callback, executor) - HttpClientManager.headers.forEach { (key, value) -> requestBuilder.addHeader(key, value) } - HttpClientManager.loadCookieHeader(url)?.let { requestBuilder.addHeader("Cookie", it) } - url.toHttpUrlOrNull()?.let { httpUrl -> - if (httpUrl.username.isNotEmpty()) { - requestBuilder.addHeader("Authorization", Credentials.basic(httpUrl.username, httpUrl.password)) - } + val requestBuilder = HttpClientManager.cronetEngine!! + .newUrlRequestBuilder(url, callback, HttpClientManager.cronetExecutor) + HttpClientManager.getAuthHeaders(url).forEach { (key, value) -> + requestBuilder.addHeader(key, value) } val request = requestBuilder.build() signal.setOnCancelListener(request::cancel) request.start() } - private fun build(ctx: Context): CronetEngine { - return CronetEngine.Builder(ctx) - .enableHttp2(true) - .enableQuic(true) - .enableBrotli(true) - .setStoragePath(storageDir.absolutePath) - .setUserAgent(USER_AGENT) - .enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK, CACHE_SIZE_BYTES) - .build() - } - private fun onComplete() { val didDrain = synchronized(stateLock) { activeCount-- @@ -236,22 +199,16 @@ private class CronetImageFetcher(context: Context, cacheDir: File) : ImageFetche } private fun onDrained() { - engine.shutdown() val onCacheCleared = synchronized(stateLock) { - val onCacheCleared = onCacheCleared + val onCacheCleared = this.onCacheCleared this.onCacheCleared = null onCacheCleared - } - if (onCacheCleared == null) { - executor.shutdown() - } else { - CoroutineScope(Dispatchers.IO).launch { - val result = runCatching { deleteFolderAndGetSize(storageDir.toPath()) } - // Cronet is very good at self-repair, so it shouldn't fail here regardless of clear result - engine = build(ctx) - synchronized(stateLock) { draining = false } - onCacheCleared(result) - } + } ?: return + + CoroutineScope(Dispatchers.IO).launch { + val result = HttpClientManager.rebuildCronetEngine() + synchronized(stateLock) { draining = false } + onCacheCleared(result) } } @@ -341,26 +298,6 @@ private class CronetImageFetcher(context: Context, cacheDir: File) : ImageFetche } } - suspend fun deleteFolderAndGetSize(root: Path): Long = withContext(Dispatchers.IO) { - var totalSize = 0L - - Files.walkFileTree(root, object : SimpleFileVisitor() { - override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult { - totalSize += attrs.size() - Files.delete(file) - return FileVisitResult.CONTINUE - } - - override fun postVisitDirectory(dir: Path, exc: IOException?): FileVisitResult { - if (dir != root) { - Files.delete(dir) - } - return FileVisitResult.CONTINUE - } - }) - - totalSize - } } private class OkHttpImageFetcher private constructor( @@ -375,7 +312,7 @@ private class OkHttpImageFetcher private constructor( val dir = File(cacheDir, "okhttp") val client = HttpClientManager.getClient().newBuilder() - .cache(Cache(File(dir, "thumbnails"), CACHE_SIZE_BYTES)) + .cache(Cache(File(dir, "thumbnails"), HttpClientManager.MEDIA_CACHE_SIZE_BYTES)) .build() return OkHttpImageFetcher(client) diff --git a/mobile/android/fastlane/Fastfile b/mobile/android/fastlane/Fastfile index 14a6b4b660..279b985cfe 100644 --- a/mobile/android/fastlane/Fastfile +++ b/mobile/android/fastlane/Fastfile @@ -35,8 +35,8 @@ platform :android do task: 'bundle', build_type: 'Release', properties: { - "android.injected.version.code" => 3037, - "android.injected.version.name" => "2.5.6", + "android.injected.version.code" => 3041, + "android.injected.version.name" => "2.6.3", } ) upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab') diff --git a/mobile/ios/Runner/AppDelegate.swift b/mobile/ios/Runner/AppDelegate.swift index f842285b23..81af41ab08 100644 --- a/mobile/ios/Runner/AppDelegate.swift +++ b/mobile/ios/Runner/AppDelegate.swift @@ -1,5 +1,6 @@ import BackgroundTasks import Flutter +import native_video_player import network_info_plus import path_provider_foundation import permission_handler_apple @@ -18,6 +19,8 @@ import UIKit UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate } + SwiftNativeVideoPlayerPlugin.cookieStorage = URLSessionManager.cookieStorage + URLSessionManager.patchBackgroundDownloader() GeneratedPluginRegistrant.register(with: self) let controller: FlutterViewController = window?.rootViewController as! FlutterViewController AppDelegate.registerPlugins(with: controller.engine, controller: controller) diff --git a/mobile/ios/Runner/Core/URLSessionManager.swift b/mobile/ios/Runner/Core/URLSessionManager.swift index 9868d4eb59..9eb93f9ff9 100644 --- a/mobile/ios/Runner/Core/URLSessionManager.swift +++ b/mobile/ios/Runner/Core/URLSessionManager.swift @@ -51,7 +51,7 @@ class URLSessionManager: NSObject { diskCapacity: 1024 * 1024 * 1024, directory: cacheDir ) - private static let userAgent: String = { + static let userAgent: String = { let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "unknown" return "Immich_iOS_\(version)" }() @@ -150,7 +150,6 @@ class URLSessionManager: NSObject { config.httpCookieStorage = cookieStorage config.httpMaximumConnectionsPerHost = 64 config.timeoutIntervalForRequest = 60 - config.timeoutIntervalForResource = 300 var headers = UserDefaults.group.dictionary(forKey: HEADERS_KEY) as? [String: String] ?? [:] headers["User-Agent"] = headers["User-Agent"] ?? userAgent @@ -158,6 +157,49 @@ class URLSessionManager: NSObject { return URLSession(configuration: config, delegate: delegate, delegateQueue: nil) } + + /// Patches background_downloader's URLSession to use shared auth configuration. + /// Must be called before background_downloader creates its session (i.e. early in app startup). + static func patchBackgroundDownloader() { + // Swizzle URLSessionConfiguration.background(withIdentifier:) to inject shared config + let originalSel = NSSelectorFromString("backgroundSessionConfigurationWithIdentifier:") + let swizzledSel = #selector(URLSessionConfiguration.immich_background(withIdentifier:)) + if let original = class_getClassMethod(URLSessionConfiguration.self, originalSel), + let swizzled = class_getClassMethod(URLSessionConfiguration.self, swizzledSel) { + method_exchangeImplementations(original, swizzled) + } + + // Add auth challenge handling to background_downloader's UrlSessionDelegate + guard let targetClass = NSClassFromString("background_downloader.UrlSessionDelegate") else { return } + + let sessionBlock: @convention(block) (AnyObject, URLSession, URLAuthenticationChallenge, + @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void + = { _, session, challenge, completion in + URLSessionManager.shared.delegate.handleChallenge(session, challenge, completion) + } + class_replaceMethod(targetClass, + NSSelectorFromString("URLSession:didReceiveChallenge:completionHandler:"), + imp_implementationWithBlock(sessionBlock), "v@:@@@?") + + let taskBlock: @convention(block) (AnyObject, URLSession, URLSessionTask, URLAuthenticationChallenge, + @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void + = { _, session, task, challenge, completion in + URLSessionManager.shared.delegate.handleChallenge(session, challenge, completion, task: task) + } + class_replaceMethod(targetClass, + NSSelectorFromString("URLSession:task:didReceiveChallenge:completionHandler:"), + imp_implementationWithBlock(taskBlock), "v@:@@@@?") + } +} + +private extension URLSessionConfiguration { + @objc dynamic class func immich_background(withIdentifier id: String) -> URLSessionConfiguration { + // After swizzle, this calls the original implementation + let config = immich_background(withIdentifier: id) + config.httpCookieStorage = URLSessionManager.cookieStorage + config.httpAdditionalHeaders = ["User-Agent": URLSessionManager.userAgent] + return config + } } class URLSessionManagerDelegate: NSObject, URLSessionTaskDelegate, URLSessionWebSocketDelegate { @@ -168,7 +210,7 @@ class URLSessionManagerDelegate: NSObject, URLSessionTaskDelegate, URLSessionWeb ) { handleChallenge(session, challenge, completionHandler) } - + func urlSession( _ session: URLSession, task: URLSessionTask, @@ -177,7 +219,7 @@ class URLSessionManagerDelegate: NSObject, URLSessionTaskDelegate, URLSessionWeb ) { handleChallenge(session, challenge, completionHandler, task: task) } - + func handleChallenge( _ session: URLSession, _ challenge: URLAuthenticationChallenge, @@ -190,7 +232,7 @@ class URLSessionManagerDelegate: NSObject, URLSessionTaskDelegate, URLSessionWeb default: completionHandler(.performDefaultHandling, nil) } } - + private func handleClientCertificate( _ session: URLSession, completion: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void @@ -200,7 +242,7 @@ class URLSessionManagerDelegate: NSObject, URLSessionTaskDelegate, URLSessionWeb kSecAttrLabel as String: CLIENT_CERT_LABEL, kSecReturnRef as String: true, ] - + var item: CFTypeRef? let status = SecItemCopyMatching(query as CFDictionary, &item) if status == errSecSuccess, let identity = item { @@ -214,7 +256,7 @@ class URLSessionManagerDelegate: NSObject, URLSessionTaskDelegate, URLSessionWeb } completion(.performDefaultHandling, nil) } - + private func handleBasicAuth( _ session: URLSession, task: URLSessionTask?, diff --git a/mobile/ios/Runner/Info.plist b/mobile/ios/Runner/Info.plist index 1557d7f701..1bf52807f9 100644 --- a/mobile/ios/Runner/Info.plist +++ b/mobile/ios/Runner/Info.plist @@ -80,7 +80,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.5.6 + 2.6.3 CFBundleSignature ???? CFBundleURLTypes diff --git a/mobile/lib/constants/locales.dart b/mobile/lib/constants/locales.dart index e20f037beb..f44aa5cc3e 100644 --- a/mobile/lib/constants/locales.dart +++ b/mobile/lib/constants/locales.dart @@ -7,7 +7,7 @@ const Map locales = { 'Arabic (ar)': Locale('ar'), 'Bulgarian (bg)': Locale('bg'), 'Catalan (ca)': Locale('ca'), - 'Chinese Simplified (zh_CN)': Locale.fromSubtags(languageCode: 'zh', scriptCode: 'SIMPLIFIED'), + 'Chinese Simplified (zh_CN)': Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'), 'Chinese Traditional (zh_TW)': Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'), 'Croatian (hr)': Locale('hr'), 'Czech (cs)': Locale('cs'), diff --git a/mobile/lib/infrastructure/repositories/network.repository.dart b/mobile/lib/infrastructure/repositories/network.repository.dart index bb5796e220..75f7850168 100644 --- a/mobile/lib/infrastructure/repositories/network.repository.dart +++ b/mobile/lib/infrastructure/repositories/network.repository.dart @@ -22,7 +22,14 @@ class NetworkRepository { final session = URLSession.fromRawPointer(clientPointer.cast()); _client = CupertinoClient.fromSharedSession(session); } else { - _client = OkHttpClient.fromJniGlobalRef(clientPointer); + _client = OkHttpClient.fromJniGlobalRef( + clientPointer, + configuration: const OkHttpClientConfiguration( + connectTimeout: Duration(seconds: 30), + readTimeout: Duration(seconds: 60), + writeTimeout: Duration(seconds: 60), + ), + ); } } diff --git a/mobile/lib/presentation/pages/drift_memory.page.dart b/mobile/lib/presentation/pages/drift_memory.page.dart index 3f8879c91d..846f062501 100644 --- a/mobile/lib/presentation/pages/drift_memory.page.dart +++ b/mobile/lib/presentation/pages/drift_memory.page.dart @@ -207,6 +207,11 @@ class DriftMemoryPage extends HookConsumerWidget { WidgetsBinding.instance.addPostFrameCallback((_) { DriftMemoryPage.setMemory(ref, memories[pageNumber]); }); + + // Update currentAsset to the first asset of the new memory + if (memories[pageNumber].assets.isNotEmpty) { + currentAsset.value = memories[pageNumber].assets.first; + } } currentAssetPage.value = 0; diff --git a/mobile/lib/presentation/pages/drift_people_collection.page.dart b/mobile/lib/presentation/pages/drift_people_collection.page.dart index f73dac3af2..d34ce3e776 100644 --- a/mobile/lib/presentation/pages/drift_people_collection.page.dart +++ b/mobile/lib/presentation/pages/drift_people_collection.page.dart @@ -79,6 +79,7 @@ class _DriftPeopleCollectionPageState extends ConsumerState(null); + final hasRequestedSearch = useState(false); final dateInputFilter = useState(null); final peopleCurrentFilterWidget = useState(null); @@ -91,9 +92,11 @@ class DriftSearchPage extends HookConsumerWidget { if (filter.isEmpty) { previousFilter.value = null; + hasRequestedSearch.value = false; return; } + hasRequestedSearch.value = true; unawaited(ref.read(paginatedSearchProvider.notifier).search(filter)); previousFilter.value = filter; } @@ -107,6 +110,8 @@ class DriftSearchPage extends HookConsumerWidget { searchPreFilter() { if (preFilter != null) { Future.delayed(Duration.zero, () { + filter.value = preFilter; + textSearchController.clear(); searchFilter(preFilter); if (preFilter.location.city != null) { @@ -719,7 +724,7 @@ class DriftSearchPage extends HookConsumerWidget { ), ), ), - if (filter.value.isEmpty) + if (!hasRequestedSearch.value) const _SearchSuggestions() else _SearchResultGrid(onScrollEnd: loadMoreSearchResults), diff --git a/mobile/lib/presentation/widgets/action_buttons/archive_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/archive_action_button.widget.dart index 7c7e96c1c5..a673dff1d7 100644 --- a/mobile/lib/presentation/widgets/action_buttons/archive_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/archive_action_button.widget.dart @@ -14,13 +14,13 @@ import 'package:immich_mobile/widgets/common/immich_toast.dart'; Future performArchiveAction(BuildContext context, WidgetRef ref, {required ActionSource source}) async { if (!context.mounted) return; - final result = await ref.read(actionProvider.notifier).archive(source); - ref.read(multiSelectProvider.notifier).reset(); - if (source == ActionSource.viewer) { EventStream.shared.emit(const ViewerReloadAssetEvent()); } + final result = await ref.read(actionProvider.notifier).archive(source); + ref.read(multiSelectProvider.notifier).reset(); + final successMessage = 'archive_action_prompt'.t(context: context, args: {'count': result.count.toString()}); if (context.mounted) { diff --git a/mobile/lib/presentation/widgets/action_buttons/delete_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/delete_action_button.widget.dart index 94ee1b2343..2121ef3159 100644 --- a/mobile/lib/presentation/widgets/action_buttons/delete_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/delete_action_button.widget.dart @@ -57,13 +57,13 @@ class DeleteActionButton extends ConsumerWidget { if (confirm != true) return; } - final result = await ref.read(actionProvider.notifier).trashRemoteAndDeleteLocal(source); - ref.read(multiSelectProvider.notifier).reset(); - if (source == ActionSource.viewer) { EventStream.shared.emit(const ViewerReloadAssetEvent()); } + final result = await ref.read(actionProvider.notifier).trashRemoteAndDeleteLocal(source); + ref.read(multiSelectProvider.notifier).reset(); + final successMessage = 'delete_action_prompt'.t(context: context, args: {'count': result.count.toString()}); if (context.mounted) { diff --git a/mobile/lib/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart index 710ec506c2..27a1a4d8af 100644 --- a/mobile/lib/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart @@ -35,13 +35,13 @@ class DeletePermanentActionButton extends ConsumerWidget { false; if (!confirm) return; - final result = await ref.read(actionProvider.notifier).deleteRemoteAndLocal(source); - ref.read(multiSelectProvider.notifier).reset(); - if (source == ActionSource.viewer) { EventStream.shared.emit(const ViewerReloadAssetEvent()); } + final result = await ref.read(actionProvider.notifier).deleteRemoteAndLocal(source); + ref.read(multiSelectProvider.notifier).reset(); + final successMessage = 'delete_permanently_action_prompt'.t( context: context, args: {'count': result.count.toString()}, diff --git a/mobile/lib/presentation/widgets/action_buttons/favorite_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/favorite_action_button.widget.dart index ba2491365d..07ace7e631 100644 --- a/mobile/lib/presentation/widgets/action_buttons/favorite_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/favorite_action_button.widget.dart @@ -2,8 +2,10 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; +import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart'; +import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; @@ -23,6 +25,12 @@ class FavoriteActionButton extends ConsumerWidget { final result = await ref.read(actionProvider.notifier).favorite(source); if (source == ActionSource.viewer) { + if (result.success) { + final currentAsset = ref.read(assetViewerProvider).currentAsset; + if (currentAsset is RemoteAsset && !currentAsset.isFavorite) { + ref.read(assetViewerProvider.notifier).setAsset(currentAsset.copyWith(isFavorite: true)); + } + } return; } diff --git a/mobile/lib/presentation/widgets/action_buttons/move_to_lock_folder_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/move_to_lock_folder_action_button.widget.dart index 341791c1af..2f7c3899eb 100644 --- a/mobile/lib/presentation/widgets/action_buttons/move_to_lock_folder_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/move_to_lock_folder_action_button.widget.dart @@ -14,13 +14,13 @@ import 'package:immich_mobile/widgets/common/immich_toast.dart'; Future performMoveToLockFolderAction(BuildContext context, WidgetRef ref, {required ActionSource source}) async { if (!context.mounted) return; - final result = await ref.read(actionProvider.notifier).moveToLockFolder(source); - ref.read(multiSelectProvider.notifier).reset(); - if (source == ActionSource.viewer) { EventStream.shared.emit(const ViewerReloadAssetEvent()); } + final result = await ref.read(actionProvider.notifier).moveToLockFolder(source); + ref.read(multiSelectProvider.notifier).reset(); + final successMessage = 'move_to_lock_folder_action_prompt'.t( context: context, args: {'count': result.count.toString()}, diff --git a/mobile/lib/presentation/widgets/action_buttons/open_in_browser_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/open_in_browser_action_button.widget.dart new file mode 100644 index 0000000000..17703d0beb --- /dev/null +++ b/mobile/lib/presentation/widgets/action_buttons/open_in_browser_action_button.widget.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/domain/models/store.model.dart'; +import 'package:immich_mobile/domain/services/timeline.service.dart'; +import 'package:immich_mobile/entities/store.entity.dart'; +import 'package:immich_mobile/extensions/translate_extensions.dart'; +import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class OpenInBrowserActionButton extends ConsumerWidget { + final String remoteId; + final TimelineOrigin origin; + final bool iconOnly; + final bool menuItem; + final Color? iconColor; + + const OpenInBrowserActionButton({ + super.key, + required this.remoteId, + required this.origin, + this.iconOnly = false, + this.menuItem = false, + this.iconColor, + }); + + void _onTap() async { + final serverEndpoint = Store.get(StoreKey.serverEndpoint).replaceFirst('/api', ''); + + String originPath = ''; + switch (origin) { + case TimelineOrigin.favorite: + originPath = '/favorites'; + break; + case TimelineOrigin.trash: + originPath = '/trash'; + break; + case TimelineOrigin.archive: + originPath = '/archive'; + break; + default: + break; + } + + final url = '$serverEndpoint$originPath/photos/$remoteId'; + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication); + } + } + + @override + Widget build(BuildContext context, WidgetRef ref) { + return BaseActionButton( + label: 'open_in_browser'.t(context: context), + iconData: Icons.open_in_browser, + iconColor: iconColor, + iconOnly: iconOnly, + menuItem: menuItem, + onPressed: _onTap, + ); + } +} diff --git a/mobile/lib/presentation/widgets/action_buttons/remove_from_album_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/remove_from_album_action_button.widget.dart index fd88e94cf7..97a36a56dc 100644 --- a/mobile/lib/presentation/widgets/action_buttons/remove_from_album_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/remove_from_album_action_button.widget.dart @@ -29,13 +29,13 @@ class RemoveFromAlbumActionButton extends ConsumerWidget { return; } - final result = await ref.read(actionProvider.notifier).removeFromAlbum(source, albumId); - ref.read(multiSelectProvider.notifier).reset(); - if (source == ActionSource.viewer) { EventStream.shared.emit(const ViewerReloadAssetEvent()); } + final result = await ref.read(actionProvider.notifier).removeFromAlbum(source, albumId); + ref.read(multiSelectProvider.notifier).reset(); + final successMessage = 'remove_from_album_action_prompt'.t( context: context, args: {'count': result.count.toString()}, diff --git a/mobile/lib/presentation/widgets/action_buttons/similar_photos_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/similar_photos_action_button.widget.dart index 530c3fd8d4..bb42140d0a 100644 --- a/mobile/lib/presentation/widgets/action_buttons/similar_photos_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/similar_photos_action_button.widget.dart @@ -24,20 +24,22 @@ class SimilarPhotosActionButton extends ConsumerWidget { } ref.invalidate(assetViewerProvider); - ref - .read(searchPreFilterProvider.notifier) - .setFilter( - SearchFilter( - assetId: assetId, - people: {}, - location: SearchLocationFilter(), - camera: SearchCameraFilter(), - date: SearchDateFilter(), - display: SearchDisplayFilters(isNotInAlbum: false, isArchive: false, isFavorite: false), - rating: SearchRatingFilter(), - mediaType: AssetType.image, - ), - ); + ref.invalidate(paginatedSearchProvider); + + ref.read(searchPreFilterProvider.notifier) + ..clear() + ..setFilter( + SearchFilter( + assetId: assetId, + people: {}, + location: SearchLocationFilter(), + camera: SearchCameraFilter(), + date: SearchDateFilter(), + display: SearchDisplayFilters(isNotInAlbum: false, isArchive: false, isFavorite: false), + rating: SearchRatingFilter(), + mediaType: AssetType.image, + ), + ); unawaited(context.navigateTo(const DriftSearchRoute())); } diff --git a/mobile/lib/presentation/widgets/action_buttons/trash_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/trash_action_button.widget.dart index 5f1e385769..e95569af45 100644 --- a/mobile/lib/presentation/widgets/action_buttons/trash_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/trash_action_button.widget.dart @@ -25,13 +25,13 @@ class TrashActionButton extends ConsumerWidget { return; } - final result = await ref.read(actionProvider.notifier).trash(source); - ref.read(multiSelectProvider.notifier).reset(); - if (source == ActionSource.viewer) { EventStream.shared.emit(const ViewerReloadAssetEvent()); } + final result = await ref.read(actionProvider.notifier).trash(source); + ref.read(multiSelectProvider.notifier).reset(); + final successMessage = 'trash_action_prompt'.t(context: context, args: {'count': result.count.toString()}); if (context.mounted) { diff --git a/mobile/lib/presentation/widgets/action_buttons/unarchive_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/unarchive_action_button.widget.dart index 8cf0bcba92..98e868d953 100644 --- a/mobile/lib/presentation/widgets/action_buttons/unarchive_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/unarchive_action_button.widget.dart @@ -16,13 +16,13 @@ import 'package:immich_mobile/domain/utils/event_stream.dart'; Future performUnArchiveAction(BuildContext context, WidgetRef ref, {required ActionSource source}) async { if (!context.mounted) return; - final result = await ref.read(actionProvider.notifier).unArchive(source); - ref.read(multiSelectProvider.notifier).reset(); - if (source == ActionSource.viewer) { EventStream.shared.emit(const ViewerReloadAssetEvent()); } + final result = await ref.read(actionProvider.notifier).unArchive(source); + ref.read(multiSelectProvider.notifier).reset(); + final successMessage = 'unarchive_action_prompt'.t(context: context, args: {'count': result.count.toString()}); if (context.mounted) { diff --git a/mobile/lib/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart index ec5513e0a8..5e88735d9c 100644 --- a/mobile/lib/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart @@ -2,8 +2,10 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; +import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart'; +import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; @@ -23,6 +25,12 @@ class UnFavoriteActionButton extends ConsumerWidget { final result = await ref.read(actionProvider.notifier).unFavorite(source); if (source == ActionSource.viewer) { + if (result.success) { + final currentAsset = ref.read(assetViewerProvider).currentAsset; + if (currentAsset is RemoteAsset && currentAsset.isFavorite) { + ref.read(assetViewerProvider.notifier).setAsset(currentAsset.copyWith(isFavorite: false)); + } + } return; } diff --git a/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart b/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart index 903105406c..4d8954d4ef 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart @@ -81,19 +81,17 @@ class _AssetViewerState extends ConsumerState { late final _preloader = AssetPreloader(timelineService: ref.read(timelineServiceProvider), mounted: () => mounted); late int _currentPage = widget.initialIndex; + late int _totalAssets = ref.read(timelineServiceProvider).totalAssets; StreamSubscription? _reloadSubscription; KeepAliveLink? _stackChildrenKeepAlive; - bool _assetReloadRequested = false; - void _onTapNavigate(int direction) { final page = _pageController.page?.toInt(); if (page == null) return; final target = page + direction; - final maxPage = ref.read(timelineServiceProvider).totalAssets - 1; + final maxPage = _totalAssets - 1; if (target >= 0 && target <= maxPage) { - _currentPage = target; _pageController.jumpToPage(target); _onAssetChanged(target); } @@ -141,7 +139,6 @@ class _AssetViewerState extends ConsumerState { final page = _pageController.page?.round(); if (page != null && page != _currentPage) { - _currentPage = page; _onAssetChanged(page); } return false; @@ -153,8 +150,9 @@ class _AssetViewerState extends ConsumerState { } void _onAssetChanged(int index) async { - final timelineService = ref.read(timelineServiceProvider); - final asset = await timelineService.getAssetAsync(index); + _currentPage = index; + + final asset = await ref.read(timelineServiceProvider).getAssetAsync(index); if (asset == null) return; AssetViewer._setAsset(ref, asset); @@ -193,11 +191,20 @@ class _AssetViewerState extends ConsumerState { case TimelineReloadEvent(): _onTimelineReloadEvent(); case ViewerReloadAssetEvent(): - _assetReloadRequested = true; + _onViewerReloadEvent(); default: } } + void _onViewerReloadEvent() { + if (_totalAssets <= 1) return; + + final index = _pageController.page?.round() ?? 0; + final target = index >= _totalAssets - 1 ? index - 1 : index + 1; + _pageController.animateToPage(target, duration: Durations.medium1, curve: Curves.easeInOut); + _onAssetChanged(target); + } + void _onTimelineReloadEvent() { final timelineService = ref.read(timelineServiceProvider); final totalAssets = timelineService.totalAssets; @@ -207,43 +214,24 @@ class _AssetViewerState extends ConsumerState { return; } - var index = _pageController.page?.round() ?? 0; final currentAsset = ref.read(assetViewerProvider).currentAsset; - if (currentAsset != null) { - final newIndex = timelineService.getIndex(currentAsset.heroTag); - if (newIndex != null && newIndex != index) { - index = newIndex; - _currentPage = index; - _pageController.jumpToPage(index); - } - } + final assetIndex = currentAsset != null ? timelineService.getIndex(currentAsset.heroTag) : null; + final index = (assetIndex ?? _currentPage).clamp(0, totalAssets - 1); - if (index >= totalAssets) { - index = totalAssets - 1; - _currentPage = index; + if (index != _currentPage) { _pageController.jumpToPage(index); + _onAssetChanged(index); + } else if (currentAsset != null && assetIndex == null) { + _onAssetChanged(index); } - if (_assetReloadRequested) { - _assetReloadRequested = false; - _onAssetReloadEvent(index); + if (_totalAssets != totalAssets) { + setState(() { + _totalAssets = totalAssets; + }); } } - void _onAssetReloadEvent(int index) async { - final timelineService = ref.read(timelineServiceProvider); - - final newAsset = await timelineService.getAssetAsync(index); - if (newAsset == null) return; - - final currentAsset = ref.read(assetViewerProvider).currentAsset; - - // Do not reload if the asset has not changed - if (newAsset.heroTag == currentAsset?.heroTag) return; - - _onAssetChanged(index); - } - void _setSystemUIMode(bool controls, bool details) { final mode = !controls || (CurrentPlatform.isIOS && details) ? SystemUiMode.immersiveSticky @@ -301,7 +289,7 @@ class _AssetViewerState extends ConsumerState { : CurrentPlatform.isIOS ? const FastScrollPhysics() : const FastClampingScrollPhysics(), - itemCount: ref.read(timelineServiceProvider).totalAssets, + itemCount: _totalAssets, itemBuilder: (context, index) => AssetPage(index: index, heroOffset: _heroOffset, onTapNavigate: _onTapNavigate), ), diff --git a/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart index cc171f4490..b51960bb05 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart @@ -71,16 +71,13 @@ class ViewerBottomBar extends ConsumerWidget { ), child: SafeArea( top: false, - child: Padding( - padding: const EdgeInsets.only(top: 16), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - if (asset.isVideo) VideoControls(videoPlayerName: asset.heroTag), - if (!isReadonlyModeEnabled) - Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: actions), - ], - ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (asset.isVideo) VideoControls(videoPlayerName: asset.heroTag), + if (!isReadonlyModeEnabled) + Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: actions), + ], ), ), ), diff --git a/mobile/lib/presentation/widgets/asset_viewer/rating_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/rating_bar.widget.dart index 64090dc5c2..62a439fe39 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/rating_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/rating_bar.widget.dart @@ -39,6 +39,16 @@ class _RatingBarState extends State { _currentRating = widget.initialRating; } + @override + void didUpdateWidget(covariant RatingBar oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.initialRating != widget.initialRating && _currentRating != widget.initialRating) { + setState(() { + _currentRating = widget.initialRating; + }); + } + } + void _updateRating(Offset localPosition, bool isRTL, {bool isTap = false}) { final totalWidth = widget.itemCount * widget.itemSize + (widget.itemCount - 1) * widget.starPadding; double dx = localPosition.dx; diff --git a/mobile/lib/presentation/widgets/images/animated_image_stream_completer.dart b/mobile/lib/presentation/widgets/images/animated_image_stream_completer.dart index be4fbff8cf..796d30e992 100644 --- a/mobile/lib/presentation/widgets/images/animated_image_stream_completer.dart +++ b/mobile/lib/presentation/widgets/images/animated_image_stream_completer.dart @@ -3,24 +3,21 @@ import 'dart:ui' as ui; import 'package:flutter/foundation.dart' show InformationCollector; import 'package:flutter/painting.dart'; +import 'package:immich_mobile/presentation/widgets/images/cache_aware_listener_tracker.mixin.dart'; /// A [MultiFrameImageStreamCompleter] with support for listener tracking /// which makes resource cleanup possible when no longer needed. /// Codec is disposed through the MultiFrameImageStreamCompleter's internals onDispose method -class AnimatedImageStreamCompleter extends MultiFrameImageStreamCompleter { - void Function()? _onLastListenerRemoved; - int _listenerCount = 0; - // True once any image or the codec has been provided. - // Until then the image cache holds one listener, so "last real listener gone" - // is _listenerCount == 1, not 0. - bool didProvideImage = false; - +class AnimatedImageStreamCompleter extends MultiFrameImageStreamCompleter with CacheAwareListenerTrackerMixin { AnimatedImageStreamCompleter._({ required super.codec, required super.scale, + required bool hadInitialImage, super.informationCollector, void Function()? onLastListenerRemoved, - }) : _onLastListenerRemoved = onLastListenerRemoved; + }) { + setupListenerTracking(hadInitialImage: hadInitialImage, onLastListenerRemoved: onLastListenerRemoved); + } factory AnimatedImageStreamCompleter({ required Stream stream, @@ -33,23 +30,21 @@ class AnimatedImageStreamCompleter extends MultiFrameImageStreamCompleter { final self = AnimatedImageStreamCompleter._( codec: codecCompleter.future, scale: scale, + hadInitialImage: initialImage != null, informationCollector: informationCollector, onLastListenerRemoved: onLastListenerRemoved, ); if (initialImage != null) { - self.didProvideImage = true; self.setImage(initialImage); } stream.listen( (item) { if (item is ImageInfo) { - self.didProvideImage = true; self.setImage(item); } else if (item is ui.Codec) { if (!codecCompleter.isCompleted) { - self.didProvideImage = true; codecCompleter.complete(item); } } @@ -70,27 +65,4 @@ class AnimatedImageStreamCompleter extends MultiFrameImageStreamCompleter { return self; } - - @override - void addListener(ImageStreamListener listener) { - super.addListener(listener); - _listenerCount++; - } - - @override - void removeListener(ImageStreamListener listener) { - super.removeListener(listener); - _listenerCount--; - - final bool onlyCacheListenerLeft = _listenerCount == 1 && !didProvideImage; - final bool noListenersAfterCodec = _listenerCount == 0 && didProvideImage; - - if (onlyCacheListenerLeft || noListenersAfterCodec) { - final onLastListenerRemoved = _onLastListenerRemoved; - if (onLastListenerRemoved != null) { - _onLastListenerRemoved = null; - onLastListenerRemoved(); - } - } - } } diff --git a/mobile/lib/presentation/widgets/images/cache_aware_listener_tracker.mixin.dart b/mobile/lib/presentation/widgets/images/cache_aware_listener_tracker.mixin.dart new file mode 100644 index 0000000000..e63d5c4cfc --- /dev/null +++ b/mobile/lib/presentation/widgets/images/cache_aware_listener_tracker.mixin.dart @@ -0,0 +1,84 @@ +import 'package:flutter/painting.dart'; + +/// Tracks listeners on an [ImageStreamCompleter] to safely cancel in-flight +/// network requests without interfering with [ImageCache] internals. +/// +/// ### Problem +/// Cancelling fetches when the listener count drops to 1 (cache only) or 0 +/// is unsafe due to three framework behaviours: +/// +/// 1. **Memory-pressure eviction** — `ImageCache.clear()` removes the cache +/// listener while UI widgets still need the image. A count-based check +/// would cancel the active fetch, leaving the UI with no image. +/// 2. **Synchronous detach during `putIfAbsent`** — When an `initialImage` +/// is provided, the cache attaches, receives the frame, and detaches +/// synchronously *before* the UI widget can attach. Count reaches 0 and +/// would trigger a false cancel. +/// 3. **Listener misidentification** — After the cache detaches (via 1 or 2), +/// the next UI listener could be mistaken for the cache listener, causing +/// incorrect cancellations when that widget is disposed. +/// +/// ### Solution: First-Listener Heuristic +/// The cache is always the first listener attached (via `putIfAbsent`). This +/// mixin records that identity once and uses it for all subsequent decisions: +/// +/// * **Identity locking** — The first listener is assumed to be the cache. +/// Once identified, `_hasIdentifiedCacheListener` prevents reassignment. +/// * **Targeted cancellation** — Cancel only when the identified cache +/// listener is the sole remaining listener and no image has been delivered. +/// * **Sync-removal bypass** — When `hadInitialImage` is set, the first +/// synchronous removal of the cache listener is ignored so the fetch +/// survives until the UI attaches. +mixin CacheAwareListenerTrackerMixin on ImageStreamCompleter { + void Function()? _onLastListenerRemoved; + int _listenerCount = 0; + bool _hadInitialImage = false; + bool _hasIgnoredFirstSyncRemoval = false; + ImageStreamListener? _cacheListener; + bool _hasIdentifiedCacheListener = false; + + /// Initializes the tracking state. Must be called in the subclass constructor. + void setupListenerTracking({required bool hadInitialImage, void Function()? onLastListenerRemoved}) { + _hadInitialImage = hadInitialImage; + _onLastListenerRemoved = onLastListenerRemoved; + } + + @override + void addListener(ImageStreamListener listener) { + if (!_hasIdentifiedCacheListener) { + _hasIdentifiedCacheListener = true; + _cacheListener = listener; + } + + _listenerCount++; + super.addListener(listener); + } + + @override + void removeListener(ImageStreamListener listener) { + super.removeListener(listener); + _listenerCount--; + + final bool isCacheListener = listener == _cacheListener; + if (isCacheListener) { + _cacheListener = null; + } + + if (_hadInitialImage && !_hasIgnoredFirstSyncRemoval && isCacheListener) { + _hasIgnoredFirstSyncRemoval = true; + return; + } + + final bool onlyCacheListenerLeft = _listenerCount == 1 && _cacheListener != null; + + final bool completelyAbandoned = _listenerCount == 0; + + if (onlyCacheListenerLeft || completelyAbandoned) { + final onLastListenerRemoved = _onLastListenerRemoved; + if (onLastListenerRemoved != null) { + _onLastListenerRemoved = null; + onLastListenerRemoved(); + } + } + } +} diff --git a/mobile/lib/presentation/widgets/images/one_frame_multi_image_stream_completer.dart b/mobile/lib/presentation/widgets/images/one_frame_multi_image_stream_completer.dart index 302deca4a7..e80d191ac9 100644 --- a/mobile/lib/presentation/widgets/images/one_frame_multi_image_stream_completer.dart +++ b/mobile/lib/presentation/widgets/images/one_frame_multi_image_stream_completer.dart @@ -6,14 +6,10 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/painting.dart'; +import 'package:immich_mobile/presentation/widgets/images/cache_aware_listener_tracker.mixin.dart'; /// An ImageStreamCompleter with support for loading multiple images. -class OneFramePlaceholderImageStreamCompleter extends ImageStreamCompleter { - void Function()? _onLastListenerRemoved; - int _listenerCount = 0; - // True once setImage() has been called at least once. - bool didProvideImage = false; - +class OneFramePlaceholderImageStreamCompleter extends ImageStreamCompleter with CacheAwareListenerTrackerMixin { /// The constructor to create an OneFramePlaceholderImageStreamCompleter. The [images] /// should be the primary images to display (typically asynchronously as they load). /// The [initialImage] is an optional image that will be emitted synchronously @@ -24,14 +20,14 @@ class OneFramePlaceholderImageStreamCompleter extends ImageStreamCompleter { InformationCollector? informationCollector, void Function()? onLastListenerRemoved, }) { + setupListenerTracking(hadInitialImage: initialImage != null, onLastListenerRemoved: onLastListenerRemoved); + if (initialImage != null) { - didProvideImage = true; setImage(initialImage); } - _onLastListenerRemoved = onLastListenerRemoved; + images.listen( (image) { - didProvideImage = true; setImage(image); }, onError: (Object error, StackTrace stack) { @@ -45,26 +41,4 @@ class OneFramePlaceholderImageStreamCompleter extends ImageStreamCompleter { }, ); } - - @override - void addListener(ImageStreamListener listener) { - super.addListener(listener); - _listenerCount = _listenerCount + 1; - } - - @override - void removeListener(ImageStreamListener listener) { - super.removeListener(listener); - _listenerCount = _listenerCount - 1; - - final bool onlyCacheListenerLeft = _listenerCount == 1 && !didProvideImage; - final bool noListenersAfterImage = _listenerCount == 0 && didProvideImage; - - final onLastListenerRemoved = _onLastListenerRemoved; - - if (onLastListenerRemoved != null && (noListenersAfterImage || onlyCacheListenerLeft)) { - _onLastListenerRemoved = null; - onLastListenerRemoved(); - } - } } diff --git a/mobile/lib/services/api.service.dart b/mobile/lib/services/api.service.dart index bc5e46f769..ec4720f313 100644 --- a/mobile/lib/services/api.service.dart +++ b/mobile/lib/services/api.service.dart @@ -6,6 +6,7 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/infrastructure/repositories/network.repository.dart'; +import 'package:immich_mobile/models/auth/auxilary_endpoint.model.dart'; import 'package:immich_mobile/utils/debug_print.dart'; import 'package:immich_mobile/utils/url_helper.dart'; import 'package:logging/logging.dart'; @@ -176,10 +177,6 @@ class ApiService { if (serverEndpoint != null && serverEndpoint.isNotEmpty) { urls.add(serverEndpoint); } - final serverUrl = Store.tryGet(StoreKey.serverUrl); - if (serverUrl != null && serverUrl.isNotEmpty) { - urls.add(serverUrl); - } final localEndpoint = Store.tryGet(StoreKey.localEndpoint); if (localEndpoint != null && localEndpoint.isNotEmpty) { urls.add(localEndpoint); @@ -188,8 +185,8 @@ class ApiService { if (externalJson != null) { final List list = jsonDecode(externalJson); for (final entry in list) { - final url = entry['url'] as String?; - if (url != null && url.isNotEmpty) urls.add(url); + final url = AuxilaryEndpoint.fromJson(entry).url; + if (url.isNotEmpty) urls.add(url); } } return urls; diff --git a/mobile/lib/services/auth.service.dart b/mobile/lib/services/auth.service.dart index c5f3fa6a4a..667681e579 100644 --- a/mobile/lib/services/auth.service.dart +++ b/mobile/lib/services/auth.service.dart @@ -67,6 +67,9 @@ class AuthService { bool isValid = false; try { + final urls = ApiService.getServerUrls(); + urls.add(url); + await NetworkRepository.setHeaders(ApiService.getRequestHeaders(), urls); final uri = Uri.parse('$url/users/me'); final response = await NetworkRepository.client.get(uri); if (response.statusCode == 200) { diff --git a/mobile/lib/services/download.service.dart b/mobile/lib/services/download.service.dart index 7d2cf01b7c..8e810ced2a 100644 --- a/mobile/lib/services/download.service.dart +++ b/mobile/lib/services/download.service.dart @@ -109,7 +109,7 @@ class DownloadService { return result != null; } on PlatformException catch (error, stack) { // Handle saving MotionPhotos on iOS - if (error.code == 'PHPhotosErrorDomain (-1)') { + if (error.code.startsWith('PHPhotosErrorDomain')) { final result = await _fileMediaRepository.saveImageWithFile(imageFilePath, title: task.filename); return result != null; } diff --git a/mobile/lib/theme/dynamic_theme.dart b/mobile/lib/theme/dynamic_theme.dart index d0cb8e646f..7f7c4d05d7 100644 --- a/mobile/lib/theme/dynamic_theme.dart +++ b/mobile/lib/theme/dynamic_theme.dart @@ -19,8 +19,16 @@ abstract final class DynamicTheme { // Some palettes do not generate surface container colors accurately, // so we regenerate all colors using the primary color _theme = ImmichTheme( - light: ColorScheme.fromSeed(seedColor: primaryColor, brightness: Brightness.light), - dark: ColorScheme.fromSeed(seedColor: primaryColor, brightness: Brightness.dark), + light: ColorScheme.fromSeed( + seedColor: primaryColor, + brightness: Brightness.light, + dynamicSchemeVariant: DynamicSchemeVariant.fidelity, + ), + dark: ColorScheme.fromSeed( + seedColor: primaryColor, + brightness: Brightness.dark, + dynamicSchemeVariant: DynamicSchemeVariant.fidelity, + ), ); } } catch (error) { diff --git a/mobile/lib/theme/theme_data.dart b/mobile/lib/theme/theme_data.dart index 69b8596490..7200d58dca 100644 --- a/mobile/lib/theme/theme_data.dart +++ b/mobile/lib/theme/theme_data.dart @@ -62,6 +62,7 @@ ThemeData getThemeData({required ColorScheme colorScheme, required Locale locale ), chipTheme: const ChipThemeData(side: BorderSide.none), sliderTheme: const SliderThemeData( + trackHeight: 12, // ignore: deprecated_member_use year2023: false, ), diff --git a/mobile/lib/utils/action_button.utils.dart b/mobile/lib/utils/action_button.utils.dart index 2e26d8e80d..2aad2f264a 100644 --- a/mobile/lib/utils/action_button.utils.dart +++ b/mobile/lib/utils/action_button.utils.dart @@ -18,6 +18,7 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permane import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/like_activity_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/move_to_lock_folder_action_button.widget.dart'; +import 'package:immich_mobile/presentation/widgets/action_buttons/open_in_browser_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/remove_from_album_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/remove_from_lock_folder_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/set_album_cover.widget.dart'; @@ -75,6 +76,7 @@ enum ActionButtonType { viewInTimeline, download, upload, + openInBrowser, unstack, archive, unarchive, @@ -141,14 +143,14 @@ enum ActionButtonType { !context.isInLockedView && // context.currentAlbum != null, ActionButtonType.setAlbumCover => - context.isOwner && // - !context.isInLockedView && // + !context.isInLockedView && // context.currentAlbum != null && // context.selectedCount == 1, ActionButtonType.unstack => context.isOwner && // !context.isInLockedView && // context.isStacked, + ActionButtonType.openInBrowser => context.asset.hasRemote && !context.isInLockedView, ActionButtonType.likeActivity => !context.isInLockedView && context.currentAlbum != null && @@ -236,6 +238,13 @@ enum ActionButtonType { ), ActionButtonType.likeActivity => LikeActivityActionButton(iconOnly: iconOnly, menuItem: menuItem), ActionButtonType.unstack => UnStackActionButton(source: context.source, iconOnly: iconOnly, menuItem: menuItem), + ActionButtonType.openInBrowser => OpenInBrowserActionButton( + remoteId: context.asset.remoteId!, + origin: context.timelineOrigin, + iconOnly: iconOnly, + menuItem: menuItem, + iconColor: context.originalTheme?.iconTheme.color, + ), ActionButtonType.similarPhotos => SimilarPhotosActionButton( assetId: (context.asset as RemoteAsset).id, iconOnly: iconOnly, diff --git a/mobile/lib/utils/cache/custom_image_cache.dart b/mobile/lib/utils/cache/custom_image_cache.dart index 99ce0db57c..2c09030ffa 100644 --- a/mobile/lib/utils/cache/custom_image_cache.dart +++ b/mobile/lib/utils/cache/custom_image_cache.dart @@ -20,7 +20,7 @@ final class CustomImageCache implements ImageCache { set maximumSize(int value) => _small.maximumSize = value; @override - set maximumSizeBytes(int value) => _small.maximumSize = value; + set maximumSizeBytes(int value) => _small.maximumSizeBytes = value; @override void clear() { diff --git a/mobile/lib/widgets/asset_viewer/video_controls.dart b/mobile/lib/widgets/asset_viewer/video_controls.dart index 85707c82ea..ff782113c7 100644 --- a/mobile/lib/widgets/asset_viewer/video_controls.dart +++ b/mobile/lib/widgets/asset_viewer/video_controls.dart @@ -66,9 +66,9 @@ class VideoControls extends HookConsumerWidget { final isLoaded = duration != Duration.zero; return Padding( - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 12), child: Column( - spacing: 16, + spacing: 4, children: [ Row( children: [ @@ -77,8 +77,8 @@ class VideoControls extends HookConsumerWidget { padding: const EdgeInsets.all(12), constraints: const BoxConstraints(), icon: isFinished - ? const Icon(Icons.replay, color: Colors.white, size: 32, shadows: _controlShadows) - : AnimatedPlayPause(color: Colors.white, size: 32, playing: isPlaying, shadows: _controlShadows), + ? const Icon(Icons.replay, color: Colors.white, shadows: _controlShadows) + : AnimatedPlayPause(color: Colors.white, playing: isPlaying, shadows: _controlShadows), onPressed: () => _toggle(ref, isCasting), ), const Spacer(), @@ -91,7 +91,7 @@ class VideoControls extends HookConsumerWidget { shadows: _controlShadows, ), ), - const SizedBox(width: 16), + const SizedBox(width: 12), ], ), Slider( diff --git a/mobile/lib/widgets/search/search_filter/common/dropdown.dart b/mobile/lib/widgets/search/search_filter/common/dropdown.dart index 70cbfd2c15..9d02f4f3e8 100644 --- a/mobile/lib/widgets/search/search_filter/common/dropdown.dart +++ b/mobile/lib/widgets/search/search_filter/common/dropdown.dart @@ -16,9 +16,15 @@ class SearchDropdown extends StatelessWidget { final Widget? label; final Widget? leadingIcon; + static const WidgetStatePropertyAll _optionPadding = WidgetStatePropertyAll( + EdgeInsetsDirectional.fromSTEB(16, 0, 16, 0), + ); + @override Widget build(BuildContext context) { - final menuStyle = const MenuStyle( + final mediaQuery = MediaQuery.of(context); + final maxMenuHeight = mediaQuery.size.height * 0.5 - mediaQuery.viewPadding.bottom; + const menuStyle = MenuStyle( shape: WidgetStatePropertyAll( RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(15))), ), @@ -26,11 +32,26 @@ class SearchDropdown extends StatelessWidget { return LayoutBuilder( builder: (context, constraints) { + final styledEntries = dropdownMenuEntries + .map( + (entry) => DropdownMenuEntry( + value: entry.value, + label: entry.label, + labelWidget: entry.labelWidget, + enabled: entry.enabled, + leadingIcon: entry.leadingIcon, + trailingIcon: entry.trailingIcon, + style: (entry.style ?? const ButtonStyle()).copyWith(padding: _optionPadding), + ), + ) + .toList(growable: false); + return DropdownMenu( controller: controller, leadingIcon: leadingIcon, width: constraints.maxWidth, - dropdownMenuEntries: dropdownMenuEntries, + menuHeight: maxMenuHeight, + dropdownMenuEntries: styledEntries, label: label, menuStyle: menuStyle, trailingIcon: const Icon(Icons.arrow_drop_down_rounded), diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index bb437787cb..e79a60f98b 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -3,7 +3,7 @@ Immich API This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 2.5.6 +- API version: 2.6.3 - Generator version: 7.8.0 - Build package: org.openapitools.codegen.languages.DartClientCodegen @@ -156,6 +156,7 @@ Class | Method | HTTP request | Description *DuplicatesApi* | [**deleteDuplicate**](doc//DuplicatesApi.md#deleteduplicate) | **DELETE** /duplicates/{id} | Delete a duplicate *DuplicatesApi* | [**deleteDuplicates**](doc//DuplicatesApi.md#deleteduplicates) | **DELETE** /duplicates | Delete duplicates *DuplicatesApi* | [**getAssetDuplicates**](doc//DuplicatesApi.md#getassetduplicates) | **GET** /duplicates | Retrieve duplicates +*DuplicatesApi* | [**resolveDuplicates**](doc//DuplicatesApi.md#resolveduplicates) | **POST** /duplicates/resolve | Resolve duplicate groups *FacesApi* | [**createFace**](doc//FacesApi.md#createface) | **POST** /faces | Create a face *FacesApi* | [**deleteFace**](doc//FacesApi.md#deleteface) | **DELETE** /faces/{id} | Delete a face *FacesApi* | [**getFaces**](doc//FacesApi.md#getfaces) | **GET** /faces | Retrieve faces for asset @@ -422,6 +423,8 @@ Class | Method | HTTP request | Description - [DownloadResponseDto](doc//DownloadResponseDto.md) - [DownloadUpdate](doc//DownloadUpdate.md) - [DuplicateDetectionConfig](doc//DuplicateDetectionConfig.md) + - [DuplicateResolveDto](doc//DuplicateResolveDto.md) + - [DuplicateResolveGroupDto](doc//DuplicateResolveGroupDto.md) - [DuplicateResponseDto](doc//DuplicateResponseDto.md) - [EmailNotificationsResponse](doc//EmailNotificationsResponse.md) - [EmailNotificationsUpdate](doc//EmailNotificationsUpdate.md) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 253e8a6811..6b554fb644 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -161,6 +161,8 @@ part 'model/download_response.dart'; part 'model/download_response_dto.dart'; part 'model/download_update.dart'; part 'model/duplicate_detection_config.dart'; +part 'model/duplicate_resolve_dto.dart'; +part 'model/duplicate_resolve_group_dto.dart'; part 'model/duplicate_response_dto.dart'; part 'model/email_notifications_response.dart'; part 'model/email_notifications_update.dart'; diff --git a/mobile/openapi/lib/api/duplicates_api.dart b/mobile/openapi/lib/api/duplicates_api.dart index 7fa7b368b5..e873537592 100644 --- a/mobile/openapi/lib/api/duplicates_api.dart +++ b/mobile/openapi/lib/api/duplicates_api.dart @@ -163,4 +163,63 @@ class DuplicatesApi { } return null; } + + /// Resolve duplicate groups + /// + /// Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates. + /// + /// Note: This method returns the HTTP [Response]. + /// + /// Parameters: + /// + /// * [DuplicateResolveDto] duplicateResolveDto (required): + Future resolveDuplicatesWithHttpInfo(DuplicateResolveDto duplicateResolveDto,) async { + // ignore: prefer_const_declarations + final apiPath = r'/duplicates/resolve'; + + // ignore: prefer_final_locals + Object? postBody = duplicateResolveDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = ['application/json']; + + + return apiClient.invokeAPI( + apiPath, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// Resolve duplicate groups + /// + /// Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates. + /// + /// Parameters: + /// + /// * [DuplicateResolveDto] duplicateResolveDto (required): + Future?> resolveDuplicates(DuplicateResolveDto duplicateResolveDto,) async { + final response = await resolveDuplicatesWithHttpInfo(duplicateResolveDto,); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + // When a remote server returns no body with a status of 204, we shall not decode it. + // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" + // FormatException when trying to decode an empty string. + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, 'List') as List) + .cast() + .toList(growable: false); + + } + return null; + } } diff --git a/mobile/openapi/lib/api/shared_links_api.dart b/mobile/openapi/lib/api/shared_links_api.dart index 37eeffcf46..084662ace8 100644 --- a/mobile/openapi/lib/api/shared_links_api.dart +++ b/mobile/openapi/lib/api/shared_links_api.dart @@ -427,11 +427,7 @@ class SharedLinksApi { /// * [String] id (required): /// /// * [AssetIdsDto] assetIdsDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future removeSharedLinkAssetsWithHttpInfo(String id, AssetIdsDto assetIdsDto, { String? key, String? slug, }) async { + Future removeSharedLinkAssetsWithHttpInfo(String id, AssetIdsDto assetIdsDto,) async { // ignore: prefer_const_declarations final apiPath = r'/shared-links/{id}/assets' .replaceAll('{id}', id); @@ -443,13 +439,6 @@ class SharedLinksApi { final headerParams = {}; final formParams = {}; - if (key != null) { - queryParams.addAll(_queryParams('', 'key', key)); - } - if (slug != null) { - queryParams.addAll(_queryParams('', 'slug', slug)); - } - const contentTypes = ['application/json']; @@ -473,12 +462,8 @@ class SharedLinksApi { /// * [String] id (required): /// /// * [AssetIdsDto] assetIdsDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future?> removeSharedLinkAssets(String id, AssetIdsDto assetIdsDto, { String? key, String? slug, }) async { - final response = await removeSharedLinkAssetsWithHttpInfo(id, assetIdsDto, key: key, slug: slug, ); + Future?> removeSharedLinkAssets(String id, AssetIdsDto assetIdsDto,) async { + final response = await removeSharedLinkAssetsWithHttpInfo(id, assetIdsDto,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index bfe469e7c0..48e5f5874b 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -368,6 +368,10 @@ class ApiClient { return DownloadUpdate.fromJson(value); case 'DuplicateDetectionConfig': return DuplicateDetectionConfig.fromJson(value); + case 'DuplicateResolveDto': + return DuplicateResolveDto.fromJson(value); + case 'DuplicateResolveGroupDto': + return DuplicateResolveGroupDto.fromJson(value); case 'DuplicateResponseDto': return DuplicateResponseDto.fromJson(value); case 'EmailNotificationsResponse': diff --git a/mobile/openapi/lib/model/bulk_id_error_reason.dart b/mobile/openapi/lib/model/bulk_id_error_reason.dart index ea56e9dbba..fd6c61d6fd 100644 --- a/mobile/openapi/lib/model/bulk_id_error_reason.dart +++ b/mobile/openapi/lib/model/bulk_id_error_reason.dart @@ -27,6 +27,7 @@ class BulkIdErrorReason { static const noPermission = BulkIdErrorReason._(r'no_permission'); static const notFound = BulkIdErrorReason._(r'not_found'); static const unknown = BulkIdErrorReason._(r'unknown'); + static const validation = BulkIdErrorReason._(r'validation'); /// List of all possible values in this [enum][BulkIdErrorReason]. static const values = [ @@ -34,6 +35,7 @@ class BulkIdErrorReason { noPermission, notFound, unknown, + validation, ]; static BulkIdErrorReason? fromJson(dynamic value) => BulkIdErrorReasonTypeTransformer().decode(value); @@ -76,6 +78,7 @@ class BulkIdErrorReasonTypeTransformer { case r'no_permission': return BulkIdErrorReason.noPermission; case r'not_found': return BulkIdErrorReason.notFound; case r'unknown': return BulkIdErrorReason.unknown; + case r'validation': return BulkIdErrorReason.validation; default: if (!allowNull) { throw ArgumentError('Unknown enum value to decode: $data'); diff --git a/mobile/openapi/lib/model/bulk_id_response_dto.dart b/mobile/openapi/lib/model/bulk_id_response_dto.dart index cd122785dd..1fa8536964 100644 --- a/mobile/openapi/lib/model/bulk_id_response_dto.dart +++ b/mobile/openapi/lib/model/bulk_id_response_dto.dart @@ -14,6 +14,7 @@ class BulkIdResponseDto { /// Returns a new [BulkIdResponseDto] instance. BulkIdResponseDto({ this.error, + this.errorMessage, required this.id, required this.success, }); @@ -21,6 +22,14 @@ class BulkIdResponseDto { /// Error reason if failed BulkIdResponseDtoErrorEnum? error; + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + String? errorMessage; + /// ID String id; @@ -30,6 +39,7 @@ class BulkIdResponseDto { @override bool operator ==(Object other) => identical(this, other) || other is BulkIdResponseDto && other.error == error && + other.errorMessage == errorMessage && other.id == id && other.success == success; @@ -37,11 +47,12 @@ class BulkIdResponseDto { int get hashCode => // ignore: unnecessary_parenthesis (error == null ? 0 : error!.hashCode) + + (errorMessage == null ? 0 : errorMessage!.hashCode) + (id.hashCode) + (success.hashCode); @override - String toString() => 'BulkIdResponseDto[error=$error, id=$id, success=$success]'; + String toString() => 'BulkIdResponseDto[error=$error, errorMessage=$errorMessage, id=$id, success=$success]'; Map toJson() { final json = {}; @@ -49,6 +60,11 @@ class BulkIdResponseDto { json[r'error'] = this.error; } else { // json[r'error'] = null; + } + if (this.errorMessage != null) { + json[r'errorMessage'] = this.errorMessage; + } else { + // json[r'errorMessage'] = null; } json[r'id'] = this.id; json[r'success'] = this.success; @@ -65,6 +81,7 @@ class BulkIdResponseDto { return BulkIdResponseDto( error: BulkIdResponseDtoErrorEnum.fromJson(json[r'error']), + errorMessage: mapValueOfType(json, r'errorMessage'), id: mapValueOfType(json, r'id')!, success: mapValueOfType(json, r'success')!, ); @@ -136,6 +153,7 @@ class BulkIdResponseDtoErrorEnum { static const noPermission = BulkIdResponseDtoErrorEnum._(r'no_permission'); static const notFound = BulkIdResponseDtoErrorEnum._(r'not_found'); static const unknown = BulkIdResponseDtoErrorEnum._(r'unknown'); + static const validation = BulkIdResponseDtoErrorEnum._(r'validation'); /// List of all possible values in this [enum][BulkIdResponseDtoErrorEnum]. static const values = [ @@ -143,6 +161,7 @@ class BulkIdResponseDtoErrorEnum { noPermission, notFound, unknown, + validation, ]; static BulkIdResponseDtoErrorEnum? fromJson(dynamic value) => BulkIdResponseDtoErrorEnumTypeTransformer().decode(value); @@ -185,6 +204,7 @@ class BulkIdResponseDtoErrorEnumTypeTransformer { case r'no_permission': return BulkIdResponseDtoErrorEnum.noPermission; case r'not_found': return BulkIdResponseDtoErrorEnum.notFound; case r'unknown': return BulkIdResponseDtoErrorEnum.unknown; + case r'validation': return BulkIdResponseDtoErrorEnum.validation; default: if (!allowNull) { throw ArgumentError('Unknown enum value to decode: $data'); diff --git a/mobile/openapi/lib/model/duplicate_resolve_dto.dart b/mobile/openapi/lib/model/duplicate_resolve_dto.dart new file mode 100644 index 0000000000..3466d3a620 --- /dev/null +++ b/mobile/openapi/lib/model/duplicate_resolve_dto.dart @@ -0,0 +1,100 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class DuplicateResolveDto { + /// Returns a new [DuplicateResolveDto] instance. + DuplicateResolveDto({ + this.groups = const [], + }); + + /// List of duplicate groups to resolve + List groups; + + @override + bool operator ==(Object other) => identical(this, other) || other is DuplicateResolveDto && + _deepEquality.equals(other.groups, groups); + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (groups.hashCode); + + @override + String toString() => 'DuplicateResolveDto[groups=$groups]'; + + Map toJson() { + final json = {}; + json[r'groups'] = this.groups; + return json; + } + + /// Returns a new [DuplicateResolveDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static DuplicateResolveDto? fromJson(dynamic value) { + upgradeDto(value, "DuplicateResolveDto"); + if (value is Map) { + final json = value.cast(); + + return DuplicateResolveDto( + groups: DuplicateResolveGroupDto.listFromJson(json[r'groups']), + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = DuplicateResolveDto.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = DuplicateResolveDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of DuplicateResolveDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + // ignore: parameter_assignments + json = json.cast(); + for (final entry in json.entries) { + map[entry.key] = DuplicateResolveDto.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'groups', + }; +} + diff --git a/mobile/openapi/lib/model/duplicate_resolve_group_dto.dart b/mobile/openapi/lib/model/duplicate_resolve_group_dto.dart new file mode 100644 index 0000000000..94ca53eb7d --- /dev/null +++ b/mobile/openapi/lib/model/duplicate_resolve_group_dto.dart @@ -0,0 +1,121 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class DuplicateResolveGroupDto { + /// Returns a new [DuplicateResolveGroupDto] instance. + DuplicateResolveGroupDto({ + required this.duplicateId, + this.keepAssetIds = const [], + this.trashAssetIds = const [], + }); + + String duplicateId; + + /// Asset IDs to keep + List keepAssetIds; + + /// Asset IDs to trash or delete + List trashAssetIds; + + @override + bool operator ==(Object other) => identical(this, other) || other is DuplicateResolveGroupDto && + other.duplicateId == duplicateId && + _deepEquality.equals(other.keepAssetIds, keepAssetIds) && + _deepEquality.equals(other.trashAssetIds, trashAssetIds); + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (duplicateId.hashCode) + + (keepAssetIds.hashCode) + + (trashAssetIds.hashCode); + + @override + String toString() => 'DuplicateResolveGroupDto[duplicateId=$duplicateId, keepAssetIds=$keepAssetIds, trashAssetIds=$trashAssetIds]'; + + Map toJson() { + final json = {}; + json[r'duplicateId'] = this.duplicateId; + json[r'keepAssetIds'] = this.keepAssetIds; + json[r'trashAssetIds'] = this.trashAssetIds; + return json; + } + + /// Returns a new [DuplicateResolveGroupDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static DuplicateResolveGroupDto? fromJson(dynamic value) { + upgradeDto(value, "DuplicateResolveGroupDto"); + if (value is Map) { + final json = value.cast(); + + return DuplicateResolveGroupDto( + duplicateId: mapValueOfType(json, r'duplicateId')!, + keepAssetIds: json[r'keepAssetIds'] is Iterable + ? (json[r'keepAssetIds'] as Iterable).cast().toList(growable: false) + : const [], + trashAssetIds: json[r'trashAssetIds'] is Iterable + ? (json[r'trashAssetIds'] as Iterable).cast().toList(growable: false) + : const [], + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = DuplicateResolveGroupDto.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = DuplicateResolveGroupDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of DuplicateResolveGroupDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + // ignore: parameter_assignments + json = json.cast(); + for (final entry in json.entries) { + map[entry.key] = DuplicateResolveGroupDto.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'duplicateId', + 'keepAssetIds', + 'trashAssetIds', + }; +} + diff --git a/mobile/openapi/lib/model/duplicate_response_dto.dart b/mobile/openapi/lib/model/duplicate_response_dto.dart index 6c85dc8013..f0ddbb4fdd 100644 --- a/mobile/openapi/lib/model/duplicate_response_dto.dart +++ b/mobile/openapi/lib/model/duplicate_response_dto.dart @@ -15,6 +15,7 @@ class DuplicateResponseDto { DuplicateResponseDto({ this.assets = const [], required this.duplicateId, + this.suggestedKeepAssetIds = const [], }); /// Duplicate assets @@ -23,24 +24,30 @@ class DuplicateResponseDto { /// Duplicate group ID String duplicateId; + /// Suggested asset IDs to keep based on file size and EXIF data + List suggestedKeepAssetIds; + @override bool operator ==(Object other) => identical(this, other) || other is DuplicateResponseDto && _deepEquality.equals(other.assets, assets) && - other.duplicateId == duplicateId; + other.duplicateId == duplicateId && + _deepEquality.equals(other.suggestedKeepAssetIds, suggestedKeepAssetIds); @override int get hashCode => // ignore: unnecessary_parenthesis (assets.hashCode) + - (duplicateId.hashCode); + (duplicateId.hashCode) + + (suggestedKeepAssetIds.hashCode); @override - String toString() => 'DuplicateResponseDto[assets=$assets, duplicateId=$duplicateId]'; + String toString() => 'DuplicateResponseDto[assets=$assets, duplicateId=$duplicateId, suggestedKeepAssetIds=$suggestedKeepAssetIds]'; Map toJson() { final json = {}; json[r'assets'] = this.assets; json[r'duplicateId'] = this.duplicateId; + json[r'suggestedKeepAssetIds'] = this.suggestedKeepAssetIds; return json; } @@ -55,6 +62,9 @@ class DuplicateResponseDto { return DuplicateResponseDto( assets: AssetResponseDto.listFromJson(json[r'assets']), duplicateId: mapValueOfType(json, r'duplicateId')!, + suggestedKeepAssetIds: json[r'suggestedKeepAssetIds'] is Iterable + ? (json[r'suggestedKeepAssetIds'] as Iterable).cast().toList(growable: false) + : const [], ); } return null; @@ -104,6 +114,7 @@ class DuplicateResponseDto { static const requiredKeys = { 'assets', 'duplicateId', + 'suggestedKeepAssetIds', }; } diff --git a/mobile/openapi/lib/model/metadata_search_dto.dart b/mobile/openapi/lib/model/metadata_search_dto.dart index 81f8d41527..4dbc90d407 100644 --- a/mobile/openapi/lib/model/metadata_search_dto.dart +++ b/mobile/openapi/lib/model/metadata_search_dto.dart @@ -379,7 +379,7 @@ class MetadataSearchDto { /// bool? withExif; - /// Include assets with people + /// Include people data in response /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated diff --git a/mobile/openapi/lib/model/random_search_dto.dart b/mobile/openapi/lib/model/random_search_dto.dart index 4166fc9f3c..d5803c9cc7 100644 --- a/mobile/openapi/lib/model/random_search_dto.dart +++ b/mobile/openapi/lib/model/random_search_dto.dart @@ -273,7 +273,7 @@ class RandomSearchDto { /// bool? withExif; - /// Include assets with people + /// Include people data in response /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index de116abb7e..89a43f328b 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1194,10 +1194,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mime: dependency: transitive description: @@ -1218,8 +1218,8 @@ packages: dependency: "direct main" description: path: "." - ref: "0a80cd0bd3ff61790d1e05ef15baa7cbe26264d2" - resolved-ref: "0a80cd0bd3ff61790d1e05ef15baa7cbe26264d2" + ref: cdf621bdb7edaf996e118a58a48f6441187d79c6 + resolved-ref: cdf621bdb7edaf996e118a58a48f6441187d79c6 url: "https://github.com/immich-app/native_video_player" source: git version: "1.3.1" @@ -1897,10 +1897,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.7" thumbhash: dependency: "direct main" description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 3a075d67ff..c5839fb9be 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -2,7 +2,7 @@ name: immich_mobile description: Immich - selfhosted backup media file on mobile phone publish_to: 'none' -version: 2.5.6+3037 +version: 2.6.3+3041 environment: sdk: '>=3.8.0 <4.0.0' @@ -56,7 +56,7 @@ dependencies: native_video_player: git: url: https://github.com/immich-app/native_video_player - ref: '0a80cd0bd3ff61790d1e05ef15baa7cbe26264d2' + ref: 'cdf621bdb7edaf996e118a58a48f6441187d79c6' network_info_plus: ^6.1.3 octo_image: ^2.1.0 openapi: diff --git a/mobile/test/presentation/widgets/images/cache_aware_listener_tracker_mixin_test.dart b/mobile/test/presentation/widgets/images/cache_aware_listener_tracker_mixin_test.dart new file mode 100644 index 0000000000..02bb0c1053 --- /dev/null +++ b/mobile/test/presentation/widgets/images/cache_aware_listener_tracker_mixin_test.dart @@ -0,0 +1,183 @@ +import 'dart:ui' as ui; + +import 'package:flutter/painting.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:immich_mobile/presentation/widgets/images/cache_aware_listener_tracker.mixin.dart'; + +class TestImageCompleter extends ImageStreamCompleter with CacheAwareListenerTrackerMixin { + bool wasCancelled = false; + + TestImageCompleter({required bool hadInitialImage}) { + setupListenerTracking( + hadInitialImage: hadInitialImage, + onLastListenerRemoved: () { + wasCancelled = true; + }, + ); + } + + @override + void setImage(ImageInfo image) { + super.setImage(image); + } +} + +void main() { + late ImageCache cache; + late ImageStreamListener uiListener; + + setUp(() { + // Create a fresh, real Flutter ImageCache for every test + cache = ImageCache(); + uiListener = ImageStreamListener((_, __) {}); + }); + + group('CacheAwareListenerTrackerMixin with Real ImageCache', () { + + testWidgets('cancels fetch when UI detaches before completion', (WidgetTester tester) async { + final completer = TestImageCompleter(hadInitialImage: false); + final key = Object(); + + // 1. Request image from the real cache (simulating the provider) + final stream = cache.putIfAbsent(key, () => completer)!; + + // 2. UI attaches + stream.addListener(uiListener); + expect(completer.wasCancelled, isFalse); + + // 3. Simulate asynchronous network delay... + await tester.pump(const Duration(milliseconds: 150)); + + // 4. User scrolls away before network finishes. UI detaches. + stream.removeListener(uiListener); + + expect(completer.wasCancelled, isTrue); + }); + + testWidgets('survives cache eviction while UI listener is still attached', (WidgetTester tester) async { + final completer = TestImageCompleter(hadInitialImage: false); + final key = Object(); + + // 1. Request image and attach UI + final stream = cache.putIfAbsent(key, () => completer)!; + stream.addListener(uiListener); + + // 2. Simulate app going to background -> OS Memory Warning -> Cache clears + cache.clear(); + + // Even though the real cache just aggressively detached its listener, + // the stream MUST survive because the UI widget is still on screen! + expect(completer.wasCancelled, isFalse); + + // 3. UI widget finally detaches + stream.removeListener(uiListener); + expect(completer.wasCancelled, isTrue); + }); + + testWidgets('survives synchronous cache detach during putIfAbsent with initialImage', (WidgetTester tester) async { + final completer = TestImageCompleter(hadInitialImage: true); + final key = Object(); + + // Run image creation outside FakeAsync zone to avoid hang + late ui.Image dummyImage; + await tester.runAsync(() async { + dummyImage = await createTestImage(width: 1, height: 1); + }); + + final initialImageInfo = ImageInfo(image: dummyImage); + + final stream = cache.putIfAbsent(key, () { + completer.setImage(initialImageInfo); + return completer; + })!; + + expect(completer.wasCancelled, isFalse); + + stream.addListener(uiListener); + expect(completer.wasCancelled, isFalse); + + stream.removeListener(uiListener); + expect(completer.wasCancelled, isTrue); + }); + + testWidgets('fires cleanup on full abandonment even after successful fetch', (WidgetTester tester) async { + final completer = TestImageCompleter(hadInitialImage: false); + final key = Object(); + + final stream = cache.putIfAbsent(key, () => completer)!; + stream.addListener(uiListener); + + await tester.pump(const Duration(milliseconds: 100)); + + // Run image creation outside FakeAsync zone to avoid hang + late ui.Image dummyImage; + await tester.runAsync(() async { + dummyImage = await createTestImage(width: 1, height: 1); + }); + + completer.setImage(ImageInfo(image: dummyImage)); + + stream.removeListener(uiListener); + + // The stream is completely abandoned (0 listeners), so it fires the cleanup hook. + // Since the image is already downloaded, canceling the network token is a safe no-op. + expect(completer.wasCancelled, isTrue); + }); + + testWidgets('Multiple UI listeners — only all detached, should cancel', (WidgetTester tester) async { + final completer = TestImageCompleter(hadInitialImage: false); + final key = Object(); + + final stream = cache.putIfAbsent(key, () => completer)!; + + final uiListener2 = ImageStreamListener((_, __) {}); + stream.addListener(uiListener); + stream.addListener(uiListener2); + + // First UI detach leaves cache + one UI → no cancel + stream.removeListener(uiListener); + expect(completer.wasCancelled, isFalse); + + // Second UI detach leaves only cache → cancel + stream.removeListener(uiListener2); + expect(completer.wasCancelled, isTrue); + }); + + testWidgets('Listener misidentification: new listener after cache eviction is not treated as cache', (WidgetTester tester) async { + final completer = TestImageCompleter(hadInitialImage: false); + final key = Object(); + + final stream = cache.putIfAbsent(key, () => completer)!; + + // UI attaches + stream.addListener(uiListener); + + // Cache eviction removes the cache listener + cache.clear(); + expect(completer.wasCancelled, isFalse); + + // A second UI listener attaches — must NOT be treated as cache + final uiListener2 = ImageStreamListener((_, __) {}); + stream.addListener(uiListener2); + + // Remove first UI listener; second UI still active → no cancel + stream.removeListener(uiListener); + expect(completer.wasCancelled, isFalse); + + // Remove second UI listener; completely abandoned → cancel + stream.removeListener(uiListener2); + expect(completer.wasCancelled, isTrue); + }); + + testWidgets('No UI listener ever attaches (cache-only) — cache detaches should cancel', (WidgetTester tester) async { + final completer = TestImageCompleter(hadInitialImage: false); + final key = Object(); + + cache.putIfAbsent(key, () => completer); + + // Cache eviction removes the only listener + cache.clear(); + expect(completer.wasCancelled, isTrue); + }); + }); +} diff --git a/mobile/test/utils/action_button_utils_test.dart b/mobile/test/utils/action_button_utils_test.dart index b5540f9dc7..9956dfa2d0 100644 --- a/mobile/test/utils/action_button_utils_test.dart +++ b/mobile/test/utils/action_button_utils_test.dart @@ -727,7 +727,7 @@ void main() { expect(ActionButtonType.setAlbumCover.shouldShow(context), isTrue); }); - test('should not show when not owner', () { + test('should show when not owner', () { final album = createRemoteAlbum(); final context = ActionButtonContext( asset: mergedAsset, @@ -742,7 +742,7 @@ void main() { selectedCount: 1, ); - expect(ActionButtonType.setAlbumCover.shouldShow(context), isFalse); + expect(ActionButtonType.setAlbumCover.shouldShow(context), isTrue); }); test('should not show when in locked view', () { diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index d2eb322009..19427413b0 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -5285,6 +5285,65 @@ "x-immich-state": "Stable" } }, + "/duplicates/resolve": { + "post": { + "description": "Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates.", + "operationId": "resolveDuplicates", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DuplicateResolveDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/BulkIdResponseDto" + }, + "type": "array" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "summary": "Resolve duplicate groups", + "tags": [ + "Duplicates" + ], + "x-immich-history": [ + { + "version": "v3.0.0", + "state": "Added" + }, + { + "version": "v3.0.0", + "state": "Alpha" + } + ], + "x-immich-permission": "duplicate.delete", + "x-immich-state": "Alpha" + } + }, "/duplicates/{id}": { "delete": { "description": "Delete a single duplicate asset specified by its ID.", @@ -11605,22 +11664,6 @@ "format": "uuid", "type": "string" } - }, - { - "name": "key", - "required": false, - "in": "query", - "schema": { - "type": "string" - } - }, - { - "name": "slug", - "required": false, - "in": "query", - "schema": { - "type": "string" - } } ], "requestBody": { @@ -11677,6 +11720,7 @@ "state": "Stable" } ], + "x-immich-permission": "sharedLink.update", "x-immich-state": "Stable" }, "put": { @@ -15181,7 +15225,7 @@ "info": { "title": "Immich", "description": "Immich API", - "version": "2.5.6", + "version": "2.6.3", "contact": {} }, "tags": [ @@ -17314,7 +17358,8 @@ "duplicate", "no_permission", "not_found", - "unknown" + "unknown", + "validation" ], "type": "string" }, @@ -17326,10 +17371,14 @@ "duplicate", "no_permission", "not_found", - "unknown" + "unknown", + "validation" ], "type": "string" }, + "errorMessage": { + "type": "string" + }, "id": { "description": "ID", "type": "string" @@ -17843,6 +17892,52 @@ ], "type": "object" }, + "DuplicateResolveDto": { + "properties": { + "groups": { + "description": "List of duplicate groups to resolve", + "items": { + "$ref": "#/components/schemas/DuplicateResolveGroupDto" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "groups" + ], + "type": "object" + }, + "DuplicateResolveGroupDto": { + "properties": { + "duplicateId": { + "format": "uuid", + "type": "string" + }, + "keepAssetIds": { + "description": "Asset IDs to keep", + "items": { + "format": "uuid", + "type": "string" + }, + "type": "array" + }, + "trashAssetIds": { + "description": "Asset IDs to trash or delete", + "items": { + "format": "uuid", + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "duplicateId", + "keepAssetIds", + "trashAssetIds" + ], + "type": "object" + }, "DuplicateResponseDto": { "properties": { "assets": { @@ -17855,11 +17950,20 @@ "duplicateId": { "description": "Duplicate group ID", "type": "string" + }, + "suggestedKeepAssetIds": { + "description": "Suggested asset IDs to keep based on file size and EXIF data", + "items": { + "format": "uuid", + "type": "string" + }, + "type": "array" } }, "required": [ "assets", - "duplicateId" + "duplicateId", + "suggestedKeepAssetIds" ], "type": "object" }, @@ -19144,7 +19248,7 @@ "type": "boolean" }, "withPeople": { - "description": "Include assets with people", + "description": "Include people data in response", "type": "boolean" }, "withStacked": { @@ -20883,7 +20987,7 @@ "type": "boolean" }, "withPeople": { - "description": "Include assets with people", + "description": "Include people data in response", "type": "boolean" }, "withStacked": { diff --git a/open-api/typescript-sdk/.nvmrc b/open-api/typescript-sdk/.nvmrc index 32f8c50de0..8e35034890 100644 --- a/open-api/typescript-sdk/.nvmrc +++ b/open-api/typescript-sdk/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.1 diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index 89b48d1d13..d502ac5eb4 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@immich/sdk", - "version": "2.5.6", + "version": "2.6.3", "description": "Auto-generated TypeScript SDK for the Immich API", "type": "module", "main": "./build/index.js", @@ -19,7 +19,7 @@ "@oazapfts/runtime": "^1.0.2" }, "devDependencies": { - "@types/node": "^24.11.0", + "@types/node": "^24.12.0", "typescript": "^5.3.3" }, "repository": { @@ -28,6 +28,6 @@ "directory": "open-api/typescript-sdk" }, "volta": { - "node": "24.13.1" + "node": "24.14.1" } } diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 5c8ac6dbc1..fc465ce529 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -1,6 +1,6 @@ /** * Immich - * 2.5.6 + * 2.6.3 * DO NOT MODIFY - This file has been generated using oazapfts. * See https://www.npmjs.com/package/oazapfts */ @@ -725,6 +725,7 @@ export type BulkIdsDto = { export type BulkIdResponseDto = { /** Error reason if failed */ error?: Error; + errorMessage?: string; /** ID */ id: string; /** Whether operation succeeded */ @@ -1163,6 +1164,19 @@ export type DuplicateResponseDto = { assets: AssetResponseDto[]; /** Duplicate group ID */ duplicateId: string; + /** Suggested asset IDs to keep based on file size and EXIF data */ + suggestedKeepAssetIds: string[]; +}; +export type DuplicateResolveGroupDto = { + duplicateId: string; + /** Asset IDs to keep */ + keepAssetIds: string[]; + /** Asset IDs to trash or delete */ + trashAssetIds: string[]; +}; +export type DuplicateResolveDto = { + /** List of duplicate groups to resolve */ + groups: DuplicateResolveGroupDto[]; }; export type PersonResponseDto = { /** Person date of birth */ @@ -1741,7 +1755,7 @@ export type MetadataSearchDto = { withDeleted?: boolean; /** Include EXIF data in response */ withExif?: boolean; - /** Include assets with people */ + /** Include people data in response */ withPeople?: boolean; /** Include stacked assets */ withStacked?: boolean; @@ -1855,7 +1869,7 @@ export type RandomSearchDto = { withDeleted?: boolean; /** Include EXIF data in response */ withExif?: boolean; - /** Include assets with people */ + /** Include people data in response */ withPeople?: boolean; /** Include stacked assets */ withStacked?: boolean; @@ -4531,6 +4545,21 @@ export function getAssetDuplicates(opts?: Oazapfts.RequestOpts) { ...opts })); } +/** + * Resolve duplicate groups + */ +export function resolveDuplicates({ duplicateResolveDto }: { + duplicateResolveDto: DuplicateResolveDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchJson<{ + status: 200; + data: BulkIdResponseDto[]; + }>("/duplicates/resolve", oazapfts.json({ + ...opts, + method: "POST", + body: duplicateResolveDto + }))); +} /** * Delete a duplicate */ @@ -5987,19 +6016,14 @@ export function updateSharedLink({ id, sharedLinkEditDto }: { /** * Remove assets from a shared link */ -export function removeSharedLinkAssets({ id, key, slug, assetIdsDto }: { +export function removeSharedLinkAssets({ id, assetIdsDto }: { id: string; - key?: string; - slug?: string; assetIdsDto: AssetIdsDto; }, opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; data: AssetIdsResponseDto[]; - }>(`/shared-links/${encodeURIComponent(id)}/assets${QS.query(QS.explode({ - key, - slug - }))}`, oazapfts.json({ + }>(`/shared-links/${encodeURIComponent(id)}/assets`, oazapfts.json({ ...opts, method: "DELETE", body: assetIdsDto @@ -6898,13 +6922,15 @@ export enum BulkIdErrorReason { Duplicate = "duplicate", NoPermission = "no_permission", NotFound = "not_found", - Unknown = "unknown" + Unknown = "unknown", + Validation = "validation" } export enum Error { Duplicate = "duplicate", NoPermission = "no_permission", NotFound = "not_found", - Unknown = "unknown" + Unknown = "unknown", + Validation = "validation" } export enum Permission { All = "all", diff --git a/package.json b/package.json index 4449cfbdd2..e33d46df96 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "immich-monorepo", - "version": "2.5.6", + "version": "2.6.3", "description": "Monorepo for Immich", "private": true, - "packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017", + "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be", "engines": { "pnpm": ">=10.0.0" } diff --git a/plugins/package-lock.json b/plugins/package-lock.json index 9ebaa59a02..3f004d7dba 100644 --- a/plugins/package-lock.json +++ b/plugins/package-lock.json @@ -15,9 +15,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], @@ -32,9 +32,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], @@ -49,9 +49,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], @@ -66,9 +66,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], @@ -83,9 +83,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], @@ -100,9 +100,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], @@ -117,9 +117,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], @@ -134,9 +134,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], @@ -151,9 +151,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], @@ -168,9 +168,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], @@ -185,9 +185,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], @@ -202,9 +202,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], @@ -219,9 +219,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], @@ -236,9 +236,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], @@ -253,9 +253,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], @@ -270,9 +270,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], @@ -287,9 +287,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], @@ -304,9 +304,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], @@ -321,9 +321,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], @@ -338,9 +338,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "cpu": [ "arm64" ], @@ -355,9 +355,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], @@ -372,9 +372,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "cpu": [ "arm64" ], @@ -389,9 +389,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], @@ -406,9 +406,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], @@ -423,9 +423,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], @@ -440,9 +440,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], @@ -467,9 +467,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -480,32 +480,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/typescript": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10619cdb83..cf030777b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,11 +63,11 @@ importers: specifier: ^4.13.1 version: 4.13.4 '@types/node': - specifier: ^24.11.0 + specifier: ^24.12.0 version: 24.12.0 '@vitest/coverage-v8': specifier: ^4.0.0 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) byte-size: specifier: ^9.0.0 version: 9.0.1 @@ -108,17 +108,14 @@ importers: specifier: ^8.28.0 version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) vite: - specifier: ^7.0.0 - version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - vite-tsconfig-paths: - specifier: ^6.0.0 - version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^8.0.0 + version: 8.0.0(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vitest: specifier: ^4.0.0 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vitest-fetch-mock: specifier: ^0.4.0 - version: 0.4.5(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.4.5(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) yaml: specifier: ^2.3.1 version: 2.8.2 @@ -220,7 +217,7 @@ importers: specifier: ^3.4.2 version: 3.7.1 '@types/node': - specifier: ^24.11.0 + specifier: ^24.12.0 version: 24.12.0 '@types/pg': specifier: ^8.15.1 @@ -287,10 +284,10 @@ importers: version: 5.2.1(encoding@0.1.13) vite-tsconfig-paths: specifier: ^6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.1.1(typescript@5.9.3)(vite@8.0.0(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) vitest: specifier: ^4.0.0 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) e2e-auth-server: devDependencies: @@ -323,7 +320,7 @@ importers: version: 1.2.0 devDependencies: '@types/node': - specifier: ^24.11.0 + specifier: ^24.12.0 version: 24.12.0 typescript: specifier: ^5.3.3 @@ -472,6 +469,9 @@ importers: handlebars: specifier: ^4.7.8 version: 4.7.8 + helmet: + specifier: ^8.1.0 + version: 8.1.0 i18n-iso-countries: specifier: ^7.6.0 version: 7.14.0 @@ -488,11 +488,11 @@ importers: specifier: ^9.0.2 version: 9.0.3 kysely: - specifier: 0.28.11 - version: 0.28.11 + specifier: 0.28.14 + version: 0.28.14 kysely-postgres-js: specifier: ^3.0.0 - version: 3.0.0(kysely@0.28.11)(postgres@3.4.8) + version: 3.0.0(kysely@0.28.14)(postgres@3.4.8) lodash: specifier: ^4.17.21 version: 4.17.23 @@ -513,13 +513,13 @@ importers: version: 5.4.3(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(reflect-metadata@0.2.2)(rxjs@7.8.2) nestjs-kysely: specifier: 3.1.2 - version: 3.1.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(kysely@0.28.11)(reflect-metadata@0.2.2) + version: 3.1.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(kysely@0.28.14)(reflect-metadata@0.2.2) nestjs-otel: specifier: ^7.0.0 version: 7.0.1(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16) nodemailer: - specifier: ^7.0.0 - version: 7.0.13 + specifier: ^8.0.0 + version: 8.0.4 openid-client: specifier: ^6.3.3 version: 6.8.2 @@ -592,7 +592,7 @@ importers: version: 10.0.1(eslint@10.0.2(jiti@2.6.1)) '@nestjs/cli': specifier: ^11.0.2 - version: 11.0.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(@types/node@24.12.0) + version: 11.0.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(@types/node@24.12.0)(esbuild@0.27.3) '@nestjs/schematics': specifier: ^11.0.0 version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) @@ -645,7 +645,7 @@ importers: specifier: ^2.0.0 version: 2.1.0 '@types/node': - specifier: ^24.11.0 + specifier: ^24.12.0 version: 24.12.0 '@types/nodemailer': specifier: ^7.0.0 @@ -676,7 +676,7 @@ importers: version: 13.15.10 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) eslint: specifier: ^10.0.0 version: 10.0.2(jiti@2.6.1) @@ -730,10 +730,10 @@ importers: version: 1.5.9(@swc/core@1.15.18(@swc/helpers@0.5.17))(rollup@4.55.1) vite-tsconfig-paths: specifier: ^6.0.0 - version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.1.1(typescript@5.9.3)(vite@8.0.0(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) web: dependencies: @@ -747,8 +747,8 @@ importers: specifier: workspace:* version: link:../open-api/typescript-sdk '@immich/ui': - specifier: ^0.64.0 - version: 0.64.0(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7) + specifier: ^0.69.0 + version: 0.69.0(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1) '@mapbox/mapbox-gl-rtl-text': specifier: 0.3.0 version: 0.3.0 @@ -781,7 +781,7 @@ importers: version: 0.42.0 '@zoom-image/svelte': specifier: ^0.3.0 - version: 0.3.9(svelte@5.53.7) + version: 0.3.9(svelte@5.54.1) dom-to-image: specifier: ^2.6.0 version: 2.6.0 @@ -817,7 +817,7 @@ importers: version: 5.19.0 media-chrome: specifier: ^4.17.2 - version: 4.17.2(react@19.2.4) + version: 4.18.3(react@19.2.4) pmtiles: specifier: ^4.3.0 version: 4.4.0 @@ -835,16 +835,16 @@ importers: version: 5.2.2 svelte-i18n: specifier: ^4.0.1 - version: 4.0.1(svelte@5.53.7) + version: 4.0.1(svelte@5.54.1) svelte-jsoneditor: specifier: ^3.10.0 - version: 3.11.0(svelte@5.53.7) + version: 3.11.0(svelte@5.54.1) svelte-maplibre: specifier: ^1.2.5 - version: 1.2.6(svelte@5.53.7) + version: 1.2.6(svelte@5.54.1) svelte-persisted-store: specifier: ^0.12.0 - version: 0.12.0(svelte@5.53.7) + version: 0.12.0(svelte@5.54.1) tabbable: specifier: ^6.2.0 version: 6.4.0 @@ -853,7 +853,7 @@ importers: version: 3.5.0 tailwind-variants: specifier: ^3.2.2 - version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) + version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.2) thumbhash: specifier: ^0.1.1 version: 0.1.1 @@ -878,25 +878,25 @@ importers: version: 3.1.2 '@sveltejs/adapter-static': specifier: ^3.0.8 - version: 3.0.10(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))) + version: 3.0.10(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))) '@sveltejs/enhanced-img': - specifier: ^0.10.0 - version: 0.10.3(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(rollup@4.55.1)(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^0.10.4 + version: 0.10.4(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(rollup@4.55.1)(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@sveltejs/kit': specifier: ^2.27.1 - version: 2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': - specifier: 6.2.4 - version: 6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 7.0.0 + version: 7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@tailwindcss/vite': - specifier: ^4.1.7 - version: 4.2.1(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^4.2.2 + version: 4.2.2(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@testing-library/jest-dom': specifier: ^6.4.2 version: 6.9.1 '@testing-library/svelte': specifier: ^5.2.8 - version: 5.3.1(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.3.1(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@testing-library/user-event': specifier: ^14.5.2 version: 14.6.1(@testing-library/dom@10.4.1) @@ -920,7 +920,7 @@ importers: version: 1.5.6 '@vitest/coverage-v8': specifier: ^4.0.0 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) dotenv: specifier: ^17.0.0 version: 17.3.1 @@ -935,7 +935,7 @@ importers: version: 6.2.1(eslint@10.0.2(jiti@2.6.1)) eslint-plugin-svelte: specifier: ^3.12.4 - version: 3.15.0(eslint@10.0.2(jiti@2.6.1))(svelte@5.53.7) + version: 3.15.0(eslint@10.0.2(jiti@2.6.1))(svelte@5.54.1) eslint-plugin-unicorn: specifier: ^63.0.0 version: 63.0.0(eslint@10.0.2(jiti@2.6.1)) @@ -956,22 +956,22 @@ importers: version: 4.2.0(prettier@3.8.1) prettier-plugin-svelte: specifier: ^3.3.3 - version: 3.5.1(prettier@3.8.1)(svelte@5.53.7) + version: 3.5.1(prettier@3.8.1)(svelte@5.54.1) rollup-plugin-visualizer: specifier: ^6.0.0 - version: 6.0.11(rollup@4.55.1) + version: 6.0.11(rolldown@1.0.0-rc.9)(rollup@4.55.1) svelte: - specifier: 5.53.7 - version: 5.53.7 + specifier: 5.54.1 + version: 5.54.1 svelte-check: specifier: ^4.1.5 - version: 4.4.4(picomatch@4.0.3)(svelte@5.53.7)(typescript@5.9.3) + version: 4.4.4(picomatch@4.0.3)(svelte@5.54.1)(typescript@5.9.3) svelte-eslint-parser: specifier: ^1.3.3 - version: 1.6.0(svelte@5.53.7) + version: 1.6.0(svelte@5.54.1) tailwindcss: - specifier: ^4.1.7 - version: 4.2.1 + specifier: ^4.2.2 + version: 4.2.2 typescript: specifier: ^5.8.3 version: 5.9.3 @@ -979,11 +979,11 @@ importers: specifier: ^8.45.0 version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) vite: - specifier: ^7.1.2 - version: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^8.0.0 + version: 8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vitest: specifier: ^4.0.0 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) packages: @@ -2267,9 +2267,15 @@ packages: resolution: {integrity: sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==} engines: {node: '>=20.0'} + '@emnapi/core@1.9.0': + resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -3038,8 +3044,8 @@ packages: peerDependencies: svelte: ^5.0.0 - '@immich/ui@0.64.0': - resolution: {integrity: sha512-jbPN1x9KAAcW18h4RO7skbFYjkR4Lg+mEVjSDzsPC2NBNzSi4IA0PIHhFEwnD5dk4OS7+UjRG8m5/QTyotrm4A==} + '@immich/ui@0.69.0': + resolution: {integrity: sha512-YQ+27pGQhzdRBOo/7cHcbXnax5BUrrJeYjUc+VdRYp6KMS8SlGWAKQhvZPdcqiPB332fxJMmpHjV+VqXJJjrqg==} peerDependencies: svelte: ^5.0.0 @@ -3431,6 +3437,9 @@ packages: '@namnode/store@0.1.0': resolution: {integrity: sha512-4NGTldxKcmY0UuZ7OEkvCjs8ZEoeYB6M2UwMu74pdLiFMKxXbj9HdNk1Qn213bxX1O7bY5h+PLh5DZsTURZkYA==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@nestjs/bull-shared@11.0.4': resolution: {integrity: sha512-VBJcDHSAzxQnpcDfA0kt9MTGUD1XZzfByV70su0W0eDCQ9aqIEBlzWRW21tv9FG9dIut22ysgDidshdjlnczLw==} peerDependencies: @@ -3807,6 +3816,13 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@oxc-project/runtime@0.115.0': + resolution: {integrity: sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.115.0': + resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} + '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} @@ -4121,6 +4137,104 @@ packages: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 + '@rolldown/binding-android-arm64@1.0.0-rc.9': + resolution: {integrity: sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.9': + resolution: {integrity: sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.9': + resolution: {integrity: sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.9': + resolution: {integrity: sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9': + resolution: {integrity: sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9': + resolution: {integrity: sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.9': + resolution: {integrity: sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.9': + resolution: {integrity: sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9': + resolution: {integrity: sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9': + resolution: {integrity: sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9': + resolution: {integrity: sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.9': + resolution: {integrity: sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==} + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -4328,10 +4442,10 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/enhanced-img@0.10.3': - resolution: {integrity: sha512-/6tYiqVmVgWcntSD/TChENE74yN8Gde9JEN8gyGKtm2ytlsUzGiS8loPPiO7Lh4V/rSsOFbvLdXPdiNVztMArA==} + '@sveltejs/enhanced-img@0.10.4': + resolution: {integrity: sha512-Am5nmAKUo7Nboqq7Dhtfn7dcXA087d7gIz6Vecn1opB41aJ680+0q9U9KvEcMgduOyeiwckTIOQOx4Mmq9GcvA==} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^6.0.0 + '@sveltejs/vite-plugin-svelte': ^6.0.0 || ^7.0.0 svelte: ^5.0.0 vite: ^6.3.0 || >=7.0.0 @@ -4351,20 +4465,12 @@ packages: typescript: optional: true - '@sveltejs/vite-plugin-svelte-inspector@5.0.1': - resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} + '@sveltejs/vite-plugin-svelte@7.0.0': + resolution: {integrity: sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g==} engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 - svelte: ^5.0.0 - vite: ^6.3.0 || ^7.0.0 - - '@sveltejs/vite-plugin-svelte@6.2.4': - resolution: {integrity: sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==} - engines: {node: ^20.19 || ^22.12 || >=24} - peerDependencies: - svelte: ^5.0.0 - vite: ^6.3.0 || ^7.0.0 + svelte: ^5.46.4 + vite: ^8.0.0-beta.7 || ^8.0.0 '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} @@ -4530,69 +4636,69 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} - '@tailwindcss/node@4.2.1': - resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} - '@tailwindcss/oxide-android-arm64@4.2.1': - resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.1': - resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.1': - resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.1': - resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': - resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': - resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': - resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': - resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.1': - resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.1': - resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -4603,26 +4709,26 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': - resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': - resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.1': - resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.2.1': - resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} + '@tailwindcss/vite@4.2.2': + resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 + vite: ^5.2.0 || ^6 || ^7 || ^8 '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -4677,6 +4783,9 @@ packages: '@turf/invariant@7.3.2': resolution: {integrity: sha512-brGmL1EFhZH/YNXhq6S+8sPWBEnmvEyxMWJO8bUNOFZyWHYiRTwxQHZM+An1blkbQ77PiEzsdNAspZqE1j7YKA==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} @@ -6760,6 +6869,9 @@ packages: devalue@5.6.3: resolution: {integrity: sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==} + devalue@5.6.4: + resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -7739,6 +7851,10 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + helmet@8.1.0: + resolution: {integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==} + engines: {node: '>=18.0.0'} + highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} @@ -8403,8 +8519,8 @@ packages: postgres: optional: true - kysely@0.28.11: - resolution: {integrity: sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg==} + kysely@0.28.14: + resolution: {integrity: sha512-SU3lgh0rPvq7upc6vvdVrCsSMUG1h3ChvHVOY7wJ2fw4C9QEB7X3d5eyYEyULUX7UQtxZJtZXGuT6U2US72UYA==} engines: {node: '>=20.0.0'} langium@3.3.1: @@ -8442,78 +8558,78 @@ packages: libphonenumber-js@1.12.38: resolution: {integrity: sha512-vwzxmasAy9hZigxtqTbFEwp8ZdZ975TiqVDwj5bKx5sR+zi5ucUQy9mbVTkKM9GzqdLdxux/hTw2nmN5J7POMA==} - lightningcss-android-arm64@1.31.1: - resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.31.1: - resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.31.1: - resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.31.1: - resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.31.1: - resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.31.1: - resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.31.1: - resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.31.1: - resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.31.1: - resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.31.1: - resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.31.1: - resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.31.1: - resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lilconfig@2.1.0: @@ -8785,8 +8901,8 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - media-chrome@4.17.2: - resolution: {integrity: sha512-o/IgiHx0tdSVwRxxqF5H12FK31A/A8T71sv3KdAvh7b6XeBS9dXwqvIFwlR9kdEuqg3n7xpmRIuL83rmYq8FTg==} + media-chrome@4.18.3: + resolution: {integrity: sha512-YuS2wY0Fn+2nXGijJYn4+IE0n9wFe3v6SvOZHGNkoxh32T/cCcrXHUWskA+9tyYTONa6JKwKAOJJeO6QOlJLKw==} media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} @@ -9282,8 +9398,8 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - nodemailer@7.0.13: - resolution: {integrity: sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==} + nodemailer@8.0.4: + resolution: {integrity: sha512-k+jf6N8PfQJ0Fe8ZhJlgqU5qJU44Lpvp2yvidH3vp1lPnVQMgi4yEEMPXg5eJS1gFIJTVq1NHBk7Ia9ARdSBdQ==} engines: {node: '>=6.0.0'} nopt@1.0.10: @@ -10628,6 +10744,11 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rolldown@1.0.0-rc.9: + resolution: {integrity: sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-visualizer@6.0.11: resolution: {integrity: sha512-TBwVHVY7buHjIKVLqr9scTVFwqZqMXINcCphPwIWKPDCOBIa+jCQfafvbjRJDZgXdq/A996Dy6yGJ/+/NtAXDQ==} engines: {node: '>=18'} @@ -11229,8 +11350,8 @@ packages: peerDependencies: svelte: ^5.30.2 - svelte@5.53.7: - resolution: {integrity: sha512-uxck1KI7JWtlfP3H6HOWi/94soAl23jsGJkBzN2BAWcQng0+lTrRNhxActFqORgnO9BHVd1hKJhG+ljRuIUWfQ==} + svelte@5.54.1: + resolution: {integrity: sha512-ow8tncN097Ty8U1H+C3bM1xNlsCbnO2UZeN0lWBnv8f3jKho7QTTQ2LWbMXrPQDodLjH91n4kpNnLolyRhVE6A==} engines: {node: '>=18'} svg-parser@2.0.4: @@ -11304,8 +11425,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.2.1: - resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} @@ -11888,10 +12009,53 @@ packages: yaml: optional: true - vitefu@1.1.1: - resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + vite@8.0.0: + resolution: {integrity: sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.0.0-alpha.31 + esbuild: ^0.27.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.2: + resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0 peerDependenciesMeta: vite: optional: true @@ -14452,11 +14616,22 @@ snapshots: - uglify-js - webpack-cli + '@emnapi/core@1.9.0': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.19.12': optional: true @@ -14954,31 +15129,31 @@ snapshots: '@immich/sql-tools@0.3.2': dependencies: commander: 14.0.3 - kysely: 0.28.11 - kysely-postgres-js: 3.0.0(kysely@0.28.11)(postgres@3.4.8) + kysely: 0.28.14 + kysely-postgres-js: 3.0.0(kysely@0.28.14)(postgres@3.4.8) pg-connection-string: 2.12.0 postgres: 3.4.8 - '@immich/svelte-markdown-preprocess@0.2.1(svelte@5.53.7)': + '@immich/svelte-markdown-preprocess@0.2.1(svelte@5.54.1)': dependencies: front-matter: 4.0.2 marked: 17.0.3 node-emoji: 2.2.0 - svelte: 5.53.7 + svelte: 5.54.1 - '@immich/ui@0.64.0(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)': + '@immich/ui@0.69.0(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)': dependencies: - '@immich/svelte-markdown-preprocess': 0.2.1(svelte@5.53.7) + '@immich/svelte-markdown-preprocess': 0.2.1(svelte@5.54.1) '@internationalized/date': 3.10.0 '@mdi/js': 7.4.47 - bits-ui: 2.16.0(@internationalized/date@3.10.0)(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7) + bits-ui: 2.16.0(@internationalized/date@3.10.0)(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1) luxon: 3.7.2 simple-icons: 16.9.0 - svelte: 5.53.7 + svelte: 5.54.1 svelte-highlight: 7.9.0 tailwind-merge: 3.5.0 - tailwind-variants: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) - tailwindcss: 4.2.1 + tailwind-variants: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.2) + tailwindcss: 4.2.2 transitivePeerDependencies: - '@sveltejs/kit' @@ -15435,6 +15610,13 @@ snapshots: '@namnode/store@0.1.0': {} + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.9.0 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nestjs/bull-shared@11.0.4(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)': dependencies: '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -15449,7 +15631,7 @@ snapshots: bullmq: 5.70.4 tslib: 2.8.1 - '@nestjs/cli@11.0.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(@types/node@24.12.0)': + '@nestjs/cli@11.0.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(@types/node@24.12.0)(esbuild@0.27.3)': dependencies: '@angular-devkit/core': 19.2.19(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) @@ -15460,14 +15642,14 @@ snapshots: chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3)) glob: 13.0.0 node-emoji: 1.11.0 ora: 5.4.1 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 5.9.3 - webpack: 5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.15.18(@swc/helpers@0.5.17) @@ -15913,6 +16095,10 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@oxc-project/runtime@0.115.0': {} + + '@oxc-project/types@0.115.0': {} + '@paralleldrive/cuid2@2.3.1': dependencies: '@noble/hashes': 1.8.0 @@ -16172,6 +16358,55 @@ snapshots: '@codemirror/state': 6.5.3 '@codemirror/view': 6.39.8 + '@rolldown/binding-android-arm64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.9': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.9': {} + '@rollup/pluginutils@5.3.0(rollup@4.55.1)': dependencies: '@types/estree': 1.0.8 @@ -16311,29 +16546,29 @@ snapshots: dependencies: acorn: 8.16.0 - '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))': + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))': dependencies: - '@sveltejs/kit': 2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - '@sveltejs/enhanced-img@0.10.3(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(rollup@4.55.1)(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/enhanced-img@0.10.4(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(rollup@4.55.1)(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) magic-string: 0.30.21 sharp: 0.34.5 - svelte: 5.53.7 - svelte-parse-markup: 0.1.5(svelte@5.53.7) - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + svelte: 5.54.1 + svelte-parse-markup: 0.1.5(svelte@5.54.1) + vite: 8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vite-imagetools: 9.0.3(rollup@4.55.1) zimmerframe: 1.1.4 transitivePeerDependencies: - rollup - supports-color - '@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -16344,32 +16579,20 @@ snapshots: mrmime: 2.0.1 set-cookie-parser: 3.0.1 sirv: 3.0.2 - svelte: 5.53.7 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + svelte: 5.54.1 + vite: 8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: '@opentelemetry/api': 1.9.0 typescript: 5.9.3 - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - debug: 4.4.3 - svelte: 5.53.7 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 - svelte: 5.53.7 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - transitivePeerDependencies: - - supports-color + svelte: 5.54.1 + vite: 8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.5)': dependencies: @@ -16525,73 +16748,73 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/node@4.2.1': + '@tailwindcss/node@4.2.2': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.20.0 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.1 + tailwindcss: 4.2.2 - '@tailwindcss/oxide-android-arm64@4.2.1': + '@tailwindcss/oxide-android-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.1': + '@tailwindcss/oxide-darwin-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.1': + '@tailwindcss/oxide-darwin-x64@4.2.2': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.1': + '@tailwindcss/oxide-freebsd-x64@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.1': + '@tailwindcss/oxide-linux-x64-musl@4.2.2': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.1': + '@tailwindcss/oxide-wasm32-wasi@4.2.2': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': optional: true - '@tailwindcss/oxide@4.2.1': + '@tailwindcss/oxide@4.2.2': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-x64': 4.2.1 - '@tailwindcss/oxide-freebsd-x64': 4.2.1 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-x64-musl': 4.2.1 - '@tailwindcss/oxide-wasm32-wasi': 4.2.1 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.2(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@tailwindcss/node': 4.2.1 - '@tailwindcss/oxide': 4.2.1 - tailwindcss: 4.2.1 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + tailwindcss: 4.2.2 + vite: 8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) '@testing-library/dom@10.4.1': dependencies: @@ -16613,18 +16836,18 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/svelte-core@1.0.0(svelte@5.53.7)': + '@testing-library/svelte-core@1.0.0(svelte@5.54.1)': dependencies: - svelte: 5.53.7 + svelte: 5.54.1 - '@testing-library/svelte@5.3.1(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@testing-library/svelte@5.3.1(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@testing-library/dom': 10.4.1 - '@testing-library/svelte-core': 1.0.0(svelte@5.53.7) - svelte: 5.53.7 + '@testing-library/svelte-core': 1.0.0(svelte@5.54.1) + svelte: 5.54.1 optionalDependencies: - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -16660,6 +16883,11 @@ snapshots: '@types/geojson': 7946.0.16 tslib: 2.8.1 + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/accepts@1.3.7': dependencies: '@types/node': 24.12.0 @@ -17318,7 +17546,7 @@ snapshots: '@vercel/oidc@3.0.5': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -17333,11 +17561,11 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -17349,9 +17577,9 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -17363,7 +17591,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/expect@3.2.4': dependencies: @@ -17382,29 +17610,29 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -17538,10 +17766,10 @@ snapshots: dependencies: '@namnode/store': 0.1.0 - '@zoom-image/svelte@0.3.9(svelte@5.53.7)': + '@zoom-image/svelte@0.3.9(svelte@5.54.1)': dependencies: '@zoom-image/core': 0.42.0 - svelte: 5.53.7 + svelte: 5.54.1 abbrev@1.1.1: {} @@ -17905,15 +18133,15 @@ snapshots: binary-extensions@2.3.0: {} - bits-ui@2.16.0(@internationalized/date@3.10.0)(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7): + bits-ui@2.16.0(@internationalized/date@3.10.0)(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1): dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/dom': 1.7.4 '@internationalized/date': 3.10.0 esm-env: 1.2.2 - runed: 0.35.1(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7) - svelte: 5.53.7 - svelte-toolbelt: 0.10.6(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7) + runed: 0.35.1(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1) + svelte: 5.54.1 + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1) tabbable: 6.4.0 transitivePeerDependencies: - '@sveltejs/kit' @@ -19010,6 +19238,8 @@ snapshots: devalue@5.6.3: {} + devalue@5.6.4: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -19418,7 +19648,7 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 10.1.8(eslint@10.0.2(jiti@2.6.1)) - eslint-plugin-svelte@3.15.0(eslint@10.0.2(jiti@2.6.1))(svelte@5.53.7): + eslint-plugin-svelte@3.15.0(eslint@10.0.2(jiti@2.6.1))(svelte@5.54.1): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) '@jridgewell/sourcemap-codec': 1.5.5 @@ -19430,9 +19660,9 @@ snapshots: postcss-load-config: 3.1.4(postcss@8.5.8) postcss-safe-parser: 7.0.1(postcss@8.5.8) semver: 7.7.4 - svelte-eslint-parser: 1.6.0(svelte@5.53.7) + svelte-eslint-parser: 1.6.0(svelte@5.54.1) optionalDependencies: - svelte: 5.53.7 + svelte: 5.54.1 transitivePeerDependencies: - ts-node @@ -19897,7 +20127,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3)): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -19912,7 +20142,7 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.9.3 - webpack: 5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3) form-data-encoder@2.1.4: {} @@ -20353,6 +20583,8 @@ snapshots: he@1.2.0: {} + helmet@8.1.0: {} + highlight.js@11.11.1: {} history@4.10.1: @@ -21073,13 +21305,13 @@ snapshots: type-is: 2.0.1 vary: 1.1.2 - kysely-postgres-js@3.0.0(kysely@0.28.11)(postgres@3.4.8): + kysely-postgres-js@3.0.0(kysely@0.28.14)(postgres@3.4.8): dependencies: - kysely: 0.28.11 + kysely: 0.28.14 optionalDependencies: postgres: 3.4.8 - kysely@0.28.11: {} + kysely@0.28.14: {} langium@3.3.1: dependencies: @@ -21117,54 +21349,54 @@ snapshots: libphonenumber-js@1.12.38: {} - lightningcss-android-arm64@1.31.1: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.31.1: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.31.1: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.31.1: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.31.1: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.31.1: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.31.1: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.31.1: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.31.1: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.31.1: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.31.1: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.31.1: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.31.1 - lightningcss-darwin-arm64: 1.31.1 - lightningcss-darwin-x64: 1.31.1 - lightningcss-freebsd-x64: 1.31.1 - lightningcss-linux-arm-gnueabihf: 1.31.1 - lightningcss-linux-arm64-gnu: 1.31.1 - lightningcss-linux-arm64-musl: 1.31.1 - lightningcss-linux-x64-gnu: 1.31.1 - lightningcss-linux-x64-musl: 1.31.1 - lightningcss-win32-arm64-msvc: 1.31.1 - lightningcss-win32-x64-msvc: 1.31.1 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lilconfig@2.1.0: {} @@ -21560,7 +21792,7 @@ snapshots: mdn-data@2.0.30: {} - media-chrome@4.17.2(react@19.2.4): + media-chrome@4.18.3(react@19.2.4): dependencies: ce-la-react: 0.3.2(react@19.2.4) transitivePeerDependencies: @@ -22151,11 +22383,11 @@ snapshots: reflect-metadata: 0.2.2 rxjs: 7.8.2 - nestjs-kysely@3.1.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(kysely@0.28.11)(reflect-metadata@0.2.2): + nestjs-kysely@3.1.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(kysely@0.28.14)(reflect-metadata@0.2.2): dependencies: '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.16)(@nestjs/websockets@11.1.16)(reflect-metadata@0.2.2)(rxjs@7.8.2) - kysely: 0.28.11 + kysely: 0.28.14 reflect-metadata: 0.2.2 tslib: 2.8.1 @@ -22232,7 +22464,7 @@ snapshots: node-releases@2.0.27: {} - nodemailer@7.0.13: {} + nodemailer@8.0.4: {} nopt@1.0.10: dependencies: @@ -23176,10 +23408,10 @@ snapshots: dependencies: prettier: 3.8.1 - prettier-plugin-svelte@3.5.1(prettier@3.8.1)(svelte@5.53.7): + prettier-plugin-svelte@3.5.1(prettier@3.8.1)(svelte@5.54.1): dependencies: prettier: 3.8.1 - svelte: 5.53.7 + svelte: 5.54.1 prettier@3.8.1: {} @@ -23709,13 +23941,35 @@ snapshots: robust-predicates@3.0.2: {} - rollup-plugin-visualizer@6.0.11(rollup@4.55.1): + rolldown@1.0.0-rc.9: + dependencies: + '@oxc-project/types': 0.115.0 + '@rolldown/pluginutils': 1.0.0-rc.9 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.9 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.9 + '@rolldown/binding-darwin-x64': 1.0.0-rc.9 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.9 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.9 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.9 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.9 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.9 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.9 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.9 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.9 + + rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.55.1): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: + rolldown: 1.0.0-rc.9 rollup: 4.55.1 rollup@4.55.1: @@ -23784,14 +24038,14 @@ snapshots: dependencies: queue-microtask: 1.2.3 - runed@0.35.1(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7): + runed@0.35.1(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 - svelte: 5.53.7 + svelte: 5.54.1 optionalDependencies: - '@sveltejs/kit': 2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) rw@1.3.3: {} @@ -24415,23 +24669,23 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-awesome@3.3.5(svelte@5.53.7): + svelte-awesome@3.3.5(svelte@5.54.1): dependencies: - svelte: 5.53.7 + svelte: 5.54.1 - svelte-check@4.4.4(picomatch@4.0.3)(svelte@5.53.7)(typescript@5.9.3): + svelte-check@4.4.4(picomatch@4.0.3)(svelte@5.54.1)(typescript@5.9.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 fdir: 6.5.0(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.53.7 + svelte: 5.54.1 typescript: 5.9.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@1.6.0(svelte@5.53.7): + svelte-eslint-parser@1.6.0(svelte@5.54.1): dependencies: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -24441,7 +24695,7 @@ snapshots: postcss-selector-parser: 7.1.1 semver: 7.7.4 optionalDependencies: - svelte: 5.53.7 + svelte: 5.54.1 svelte-floating-ui@1.5.8: dependencies: @@ -24454,7 +24708,7 @@ snapshots: dependencies: highlight.js: 11.11.1 - svelte-i18n@4.0.1(svelte@5.53.7): + svelte-i18n@4.0.1(svelte@5.54.1): dependencies: cli-color: 2.0.4 deepmerge: 4.3.1 @@ -24462,10 +24716,10 @@ snapshots: estree-walker: 2.0.2 intl-messageformat: 10.7.18 sade: 1.8.1 - svelte: 5.53.7 + svelte: 5.54.1 tiny-glob: 0.2.9 - svelte-jsoneditor@3.11.0(svelte@5.53.7): + svelte-jsoneditor@3.11.0(svelte@5.54.1): dependencies: '@codemirror/autocomplete': 6.20.0 '@codemirror/commands': 6.10.1 @@ -24492,42 +24746,42 @@ snapshots: memoize-one: 6.0.0 natural-compare-lite: 1.4.0 sass: 1.97.1 - svelte: 5.53.7 - svelte-awesome: 3.3.5(svelte@5.53.7) + svelte: 5.54.1 + svelte-awesome: 3.3.5(svelte@5.54.1) svelte-select: 5.8.3 vanilla-picker: 2.12.3 - svelte-maplibre@1.2.6(svelte@5.53.7): + svelte-maplibre@1.2.6(svelte@5.54.1): dependencies: d3-geo: 3.1.1 dequal: 2.0.3 just-compare: 2.3.0 maplibre-gl: 5.19.0 pmtiles: 3.2.1 - svelte: 5.53.7 + svelte: 5.54.1 - svelte-parse-markup@0.1.5(svelte@5.53.7): + svelte-parse-markup@0.1.5(svelte@5.54.1): dependencies: - svelte: 5.53.7 + svelte: 5.54.1 - svelte-persisted-store@0.12.0(svelte@5.53.7): + svelte-persisted-store@0.12.0(svelte@5.54.1): dependencies: - svelte: 5.53.7 + svelte: 5.54.1 svelte-select@5.8.3: dependencies: svelte-floating-ui: 1.5.8 - svelte-toolbelt@0.10.6(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7): + svelte-toolbelt@0.10.6(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1): dependencies: clsx: 2.1.1 - runed: 0.35.1(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.7) + runed: 0.35.1(@sveltejs/kit@2.53.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.54.1)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1) style-to-object: 1.0.14 - svelte: 5.53.7 + svelte: 5.54.1 transitivePeerDependencies: - '@sveltejs/kit' - svelte@5.53.7: + svelte@5.54.1: dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 @@ -24538,7 +24792,7 @@ snapshots: aria-query: 5.3.1 axobject-query: 4.1.0 clsx: 2.1.1 - devalue: 5.6.3 + devalue: 5.6.4 esm-env: 1.2.2 esrap: 2.2.3 is-reference: 3.0.3 @@ -24583,9 +24837,9 @@ snapshots: tailwind-merge@3.5.0: {} - tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1): + tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.2): dependencies: - tailwindcss: 4.2.1 + tailwindcss: 4.2.2 optionalDependencies: tailwind-merge: 3.5.0 @@ -24631,7 +24885,7 @@ snapshots: - tsx - yaml - tailwindcss@4.2.1: {} + tailwindcss@4.2.2: {} tapable@2.3.0: {} @@ -24696,16 +24950,17 @@ snapshots: - react-native-b4a optional: true - terser-webpack-plugin@5.3.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))): + terser-webpack-plugin@5.3.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3)(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.1 - webpack: 5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3) optionalDependencies: '@swc/core': 1.15.18(@swc/helpers@0.5.17) + esbuild: 0.27.3 terser-webpack-plugin@5.3.16(webpack@5.104.1): dependencies: @@ -25220,13 +25475,13 @@ snapshots: - rollup - supports-color - vite-node@3.2.4(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -25241,17 +25496,17 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@8.0.0(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.0(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -25263,13 +25518,13 @@ snapshots: '@types/node': 24.12.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 sass: 1.97.1 terser: 5.44.1 tsx: 4.21.0 yaml: 2.8.2 - vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -25281,25 +25536,61 @@ snapshots: '@types/node': 25.4.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 sass: 1.97.1 terser: 5.44.1 tsx: 4.21.0 yaml: 2.8.2 - vitefu@1.1.1(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): - optionalDependencies: - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - - vitest-fetch-mock@0.4.5(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite@8.0.0(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + '@oxc-project/runtime': 0.115.0 + lightningcss: 1.32.0 + picomatch: 4.0.3 + postcss: 8.5.8 + rolldown: 1.0.0-rc.9 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.12.0 + esbuild: 0.27.3 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.97.1 + terser: 5.44.1 + tsx: 4.21.0 + yaml: 2.8.2 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + '@oxc-project/runtime': 0.115.0 + lightningcss: 1.32.0 + picomatch: 4.0.3 + postcss: 8.5.8 + rolldown: 1.0.0-rc.9 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.4.0 + esbuild: 0.27.3 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.97.1 + terser: 5.44.1 + tsx: 4.21.0 + yaml: 2.8.2 + + vitefu@1.1.2(vite@8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + optionalDependencies: + vite: 8.0.0(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + + vitest-fetch-mock@0.4.5(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -25317,8 +25608,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -25339,10 +25630,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -25359,7 +25650,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -25379,10 +25670,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -25399,7 +25690,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -25419,10 +25710,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -25439,7 +25730,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -25622,7 +25913,7 @@ snapshots: - esbuild - uglify-js - webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17)): + webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -25646,7 +25937,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3)(webpack@5.104.1(@swc/core@1.15.18(@swc/helpers@0.5.17))(esbuild@0.27.3)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: diff --git a/renovate.json b/renovate.json index fbbc8976bd..0fdf5a7f69 100644 --- a/renovate.json +++ b/renovate.json @@ -27,6 +27,10 @@ "matchUpdateTypes": ["major"], "enabled": false }, + { + "matchPackageNames": ["ghcr.io/immich-app/base-server-*"], + "maxMajorIncrement": 0 + }, { "matchPackageNames": ["ruby"], "groupName": "ruby", diff --git a/server/.nvmrc b/server/.nvmrc index 32f8c50de0..8e35034890 100644 --- a/server/.nvmrc +++ b/server/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.1 diff --git a/server/Dockerfile b/server/Dockerfile index 9cc53c1095..476d58b983 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/immich-app/base-server-dev:202603031112@sha256:837536db5fd9e432f0f474ef9b61712fe3b3815821c3e4edf5e5b0b1f1ed30ad AS builder +FROM ghcr.io/immich-app/base-server-dev:202603251709@sha256:2bf3053c732fcb87ec90c3c614632ac44847423468ccc57fd935bff771828d9d AS builder ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \ CI=1 \ COREPACK_HOME=/tmp \ @@ -52,7 +52,7 @@ FROM builder AS plugins ARG TARGETPLATFORM -COPY --from=ghcr.io/jdx/mise:2026.1.1@sha256:a55c391f7582f34c58bce1a85090cd526596402ba77fc32b06c49b8404ef9c14 /usr/local/bin/mise /usr/local/bin/mise +COPY --from=ghcr.io/jdx/mise:2026.3.12@sha256:0210678cbf58413806531a27adb2c7daf1c37238e56e8f7ea381d73521571775 /usr/local/bin/mise /usr/local/bin/mise WORKDIR /usr/src/app COPY ./plugins/mise.toml ./plugins/ @@ -71,7 +71,7 @@ RUN --mount=type=cache,id=pnpm-plugins,target=/buildcache/pnpm-store \ --mount=type=cache,id=mise-tools-${TARGETPLATFORM},target=/buildcache/mise \ cd plugins && mise run build -FROM ghcr.io/immich-app/base-server-prod:202603031112@sha256:bb8c8645ee61977140121e56ba09db7ae656a7506f9a6af1be8461b4d81fdf03 +FROM ghcr.io/immich-app/base-server-prod:202603251709@sha256:17de30977ff87aa06758a56ad7f10d6b5c97bf9dab76e4ec4177a2a8d1b2b5f3 WORKDIR /usr/src/app ENV NODE_ENV=production \ diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev index f64a1a904b..096ffdf0bf 100644 --- a/server/Dockerfile.dev +++ b/server/Dockerfile.dev @@ -1,5 +1,5 @@ # dev build -FROM ghcr.io/immich-app/base-server-dev:202603031112@sha256:837536db5fd9e432f0f474ef9b61712fe3b3815821c3e4edf5e5b0b1f1ed30ad AS dev +FROM ghcr.io/immich-app/base-server-dev:202603251709@sha256:2bf3053c732fcb87ec90c3c614632ac44847423468ccc57fd935bff771828d9d AS dev ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \ CI=1 \ diff --git a/server/bin/start.sh b/server/bin/start.sh index 0a26be8e0b..15f4411959 100755 --- a/server/bin/start.sh +++ b/server/bin/start.sh @@ -15,13 +15,12 @@ log_message() { log_message "Initializing Immich $IMMICH_SOURCE_REF" -# TODO: Update to mimalloc v3 when verified memory isn't released issue is fixed -# lib_path="/usr/lib/$(arch)-linux-gnu/libmimalloc.so.3" -# if [ -f "$lib_path" ]; then -# export LD_PRELOAD="$lib_path" -# else -# echo "skipping libmimalloc - path not found $lib_path" -# fi +lib_path="/usr/lib/$(arch)-linux-gnu/libmimalloc.so.3" +if [ -f "$lib_path" ]; then + export LD_PRELOAD="$lib_path" +else + echo "skipping libmimalloc - path not found $lib_path" +fi export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/jellyfin-ffmpeg/lib" SERVER_HOME="$(readlink -f "$(dirname "$0")/..")" diff --git a/server/helmet.json b/server/helmet.json new file mode 100644 index 0000000000..ec31752a52 --- /dev/null +++ b/server/helmet.json @@ -0,0 +1,21 @@ +{ + "contentSecurityPolicy": { + "directives": { + "default-src": ["'self'"], + "script-src": ["'self'", "'wasm-unsafe-eval", "'unsafe-inline'", "https://www.gstatic.com"], + "style-src": ["'self'", "'unsafe-inline'"], + "img-src": ["'self'", "'data:'", "'blob:'"], + "connect-src": [ + "'self'", + "blob:", + "https://pay.futo.org", + "https://static.immich.cloud", + "https://tiles.immich.cloud" + ], + "worker-src": ["'self'", "blob:"], + "frame-src": ["'none'"], + "object-src": ["'none'"], + "base-uri": ["'self'"] + } + } +} diff --git a/server/package.json b/server/package.json index 848229b0e9..1adad9ba8b 100644 --- a/server/package.json +++ b/server/package.json @@ -1,10 +1,15 @@ { "name": "immich", - "version": "2.5.6", + "version": "2.6.3", "description": "", "author": "", "private": true, "license": "GNU Affero General Public License version 3", + "files": [ + "bin", + "dist", + "helmet.json" + ], "scripts": { "build": "nest build", "format": "prettier --cache --check .", @@ -24,7 +29,7 @@ "typeorm": "typeorm", "migrations:debug": "sql-tools -u ${DB_URL:-postgres://postgres:postgres@localhost:5432/immich} migrations generate --debug", "migrations:generate": "sql-tools -u ${DB_URL:-postgres://postgres:postgres@localhost:5432/immich} migrations generate", - "migrations:create": "sql-tools -u ${DB_URL:-postgres://postgres:postgres@localhost:5432/immich} migrations generate", + "migrations:create": "sql-tools -u ${DB_URL:-postgres://postgres:postgres@localhost:5432/immich} migrations create", "migrations:run": "sql-tools -u ${DB_URL:-postgres://postgres:postgres@localhost:5432/immich} migrations run", "migrations:revert": "sql-tools -u ${DB_URL:-postgres://postgres:postgres@localhost:5432/immich} migrations revert", "schema:drop": "sql-tools -u ${DB_URL:-postgres://postgres:postgres@localhost:5432/immich} query 'DROP schema public cascade; CREATE schema public;'", @@ -77,12 +82,13 @@ "fluent-ffmpeg": "^2.1.2", "geo-tz": "^8.0.0", "handlebars": "^4.7.8", + "helmet": "^8.1.0", "i18n-iso-countries": "^7.6.0", "ioredis": "^5.8.2", "jose": "^5.10.0", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.2", - "kysely": "0.28.11", + "kysely": "0.28.14", "kysely-postgres-js": "^3.0.0", "lodash": "^4.17.21", "luxon": "^3.4.2", @@ -92,7 +98,7 @@ "nestjs-cls": "^5.0.0", "nestjs-kysely": "3.1.2", "nestjs-otel": "^7.0.0", - "nodemailer": "^7.0.0", + "nodemailer": "^8.0.0", "openid-client": "^6.3.3", "pg": "^8.11.3", "pg-connection-string": "^2.9.1", @@ -136,7 +142,7 @@ "@types/luxon": "^3.6.2", "@types/mock-fs": "^4.13.1", "@types/multer": "^2.0.0", - "@types/node": "^24.11.0", + "@types/node": "^24.12.0", "@types/nodemailer": "^7.0.0", "@types/picomatch": "^4.0.0", "@types/pngjs": "^6.0.5", @@ -168,7 +174,7 @@ "vitest": "^3.0.0" }, "volta": { - "node": "24.13.1" + "node": "24.14.1" }, "overrides": { "sharp": "^0.34.5" diff --git a/server/resources/style-dark.json b/server/resources/style-dark.json deleted file mode 100644 index 91148e7814..0000000000 --- a/server/resources/style-dark.json +++ /dev/null @@ -1,3180 +0,0 @@ -{ - "version": 8, - "name": "Immich Map", - "id": "immich-map-dark", - "sources": { - "protomaps": { - "type": "vector", - "url": "https://tiles.immich.cloud/v1.json" - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#2b2b2b" - } - }, - { - "id": "earth", - "type": "fill", - "source": "protomaps", - "source-layer": "earth", - "paint": { - "fill-color": "#141414" - } - }, - { - "id": "landuse_park", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "national_park", - "park", - "cemetery", - "protected_area", - "nature_reserve", - "forest", - "golf_course" - ] - ], - "paint": { - "fill-color": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - "#181818", - 12, - "#181818" - ] - } - }, - { - "id": "landuse_urban_green", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "allotments", - "village_green", - "playground" - ] - ], - "paint": { - "fill-color": "#181818", - "fill-opacity": 0.7 - } - }, - { - "id": "landuse_hospital", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "hospital" - ] - ], - "paint": { - "fill-color": "#1d1d1d" - } - }, - { - "id": "landuse_industrial", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "industrial" - ] - ], - "paint": { - "fill-color": "#101010" - } - }, - { - "id": "landuse_school", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "school", - "university", - "college" - ] - ], - "paint": { - "fill-color": "#111111" - } - }, - { - "id": "landuse_beach", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "beach" - ] - ], - "paint": { - "fill-color": "#1f1f1f" - } - }, - { - "id": "landuse_zoo", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "zoo" - ] - ], - "paint": { - "fill-color": "#191919" - } - }, - { - "id": "landuse_military", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "military", - "naval_base", - "airfield" - ] - ], - "paint": { - "fill-color": "#191919" - } - }, - { - "id": "natural_wood", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "wood", - "nature_reserve", - "forest" - ] - ], - "paint": { - "fill-color": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - "#1a1a1a", - 12, - "#1a1a1a" - ] - } - }, - { - "id": "natural_scrub", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "in", - "pmap:kind", - "scrub", - "grassland", - "grass" - ], - "paint": { - "fill-color": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - "#1c1c1c", - 12, - "#1c1c1c" - ] - } - }, - { - "id": "natural_glacier", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "==", - "pmap:kind", - "glacier" - ], - "paint": { - "fill-color": "#191919" - } - }, - { - "id": "natural_sand", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "==", - "pmap:kind", - "sand" - ], - "paint": { - "fill-color": "#161616" - } - }, - { - "id": "landuse_aerodrome", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "aerodrome" - ] - ], - "paint": { - "fill-color": "#191919" - } - }, - { - "id": "transit_runway", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "filter": [ - "any", - [ - "in", - "pmap:kind_detail", - "runway" - ] - ], - "paint": { - "line-color": "#323232", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 12, - 4, - 18, - 30 - ] - } - }, - { - "id": "transit_taxiway", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "minzoom": 13, - "filter": [ - "any", - [ - "in", - "pmap:kind_detail", - "taxiway" - ] - ], - "paint": { - "line-color": "#323232", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 15, - 6 - ] - } - }, - { - "id": "water", - "type": "fill", - "source": "protomaps", - "source-layer": "water", - "paint": { - "fill-color": "#333333" - } - }, - { - "id": "physical_line_stream", - "type": "line", - "source": "protomaps", - "source-layer": "physical_line", - "minzoom": 14, - "filter": [ - "all", - [ - "in", - "pmap:kind", - "stream" - ] - ], - "paint": { - "line-color": "#333333", - "line-width": 0.5 - } - }, - { - "id": "physical_line_river", - "type": "line", - "source": "protomaps", - "source-layer": "physical_line", - "minzoom": 9, - "filter": [ - "all", - [ - "in", - "pmap:kind", - "river" - ] - ], - "paint": { - "line-color": "#333333", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1, - 18, - 12 - ] - } - }, - { - "id": "landuse_pedestrian", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "pedestrian" - ] - ], - "paint": { - "fill-color": "#191919" - } - }, - { - "id": "landuse_pier", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "pier" - ] - ], - "paint": { - "fill-color": "#0a0a0a" - } - }, - { - "id": "roads_tunnels_other_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#101010", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_tunnels_minor_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#101010", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_link_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#101010", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_medium_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#101010", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 10.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_major_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#101010", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_highway_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#101010", - "line-dasharray": [ - 6, - 0.5 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1, - 20, - 15 - ] - } - }, - { - "id": "roads_tunnels_other", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#292929", - "line-dasharray": [ - 4.5, - 0.5 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_tunnels_minor", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ] - } - }, - { - "id": "roads_tunnels_link", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ] - } - }, - { - "id": "roads_tunnels_medium", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_tunnels_major", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_tunnels_highway", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 1.1, - 12, - 1.6, - 15, - 5, - 18, - 15 - ] - } - }, - { - "id": "buildings", - "type": "fill", - "source": "protomaps", - "source-layer": "buildings", - "paint": { - "fill-color": "#0a0a0a", - "fill-opacity": 0.5 - } - }, - { - "id": "transit_pier", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "pier" - ] - ], - "paint": { - "line-color": "#0a0a0a", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 0.5, - 20, - 16 - ] - } - }, - { - "id": "roads_minor_service_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 13, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "==", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 18, - 8 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 0.8 - ] - } - }, - { - "id": "roads_minor_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "!=", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1 - ] - } - }, - { - "id": "roads_link_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 13, - "filter": [ - "all", - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1.5 - ] - } - }, - { - "id": "roads_medium_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 10.5, - 1.5 - ] - } - }, - { - "id": "roads_major_casing_late", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1 - ] - } - }, - { - "id": "roads_highway_casing_late", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1, - 20, - 15 - ] - } - }, - { - "id": "roads_other", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#1f1f1f", - "line-dasharray": [ - 3, - 1 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_link", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#1f1f1f", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ] - } - }, - { - "id": "roads_minor_service", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "==", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": "#1f1f1f", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 18, - 8 - ] - } - }, - { - "id": "roads_minor", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "!=", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - "#292929", - 16, - "#1f1f1f" - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ] - } - }, - { - "id": "roads_medium", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_major_casing_early", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "maxzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1 - ] - } - }, - { - "id": "roads_major", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_highway_casing_early", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "maxzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1 - ] - } - }, - { - "id": "roads_highway", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 1.1, - 12, - 1.6, - 15, - 5, - 18, - 15 - ] - } - }, - { - "id": "transit_railway", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "filter": [ - "all", - [ - "==", - "pmap:kind", - "rail" - ] - ], - "paint": { - "line-dasharray": [ - 0.3, - 0.75 - ], - "line-opacity": 0.5, - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 0.15, - 18, - 9 - ] - } - }, - { - "id": "boundaries_country", - "type": "line", - "source": "protomaps", - "source-layer": "boundaries", - "filter": [ - "<=", - "pmap:min_admin_level", - 2 - ], - "paint": { - "line-color": "#707070", - "line-width": 1, - "line-dasharray": [ - 3, - 2 - ] - } - }, - { - "id": "boundaries", - "type": "line", - "source": "protomaps", - "source-layer": "boundaries", - "filter": [ - ">", - "pmap:min_admin_level", - 2 - ], - "paint": { - "line-color": "#707070", - "line-width": 0.5, - "line-dasharray": [ - 3, - 2 - ] - } - }, - { - "id": "roads_bridges_other_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_bridges_link_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1.5 - ] - } - }, - { - "id": "roads_bridges_minor_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 0.8 - ] - } - }, - { - "id": "roads_bridges_medium_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 10.5, - 1.5 - ] - } - }, - { - "id": "roads_bridges_major_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 10 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1.5 - ] - } - }, - { - "id": "roads_bridges_other", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#1f1f1f", - "line-dasharray": [ - 2, - 1 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_bridges_minor", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#1f1f1f", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ] - } - }, - { - "id": "roads_bridges_link", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#1f1f1f", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ] - } - }, - { - "id": "roads_bridges_medium", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_bridges_major", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_bridges_highway_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#141414", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1, - 20, - 15 - ] - } - }, - { - "id": "roads_bridges_highway", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#292929", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 1.1, - 12, - 1.6, - 15, - 5, - 18, - 15 - ] - } - }, - { - "id": "physical_line_waterway_label", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_line", - "minzoom": 13, - "filter": [ - "all", - [ - "in", - "pmap:kind", - "river", - "stream" - ] - ], - "layout": { - "symbol-placement": "line", - "text-font": [ - "Noto Sans Regular" - ], - "text-field": [ - "get", - "name" - ], - "text-size": 12, - "text-letter-spacing": 0.3 - }, - "paint": { - "text-color": "#707070" - } - }, - { - "id": "physical_point_peak", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_point", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "peak" - ] - ], - "layout": { - "text-font": [ - "Noto Sans Italic" - ], - "text-field": [ - "get", - "name" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 8, - 16, - 12 - ], - "text-letter-spacing": 0.1, - "text-max-width": 9 - }, - "paint": { - "text-color": "#707070", - "text-halo-width": 1.5 - } - }, - { - "id": "roads_labels_minor", - "type": "symbol", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 15, - "filter": [ - "any", - [ - "in", - "pmap:kind", - "minor_road", - "other", - "path" - ] - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "symbol-placement": "line", - "text-font": [ - "Noto Sans Regular" - ], - "text-field": [ - "get", - "name" - ], - "text-size": 12 - }, - "paint": { - "text-color": "#525252", - "text-halo-color": "#141414", - "text-halo-width": 2 - } - }, - { - "id": "physical_point_ocean", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_point", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "sea", - "ocean", - "lake", - "water", - "bay", - "strait", - "fjord" - ] - ], - "layout": { - "text-font": [ - "Noto Sans Medium" - ], - "text-field": [ - "get", - "name" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 3, - 10, - 10, - 12 - ], - "text-letter-spacing": 0.1, - "text-max-width": 9, - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#707070" - } - }, - { - "id": "physical_point_lakes", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_point", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "lake", - "water" - ] - ], - "layout": { - "text-font": [ - "Noto Sans Medium" - ], - "text-field": [ - "get", - "name" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 3, - 0, - 6, - 12, - 10, - 12 - ], - "text-letter-spacing": 0.1, - "text-max-width": 9 - }, - "paint": { - "text-color": "#707070" - } - }, - { - "id": "roads_labels_major", - "type": "symbol", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 11, - "filter": [ - "any", - [ - "in", - "pmap:kind", - "highway", - "major_road", - "medium_road" - ] - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "symbol-placement": "line", - "text-font": [ - "Noto Sans Regular" - ], - "text-field": [ - "get", - "name" - ], - "text-size": 12 - }, - "paint": { - "text-color": "#5c5c5c", - "text-halo-color": "#141414", - "text-halo-width": 2 - } - }, - { - "id": "places_subplace", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "neighbourhood" - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "text-field": "{name}", - "text-font": [ - "Noto Sans Regular" - ], - "text-max-width": 7, - "text-letter-spacing": 0.1, - "text-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 5, - 2, - 8, - 4, - 12, - 18, - 15, - 20 - ], - "text-size": [ - "interpolate", - [ - "exponential", - 1.2 - ], - [ - "zoom" - ], - 11, - 8, - 14, - 14, - 18, - 24 - ], - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#5c5c5c", - "text-halo-color": "#141414", - "text-halo-width": 1.5 - } - }, - { - "id": "places_locality", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "locality" - ], - "layout": { - "icon-image": [ - "step", - [ - "zoom" - ], - "townspot", - 8, - "" - ], - "icon-size": 0.7, - "text-field": "{name}", - "text-font": [ - "case", - [ - "<=", - [ - "get", - "pmap:min_zoom" - ], - 5 - ], - [ - "literal", - [ - "Noto Sans Medium" - ] - ], - [ - "literal", - [ - "Noto Sans Regular" - ] - ] - ], - "text-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 5, - 3, - 8, - 7, - 12, - 11 - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 2, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 8, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 13, - 0 - ], - 4, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 10, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 15, - 0 - ], - 6, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 12 - ], - 11, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 12 - ], - 17, - 0 - ], - 8, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 11 - ], - 11, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 11 - ], - 18, - 0 - ], - 10, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 9 - ], - 12, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 9 - ], - 20, - 0 - ], - 15, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 12, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 22, - 0 - ] - ], - "icon-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - 0, - 8, - 4, - 10, - 8, - 12, - 6, - 22, - 2 - ], - "text-anchor": [ - "step", - [ - "zoom" - ], - "left", - 8, - "center" - ], - "text-radial-offset": 0.4 - }, - "paint": { - "text-color": "#999999", - "text-halo-color": "#141414", - "text-halo-width": 1 - } - }, - { - "id": "places_region", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "region" - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "text-field": [ - "step", - [ - "zoom" - ], - [ - "get", - "name:short" - ], - 6, - [ - "get", - "name" - ] - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 3, - 11, - 7, - 16 - ], - "text-radial-offset": 0.2, - "text-anchor": "center", - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#3d3d3d", - "text-halo-color": "#141414", - "text-halo-width": 2 - } - }, - { - "id": "places_country", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "country" - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "text-field": "{name}", - "text-font": [ - "Noto Sans Medium" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 2, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 10 - ], - 8, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 10 - ], - 12, - 0 - ], - 6, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 10, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 18, - 0 - ], - 8, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 7 - ], - 11, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 7 - ], - 20, - 0 - ] - ], - "icon-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - 2, - 14, - 2, - 16, - 20, - 17, - 2, - 22, - 2 - ], - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#707070" - } - } - ], - "sprite": "https://static.immich.cloud/tiles/sprites/v1/dark", - "glyphs": "https://static.immich.cloud/tiles/fonts/{fontstack}/{range}.pbf" -} diff --git a/server/resources/style-light.json b/server/resources/style-light.json deleted file mode 100644 index 612622ef85..0000000000 --- a/server/resources/style-light.json +++ /dev/null @@ -1,3180 +0,0 @@ -{ - "version": 8, - "name": "Immich Map", - "id": "immich-map-light", - "sources": { - "protomaps": { - "type": "vector", - "url": "https://tiles.immich.cloud/v1.json" - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#cccccc" - } - }, - { - "id": "earth", - "type": "fill", - "source": "protomaps", - "source-layer": "earth", - "paint": { - "fill-color": "#e0e0e0" - } - }, - { - "id": "landuse_park", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "national_park", - "park", - "cemetery", - "protected_area", - "nature_reserve", - "forest", - "golf_course" - ] - ], - "paint": { - "fill-color": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - "#cfddd5", - 12, - "#9cd3b4" - ] - } - }, - { - "id": "landuse_urban_green", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "allotments", - "village_green", - "playground" - ] - ], - "paint": { - "fill-color": "#9cd3b4", - "fill-opacity": 0.7 - } - }, - { - "id": "landuse_hospital", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "hospital" - ] - ], - "paint": { - "fill-color": "#e4dad9" - } - }, - { - "id": "landuse_industrial", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "industrial" - ] - ], - "paint": { - "fill-color": "#d1dde1" - } - }, - { - "id": "landuse_school", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "school", - "university", - "college" - ] - ], - "paint": { - "fill-color": "#e4ded7" - } - }, - { - "id": "landuse_beach", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "beach" - ] - ], - "paint": { - "fill-color": "#e8e4d0" - } - }, - { - "id": "landuse_zoo", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "zoo" - ] - ], - "paint": { - "fill-color": "#c6dcdc" - } - }, - { - "id": "landuse_military", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "military", - "naval_base", - "airfield" - ] - ], - "paint": { - "fill-color": "#c6dcdc" - } - }, - { - "id": "natural_wood", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "wood", - "nature_reserve", - "forest" - ] - ], - "paint": { - "fill-color": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - "#d0ded0", - 12, - "#a0d9a0" - ] - } - }, - { - "id": "natural_scrub", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "in", - "pmap:kind", - "scrub", - "grassland", - "grass" - ], - "paint": { - "fill-color": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - "#cedcd7", - 12, - "#99d2bb" - ] - } - }, - { - "id": "natural_glacier", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "==", - "pmap:kind", - "glacier" - ], - "paint": { - "fill-color": "#e7e7e7" - } - }, - { - "id": "natural_sand", - "type": "fill", - "source": "protomaps", - "source-layer": "natural", - "filter": [ - "==", - "pmap:kind", - "sand" - ], - "paint": { - "fill-color": "#e2e0d7" - } - }, - { - "id": "landuse_aerodrome", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "aerodrome" - ] - ], - "paint": { - "fill-color": "#dadbdf" - } - }, - { - "id": "transit_runway", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "filter": [ - "any", - [ - "in", - "pmap:kind_detail", - "runway" - ] - ], - "paint": { - "line-color": "#e9e9ed", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 12, - 4, - 18, - 30 - ] - } - }, - { - "id": "transit_taxiway", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "minzoom": 13, - "filter": [ - "any", - [ - "in", - "pmap:kind_detail", - "taxiway" - ] - ], - "paint": { - "line-color": "#e9e9ed", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 15, - 6 - ] - } - }, - { - "id": "water", - "type": "fill", - "source": "protomaps", - "source-layer": "water", - "paint": { - "fill-color": "rgba(148, 209, 236, 0.66)" - } - }, - { - "id": "physical_line_stream", - "type": "line", - "source": "protomaps", - "source-layer": "physical_line", - "minzoom": 14, - "filter": [ - "all", - [ - "in", - "pmap:kind", - "stream" - ] - ], - "paint": { - "line-color": "rgba(148, 209, 236, 0.66)", - "line-width": 0.5 - } - }, - { - "id": "physical_line_river", - "type": "line", - "source": "protomaps", - "source-layer": "physical_line", - "minzoom": 9, - "filter": [ - "all", - [ - "in", - "pmap:kind", - "river" - ] - ], - "paint": { - "line-color": "rgba(148, 209, 236, 0.66)", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1, - 18, - 12 - ] - } - }, - { - "id": "landuse_pedestrian", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "pedestrian" - ] - ], - "paint": { - "fill-color": "#e3e0d4" - } - }, - { - "id": "landuse_pier", - "type": "fill", - "source": "protomaps", - "source-layer": "landuse", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "pier" - ] - ], - "paint": { - "fill-color": "#e0e0e0" - } - }, - { - "id": "roads_tunnels_other_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_tunnels_minor_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_link_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_medium_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 10.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_major_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-dasharray": [ - 3, - 2 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1 - ] - } - }, - { - "id": "roads_tunnels_highway_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-dasharray": [ - 6, - 0.5 - ], - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1, - 20, - 15 - ] - } - }, - { - "id": "roads_tunnels_other", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#d5d5d5", - "line-dasharray": [ - 4.5, - 0.5 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_tunnels_minor", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#d5d5d5", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ] - } - }, - { - "id": "roads_tunnels_link", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#d5d5d5", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ] - } - }, - { - "id": "roads_tunnels_medium", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#d5d5d5", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_tunnels_major", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#d5d5d5", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_tunnels_highway", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "<", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#d5d5d5", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 1.1, - 12, - 1.6, - 15, - 5, - 18, - 15 - ] - } - }, - { - "id": "buildings", - "type": "fill", - "source": "protomaps", - "source-layer": "buildings", - "paint": { - "fill-color": "#cccccc", - "fill-opacity": 0.5 - } - }, - { - "id": "transit_pier", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "pier" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 0.5, - 20, - 16 - ] - } - }, - { - "id": "roads_minor_service_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 13, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "==", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 18, - 8 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 0.8 - ] - } - }, - { - "id": "roads_minor_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "!=", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1 - ] - } - }, - { - "id": "roads_link_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 13, - "filter": [ - "all", - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1.5 - ] - } - }, - { - "id": "roads_medium_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 10.5, - 1.5 - ] - } - }, - { - "id": "roads_major_casing_late", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1 - ] - } - }, - { - "id": "roads_highway_casing_late", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1, - 20, - 15 - ] - } - }, - { - "id": "roads_other", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#ebebeb", - "line-dasharray": [ - 3, - 1 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_link", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#ffffff", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ] - } - }, - { - "id": "roads_minor_service", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "==", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": "#ebebeb", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 18, - 8 - ] - } - }, - { - "id": "roads_minor", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ], - [ - "!=", - "pmap:kind_detail", - "service" - ] - ], - "paint": { - "line-color": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - "#ebebeb", - 16, - "#ffffff" - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ] - } - }, - { - "id": "roads_medium", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#f5f5f5", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_major_casing_early", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "maxzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1 - ] - } - }, - { - "id": "roads_major", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#ffffff", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_highway_casing_early", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "maxzoom": 12, - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1 - ] - } - }, - { - "id": "roads_highway", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - "==", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#ffffff", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 1.1, - 12, - 1.6, - 15, - 5, - 18, - 15 - ] - } - }, - { - "id": "transit_railway", - "type": "line", - "source": "protomaps", - "source-layer": "transit", - "filter": [ - "all", - [ - "==", - "pmap:kind", - "rail" - ] - ], - "paint": { - "line-dasharray": [ - 0.3, - 0.75 - ], - "line-opacity": 0.5, - "line-color": "#a7b1b3", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 0.15, - 18, - 9 - ] - } - }, - { - "id": "boundaries_country", - "type": "line", - "source": "protomaps", - "source-layer": "boundaries", - "filter": [ - "<=", - "pmap:min_admin_level", - 2 - ], - "paint": { - "line-color": "#adadad", - "line-width": 1, - "line-dasharray": [ - 3, - 2 - ] - } - }, - { - "id": "boundaries", - "type": "line", - "source": "protomaps", - "source-layer": "boundaries", - "filter": [ - ">", - "pmap:min_admin_level", - 2 - ], - "paint": { - "line-color": "#adadad", - "line-width": 0.5, - "line-dasharray": [ - 3, - 2 - ] - } - }, - { - "id": "roads_bridges_other_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_bridges_link_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 12, - 0, - 12.5, - 1.5 - ] - } - }, - { - "id": "roads_bridges_minor_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 0.8 - ] - } - }, - { - "id": "roads_bridges_medium_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 10, - 0, - 10.5, - 1.5 - ] - } - }, - { - "id": "roads_bridges_major_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 0.5, - 18, - 10 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 9, - 0, - 9.5, - 1.5 - ] - } - }, - { - "id": "roads_bridges_other", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "in", - "pmap:kind", - "other", - "path" - ] - ], - "paint": { - "line-color": "#ebebeb", - "line-dasharray": [ - 2, - 1 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 14, - 0, - 20, - 7 - ] - } - }, - { - "id": "roads_bridges_minor", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "minor_road" - ] - ], - "paint": { - "line-color": "#ffffff", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 11, - 0, - 12.5, - 0.5, - 15, - 2, - 18, - 11 - ] - } - }, - { - "id": "roads_bridges_link", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#ffffff", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 13, - 0, - 13.5, - 1, - 18, - 11 - ] - } - }, - { - "id": "roads_bridges_medium", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "medium_road" - ] - ], - "paint": { - "line-color": "#f0eded", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 12, - 1.2, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_bridges_major", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "major_road" - ] - ], - "paint": { - "line-color": "#f5f5f5", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 6, - 0, - 12, - 1.6, - 15, - 3, - 18, - 13 - ] - } - }, - { - "id": "roads_bridges_highway_casing", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 12, - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#e0e0e0", - "line-gap-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 3.5, - 0.5, - 18, - 15 - ], - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 7, - 0, - 7.5, - 1, - 20, - 15 - ] - } - }, - { - "id": "roads_bridges_highway", - "type": "line", - "source": "protomaps", - "source-layer": "roads", - "filter": [ - "all", - [ - ">", - "pmap:level", - 0 - ], - [ - "==", - "pmap:kind", - "highway" - ], - [ - "!=", - "pmap:link", - 1 - ] - ], - "paint": { - "line-color": "#ffffff", - "line-width": [ - "interpolate", - [ - "exponential", - 1.6 - ], - [ - "zoom" - ], - 3, - 0, - 6, - 1.1, - 12, - 1.6, - 15, - 5, - 18, - 15 - ] - } - }, - { - "id": "physical_line_waterway_label", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_line", - "minzoom": 13, - "filter": [ - "all", - [ - "in", - "pmap:kind", - "river", - "stream" - ] - ], - "layout": { - "symbol-placement": "line", - "text-font": [ - "Noto Sans Regular" - ], - "text-field": [ - "get", - "name" - ], - "text-size": 12, - "text-letter-spacing": 0.3 - }, - "paint": { - "text-color": "#ffffff" - } - }, - { - "id": "physical_point_peak", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_point", - "filter": [ - "any", - [ - "==", - "pmap:kind", - "peak" - ] - ], - "layout": { - "text-font": [ - "Noto Sans Italic" - ], - "text-field": [ - "get", - "name" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 8, - 16, - 12 - ], - "text-letter-spacing": 0.1, - "text-max-width": 9 - }, - "paint": { - "text-color": "#7e9aa0", - "text-halo-width": 1.5 - } - }, - { - "id": "roads_labels_minor", - "type": "symbol", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 15, - "filter": [ - "any", - [ - "in", - "pmap:kind", - "minor_road", - "other", - "path" - ] - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "symbol-placement": "line", - "text-font": [ - "Noto Sans Regular" - ], - "text-field": [ - "get", - "name" - ], - "text-size": 12 - }, - "paint": { - "text-color": "#91888b", - "text-halo-color": "#ffffff", - "text-halo-width": 2 - } - }, - { - "id": "physical_point_ocean", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_point", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "sea", - "ocean", - "lake", - "water", - "bay", - "strait", - "fjord" - ] - ], - "layout": { - "text-font": [ - "Noto Sans Medium" - ], - "text-field": [ - "get", - "name" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 3, - 10, - 10, - 12 - ], - "text-letter-spacing": 0.1, - "text-max-width": 9, - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#ffffff" - } - }, - { - "id": "physical_point_lakes", - "type": "symbol", - "source": "protomaps", - "source-layer": "physical_point", - "filter": [ - "any", - [ - "in", - "pmap:kind", - "lake", - "water" - ] - ], - "layout": { - "text-font": [ - "Noto Sans Medium" - ], - "text-field": [ - "get", - "name" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 3, - 0, - 6, - 12, - 10, - 12 - ], - "text-letter-spacing": 0.1, - "text-max-width": 9 - }, - "paint": { - "text-color": "#ffffff" - } - }, - { - "id": "roads_labels_major", - "type": "symbol", - "source": "protomaps", - "source-layer": "roads", - "minzoom": 11, - "filter": [ - "any", - [ - "in", - "pmap:kind", - "highway", - "major_road", - "medium_road" - ] - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "symbol-placement": "line", - "text-font": [ - "Noto Sans Regular" - ], - "text-field": [ - "get", - "name" - ], - "text-size": 12 - }, - "paint": { - "text-color": "#938a8d", - "text-halo-color": "#ffffff", - "text-halo-width": 2 - } - }, - { - "id": "places_subplace", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "neighbourhood" - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "text-field": "{name}", - "text-font": [ - "Noto Sans Regular" - ], - "text-max-width": 7, - "text-letter-spacing": 0.1, - "text-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 5, - 2, - 8, - 4, - 12, - 18, - 15, - 20 - ], - "text-size": [ - "interpolate", - [ - "exponential", - 1.2 - ], - [ - "zoom" - ], - 11, - 8, - 14, - 14, - 18, - 24 - ], - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#8f8f8f", - "text-halo-color": "#e0e0e0", - "text-halo-width": 1.5 - } - }, - { - "id": "places_locality", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "locality" - ], - "layout": { - "icon-image": [ - "step", - [ - "zoom" - ], - "townspot", - 8, - "" - ], - "icon-size": 0.7, - "text-field": "{name}", - "text-font": [ - "case", - [ - "<=", - [ - "get", - "pmap:min_zoom" - ], - 5 - ], - [ - "literal", - [ - "Noto Sans Medium" - ] - ], - [ - "literal", - [ - "Noto Sans Regular" - ] - ] - ], - "text-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 5, - 3, - 8, - 7, - 12, - 11 - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 2, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 8, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 13, - 0 - ], - 4, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 10, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 13 - ], - 15, - 0 - ], - 6, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 12 - ], - 11, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 12 - ], - 17, - 0 - ], - 8, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 11 - ], - 11, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 11 - ], - 18, - 0 - ], - 10, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 9 - ], - 12, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 9 - ], - 20, - 0 - ], - 15, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 12, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 22, - 0 - ] - ], - "icon-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - 0, - 8, - 4, - 10, - 8, - 12, - 6, - 22, - 2 - ], - "text-anchor": [ - "step", - [ - "zoom" - ], - "left", - 8, - "center" - ], - "text-radial-offset": 0.4 - }, - "paint": { - "text-color": "#5c5c5c", - "text-halo-color": "#e0e0e0", - "text-halo-width": 1 - } - }, - { - "id": "places_region", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "region" - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "text-field": [ - "step", - [ - "zoom" - ], - [ - "get", - "name:short" - ], - 6, - [ - "get", - "name" - ] - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 3, - 11, - 7, - 16 - ], - "text-radial-offset": 0.2, - "text-anchor": "center", - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#b3b3b3", - "text-halo-color": "#e0e0e0", - "text-halo-width": 2 - } - }, - { - "id": "places_country", - "type": "symbol", - "source": "protomaps", - "source-layer": "places", - "filter": [ - "==", - "pmap:kind", - "country" - ], - "layout": { - "symbol-sort-key": [ - "get", - "pmap:min_zoom" - ], - "text-field": "{name}", - "text-font": [ - "Noto Sans Medium" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 2, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 10 - ], - 8, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 10 - ], - 12, - 0 - ], - 6, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 10, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 8 - ], - 18, - 0 - ], - 8, - [ - "case", - [ - "<", - [ - "get", - "pmap:population_rank" - ], - 7 - ], - 11, - [ - ">=", - [ - "get", - "pmap:population_rank" - ], - 7 - ], - 20, - 0 - ] - ], - "icon-padding": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 0, - 2, - 14, - 2, - 16, - 20, - 17, - 2, - 22, - 2 - ], - "text-transform": "uppercase" - }, - "paint": { - "text-color": "#a3a3a3" - } - } - ], - "sprite": "https://static.immich.cloud/tiles/sprites/v1/light", - "glyphs": "https://static.immich.cloud/tiles/fonts/{fontstack}/{range}.pbf" -} diff --git a/server/src/app.common.ts b/server/src/app.common.ts index 934c13343f..2159721932 100644 --- a/server/src/app.common.ts +++ b/server/src/app.common.ts @@ -2,9 +2,10 @@ import { NestExpressApplication } from '@nestjs/platform-express'; import { json } from 'body-parser'; import compression from 'compression'; import cookieParser from 'cookie-parser'; +import helmetMiddleware from 'helmet'; import { existsSync } from 'node:fs'; import sirv from 'sirv'; -import { excludePaths, serverVersion } from 'src/constants'; +import { IMMICH_SERVER_START, excludePaths, serverVersion } from 'src/constants'; import { MaintenanceWorkerService } from 'src/maintenance/maintenance-worker.service'; import { WebSocketAdapter } from 'src/middleware/websocket.adapter'; import { ConfigRepository } from 'src/repositories/config.repository'; @@ -39,7 +40,7 @@ export async function configureExpress( }, ) { const configRepository = app.get(ConfigRepository); - const { environment, host, port, resourcePaths, network } = configRepository.getEnv(); + const { environment, host, port, helmet, resourcePaths, network } = configRepository.getEnv(); const logger = await app.resolve(LoggingRepository); logger.setContext('Bootstrap'); @@ -47,6 +48,12 @@ export async function configureExpress( app.set('trust proxy', ['loopback', ...network.trustedProxies]); app.set('etag', 'strong'); + + if (helmet.config) { + app.use(helmetMiddleware(helmet.config)); + logger.log('Initialized helmet middleware'); + } + app.use(cookieParser()); app.use(json({ limit: '10mb' })); @@ -83,5 +90,5 @@ export async function configureExpress( const server = await (host ? app.listen(port, host) : app.listen(port)); server.requestTimeout = 24 * 60 * 60 * 1000; - logger.log(`Immich Server is listening on ${await app.getUrl()} [v${serverVersion}] [${environment}] `); + logger.log(`${IMMICH_SERVER_START} on ${await app.getUrl()} [v${serverVersion}] [${environment}] `); } diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 49b779ca18..b59317577f 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -29,6 +29,7 @@ import { ProcessRepository } from 'src/repositories/process.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository'; import { teardownTelemetry, TelemetryRepository } from 'src/repositories/telemetry.repository'; +import { UserRepository } from 'src/repositories/user.repository'; import { WebsocketRepository } from 'src/repositories/websocket.repository'; import { services } from 'src/services'; import { AuthService } from 'src/services/auth.service'; @@ -111,6 +112,7 @@ export class ApiModule extends BaseModule {} StorageRepository, ProcessRepository, DatabaseRepository, + UserRepository, SystemMetadataRepository, AppRepository, MaintenanceHealthRepository, diff --git a/server/src/constants.ts b/server/src/constants.ts index e24057beba..4f8d9342c7 100644 --- a/server/src/constants.ts +++ b/server/src/constants.ts @@ -4,6 +4,8 @@ import { dirname, join } from 'node:path'; import { SemVer } from 'semver'; import { ApiTag, AudioCodec, DatabaseExtension, ExifOrientation, VectorIndex } from 'src/enum'; +export const IMMICH_SERVER_START = 'Immich Server is listening'; + export const ErrorMessages = { InconsistentMediaLocation: 'Detected an inconsistent media location. For more information, see https://docs.immich.app/errors#inconsistent-media-location', diff --git a/server/src/controllers/duplicate.controller.spec.ts b/server/src/controllers/duplicate.controller.spec.ts new file mode 100644 index 0000000000..66598b9920 --- /dev/null +++ b/server/src/controllers/duplicate.controller.spec.ts @@ -0,0 +1,47 @@ +import { DuplicateController } from 'src/controllers/duplicate.controller'; +import { DuplicateService } from 'src/services/duplicate.service'; +import request from 'supertest'; +import { factory } from 'test/small.factory'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(DuplicateController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(DuplicateService); + + beforeAll(async () => { + ctx = await controllerSetup(DuplicateController, [{ provide: DuplicateService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('GET /duplicates', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/duplicates'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('DELETE /duplicates', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).delete('/duplicates'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('DELETE /duplicates/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).delete(`/duplicates/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid uuid', async () => { + const { status, body } = await request(ctx.getHttpServer()).delete(`/duplicates/123`); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['id must be a UUID'])); + }); + }); +}); diff --git a/server/src/controllers/duplicate.controller.ts b/server/src/controllers/duplicate.controller.ts index e8c8e5ef80..0a8c451ed4 100644 --- a/server/src/controllers/duplicate.controller.ts +++ b/server/src/controllers/duplicate.controller.ts @@ -1,9 +1,9 @@ -import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param } from '@nestjs/common'; +import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Endpoint, HistoryBuilder } from 'src/decorators'; -import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto'; +import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; -import { DuplicateResponseDto } from 'src/dtos/duplicate.dto'; +import { DuplicateResolveDto, DuplicateResponseDto } from 'src/dtos/duplicate.dto'; import { ApiTag, Permission } from 'src/enum'; import { Auth, Authenticated } from 'src/middleware/auth.guard'; import { DuplicateService } from 'src/services/duplicate.service'; @@ -48,4 +48,16 @@ export class DuplicateController { deleteDuplicate(@Auth() auth: AuthDto, @Param() { id }: UUIDParamDto): Promise { return this.service.delete(auth, id); } + + @Post('resolve') + @HttpCode(HttpStatus.OK) + @Authenticated({ permission: Permission.DuplicateDelete }) + @Endpoint({ + summary: 'Resolve duplicate groups', + description: 'Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates.', + history: new HistoryBuilder().added('v3.0.0').alpha('v3.0.0'), + }) + resolveDuplicates(@Auth() auth: AuthDto, @Body() dto: DuplicateResolveDto): Promise { + return this.service.resolve(auth, dto); + } } diff --git a/server/src/controllers/shared-link.controller.spec.ts b/server/src/controllers/shared-link.controller.spec.ts index 96c84040ca..d8b89d0029 100644 --- a/server/src/controllers/shared-link.controller.spec.ts +++ b/server/src/controllers/shared-link.controller.spec.ts @@ -1,7 +1,8 @@ import { SharedLinkController } from 'src/controllers/shared-link.controller'; -import { SharedLinkType } from 'src/enum'; +import { Permission, SharedLinkType } from 'src/enum'; import { SharedLinkService } from 'src/services/shared-link.service'; import request from 'supertest'; +import { factory } from 'test/small.factory'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; describe(SharedLinkController.name, () => { @@ -31,4 +32,16 @@ describe(SharedLinkController.name, () => { expect(service.create).toHaveBeenCalledWith(undefined, expect.objectContaining({ expiresAt: null })); }); }); + + describe('DELETE /shared-links/:id/assets', () => { + it('should require shared link update permission', async () => { + await request(ctx.getHttpServer()).delete(`/shared-links/${factory.uuid()}/assets`).send({ assetIds: [] }); + + expect(ctx.authenticate).toHaveBeenCalledWith( + expect.objectContaining({ + metadata: expect.objectContaining({ permission: Permission.SharedLinkUpdate, sharedLinkRoute: false }), + }), + ); + }); + }); }); diff --git a/server/src/controllers/shared-link.controller.ts b/server/src/controllers/shared-link.controller.ts index 1f91409e80..c7ba589a9f 100644 --- a/server/src/controllers/shared-link.controller.ts +++ b/server/src/controllers/shared-link.controller.ts @@ -180,7 +180,7 @@ export class SharedLinkController { } @Delete(':id/assets') - @Authenticated({ sharedLink: true }) + @Authenticated({ permission: Permission.SharedLinkUpdate }) @Endpoint({ summary: 'Remove assets from a shared link', description: diff --git a/server/src/cores/storage.core.ts b/server/src/cores/storage.core.ts index c6821404dc..3345f6e129 100644 --- a/server/src/cores/storage.core.ts +++ b/server/src/cores/storage.core.ts @@ -154,10 +154,11 @@ export class StorageCore { } async moveAssetVideo(asset: StorageAsset) { + const encodedVideoFile = getAssetFile(asset.files, AssetFileType.EncodedVideo, { isEdited: false }); return this.moveFile({ entityId: asset.id, pathType: AssetPathType.EncodedVideo, - oldPath: asset.encodedVideoPath, + oldPath: encodedVideoFile?.path || null, newPath: StorageCore.getEncodedVideoPath(asset), }); } @@ -303,21 +304,15 @@ export class StorageCore { case AssetPathType.Original: { return this.assetRepository.update({ id, originalPath: newPath }); } - case AssetFileType.FullSize: { - return this.assetRepository.upsertFile({ assetId: id, type: AssetFileType.FullSize, path: newPath }); - } - case AssetFileType.Preview: { - return this.assetRepository.upsertFile({ assetId: id, type: AssetFileType.Preview, path: newPath }); - } - case AssetFileType.Thumbnail: { - return this.assetRepository.upsertFile({ assetId: id, type: AssetFileType.Thumbnail, path: newPath }); - } - case AssetPathType.EncodedVideo: { - return this.assetRepository.update({ id, encodedVideoPath: newPath }); - } + + case AssetFileType.FullSize: + case AssetFileType.EncodedVideo: + case AssetFileType.Thumbnail: + case AssetFileType.Preview: case AssetFileType.Sidecar: { - return this.assetRepository.upsertFile({ assetId: id, type: AssetFileType.Sidecar, path: newPath }); + return this.assetRepository.upsertFile({ assetId: id, type: pathType as AssetFileType, path: newPath }); } + case PersonPathType.Face: { return this.personRepository.update({ id, thumbnailPath: newPath }); } diff --git a/server/src/database.ts b/server/src/database.ts index fc790259d1..4f339624e6 100644 --- a/server/src/database.ts +++ b/server/src/database.ts @@ -5,6 +5,7 @@ import { AssetFileType, AssetType, AssetVisibility, + ChecksumAlgorithm, MemoryType, Permission, PluginContext, @@ -112,6 +113,7 @@ export type Memory = { export type Asset = { id: string; checksum: Buffer; + checksumAlgorithm: ChecksumAlgorithm; deviceAssetId: string; deviceId: string; fileCreatedAt: Date; @@ -154,7 +156,6 @@ export type StorageAsset = { id: string; ownerId: string; files: AssetFile[]; - encodedVideoPath: string | null; }; export type Stack = { @@ -170,6 +171,7 @@ export type AuthSharedLink = { id: string; expiresAt: Date | null; userId: string; + albumId: string | null; showExif: boolean; allowUpload: boolean; allowDownload: boolean; @@ -330,6 +332,7 @@ export const columns = { asset: [ 'asset.id', 'asset.checksum', + 'asset.checksumAlgorithm', 'asset.deviceAssetId', 'asset.deviceId', 'asset.fileCreatedAt', @@ -345,6 +348,7 @@ export const columns = { 'asset.type', 'asset.width', 'asset.height', + 'asset.isEdited', ], assetFiles: ['asset_file.id', 'asset_file.path', 'asset_file.type', 'asset_file.isEdited'], assetFilesForThumbnail: [ @@ -358,15 +362,6 @@ export const columns = { authUser: ['user.id', 'user.name', 'user.email', 'user.isAdmin', 'user.quotaUsageInBytes', 'user.quotaSizeInBytes'], authApiKey: ['api_key.id', 'api_key.permissions'], authSession: ['session.id', 'session.updatedAt', 'session.pinExpiresAt', 'session.appVersion'], - authSharedLink: [ - 'shared_link.id', - 'shared_link.userId', - 'shared_link.expiresAt', - 'shared_link.showExif', - 'shared_link.allowUpload', - 'shared_link.allowDownload', - 'shared_link.password', - ], user: userColumns, userWithPrefix: userWithPrefixColumns, userAdmin: [ diff --git a/server/src/dtos/asset-ids.response.dto.ts b/server/src/dtos/asset-ids.response.dto.ts index 427117518d..1065d8485e 100644 --- a/server/src/dtos/asset-ids.response.dto.ts +++ b/server/src/dtos/asset-ids.response.dto.ts @@ -23,6 +23,7 @@ export enum BulkIdErrorReason { NO_PERMISSION = 'no_permission', NOT_FOUND = 'not_found', UNKNOWN = 'unknown', + VALIDATION = 'validation', } export class BulkIdsDto { @@ -37,4 +38,5 @@ export class BulkIdResponseDto { success!: boolean; @ApiPropertyOptional({ description: 'Error reason if failed', enum: BulkIdErrorReason }) error?: BulkIdErrorReason; + errorMessage?: string; } diff --git a/server/src/dtos/asset-response.dto.ts b/server/src/dtos/asset-response.dto.ts index 644c9caeb8..2c2f57bbb2 100644 --- a/server/src/dtos/asset-response.dto.ts +++ b/server/src/dtos/asset-response.dto.ts @@ -13,7 +13,7 @@ import { } from 'src/dtos/person.dto'; import { TagResponseDto, mapTag } from 'src/dtos/tag.dto'; import { UserResponseDto, mapUser } from 'src/dtos/user.dto'; -import { AssetStatus, AssetType, AssetVisibility } from 'src/enum'; +import { AssetStatus, AssetType, AssetVisibility, ChecksumAlgorithm } from 'src/enum'; import { ImageDimensions, MaybeDehydrated } from 'src/types'; import { getDimensions } from 'src/utils/asset.util'; import { hexOrBufferToBase64 } from 'src/utils/bytes'; @@ -148,12 +148,12 @@ export type MapAsset = { updateId: string; status: AssetStatus; checksum: Buffer; + checksumAlgorithm: ChecksumAlgorithm; deviceAssetId: string; deviceId: string; duplicateId: string | null; duration: string | null; edits?: ShallowDehydrateObject[]; - encodedVideoPath: string | null; exifInfo?: ShallowDehydrateObject> | null; faces?: ShallowDehydrateObject[]; fileCreatedAt: Date; diff --git a/server/src/dtos/duplicate.dto.ts b/server/src/dtos/duplicate.dto.ts index 9cd9147ec5..40b1b74c70 100644 --- a/server/src/dtos/duplicate.dto.ts +++ b/server/src/dtos/duplicate.dto.ts @@ -1,9 +1,35 @@ import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { ArrayMinSize, IsArray, ValidateNested } from 'class-validator'; import { AssetResponseDto } from 'src/dtos/asset-response.dto'; +import { ValidateUUID } from 'src/validation'; export class DuplicateResponseDto { @ApiProperty({ description: 'Duplicate group ID' }) duplicateId!: string; @ApiProperty({ description: 'Duplicate assets' }) assets!: AssetResponseDto[]; + + @ValidateUUID({ each: true, description: 'Suggested asset IDs to keep based on file size and EXIF data' }) + suggestedKeepAssetIds!: string[]; +} + +export class DuplicateResolveGroupDto { + @ValidateUUID() + duplicateId!: string; + + @ValidateUUID({ each: true, description: 'Asset IDs to keep' }) + keepAssetIds!: string[]; + + @ValidateUUID({ each: true, description: 'Asset IDs to trash or delete' }) + trashAssetIds!: string[]; +} + +export class DuplicateResolveDto { + @ApiProperty({ description: 'List of duplicate groups to resolve' }) + @ValidateNested({ each: true }) + @IsArray() + @Type(() => DuplicateResolveGroupDto) + @ArrayMinSize(1) + groups!: DuplicateResolveGroupDto[]; } diff --git a/server/src/dtos/env.dto.ts b/server/src/dtos/env.dto.ts index b04366c273..bdcf3614fd 100644 --- a/server/src/dtos/env.dto.ts +++ b/server/src/dtos/env.dto.ts @@ -42,6 +42,10 @@ export class EnvDto { @Optional() IMMICH_CONFIG_FILE?: string; + @IsString() + @Optional() + IMMICH_HELMET_FILE?: string; + @IsEnum(ImmichEnvironment) @Optional() IMMICH_ENV?: ImmichEnvironment; diff --git a/server/src/dtos/search.dto.ts b/server/src/dtos/search.dto.ts index f72ecdf8b6..196e72c37e 100644 --- a/server/src/dtos/search.dto.ts +++ b/server/src/dtos/search.dto.ts @@ -146,7 +146,7 @@ export class RandomSearchDto extends BaseSearchWithResultsDto { @ValidateBoolean({ optional: true, description: 'Include stacked assets' }) withStacked?: boolean; - @ValidateBoolean({ optional: true, description: 'Include assets with people' }) + @ValidateBoolean({ optional: true, description: 'Include people data in response' }) withPeople?: boolean; } diff --git a/server/src/enum.ts b/server/src/enum.ts index 887c8fa93c..1277a39036 100644 --- a/server/src/enum.ts +++ b/server/src/enum.ts @@ -37,6 +37,11 @@ export enum AssetType { Other = 'OTHER', } +export enum ChecksumAlgorithm { + sha1File = 'sha1', // sha1 checksum of the whole file contents + sha1Path = 'sha1-path', // sha1 checksum of "path:" plus the file path, currently used in external libraries, deprecated +} + export enum AssetFileType { /** * An full/large-size image extracted/converted from RAW photos @@ -45,6 +50,7 @@ export enum AssetFileType { Preview = 'preview', Thumbnail = 'thumbnail', Sidecar = 'sidecar', + EncodedVideo = 'encoded_video', } export enum AlbumUserRole { diff --git a/server/src/maintenance/maintenance-health.repository.ts b/server/src/maintenance/maintenance-health.repository.ts index aeef93ec51..6eab265677 100644 --- a/server/src/maintenance/maintenance-health.repository.ts +++ b/server/src/maintenance/maintenance-health.repository.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { fork } from 'node:child_process'; import { dirname, join } from 'node:path'; +import { IMMICH_SERVER_START } from 'src/constants'; @Injectable() export class MaintenanceHealthRepository { @@ -20,45 +21,27 @@ export class MaintenanceHealthRepository { stdio: ['ignore', 'pipe', 'ignore', 'ipc'], }); - async function checkHealth() { - try { - const response = await fetch('http://127.0.0.1:33001/api/server/config'); - const { isOnboarded } = await response.json(); - if (isOnboarded) { - resolve(); - } else { - reject(new Error('Server health check failed, no admin exists.')); - } - } catch (error) { - reject(error); - } finally { - if (worker.exitCode === null) { - worker.kill('SIGTERM'); - } - } - } - - let output = '', - alive = false; + let output = ''; worker.stdout?.on('data', (data) => { - if (alive) { + if (worker.exitCode !== null) { return; } output += data; - if (output.includes('Immich Server is listening')) { - alive = true; - void checkHealth(); + if (output.includes(IMMICH_SERVER_START)) { + resolve(); + worker.kill('SIGTERM'); } }); - worker.on('exit', reject); - worker.on('error', reject); + worker.on('exit', (code, signal) => reject(`Server health check failed, server exited with ${signal ?? code}`)); + worker.on('error', (error) => reject(`Server health check failed, process threw: ${error}`)); setTimeout(() => { if (worker.exitCode === null) { + reject('Server health check failed, took too long to start.'); worker.kill('SIGTERM'); } }, 20_000); diff --git a/server/src/maintenance/maintenance-worker.controller.ts b/server/src/maintenance/maintenance-worker.controller.ts index 162fa27257..bf06853bf2 100644 --- a/server/src/maintenance/maintenance-worker.controller.ts +++ b/server/src/maintenance/maintenance-worker.controller.ts @@ -20,7 +20,7 @@ import { MaintenanceStatusResponseDto, SetMaintenanceModeDto, } from 'src/dtos/maintenance.dto'; -import { ServerConfigDto, ServerVersionResponseDto } from 'src/dtos/server.dto'; +import { ServerConfigDto, ServerPingResponse, ServerVersionResponseDto } from 'src/dtos/server.dto'; import { ImmichCookie } from 'src/enum'; import { MaintenanceRoute } from 'src/maintenance/maintenance-auth.guard'; import { MaintenanceWorkerService } from 'src/maintenance/maintenance-worker.service'; @@ -52,6 +52,11 @@ export class MaintenanceWorkerController { return this.service.getSystemConfig(); } + @Get('server/ping') + pingServer(): ServerPingResponse { + return this.service.ping(); + } + @Get('server/version') getServerVersion(): ServerVersionResponseDto { return this.service.getVersion(); diff --git a/server/src/maintenance/maintenance-worker.service.ts b/server/src/maintenance/maintenance-worker.service.ts index 9ceb3caa43..61958a0d8a 100644 --- a/server/src/maintenance/maintenance-worker.service.ts +++ b/server/src/maintenance/maintenance-worker.service.ts @@ -12,7 +12,7 @@ import { MaintenanceStatusResponseDto, SetMaintenanceModeDto, } from 'src/dtos/maintenance.dto'; -import { ServerConfigDto, ServerVersionResponseDto } from 'src/dtos/server.dto'; +import { ServerConfigDto, ServerPingResponse, ServerVersionResponseDto } from 'src/dtos/server.dto'; import { DatabaseLock, ImmichCookie, MaintenanceAction, SystemMetadataKey } from 'src/enum'; import { MaintenanceHealthRepository } from 'src/maintenance/maintenance-health.repository'; import { MaintenanceWebsocketRepository } from 'src/maintenance/maintenance-websocket.repository'; @@ -121,6 +121,10 @@ export class MaintenanceWorkerService { return ServerVersionResponseDto.fromSemVer(serverVersion); } + ping(): ServerPingResponse { + return { res: 'pong' }; + } + /** * {@link _ApiService.ssr} */ diff --git a/server/src/middleware/file-upload.interceptor.ts b/server/src/middleware/file-upload.interceptor.ts index 6dfd11ee4b..63acb13789 100644 --- a/server/src/middleware/file-upload.interceptor.ts +++ b/server/src/middleware/file-upload.interceptor.ts @@ -3,13 +3,16 @@ import { PATH_METADATA } from '@nestjs/common/constants'; import { Reflector } from '@nestjs/core'; import { transformException } from '@nestjs/platform-express/multer/multer/multer.utils'; import { NextFunction, RequestHandler } from 'express'; -import multer, { StorageEngine, diskStorage } from 'multer'; +import multer from 'multer'; import { createHash, randomUUID } from 'node:crypto'; +import { join } from 'node:path'; +import { pipeline } from 'node:stream'; import { Observable } from 'rxjs'; import { UploadFieldName } from 'src/dtos/asset-media.dto'; import { RouteKey } from 'src/enum'; import { AuthRequest } from 'src/middleware/auth.guard'; import { LoggingRepository } from 'src/repositories/logging.repository'; +import { StorageRepository } from 'src/repositories/storage.repository'; import { AssetMediaService } from 'src/services/asset-media.service'; import { ImmichFile, UploadFile, UploadFiles } from 'src/types'; import { asUploadRequest, mapToUploadFile } from 'src/utils/asset.util'; @@ -26,8 +29,6 @@ export function getFiles(files: UploadFiles) { }; } -type DiskStorageCallback = (error: Error | null, result: string) => void; - type ImmichMulterFile = Express.Multer.File & { uuid: string }; interface Callback { @@ -35,34 +36,21 @@ interface Callback { (error: null, result: T): void; } -const callbackify = (target: (...arguments_: any[]) => T, callback: Callback) => { - try { - return callback(null, target()); - } catch (error: Error | any) { - return callback(error); - } -}; - @Injectable() export class FileUploadInterceptor implements NestInterceptor { private handlers: { userProfile: RequestHandler; assetUpload: RequestHandler; }; - private defaultStorage: StorageEngine; constructor( private reflect: Reflector, private assetService: AssetMediaService, + private storageRepository: StorageRepository, private logger: LoggingRepository, ) { this.logger.setContext(FileUploadInterceptor.name); - this.defaultStorage = diskStorage({ - filename: this.filename.bind(this), - destination: this.destination.bind(this), - }); - const instance = multer({ fileFilter: this.fileFilter.bind(this), storage: { @@ -99,60 +87,60 @@ export class FileUploadInterceptor implements NestInterceptor { } private fileFilter(request: AuthRequest, file: Express.Multer.File, callback: multer.FileFilterCallback) { - return callbackify(() => this.assetService.canUploadFile(asUploadRequest(request, file)), callback); - } - - private filename(request: AuthRequest, file: Express.Multer.File, callback: DiskStorageCallback) { - return callbackify( - () => this.assetService.getUploadFilename(asUploadRequest(request, file)), - callback as Callback, - ); - } - - private destination(request: AuthRequest, file: Express.Multer.File, callback: DiskStorageCallback) { - return callbackify( - () => this.assetService.getUploadFolder(asUploadRequest(request, file)), - callback as Callback, - ); + try { + callback(null, this.assetService.canUploadFile(asUploadRequest(request, file))); + } catch (error: Error | any) { + callback(error); + } } private handleFile(request: AuthRequest, file: Express.Multer.File, callback: Callback>) { - (file as ImmichMulterFile).uuid = randomUUID(); - request.on('error', (error) => { this.logger.warn('Request error while uploading file, cleaning up', error); this.assetService.onUploadError(request, file).catch(this.logger.error); }); - if (!this.isAssetUploadFile(file)) { - this.defaultStorage._handleFile(request, file, callback); - return; - } + try { + (file as ImmichMulterFile).uuid = randomUUID(); - const hash = createHash('sha1'); - file.stream.on('data', (chunk) => hash.update(chunk)); - this.defaultStorage._handleFile(request, file, (error, info) => { - if (error) { - hash.destroy(); - callback(error); - } else { - callback(null, { ...info, checksum: hash.digest() }); - } - }); + const uploadRequest = asUploadRequest(request, file); + + const path = join( + this.assetService.getUploadFolder(uploadRequest), + this.assetService.getUploadFilename(uploadRequest), + ); + + const writeStream = this.storageRepository.createWriteStream(path); + const hash = file.fieldname === UploadFieldName.ASSET_DATA ? createHash('sha1') : null; + + let size = 0; + + file.stream.on('data', (chunk) => { + hash?.update(chunk); + size += chunk.length; + }); + + pipeline(file.stream, writeStream, (error) => { + if (error) { + hash?.destroy(); + return callback(error); + } + callback(null, { + path, + size, + checksum: hash?.digest(), + }); + }); + } catch (error: Error | any) { + callback(error); + } } - private removeFile(request: AuthRequest, file: Express.Multer.File, callback: (error: Error | null) => void) { - this.defaultStorage._removeFile(request, file, callback); - } - - private isAssetUploadFile(file: Express.Multer.File) { - switch (file.fieldname as UploadFieldName) { - case UploadFieldName.ASSET_DATA: { - return true; - } - } - - return false; + private removeFile(_request: AuthRequest, file: Express.Multer.File, callback: (error: Error | null) => void) { + this.storageRepository + .unlink(file.path) + .then(() => callback(null)) + .catch(callback); } private getHandler(route: RouteKey) { diff --git a/server/src/queries/access.repository.sql b/server/src/queries/access.repository.sql index 1239260dce..810229093b 100644 --- a/server/src/queries/access.repository.sql +++ b/server/src/queries/access.repository.sql @@ -160,6 +160,16 @@ where "session"."userId" = $1 and "session"."id" in ($2) +-- AccessRepository.duplicate.checkOwnerAccess +select + "asset"."duplicateId" +from + "asset" +where + "asset"."duplicateId" in ($1) + and "asset"."ownerId" = $2 + and "asset"."deletedAt" is null + -- AccessRepository.memory.checkOwnerAccess select "memory"."id" diff --git a/server/src/queries/album.repository.sql b/server/src/queries/album.repository.sql index e3d7436c30..cc15260bdb 100644 --- a/server/src/queries/album.repository.sql +++ b/server/src/queries/album.repository.sql @@ -164,6 +164,28 @@ order by "album"."createdAt" desc, "album"."createdAt" desc +-- AlbumRepository.getByAssetIds +select + "album"."id", + "album_asset"."assetId" +from + "album" + inner join "album_asset" on "album_asset"."albumId" = "album"."id" +where + ( + "album"."ownerId" = $1 + or exists ( + select + from + "album_user" + where + "album_user"."albumId" = "album"."id" + and "album_user"."userId" = $2 + ) + ) + and "album_asset"."assetId" in ($3) + and "album"."deletedAt" is null + -- AlbumRepository.getMetadataForIds select "album_asset"."albumId" as "albumId", diff --git a/server/src/queries/asset.job.repository.sql b/server/src/queries/asset.job.repository.sql index a9c407782b..554aa3b195 100644 --- a/server/src/queries/asset.job.repository.sql +++ b/server/src/queries/asset.job.repository.sql @@ -175,7 +175,6 @@ where select "asset"."id", "asset"."ownerId", - "asset"."encodedVideoPath", ( select coalesce(json_agg(agg), '[]') @@ -250,6 +249,7 @@ where select "asset"."id", "asset"."checksum", + "asset"."checksumAlgorithm", "asset"."deviceAssetId", "asset"."deviceId", "asset"."fileCreatedAt", @@ -265,6 +265,7 @@ select "asset"."type", "asset"."width", "asset"."height", + "asset"."isEdited", ( select coalesce(json_agg(agg), '[]') @@ -463,7 +464,6 @@ select "asset"."libraryId", "asset"."ownerId", "asset"."livePhotoVideoId", - "asset"."encodedVideoPath", "asset"."originalPath", "asset"."isOffline", to_json("asset_exif") as "exifInfo", @@ -521,12 +521,17 @@ select from "asset" where - "asset"."type" = $1 - and ( - "asset"."encodedVideoPath" is null - or "asset"."encodedVideoPath" = $2 + "asset"."type" = 'VIDEO' + and not exists ( + select + "asset_file"."id" + from + "asset_file" + where + "asset_file"."assetId" = "asset"."id" + and "asset_file"."type" = 'encoded_video' ) - and "asset"."visibility" != $3 + and "asset"."visibility" != 'hidden' and "asset"."deletedAt" is null -- AssetJobRepository.getForVideoConversion @@ -534,12 +539,27 @@ select "asset"."id", "asset"."ownerId", "asset"."originalPath", - "asset"."encodedVideoPath" + ( + select + coalesce(json_agg(agg), '[]') + from + ( + select + "asset_file"."id", + "asset_file"."path", + "asset_file"."type", + "asset_file"."isEdited" + from + "asset_file" + where + "asset_file"."assetId" = "asset"."id" + ) as agg + ) as "files" from "asset" where "asset"."id" = $1 - and "asset"."type" = $2 + and "asset"."type" = 'VIDEO' -- AssetJobRepository.streamForMetadataExtraction select diff --git a/server/src/queries/asset.repository.sql b/server/src/queries/asset.repository.sql index a74a05f466..a2525c3b17 100644 --- a/server/src/queries/asset.repository.sql +++ b/server/src/queries/asset.repository.sql @@ -629,13 +629,21 @@ order by -- AssetRepository.getForVideo select - "asset"."encodedVideoPath", - "asset"."originalPath" + "asset"."originalPath", + ( + select + "asset_file"."path" + from + "asset_file" + where + "asset_file"."assetId" = "asset"."id" + and "asset_file"."type" = $1 + ) as "encodedVideoPath" from "asset" where - "asset"."id" = $1 - and "asset"."type" = $2 + "asset"."id" = $2 + and "asset"."type" = $3 -- AssetRepository.getForOcr select diff --git a/server/src/queries/duplicate.repository.sql b/server/src/queries/duplicate.repository.sql index 3f718f84c2..24a02e0f23 100644 --- a/server/src/queries/duplicate.repository.sql +++ b/server/src/queries/duplicate.repository.sql @@ -15,7 +15,26 @@ with inner join lateral ( select "asset".*, - "asset_exif" as "exifInfo" + to_json("asset_exif") as "exifInfo", + ( + select + coalesce(json_agg(agg), '[]') + from + ( + select + "tag"."id", + "tag"."value", + "tag"."createdAt", + "tag"."updatedAt", + "tag"."color", + "tag"."parentId" + from + "tag" + inner join "tag_asset" on "tag"."id" = "tag_asset"."tagId" + where + "tag_asset"."assetId" = "asset"."id" + ) as agg + ) as "tags" from "asset_exif" where @@ -29,36 +48,84 @@ with and "asset"."stackId" is null group by "asset"."duplicateId" - ), - "unique" as ( - select - "duplicateId" - from - "duplicates" - where - json_array_length("assets") = $2 - ), - "removed_unique" as ( - update "asset" - set - "duplicateId" = $3 - from - "unique" - where - "asset"."duplicateId" = "unique"."duplicateId" ) select * from "duplicates" where - not exists ( + json_array_length("assets") > $2 + +-- DuplicateRepository.cleanupSingletonGroups +with + "singletons" as ( select + "duplicateId" from - "unique" + "asset" where - "unique"."duplicateId" = "duplicates"."duplicateId" + "ownerId" = $1::uuid + and "duplicateId" is not null + and "deletedAt" is null + and "stackId" is null + group by + "duplicateId" + having + count("id") = $2 ) +update "asset" +set + "duplicateId" = $3 +from + "singletons" +where + "asset"."duplicateId" = "singletons"."duplicateId" + +-- DuplicateRepository.get +select + "asset"."duplicateId", + json_agg( + "asset2" + order by + "asset"."localDateTime" asc + ) as "assets" +from + "asset" + inner join lateral ( + select + "asset".*, + to_json("asset_exif") as "exifInfo", + ( + select + coalesce(json_agg(agg), '[]') + from + ( + select + "tag"."id", + "tag"."value", + "tag"."createdAt", + "tag"."updatedAt", + "tag"."color", + "tag"."parentId" + from + "tag" + inner join "tag_asset" on "tag"."id" = "tag_asset"."tagId" + where + "tag_asset"."assetId" = "asset"."id" + ) as agg + ) as "tags" + from + "asset_exif" + where + "asset_exif"."assetId" = "asset"."id" + ) as "asset2" on true +where + "asset"."visibility" in ('archive', 'timeline') + and "asset"."duplicateId" = $1::uuid + and "asset"."deletedAt" is null + and "asset"."stackId" is null +group by + "asset"."duplicateId" -- DuplicateRepository.delete update "asset" diff --git a/server/src/queries/person.repository.sql b/server/src/queries/person.repository.sql index 964aaaccee..80756f26c7 100644 --- a/server/src/queries/person.repository.sql +++ b/server/src/queries/person.repository.sql @@ -228,12 +228,12 @@ select from "asset_face" left join "asset" on "asset"."id" = "asset_face"."assetId" - and "asset_face"."personId" = $1 and "asset"."visibility" = 'timeline' and "asset"."deletedAt" is null where "asset_face"."deletedAt" is null and "asset_face"."isVisible" is true + and "asset_face"."personId" = $1 -- PersonRepository.getNumberOfPeople select diff --git a/server/src/queries/search.repository.sql b/server/src/queries/search.repository.sql index ef5fbe09be..099b7f4ee2 100644 --- a/server/src/queries/search.repository.sql +++ b/server/src/queries/search.repository.sql @@ -254,6 +254,7 @@ where and "visibility" = $2 and "deletedAt" is null and "state" is not null + and "state" != $3 -- SearchRepository.getCities select distinct @@ -266,6 +267,7 @@ where and "visibility" = $2 and "deletedAt" is null and "city" is not null + and "city" != $3 -- SearchRepository.getCameraMakes select distinct @@ -278,6 +280,7 @@ where and "visibility" = $2 and "deletedAt" is null and "make" is not null + and "make" != $3 -- SearchRepository.getCameraModels select distinct @@ -290,6 +293,7 @@ where and "visibility" = $2 and "deletedAt" is null and "model" is not null + and "model" != $3 -- SearchRepository.getCameraLensModels select distinct @@ -302,3 +306,4 @@ where and "visibility" = $2 and "deletedAt" is null and "lensModel" is not null + and "lensModel" != $3 diff --git a/server/src/queries/shared.link.repository.sql b/server/src/queries/shared.link.repository.sql index 2630e384fc..e1177bba28 100644 --- a/server/src/queries/shared.link.repository.sql +++ b/server/src/queries/shared.link.repository.sql @@ -3,37 +3,64 @@ -- SharedLinkRepository.get select "shared_link".*, - coalesce( - json_agg("a") filter ( - where - "a"."id" is not null - ), - '[]' + ( + select + coalesce(json_agg(agg), '[]') + from + ( + select + "asset".*, + to_json("exifInfo") as "exifInfo" + from + "shared_link_asset" + inner join "asset" on "asset"."id" = "shared_link_asset"."assetId" + inner join lateral ( + select + "asset_exif"."assetId", + "asset_exif"."autoStackId", + "asset_exif"."bitsPerSample", + "asset_exif"."city", + "asset_exif"."colorspace", + "asset_exif"."country", + "asset_exif"."dateTimeOriginal", + "asset_exif"."description", + "asset_exif"."exifImageHeight", + "asset_exif"."exifImageWidth", + "asset_exif"."exposureTime", + "asset_exif"."fileSizeInByte", + "asset_exif"."fNumber", + "asset_exif"."focalLength", + "asset_exif"."fps", + "asset_exif"."iso", + "asset_exif"."latitude", + "asset_exif"."lensModel", + "asset_exif"."livePhotoCID", + "asset_exif"."longitude", + "asset_exif"."make", + "asset_exif"."model", + "asset_exif"."modifyDate", + "asset_exif"."orientation", + "asset_exif"."profileDescription", + "asset_exif"."projectionType", + "asset_exif"."rating", + "asset_exif"."state", + "asset_exif"."tags", + "asset_exif"."timeZone" + from + "asset_exif" + where + "asset_exif"."assetId" = "asset"."id" + ) as "exifInfo" on true + where + "shared_link"."id" = "shared_link_asset"."sharedLinkId" + and "asset"."deletedAt" is null + order by + "asset"."fileCreatedAt" asc + ) as agg ) as "assets", to_json("album") as "album" from "shared_link" - left join lateral ( - select - "asset".*, - to_json("exifInfo") as "exifInfo" - from - "shared_link_asset" - inner join "asset" on "asset"."id" = "shared_link_asset"."assetId" - inner join lateral ( - select - "asset_exif".* - from - "asset_exif" - where - "asset_exif"."assetId" = "asset"."id" - ) as "exifInfo" on true - where - "shared_link"."id" = "shared_link_asset"."sharedLinkId" - and "asset"."deletedAt" is null - order by - "asset"."fileCreatedAt" asc - ) as "a" on true left join lateral ( select "album".*, @@ -60,7 +87,36 @@ from "asset" inner join lateral ( select - "asset_exif".* + "asset_exif"."assetId", + "asset_exif"."autoStackId", + "asset_exif"."bitsPerSample", + "asset_exif"."city", + "asset_exif"."colorspace", + "asset_exif"."country", + "asset_exif"."dateTimeOriginal", + "asset_exif"."description", + "asset_exif"."exifImageHeight", + "asset_exif"."exifImageWidth", + "asset_exif"."exposureTime", + "asset_exif"."fileSizeInByte", + "asset_exif"."fNumber", + "asset_exif"."focalLength", + "asset_exif"."fps", + "asset_exif"."iso", + "asset_exif"."latitude", + "asset_exif"."lensModel", + "asset_exif"."livePhotoCID", + "asset_exif"."longitude", + "asset_exif"."make", + "asset_exif"."model", + "asset_exif"."modifyDate", + "asset_exif"."orientation", + "asset_exif"."profileDescription", + "asset_exif"."projectionType", + "asset_exif"."rating", + "asset_exif"."state", + "asset_exif"."tags", + "asset_exif"."timeZone" from "asset_exif" where @@ -74,7 +130,12 @@ from ) as "assets" on true inner join lateral ( select - "user".* + "id", + "name", + "email", + "avatarColor", + "profileImagePath", + "profileChangedAt" from "user" where @@ -95,9 +156,6 @@ where "shared_link"."type" = $3 or "album"."id" is not null ) -group by - "shared_link"."id", - "album".* order by "shared_link"."createdAt" desc @@ -134,21 +192,12 @@ from "album" inner join lateral ( select - "user"."id", - "user"."email", - "user"."createdAt", - "user"."profileImagePath", - "user"."isAdmin", - "user"."shouldChangePassword", - "user"."deletedAt", - "user"."oauthId", - "user"."updatedAt", - "user"."storageLabel", - "user"."name", - "user"."quotaSizeInBytes", - "user"."quotaUsageInBytes", - "user"."status", - "user"."profileChangedAt" + "id", + "name", + "email", + "avatarColor", + "profileImagePath", + "profileChangedAt" from "user" where @@ -173,6 +222,7 @@ order by select "shared_link"."id", "shared_link"."userId", + "shared_link"."albumId", "shared_link"."expiresAt", "shared_link"."showExif", "shared_link"."allowUpload", @@ -211,6 +261,7 @@ where select "shared_link"."id", "shared_link"."userId", + "shared_link"."albumId", "shared_link"."expiresAt", "shared_link"."showExif", "shared_link"."allowUpload", @@ -265,7 +316,36 @@ from "asset" inner join lateral ( select - * + "asset_exif"."assetId", + "asset_exif"."autoStackId", + "asset_exif"."bitsPerSample", + "asset_exif"."city", + "asset_exif"."colorspace", + "asset_exif"."country", + "asset_exif"."dateTimeOriginal", + "asset_exif"."description", + "asset_exif"."exifImageHeight", + "asset_exif"."exifImageWidth", + "asset_exif"."exposureTime", + "asset_exif"."fileSizeInByte", + "asset_exif"."fNumber", + "asset_exif"."focalLength", + "asset_exif"."fps", + "asset_exif"."iso", + "asset_exif"."latitude", + "asset_exif"."lensModel", + "asset_exif"."livePhotoCID", + "asset_exif"."longitude", + "asset_exif"."make", + "asset_exif"."model", + "asset_exif"."modifyDate", + "asset_exif"."orientation", + "asset_exif"."profileDescription", + "asset_exif"."projectionType", + "asset_exif"."rating", + "asset_exif"."state", + "asset_exif"."tags", + "asset_exif"."timeZone" from "asset_exif" where diff --git a/server/src/queries/sync.repository.sql b/server/src/queries/sync.repository.sql index 43c6a380bf..a4acc95e29 100644 --- a/server/src/queries/sync.repository.sql +++ b/server/src/queries/sync.repository.sql @@ -582,7 +582,6 @@ where "asset_face"."updateId" < $1 and "asset_face"."updateId" > $2 and "asset"."ownerId" = $3 - and "asset_face"."isVisible" = $4 order by "asset_face"."updateId" asc diff --git a/server/src/repositories/access.repository.ts b/server/src/repositories/access.repository.ts index 533e74a311..1661e42c14 100644 --- a/server/src/repositories/access.repository.ts +++ b/server/src/repositories/access.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { Kysely, sql } from 'kysely'; +import { Kysely, NotNull, sql } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { ChunkedSet, DummyValue, GenerateSql } from 'src/decorators'; import { AlbumUserRole, AssetVisibility } from 'src/enum'; @@ -285,6 +285,28 @@ class AuthDeviceAccess { } } +class DuplicateAccess { + constructor(private db: Kysely) {} + + @GenerateSql({ params: [DummyValue.UUID, DummyValue.UUID_SET] }) + @ChunkedSet({ paramIndex: 1 }) + async checkOwnerAccess(userId: string, duplicateIds: Set) { + if (duplicateIds.size === 0) { + return new Set(); + } + + return this.db + .selectFrom('asset') + .select('asset.duplicateId') + .where('asset.duplicateId', 'in', [...duplicateIds]) + .where('asset.ownerId', '=', userId) + .where('asset.deletedAt', 'is', null) + .$narrowType<{ duplicateId: NotNull }>() + .execute() + .then((assets) => new Set(assets.map((asset) => asset.duplicateId))); + } +} + class NotificationAccess { constructor(private db: Kysely) {} @@ -488,6 +510,7 @@ export class AccessRepository { album: AlbumAccess; asset: AssetAccess; authDevice: AuthDeviceAccess; + duplicate: DuplicateAccess; memory: MemoryAccess; notification: NotificationAccess; person: PersonAccess; @@ -503,6 +526,7 @@ export class AccessRepository { this.album = new AlbumAccess(db); this.asset = new AssetAccess(db); this.authDevice = new AuthDeviceAccess(db); + this.duplicate = new DuplicateAccess(db); this.memory = new MemoryAccess(db); this.notification = new NotificationAccess(db); this.person = new PersonAccess(db); diff --git a/server/src/repositories/album.repository.ts b/server/src/repositories/album.repository.ts index 9a76b379ed..e4d802b93c 100644 --- a/server/src/repositories/album.repository.ts +++ b/server/src/repositories/album.repository.ts @@ -125,6 +125,44 @@ export class AlbumRepository { .execute(); } + @GenerateSql({ params: [DummyValue.UUID, [DummyValue.UUID]] }) + @ChunkedSet({ paramIndex: 1 }) + async getByAssetIds(ownerId: string, assetIds: string[]): Promise> { + if (assetIds.length === 0) { + return new Map(); + } + + const results = await this.db + .selectFrom('album') + .select('album.id') + .innerJoin('album_asset', 'album_asset.albumId', 'album.id') + .where((eb) => + eb.or([ + eb('album.ownerId', '=', ownerId), + eb.exists( + eb + .selectFrom('album_user') + .whereRef('album_user.albumId', '=', 'album.id') + .where('album_user.userId', '=', ownerId), + ), + ]), + ) + .where('album_asset.assetId', 'in', assetIds) + .where('album.deletedAt', 'is', null) + .select('album_asset.assetId') + .execute(); + + // Group by assetId + const map = new Map(); + for (const row of results) { + const existing = map.get(row.assetId) ?? []; + existing.push(row.id); + map.set(row.assetId, existing); + } + + return map; + } + @GenerateSql({ params: [[DummyValue.UUID]] }) @ChunkedArray() async getMetadataForIds(ids: string[]): Promise { @@ -330,6 +368,7 @@ export class AlbumRepository { await db .insertInto('album_asset') .values(assetIds.map((assetId) => ({ albumId, assetId }))) + .onConflict((oc) => oc.doNothing()) .execute(); } @@ -338,7 +377,12 @@ export class AlbumRepository { if (values.length === 0) { return; } - await this.db.insertInto('album_asset').values(values).execute(); + await this.db + .insertInto('album_asset') + .values(values) + // Allow idempotent album sync without failing on existing album memberships. + .onConflict((oc) => oc.columns(['albumId', 'assetId']).doNothing()) + .execute(); } /** diff --git a/server/src/repositories/asset-job.repository.ts b/server/src/repositories/asset-job.repository.ts index a8067473e4..3765cad7ed 100644 --- a/server/src/repositories/asset-job.repository.ts +++ b/server/src/repositories/asset-job.repository.ts @@ -104,7 +104,7 @@ export class AssetJobRepository { getForMigrationJob(id: string) { return this.db .selectFrom('asset') - .select(['asset.id', 'asset.ownerId', 'asset.encodedVideoPath']) + .select(['asset.id', 'asset.ownerId']) .select(withFiles) .where('asset.id', '=', id) .executeTakeFirst(); @@ -268,7 +268,6 @@ export class AssetJobRepository { 'asset.libraryId', 'asset.ownerId', 'asset.livePhotoVideoId', - 'asset.encodedVideoPath', 'asset.originalPath', 'asset.isOffline', ]) @@ -310,11 +309,21 @@ export class AssetJobRepository { return this.db .selectFrom('asset') .select(['asset.id']) - .where('asset.type', '=', AssetType.Video) + .where('asset.type', '=', sql.lit(AssetType.Video)) .$if(!force, (qb) => qb - .where((eb) => eb.or([eb('asset.encodedVideoPath', 'is', null), eb('asset.encodedVideoPath', '=', '')])) - .where('asset.visibility', '!=', AssetVisibility.Hidden), + .where((eb) => + eb.not( + eb.exists( + eb + .selectFrom('asset_file') + .select('asset_file.id') + .whereRef('asset_file.assetId', '=', 'asset.id') + .where('asset_file.type', '=', sql.lit(AssetFileType.EncodedVideo)), + ), + ), + ) + .where('asset.visibility', '!=', sql.lit(AssetVisibility.Hidden)), ) .where('asset.deletedAt', 'is', null) .stream(); @@ -324,9 +333,10 @@ export class AssetJobRepository { getForVideoConversion(id: string) { return this.db .selectFrom('asset') - .select(['asset.id', 'asset.ownerId', 'asset.originalPath', 'asset.encodedVideoPath']) + .select(['asset.id', 'asset.ownerId', 'asset.originalPath']) + .select(withFiles) .where('asset.id', '=', id) - .where('asset.type', '=', AssetType.Video) + .where('asset.type', '=', sql.lit(AssetType.Video)) .executeTakeFirst(); } diff --git a/server/src/repositories/asset.repository.ts b/server/src/repositories/asset.repository.ts index 200137a137..2e1d02ef28 100644 --- a/server/src/repositories/asset.repository.ts +++ b/server/src/repositories/asset.repository.ts @@ -36,6 +36,7 @@ import { withExif, withFaces, withFacesAndPeople, + withFilePath, withFiles, withLibrary, withOwner, @@ -1019,8 +1020,21 @@ export class AssetRepository { .execute(); } - async deleteFile({ assetId, type }: { assetId: string; type: AssetFileType }): Promise { - await this.db.deleteFrom('asset_file').where('assetId', '=', asUuid(assetId)).where('type', '=', type).execute(); + async deleteFile({ + assetId, + type, + edited, + }: { + assetId: string; + type: AssetFileType; + edited?: boolean; + }): Promise { + await this.db + .deleteFrom('asset_file') + .where('assetId', '=', asUuid(assetId)) + .where('type', '=', type) + .$if(edited !== undefined, (qb) => qb.where('isEdited', '=', edited!)) + .execute(); } async deleteFiles(files: Pick, 'id'>[]): Promise { @@ -1139,7 +1153,8 @@ export class AssetRepository { async getForVideo(id: string) { return this.db .selectFrom('asset') - .select(['asset.encodedVideoPath', 'asset.originalPath']) + .select(['asset.originalPath']) + .select((eb) => withFilePath(eb, AssetFileType.EncodedVideo).as('encodedVideoPath')) .where('asset.id', '=', id) .where('asset.type', '=', AssetType.Video) .executeTakeFirst(); diff --git a/server/src/repositories/config.repository.ts b/server/src/repositories/config.repository.ts index 7e8082a582..1864733f87 100644 --- a/server/src/repositories/config.repository.ts +++ b/server/src/repositories/config.repository.ts @@ -5,9 +5,11 @@ import { QueueOptions } from 'bullmq'; import { plainToInstance } from 'class-transformer'; import { validateSync } from 'class-validator'; import { Request, Response } from 'express'; +import { HelmetOptions } from 'helmet'; import { RedisOptions } from 'ioredis'; import { CLS_ID, ClsModuleOptions } from 'nestjs-cls'; import { OpenTelemetryModuleOptions } from 'nestjs-otel/lib/interfaces'; +import { readFileSync } from 'node:fs'; import { join } from 'node:path'; import { citiesFile, excludePaths, IWorker } from 'src/constants'; import { Telemetry } from 'src/decorators'; @@ -58,6 +60,10 @@ export interface EnvData { config: ClsModuleOptions; }; + helmet: { + config?: HelmetOptions; + }; + database: { config: DatabaseConnectionParams; skipMigrations: boolean; @@ -143,6 +149,25 @@ const asSet = (value: string | undefined, defaults: T[]) => { return new Set(values.length === 0 ? defaults : (values as T[])); }; +const resolveHelmetFile = (helmetFile: 'true' | 'false' | string | undefined) => { + // default is off + if (!helmetFile || helmetFile === 'false') { + return; + } + + helmetFile = + helmetFile === 'true' + ? // eslint-disable-next-line unicorn/prefer-module + join(__dirname, '..', '..', 'helmet.json') + : helmetFile; + + try { + return JSON.parse(readFileSync(helmetFile).toString()) as HelmetOptions; + } catch (error) { + throw new Error(`Failed to read helmet file: ${helmetFile}`, { cause: error }); + } +}; + const getEnv = (): EnvData => { const dto = plainToInstance(EnvDto, process.env); const errors = validateSync(dto); @@ -289,6 +314,10 @@ const getEnv = (): EnvData => { vectorExtension, }, + helmet: { + config: resolveHelmetFile(dto.IMMICH_HELMET_FILE), + }, + licensePublicKey: isProd ? productionKeys : stagingKeys, network: { diff --git a/server/src/repositories/database.repository.ts b/server/src/repositories/database.repository.ts index 4ffb37c79c..7ae1119bbc 100644 --- a/server/src/repositories/database.repository.ts +++ b/server/src/repositories/database.repository.ts @@ -431,7 +431,6 @@ export class DatabaseRepository { .updateTable('asset') .set((eb) => ({ originalPath: eb.fn('REGEXP_REPLACE', ['originalPath', source, target]), - encodedVideoPath: eb.fn('REGEXP_REPLACE', ['encodedVideoPath', source, target]), })) .execute(); diff --git a/server/src/repositories/duplicate.repository.ts b/server/src/repositories/duplicate.repository.ts index 7a5931e029..6a9b4e9082 100644 --- a/server/src/repositories/duplicate.repository.ts +++ b/server/src/repositories/duplicate.repository.ts @@ -1,13 +1,19 @@ import { Injectable } from '@nestjs/common'; import { Kysely, NotNull, Selectable, ShallowDehydrateObject, sql } from 'kysely'; +import { jsonArrayFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; +import { columns } from 'src/database'; import { Chunked, DummyValue, GenerateSql } from 'src/decorators'; +import { MapAsset } from 'src/dtos/asset-response.dto'; import { AssetType, VectorIndex } from 'src/enum'; import { probes } from 'src/repositories/database.repository'; import { DB } from 'src/schema'; import { AssetExifTable } from 'src/schema/tables/asset-exif.table'; import { anyUuid, asUuid, withDefaultVisibility } from 'src/utils/database'; +// Maximum number of candidate duplicates to return from vector search +const DUPLICATE_SEARCH_LIMIT = 64; + interface DuplicateSearch { assetId: string; embedding: string; @@ -34,20 +40,39 @@ export class DuplicateRepository { qb .selectFrom('asset') .$call(withDefaultVisibility) + // Use innerJoinLateral to build a composite object per asset that includes + // exifInfo and tags. This "asset2" object is then aggregated via jsonAgg. + // Tags must be included here (not via separate joins) so they appear in the + // final MapAsset[] output - needed for tag synchronization during resolution. .innerJoinLateral( (qb) => qb .selectFrom('asset_exif') .selectAll('asset') .select((eb) => - eb.table('asset_exif').$castTo>>().as('exifInfo'), + eb.fn + .toJson('asset_exif') + .$castTo>>() + .as('exifInfo'), + ) + + .select((eb) => + jsonArrayFrom( + eb + .selectFrom('tag') + .select(columns.tag) + .innerJoin('tag_asset', 'tag.id', 'tag_asset.tagId') + .whereRef('tag_asset.assetId', '=', 'asset.id'), + ).as('tags'), ) .whereRef('asset_exif.assetId', '=', 'asset.id') .as('asset2'), (join) => join.onTrue(), ) .select('asset.duplicateId') - .select((eb) => eb.fn.jsonAgg('asset2').orderBy('asset.localDateTime', 'asc').as('assets')) + .select((eb) => + eb.fn.jsonAgg('asset2').orderBy('asset.localDateTime', 'asc').$castTo().as('assets'), + ) .where('asset.ownerId', '=', asUuid(userId)) .where('asset.duplicateId', 'is not', null) .$narrowType<{ duplicateId: NotNull }>() @@ -55,29 +80,80 @@ export class DuplicateRepository { .where('asset.stackId', 'is', null) .groupBy('asset.duplicateId'), ) - .with('unique', (qb) => - qb - .selectFrom('duplicates') - .select('duplicateId') - .where((eb) => eb(eb.fn('json_array_length', ['assets']), '=', 1)), - ) - .with('removed_unique', (qb) => - qb - .updateTable('asset') - .set({ duplicateId: null }) - .from('unique') - .whereRef('asset.duplicateId', '=', 'unique.duplicateId'), - ) .selectFrom('duplicates') .selectAll() - // TODO: compare with filtering by json_array_length > 1 - .where(({ not, exists }) => - not(exists((eb) => eb.selectFrom('unique').whereRef('unique.duplicateId', '=', 'duplicates.duplicateId'))), - ) + // Filter out singleton groups (only 1 asset) directly in the query + .where((eb) => eb(eb.fn('json_array_length', ['assets']), '>', 1)) .execute() ); } + @GenerateSql({ params: [DummyValue.UUID] }) + async cleanupSingletonGroups(userId: string): Promise { + // Remove duplicateId from assets that are the only member of their duplicate group + await this.db + .with('singletons', (qb) => + qb + .selectFrom('asset') + .select('duplicateId') + .where('ownerId', '=', asUuid(userId)) + .where('duplicateId', 'is not', null) + .$narrowType<{ duplicateId: NotNull }>() + .where('deletedAt', 'is', null) + .where('stackId', 'is', null) + .groupBy('duplicateId') + .having((eb) => eb.fn.count('id'), '=', 1), + ) + .updateTable('asset') + .set({ duplicateId: null }) + .from('singletons') + .whereRef('asset.duplicateId', '=', 'singletons.duplicateId') + .execute(); + } + + @GenerateSql({ params: [DummyValue.UUID, DummyValue.UUID] }) + async get(duplicateId: string): Promise<{ duplicateId: string; assets: MapAsset[] } | undefined> { + const result = await this.db + .selectFrom('asset') + .$call(withDefaultVisibility) + // Use innerJoinLateral to build a composite object per asset that includes + // exifInfo and tags. This "asset2" object is then aggregated via jsonAgg. + // Tags must be included here (not via separate joins) so they appear in the + // final MapAsset[] output - needed for tag synchronization during resolution. + .innerJoinLateral( + (qb) => + qb + .selectFrom('asset_exif') + .selectAll('asset') + .select((eb) => eb.fn.toJson('asset_exif').as('exifInfo')) + .select((eb) => + jsonArrayFrom( + eb + .selectFrom('tag') + .select(columns.tag) + .innerJoin('tag_asset', 'tag.id', 'tag_asset.tagId') + .whereRef('tag_asset.assetId', '=', 'asset.id'), + ).as('tags'), + ) + .whereRef('asset_exif.assetId', '=', 'asset.id') + .as('asset2'), + (join) => join.onTrue(), + ) + .select('asset.duplicateId') + .select((eb) => eb.fn.jsonAgg('asset2').orderBy('asset.localDateTime', 'asc').$castTo().as('assets')) + .where('asset.duplicateId', '=', asUuid(duplicateId)) + .where('asset.deletedAt', 'is', null) + .where('asset.stackId', 'is', null) + .groupBy('asset.duplicateId') + .executeTakeFirst(); + + if (!result || !result.duplicateId) { + return; + } + + return { duplicateId: result.duplicateId, assets: result.assets }; + } + @GenerateSql({ params: [DummyValue.UUID, DummyValue.UUID] }) async delete(userId: string, id: string): Promise { await this.db @@ -134,7 +210,7 @@ export class DuplicateRepository { .where('asset.id', '!=', asUuid(assetId)) .where('asset.stackId', 'is', null) .orderBy('distance') - .limit(64), + .limit(DUPLICATE_SEARCH_LIMIT), ) .selectFrom('cte') .selectAll() diff --git a/server/src/repositories/email.repository.ts b/server/src/repositories/email.repository.ts index 1bc4f0981a..a0cc23661a 100644 --- a/server/src/repositories/email.repository.ts +++ b/server/src/repositories/email.repository.ts @@ -162,6 +162,7 @@ export class EmailRepository { host: options.host, port: options.port, tls: { rejectUnauthorized: !options.ignoreCert }, + secure: options.secure, auth: options.username || options.password ? { diff --git a/server/src/repositories/metadata.repository.ts b/server/src/repositories/metadata.repository.ts index fc00d44b3f..57c688cac2 100644 --- a/server/src/repositories/metadata.repository.ts +++ b/server/src/repositories/metadata.repository.ts @@ -119,8 +119,12 @@ export class MetadataRepository { } async writeTags(path: string, tags: Partial): Promise { + // If exiftool assigns a field with ^= instead of =, empty values will be written too. + // Since exiftool-vendored doesn't support an option for this, we append the ^ to the name of the tag instead. + // https://exiftool.org/exiftool_pod.html#:~:text=is%20used%20to%20write%20an%20empty%20string + const tagsToWrite = Object.fromEntries(Object.entries(tags).map(([key, value]) => [`${key}^`, value])); try { - await this.exiftool.write(path, tags); + await this.exiftool.write(path, tagsToWrite); } catch (error) { this.logger.warn(`Error writing exif data (${path}): ${error}`); } diff --git a/server/src/repositories/oauth.repository.ts b/server/src/repositories/oauth.repository.ts index a42955ba10..b2e72e470a 100644 --- a/server/src/repositories/oauth.repository.ts +++ b/server/src/repositories/oauth.repository.ts @@ -1,5 +1,19 @@ import { Injectable, InternalServerErrorException } from '@nestjs/common'; -import type { UserInfoResponse } from 'openid-client' with { 'resolution-mode': 'import' }; +import { + allowInsecureRequests, + authorizationCodeGrant, + buildAuthorizationUrl, + calculatePKCECodeChallenge, + ClientSecretBasic, + ClientSecretPost, + discovery, + fetchUserInfo, + None, + randomPKCECodeVerifier, + randomState, + skipSubjectCheck, + type UserInfoResponse, +} from 'openid-client'; import { OAuthTokenEndpointAuthMethod } from 'src/enum'; import { LoggingRepository } from 'src/repositories/logging.repository'; @@ -24,8 +38,6 @@ export class OAuthRepository { } async authorize(config: OAuthConfig, redirectUrl: string, state?: string, codeChallenge?: string) { - const { buildAuthorizationUrl, randomState, randomPKCECodeVerifier, calculatePKCECodeChallenge } = - await import('openid-client'); const client = await this.getClient(config); state ??= randomState(); @@ -64,13 +76,21 @@ export class OAuthRepository { expectedState: string, codeVerifier: string, ): Promise { - const { authorizationCodeGrant, fetchUserInfo, ...oidc } = await import('openid-client'); const client = await this.getClient(config); const pkceCodeVerifier = client.serverMetadata().supportsPKCE() ? codeVerifier : undefined; try { const tokens = await authorizationCodeGrant(client, new URL(url), { expectedState, pkceCodeVerifier }); - const profile = await fetchUserInfo(client, tokens.access_token, oidc.skipSubjectCheck); + + let profile: OAuthProfile; + const tokenClaims = tokens.claims(); + if (tokenClaims && 'email' in tokenClaims) { + this.logger.debug('Using ID token claims instead of userinfo endpoint'); + profile = tokenClaims as OAuthProfile; + } else { + profile = await fetchUserInfo(client, tokens.access_token, skipSubjectCheck); + } + if (!profile.sub) { throw new Error('Unexpected profile response, no `sub`'); } @@ -115,7 +135,6 @@ export class OAuthRepository { timeout, }: OAuthConfig) { try { - const { allowInsecureRequests, discovery } = await import('openid-client'); return await discovery( new URL(issuerUrl), clientId, @@ -125,7 +144,7 @@ export class OAuthRepository { userinfo_signed_response_alg: profileSigningAlgorithm === 'none' ? undefined : profileSigningAlgorithm, id_token_signed_response_alg: signingAlgorithm, }, - await this.getTokenAuthMethod(tokenEndpointAuthMethod, clientSecret), + this.getTokenAuthMethod(tokenEndpointAuthMethod, clientSecret), { execute: [allowInsecureRequests], timeout, @@ -137,9 +156,7 @@ export class OAuthRepository { } } - private async getTokenAuthMethod(tokenEndpointAuthMethod: OAuthTokenEndpointAuthMethod, clientSecret?: string) { - const { None, ClientSecretPost, ClientSecretBasic } = await import('openid-client'); - + private getTokenAuthMethod(tokenEndpointAuthMethod: OAuthTokenEndpointAuthMethod, clientSecret?: string) { if (!clientSecret) { return None(); } diff --git a/server/src/repositories/person.repository.ts b/server/src/repositories/person.repository.ts index 00156a2492..8701779de5 100644 --- a/server/src/repositories/person.repository.ts +++ b/server/src/repositories/person.repository.ts @@ -352,13 +352,13 @@ export class PersonRepository { .leftJoin('asset', (join) => join .onRef('asset.id', '=', 'asset_face.assetId') - .on('asset_face.personId', '=', personId) .on('asset.visibility', '=', sql.lit(AssetVisibility.Timeline)) .on('asset.deletedAt', 'is', null), ) .select((eb) => eb.fn.count(eb.fn('distinct', ['asset.id'])).as('count')) .where('asset_face.deletedAt', 'is', null) .where('asset_face.isVisible', 'is', true) + .where('asset_face.personId', '=', personId) .executeTakeFirst(); return { diff --git a/server/src/repositories/search.repository.ts b/server/src/repositories/search.repository.ts index 13ac254654..ba72a70fdb 100644 --- a/server/src/repositories/search.repository.ts +++ b/server/src/repositories/search.repository.ts @@ -502,10 +502,7 @@ export class SearchRepository { return res.map((row) => row.lensModel!); } - private getExifField( - field: K, - userIds: string[], - ) { + private getExifField(field: 'city' | 'state' | 'country' | 'make' | 'model' | 'lensModel', userIds: string[]) { return this.db .selectFrom('asset_exif') .select(field) @@ -514,6 +511,7 @@ export class SearchRepository { .where('ownerId', '=', anyUuid(userIds)) .where('visibility', '=', AssetVisibility.Timeline) .where('deletedAt', 'is', null) - .where(field, 'is not', null); + .where(field, 'is not', null) + .where(field, '!=', ''); } } diff --git a/server/src/repositories/shared-link.repository.ts b/server/src/repositories/shared-link.repository.ts index 48afcf7d92..ddfe37ef35 100644 --- a/server/src/repositories/shared-link.repository.ts +++ b/server/src/repositories/shared-link.repository.ts @@ -1,10 +1,10 @@ import { Injectable } from '@nestjs/common'; -import { Insertable, Kysely, Selectable, ShallowDehydrateObject, sql, Updateable } from 'kysely'; +import { ExpressionBuilder, Insertable, Kysely, Selectable, ShallowDehydrateObject, sql, Updateable } from 'kysely'; import { jsonArrayFrom, jsonObjectFrom } from 'kysely/helpers/postgres'; import _ from 'lodash'; import { InjectKysely } from 'nestjs-kysely'; import { Album, columns } from 'src/database'; -import { DummyValue, GenerateSql } from 'src/decorators'; +import { ChunkedArray, DummyValue, GenerateSql } from 'src/decorators'; import { SharedLinkType } from 'src/enum'; import { DB } from 'src/schema'; import { AssetExifTable } from 'src/schema/tables/asset-exif.table'; @@ -17,6 +17,41 @@ export type SharedLinkSearchOptions = { albumId?: string; }; +const withSharedAssets = (eb: ExpressionBuilder) => { + return eb + .selectFrom('shared_link_asset') + .whereRef('shared_link.id', '=', 'shared_link_asset.sharedLinkId') + .innerJoin('asset', 'asset.id', 'shared_link_asset.assetId') + .where('asset.deletedAt', 'is', null) + .selectAll('asset') + .orderBy('asset.fileCreatedAt', 'asc'); +}; + +export const withExifInfo = (eb: ExpressionBuilder) => { + return eb + .selectFrom('asset_exif') + .select(columns.exif) + .whereRef('asset_exif.assetId', '=', 'asset.id') + .as('exifInfo'); +}; + +const withAlbumOwner = (eb: ExpressionBuilder) => { + return eb + .selectFrom('user') + .select(columns.user) + .whereRef('user.id', '=', 'album.ownerId') + .where('user.deletedAt', 'is', null) + .as('owner'); +}; + +const withSharedLinkAlbum = (eb: ExpressionBuilder) => { + return eb + .selectFrom('album') + .selectAll('album') + .whereRef('album.id', '=', 'shared_link.albumId') + .where('album.deletedAt', 'is', null); +}; + @Injectable() export class SharedLinkRepository { constructor(@InjectKysely() private db: Kysely) {} @@ -26,35 +61,16 @@ export class SharedLinkRepository { return this.db .selectFrom('shared_link') .selectAll('shared_link') - .leftJoinLateral( - (eb) => - eb - .selectFrom('shared_link_asset') - .whereRef('shared_link.id', '=', 'shared_link_asset.sharedLinkId') - .innerJoin('asset', 'asset.id', 'shared_link_asset.assetId') - .where('asset.deletedAt', 'is', null) - .selectAll('asset') - .innerJoinLateral( - (eb) => - eb - .selectFrom('asset_exif') - .selectAll('asset_exif') - .whereRef('asset_exif.assetId', '=', 'asset.id') - .as('exifInfo'), - (join) => join.onTrue(), - ) - .select((eb) => eb.fn.toJson('exifInfo').as('exifInfo')) - .orderBy('asset.fileCreatedAt', 'asc') - .as('a'), - (join) => join.onTrue(), + .select((eb) => + jsonArrayFrom( + withSharedAssets(eb) + .innerJoinLateral(withExifInfo, (join) => join.onTrue()) + .select((eb) => eb.fn.toJson('exifInfo').as('exifInfo')), + ).as('assets'), ) .leftJoinLateral( (eb) => - eb - .selectFrom('album') - .selectAll('album') - .whereRef('album.id', '=', 'shared_link.albumId') - .where('album.deletedAt', 'is', null) + withSharedLinkAlbum(eb) .leftJoin('album_asset', 'album_asset.albumId', 'album.id') .leftJoinLateral( (eb) => @@ -63,30 +79,13 @@ export class SharedLinkRepository { .selectAll('asset') .whereRef('album_asset.assetId', '=', 'asset.id') .where('asset.deletedAt', 'is', null) - .innerJoinLateral( - (eb) => - eb - .selectFrom('asset_exif') - .selectAll('asset_exif') - .whereRef('asset_exif.assetId', '=', 'asset.id') - .as('exifInfo'), - (join) => join.onTrue(), - ) + .innerJoinLateral(withExifInfo, (join) => join.onTrue()) .select((eb) => eb.fn.toJson(eb.table('exifInfo')).as('exifInfo')) .orderBy('asset.fileCreatedAt', 'asc') .as('assets'), (join) => join.onTrue(), ) - .innerJoinLateral( - (eb) => - eb - .selectFrom('user') - .selectAll('user') - .whereRef('user.id', '=', 'album.ownerId') - .where('user.deletedAt', 'is', null) - .as('owner'), - (join) => join.onTrue(), - ) + .innerJoinLateral(withAlbumOwner, (join) => join.onTrue()) .select((eb) => eb.fn .coalesce( @@ -104,17 +103,6 @@ export class SharedLinkRepository { .as('album'), (join) => join.onTrue(), ) - .select((eb) => - eb.fn - .coalesce(eb.fn.jsonAgg('a').filterWhere('a.id', 'is not', null), sql`'[]'`) - .$castTo< - (ShallowDehydrateObject> & { - exifInfo: ShallowDehydrateObject>; - })[] - >() - .as('assets'), - ) - .groupBy(['shared_link.id', sql`"album".*`]) .select((eb) => eb.fn.toJson(eb.table('album')).$castTo | null>().as('album')) .where('shared_link.id', '=', id) .where('shared_link.userId', '=', userId) @@ -128,53 +116,13 @@ export class SharedLinkRepository { return this.db .selectFrom('shared_link') .selectAll('shared_link') + .select((eb) => jsonArrayFrom(withSharedAssets(eb).limit(1)).as('assets')) .where('shared_link.userId', '=', userId) - .select((eb) => - jsonArrayFrom( - eb - .selectFrom('shared_link_asset') - .whereRef('shared_link.id', '=', 'shared_link_asset.sharedLinkId') - .innerJoin('asset', 'asset.id', 'shared_link_asset.assetId') - .where('asset.deletedAt', 'is', null) - .selectAll('asset') - .orderBy('asset.fileCreatedAt', 'asc') - .limit(1), - ).as('assets'), - ) .leftJoinLateral( (eb) => - eb - .selectFrom('album') - .selectAll('album') - .whereRef('album.id', '=', 'shared_link.albumId') - .innerJoinLateral( - (eb) => - eb - .selectFrom('user') - .select([ - 'user.id', - 'user.email', - 'user.createdAt', - 'user.profileImagePath', - 'user.isAdmin', - 'user.shouldChangePassword', - 'user.deletedAt', - 'user.oauthId', - 'user.updatedAt', - 'user.storageLabel', - 'user.name', - 'user.quotaSizeInBytes', - 'user.quotaUsageInBytes', - 'user.status', - 'user.profileChangedAt', - ]) - .whereRef('user.id', '=', 'album.ownerId') - .where('user.deletedAt', 'is', null) - .as('owner'), - (join) => join.onTrue(), - ) + withSharedLinkAlbum(eb) + .innerJoinLateral(withAlbumOwner, (join) => join.onTrue()) .select((eb) => eb.fn.toJson('owner').as('owner')) - .where('album.deletedAt', 'is', null) .as('album'), (join) => join.onTrue(), ) @@ -202,7 +150,14 @@ export class SharedLinkRepository { .leftJoin('album', 'album.id', 'shared_link.albumId') .where('album.deletedAt', 'is', null) .select((eb) => [ - ...columns.authSharedLink, + 'shared_link.id', + 'shared_link.userId', + 'shared_link.albumId', + 'shared_link.expiresAt', + 'shared_link.showExif', + 'shared_link.allowUpload', + 'shared_link.allowDownload', + 'shared_link.password', jsonObjectFrom( eb.selectFrom('user').select(columns.authUser).whereRef('user.id', '=', 'shared_link.userId'), ).as('user'), @@ -249,6 +204,20 @@ export class SharedLinkRepository { await this.db.deleteFrom('shared_link').where('shared_link.id', '=', id).execute(); } + @ChunkedArray({ paramIndex: 1 }) + async addAssets(id: string, assetIds: string[]) { + if (assetIds.length === 0) { + return []; + } + + return await this.db + .insertInto('shared_link_asset') + .values(assetIds.map((assetId) => ({ assetId, sharedLinkId: id }))) + .onConflict((oc) => oc.doNothing()) + .returning(['shared_link_asset.assetId']) + .execute(); + } + @GenerateSql({ params: [DummyValue.UUID] }) private getSharedLinks(id: string) { return this.db @@ -262,11 +231,7 @@ export class SharedLinkRepository { .selectFrom('asset') .whereRef('asset.id', '=', 'shared_link_asset.assetId') .selectAll('asset') - .innerJoinLateral( - (eb) => - eb.selectFrom('asset_exif').whereRef('asset_exif.assetId', '=', 'asset.id').selectAll().as('exifInfo'), - (join) => join.onTrue(), - ) + .innerJoinLateral(withExifInfo, (join) => join.onTrue()) .as('assets'), (join) => join.onTrue(), ) diff --git a/server/src/repositories/storage.repository.ts b/server/src/repositories/storage.repository.ts index 5a1a936e77..c7ba4ab6cc 100644 --- a/server/src/repositories/storage.repository.ts +++ b/server/src/repositories/storage.repository.ts @@ -63,7 +63,7 @@ export class StorageRepository { } createWriteStream(filepath: string): Writable { - return createWriteStream(filepath, { flags: 'w' }); + return createWriteStream(filepath, { flags: 'w', flush: true }); } createOrOverwriteFile(filepath: string, buffer: Buffer) { diff --git a/server/src/repositories/sync.repository.ts b/server/src/repositories/sync.repository.ts index b2fa144ca4..486bf15163 100644 --- a/server/src/repositories/sync.repository.ts +++ b/server/src/repositories/sync.repository.ts @@ -487,7 +487,6 @@ class AssetFaceSync extends BaseSync { ]) .leftJoin('asset', 'asset.id', 'asset_face.assetId') .where('asset.ownerId', '=', options.userId) - .where('asset_face.isVisible', '=', true) .stream(); } } diff --git a/server/src/schema/enums.ts b/server/src/schema/enums.ts index c68f152779..f63a09c462 100644 --- a/server/src/schema/enums.ts +++ b/server/src/schema/enums.ts @@ -1,5 +1,5 @@ import { registerEnum } from '@immich/sql-tools'; -import { AssetStatus, AssetVisibility, SourceType } from 'src/enum'; +import { AssetStatus, AssetVisibility, ChecksumAlgorithm, SourceType } from 'src/enum'; export const assets_status_enum = registerEnum({ name: 'assets_status_enum', @@ -15,3 +15,8 @@ export const asset_visibility_enum = registerEnum({ name: 'asset_visibility_enum', values: Object.values(AssetVisibility), }); + +export const asset_checksum_algorithm_enum = registerEnum({ + name: 'asset_checksum_algorithm_enum', + values: Object.values(ChecksumAlgorithm), +}); diff --git a/server/src/schema/migrations/1773242919341-EncodedVideoAssetFiles.ts b/server/src/schema/migrations/1773242919341-EncodedVideoAssetFiles.ts new file mode 100644 index 0000000000..4a62a7e842 --- /dev/null +++ b/server/src/schema/migrations/1773242919341-EncodedVideoAssetFiles.ts @@ -0,0 +1,25 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + await sql` + INSERT INTO "asset_file" ("assetId", "type", "path") + SELECT "id", 'encoded_video', "encodedVideoPath" + FROM "asset" + WHERE "encodedVideoPath" IS NOT NULL AND "encodedVideoPath" != ''; + `.execute(db); + + await sql`ALTER TABLE "asset" DROP COLUMN "encodedVideoPath";`.execute(db); +} + +export async function down(db: Kysely): Promise { + await sql`ALTER TABLE "asset" ADD "encodedVideoPath" character varying DEFAULT '';`.execute(db); + + await sql` + UPDATE "asset" + SET "encodedVideoPath" = af."path" + FROM "asset_file" af + WHERE "asset"."id" = af."assetId" + AND af."type" = 'encoded_video' + AND af."isEdited" = false; + `.execute(db); +} diff --git a/server/src/schema/migrations/1773956345315-DuplicateSharedLinkAssets.ts b/server/src/schema/migrations/1773956345315-DuplicateSharedLinkAssets.ts new file mode 100644 index 0000000000..d3a83d53dc --- /dev/null +++ b/server/src/schema/migrations/1773956345315-DuplicateSharedLinkAssets.ts @@ -0,0 +1,13 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + await sql` + DELETE FROM "shared_link_asset" + USING "shared_link" + WHERE "shared_link_asset"."sharedLinkId" = "shared_link"."id" AND "shared_link"."type" = 'ALBUM'; +`.execute(db); +} + +export async function down(): Promise { + // noop +} diff --git a/server/src/schema/migrations/1774393726320-AssetFaceSyncReset.ts b/server/src/schema/migrations/1774393726320-AssetFaceSyncReset.ts new file mode 100644 index 0000000000..8dcd238bc0 --- /dev/null +++ b/server/src/schema/migrations/1774393726320-AssetFaceSyncReset.ts @@ -0,0 +1,10 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + // Sync query for faces was incorrect on server <=2.6.2 + await sql`DELETE FROM session_sync_checkpoint WHERE type in ('AssetFaceV1', 'AssetFaceV2')`.execute(db); +} + +export async function down(): Promise { + // Not implemented +} diff --git a/server/src/schema/migrations/1774548649115-AddChecksumAlgorithm.ts.ts b/server/src/schema/migrations/1774548649115-AddChecksumAlgorithm.ts.ts new file mode 100644 index 0000000000..477e7d0e48 --- /dev/null +++ b/server/src/schema/migrations/1774548649115-AddChecksumAlgorithm.ts.ts @@ -0,0 +1,21 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + await sql`CREATE TYPE "asset_checksum_algorithm_enum" AS ENUM ('sha1','sha1-path');`.execute(db); + await sql`ALTER TABLE "asset" ADD "checksumAlgorithm" asset_checksum_algorithm_enum;`.execute(db); + + await sql` + UPDATE "asset" + SET "checksumAlgorithm" = CASE + WHEN "isExternal" = true THEN 'sha1-path'::asset_checksum_algorithm_enum + ELSE 'sha1'::asset_checksum_algorithm_enum + END + `.execute(db); + + await sql`ALTER TABLE "asset" ALTER COLUMN "checksumAlgorithm" SET NOT NULL;`.execute(db); +} + +export async function down(db: Kysely): Promise { + await sql`ALTER TABLE "asset" DROP COLUMN "checksumAlgorithm";`.execute(db); + await sql`DROP TYPE "asset_checksum_algorithm_enum";`.execute(db); +} diff --git a/server/src/schema/tables/asset.table.ts b/server/src/schema/tables/asset.table.ts index 12e9c36125..7418dab102 100644 --- a/server/src/schema/tables/asset.table.ts +++ b/server/src/schema/tables/asset.table.ts @@ -12,8 +12,8 @@ import { UpdateDateColumn, } from '@immich/sql-tools'; import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators'; -import { AssetStatus, AssetType, AssetVisibility } from 'src/enum'; -import { asset_visibility_enum, assets_status_enum } from 'src/schema/enums'; +import { AssetStatus, AssetType, AssetVisibility, ChecksumAlgorithm } from 'src/enum'; +import { asset_checksum_algorithm_enum, asset_visibility_enum, assets_status_enum } from 'src/schema/enums'; import { asset_delete_audit } from 'src/schema/functions'; import { LibraryTable } from 'src/schema/tables/library.table'; import { StackTable } from 'src/schema/tables/stack.table'; @@ -92,12 +92,12 @@ export class AssetTable { @Column({ type: 'character varying', nullable: true }) duration!: string | null; - @Column({ type: 'character varying', nullable: true, default: '' }) - encodedVideoPath!: string | null; - @Column({ type: 'bytea', index: true }) checksum!: Buffer; // sha1 checksum + @Column({ enum: asset_checksum_algorithm_enum }) + checksumAlgorithm!: ChecksumAlgorithm; + @ForeignKeyColumn(() => AssetTable, { nullable: true, onUpdate: 'CASCADE', onDelete: 'SET NULL' }) livePhotoVideoId!: string | null; diff --git a/server/src/schema/tables/user.table.ts b/server/src/schema/tables/user.table.ts index 3a340d976b..0839924d2a 100644 --- a/server/src/schema/tables/user.table.ts +++ b/server/src/schema/tables/user.table.ts @@ -64,8 +64,9 @@ export class UserTable { @Column({ unique: true, nullable: true, default: null }) storageLabel!: string | null; + // TODO remove default, make nullable, and convert empty spaces to null @Column({ default: '' }) - name!: Generated; + name!: string; @Column({ type: 'bigint', nullable: true }) quotaSizeInBytes!: ColumnType | null; diff --git a/server/src/services/activity.service.spec.ts b/server/src/services/activity.service.spec.ts index d1a9f53a20..03cd0132c1 100644 --- a/server/src/services/activity.service.spec.ts +++ b/server/src/services/activity.service.spec.ts @@ -1,8 +1,10 @@ import { BadRequestException } from '@nestjs/common'; import { ReactionType } from 'src/dtos/activity.dto'; import { ActivityService } from 'src/services/activity.service'; +import { ActivityFactory } from 'test/factories/activity.factory'; +import { AuthFactory } from 'test/factories/auth.factory'; import { getForActivity } from 'test/mappers'; -import { factory, newUuid, newUuids } from 'test/small.factory'; +import { newUuid, newUuids } from 'test/small.factory'; import { newTestService, ServiceMocks } from 'test/utils'; describe(ActivityService.name, () => { @@ -24,7 +26,7 @@ describe(ActivityService.name, () => { mocks.access.album.checkOwnerAccess.mockResolvedValue(new Set([albumId])); mocks.activity.search.mockResolvedValue([]); - await expect(sut.getAll(factory.auth({ user: { id: userId } }), { assetId, albumId })).resolves.toEqual([]); + await expect(sut.getAll(AuthFactory.create({ id: userId }), { assetId, albumId })).resolves.toEqual([]); expect(mocks.activity.search).toHaveBeenCalledWith({ assetId, albumId, isLiked: undefined }); }); @@ -36,7 +38,7 @@ describe(ActivityService.name, () => { mocks.activity.search.mockResolvedValue([]); await expect( - sut.getAll(factory.auth({ user: { id: userId } }), { assetId, albumId, type: ReactionType.LIKE }), + sut.getAll(AuthFactory.create({ id: userId }), { assetId, albumId, type: ReactionType.LIKE }), ).resolves.toEqual([]); expect(mocks.activity.search).toHaveBeenCalledWith({ assetId, albumId, isLiked: true }); @@ -48,7 +50,9 @@ describe(ActivityService.name, () => { mocks.access.album.checkOwnerAccess.mockResolvedValue(new Set([albumId])); mocks.activity.search.mockResolvedValue([]); - await expect(sut.getAll(factory.auth(), { assetId, albumId, type: ReactionType.COMMENT })).resolves.toEqual([]); + await expect(sut.getAll(AuthFactory.create(), { assetId, albumId, type: ReactionType.COMMENT })).resolves.toEqual( + [], + ); expect(mocks.activity.search).toHaveBeenCalledWith({ assetId, albumId, isLiked: false }); }); @@ -61,7 +65,10 @@ describe(ActivityService.name, () => { mocks.activity.getStatistics.mockResolvedValue({ comments: 1, likes: 3 }); mocks.access.album.checkOwnerAccess.mockResolvedValue(new Set([albumId])); - await expect(sut.getStatistics(factory.auth(), { assetId, albumId })).resolves.toEqual({ comments: 1, likes: 3 }); + await expect(sut.getStatistics(AuthFactory.create(), { assetId, albumId })).resolves.toEqual({ + comments: 1, + likes: 3, + }); }); }); @@ -70,18 +77,18 @@ describe(ActivityService.name, () => { const [albumId, assetId] = newUuids(); await expect( - sut.create(factory.auth(), { albumId, assetId, type: ReactionType.COMMENT, comment: 'comment' }), + sut.create(AuthFactory.create(), { albumId, assetId, type: ReactionType.COMMENT, comment: 'comment' }), ).rejects.toBeInstanceOf(BadRequestException); }); it('should create a comment', async () => { const [albumId, assetId, userId] = newUuids(); - const activity = factory.activity({ albumId, assetId, userId }); + const activity = ActivityFactory.create({ albumId, assetId, userId }); mocks.access.activity.checkCreateAccess.mockResolvedValue(new Set([albumId])); mocks.activity.create.mockResolvedValue(getForActivity(activity)); - await sut.create(factory.auth({ user: { id: userId } }), { + await sut.create(AuthFactory.create({ id: userId }), { albumId, assetId, type: ReactionType.COMMENT, @@ -99,38 +106,38 @@ describe(ActivityService.name, () => { it('should fail because activity is disabled for the album', async () => { const [albumId, assetId] = newUuids(); - const activity = factory.activity({ albumId, assetId }); + const activity = ActivityFactory.create({ albumId, assetId }); mocks.access.album.checkOwnerAccess.mockResolvedValue(new Set([albumId])); mocks.activity.create.mockResolvedValue(getForActivity(activity)); await expect( - sut.create(factory.auth(), { albumId, assetId, type: ReactionType.COMMENT, comment: 'comment' }), + sut.create(AuthFactory.create(), { albumId, assetId, type: ReactionType.COMMENT, comment: 'comment' }), ).rejects.toBeInstanceOf(BadRequestException); }); it('should create a like', async () => { const [albumId, assetId, userId] = newUuids(); - const activity = factory.activity({ userId, albumId, assetId, isLiked: true }); + const activity = ActivityFactory.create({ userId, albumId, assetId, isLiked: true }); mocks.access.activity.checkCreateAccess.mockResolvedValue(new Set([albumId])); mocks.activity.create.mockResolvedValue(getForActivity(activity)); mocks.activity.search.mockResolvedValue([]); - await sut.create(factory.auth({ user: { id: userId } }), { albumId, assetId, type: ReactionType.LIKE }); + await sut.create(AuthFactory.create({ id: userId }), { albumId, assetId, type: ReactionType.LIKE }); expect(mocks.activity.create).toHaveBeenCalledWith({ userId: activity.userId, albumId, assetId, isLiked: true }); }); it('should skip if like exists', async () => { const [albumId, assetId] = newUuids(); - const activity = factory.activity({ albumId, assetId, isLiked: true }); + const activity = ActivityFactory.create({ albumId, assetId, isLiked: true }); mocks.access.album.checkOwnerAccess.mockResolvedValue(new Set([albumId])); mocks.access.activity.checkCreateAccess.mockResolvedValue(new Set([albumId])); mocks.activity.search.mockResolvedValue([getForActivity(activity)]); - await sut.create(factory.auth(), { albumId, assetId, type: ReactionType.LIKE }); + await sut.create(AuthFactory.create(), { albumId, assetId, type: ReactionType.LIKE }); expect(mocks.activity.create).not.toHaveBeenCalled(); }); @@ -138,29 +145,29 @@ describe(ActivityService.name, () => { describe('delete', () => { it('should require access', async () => { - await expect(sut.delete(factory.auth(), newUuid())).rejects.toBeInstanceOf(BadRequestException); + await expect(sut.delete(AuthFactory.create(), newUuid())).rejects.toBeInstanceOf(BadRequestException); expect(mocks.activity.delete).not.toHaveBeenCalled(); }); it('should let the activity owner delete a comment', async () => { - const activity = factory.activity(); + const activity = ActivityFactory.create(); mocks.access.activity.checkOwnerAccess.mockResolvedValue(new Set([activity.id])); mocks.activity.delete.mockResolvedValue(); - await sut.delete(factory.auth(), activity.id); + await sut.delete(AuthFactory.create(), activity.id); expect(mocks.activity.delete).toHaveBeenCalledWith(activity.id); }); it('should let the album owner delete a comment', async () => { - const activity = factory.activity(); + const activity = ActivityFactory.create(); mocks.access.activity.checkAlbumOwnerAccess.mockResolvedValue(new Set([activity.id])); mocks.activity.delete.mockResolvedValue(); - await sut.delete(factory.auth(), activity.id); + await sut.delete(AuthFactory.create(), activity.id); expect(mocks.activity.delete).toHaveBeenCalledWith(activity.id); }); diff --git a/server/src/services/album.service.ts b/server/src/services/album.service.ts index 24b9b165c9..547ec63bf8 100644 --- a/server/src/services/album.service.ts +++ b/server/src/services/album.service.ts @@ -165,6 +165,12 @@ export class AlbumService extends BaseService { } async addAssets(auth: AuthDto, id: string, dto: BulkIdsDto): Promise { + if (auth.sharedLink) { + this.logger.deprecate( + 'Assets uploaded to a shared link are automatically added and calling this endpoint is no longer necessary. It will be removed in the next major release.', + ); + } + const album = await this.findOrFail(id, { withAssets: false }); await this.requireAccess({ auth, permission: Permission.AlbumAssetCreate, ids: [id] }); @@ -195,6 +201,12 @@ export class AlbumService extends BaseService { } async addAssetsToAlbums(auth: AuthDto, dto: AlbumsAddAssetsDto): Promise { + if (auth.sharedLink) { + this.logger.deprecate( + 'Assets uploaded to a shared link are automatically added and calling this endpoint is no longer necessary. It will be removed in the next major release.', + ); + } + const results: AlbumsAddAssetsResponseDto = { success: false, error: BulkIdErrorReason.DUPLICATE, diff --git a/server/src/services/api-key.service.spec.ts b/server/src/services/api-key.service.spec.ts index 3a31dbbea1..68165d642f 100644 --- a/server/src/services/api-key.service.spec.ts +++ b/server/src/services/api-key.service.spec.ts @@ -1,7 +1,10 @@ import { BadRequestException, ForbiddenException } from '@nestjs/common'; import { Permission } from 'src/enum'; import { ApiKeyService } from 'src/services/api-key.service'; -import { factory, newUuid } from 'test/small.factory'; +import { ApiKeyFactory } from 'test/factories/api-key.factory'; +import { AuthFactory } from 'test/factories/auth.factory'; +import { SessionFactory } from 'test/factories/session.factory'; +import { newUuid } from 'test/small.factory'; import { newTestService, ServiceMocks } from 'test/utils'; describe(ApiKeyService.name, () => { @@ -14,8 +17,8 @@ describe(ApiKeyService.name, () => { describe('create', () => { it('should create a new key', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id, permissions: [Permission.All] }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id, permissions: [Permission.All] }); const key = 'super-secret'; mocks.crypto.randomBytesAsText.mockReturnValue(key); @@ -34,8 +37,8 @@ describe(ApiKeyService.name, () => { }); it('should not require a name', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id }); const key = 'super-secret'; mocks.crypto.randomBytesAsText.mockReturnValue(key); @@ -54,7 +57,9 @@ describe(ApiKeyService.name, () => { }); it('should throw an error if the api key does not have sufficient permissions', async () => { - const auth = factory.auth({ apiKey: { permissions: [Permission.AssetRead] } }); + const auth = AuthFactory.from() + .apiKey({ permissions: [Permission.AssetRead] }) + .build(); await expect(sut.create(auth, { permissions: [Permission.AssetUpdate] })).rejects.toBeInstanceOf( BadRequestException, @@ -65,7 +70,7 @@ describe(ApiKeyService.name, () => { describe('update', () => { it('should throw an error if the key is not found', async () => { const id = newUuid(); - const auth = factory.auth(); + const auth = AuthFactory.create(); mocks.apiKey.getById.mockResolvedValue(void 0); @@ -77,8 +82,8 @@ describe(ApiKeyService.name, () => { }); it('should update a key', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id }); const newName = 'New name'; mocks.apiKey.getById.mockResolvedValue(apiKey); @@ -93,8 +98,8 @@ describe(ApiKeyService.name, () => { }); it('should update permissions', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id }); const newPermissions = [Permission.ActivityCreate, Permission.ActivityRead, Permission.ActivityUpdate]; mocks.apiKey.getById.mockResolvedValue(apiKey); @@ -111,8 +116,8 @@ describe(ApiKeyService.name, () => { describe('api key auth', () => { it('should prevent adding Permission.all', async () => { const permissions = [Permission.ApiKeyCreate, Permission.ApiKeyUpdate, Permission.AssetRead]; - const auth = factory.auth({ apiKey: { permissions } }); - const apiKey = factory.apiKey({ userId: auth.user.id, permissions }); + const auth = AuthFactory.from().apiKey({ permissions }).build(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id, permissions }); mocks.apiKey.getById.mockResolvedValue(apiKey); @@ -125,8 +130,8 @@ describe(ApiKeyService.name, () => { it('should prevent adding a new permission', async () => { const permissions = [Permission.ApiKeyCreate, Permission.ApiKeyUpdate, Permission.AssetRead]; - const auth = factory.auth({ apiKey: { permissions } }); - const apiKey = factory.apiKey({ userId: auth.user.id, permissions }); + const auth = AuthFactory.from().apiKey({ permissions }).build(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id, permissions }); mocks.apiKey.getById.mockResolvedValue(apiKey); @@ -138,8 +143,10 @@ describe(ApiKeyService.name, () => { }); it('should allow removing permissions', async () => { - const auth = factory.auth({ apiKey: { permissions: [Permission.ApiKeyUpdate, Permission.AssetRead] } }); - const apiKey = factory.apiKey({ + const auth = AuthFactory.from() + .apiKey({ permissions: [Permission.ApiKeyUpdate, Permission.AssetRead] }) + .build(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id, permissions: [Permission.AssetRead, Permission.AssetDelete], }); @@ -158,10 +165,10 @@ describe(ApiKeyService.name, () => { }); it('should allow adding new permissions', async () => { - const auth = factory.auth({ - apiKey: { permissions: [Permission.ApiKeyUpdate, Permission.AssetRead, Permission.AssetUpdate] }, - }); - const apiKey = factory.apiKey({ userId: auth.user.id, permissions: [Permission.AssetRead] }); + const auth = AuthFactory.from() + .apiKey({ permissions: [Permission.ApiKeyUpdate, Permission.AssetRead, Permission.AssetUpdate] }) + .build(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id, permissions: [Permission.AssetRead] }); mocks.apiKey.getById.mockResolvedValue(apiKey); mocks.apiKey.update.mockResolvedValue(apiKey); @@ -183,7 +190,7 @@ describe(ApiKeyService.name, () => { describe('delete', () => { it('should throw an error if the key is not found', async () => { - const auth = factory.auth(); + const auth = AuthFactory.create(); const id = newUuid(); mocks.apiKey.getById.mockResolvedValue(void 0); @@ -194,8 +201,8 @@ describe(ApiKeyService.name, () => { }); it('should delete a key', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id }); mocks.apiKey.getById.mockResolvedValue(apiKey); mocks.apiKey.delete.mockResolvedValue(); @@ -208,8 +215,8 @@ describe(ApiKeyService.name, () => { describe('getMine', () => { it('should not work with a session token', async () => { - const session = factory.session(); - const auth = factory.auth({ session }); + const session = SessionFactory.create(); + const auth = AuthFactory.from().session(session).build(); mocks.apiKey.getById.mockResolvedValue(void 0); @@ -219,8 +226,8 @@ describe(ApiKeyService.name, () => { }); it('should throw an error if the key is not found', async () => { - const apiKey = factory.authApiKey(); - const auth = factory.auth({ apiKey }); + const apiKey = ApiKeyFactory.create(); + const auth = AuthFactory.from().apiKey(apiKey).build(); mocks.apiKey.getById.mockResolvedValue(void 0); @@ -230,8 +237,8 @@ describe(ApiKeyService.name, () => { }); it('should get a key by id', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id }); mocks.apiKey.getById.mockResolvedValue(apiKey); @@ -243,7 +250,7 @@ describe(ApiKeyService.name, () => { describe('getById', () => { it('should throw an error if the key is not found', async () => { - const auth = factory.auth(); + const auth = AuthFactory.create(); const id = newUuid(); mocks.apiKey.getById.mockResolvedValue(void 0); @@ -254,8 +261,8 @@ describe(ApiKeyService.name, () => { }); it('should get a key by id', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id }); mocks.apiKey.getById.mockResolvedValue(apiKey); @@ -267,8 +274,8 @@ describe(ApiKeyService.name, () => { describe('getAll', () => { it('should return all the keys for a user', async () => { - const auth = factory.auth(); - const apiKey = factory.apiKey({ userId: auth.user.id }); + const auth = AuthFactory.create(); + const apiKey = ApiKeyFactory.create({ userId: auth.user.id }); mocks.apiKey.getByUserId.mockResolvedValue([apiKey]); diff --git a/server/src/services/api.service.ts b/server/src/services/api.service.ts index ed1b4095d6..1071c75fc7 100644 --- a/server/src/services/api.service.ts +++ b/server/src/services/api.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, NotAcceptableException } from '@nestjs/common'; import { Interval } from '@nestjs/schedule'; import { NextFunction, Request, Response } from 'express'; import { readFileSync } from 'node:fs'; @@ -72,6 +72,13 @@ export class ApiService { return next(); } + const responseType = request.accepts('text/html'); + if (!responseType) { + throw new NotAcceptableException( + `The route ${request.path} was requested as ${request.header('accept')}, but only returns text/html`, + ); + } + let status = 200; let html = index; @@ -105,7 +112,7 @@ export class ApiService { html = render(index, meta); } - res.status(status).type('text/html').header('Cache-Control', 'no-store').send(html); + res.status(status).type(responseType).header('Cache-Control', 'no-store').send(html); }; } } diff --git a/server/src/services/asset-media.service.spec.ts b/server/src/services/asset-media.service.spec.ts index f49dd3cb50..1bf8bafdf7 100644 --- a/server/src/services/asset-media.service.spec.ts +++ b/server/src/services/asset-media.service.spec.ts @@ -163,7 +163,6 @@ const assetEntity = Object.freeze({ fileCreatedAt: new Date('2022-06-19T23:41:36.910Z'), updatedAt: new Date('2022-06-19T23:41:36.910Z'), isFavorite: false, - encodedVideoPath: '', duration: '0:00:00.000000', files: [] as AssetFile[], exifInfo: { @@ -711,13 +710,18 @@ describe(AssetMediaService.name, () => { }); it('should return the encoded video path if available', async () => { - const asset = AssetFactory.create({ encodedVideoPath: '/path/to/encoded/video.mp4' }); + const asset = AssetFactory.from() + .file({ type: AssetFileType.EncodedVideo, path: '/path/to/encoded/video.mp4' }) + .build(); mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set([asset.id])); - mocks.asset.getForVideo.mockResolvedValue(asset); + mocks.asset.getForVideo.mockResolvedValue({ + originalPath: asset.originalPath, + encodedVideoPath: asset.files[0].path, + }); await expect(sut.playbackVideo(authStub.admin, asset.id)).resolves.toEqual( new ImmichFileResponse({ - path: asset.encodedVideoPath!, + path: '/path/to/encoded/video.mp4', cacheControl: CacheControl.PrivateWithCache, contentType: 'video/mp4', }), @@ -727,7 +731,10 @@ describe(AssetMediaService.name, () => { it('should fall back to the original path', async () => { const asset = AssetFactory.create({ type: AssetType.Video, originalPath: '/original/path.ext' }); mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set([asset.id])); - mocks.asset.getForVideo.mockResolvedValue(asset); + mocks.asset.getForVideo.mockResolvedValue({ + originalPath: asset.originalPath, + encodedVideoPath: null, + }); await expect(sut.playbackVideo(authStub.admin, asset.id)).resolves.toEqual( new ImmichFileResponse({ diff --git a/server/src/services/asset-media.service.ts b/server/src/services/asset-media.service.ts index 020bda4df7..8b8efd19c5 100644 --- a/server/src/services/asset-media.service.ts +++ b/server/src/services/asset-media.service.ts @@ -2,7 +2,7 @@ import { BadRequestException, Injectable, InternalServerErrorException, NotFound import { extname } from 'node:path'; import sanitize from 'sanitize-filename'; import { StorageCore } from 'src/cores/storage.core'; -import { Asset } from 'src/database'; +import { Asset, AuthSharedLink } from 'src/database'; import { AssetBulkUploadCheckResponseDto, AssetMediaResponseDto, @@ -27,6 +27,7 @@ import { AssetStatus, AssetVisibility, CacheControl, + ChecksumAlgorithm, JobName, Permission, StorageFolder, @@ -151,6 +152,10 @@ export class AssetMediaService extends BaseService { } const asset = await this.create(auth.user.id, dto, file, sidecarFile); + if (auth.sharedLink) { + await this.addToSharedLink(auth.sharedLink, asset.id); + } + await this.userRepository.updateUsage(auth.user.id, file.size); return { id: asset.id, status: AssetMediaStatus.CREATED }; @@ -322,6 +327,12 @@ export class AssetMediaService extends BaseService { }; } + private async addToSharedLink(sharedLink: AuthSharedLink, assetId: string) { + await (sharedLink.albumId + ? this.albumRepository.addAssetIds(sharedLink.albumId, [assetId]) + : this.sharedLinkRepository.addAssets(sharedLink.id, [assetId])); + } + private async handleUploadError( error: any, auth: AuthDto, @@ -341,6 +352,12 @@ export class AssetMediaService extends BaseService { this.logger.error(`Error locating duplicate for checksum constraint`); throw new InternalServerErrorException(); } + + if (auth.sharedLink) { + await this.addToSharedLink(auth.sharedLink, duplicateId); + } + + this.logger.debug(`Duplicate asset upload rejected: existing asset ${duplicateId}`); return { status: AssetMediaStatus.DUPLICATE, id: duplicateId }; } @@ -409,6 +426,7 @@ export class AssetMediaService extends BaseService { deviceId: asset.deviceId, type: asset.type, checksum: asset.checksum, + checksumAlgorithm: asset.checksumAlgorithm, fileCreatedAt: asset.fileCreatedAt, localDateTime: asset.localDateTime, fileModifiedAt: asset.fileModifiedAt, @@ -430,6 +448,7 @@ export class AssetMediaService extends BaseService { libraryId: null, checksum: file.checksum, + checksumAlgorithm: ChecksumAlgorithm.sha1File, originalPath: file.originalPath, deviceAssetId: dto.deviceAssetId, diff --git a/server/src/services/asset.service.spec.ts b/server/src/services/asset.service.spec.ts index 7da0452d45..718ec00f1d 100755 --- a/server/src/services/asset.service.spec.ts +++ b/server/src/services/asset.service.spec.ts @@ -7,6 +7,7 @@ import { AssetStats } from 'src/repositories/asset.repository'; import { AssetService } from 'src/services/asset.service'; import { AssetFactory } from 'test/factories/asset.factory'; import { AuthFactory } from 'test/factories/auth.factory'; +import { PartnerFactory } from 'test/factories/partner.factory'; import { authStub } from 'test/fixtures/auth.stub'; import { getForAsset, getForAssetDeletion, getForPartner } from 'test/mappers'; import { factory, newUuid } from 'test/small.factory'; @@ -80,8 +81,8 @@ describe(AssetService.name, () => { }); it('should not include partner assets if not in timeline', async () => { - const partner = factory.partner({ inTimeline: false }); - const auth = factory.auth({ user: { id: partner.sharedWithId } }); + const partner = PartnerFactory.create({ inTimeline: false }); + const auth = AuthFactory.create({ id: partner.sharedWithId }); mocks.asset.getRandom.mockResolvedValue([getForAsset(AssetFactory.create())]); mocks.partner.getAll.mockResolvedValue([getForPartner(partner)]); @@ -92,8 +93,8 @@ describe(AssetService.name, () => { }); it('should include partner assets if in timeline', async () => { - const partner = factory.partner({ inTimeline: true }); - const auth = factory.auth({ user: { id: partner.sharedWithId } }); + const partner = PartnerFactory.create({ inTimeline: true }); + const auth = AuthFactory.create({ id: partner.sharedWithId }); mocks.asset.getRandom.mockResolvedValue([getForAsset(AssetFactory.create())]); mocks.partner.getAll.mockResolvedValue([getForPartner(partner)]); diff --git a/server/src/services/asset.service.ts b/server/src/services/asset.service.ts index 387b700f01..1e5d23a98d 100644 --- a/server/src/services/asset.service.ts +++ b/server/src/services/asset.service.ts @@ -370,7 +370,7 @@ export class AssetService extends BaseService { assetFiles.editedFullsizeFile?.path, assetFiles.editedPreviewFile?.path, assetFiles.editedThumbnailFile?.path, - asset.encodedVideoPath, + assetFiles.encodedVideoFile?.path, ]; if (deleteOnDisk && !asset.isOffline) { diff --git a/server/src/services/auth.service.spec.ts b/server/src/services/auth.service.spec.ts index 81f601da0a..2c4b31c83a 100644 --- a/server/src/services/auth.service.spec.ts +++ b/server/src/services/auth.service.spec.ts @@ -6,36 +6,17 @@ import { AuthDto, SignUpDto } from 'src/dtos/auth.dto'; import { AuthType, Permission } from 'src/enum'; import { AuthService } from 'src/services/auth.service'; import { UserMetadataItem } from 'src/types'; +import { ApiKeyFactory } from 'test/factories/api-key.factory'; +import { AuthFactory } from 'test/factories/auth.factory'; +import { OAuthProfileFactory } from 'test/factories/oauth-profile.factory'; +import { SessionFactory } from 'test/factories/session.factory'; +import { UserFactory } from 'test/factories/user.factory'; import { sharedLinkStub } from 'test/fixtures/shared-link.stub'; import { systemConfigStub } from 'test/fixtures/system-config.stub'; -import { factory, newUuid } from 'test/small.factory'; +import { newUuid } from 'test/small.factory'; import { newTestService, ServiceMocks } from 'test/utils'; -const oauthResponse = ({ - id, - email, - name, - profileImagePath, -}: { - id: string; - email: string; - name: string; - profileImagePath?: string; -}) => ({ - accessToken: 'cmFuZG9tLWJ5dGVz', - userId: id, - userEmail: email, - name, - profileImagePath, - isAdmin: false, - isOnboarded: false, - shouldChangePassword: false, -}); - -// const token = Buffer.from('my-api-key', 'utf8').toString('base64'); - const email = 'test@immich.com'; -const sub = 'my-auth-user-sub'; const loginDetails = { isSecure: true, clientIp: '127.0.0.1', @@ -44,11 +25,9 @@ const loginDetails = { appVersion: null, }; -const fixtures = { - login: { - email, - password: 'password', - }, +const dto = { + email, + password: 'password', }; describe(AuthService.name, () => { @@ -59,7 +38,6 @@ describe(AuthService.name, () => { ({ sut, mocks } = newTestService(AuthService)); mocks.oauth.authorize.mockResolvedValue({ url: 'http://test', state: 'state', codeVerifier: 'codeVerifier' }); - mocks.oauth.getProfile.mockResolvedValue({ sub, email }); mocks.oauth.getLogoutEndpoint.mockResolvedValue('http://end-session-endpoint'); }); @@ -71,13 +49,13 @@ describe(AuthService.name, () => { it('should throw an error if password login is disabled', async () => { mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.disabled); - await expect(sut.login(fixtures.login, loginDetails)).rejects.toBeInstanceOf(UnauthorizedException); + await expect(sut.login(dto, loginDetails)).rejects.toBeInstanceOf(UnauthorizedException); }); it('should check the user exists', async () => { mocks.user.getByEmail.mockResolvedValue(void 0); - await expect(sut.login(fixtures.login, loginDetails)).rejects.toBeInstanceOf(UnauthorizedException); + await expect(sut.login(dto, loginDetails)).rejects.toBeInstanceOf(UnauthorizedException); expect(mocks.user.getByEmail).toHaveBeenCalledTimes(1); }); @@ -85,18 +63,18 @@ describe(AuthService.name, () => { it('should check the user has a password', async () => { mocks.user.getByEmail.mockResolvedValue({} as UserAdmin); - await expect(sut.login(fixtures.login, loginDetails)).rejects.toBeInstanceOf(UnauthorizedException); + await expect(sut.login(dto, loginDetails)).rejects.toBeInstanceOf(UnauthorizedException); expect(mocks.user.getByEmail).toHaveBeenCalledTimes(1); }); it('should successfully log the user in', async () => { - const user = { ...(factory.user() as UserAdmin), password: 'immich_password' }; - const session = factory.session(); + const user = UserFactory.create({ password: 'immich_password' }); + const session = SessionFactory.create(); mocks.user.getByEmail.mockResolvedValue(user); mocks.session.create.mockResolvedValue(session); - await expect(sut.login(fixtures.login, loginDetails)).resolves.toEqual({ + await expect(sut.login(dto, loginDetails)).resolves.toEqual({ accessToken: 'cmFuZG9tLWJ5dGVz', userId: user.id, userEmail: user.email, @@ -113,8 +91,8 @@ describe(AuthService.name, () => { describe('changePassword', () => { it('should change the password', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); const dto = { password: 'old-password', newPassword: 'new-password' }; mocks.user.getForChangePassword.mockResolvedValue({ id: user.id, password: 'hash-password' }); @@ -132,8 +110,8 @@ describe(AuthService.name, () => { }); it('should throw when password does not match existing password', async () => { - const user = factory.user(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); const dto = { password: 'old-password', newPassword: 'new-password' }; mocks.crypto.compareBcrypt.mockReturnValue(false); @@ -144,8 +122,8 @@ describe(AuthService.name, () => { }); it('should throw when user does not have a password', async () => { - const user = factory.user(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); const dto = { password: 'old-password', newPassword: 'new-password' }; mocks.user.getForChangePassword.mockResolvedValue({ id: user.id, password: '' }); @@ -154,8 +132,8 @@ describe(AuthService.name, () => { }); it('should change the password and logout other sessions', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); const dto = { password: 'old-password', newPassword: 'new-password', invalidateSessions: true }; mocks.user.getForChangePassword.mockResolvedValue({ id: user.id, password: 'hash-password' }); @@ -175,7 +153,7 @@ describe(AuthService.name, () => { describe('logout', () => { it('should return the end session endpoint', async () => { - const auth = factory.auth(); + const auth = AuthFactory.create(); mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); @@ -186,7 +164,7 @@ describe(AuthService.name, () => { }); it('should return the default redirect', async () => { - const auth = factory.auth(); + const auth = AuthFactory.create(); await expect(sut.logout(auth, AuthType.Password)).resolves.toEqual({ successful: true, @@ -262,11 +240,11 @@ describe(AuthService.name, () => { }); it('should validate using authorization header', async () => { - const session = factory.session(); + const session = SessionFactory.create(); const sessionWithToken = { id: session.id, updatedAt: session.updatedAt, - user: factory.authUser(), + user: UserFactory.create(), pinExpiresAt: null, appVersion: null, }; @@ -340,7 +318,7 @@ describe(AuthService.name, () => { }); it('should accept a base64url key', async () => { - const user = factory.userAdmin(); + const user = UserFactory.create(); const sharedLink = { ...sharedLinkStub.valid, user } as any; mocks.sharedLink.getByKey.mockResolvedValue(sharedLink); @@ -361,7 +339,7 @@ describe(AuthService.name, () => { }); it('should accept a hex key', async () => { - const user = factory.userAdmin(); + const user = UserFactory.create(); const sharedLink = { ...sharedLinkStub.valid, user } as any; mocks.sharedLink.getByKey.mockResolvedValue(sharedLink); @@ -396,7 +374,7 @@ describe(AuthService.name, () => { }); it('should accept a valid slug', async () => { - const user = factory.userAdmin(); + const user = UserFactory.create(); const sharedLink = { ...sharedLinkStub.valid, slug: 'slug-123', user } as any; mocks.sharedLink.getBySlug.mockResolvedValue(sharedLink); @@ -428,11 +406,11 @@ describe(AuthService.name, () => { }); it('should return an auth dto', async () => { - const session = factory.session(); + const session = SessionFactory.create(); const sessionWithToken = { id: session.id, updatedAt: session.updatedAt, - user: factory.authUser(), + user: UserFactory.create(), pinExpiresAt: null, appVersion: null, }; @@ -455,11 +433,11 @@ describe(AuthService.name, () => { }); it('should throw if admin route and not an admin', async () => { - const session = factory.session(); + const session = SessionFactory.create(); const sessionWithToken = { id: session.id, updatedAt: session.updatedAt, - user: factory.authUser(), + user: UserFactory.create(), isPendingSyncReset: false, pinExpiresAt: null, appVersion: null, @@ -477,11 +455,11 @@ describe(AuthService.name, () => { }); it('should update when access time exceeds an hour', async () => { - const session = factory.session({ updatedAt: DateTime.now().minus({ hours: 2 }).toJSDate() }); + const session = SessionFactory.create({ updatedAt: DateTime.now().minus({ hours: 2 }).toJSDate() }); const sessionWithToken = { id: session.id, updatedAt: session.updatedAt, - user: factory.authUser(), + user: UserFactory.create(), isPendingSyncReset: false, pinExpiresAt: null, appVersion: null, @@ -517,8 +495,8 @@ describe(AuthService.name, () => { }); it('should throw an error if api key has insufficient permissions', async () => { - const authUser = factory.authUser(); - const authApiKey = factory.authApiKey({ permissions: [] }); + const authUser = UserFactory.create(); + const authApiKey = ApiKeyFactory.create({ permissions: [] }); mocks.apiKey.getKey.mockResolvedValue({ ...authApiKey, user: authUser }); @@ -533,8 +511,8 @@ describe(AuthService.name, () => { }); it('should default to requiring the all permission when omitted', async () => { - const authUser = factory.authUser(); - const authApiKey = factory.authApiKey({ permissions: [Permission.AssetRead] }); + const authUser = UserFactory.create(); + const authApiKey = ApiKeyFactory.create({ permissions: [Permission.AssetRead] }); mocks.apiKey.getKey.mockResolvedValue({ ...authApiKey, user: authUser }); @@ -548,10 +526,12 @@ describe(AuthService.name, () => { }); it('should not require any permission when metadata is set to `false`', async () => { - const authUser = factory.authUser(); - const authApiKey = factory.authApiKey({ permissions: [Permission.ActivityRead] }); + const authUser = UserFactory.create(); + const authApiKey = ApiKeyFactory.from({ permissions: [Permission.ActivityRead] }) + .user(authUser) + .build(); - mocks.apiKey.getKey.mockResolvedValue({ ...authApiKey, user: authUser }); + mocks.apiKey.getKey.mockResolvedValue(authApiKey); const result = sut.authenticate({ headers: { 'x-api-key': 'auth_token' }, @@ -562,10 +542,12 @@ describe(AuthService.name, () => { }); it('should return an auth dto', async () => { - const authUser = factory.authUser(); - const authApiKey = factory.authApiKey({ permissions: [Permission.All] }); + const authUser = UserFactory.create(); + const authApiKey = ApiKeyFactory.from({ permissions: [Permission.All] }) + .user(authUser) + .build(); - mocks.apiKey.getKey.mockResolvedValue({ ...authApiKey, user: authUser }); + mocks.apiKey.getKey.mockResolvedValue(authApiKey); await expect( sut.authenticate({ @@ -616,6 +598,7 @@ describe(AuthService.name, () => { it('should not allow auto registering', async () => { mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthEnabled); mocks.user.getByEmail.mockResolvedValue(void 0); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create()); await expect( sut.callback( @@ -629,32 +612,32 @@ describe(AuthService.name, () => { }); it('should link an existing user', async () => { - const user = factory.userAdmin(); + const user = UserFactory.create(); + const profile = OAuthProfileFactory.create(); mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthEnabled); + mocks.oauth.getProfile.mockResolvedValue(profile); mocks.user.getByEmail.mockResolvedValue(user); mocks.user.update.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foobar' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foobar' }, + {}, + loginDetails, + ); expect(mocks.user.getByEmail).toHaveBeenCalledTimes(1); - expect(mocks.user.update).toHaveBeenCalledWith(user.id, { oauthId: sub }); + expect(mocks.user.update).toHaveBeenCalledWith(user.id, { oauthId: profile.sub }); }); it('should not link to a user with a different oauth sub', async () => { - const user = factory.userAdmin({ isAdmin: true, oauthId: 'existing-sub' }); + const user = UserFactory.create({ oauthId: 'existing-sub' }); mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithAutoRegister); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create()); mocks.user.getByEmail.mockResolvedValueOnce(user); - mocks.user.getAdmin.mockResolvedValue(user); - mocks.user.create.mockResolvedValue(user); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); await expect( sut.callback( @@ -669,35 +652,30 @@ describe(AuthService.name, () => { }); it('should allow auto registering by default', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.getAdmin.mockResolvedValue(factory.userAdmin({ isAdmin: true })); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foobar' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foobar' }, + {}, + loginDetails, + ); expect(mocks.user.getByEmail).toHaveBeenCalledTimes(2); // second call is for domain check before create expect(mocks.user.create).toHaveBeenCalledTimes(1); }); it('should throw an error if user should be auto registered but the email claim does not exist', async () => { - const user = factory.userAdmin({ isAdmin: true }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.getAdmin.mockResolvedValue(user); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); - mocks.oauth.getProfile.mockResolvedValue({ sub, email: undefined }); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); + mocks.user.create.mockResolvedValue(UserFactory.create()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); + mocks.oauth.getProfile.mockResolvedValue({ sub: 'sub' }); await expect( sut.callback( @@ -717,11 +695,10 @@ describe(AuthService.name, () => { 'app.immich:///oauth-callback?code=abc123', ]) { it(`should use the mobile redirect override for a url of ${url}`, async () => { - const user = factory.userAdmin(); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithMobileOverride); - mocks.user.getByOAuthId.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.getByOAuthId.mockResolvedValue(UserFactory.create()); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); await sut.callback({ url, state: 'xyz789', codeVerifier: 'foo' }, {}, loginDetails); @@ -735,135 +712,136 @@ describe(AuthService.name, () => { } it('should use the default quota', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithStorageQuota); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.getAdmin.mockResolvedValue(factory.userAdmin({ isAdmin: true })); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create()); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ quotaSizeInBytes: 1_073_741_824 })); }); - it('should ignore an invalid storage quota', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithStorageQuota); - mocks.oauth.getProfile.mockResolvedValue({ sub: user.oauthId, email: user.email, immich_quota: 'abc' }); - mocks.user.getAdmin.mockResolvedValue(factory.userAdmin({ isAdmin: true })); + it('should infer name from given and family names', async () => { + mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); + mocks.oauth.getProfile.mockResolvedValue( + OAuthProfileFactory.create({ name: undefined, given_name: 'Given', family_name: 'Family' }), + ); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); + mocks.user.create.mockResolvedValue(UserFactory.create()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); + + expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ name: 'Given Family' })); + }); + + it('should fallback to email when no username is provided', async () => { + const profile = OAuthProfileFactory.create({ name: undefined, given_name: undefined, family_name: undefined }); + + mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); + mocks.oauth.getProfile.mockResolvedValue(profile); + mocks.user.getByEmail.mockResolvedValue(void 0); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); + mocks.user.create.mockResolvedValue(UserFactory.create()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); + + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); + + expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ name: profile.email })); + }); + + it('should ignore an invalid storage quota', async () => { + mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithStorageQuota); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create({ immich_quota: 'abc' })); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); + mocks.user.getByEmail.mockResolvedValue(void 0); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); + + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ quotaSizeInBytes: 1_073_741_824 })); }); it('should ignore a negative quota', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithStorageQuota); - mocks.oauth.getProfile.mockResolvedValue({ sub: user.oauthId, email: user.email, immich_quota: -5 }); - mocks.user.getAdmin.mockResolvedValue(user); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create({ immich_quota: -5 })); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ quotaSizeInBytes: 1_073_741_824 })); }); it('should set quota for 0 quota', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithStorageQuota); - mocks.oauth.getProfile.mockResolvedValue({ sub: user.oauthId, email: user.email, immich_quota: 0 }); - mocks.user.getAdmin.mockResolvedValue(factory.userAdmin({ isAdmin: true })); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create({ immich_quota: 0 })); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); - expect(mocks.user.create).toHaveBeenCalledWith({ - email: user.email, - isAdmin: false, - name: ' ', - oauthId: user.oauthId, - quotaSizeInBytes: 0, - storageLabel: null, - }); + expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ quotaSizeInBytes: 0 })); }); it('should use a valid storage quota', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithStorageQuota); - mocks.oauth.getProfile.mockResolvedValue({ sub: user.oauthId, email: user.email, immich_quota: 5 }); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create({ immich_quota: 5 })); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.getAdmin.mockResolvedValue(factory.userAdmin({ isAdmin: true })); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); mocks.user.getByOAuthId.mockResolvedValue(void 0); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); - expect(mocks.user.create).toHaveBeenCalledWith({ - email: user.email, - isAdmin: false, - name: ' ', - oauthId: user.oauthId, - quotaSizeInBytes: 5_368_709_120, - storageLabel: null, - }); + expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ quotaSizeInBytes: 5_368_709_120 })); }); it('should sync the profile picture', async () => { const fileId = newUuid(); - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - const pictureUrl = 'https://auth.immich.cloud/profiles/1.jpg'; + const user = UserFactory.create({ oauthId: 'oauth-id' }); + const profile = OAuthProfileFactory.create({ picture: 'https://auth.immich.cloud/profiles/1.jpg' }); mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthEnabled); - mocks.oauth.getProfile.mockResolvedValue({ - sub: user.oauthId, - email: user.email, - picture: pictureUrl, - }); + mocks.oauth.getProfile.mockResolvedValue(profile); mocks.user.getByOAuthId.mockResolvedValue(user); mocks.crypto.randomUUID.mockReturnValue(fileId); mocks.oauth.getProfilePicture.mockResolvedValue({ @@ -871,142 +849,109 @@ describe(AuthService.name, () => { data: new Uint8Array([1, 2, 3, 4, 5]).buffer, }); mocks.user.update.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); expect(mocks.user.update).toHaveBeenCalledWith(user.id, { profileImagePath: expect.stringContaining(`/data/profile/${user.id}/${fileId}.jpg`), profileChangedAt: expect.any(Date), }); - expect(mocks.oauth.getProfilePicture).toHaveBeenCalledWith(pictureUrl); + expect(mocks.oauth.getProfilePicture).toHaveBeenCalledWith(profile.picture); }); it('should not sync the profile picture if the user already has one', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id', profileImagePath: 'not-empty' }); + const user = UserFactory.create({ oauthId: 'oauth-id', profileImagePath: 'not-empty' }); mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthEnabled); - mocks.oauth.getProfile.mockResolvedValue({ - sub: user.oauthId, - email: user.email, - picture: 'https://auth.immich.cloud/profiles/1.jpg', - }); + mocks.oauth.getProfile.mockResolvedValue( + OAuthProfileFactory.create({ + sub: user.oauthId, + email: user.email, + picture: 'https://auth.immich.cloud/profiles/1.jpg', + }), + ); mocks.user.getByOAuthId.mockResolvedValue(user); mocks.user.update.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); expect(mocks.user.update).not.toHaveBeenCalled(); expect(mocks.oauth.getProfilePicture).not.toHaveBeenCalled(); }); it('should only allow "admin" and "user" for the role claim', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithAutoRegister); - mocks.oauth.getProfile.mockResolvedValue({ sub: user.oauthId, email: user.email, immich_role: 'foo' }); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create({ immich_role: 'foo' })); mocks.user.getByEmail.mockResolvedValue(void 0); - mocks.user.getAdmin.mockResolvedValue(factory.userAdmin({ isAdmin: true })); + mocks.user.getAdmin.mockResolvedValue(UserFactory.create({ isAdmin: true })); mocks.user.getByOAuthId.mockResolvedValue(void 0); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); - expect(mocks.user.create).toHaveBeenCalledWith({ - email: user.email, - name: ' ', - oauthId: user.oauthId, - quotaSizeInBytes: null, - storageLabel: null, - isAdmin: false, - }); + expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ isAdmin: false })); }); it('should create an admin user if the role claim is set to admin', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.oauthWithAutoRegister); - mocks.oauth.getProfile.mockResolvedValue({ sub: user.oauthId, email: user.email, immich_role: 'admin' }); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create({ immich_role: 'admin' })); mocks.user.getByEmail.mockResolvedValue(void 0); mocks.user.getByOAuthId.mockResolvedValue(void 0); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); - expect(mocks.user.create).toHaveBeenCalledWith({ - email: user.email, - name: ' ', - oauthId: user.oauthId, - quotaSizeInBytes: null, - storageLabel: null, - isAdmin: true, - }); + expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ isAdmin: true })); }); it('should accept a custom role claim', async () => { - const user = factory.userAdmin({ oauthId: 'oauth-id' }); - mocks.systemMetadata.get.mockResolvedValue({ - oauth: { ...systemConfigStub.oauthWithAutoRegister, roleClaim: 'my_role' }, + oauth: { ...systemConfigStub.oauthWithAutoRegister.oauth, roleClaim: 'my_role' }, }); - mocks.oauth.getProfile.mockResolvedValue({ sub: user.oauthId, email: user.email, my_role: 'admin' }); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create({ my_role: 'admin' })); mocks.user.getByEmail.mockResolvedValue(void 0); mocks.user.getByOAuthId.mockResolvedValue(void 0); - mocks.user.create.mockResolvedValue(user); - mocks.session.create.mockResolvedValue(factory.session()); + mocks.user.create.mockResolvedValue(UserFactory.create({ oauthId: 'oauth-id' })); + mocks.session.create.mockResolvedValue(SessionFactory.create()); - await expect( - sut.callback( - { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, - {}, - loginDetails, - ), - ).resolves.toEqual(oauthResponse(user)); + await sut.callback( + { url: 'http://immich/auth/login?code=abc123', state: 'xyz789', codeVerifier: 'foo' }, + {}, + loginDetails, + ); - expect(mocks.user.create).toHaveBeenCalledWith({ - email: user.email, - name: ' ', - oauthId: user.oauthId, - quotaSizeInBytes: null, - storageLabel: null, - isAdmin: true, - }); + expect(mocks.user.create).toHaveBeenCalledWith(expect.objectContaining({ isAdmin: true })); }); }); describe('link', () => { it('should link an account', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ apiKey: { permissions: [] }, user }); + const user = UserFactory.create(); + const auth = AuthFactory.from(user).apiKey({ permissions: [] }).build(); + const profile = OAuthProfileFactory.create(); mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); + mocks.oauth.getProfile.mockResolvedValue(profile); mocks.user.update.mockResolvedValue(user); await sut.link( @@ -1015,15 +960,16 @@ describe(AuthService.name, () => { {}, ); - expect(mocks.user.update).toHaveBeenCalledWith(auth.user.id, { oauthId: sub }); + expect(mocks.user.update).toHaveBeenCalledWith(auth.user.id, { oauthId: profile.sub }); }); it('should not link an already linked oauth.sub', async () => { - const authUser = factory.authUser(); - const authApiKey = factory.authApiKey({ permissions: [] }); + const authUser = UserFactory.create(); + const authApiKey = ApiKeyFactory.create({ permissions: [] }); const auth = { user: authUser, apiKey: authApiKey }; mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); + mocks.oauth.getProfile.mockResolvedValue(OAuthProfileFactory.create()); mocks.user.getByOAuthId.mockResolvedValue({ id: 'other-user' } as UserAdmin); await expect( @@ -1036,8 +982,8 @@ describe(AuthService.name, () => { describe('unlink', () => { it('should unlink an account', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user, apiKey: { permissions: [] } }); + const user = UserFactory.create(); + const auth = AuthFactory.from(user).apiKey({ permissions: [] }).build(); mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.enabled); mocks.user.update.mockResolvedValue(user); @@ -1050,8 +996,8 @@ describe(AuthService.name, () => { describe('setupPinCode', () => { it('should setup a PIN code', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); const dto = { pinCode: '123456' }; mocks.user.getForPinCode.mockResolvedValue({ pinCode: null, password: '' }); @@ -1065,8 +1011,8 @@ describe(AuthService.name, () => { }); it('should fail if the user already has a PIN code', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); @@ -1076,8 +1022,8 @@ describe(AuthService.name, () => { describe('changePinCode', () => { it('should change the PIN code', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); const dto = { pinCode: '123456', newPinCode: '012345' }; mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); @@ -1091,37 +1037,37 @@ describe(AuthService.name, () => { }); it('should fail if the PIN code does not match', async () => { - const user = factory.userAdmin(); + const user = UserFactory.create(); mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); mocks.crypto.compareBcrypt.mockImplementation((a, b) => `${a} (hashed)` === b); await expect( - sut.changePinCode(factory.auth({ user }), { pinCode: '000000', newPinCode: '012345' }), + sut.changePinCode(AuthFactory.create(user), { pinCode: '000000', newPinCode: '012345' }), ).rejects.toThrow('Wrong PIN code'); }); }); describe('resetPinCode', () => { it('should reset the PIN code', async () => { - const currentSession = factory.session(); - const user = factory.userAdmin(); + const currentSession = SessionFactory.create(); + const user = UserFactory.create(); mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); mocks.crypto.compareBcrypt.mockImplementation((a, b) => `${a} (hashed)` === b); mocks.session.lockAll.mockResolvedValue(void 0); mocks.session.update.mockResolvedValue(currentSession); - await sut.resetPinCode(factory.auth({ user }), { pinCode: '123456' }); + await sut.resetPinCode(AuthFactory.create(user), { pinCode: '123456' }); expect(mocks.user.update).toHaveBeenCalledWith(user.id, { pinCode: null }); expect(mocks.session.lockAll).toHaveBeenCalledWith(user.id); }); it('should throw if the PIN code does not match', async () => { - const user = factory.userAdmin(); + const user = UserFactory.create(); mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); mocks.crypto.compareBcrypt.mockImplementation((a, b) => `${a} (hashed)` === b); - await expect(sut.resetPinCode(factory.auth({ user }), { pinCode: '000000' })).rejects.toThrow('Wrong PIN code'); + await expect(sut.resetPinCode(AuthFactory.create(user), { pinCode: '000000' })).rejects.toThrow('Wrong PIN code'); }); }); }); diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts index b8e1b78107..5932855a21 100644 --- a/server/src/services/auth.service.ts +++ b/server/src/services/auth.service.ts @@ -261,6 +261,11 @@ export class AuthService extends BaseService { } async callback(dto: OAuthCallbackDto, headers: IncomingHttpHeaders, loginDetails: LoginDetails) { + const { oauth } = await this.getConfig({ withCache: false }); + if (!oauth.enabled) { + throw new BadRequestException('OAuth is not enabled'); + } + const expectedState = dto.state ?? this.getCookieOauthState(headers); if (!expectedState?.length) { throw new BadRequestException('OAuth state is missing'); @@ -271,7 +276,6 @@ export class AuthService extends BaseService { throw new BadRequestException('OAuth code verifier is missing'); } - const { oauth } = await this.getConfig({ withCache: false }); const url = this.resolveRedirectUri(oauth, dto.url); const profile = await this.oauthRepository.getProfile(oauth, url, expectedState, codeVerifier); const { autoRegister, defaultStorageQuota, storageLabelClaim, storageQuotaClaim, roleClaim } = oauth; @@ -298,7 +302,8 @@ export class AuthService extends BaseService { throw new BadRequestException(`User does not exist and auto registering is disabled.`); } - if (!profile.email) { + const email = profile.email; + if (!email) { throw new BadRequestException('OAuth profile does not have an email address'); } @@ -320,10 +325,13 @@ export class AuthService extends BaseService { isValid: (value: unknown) => isString(value) && ['admin', 'user'].includes(value), }); - const userName = profile.name ?? `${profile.given_name || ''} ${profile.family_name || ''}`; user = await this.createUser({ - name: userName, - email: profile.email, + name: + profile.name || + `${profile.given_name || ''} ${profile.family_name || ''}`.trim() || + profile.preferred_username || + email, + email, oauthId: profile.sub, quotaSizeInBytes: storageQuota === null ? null : storageQuota * HumanReadableSize.GiB, storageLabel: storageLabel || null, diff --git a/server/src/services/cli.service.spec.ts b/server/src/services/cli.service.spec.ts index 36a3d2eb2c..347d9eef00 100644 --- a/server/src/services/cli.service.spec.ts +++ b/server/src/services/cli.service.spec.ts @@ -1,7 +1,7 @@ import { jwtVerify } from 'jose'; import { MaintenanceAction, SystemMetadataKey } from 'src/enum'; import { CliService } from 'src/services/cli.service'; -import { factory } from 'test/small.factory'; +import { UserFactory } from 'test/factories/user.factory'; import { newTestService, ServiceMocks } from 'test/utils'; import { describe, it } from 'vitest'; @@ -15,7 +15,7 @@ describe(CliService.name, () => { describe('listUsers', () => { it('should list users', async () => { - mocks.user.getList.mockResolvedValue([factory.userAdmin({ isAdmin: true })]); + mocks.user.getList.mockResolvedValue([UserFactory.create({ isAdmin: true })]); await expect(sut.listUsers()).resolves.toEqual([expect.objectContaining({ isAdmin: true })]); expect(mocks.user.getList).toHaveBeenCalledWith({ withDeleted: true }); }); @@ -32,10 +32,10 @@ describe(CliService.name, () => { }); it('should default to a random password', async () => { - const admin = factory.userAdmin({ isAdmin: true }); + const admin = UserFactory.create({ isAdmin: true }); mocks.user.getAdmin.mockResolvedValue(admin); - mocks.user.update.mockResolvedValue(factory.userAdmin({ isAdmin: true })); + mocks.user.update.mockResolvedValue(UserFactory.create({ isAdmin: true })); const ask = vitest.fn().mockImplementation(() => {}); @@ -50,7 +50,7 @@ describe(CliService.name, () => { }); it('should use the supplied password', async () => { - const admin = factory.userAdmin({ isAdmin: true }); + const admin = UserFactory.create({ isAdmin: true }); mocks.user.getAdmin.mockResolvedValue(admin); mocks.user.update.mockResolvedValue(admin); diff --git a/server/src/services/database-backup.service.spec.ts b/server/src/services/database-backup.service.spec.ts index 429e60aede..37964e7b6f 100644 --- a/server/src/services/database-backup.service.spec.ts +++ b/server/src/services/database-backup.service.spec.ts @@ -27,6 +27,7 @@ describe(DatabaseBackupService.name, () => { mocks.systemMetadata as never, mocks.process, mocks.database as never, + mocks.user as never, mocks.cron as never, mocks.job as never, maintenanceHealthRepositoryMock as never, @@ -187,6 +188,7 @@ describe(DatabaseBackupService.name, () => { mocks.systemMetadata as never, mocks.process, mocks.database as never, + mocks.user as never, mocks.cron as never, mocks.job as never, void 0 as never, @@ -400,6 +402,7 @@ describe(DatabaseBackupService.name, () => { mocks.systemMetadata as never, mocks.process, mocks.database as never, + mocks.user as never, mocks.cron as never, mocks.job as never, void 0 as never, @@ -474,6 +477,7 @@ describe(DatabaseBackupService.name, () => { mocks.systemMetadata as never, mocks.process, mocks.database as never, + mocks.user as never, mocks.cron as never, mocks.job as never, void 0 as never, @@ -536,6 +540,7 @@ describe(DatabaseBackupService.name, () => { mocks.systemMetadata as never, mocks.process, mocks.database as never, + mocks.user as never, mocks.cron as never, mocks.job as never, void 0 as never, @@ -663,6 +668,7 @@ describe(DatabaseBackupService.name, () => { mocks.systemMetadata as never, mocks.process, mocks.database as never, + mocks.user as never, mocks.cron as never, mocks.job as never, maintenanceHealthRepositoryMock, @@ -678,6 +684,8 @@ describe(DatabaseBackupService.name, () => { it('should successfully restore a backup', async () => { let writtenToPsql = ''; + mocks.user.hasAdmin.mockResolvedValue(true); + mocks.process.spawnDuplexStream.mockImplementationOnce(() => mockDuplex()('command', 0, 'data', '')); mocks.process.spawnDuplexStream.mockImplementationOnce(() => mockDuplex()('command', 0, 'data', '')); mocks.process.spawnDuplexStream.mockImplementationOnce(() => { @@ -740,6 +748,8 @@ describe(DatabaseBackupService.name, () => { it('should generate pg_dumpall specific SQL instructions', async () => { let writtenToPsql = ''; + mocks.user.hasAdmin.mockResolvedValue(true); + mocks.process.spawnDuplexStream.mockImplementationOnce(() => mockDuplex()('command', 0, 'data', '')); mocks.process.spawnDuplexStream.mockImplementationOnce(() => mockDuplex()('command', 0, 'data', '')); mocks.process.spawnDuplexStream.mockImplementationOnce(() => { @@ -834,7 +844,24 @@ describe(DatabaseBackupService.name, () => { expect(mocks.process.spawnDuplexStream).toHaveBeenCalledTimes(4); }); + it('should rollback if there is no admin user', async () => { + mocks.user.hasAdmin.mockResolvedValue(false); + + const progress = vitest.fn(); + await expect( + sut.restoreDatabaseBackup('development-filename.sql', progress), + ).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Server health check failed, no admin exists.]`); + + expect(progress).toHaveBeenCalledWith('backup', 0.05); + expect(progress).toHaveBeenCalledWith('migrations', 0.9); + expect(progress).toHaveBeenCalledWith('rollback', 0); + + expect(mocks.user.hasAdmin).toHaveBeenCalled(); + expect(mocks.process.spawnDuplexStream).toHaveBeenCalledTimes(4); + }); + it('should rollback if API healthcheck fails', async () => { + mocks.user.hasAdmin.mockResolvedValue(true); maintenanceHealthRepositoryMock.checkApiHealth.mockRejectedValue(new Error('Health Error')); const progress = vitest.fn(); @@ -846,6 +873,7 @@ describe(DatabaseBackupService.name, () => { expect(progress).toHaveBeenCalledWith('migrations', 0.9); expect(progress).toHaveBeenCalledWith('rollback', 0); + expect(mocks.user.hasAdmin).toHaveBeenCalled(); expect(maintenanceHealthRepositoryMock.checkApiHealth).toHaveBeenCalled(); expect(mocks.process.spawnDuplexStream).toHaveBeenCalledTimes(4); }); diff --git a/server/src/services/database-backup.service.ts b/server/src/services/database-backup.service.ts index 3c964c950c..666ddcff0a 100644 --- a/server/src/services/database-backup.service.ts +++ b/server/src/services/database-backup.service.ts @@ -20,6 +20,7 @@ import { LoggingRepository } from 'src/repositories/logging.repository'; import { ProcessRepository } from 'src/repositories/process.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository'; +import { UserRepository } from 'src/repositories/user.repository'; import { getConfig } from 'src/utils/config'; import { findDatabaseBackupVersion, @@ -40,6 +41,7 @@ export class DatabaseBackupService { private readonly systemMetadataRepository: SystemMetadataRepository, private readonly processRepository: ProcessRepository, private readonly databaseRepository: DatabaseRepository, + private readonly userRepository: UserRepository, @Optional() private readonly cronRepository: CronRepository, @Optional() @@ -405,7 +407,14 @@ export class DatabaseBackupService { try { progressCb?.('migrations', 0.9); + await this.databaseRepository.runMigrations(); + + const hasAdmin = await this.userRepository.hasAdmin(); + if (!hasAdmin) { + throw new Error('Server health check failed, no admin exists.'); + } + await this.maintenanceHealthRepository.checkApiHealth(); } catch (error) { progressCb?.('rollback', 0); diff --git a/server/src/services/duplicate.service.spec.ts b/server/src/services/duplicate.service.spec.ts index 38c6833105..564cffa0bc 100644 --- a/server/src/services/duplicate.service.spec.ts +++ b/server/src/services/duplicate.service.spec.ts @@ -1,12 +1,13 @@ +import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto'; +import { MapAsset } from 'src/dtos/asset-response.dto'; import { AssetType, AssetVisibility, JobName, JobStatus } from 'src/enum'; import { DuplicateService } from 'src/services/duplicate.service'; -import { SearchService } from 'src/services/search.service'; import { AssetFactory } from 'test/factories/asset.factory'; import { authStub } from 'test/fixtures/auth.stub'; import { getForDuplicate } from 'test/mappers'; import { newUuid } from 'test/small.factory'; import { makeStream, newTestService, ServiceMocks } from 'test/utils'; -import { beforeEach, vitest } from 'vitest'; +import { beforeEach, describe, expect, it, vitest } from 'vitest'; vitest.useFakeTimers(); @@ -26,7 +27,7 @@ const hasDupe = { duplicateId: 'duplicate-id', }; -describe(SearchService.name, () => { +describe(DuplicateService.name, () => { let sut: DuplicateService; let mocks: ServiceMocks; @@ -41,6 +42,8 @@ describe(SearchService.name, () => { describe('getDuplicates', () => { it('should get duplicates', async () => { const asset = AssetFactory.from().exif().build(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['duplicate-id'])); + mocks.duplicateRepository.cleanupSingletonGroups.mockResolvedValue(); mocks.duplicateRepository.getAll.mockResolvedValue([ { duplicateId: 'duplicate-id', @@ -51,9 +54,24 @@ describe(SearchService.name, () => { { duplicateId: 'duplicate-id', assets: [expect.objectContaining({ id: asset.id }), expect.objectContaining({ id: asset.id })], + suggestedKeepAssetIds: [asset.id], }, ]); }); + + it('should return suggestedKeepAssetIds based on file size', async () => { + const smallAsset = AssetFactory.from().exif({ fileSizeInByte: 1000 }).build(); + const largeAsset = AssetFactory.from().exif({ fileSizeInByte: 5000 }).build(); + mocks.duplicateRepository.cleanupSingletonGroups.mockResolvedValue(); + mocks.duplicateRepository.getAll.mockResolvedValue([ + { + duplicateId: 'duplicate-id', + assets: [getForDuplicate(smallAsset), getForDuplicate(largeAsset)], + }, + ]); + const result = await sut.getDuplicates(authStub.admin); + expect(result[0].suggestedKeepAssetIds).toEqual([largeAsset.id]); + }); }); describe('handleQueueSearchDuplicates', () => { @@ -131,6 +149,200 @@ describe(SearchService.name, () => { }); }); + describe('resolve', () => { + it('should handle mixed success and failure', async () => { + const asset = AssetFactory.create(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1', 'group-2'])); + mocks.duplicateRepository.get.mockResolvedValueOnce(void 0); + mocks.duplicateRepository.get.mockResolvedValueOnce({ + duplicateId: 'group-2', + assets: [asset as unknown as MapAsset], + }); + + await expect( + sut.resolve(authStub.admin, { + groups: [ + { duplicateId: 'group-1', keepAssetIds: [], trashAssetIds: [] }, + { duplicateId: 'group-2', keepAssetIds: [asset.id], trashAssetIds: [] }, + ], + }), + ).resolves.toEqual([ + { id: 'group-1', success: false, error: BulkIdErrorReason.NOT_FOUND }, + { id: 'group-2', success: true }, + ]); + }); + + it('should catch and report errors', async () => { + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1'])); + mocks.duplicateRepository.get.mockRejectedValue(new Error('Database error')); + + await expect( + sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'group-1', keepAssetIds: [], trashAssetIds: [] }], + }), + ).resolves.toEqual([{ id: 'group-1', success: false, error: BulkIdErrorReason.UNKNOWN }]); + }); + }); + + describe('resolveGroup (via resolve)', () => { + it('should fail if duplicate group not found', async () => { + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['missing-id'])); + mocks.duplicateRepository.get.mockResolvedValue(void 0); + + await expect( + sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'missing-id', keepAssetIds: [], trashAssetIds: [] }], + }), + ).resolves.toEqual([ + { + id: 'missing-id', + success: false, + error: BulkIdErrorReason.NOT_FOUND, + }, + ]); + }); + + it('should skip when keepAssetIds contains non-member', async () => { + const asset = AssetFactory.create(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1'])); + mocks.duplicateRepository.get.mockResolvedValue({ + duplicateId: 'group-1', + assets: [asset as unknown as MapAsset], + }); + + await expect( + sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'group-1', keepAssetIds: ['asset-999', asset.id], trashAssetIds: [] }], + }), + ).resolves.toEqual([{ id: 'group-1', success: true }]); + }); + + it('should skip when trashAssetIds contains non-member', async () => { + const asset = AssetFactory.create(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1'])); + mocks.duplicateRepository.get.mockResolvedValue({ + duplicateId: 'group-1', + assets: [asset as unknown as MapAsset], + }); + + await expect( + sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'group-1', keepAssetIds: [asset.id], trashAssetIds: ['asset-999'] }], + }), + ).resolves.toEqual([{ id: 'group-1', success: true }]); + }); + + it('should fail if keepAssetIds and trashAssetIds overlap', async () => { + const asset1 = AssetFactory.create(); + const asset2 = AssetFactory.create(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1'])); + mocks.duplicateRepository.get.mockResolvedValue({ + duplicateId: 'group-1', + assets: [asset1 as unknown as MapAsset, asset2 as unknown as MapAsset], + }); + + const result = await sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'group-1', keepAssetIds: [asset1.id], trashAssetIds: [asset1.id] }], + }); + + expect(result[0].success).toBe(false); + expect(result[0].errorMessage).toContain('An asset cannot be in both keepAssetIds and trashAssetIds'); + }); + + it('should fail if keepAssetIds and trashAssetIds do not cover all assets', async () => { + const asset1 = AssetFactory.create(); + const asset2 = AssetFactory.create(); + const asset3 = AssetFactory.create(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1'])); + mocks.duplicateRepository.get.mockResolvedValue({ + duplicateId: 'group-1', + assets: [asset1 as unknown as MapAsset, asset2 as unknown as MapAsset, asset3 as unknown as MapAsset], + }); + + const result = await sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'group-1', keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(result[0].success).toBe(false); + expect(result[0].errorMessage).toContain('Every asset must be in either keepAssetIds or trashAssetIds'); + }); + + it('should fail if partial trash without keepers', async () => { + const asset1 = AssetFactory.create(); + const asset2 = AssetFactory.create(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1'])); + mocks.duplicateRepository.get.mockResolvedValue({ + duplicateId: 'group-1', + assets: [asset1 as unknown as MapAsset, asset2 as unknown as MapAsset], + }); + + const result = await sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'group-1', keepAssetIds: [], trashAssetIds: [asset1.id] }], + }); + + expect(result[0].success).toBe(false); + expect(result[0].errorMessage).toContain('Every asset must be in either keepAssetIds or trashAssetIds'); + }); + + it('should sync merged tags to asset_exif.tags', async () => { + const asset1 = AssetFactory.create(); + const asset2 = AssetFactory.create(); + mocks.access.duplicate.checkOwnerAccess.mockResolvedValue(new Set(['group-1'])); + mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set(['asset-2'])); + mocks.access.tag.checkOwnerAccess.mockResolvedValue(new Set(['tag-1', 'tag-2'])); + mocks.duplicateRepository.get.mockResolvedValue({ + duplicateId: 'group-1', + assets: [ + { + ...asset1, + tags: [ + { + id: 'tag-1', + value: 'Work', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + parentId: null, + color: null, + }, + ], + }, + { + ...asset2, + tags: [ + { + id: 'tag-2', + value: 'Travel', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + parentId: null, + color: null, + }, + ], + }, + ] as any, + }); + + const result = await sut.resolve(authStub.admin, { + groups: [{ duplicateId: 'group-1', keepAssetIds: [asset1.id], trashAssetIds: [asset2.id] }], + }); + + expect(result[0].success).toBe(true); + + // Verify tags were applied to tag_asset table + expect(mocks.tag.replaceAssetTags).toHaveBeenCalledWith(asset1.id, ['tag-1', 'tag-2']); + + // Verify merged tag values were written to asset_exif.tags so SidecarWrite preserves them + expect(mocks.asset.updateAllExif).toHaveBeenCalledWith([asset1.id], { tags: ['Work', 'Travel'] }); + + // Verify SidecarWrite was queued (to write tags to sidecar) + expect(mocks.job.queueAll).toHaveBeenCalledWith([{ name: JobName.SidecarWrite, data: { id: asset1.id } }]); + }); + + // NOTE: The following integration-style tests are covered by E2E tests instead + // to avoid complex mock setup. The validation and error-handling logic above + // is thoroughly unit tested. + }); + describe('handleSearchDuplicates', () => { beforeEach(() => { mocks.systemMetadata.get.mockResolvedValue({ diff --git a/server/src/services/duplicate.service.ts b/server/src/services/duplicate.service.ts index 618754ff74..39123e031c 100644 --- a/server/src/services/duplicate.service.ts +++ b/server/src/services/duplicate.service.ts @@ -1,24 +1,84 @@ import { Injectable } from '@nestjs/common'; import { JOBS_ASSET_PAGINATION_SIZE } from 'src/constants'; import { OnJob } from 'src/decorators'; -import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto'; -import { mapAsset } from 'src/dtos/asset-response.dto'; +import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto'; +import { MapAsset, mapAsset } from 'src/dtos/asset-response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; -import { DuplicateResponseDto } from 'src/dtos/duplicate.dto'; -import { AssetVisibility, JobName, JobStatus, QueueName } from 'src/enum'; +import { DuplicateResolveDto, DuplicateResolveGroupDto, DuplicateResponseDto } from 'src/dtos/duplicate.dto'; +import { AssetStatus, AssetVisibility, JobName, JobStatus, Permission, QueueName } from 'src/enum'; import { AssetDuplicateResult } from 'src/repositories/search.repository'; import { BaseService } from 'src/services/base.service'; import { JobItem, JobOf } from 'src/types'; +import { suggestDuplicateKeepAssetIds } from 'src/utils/duplicate'; import { isDuplicateDetectionEnabled } from 'src/utils/misc'; +type ResolveRequest = { + assetUpdate: { + isFavorite?: boolean; + visibility?: AssetVisibility; + }; + + exifUpdate: { + rating?: number; + latitude?: number; + longitude?: number; + description?: string; + }; + + mergedAlbumIds: string[]; + + mergedTagIds: string[]; + + mergedTagValues: string[]; +}; + +const uniqueNonEmptyLines = (values: Array): string[] => { + const unique = new Set(); + const lines: string[] = []; + for (const value of values) { + if (!value) { + continue; + } + for (const line of value.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || unique.has(trimmed)) { + continue; + } + unique.add(trimmed); + lines.push(trimmed); + } + } + return lines; +}; + +const getUniqueCoordinate = (assets: MapAsset[], key: 'latitude' | 'longitude'): number | null => { + const values = assets + .map((asset) => asset.exifInfo?.[key]) + .filter((value): value is number => Number.isFinite(value)); + + if (values.length === 0) { + return null; + } + + const unique = new Set(values); + return unique.size === 1 ? [...unique][0] : null; +}; + @Injectable() export class DuplicateService extends BaseService { async getDuplicates(auth: AuthDto): Promise { + // Clean up singleton groups (assets that are the only member of their duplicate group) + await this.duplicateRepository.cleanupSingletonGroups(auth.user.id); + const duplicates = await this.duplicateRepository.getAll(auth.user.id); - return duplicates.map(({ duplicateId, assets }) => ({ - duplicateId, - assets: assets.map((asset) => mapAsset(asset, { auth })), - })); + return duplicates.map(({ duplicateId, assets }) => { + const mappedAssets = assets.map((asset) => mapAsset(asset, { auth })); + return { + duplicateId, + assets: mappedAssets, + suggestedKeepAssetIds: suggestDuplicateKeepAssetIds(mappedAssets), + }; + }); } async delete(auth: AuthDto, id: string): Promise { @@ -29,6 +89,213 @@ export class DuplicateService extends BaseService { await this.duplicateRepository.deleteAll(auth.user.id, dto.ids); } + async resolve(auth: AuthDto, dto: DuplicateResolveDto) { + const duplicateIds = dto.groups.map(({ duplicateId }) => duplicateId); + + await this.requireAccess({ auth, permission: Permission.DuplicateDelete, ids: duplicateIds }); + + const results: BulkIdResponseDto[] = []; + + for (const group of dto.groups) { + try { + results.push(await this.resolveGroup(auth, group)); + } catch (error: Error | any) { + this.logger.error(`Error resolving duplicate group ${group.duplicateId}: ${error}`, error?.stack); + results.push({ id: group.duplicateId, success: false, error: BulkIdErrorReason.UNKNOWN }); + } + } + + return results; + } + + private async resolveGroup(auth: AuthDto, group: DuplicateResolveGroupDto): Promise { + const { duplicateId, keepAssetIds, trashAssetIds } = group; + + const duplicateGroup = await this.duplicateRepository.get(duplicateId); + if (!duplicateGroup) { + return { id: duplicateId, success: false, error: BulkIdErrorReason.NOT_FOUND }; + } + + const groupAssetIds = new Set(duplicateGroup.assets.map((a) => a.id)); + + // ignore/skip asset IDs not in the group + const idsToKeep = keepAssetIds.filter((id) => groupAssetIds.has(id)); + const idsToTrash = trashAssetIds.filter((id) => groupAssetIds.has(id)); + + for (const assetId of groupAssetIds) { + if (idsToKeep.includes(assetId) && idsToTrash.includes(assetId)) { + return { + id: duplicateId, + success: false, + error: BulkIdErrorReason.VALIDATION, + errorMessage: 'An asset cannot be in both keepAssetIds and trashAssetIds', + }; + } + + if (!idsToKeep.includes(assetId) && !idsToTrash.includes(assetId)) { + return { + id: duplicateId, + success: false, + error: BulkIdErrorReason.VALIDATION, + errorMessage: 'Every asset must be in either keepAssetIds or trashAssetIds', + }; + } + } + + if (idsToTrash.length > 0) { + const ids = await this.checkAccess({ auth, permission: Permission.AssetDelete, ids: idsToTrash }); + if (ids.size !== idsToTrash.length) { + return { + id: duplicateId, + success: false, + error: BulkIdErrorReason.NO_PERMISSION, + errorMessage: 'No permission to delete assets', + }; + } + } + + const assetAlbumMap = await this.albumRepository.getByAssetIds(auth.user.id, [...groupAssetIds]); + + const { assetUpdate, exifUpdate, mergedAlbumIds, mergedTagIds, mergedTagValues } = this.getSyncMergeResult( + duplicateGroup.assets, + assetAlbumMap, + ); + + if (mergedAlbumIds.length > 0) { + const allowedAlbumIds = await this.checkAccess({ + auth, + permission: Permission.AlbumAssetCreate, + ids: mergedAlbumIds, + }); + + const allowedShareIds = await this.checkAccess({ + auth, + permission: Permission.AssetShare, + ids: idsToKeep, + }); + + if (allowedAlbumIds.size > 0 && allowedShareIds.size > 0) { + await this.albumRepository.addAssetIdsToAlbums( + [...allowedAlbumIds].flatMap((albumId) => [...allowedShareIds].map((assetId) => ({ albumId, assetId }))), + ); + } + } + + if (mergedTagIds.length > 0) { + const allowedTagIds = await this.checkAccess({ + auth, + permission: Permission.TagAsset, + ids: mergedTagIds, + }); + + if (allowedTagIds.size > 0) { + // Replace tags for each keeper asset to ensure all merged tags are applied + await Promise.all(idsToKeep.map((assetId) => this.tagRepository.replaceAssetTags(assetId, [...allowedTagIds]))); + + // Update asset_exif.tags so the subsequent SidecarWrite + MetadataExtraction + // cycle preserves the merged tags (updateAllExif locks the property automatically) + await this.assetRepository.updateAllExif(idsToKeep, { tags: mergedTagValues }); + } + } + + if (idsToKeep.length > 0) { + const hasExifUpdate = Object.keys(exifUpdate).length > 0; + const hasTagUpdate = mergedTagIds.length > 0; + + if (hasExifUpdate) { + await this.assetRepository.updateAllExif(idsToKeep, exifUpdate); + } + + if (hasExifUpdate || hasTagUpdate) { + await this.jobRepository.queueAll(idsToKeep.map((id) => ({ name: JobName.SidecarWrite, data: { id } }))); + } + + await this.assetRepository.updateAll(idsToKeep, { duplicateId: null, ...assetUpdate }); + } + + if (idsToTrash.length > 0) { + // TODO: this is duplicated with AssetService.deleteAssets + const { trash } = await this.getConfig({ withCache: true }); + const force = !trash.enabled; + + await this.assetRepository.updateAll(idsToTrash, { + deletedAt: new Date(), + status: force ? AssetStatus.Deleted : AssetStatus.Trashed, + duplicateId: null, + }); + + await this.eventRepository.emit(force ? 'AssetDeleteAll' : 'AssetTrashAll', { + assetIds: idsToTrash, + userId: auth.user.id, + }); + } + + return { id: duplicateId, success: true }; + } + + private getSyncMergeResult(assets: MapAsset[], assetAlbumMap: Map = new Map()): ResolveRequest { + const response: ResolveRequest = { + mergedAlbumIds: [], + mergedTagIds: [], + mergedTagValues: [], + assetUpdate: {}, + exifUpdate: {}, + }; + + response.assetUpdate.isFavorite = assets.some((asset) => asset.isFavorite); + + const visibilityOrder = [AssetVisibility.Locked, AssetVisibility.Archive, AssetVisibility.Timeline]; + let visibility = visibilityOrder.find((level) => assets.some((asset) => asset.visibility === level)); + if (!visibility && assets.some((asset) => asset.visibility === AssetVisibility.Hidden)) { + visibility = AssetVisibility.Hidden; + } + if (visibility) { + response.assetUpdate.visibility = visibility; + } + + let rating = 0; + for (const asset of assets) { + const assetRating = asset.exifInfo?.rating ?? 0; + if (assetRating > rating) { + rating = assetRating; + } + } + if (rating > 0) { + response.exifUpdate.rating = rating; + } + + const descriptionLines = uniqueNonEmptyLines(assets.map((asset) => asset.exifInfo?.description)); + const description = descriptionLines.length > 0 ? descriptionLines.join('\n') : null; + if (description !== null) { + response.exifUpdate.description = description; + } + + const latitude = getUniqueCoordinate(assets, 'latitude'); + const longitude = getUniqueCoordinate(assets, 'longitude'); + if (latitude !== null && longitude !== null) { + response.exifUpdate.latitude = latitude; + response.exifUpdate.longitude = longitude; + } + + const albumIdSet = new Set(); + for (const [, albumIds] of assetAlbumMap) { + for (const albumId of albumIds) { + albumIdSet.add(albumId); + } + } + response.mergedAlbumIds = [...albumIdSet]; + + const allTags = assets.flatMap((asset) => asset.tags ?? []); + const tagIds = [...new Set(allTags.map((tag) => tag.id).filter((id): id is string => !!id))]; + const tagValues = [...new Set(allTags.map((tag) => tag.value).filter((v): v is string => !!v))]; + if (tagIds.length > 0) { + response.mergedTagIds = tagIds; + response.mergedTagValues = tagValues; + } + + return response; + } + @OnJob({ name: JobName.AssetDetectDuplicatesQueueAll, queue: QueueName.DuplicateDetection }) async handleQueueSearchDuplicates({ force }: JobOf): Promise { const { machineLearning } = await this.getConfig({ withCache: false }); diff --git a/server/src/services/library.service.ts b/server/src/services/library.service.ts index 841fa4743c..9f2d69bab5 100644 --- a/server/src/services/library.service.ts +++ b/server/src/services/library.service.ts @@ -17,7 +17,17 @@ import { ValidateLibraryImportPathResponseDto, ValidateLibraryResponseDto, } from 'src/dtos/library.dto'; -import { AssetStatus, AssetType, CronJob, DatabaseLock, ImmichWorker, JobName, JobStatus, QueueName } from 'src/enum'; +import { + AssetStatus, + AssetType, + ChecksumAlgorithm, + CronJob, + DatabaseLock, + ImmichWorker, + JobName, + JobStatus, + QueueName, +} from 'src/enum'; import { ArgOf } from 'src/repositories/event.repository'; import { AssetSyncResult } from 'src/repositories/library.repository'; import { AssetTable } from 'src/schema/tables/asset.table'; @@ -400,6 +410,7 @@ export class LibraryService extends BaseService { ownerId, libraryId, checksum: this.cryptoRepository.hashSha1(`path:${assetPath}`), + checksumAlgorithm: ChecksumAlgorithm.sha1Path, originalPath: assetPath, fileCreatedAt: stat.mtime, diff --git a/server/src/services/map.service.spec.ts b/server/src/services/map.service.spec.ts index 287c5c7c63..fdf7aee68b 100644 --- a/server/src/services/map.service.spec.ts +++ b/server/src/services/map.service.spec.ts @@ -2,9 +2,9 @@ import { MapService } from 'src/services/map.service'; import { AlbumFactory } from 'test/factories/album.factory'; import { AssetFactory } from 'test/factories/asset.factory'; import { AuthFactory } from 'test/factories/auth.factory'; +import { PartnerFactory } from 'test/factories/partner.factory'; import { userStub } from 'test/fixtures/user.stub'; import { getForAlbum, getForPartner } from 'test/mappers'; -import { factory } from 'test/small.factory'; import { newTestService, ServiceMocks } from 'test/utils'; describe(MapService.name, () => { @@ -40,7 +40,7 @@ describe(MapService.name, () => { it('should include partner assets', async () => { const auth = AuthFactory.create(); - const partner = factory.partner({ sharedWithId: auth.user.id }); + const partner = PartnerFactory.create({ sharedWithId: auth.user.id }); const asset = AssetFactory.from() .exif({ latitude: 42, longitude: 69, city: 'city', state: 'state', country: 'country' }) diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 279d57becd..51a10a39c2 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -2254,7 +2254,9 @@ describe(MediaService.name, () => { }); it('should delete existing transcode if current policy does not require transcoding', async () => { - const asset = AssetFactory.create({ type: AssetType.Video, encodedVideoPath: '/encoded/video/path.mp4' }); + const asset = AssetFactory.from({ type: AssetType.Video }) + .file({ type: AssetFileType.EncodedVideo, path: '/encoded/video/path.mp4' }) + .build(); mocks.media.probe.mockResolvedValue(probeStub.videoStream2160p); mocks.systemMetadata.get.mockResolvedValue({ ffmpeg: { transcode: TranscodePolicy.Disabled } }); mocks.assetJob.getForVideoConversion.mockResolvedValue(asset); @@ -2264,7 +2266,7 @@ describe(MediaService.name, () => { expect(mocks.media.transcode).not.toHaveBeenCalled(); expect(mocks.job.queue).toHaveBeenCalledWith({ name: JobName.FileDelete, - data: { files: [asset.encodedVideoPath] }, + data: { files: ['/encoded/video/path.mp4'] }, }); }); diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index 8158ade192..2c9325c976 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -39,7 +39,7 @@ import { VideoInterfaces, VideoStreamInfo, } from 'src/types'; -import { getDimensions } from 'src/utils/asset.util'; +import { getAssetFile, getDimensions } from 'src/utils/asset.util'; import { checkFaceVisibility, checkOcrVisibility } from 'src/utils/editor'; import { BaseConfig, ThumbnailConfig } from 'src/utils/media'; import { mimeTypes } from 'src/utils/mime-types'; @@ -605,10 +605,11 @@ export class MediaService extends BaseService { let { ffmpeg } = await this.getConfig({ withCache: true }); const target = this.getTranscodeTarget(ffmpeg, videoStream, audioStream); if (target === TranscodeTarget.None && !this.isRemuxRequired(ffmpeg, format)) { - if (asset.encodedVideoPath) { + const encodedVideo = getAssetFile(asset.files, AssetFileType.EncodedVideo, { isEdited: false }); + if (encodedVideo) { this.logger.log(`Transcoded video exists for asset ${asset.id}, but is no longer required. Deleting...`); - await this.jobRepository.queue({ name: JobName.FileDelete, data: { files: [asset.encodedVideoPath] } }); - await this.assetRepository.update({ id: asset.id, encodedVideoPath: null }); + await this.jobRepository.queue({ name: JobName.FileDelete, data: { files: [encodedVideo.path] } }); + await this.assetRepository.deleteFiles([encodedVideo]); } else { this.logger.verbose(`Asset ${asset.id} does not require transcoding based on current policy, skipping`); } @@ -656,7 +657,12 @@ export class MediaService extends BaseService { this.logger.log(`Successfully encoded ${asset.id}`); - await this.assetRepository.update({ id: asset.id, encodedVideoPath: output }); + await this.assetRepository.upsertFile({ + assetId: asset.id, + type: AssetFileType.EncodedVideo, + path: output, + isEdited: false, + }); return JobStatus.Success; } @@ -750,7 +756,13 @@ export class MediaService extends BaseService { return false; } - const name = formatLongName === 'QuickTime / MOV' ? VideoContainer.Mov : (formatName as VideoContainer); + const formatLongNameMapping: Record = { + 'QuickTime / MOV': VideoContainer.Mov, + 'Matroska / WebM': VideoContainer.Webm, + }; + + const name = (formatLongName ? formatLongNameMapping[formatLongName] : undefined) ?? (formatName as VideoContainer); + return name !== VideoContainer.Mp4 && !ffmpegConfig.acceptedContainers.includes(name); } diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 19dd1e5352..f9d17079e3 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -7,6 +7,7 @@ import { AssetFileType, AssetType, AssetVisibility, + ChecksumAlgorithm, ExifOrientation, ImmichWorker, JobName, @@ -330,7 +331,7 @@ describe(MetadataService.name, () => { duration: null, fileCreatedAt: asset.fileCreatedAt, fileModifiedAt: asset.fileModifiedAt, - localDateTime: asset.localDateTime, + localDateTime: asset.fileCreatedAt, width: null, height: null, }); @@ -360,7 +361,7 @@ describe(MetadataService.name, () => { duration: null, fileCreatedAt: asset.fileCreatedAt, fileModifiedAt: asset.fileModifiedAt, - localDateTime: asset.localDateTime, + localDateTime: asset.fileCreatedAt, width: null, height: null, }); @@ -652,6 +653,7 @@ describe(MetadataService.name, () => { expect(mocks.assetJob.getForMetadataExtraction).toHaveBeenCalledWith(asset.id); expect(mocks.asset.create).toHaveBeenCalledWith({ checksum: expect.any(Buffer), + checksumAlgorithm: ChecksumAlgorithm.sha1File, deviceAssetId: 'NONE', deviceId: 'NONE', fileCreatedAt: asset.fileCreatedAt, @@ -705,6 +707,7 @@ describe(MetadataService.name, () => { expect(mocks.assetJob.getForMetadataExtraction).toHaveBeenCalledWith(asset.id); expect(mocks.asset.create).toHaveBeenCalledWith({ checksum: expect.any(Buffer), + checksumAlgorithm: ChecksumAlgorithm.sha1File, deviceAssetId: 'NONE', deviceId: 'NONE', fileCreatedAt: asset.fileCreatedAt, @@ -758,6 +761,7 @@ describe(MetadataService.name, () => { expect(mocks.storage.readFile).toHaveBeenCalledWith(asset.originalPath, expect.any(Object)); expect(mocks.asset.create).toHaveBeenCalledWith({ checksum: expect.any(Buffer), + checksumAlgorithm: ChecksumAlgorithm.sha1File, deviceAssetId: 'NONE', deviceId: 'NONE', fileCreatedAt: asset.fileCreatedAt, @@ -1641,12 +1645,32 @@ describe(MetadataService.name, () => { ); }); - it('should not overwrite existing width/height if they already exist', async () => { - const asset = AssetFactory.create({ width: 1920, height: 1080 }); + it('should overwrite existing width/height for unedited assets', async () => { + const asset = AssetFactory.create({ width: 1920, height: 1080, isEdited: false }); mocks.assetJob.getForMetadataExtraction.mockResolvedValue(getForMetadataExtraction(asset)); mockReadTags({ ImageWidth: 1280, ImageHeight: 720 }); await sut.handleMetadataExtraction({ id: asset.id }); + expect(mocks.asset.update).toHaveBeenCalledWith( + expect.objectContaining({ + width: 1280, + height: 720, + }), + ); + }); + + it('should not overwrite existing width/height for edited assets', async () => { + const asset = AssetFactory.create({ width: 1920, height: 1080, isEdited: true }); + mocks.assetJob.getForMetadataExtraction.mockResolvedValue(getForMetadataExtraction(asset)); + mockReadTags({ ImageWidth: 1280, ImageHeight: 720 }); + + await sut.handleMetadataExtraction({ id: asset.id }); + expect(mocks.asset.update).toHaveBeenCalledWith( + expect.objectContaining({ + width: undefined, + height: undefined, + }), + ); expect(mocks.asset.update).not.toHaveBeenCalledWith( expect.objectContaining({ width: 1280, diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index d2467ae6d9..c2cf66ad57 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -14,6 +14,7 @@ import { AssetFileType, AssetType, AssetVisibility, + ChecksumAlgorithm, DatabaseLock, ExifOrientation, ImmichWorker, @@ -327,10 +328,9 @@ export class MetadataService extends BaseService { fileCreatedAt: dates.dateTimeOriginal ?? undefined, fileModifiedAt: stats.mtime, - // only update the dimensions if they don't already exist - // we don't want to overwrite width/height that are modified by edits - width: asset.width == null ? assetWidth : undefined, - height: asset.height == null ? assetHeight : undefined, + // Keep unedited assets in sync with the file on disk, but don't overwrite edited dimensions. + width: !asset.isEdited || asset.width == null ? assetWidth : undefined, + height: !asset.isEdited || asset.height == null ? assetHeight : undefined, }), async () => { await this.assetRepository.upsertExif(exifData, { lockedPropertiesBehavior: 'skip' }); @@ -467,7 +467,7 @@ export class MetadataService extends BaseService { GPSLatitude: latitude, GPSLongitude: longitude, Rating: rating, - TagsList: tags?.length ? tags : undefined, + TagsList: tags, }, _.isUndefined, ); @@ -676,6 +676,7 @@ export class MetadataService extends BaseService { fileModifiedAt: stats.mtime, localDateTime: dates.localDateTime, checksum, + checksumAlgorithm: ChecksumAlgorithm.sha1File, ownerId: asset.ownerId, originalPath: StorageCore.getAndroidMotionPath(asset, motionAssetId), originalFileName: `${parse(asset.originalFileName).name}.mp4`, diff --git a/server/src/services/partner.service.spec.ts b/server/src/services/partner.service.spec.ts index 0f80ca84f1..029462a865 100644 --- a/server/src/services/partner.service.spec.ts +++ b/server/src/services/partner.service.spec.ts @@ -1,9 +1,10 @@ import { BadRequestException } from '@nestjs/common'; import { PartnerDirection } from 'src/repositories/partner.repository'; import { PartnerService } from 'src/services/partner.service'; +import { AuthFactory } from 'test/factories/auth.factory'; +import { PartnerFactory } from 'test/factories/partner.factory'; import { UserFactory } from 'test/factories/user.factory'; -import { getDehydrated, getForPartner } from 'test/mappers'; -import { factory } from 'test/small.factory'; +import { getForPartner } from 'test/mappers'; import { newTestService, ServiceMocks } from 'test/utils'; describe(PartnerService.name, () => { @@ -22,15 +23,9 @@ describe(PartnerService.name, () => { it("should return a list of partners with whom I've shared my library", async () => { const user1 = UserFactory.create(); const user2 = UserFactory.create(); - const sharedWithUser2 = factory.partner({ - sharedBy: getDehydrated(user1), - sharedWith: getDehydrated(user2), - }); - const sharedWithUser1 = factory.partner({ - sharedBy: getDehydrated(user2), - sharedWith: getDehydrated(user1), - }); - const auth = factory.auth({ user: { id: user1.id } }); + const sharedWithUser2 = PartnerFactory.from().sharedBy(user1).sharedWith(user2).build(); + const sharedWithUser1 = PartnerFactory.from().sharedBy(user2).sharedWith(user1).build(); + const auth = AuthFactory.create({ id: user1.id }); mocks.partner.getAll.mockResolvedValue([getForPartner(sharedWithUser1), getForPartner(sharedWithUser2)]); @@ -41,15 +36,9 @@ describe(PartnerService.name, () => { it('should return a list of partners who have shared their libraries with me', async () => { const user1 = UserFactory.create(); const user2 = UserFactory.create(); - const sharedWithUser2 = factory.partner({ - sharedBy: getDehydrated(user1), - sharedWith: getDehydrated(user2), - }); - const sharedWithUser1 = factory.partner({ - sharedBy: getDehydrated(user2), - sharedWith: getDehydrated(user1), - }); - const auth = factory.auth({ user: { id: user1.id } }); + const sharedWithUser2 = PartnerFactory.from().sharedBy(user1).sharedWith(user2).build(); + const sharedWithUser1 = PartnerFactory.from().sharedBy(user2).sharedWith(user1).build(); + const auth = AuthFactory.create({ id: user1.id }); mocks.partner.getAll.mockResolvedValue([getForPartner(sharedWithUser1), getForPartner(sharedWithUser2)]); await expect(sut.search(auth, { direction: PartnerDirection.SharedWith })).resolves.toBeDefined(); @@ -61,8 +50,8 @@ describe(PartnerService.name, () => { it('should create a new partner', async () => { const user1 = UserFactory.create(); const user2 = UserFactory.create(); - const partner = factory.partner({ sharedBy: getDehydrated(user1), sharedWith: getDehydrated(user2) }); - const auth = factory.auth({ user: { id: user1.id } }); + const partner = PartnerFactory.from().sharedBy(user1).sharedWith(user2).build(); + const auth = AuthFactory.create({ id: user1.id }); mocks.partner.get.mockResolvedValue(void 0); mocks.partner.create.mockResolvedValue(getForPartner(partner)); @@ -78,8 +67,8 @@ describe(PartnerService.name, () => { it('should throw an error when the partner already exists', async () => { const user1 = UserFactory.create(); const user2 = UserFactory.create(); - const partner = factory.partner({ sharedBy: getDehydrated(user1), sharedWith: getDehydrated(user2) }); - const auth = factory.auth({ user: { id: user1.id } }); + const partner = PartnerFactory.from().sharedBy(user1).sharedWith(user2).build(); + const auth = AuthFactory.create({ id: user1.id }); mocks.partner.get.mockResolvedValue(getForPartner(partner)); @@ -93,8 +82,8 @@ describe(PartnerService.name, () => { it('should remove a partner', async () => { const user1 = UserFactory.create(); const user2 = UserFactory.create(); - const partner = factory.partner({ sharedBy: getDehydrated(user1), sharedWith: getDehydrated(user2) }); - const auth = factory.auth({ user: { id: user1.id } }); + const partner = PartnerFactory.from().sharedBy(user1).sharedWith(user2).build(); + const auth = AuthFactory.create({ id: user1.id }); mocks.partner.get.mockResolvedValue(getForPartner(partner)); @@ -104,8 +93,8 @@ describe(PartnerService.name, () => { }); it('should throw an error when the partner does not exist', async () => { - const user2 = factory.user(); - const auth = factory.auth(); + const user2 = UserFactory.create(); + const auth = AuthFactory.create(); mocks.partner.get.mockResolvedValue(void 0); @@ -117,8 +106,8 @@ describe(PartnerService.name, () => { describe('update', () => { it('should require access', async () => { - const user2 = factory.user(); - const auth = factory.auth(); + const user2 = UserFactory.create(); + const auth = AuthFactory.create(); await expect(sut.update(auth, user2.id, { inTimeline: false })).rejects.toBeInstanceOf(BadRequestException); }); @@ -126,8 +115,8 @@ describe(PartnerService.name, () => { it('should update partner', async () => { const user1 = UserFactory.create(); const user2 = UserFactory.create(); - const partner = factory.partner({ sharedBy: getDehydrated(user1), sharedWith: getDehydrated(user2) }); - const auth = factory.auth({ user: { id: user1.id } }); + const partner = PartnerFactory.from().sharedBy(user1).sharedWith(user2).build(); + const auth = AuthFactory.create({ id: user1.id }); mocks.access.partner.checkUpdateAccess.mockResolvedValue(new Set([user2.id])); mocks.partner.update.mockResolvedValue(getForPartner(partner)); diff --git a/server/src/services/session.service.spec.ts b/server/src/services/session.service.spec.ts index 7eacd148ad..8f4409a508 100644 --- a/server/src/services/session.service.spec.ts +++ b/server/src/services/session.service.spec.ts @@ -1,7 +1,8 @@ import { JobStatus } from 'src/enum'; import { SessionService } from 'src/services/session.service'; +import { AuthFactory } from 'test/factories/auth.factory'; +import { SessionFactory } from 'test/factories/session.factory'; import { authStub } from 'test/fixtures/auth.stub'; -import { factory } from 'test/small.factory'; import { newTestService, ServiceMocks } from 'test/utils'; describe('SessionService', () => { @@ -25,9 +26,9 @@ describe('SessionService', () => { describe('getAll', () => { it('should get the devices', async () => { - const currentSession = factory.session(); - const otherSession = factory.session(); - const auth = factory.auth({ session: currentSession }); + const currentSession = SessionFactory.create(); + const otherSession = SessionFactory.create(); + const auth = AuthFactory.from().session(currentSession).build(); mocks.session.getByUserId.mockResolvedValue([currentSession, otherSession]); @@ -42,8 +43,8 @@ describe('SessionService', () => { describe('logoutDevices', () => { it('should logout all devices', async () => { - const currentSession = factory.session(); - const auth = factory.auth({ session: currentSession }); + const currentSession = SessionFactory.create(); + const auth = AuthFactory.from().session(currentSession).build(); mocks.session.invalidate.mockResolvedValue(); diff --git a/server/src/services/shared-link.service.ts b/server/src/services/shared-link.service.ts index b942c32326..26b15031ee 100644 --- a/server/src/services/shared-link.service.ts +++ b/server/src/services/shared-link.service.ts @@ -150,6 +150,12 @@ export class SharedLinkService extends BaseService { } async addAssets(auth: AuthDto, id: string, dto: AssetIdsDto): Promise { + if (auth.sharedLink) { + this.logger.deprecate( + 'Assets uploaded using shared link authentication are now automatically added to the shared link during upload and in the next major release this endpoint will no longer accept shared link authentication', + ); + } + const sharedLink = await this.findOrFail(auth.user.id, id); if (sharedLink.type !== SharedLinkType.Individual) { diff --git a/server/src/services/sync.service.spec.ts b/server/src/services/sync.service.spec.ts index 3b7fbfcd95..234e3ac223 100644 --- a/server/src/services/sync.service.spec.ts +++ b/server/src/services/sync.service.spec.ts @@ -1,6 +1,7 @@ import { mapAsset } from 'src/dtos/asset-response.dto'; import { SyncService } from 'src/services/sync.service'; import { AssetFactory } from 'test/factories/asset.factory'; +import { PartnerFactory } from 'test/factories/partner.factory'; import { authStub } from 'test/fixtures/auth.stub'; import { getForAsset, getForPartner } from 'test/mappers'; import { factory } from 'test/small.factory'; @@ -42,7 +43,7 @@ describe(SyncService.name, () => { describe('getChangesForDeltaSync', () => { it('should return a response requiring a full sync when partners are out of sync', async () => { - const partner = factory.partner(); + const partner = PartnerFactory.create(); const auth = factory.auth({ user: { id: partner.sharedWithId } }); mocks.partner.getAll.mockResolvedValue([getForPartner(partner)]); diff --git a/server/src/services/user-admin.service.spec.ts b/server/src/services/user-admin.service.spec.ts index d8e13fcfbd..49aefaa870 100644 --- a/server/src/services/user-admin.service.spec.ts +++ b/server/src/services/user-admin.service.spec.ts @@ -2,9 +2,10 @@ import { BadRequestException, ForbiddenException } from '@nestjs/common'; import { mapUserAdmin } from 'src/dtos/user.dto'; import { JobName, UserStatus } from 'src/enum'; import { UserAdminService } from 'src/services/user-admin.service'; +import { AuthFactory } from 'test/factories/auth.factory'; +import { UserFactory } from 'test/factories/user.factory'; import { authStub } from 'test/fixtures/auth.stub'; import { userStub } from 'test/fixtures/user.stub'; -import { factory } from 'test/small.factory'; import { newTestService, ServiceMocks } from 'test/utils'; import { describe } from 'vitest'; @@ -126,8 +127,8 @@ describe(UserAdminService.name, () => { }); it('should not allow deleting own account', async () => { - const user = factory.userAdmin({ isAdmin: false }); - const auth = factory.auth({ user }); + const user = UserFactory.create({ isAdmin: false }); + const auth = AuthFactory.create(user); mocks.user.get.mockResolvedValue(user); await expect(sut.delete(auth, user.id, {})).rejects.toBeInstanceOf(ForbiddenException); diff --git a/server/src/services/user.service.spec.ts b/server/src/services/user.service.spec.ts index bd896ffc24..0dc83928fc 100644 --- a/server/src/services/user.service.spec.ts +++ b/server/src/services/user.service.spec.ts @@ -3,10 +3,11 @@ import { UserAdmin } from 'src/database'; import { CacheControl, JobName, UserMetadataKey } from 'src/enum'; import { UserService } from 'src/services/user.service'; import { ImmichFileResponse } from 'src/utils/file'; +import { AuthFactory } from 'test/factories/auth.factory'; +import { UserFactory } from 'test/factories/user.factory'; import { authStub } from 'test/fixtures/auth.stub'; import { systemConfigStub } from 'test/fixtures/system-config.stub'; import { userStub } from 'test/fixtures/user.stub'; -import { factory } from 'test/small.factory'; import { newTestService, ServiceMocks } from 'test/utils'; const makeDeletedAt = (daysAgo: number) => { @@ -28,8 +29,8 @@ describe(UserService.name, () => { describe('getAll', () => { it('admin should get all users', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); mocks.user.getList.mockResolvedValue([user]); @@ -39,8 +40,8 @@ describe(UserService.name, () => { }); it('non-admin should get all users when publicUsers enabled', async () => { - const user = factory.userAdmin(); - const auth = factory.auth({ user }); + const user = UserFactory.create(); + const auth = AuthFactory.create(user); mocks.user.getList.mockResolvedValue([user]); @@ -105,7 +106,7 @@ describe(UserService.name, () => { it('should throw an error if the user profile could not be updated with the new image', async () => { const file = { path: '/profile/path' } as Express.Multer.File; - const user = factory.userAdmin({ profileImagePath: '/path/to/profile.jpg' }); + const user = UserFactory.create({ profileImagePath: '/path/to/profile.jpg' }); mocks.user.get.mockResolvedValue(user); mocks.user.update.mockRejectedValue(new InternalServerErrorException('mocked error')); @@ -113,7 +114,7 @@ describe(UserService.name, () => { }); it('should delete the previous profile image', async () => { - const user = factory.userAdmin({ profileImagePath: '/path/to/profile.jpg' }); + const user = UserFactory.create({ profileImagePath: '/path/to/profile.jpg' }); const file = { path: '/profile/path' } as Express.Multer.File; const files = [user.profileImagePath]; @@ -149,7 +150,7 @@ describe(UserService.name, () => { }); it('should delete the profile image if user has one', async () => { - const user = factory.userAdmin({ profileImagePath: '/path/to/profile.jpg' }); + const user = UserFactory.create({ profileImagePath: '/path/to/profile.jpg' }); const files = [user.profileImagePath]; mocks.user.get.mockResolvedValue(user); @@ -178,7 +179,7 @@ describe(UserService.name, () => { }); it('should return the profile picture', async () => { - const user = factory.userAdmin({ profileImagePath: '/path/to/profile.jpg' }); + const user = UserFactory.create({ profileImagePath: '/path/to/profile.jpg' }); mocks.user.get.mockResolvedValue(user); await expect(sut.getProfileImage(user.id)).resolves.toEqual( @@ -205,7 +206,7 @@ describe(UserService.name, () => { }); it('should queue user ready for deletion', async () => { - const user = factory.user(); + const user = UserFactory.create(); mocks.user.getDeletedAfter.mockResolvedValue([{ id: user.id }]); await sut.handleUserDeleteCheck(); diff --git a/server/src/services/version.service.spec.ts b/server/src/services/version.service.spec.ts index 7872f720a9..eacae928eb 100644 --- a/server/src/services/version.service.spec.ts +++ b/server/src/services/version.service.spec.ts @@ -1,5 +1,6 @@ import { DateTime } from 'luxon'; import { SemVer } from 'semver'; +import { defaults } from 'src/config'; import { serverVersion } from 'src/constants'; import { ImmichEnvironment, JobName, JobStatus, SystemMetadataKey } from 'src/enum'; import { VersionService } from 'src/services/version.service'; @@ -130,6 +131,32 @@ describe(VersionService.name, () => { }); }); + describe('onConfigUpdate', () => { + it('should queue a version check job when newVersionCheck is enabled', async () => { + await sut.onConfigUpdate({ + oldConfig: { ...defaults, newVersionCheck: { enabled: false } }, + newConfig: { ...defaults, newVersionCheck: { enabled: true } }, + }); + expect(mocks.job.queue).toHaveBeenCalledWith({ name: JobName.VersionCheck, data: {} }); + }); + + it('should not queue a version check job when newVersionCheck is disabled', async () => { + await sut.onConfigUpdate({ + oldConfig: { ...defaults, newVersionCheck: { enabled: true } }, + newConfig: { ...defaults, newVersionCheck: { enabled: false } }, + }); + expect(mocks.job.queue).not.toHaveBeenCalled(); + }); + + it('should not queue a version check job when newVersionCheck was already enabled', async () => { + await sut.onConfigUpdate({ + oldConfig: { ...defaults, newVersionCheck: { enabled: true } }, + newConfig: { ...defaults, newVersionCheck: { enabled: true } }, + }); + expect(mocks.job.queue).not.toHaveBeenCalled(); + }); + }); + describe('onWebsocketConnection', () => { it('should send on_server_version client event', async () => { await sut.onWebsocketConnection({ userId: '42' }); diff --git a/server/src/services/version.service.ts b/server/src/services/version.service.ts index fd51fa9adf..fc51481cad 100644 --- a/server/src/services/version.service.ts +++ b/server/src/services/version.service.ts @@ -55,6 +55,13 @@ export class VersionService extends BaseService { return this.versionRepository.getAll(); } + @OnEvent({ name: 'ConfigUpdate' }) + async onConfigUpdate({ oldConfig, newConfig }: ArgOf<'ConfigUpdate'>) { + if (!oldConfig.newVersionCheck.enabled && newConfig.newVersionCheck.enabled) { + await this.handleQueueVersionCheck(); + } + } + async handleQueueVersionCheck() { await this.jobRepository.queue({ name: JobName.VersionCheck, data: {} }); } diff --git a/server/src/utils/access.ts b/server/src/utils/access.ts index 7431cb3293..21e8bdd66e 100644 --- a/server/src/utils/access.ts +++ b/server/src/utils/access.ts @@ -190,7 +190,13 @@ const checkOtherAccess = async (access: AccessRepository, request: OtherAccessRe } case Permission.AlbumUpdate: { - return await access.album.checkOwnerAccess(auth.user.id, ids); + const isOwner = await access.album.checkOwnerAccess(auth.user.id, ids); + const isShared = await access.album.checkSharedAlbumAccess( + auth.user.id, + setDifference(ids, isOwner), + AlbumUserRole.Editor, + ); + return setUnion(isOwner, isShared); } case Permission.AlbumDelete: { @@ -198,7 +204,13 @@ const checkOtherAccess = async (access: AccessRepository, request: OtherAccessRe } case Permission.AlbumShare: { - return await access.album.checkOwnerAccess(auth.user.id, ids); + const isOwner = await access.album.checkOwnerAccess(auth.user.id, ids); + const isShared = await access.album.checkSharedAlbumAccess( + auth.user.id, + setDifference(ids, isOwner), + AlbumUserRole.Editor, + ); + return setUnion(isOwner, isShared); } case Permission.AlbumDownload: { @@ -229,6 +241,11 @@ const checkOtherAccess = async (access: AccessRepository, request: OtherAccessRe return ids.has(auth.user.id) ? new Set([auth.user.id]) : new Set(); } + case Permission.DuplicateRead: + case Permission.DuplicateDelete: { + return access.duplicate.checkOwnerAccess(auth.user.id, ids); + } + case Permission.AuthDeviceDelete: { return await access.authDevice.checkOwnerAccess(auth.user.id, ids); } diff --git a/server/src/utils/asset.util.ts b/server/src/utils/asset.util.ts index d6ab825028..5420e60361 100644 --- a/server/src/utils/asset.util.ts +++ b/server/src/utils/asset.util.ts @@ -26,6 +26,8 @@ export const getAssetFiles = (files: AssetFile[]) => ({ editedFullsizeFile: getAssetFile(files, AssetFileType.FullSize, { isEdited: true }), editedPreviewFile: getAssetFile(files, AssetFileType.Preview, { isEdited: true }), editedThumbnailFile: getAssetFile(files, AssetFileType.Thumbnail, { isEdited: true }), + + encodedVideoFile: getAssetFile(files, AssetFileType.EncodedVideo, { isEdited: false }), }); export const addAssets = async ( diff --git a/server/src/utils/database.ts b/server/src/utils/database.ts index 2e22a9f479..03998d9462 100644 --- a/server/src/utils/database.ts +++ b/server/src/utils/database.ts @@ -355,7 +355,16 @@ export function searchAssetBuilder(kysely: Kysely, options: AssetSearchBuild .$if(!!options.id, (qb) => qb.where('asset.id', '=', asUuid(options.id!))) .$if(!!options.libraryId, (qb) => qb.where('asset.libraryId', '=', asUuid(options.libraryId!))) .$if(!!options.userIds, (qb) => qb.where('asset.ownerId', '=', anyUuid(options.userIds!))) - .$if(!!options.encodedVideoPath, (qb) => qb.where('asset.encodedVideoPath', '=', options.encodedVideoPath!)) + .$if(!!options.encodedVideoPath, (qb) => + qb + .innerJoin('asset_file', (join) => + join + .onRef('asset.id', '=', 'asset_file.assetId') + .on('asset_file.type', '=', AssetFileType.EncodedVideo) + .on('asset_file.isEdited', '=', false), + ) + .where('asset_file.path', '=', options.encodedVideoPath!), + ) .$if(!!options.originalPath, (qb) => qb.where(sql`f_unaccent(asset."originalPath")`, 'ilike', sql`'%' || f_unaccent(${options.originalPath}) || '%'`), ) @@ -380,7 +389,15 @@ export function searchAssetBuilder(kysely: Kysely, options: AssetSearchBuild .$if(options.isFavorite !== undefined, (qb) => qb.where('asset.isFavorite', '=', options.isFavorite!)) .$if(options.isOffline !== undefined, (qb) => qb.where('asset.isOffline', '=', options.isOffline!)) .$if(options.isEncoded !== undefined, (qb) => - qb.where('asset.encodedVideoPath', options.isEncoded ? 'is not' : 'is', null), + qb.where((eb) => { + const exists = eb.exists((eb) => + eb + .selectFrom('asset_file') + .whereRef('assetId', '=', 'asset.id') + .where('type', '=', AssetFileType.EncodedVideo), + ); + return options.isEncoded ? exists : eb.not(exists); + }), ) .$if(options.isMotion !== undefined, (qb) => qb.where('asset.livePhotoVideoId', options.isMotion ? 'is not' : 'is', null), diff --git a/server/src/utils/duplicate.spec.ts b/server/src/utils/duplicate.spec.ts new file mode 100644 index 0000000000..4c5d5ddfc4 --- /dev/null +++ b/server/src/utils/duplicate.spec.ts @@ -0,0 +1,178 @@ +import { AssetResponseDto } from 'src/dtos/asset-response.dto'; +import { AssetType, AssetVisibility } from 'src/enum'; +import { getExifCount, suggestDuplicate, suggestDuplicateKeepAssetIds } from 'src/utils/duplicate'; +import { describe, expect, it } from 'vitest'; + +const createAsset = ( + id: string, + fileSizeInByte: number | null = null, + exifFields: Record = {}, +): AssetResponseDto => ({ + id, + type: AssetType.Image, + thumbhash: null, + localDateTime: new Date().toISOString(), + duration: '0:00:00.00000', + hasMetadata: true, + width: 1920, + height: 1080, + createdAt: new Date().toISOString(), + deviceAssetId: 'device-asset-1', + deviceId: 'device-1', + ownerId: 'owner-1', + originalPath: '/path/to/asset', + originalFileName: 'asset.jpg', + fileCreatedAt: new Date().toISOString(), + fileModifiedAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + isFavorite: false, + isArchived: false, + isTrashed: false, + isOffline: false, + isEdited: false, + visibility: AssetVisibility.Timeline, + checksum: 'checksum', + exifInfo: + fileSizeInByte !== null || Object.keys(exifFields).length > 0 ? { fileSizeInByte, ...exifFields } : undefined, +}); + +describe('duplicate utils', () => { + describe('getExifCount', () => { + it('should return 0 for asset without exifInfo', () => { + const asset = createAsset('asset-1'); + asset.exifInfo = undefined; + expect(getExifCount(asset)).toBe(0); + }); + + it('should return 0 for empty exifInfo', () => { + const asset = createAsset('asset-1'); + asset.exifInfo = {}; + expect(getExifCount(asset)).toBe(0); + }); + + it('should count all truthy values in exifInfo', () => { + const asset = createAsset('asset-1', 1000, { + make: 'Canon', + model: 'EOS 5D', + dateTimeOriginal: new Date(), + timeZone: 'UTC', + latitude: 40.7128, + longitude: -74.006, + city: 'New York', + state: 'NY', + country: 'USA', + description: 'A photo', + rating: 5, + }); + // fileSizeInByte (1000) + 11 other truthy fields = 12 + expect(getExifCount(asset)).toBe(12); + }); + + it('should not count null or undefined values', () => { + const asset = createAsset('asset-1', 1000, { + make: 'Canon', + model: null, + latitude: undefined, + city: '', + rating: 0, + }); + // fileSizeInByte (1000) + make ('Canon') = 2 truthy values + // model (null), latitude (undefined), city (''), rating (0) are all falsy + expect(getExifCount(asset)).toBe(2); + }); + }); + + describe('suggestDuplicate', () => { + it('should return undefined for empty list', () => { + expect(suggestDuplicate([])).toBeUndefined(); + }); + + it('should return the single asset for list with one asset', () => { + const asset = createAsset('asset-1', 1000); + expect(suggestDuplicate([asset])).toEqual(asset); + }); + + it('should return asset with largest file size', () => { + const small = createAsset('small', 1000); + const large = createAsset('large', 5000); + const medium = createAsset('medium', 3000); + + expect(suggestDuplicate([small, large, medium])?.id).toBe('large'); + expect(suggestDuplicate([large, small, medium])?.id).toBe('large'); + expect(suggestDuplicate([medium, small, large])?.id).toBe('large'); + }); + + it('should use EXIF count as tie-breaker when file sizes are equal', () => { + const lessExif = createAsset('less-exif', 1000, { make: 'Canon' }); + const moreExif = createAsset('more-exif', 1000, { + make: 'Canon', + model: 'EOS 5D', + dateTimeOriginal: new Date(), + city: 'New York', + }); + + expect(suggestDuplicate([lessExif, moreExif])?.id).toBe('more-exif'); + expect(suggestDuplicate([moreExif, lessExif])?.id).toBe('more-exif'); + }); + + it('should handle assets with no exifInfo (treat as 0 file size)', () => { + const noExif = createAsset('no-exif'); + noExif.exifInfo = undefined; + const withExif = createAsset('with-exif', 1000); + + expect(suggestDuplicate([noExif, withExif])?.id).toBe('with-exif'); + }); + + it('should handle assets with exifInfo but no fileSizeInByte', () => { + const noFileSize = createAsset('no-file-size'); + noFileSize.exifInfo = { make: 'Canon', model: 'EOS 5D' }; + const withFileSize = createAsset('with-file-size', 1000); + + expect(suggestDuplicate([noFileSize, withFileSize])?.id).toBe('with-file-size'); + }); + + it('should return last asset when all have same file size and EXIF count', () => { + const asset1 = createAsset('asset-1', 1000, { make: 'Canon' }); + const asset2 = createAsset('asset-2', 1000, { make: 'Nikon' }); + + // Both have same file size (1000) and same EXIF count (2: fileSizeInByte + make) + // Should return the last one in the sorted array + const result = suggestDuplicate([asset1, asset2]); + // Since they're equal, the last one after sorting should be returned + expect(result).toBeDefined(); + expect(['asset-1', 'asset-2']).toContain(result?.id); + }); + + it('should prioritize file size over EXIF count', () => { + const largeWithLessExif = createAsset('large-less-exif', 5000, { make: 'Canon' }); + const smallWithMoreExif = createAsset('small-more-exif', 1000, { + make: 'Canon', + model: 'EOS 5D', + dateTimeOriginal: new Date(), + city: 'New York', + state: 'NY', + country: 'USA', + }); + + expect(suggestDuplicate([largeWithLessExif, smallWithMoreExif])?.id).toBe('large-less-exif'); + }); + }); + + describe('suggestDuplicateKeepAssetIds', () => { + it('should return empty array for empty list', () => { + expect(suggestDuplicateKeepAssetIds([])).toEqual([]); + }); + + it('should return array with single asset ID', () => { + const asset = createAsset('asset-1', 1000); + expect(suggestDuplicateKeepAssetIds([asset])).toEqual(['asset-1']); + }); + + it('should return array with best asset ID', () => { + const small = createAsset('small', 1000); + const large = createAsset('large', 5000); + + expect(suggestDuplicateKeepAssetIds([small, large])).toEqual(['large']); + }); + }); +}); diff --git a/server/src/utils/duplicate.ts b/server/src/utils/duplicate.ts new file mode 100644 index 0000000000..4f6deb2fce --- /dev/null +++ b/server/src/utils/duplicate.ts @@ -0,0 +1,60 @@ +import { AssetResponseDto } from 'src/dtos/asset-response.dto'; + +/** + * Counts all truthy values in the exifInfo object. + * This matches the client implementation in web/src/lib/utils/exif-utils.ts + * + * @param asset Asset with optional exifInfo + * @returns Count of truthy EXIF values + */ +export const getExifCount = (asset: AssetResponseDto): number => { + return Object.values(asset.exifInfo ?? {}).filter(Boolean).length; +}; + +/** + * Suggests the best duplicate asset to keep from a list of duplicates. + * This is a direct port of the client logic from web/src/lib/utils/duplicate-utils.ts + * + * The best asset is determined by the following criteria: + * 1. Largest image file size in bytes + * 2. Largest count of EXIF data (as tie-breaker) + * + * @param assets List of duplicate assets + * @returns The best asset to keep, or undefined if empty list + */ +export const suggestDuplicate = (assets: AssetResponseDto[]): AssetResponseDto | undefined => { + if (assets.length === 0) { + return undefined; + } + + // Sort by file size ascending (smallest first) + let duplicateAssets = [...assets].toSorted( + (a, b) => (a.exifInfo?.fileSizeInByte ?? 0) - (b.exifInfo?.fileSizeInByte ?? 0), + ); + + // Get the largest file size (last element after sorting) + const largestFileSize = duplicateAssets.at(-1)?.exifInfo?.fileSizeInByte ?? 0; + + // Filter to keep only assets with the largest file size + duplicateAssets = duplicateAssets.filter((asset) => (asset.exifInfo?.fileSizeInByte ?? 0) === largestFileSize); + + // If there are multiple assets with the same file size, sort by EXIF count + if (duplicateAssets.length >= 2) { + duplicateAssets = duplicateAssets.toSorted((a, b) => getExifCount(a) - getExifCount(b)); + } + + // Return the last asset (highest EXIF count among highest file size) + return duplicateAssets.at(-1); +}; + +/** + * Suggests the best duplicate asset IDs to keep from a list of duplicates. + * Returns an array with a single asset ID (the best candidate), or empty if no assets. + * + * @param assets List of duplicate assets + * @returns Array of suggested asset IDs to keep (0 or 1 element) + */ +export const suggestDuplicateKeepAssetIds = (assets: AssetResponseDto[]): string[] => { + const suggested = suggestDuplicate(assets); + return suggested ? [suggested.id] : []; +}; diff --git a/server/src/utils/transform.spec.ts b/server/src/utils/transform.spec.ts index 5efeac02a6..f652788424 100644 --- a/server/src/utils/transform.spec.ts +++ b/server/src/utils/transform.spec.ts @@ -155,6 +155,33 @@ describe('transformFaceBoundingBox', () => { expect(result.boundingBoxX2).toBe(50); expect(result.boundingBoxY2).toBe(50); }); + + it('should always return whole numbers', () => { + const edits: AssetEditActionItem[] = [ + { action: AssetEditAction.Crop, parameters: { x: 50, y: 50, width: 250, height: 250 } }, + ]; + + expect(transformFaceBoundingBox(baseFace, edits, { width: 1000, height: 400 })).toMatchObject({ + boundingBoxX1: 50, + boundingBoxY1: 0, + boundingBoxX2: 150, + boundingBoxY2: 50, + }); + + expect(transformFaceBoundingBox(baseFace, edits, { width: 1001, height: 401 })).toMatchObject({ + boundingBoxX1: 50, + boundingBoxY1: 0, + boundingBoxX2: 150, + boundingBoxY2: 50, + }); + + expect(transformFaceBoundingBox(baseFace, edits, { width: 999, height: 399 })).toMatchObject({ + boundingBoxX1: 49, + boundingBoxY1: -0, + boundingBoxX2: 149, + boundingBoxY2: 49, + }); + }); }); }); diff --git a/server/src/utils/transform.ts b/server/src/utils/transform.ts index 261595eb66..1c849322a1 100644 --- a/server/src/utils/transform.ts +++ b/server/src/utils/transform.ts @@ -179,10 +179,10 @@ export const transformFaceBoundingBox = ( // Ensure x1,y1 is top-left and x2,y2 is bottom-right const [p1, p2] = transformedPoints; return { - boundingBoxX1: Math.min(p1.x, p2.x), - boundingBoxY1: Math.min(p1.y, p2.y), - boundingBoxX2: Math.max(p1.x, p2.x), - boundingBoxY2: Math.max(p1.y, p2.y), + boundingBoxX1: Math.trunc(Math.min(p1.x, p2.x)), + boundingBoxY1: Math.trunc(Math.min(p1.y, p2.y)), + boundingBoxX2: Math.trunc(Math.max(p1.x, p2.x)), + boundingBoxY2: Math.trunc(Math.max(p1.y, p2.y)), imageWidth: currentWidth, imageHeight: currentHeight, }; diff --git a/server/test/factories/activity.factory.ts b/server/test/factories/activity.factory.ts new file mode 100644 index 0000000000..861b115158 --- /dev/null +++ b/server/test/factories/activity.factory.ts @@ -0,0 +1,42 @@ +import { Selectable } from 'kysely'; +import { ActivityTable } from 'src/schema/tables/activity.table'; +import { build } from 'test/factories/builder.factory'; +import { ActivityLike, FactoryBuilder, UserLike } from 'test/factories/types'; +import { UserFactory } from 'test/factories/user.factory'; +import { newDate, newUuid, newUuidV7 } from 'test/small.factory'; + +export class ActivityFactory { + #user!: UserFactory; + + private constructor(private value: Selectable) {} + + static create(dto: ActivityLike = {}) { + return ActivityFactory.from(dto).build(); + } + + static from(dto: ActivityLike = {}) { + const userId = dto.userId ?? newUuid(); + return new ActivityFactory({ + albumId: newUuid(), + assetId: null, + comment: null, + createdAt: newDate(), + id: newUuid(), + isLiked: false, + userId, + updatedAt: newDate(), + updateId: newUuidV7(), + ...dto, + }).user({ id: userId }); + } + + user(dto: UserLike = {}, builder?: FactoryBuilder) { + this.#user = build(UserFactory.from(dto), builder); + this.value.userId = this.#user.build().id; + return this; + } + + build() { + return { ...this.value, user: this.#user.build() }; + } +} diff --git a/server/test/factories/api-key.factory.ts b/server/test/factories/api-key.factory.ts new file mode 100644 index 0000000000..d16b50ba57 --- /dev/null +++ b/server/test/factories/api-key.factory.ts @@ -0,0 +1,42 @@ +import { Selectable } from 'kysely'; +import { Permission } from 'src/enum'; +import { ApiKeyTable } from 'src/schema/tables/api-key.table'; +import { build } from 'test/factories/builder.factory'; +import { ApiKeyLike, FactoryBuilder, UserLike } from 'test/factories/types'; +import { UserFactory } from 'test/factories/user.factory'; +import { newDate, newUuid, newUuidV7 } from 'test/small.factory'; + +export class ApiKeyFactory { + #user!: UserFactory; + + private constructor(private value: Selectable) {} + + static create(dto: ApiKeyLike = {}) { + return ApiKeyFactory.from(dto).build(); + } + + static from(dto: ApiKeyLike = {}) { + const userId = dto.userId ?? newUuid(); + return new ApiKeyFactory({ + createdAt: newDate(), + id: newUuid(), + key: Buffer.from('api-key-buffer'), + name: 'API Key', + permissions: [Permission.All], + updatedAt: newDate(), + updateId: newUuidV7(), + userId, + ...dto, + }).user({ id: userId }); + } + + user(dto: UserLike = {}, builder?: FactoryBuilder) { + this.#user = build(UserFactory.from(dto), builder); + this.value.userId = this.#user.build().id; + return this; + } + + build() { + return { ...this.value, user: this.#user.build() }; + } +} diff --git a/server/test/factories/asset.factory.ts b/server/test/factories/asset.factory.ts index 4d54ba820b..9caec31d6f 100644 --- a/server/test/factories/asset.factory.ts +++ b/server/test/factories/asset.factory.ts @@ -1,5 +1,5 @@ import { Selectable } from 'kysely'; -import { AssetFileType, AssetStatus, AssetType, AssetVisibility } from 'src/enum'; +import { AssetFileType, AssetStatus, AssetType, AssetVisibility, ChecksumAlgorithm } from 'src/enum'; import { AssetTable } from 'src/schema/tables/asset.table'; import { StackTable } from 'src/schema/tables/stack.table'; import { AssetEditFactory } from 'test/factories/asset-edit.factory'; @@ -19,7 +19,7 @@ import { UserLike, } from 'test/factories/types'; import { UserFactory } from 'test/factories/user.factory'; -import { newDate, newSha1, newUuid, newUuidV7 } from 'test/small.factory'; +import { newSha1, newUuid, newUuidV7 } from 'test/small.factory'; export class AssetFactory { #owner!: UserFactory; @@ -43,27 +43,29 @@ export class AssetFactory { const originalFileName = dto.originalFileName ?? (dto.type === AssetType.Video ? `MOV_${id}.mp4` : `IMG_${id}.jpg`); + let now = Date.now(); + return new AssetFactory({ id, - createdAt: newDate(), - updatedAt: newDate(), + createdAt: new Date(now++), + updatedAt: new Date(now++), deletedAt: null, updateId: newUuidV7(), status: AssetStatus.Active, checksum: newSha1(), + checksumAlgorithm: ChecksumAlgorithm.sha1File, deviceAssetId: '', deviceId: '', duplicateId: null, duration: null, - encodedVideoPath: null, - fileCreatedAt: newDate(), - fileModifiedAt: newDate(), + fileCreatedAt: new Date(now++), + fileModifiedAt: new Date(now++), isExternal: false, isFavorite: false, isOffline: false, libraryId: null, livePhotoVideoId: null, - localDateTime: newDate(), + localDateTime: new Date(now), originalFileName, originalPath: `/data/library/${originalFileName}`, ownerId: newUuid(), diff --git a/server/test/factories/auth.factory.ts b/server/test/factories/auth.factory.ts index 9c738aabac..fd38c42649 100644 --- a/server/test/factories/auth.factory.ts +++ b/server/test/factories/auth.factory.ts @@ -1,12 +1,16 @@ import { AuthDto } from 'src/dtos/auth.dto'; +import { ApiKeyFactory } from 'test/factories/api-key.factory'; import { build } from 'test/factories/builder.factory'; import { SharedLinkFactory } from 'test/factories/shared-link.factory'; -import { FactoryBuilder, SharedLinkLike, UserLike } from 'test/factories/types'; +import { ApiKeyLike, FactoryBuilder, SharedLinkLike, UserLike } from 'test/factories/types'; import { UserFactory } from 'test/factories/user.factory'; +import { newUuid } from 'test/small.factory'; export class AuthFactory { #user: UserFactory; #sharedLink?: SharedLinkFactory; + #apiKey?: ApiKeyFactory; + #session?: AuthDto['session']; private constructor(user: UserFactory) { this.#user = user; @@ -20,8 +24,8 @@ export class AuthFactory { return new AuthFactory(UserFactory.from(dto)); } - apiKey() { - // TODO + apiKey(dto: ApiKeyLike = {}, builder?: FactoryBuilder) { + this.#apiKey = build(ApiKeyFactory.from(dto), builder); return this; } @@ -30,6 +34,11 @@ export class AuthFactory { return this; } + session(dto: Partial = {}) { + this.#session = { id: newUuid(), hasElevatedPermission: false, ...dto }; + return this; + } + build(): AuthDto { const { id, isAdmin, name, email, quotaUsageInBytes, quotaSizeInBytes } = this.#user.build(); @@ -43,6 +52,8 @@ export class AuthFactory { quotaSizeInBytes, }, sharedLink: this.#sharedLink?.build(), + apiKey: this.#apiKey?.build(), + session: this.#session, }; } } diff --git a/server/test/factories/oauth-profile.factory.ts b/server/test/factories/oauth-profile.factory.ts new file mode 100644 index 0000000000..31a8e4ea77 --- /dev/null +++ b/server/test/factories/oauth-profile.factory.ts @@ -0,0 +1,28 @@ +import { OAuthProfile } from 'src/repositories/oauth.repository'; +import { OAuthProfileLike } from 'test/factories/types'; +import { newUuid } from 'test/small.factory'; + +export class OAuthProfileFactory { + private constructor(private value: OAuthProfile) {} + + static create(dto: OAuthProfileLike = {}) { + return OAuthProfileFactory.from(dto).build(); + } + + static from(dto: OAuthProfileLike = {}) { + const sub = newUuid(); + return new OAuthProfileFactory({ + sub, + name: 'Name', + given_name: 'Given', + family_name: 'Family', + email: `oauth-${sub}@immich.cloud`, + email_verified: true, + ...dto, + }); + } + + build() { + return { ...this.value }; + } +} diff --git a/server/test/factories/partner.factory.ts b/server/test/factories/partner.factory.ts new file mode 100644 index 0000000000..f631db1eb5 --- /dev/null +++ b/server/test/factories/partner.factory.ts @@ -0,0 +1,50 @@ +import { Selectable } from 'kysely'; +import { PartnerTable } from 'src/schema/tables/partner.table'; +import { build } from 'test/factories/builder.factory'; +import { FactoryBuilder, PartnerLike, UserLike } from 'test/factories/types'; +import { UserFactory } from 'test/factories/user.factory'; +import { newDate, newUuid, newUuidV7 } from 'test/small.factory'; + +export class PartnerFactory { + #sharedWith!: UserFactory; + #sharedBy!: UserFactory; + + private constructor(private value: Selectable) {} + + static create(dto: PartnerLike = {}) { + return PartnerFactory.from(dto).build(); + } + + static from(dto: PartnerLike = {}) { + const sharedById = dto.sharedById ?? newUuid(); + const sharedWithId = dto.sharedWithId ?? newUuid(); + return new PartnerFactory({ + createdAt: newDate(), + createId: newUuidV7(), + inTimeline: true, + sharedById, + sharedWithId, + updatedAt: newDate(), + updateId: newUuidV7(), + ...dto, + }) + .sharedBy({ id: sharedById }) + .sharedWith({ id: sharedWithId }); + } + + sharedWith(dto: UserLike = {}, builder?: FactoryBuilder) { + this.#sharedWith = build(UserFactory.from(dto), builder); + this.value.sharedWithId = this.#sharedWith.build().id; + return this; + } + + sharedBy(dto: UserLike = {}, builder?: FactoryBuilder) { + this.#sharedBy = build(UserFactory.from(dto), builder); + this.value.sharedById = this.#sharedBy.build().id; + return this; + } + + build() { + return { ...this.value, sharedWith: this.#sharedWith.build(), sharedBy: this.#sharedBy.build() }; + } +} diff --git a/server/test/factories/session.factory.ts b/server/test/factories/session.factory.ts new file mode 100644 index 0000000000..8d4cb28727 --- /dev/null +++ b/server/test/factories/session.factory.ts @@ -0,0 +1,35 @@ +import { Selectable } from 'kysely'; +import { SessionTable } from 'src/schema/tables/session.table'; +import { SessionLike } from 'test/factories/types'; +import { newDate, newUuid, newUuidV7 } from 'test/small.factory'; + +export class SessionFactory { + private constructor(private value: Selectable) {} + + static create(dto: SessionLike = {}) { + return SessionFactory.from(dto).build(); + } + + static from(dto: SessionLike = {}) { + return new SessionFactory({ + appVersion: null, + createdAt: newDate(), + deviceOS: 'android', + deviceType: 'mobile', + expiresAt: null, + id: newUuid(), + isPendingSyncReset: false, + parentId: null, + pinExpiresAt: null, + token: Buffer.from('abc123'), + updateId: newUuidV7(), + updatedAt: newDate(), + userId: newUuid(), + ...dto, + }); + } + + build() { + return { ...this.value }; + } +} diff --git a/server/test/factories/types.ts b/server/test/factories/types.ts index 0e070c1bcc..5c8c8ee2c2 100644 --- a/server/test/factories/types.ts +++ b/server/test/factories/types.ts @@ -1,13 +1,18 @@ import { Selectable } from 'kysely'; +import { OAuthProfile } from 'src/repositories/oauth.repository'; +import { ActivityTable } from 'src/schema/tables/activity.table'; import { AlbumUserTable } from 'src/schema/tables/album-user.table'; import { AlbumTable } from 'src/schema/tables/album.table'; +import { ApiKeyTable } from 'src/schema/tables/api-key.table'; import { AssetEditTable } from 'src/schema/tables/asset-edit.table'; import { AssetExifTable } from 'src/schema/tables/asset-exif.table'; import { AssetFaceTable } from 'src/schema/tables/asset-face.table'; import { AssetFileTable } from 'src/schema/tables/asset-file.table'; import { AssetTable } from 'src/schema/tables/asset.table'; import { MemoryTable } from 'src/schema/tables/memory.table'; +import { PartnerTable } from 'src/schema/tables/partner.table'; import { PersonTable } from 'src/schema/tables/person.table'; +import { SessionTable } from 'src/schema/tables/session.table'; import { SharedLinkTable } from 'src/schema/tables/shared-link.table'; import { StackTable } from 'src/schema/tables/stack.table'; import { UserTable } from 'src/schema/tables/user.table'; @@ -26,3 +31,8 @@ export type AssetFaceLike = Partial>; export type PersonLike = Partial>; export type StackLike = Partial>; export type MemoryLike = Partial>; +export type PartnerLike = Partial>; +export type ActivityLike = Partial>; +export type ApiKeyLike = Partial>; +export type SessionLike = Partial>; +export type OAuthProfileLike = Partial; diff --git a/server/test/fixtures/auth.stub.ts b/server/test/fixtures/auth.stub.ts index 3e5825c0cc..85d52f14a1 100644 --- a/server/test/fixtures/auth.stub.ts +++ b/server/test/fixtures/auth.stub.ts @@ -48,6 +48,7 @@ export const authStub = { showExif: true, allowDownload: true, allowUpload: true, + albumId: null, expiresAt: null, password: null, userId: '42', diff --git a/server/test/mappers.ts b/server/test/mappers.ts index 73c1bcd6d7..ed2c9431f3 100644 --- a/server/test/mappers.ts +++ b/server/test/mappers.ts @@ -1,4 +1,5 @@ import { Selectable, ShallowDehydrateObject } from 'kysely'; +import { MapAsset } from 'src/dtos/asset-response.dto'; import { AssetEditActionItem } from 'src/dtos/editing.dto'; import { ActivityTable } from 'src/schema/tables/activity.table'; import { AssetTable } from 'src/schema/tables/asset.table'; @@ -125,6 +126,7 @@ export const getForMemory = (memory: ReturnType) => ({ export const getForMetadataExtraction = (asset: ReturnType) => ({ id: asset.id, checksum: asset.checksum, + checksumAlgorithm: asset.checksumAlgorithm, deviceAssetId: asset.deviceAssetId, deviceId: asset.deviceId, fileCreatedAt: asset.fileCreatedAt, @@ -138,6 +140,7 @@ export const getForMetadataExtraction = (asset: ReturnType getDehydrated(face)), @@ -183,7 +186,6 @@ export const getForAssetDeletion = (asset: ReturnType) => libraryId: asset.libraryId, ownerId: asset.ownerId, livePhotoVideoId: asset.livePhotoVideoId, - encodedVideoPath: asset.encodedVideoPath, originalPath: asset.originalPath, isOffline: asset.isOffline, exifInfo: asset.exifInfo ? getDehydrated(asset.exifInfo) : null, @@ -204,10 +206,11 @@ export const getForStack = (stack: ReturnType) => ({ })), }); -export const getForDuplicate = (asset: ReturnType) => ({ - ...getDehydrated(asset), - exifInfo: getDehydrated(asset.exifInfo), -}); +export const getForDuplicate = (asset: ReturnType) => + ({ + ...getDehydrated(asset), + exifInfo: getDehydrated(asset.exifInfo), + }) as unknown as MapAsset; export const getForSharedLink = (sharedLink: ReturnType) => ({ ...sharedLink, diff --git a/server/test/medium.factory.ts b/server/test/medium.factory.ts index 53bf78b5b8..1906fc0ccb 100644 --- a/server/test/medium.factory.ts +++ b/server/test/medium.factory.ts @@ -12,6 +12,7 @@ import { AlbumUserRole, AssetType, AssetVisibility, + ChecksumAlgorithm, MemoryType, SourceType, SyncEntityType, @@ -220,9 +221,9 @@ export class MediumTestContext { return { result }; } - async newAlbum(dto: Insertable) { + async newAlbum(dto: Insertable, assetIds?: string[]) { const album = mediumFactory.albumInsert(dto); - const result = await this.get(AlbumRepository).create(album, [], []); + const result = await this.get(AlbumRepository).create(album, assetIds ?? [], []); return { album, result }; } @@ -547,6 +548,7 @@ const assetInsert = (asset: Partial> = {}) => { deviceId: '', originalFileName: '', checksum: randomBytes(32), + checksumAlgorithm: ChecksumAlgorithm.sha1File, type: AssetType.Image, originalPath: '/path/to/something.jpg', ownerId: 'not-a-valid-uuid', diff --git a/server/test/medium/specs/repositories/metadata.repository.spec.ts b/server/test/medium/specs/repositories/metadata.repository.spec.ts new file mode 100644 index 0000000000..976f33695e --- /dev/null +++ b/server/test/medium/specs/repositories/metadata.repository.spec.ts @@ -0,0 +1,75 @@ +import { Kysely } from 'kysely'; +import { mkdtempSync, readFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { LoggingRepository } from 'src/repositories/logging.repository'; +import { MetadataRepository } from 'src/repositories/metadata.repository'; +import { DB } from 'src/schema'; +import { BaseService } from 'src/services/base.service'; +import { newMediumService } from 'test/medium.factory'; +import { newDate } from 'test/small.factory'; +import { getKyselyDB } from 'test/utils'; + +let database: Kysely; + +const setup = () => { + const { ctx } = newMediumService(BaseService, { + database, + real: [], + mock: [LoggingRepository], + }); + return { ctx, sut: ctx.get(MetadataRepository) }; +}; + +beforeAll(async () => { + database = await getKyselyDB(); +}); + +describe(MetadataRepository.name, () => { + describe('writeTags', () => { + it('should write an empty description', async () => { + const { sut } = setup(); + const dir = mkdtempSync(join(tmpdir(), 'metadata-medium-write-tags')); + const sidecarFile = join(dir, 'sidecar.xmp'); + + await sut.writeTags(sidecarFile, { Description: '' }); + expect(readFileSync(sidecarFile).toString()).toEqual(expect.stringContaining('rdf:Description')); + }); + + it('should write an empty tags list', async () => { + const { sut } = setup(); + const dir = mkdtempSync(join(tmpdir(), 'metadata-medium-write-tags')); + const sidecarFile = join(dir, 'sidecar.xmp'); + + await sut.writeTags(sidecarFile, { TagsList: [] }); + const fileContent = readFileSync(sidecarFile).toString(); + expect(fileContent).toEqual(expect.stringContaining('digiKam:TagsList')); + expect(fileContent).toEqual(expect.stringContaining('')); + }); + }); + + it('should write tags', async () => { + const { sut } = setup(); + const dir = mkdtempSync(join(tmpdir(), 'metadata-medium-write-tags')); + const sidecarFile = join(dir, 'sidecar.xmp'); + + await sut.writeTags(sidecarFile, { + Description: 'my-description', + ImageDescription: 'my-image-description', + DateTimeOriginal: newDate().toISOString(), + GPSLatitude: 42, + GPSLongitude: 69, + Rating: 3, + TagsList: ['tagA'], + }); + + const fileContent = readFileSync(sidecarFile).toString(); + expect(fileContent).toEqual(expect.stringContaining('my-description')); + expect(fileContent).toEqual(expect.stringContaining('my-image-description')); + expect(fileContent).toEqual(expect.stringContaining('exif:DateTimeOriginal')); + expect(fileContent).toEqual(expect.stringContaining('42,0.0N')); + expect(fileContent).toEqual(expect.stringContaining('69,0.0E')); + expect(fileContent).toEqual(expect.stringContaining('3')); + expect(fileContent).toEqual(expect.stringContaining('tagA')); + }); +}); diff --git a/server/test/medium/specs/services/asset-media.service.spec.ts b/server/test/medium/specs/services/asset-media.service.spec.ts index cdd47e3dc4..f10844ca4a 100644 --- a/server/test/medium/specs/services/asset-media.service.spec.ts +++ b/server/test/medium/specs/services/asset-media.service.spec.ts @@ -1,12 +1,15 @@ import { Kysely } from 'kysely'; +import { randomBytes } from 'node:crypto'; import { AssetMediaStatus } from 'src/dtos/asset-media-response.dto'; import { AssetMediaSize } from 'src/dtos/asset-media.dto'; -import { AssetFileType } from 'src/enum'; +import { AssetFileType, SharedLinkType } from 'src/enum'; import { AccessRepository } from 'src/repositories/access.repository'; +import { AlbumRepository } from 'src/repositories/album.repository'; import { AssetRepository } from 'src/repositories/asset.repository'; import { EventRepository } from 'src/repositories/event.repository'; import { JobRepository } from 'src/repositories/job.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; +import { SharedLinkRepository } from 'src/repositories/shared-link.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; import { UserRepository } from 'src/repositories/user.repository'; import { DB } from 'src/schema'; @@ -22,7 +25,7 @@ let defaultDatabase: Kysely; const setup = (db?: Kysely) => { return newMediumService(AssetMediaService, { database: db || defaultDatabase, - real: [AccessRepository, AssetRepository, UserRepository], + real: [AccessRepository, AlbumRepository, AssetRepository, SharedLinkRepository, UserRepository], mock: [EventRepository, LoggingRepository, JobRepository, StorageRepository], }); }; @@ -44,7 +47,6 @@ describe(AssetService.name, () => { const { asset } = await ctx.newAsset({ ownerId: user.id }); await ctx.newExif({ assetId: asset.id, fileSizeInByte: 12_345 }); const auth = factory.auth({ user: { id: user.id } }); - const file = mediumFactory.uploadFile(); await expect( sut.uploadAsset( @@ -56,7 +58,7 @@ describe(AssetService.name, () => { fileCreatedAt: new Date(), assetData: Buffer.from('some data'), }, - file, + mediumFactory.uploadFile(), ), ).resolves.toEqual({ id: expect.any(String), @@ -99,6 +101,168 @@ describe(AssetService.name, () => { status: AssetMediaStatus.CREATED, }); }); + + it('should add to a shared link', async () => { + const { sut, ctx } = setup(); + + const sharedLinkRepo = ctx.get(SharedLinkRepository); + + ctx.getMock(StorageRepository).utimes.mockResolvedValue(); + ctx.getMock(EventRepository).emit.mockResolvedValue(); + ctx.getMock(JobRepository).queue.mockResolvedValue(); + + const { user } = await ctx.newUser(); + + const sharedLink = await sharedLinkRepo.create({ + key: randomBytes(50), + type: SharedLinkType.Individual, + description: 'Shared link description', + userId: user.id, + allowDownload: true, + allowUpload: true, + }); + + const auth = factory.auth({ user: { id: user.id }, sharedLink }); + const file = mediumFactory.uploadFile(); + const uploadDto = { + deviceId: 'some-id', + deviceAssetId: 'some-id', + fileModifiedAt: new Date(), + fileCreatedAt: new Date(), + assetData: Buffer.from('some data'), + }; + + const response = await sut.uploadAsset(auth, uploadDto, file); + expect(response).toEqual({ id: expect.any(String), status: AssetMediaStatus.CREATED }); + + const update = await sharedLinkRepo.get(user.id, sharedLink.id); + const assets = update!.assets; + expect(assets).toHaveLength(1); + expect(assets[0]).toMatchObject({ id: response.id }); + }); + + it('should handle adding a duplicate asset to a shared link', async () => { + const { sut, ctx } = setup(); + + ctx.getMock(StorageRepository).utimes.mockResolvedValue(); + ctx.getMock(EventRepository).emit.mockResolvedValue(); + ctx.getMock(JobRepository).queue.mockResolvedValue(); + + const sharedLinkRepo = ctx.get(SharedLinkRepository); + + const { user } = await ctx.newUser(); + const { asset } = await ctx.newAsset({ ownerId: user.id }); + await ctx.newExif({ assetId: asset.id, fileSizeInByte: 12_345 }); + + const sharedLink = await sharedLinkRepo.create({ + key: randomBytes(50), + type: SharedLinkType.Individual, + description: 'Shared link description', + userId: user.id, + allowDownload: true, + allowUpload: true, + assetIds: [asset.id], + }); + + const auth = factory.auth({ user: { id: user.id }, sharedLink }); + const uploadDto = { + deviceId: 'some-id', + deviceAssetId: 'some-id', + fileModifiedAt: new Date(), + fileCreatedAt: new Date(), + assetData: Buffer.from('some data'), + }; + + const response = await sut.uploadAsset(auth, uploadDto, mediumFactory.uploadFile({ checksum: asset.checksum })); + expect(response).toEqual({ id: expect.any(String), status: AssetMediaStatus.DUPLICATE }); + + const update = await sharedLinkRepo.get(user.id, sharedLink.id); + const assets = update!.assets; + expect(assets).toHaveLength(1); + expect(assets[0]).toMatchObject({ id: response.id }); + }); + + it('should add to an album shared link', async () => { + const { sut, ctx } = setup(); + + const sharedLinkRepo = ctx.get(SharedLinkRepository); + + ctx.getMock(StorageRepository).utimes.mockResolvedValue(); + ctx.getMock(EventRepository).emit.mockResolvedValue(); + ctx.getMock(JobRepository).queue.mockResolvedValue(); + + const { user } = await ctx.newUser(); + const { album } = await ctx.newAlbum({ ownerId: user.id }); + + const sharedLink = await sharedLinkRepo.create({ + key: randomBytes(50), + type: SharedLinkType.Album, + albumId: album.id, + description: 'Shared link description', + userId: user.id, + allowDownload: true, + allowUpload: true, + }); + + const auth = factory.auth({ user: { id: user.id }, sharedLink }); + const uploadDto = { + deviceId: 'some-id', + deviceAssetId: 'some-id', + fileModifiedAt: new Date(), + fileCreatedAt: new Date(), + assetData: Buffer.from('some data'), + }; + + const response = await sut.uploadAsset(auth, uploadDto, mediumFactory.uploadFile()); + expect(response).toEqual({ id: expect.any(String), status: AssetMediaStatus.CREATED }); + + const result = await ctx.get(AlbumRepository).getAssetIds(album.id, [response.id]); + const assets = [...result]; + expect(assets).toHaveLength(1); + expect(assets[0]).toEqual(response.id); + }); + + it('should handle adding a duplicate asset to an album shared link', async () => { + const { sut, ctx } = setup(); + + const sharedLinkRepo = ctx.get(SharedLinkRepository); + + ctx.getMock(StorageRepository).utimes.mockResolvedValue(); + ctx.getMock(EventRepository).emit.mockResolvedValue(); + ctx.getMock(JobRepository).queue.mockResolvedValue(); + + const { user } = await ctx.newUser(); + const { asset } = await ctx.newAsset({ ownerId: user.id }); + const { album } = await ctx.newAlbum({ ownerId: user.id }, [asset.id]); + // await ctx.newExif({ assetId: asset.id, fileSizeInByte: 12_345 }); + + const sharedLink = await sharedLinkRepo.create({ + key: randomBytes(50), + type: SharedLinkType.Album, + albumId: album.id, + description: 'Shared link description', + userId: user.id, + allowDownload: true, + allowUpload: true, + }); + + const auth = factory.auth({ user: { id: user.id }, sharedLink }); + const uploadDto = { + deviceId: 'some-id', + deviceAssetId: 'some-id', + fileModifiedAt: new Date(), + fileCreatedAt: new Date(), + assetData: Buffer.from('some data'), + }; + + const response = await sut.uploadAsset(auth, uploadDto, mediumFactory.uploadFile({ checksum: asset.checksum })); + expect(response).toEqual({ id: expect.any(String), status: AssetMediaStatus.DUPLICATE }); + + const result = await ctx.get(AlbumRepository).getAssetIds(album.id, [response.id]); + const assets = [...result]; + expect(assets).toHaveLength(1); + expect(assets[0]).toEqual(response.id); + }); }); describe('viewThumbnail', () => { diff --git a/server/test/medium/specs/services/person.service.spec.ts b/server/test/medium/specs/services/person.service.spec.ts index c86bd96a10..4cd705b5bd 100644 --- a/server/test/medium/specs/services/person.service.spec.ts +++ b/server/test/medium/specs/services/person.service.spec.ts @@ -591,10 +591,10 @@ describe(PersonService.name, () => { expect.arrayContaining([ expect.objectContaining({ person: expect.objectContaining({ id: person.id }), - boundingBoxX1: expect.closeTo(25, 1), - boundingBoxY1: expect.closeTo(50, 1), - boundingBoxX2: expect.closeTo(100, 1), - boundingBoxY2: expect.closeTo(100, 1), + boundingBoxX1: 25, + boundingBoxY1: 49, + boundingBoxX2: 99, + boundingBoxY2: 100, }), ]), ); diff --git a/server/test/medium/specs/services/search.service.spec.ts b/server/test/medium/specs/services/search.service.spec.ts index c20b64ca7c..18e03b2e48 100644 --- a/server/test/medium/specs/services/search.service.spec.ts +++ b/server/test/medium/specs/services/search.service.spec.ts @@ -1,4 +1,5 @@ import { Kysely } from 'kysely'; +import { SearchSuggestionType } from 'src/dtos/search.dto'; import { AccessRepository } from 'src/repositories/access.repository'; import { AssetRepository } from 'src/repositories/asset.repository'; import { DatabaseRepository } from 'src/repositories/database.repository'; @@ -108,4 +109,25 @@ describe(SearchService.name, () => { expect(response.assets.items[0].id).toBe(unstackedAsset.id); }); }); + + describe('getSearchSuggestions', () => { + it('should filter out empty search suggestions', async () => { + const { sut, ctx } = setup(); + const { user } = await ctx.newUser(); + + const { asset } = await ctx.newAsset({ ownerId: user.id }); + await ctx.newExif({ assetId: asset.id, make: 'Canon' }); + + const { asset: assetWithEmptyMake } = await ctx.newAsset({ ownerId: user.id }); + await ctx.newExif({ assetId: assetWithEmptyMake.id, make: '' }); + + const auth = factory.auth({ user: { id: user.id } }); + const suggestions = await sut.getSearchSuggestions(auth, { + type: SearchSuggestionType.CAMERA_MAKE, + includeNull: true, + }); + + expect(suggestions).toEqual(['Canon', null]); + }); + }); }); diff --git a/server/test/medium/specs/services/shared-link.service.spec.ts b/server/test/medium/specs/services/shared-link.service.spec.ts index 5873d469a5..347e2e9506 100644 --- a/server/test/medium/specs/services/shared-link.service.spec.ts +++ b/server/test/medium/specs/services/shared-link.service.spec.ts @@ -372,6 +372,43 @@ describe(SharedLinkService.name, () => { }); describe('get', () => { + it('should return an album shared link with assets', async () => { + const { sut, ctx } = setup(); + const { user } = await ctx.newUser(); + const auth = factory.auth({ user }); + const { album } = await ctx.newAlbum({ ownerId: user.id }); + + const [{ asset: asset1 }, { asset: asset2 }] = await Promise.all([ + ctx.newAsset({ ownerId: user.id }), + ctx.newAsset({ ownerId: user.id }), + ]); + await Promise.all([ + ctx.newExif({ assetId: asset1.id, make: 'Canon' }), + ctx.newExif({ assetId: asset2.id, make: 'Canon' }), + ]); + + const sharedLinkRepo = ctx.get(SharedLinkRepository); + const sharedLink = await sharedLinkRepo.create({ + key: randomBytes(16), + id: factory.uuid(), + userId: user.id, + albumId: album.id, + allowUpload: true, + type: SharedLinkType.Album, + }); + + await sharedLinkRepo.addAssets(sharedLink.id, [asset1.id, asset2.id]); + const result = await sut.get(auth, sharedLink.id); + const assetIds = result.assets.map((asset) => asset.id); + + expect(result).toMatchObject({ + id: sharedLink.id, + album: expect.objectContaining({ id: album.id }), + }); + expect(assetIds).toHaveLength(2); + expect(assetIds).toEqual(expect.arrayContaining([asset1.id, asset2.id])); + }); + it('should not return trashed assets for an individual shared link', async () => { const { sut, ctx } = setup(); const { user } = await ctx.newUser(); diff --git a/server/test/medium/specs/services/user.service.spec.ts b/server/test/medium/specs/services/user.service.spec.ts index 24a06404b1..2250034eea 100644 --- a/server/test/medium/specs/services/user.service.spec.ts +++ b/server/test/medium/specs/services/user.service.spec.ts @@ -47,15 +47,15 @@ describe(UserService.name, () => { const { sut, ctx } = setup(); ctx.getMock(EventRepository).emit.mockResolvedValue(); const user = mediumFactory.userInsert(); - await expect(sut.createUser({ email: user.email })).resolves.toMatchObject({ email: user.email }); - await expect(sut.createUser({ email: user.email })).rejects.toThrow('User exists'); + await expect(sut.createUser({ name: 'Test', email: user.email })).resolves.toMatchObject({ email: user.email }); + await expect(sut.createUser({ name: 'Test', email: user.email })).rejects.toThrow('User exists'); }); it('should not return password', async () => { const { sut, ctx } = setup(); ctx.getMock(EventRepository).emit.mockResolvedValue(); const dto = mediumFactory.userInsert({ password: 'password' }); - const user = await sut.createUser({ email: dto.email, password: 'password' }); + const user = await sut.createUser({ name: 'Test', email: dto.email, password: 'password' }); expect((user as any).password).toBeUndefined(); }); }); diff --git a/server/test/repositories/access.repository.mock.ts b/server/test/repositories/access.repository.mock.ts index 208b09c120..f723113bd1 100644 --- a/server/test/repositories/access.repository.mock.ts +++ b/server/test/repositories/access.repository.mock.ts @@ -33,6 +33,10 @@ export const newAccessRepositoryMock = (): IAccessRepositoryMock => { checkOwnerAccess: vitest.fn().mockResolvedValue(new Set()), }, + duplicate: { + checkOwnerAccess: vitest.fn().mockResolvedValue(new Set()), + }, + memory: { checkOwnerAccess: vitest.fn().mockResolvedValue(new Set()), }, diff --git a/server/test/repositories/config.repository.mock.ts b/server/test/repositories/config.repository.mock.ts index 62e498372e..b5ab6e2054 100644 --- a/server/test/repositories/config.repository.mock.ts +++ b/server/test/repositories/config.repository.mock.ts @@ -35,6 +35,10 @@ const envData: EnvData = { vectorExtension: DatabaseExtension.Vectors, }, + helmet: { + config: {}, + }, + licensePublicKey: { client: 'client-public-key', server: 'server-public-key', diff --git a/server/test/small.factory.ts b/server/test/small.factory.ts index c734fdcb2d..e4001d18ab 100644 --- a/server/test/small.factory.ts +++ b/server/test/small.factory.ts @@ -1,26 +1,7 @@ -import { ShallowDehydrateObject } from 'kysely'; -import { - Activity, - Album, - ApiKey, - AuthApiKey, - AuthSharedLink, - AuthUser, - Exif, - Library, - Partner, - Person, - Session, - Tag, - User, - UserAdmin, -} from 'src/database'; +import { AuthApiKey, AuthSharedLink, AuthUser, Exif, Library, UserAdmin } from 'src/database'; import { AuthDto } from 'src/dtos/auth.dto'; -import { AssetEditAction, AssetEditActionItem, MirrorAxis } from 'src/dtos/editing.dto'; import { QueueStatisticsDto } from 'src/dtos/queue.dto'; -import { AssetFileType, AssetOrder, Permission, UserMetadataKey, UserStatus } from 'src/enum'; -import { UserMetadataItem } from 'src/types'; -import { UserFactory } from 'test/factories/user.factory'; +import { AssetFileType, Permission, UserStatus } from 'src/enum'; import { v4, v7 } from 'uuid'; export const newUuid = () => v4(); @@ -82,12 +63,22 @@ const authSharedLinkFactory = (sharedLink: Partial = {}) => { expiresAt = null, userId = newUuid(), showExif = true, + albumId = null, allowUpload = false, allowDownload = true, password = null, } = sharedLink; - return { id, expiresAt, userId, showExif, allowUpload, allowDownload, password }; + return { + id, + albumId, + expiresAt, + userId, + showExif, + allowUpload, + allowDownload, + password, + }; }; const authApiKeyFactory = (apiKey: Partial = {}) => ({ @@ -109,49 +100,6 @@ const authUserFactory = (authUser: Partial = {}) => { return { id, isAdmin, name, email, quotaUsageInBytes, quotaSizeInBytes }; }; -const partnerFactory = ({ - sharedBy: sharedByProvided, - sharedWith: sharedWithProvided, - ...partner -}: Partial = {}) => { - const hydrateUser = (user: Partial>) => ({ - ...user, - profileChangedAt: user.profileChangedAt ? new Date(user.profileChangedAt) : undefined, - }); - const sharedBy = UserFactory.create(sharedByProvided ? hydrateUser(sharedByProvided) : {}); - const sharedWith = UserFactory.create(sharedWithProvided ? hydrateUser(sharedWithProvided) : {}); - - return { - sharedById: sharedBy.id, - sharedBy, - sharedWithId: sharedWith.id, - sharedWith, - createId: newUuidV7(), - createdAt: newDate(), - updatedAt: newDate(), - updateId: newUuidV7(), - inTimeline: true, - ...partner, - }; -}; - -const sessionFactory = (session: Partial = {}) => ({ - id: newUuid(), - createdAt: newDate(), - updatedAt: newDate(), - updateId: newUuidV7(), - deviceOS: 'android', - deviceType: 'mobile', - token: Buffer.from('abc123'), - parentId: null, - expiresAt: null, - userId: newUuid(), - pinExpiresAt: newDate(), - isPendingSyncReset: false, - appVersion: session.appVersion ?? null, - ...session, -}); - const queueStatisticsFactory = (dto?: Partial) => ({ active: 0, completed: 0, @@ -162,22 +110,6 @@ const queueStatisticsFactory = (dto?: Partial) => ({ ...dto, }); -const userFactory = (user: Partial = {}) => ({ - id: newUuid(), - name: 'Test User', - email: 'test@immich.cloud', - avatarColor: null, - profileImagePath: '', - profileChangedAt: newDate(), - metadata: [ - { - key: UserMetadataKey.Onboarding, - value: 'true', - }, - ] as UserMetadataItem[], - ...user, -}); - const userAdminFactory = (user: Partial = {}) => { const { id = newUuid(), @@ -219,34 +151,6 @@ const userAdminFactory = (user: Partial = {}) => { }; }; -const activityFactory = (activity: Omit, 'user'> = {}) => { - const userId = activity.userId || newUuid(); - return { - id: newUuid(), - comment: null, - isLiked: false, - userId, - user: UserFactory.create({ id: userId }), - assetId: newUuid(), - albumId: newUuid(), - createdAt: newDate(), - updatedAt: newDate(), - updateId: newUuidV7(), - ...activity, - }; -}; - -const apiKeyFactory = (apiKey: Partial = {}) => ({ - id: newUuid(), - userId: newUuid(), - createdAt: newDate(), - updatedAt: newDate(), - updateId: newUuidV7(), - name: 'Api Key', - permissions: [Permission.All], - ...apiKey, -}); - const libraryFactory = (library: Partial = {}) => ({ id: newUuid(), createdAt: newDate(), @@ -328,88 +232,15 @@ const assetOcrFactory = ( ...ocr, }); -const tagFactory = (tag: Partial): Tag => ({ - id: newUuid(), - color: null, - createdAt: newDate(), - parentId: null, - updatedAt: newDate(), - value: `tag-${newUuid()}`, - ...tag, -}); - -const assetEditFactory = (edit?: Partial): AssetEditActionItem => { - switch (edit?.action) { - case AssetEditAction.Crop: { - return { action: AssetEditAction.Crop, parameters: { height: 42, width: 42, x: 0, y: 10 }, ...edit }; - } - case AssetEditAction.Mirror: { - return { action: AssetEditAction.Mirror, parameters: { axis: MirrorAxis.Horizontal }, ...edit }; - } - case AssetEditAction.Rotate: { - return { action: AssetEditAction.Rotate, parameters: { angle: 90 }, ...edit }; - } - default: { - return { action: AssetEditAction.Mirror, parameters: { axis: MirrorAxis.Vertical } }; - } - } -}; - -const personFactory = (person?: Partial): Person => ({ - birthDate: newDate(), - color: null, - createdAt: newDate(), - faceAssetId: null, - id: newUuid(), - isFavorite: false, - isHidden: false, - name: 'person', - ownerId: newUuid(), - thumbnailPath: '/path/to/person/thumbnail.jpg', - updatedAt: newDate(), - updateId: newUuidV7(), - ...person, -}); - -const albumFactory = (album?: Partial>) => ({ - albumName: 'My Album', - albumThumbnailAssetId: null, - albumUsers: [], - assets: [], - createdAt: newDate(), - deletedAt: null, - description: 'Album description', - id: newUuid(), - isActivityEnabled: false, - order: AssetOrder.Desc, - ownerId: newUuid(), - sharedLinks: [], - updatedAt: newDate(), - updateId: newUuidV7(), - ...album, -}); - export const factory = { - activity: activityFactory, - apiKey: apiKeyFactory, assetOcr: assetOcrFactory, auth: authFactory, - authApiKey: authApiKeyFactory, - authUser: authUserFactory, library: libraryFactory, - partner: partnerFactory, queueStatistics: queueStatisticsFactory, - session: sessionFactory, - user: userFactory, - userAdmin: userAdminFactory, versionHistory: versionHistoryFactory, jobAssets: { sidecarWrite: assetSidecarWriteFactory, }, - person: personFactory, - assetEdit: assetEditFactory, - tag: tagFactory, - album: albumFactory, uuid: newUuid, buffer: () => Buffer.from('this is a fake buffer'), date: newDate, diff --git a/web/.nvmrc b/web/.nvmrc index 32f8c50de0..8e35034890 100644 --- a/web/.nvmrc +++ b/web/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.1 diff --git a/web/package.json b/web/package.json index 03104e7087..36818a410c 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "immich-web", - "version": "2.5.6", + "version": "2.6.3", "license": "GNU Affero General Public License version 3", "type": "module", "scripts": { @@ -27,7 +27,7 @@ "@formatjs/icu-messageformat-parser": "^3.0.0", "@immich/justified-layout-wasm": "^0.4.3", "@immich/sdk": "workspace:*", - "@immich/ui": "^0.64.0", + "@immich/ui": "^0.69.0", "@mapbox/mapbox-gl-rtl-text": "0.3.0", "@mdi/js": "^7.4.47", "@photo-sphere-viewer/core": "^5.14.0", @@ -73,10 +73,10 @@ "@koddsson/eslint-plugin-tscompat": "^0.2.0", "@socket.io/component-emitter": "^3.1.0", "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/enhanced-img": "^0.10.0", + "@sveltejs/enhanced-img": "^0.10.4", "@sveltejs/kit": "^2.27.1", - "@sveltejs/vite-plugin-svelte": "6.2.4", - "@tailwindcss/vite": "^4.1.7", + "@sveltejs/vite-plugin-svelte": "7.0.0", + "@tailwindcss/vite": "^4.2.2", "@testing-library/jest-dom": "^6.4.2", "@testing-library/svelte": "^5.2.8", "@testing-library/user-event": "^14.5.2", @@ -101,16 +101,16 @@ "prettier-plugin-sort-json": "^4.1.1", "prettier-plugin-svelte": "^3.3.3", "rollup-plugin-visualizer": "^6.0.0", - "svelte": "5.53.7", + "svelte": "5.54.1", "svelte-check": "^4.1.5", "svelte-eslint-parser": "^1.3.3", - "tailwindcss": "^4.1.7", + "tailwindcss": "^4.2.2", "typescript": "^5.8.3", "typescript-eslint": "^8.45.0", - "vite": "^7.1.2", + "vite": "^8.0.0", "vitest": "^4.0.0" }, "volta": { - "node": "24.13.1" + "node": "24.14.1" } } diff --git a/web/src/lib/actions/zoom-image.ts b/web/src/lib/actions/zoom-image.ts index 35c3d3a106..07c44569cd 100644 --- a/web/src/lib/actions/zoom-image.ts +++ b/web/src/lib/actions/zoom-image.ts @@ -1,11 +1,18 @@ import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte'; import { createZoomImageWheel } from '@zoom-image/core'; -export const zoomImageAction = (node: HTMLElement, options?: { disabled?: boolean }) => { +// Minimal touch shape — avoids importing DOM TouchEvent which isn't available in all TS targets. +type TouchEventLike = { + touches: Iterable<{ clientX: number; clientY: number }> & { length: number }; + targetTouches: ArrayLike; +}; +const asTouchEvent = (event: Event) => event as unknown as TouchEventLike; + +export const zoomImageAction = (node: HTMLElement, options?: { zoomTarget?: HTMLElement }) => { const zoomInstance = createZoomImageWheel(node, { maxZoom: 10, initialState: assetViewerManager.zoomState, - zoomTarget: null, + zoomTarget: options?.zoomTarget, }); const unsubscribes = [ @@ -13,47 +20,130 @@ export const zoomImageAction = (node: HTMLElement, options?: { disabled?: boolea zoomInstance.subscribe(({ state }) => assetViewerManager.onZoomChange(state)), ]; - const onInteractionStart = (event: Event) => { - if (options?.disabled) { - event.stopImmediatePropagation(); + const controller = new AbortController(); + const { signal } = controller; + + node.addEventListener('pointerdown', () => assetViewerManager.cancelZoomAnimation(), { capture: true, signal }); + + // Intercept events in capture phase to prevent zoom-image from seeing interactions on + // overlay elements (e.g. OCR text boxes), preserving browser defaults like text selection. + const isOverlayEvent = (event: Event) => !!(event.target as HTMLElement).closest('[data-overlay-interactive]'); + const isOverlayAtPoint = (x: number, y: number) => + !!document.elementFromPoint(x, y)?.closest('[data-overlay-interactive]'); + + // Pointer event interception: track pointers that start on overlays and intercept the entire gesture. + const overlayPointers = new Set(); + const interceptedPointers = new Set(); + const interceptOverlayPointerDown = (event: PointerEvent) => { + if (isOverlayEvent(event) || isOverlayAtPoint(event.clientX, event.clientY)) { + overlayPointers.add(event.pointerId); + interceptedPointers.add(event.pointerId); + event.stopPropagation(); + } else if (overlayPointers.size > 0) { + // Split gesture (e.g. pinch with one finger on overlay) — intercept entirely. + interceptedPointers.add(event.pointerId); + event.stopPropagation(); } - assetViewerManager.cancelZoomAnimation(); }; + const interceptOverlayPointerEvent = (event: PointerEvent) => { + if (interceptedPointers.has(event.pointerId)) { + event.stopPropagation(); + } + }; + const interceptOverlayPointerEnd = (event: PointerEvent) => { + overlayPointers.delete(event.pointerId); + if (interceptedPointers.delete(event.pointerId)) { + event.stopPropagation(); + } + }; + node.addEventListener('pointerdown', interceptOverlayPointerDown, { capture: true, signal }); + node.addEventListener('pointermove', interceptOverlayPointerEvent, { capture: true, signal }); + node.addEventListener('pointerup', interceptOverlayPointerEnd, { capture: true, signal }); + node.addEventListener('pointerleave', interceptOverlayPointerEnd, { capture: true, signal }); - node.addEventListener('wheel', onInteractionStart, { capture: true }); - node.addEventListener('pointerdown', onInteractionStart, { capture: true }); + // Touch event interception for overlay touches or split gestures (pinch across container boundary). + // Once intercepted, stays intercepted until all fingers are lifted. + let touchGestureIntercepted = false; + const interceptOverlayTouchEvent = (event: Event) => { + if (touchGestureIntercepted) { + event.stopPropagation(); + return; + } + const { touches, targetTouches } = asTouchEvent(event); + if (touches && targetTouches) { + if (touches.length > targetTouches.length) { + touchGestureIntercepted = true; + event.stopPropagation(); + return; + } + for (const touch of touches) { + if (isOverlayAtPoint(touch.clientX, touch.clientY)) { + touchGestureIntercepted = true; + event.stopPropagation(); + return; + } + } + } else if (isOverlayEvent(event)) { + event.stopPropagation(); + } + }; + const resetTouchGesture = (event: Event) => { + const { touches } = asTouchEvent(event); + if (touches.length === 0) { + touchGestureIntercepted = false; + } + }; + node.addEventListener('touchstart', interceptOverlayTouchEvent, { capture: true, signal }); + node.addEventListener('touchmove', interceptOverlayTouchEvent, { capture: true, signal }); + node.addEventListener('touchend', resetTouchGesture, { capture: true, signal }); - // Suppress Safari's synthetic dblclick on double-tap. Without this, zoom-image's touchstart - // handler zooms to maxZoom (10x), then Safari's synthetic dblclick triggers photo-viewer's - // handler which conflicts. Chrome does not fire synthetic dblclick on touch. + // Wheel and dblclick interception on overlay elements. + // Dblclick also intercepted for all touch double-taps (Safari fires synthetic dblclick + // on double-tap, which conflicts with zoom-image's touch zoom handler). let lastPointerWasTouch = false; - const trackPointerType = (event: PointerEvent) => { - lastPointerWasTouch = event.pointerType === 'touch'; - }; - const suppressTouchDblClick = (event: MouseEvent) => { - if (lastPointerWasTouch) { - event.stopImmediatePropagation(); - } - }; - node.addEventListener('pointerdown', trackPointerType, { capture: true }); - node.addEventListener('dblclick', suppressTouchDblClick, { capture: true }); + node.addEventListener('pointerdown', (event) => (lastPointerWasTouch = event.pointerType === 'touch'), { + capture: true, + signal, + }); + node.addEventListener( + 'wheel', + (event) => { + if (isOverlayEvent(event)) { + event.stopPropagation(); + } + }, + { capture: true, signal }, + ); + node.addEventListener( + 'dblclick', + (event) => { + if (lastPointerWasTouch || isOverlayEvent(event)) { + event.stopImmediatePropagation(); + } + }, + { capture: true, signal }, + ); - // Allow zoomed content to render outside the container bounds + if (options?.zoomTarget) { + options.zoomTarget.style.willChange = 'transform'; + } node.style.overflow = 'visible'; - // Prevent browser handling of touch gestures so zoom-image can manage them node.style.touchAction = 'none'; return { - update(newOptions?: { disabled?: boolean }) { + update(newOptions?: { zoomTarget?: HTMLElement }) { options = newOptions; + if (newOptions?.zoomTarget !== undefined) { + zoomInstance.setState({ zoomTarget: newOptions.zoomTarget }); + } }, destroy() { + controller.abort(); + if (options?.zoomTarget) { + options.zoomTarget.style.willChange = ''; + } for (const unsubscribe of unsubscribes) { unsubscribe(); } - node.removeEventListener('wheel', onInteractionStart, { capture: true }); - node.removeEventListener('pointerdown', onInteractionStart, { capture: true }); - node.removeEventListener('pointerdown', trackPointerType, { capture: true }); - node.removeEventListener('dblclick', suppressTouchDblClick, { capture: true }); zoomInstance.cleanup(); }, }; diff --git a/web/src/lib/components/AdaptiveImage.svelte b/web/src/lib/components/AdaptiveImage.svelte index fad4d49d1b..90c9328cf8 100644 --- a/web/src/lib/components/AdaptiveImage.svelte +++ b/web/src/lib/components/AdaptiveImage.svelte @@ -7,7 +7,7 @@ import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte'; import { getAssetUrls } from '$lib/utils'; import { AdaptiveImageLoader, type QualityList } from '$lib/utils/adaptive-image-loader.svelte'; - import { scaleToCover, scaleToFit } from '$lib/utils/container-utils'; + import { scaleToCover, scaleToFit, type Size } from '$lib/utils/container-utils'; import { getAltText } from '$lib/utils/thumbnail-util'; import { toTimelineAsset } from '$lib/utils/timeline-util'; import type { AssetResponseDto, SharedLinkResponseDto } from '@immich/sdk'; @@ -17,10 +17,7 @@ asset: AssetResponseDto; sharedLink?: SharedLinkResponseDto; objectFit?: 'contain' | 'cover'; - container: { - width: number; - height: number; - }; + container: Size; onUrlChange?: (url: string) => void; onImageReady?: () => void; onError?: () => void; @@ -149,81 +146,66 @@ (quality.preview === 'success' ? previewElement : undefined) ?? (quality.thumbnail === 'success' ? thumbnailElement : undefined); }); - - const zoomTransform = $derived.by(() => { - const { currentZoom, currentPositionX, currentPositionY } = assetViewerManager.zoomState; - if (currentZoom === 1 && currentPositionX === 0 && currentPositionY === 0) { - return undefined; - } - return `translate(${currentPositionX}px, ${currentPositionY}px) scale(${currentZoom})`; - });
{@render backdrop?.()} - -
-
- {#if show.alphaBackground} - - {/if} +
+ {#if show.alphaBackground} + + {/if} - {#if show.thumbhash} - {#if asset.thumbhash} - - - {:else if show.spinner} - - {/if} + {#if show.thumbhash} + {#if asset.thumbhash} + + + {:else if show.spinner} + {/if} + {/if} - {#if show.thumbnail} - - {/if} + {#if show.thumbnail} + + {/if} - {#if show.brokenAsset} - - {/if} + {#if show.brokenAsset} + + {/if} - {#if show.preview} - - {/if} + {#if show.preview} + + {/if} - {#if show.original} - - {/if} -
+ {#if show.original} + + {/if}
diff --git a/web/src/lib/components/ImageLayer.svelte b/web/src/lib/components/ImageLayer.svelte index 1dba4e4c7a..ea8360df56 100644 --- a/web/src/lib/components/ImageLayer.svelte +++ b/web/src/lib/components/ImageLayer.svelte @@ -36,7 +36,7 @@ onLoad={() => adaptiveImageLoader.onLoad(quality)} onError={() => adaptiveImageLoader.onError(quality)} bind:ref - class="h-full w-full bg-transparent" + class="h-full w-full bg-transparent pointer-events-auto" {alt} {role} draggable={false} diff --git a/web/src/lib/components/LinkToDocs.svelte b/web/src/lib/components/LinkToDocs.svelte new file mode 100644 index 0000000000..604b1ac14b --- /dev/null +++ b/web/src/lib/components/LinkToDocs.svelte @@ -0,0 +1,16 @@ + + + + {#snippet children({ message })} + {message} + {/snippet} + diff --git a/web/src/lib/components/QueuePanel.svelte b/web/src/lib/components/QueuePanel.svelte index 177cbf33c3..2b091c6750 100644 --- a/web/src/lib/components/QueuePanel.svelte +++ b/web/src/lib/components/QueuePanel.svelte @@ -112,7 +112,7 @@ switch (dto.command) { case QueueCommand.Empty: { - toastManager.success($t('admin.cleared_jobs', { values: { job: item.title } })); + toastManager.primary($t('admin.cleared_jobs', { values: { job: item.title } })); break; } } diff --git a/web/src/lib/components/ToastAction.svelte b/web/src/lib/components/ToastAction.svelte deleted file mode 100644 index 5dc430f323..0000000000 --- a/web/src/lib/components/ToastAction.svelte +++ /dev/null @@ -1,33 +0,0 @@ - - - - - {#if button} -
- -
- {/if} -
-
diff --git a/web/src/lib/components/admin-settings/AuthSettings.svelte b/web/src/lib/components/admin-settings/AuthSettings.svelte index 25af7bf2c1..ae0e1c97c5 100644 --- a/web/src/lib/components/admin-settings/AuthSettings.svelte +++ b/web/src/lib/components/admin-settings/AuthSettings.svelte @@ -55,7 +55,7 @@ try { await unlinkAllOAuthAccountsAdmin(); - toastManager.success(); + toastManager.primary(); } catch (error) { handleError(error, $t('errors.something_went_wrong')); } diff --git a/web/src/lib/components/admin-settings/NotificationSettings.svelte b/web/src/lib/components/admin-settings/NotificationSettings.svelte index e97af356df..5d5f61b403 100644 --- a/web/src/lib/components/admin-settings/NotificationSettings.svelte +++ b/web/src/lib/components/admin-settings/NotificationSettings.svelte @@ -11,7 +11,7 @@ import { user } from '$lib/stores/user.store'; import { handleError } from '$lib/utils/handle-error'; import { sendTestEmailAdmin } from '@immich/sdk'; - import { Button, LoadingSpinner, toastManager } from '@immich/ui'; + import { Button, toastManager } from '@immich/ui'; import { t } from 'svelte-i18n'; import { fade } from 'svelte/transition'; @@ -45,7 +45,7 @@ }, }); - toastManager.success($t('admin.notification_email_test_email_sent', { values: { email: $user.email } })); + toastManager.primary($t('admin.notification_email_test_email_sent', { values: { email: $user.email } })); if (!disabled) { await handleSystemConfigSave({ notifications: configToEdit.notifications }); @@ -142,6 +142,7 @@ - {#if isSending} - - {/if}
diff --git a/web/src/lib/components/album-page/album-card-group.svelte b/web/src/lib/components/album-page/album-card-group.svelte index 99aa8f2b71..eb931d834c 100644 --- a/web/src/lib/components/album-page/album-card-group.svelte +++ b/web/src/lib/components/album-page/album-card-group.svelte @@ -65,6 +65,7 @@ {#each albums as album, index (album.id)} oncontextmenu(event, album)} > diff --git a/web/src/lib/components/album-page/album-cover.svelte b/web/src/lib/components/album-page/album-cover.svelte index c6242c5fad..2af2be77f6 100644 --- a/web/src/lib/components/album-page/album-cover.svelte +++ b/web/src/lib/components/album-page/album-cover.svelte @@ -11,7 +11,7 @@ class?: string; } - let { album, preload = false, class: className = '' }: Props = $props(); + let { album, preload = false, class: className }: Props = $props(); let alt = $derived(album.albumName || $t('unnamed_album')); let thumbnailUrl = $derived( diff --git a/web/src/lib/components/album-page/album-description.svelte b/web/src/lib/components/album-page/album-description.svelte index 481e110fb0..9443392456 100644 --- a/web/src/lib/components/album-page/album-description.svelte +++ b/web/src/lib/components/album-page/album-description.svelte @@ -33,13 +33,11 @@ {#if isOwned}